gnustep-dl2-0.12.0/0000775000175000017500000000000014754660701013034 5ustar yavoryavorgnustep-dl2-0.12.0/Version0000664000175000017500000000104414632325605014377 0ustar yavoryavor# This file is included in various Makefile's to get version information. # Compatible with Bourne shell syntax, so it can included there too. # The gcc version required to compile the library. GNUSTEP_GCC=2.95.2 # The version number of this release. MAJOR_VERSION=0 MINOR_VERSION=12 SUBMINOR_VERSION=0 GDL2_VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${SUBMINOR_VERSION} VERSION=${GDL2_VERSION} GDL2_FTP_MACHINE=ftp.gnustep.org GDL2_FTP_DIRECTORY=pub/gnustep/gdl2 GDL2_SNAP_FTP_MACHINE=ftp.gnustep.org GDL2_SNAP_FTP_DIRECTORY=pub/daily-snapshots gnustep-dl2-0.12.0/Tools/0000775000175000017500000000000014754345005014131 5ustar yavoryavorgnustep-dl2-0.12.0/Tools/gdl2gsdoc.gsdoc0000664000175000017500000000126414632325605017024 0ustar yavoryavor GDL2 GSDoc GDL2 GSDoc

...

gnustep-dl2-0.12.0/Tools/EOJoin+GSDoc.h0000664000175000017500000000245314632325605016363 0ustar yavoryavor/* -*-objc-*- EOJoin+GSDoc.h EOJoin+GSDoc Copyright (C) 2000-2002,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ // $Id$ #ifndef __EOJoin_GSDoc_h__ #define __EOJoin_GSDoc_h__ #include @interface EOJoin (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr; @end #endif /* __EOJoin_GSDoc_h__ */ gnustep-dl2-0.12.0/Tools/Makefile.preamble0000664000175000017500000000473714636004727017374 0ustar yavoryavor# # Makefile.preamble # # Copyright (C) 1997,2002,2004,2005 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Database Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # Makefile.preamble # # Project specific makefile variables, and additional # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor #ADDITIONAL_CPPFLAGS = $(FND_DEFINE) $(RUNTIME_DEFINE) -g # Additional flags to pass to the Objective-C compiler ADDITIONAL_OBJCFLAGS += -Wall # Additional flags to pass to the C compiler ADDITIONAL_CFLAGS = # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS = -I../EOControl/$(GNUSTEP_TARGET_DIR) -I.. # Additional LDFLAGS to pass to the linker ifneq ($(FOUNDATION_LIB),gnu) ADDITIONAL_TOOL_LIBS += -lgnustep-baseadd else ADDITIONAL_LDFLAGS +=-Wl,--allow-shlib-undefined endif ADDITIONAL_NATIVE_LIBS+=EOControl EOAccess ADDITIONAL_NATIVE_LIB_DIRS+=../EOControl ../EOAccess # Additional library directories the linker should search ADDITIONAL_LIB_DIRS += # # Flags dealing with installing and uninstalling # # Additional directories to be created during installation ADDITIONAL_INSTALL_DIRS = # What are the libraries this library depends upon. This is needed for some # systems where building a shared library requires to pass to the linker # all the libraries the target library depends upon. ifneq ($(FOUNDATION_LIBRARY_NAME),) LIBRARIES_DEPEND_UPON = -l$(FOUNDATION_LIBRARY_NAME) endif ifeq ($(FOUNDATION_HAS_KVC), yes) ADDITIONAL_OBJCFLAGS := $(ADDITIONAL_OBJCFLAGS) -DFOUNDATION_HAS_KVC=1 endif gnustep-dl2-0.12.0/Tools/NSDictionary+GSDoc.m0000664000175000017500000000542314636026724017617 0ustar yavoryavor/** NSDictionary+GSDoc.m Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #include #include #else #include #endif #ifndef GNUSTEP #include #endif #include "NSDictionary+GSDoc.h" @implementation NSDictionary (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr { return [self gsdocContentWithTagName: @"dictionary" idPtr: xmlIdPtr]; } - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *content = [NSString string]; NSEnumerator *enumerator = [self keyEnumerator]; id key = nil; NSLog(@"Start: %@", [self class]); if (tagName) content = [content stringByAppendingFormat: @"<%@%@>\n", tagName, (!xmlIdPtr || [tagName isEqualToString: @"dictionary"] ? @"" : [NSString stringWithFormat: @" debugId=\"%d\"", (*xmlIdPtr)++])]; while ((key = [enumerator nextObject])) { id elem = [self objectForKey: key]; NSLog(@"key: %@ elem: %@", key, elem); if ([elem respondsToSelector: @selector(gsdocContentWithIdPtr:)]) content = [content stringByAppendingFormat: @"\n%@\n", key, [elem gsdocContentWithIdPtr: xmlIdPtr]]; else content = [content stringByAppendingFormat: @"\n", key, elem]; } if (tagName) content = [content stringByAppendingFormat: @"\n", tagName]; NSLog(@"Stop: %@", [self class]); RETAIN(content); DESTROY(arp); return AUTORELEASE(content); } @end gnustep-dl2-0.12.0/Tools/eomodeltemplate.gsdoc0000664000175000017500000000157614632325605020342 0ustar yavoryavor [[projectName]] [[infoDictionary.authorDesc]] [[infoDictionary.version]] [[infoDictionary.date]] [[timestampString]] [Source : [[fileName]]] DTD] [[infoDictionary.copyright]] [[content]] gnustep-dl2-0.12.0/Tools/GNUmakefile0000664000175000017500000000465214632325605016211 0ustar yavoryavor# # Tools makefile for GNUstep Database Library. # # Copyright (C) 1997,2002,2003,2004,2005 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Database Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # include ../common.make include $(GNUSTEP_MAKEFILES)/common.make include ../Version # The library to be compiled TOOL_NAME=gdlgsdoc eoutil gdlgsdoc_NEEDS_GUI = no # The C source files to be compiled gdlgsdoc_C_FILES = # The Objective-C source files to be compiled gdlgsdoc_OBJC_FILES = \ EOAttribute+GSDoc.m \ EOEntity+GSDoc.m \ EOJoin+GSDoc.m \ EOModel+GSDoc.m \ EORelationship+GSDoc.m \ gsdoc-model.m \ NSArray+GSDoc.m \ NSDictionary+GSDoc.m \ gdlgsdoc_HEADER_FILES_DIR = . #gdlgsdoc_HEADER_FILES_INSTALL_DIR = gdlgsdoc_HEADER_FILES = \ EOAttribute+GSDoc.h \ EOEntity+GSDoc.h \ EOJoin+GSDoc.h \ EOModel+GSDoc.h \ EORelationship+GSDoc.h \ NSArray+GSDoc.h \ NSDictionary+GSDoc.h \ gdl2gsdoc_AUTOGSDOC_HEADERS = $(gdlgsdoc_HEADER_FILES) gdl2gsdoc_AUTOGSDOC_SOURCE = $(gdlgsdoc_OBJC_FILES) DOCUMENT_NAME = gdl2gsdoc gdl2gsdoc_HEADER_FILES_DIR = $(HEADER_DIR) gdl2gsdoc_AGSDOC_FILES = gdl2gsdoc.gsdoc $(gdl2gsdoc_AUTOGSDOC_HEADERS) #$(gdl2gsdoc_AUTOGSDOC_SOURCE) gdl2gsdoc_AGSDOC_FLAGS = \ -Declared gdlgsdoc \ -Project gdl2gsdoc \ -Up gdl2gsdoc \ $(GDL2_AGSDOC_FLAGS) eoutil_NEEDS_GUI = no eoutil_OBJC_FILES = eoutil.m eoutil_HEADER_FILES = -include Makefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/tool.make include $(GNUSTEP_MAKEFILES)/ctool.make # Only build the doc if doc=yes was passed on the command line ifeq ($(doc),yes) include $(GNUSTEP_MAKEFILES)/documentation.make endif -include Makefile.postamble gnustep-dl2-0.12.0/Tools/gsdoc-model.m0000664000175000017500000004063514636026724016517 0ustar yavoryavor/* This tool produce .gsdoc files from eomodel files Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Written by: Manuel Guesdon Created: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #include #include #include #include #include #include #include #include #include #include #else #include #endif #ifndef GNUSTEP #include #endif #include #include "EOModel+GSDoc.h" NSString *PathExtension_GSDoc = @"gsdoc"; NSString *PathExtension_EOModel = @"eomodeld"; NSString *PathExtension_Model = @"model"; int verbose = 0; //-------------------------------------------------------------------- // In text, replace keys from variables with their values // variables is like something like this // { // "[[key1]]" = "value1"; // "[[key2]]" = "value2"; // }; NSString *TextByReplacingVariablesInText(NSString *text, NSDictionary *variables) { NSEnumerator *variablesEnum = [variables keyEnumerator]; id key; while ((key = [variablesEnum nextObject])) { id value = [variables objectForKey: key]; text = [text stringByReplacingString: key withString: [value description]]; } return text; } //-------------------------------------------------------------------- // Return list of files found in dir (deep search) which have extension extension NSArray *FilesInPathWithExtension(NSString *dir, NSString *extension) { NSMutableArray *files = [NSMutableArray array]; NSString *file = nil; NSFileManager *fm = [NSFileManager defaultManager]; NSDirectoryEnumerator *enumerator = [fm enumeratorAtPath: dir]; while ((file = [enumerator nextObject])) { BOOL isDirectory = NO; file = [dir stringByAppendingPathComponent: file]; if ([[file pathExtension] isEqual: extension]) { if ([fm fileExistsAtPath: file isDirectory: &isDirectory]) { if (!isDirectory) { [files addObject: file]; } } } } return files; } //-------------------------------------------------------------------- int main(int argc, char **argv, char **env) { NSProcessInfo *proc; NSArray *args; NSUInteger i; NSUserDefaults *defs; NSMutableArray *files = nil; // Files to parse NSString *templateFileName = nil; // makeIndex template file name NSMutableDictionary *infoDictionary = nil; // user info NSDictionary *variablesDictionary = nil; // variables dictionary BOOL goOn = YES; BOOL splitByEntities = NO; NSFileManager *fileManager = nil; NSString *documentationDirectory = nil; NSString *declared = nil; NSString *project = nil; BOOL generateHtml = YES; BOOL ignoreDependencies = NO; BOOL showDependencies = NO; id obj = nil; CREATE_AUTORELEASE_POOL(pool); #ifdef GS_PASS_ARGUMENTS [NSProcessInfo initializeWithArguments: argv count: argc environment: env]; #endif defs = [NSUserDefaults standardUserDefaults]; [defs registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: @"Untitled", @"Project", nil]]; verbose = [defs boolForKey: @"Verbose"]; ignoreDependencies = [defs boolForKey: @"IgnoreDependencies"]; showDependencies = [defs boolForKey: @"ShowDependencies"]; if (ignoreDependencies == YES) { if (showDependencies == YES) { showDependencies = NO; NSLog(@"ShowDependencies(YES) used with IgnoreDependencies(YES)"); } } obj = [defs objectForKey: @"GenerateHtml"]; if (obj != nil) { generateHtml = [defs boolForKey: @"GenerateHtml"]; } declared = [defs stringForKey: @"Declared"]; project = [defs stringForKey: @"Project"]; documentationDirectory = [defs stringForKey: @"DocumentationDirectory"]; if (documentationDirectory == nil) { documentationDirectory = @""; } proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"unable to get process information!"); goOn = NO; } fileManager = [NSFileManager defaultManager]; if (goOn) { args = [proc arguments]; // First, process arguments for (i = 1; goOn && i < [args count]; i++) { NSString *arg = [args objectAtIndex: i]; // is this an option ? if ([arg hasPrefix: @"--"]) { NSString *argWithoutPrefix = [arg stringByDeletingPrefix: @"--"]; NSString *key = nil; NSString *value = nil; NSArray *parts = [argWithoutPrefix componentsSeparatedByString: @"="]; key = [parts objectAtIndex: 0]; if ([parts count] > 1) value = [[parts subarrayWithRange: NSMakeRange(1, [parts count] - 1)] componentsJoinedByString: @"="]; // projectName option if ([key isEqualToString: @"projectName"] || [key isEqualToString: @"project"]) { project = value; NSCAssert([project length], @"No project name"); } // template option else if ([key isEqualToString: @"template"]) { templateFileName = value; NSCAssert([templateFileName length], @"No template filename"); } else if ([key isEqualToString: @"splitByEntities"]) { splitByEntities = [value boolValue]; } // Verbose else if ([key hasPrefix: @"verbose"]) { NSCAssert1(value, @"No value for %@", key); verbose = [value intValue]; if (verbose > 0) { NSMutableSet *debugSet = [proc debugSet]; [debugSet addObject: @"dflt"]; } } // define option else if ([key hasPrefix: @"define-"]) { if (!infoDictionary) infoDictionary = (id)[NSMutableDictionary dictionary]; NSCAssert1(value, @"No value for %@", key); [infoDictionary setObject: value forKey: [key stringByDeletingPrefix: @"define-"]]; } // DocumentationDirectory else if ([key hasPrefix: @"documentationDirectory"]) { if (!value) value = @""; documentationDirectory = value; } /* // unknown option else { NSLog(@"Unknown option %@", arg); goOn = NO; };*/ } // file to parse else { if (!files) files = [NSMutableArray array]; [files addObject: arg]; } } } //Default Values if (goOn) { if (!project) project = @"unknown"; } // Verify option compatibilities if (goOn) { } //Variables if (goOn) { NSMutableDictionary *variablesMutableDictionary = [NSMutableDictionary dictionary]; NSEnumerator *enumer = [infoDictionary keyEnumerator]; id key; while ((key = [enumer nextObject])) { id value = [infoDictionary objectForKey: key]; [variablesMutableDictionary setObject: value forKey: [NSString stringWithFormat: @"[[infoDictionary.%@]]", key]]; } [variablesMutableDictionary setObject: [NSCalendarDate calendarDate] forKey: @"[[timestampString]]"]; if (project) [variablesMutableDictionary setObject: project forKey: @"[[projectName]]"]; variablesDictionary = [[variablesMutableDictionary copy] autorelease]; if (verbose >= 3) { NSEnumerator *enumer = [variablesDictionary keyEnumerator]; id key; while ((key = [enumer nextObject])) { NSLog(@"Variables: %@=%@", key, [variablesDictionary objectForKey: key]); } } } // Find Files to parse if (goOn) { if ([files count] < 1) { NSLog(@"No file names given to parse."); goOn = NO; } else { /* NSMutableArray* tmpNewFiles=[NSMutableArray array]; for (i=0;goOn && i<[files count];i++) { NSString* file = [files objectAtIndex: i]; BOOL isDirectory=NO; if (![fileManager fileExistsAtPath:file isDirectory:&isDirectory]) { NSLog(@"File %@ doesn't exist",file); goOn=NO; } else { if (isDirectory) { NSArray* tmpFiles=FilesInPathWithExtension(file,PathExtension_EOModel); [tmpNewFiles addObjectsFromArray:tmpFiles]; tmpFiles=FilesInPathWithExtension(file,PathExtension_Model); [tmpNewFiles addObjectsFromArray:tmpFiles]; } else { [tmpNewFiles addObject:file]; } } } files=tmpNewFiles; files=(NSMutableArray*)[files sortedArrayUsingSelector:@selector(compare:)]; NSDebugLog(@"files=%@",files); */ } } if (goOn) { NSString *textTemplate = [NSString stringWithContentsOfFile: templateFileName]; for (i = 0; goOn && i < [files count]; i++) { NSString *file = [files objectAtIndex: i]; NSAutoreleasePool *arp = [NSAutoreleasePool new]; if (verbose >= 1) { NSLog(@"File %"PRIuPTR"/%"PRIuPTR" - Processing %@", (i+1), [files count], file); } NS_DURING { EOModel *model; // model=[[[EOModel alloc]autorelease]initWithContentsOfFile:file]; model = [[[EOModel alloc] initWithContentsOfFile: file] autorelease]; if (model) { NSString *gsdocModelContent = nil; NSDictionary *entities = nil; NSLog(@"Model %@ loaded", file); gsdocModelContent = [model gsdocContentSplittedByEntities: (splitByEntities ? &entities : NULL) idPtr: NULL/*&xmlId*/];//Debugging if (gsdocModelContent == nil) { NSLog(@"File %"PRIuPTR"/%"PRIuPTR" - Error generating doc for %@", (i+1), [files count], file); goOn = NO; } else { int iGenerateDoc = 0; int iGenerateCount = 0; NSString *fileContent = nil; NSString *baseFileName = nil; NSString *fileName = nil; NSMutableDictionary *variablesMutableDictionary = nil; NSArray *entitiesNames = [[entities allKeys] sortedArrayUsingSelector: @selector(compare:)]; NSMutableString *entitiesIndex = [NSMutableString stringWithString: @"\n"]; iGenerateCount = [entitiesNames count] + 1; variablesMutableDictionary = [variablesDictionary mutableCopy]; for (iGenerateDoc = 0; iGenerateDoc < iGenerateCount; iGenerateDoc++) { NSString *theFile = nil; NSString *content = nil; if (iGenerateDoc == (iGenerateCount - 1)) { NSMutableDictionary *tmpVariablesMutableDictionary = nil; theFile = file; [entitiesIndex appendString: @"\n"]; tmpVariablesMutableDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys: entitiesIndex, @"[[entities]]", nil]; content = TextByReplacingVariablesInText(gsdocModelContent, tmpVariablesMutableDictionary); } else { NSString *entityName = [entitiesNames objectAtIndex: iGenerateDoc]; theFile = [NSString stringWithFormat: @"%@+%@", [file stringByDeletingPathExtension], entityName]; content = [entities objectForKey: entityName]; [entitiesIndex appendFormat: @"%@\n", theFile, entityName]; } baseFileName = [theFile stringByDeletingPathExtension]; fileName = [baseFileName stringByAppendingPathExtension: PathExtension_GSDoc]; fileName = [documentationDirectory stringByAppendingPathComponent: fileName]; [variablesMutableDictionary setObject: fileName forKey: @"[[fileName]]"]; [variablesMutableDictionary setObject: baseFileName forKey: @"[[baseFileName]]"]; [variablesMutableDictionary setObject: content forKey: @"[[content]]"]; fileContent = TextByReplacingVariablesInText(textTemplate, variablesMutableDictionary); [fileContent writeToFile: fileName atomically: NO]; } if (verbose >= 1) { NSLog(@"File %"PRIuPTR"/%"PRIuPTR" - Generating %@ - OK", (i+1), [files count], file); } } } else { NSLog(@"File %"PRIuPTR"/%"PRIuPTR" - Error parsing '%@'", (i+1), [files count], file); goOn = NO; } } NS_HANDLER { NSLog(@"File %"PRIuPTR"/%"PRIuPTR" - Parsing '%@' - %@", (i+1), [files count], file, [localException reason]); goOn = NO; } NS_ENDHANDLER; DESTROY(arp); } } [pool release]; return (goOn ? 0 : 1); } gnustep-dl2-0.12.0/Tools/EOJoin+GSDoc.m0000664000175000017500000000473314636026724016377 0ustar yavoryavor/** EOJoin+GSDoc.m EOJoin+GSDoc Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #else #include #endif #ifndef GNUSTEP #include #endif #include #include #include #include "NSArray+GSDoc.h" #include "NSDictionary+GSDoc.h" #include "EOAttribute+GSDoc.h" #include "EOJoin+GSDoc.h" @implementation EOJoin (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *content = [NSString string]; NSLog(@"Start: %@", [self class]); content = [content stringByAppendingFormat: @"\n", (xmlIdPtr ? [NSString stringWithFormat: @" debugId=\"%d\"", (*xmlIdPtr)++] : @""), @"",//[[self relationship] name], @"",//[self joinOperatorDescription], @"",//[self joinSemanticDescription], [[self sourceAttribute] name], [[self destinationAttribute] name]]; /* if ([self docComment]) content=[content stringByAppendingFormat:@"%@\n",[self docComment]];*/ content = [content stringByAppendingString: @"\n"]; NSLog(@"Stop: %@", [self class]); RETAIN(content); DESTROY(arp); return AUTORELEASE(content); } @end gnustep-dl2-0.12.0/Tools/EOEntity+GSDoc.h0000664000175000017500000000245214632325605016737 0ustar yavoryavor/* -*-objc-*- EOEntity+GSDoc.h Copyright (C) 2000-2002,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ // $Id$ #ifndef __EOEntity_GSDoc_h__ #define __EOEntity_GSDoc_h__ #include @interface EOEntity (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr; @end #endif /* __EOEntity_GSDoc_h__ */ gnustep-dl2-0.12.0/Tools/NSArray+GSDoc.h0000664000175000017500000000302714632325605016555 0ustar yavoryavor/* -*-objc-*- NSArray+GSDoc.h Copyright (C) 2000-2002,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ // $Id$ #ifndef __NSArray_GSDoc_h__ #define __NSArray_GSDoc_h__ #include @interface NSArray (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr; - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr; - (NSString *)gsdocContentWithTagName: (NSString *)tagName elementsTagName: (NSString *)elementsTagName idPtr: (int *)xmlIdPtr; @end #endif /* __NSArray_GSDoc_h__ */ gnustep-dl2-0.12.0/Tools/NSArray+GSDoc.m0000664000175000017500000000662514636026724016575 0ustar yavoryavor/** NSArray+GSDoc.m Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #include #else #include #endif #ifndef GNUSTEP #include #endif #include "NSArray+GSDoc.h" @implementation NSArray (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr { return [self gsdocContentWithTagName: @"list" idPtr: NULL]; } - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr { return [self gsdocContentWithTagName: (NSString *)tagName elementsTagName: nil idPtr: xmlIdPtr]; } - (NSString *)gsdocContentWithTagName: (NSString *)tagName elementsTagName: (NSString *)elementsTagName idPtr: (int *)xmlIdPtr { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *content = [NSString string]; int i, count = [self count]; NSLog(@"Start: %@", [self class]); if (tagName) content = [content stringByAppendingFormat: @"<%@%@>\n", tagName, (!xmlIdPtr || [tagName isEqualToString:@"list"] ? @"" : [NSString stringWithFormat: @" debugId=\"%d\"", (*xmlIdPtr)++])]; for (i = 0; i < count; i++) { id elem = [self objectAtIndex: i]; NSLog(@"elem: %@", elem); if (elementsTagName) { if ([elem respondsToSelector: @selector(gsdocContentWithTagName:idPtr:)]) content = [content stringByAppendingString: [elem gsdocContentWithTagName: elementsTagName idPtr: xmlIdPtr]]; else if ([elem respondsToSelector: @selector(gsdocContentWithIdPtr:)]) content = [content stringByAppendingString: [elem gsdocContentWithIdPtr: xmlIdPtr]]; else content = [content stringByAppendingFormat: @"%@\n", elem]; } else { if ([elem respondsToSelector: @selector(gsdocContentWithIdPtr:)]) content = [content stringByAppendingString: [elem gsdocContentWithIdPtr: xmlIdPtr]]; else content = [content stringByAppendingFormat: @"%@\n", elem]; } } if (tagName) content = [content stringByAppendingFormat: @"\n", tagName]; NSLog(@"Stop: %@", [self class]); RETAIN(content); DESTROY(arp); return AUTORELEASE(content); } @end gnustep-dl2-0.12.0/Tools/EORelationship+GSDoc.m0000664000175000017500000000765514636026724020147 0ustar yavoryavor/** EORelationship+GSDoc.m Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #else #include #endif #ifndef GNUSTEP #include #endif #include #include #include #include "NSArray+GSDoc.h" #include "NSDictionary+GSDoc.h" #include "EORelationship+GSDoc.h" /* NSString* definition; struct { BOOL isFlattened:1; BOOL isToMany:1; BOOL createsMutableObjects:1; } flags; */ @implementation EORelationship (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr { return [self gsdocContentWithTagName: @"EORelationship" idPtr: xmlIdPtr]; } - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *content = [NSString string]; NSLog(@"Start: %@: %@", [self class], [self name]); if ([tagName isEqual: @"EOAttributeRef"]) { content = [content stringByAppendingFormat: @"\n", (xmlIdPtr ? [NSString stringWithFormat: @" debugId=\"%d\"", (*xmlIdPtr)++] : @""), [self name]]; } else { content = [content stringByAppendingFormat: @"<%@%@ name=\"%@\" entityName=\"%@\" destinationEntityName=\"%@\">\n", tagName, (xmlIdPtr ? [NSString stringWithFormat: @" id=\"%d\"", (*xmlIdPtr)++] : @""), [self name], [[self entity] name], [[self destinationEntity] name]]; if ([self isFlattened]) { int i, count = [[self componentRelationships] count]; for (i = 0; i < count; i++) { EORelationship *component; component = [[self componentRelationships] objectAtIndex: i]; content = [content stringByAppendingFormat: @"\n", (xmlIdPtr ? [NSString stringWithFormat: @" id=\"%d\"", (*xmlIdPtr)++] : @""), [component name]]; } for (i = 0; i < count; i++) content = [content stringByAppendingString: @"\n"]; } else if ([self joins]) content = [content stringByAppendingString: [[self joins] gsdocContentWithTagName: nil idPtr: xmlIdPtr]]; if ([[self userInfo] count]) content = [content stringByAppendingString: [[self userInfo] gsdocContentWithTagName: @"EOUserDictionary" idPtr: xmlIdPtr]]; if ([self docComment]) content = [content stringByAppendingFormat: @"%@\n", [self docComment]]; content = [content stringByAppendingFormat: @"\n", tagName]; } NSLog(@"Stop: %@: %@", [self class], [self name]); RETAIN(content); DESTROY(arp); return AUTORELEASE(content); } @end gnustep-dl2-0.12.0/Tools/EOModel+GSDoc.m0000664000175000017500000001067714636026724016544 0ustar yavoryavor/** EOModel+GSDoc.m Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #include #else #include #endif #ifndef GNUSTEP #include #endif #include #include #include #include "NSArray+GSDoc.h" #include "NSDictionary+GSDoc.h" #include "EOEntity+GSDoc.h" #include "EOModel+GSDoc.h" @implementation EOModel (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr { return [self gsdocContentSplittedByEntities: NULL idPtr: xmlIdPtr]; } - (NSString *)gsdocContentSplittedByEntities: (NSDictionary **)entitiesPtr idPtr: (int *)xmlIdPtr { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *content = [NSString string]; NSArray *entities = [self entities]; int i, count = [entities count]; NSString *chapter = [self name] ? [NSString stringWithFormat: @" id=\"%@\"", [self name]] : @""; NSString *model = [self name] ? [self name] : @""; NSString *debugId = xmlIdPtr ? [NSString stringWithFormat: @" debugId=\"%d\"", (*xmlIdPtr)++] : @""; NSString *name = ([self name] ? [NSString stringWithFormat: @" name=\"%@\"", [self name]] : @""); NSString *adaptorName = [self adaptorName] ? [NSString stringWithFormat: @" adaptorName=\"%@\"", [self adaptorName]] : @""; NSString *adaptorClassName = [self adaptorClassName] ? [NSString stringWithFormat: @" adaptorClassName=\"%@\"", [self adaptorClassName]] : @" adaptorClassName=\"\""; NSLog(@"Start: %@", [self class]); content = [content stringByAppendingFormat: @"\nEOModel %@\n\n", chapter, model, debugId, name, adaptorName, adaptorClassName]; if ([self connectionDictionary]) content = [content stringByAppendingString: [[self connectionDictionary] gsdocContentWithTagName: @"EOConnectionDictionary" idPtr: xmlIdPtr]]; if (entitiesPtr) { *entitiesPtr = [NSMutableDictionary dictionary]; content = [content stringByAppendingString: @"[[entities]]"]; } for (i = 0; i < count; i++) { EOEntity *entity = [entities objectAtIndex: i]; NSString *entityContent = [entity gsdocContentWithIdPtr: xmlIdPtr]; NSAssert(entityContent, @"No entity gsdoc content"); if (entitiesPtr) { entityContent = [NSString stringWithFormat: @"\nEOEntity %@\n%@\n\n", [entity name], [entity name], entityContent]; [(NSMutableDictionary*)*entitiesPtr setObject: entityContent forKey: [entity name]]; } else content = [content stringByAppendingString: entityContent]; } if ([[self userInfo] count]) content = [content stringByAppendingString: [[self userInfo] gsdocContentWithTagName: @"EOUserDictionary" idPtr: xmlIdPtr]]; if ([self docComment]) content = [content stringByAppendingFormat: @"%@\n", [self docComment]]; content = [content stringByAppendingString: @"\n\n"]; NSLog(@"Stop: %@", [self class]); RETAIN(content); if (entitiesPtr) RETAIN(*entitiesPtr); DESTROY(arp); if (entitiesPtr) AUTORELEASE(*entitiesPtr); return AUTORELEASE(content); } @end gnustep-dl2-0.12.0/Tools/eoutil.m0000664000175000017500000012605414754345005015620 0ustar yavoryavor/** eoutil.m eoutil Tool Copyright (C) 2003,2004,2005 Free Software Foundation, Inc. Author: Stephane Corthesy Date: February 2003 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #include #include #include #include #include #include #include #include #include #include #include #include #else #include #endif #ifndef GNUSTEP #include #endif #include #include /* TODO Implement -ascii option Test multiple models Add new option -dateFormat ISO|Apple (has ISO enough precision for microseconds?) Add new option -nullValue '__NULL__' Question: is it possible to save/restore sequences (for PK)? Replace all autorelease/release/retain by macros Document plist format Document usage Optimization: if not -force, do all EOF ops in one go */ @interface NSString(eoutil) - (NSString *) lossyASCIIString; @end @implementation NSString(eoutil) - (NSString *) lossyASCIIString { NSData *d; d = [self dataUsingEncoding: NSASCIIStringEncoding allowLossyConversion: YES]; return [[[NSString alloc] initWithData: d encoding: NSASCIIStringEncoding] autorelease]; } @end // TODO // Add support to read/write multiple plists, one per entity // -source plists where 'plists' is a directory name (created if necessary) // In the directory, create one plist per entity static BOOL usage(BOOL fullUsage) { char *usageString; if (fullUsage) usageString = "Command line utility to perform database and EOF oriented tasks.\n" "Syntax: eoutil dump/connect/convert\n" " eoutil dump [-source [sourcefile]] -dest [destfile] [-schemaCreate ] [-schemaDrop ] [-postInstall] [-force] [-connDict ] [-entities ] [-excludedEntities ] [-modelGroup ] [-ascii]\n" "\tThis command reads data from and dumps it to . The dump may\n" "\tinclude bits of DML that create bits of database schema. The -source flag is\n" "\toptional if only schema is to be created (i.e. no data is being dumped). The\n" "\tfollowing is a list of possible values for each of the arguments in the command:\n" "\t model -- must be the name of an eomodel or eomodeld file\n" "\t source -- 'plist' (read from stdin unless source file is specified) or\n" "\t 'database' (uses model to connect)\n" "\t sourcefile -- name of file to read plist from\n" "\t dest -- 'plist' or 'script' (both are written to stdout unless destfile is\n" "\t specified) or 'database' (uses model to connect)\n" "\t destfile -- name of file to write plist or script\n" "\t options -- 'database', 'tables', 'primaryKeySupport',\n" "\t 'primaryKeyConstraints' or 'foreignKeyConstraints'\n" "\t postInstall -- looks in the userInfo dictionary for an array of SQL strings\n" "\t to process after any schema creation and data dumping is done\n" "\t force -- Do not quit processing after database error\n" "\t connDict -- A substitute connection dictionary\n" "\t entities -- a subset of the entities in the model (all are used by default)\n" "\t excludedEntities -- a subset of the entities in the model which shall not be used (all are used by default)\n" "\t modelGroup -- A list of models to create a model group. (Allows you to use\n" "\t models not in a framework. Model names must be absolute paths.)\n" "\t ascii -- Convert all non-ASCII characters to their nearest ASCII equivalents.\n" "\n" "\tExample: eoutil dump Movies.eomodeld -source plist -dest database -schemaCreate tables primaryKeySupport foreignKeyConstraints < MovieData.plist\n" "\t Creates the tables in the database, reads data in plist format from,\n" "\t stdin stores the data in the database listed in the connection\n" "\t dictionary of model, creates primary key support in the database, and\n" "\t creates foreign key constraints corresponding to the relationship\n" "\t definitions.\n" "\n" " eoutil convert \n" "\tThis command converts the type mapping in a model for the data source specified\n" "\tby the connection dictionary URL. The connection dictionary in the new model is\n" "\tset to connectionDictionary.\n" "\n" "\t model -- must be the name of an eomodel or eomodeld file\n" "\t adaptorName -- PostgreSQL, FlatFile, etc.\n" "\t connectionDictionary -- string in property list format representing a\n" "\t dictionary, specifying the database name for the\n" "\t data source (required) and username and password (if\n" "\t required by that data source).\n" "\t outFileName -- the name of a directory to write the converted model\n" "\n" "\tExample: eoutil convert Movies.eomodeld PostgreSQL '{ databaseName = test; hostName = localhost; userName = postgres; password = postgres; }' M.eomodeld\n" "\t Converts types in Movies.eomodeld file to PostgreSQL types and writes\n" "\t the converted model to ./M.eomodel\n" "\n" " eoutil connect ( | ( ))\n" "\tThis command attempts to connect to a data source using the adaptor named\n" "\tadaptorName with connectionDictionary, or using the connection dictionary in\n" "\tmodel. It returns an exit status of 0 if successful and 1 otherwise. This is\n" "\tprimarily useful for scripts.\n" "\n" "\t model -- must be the name of an eomodel or eomodeld file\n" "\t adaptorName -- PostgreSQL, FlatFile, etc.\n" "\t connectionDictionary -- string in property list format representing a\n" "\t dictionary, specifying the database name for the\n" "\t data source (required) and username and password (if\n" "\t required by that data source).\n" "\n" "\tExample: eoutil connect PostgreSQL '{ databaseName = test; hostName = localhost; userName = postgres; password = postgres; }'\n" "\t Attempts to connect to a PostgreSQL database on host localhost.\n" "\n" " eoutil help\n" "\tPrints this text.\n" "\n"; else usageString = "Command line utility to perform database and EOF oriented tasks.\n" "Syntax: eoutil dump/connect/convert/help\n" " eoutil dump [-source [sourcefile]] -dest [destfile] [-schemaCreate ] [-schemaDrop ] [-postInstall] [-force] [-connDict ] [-entities ] [-modelGroup ] [-ascii]\n" " eoutil convert \n" " eoutil connect ( | ( ))\n" " eoutil help\n"; NSLog(@"%s", usageString); return YES; } enum { databaseOption = 1 << 0, tablesOption = 1 << 1, pkSupportOption = 1 << 2, pkConstraintsOption = 1 << 3, fkConstraintsOption = 1 << 4, }; static void executeSQLStatements(EOModel *srcModel, NSArray *sqlStatements, BOOL force){ EODatabaseContext *aDatabaseContext; EOEditingContext *anEC = [[EOEditingContext alloc] init]; aDatabaseContext = [EODatabaseContext registeredDatabaseContextForModel: srcModel editingContext: anEC]; [aDatabaseContext lock]; NS_DURING { EODatabaseChannel *aDatabaseChannel = [aDatabaseContext availableChannel]; EOAdaptorChannel *anAdaptorChannel = [aDatabaseChannel adaptorChannel]; NSEnumerator *anEnum; EOSQLExpression *aStatement; if (![anAdaptorChannel isOpen]) [anAdaptorChannel openChannel]; anEnum = [sqlStatements objectEnumerator]; while ((aStatement = [anEnum nextObject])) { NS_DURING [anAdaptorChannel evaluateExpression: aStatement]; NS_HANDLER if(!force) break; NS_ENDHANDLER; } [aDatabaseContext unlock]; [anEC release]; } NS_HANDLER { [aDatabaseContext unlock]; [anEC release]; [localException raise]; } NS_ENDHANDLER; } static BOOL dump(NSArray *arguments) { int aCount = [arguments count], i = 0; EOModel *srcModel; NSString *sourceType = nil, *sourceFilename = nil; NSString *destType = nil, *destFilename = nil; int schemaCreateOptions = 0, schemaDropOptions = 0; BOOL postInstall = NO; BOOL force = NO; NSDictionary *aConnectionDictionary = nil; NSMutableArray *entityNameList = nil, *excludedEntityNameList = nil; NSMutableArray *entitiesList = nil; NSMutableArray *modelList = nil; BOOL convertsNonASCII = NO; NSMutableString *outputString = [NSMutableString string]; NSArray *initialStatements = nil; NSArray *endingStatements = nil; NSDictionary *dataDictionary = nil; Class exprClass; NSArray *postInstallSQLExpressions = nil; // First, let's parse arguments srcModel = [[EOModel alloc] initWithContentsOfFile: [[arguments objectAtIndex: i++] stringByStandardizingPath]]; [srcModel autorelease]; while (i < aCount) { NSString *anArg = [arguments objectAtIndex: i++]; if ([anArg isEqualToString: @"-source"]) { if (sourceType != nil) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-source'"]; if (i < aCount) sourceType = [arguments objectAtIndex: i++]; else [NSException raise: NSInvalidArgumentException format: @"Missing argument(s) after '-source'"]; if (![sourceType isEqualToString: @"database"]) { if ([sourceType isEqualToString: @"plist"]) { if (i < aCount) { sourceFilename = [[arguments objectAtIndex: i++] stringByStandardizingPath]; if ([sourceFilename hasPrefix: @"-"]) { // We consider it's an option, not a filename sourceFilename = nil; i--; } } } else [NSException raise: NSInvalidArgumentException format: @"Illegal '-source' option: %@", sourceType]; } } else if ([anArg isEqualToString: @"-dest"]) { if (destType != nil) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-dest'"]; if (i < aCount) destType = [arguments objectAtIndex: i++]; else [NSException raise: NSInvalidArgumentException format: @"Missing argument(s) after '-dest'"]; if (![destType isEqualToString: @"database"]) { if ([destType isEqualToString: @"script"] || [destType isEqualToString: @"plist"]) { if (i < aCount) { destFilename = [[arguments objectAtIndex: i++] stringByStandardizingPath]; if ([destFilename hasPrefix: @"-"]) { // We consider it's an option, not a filename destFilename = nil; i--; } } } else [NSException raise: NSInvalidArgumentException format: @"Illegal '-dest' option: %@", destType]; } } else if ([anArg isEqualToString: @"-schemaCreate"]) { if (schemaCreateOptions != 0) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-schemaCreate'"]; while (i < aCount) { anArg = [arguments objectAtIndex: i++]; if ([anArg isEqualToString: @"database"]) schemaCreateOptions |= databaseOption; else if ([anArg isEqualToString: @"tables"]) schemaCreateOptions |= tablesOption; else if ([anArg isEqualToString: @"primaryKeySupport"]) schemaCreateOptions |= pkSupportOption; else if ([anArg isEqualToString: @"primaryKeyConstraints"]) schemaCreateOptions |= pkConstraintsOption; else if ([anArg isEqualToString: @"foreignKeyConstraints"]) schemaCreateOptions |= fkConstraintsOption; else { if (![anArg hasPrefix:@"-"]) [NSException raise: NSInvalidArgumentException format: @"Illegal '-schemaCreate' option: %@", anArg]; i--; break; } } if (schemaCreateOptions == 0) [NSException raise: NSInvalidArgumentException format: @"Missing argument(s) after '-schemaCreate'"]; } else if ([anArg isEqualToString: @"-schemaDrop"]) { if (schemaDropOptions != 0) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-schemaDrop'"]; while (i < aCount) { anArg = [arguments objectAtIndex: i++]; if ([anArg isEqualToString: @"database"]) schemaDropOptions |= databaseOption; else if ([anArg isEqualToString: @"tables"]) schemaDropOptions |= tablesOption; else if ([anArg isEqualToString: @"primaryKeySupport"]) schemaDropOptions |= pkSupportOption; /* else if ([anArg isEqualToString: @"primaryKeyConstraints"]) schemaDropOptions |= pkConstraintsOption; else if ([anArg isEqualToString: @"foreignKeyConstraints"]) schemaDropOptions |= fkConstraintsOption;*/ else { if (![anArg hasPrefix: @"-"]) [NSException raise: NSInvalidArgumentException format: @"Illegal '-schemaDrop' option: %@", anArg]; i--; break; } } if (schemaDropOptions == 0) [NSException raise: NSInvalidArgumentException format: @"Missing argument(s) after '-schemaDrop'"]; } else if ([anArg isEqualToString: @"-postInstall"]) { if (postInstall) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-postInstall'"]; postInstall = YES; } else if ([anArg isEqualToString: @"-force"]) { if (force) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-force'"]; force = YES; } else if ([anArg isEqualToString: @"-ascii"]) { if (convertsNonASCII) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-ascii'"]; convertsNonASCII = YES; } else if ([anArg isEqualToString: @"-connDict"]) { if (aConnectionDictionary) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-connDict'"]; if (i < aCount) { aConnectionDictionary = [[arguments objectAtIndex: i++] propertyList]; if (![aConnectionDictionary isKindOfClass: [NSDictionary class]]) [NSException raise: NSInvalidArgumentException format: @"Invalid '-connDict' argument; must be a NSDictionary"]; } else [NSException raise: NSInvalidArgumentException format: @"Missing argument after '-connDict'"]; } else if ([anArg isEqualToString: @"-entities"]) { if (entityNameList) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-entities'"]; entityNameList = [NSMutableArray array]; while (i < aCount) { anArg = [arguments objectAtIndex: i++]; if ([anArg hasPrefix: @"-"]) { // We consider it's an option, not an entity name i--; break; } if ([entityNameList containsObject: anArg]) [NSException raise: NSInvalidArgumentException format: @"Entity name argument '%@' occurs more than once", anArg]; [entityNameList addObject: anArg]; } if ([entityNameList count] == 0) [NSException raise: NSInvalidArgumentException format: @"Missing argument(s) after '-entities'"]; } else if ([anArg isEqualToString: @"-excludedEntities"]) { if (excludedEntityNameList) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-excludedEntities'"]; excludedEntityNameList = [NSMutableArray array]; while (i < aCount) { anArg = [arguments objectAtIndex: i++]; if ([anArg hasPrefix: @"-"]) { // We consider it's an option, not an entity name i--; break; } if ([excludedEntityNameList containsObject: anArg]) [NSException raise: NSInvalidArgumentException format: @"Entity name argument '%@' occurs more than once", anArg]; [excludedEntityNameList addObject: anArg]; } if ([excludedEntityNameList count] == 0) [NSException raise: NSInvalidArgumentException format: @"Missing argument(s) after '-excludedEntities'"]; } else if ([anArg isEqualToString: @"-modelGroup"]) { if (modelList) [NSException raise: NSInvalidArgumentException format: @"More than one occurence of parameter '-modelGroup'"]; modelList = [NSMutableArray array]; while (i < aCount) { anArg = [[arguments objectAtIndex: i++] stringByStandardizingPath]; if ([anArg hasPrefix: @"-"]) { // We consider it's an option, not a file name i--; break; } if ([modelList containsObject: anArg]) [NSException raise: NSInvalidArgumentException format: @"Model file name argument '%@' occurs more than once", anArg]; if (![anArg isAbsolutePath]) anArg = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:anArg]; // [NSException raise:NSInvalidArgumentException format:@"Model file name argument '%@' is not absolute", anArg]; [modelList addObject: anArg]; } if ([modelList count] == 0) [NSException raise: NSInvalidArgumentException format: @"Missing argument(s) after '-modelGroup'"]; } else // Else, ignore remaining args break; } // Now check parameter consistency if (!destType) [NSException raise: NSInvalidArgumentException format: @"Missing -dest [destfile] argument"]; if (sourceType == nil && schemaCreateOptions == 0 && schemaDropOptions == 0) [NSException raise: NSInvalidArgumentException format: @"Unknown operation"]; if ([destType isEqualToString: @"plist"] && (schemaDropOptions != 0 || schemaCreateOptions != 0)) [NSException raise: NSInvalidArgumentException format: @"Can't declare plist as destination and use schema arguments"]; // Load models { EOModelGroup *defaultModelGroup = [EOModelGroup globalModelGroup]; [defaultModelGroup addModel: srcModel]; if (modelList) { // Load other models in same model group NSEnumerator *anEnum = [modelList objectEnumerator]; NSString *aString; while ((aString = [anEnum nextObject])) { (void)[defaultModelGroup addModelWithFile: aString]; } } [defaultModelGroup loadAllModelObjects]; [EOModelGroup setDefaultGroup: defaultModelGroup]; } // Create entity list if (entityNameList) { NSEnumerator *anEnum = [entityNameList objectEnumerator]; NSString *aString; entitiesList = [NSMutableArray array]; while ((aString = [anEnum nextObject])) { if(![excludedEntityNameList containsObject:aString]){ EOEntity *anEntity = [[EOModelGroup defaultGroup] entityNamed: aString]; if (anEntity == nil) [NSException raise: NSInvalidArgumentException format: @"Unknown entity '%@'", aString]; [entitiesList addObject: anEntity]; } } } else { NSEnumerator *anEnum = [[srcModel entities] objectEnumerator]; EOEntity *anEntity; entitiesList = [NSMutableArray array]; while ((anEntity = [anEnum nextObject])){ if(![excludedEntityNameList containsObject:[anEntity name]]){ [entitiesList addObject:anEntity]; } } } if (aConnectionDictionary) { [srcModel setConnectionDictionary: aConnectionDictionary]; // Only for srcModel, not for additional models? } exprClass = [[EOAdaptor adaptorWithModel: srcModel] expressionClass]; if (schemaDropOptions != 0 || schemaCreateOptions != 0) { // We split SQL execution in two parts: first we drop elements, and create tables, // and in a second phase we create constraints: this allows us to fill in database with data // and then we set the database constraints. NSDictionary *aDictionary = [NSDictionary dictionaryWithObjectsAndKeys: ((schemaDropOptions & databaseOption) ? @"YES":@"NO"), EODropDatabaseKey, ((schemaDropOptions & tablesOption) ? @"YES":@"NO"), EODropTablesKey, ((schemaDropOptions & pkSupportOption) ? @"YES":@"NO"), EODropPrimaryKeySupportKey, // ((schemaDropOptions & pkConstraintsOption) ? @"YES":@"NO"), EOPrimaryKeyConstraintsKey, // ((schemaDropOptions & fkConstraintsOption) ? @"YES":@"NO"), EOForeignKeyConstraintsKey, ((schemaCreateOptions & databaseOption) ? @"YES":@"NO"), EOCreateDatabaseKey, ((schemaCreateOptions & tablesOption) ? @"YES":@"NO"), EOCreateTablesKey, @"NO", EOCreatePrimaryKeySupportKey, @"NO", EOPrimaryKeyConstraintsKey, @"NO", EOForeignKeyConstraintsKey, nil]; NSEnumerator *anEnum; EOSQLExpression *aStatement; if([aDictionary count] > 0) initialStatements = [exprClass schemaCreationStatementsForEntities: entitiesList options: aDictionary]; aDictionary = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", EODropDatabaseKey, @"NO", EODropTablesKey, @"NO", EODropPrimaryKeySupportKey, // @"NO", EOPrimaryKeyConstraintsKey, // @"NO", EOForeignKeyConstraintsKey, @"NO", EOCreateDatabaseKey, @"NO", EOCreateTablesKey, ((schemaCreateOptions & pkSupportOption) ? @"YES":@"NO"), EOCreatePrimaryKeySupportKey, ((schemaCreateOptions & pkConstraintsOption) ? @"YES":@"NO"), EOPrimaryKeyConstraintsKey, ((schemaCreateOptions & fkConstraintsOption) ? @"YES":@"NO"), EOForeignKeyConstraintsKey, nil]; if([aDictionary count] > 0) endingStatements = [exprClass schemaCreationStatementsForEntities: entitiesList options: aDictionary]; if(initialStatements){ if ([destType isEqualToString: @"database"]) { executeSQLStatements(srcModel, initialStatements, force); } else { // script anEnum = [initialStatements objectEnumerator]; while ((aStatement = [anEnum nextObject])) [exprClass appendExpression: aStatement toScript: outputString]; } } } if (sourceType) { // Dump if ([sourceType isEqualToString: @"plist"]) { if (sourceFilename) { dataDictionary = [[NSDictionary alloc] initWithContentsOfFile: sourceFilename]; NSCAssert1(dataDictionary != nil, @"Unable to read plist from file '%@'", sourceFilename); } #ifndef GNUSTEP else { #warning TODO: test this NSString *errorString = nil; NSData *readData = [[NSFileHandle fileHandleWithStandardInput] readDataToEndOfFile]; dataDictionary = [NSPropertyListSerialization propertyListFromData: readData mutabilityOption: NSPropertyListImmutable format: NULL errorDescription: &errorString]; if (errorString != nil) [NSException raise: NSInvalidArgumentException format: @"Unable to load plist from stdin: %@", errorString]; if (![dataDictionary isKindOfClass:[NSDictionary class]]) [NSException raise: NSInvalidArgumentException format: @"Invalid plist format from stdin: should be a dictionary"]; [dataDictionary retain]; } #endif } else { // database // We get data from database NSEnumerator *anEnum = [entitiesList objectEnumerator]; EOEntity *anEntity; EOEditingContext *aContext = [[EOEditingContext alloc] init]; dataDictionary = [[NSMutableDictionary alloc] init]; while ((anEntity = [anEnum nextObject])) { // We don't fetch abstract entities if (![anEntity isAbstractEntity]) { NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init]; NSArray *attributes = [anEntity attributes]; NSEnumerator *anAttrEnum = [attributes objectEnumerator]; EOAttribute *anAttribute; NSMutableArray *attributeNames = [NSMutableArray array]; NSArray *rawRows; NSMutableArray *rows; EOFetchSpecification *fetchSpec; NSDictionary *aRawRow; BOOL usesPlistTypesOnly = [destType isEqualToString: @"plist"]; while ((anAttribute = [anAttrEnum nextObject])) { // We do fetch flattened or derived attributes (but we will not write them) [attributeNames addObject: [anAttribute name]]; } fetchSpec = [EOFetchSpecification fetchSpecificationWithEntityName: [anEntity name] qualifier: nil sortOrderings: nil]; [fetchSpec setFetchesRawRows: YES]; rows = [NSMutableArray array]; // FIXME Problem // If a raw row contains data which does not respect entity's constraints // (e.g. doesn't allow NULL attribute), then an exception is raised, // at least on WO4.5 rawRows = [aContext objectsWithFetchSpecification: fetchSpec]; anAttrEnum = [rawRows objectEnumerator]; while ((aRawRow = [anAttrEnum nextObject])) { NSMutableArray *values = [NSMutableArray array]; NSEnumerator *anEnum3 = [attributeNames objectEnumerator]; NSString *aName; while ((aName = [anEnum3 nextObject])) { id aValue = [aRawRow objectForKey: aName]; if ([aValue isEqual: [EONull null]]) [values addObject: @"__NULL__"]; else { if ([aValue isKindOfClass: [NSString class]]) { if (convertsNonASCII) [values addObject: [aValue lossyASCIIString]]; else [values addObject: aValue]; } else if(usesPlistTypesOnly){ if ([aValue isKindOfClass:[NSCalendarDate class]]){ // Format is ISO's + milliseconds [values addObject:[aValue descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S.%F %z" /*local:*/]]; } else if ([aValue isKindOfClass:[NSData class]]) [values addObject:[aValue description]]; /* else if ([aValue isKindOfClass:[NSDecimalNumber class]]) [values addObject:[aValue stringValue]];*/ else if ([aValue isKindOfClass:[NSNumber class]]) [values addObject:[aValue stringValue]]; else // FIXME No support for custom data types? [values addObject: aValue]; } else [values addObject: aValue]; } } [rows addObject: values]; } [(NSMutableDictionary *)dataDictionary setObject: [NSDictionary dictionaryWithObjectsAndKeys: attributeNames, @"attributeNames", rows, @"rows", nil] forKey: [anEntity name]]; [arp release]; } } [aContext release]; } } // Else, no sourcefile => schemaDrop and/or schemaCreate if (postInstall) { // Look for a key "AdaptorName"PostInstallExpressions which // which have an array of SQL expressions postInstallSQLExpressions = [[srcModel userInfo] objectForKey:[[[EOAdaptor adaptorWithModel: srcModel] name] stringByAppendingString:@"PostInstallExpressions"]]; } if ([destType isEqualToString: @"plist"]) { // Write data as plist NSCAssert(dataDictionary != nil, @"No data to write in plist?!?"); if (destFilename) NSCAssert1([[dataDictionary description] writeToFile:destFilename atomically:NO], @"Unable to write plist to '%@'", destFilename); else [(NSFileHandle *)[NSFileHandle fileHandleWithStandardOutput] writeData:[[dataDictionary description] dataUsingEncoding:NSUTF8StringEncoding]]; } else if ([destType isEqualToString: @"script"]) { // Write schemaDrop and/or schemaCreate script, or data creation SQL script if (dataDictionary) { // Generate SQL to create data from dataDictionary NSEnumerator *entityNameEnum = [dataDictionary keyEnumerator]; NSString *anEntityName; #warning PROBLEM: we cannot create the statement telling to defer constraints! // In the script, we miss: // BEGIN; // SET CONSTRAINTS ALL DEFERRED; // ... // COMMIT while ((anEntityName = [entityNameEnum nextObject])) { NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init]; EOEntity *anEntity = [[EOModelGroup defaultGroup] entityNamed: anEntityName]; NSEnumerator *aRowEnum = [[[dataDictionary objectForKey: anEntityName] objectForKey: @"rows"] objectEnumerator]; NSMutableDictionary *aDict = [NSMutableDictionary dictionary]; NSArray *aRow, *attrNames = [[dataDictionary objectForKey: anEntityName] objectForKey: @"attributeNames"]; while ((aRow = [aRowEnum nextObject])) { NSEnumerator *anAttributeEnum = [attrNames objectEnumerator]; NSEnumerator *aValueEnum = [aRow objectEnumerator]; NSString *anAttrName; while ((anAttrName = [anAttributeEnum nextObject])) { id aValue = [aValueEnum nextObject]; if (![aValue isKindOfClass: [NSString class]] || ![aValue isEqualToString: @"__NULL__"]) [aDict setObject: aValue forKey: anAttrName]; } [exprClass appendExpression: [exprClass insertStatementForRow: aDict entity: anEntity] toScript: outputString]; [aDict removeAllObjects]; } [arp release]; } } if (postInstallSQLExpressions) { [outputString appendString:[postInstallSQLExpressions componentsJoinedByString:@"\n"]]; } if (destFilename) { if (![outputString writeToFile: destFilename atomically: NO]) [NSException raise: NSInvalidArgumentException format: @"Unable to save file '%@'", destFilename]; } else [(NSFileHandle *)[NSFileHandle fileHandleWithStandardOutput] writeData: [outputString dataUsingEncoding: NSUTF8StringEncoding]]; } else { // database // Execute statements one after the other? if (dataDictionary) { NSEnumerator *entityEnum = [entitiesList objectEnumerator]; EOEntity *anEntity; EOEditingContext *anEC = [[EOEditingContext alloc] init]; [anEC setUndoManager:nil]; while ((anEntity = [entityEnum nextObject])) { NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init]; NSDictionary *aDictionary = [dataDictionary objectForKey: [anEntity name]]; NSArray *attributeNames = [aDictionary objectForKey: @"attributeNames"]; NSEnumerator *anEnum = [attributeNames objectEnumerator]; NSString *aName; NSMutableSet *newClassProperties = [NSMutableSet set]; EORelationship *aRelationship; if ([anEntity isReadOnly]) [anEntity setReadOnly: NO]; if (![[anEntity className] isEqualToString: @"EOGenericRecord"]) [anEntity setClassName: @"EOGenericRecord"]; while ((aName = [anEnum nextObject])) { EOAttribute *anAttribute = [anEntity attributeNamed: aName]; NSCAssert1(anAttribute != nil, @"'%@' is not a valid attribute name", aName); if (![anAttribute isReadOnly] && ![anAttribute isDerived]) [newClassProperties addObject: anAttribute]; } NSCAssert1([anEntity setClassProperties:[newClassProperties allObjects]], @"Unable to set new class properties from %@", newClassProperties); anEnum = [[NSArray arrayWithArray: [anEntity relationships]] objectEnumerator]; while ((aRelationship = [anEnum nextObject])) { [anEntity removeRelationship: aRelationship]; } [arp release]; } entityEnum = [entitiesList objectEnumerator]; while ((anEntity = [entityEnum nextObject])) { NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init]; NSDictionary *aDictionary = [dataDictionary objectForKey: [anEntity name]]; NSEnumerator *rowEnum = [[aDictionary objectForKey: @"rows"] objectEnumerator]; NSArray *aRow; NSArray *attributeNames = [aDictionary objectForKey: @"attributeNames"]; NSEnumerator *attrNameEnum = [attributeNames objectEnumerator]; NSString *anAttrName; NSMutableArray *filteredAttributeNames = [NSMutableArray array]; NSArray *classPropertyNames = [anEntity classPropertyNames]; // First, we filter out given attribute names to retain only // the ones that have a matching class property // (we already cleaned up entities attributes/relationships) while ((anAttrName = [attrNameEnum nextObject])){ if([classPropertyNames containsObject:anAttrName]) [filteredAttributeNames addObject:anAttrName]; } while ((aRow = [rowEnum nextObject])) { NSAutoreleasePool *arp2 = [[NSAutoreleasePool alloc] init]; EOGenericRecord *aRecord = [anEC createAndInsertInstanceOfEntityNamed: [anEntity name]]; attrNameEnum = [filteredAttributeNames objectEnumerator]; while ((anAttrName = [attrNameEnum nextObject])) { NSString *aStringValue; id aValue = nil; i = [attributeNames indexOfObject:anAttrName]; aStringValue = [aRow objectAtIndex: i]; if ([aStringValue isEqualToString: @"__NULL__"]) aValue = [EONull null]; else { EOAttribute *anAttribute = [anEntity attributeNamed: anAttrName]; NSString *internalType = [anAttribute valueClassName]; if ([internalType isEqualToString: @"NSString"]) { aValue = aStringValue; } else if ([internalType isEqualToString: @"NSNumber"]) { #if 0 if (![anAttribute valueType] || [@"cil" rangeOfString: [anAttribute valueType]].length != 0) aValue = [NSNumber numberWithInt: [aStringValue intValue]]; else if([@"fd" rangeOfString: [anAttribute valueType]].length != 0) aValue = [NSNumber numberWithDouble: [aStringValue doubleValue]]; else [NSException raise:NSInvalidArgumentException format:@"Unknown valueType '%@' for attribute %@", [anAttribute valueType], anAttribute]; #else aValue = [NSNumber numberWithDouble: [aStringValue doubleValue]]; #endif } else if ([internalType isEqualToString: @"NSDecimalNumber"]) { aValue = [NSDecimalNumber decimalNumberWithString: aStringValue]; NSCAssert1(aValue != nil, @"Invalid decimal number representation: %@", aStringValue); } else if ([internalType isEqualToString:@"NSCalendarDate"]) { // Format is Apple's eoutil format aValue = [[NSCalendarDate alloc] initWithString: aStringValue calendarFormat: @"%b %d %Y %H:%M" /*locale:*/]; if(!aValue) // Format is ISO's aValue = [[NSCalendarDate alloc] initWithString: aStringValue calendarFormat: @"%Y-%m-%d %H:%M:%S %z" /*locale:*/]; if(!aValue) // Format is ISO's + milliseconds aValue = [[NSCalendarDate alloc] initWithString:aStringValue calendarFormat:@"%Y-%m-%d %H:%M:%S.%F %z" /*locale:*/]; NSCAssert1(aValue != nil, @"Unable to parse date from '%@'", aStringValue); [aValue autorelease]; } else if ([internalType isEqualToString: @"NSData"]) { if ([aStringValue isEqualToString: @""]) aValue = [NSData data]; else { aValue = [aStringValue propertyList]; NSCAssert1([aValue isKindOfClass: [NSData class]], @"Invalid data: %@", aStringValue); } } else [NSException raise:NSInvalidArgumentException format: @"Unknown attribute (%@) valueClassName: %@", anAttribute, internalType]; } [aRecord takeStoredValue: aValue forKey: anAttrName]; } NS_DURING { [anEC saveChanges]; } NS_HANDLER { if(!force){ [anEC release]; [arp2 release]; [arp release]; [localException raise]; } else{ NSLog(@"%@", localException); [anEC revert]; } } NS_ENDHANDLER; [arp2 release]; } [arp release]; } [anEC release]; } if(endingStatements) executeSQLStatements(srcModel, endingStatements, force); if (postInstallSQLExpressions) { EODatabaseContext *databaseContext; EOEditingContext *anEC = [[EOEditingContext alloc] init]; databaseContext = [EODatabaseContext registeredDatabaseContextForModel: srcModel editingContext: anEC]; [databaseContext lock]; NS_DURING { EODatabaseChannel *databaseChannel = [databaseContext availableChannel]; EOAdaptorChannel *adaptorChannel = [databaseChannel adaptorChannel]; NSString *aString; NSEnumerator *anEnum; if (![adaptorChannel isOpen]) [adaptorChannel openChannel]; anEnum = [postInstallSQLExpressions objectEnumerator]; while ((aString = [anEnum nextObject])) { NS_DURING EOSQLExpression *aStatement = [exprClass expressionForString:aString]; [adaptorChannel evaluateExpression: aStatement]; NS_HANDLER if(!force) break; NS_ENDHANDLER; } [databaseContext unlock]; [anEC release]; } NS_HANDLER { [databaseContext unlock]; [anEC release]; [localException raise]; } NS_ENDHANDLER; } } return YES; } static BOOL convert(NSArray *arguments) { EOModel *aModel; EOAdaptor *newAdaptor; NSDictionary *newConnectionDictionary; NSString *newFilename; if ([arguments count] < 4) return NO; aModel = [[EOModel alloc] initWithContentsOfFile: [[arguments objectAtIndex: 0] stringByStandardizingPath]]; newAdaptor = [EOAdaptor adaptorWithName: [arguments objectAtIndex: 1]]; newConnectionDictionary = [[arguments objectAtIndex: 2] propertyList]; newFilename = [[arguments objectAtIndex: 3] stringByStandardizingPath]; [aModel setAdaptorName: [newAdaptor name]]; [aModel setConnectionDictionary: newConnectionDictionary]; [[newAdaptor class] assignExternalInfoForEntireModel: aModel]; [aModel writeToFile: newFilename]; [aModel release]; NSLog(@"Converted %@ to %@", [arguments objectAtIndex: 0], newFilename); return YES; } static BOOL dbConnect(NSArray *arguments) { EOAdaptor *anAdaptor = nil; NSDictionary *aConnectionDictionary = nil; EOModel *aModel; switch ([arguments count]) { case 1: aModel = [[EOModel alloc] initWithContentsOfFile: [[arguments objectAtIndex: 0] stringByStandardizingPath]]; anAdaptor = [EOAdaptor adaptorWithModel: aModel]; aConnectionDictionary = [aModel connectionDictionary]; [aModel release]; default: if (anAdaptor == nil) { anAdaptor = [EOAdaptor adaptorWithName: [arguments objectAtIndex: 0]]; aConnectionDictionary = [[arguments objectAtIndex: 1] propertyList]; [anAdaptor setConnectionDictionary: aConnectionDictionary]; } [anAdaptor assertConnectionDictionaryIsValid]; } return YES; } int main(int arcg, char *argv[], char **envp) { NSAutoreleasePool *localAP = [[NSAutoreleasePool alloc] init]; BOOL noUsage = NO; NSArray *arguments = [[NSProcessInfo processInfo] arguments]; int argc = [arguments count]; BOOL hasError = NO; if (argc >= 2) { NSString *command = [arguments objectAtIndex: 1]; if (argc > 2) arguments = [arguments subarrayWithRange: NSMakeRange(2, argc - 2)]; else arguments = [NSArray array]; NS_DURING { if ([command isEqualToString: @"dump"]) noUsage = dump(arguments); else if ([command isEqualToString: @"convert"]) noUsage = convert(arguments); else if ([command isEqualToString: @"connect"]) noUsage = dbConnect(arguments); else if ([command isEqualToString: @"help"]) noUsage = usage(YES); } NS_HANDLER { noUsage = ![[localException name] isEqualToString: NSInvalidArgumentException]; hasError = YES; NSLog(@"%@", localException); } NS_ENDHANDLER; } if (!noUsage) (void)usage(NO); [localAP release]; return hasError; } gnustep-dl2-0.12.0/Tools/NSDictionary+GSDoc.h0000664000175000017500000000263414632325605017607 0ustar yavoryavor/* -*-objc-*- NSDictionary+GSDoc.h Copyright (C) 2000-2002,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ // $Id$ #ifndef __NSDictionary_GSDoc_h__ #define __NSDictionary_GSDoc_h__ #include @interface NSDictionary (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr; - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr; @end #endif /* __NSDictionary_GSDoc_h__ */ gnustep-dl2-0.12.0/Tools/EOAttribute+GSDoc.m0000664000175000017500000001010614636026724017432 0ustar yavoryavor/* EOAttribute+GSDoc.m Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #else #include #endif #ifndef GNUSTEP #include #endif #include #include #include #include "NSArray+GSDoc.h" #include "NSDictionary+GSDoc.h" #include "EOAttribute+GSDoc.h" /* NSString* calendarFormat; NSTimeZone* clientTimeZone; NSTimeZone* serverTimeZone; NSString* insertFormat; NSString* selectFormat; NSString* updateFormat; NSMutableArray* definitionArray; // These variables are meaningful only EOAttribute* realAttribute; // if the attribute is flattened */ @implementation EOAttribute (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr { return [self gsdocContentWithTagName: @"EOAttribute" idPtr: xmlIdPtr]; } - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *content = [NSString string]; NSLog(@"Start: %@: %@ tagName=%@", [self class], [self name], tagName); if ([tagName isEqual: @"EOAttributeRef"]) { content = [content stringByAppendingFormat: @"\n", [self name], (xmlIdPtr ? [NSString stringWithFormat: @" debugId=\"%d\"", (*xmlIdPtr)++] : @"")]; } else { content = [content stringByAppendingFormat: @"<%@%@%@%@%@%@%@%@%@%@%@>\n", tagName, ([self columnName] ? [NSString stringWithFormat: @" columnName=\"%@\"", [self columnName]] : @""), ([self definition] ? [NSString stringWithFormat: @" definition=\"%@\"", [self definition]] : @""), ([self externalType] ? [NSString stringWithFormat: @" externalType=\"%@\"", [self externalType]] : @""), ([self name] ? [NSString stringWithFormat: @" name=\"%@\"", [self name]] : @""), ([self valueClassName] ? [NSString stringWithFormat: @" valueClassName=\"%@\"", [self valueClassName]] : @""), ([self valueType] ? [NSString stringWithFormat: @" valueType=\"%@\"", [self valueType]] : @""), ([[self entity] name] ? [NSString stringWithFormat: @" entityName=\"%@\"", [[self entity] name]] : @""), ([self isReadOnly] ? @" isReadOnly=\"YES\"" : @""), ([self isDerived] ? @" isDerived=\"YES\"" : @""), ([self isFlattened] ? @" isFlattened=\"YES\"" : @"")]; if ([[self userInfo] count]) content = [content stringByAppendingString: [[self userInfo] gsdocContentWithTagName: @"EOUserDictionary" idPtr: xmlIdPtr]]; if ([self docComment]) content = [content stringByAppendingFormat: @"%@\n", [self docComment]]; content = [content stringByAppendingFormat: @"\n", tagName]; } NSLog(@"Stop: %@: %@", [self class], [self name]); RETAIN(content); DESTROY(arp); return AUTORELEASE(content); } @end gnustep-dl2-0.12.0/Tools/Makefile.postamble0000664000175000017500000000344714632325605017565 0ustar yavoryavor# # Makefile.postamble # # Copyright (C) 1997,2002,2005 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Database Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # Makefile.postamble # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling before-all:: # Things to do after compiling # after-all:: # Things to do before installing # before-install:: # Things to do after installing # after-install:: # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check: gnustep-dl2-0.12.0/Tools/EOAttribute+GSDoc.h0000664000175000017500000000266514632325605017434 0ustar yavoryavor/* -*-objc-*- EOAttribute+GSDoc.h Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ // $Id$ #ifndef __EOAttribute_GSDoc_h__ #define __EOAttribute_GSDoc_h__ #include @interface EOAttribute (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr; - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr; @end #endif /* __EOAttribute_GSDoc_h__ */ gnustep-dl2-0.12.0/Tools/EORelationship+GSDoc.h0000664000175000017500000000264514632325605020130 0ustar yavoryavor/* -*-objc-*- EORelationship+GSDoc.h Copyright (C) 2000-2002,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ // $Id$ #ifndef __EORelationship_GSDoc_h__ #define __EORelationship_GSDoc_h__ #include @interface EORelationship (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr; - (NSString *)gsdocContentWithTagName: (NSString *)tagName idPtr: (int *)xmlIdPtr; @end #endif /* __EORelationship_GSDoc_h__ */ gnustep-dl2-0.12.0/Tools/EOModel+GSDoc.h0000664000175000017500000000263014632325605016521 0ustar yavoryavor/* -*-objc-*- EOModel+GSDoc.h Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ // $Id$ #ifndef __EOModel_GSDoc_h__ #define __EOModel_GSDoc_h__ #include @interface EOModel (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr; - (NSString *)gsdocContentSplittedByEntities: (NSDictionary **)entitiesPtr idPtr: (int *)xmlIdPtr; @end #endif /* __EOModel_GSDoc_h__ */ gnustep-dl2-0.12.0/Tools/EOEntity+GSDoc.m0000664000175000017500000001027314636026724016750 0ustar yavoryavor/* EOEntity+GSDoc.m Copyright (C) 2000-2002,2003,2004,2005 Free Software Foundation, Inc. Author: Manuel Guesdon Date: August 2000 $Revision$ $Date$ This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "config.h" #ifdef GNUSTEP #include #else #include #endif #ifndef GNUSTEP #include #endif #include #include #include "NSArray+GSDoc.h" #include "NSDictionary+GSDoc.h" #include "EOModel+GSDoc.h" #include "EOEntity+GSDoc.h" /* NSString* externalQuery; NSArray* attributesNamesUsedForInsert; EOQualifier* qualifier; NSArray* attributesUsedForInsert; // cache from classProperties NSArray* attributesUsedForFetch; // cache from classProperties NSArray* relationsUsedForFetch; // cache from classProperties */ @implementation EOEntity (GSDoc) - (NSString *)gsdocContentWithIdPtr: (int *)xmlIdPtr { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *content = [NSString string]; NSLog(@"Start: %@: %@", [self class], [self name]); content = [content stringByAppendingFormat: @"\n", (xmlIdPtr ? [NSString stringWithFormat: @" debugId=\"%d\"", (*xmlIdPtr)++] : @""), ([self name] ? [NSString stringWithFormat: @" name=\"%@\"", [self name]] : @""), ([self externalName] ? [NSString stringWithFormat: @" externalName=\"%@\"", [self externalName]] : @""), ([self className] ? [NSString stringWithFormat: @" className=\"%@\"", [self className]] : @""), ([[self model] name] ? [NSString stringWithFormat: @" modelName=\"%@\"", [[self model] name]] : @""), ([self isReadOnly] ? @"isReadOnly=\"YES\"" : @"")]; if ([self attributes]) content = [content stringByAppendingString: [[self attributes] gsdocContentWithTagName: nil idPtr: xmlIdPtr]]; if ([self attributesUsedForLocking]) content = [content stringByAppendingString: [[self attributesUsedForLocking] gsdocContentWithTagName: @"EOAttributesUsedForLocking" elementsTagName: @"EOAttributeRef" idPtr: xmlIdPtr]]; if ([self classProperties]) content = [content stringByAppendingString: [[self classProperties] gsdocContentWithTagName: @"EOClassProperties" elementsTagName: @"EOAttributeRef" idPtr: xmlIdPtr]]; if ([self primaryKeyAttributes]) content = [content stringByAppendingString: [[self primaryKeyAttributes] gsdocContentWithTagName: @"EOPrimaryKeyAttributes" elementsTagName: @"EOAttributeRef" idPtr: xmlIdPtr]]; if ([self relationships]) content = [content stringByAppendingString: [[self relationships] gsdocContentWithTagName: nil idPtr: xmlIdPtr]]; if ([[self userInfo] count]) content = [content stringByAppendingString: [[self userInfo] gsdocContentWithTagName: @"EOUserDictionary" idPtr: xmlIdPtr]]; if ([self docComment]) content = [content stringByAppendingFormat: @"%@\n", [self docComment]]; content = [content stringByAppendingString: @"\n"]; NSLog(@"Stop: %@: %@", [self class], [self name]); RETAIN(content); DESTROY(arp); return AUTORELEASE(content); } @end gnustep-dl2-0.12.0/TODO0000664000175000017500000000135314636002701013513 0ustar yavoryavorGDL2Palette is currently broken, please send patches EOControl: Implement & Test: EOControl/EOMultiReaderLocks Implement & Test: EOControl/EOEvent(Center) Test: EOSharedEditingContext Test: validateTakeValue:forKeyPath: (does the method propagate or is it forwarded down to last component?) EOAccess: Implement databaseFailedToFetchObject mechanism. (EODatabaseContextDelegation) Cf Developper's guide p 121 Implement & Test: EOAccesss/EOSchemaSynchronization Test: EOAccess/EOGenericRecord category Implement & Test: to-one PK to Foreign Key support (Not implemented by WO but it's really cool) Adaptors: Documentation: API Documentation Tutorials: See Trading example of a Framework usable for EOInterface and GSWeb Examples: gnustep-dl2-0.12.0/Examples/0000775000175000017500000000000014754345051014610 5ustar yavoryavorgnustep-dl2-0.12.0/Examples/example.GNUmakefile0000664000175000017500000000034014632325605020307 0ustar yavoryavorinclude $(GNUSTEP_MAKEFILES)/common.make include $(GNUSTEP_MAKEFILES)/Auxiliary/gdl2.make TOOL_NAME=eoexample eoexample_OBJC_FILES=eoexample.m eoexample_RESOURCE_FILES=library.eomodel include $(GNUSTEP_MAKEFILES)/tool.make gnustep-dl2-0.12.0/Examples/GNUmakefile0000664000175000017500000000111614754345005016660 0ustar yavoryavorinclude ../common.make include $(GNUSTEP_MAKEFILES)/common.make include $(GNUSTEP_MAKEFILES)/Auxiliary/gdl2.make SUBPROJECTS = Trading ADDITIONAL_NATIVE_LIBS=EOAccess EOControl # This is strictly for integration into the gdl2 build system # If you are basing a gdl2 application off of these examples # you won't need the following line in your GNUmakefiles. ADDITIONAL_NATIVE_LIB_DIRS=../EOAccess ../EOControl include GNUmakefile.eoexample include GNUmakefile.connection include GNUmakefile.eoexample2 include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/tool.make gnustep-dl2-0.12.0/Examples/eoexample.m0000664000175000017500000000310314754345005016741 0ustar yavoryavor#include #include #include int main(int arcg, char *argv[], char **envp) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; EOModelGroup *group = [EOModelGroup defaultGroup]; EOModel *model; EOAdaptor *adaptor; EOAdaptorContext *context; EOAdaptorChannel *channel; EOEditingContext *ec; EODatabaseDataSource *authorsDS; NSArray *authors; id author; model = [group modelNamed:@"library"]; /* Tools don't have resources so we have to add the model manually */ if (!model) { NSString *path = @"./library.eomodel"; model = [[EOModel alloc] initWithContentsOfFile: path]; [group addModel:model]; [model release]; } adaptor = [EOAdaptor adaptorWithModel:model]; context = [adaptor createAdaptorContext]; channel = [context createAdaptorChannel]; ec = [[EOEditingContext alloc] init]; authorsDS = [[EODatabaseDataSource alloc] initWithEditingContext: ec entityName:@"authors"]; [channel openChannel]; /* Create a new author object */ author = [authorsDS createObject]; [author takeValue:@"Anonymous" forKey:@"name"]; [authorsDS insertObject:author]; [ec saveChanges]; /* Fetch the newly inserted object from the database */ authors = [authorsDS fetchObjects]; NSLog(@"%@", authors); /* Update the authors name */ [[authors objectAtIndex:0] takeValue:@"John Doe" forKey:@"name"]; [ec saveChanges]; NSLog(@"%@", [authorsDS fetchObjects]); [channel closeChannel]; [pool release]; return 0; } gnustep-dl2-0.12.0/Examples/eoexample2.m0000664000175000017500000000411514632325605017026 0ustar yavoryavor#include #include #include int main(int arcg, char *argv[], char **envp) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; EOModelGroup *group = [EOModelGroup defaultGroup]; EOModel *model; EOAdaptor *adaptor; EOAdaptorContext *context; EOAdaptorChannel *channel; EOEditingContext *ec; EODatabaseDataSource *authorsDS; EODataSource *booksDS; id author; id book; model = [group modelNamed:@"library"]; /* Tools do not have resources so we add the model manually. */ if (!model) { NSString *path = @"./library.eomodel"; model = [[EOModel alloc] initWithContentsOfFile: path]; [group addModel:model]; [model release]; } adaptor = [EOAdaptor adaptorWithModel:model]; context = [adaptor createAdaptorContext]; channel = [context createAdaptorChannel]; ec = [[EOEditingContext alloc] init]; authorsDS = [[EODatabaseDataSource alloc] initWithEditingContext: ec entityName:@"authors"]; [channel openChannel]; author = [authorsDS createObject]; [author takeValue:@"Richard Brautigan" forKey:@"name"]; [authorsDS insertObject:author]; booksDS = [authorsDS dataSourceQualifiedByKey:@"toBooks"]; [booksDS qualifyWithRelationshipKey:@"toBooks" ofObject:author]; book = [booksDS createObject]; [book takeValue:@"The Hawkline Monster" forKey:@"title"]; [booksDS insertObject:book]; book = [booksDS createObject]; [book takeValue:@"Trout Fishing in America" forKey:@"title"]; [booksDS insertObject:book]; [ec saveChanges]; /* log the to many relationship from author to books */ NSLog(@"%@ %@", [author valueForKey:@"name"], [author valueForKeyPath:@"toBooks.title"]); /* log the to one relationship from book to author */ NSLog(@"%@", [book valueForKeyPath:@"toAuthor.name"]); /* traverse to one through the to many through key paths logging the author once for each book. */ NSLog(@"%@", [author valueForKeyPath:@"toBooks.toAuthor.name"]); [channel closeChannel]; [pool release]; return 0; } gnustep-dl2-0.12.0/Examples/library.eomodel0000664000175000017500000000325614754345005017627 0ustar yavoryavor{ EOModelVersion = 2; adaptorName = SQLite3; connectionDictionary = { databasePath = "/tmp/example.db"; }; entities = ( { attributes = ( { columnName = authorID; externalType = integer; name = authorID; valueClassName = NSNumber; }, { columnName = name; externalType = varchar; name = name; valueClassName = NSString; } ); className = EOGenericRecord; classProperties = ( name, toBooks ); externalName = authors; name = authors; primaryKeyAttributes = ( authorID ); relationships = ( { destination = books; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = authorID; sourceAttribute = authorID; } ); name = toBooks; } ); }, { attributes = ( { columnName = authorID; externalType = integer; name = authorID; valueClassName = NSNumber; }, { columnName = bookID; externalType = integer; name = bookID; valueClassName = NSNumber; }, { columnName = title; externalType = varchar; name = title; valueClassName = NSString; } ); className = EOGenericRecord; classProperties = ( title, toAuthor ); externalName = books; name = books; primaryKeyAttributes = ( bookID ); relationships = ( { destination = authors; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = authorID; sourceAttribute = authorID; } ); name = toAuthor; } ); } ); name = library; } gnustep-dl2-0.12.0/Examples/GNUmakefile.eoexample20000664000175000017500000000017414632325605020722 0ustar yavoryavorTOOL_NAME+=eoexample2 eoexample2_NEEDS_GUI=no eoexample2_OBJC_FILES=eoexample2.m eoexample2_RESOURCE_FILES=library.eomodel gnustep-dl2-0.12.0/Examples/connection.m0000664000175000017500000000164414754345005017131 0ustar yavoryavor#include #include #include int main(int arcg, char *argv[], char **envp) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; EOModelGroup *modelGroup = [EOModelGroup defaultGroup]; EOModel *model = [modelGroup modelNamed:@"library"]; EOAdaptor *adaptor; EOAdaptorContext *context; EOAdaptorChannel *channel; /* Tools don't have resources so we have to add the model manually. */ if (!model) { NSString *path = @"./library.eomodel"; model = [[EOModel alloc] initWithContentsOfFile: path]; [modelGroup addModel:model]; [model release]; } adaptor = [EOAdaptor adaptorWithName:[model adaptorName]]; context = [adaptor createAdaptorContext]; channel = [context createAdaptorChannel]; [channel openChannel]; /* insert code here */ [channel closeChannel]; [pool release]; return 0; } gnustep-dl2-0.12.0/Examples/GNUmakefile.eoexample0000664000175000017500000000016714632325605020642 0ustar yavoryavorTOOL_NAME+=eoexample eoexample_NEEDS_GUI=no eoexample_OBJC_FILES=eoexample.m eoexample_RESOURCE_FILES=library.eomodel gnustep-dl2-0.12.0/Examples/Trading/0000775000175000017500000000000014754345067016207 5ustar yavoryavorgnustep-dl2-0.12.0/Examples/Trading/TradingData.m0000664000175000017500000002037114632325605020541 0ustar yavoryavor#include "TradingData.h" #define PDEC2(x) \ [NSDecimalNumber decimalNumberWithMantissa:x \ exponent:-2 \ isNegative:NO] @implementation TradingData - (id) init { self = [super init]; if (self) { ec = [[EOEditingContext alloc] init]; customerDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"Customer"]; customerGroupDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"CustomerGroup"]; productGroupDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"ProductGroup"]; productDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"Product"]; suppliersDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"Supplier"]; priceListDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"PriceList"]; priceListPosDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"PriceListPos"]; orderDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"Order"]; orderPosDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec entityName:@"OrderPos"]; } return self; } - (void) dealloc { [ec release]; [customerDS release]; [customerGroupDS release]; [productGroupDS release]; [productDS release]; [suppliersDS release]; [priceListDS release]; [priceListPosDS release]; [orderDS release]; [orderPosDS release]; } - (void) fillTables { id fsfSup, mysqlSup, postgreSup, publicSup, acmeSup; id implGrp, softGrp; id folkGrp; id rake, shovel, pitchfork, mysql, postgresql, sqlite, gnustep, gcc; id salePriceList; id customer; id order; implGrp = [self addProductGroup:@"Implements of destruction"]; softGrp = [self addProductGroup:@"Software"]; fsfSup = [self addSupplierNamed:@"The Free Software Foundation"]; gnustep = [self addProduct:@"GNUstep" price:PDEC2(2595) supplier:fsfSup group:softGrp]; gcc = [self addProduct:@"gcc" price:PDEC2(4995) supplier:fsfSup group:softGrp]; mysqlSup = [self addSupplierNamed:@"MySQL AB"]; mysql = [self addProduct:@"MySQL" price:PDEC2(3000) supplier:fsfSup group:softGrp]; postgreSup = [self addSupplierNamed:@"The PostgreSQL Global Development Group"]; postgresql = [self addProduct:@"PostgreSQL" price:PDEC2(3000) supplier:postgreSup group:softGrp]; publicSup = [self addSupplierNamed:@"sqlite.org"]; sqlite = [self addProduct:@"SQLite" price:PDEC2(1500) supplier:publicSup group:softGrp]; acmeSup = [self addSupplierNamed:@"ACME"]; shovel = [self addProduct:@"Shovel" price:PDEC2(1400) supplier:acmeSup group:implGrp]; rake = [self addProduct:@"Rake" price:PDEC2(1295) supplier:acmeSup group:implGrp]; pitchfork = [self addProduct:@"Pitchfork" price:PDEC2(1800) supplier:acmeSup group:implGrp]; folkGrp = [self addCustomerGroup:@"Angry Townfolk"]; [self customer:[self addCustomer:@"Angry Townsperson1" group:folkGrp] order:rake quantity:3]; [self customer:[self addCustomer:@"Angry Townsperson2" group:folkGrp] order:shovel]; [self customer:[self addCustomer:@"Angry Townsperson3" group:folkGrp] order:rake quantity:2]; customer = [self addCustomer:@"Test Customer1"]; order = [self createOrderForCustomer:customer]; [self order:order product:mysql quantity:5]; [self order:order product:postgresql quantity:1]; [self order:order product:rake quantity:2]; [self customer:[self addCustomer:@"Test Customer2"] order:postgresql]; [self customer:[self addCustomer:@"Test Customer3"] order:sqlite]; salePriceList = [self addPriceList:@"Farm Supply Sale" forGroup:folkGrp]; [self addProduct:pitchfork price:PDEC2(1675) toPriceList:salePriceList]; [self addProduct:rake price:PDEC2(800) toPriceList:salePriceList]; [self addProduct:shovel price:PDEC2(995) toPriceList:salePriceList]; [self saveChanges]; } - (id) addPriceList:(NSString *)name forGroup:(id)grp { id record = [priceListDS createObject]; [record takeValue:name forKey:@"name"]; [record addObject:grp toBothSidesOfRelationshipWithKey:@"customerGroup"]; return record; } - (id) addProduct:(id)product price:(NSDecimalNumber *)price toPriceList:(id)priceList { id record = [priceListPosDS createObject]; [record addObject:product toBothSidesOfRelationshipWithKey:@"product"]; [record takeValue:price forKey:@"price"]; [record addObject:priceList toBothSidesOfRelationshipWithKey:@"priceList"]; [priceListPosDS insertObject:record]; return record; } - (id) addProductGroup:(NSString *)productGroupName { id record = [productGroupDS createObject]; [record takeValue:productGroupName forKey:@"name"]; return record; } - (id) addSupplierNamed:(NSString *)name { id record = [suppliersDS createObject]; [record takeValue:name forKey:@"name"]; [suppliersDS insertObject:record]; return record; } - (id) addProduct:(NSString *)productName price:(NSDecimalNumber *)price supplier:(id)supplier group:(id)productGroup { id record = [productDS createObject]; [record takeValue:productName forKey:@"name"]; [record takeValue:price forKey:@"price"]; [record addObject:supplier toBothSidesOfRelationshipWithKey:@"supplier"]; [record addObject:productGroup toBothSidesOfRelationshipWithKey:@"productGroup"]; [productDS insertObject:record]; return record; } - (id) addCustomerGroup:(NSString *)name { id record = [customerGroupDS createObject]; [record takeValue:name forKey:@"name"]; [customerGroupDS insertObject:record]; return record; } - (id) addCustomer:(NSString *)name { return [self addCustomer:name group:nil]; } - (id) addCustomer:(NSString *)name group:(id)group { id record = [customerDS createObject]; [record takeValue:name forKey:@"name"]; [record addObject:group toBothSidesOfRelationshipWithKey:@"customerGroup"]; [customerDS insertObject:record]; return record; } - (id) createOrderForCustomer:(id)customer { id order = [orderDS createObject]; [order takeValue:[NSDate date] forKey:@"date"]; [order addObject:customer toBothSidesOfRelationshipWithKey:@"customer"]; [orderDS insertObject:order]; return order; } - (id) order:(id)order product:(id)product quantity:(int)quantity { id orderPos = [orderPosDS createObject]; NSNumber *price = [product valueForKey:@"price"]; NSNumber *qNum = [NSNumber numberWithInt:quantity]; /* this should really not be in the database but in some business logic */ NSNumber *value = [NSNumber numberWithDouble:((double)quantity) * [price doubleValue]]; [orderPos addObject:product toBothSidesOfRelationshipWithKey:@"product"]; [orderPos addObject:order toBothSidesOfRelationshipWithKey:@"order"]; /* FIXME customer group pricing */ [orderPos takeValue:price forKey:@"price"]; [orderPos takeValue:qNum forKey:@"quantity"]; [orderPos takeValue:value forKey:@"value"]; /* FIXME this should be a relationship to a pos table */ [orderPos takeValue:[NSNumber numberWithInt:1] forKey:@"posnr"]; return orderPos; } - (id) customer:(id)customer order:(id)product { return [self customer:customer order:product quantity:1]; } - (id) customer:(id)customer order:(id)product quantity:(int)quantity { return [self customer:customer order:product quantity:quantity posNr:1]; } - (id) customer:(id)customer order:(id)product quantity:(int)quantity posNr:(int)posNr { id order = [orderDS createObject]; id orderPos = [orderPosDS createObject]; NSNumber *price = [product valueForKey:@"price"]; NSNumber *qNum = [NSNumber numberWithInt:quantity]; NSNumber *value = [NSNumber numberWithDouble:((double)quantity) * [price doubleValue]]; [order takeValue:[NSDate date] forKey:@"date"]; [order addObject:customer toBothSidesOfRelationshipWithKey:@"customer"]; [orderPos addObject:order toBothSidesOfRelationshipWithKey:@"order"]; /* FIXME customer group pricing */ [orderPos takeValue:price forKey:@"price"]; [orderPos takeValue:qNum forKey:@"quantity"]; [orderPos takeValue:value forKey:@"value"]; /* fixme this should be a relationship to a pos table */ [orderPos takeValue:[NSNumber numberWithInt:posNr] forKey:@"posnr"]; [orderPos addObject:product toBothSidesOfRelationshipWithKey:@"product"]; return order; } - (void) saveChanges { [ec saveChanges]; } @end gnustep-dl2-0.12.0/Examples/Trading/GNUmakefile0000664000175000017500000000123114754345067020256 0ustar yavoryavorinclude ../../common.make include $(GNUSTEP_MAKEFILES)/common.make include ../../Version include ../../common.make NATIVE_LIBRARY_NAME=Trading TOOL_NAME=createTradingDB Trading_RESOURCE_FILES=Trading.eomodeld Trading_HAS_RESOURCE_BUNDLE=yes Trading_OBJC_FILES=Trading.m TradingData.m Trading_HEADER_FILES=Trading.h TradingData.h createTradingDB_OBJC_FILES=create.m createTradingDB_NATIVE_LIBS+= Trading ADDITIONAL_INCLUDE_DIRS+=-I../.. ADDITIONAL_NATIVE_LIBS+=EOAccess EOControl ADDITIONAL_NATIVE_LIB_DIRS+=../../EOAccess ../../EOControl ADDITIONAL_NATIVE_LIB_DIRS+= . include $(GNUSTEP_MAKEFILES)/native-library.make include $(GNUSTEP_MAKEFILES)/tool.make gnustep-dl2-0.12.0/Examples/Trading/TradingData.h0000664000175000017500000000251314632325605020532 0ustar yavoryavor#import #include #include @interface TradingData : NSObject { EOEditingContext *ec; EODatabaseDataSource *productGroupDS; EODatabaseDataSource *productDS; EODatabaseDataSource *suppliersDS; EODatabaseDataSource *priceListDS; EODatabaseDataSource *priceListPosDS; EODatabaseDataSource *orderDS; EODatabaseDataSource *orderPosDS; EODatabaseDataSource *customerDS; EODatabaseDataSource *customerGroupDS; } - (void) saveChanges; - (void) fillTables; - (id) addSupplierNamed:(NSString *)name; - (id) addProductGroup:(NSString *)name; - (id) addProduct:(NSString*)name price:(NSDecimalNumber *)price supplier:(id)supplier group:(id)group; - (id) addProduct:(id)product price:(NSDecimalNumber *)price toPriceList:(id)priceList; - (id) addPriceList:(NSString *)name forGroup:(id)group; - (id) addCustomer:(NSString *)customer; - (id) addCustomer:(NSString *)customer group:(id)group; - (id) addCustomerGroup:(NSString *)name; - (id) customer:(id)customer order:(id)product; - (id) customer:(id)customer order:(id)product quantity:(int)quantity; - (id) customer:(id)customer order:(id)product quantity:(int)quantity posNr:(int)posNr; - (id) createOrderForCustomer:(id)customer; - (id) order:(id)order product:(id)product quantity:(int)quantity; @end gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/0000775000175000017500000000000014635562742021365 5ustar yavoryavorgnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/Supplier.plist0000664000175000017500000000113714632325605024237 0ustar yavoryavor{ attributes = ( { columnName = NAME; name = name; prototypeName = char; width = 90; }, { columnName = PID; name = pid; prototypeName = integer; } ); className = EOGenericRecord; classProperties = ( name, products ); externalName = TST_SUPPLIER; name = Supplier; primaryKeyAttributes = ( pid ); relationships = ( { destination = Product; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = supid; sourceAttribute = pid; } ); name = products; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/EOSQLite3Prototypes.plist0000664000175000017500000000110314632325605026206 0ustar yavoryavor{ attributes = ( { externalType = TEXT; name = char; valueClassName = NSString; width = 30; }, { externalType = DATE; name = date; valueClassName = NSCalendarDate; }, { externalType = decimal; name = decimal; precision = 12; scale = 2; valueClassName = NSDecimalNumber; }, { externalType = INTEGER; name = integer; valueClassName = NSNumber; valueType = i; } ); className = EOGenericRecord; isAbstractEntity = Y; name = EOSQLite3Prototypes; relationships = ( ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/PriceList.plist0000664000175000017500000000173014632325605024331 0ustar yavoryavor{ attributes = ( { columnName = CSTGRPID; externalType = integer; name = cstgrpid; valueClassName = NSNumber; }, { columnName = NAME; externalType = char; name = name; prototypeName = char; }, { columnName = PID; name = pid; prototypeName = integer; } ); className = EOGenericRecord; classProperties = ( customerGroup, name, priceListPos ); externalName = TST_PRICELIST; name = PriceList; primaryKeyAttributes = ( pid ); relationships = ( { destination = CustomerGroup; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = cstgrpid; } ); name = customerGroup; }, { destination = PriceListPos; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = prlid; sourceAttribute = pid; } ); name = priceListPos; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/Order.plist0000664000175000017500000000161014632325605023503 0ustar yavoryavor{ attributes = ( { allowsNull = Y; columnName = CSTID; name = cstid; prototypeName = integer; }, { columnName = DATE; name = date; prototypeName = date; }, { columnName = PID; name = pid; prototypeName = integer; } ); className = EOGenericRecord; classProperties = ( customer, date, orderPos ); externalName = TST_ORDER; name = Order; primaryKeyAttributes = ( pid ); relationships = ( { destination = OrderPos; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = ordid; sourceAttribute = pid; } ); name = orderPos; }, { destination = Customer; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = cstid; } ); name = customer; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/procName.storedProcedure0000664000175000017500000000041014632325605026207 0ustar yavoryavor{ arguments = ( { allowsNull = Y; columnName = ""; externalType = varchar; name = argument; parameterDirection = 1; valueClassName = NSString; width = 20; } ); externalName = externalProcName; name = procName; }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/PriceListPos.plist0000664000175000017500000000173014632325605025013 0ustar yavoryavor{ attributes = ( { columnName = PID; name = pid; prototypeName = integer; }, { columnName = PRDID; name = prdid; prototypeName = integer; }, { columnName = PRICE; name = price; prototypeName = decimal; }, { columnName = PRLID; name = prlid; prototypeName = integer; } ); className = EOGenericRecord; classProperties = ( price, priceList, product ); externalName = TST_PRICELISTPOS; name = PriceListPos; primaryKeyAttributes = ( pid ); relationships = ( { destination = Product; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = prdid; } ); name = product; }, { destination = PriceList; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = prlid; } ); name = priceList; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/EOPostgreSQLPrototypes.plist0000664000175000017500000000110614632325605026770 0ustar yavoryavor{ attributes = ( { externalType = char; name = char; valueClassName = NSString; width = 30; }, { externalType = date; name = date; valueClassName = NSCalendarDate; }, { externalType = decimal; name = decimal; precision = 12; scale = 2; valueClassName = NSDecimalNumber; }, { externalType = integer; name = integer; valueClassName = NSNumber; valueType = i; } ); className = EOGenericRecord; isAbstractEntity = Y; name = EOPostgreSQLPrototypes; relationships = ( ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/EOPostgres95Prototypes.plist0000664000175000017500000000110614632325605026751 0ustar yavoryavor{ attributes = ( { externalType = char; name = char; valueClassName = NSString; width = 30; }, { externalType = date; name = date; valueClassName = NSCalendarDate; }, { externalType = decimal; name = decimal; precision = 12; scale = 2; valueClassName = NSDecimalNumber; }, { externalType = integer; name = integer; valueClassName = NSNumber; valueType = i; } ); className = EOGenericRecord; isAbstractEntity = Y; name = EOPostgres95Prototypes; relationships = ( ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/CustomerGroup.plist0000664000175000017500000000147214632325605025254 0ustar yavoryavor{ attributes = ( { columnName = NAME; name = name; prototypeName = char; }, { columnName = PID; name = pid; prototypeName = integer; } ); className = EOGenericRecord; classProperties = ( customers, name, priceList ); externalName = TST_CUSTOMERGROUP; name = CustomerGroup; primaryKeyAttributes = ( pid ); relationships = ( { destination = Customer; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = grpid; sourceAttribute = pid; } ); name = customers; }, { destination = PriceList; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = cstgrpid; sourceAttribute = pid; } ); name = priceList; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/Customer.plist0000664000175000017500000000162614632325605024240 0ustar yavoryavor{ attributes = ( { allowsNull = Y; columnName = GRPID; name = grpid; prototypeName = integer; }, { columnName = NAME; name = name; prototypeName = char; }, { columnName = PID; name = pid; prototypeName = integer; } ); className = EOGenericRecord; classProperties = ( customerGroup, name, orders ); externalName = TST_CUSTOMER; name = Customer; primaryKeyAttributes = ( pid ); relationships = ( { destination = CustomerGroup; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = grpid; } ); name = customerGroup; }, { destination = Order; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = cstid; sourceAttribute = pid; } ); name = orders; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/Product.plist0000664000175000017500000000262214632325605024054 0ustar yavoryavor{ attributes = ( { columnName = GRPID; externalType = integer; name = grpid; prototypeName = integer; }, { columnName = NAME; name = name; prototypeName = char; }, { columnName = PID; name = pid; prototypeName = integer; }, { allowsNull = Y; columnName = PRICE; externalType = decimal; name = price; valueClassName = NSDecimalNumber; }, { allowsNull = Y; columnName = SUPID; externalType = integer; name = supid; valueClassName = NSNumber; } ); className = EOGenericRecord; classProperties = ( name, orderPos, price, productGroup, supplier ); externalName = TST_PRODUCT; name = Product; primaryKeyAttributes = ( pid ); relationships = ( { destination = ProductGroup; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = grpid; } ); name = productGroup; }, { destination = Supplier; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = supid; } ); name = supplier; }, { destination = OrderPos; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = prdid; sourceAttribute = pid; } ); name = orderPos; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/ProductGroup.plist0000664000175000017500000000112614632325605025067 0ustar yavoryavor{ attributes = ( { columnName = NAME; name = name; prototypeName = char; }, { columnName = PID; name = pid; prototypeName = integer; } ); className = EOGenericRecord; classProperties = ( name, products ); externalName = TST_PRODUCTGROUP; name = ProductGroup; primaryKeyAttributes = ( pid ); relationships = ( { destination = Product; isToMany = Y; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = grpid; sourceAttribute = pid; } ); name = products; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/OrderPos.plist0000664000175000017500000000240414632325605024167 0ustar yavoryavor{ attributes = ( { columnName = ORDID; name = ordid; prototypeName = integer; }, { columnName = PID; name = pid; prototypeName = integer; }, { columnName = POSNR; name = posnr; prototypeName = integer; }, { columnName = PRDID; name = prdid; prototypeName = integer; }, { columnName = PRICE; name = price; prototypeName = decimal; }, { columnName = QUANTITY; name = quantity; prototypeName = decimal; }, { columnName = VALUE; name = value; prototypeName = decimal; } ); className = EOGenericRecord; classProperties = ( order, posnr, price, product, quantity, value ); externalName = TST_ORDERPOS; name = OrderPos; primaryKeyAttributes = ( pid ); relationships = ( { destination = Product; isMandatory = Y; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = prdid; } ); name = product; }, { destination = Order; isMandatory = Y; isToMany = N; joinSemantic = EOInnerJoin; joins = ( { destinationAttribute = pid; sourceAttribute = ordid; } ); name = order; } ); }gnustep-dl2-0.12.0/Examples/Trading/Trading.eomodeld/index.eomodeld0000664000175000017500000000222714635562742024211 0ustar yavoryavor{ EOModelVersion = 2; adaptorName = PostgreSQL; entities = ( { className = EOGenericRecord; name = Customer; }, { className = EOGenericRecord; name = CustomerGroup; }, { className = EOGenericRecord; name = EOPostgreSQLPrototypes; }, { className = EOGenericRecord; name = EOPostgres95Prototypes; }, { className = EOGenericRecord; name = EOSQLite3Prototypes; }, { className = EOGenericRecord; name = Order; }, { className = EOGenericRecord; name = OrderPos; }, { className = EOGenericRecord; name = PriceList; }, { className = EOGenericRecord; name = PriceListPos; }, { className = EOGenericRecord; name = Product; }, { className = EOGenericRecord; name = ProductGroup; }, { className = EOGenericRecord; name = Supplier; } ); storedProcedures = ( procName ); userInfo = { PostgreSQLConnectionDictionary = { databaseName = gdl2trading; }; Postgres95ConnectionDictionary = { databaseName = gdl2trading; }; SQLite3ConnectionDictionary = { databasePath = "/tmp/gdl2trading"; }; }; } gnustep-dl2-0.12.0/Examples/Trading/Trading.m0000664000175000017500000001256214754345067017763 0ustar yavoryavor#include "Trading.h" /* Convience class for working with models supporting multiple adaptors */ @implementation Trading : NSObject + (EOModel *) defaultModel { EOModelGroup *globalGrp = [EOModelGroup globalModelGroup]; EOModel *model = [[EOModelGroup globalModelGroup] modelNamed:@"Trading"]; /* * globalModelGroup doesn't currently work with non-framework native-libs */ if (!model) { NSBundle *bundle = [NSBundle bundleForClass:[self class]]; NSString *modelPath = [bundle pathForResource:@"Trading" ofType:@"eomodeld"]; [globalGrp addModelWithFile:modelPath]; model = [globalGrp modelNamed:@"Trading"]; } return model; } /* calls initWithModel: with the default model */ - (id) init { return [self initWithModel:[[self class] defaultModel]]; } - (BOOL) hasAdaptorNamed:(NSString *)adaptorName; { NSArray *adaptorNames; if (adaptorName == nil) return NO; adaptorNames = [EOAdaptor availableAdaptorNames]; return [adaptorNames containsObject:adaptorName]; } /* calls initWithModel:adaptorName: * looking for an adaptor name in the following order: * first it looks at the TEST_ADAPTOR environment variable * then it looks for the GDL2TestAdaptor key * then it looks for the models -adaptorName. * finally if all else fails, it uses the first adaptor in the * +availableAdaptorNames array. */ - (id) initWithModel:(EOModel *)model { NSArray *adaptorNames; NSString *adaptorName; BOOL flag; adaptorNames = [EOAdaptor availableAdaptorNames]; adaptorName = [[[NSProcessInfo processInfo] environment] objectForKey:@"TEST_ADAPTOR"]; if (flag == NO && ((flag = [self hasAdaptorNamed:adaptorName]) == NO)) adaptorName = [[NSUserDefaults standardUserDefaults] stringForKey:@"GDL2TestAdaptorName"]; if (flag == NO && ((flag = [self hasAdaptorNamed:adaptorName]) == NO)) { adaptorName = [model adaptorName]; } if (flag == NO && ((flag = [self hasAdaptorNamed:adaptorName]) == NO)) { adaptorName = [adaptorNames count] ? [adaptorNames objectAtIndex:0] : nil; } return [self initWithModel:model adaptorName:adaptorName]; } /* * uses the default model and an 'adaptorName'ConnectionDictionary * in the models userInfo. */ - (id) initWithModel:(EOModel *)model adaptorName:(NSString *)adaptorName { NSAssert(adaptorName, @"nil adaptor name"); { NSString *dictName = [adaptorName stringByAppendingString: @"ConnectionDictionary"]; NSDictionary *connDict = [[model userInfo] objectForKey: dictName]; return [self initWithModel:model adaptorName:adaptorName connectionDictionary:connDict]; } } /* designated initializer assigns the models adaptor name, and connection * dictionary */ - (id) initWithModel:(EOModel *)model adaptorName:(NSString*)adaptorName connectionDictionary:(NSDictionary *)connDict { self = [super init]; if (self) { _model = [model retain]; [model setConnectionDictionary:connDict]; [model setAdaptorName:adaptorName]; _adaptor = [[EOAdaptor adaptorWithModel:_model] retain]; _exprClass = [_adaptor expressionClass]; _context = [[_adaptor createAdaptorContext] retain]; _channel = [[_context createAdaptorChannel] retain]; } return self; } - (void) dealloc { [self close]; [_model release]; [_adaptor release]; [_context release]; [_channel release]; [super dealloc]; } /* * drops the tables (ignoring any exceptions) * as the tables may not exist to be dropped. * then returns the value of [self createTables]; */ - (void) recreateTables { NS_DURING [self dropTables]; NS_HANDLER NS_ENDHANDLER return [self createTables]; } - (void) dropTables { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSArray *entities = [_model entities]; NSDictionary *dropOptDict = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"EOPrimaryKeyConstraintsKey", @"NO", @"EOCreatePrimaryKeySupportKey", @"NO", @"EOCreateTablesKey", nil]; NSArray *exprs; EOSQLExpression *expr; unsigned i,c; exprs = [_exprClass schemaCreationStatementsForEntities: entities options: dropOptDict]; [self open]; for (i=0, c=[exprs count]; i #include #include @interface Trading : NSObject { EOModel *_model; EOAdaptor *_adaptor; EOAdaptorChannel *_channel; EOAdaptorContext *_context; Class _exprClass; } + (EOModel *)defaultModel; - (id) initWithModel:(EOModel *)model; - (id) initWithModel:(EOModel *)model adaptorName:(NSString *)adaptorName; - (id) initWithModel:(EOModel *)model adaptorName:(NSString*)adaptorName connectionDictionary:(NSDictionary *)connDict; - (BOOL) isOpen; - (void) open; - (void) close; - (void) recreateTables; - (void) dropTables; - (void) createTables; - (EOAdaptor *)adaptor; - (EOAdaptorChannel *)channel; - (EOAdaptorContext *)context; - (Class)exprClass; - (EOModel *)model; @end gnustep-dl2-0.12.0/Examples/Trading/create.m0000664000175000017500000000053514632325605017622 0ustar yavoryavor#include "Trading.h" #include "TradingData.h" int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; id trading = [[Trading alloc] init]; id data = [[TradingData alloc] init]; [trading recreateTables]; [data fillTables]; [data saveChanges]; [trading release]; [data release]; [pool release]; return 0; } gnustep-dl2-0.12.0/Examples/GNUmakefile.connection0000664000175000017500000000017414632325605021020 0ustar yavoryavorTOOL_NAME+=connection connection_NEEDS_GUI=no connection_OBJC_FILES=connection.m connection_RESOURCE_FILES=library.eomodel gnustep-dl2-0.12.0/Documentation/0000775000175000017500000000000014632325605015641 5ustar yavoryavorgnustep-dl2-0.12.0/Documentation/GDL2Intro/0000775000175000017500000000000014632325605017345 5ustar yavoryavorgnustep-dl2-0.12.0/Documentation/GDL2Intro/GDL2Intro/0000775000175000017500000000000014632325605021051 5ustar yavoryavorgnustep-dl2-0.12.0/Documentation/GDL2Intro/GDL2Intro/.gitignore0000664000175000017500000000000014632325605023027 0ustar yavoryavorgnustep-dl2-0.12.0/Documentation/GDL2Intro/GNUmakefile0000664000175000017500000000031414632325605021415 0ustar yavoryavorinclude ../../common.make include $(GNUSTEP_MAKEFILES)/common.make PACKAGE_NAME="GDL2Intro" DOCUMENT_NAME=GDL2Intro GDL2Intro_TEXI_FILES=GDL2Intro.texi include $(GNUSTEP_MAKEFILES)/documentation.make gnustep-dl2-0.12.0/Documentation/GDL2Intro/GDL2Intro.texi0000664000175000017500000007175514632325605021763 0ustar yavoryavor\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename GDL2Intro.info @settitle GNUstep Database Library Introduction 0.1 @c %**end of header @copying @copyright{2006 Free Software Foundation} Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end copying @titlepage @title GNUstep Database Library Introduction @page @vskip 0pt plus 1filll @insertcopying @end titlepage @c Output the table of the contents at the beginning. @contents @ifnottex @node Top, Concepts, , @top GNUstep Database Library @insertcopying @end ifnottex @chapter Introduction This document is intended to get people started developing with GDL2. A knowledge of objective-c and relational database concepts is assumed. While not intended as a thorough reference or a replacement for the API docs and surely omits details for the sake of simplicity it attempts to provide a starting point for people unfamiliar with GDL2 or EOF to get started developing their first application. If you are reading this document from the GDL2 Sources, most example sources are provided in the ../../Examples/ directory. @menu * Concepts:: Important concepts * Classes:: A basic overview of important classes to know and understand. * Model creation:: Describes different ways to create model files. * Project creation:: Creating a GDL2 project. * Database creation:: Creating the database on the database server. * Database connection:: Connecting to a database through an adaptor. * Working with data:: Creating, Fetching, and updating data in the database. * EOInterface:: Developing graphical applications with EOInterface. * Index:: Complete index. @end menu @node Concepts, Classes, Top, Top @chapter Concepts @menu * Key Value Coding:: Key Value Coding @end menu @node Key Value Coding, , ,Concepts @chapter Key Value Coding @cindex KVC, Key Value Coding Key Value Coding is a concept used widely throughout GDL2, it provides a mechanism by where you can access and modify an objects set/accessor methods or even instance variables directly, through a named key. Additionally some classes may implement KVC in a way specific to the class. @section Setting values through KVC Setting values through key value coding will try to call a method '-setKeyName:' with the value as the parameter to -setKeyName: as a parameter failing that, if anObject had an instance variable with the same name as the key that would be modified directly. If anObject does not respond to `-setKeyName:` and there is no instance variable with the same name as the key, an exception is thrown. @example @verbatim [anObject setValue:@"bar" forKey:@"foo"]; @end verbatim @end example Will first try to call -setFoo: then attempt to set the instance variable named "foo" to "bar". @section Accessing values through KVC Accessing values through Key Value Coding first attempts to call the -keyName method on anObject if it responds. If the object does not respond then it will try to access an instance variable with the name of the key. If there is no method or instance variable with the name of the key an exception will be thrown. For example, @example @verbatim [anObject valueForKey:@"foo"]; @end verbatim @end example Will first try to call -foo, then attempt to return instance variable named foo. @section Key Paths Key paths are a list of keys separated by a dot. The first key accesses the key on the target object through normal KVC, and each subsequent key is sent to the object returned through the previous key in the list. For example, @example @verbatim [anObject valueForKeyPath:@"foo.bar"]; @end verbatim @end example Will be equivalent to @example @verbatim [[anObject valueForKey:@"foo"] valueForKey:@"bar"]; @end verbatim @end example @section Type promotion When a accessing a key, you may access keys for things such as standard c numerical types, and they will be automatically promoted to their object equivalent For example: @example @verbatim [@"foo" valueForKey:@"length"]; @end verbatim @end example Returns a NSNumber object containing '3'. @section Class specific implementation By implementing valueForKey: and setValueForKey: classes can implement functionality to contain keys in an instance variable such as a dictionary, but they can also implement something to work on a collection of objects. For instance NSArray implements KVC to forward key value coding to all objects in the array. Suppose we have an array contain a few string objects. @example ("Example", "array", "containing", "strings") @end example If we get the value for the key length, it will return an NSArray of NSNumbers @example (7, 5, 10, 7). @end example @node Classes, Model creation, Concepts, Top @chapter Classes @section Model classes The model related classes are important in that they define a databases structure. Giving GDL2 a way to map a relational database into a set of objects. @menu * EOModel class:: EOModel * EOEntity class:: EOEntity * EOAttribute class:: EOAttribute * EORelationship class:: EORelationship * EOModelGroup class:: EOModelGroup @end menu @section Database specific classes The database specific classes loadable through bundles provide a method for GDL2 to connect to and abstract implementation details between different database implementations. Currently adaptors for SQLite3 and PostgreSQL exist. @menu * EOAdaptor class:: EOAdaptor * EOAdaptorChannel class:: EOAdaptorChannel * EOAdaptorContext class:: EOAdaptorContext @end menu @section Data oriented classes The data oriented classes relate to actual data manipulation and management. @menu * EODataSource class:: EODataSource * EOEditingContext class:: EOEditingContext * EOGenericRecord class:: EOGenericRecord @end menu @node EOModel class, EOEntity class, , Classes @section EOModel class @cindex class, EOModel @subsection overview A model represents GDL2s interface to a database. It contains information required to connect to the database along with entities and stored procedures. All the model classes can be written to and read from property list files in the form of .eomodel or .eomodeld files. While .eomodel files contain a model and all its entities and objects in a single property list, .eomodeld files are a directory with each of the property lists in their own file. Typically you won't create an model through manual instantiation of the classes but store them in and read them from a property list. We have provided an example .eomodel file @xref{Example model file}. @noindent An EOModel Typically has: @enumerate @item A Name @item An adaptor name @item A connection dictionary @item An array of entities @end enumerate @node EOEntity class, EOAttribute class, EOModel class, Classes @section EOEntity class @cindex class, EOEntity @subsection overview An entity contains information pertaining to a table in a database in the form of attributes and relationships. @noindent Additionally an entity contains: @enumerate @item An array of class properties @item An array of primary key attributes @item A class name @item An External name @end enumerate @subsection Class properties A class property of an entity can be either an attribute or a relationship. typically class properties are the set of attributes or relationships which are user visible and need to be set or accessed by the user. Primary and Foreign keys attributes are usually derived from other attributes or generated automatically and so they are not typically class properties. A class property will be available through Key Value Coding for access and modification, in an instance of an Enterprise object. @subsection Class name an EOEntity's class name represents the name of the class which will be instantiated when creating an Enterprise Object such as EOGenericRecord or a custom object. @subsection Primary Key Attributes Primary key attributes specify which attributes uniquely identify a row in the table, they are typically generated automatically by GDL2. They correspond directly to the relational database concept. @subsection External name The external name represents the table name in the database server, and in any SQL the adaptor might generate. @node EOAttribute class, EORelationship class, EOEntity class, Classes @section EOAttribute class @cindex class, EOAttribute @subsection overview An attribute typically maps a table column to an instance variable, in which case the attribute is a class property. Some attributes represent foreign keys which are used to create realationships yet do not correspond to a property in the enterprise object. Other attributes may represent primary keys which needn't be class property either. In fact some parts of framework work more smoothly if primary key attributes and foreign key attributes are not class properties. @noindent Attributes typically contain: @enumerate @item A name @item A column name @item An adaptor value type @item An external type @item A value type @item A value class name @item A value factory method name @item a factory method argument type @end enumerate @noindent Some additional properties an attribute may have: @enumerate @item Read only @item Allows null @item Width @item Precision @item Scale @end enumerate @subsection Name The attributes name when the attribute is a class property is used as the key when doing key value coding on an enterprise object. It also uniquely identifies the attribute in its entity there many not be an attribute with the same name as another attribute or relationship in an entity. @subsection Column name The adaptor uses the column name in generating SQL. @subsection Adaptor value type Indicates the type of the attribute as contained in the database @noindent Valid adaptor value types are: @enumerate @item EOAdaptorNumberType @item EOAdaptorCharactersType @item EOAdaptorBytesType @item EOAdaptorDateType @end enumerate Corresponding to numerical, string, raw data, and date value types. @subsection External type An external type is a string representing an adaptor specific database type different adaptors may use different names where the PostgreSQL adaptor might use 'char'. The SQLite3 Adaptor might use 'TEXT' it gives you full control on how the data is stored in the specific adaptor where the adaptor value type allows you to specify a few generic values. @subsection Value type Value types are a string with a single character such as 'f' for floats 'c' for chars a full list of the standard types is available in the GDL2 API reference for EOAttributes -valueType method. The value type allows you to further refine the adaptor value type where EOAdaptorNumberType might represent a integer, float, or double type. @subsection Value class name The value class name specifies the class which will be present in an Enterprise Object containing the attribute. A property of this class will be instantiated when a field is retrieved from the database, similarly a instance of this will be converted into the external type when being sent to the datbase server. @subsection Value factory method name When the Value Class Name is a custom object for instance NSImage created from a blob of data. The value factory method name denotes the initializer for the class, used to create a new instance of the custom class. The value class name is an NSString representing a selector accepting a single argument suitable for passing to the NSSelectorFromString function. @subsection Value factory argument type This is the type of the argument sent to the value factory method name. @noindent Valid types are @enumerate @item EOFactoryMethodArgumentIsNSData @item EOFactoryMethodArgumentIsNSString @item EOFactoryMethodArgumentIsBytes @end enumerate @node EORelationship class, EOModelGroup class, EOAttribute class, Classes @section EORelationship class @cindex class, EORelationship @subsection overview A relationship represents a connecton between entities and are described with EOJoin's. A join defines source and destination attributes -- The attributes of the joining entity which must match. A relationship may be of type to-one or to-many. In a to-many the destination will be an array of objects, and a to-one relationships destination a single object. Typically a relationship is a class property. Yet some relationships may soley be used for flattening other relationships which are class properties, yet need not be class properties themselves. @node EOModelGroup class, EOAdaptor class, EORelationship class, Classes @section EOModelGroup class @cindex class, EOModelGroup @subsection overview When models have relationships to other models, they ask their model group. There is a special model group - the default model group - which contains all the models in the applications resources and the resources of any frameworks the application uses. If your model file is not available through application or framework resources you will need to add it to a model group. @node EOAdaptor class, EOAdaptorContext class, EOModelGroup class, Classes @section EOAdaptor class @cindex class, EOAdaptor @subsection overview An adaptor abstracts the difference between different database implementations. It can connect to the database with the help of a connection dictionary and create and execute SQL statements. While an adaptor is made up of many different classes. The EOAdaptor class is sort of an entry point into the different available classes. And a typical use for the EOAdaptor class is creating an instance of a specific adaptor, either by name or through the adaptor name in a model. Typical methods for the EOAdaptor class are: @enumerate @item -createAdaptorContext @item -runLoginPanel @item -assertConnectionDictionaryIsValid @item +adaptorWithModel: @end enumerate @node EOAdaptorContext class, EOAdaptorChannel class, EOAdaptor class, Classes @section EOAdaptorContext class An EOAdaptorContext can create an adaptor channel and will transparently handle transactions for the channel, It can begin, commit, roll back transactions. Additionaly you can enable debugging on the context and its channels. Typical methods for an EOAdaptorContext: @enumerate @item -createAdaptorChannel @item -setDebugEnabled: @end enumerate @node EOAdaptorChannel class, EODataSource class, EOAdaptorContext class, Classes @section EOAdaptorChannel class An adaptor channel can open and close a connection to the adaptors database server. Along with fetch rows from the database and create, update, and delete rows in the database. It is the main communication channel for gdl2, in creating the connection to the database, and executing any SQL statements which have been prepared through EOSQLExpression. Though it also has methods for building SQL expressions from entities, and possibly turning the results back into enterprise objects. Because EOAdaptorChannel can create most SQL statements for you, you'll rarely need to do that yourself, though it is available if needed. Typical methods for an EOAdaptorChannel: @enumerate @item -openChannel @item -closeChannel @item -isOpen @end enumerate @node EODataSource class, EOEditingContext class, EOAdaptorChannel class, Classes @section EODataSource class @cindex class, EODataSource @subsection overview EODataSource is an abstract base class, and implements no real functionality on its own, instead you'll access EODataSource subclass. A data source represents a collection of rows inside of a table. It can create rows, delete and provide access to the individual rows represented as Enterprise objects. @noindent Typical methods for an EODataSource subclass: @enumerate @item -fetchObjects @item -createObject: @item -deleteObject: @item -insertObject: @item -dataSourceQualifiedByKey: @end enumerate @subsection Fetch objects The -fetchObjects method will return an array of enterprise objects. Typically these will be retrieved directly from data in the database server. Then the caller will save the array for access or modification. @subsection Creating objects The -createObject: method will create a new enterprise object for insertion into the database. A subclass will generally insert this new object into an editing context. Though the caller is responsible for inserting the object into the data source with -insertObject:. @subsection Inserting objects The -insertObject: method will schedule the object for addition into the database server EditingContexts changes are saved to the database. @subsection Deleting objects The -deleteObject: method will schedule the object for removal from the database server when the EOEditingContexts changes are saved to the database. @subsection Qualified DataSources Subclasses may implement this method to return a detail data source. A detail data source is a datasource which is created from following a relationship in an object of the receiever: the master object. in our example you might have a data source for the authors entity and qualify a detail data source, with the toBooks key. @subsection EODatabaseDataSource class EODatabaseDataSource class is a subclass of EODataSource. To initialize an EODatabaseDataSource you'll give it a reference to an EOEditingContext and an entity name. EODatabaseDataSource initializers: @enumerate @item -initWithEditingContext:entityName: @item -initWithEditingContext:entityName:fetchSpecificationName: @end enumerate Once initialized, you can call the EODataSource methods on it, to create fetch insert, and delete objects from the datasource. @node EOEditingContext class, EOGenericRecord class, EODataSource class, Classes @section EOEditingContext class @cindex class, EOEditingContext @subsection overview An editing context is responsible for managing changes to enterprise objects and provides the ability to save and undo those changes. Including inserts, updates, and deletes. Typical methods of the EOEditingContext class: @enumerate @item -saveChanges: @item -revert: @item -undo: @item -redo: @item -insertObject: @item -deleteObject: @end enumerate You may have noticed that there is no mention of a method for modifying an object through an EOEditingContext. As you will modify the objects directly, and EOEditingContext will merely take note of the changes, and save snapshots of the objects as they are being modified so you can undo those changes. @node EOGenericRecord class, , EOEditingContext class, Classes @section EOGenericRecord class @cindex class, EOGenericRecord @subsection overview EOGeneric record represents an actual row in a table being the default enterprise object it contains no custom business logic and is accessible solely through key value coding. Where an entity represents the description of the table. It's columns and types. enterprise objects represent the data contained in the table. EOGenericRecords are generally created with a reference to an entity. They export as keys the class properties of the entity, for access and modification. If you have an EOGenericRecord from the 'authors' entity of our example model you could set the authors name as so. @xref{Example model file}. @example @verbatim [anAuthor takeValue:@"Anonymous" forKey:@"name"]; @end verbatim @end example And retrieve the author name with: @example @verbatim [anAuthor valueForKey:@"name"]; @end verbatim @end example @node Model creation, Project creation, Classes, Top @chapter Model Creation @cindex model creation Models can be created in 3 ways @enumerate @item Manual written with property lists. @item Hard coding the model in objective-c. @item Creation of plists with the DBModeler application. @end enumerate while DBModeler provides the easiest way, followed by manually writing the property lists, and hard coding the model is both tedious and complicated. @menu * Example model file:: An example property list for a .eomodel file. * Creating with DBModeler:: Instructions for recreating the property list with DBModeler @end menu @node Example model file, Creating with DBModeler, Model creation, Model creation @subsection Example model file Below is a example property list model created with DBModeler, it contains a Model for a library 2 entities, author and book author contains 2 attributes, authorID the primary key number, and name a string book contains 3 attributes, bookID the primary key number, authorID a foreign key number, and title a string. author and book each contain a relationship author a to-many relationship to each of the authors books, and book a to-one relationship to the books author for the sake of demonstration i'm ignoring books with multiple authors. it also contains an adaptor name, and an adaptor specific connection dictionary. @verbatiminclude ../../Examples/library.eomodel @node Creating with DBModeler, , Example model file, Model creation @subsection Creating with DBModeler To recreate the example model with DBModeler, select Document, New from the main menu then property Add entity twice. set the name and external names to 'authors' and 'books' select Document, Set Adaptor Info, and select SQLite, and click Ok, this will bring up the SQLite login panel, where you need to provide it a path for where to create the model file. Each Adaptor will have different requirements, so each login panel is quite different. Other adaptors may have a server address, username, and database names. select the authors entity in the outline view, after expanding the model add an attribute to authors by selecting Property, Add attribute set the name and column name to 'authorID', and select the switch button with a key icon, to set it as the primary key for the entity. Set the value class name to NSNumber and the external type to INTEGER Add another entity, set the name and column names to 'name'. Select the switch button which looks like a jewel icon to set it as a Class Property. Set the Value Class Name to NSString and external type to TEXT. now do the same with books, name them bookID, authorID, and title. make sure bookID is set as the primary key not authorID in the books entity. And that title is set as a class property. title is a NSString/TEXT, where authorID and bookID are NSNumber/INTEGER now add a relationship to authors name it toBooks, and Tools, inspector in the destination table, select To many, and books as the destination entity. select authorID as the source and destination attributes add a relationship to books, name it toAuthor. Select author as the destination entity, and authorID as the source and destination attributes. The select Document, Save, from the main menu. @node Project creation, Database creation, Model creation, Top @chapter Creating a project. @subsection Creating a makefile Creating a GNUmakefile for a GDL2 Project is done throught he well documented gnustep-make makefile system. they are standard GNUmakefiles but you'll need to include a special file -- gdl2.make after common.make E.g. @example include $(GNUSTEP_MAKEFILES)/common.make include $(GNUSTEP_MAKEFILES)/Auxiliary/gdl2.make @end example @subsection Adding Resource Files Make sure you add your .eomodel or .eomodeld file to your projects resources @example APP_NAME=foo foo_RESOURCE_FILES=foo.eomodeld @end example @subsection A complete GNUmakefile @example @verbatiminclude ../../Examples/example.GNUmakefile @end example @node Database creation, Database connection, Project creation, Top @chapter Database creation Now that we have created a model file, we need to generate the SQL to create the database. @subsection Creating the database with DBModeler Select, Generate SQL from the Tools menu, then select the appropriate check boxes, Create databases, Create tables, foreign key constraints, primary key constraints, and primary key support. then either save the SQL to a file, or execute it, you may need to login to the database server, but the adaptor for the model should bring up a login panel. @node Database connection, Working with data, Database creation, Top @chapter Database connection An example which connects to and then disconnects from the database. provided you have already created the database in previous section @example @verbatiminclude ../../Examples/connection.m @end example @node Working with data, EOInterface, Database connection, Top @chapter Working with data @section Adding some data. Here we have more complete example which writes a record to the database, then fetches the record and updates it and saves the data again, then removes the record. @example @verbatiminclude ../../Examples/eoexample.m @end example @section Working with relationships Heres another more complex example of working with data, we'll add an author, and some books, and then traverse the relationship in a couple of different ways. @example @verbatiminclude ../../Examples/eoexample2.m @end example @node EOInterface, Index, Working with data, Top @chapter EOInterface @section Introduction With GDL2 and EOInterface you can develop graphical applications using the gnustep gui libraries. It provides the ability to create connections between records from the database, and graphical controls. Once a connection has been made between the graphical control and the record, EOInterface will update the record when the data changes in the control, and update the control when the data or the selection changes. EOInterface is composed of the EODisplayGroup class and EOAssociation subclasses. EODisplayGroup contains the records and manages the selection, and notifies EOAssociations when the selection or selected record changes. EOAssociation subclasses, associate graphical controls to the display group displaying the data in the display group, and updating the display group when the control changes the data. Multi-record associations such as table views can change the display groups selection. @section EODisplayGroup class EODisplayGroup has an EODataSource, and can fetch and create objects, manage the selection, filter the objects for display with qualifiers, and sort them with EOSortOrderings. If you have loaded the GDL2Palette into Gorm you can create an EODisplayGroup by dragging an entity or a relationship from the outline view in DBModeler, to the document window in Gorm the display group will be associated with an EODataSource and will be encoded/decoded to and from the .gorm file. It will be a top level object, visible in the 'Objects' view of the gorm document. With the name of the entity or relationship dropped. You can create connections from controls directly to the display group, for example you could connect a button or menu item to EODisplayGroups -selectNext: action by: Selecting the control and control-drag from the control to the display group. In the connect inspector, select -selectNext: and click 'connect'. Available actions for EODisplayGroup: @enumerate @item -fetch: @item -selectNext: @item -selectPrevious: @item -delete: @item -insert: @end enumerate Manual creation of a EODisplayGroup by initializing the display group and setting its dataSource: @example EODisplayGroup *dg; EODataSource *dataSource; dg = [[EODisplayGroup alloc] init]; [dg setDataSource:dataSource]; @end example @section EOAssociation class An EOAssociation is an abstract base class. Subclasses of EOAssociation can be created to connect properties of an object in an EODisplayGroup to graphical controls. EOControls contain aspects, objects, and keys, and display groups. Where the object is a graphical control, the key, being a key appropriate for KVC on an enterprise object, and the aspect is a string describing the use for the key. Each association has their own set of aspects and the aspects supported may vary between different association classes. Manual creation of an EOControlAssocation: @example @verbatim EOAssociation *association; EODisplayGroup *authorDG; NSTextField *nameField; association = [[EOControlAssociation alloc] initWithObject:nameField]; [association bindAspect:@"value" displayGroup:authorDG key:@"name"]; [association establishConnection]; [association release]; @end verbatim @end example A few things of note, You can bind multiple aspects to an association. When the connection is broken the association will be released. When 'nameField' is deallocated, the connection will automatically be broken. EOAssociations can be created transparently by Gorm with the GDL2Palette. To create an association with Gorm, Select a control and control-drag from a control to an EODisplayGroup. In the connect inspector there is a pop up button which contains a list of the association classes which are usable with the control. Select an association class and the first column in the browser changes to a list of the aspects available. Selecting an aspect in the browser and the second column in the browser will list the available class properties connectable to the aspect. Unfortunately while not all association classes and aspects are implemented. They will unfortunately show up in the connect inspector. @node Index, , EOInterface, Top @unnumbered Index @printindex cp @bye gnustep-dl2-0.12.0/Documentation/GNUmakefile0000664000175000017500000000020514632325605017710 0ustar yavoryavorinclude ../common.make include $(GNUSTEP_MAKEFILES)/common.make SUBPROJECTS=GDL2Intro include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-dl2-0.12.0/EOInterface/0000775000175000017500000000000014747431374015164 5ustar yavoryavorgnustep-dl2-0.12.0/EOInterface/EORadioMatrixAssociation.h0000664000175000017500000000336014632325605022173 0ustar yavoryavor/** -*-ObjC-*- EORadioMatrixAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EORadioMatrixAssociation_h__ #define __EOInterface_EORadioMatrixAssociation_h__ #include @class NSString; @class NSArray; @interface EORadioMatrixAssociation : EOAssociation { int _tagValueForOther; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSArray *)associationClassesSuperseded; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (void)setTagValueForOther: (int)value; - (int)tagValueForOther; @end #endif gnustep-dl2-0.12.0/EOInterface/Makefile.preamble0000664000175000017500000000433014632325605020402 0ustar yavoryavor# -*-makefile-*- # Makefile.preamble # # Copyright (C) 2004,2005 Free Software Foundation, Inc. # # Written by: David Ayers # # This file is part of the GNUstep Database Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS = $(FND_DEFINE) $(RUNTIME_DEFINE) -g # Additional flags to pass to the Objective-C compiler ADDITIONAL_OBJCFLAGS = $(TEST_CFLAGS) # Additional flags to pass to the C compiler ADDITIONAL_CFLAGS = $(TEST_CFLAGS) # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS = -I../EOControl/$(GNUSTEP_TARGET_DIR) -I.. # Additional LDFLAGS to pass to the linker ADDITIONAL_LDFLAGS = $(TEST_LDFLAGS) # Additional library directories the linker should search ADDITIONAL_LIB_DIRS = # # Flags dealing with installing and uninstalling # # Additional directories to be created during installation ADDITIONAL_INSTALL_DIRS = # What are the libraries this library depends upon. This is needed for some # systems where building a shared library requires to pass to the linker # all the libraries the target library depends upon. ifneq ($(FOUNDATION_LIBRARY_NAME),) LIBRARIES_DEPEND_UPON = $(FND_LIBS) $(GUI_LIBS) endif ifneq ($(FOUNDATION_LIB),gnu) LIBRARIES_DEPEND_UPON += -lgnustep-baseadd endif LIBRARIES_DEPEND_UPON += $(TEST_COVERAGE_LIBS) ADDITIONAL_NATIVE_LIB_DIRS += ../EOControl ../EOAccess ADDITIONAL_NATIVE_LIBS += EOControl EOAccess gnustep-dl2-0.12.0/EOInterface/EOTableViewAssociation.m0000664000175000017500000002315614636004727021647 0ustar yavoryavor/** EOTableViewAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #include #include #include #include #include #else #include #include #endif #include #include "EOColumnAssociation.h" #include "EOControlAssociation.h" #include "EOPickTextAssociation.h" #include "EOActionAssociation.h" #include "EOActionInsertionAssociation.h" #include "EODisplayGroup.h" @implementation EOTableViewAssociation static NSMapTable *tvAssociationMap; + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"source", @"enabled", @"textColor", @"bold", @"italic", nil]; _aspects = RETAIN([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"", @"A", @"A", @"A", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = [[NSArray alloc] initWithObjects: @"target", @"delegate", @"dataSource", nil]; } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSTableView class]]; } @class EOControlAssociation; @class EOPickTextAssociation; @class EOActionAssociation; @class EOActionInsertionAssociation; + (NSArray *) associationClassesSuperseded { static NSArray *_superseded; if (!_superseded) _superseded = [[NSArray arrayWithObjects:[EOControlAssociation class], [EOPickTextAssociation class], [EOActionAssociation class], [EOActionInsertionAssociation class], nil] retain]; return _superseded; } + (NSString *)primaryAspect { return @"source"; } - (void)establishConnection { [super establishConnection]; _enabledAspectBound = [self displayGroupForAspect:@"enabled"] != nil; _italicAspectBound = [self displayGroupForAspect:@"italic"] != nil; _colorAspectBound = [self displayGroupForAspect:@"color"] != nil; _boldAspectBound = [self displayGroupForAspect:@"bold"] != nil; } - (void)breakConnection { [super breakConnection]; NSMapRemove(tvAssociationMap, _object); _enabledAspectBound = NO; _italicAspectBound = NO; _colorAspectBound = NO; _boldAspectBound = NO; } - (void)subjectChanged { EODisplayGroup *dg = [self displayGroupForAspect:@"source"]; /* this must be before selection changes in the case where the selected row is not yet inserted */ if ([dg contentsChanged]) [[self object] reloadData]; if ([dg selectionChanged]) { if (!_extras) { NSArray *selectionIndexes = RETAIN([dg selectionIndexes]); NSUInteger i, count; count = [selectionIndexes count]; if (count) { for (i = 0; i < count; i++) { NSInteger rowIndex = [[selectionIndexes objectAtIndex:i] integerValue]; /* don't extend the first selection */ [[self object] selectRow: rowIndex byExtendingSelection: (i != 0)]; [[self object] scrollRowToVisible:rowIndex]; } } else { /* hmm not sure what to do about it if it doesn't allow empty * selection. In that case NSTableView no-ops and the dg * will think nothing is selected table view will leave * whatever index was selected still selected. */ if ([[self object] allowsEmptySelection]) { [[self object] deselectAll:self]; } else NSLog(@"attempting to clear selection when table view won't allow empty selection"); } RELEASE(selectionIndexes); } _extras = 0; } } + (void)bindToTableView: (NSTableView *)tableView displayGroup: (EODisplayGroup *)displayGroup { EOTableViewAssociation *assoc; if (!tvAssociationMap) { tvAssociationMap = NSCreateMapTableWithZone(NSNonRetainedObjectMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0, [self zone]); assoc = [[self allocWithZone:NSDefaultMallocZone()] initWithObject:tableView]; NSMapInsert(tvAssociationMap, (void *)tableView, (void *)assoc); [assoc bindAspect:@"source" displayGroup:displayGroup key:@""]; [tableView setDataSource:assoc]; [tableView setDelegate:assoc]; [assoc establishConnection]; RELEASE(assoc); return; } assoc = (EOTableViewAssociation *)NSMapGet(tvAssociationMap, tableView); if (!assoc) { assoc = [[self allocWithZone:NSDefaultMallocZone()] initWithObject:tableView]; [assoc bindAspect:@"source" displayGroup:displayGroup key:@""]; [tableView setDataSource:assoc]; [tableView setDelegate:assoc]; [assoc establishConnection]; RELEASE(assoc); NSMapInsert(tvAssociationMap, tableView, assoc); } } - (BOOL)sortsByColumnOrder { return _sortsByColumnOrder; } - (void)setSortsByColumnOrder: (BOOL)flag { _sortsByColumnOrder = flag ? YES : NO; } - (EOColumnAssociation *)editingAssociation { NSInteger editedColumn = [[self object] editedColumn]; if (editedColumn == -1) { return nil; } else { return [[[[self object] tableColumns] objectAtIndex:editedColumn] identifier]; } } - (NSInteger)numberOfRowsInTableView: (NSTableView *)tableView { return [[[self displayGroupForAspect:@"source"] displayedObjects] count]; } - (void)tableView: (NSTableView *)tableView setObjectValue: (id)object forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { [(EOColumnAssociation *)[tableColumn identifier] tableView: tableView setObjectValue: object forTableColumn: tableColumn row: row]; } - (id)tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { id object; object = [[tableColumn identifier] tableView: tableView objectValueForTableColumn: tableColumn row: row]; return object; } - (BOOL)tableView: (NSTableView *)tableView shouldEditTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { if (_enabledAspectBound) if ([[self valueForAspect: @"enabled" atIndex:row] boolValue] == NO) return NO; return [[tableColumn identifier] tableView:tableView shouldEditTableColumn:tableColumn row:row]; } - (void)tableView: (NSTableView *)tableView willDisplayCell: (id)cell forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { if (_enabledAspectBound) [cell setEnabled: [[self valueForAspect:@"enabled" atIndex: row] boolValue]]; /* maybe these should setup an attributed string */ if (_italicAspectBound) ; /* TODO */ if (_boldAspectBound) ; /* TODO */ if (_colorAspectBound) { if ([cell respondsToSelector:@selector(setTextColor:)]) [cell setTextColor: [self valueForAspect:@"color" atIndex:row]]; } } - (void)tableViewSelectionDidChange: (NSNotification *)notification { _extras = 1; { EODisplayGroup *dg = [self displayGroupForAspect:@"source"]; NSMutableArray *selectionIndices = [[NSMutableArray alloc] init]; NSTableView *tv = [notification object]; NSEnumerator *selectionEnum = [tv selectedRowEnumerator]; id index; while ((index = [selectionEnum nextObject])) { [selectionIndices addObject:index]; } [dg setSelectionIndexes: AUTORELEASE(selectionIndices)]; } } - (BOOL)control: (NSControl *)control didFailToFormatString: (NSString *)string errorDescription: (NSString *)description { return [[self editingAssociation] control: control didFailToFormatString: string errorDescription: description]; } - (BOOL)control: (NSControl *)control isValidObject: (id)object { return [[self editingAssociation] control: control isValidObject: object]; } - (BOOL)control: (NSControl *)control textShouldBeginEditing: (NSText *)fieldEditor { return [[self editingAssociation] control: control textShouldBeginEditing: fieldEditor]; } - (void)controlTextDidEndEditing:(NSNotification *)aNotification { [[self displayGroupForAspect:@"source"] endEditing]; } - (void) dealloc { [super dealloc]; } @end gnustep-dl2-0.12.0/EOInterface/TODO0000664000175000017500000000124314632325605015644 0ustar yavoryavor# Completed Associations: EOActionAssociation EOColumnAssociation EOMasterDetailAssociation EOMatrixAssociation EOPopUpAssociation EORadioMatixAssociation # Incomplete Associations: EOControlAssociation: done: value, enabled needs: URL EOGenericControlAssociation: done: value, enabled needs: URL EOTableViewAssociation: done: value, color, enabled, source needs: italic, bold EOTextAssociation: done: value, editable needs: URL # Unimplemented Associations: EOActionCellAssociation EOActionInsertionAssociation EOComboBoxAssociation EODetailSelectionAssociation EOMasterCopyAssociation EOMasterPeerAssociation EOPickTextAssociation EORecursiveBrowserAssociation gnustep-dl2-0.12.0/EOInterface/EOAssociation.h0000664000175000017500000000644014632325605020031 0ustar yavoryavor/** -*-ObjC-*- EOAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOAssociation_h__ #define __EOInterface_EOAssociation_h__ #ifdef GNUSTEP #include #else #include #endif #include @class NSString; @class NSArray; @class EODisplayGroup; @interface EOAssociation : EODelayedObserver { id _object; unsigned int _refs:8; unsigned int _isConnected:1; unsigned int _extras:7; unsigned int subclassFlags:16; @private NSMapTable *_displayGroupMap; NSMapTable *_displayGroupKeyMap; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSArray *)associationClassesSuperseded; + (NSString *)displayName; + (NSString *)primaryAspect; + (NSArray *)associationClassesForObject: (id)object; /* Creation and configuration. */ - (id)initWithObject: (id)object; - (void)bindAspect: (NSString *)aspectName displayGroup: (EODisplayGroup *)displayGroup key: (NSString *)key; - (void)establishConnection; - (void)breakConnection; - (void)copyMatchingBindingsFromAssociation: (EOAssociation *)association; /* Defining capabilities of concrete instance. */ - (BOOL)canBindAspect: (NSString *)aspectName displayGroup: (EODisplayGroup *)displayGroup key: (NSString *)key; /* Display object access. */ - (id)object; /* Bindings access. */ - (EODisplayGroup *)displayGroupForAspect: (NSString *)aspectName; - (NSString *)displayGroupKeyForAspect: (NSString *)aspectName; /* Display object value manipulation. */ - (void)subjectChanged; - (BOOL)endEditing; /* Enterprise object value manipulation. */ - (id)valueForAspect: (NSString *)aspectName; - (BOOL)setValue: (id)value forAspect: (NSString *)aspectName; - (id)valueForAspect: (NSString *)aspectName atIndex: (unsigned int)index; - (BOOL)setValue: (id)value forAspect: (NSString *)aspectName atIndex: (unsigned int)index; /* Handling of validation errors. */ - (BOOL)shouldEndEditingForAspect: (NSString *)aspectName invalidInput: (NSString *)input errorDescription: (NSString *)description; - (BOOL)shouldEndEditingForAspect: (NSString *)aspectName invalidInput: (NSString *)input errorDescription: (NSString *)description index: (unsigned int)index; @end #endif gnustep-dl2-0.12.0/EOInterface/EOColumnAssociation.m0000664000175000017500000001230014636004727021207 0ustar yavoryavor/** EOColumnAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #include #include #else #include #include #endif #include #include "EODisplayGroup.h" #include "EOColumnAssociation.h" #include "SubclassFlags.h" @implementation EOColumnAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"value", @"enabled", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = [[NSArray alloc] initWithObjects: @"identifier", nil]; } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSTableColumn class]]; } + (NSString *)displayName { return @"EOColumnAssoc"; } + (NSString *)primaryAspect { return @"value"; } - (id)initWithObject: (id)object { if ((self = [super initWithObject: object])) { _sortingSelector = @selector(compareAscending:); } return self; } - (void)establishConnection { EODisplayGroup *dg; [super establishConnection]; dg = [self displayGroupForAspect:@"value"]; if (dg) { [EOTableViewAssociation bindToTableView: [[self object] tableView] displayGroup: dg]; subclassFlags |= ValueAspectMask; } [[self object] setIdentifier: self]; _enabledAspectBound = [self displayGroupForAspect:@"enabled"] != nil; } - (void)breakConnection { [super breakConnection]; _enabledAspectBound = NO; } - (void)subjectChanged { } - (BOOL)endEditing { BOOL flag = YES; if (subclassFlags & ValueAspectMask) { NSTableView *tv = [[self object] tableView]; NSInteger row = tv ? [tv editedRow] : -1; if (row != -1) { [[[self object] tableView] validateEditing]; [[self displayGroupForAspect:@"value"] associationDidEndEditing:self]; } } return flag; } - (void)setSortingSelector: (SEL)selector { _sortingSelector = selector; } - (SEL)sortingSelector { return _sortingSelector; } - (void)tableView: (NSTableView *)tableView setObjectValue: (id)object forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { [self setValue:object forAspect:@"value" atIndex:row]; } - (id)tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { return [self valueForAspect:@"value" atIndex:row]; } - (BOOL)tableView: (NSTableView *)tableView shouldEditTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { if (_enabledAspectBound) return [[self valueForAspect:@"enabled"] boolValue]; return YES; } - (void)tableView: (NSTableView *)tableView willDisplayCell: (id)cell forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { if (_enabledAspectBound) [cell setEnabled:[[self valueForAspect:@"value" atIndex:row] boolValue]]; } - (BOOL)control: (NSControl *)control didFailToFormatString: (NSString *)string errorDescription: (NSString *)description { return [self shouldEndEditingForAspect: @"value" invalidInput: string errorDescription: description];; } - (BOOL)control: (NSControl *)control isValidObject: (id)object { BOOL flag; /* TODO selected != editing figure this out */ flag = [self setValue:object forAspect:@"value"]; if (flag) [[self displayGroupForAspect:@"value"] associationDidEndEditing:self]; return flag; } - (BOOL)control: (NSControl *)control textShouldBeginEditing: (NSText *)fieldEditor { BOOL flag = [[self object] isEditable]; if (flag) { [[self displayGroupForAspect:@"value"] associationDidBeginEditing:self]; return YES; } return NO; } @end gnustep-dl2-0.12.0/EOInterface/EOComboBoxAssociation.h0000664000175000017500000000466614632325605021472 0ustar yavoryavor/** -*-ObjC-*- EOComboBoxAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOComboBoxAssociation_h__ #define __EOInterface_EOComboBoxAssociation_h__ #ifdef GNUSTEP #include #else #include #endif #include @class NSString; @class NSArray; @class NSNotification; @class NSComboBox; @interface EOComboBoxAssociation : EOAssociation { } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSArray *)associationClassesSuperseded; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (BOOL)endEditing; /* NSComboBox data source. */ - (int)numberOfItemsInComboBox: (NSComboBox *)comboBox; - (id)comboBox: (NSComboBox *)comboBox objectValueForItemAtIndex: (int)index; - (unsigned int)comboBox: (NSComboBox *)comboBox indexOfItemWithStringValue: (NSString *)stringValue; - (NSString *)comboBox: (NSComboBox *)comboBox completedString: (NSString *)string; /* NSComboBox delegate methods. */ - (void)comboBoxWillPopUp: (NSNotification *)notification; - (void)comboBoxWillDismiss: (NSNotification *)notification; - (void)comboBoxSelectionDidChange: (NSNotification *)notification; - (void)comboBoxSelectionIsChanging: (NSNotification *)notification; @end #endif gnustep-dl2-0.12.0/EOInterface/EOActionAssociation.h0000664000175000017500000000336214632325605021167 0ustar yavoryavor/** -*-ObjC-*- EOActionAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOActionAssociation_h__ #define __EOInterface_EOActionAssociation_h__ #ifdef GNUSTEP #include #include #else #include #endif #include @class NSString; @class NSArray; @class EODisplayGroup; @interface EOActionAssociation : EOAssociation { } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (void)action: (id)sender; @end #endif gnustep-dl2-0.12.0/EOInterface/EOColumnAssociation.h0000664000175000017500000001236414636004727021214 0ustar yavoryavor/** -*-ObjC-*- EOColumnAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOColumnAssociation_h__ #define __EOInterface_EOColumnAssociation_h__ #ifdef GNUSTEP #include #else #include #endif #include @class NSString; @class NSArray; @class NSNotification; @class NSTableView; @class NSTableColumn; @class NSControl; @class NSText; @class EODisplayGroup; @interface EOColumnAssociation : EOAssociation { unsigned int _didChange:1; unsigned int _alreadySetObject:1; unsigned int _enabledAspectBound:1; unsigned int _colorAspectBound:1; unsigned int _boldAspectBound:1; unsigned int _italicAspectBound:1; unsigned _unused:26; SEL _sortingSelector; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (id)initWithObject: (id)object; - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (BOOL)endEditing; /* EOColumnViewAssociation sort ordering. */ - (void)setSortingSelector: (SEL)selector; - (SEL)sortingSelector; /* EOColumnViewAssociation table view delegate. */ - (void)tableView: (NSTableView *)tableView setObjectValue: (id)object forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; - (id)tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; - (BOOL)tableView: (NSTableView *)tableView shouldEditTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; - (void)tableView: (NSTableView *)tableView willDisplayCell: (id)cell forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; /* EOColumnViewAssociation control delegate. */ - (BOOL)control: (NSControl *)control didFailToFormatString: (NSString *)string errorDescription: (NSString *)description; - (BOOL)control: (NSControl *)control isValidObject: (id)object; - (BOOL)control: (NSControl *)control textShouldBeginEditing: (NSText *)fieldEditor; @end @interface EOTableViewAssociation : EOAssociation { unsigned int _updating:1; unsigned int _enabledAspectBound:1; unsigned int _colorAspectBound:1; unsigned int _boldAspectBound:1; unsigned int _italicAspectBound:1; unsigned int _sortsByColumnOrder:1; unsigned int _didSetSortOrdering:1; unsigned int _autoCreated:1; unsigned int _unused:24; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; /* Creation. */ + (void)bindToTableView: (NSTableView *)tableView displayGroup: (EODisplayGroup *)displayGroup; /* Configure sort ordering. */ - (BOOL)sortsByColumnOrder; - (void)setSortsByColumnOrder: (BOOL)flag; /* Access to EOColumnAssociation. */ - (EOColumnAssociation *)editingAssociation; /* Providing table view data source. */ - (NSInteger)numberOfRowsInTableView: (NSTableView *)tableView; - (void)tableView: (NSTableView *)tableView setObjectValue: (id)object forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; - (id)tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; /* Delegate methods for table view. */ - (BOOL)tableView: (NSTableView *)tableView shouldEditTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; - (void)tableView: (NSTableView *)tableView willDisplayCell: (id)cell forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row; /* Notification methods for table view. */ - (void)tableViewSelectionDidChange: (NSNotification *)notification; /* Delegate methods for control. */ - (BOOL)control: (NSControl *)control didFailToFormatString: (NSString *)string errorDescription: (NSString *)description; - (BOOL)control: (NSControl *)control isValidObject: (id)object; - (BOOL)control: (NSControl *)control textShouldBeginEditing: (NSText *)fieldEditor; @end #endif gnustep-dl2-0.12.0/EOInterface/EOInterface.gsdoc0000664000175000017500000000126514632325605020325 0ustar yavoryavor GDL2 - EOInterface GDL2 - EOInterface

...

gnustep-dl2-0.12.0/EOInterface/GNUmakefile0000664000175000017500000000614214636002701017222 0ustar yavoryavor# # EOInterface makefile for GNUstep Database Library. # # Copyright (C) 2004,2005 Free Software Foundation, Inc. # # Author: David Ayers # # This file is part of the GNUstep Database Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # include ../common.make include $(GNUSTEP_MAKEFILES)/common.make include ../Version # The library to be compiled NATIVE_LIBRARY_NAME=EOInterface EOInterface_NEEDS_GUI = yes EOInterface_LIBRARIES_DEPEND_UPON = -lEOControl $(OBJC_LIBS) # The C source files to be compiled EOInterface_C_FILES = # The Objective-C source files to be compiled EOInterface_OBJC_FILES = \ EOActionAssociation.m \ EOActionCellAssociation.m \ EOActionInsertionAssociation.m \ EOAssociation.m \ EOColumnAssociation.m \ EOComboBoxAssociation.m \ EOControlAssociation.m \ EODetailSelectionAssociation.m \ EODisplayGroup.m \ EOGenericControlAssociation.m \ EOMasterCopyAssociation.m \ EOMasterDetailAssociation.m \ EOMasterPeerAssociation.m \ EOMatrixAssociation.m \ EOPickTextAssociation.m \ EOPopUpAssociation.m \ EORadioMatrixAssociation.m \ EORecursiveBrowserAssociation.m \ EOTableViewAssociation.m \ EOTextAssociation.m \ NSImage+Additions.m \ EOAspectConnector.m EOInterface_HEADER_FILES = \ EOActionAssociation.h \ EOActionInsertionAssociation.h \ EOAssociation.h \ EOColumnAssociation.h \ EOComboBoxAssociation.h \ EOControlAssociation.h \ EODetailSelectionAssociation.h \ EODisplayGroup.h \ EOInterface.h \ EOMasterCopyAssociation.h \ EOMasterDetailAssociation.h \ EOMatrixAssociation.h \ EOPickTextAssociation.h \ EOPopUpAssociation.h \ EORadioMatrixAssociation.h \ EORecursiveBrowserAssociation.h \ EOTextAssociation.h \ EOAspectConnector.h EOInterface_AUTOGSDOC_HEADERS = $(EOInterface_HEADER_FILES) EOInterface_AUTOGSDOC_SOURCE = $(EOInterface_OBJC_FILES) DOCUMENT_NAME = EOInterface EOInterface_HEADER_FILES_DIR = $(HEADER_DIR) EOInterface_AGSDOC_FILES = EOInterface.gsdoc $(EOInterface_AUTOGSDOC_HEADERS) #$(EOInterface_AUTOGSDOC_SOURCE) EOInterface_AGSDOC_FLAGS = \ -Declared EOInterface \ -Project EOInterface \ -Up EOInterface \ $(GDL2_AGSDOC_FLAGS) -include Makefile.preamble -include GNUmakefile.local -include ../GNUmakefile.local include $(GNUSTEP_MAKEFILES)/native-library.make # Only build the doc if doc=yes was passed on the command line ifeq ($(doc),yes) include $(GNUSTEP_MAKEFILES)/documentation.make endif -include Makefile.postamble gnustep-dl2-0.12.0/EOInterface/EOMatrixAssociation.h0000664000175000017500000000320114632325605021206 0ustar yavoryavor/** -*-ObjC-*- EOMatrixAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOMatrixAssociation_h__ #define __EOInterface_EOMatrixAssociation_h__ #include @class NSString; @class NSArray; @interface EOMatrixAssociation : EOAssociation { } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSArray *)associationClassesSuperseded; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; @end #endif gnustep-dl2-0.12.0/EOInterface/EOMasterPeerAssociation.m0000664000175000017500000000272714632325605022032 0ustar yavoryavor/** EOMasterPeerAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #else #include #endif #include #include "EODisplayGroup.h" #include "EOMasterDetailAssociation.h" @implementation EOMasterPeerAssociation + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [EODisplayGroup class]] && [[object dataSource] isKindOfClass: [EODetailDataSource class]] == NO; } + (NSString *)displayName { return @"EOMasterPeerAssociation"; } @end gnustep-dl2-0.12.0/EOInterface/EODetailSelectionAssociation.h0000664000175000017500000000312014632325605023012 0ustar yavoryavor/** -*-ObjC-*- EODetailSelectionAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EODetailSelectionAssociation_h__ #define __EOInterface_EODetailSelectionAssociation_h__ #include @class NSString; @class NSArray; @interface EODetailSelectionAssociation : EOAssociation { id _nonRetainedObject; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (BOOL)isUsableWithObject: (id)object; + (NSString *)displayName; + (NSString *)primaryAspect; - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; @end #endif gnustep-dl2-0.12.0/EOInterface/EOTextAssociation.h0000664000175000017500000000377214632325605020703 0ustar yavoryavor/** -*-ObjC-*- EOTextAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOTextAssociation_h__ #define __EOInterface_EOTextAssociation_h__ #include @class NSString; @class NSArray; @class NSControl; @class NSText; @interface EOTextAssociation : EOAssociation { id _lastValue; unsigned _didChange:1; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (BOOL)endEditing; /* NSControl delegate methods. */ - (BOOL)control: (NSControl *)control isValidObject: (id)object; - (void)control: (NSControl *)control didFailToValidatePartialString: (NSString *)string errorDescription: (NSString *)description; /* NSText delegete methods. */ - (BOOL)textShouldBeginEditing: (NSText *) text; - (BOOL)textShouldEndEditing: (NSText *)text; @end #endif gnustep-dl2-0.12.0/EOInterface/EODisplayGroup.m0000664000175000017500000010062014636026724020203 0ustar yavoryavor/* EODisplayGroup.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef GNUSTEP #include #include #include #include #include #include #include #include #include #else #include #include #endif #include #include #include #include #include #include #include #include #include #include #include "EODisplayGroup.h" #include "EODeprecated.h" #include "EOAssociation.h" #include #define DG_SHOULD_CHANGE_SELECTION_TO_IDX \ @selector(displayGroup:shouldChangeSelectionToIndexes:) #define DG_DISPLAY_ARRAY_FOR_OBJECTS \ @selector(displayGroup:displayArrayForObjects:) #define DG_SHOULD_DISPLAY_ALERT \ @selector(displayGroup:shouldDisplayAlertWithTitle:message:) #define DG_DID_FETCH_OBJECTS \ @selector(displayGroup:didFetchObjects:) #define DG_CREATE_OBJECT_FAILED \ @selector(displayGroup:createObjectFailedForDataSource:) #define DG_SHOULD_INSERT_OBJECT \ @selector(displayGroup:shouldInsertObject:atIndex:) #define DG_DID_INSERT_OBJECT \ @selector(displayGroup:didInsertObject:) #define DG_DID_CHANGE_SELECTION \ @selector(displayGroupDidChangeSelection:) #define DG_DID_DELETE_OBJECT \ @selector(displayGroup:didDeleteObject:) #define DG_SHOULD_DELETE_OBJECT \ @selector(displayGroup:shouldDeleteObject:) /* undocumented notification */ NSString *EODisplayGroupWillFetchNotification = @"EODisplayGroupWillFetch"; @interface NSArray (private) - (NSArray *)indexesForObjectsIdenticalTo: (NSArray *)array; @end @implementation NSArray (private) - (NSArray *)indexesForObjectsIdenticalTo: (NSArray *)array { NSUInteger idx, i, c = [array count]; NSMutableArray *indices = (id)[NSMutableArray arrayWithCapacity: c]; id object; NSNumber *number; for (i = 0; i < c; i++) { object = [array objectAtIndex: i]; idx = [self indexOfObjectIdenticalTo: object]; if (idx != NSNotFound) { /* We should cache all these numbers. */ number = [NSNumber numberWithUnsignedInteger: idx]; [indices addObject: number]; } } return AUTORELEASE ([indices copy]); } @end @interface EODisplayGroup (private) - (void)_presentAlertWithTitle:(NSString *)title message:(NSString *)message; @end @implementation EODisplayGroup (private) - (void)_presentAlertWithTitle:(NSString *)title message:(NSString *)message { if (_delegate && [_delegate respondsToSelector: DG_SHOULD_DISPLAY_ALERT] && [_delegate displayGroup: self shouldDisplayAlertWithTitle: title message: message] == NO) { return; } NSRunAlertPanel(title, message, nil, nil, nil); } @end /** * The EODisplayGoup keeps track of all enterprise objects from * a particular EODataSource to coordinate their internal state * with other objects such as UI elements and other EODisplayGroups. * Commonly the data source is a EODatabaseDataSource (EOAccess) * which manages the objects of a single entity for a specific * editing context. The display group is connected to the UI elements * or other display groups via EOAssociations. This framework is * responsible to update the enterprise objects when the contents * and state of the UI elements are changed and to update the UI * elements when the state of the enterprise objects are changed. */ @implementation EODisplayGroup NSArray *emptyArray; NSDictionary *emptyDictionary; + (void)initialize { if (emptyArray == nil) { emptyArray = [NSArray new]; emptyDictionary = [NSDictionary new]; } } static NSString *_globalDefaultStringMatchOperator = @"caseInsensitiveLike"; + (NSString *)globalDefaultStringMatchOperator { return _globalDefaultStringMatchOperator; } + (void)setGlobalDefaultStringMatchOperator: (NSString *)operator { ASSIGNCOPY(_globalDefaultStringMatchOperator, operator); } static BOOL _globalDefaultForValidatesChangesImmediately = NO; + (BOOL)globalDefaultForValidatesChangesImmediately { return _globalDefaultForValidatesChangesImmediately; } + (void)setGlobalDefaultForValidatesChangesImmediately: (BOOL)flag { _globalDefaultForValidatesChangesImmediately = flag ? YES : NO; } - (id)init { if ((self = [super init])) { _allObjects = [NSMutableArray new]; _displayedObjects = [NSMutableArray new]; _selection = emptyArray; _observerNotificationBeginProxy = [[EOObserverProxy alloc] initWithTarget: self action: @selector(_beginObserverNotification:) priority: EOObserverPriorityFirst]; [EOObserverCenter addObserver: _observerNotificationBeginProxy forObject: self]; _observerNotificationEndProxy = [[EOObserverProxy alloc] initWithTarget: self action: @selector(_endObserverNotification:) priority: EOObserverPrioritySixth]; [EOObserverCenter addObserver: _observerNotificationEndProxy forObject: self]; _insertedObjectDefaultValues = emptyDictionary; _queryMatch = [NSMutableDictionary new]; _queryMin = [NSMutableDictionary new]; _queryMax = [NSMutableDictionary new]; _queryOperator = [NSMutableDictionary new]; _defaultStringMatchOperator = [[self class] globalDefaultStringMatchOperator]; _defaultStringMatchFormat = @"%@*"; _queryBindings = [NSMutableDictionary new]; _flags.selectsFirstObjectAfterFetch = YES; _flags._initialized = YES; } return self; } - (void)dealloc { EOEditingContext *context = [_dataSource editingContext]; [[NSNotificationCenter defaultCenter] removeObserver:self]; [context removeEditor:self]; if ([context messageHandler] == self) [context setMessageHandler:nil]; DESTROY(_dataSource); if (_allObjects != emptyArray) DESTROY(_allObjects); DESTROY(_displayedObjects); if (_selection != emptyArray) DESTROY(_selection); DESTROY(_sortOrdering); DESTROY(_qualifier); DESTROY(_localKeys); DESTROY(_selectedObjects); [EOObserverCenter removeObserver:_observerNotificationBeginProxy forObject:self]; [EOObserverCenter removeObserver:_observerNotificationEndProxy forObject:self]; DESTROY(_observerNotificationBeginProxy); DESTROY(_observerNotificationEndProxy); if (_insertedObjectDefaultValues != emptyDictionary) DESTROY(_insertedObjectDefaultValues); DESTROY(_savedAllObjects); DESTROY(_queryMatch); DESTROY(_queryMin); DESTROY(_queryMax); DESTROY(_queryOperator); DESTROY(_defaultStringMatchOperator); DESTROY(_defaultStringMatchFormat); DESTROY(_queryBindings); DESTROY(_editingAssociation); [super dealloc]; } - (id) initWithCoder:(NSCoder *)decoder { int tmpI; self = [self init]; [self setDataSource:[decoder decodeObject]]; _delegate = [decoder decodeObject]; ASSIGN(_sortOrdering, [decoder decodeObject]); ASSIGN(_qualifier, [decoder decodeObject]); ASSIGN(_localKeys, [decoder decodeObject]); /* encode _query*, _defaultStringMatch* ?? */ [decoder decodeValueOfObjCType: @encode(int) at: &tmpI]; _flags.selectsFirstObjectAfterFetch = tmpI; [decoder decodeValueOfObjCType: @encode(int) at: &tmpI]; _flags.autoFetch = tmpI; return self; } - (void) awakeFromNib { if (_flags.autoFetch) { [self fetch]; } } - (void)encodeWithCoder: (NSCoder *)encoder { int tmpI; [encoder encodeObject: _dataSource]; [encoder encodeObject: _delegate]; [encoder encodeObject: _sortOrdering]; [encoder encodeObject: _qualifier]; [encoder encodeObject: _localKeys]; tmpI = _flags.selectsFirstObjectAfterFetch; [encoder encodeValueOfObjCType: @encode(int) at: &tmpI]; tmpI = _flags.autoFetch; [encoder encodeValueOfObjCType: @encode(int) at: &tmpI]; } - (BOOL)fetchesOnLoad { return _flags.autoFetch; } - (void)setFetchesOnLoad: (BOOL)flag { _flags.autoFetch = flag ? YES : NO; } - (BOOL)selectsFirstObjectAfterFetch { return _flags.selectsFirstObjectAfterFetch; } - (void)setSelectsFirstObjectAfterFetch: (BOOL)flag { _flags.selectsFirstObjectAfterFetch = flag ? YES : NO; } - (BOOL)validatesChangesImmediately { return _flags.validateImmediately; } - (void)setValidatesChangesImmediately: (BOOL)flag { _flags.validateImmediately = flag ? YES : NO; } - (BOOL)usesOptimisticRefresh { return _flags.optimisticRefresh; } - (void)setUsesOptimisticRefresh: (BOOL)flag { _flags.optimisticRefresh = flag ? YES : NO; } - (NSDictionary *)queryBindingValues { return AUTORELEASE([_queryBindings copy]); } - (void)setQueryBindingValues: (NSDictionary *)values { ASSIGN(_queryBindings, [values mutableCopyWithZone: [self zone]]); } - (NSDictionary *)queryOperatorValues { return AUTORELEASE([_queryOperator copy]); } - (void)setQueryOperatorValues: (NSDictionary *)values { ASSIGN(_queryOperator, AUTORELEASE([values mutableCopyWithZone: [self zone]])); } - (NSString *)defaultStringMatchFormat { return _defaultStringMatchFormat; } - (void)setDefaultStringMatchFormat: (NSString *)format { ASSIGNCOPY(_defaultStringMatchFormat, format); } - (NSString *)defaultStringMatchOperator { return _defaultStringMatchOperator; } - (void)setDefaultStringMatchOperator: (NSString *)operator { ASSIGNCOPY(_defaultStringMatchOperator, operator); } - (EODataSource *)dataSource { return _dataSource; } - (void)setDataSource: (EODataSource *)dataSource { if (_dataSource != dataSource) { EOEditingContext *context; NSNotificationCenter *center; center = [NSNotificationCenter defaultCenter]; if (_dataSource && (context = [_dataSource editingContext])) { [context removeEditor: self]; if ([context messageHandler] == self) { [context setMessageHandler: nil]; } [center removeObserver: self name: EOObjectsChangedInEditingContextNotification object: context]; [center removeObserver: self name: EOObjectsChangedInStoreNotification object: context]; } [self setObjectArray: nil]; ASSIGN(_dataSource, dataSource); if ((context = [_dataSource editingContext])) { [context addEditor: self]; if ([context messageHandler] == nil) { [context setMessageHandler: self]; } [center addObserver: self selector: @selector(objectsInvalidatedInEditingContext:) name: EOInvalidatedAllObjectsInStoreNotification object: context]; [center addObserver: self selector: @selector(objectsChangedInEditingContext:) name: EOObjectsChangedInEditingContextNotification object: context]; } if (_delegate && [_delegate respondsToSelector: @selector(displayGroupDidChangeDataSource:)]) { [_delegate displayGroupDidChangeDataSource: self]; } } } - (EOQualifier *)qualifier { return _qualifier; } - (void)setQualifier: (EOQualifier *)qualifier { ASSIGN(_qualifier, qualifier); } - (NSArray *)sortOrderings { return _sortOrdering; } - (void)setSortOrderings: (NSArray *)orderings { ASSIGNCOPY(_sortOrdering, orderings); } - (EOQualifier *) _qualifierForKey:(NSString *)key value:(id)val defaultOperator:(char)defaultOp { NSString *op; SEL selector = NULL; NSString *fmt = nil; EOClassDescription *classDesc = [_dataSource classDescriptionForObjects]; [[classDesc validateValue:&val forKey:key] raise]; op = [_queryOperator objectForKey:key]; if (op == nil) { switch (defaultOp) { case '=': if ([val isKindOfClass:[NSString class]]) { op = _defaultStringMatchOperator; fmt = _defaultStringMatchFormat; } else { selector = EOQualifierOperatorEqual; } break; case '>': selector = EOQualifierOperatorGreaterThanOrEqualTo; break; case '<': selector = EOQualifierOperatorLessThanOrEqualTo; break; } } if (op) selector = [EOKeyValueQualifier operatorSelectorForString:op]; if (fmt) val = [NSString stringWithFormat:fmt, val]; return [EOKeyValueQualifier qualifierWithKey:key operatorSelector:selector value: val]; } - (EOQualifier *)qualifierFromQueryValues { NSMutableArray *quals = [NSMutableArray array]; int i, c, j; id dicts[3]; char ops[3] = { '=', '<', '>' }; dicts[0] = _queryMatch; dicts[1] = _queryMax; dicts[2] = _queryMin; for (j = 0; j < 3; j++) { NSArray *keys = [dicts[j] allKeys]; for (i = 0, c = [keys count]; i < c; i++) { NSString *key = [keys objectAtIndex:i]; id val = [dicts[j] objectForKey:key]; [quals addObject:[self _qualifierForKey:key value:val defaultOperator:ops[j]]]; } } return [EOAndQualifier qualifierWithQualifierArray:quals]; } - (NSDictionary *)equalToQueryValues { return AUTORELEASE([_queryMatch copy]); } - (void)setEqualToQueryValues: (NSDictionary *)values { ASSIGN(_queryMatch, AUTORELEASE([values mutableCopyWithZone: [self zone]])); } - (NSDictionary *)greaterThanQueryValues { return AUTORELEASE([_queryMin copy]); } - (void)setGreaterThanQueryValues: (NSDictionary *)values { ASSIGN(_queryMin, AUTORELEASE([values mutableCopyWithZone: [self zone]])); } - (NSDictionary *)lessThanQueryValues { return AUTORELEASE([_queryMax copy]); } - (void)setLessThanQueryValues: (NSDictionary *)values { ASSIGN(_queryMax, AUTORELEASE([values mutableCopyWithZone: [self zone]])); } - (void)qualifyDisplayGroup { [self setQualifier:[self qualifierFromQueryValues]]; [self updateDisplayedObjects]; _flags.queryMode = NO; } - (void)qualifyDataSource { /* only works with EODatabaseDataSource ?? */ [[(EODatabaseDataSource *)_dataSource fetchSpecification] setQualifier:[self qualifierFromQueryValues]]; _flags.queryMode = NO; [self fetch]; } - (BOOL)inQueryMode { return _flags.queryMode; } - (void)setInQueryMode: (BOOL)flag { _flags.queryMode = flag ? YES : NO; } - (BOOL)fetch { BOOL flag = YES; if (_dataSource && (flag = [self endEditing])) { if (_delegate && [_delegate respondsToSelector: @selector(displayGroupShouldFetch:)]) { flag = [_delegate displayGroupShouldFetch: self]; } if (flag) { NSNotificationCenter *center; NSArray *objects; center = [NSNotificationCenter defaultCenter]; [center postNotificationName: EODisplayGroupWillFetchNotification object: self]; if ([_dataSource respondsToSelector: @selector(setQualifierBindings:)]) { [_dataSource setQualifierBindings: _queryBindings]; } objects = [_dataSource fetchObjects]; [self setObjectArray: objects]; if (_delegate && [_delegate respondsToSelector: DG_DID_FETCH_OBJECTS]) { [_delegate displayGroup: self didFetchObjects: objects]; } flag = objects ? YES : NO; } } return flag; } - (NSArray *)allObjects { return AUTORELEASE([[NSArray alloc] initWithArray:_allObjects copyItems:NO]); } - (void)setObjectArray: (NSArray *)objects { if (objects == nil) { objects = emptyArray; } ASSIGN(_allObjects, AUTORELEASE([objects mutableCopyWithZone: [self zone]])); [self updateDisplayedObjects]; [self selectObjectsIdenticalTo:[self selectedObjects] selectFirstOnNoMatch:_flags.selectsFirstObjectAfterFetch]; [self redisplay]; } - (NSArray *)displayedObjects { return AUTORELEASE([_displayedObjects copy]); } - (void)redisplay { /* TODO: Check this again! */ _flags.didChangeContents = YES; // [EOObserverCenter notifyObserversObjectWillChange: nil]; [self willChange]; } - (void)updateDisplayedObjects { NSArray *oldSelection = [self selectedObjects]; volatile NSArray *displayedObjects = [self allObjects]; if (_delegate && [_delegate respondsToSelector: DG_DISPLAY_ARRAY_FOR_OBJECTS]) { displayedObjects = [_delegate displayGroup: self displayArrayForObjects: (id)displayedObjects]; } NS_DURING { displayedObjects = [(id)displayedObjects filteredArrayUsingQualifier: _qualifier]; displayedObjects = [(id)displayedObjects sortedArrayUsingKeyOrderArray: _sortOrdering]; } NS_HANDLER { [self _presentAlertWithTitle: @"Exception during sort or filter operatation." message: [localException reason]]; } NS_ENDHANDLER; ASSIGN(_displayedObjects, AUTORELEASE([(id)displayedObjects mutableCopyWithZone:[self zone]])); [self selectObjectsIdenticalTo: oldSelection selectFirstOnNoMatch: NO]; [self redisplay]; } - (NSArray *)selectionIndexes { return _selection; } - (BOOL)setSelectionIndexes: (NSArray *)selection { if ([self endEditing] && selection) { if (_delegate && [_delegate respondsToSelector: DG_SHOULD_CHANGE_SELECTION_TO_IDX] && [_delegate displayGroup: self shouldChangeSelectionToIndexes: selection] == NO) { return NO; } else { NSNumber *number; NSArray *newSelection; NSMutableArray *newObjects; id object; unsigned c, i, count, index; count = [_displayedObjects count]; c = [selection count]; newObjects = (id)[NSMutableArray arrayWithCapacity: c]; for (i = 0; i < c; i++) { number = [selection objectAtIndex: i]; index = [number unsignedIntValue]; object = (index < count) ? [_displayedObjects objectAtIndex: index] : nil; if (object != nil) { [newObjects addObject: object]; } } if ([_selectedObjects isEqual:newObjects] == NO || [_selection isEqual:selection] == NO) { ASSIGNCOPY(_selectedObjects, newObjects); newSelection = [_displayedObjects indexesForObjectsIdenticalTo: _selectedObjects]; /* don't release emptyArray */ (_selection == emptyArray) ? _selection = RETAIN(newSelection) : ASSIGN(_selection, newSelection); _flags.didChangeSelection = YES; if ([_delegate respondsToSelector: DG_DID_CHANGE_SELECTION]) { [_delegate displayGroupDidChangeSelection:self]; } [self willChange]; } return YES; } } return NO; } - (BOOL)selectObject: (id)object { NSArray *array; if (object) { array = [NSArray arrayWithObject: object]; } else { array = [NSArray array]; } return [self selectObjectsIdenticalTo: array]; } - (BOOL)selectObjectsIdenticalTo: (NSArray *)selection { NSArray *indices; indices = [_displayedObjects indexesForObjectsIdenticalTo: selection]; if ([selection count] && ![indices count]) return NO; return [self setSelectionIndexes: indices]; } - (BOOL)selectObjectsIdenticalTo: (NSArray *)selection selectFirstOnNoMatch: (BOOL)flag { BOOL selected = [self selectObjectsIdenticalTo: selection]; if (!selected) { unsigned c = [_displayedObjects count]; if (flag && c != 0) { id object = [_displayedObjects objectAtIndex: 0]; selected = [self selectObject: object]; } #if 0 // this really doesn't seem like it belongs here. else if (c) { [self setSelectionIndexes:_selection]; } #endif else { [self clearSelection]; } } return selected; } - (BOOL)selectNext { id selObj = [self selectedObject]; unsigned idx; if (selObj == nil) return NO; idx = [[self displayedObjects] indexOfObjectIdenticalTo:[self selectedObject]]; if (idx == UINT_MAX) return NO; return [self setSelectionIndexes:[NSArray arrayWithObject:[NSNumber numberWithUnsignedInt:++idx]]]; } - (BOOL)selectPrevious { id selObj = [self selectedObject]; unsigned idx; if (selObj == nil) return NO; idx = [[self displayedObjects] indexOfObjectIdenticalTo:[self selectedObject]]; if (idx == 0) return NO; return [self setSelectionIndexes:[NSArray arrayWithObject:[NSNumber numberWithUnsignedInt:--idx]]]; } - (BOOL)clearSelection { return [self setSelectionIndexes: emptyArray]; } - (NSArray *)selectedObjects { return AUTORELEASE([_selectedObjects copy]); } - (void)setSelectedObjects: (NSArray *)objects { ASSIGNCOPY(_selectedObjects, objects); } - (id)selectedObject { id object = nil; if ([_selectedObjects count]) { object = [_selectedObjects objectAtIndex: 0]; } return object; } - (void)setSelectedObject: (id)object { if (object) { [self selectObject: object]; } else { [self clearSelection]; } } - (id)insertObjectAtIndex: (unsigned)index { id object = nil; if ([self endEditing]) { object = [_dataSource createObject]; if (object == nil) { if (_delegate && [_delegate respondsToSelector: DG_CREATE_OBJECT_FAILED]) { [_delegate displayGroup: self createObjectFailedForDataSource: _dataSource]; } else { [self _presentAlertWithTitle: @"EODisplayGroup" message: @"Data source did not provide new object. "]; } } else { NSArray *defaultValueKeys = [_insertedObjectDefaultValues allKeys]; unsigned i, c = [defaultValueKeys count]; NSString *key; id value; /* We cannot use -takeValuesFromDictionary because we need to call -takeValue:forKeyPath:. */ for (i = 0; i < c; i++) { key = [defaultValueKeys objectAtIndex: i]; value = [_insertedObjectDefaultValues valueForKeyPath: key]; [object smartTakeValue: value forKeyPath: key]; } [self insertObject: object atIndex: index]; } } return object; } - (void)insertObject: (id)object atIndex: (unsigned)index { if ([self endEditing]) { unsigned c = [_displayedObjects count]; if (c < index) { [NSException raise: NSRangeException format: @"-[%@ %@]: Index %d is out of range %d", NSStringFromClass([self class]), NSStringFromSelector(_cmd), index, c]; } if (_delegate == nil || [_delegate respondsToSelector: DG_SHOULD_INSERT_OBJECT] == NO || [_delegate displayGroup: self shouldInsertObject: object atIndex: index]) { NS_DURING { [_dataSource insertObject: object]; } NS_HANDLER { [self _presentAlertWithTitle: @"EODisplayGroup insertion error" message: [localException reason]]; return; } NS_ENDHANDLER; /* It is safe to use the index for _allObjects but it seems strange. OTOH _allObjects should probably be viewed as set. */ [_allObjects insertObject: object atIndex: index]; [_displayedObjects insertObject: object atIndex: index]; if (_delegate && [_delegate respondsToSelector: DG_DID_INSERT_OBJECT]) { [_delegate displayGroup: self didInsertObject: object]; } [self selectObject: object]; [self redisplay]; } } } - (NSDictionary *)insertedObjectDefaultValues { return _insertedObjectDefaultValues; } - (void)setInsertedObjectDefaultValues: (NSDictionary *)values { (_insertedObjectDefaultValues == emptyDictionary) ? _insertedObjectDefaultValues = [values copy] : ASSIGNCOPY(_insertedObjectDefaultValues, values); } - (BOOL)deleteObjectAtIndex: (unsigned)index { id object = [_displayedObjects objectAtIndex:index]; if (!_delegate || ([_delegate respondsToSelector:DG_SHOULD_DELETE_OBJECT] && [_delegate displayGroup:self shouldDeleteObject:object])) { NS_DURING [_dataSource deleteObject:object]; if ([_delegate respondsToSelector:DG_DID_DELETE_OBJECT]) { [_delegate displayGroup:self didDeleteObject:object]; } [_displayedObjects removeObjectAtIndex:index]; [_allObjects removeObject:object]; NS_VALUERETURN(YES, BOOL); NS_HANDLER return NO; NS_ENDHANDLER } return NO; } - (BOOL)deleteSelection { BOOL flag = YES; NSArray *sel = [self selectionIndexes]; int c = [sel count]; if (c == 0) { return YES; } if ((flag = [self endEditing])) { int i; [self redisplay]; for (i = 0; i < c && flag; i++) { unsigned int index = [[sel objectAtIndex:i] unsignedIntValue]; id selection = [self selectedObjects]; flag = [self deleteObjectAtIndex:index]; [self selectObjectsIdenticalTo:selection selectFirstOnNoMatch:NO]; } } return flag; } - (NSArray *)localKeys { return _localKeys; } - (void)setLocalKeys: (NSArray *)keys { ASSIGNCOPY(_localKeys, keys); } - (id)delegate { return _delegate; } - (void)setDelegate: (id)delegate { _delegate = delegate; } - (NSArray *)observingAssociations { /* not sure if this should be using an EOQualifier somehow */ NSMutableArray *oa = [[NSMutableArray alloc] init]; NSArray *observers = [EOObserverCenter observersForObject: self]; int i, count; count = [observers count]; for (i = 0; i < count; i ++) { id currentObject = [observers objectAtIndex:i]; if ([currentObject isKindOfClass:[EOAssociation class]]) [oa addObject: currentObject]; } return AUTORELEASE(oa); } - (EOAssociation *)editingAssociation { return _editingAssociation; } - (BOOL)endEditing { return _editingAssociation ? [_editingAssociation endEditing] : YES; } @end @implementation EODisplayGroup (EODisplayGroupTargetAction) /* TODO: check for return value handling and exception handling. */ - (void)selectNext: (id)sender { [self selectNext]; } - (void)selectPrevious: (id)sender { [self selectPrevious]; } - (void)fetch: (id)sender { [self fetch]; [self redisplay]; } - (void)insert: (id)sender { unsigned idx = 0; NSArray *selections = [self selectionIndexes]; if ([selections count]) { NSNumber *index = [selections objectAtIndex: 0]; idx = [index unsignedIntValue]; } [self insertObjectAtIndex: idx]; } - (void)delete: (id)sender { [self deleteSelection]; } - (void)qualifyDataSource: (id)sender { [self qualifyDataSource]; } - (void)qualifyDisplayGroup: (id)sender { [self qualifyDisplayGroup]; } - (void)enterQueryMode: (id)sender { [self setInQueryMode: YES]; } @end @implementation EODisplayGroup (EOAssociationInteraction) - (BOOL)selectionChanged { return _flags.didChangeSelection; } - (BOOL)contentsChanged { return _flags.didChangeContents; } - (int)updatedObjectIndex { return -1; } - (id)valueForObject: (id)object key: (NSString *)key { return [object valueForKeyPath: key]; } - (id)selectedObjectValueForKey: (NSString *)key { return [self valueForObject: [self selectedObject] key: key]; } - (id)valueForObjectAtIndex: (unsigned)index key: (NSString *)key { return [self valueForObject: [_displayedObjects objectAtIndex: index] key: key]; } - (NSMutableDictionary *)_queryDictForOperator:(NSString *)op { if ([op isEqual:@"<"]) return _queryMax; if ([op isEqual:@">"]) return _queryMin; if ([op isEqual:@"="]) return _queryMatch; if ([op isEqual:@"Op"]) return _queryOperator; return nil; } - (BOOL)setValue: (id)value forObject: (id)object key: (NSString *)key { SEL didSetValue = @selector(displayGroup:didSetValue:forObject:key:); NSException *exception = nil; if ([key hasPrefix:@"@query"]) { NSString *oper = [NSString string]; NSScanner *scn = [NSScanner scannerWithString:key]; NSMutableDictionary *_queryDict = nil; [scn setScanLocation:6]; if ([scn scanUpToString:@"." intoString:&oper] && [scn scanString:@"." intoString:NULL] && [scn scanLocation] != [key length]) { NSString *realKey = [key substringFromIndex:[scn scanLocation]]; _queryDict = [self _queryDictForOperator:oper]; [_queryDict setObject:value forKey:realKey]; } if (!_queryDict) [[NSException exceptionWithName:NSInvalidArgumentException reason:@"Invalid query operator, expected '<', '>', '=',or 'Op'" userInfo:nil] raise]; return _queryDict != nil; } else { NS_DURING { [object takeValue:value forKeyPath:key]; } NS_HANDLER /* -userInfo likely contains useful information... */ NSLog(@"Exception in %@ name:%@ reason:%@ userInfo:%@", NSStringFromSelector(_cmd), [localException name], [localException reason], [localException userInfo]); return NO; NS_ENDHANDLER exception = [object validateValue: &value forKey: key]; if (exception && _flags.validateImmediately) { [self _presentAlertWithTitle:@"Validation error" message:[exception reason]]; return NO; } else if ([_delegate respondsToSelector:didSetValue]) { [_delegate displayGroup: self didSetValue: value forObject: object key: key]; } } return YES; } - (BOOL)setSelectedObjectValue: (id)value forKey: (NSString *)key { return [self setValue: value forObject: [self selectedObject] key: key]; } - (BOOL)setValue: (id)value forObjectAtIndex: (unsigned)index key: (NSString *)key { if ([_displayedObjects count] > index) return [self setValue: value forObject: [_displayedObjects objectAtIndex: index] key: key]; return NO; } - (BOOL)enabledToSetSelectedObjectValueForKey:(NSString *)key { return [self selectedObject] || [key hasPrefix: @"@query"] || _flags.queryMode; } - (BOOL)association: (EOAssociation *)association failedToValidateValue: (NSString *)value forKey: (NSString *)key object: (id)object errorDescription: (NSString *)description { [self _presentAlertWithTitle:@"Validation error" message:description]; return NO; } - (void)associationDidBeginEditing: (EOAssociation *)association { ASSIGN(_editingAssociation,association); } - (void)associationDidEndEditing: (EOAssociation *)association { ASSIGN(_editingAssociation,nil); } @end @implementation EODisplayGroup (EOEditors) /* FIXME GDL2 currently never calls this.. */ - (BOOL)editorHasChangesForEditingContext: (EOEditingContext *)editingContext { /* check */ [self endEditing]; return _flags.didChangeContents; } - (void)editingContextWillSaveChanges: (EOEditingContext *)editingContext { [self endEditing]; } @end @implementation EODisplayGroup (EOMessageHandlers) - (void)editingContext: (EOEditingContext *)editingContext presentErrorMessage: (NSString *)message { } @end @implementation EODisplayGroup (EODeprecated) - (void)setSortOrdering: (NSArray *)sortOrderings { [self setSortOrderings: sortOrderings]; } - (NSArray *)sortOrdering { return [self sortOrderings]; } @end @implementation EODisplayGroup (notifications) - (void)objectsInvalidatedInEditingContext: (NSNotification *)notif { } - (void)objectsChangedInEditingContext: (NSNotification *)notif { /* // hmmm this doesn't work because of relationships.... (WHY?) NSDictionary *userInfo = [notif userInfo]; NSArray *upd = [userInfo objectForKey:EOUpdatedKey]; NSArray *ins = [userInfo objectForKey:EOInsertedKey]; NSArray *del = [userInfo objectForKey:EODeletedKey]; _flags.didChangeContents = [_allObjects firstObjectCommonWithArray:upd] || [_allObjects firstObjectCommonWithArray:ins] || [_allObjects firstObjectCommonWithArray:del]; */ /* FIXME this doesn't seem correct. * display groups/data sources can share editing contexts. * which will lead to spurious updates */ _flags.didChangeContents = YES; [self willChange]; } @end @implementation EODisplayGroup (GDL2Private) - (void) _beginObserverNotification:(id)sender { /* FIXME what goes here?? */ } - (void) _endObserverNotification:(id)sender { _flags.didChangeContents = NO; _flags.didChangeSelection = NO; [EOObserverCenter notifyObserversObjectWillChange:nil]; } @end gnustep-dl2-0.12.0/EOInterface/EOMasterCopyAssociation.m0000664000175000017500000000401714632325605022043 0ustar yavoryavor/** EOMasterCopyAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #else #include #endif #include #include "EODisplayGroup.h" #include "EOMasterCopyAssociation.h" @implementation EOMasterCopyAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { _aspects = RETAIN ([[super aspects] arrayByAddingObject: @"parent"]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { _signatures = RETAIN ([[super aspectSignatures] arrayByAddingObject: @""]); } return _signatures; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [EODisplayGroup class]]; } + (NSString *)displayName { return @"EOMasterCopyAssoc"; } + (NSString *)primaryAspect { return @"parent"; } - (void)establishConnection { } - (void)breakConnection { } - (void)subjectChanged { } - (EOObserverPriority)priority { return EOObserverPrioritySecond; } @end gnustep-dl2-0.12.0/EOInterface/EOActionInsertionAssociation.m0000664000175000017500000000460214632325605023065 0ustar yavoryavor/** EOActionInsertionAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #else #include #include #endif #include #include "EOActionInsertionAssociation.h" @implementation EOActionInsertionAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"source", @"destination", @"enabled", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"", @"1M", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = RETAIN ([[super objectKeysTaken] arrayByAddingObject: @"target"]); } return _keys; } + (BOOL)isUsableWithObject: (id)object { return ([object respondsToSelector: @selector(setAction:) ]); } + (NSString *)primaryAspect { return @"source"; } - (void)establishConnection { } - (void)breakConnection { } - (void)subjectChanged { } - (void)action: (id)sender { } @end gnustep-dl2-0.12.0/EOInterface/EOActionAssociation.m0000664000175000017500000000722214632325605021173 0ustar yavoryavor/** EOActionAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #else #include #include #endif #include #include "EOActionAssociation.h" #include "SubclassFlags.h" #include "EODisplayGroup.h" @implementation EOActionAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"action", @"argument", @"enabled", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A1M", @"", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = RETAIN ([[super objectKeysTaken] arrayByAddingObject: @"target"]); } return _keys; } + (BOOL)isUsableWithObject: (id)object { return ([object isKindOfClass: [NSControl class]] || [object isKindOfClass: [NSActionCell class]]); } + (NSString *)primaryAspect { return @"action"; } - (void)establishConnection { [super establishConnection]; if ([self displayGroupForAspect: @"enabled"] != nil) subclassFlags |= EnabledAspectMask; if ([self displayGroupForAspect: @"argument"] != nil) subclassFlags |= ArgumentAspectMask; if ([self displayGroupForAspect: @"action"] != nil) subclassFlags |= ActionAspectMask; [_object setTarget:self]; [_object setAction: @selector(action:)]; } - (void)breakConnection { subclassFlags = 0; [super breakConnection]; } - (void)subjectChanged { if (subclassFlags & EnabledAspectMask) { EODisplayGroup *dg = [self displayGroupForAspect:@"enabled"]; if ([dg contentsChanged] || [dg selectionChanged]) { BOOL isEnabled; isEnabled = [[self valueForAspect:@"enabled"] boolValue]; [_object setEnabled: isEnabled]; } } } - (void)action: (id)sender { if (subclassFlags & ActionAspectMask) { id target = [[self displayGroupForAspect:@"action"] selectedObject]; SEL action; action = NSSelectorFromString([self displayGroupKeyForAspect:@"action"]); if (subclassFlags & ArgumentAspectMask) { id arg = [self displayGroupForAspect:@"argument"]; [target performSelector: action withObject: arg]; } else { [target performSelector:action]; } } } @end gnustep-dl2-0.12.0/EOInterface/EOControlAssociation.m0000664000175000017500000000332114632325605021372 0ustar yavoryavor/** EOControlAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #else #include #include #endif #include "EOControlAssociation.h" #include "EODisplayGroup.h" #include "SubclassFlags.h" #include @implementation EOControlAssociation : EOGenericControlAssociation + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSControl class]]; } + (NSString *)displayName { return @"EOControlAssoc"; } - (void) establishConnection { [super establishConnection]; } - (void) breakConnection { [super breakConnection]; } - (NSControl *)control { return [self object]; } - (EOGenericControlAssociation *)editingAssociation { return self; } @end gnustep-dl2-0.12.0/EOInterface/EOPickTextAssociation.m0000664000175000017500000000477314632325605021521 0ustar yavoryavor/** EOPickTextAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #else #include #include #endif #include #include "EOPickTextAssociation.h" @implementation EOPickTextAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"matchKey1", @"matchKey2", @"matchKey3", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A", @"A", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { NSArray *arr = [NSArray arrayWithObjects: @"target", @"delegate", nil]; arr = [[super objectKeysTaken] arrayByAddingObjectsFromArray: arr]; _keys = RETAIN (arr); } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSControl class]]; } + (NSString *)primaryAspect { return @"matchKey1"; } - (void)establishConnection { } - (void)breakConnection { } - (void)subjectChanged { } - (void)action: (id)sender { } @end gnustep-dl2-0.12.0/EOInterface/EODetailSelectionAssociation.m0000664000175000017500000000427714632325605023035 0ustar yavoryavor/** EODetailSelectionAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #else #include #endif #include #include "EODisplayGroup.h" #include "EODetailSelectionAssociation.h" @implementation EODetailSelectionAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { _aspects = RETAIN ([[super aspects] arrayByAddingObject: @"selectedObjects"]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"1M", @"A", nil]; /* TODO: Check if there is any good reason why we only have one aspect but two signatures. */ arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [EODisplayGroup class]]; } + (NSString *)displayName { return @"EODetailSelection"; } + (NSString *)primaryAspect { return @"selectedObjects"; } - (void)establishConnection { } - (void)breakConnection { } - (void)subjectChanged { } @end gnustep-dl2-0.12.0/EOInterface/EOMasterDetailAssociation.h0000664000175000017500000000376014632325605022332 0ustar yavoryavor/** -*-ObjC-*- EOMasterDetailAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOMasterDetailAssociation_h__ #define __EOInterface_EOMasterDetailAssociation_h__ #ifdef GNUSTEP #include #else #include #endif #include @class NSString; @class NSArray; @interface EOMasterDetailAssociation : EOAssociation { id _currentMasterValue; id _currentMasterEO; unsigned _lastCount; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (BOOL)isUsableWithObject: (id)object; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; /* Overwritten EODelayedObserver to return EOObserverPrioritySecond. */ - (EOObserverPriority)priority; @end @interface EOMasterPeerAssociation : EOMasterDetailAssociation { } + (BOOL)isUsableWithObject: (id)object; + (NSString *)displayName; @end #endif gnustep-dl2-0.12.0/EOInterface/EOPopUpAssociation.m0000664000175000017500000001616214636003765021030 0ustar yavoryavor/** EOPopUpAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #include #else #include #include #endif #include #include "EOControlAssociation.h" #include "EODisplayGroup.h" #include "EOPopUpAssociation.h" #include "SubclassFlags.h" @implementation EOPopUpAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"titles", @"selectedTitle", @"selectedTag", @"selectedObject", @"enabled", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A", @"A", @"A", @"1", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = [[NSArray alloc] initWithObjects: @"target", nil]; } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSPopUpButton class]]; } + (NSArray *)associationClassesSuperseded { static NSArray *_classes = nil; if (_classes == nil) { _classes = RETAIN ([[super associationClassesSuperseded] arrayByAddingObject: [EOControlAssociation class]]); } return _classes; } - (id) initWithObject:(id)obj { self = [super initWithObject:obj]; _tagValueForOther = -1; return self; } + (NSString *)displayName { return @"EOPopupAssoc"; } + (NSString *)primaryAspect { return @"selectedTitle"; } - (void)establishConnection { EODisplayGroup *dg; [super establishConnection]; if ((dg = [self displayGroupForAspect:@"titles"])) { int i,c; NSArray *dispObj; subclassFlags |= TitlesAspectMask; dispObj = [dg displayedObjects]; c = [dispObj count]; [_object removeAllItems]; for (i = 0; i < c; i++) { [_object addItemWithTitle: [self valueForAspect:@"titles" atIndex:i]]; /* hmm used in _action.... :*/ [[_object lastItem] setRepresentedObject:[dg valueForObjectAtIndex:i key:@"self"]]; } } if ([self displayGroupForAspect:@"selectedTitle"]) { subclassFlags |= SelectedTitleAspectMask; } if ([self displayGroupForAspect:@"selectedTag"]) { subclassFlags |= SelectedTagAspectMask; } if ([self displayGroupForAspect:@"selectedObject"]) { subclassFlags |= SelectedObjectAspectMask; } if ([self displayGroupForAspect:@"enabled"]) { subclassFlags |= EnabledAspectMask; } if (((subclassFlags & SelectedTitleAspectMask) && (subclassFlags & (SelectedTagAspectMask | SelectedObjectAspectMask))) || ((subclassFlags & SelectedTagAspectMask) && (subclassFlags & (SelectedObjectAspectMask | SelectedTitleAspectMask)))) { [[NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"more than one selectedTag, %@ %@", @"selectedTitle, or selectedObject aspect bound to %@", self] userInfo:nil] raise]; } [_object setTarget:self]; [_object setAction:@selector(_action:)]; } - (void)breakConnection { subclassFlags = 0; [super breakConnection]; } - (void)subjectChanged { EODisplayGroup *dg; if (subclassFlags & TitlesAspectMask) { dg = [self displayGroupForAspect:@"titles"]; if ([dg contentsChanged]) { int i,c; NSArray *dispObj; dispObj = [dg displayedObjects]; c = [dispObj count]; [_object removeAllItems]; for (i = 0; i < c; i++) { [_object addItemWithTitle: [self valueForAspect:@"titles" atIndex:i]]; /* hmm */ [[_object lastItem] setRepresentedObject:[dg valueForObjectAtIndex:i key:@"self"]]; } } } if (subclassFlags & SelectedTagAspectMask) { dg = [self displayGroupForAspect:@"selectedTag"]; if ([dg selectionChanged] || [dg contentsChanged]) { int tag = [[self valueForAspect:@"selectedTag"] intValue]; [_object selectItemAtIndex:[_object indexOfItemWithTag:tag]]; } } else if (subclassFlags & SelectedTitleAspectMask) { dg = [self displayGroupForAspect:@"selectedTitle"]; if ([dg selectionChanged] || [dg contentsChanged]) { [_object selectItemWithTitle:[self valueForAspect:@"selectedTitle"]]; } } else if (subclassFlags & SelectedObjectAspectMask) { dg = [self displayGroupForAspect:@"selectedObject"]; if ([dg selectionChanged] || [dg contentsChanged]) { NSString *titlesKey; NSString *newTitle; titlesKey = [self displayGroupKeyForAspect:@"titles"]; newTitle = [[self valueForAspect:@"selectedObject"] valueForKey:titlesKey]; [_object selectItemWithTitle:newTitle]; } } if (subclassFlags & EnabledAspectMask) { dg = [self displayGroupForAspect:@"enabled"]; if ([dg selectionChanged] || [dg contentsChanged]) [_object setEnabled: [[self valueForAspect:@"enabled"] boolValue]]; } } - (void)setTagValueForOther: (int)value { _tagValueForOther = value; } - (int)tagValueForOther { return _tagValueForOther; } - (void) _action:(id)sender { if (subclassFlags & SelectedTagAspectMask) { [self setValue: [NSNumber numberWithInt: [[_object itemAtIndex: [_object indexOfSelectedItem]] tag]] forAspect:@"selectedTag"]; } else if (subclassFlags & SelectedTitleAspectMask) { [self setValue: [_object titleOfSelectedItem] forAspect:@"selectedTitle"]; } else if (subclassFlags & SelectedObjectAspectMask) { id obj = [[_object itemAtIndex:[_object indexOfSelectedItem]] representedObject]; [self setValue: obj forAspect:@"selectedObject"]; } } @end gnustep-dl2-0.12.0/EOInterface/EORecursiveBrowserAssociation.h0000664000175000017500000000401514632325605023261 0ustar yavoryavor/** -*-ObjC-*- EORecursiveBrowserAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EORecursiveBrowserAssociation_h__ #define __EOInterface_EORecursiveBrowserAssociation_h__ #include @class NSString; @class NSArray; @class NSMutableArray; @class NSMatrix; @class NSBrowser; @class EODataSource; @class EODisplayGroup; @interface EORecursiveBrowserAssociation : EOAssociation { NSMutableArray *_eoPath; EODataSource *_orgChildDS; EODisplayGroup *_rootDG; EODisplayGroup *_currDG; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSArray *)associationClassesSuperseded; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (id)initWithObject: (id)object; - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (void)browser: (NSBrowser *)sender createRowsForColumn: (int)column inMatrix: (NSMatrix *)matrix; @end #endif gnustep-dl2-0.12.0/EOInterface/EORadioMatrixAssociation.m0000664000175000017500000001211614636003765022203 0ustar yavoryavor/** EORadioMatrixAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #include #else #include #include #endif #include #include "EOControlAssociation.h" #include "EORadioMatrixAssociation.h" #include "SubclassFlags.h" /* GNUstep specific */ @interface NSMatrix (RadioMatrixTitle) -(BOOL) _selectCellWithTitle:(NSString *)title; @end @implementation NSMatrix (RadioMatrixTitle) -(BOOL) _selectCellWithTitle:(NSString *)title { int i = _numRows; while (i-- > 0) { int j = _numCols; while (j-- > 0) { if ([[[self cellAtRow: i column: j] title] isEqual: title]) { [self selectCellAtRow:i column:j]; return YES; } } } return NO; } @end @implementation EORadioMatrixAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"selectedTitle", @"selectedTag", @"enabled", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A", @"A", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = [[NSArray alloc] initWithObjects: @"target", nil]; } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSMatrix class]]; } + (NSArray *)associationClassesSuperseded { static NSArray *_classes = nil; if (_classes == nil) { _classes = RETAIN ([[super associationClassesSuperseded] arrayByAddingObject: [EOControlAssociation class]]); } return _classes; } + (NSString *)displayName { return @"EORadioAssoc"; } + (NSString *)primaryAspect { return @"selectedTitle"; } - (id) initWithObject:(id)anObject { self = [super initWithObject:anObject]; _tagValueForOther = -1; return self; } - (void)establishConnection { if ([self displayGroupForAspect: @"enabled"]) subclassFlags |= EnabledAspectMask; if ([self displayGroupForAspect: @"selectedTag"]) subclassFlags |= SelectedTagAspectMask; if ([self displayGroupForAspect: @"selectedTitle"]) subclassFlags |= SelectedTitleAspectMask; [super establishConnection]; [_object setTarget: self]; [_object setAction: @selector(_action:)]; [_object setAllowsEmptySelection:YES]; } - (void)breakConnection { [_object setTarget: nil]; [super breakConnection]; subclassFlags = 0; } - (void)subjectChanged { if (subclassFlags & EnabledAspectMask) [[self object] setEnabled: [[self valueForAspect:@"enabled"] boolValue]]; if (subclassFlags & SelectedTagAspectMask) { NSCell *cell; cell = [_object cellWithTag:[[self valueForAspect:@"selectedTag"] intValue]]; if (cell) { [_object selectCell:cell]; } else { [_object selectCellWithTag:_tagValueForOther]; } } /* not sure if this is even supported in the original i suspect not */ if (subclassFlags & SelectedTitleAspectMask) { if (![_object _selectCellWithTitle:[self valueForAspect:@"selectedTitle"]]) [_object selectCellWithTag:_tagValueForOther]; } } - (void)setTagValueForOther: (int)value { _tagValueForOther = value; } - (int)tagValueForOther { return _tagValueForOther; } - (void) _action:(id)sender { if (subclassFlags & SelectedTagAspectMask) [self setValue: [NSNumber numberWithInt: [[_object selectedCell] tag]] forAspect: @"selectedTag"]; if (subclassFlags & SelectedTitleAspectMask) { [self setValue: [[_object selectedCell] title] forAspect: @"selectedTitle"]; } } @end gnustep-dl2-0.12.0/EOInterface/EOGenericControlAssociation.m0000664000175000017500000001163114632325605022672 0ustar yavoryavor/** EOGenericControlAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #include #else #include #include #endif #include #include "EOControlAssociation.h" #include "EODisplayGroup.h" #include "SubclassFlags.h" @implementation EOGenericControlAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"value", @"enabled", @"URL", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A", @"A", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = [[NSArray alloc] initWithObjects: @"delegate", @"target", nil]; } return _keys; } + (BOOL)isUsableWithObject: (id)object { return NO; } - (void)establishConnection { [super establishConnection]; if ([self displayGroupForAspect:@"value"] != nil) subclassFlags |= ValueAspectMask; if ([self displayGroupForAspect:@"enabled"] != nil) subclassFlags |= EnabledAspectMask; /* where does URL come from, accident or is it undocumented?? */ if ([self displayGroupForAspect:@"URL"] != nil) subclassFlags |= URLAspectMask; [[self control] setAction:@selector(_action:)]; [[self control] setTarget:self]; if ([[self object] respondsToSelector: @selector(setDelegate:)]) [[self object] setDelegate:self]; } - (void)breakConnection { subclassFlags = 0; [super breakConnection]; } - (void)subjectChanged { if (subclassFlags & ValueAspectMask) { [[self control] setObjectValue: [self valueForAspect:@"value"]]; } if (subclassFlags & EnabledAspectMask) [[self control] setEnabled: [[self valueForAspect: @"enabled"] boolValue]]; [super subjectChanged]; } - (void) _action: (id)sender { [self endEditing]; } - (BOOL)endEditing { BOOL flag = NO; if (subclassFlags & ValueAspectMask) { flag = [self setValue: [[self control] objectValue] forAspect: @"value"]; [[self displayGroupForAspect:@"value"] associationDidEndEditing: self]; } /* not sure if this is neccessary */ if (subclassFlags & EnabledAspectMask) { [[self displayGroupForAspect:@"enabled"] associationDidEndEditing: self]; } return flag; } - (NSControl *)control { return nil; } - (EOGenericControlAssociation *)editingAssociation { return nil; } - (BOOL)control: (NSControl *)control didFailToFormatString: (NSString *)string errorDescription: (NSString *)description { return NO; } - (BOOL)control: (NSControl *)control isValidObject: (id)object { return NO; } - (BOOL)control: (NSControl *)control textShouldBeginEditing: (NSText *)fieldEditor { EODisplayGroup *dg = nil; BOOL flag = NO; /* inform display groups for all aspects that the editing association should change if multiple aspects are bound to the same display group only do so one time */ if (subclassFlags & ValueAspectMask) { dg = [self displayGroupForAspect:@"value"]; flag = [dg endEditing]; if (flag == YES) { [dg associationDidBeginEditing:self]; } } /* not sure if this is really neccessary */ if (subclassFlags & EnabledAspectMask) { EODisplayGroup *dg2 = [self displayGroupForAspect:@"enabled"]; if (dg2 != dg || flag == NO) { flag = [dg2 endEditing]; if (flag == YES) { [dg2 associationDidBeginEditing:self]; } } } return flag; } @end gnustep-dl2-0.12.0/EOInterface/EOInterface.h0000664000175000017500000000341414632325605017453 0ustar yavoryavor/* EOInterface.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers Date: October 2004 This file is part of the GNUstep Database Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_h__ #define __EOInterface_h__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __EOInterface_h__ */ gnustep-dl2-0.12.0/EOInterface/EOAssociation.m0000664000175000017500000002364614636001533020040 0ustar yavoryavor/** EOAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #include #include #include #else #include #endif #include #include #include "EODisplayGroup.h" #include "EOAssociation.h" /* For GDL2NonRetainingArray */ #include "../EOControl/EOPrivate.h" @implementation EOAssociation static NSArray *_emptyArray = nil; static NSMutableArray *_associationClasses = nil; static NSMapTable *_objectToAssociations; + (void) objectDeallocated:(id)object { GDL2NonRetainingMutableArray *associations; associations = NSMapGet(_objectToAssociations, object); if (associations) { [associations makeObjectsPerformSelector: @selector(breakConnection)]; NSMapRemove(_objectToAssociations, object); } } + (void)bundleLoaded: (NSNotification *)notification { DESTROY(_associationClasses); } + (void)initialize { if (_emptyArray == nil) { NSNotificationCenter *nc; _emptyArray = [NSArray new]; nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(bundleLoaded:) name: NSBundleDidLoadNotification object: nil]; _objectToAssociations = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSObjectMapValueCallBacks, 32); } } + (NSArray *)aspects { return _emptyArray; } + (NSArray *)aspectSignatures { unsigned int count = [[self aspects] count]; unsigned int i; NSMutableArray *sigs = [NSMutableArray arrayWithCapacity: count]; for (i = count; i < count; i++) { [sigs addObject: @"A1M"]; } return AUTORELEASE([sigs copy]); } + (NSArray *)objectKeysTaken { return _emptyArray; } + (BOOL)isUsableWithObject: (id)object { return NO; } + (NSArray *)associationClassesSuperseded { return _emptyArray; } + (NSString *)displayName { return NSStringFromClass(self); } + (NSString *)primaryAspect { return nil; } + (NSArray *)associationClassesForObject: (id)object { unsigned int i, count; NSMutableArray *arr; Class cls; if (_associationClasses == nil) { _associationClasses = RETAIN(GSObjCAllSubclassesOfClass([EOAssociation class])); } count = [_associationClasses count]; arr = [NSMutableArray arrayWithCapacity: count]; for (i = 0; i < count; i++) { cls = [_associationClasses objectAtIndex: i]; if ([cls isUsableWithObject: object]) { [arr addObject: cls]; } } return AUTORELEASE([arr copy]); } - (id)initWithObject: (id)object { if ((self = [super init])) { unsigned int count = [[[self class] aspects] count]; NSZone *zone = [self zone]; _object = object; _displayGroupMap = NSCreateMapTableWithZone(NSObjectMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, count, zone); _displayGroupKeyMap = NSCreateMapTableWithZone(NSObjectMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, count, zone); } return self; } - (id)init { self = [self initWithObject: nil]; return self; } - (id)initWithCoder: (NSCoder *)coder { _object = [coder decodeObject]; self = [self initWithObject:_object]; return self; } - (void) encodeWithCoder: (NSCoder*)coder { [coder encodeObject:_object]; } - (void)dealloc { [self discardPendingNotification]; NSFreeMapTable (_displayGroupMap); NSFreeMapTable (_displayGroupKeyMap); [super dealloc]; } - (void)bindAspect: (NSString *)aspectName displayGroup: (EODisplayGroup *)displayGroup key: (NSString *)key { NSMapInsert(_displayGroupMap, aspectName, displayGroup); NSMapInsert(_displayGroupKeyMap, aspectName, key); } - (void)establishConnection { if (_isConnected == NO) { NSMapEnumerator displayGroupEnum; EODisplayGroup *displayGroup; void *unusedKey; GDL2NonRetainingMutableArray *associations; displayGroupEnum = NSEnumerateMapTable(_displayGroupMap); while (NSNextMapEnumeratorPair(&displayGroupEnum, &unusedKey, (void*)&displayGroup)) { [displayGroup retain]; [EOObserverCenter addObserver:self forObject:displayGroup]; } NSEndMapTableEnumeration (&displayGroupEnum); /* registerAssociationForDeallocHack is implemented in EOControl/EOCustomObject.m this causes +objectDeallocated: to be called when '_object' is deallocated, which will break the connection which releases the association instance. */ [self retain]; [self registerAssociationForDeallocHack:_object]; associations = (id)NSMapGet(_objectToAssociations, _object); if (!associations) { associations = [[GDL2NonRetainingMutableArray alloc] initWithCapacity:32]; [associations addObject:self]; NSMapInsert(_objectToAssociations, _object, associations); } else { [associations addObject:self]; } _isConnected = YES; } } - (void)breakConnection { if (_isConnected) { NSMapEnumerator displayGroupEnum; EODisplayGroup *displayGroup; void *unusedKey; Class EOObserverCenterClass = [EOObserverCenter class]; displayGroupEnum = NSEnumerateMapTable(_displayGroupMap); while (NSNextMapEnumeratorPair(&displayGroupEnum, &unusedKey, (void *)&displayGroup)) { [displayGroup release]; [EOObserverCenterClass removeObserver: self forObject: displayGroup]; } NSEndMapTableEnumeration (&displayGroupEnum); [self discardPendingNotification]; _isConnected = NO; [self release]; } } - (void)copyMatchingBindingsFromAssociation: (EOAssociation *)association { } - (BOOL)canBindAspect: (NSString *)aspectName displayGroup: (EODisplayGroup *)displayGroup key: (NSString *)key { return YES; } - (id)object { return _object; } - (EODisplayGroup *)displayGroupForAspect: (NSString *)aspectName { return NSMapGet(_displayGroupMap, aspectName); } - (NSString *)displayGroupKeyForAspect: (NSString *)aspectName; { return NSMapGet(_displayGroupKeyMap, aspectName); } /** Implemented by subclasses. */ - (void)subjectChanged { } - (BOOL)endEditing { return NO; } - (id)valueForAspect: (NSString *)aspectName { EODisplayGroup *dg = [self displayGroupForAspect: aspectName]; NSString *key; if (dg == nil) return nil; key = [self displayGroupKeyForAspect: aspectName]; if (key == nil) return nil; return [dg selectedObjectValueForKey: key]; } - (BOOL)setValue: (id)value forAspect: (NSString *)aspectName { EODisplayGroup *dg = [self displayGroupForAspect: aspectName]; NSString *key; if (dg == nil) return NO; key = [self displayGroupKeyForAspect: aspectName]; if (key == nil) return NO; return [dg setSelectedObjectValue: value forKey: key]; } - (id)valueForAspect: (NSString *)aspectName atIndex: (unsigned int)index { EODisplayGroup *dg = [self displayGroupForAspect: aspectName]; NSString *key; if (dg == nil) return nil; key = [self displayGroupKeyForAspect: aspectName]; if (key == nil) return NO; return [dg valueForObjectAtIndex:index key: key]; } - (BOOL)setValue: (id)value forAspect: (NSString *)aspectName atIndex: (unsigned int)index { EODisplayGroup *dg = [self displayGroupForAspect: aspectName]; NSString *key; BOOL flag; if (dg == nil) { return NO; } key = [self displayGroupKeyForAspect: aspectName]; if (key == nil) { return NO; } flag = [dg setValue: value forObjectAtIndex: index key: key]; return flag; } - (BOOL)shouldEndEditingForAspect: (NSString *)aspectName invalidInput: (NSString *)input errorDescription: (NSString *)description { EODisplayGroup *displayGroup; BOOL reply = YES; displayGroup = [self displayGroupForAspect: aspectName]; if (displayGroup) { NSString *displayGroupString = [self displayGroupKeyForAspect: aspectName]; id selectedObject = [displayGroup selectedObject]; reply = [displayGroup association: self failedToValidateValue: input forKey: displayGroupString object: selectedObject errorDescription: description]; } return reply; } - (BOOL)shouldEndEditingForAspect: (NSString *)aspectName invalidInput: (NSString *)input errorDescription: (NSString *)description index: (unsigned int)index { EODisplayGroup *displayGroup; BOOL reply = YES; displayGroup = [self displayGroupForAspect: aspectName]; if (displayGroup) { NSString *displayGroupString = [self displayGroupKeyForAspect: aspectName]; NSArray *displayedObjects = [displayGroup displayedObjects]; id object = [displayedObjects objectAtIndex: index]; reply = [displayGroup association: self failedToValidateValue: input forKey: displayGroupString object: object errorDescription: description]; } return reply; } @end gnustep-dl2-0.12.0/EOInterface/EOPopUpAssociation.h0000664000175000017500000000336014632325605021013 0ustar yavoryavor/** -*-ObjC-*- EOPopUpAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOPopUpAssociation_h__ #define __EOInterface_EOPopUpAssociation_h__ #include @class NSString; @class NSArray; @interface EOPopUpAssociation : EOAssociation { BOOL _addedTempItem; int _tagValueForOther; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSArray *)associationClassesSuperseded; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (void)setTagValueForOther: (int)value; - (int)tagValueForOther; @end #endif gnustep-dl2-0.12.0/EOInterface/Makefile.postamble0000664000175000017500000000347614632325605020613 0ustar yavoryavor# -*-makefile-*- # Makefile.postamble # # Copyright (C) 1997,2002,2004,2005 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Database Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # # Makefile.postamble # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing # before-install:: # Things to do after installing # after-install:: # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check: gnustep-dl2-0.12.0/EOInterface/EOActionInsertionAssociation.h0000664000175000017500000000333314632325605023060 0ustar yavoryavor/** -*-ObjC-*- EOActionInsertionAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOActionInsertionAssociation_h__ #define __EOInterface_EOActionInsertionAssociation_h__ #ifdef GNUSTEP #include #else #include #endif #include @class NSString; @class NSArray; @interface EOActionInsertionAssociation : EOAssociation { } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (void)action: (id)sender; @end #endif gnustep-dl2-0.12.0/EOInterface/EOAspectConnector.h0000664000175000017500000000262114632325605020644 0ustar yavoryavor/** -*-ObjC-*- EOAspectConnector.h Copyright (C) 2005 Free Software Foundation, Inc. Author: Matt Rice This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include @class NSString; @class EOAssociation; @class EODisplayGroup; @interface EOAspectConnector : NSNibConnector { NSString *_aspectName; NSString *_destinationKey; EOAssociation *_association; EODisplayGroup *_dg; } - (id) initWithAssociation:(EOAssociation *)association aspectName:(NSString *)name; - (NSString *)aspectName; - (NSString *)destinationKey; - (EOAssociation *)association; @end gnustep-dl2-0.12.0/EOInterface/EOMasterDetailAssociation.m0000664000175000017500000000570014632325605022333 0ustar yavoryavor/** EOMasterDetailAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #else #include #endif #include #include #include "EODisplayGroup.h" #include "EOMasterDetailAssociation.h" #include "SubclassFlags.h" @implementation EOMasterDetailAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { _aspects = RETAIN ([[super aspects] arrayByAddingObject: @"parent"]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { _signatures = RETAIN ([[super aspectSignatures] arrayByAddingObject: @"1M"]); } return _signatures; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [EODisplayGroup class]] && [[object dataSource] isKindOfClass: [EODetailDataSource class]]; } + (NSString *)displayName { return @"EOMasterDetailAssoc"; } + (NSString *)primaryAspect { return @"parent"; } - (void)establishConnection { EODisplayGroup *parent = [self displayGroupForAspect:@"parent"]; [super establishConnection]; if (parent) { EODetailDataSource *ds = (id)[_object dataSource]; subclassFlags |= ParentAspectMask; [ds setMasterClassDescription:[[parent dataSource] classDescriptionForObjects]]; [ds setDetailKey:[self displayGroupKeyForAspect:@"parent"]]; } } - (void)breakConnection { [super breakConnection]; subclassFlags = 0; } - (void)subjectChanged { if (subclassFlags & ParentAspectMask) { id selectedObject = [[self displayGroupForAspect:@"parent"] selectedObject]; id key = [self displayGroupKeyForAspect:@"parent"]; [[_object dataSource] qualifyWithRelationshipKey:key ofObject:selectedObject]; if ([_object fetch]) [_object redisplay]; } } - (EOObserverPriority)priority { return EOObserverPrioritySecond; } @end gnustep-dl2-0.12.0/EOInterface/EOPickTextAssociation.h0000664000175000017500000000321714632325605021504 0ustar yavoryavor/** -*-ObjC-*- EOPickTextAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOPickTextAssociation_h__ #define __EOInterface_EOPickTextAssociation_h__ #include @class NSString; @class NSArray; @class EODisplayGroup; @interface EOPickTextAssociation : EOAssociation { BOOL _applyImmediately; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (void)action: (id)sender; @end #endif gnustep-dl2-0.12.0/EOInterface/EOMatrixAssociation.m0000664000175000017500000001464314632325605021227 0ustar yavoryavor/** -*-ObjC-*- EOMatrixAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #else #include #include #endif #include #include "EOControlAssociation.h" #include "EOMatrixAssociation.h" #include "EODisplayGroup.h" #include "SubclassFlags.h" @implementation EOMatrixAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"enabled", @"image", @"title", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A", @"A", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = RETAIN ([[super objectKeysTaken] arrayByAddingObject: @"target"]); } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSMatrix class]]; } + (NSArray *)associationClassesSuperseded { static NSArray *_classes = nil; if (_classes == nil) { _classes = RETAIN ([[super associationClassesSuperseded] arrayByAddingObject: [EOControlAssociation class]]); } return _classes; } + (NSString *)displayName { return @"EOMatrixAssoc"; } + (NSString *)primaryAspect { return @"title"; } - (void)establishConnection { EODisplayGroup *dg; if ((dg = [self displayGroupForAspect:@"image"])) { subclassFlags |= ImageAspectMask; NSArray *dispObj = [dg displayedObjects]; int c = [dispObj count]; int rows = [_object numberOfRows]; int i; if (rows < c) { [_object renewRows:[[dg displayedObjects] count] columns:1]; } else if (rows > c) { while (rows != c) { [_object removeRow:0]; rows--; } } [_object sizeToFit]; for (i = 0; i < c; i++) { NSCell *cell = [_object cellAtRow:i column:0]; // column 0??? [cell setImage: [self valueForAspect:@"image" atIndex:i]]; } } if ((dg = [self displayGroupForAspect:@"title"])) { subclassFlags |= TitleAspectMask; NSArray *dispObj = [dg displayedObjects]; int c = [dispObj count]; int rows = [_object numberOfRows]; int i; if (rows < c) { [_object renewRows:[[dg displayedObjects] count] columns:1]; } else if (rows > c) { while (rows != c) { [_object removeRow:0]; rows--; } } for (i = 0; i < c; i++) { NSCell *cell = [_object cellAtRow:i column:0]; // column 0??? [cell setTitle: [self valueForAspect:@"title" atIndex:i]]; } } [_object sizeToFit]; [_object sizeToCells]; [_object setNeedsDisplay:YES]; if ([self displayGroupForAspect:@"enabled"]) { subclassFlags |= EnabledAspectMask; } [super establishConnection]; [self subjectChanged]; } - (void)breakConnection { subclassFlags = 0; [super breakConnection]; } - (void)subjectChanged { EODisplayGroup *dg; if (subclassFlags & EnabledAspectMask) { dg = [self displayGroupForAspect:@"enabled"]; if ([dg selectionChanged] || [dg contentsChanged]) [_object setEnabled: [[self valueForAspect:@"enabled"] boolValue]]; } if (subclassFlags & TitleAspectMask) { dg = [self displayGroupForAspect:@"title"]; if ([dg selectionChanged] || [dg contentsChanged]) { NSArray *dispObj = [dg displayedObjects]; int c = [dispObj count]; int rows = [_object numberOfRows]; int i; if (rows < c) { [_object renewRows:[[dg displayedObjects] count] columns:1]; } else if (rows > c) { while (rows != c) { [_object removeRow:0]; rows--; } } for (i = 0; i < c; i++) { NSCell *cell = [_object cellAtRow:i column:0]; // column 0??? [cell setTitle: [self valueForAspect:@"title" atIndex:i]]; } [_object sizeToFit]; [_object sizeToCells]; [_object setNeedsDisplay:YES]; } } if (subclassFlags & ImageAspectMask) { dg = [self displayGroupForAspect:@"image"]; if ([dg selectionChanged] || [dg contentsChanged]) { NSArray *dispObj = [dg displayedObjects]; int c = [dispObj count]; int rows = [_object numberOfRows]; int i; if (rows < c) { [_object renewRows:[[dg displayedObjects] count] columns:1]; } else if (rows > c) { while (rows != c) { [_object removeRow:0]; rows--; } } for (i = 0; i < c; i++) { NSCell *cell = [_object cellAtRow:i column:0]; // column 0??? [cell setImage: [self valueForAspect:@"image" atIndex:i]]; } [_object sizeToFit]; [_object sizeToCells]; [_object setNeedsDisplay:YES]; } } } @end gnustep-dl2-0.12.0/EOInterface/SubclassFlags.h0000664000175000017500000001055414632325605020066 0ustar yavoryavor/** -*-ObjC-*- SubclassFlags.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: Matt Rice This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* please be careful when adding stuff; as this is hideous. there is one section for every class directly desending from EOAssociation which includes flags from its subclasses. */ #define EnabledAspectMask 0x1 /* EOTableViewAssociation:5 (enabled, italic, source, textColor, bold) */ // EnabledAspectMask 0x1 #define SourceAspectMask 0x2 #define ItalicAspectMask 0x4 #define TextColorAspectMask 0x8 #define BoldAspectMask 0x10 /* EOActionInsertionAssociation:3 (source, enabled, destination) */ // EnabledAspectMask 0x1 // SourceAspectMask 0x2 #define DestinationAspectMask 0x4 /* EOActionAssociation:3 (action, enabled, argument) */ // EnabledAspectMask 0x1 #define ActionAspectMask 0x2 #define ArgumentAspectMask 0x4 /* EOColumnAssociation:2 (value, enabled) */ // EnabledAspectMask 0x1 #define ValueAspectMask 0x2 /* EOGenericControlAssociation:3 (enabled, URL, value) */ // EnabledAspectMask 0x1 // ValueAspectMask 0x2 #define URLAspectMask 0x4 /* EOTextAssociation:3 (editable, URL, value) */ // EnabledAspectMask 0x1 // ValueAspectMask 0x2 #define EditableAspectMask 0x4 /* EORecursiveBrowserAssociation:4 (isLeaf, rootChildren, children, title) */ #define IsLeafAspectMask 0x1 #define RootChildrenAspectMask 0x2 #define TitleAspectMask 0x4 #define ChildrenAspectMask 0x8 /* EODetailSelectionAssociation:1 (selectedObjects) */ #define SelectedObjectsAspectMask 0x1 /* EOMatrixAssociation:3 (enabled, title, image) */ // EnabledAspectMask 0x1 #define ImageAspectMask 0x2 // TitleAspectMask 0x4 /* EOMasterCopyAssociation:1 (parent) */ /* EOMasterDetailAssociation:1 (parent) */ #define ParentAspectMask 0x1 /* EOPickTextAssociation:3 (matchKey2, matchKey3, matchKey1) */ #define MatchKey2AspectMask 0x1 #define MatchKey3AspectMask 0x2 #define MatchKey1AspectMask 0x4 /* EORadioMatrixAssociation:3 (enabled, selectedTitle, selectedTag) */ // EnabledAspectMask 0x1 #define SelectedTitleAspectMask 0x2 #define SelectedTagAspectMask 0x4 /* EOComboBoxAssociation:4 (enabled, selectedObject, titles, selectedTitle) */ // EnabledAspectMask 0x1 // SelectedTitleAspectMask 0x2 #define SelectedObjectAspectMask 0x8 #define TitlesAspectMask 0x10 /* EOPopUpAssociation:5 (enabled, selectedTag, selectedObject, titles, selectedTitle) */ // EnabledAspectMask 0x1 // SelectedTitleAspectMask 0x2 // SelectedTagAspectMask 0x4 // SelectedObjectAspectMask 0x8 // TitlesAspectMask 0x10 #ifdef HELPFUL_COMMENT_MAKER #include #include #include int main() { CREATE_AUTORELEASE_POOL(arp); NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; NSArray *a1; int i; a1 = GSObjCDirectSubclassesOfClass([EOAssociation class]); for (i = 0; i < [a1 count]; i++) { int n; NSArray *a2; NSMutableSet *aSet = [[NSMutableSet alloc] init]; a2 = GSObjCAllSubclassesOfClass([a1 objectAtIndex:i]); [aSet addObjectsFromArray:[[a1 objectAtIndex:i] aspects]]; for (n = 0; n < [a2 count]; n++) { [aSet addObjectsFromArray:[[a2 objectAtIndex:n] aspects]]; } [dict setObject:aSet forKey:[a1 objectAtIndex:i]]; } for (i = 0; i < [dict count]; i++) { id key = [[dict allKeys] objectAtIndex:i]; NSArray *arr; int n; arr = [[dict objectForKey:key] allObjects]; GSPrintf(stdout, @"/* %@:%i %@ */\n", key, [arr count], arr); } } #endif gnustep-dl2-0.12.0/EOInterface/EOComboBoxAssociation.m0000664000175000017500000000710114632325605021462 0ustar yavoryavor/** EOComboBoxAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #include #else #include #endif #include #include "EOControlAssociation.h" #include "EOComboBoxAssociation.h" @implementation EOComboBoxAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"titles", @"selectedTitle", @"selectedObject", @"enabled", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"A", @"A", @"1", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { NSArray *arr = [NSArray arrayWithObjects: @"target", @"dataSource", @"delegate", nil]; arr = [[super objectKeysTaken] arrayByAddingObjectsFromArray: arr]; _keys = RETAIN (arr); } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSComboBox class]]; } + (NSArray *)associationClassesSuperseded { static NSArray *_classes = nil; if (_classes == nil) { _classes = RETAIN ([[super associationClassesSuperseded] arrayByAddingObject: [EOControlAssociation class]]); } return _classes; } + (NSString *)displayName { return @"EOComboAssoc"; } + (NSString *)primaryAspect { return @"selectedTitle"; } - (void)establishConnection { } - (void)breakConnection { } - (void)subjectChanged { } - (BOOL)endEditing { return NO; } - (int)numberOfItemsInComboBox: (NSComboBox *)comboBox { return 0; } - (id)comboBox: (NSComboBox *)comboBox objectValueForItemAtIndex: (int)index { return nil; } - (unsigned int)comboBox: (NSComboBox *)comboBox indexOfItemWithStringValue: (NSString *)stringValue { return 0; } - (NSString *)comboBox: (NSComboBox *)comboBox completedString: (NSString *)string { return nil; } - (void)comboBoxWillPopUp: (NSNotification *)notification { } - (void)comboBoxWillDismiss: (NSNotification *)notification { } - (void)comboBoxSelectionDidChange: (NSNotification *)notification { } - (void)comboBoxSelectionIsChanging: (NSNotification *)notification { } @end gnustep-dl2-0.12.0/EOInterface/EODeprecated.h0000664000175000017500000000235714632325605017620 0ustar yavoryavor/** -*-ObjC-*- EODeprecated.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EODeprecated_h__ #define __EOInterface_EODeprecated_h__ #include @class NSArray; @interface EODisplayGroup (EODeprecated) - (void)setSortOrdering: (NSArray *)sortOrderings; - (NSArray *)sortOrdering; @end #endif gnustep-dl2-0.12.0/EOInterface/EOControlAssociation.h0000664000175000017500000000602014632325605021364 0ustar yavoryavor/** -*-ObjC-*- EOControlAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOControlAssociation_h__ #define __EOInterface_EOControlAssociation_h__ #ifdef GNUSTEP #include #else #include #endif #include #include @class NSString; @class NSArray; @class NSControl; @class NSText; @interface EOGenericControlAssociation : EOAssociation { BOOL _didChange; id _lastValue; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (NSArray *)objectKeysTaken; + (BOOL)isUsableWithObject: (id)object; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; - (BOOL)endEditing; /* EOControlAssociation methods. */ - (NSControl *)control; - (EOGenericControlAssociation *)editingAssociation; /* NSControl delegate methods. */ - (BOOL)control: (NSControl *)control didFailToFormatString: (NSString *)string errorDescription: (NSString *)description; - (BOOL)control: (NSControl *)control isValidObject: (id)object; - (BOOL)control: (NSControl *)control textShouldBeginEditing: (NSText *)fieldEditor; @end @interface EOControlAssociation : EOGenericControlAssociation { } /* Defining capabilities of concete class. */ + (BOOL)isUsableWithObject: (id)object; + (NSString *)displayName; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* EOControlAssociation methods */ - (NSControl *)control; - (EOGenericControlAssociation *)editingAssociation; @end @interface EOActionCellAssociation : EOGenericControlAssociation { } /* Defining capabilities of concete class. */ + (BOOL)isUsableWithObject: (id)object; + (NSString *)displayName; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* EOActionCellAssociation methods */ - (NSControl *)control; - (EOGenericControlAssociation *)editingAssociation; @end @interface NSImage (EOImageFactory) + (id)imageWithData:(NSData *)data; @end #endif gnustep-dl2-0.12.0/EOInterface/NSImage+Additions.m0000664000175000017500000000226014632325605020527 0ustar yavoryavor/** NSImage+Additions.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "EOControlAssociation.h" #include @implementation NSImage (EOImageFactory) + (id)imageWithData:(NSData *)data { return AUTORELEASE([[self alloc] initWithData: data]); } @end gnustep-dl2-0.12.0/EOInterface/EORecursiveBrowserAssociation.m0000664000175000017500000000643014632325605023271 0ustar yavoryavor/** EORecursiveBrowserAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #include #else #include #endif #include #include #include "EOControlAssociation.h" #include "EODisplayGroup.h" #include "EORecursiveBrowserAssociation.h" @implementation EORecursiveBrowserAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"children", @"title", @"isLeaf", @"rootChildren", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects: @"M", @"A", @"A", @"M", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { NSArray *arr = [NSArray arrayWithObjects: @"target", @"delegate", nil]; arr = [[super objectKeysTaken] arrayByAddingObjectsFromArray: arr]; _keys = RETAIN (arr); } return _keys; } + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSBrowser class]]; } + (NSArray *)associationClassesSuperseded { static NSArray *_classes = nil; if (_classes == nil) { _classes = RETAIN ([[super associationClassesSuperseded] arrayByAddingObject: [EOControlAssociation class]]); } return _classes; } + (NSString *)displayName { return @"EORecBrowser"; } + (NSString *)primaryAspect { return @"rootChildren"; } - (id)initWithObject: (id)object { if ((self = [super initWithObject: object])) { _eoPath = [NSMutableArray new]; } return self; } - (void)dealloc { DESTROY(_eoPath); [super dealloc]; } - (void)establishConnection { } - (void)breakConnection { } - (void)subjectChanged { } - (void)browser: (NSBrowser *)sender createRowsForColumn: (int)column inMatrix: (NSMatrix *)matrix { } @end gnustep-dl2-0.12.0/EOInterface/EOActionCellAssociation.m0000664000175000017500000000314214632325605021770 0ustar yavoryavor/** EOActionCellAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef GNUSTEP #include #include #include #else #include #include #endif #include "EOControlAssociation.h" @implementation EOActionCellAssociation : EOGenericControlAssociation + (BOOL)isUsableWithObject: (id)object { return [object isKindOfClass: [NSActionCell class]]; } + (NSString *)displayName { return @"EOCellAssoc"; } - (void)establishConnection { } - (void)breakConnection { } - (NSControl *)control { return [self object]; } - (EOGenericControlAssociation *)editingAssociation { return nil; } @end gnustep-dl2-0.12.0/EOInterface/EODisplayGroup.h0000664000175000017500000002200314632325605020170 0ustar yavoryavor/** -*-ObjC-*- EODisplayGroup.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EODisplayGroup_h__ #define __EOInterface_EODisplayGroup_h__ #ifdef GNUSTEP #include #else #include #endif @class NSString; @class NSArray; @class NSMutableArray; @class NSDictionary; @class NSMutableDictionary; @class NSNotification; @class EOEditingContext; @class EODataSource; @class EOQualifier; @class EOAssociation; @interface EODisplayGroup : NSObject { @private EODataSource *_dataSource; /*Retained*/ NSMutableArray *_allObjects; NSMutableArray *_displayedObjects; id _delegate; /*Not Retained*/ NSArray *_selection; NSArray *_sortOrdering; EOQualifier *_qualifier; NSArray *_localKeys; NSMutableArray *_selectedObjects; id _observerNotificationBeginProxy; id _observerNotificationEndProxy; int _updatedObjectIndex; NSDictionary *_insertedObjectDefaultValues; NSMutableArray *_savedAllObjects; NSMutableDictionary *_queryMatch; NSMutableDictionary *_queryMin; NSMutableDictionary *_queryMax; NSMutableDictionary *_queryOperator; NSString *_defaultStringMatchOperator; NSString *_defaultStringMatchFormat; NSMutableDictionary *_queryBindings; void *_reserved; struct { unsigned selectsFirstObjectAfterFetch:1; unsigned didChangeContents:1; unsigned didChangeSelection:1; unsigned autoFetch:1; unsigned haveFetched:1; unsigned validateImmediately:1; unsigned queryMode:1; unsigned optimisticRefresh:1; unsigned fetchAll:1; unsigned _initialized:1; unsigned _reserved:22; } _flags; EOAssociation *_editingAssociation; } /* Global configurations. */ + (NSString *)globalDefaultStringMatchOperator; + (void)setGlobalDefaultStringMatchOperator: (NSString *)operator; + (BOOL)globalDefaultForValidatesChangesImmediately; + (void)setGlobalDefaultForValidatesChangesImmediately: (BOOL)flag; /* Configuring behavior. */ - (BOOL)fetchesOnLoad; - (void)setFetchesOnLoad: (BOOL)flag; - (BOOL)selectsFirstObjectAfterFetch; - (void)setSelectsFirstObjectAfterFetch: (BOOL)flag; - (BOOL)validatesChangesImmediately; - (void)setValidatesChangesImmediately: (BOOL)flag; - (BOOL)usesOptimisticRefresh; - (void)setUsesOptimisticRefresh: (BOOL)flag; - (NSDictionary *)queryBindingValues; - (void)setQueryBindingValues: (NSDictionary *)values; - (NSDictionary *)queryOperatorValues; - (void)setQueryOperatorValues: (NSDictionary *)values; - (NSString *)defaultStringMatchFormat; - (void)setDefaultStringMatchFormat: (NSString *)format; - (NSString *)defaultStringMatchOperator; - (void)setDefaultStringMatchOperator: (NSString *)operator; /* Configuring data source. */ - (EODataSource *)dataSource; - (void)setDataSource: (EODataSource *)dataSource; /* Configuring qualifier. */ - (EOQualifier *)qualifier; - (void)setQualifier: (EOQualifier *)qualifier; /* Configuring sort orderings. */ - (NSArray *)sortOrderings; - (void)setSortOrderings: (NSArray *)orderings; /* Managing queries. */ - (EOQualifier *)qualifierFromQueryValues; - (NSDictionary *)equalToQueryValues; - (void)setEqualToQueryValues: (NSDictionary *)values; - (NSDictionary *)greaterThanQueryValues; - (void)setGreaterThanQueryValues: (NSDictionary *)values; - (NSDictionary *)lessThanQueryValues; - (void)setLessThanQueryValues: (NSDictionary *)values; - (void)qualifyDisplayGroup; - (void)qualifyDataSource; - (BOOL)inQueryMode; - (void)setInQueryMode: (BOOL)flag; /* Fetching. */ - (BOOL)fetch; /* Accessing objects. */ - (NSArray *)allObjects; - (void)setObjectArray: (NSArray *)objects; - (NSArray *)displayedObjects; /* Updating displayed values. */ - (void)redisplay; - (void)updateDisplayedObjects; /* Manage selection. */ - (NSArray *)selectionIndexes; - (BOOL)setSelectionIndexes: (NSArray *)selection; - (BOOL)selectObject: (id)object; - (BOOL)selectObjectsIdenticalTo: (NSArray *)selection; - (BOOL)selectObjectsIdenticalTo: (NSArray *)selection selectFirstOnNoMatch: (BOOL)flag; - (BOOL)selectNext; - (BOOL)selectPrevious; - (BOOL)clearSelection; - (NSArray *)selectedObjects; - (void)setSelectedObjects: (NSArray *)objects; - (id)selectedObject; - (void)setSelectedObject: (id)object; /* Inserting objects. */ - (id)insertObjectAtIndex: (unsigned)index; - (void)insertObject: (id)object atIndex: (unsigned)index; - (NSDictionary *)insertedObjectDefaultValues; - (void)setInsertedObjectDefaultValues: (NSDictionary *)values; /* Deleting objects. */ - (BOOL)deleteObjectAtIndex: (unsigned)index; - (BOOL)deleteSelection; /* Manage local keys. */ - (NSArray *)localKeys; - (void)setLocalKeys: (NSArray *)keys; /* Manage delegate. */ - (id)delegate; - (void)setDelegate: (id)delegate; /* Associations. */ - (NSArray *)observingAssociations; - (EOAssociation *)editingAssociation; - (BOOL)endEditing; @end @interface EODisplayGroup (EODisplayGroupTargetAction) - (void)selectNext: (id)sender; - (void)selectPrevious: (id)sender; - (void)fetch: (id)sender; - (void)insert: (id)sender; - (void)delete: (id)sender; - (void)qualifyDataSource: (id)sender; - (void)qualifyDisplayGroup: (id)sender; - (void)enterQueryMode: (id)sender; @end @interface EODisplayGroup (EOAssociationInteraction) - (BOOL)selectionChanged; - (BOOL)contentsChanged; - (int)updatedObjectIndex; - (id)valueForObject: (id)object key: (NSString *)key; - (id)selectedObjectValueForKey: (NSString *)key; - (id)valueForObjectAtIndex: (unsigned)index key: (NSString *)key; - (BOOL)setValue: (id)value forObject: (id)object key: (NSString *)key; - (BOOL)setSelectedObjectValue: (id)value forKey: (NSString *)key; - (BOOL)setValue: (id)value forObjectAtIndex: (unsigned)index key: (NSString *)key; - (BOOL)enabledToSetSelectedObjectValueForKey:(NSString *)key; - (BOOL)association: (EOAssociation *)association failedToValidateValue: (NSString *)value forKey: (NSString *)key object: (id)object errorDescription: (NSString *)description; - (void)associationDidBeginEditing: (EOAssociation *)association; - (void)associationDidEndEditing: (EOAssociation *)association; @end @interface EODisplayGroup (EOEditors) - (BOOL)editorHasChangesForEditingContext: (EOEditingContext *)editingContext; - (void)editingContextWillSaveChanges: (EOEditingContext *)editingContext; @end @interface EODisplayGroup (EOMessageHandlers) - (void)editingContext: (EOEditingContext *)editingContext presentErrorMessage: (NSString *)message; @end @interface NSObject (EODisplayGroupDelegate) - (BOOL)displayGroup: (EODisplayGroup *)displayGroup shouldRedisplayForEditingContextChangeNotification: (NSNotification *)notif; - (BOOL)displayGroup: (EODisplayGroup *)displayGroup shouldRefetchForInvalidatedAllObjectsNotification: (NSNotification *)notif; - (BOOL)displayGroup: (EODisplayGroup *)displayGroup shouldChangeSelectionToIndexes: (NSArray *)indices; - (void)displayGroupDidChangeSelection: (EODisplayGroup *)displayGroup; - (void)displayGroupDidChangeSelectedObjects: (EODisplayGroup *)displayGroup; - (BOOL)displayGroupShouldFetch: (EODisplayGroup *)displayGroup; - (void)displayGroup: (EODisplayGroup *)displayGroup didFetchObjects: (NSArray *)objects; - (NSArray *)displayGroup: (EODisplayGroup *)displayGroup displayArrayForObjects: (NSArray *)objects; - (void)displayGroup: (EODisplayGroup *)displayGroup didSetValue: (id)value forObject: (id)object key: (NSString *)key; - (void)displayGroup: (EODisplayGroup *)displayGroup createObjectFailedForDataSource: (EODataSource *)dataSource; - (BOOL)displayGroup: (EODisplayGroup *)displayGroup shouldInsertObject: (id)object atIndex: (unsigned)index; - (void)displayGroup: (EODisplayGroup *)displayGroup didInsertObject: (id)object; - (BOOL)displayGroup: (EODisplayGroup *)displayGroup shouldDeleteObject: (id)object; - (void)displayGroup: (EODisplayGroup *)displayGroup didDeleteObject: (id)object; - (void)displayGroupDidChangeDataSource: (EODisplayGroup *)displayGroup; - (BOOL)displayGroup: (EODisplayGroup *)displayGroup shouldDisplayAlertWithTitle: (NSString *)title message: (NSString *)message; @end #endif gnustep-dl2-0.12.0/EOInterface/EOTextAssociation.m0000664000175000017500000001213714636003765020707 0ustar yavoryavor/** EOTextAssociation.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "EODisplayGroup.h" #include "EOTextAssociation.h" #include "SubclassFlags.h" #include "../EOControl/EOPrivate.h" @implementation EOTextAssociation + (NSArray *)aspects { static NSArray *_aspects = nil; if (_aspects == nil) { NSArray *arr = [NSArray arrayWithObjects: @"value", @"URL", @"editable", nil]; _aspects = RETAIN ([[super aspects] arrayByAddingObjectsFromArray: arr]); } return _aspects; } + (NSArray *)aspectSignatures { static NSArray *_signatures = nil; if (_signatures == nil) { NSArray *arr = [NSArray arrayWithObjects:@"A", @"A", @"A", nil]; arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr]; _signatures = RETAIN(arr); } return _signatures; } + (NSArray *)objectKeysTaken { static NSArray *_keys = nil; if (_keys == nil) { _keys = RETAIN ([[super objectKeysTaken] arrayByAddingObject: @"delegate"]); } return _keys; } + (BOOL)isUsableWithObject: (id)object { /* NB: NSCStringText is obsolete. So unless someone asks for it, ignore it for now. */ return [object isKindOfClass: [NSText class]] || [object isKindOfClass: [NSTextView class]]; } + (NSString *)primaryAspect { return @"value"; } - (void)establishConnection { [super establishConnection]; if ([self displayGroupForAspect:@"value"]) { subclassFlags |= ValueAspectMask; if (subclassFlags & ValueAspectMask) { id value = [self valueForAspect:@"value"]; if ([value isKindOfClass:[NSString class]]) { [_object setString:value]; } else if ([value isKindOfClass:[NSData class]]) { int oldLength = [[_object string] length]; [_object replaceCharactersInRange:NSMakeRange(0,oldLength) withRTF:value]; } } } if ([self displayGroupForAspect:@"editable"]) { subclassFlags |= EditableAspectMask; [_object setEditable: [[self valueForAspect:@"editable"] boolValue]]; } [_object setDelegate:self]; } - (void)breakConnection { subclassFlags = 0; [super breakConnection]; } - (void)subjectChanged { if (subclassFlags & ValueAspectMask) { id value = [self valueForAspect:@"value"]; if ([value isKindOfClass: [NSString class]]) { [_object setString:value]; } else if ([value isKindOfClass: [NSData class]]) { int oldLength = [[_object string] length]; [_object replaceCharactersInRange:NSMakeRange(0,oldLength) withRTF: value]; } else if (_isNilOrEONull(value)) { [_object setString:@""]; } } if (subclassFlags & EditableAspectMask) { [_object setEditable: [[self valueForAspect:@"editable"] boolValue]]; } } - (BOOL)endEditing { BOOL flag = NO; if (subclassFlags & ValueAspectMask) { BOOL isRichText = [_object isRichText]; id value; if (isRichText) { value = [_object RTFFromRange:NSMakeRange(0,[[_object string] length])]; } else { value = [[_object string] copy]; } flag = [self setValue:value forAspect:@"value"]; if (flag) { [[self displayGroupForAspect:@"value"] associationDidEndEditing:self]; } } /* dunno if this is neccesary */ if (flag && (subclassFlags & EditableAspectMask)) { [[self displayGroupForAspect:@"editable"] associationDidEndEditing:self]; } return flag; } - (BOOL)control:(NSControl *)control isValidObject:(id)object { /* FIXME */ NSLog(@"FIXME %@",NSStringFromSelector(_cmd)); return YES; } - (void)control: (NSControl *)control didFailToValidatePartialString: (NSString *)string errorDescription: (NSString *)description { } - (BOOL)textShouldBeginEditing: (NSText *) text { EODisplayGroup *dg = [self displayGroupForAspect:@"value"]; BOOL flag = [dg endEditing]; if (flag == YES) { [dg associationDidBeginEditing:self]; } return flag; } - (BOOL)textShouldEndEditing: (NSText *)text { [self endEditing]; [[self displayGroupForAspect:@"value"] associationDidEndEditing:self]; return YES; } @end gnustep-dl2-0.12.0/EOInterface/EOAspectConnector.m0000664000175000017500000000456314632325605020660 0ustar yavoryavor/** -*-ObjC-*- EOAspectConnector.m Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: Matt Rice This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "EOAspectConnector.h" #include #include #include @implementation EOAspectConnector : NSNibConnector - (id) initWithAssociation:(EOAssociation *)association aspectName:(NSString *)name { self = [super init]; ASSIGN(_aspectName, name); ASSIGN(_association, association); ASSIGN(_dg, [association displayGroupForAspect:_aspectName]); ASSIGN(_destinationKey, [association displayGroupKeyForAspect:_aspectName]); return self; } - (NSString *)aspectName { return _aspectName; } - (NSString *)destinationKey { return _destinationKey; } - (EOAssociation *)association { return _association; } - (id) initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; _association = RETAIN([coder decodeObject]); _aspectName = RETAIN([coder decodeObject]); _destinationKey = RETAIN([coder decodeObject]); _dg = RETAIN([coder decodeObject]); [_association bindAspect:_aspectName displayGroup:_dg key:_destinationKey]; return self; } - (void) encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:_association]; [coder encodeObject:_aspectName]; [coder encodeObject:[self destinationKey]]; [coder encodeObject:[_association displayGroupForAspect:[self aspectName]]]; } - (void) establishConnection { [_association establishConnection]; } @end gnustep-dl2-0.12.0/EOInterface/EOMasterCopyAssociation.h0000664000175000017500000000345014632325605022036 0ustar yavoryavor/** -*-ObjC-*- EOMasterCopyAssociation.h Copyright (C) 2004,2005 Free Software Foundation, Inc. Author: David Ayers This file is part of the GNUstep Database Library The GNUstep Database Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. The GNUstep Database Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNUstep Database Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __EOInterface_EOMasterCopyAssociation_h__ #define __EOInterface_EOMasterCopyAssociation_h__ #include @class NSString; @class NSArray; @interface EOMasterCopyAssociation : EOAssociation { id _currentMasterValue; id _currentMasterEO; id _nonRetainedObject; BOOL _doneInit; unsigned int _lastCount; } /* Defining capabilities of concete class. */ + (NSArray *)aspects; + (NSArray *)aspectSignatures; + (BOOL)isUsableWithObject: (id)object; + (NSString *)displayName; + (NSString *)primaryAspect; /* Creation and configuration. */ - (void)establishConnection; - (void)breakConnection; /* Display object value manipulation. */ - (void)subjectChanged; /* Overwritten EODelayedObserver to return EOObserverPrioritySecond. */ - (EOObserverPriority)priority; @end #endif gnustep-dl2-0.12.0/ChangeLog0000664000175000017500000107761414636026724014626 0ustar yavoryavor2015-12-24 David Wetzel * EOControl/EOFaultHandler.m * EOControl/EOGenericRecord.m #include instead of #include 2014-07-24 Manuel Guesdon * EOAccess/EODatabase.[hm] add -forgetSnapshotForSourceGlobalID:relationshipName: * EOAccess/EODatabaseContext.[hm] add -forgetSnapshotForSourceGlobalID:relationshipName: add -refaultObject:withSourceGlobalID:relationshipName:editingContext: add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext: add -_turnToArrayFault:sourceGID:relationshipName:editingContext:isComplete: * EOControl/EOCustomObject.m fix -validateValue:forKey: fix -validateValue:forKey:error: fix -addObject:toPropertyWithKey: fix -removeObject:object fromPropertyWithKey: * EOControl/EOEditingContext.[hm] add -refaultObject:withSourceGlobalID:relationshipName:editingContext: * EOControl/EONSAddOns.[hm] add -performSelector:withPointer: * EOControl/EOObjectStore.[hm] add -refaultObject:withSourceGlobalID:relationshipName:editingContext: add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext: * EOControl/EOObjectStoreCoordinator.m add -refaultObject:withSourceGlobalID:relationshipName:editingContext: add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext: 2014-06-03 Manuel Guesdon * EOAccess/EOAccessFault.m remove empty init methods fix warnings * EOAccess/EOAdaptor.[hm] add -expressionFactory * EOAccess/EOAdaptorChannel.m clean -performAdaptorOperation: * EOAccess/EOAdaptorOperation.m fix warnings * EOAccess/EODatabase.[hm] add/handle _timestamp * EOAccess/EODatabaseChannel.h remove delegate (moved to EODatabaseContext) add _currentEditingContextTimestamp add _refreshedGIDs * EOAccess/EODatabaseChannel.m fix warnings remove delegate (moved to EODatabaseContext) add _currentEditingContextTimestamp add _refreshedGIDs rewrite -setEntity: rewrite -setCurrentEditingContext: rewrite -fetchObject rewrite -cancelFetch rewrite -_selectWithFetchSpecification:editingContext: * EOAccess/EODatabaseContext.h add EODatabaseChannel delegate stuff * EOAccess/EODatabaseContextPriv.h add EODatabaseChannel delegate stuff * EOAccess/EODatabaseContext.m add EODatabaseChannel delegate stuff fix EOAdaptor..Operator / EODatabase..Operator mismatch * EOAccess/EODatabaseOperation.m fix warnings * EOAccess/EOEntity.[hm], EOAccess/EOEntityPriv.h fix warnings add singleTable... methods * EOAccess/EOExpressionArray.m fix warnings * EOAccess/EOSQLExpression.m rewrite -prepareInsertExpressionWithRow: * EOAccess/EOSQLExpressionFactory.[hm] new class * EOAccess/EOUtilities.[hm] remove duplicate methods * EOAccess/GNUmakefile add EOSQLExpressionFactory.[hm] * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.h remove duplicate _adaptorContext * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m remove duplicate _adaptorContext remove unused pgResultDictionary() * EOControl/EOEditingContext.h handle fetchTimestamp * EOControl/EOEditingContext.m handle fetchTimestamp rewrite -deleteObject: fix warnings * EOControl/EOGenericRecord.m fix warnings * EOControl/EOMutableKnownKeyDictionary.m fix warnings * EOControl/EONSAddOns.[hm] remove duplicate method * EOControl/EONull.m fix warnings 2014-05-30 Sebastian Reitenbach * nearly every file get rid of RCSID/RCS_ID 2014-05-29 Manuel Guesdon * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m: respect GNUstep coding standard (curly brackets placement, indentation) use IMP for some -objectAtIndex calls * EOControl/EONSAddOns.h add -overrideEntriesWithObjectsFromDictionary:forKeys: add +diffOldArray:newArray:returnsRemovedValues:addedValues: * EOControl/EONSAddOns.h add -overrideEntriesWithObjectsFromDictionary:forKeys: add +diffOldArray:newArray:returnsRemovedValues:addedValues: use IMP for some -objectAtIndex calls use NSUInteger for count and indexes rewrite -containsIdenticalObjectsWithArray: to use diffOldArray:... * EOControl/EODetailDataSource.m fix -editingContext * EOAccess/EODatabaseContext.m use IMP for some -objectAtIndex calls rewrite -faultForGlobalID:editingContext: optimize -recordChangesInEditingContext: rewrite part of -databaseOperationForObject: 2014-05-22 Manuel Guesdon * EOAccess/EODatabaseContext.m implement _objectFaultWithSnapshot:relationship:editingContext: fix -initializeObject:row:entity:editingContext: finish implementation of -_obtainOpenChannel implement -_forceDisconnect fix -_openChannelWithLoginPanel: implement -_verifyNoChangesToReadonlyEntity: * EOAccess/EOAttributePriv.h add -_isNonUpdateable add -_isPrimaryKeyClassProperty add _flags.isNonUpdateable add _flags.isNonUpdateableInitialized * EOAccess/EOAttribute.m add -_isNonUpdateable add -_isPrimaryKeyClassProperty 2014-05-22 Manuel Guesdon * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m: fix newValueForDateTypeLengthAttribute * EOAccess/EOEntityPriv.h declare -_isSingleTableEntity declare -_assertNoPropagateKeyCycleWithEntities:relationships: * EOAccess/EOEntity.m fix _flattenAttribute:relationshipPath:currentAttributes: use relationshipPathBy...Component make _addAttributesToFetchForRelationshipPath:atts: more understandable implement -_assertNoPropagateKeyCycleWithEntities:relationships: implement -_isSingleTableEntity fix validateValue:forKey: * EOAccess/EOExpressionArray.m implement -valueWithSQLExpressionElement:forSQLExpression: fix -valueForSQLExpression: * EOAccess/EODatabaseContext.m reformat -batchNewPrimaryKeysWithEntity:count: reformat -prepareForSaveWithCoordinator:editingContext: reformat and fix -recordChangesInEditingContext: reformat -recordUpdateForObject:changes: fix -valuesForKeys:object: fix -nullifyAttributesInRelationship:sourceObject:destinationObject: add -_mutableValuesForKeys:object: add -_recordInsertForIntermediateRowFromSourceObject:... fix -relayAttributesInRelationship:sourceObject:destinationObject: fix -relayPrimaryKey:sourceObject:destObject:relationship: fix -relayPrimaryKey:object:entity: fix -createAdaptorOperationsForDatabaseOperation: fix -_buildPrimaryKeyGeneratorListForEditingContext: * EOAccess/EODatabaseOperation.m clean code * EOAccess/EODatabaseChannel.m fix -_propertiesToFetch * EOControl/EONSAddOns.[hm] add NSString (EORelationshipPath) 2014-04-30 Manuel Guesdon * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m: Handle Custom class in newValueForNumberTypeLengthAttribute() 2014-04-26 Manuel Guesdon * EOAccess/EOAdaptorChannel.m call delegate -adaptorChannel:willPerformOperations: * EOAccess/EODatabaseContext.m: propagate delegate to channel fix objectsForSourceGlobalID:relationshipName:editingContext: isToManyToOne case * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m: call delegate methods adding assert to catch bad dates use adaptor -primaryKeySequenceNameFormat * EOAccess/EOrelationship.m implement -isParentRelationship verify/clean -isReciprocalToRelationship: implement -qualifierWithSourceRow: small fix on -removeJoin: use batch faulting when -setNumberOfToManyFaultsToBatchFetch: improve -setIsMandatory fix exception message -validateValue: clean -_intermediateAttributes clean -isMultiHop implement -primaryKeyForTargetRowFromSourceDBSnapshot: implement -_setSourceToDestinationKeyMap: implement -qualifierForDBSnapshot: fix/implement -isToManyToOne fix -foreignKeyInDestination implement -isPropagatesPrimaryKeyPossible implement -qualifierOmittingAuxiliaryQualifierWithSourceRow implement -auxiliaryQualifier implement -setAuxiliaryQualifier: clean -_sourceRowToForeignKeyMapping add comment in -_sourceAttributeNames fix -joinForAttribute: fix -_flushCache fix -_stringFromDeleteRule: implement -_rightSideKeyMap implement -_leftSideKeyMap implement -_substitutionRelationshipForRow: fix -isFlattened remove _componentRelationships * EOAccess/EORelationship.h remove _componentRelationships * EOAccess/EOEntityPriv.[hm] fix _hiddenRelationships return type * EOAccess/Entity.m: implement -_mapAttribute:toDestinationAttributeInLastComponentOfRelationshipPath: implement -_inverseRelationshipPathForPath: implement -_relationshipPathHasIdenticalKeys: rewrite & fix -_keyMapForRelationshipPath: rewrite & fix -_keyMapForIdenticalKeyRelationshipPath: implement -valueForSQLExpression: fix -validateObjectForDelete: implement -qualifierForDBSnapshot: fix -_addAttributesToFetchForRelationshipPath:atts: fix -_parsePropertyName: implement -fetchSpecificationNamed: implement +externalNameForInternalName:separatorString:useAllCaps: implement +nameForExternalName:separatorString:initialCaps: implement -stringByMarkingUpcaseTransitionsWithDelimiter implement -snapshotKeyForAttributeName: implement -_flattenedAttNameToSnapshotKeyMapping fix -_attributesToFetch fix -_attributesToSave * EOAccess/Entity.h: fix _inverseRelationshipPathForPath: fix -_relationshipPathHasIdenticalKey: add _flgas.isSingleTableEntity * EOAccess/EntityPriv.h: fix -qualifierForDBSnapshot: * EOAccess/EOPrivate.[hm] add GDL2_EORelationshipClass add GDL2_EOEntityClass * EOAccess/EOModel.m: cache [EOEntity class] add -propertyListForEntity:name: to enable subclassing * EOAccess/EOAttribute.m fix -isFlattened implement -targetAttribute implement -relationshipPath fix -_setDefinitionWithoutFlushingCaches: fix -_normalizeDefinition:path: fix -isReadOnly implement -_setOverrideForKeyEnum: implement -_hasAnyOverrides implement -_isKeyEnumOverriden: implement -_prototypeKeys fix -initWithPropertyList:owner: fix -readFormat fix -writeFormat fix -scale fix -precision fix -width fix -allowsNull fix -isReadOnly fix -valueClassName fix -externalType fix -valueType implement -_setValuesFromTargetAttribute * EOAccess/EOAttribute.h declare -targetAttribute declare -relationshipPath * EOAccess/EOAttributePriv.h declare EOAttributeProtoOverrideBits enum fix method arguments declare _setValuesFromTargetAttribute() * EOAccess/EOExpressionArray.h declare -_isPropertyPath * EOAccess/EOExpressionArray.m implement -_isPropertyPath 2014-03-09 Sebastian Reitenbach * EOControl/EOCheapArray.m * EOControl/EODebug.m * EOControl/EODetailDataSource.m * EOControl/EOEditingContext.m * EOControl/EOFaultHandler.m * EOControl/EOFault.m * EOControl/EOGenericRecord.m * EOControl/EOKeyComparisonQualifier.m * EOControl/EOKeyValueArchiver.m * EOControl/EOKeyValueCoding.m * EOControl/EOKeyValueQualifier.m * EOControl/EOMutableKnownKeyDictionary.m * EOControl/EOObjectStoreCoordinator.m * EOControl/EOPrivate.m * EOControl/EOQualifier.m * EOControl/EOSortOrdering.m * Apps/EOModelEditor/CodeGenerator.m * Apps/EOModelEditor/EOMEDocument.m * Apps/EOModelEditor/Inspectors/ConnectionDictionaryInspector.m * EOAccess/EOAccessFault.m * EOAccess/EOAdaptorChannel.m * EOAccess/EOAdaptor.m * EOAccess/EOAttribute.m * EOAccess/EODatabaseChannel.m * EOAccess/EODatabaseContext.m * EOAccess/EODatabaseDataSource.m * EOAccess/EOEntity.m * EOAccess/EOModelGroup.m * EOAccess/EOModel.m * EOAccess/EORelationship.m * EOAccess/EOUtilities.m * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m * EOAdaptors/PostgreSQLAdaptor/PostgreSQLContext.m fix format string warnings and do not directly access isa 2014-03-08 Sebastian Reitenbach * Apps/EOModelEditor/CodeGenerator.m * EOControl/EOClassDescription.m * remove some dead initializations 2012-08-18 German A. Arias * Tools/Makefile.preamble: Add flag -Wl,--allow-shlib-undefined, to get GDL2 to compile again. 2013-08-12: Graham Lee * Apps/EOModelEditor/CodeGenerator.m EOModelEditor: generated ObjC files cause warnings with clang see bug 39328 2013-06-22: Graham Lee * Apps/EOModelEditor/EOMEDocument.m fix saving of new created models and make the Inspector work on OSX * EOAccess/EOModel.m separate out the connection dictionary in a separate file, bump file version 2013-06-22: Graham Lee * EOModeler/EOModelExtensions.m include the right header on OS X * EOModeler/GNUmakefile * EOAccess/GNUmakefile remove variable * EOAdaptors/PostgreSQLAdaptor/config.mak.in remove redundant libraries * EOAccess/EOAdaptor.m make error message more comprehensible 2013-06-09: Sebastian Reitenbach * EOControl/EOEditingContext.[h|m] switch setLevelsOfUndo to NSUInteger 2013-05-29: Sebastian Reitenbach * EOAccess/EOEntity.m remove unused variable * EOControl/EOEditingContext.m use the object, instead of the EOGlobalID to get the entityName * EOControl/EOGenericRecord.m * EOInterface/EOColumnAssociation.[h|m] * EOInterface/EOTableViewAssociation.m some NS(U)Integer conversions 2013-05-28: Graham Lee * Tools/gsdoc-model.m * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m * EOAdaptors/SQLiteAdaptor/SQLite3Expression.m * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.m * EOControl/EODataSource.m * EOControl/EOEvent.m * EOControl/EOPrivate.m * EOControl/EOUndoManager.m Fix header inclusion for building on MAC OS X see bug #39086 2013-03-30: Sebastian Reitenbach * Apps/EOModelEditor/SQLGenerator.m Add NSEmitTODO to showTables: * EOAdaptors/SQLiteAdaptor/SQLite3Adaptor.m add some more potential table column types * EOAdaptors/SQLiteAdaptor/SQLite3Channel.m use the table types from the SQLite3Adaptor to decide about the valueType, and set the NOT NULL correctly 2013-03-25: Sebastian Reitenbach * EOAdaptors/SQLiteAdaptor/SQLite3Channel.m CHAR is NSString, not NSNumber, makes the DataBrowser show strings 2013-03-24: Sebastian Reitenbach * EOAccess/EOAdaptorChannel.m the subclasses are responsible for describeModelWithTableNames and describeTableNames * EOAdaptors/SQLiteAdaptor/SQLite3Channel.m implement describeModelWithTableNames:, inspired from the PostgreSQLChannel.m * Apps/EOModelEditor/EOModelEditorApp.m set the model name correctly for SQLite3 databases too, use the file name * add EOAdaptors/SQLiteAdaptor/SQLite3EOAdaptorInfo.plist needed to make the EODataBrowser correctly detect that the SQLite3Adaptor is a subclass of EOAdaptor 2013-03-14: Sebastian Reitenbach * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m make the login panel remember the last used directory 2013-03-13: Sebastian Reitenbach * Apps/EOModelEditor/DataBrowser.[h|m] * make the fetch limit and qualifier fields work 2013-03-10: Sebastian Reitenbach * Apps/EOModelEditor/Inspectors/EntityInspector.m add warning about method not implemented * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m use NSOpenPanel when opening a file * EOInterface/EOColumnAssociation.m * EOInterface/EOPopUpAssociation.m * EOInterface/EORadioMatrixAssociation.m NSArray doesn't know about initWithObject: * EOInterface/EOTextAssociation.m include right headers * Apps/EOModeler/EOMInspector.m * Apps/EOModelEditor/Inspectors/AttributeInspector.m include missing header * EOAdaptors/PostgreSQLAdaptor/PostgreSQLEOAdaptorInfo.plist renamed from Info.plist, and fix NSExecutable in it * Apps/EOModelEditor/Inspectors/AdvancedAttributeInspector.m * Apps/EOModelEditor/Inspectors/AdvancedEntityInspector.m * Apps/EOModelEditor/Inspectors/AdvancedRelationshipInspector.m * Apps/EOModelEditor/Inspectors/EntityInspector.m * Apps/EOModelEditor/Inspectors/EntityStoredProcedureInspector.m * Apps/EOModelEditor/Inspectors/RelationshipInspector.m * Apps/EOModelEditor/Inspectors/StoredProcedureInspector.m * EOAccess/EOAdaptor.m Fix some headers, remove unused variables, and use EOMApp instead of NSApp * Apps/EOModelEditor/Resources/EOMEDocument.gsmarkup give the window a better name than just "Window" 2013-03-08: Sebastian Reitenbach * Apps/EOModelEditor/EOMEDocument.h make the header match the implementation, fixing warning about incomplete implementation of class 2013-03-07: Sebastian Reitenbach * EOControl/Makefile.preamble add -std=gnu89 to allow compile with clang and -O0 * EOControl/EOPrivate.h do not access the isa directly, use object_getClass * EOControl/EODebug.m ivar_getTypeEncoding returns const char * * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.h class conforms to NSTextFieldDelegate * EOAdaptors/SQLiteAdaptor/SQLite3Adaptor.m get rid of stray ; to make the loop work * GDL2Palette/ResourceManager.m include missing header * GDL2Palette/Palette.[h|m] use NSString instead of NSConstantString 2013-03-02: Sebastian Reitenbach * Apps/EOModelEditor/EOMEDocument.m * Apps/EOModelEditor/Inspectors/AdvancedRelationshipInspector.m * Apps/EOModelEditor/Inspectors/ConnectionDictionaryInspector.m * Apps/EOModelEditor/Inspectors/EntityInspector.m * Apps/EOModelEditor/Inspectors/RelationshipInspector.m * EOAccess/EOAdaptor.m * EOAccess/EODatabaseContext.m * EOAccess/EOEntity.m * EOAccess/EOModel.m * EOAccess/EOStoredProcedure.m * EOControl/EOMutableKnownKeyDictionary.m * EOControl/EOObserver.m * shutup all clang warnings of type: equality comparison with extraneous parentheses all harmless, but in EOEntity.m it actually was wrong * EOAccess/EORelationship.m * EOInterface/EODisplayGroup.m * GDL2Palette/DisplayGroupInspector.m some NS(U)Integer transitions to fix warnings about comparisons against NSNotFound * EOControl/EOKeyValueCoding.m * EOControl/EOFault.h mark EOFault and GDL2KVCNSObject classes as root classes * Apps/EOModelEditor/EOMEDocument.m * EOAccess/EODatabaseContext.m * EOControl/EODebug.h * EOControl/EOQualifier.m * Tools/gsdoc-model.m fix warnings related to format strings * Apps/EOModelEditor/AdaptorsPanel.m * Apps/EOModelEditor/Preferences.m * EOAccess/EOAttribute.m * EOAccess/EOExpressionArray.m * EOAccess/EORelationship.m * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.m * EOAdaptors/SQLiteAdaptor/SQLite3Channel.m * EOControl/EOCheapArray.m * EOControl/EOMutableKnownKeyDictionary.m * EOControl/EOPrivate.h * EOControl/EOPrivate.m * EOControl/Makefile.preamble * GDL2Palette/ConnectionInspector.m * GDL2Palette/DisplayGroupInspector.m Fix warnings about conflicting return types or paramters * EOAccess/EOAdaptor.m * EOAccess/EORelationship.m * EOControl/EONSAddOns.m get rid of some warnings about tautological compares * GDL2Palette/DisplayGroupInspector.m missed int -> NSInteger transition before 2013-03-01: Sebastian Reitenbach * EOControl/EODebug.m do not use redundant stringWithString 2012-08-10 German A. Arias * EOInterface/GNUmakefile: * EOAccess/GNUmakefile: * EOAdaptors/SQLiteAdaptor/GNUmakefile.in: * EOAdaptors/PostgreSQLAdaptor/config.mak.in: * EOControl/GNUmakefile: * EOModeler/GNUmakefile: Add flags to compile with new linkers. 2012-03-19 German A. Arias * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m (-init): Fix memory leak. 2012-03-19 German A. Arias * EOAdaptors/SQLiteAdaptor/LoginPanel/sqlitelogo.tif: * EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile: * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m: Added SQLite logo in login panel. 2012-03-19 German A. Arias * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.h: * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.m: * Apps/EOModelEditor/AdaptorsPanel.h: * Apps/EOModelEditor/AdaptorsPanel.m: Use a panel instead a window. So the menu isn't displayed when the user use NSWindows95InterfaceStyle. * Apps/EOModelEditor/EOWindow.h: * Apps/EOModelEditor/EOWindow.m: * Apps/EOModelEditor/GNUmakefile: New class for auxiliary windows. * Apps/EOModelEditor/Resources/SQLGenerator.gsmarkup: * Apps/EOModelEditor/Resources/DataBrowser.gsmarkup: Instances of class EOWindow, this avoid display the menu. 2012-03-18 German A. Arias * Apps/EOModelEditor/EOModelEditorApp.h: * Apps/EOModelEditor/EOModelEditorApp.m: Fix a problem with last commit. 2012-03-18 German A. Arias * Apps/EOModelEditor/EOModelEditorApp.m: Added delegate methods for use with in-window menu. 2011-04-06 Fred Kiefer * EOControl/EODebug.m: replace GNU runtime specific functions and data structrues with the modern ones. 2010-10-13 Fred Kiefer * EOAccess/EODatabaseContext.m ([EODatabaseContext(EOCooperatingObjectStoreSupport -rollbackChanges]): Reset _flags.preparingForSave for better recovery from an exception. Patch by Georg Fleischmann 2010-09-20 Fred Kiefer * EOAccess/EOSQLQualifier.m [EONotQualifier -sqlStringForSQLExpression:]: Pass on _qualifier not self. Patch by Georg Fleischmann 2010-09-12 Fred Kiefer * EOControl/EOCheapArray.m, * EOControl/EOMutableKnownKeyDictionary.m, * EOControl/EODetailDataSource.m: include of replaced by and * EOAccess/EODatabaseContext.m ([EODatabaseContext(EOCooperatingObjectStoreSupport) -recordChangesInEditingContext]): for isToMany relationships, call -relayAttributesInRelationship:sourceObject:destinationObjects: (with 's' !). * EOAccess/EODatabaseContext.m ([EODatabaseContext -_fireArrayFault:]): test if object is still a fault before calling -clearFault: * EOAccess/EODatabaseContext.m ([EODatabaseContext -objectsWithFetchSpecification:editingContext:]): call beginTransaction only for pessimistic locking. Patch by Georg Fleischmann 2010-08-21 David Wetzel * EOAccess/EODatabaseContext.m fix lockObjectWithGlobalID:editingContext: 2010-08-09 German Arias * Apps/EOModelEditor/Resources/EOModelEditor.tiff Changed size of the icon. 2010-07-06 David Wetzel * EOAccess/EOModel.m -_deleteTrashAtPath: .cvs -> .CVS 2010-07-05 David Wetzel * EOAccess/EOModel.m add - _deleteTrashAtPath: avoid keeping unused files in the wrapper directory. basically, .svn/.cvs/.git as this does not change that often I am not moving this to an external plist at the moment. 2010-07-05 David Wetzel * EOAccess/EODatabaseContext.m valuesForKeys: -> dictionaryWithValuesForKeys: (The old valuesForKeys: causes a log message on OSX) some reformats and DebugLog removals 2010-07-04 David Wetzel * EOAccess/EOModel.m -writeToFile: Don't copy or move directories create an dir only if we have none * Apps/EOModelEditor/EOMEDocument.m copy old wrapper dir to new tmp path/URL The model overwrites our own files then. Trash like .svn stays intact this way :-) Only OSX at the moment. see http://savannah.gnu.org/bugs/index.php?30348 (#ifdef'd) -keepBackupFile return YES * Apps/EOModelEditor/CodeGenerator.m don't write code for EOGenericRecord or EOCustomObject 2010-07-04 David Wetzel * EOAccess/EODatabaseContext.m use memset in place of bzero (as suggested by Tim Kack) 2010-07-04 David Wetzel * EOAccess/EOModelGroup.m add include * EOAccess/EOEntity.m - classProperties small cleanup * EOAccess/EODatabaseOperation.m -rowDiffsForAttributes: add checks * EOAccess/EODatabaseContext.h add _missingObjectGIDs, _checkPropagatedPKs add databaseContextFailedToFetchObject + _setUseToManyCaching: added removed -coordinator add -missingObjectGlobalIDs * EOAccess/EODatabaseContextPriv.h add -_entityForObject: * EOAccess/EODatabaseContext.m add _useToManyCaching add + _setUseToManyCaching: add - _delegateHandledDatabaseException: add -setCoordinator: removed -coordinator add databaseContextFailedToFetchObject add -missingObjectGlobalIDs cleanup _objectsChanged -_snapshotsChangedInDatabase renamed vars - _batchNewPrimaryKeysWithEntity:count: add - prepareForSaveWithCoordinator:editingContext: add checks cleanup code - _patchUpPK: add - recordChangesInEditingContext rewritten - _primaryKeyForIntermediateRowFromSourceObject:relationship:destinationObject: add - _databaseOperationForIntermediateRowFromSourceObject:relationship:destinationObject: add - _recordDeleteForIntermediateRowFromSourceObject:relationship:destinationObject: add - nullifyAttributesInRelationship:sourceObject:destinationObjects: fixed, rewritten - _entityForObject: add * EOAccess/EOAdaptorChannel.h * EOAccess/EOAdaptorChannel.m add primaryKeysForNewRowsWithEntity:count: * Apps/EOModelEditor/DataBrowser.m fix typo in import * EOControl/EONSAddOns.h * EOControl/EONSAddOns.m add +dictionaryWithDictionary:keys: add -translateFromKeys:toKeys: add -containsAnyNullObject * EOControl/EOSharedEditingContext.m fix include * EOControl/EOObjectStoreCoordinator.h * EOControl/EOObjectStoreCoordinator.m remove observers now add setCoordinator and use it. -coordinator moved up from EODatabaseContext. 2010-07-01 David Wetzel * EOAccess/EODatabaseOperation.m fix typo in string * EOAccess/EODatabaseContext.m add compareUsingEntityNames() -orderAdaptorOperations refactor -entityNameOrderingArrayForEntities: implemented * EOControl/EOMutableKnownKeyDictionary.m remove log 2010-07-01 David Wetzel * EOAccess/EODatabaseOperation.h add comment * EOAccess/EODatabaseContext.h -lockingNonQualifiableAttributes return NSArray, not id -handleDroppedConnection -commitChanges remove unsed variables -createAdaptorOperationsForDatabaseOperation:attributes: rewrite -lockingNonQualifiableAttributes fix return NSArray, not id 2010-06-29 David Wetzel * EOAccess/EOModel.m -addEntity: change error checks to be in sync with reference 2010-06-29 David Wetzel * EOControl/EOFault.h * EOControl/EOFaultHandler.m unsigned -> NSUInteger * EOControl/EOFault.m unsigned -> NSUInteger -release fix as suggested by David Ayers -dealloc add NSAssert 2010-06-28 David Wetzel * EOAccess/EODatabaseContext.m -initializeObject:withGlobalID:editingContext: remove exessive checking -initializeObject:row:entity:editingContext: reformat, less IMPs, less logs * EOControl/EOFault.h + retainCount unsigned -> NSUInteger * EOControl/EOFault.m + retainCount unsigned -> NSUInteger + clearFault: raise if argument is no fault rewrote retain behaviour it makes no sense to free objects here and use the pointers this would mess up the whole memory and crash. 2010-06-28 David Wetzel * EOAccess/EOEntity.m - createInstanceWithEditingContext:globalID:zone: reformat, remove logs * EOAccess/EODatabaseContext.m -initializeObject:withGlobalID:editingContext: rewritten, add exceptions * EOAccess/EODatabaseChannel.m -fetchObject remove logs, add exceptions * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.m postgresClientVersion() use stringWithCString:encoding: not stringWithCString: * Apps/EOModelEditor/CodeGenerator.m don't add to generated code * EOControl/EOCustomObject.h * EOControl/EOCustomObject.m add -encodeWithCoder: add -initWithCoder: 2010-06-27 David Wetzel * EOAccess/EODatabaseContext.m -isValidQualifierTypeForAttribute: reformat, remove useless code -qualifierForLockingAttributes:primaryKeyAttributes:entity:snapshot: reformat * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.m -isValidQualifierType:model: remove logs, format * Apps/EOModelEditor/Inspectors/AttributeInspector.gsmarkup * Apps/EOModeler/EOModelExtensions.m Rename the char into BOOL You can use BOOL to create code that has BOOL values. Apple seems to do this in newer code 2010-06-26 David Wetzel * EOAccess/EOAccessFault.m -unableToFaultObject:databaseContext: remove self from exception format printing otherwise we create a loop... 2010-06-24 David Wetzel * EOControl/EOControl.h include GNUstepBase/GNUstep.h on non-GNUSTEP platforms 2010-06-24 David Wetzel * Apps/EOModelEditor/CodeGenerator.m -updateNeededForFileAtPath:content:canOverwrite: do not overwrite files if canOverwrite = NO 2010-06-24 David Wetzel * README add Additional Notes * Apps/EOModelEditor/Inspectors/GNUmakefile * Apps/EOModelEditor/GNUmakefile * Apps/EOModeler/Makefile.preamble add parent directories to search path as suggested by Sergey Golovin * TODO updated * GDL2Palette/GNUmakefile add ../Apps/EOModeler to ADDITIONAL_NATIVE_LIB_DIRS (as suggested by Sergey Golovin) It does not build on OS X, I need patches guys :-) 2010-06-23 David Wetzel * EOAccess/EOModel.m add -_writePlist:toFile: use it in -writeToFile: this makes writing OPENSTEP plists work on OSX! 2010-06-14 David Wetzel * EOAccess/EODatabaseContext.m recordUpdateForObject: changes: more checks, call coordinator's forwardUpdateForObject:changes: recordInsertForObject: raise exception on inconsistency recordDeleteForObject: raise exception on inconsistency commitChanges: remove NSLog 2010-06-11 David Wetzel * EOAccess/EODatabase.m * EOAccess/EODatabase.h add _doesReleaseUnreferencedSnapshots add dummy for incrementSnapshotCountForGlobalID add dummy for decrementSnapshotCountForGlobalID add disableSnapshotRefcounting * EOAccess/EODatabaseContext.m retain EOAdaptorChannel created by adaptor This is documented in WO 4.5. Otherwise it gets closed after the request's autorelease pool is drained. I tested this on OSX with the BookStore example. added some dummies for future implementation refactor objectsWithFetchSpecification: editingContext: refactor commitChanges * EOAccess/EODatabaseChannel.m reformat * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m add include * EOControl/EOGenericRecord.m add [self willChange] in setValue:forUndefinedKey: this will make saving changes possible for EOGenericRecord otherwise it was just showing them in memory 2010-06-10 David Wetzel * EOControl/EOGenericRecord.h * EOControl/EOGenericRecord.m rename dictionary to _dictionary fixed KVC. 2010-06-09 David Wetzel * EOAccess/EOSQLExpression.m fix include for less warnings on mac * EOAccess/EOEntity.m fix include for less warnings on mac isPrimaryKeyValidInObject: 0 is NOT a valid PK value * EOAccess/EOAdaptor.m fix include for less warnings on mac isDroppedConnectionException add comment and remove logs * EOAccess/EOSQLQualifier.m * EOAccess/EODatabaseDataSource.m * EOAccess/EOAdaptorContext.m * EOAccess/EORelationship.m * EOAccess/EOUtilities.m * EOAccess/EOSchemaGeneration.m * EOAccess/EOAdaptorChannel.m * EOAccess/EODatabaseChannel.m fix include for less warnings on mac * EOAccess/EODatabaseContext.h add support for shouldHandleDatabaseException (WO 4.5) * EOAccess/EODatabaseContext.m add support for shouldHandleDatabaseException add [newRow addEntriesFromDictionary:objectPK] to merge PKValues into the values of the EO. without that it is impossible to work. relayPrimaryKey: object: entity: Hopefully fixed. add _delegateHandledDatabaseException: fixed _primaryKeyForObject: raiseException: (we raise always for now) * EOAccess/EOAdaptorChannel.h add comment * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m fix include for less warnings on mac numberOfAffectedRows: search reverse to cover "INSERT 0 1" case. The first zero is the OID number refactored primaryKeyForNewRowWithEntity: * EOAdaptors/PostgreSQLAdaptor/PostgreSQLContext.h/m disabled _primaryKeySequenceNameFormat * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m fixed formatValue: forAttribute: * EOControl/EOEditingContext.m * EOControl/EOFaultHandler.m * EOControl/EOKeyValueQualifier.m * EOControl/EOUndoManager.m * EOControl/EOClassDescription.m * EOControl/EOQualifier.m * EOControl/EOOrQualifier.m fix include for less warnings on mac * EOControl/EOCustomObject.m use getCString:maxLength:encoding instead of getCString use setValue: forKey instead of takeValue: forKey: change text in exceptions a bit * EOControl/EOPrivate.h use setValue: forKey instead of takeValue: forKey: 2010-06-07 Fred Kiefer * EOMultiReaderLock.m (-tryLockForWriting, -unlockForReading): Replace int with NSInteger. 2010-06-06 David Wetzel * EOAccess/EOEntity.m Added comment. Please check this! * EOAccess/EODatabaseContext.m include NSObject+GNUstepBase.h avoid Enumerator exception. * EOAccess/EOUtilities.m split line into two * EOAccess/EOAdaptorChannel.h/m unsigned -> NSUInteger * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.h removed _describeResults * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m include NSObject+GNUstepBase.h added numberOfAffectedRows attribute naming in raw rows fixed updating fixed unsigned -> NSUInteger 2010-06-04 David Wetzel * Apps/EOModelEditor/Inspectors/AdvancedEntityInspector.gsmarkup changed scrollView sizing * Apps/EOModeler/EOMInspectorController.m refactored view switching into a single method disabled bounds logging Be sure to get the lastest gui if you try this! 2010-06-03 David Wetzel * EOAccess/EOAttribute.m include EOSQLExpression.h move methods around to fix warnings * EOAccess/EOEntity.m include EOFetchSpecification.h to fix warning * EOAccess/EOAdaptor.m fix Mime include * EOAccess/EOStoredProcedure.m fix warning in setExternalName: * EOAccess/EODatabaseContext.m include EOAttributePriv.h and EOSQLExpression.h to fix warning entityForGlobalID: cast to EOKeyGlobalID to avoid warning. use caching. _fetchRawRowKeyPaths: fix warnings by using proper types. processSnapshotForDatabaseOperation: set EONull value when needed. avoid warnings. 2010-06-03 David Wetzel * configure.ac replaced DBModeler with Apps/EOModeler Apps/EOModelEditor * configure: regenerated * Apps/EOModelEditor/Inspectors/AttributeInspector.gsmarkup * Apps/EOModelEditor/Inspectors/EntityStoredProcedureInspector.gsmarkup * Apps/EOModelEditor/Inspectors/AdvancedAttributeInspector.gsmarkup * Apps/EOModelEditor/Inspectors/EntityInspector.gsmarkup Changed box sizes. * Apps/EOModeler/EOMInspectorController.m add inspector view in background. add NSLogs to help debugging (still broken on X11) 2010-06-03 David Wetzel * Apps/EOModelEditor/Inspectors/*.gsmarkup trying to fix offsets on X11 * Apps/EOModeler/EOModelExtensions.m remove config.h include as suggested by David Ayers 2010-06-03 David Wetzel * EOAccess/EOModel.m include GNUstepBase/NSObject+GNUstepBase.h _removePropertiesReferencingEntity: fix selector name removeEntity: add comment, call _removeEntity: implemented removeEntityAndReferences: * EOAccess/EOAttribute.m include GNUstepBase/NSObject+GNUstepBase.h add comment * EOAccess/EOModel.h add comment * Apps/EOModelEditor/EOMEDocument.m deleting of attributes, arguments (stored procedures) and entities works now * Apps/EOModelEditor/EOMEDocument.h add methods to avoid warnings 2010-06-02 David Wetzel * EOAccess/EOModel.m/h new (still empty) _loadFetchSpecificationDictionaryForEntityNamed: added _removePropertiesReferencingProperty: added _removePropertiesReferencingEntity: loadAllModelObjects: load storedProcedures, call _loadEntity fixed referencesToProperty: added referencesProperty: * EOAccess/EOAttribute.m fixed valueForSQLExpression: changed return type of _definitionArray to EOExpressionArray * * EOAccess/EOEntity.m fixed attributesUsedForLocking fixed removeAttribute: fixed removeRelationship: fixed _fetchSpecificationDictionary fixed _loadEntity * EOAccess/EORelationship.m verified valueForSQLExpression, removed logs fixed referencesProperty: * Apps/EOModelEditor/EOMEDocument.m make deleting of attributes work. 2010-06-01 David Wetzel * Apps/EOModelEditor/Resources/PlusCorner.tiff added 2010-06-01 David Wetzel * Apps/EOModelEditor/Inspectors/*.gsmarkup tried to fix on X11 * Apps/EOModelEditor/EOModelEditorApp.m new: to create new models manually * Apps/EOModelEditor/Inspectors/EntityInspector.m check for empty strings before filling fields * Apps/EOModelEditor/Inspectors/RelationshipInspector.m check for empty name * Apps/EOModelEditor/EOMEDocument.m addEntity, addRelationship, validateUserInterfaceItem 2010-05-31 David Wetzel * Apps/EOModeler/EOMInspectorController.m int -> NSUInteger, call sizeToCells 2010-05-30 David Wetzel * EOAccess/EOAttribute.m: reformat * EOAccess/EOAdaptor.m in databaseEncoding: use +[GSMimeDocument encodingFromCharset:] less logging * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.h: reformat encoding -> _encoding * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m Use _encoding now for reading and writing Strings. less logging * EOAdaptors/PostgreSQLAdaptor/PostgreSQLCompatibility.h if 0 for now (please check if that code is still needed!) * EOAdaptors/PostgreSQLAdaptor/PostgreSQLPrivate.m fix header * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.m less logging * Apps/EOModelEditor * Apps/EOModelEditor/Inspectors propset svn:ignore * Apps/EOModelEditor/GNUmakefile add -lgnustep-baseadd on non-GNUstep 2010-05-30 David Wetzel * Apps/EOModelEditor * Apps/EOModeler Initial Version of EOModelEditor. Does not save Plists on OSX. Use at your own risk! 2010-05-30 David Wetzel * EOAccess/EOModel.m * EOAccess/EOAttribute.m * EOAccess/EODatabase.m * EOAccess/EOModelGroup.m * EOAccess/EOAccessFault.m * EOAccess/EOAdaptorOperation.m * EOAccess/EOEntity.m * EOAccess/EODatabaseOperation.m * EOAccess/EOAdaptor.m * EOAccess/EOSQLQualifier.m * EOAccess/EODatabaseDataSource.m * EOAccess/EOExpressionArray.m * EOAccess/EOAdaptorContext.m * EOAccess/EORelationship.m * EOAccess/EODatabaseContext.m * EOAccess/EOUtilities.m * EOAccess/EOSchemaGeneration.m * EOAccess/EOAdaptorChannel.m * EOAccess/EODatabaseChannel.m * EOControl/EOMutableKnownKeyDictionary.m * EOControl/EOEditingContext.m * EOControl/EODataSource.m * EOControl/EOAndQualifier.m * EOControl/EOKeyValueArchiver.m * EOControl/EOFaultHandler.m * EOControl/EOGenericRecord.m * EOControl/EOKeyComparisonQualifier.m * EOControl/EODetailDataSource.m * EOControl/EOCheapArray.m * EOControl/EOKeyValueQualifier.m * EOControl/EOObjectStoreCoordinator.m * EOControl/EOUndoManager.m * EOControl/EOClassDescription.m * EOControl/EOKeyValueCoding.m * EOControl/EONull.m * EOControl/EOGlobalID.m * EOControl/EOSortOrdering.m * EOControl/EOOrQualifier.m Remove lots of logging. 2010-05-30 David Wetzel * EOAccess/EOAttribute.m added attributeWithParent: definition: convenience method * EOAccess/EOAdaptorContext.m _channelDidInit: setDelegate * EOAccess/EODatabaseContext.m availableChannel: call registerChannel new method _fetchRawRowKeyPaths:fetchSpecification:entity:editingContext: * EOAccess/EODatabaseChannel.m raise NSInvalidArgumentException in init. initWithDatabaseContext: more checks * EOAdaptors/PostgreSQLAdaptor/PostgreSQLContext.m beginTransaction: more checks, raise NSInternalInconsistencyException 2010-05-26 David Wetzel * EOAccess/EOEntity.m added support for stored procedures 2010-05-19 David Wetzel * EOAccess/EOStoredProcedure.m setName: added loadAllModelObjects and checks setExternalName: add checks * EOAccess/EORelationship.m encodeIntoPropertyList: added code for ownsDestination and propagatesPrimaryKey from Sergey Golovin. 2010-05-16 David Wetzel * EOAccess/EOModel.m: entities: make sure we use a mutable array. Destroy _entities cache when adding a new one. (We run into wrong sorted arrays otherwise) * EOAccess/EOEntity.m: make setName: work * EOAccess/EORelationship.m add support for KVObserving. 2010-05-03 David Wetzel * EOAccess/EOAttribute.m: Add comment * EOControl/EOEditingContext.m: Do not raise on inserting bad objects for now (Non-EOCustomObject subclasses) * EOAccess/EORelationship.m * EOAccess/EOPrivate.h added + _joinSemanticForName: added + _nameForJoinSemantic: include JoinSemantic in description, use new methods in code. 2010-05-02 Matt Rice * DBModeler/ModelerTableEmbedibleEditor.h/m: Remove usage of NSMenuItem protocol. 2010-05-02 David Wetzel * DBModeler/Inspectors/AttributeInspector.* * DBModeler/Inspectors/GNUmakefile Moved to Renaissance for the Attribute Inspector * EOModeler/EOMInspector.m: load markup, not gorm 2010-04-29 David Wetzel * EOControl/EOMutableKnownKeyDictionary.m removed __PRETTY_FUNCTION__ from Asserts removed NSLogs * EOModeler/EOModelExtensions.m added - (NSString *)cScalarTypeString * DBModeler/CodeGenerator.h/m: new file Added a Code Generator like EOGenerator from www.rubicode.com * DBModeler/Modeler.m: use sel_isEqual to check menu * DBModeler/Resources/SQLGenerator.gsmarkup: make window resizeable * DBModeler/CodeGenerator.m: add credits for initialCapitalString and initialLowercaseString use ASSIGN() in generated code. 2010-04-26 David Wetzel * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.h/m added _evaluateExprInProgress _evaluateExpression:withAttributes: returns number of affected rows now. This removes the need for keeping the _pgResult alive. (and leak) fix includes for non-GNUstep platforms * EOAdaptors/PostgreSQLAdaptor/PostgreSQLContext.m fix includes for non-GNUstep platforms * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.m fix includes for non-GNUstep platforms * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m fix includes for non-GNUstep platforms * EOAccess/EODatabaseContext.m implemented _assertValidStateWithSelector: fixed leaks * EOAccess/Makefile.preamble: added -Werror-implicit-function-declaration * EOAccess/*: ported to new runtime and OS X * EOControl/EOMutableKnownKeyDictionary.*: ported, works for me, please double check * EOControl/EOEditingContext.m: added @implementation EOCustomObject (AssociationsHack) re-added registerAssociationForDeallocHack * EOControl/*: ported to new runtime and OS X EOInterface/* numberOfRowsInTableView returns NSInteger now EOModeler/EOModelerDocument.m: do not insert a model into EditingContext. EOModeler/EOModelerEditor.m: avoid crash 2010-04-21 Sergey Golovin * DBModeler/ConsistencyChecker.m (attributeDetailsCheckForModel:) Fix iterator variable. * EOAccess/EODatabaseContext.m (prepareForSaveWithCoordinator:editingContext:): Correct logic for primary key generation. 2010-04-21 David Ayers * EOControl/EOObserver.h (EODelayedObserver): Inherit from EOCustomObject to be able to rely on implicit breaking of connections during dealloc. * EOInterface/EOAssociation.m (establishConnection): Reactivate implicit connection handling. 2010-04-20 David Wetzel * EOAccess/EODatabaseContext.m: (-objectsWithFetchSpecification:editingContext:): Start transaction if none was in place before. * EOAccess/EOEntity.m: (-globalIDForRow:isFinal:) Create EOKeyGlobalID outside loop. 2010-04-19 Fred Kiefer * EOAccess/EOEntity.m: Use '||' instead of '|'. * Tools/eoutil.m: Implement -lossyASCIIString. 2010-04-19 Fred Kiefer * EOControl/EOMutableKnownKeyDictionary.h, * EOControl/EOMutableKnownKeyDictionary.m, * EOControl/EOCheapArray.h, * EOControl/EOCheapArray.m: Use NSUInteger and remove methods declared in super class. 2010-04-19 David Ayers * EOAccess/EODatabaseContext.m (qualifierForLockingAttributes:primaryKeyAttributes:entity:snapshot:) Revert rewrite. Adapt to NSUInteger. 2010-04-19 David Wetzel * EOInterface/EOAssociation.m: remove hacks * EOControl/EOEditingContext.m: remove hacks, adapt to EOCustomObject * EOControl/EOCustomObject.h/m: added code here * EOControl/EOClassDescription.h/m: adapt to EOCustomObject * EOControl/EOPrivate.h: adapt to EOCustomObject * EOControl/EOClassDescription.m:adapt to EOCustomObject * EOAccess/EODatabaseContext.m rewrote qualifierForLockingAttributes:primaryKeyAttributes:entity:snapshot: 2010-04-17 David Wetzel * EOCustomObject.h/m new class like in EOF3. Use this as your EO's superclass or use EOGenericRecords * EOControl/EOControl.h: add EOCustomObject.h 2010-04-14 David Ayers * EOMutableKnownKeyDictionary.h/m ([-initWithObjects:forKeys:count:]): * EOFault.h/m ([-retainCount]): * EOKeyGlobalID.h/m ([-hash]): * EOMultiReaderLock.m ([-tryLockForReading]): * EOCheapArray.h/m ([-initWithObjects:count:],[initWithCapacity:]): * EOGlobalID.h/m ([-hash]): Use NS(U)Integer instead of int. 2010-04-09 David Ayers * EOControl/EONSAddOns.h (GDL2_ActivateAllGDL2Categories): Remove obsolete declaration. * EOControl/EONSAddOns.m (GDL2_ActivateAll): Remove. (GDL2_Activate): Add assertions for parameters. * EOControl/EOClassDescription.m (+[GDL2CDNSObject load]) * EOControl/EOKeyValueCoding.m (+[GDL2KVCNSObject load]) (+[GDL2KVCNSArray load], +[GDL2KVCNSDictionary load]) (+[GDL2KVCNSMutableDictionary load]): Setup classes individually to insure the are available in the runtime. * EOControl/EOClassDescription.m * EOControl/EOKeyValueCoding.m: Add declartions for method replacement hack. * DBModeler/ModelerEntityEditor.m * DBModeler/ModelerTableEmbedibleEditor.m * DBModeler/ModelerAttributeEditor.m: Rearrange includes. * EOControl/EOGenericRecord.m (-_infoForInstanceVariableNamed:stringName:retType:retSize:retOffset:): Rearrange initialization to avoid warning. * EOInterface/EODisplayGroup.m (_qualifierForKey:value:defaultOperator:): * EOAccess/EOUtilities.m (-rawRowsWithStoredProcedureNamed:arguments:): * EOAccess/EOSQLExpression.m (addInsertListAttribute:value:): * GDL2Palette/ConnectionInspector.m (_keysFromClassDescription:): * DBModeler/Inspectors/AttributeInspector.m (setValueType:): * EOControl/EOSharedEditingContext.m (-objectsByEntityName, -objectsByEntityNameAndFetchSpecificationName) (objectForGlobalID:,faultForGlobalID:editingContext:,registeredObjects): Initialize variables. * DBModeler/Inspectors/AttributeInspector.m: Add missing guard to include. 2010-04-09 Fred Kiefer * EOInterface/EOPopUpAssociation.m * DBModeler/ModelerEntityEditor.m * DBModeler/ModelerTableEmbedibleEditor.m * DBModeler/ModelerAttributeEditor.m: Add missing includes. 2010-04-07 David Ayers * EOInterface/EOPopUpAssociation.m: Add missing include. Reported by: German Arias. 2010-03-30 Sergey Golovin * EOAccess/EORelationship.m (-[isToManyToOne]): Correct index used to retrieved second relationship. Bug #29369 2010-03-30 David Ayers * Tools/EOModel+GSDoc.m (-[gsdocContentSplittedByEntities:idPtr:]): Split out parameters into local variables. Fix format string to match parameters. Reported by: Federico Gimenez Nieto, Sergey Golovin. Fix reported by: Richard Frith-Macdonald. Bug #29191 * EOControl/EONSAddOns.m (GSUseStrictWO451Compatibility): Avoid usage of GS_INITIALIZED_LOCK. * EOControl/EOPrivate.h/m (GDL2_AssignAtomicallyIfNil): New convenience function for initializing variables in multithreaded environments. Reported by: Tim Kack Bug #28900 2010-03-15 Richard Frith-Macdonald * EOControl/EONSAddOns.h: * EOControl/EONSAddOns.m: * EOControl/EOKeyValueCoding.m: * EOControl/EOClassDescription.m: Rewrite mechanism to try to ensure that our implementations are used for KVC. New version should work with the objc runtime API. 2010-03-07 Matt Rice * DBModeler/DiagramView.m: Add missing include. 2010-02-11 Nicola Pero * EOControl/Makefile.postamble: Removed unused dependency rule. 2009-07-29 04:06-EDT Gregory John Casamento * EOControl/EOKeyValueArchiver.h: Add forward declaration of NSMutableArray. * EOControl/EOQualifier.h: Add missing include for NSArray. 2009-06-24 Georg Fleischmann 2009-06-24 David Ayers * EOAccess/EOPrivate.h (EOQualifier ): Declare. * EOAccess/EOSQLQualifier.m ([EOQualifier-schemaBasedQualifierWithRootEntity:]), ([EOQualifier-sqlStringForSQLExpression:]): Add preliminary dummy implementations. ([EONotQualifier-schemaBasedQualifierWithRootEntity:]): Implement. * EOAccess/EOSQLQualifier.m (-[initWithEntity:qualifierFormat:]): Implement. (-[schemaBasedQualifierWithRootEntity:]): Ditto. (-[sqlStringForSQLExpression:]): Ditto. (-[dealloc]): Ditto. * EOAccess/EOExpressionArray.m (-[valueForSQLExpression:): Use _infix instead of @"." and skip if _infix is not set. * EOAccess/EOSQLExpression ([EOSQLExpression-prepareSelectExpressionWithAttributes:]): Set listString for "flattened attributes" for aggregate definitions. 2009-06-01 Georg Fleischmann * EOAdaptor/PostgreSQLAdaptor/EOPostgreSQLExpression.m (+[formatValue:forAttribute:]): Do not escape underscore characters in values. 2009-06-01 David Ayers * EOControl/EOAndQualifier.m * EOControl/EOKeyComparisonQualifier.m * EOControl/EONotQualifier.m * EOControl/EOOrQualifier.m * EOControl/EOQualifier.m * EOAccess/EOSQLQualifier.m: Include NSArray.h. 2009-04-04 David Ayers * EOControl/EOUndoManager.m (-[registerUndoWithTarget:selector:arg:]): Defer to NSUndoManager's -[registerUndoWithTarget:selector:object:]. 2009-03-16 David Ayers * EOAccess/EODatabaseContext.m (setUpdateStrategy:): Count the snapshots to determine if we actually already have fetched them. Reported by: Thierry Delhaise 2009-03-03 Matt Rice * DBModeler/ModelerAttributeEditor.m (-displaygroupDidChangeSelection:): Activate self on selection change. * DBModeler/MainModelEditor.m (-_activateSelection): Move method to EOModeler. (viewSelectedObject): Remove method. (outlineViewSelectionDidChange:): Call -activateSelection. * EOModeler/EOModelerEditor.m: Add activateSelection extension/method. * EOModeler/EOModelerEditor.h: Ditto. * EOModeler/EOModelerDocument.m (-addAttribute): (-addRelationship): Add some Fixme's. Call -activateSelection on the editor. (-delete:): Revert the selection back to the viewed object, and activate the new selection. 2009-03-02 Matt Rice * DBModeler/ModelerAttributeEditor.m (dealloc): Remove observers and release the selection, remove unused ivar. (selectionDidChange:): Remove unused local. * DBModeler/ModelerAttributeEditor.h: Remove unused ivar. 2009-03-01 Matt Rice * DBModeler/Inspectors/AttributesInspector.m: Implement controlTextDidEndEditing:. * DBModeler/Inspectors/AttributesInspector.gorm: Set text field delegates, and nextKeyView. * DBModeler/Inspectors/RelationshipInspector.m (-awakeFromNib): Set text field delegate, implement controlTextDidEndEditing. * DBModeler/Resources/Preferences.gorm: Remove unimplemented outlets. * DBModeler/ModelerAttributeEditor.h: Add ivar. * DBModeler/ModelerAttributeEditor.m: Add EOObserving for the current selection. 2009-03-01 Matt Rice * EOAccess/EORelationship.m (-referencesProperty:): Check if property is the relationships destination entity. * EOModeler/EOModelerDocument (-delete:): Call referencesToProperty: on all model objects. 2009-02-27 Matt Rice * DBModeler/MainModelEditor.m: Implement -viewSelectedObject calling _activateSelection. * DBModeler/DiagramView.m: Include math.h. 2009-02-26 Matt Rice * EOInterface/EODisplayGroup.m: (-selectObjectsIdenticalTo:selectFirstOnNoMatch:): Disable some questionable code. (-setSelectedObjects:): Use a copy, not a mutable copy. * DBModeler/DiagramView.m (-orderViewFront:): Move the view to the end, not the beginning. (sortSubviews()): Flip the ascending/descending order. (showEntity:): floor randomly generated points. * DBModeler/MainModelEditor.m: Rename -viewSelectedObject method to _activateSelection. Remove calls to super viewSelectedObject. * DBModeler/ModelerAttributeEditor.m (-displayGroupDidChangeSelection): View the selected object when the current selection is the attribute editors entity. 2009-02-25 David Ayers * EOControl/EOEditingContext.m (_undoManagerCheckpoint:): Insure we only call _processEndOfEventNotification: if we already have a grouping level. 2009-02-21 Matt Rice * DBModeler/Modeler.m (-newFromDatabase:): Remove extra release. * DBModeler/DiagramView.m (-dealloc): Release model. 2009-02-20 David Ayers * Version 0.12.0 * ANNOUNCE: Update for release. * NEWS: Ditto. 2009-02-20 David Ayers * EOControl/gdl2.EOControl.make, * EOAccess/gdl2.EOAccess.make, * EOInterface/gdl2.EOInterface.make: Remove convenience make file fragements. * EOControl/Makefile.postamble, * EOAccess/Makefile.postamble, * EOInterface/Makefile.postamble: Remove references to convenience make file fragements. * README: Add documentation on usage of GDL2 components. Update versions of dependencies. Add documentation for some missing components. Remove obsolete documentation. Refer to TODO file for missing features. * TODO: Update. 2009-02-19 David Ayers * EOAccess/EOGenericRecord.h/m ([-entity]): New category. * EOAccess/GNUmakefile (EOGenericRecord): Build and install new category. * EOControl/EOPrivate.h/m (GDL2_isLegalDBName): New function. * EOQualifier.m (getKey): Validate qualifier bind variable key. 2009-02-18 David Ayers * configure.ac (disable-gui-projects): New option to disable builing of projects depending -gui/AppKit. Default to yes. (disable-gorm-palette): Default to the setting for enable-gui-projects. * configure: Regenerate. * GNUmakefile.in: Extract all GUI libs into variable. * Documentation/GDL2Intro/Examples: Move to ... * Examples: ... here. * Examples/GNUmakefile: Adapt to new location. * Documentation/GDL2Intro/GNUmakefile: Remove subproject. * Documentation/GDL2Intro/GDL2Intro.texi: Update references to new location. * Trading: Move to ... * Examples/Trading: ... here. * Examples/Trading/GNUmakefile: Adapte to new location. * Examples/GNUmakefile: Add Trading. * configure.ac (enable-examples): Allow examples to be built from top-level makefile. * GNUmakefile.in: Ditto. * configure: Regenerate. * GDL2.gsdoc: Update relative path to sub project documentation. 2009-02-18 Matt Rice * GNUmakefile.in: Add Trading subproject. * EOAccess/EORelationship.m (-_joinsChanged:): Set the destination to the first object. (-destinationEntity): Call _joinsChanged if the destination is nil. 2009-02-18 David Ayers * EOControl/Makefile.postamble * EOAccess/Makefile.postamble * EOInterface/Makefile.postamble (after-uninstall::) Remove make file fragments. * EOAccess/EOEntity.m (-dealloc): Invalidate class description cache. 2009-02-17 Matt Rice * EOAccess/EOEntityPriv.h: Remove GDL2DestinationEntitiesAddRelationship, and GDL2DestinationEntitiesRemoveRelationship. * EOAccess/EOEntity.m (+initialize, -dealloc): Remove usage and implementations of the above functions. * EOAccess/EORelationship.m (-initWithPropertyList:owner:): (-setDefinition:): Ditto. 2009-02-17 David Ayers * EOControl/gdl2.EOControl.make * EOAccess/gdl2.EOAccess.make * EOInterface/gdl2.EOInterface.make * EOControl/Makefile.postamble * EOAccess/Makefile.postamble * EOInterface/Makefile.postamble Install makefile fragments for each 'core' library which adds linker flags. 2009-02-17 Matt Rice * EOControl/EOEditingContext.m: Revert last patch. * EOControl/EOEditingContext.m: Add comment. 2009-02-17 Matt Rice * EOControl/EOEditingContext.m (_undoManagerCheckpoint:): call _processEndOfEventNotification by performing a selector through the runloop. 2009-02-02 Matt Rice * GDL2Palette/GNUmakefile: link to libGorm. * DBModeler/main.m: add hack for windows. 2009-01-31 Nicola Pero * EOAdaptors/SQLiteAdaptor/GNUmakefile.in (ADDITIONAL_NATIVE_LIB_DIRS): Fixed typo, it should link ../../EOControl, not ../EOControl. 2009-01-31 Nicola Pero * config/sqlite3.m4: Fixed typo in implementation of --with-sqlite3-library=xxx. * configure: Regenerated. 2009-01-29 Matt Rice * EOControl/EODefines.h: switch BUILD_libgnustep-db2control_DLL define to BUILD_libEOControl_DLL. * EOControl/EOGlobalID.m: include limits.h. * EOControl/EOPrivate.m: implement -copyWithZone: and -mutableCopyWithZone: in GDL2NonRetainingArray. * EOAccess/EODefines.h: switch BUILD_libgnustep-db2_DLL define to BUILD_libEOAccess_DLL. 2009-01-26 David Ayers * EOAccess/EOJoin.h: Update memory mangement comments. * EOAccess/EOJoin.m (dealloc): Implement. * EOAccess/EORelationship.m (dealloc,_flushCahce): Fix memory leaks. * EOAccess/EOAttribute.h: Update some signatures. 2009-01-25 Matt Rice * DBModeler/MainModelEditor.m: Implement -draggingSourceOperationMaskForLocal:. 2008-10-27 David Ayers * config.h.in (getRCSID): Mark inline to avoid compiler warnings. 2008-07-06 David Wetzel * EOControl/EOClassDescription.m (classDescriptionForClass:): Only register null internally if the notification returned nothing. Adjust NSLog typespeficier. 2008-06-06 Matt Rice * EOControl/EOPrivate.m (GDL2_PrivateInit): * EOAccess/EOPrivate.m (GDL2_AccessPrivateInit): Set initialized to YES. 2008-06-06 David Ayers * EOAccess/EOAttribute.m (-setDefinition:): Clear _columnName before calling _setIsEdited on the parent. Document. * EOAccess/EORelationship.h/m (-setInverseRelationship:): Rename to... (-_setInverseRelationship:): ... and move to local privat method. 2008-06-05 Matt Rice * EOAccess/EOModel.m (-setName:, -setAdaptorName:, -setDocComment): * EOAccess/EORelationship.m (-setName:, -setDocComment:): * EOAccess/EOStoredProcedure.m (-setName:, -setExternalName:): * EOAccess/EOAttribute.m (-setAdaptorValueConversionMethodName:) (-setName, -setColumnName:, -setExternalType:, -setValueType:): (-setValueClassName:, -setWriteFormat:, -setReadFormat:): (-setDocComment:, -setValueFactoryMethodName:): (-setAdaptorValueConversionMethodName:): Use ASSIGNCOPY instead of ASSIGN. * EOAccess/EOEntity.m (performSelectorOnArrayWithEachObjectOfClass()): Perform the selectors on a copy of the array. 2008-06-03 Matt Rice * README: Reflect name change of PostgreSQL adaptor, and addition of SQLite adaptor. Bump supported version of Postgres Adaptor. * README: Add Trading framework. * GNUmakefile: Ditto. * Trading/*: Initial import. 2008-05-29 Blake Nicholson * DBModeler/Modeler.m: Removed duplicate invocation of [adaptor runLoginPanel]. * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.m: Changed the panel's backing to NSBackingStoreBuffered instead of NSBackingStoreRetained. * GNUmakefile.in, EOInterface/GNUmakefile, EOAccess/GNUmakefile, DBModeler/Inspectors/GNUmakefile, DBModeler/GNUmakefile, Tools/GNUmakefile, EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile, EOAdaptors/SQLiteAdaptor/GNUmakefile.in, EOAdaptors/GNUmakefile.in, EOAdaptors/PostgreSQLAdaptor/LoginPanel/GNUmakefile, EOAdaptors/PostgreSQLAdaptor/GNUmakefile.in, EOControl/GNUmakefile, GDL2Palette/GNUmakefile, Documentation/GDL2Intro/GNUmakefile, Documentation/GDL2Intro/Examples/GNUmakefile, Documentation/GNUmakefile, EOModeler/GNUmakefile, common.make: Added logic to the local common.make to try to populate GNUSTEP_MAKEFILES by calling gnustep-config, if GNUSTEP_MAKEFILES is not already populated. 2008-05-27 Matt Rice * EOInterface/EOPopUpAssociation.m (subjectChanged:): Select the item with tag, not item with index of the tag. 2008-05-23 Blake Nicholson * DBModeler/AdaptorsPanel.m, DBModeler/AttributeCell.m, DBModeler/ConsistencyChecker.m, DBModeler/DefaultColumnProvider.m, DBModeler/DiagramView.m, DBModeler/EOAdditions.m, DBModeler/EntityView.m, DBModeler/GNUmakefile, DBModeler/KVDataSource.m, DBModeler/MainModelEditor.h, DBModeler/MainModelEditor.m, DBModeler/ModelerAttributeEditor.m, DBModeler/ModelerEntityEditor.h, DBModeler/ModelerEntityEditor.m, DBModeler/ModelerTableEmbedibleEditor.h, DBModeler/ModelerTableEmbedibleEditor.m, DBModeler/NSView+Additions.m, DBModeler/Preferences.m, DBModeler/SQLGenerator.m, DBModeler/Inspectors/AdvancedEntityInspector.m, DBModeler/Inspectors/AttributeInspector.h, DBModeler/Inspectors/AttributeInspector.m, DBModeler/Inspectors/RelationshipInspector.h, DBModeler/Inspectors/RelationshipInspector.m: Replaced tabs with spaces. 2008-05-22 Blake Nicholson * DBModeler/ModelerEntityEditor.m, DBModeler/ModelerAttributeEditor.m, DBModeler/MainModelEditor.m: Added preprocessor directives to wrap methods deprecated on OS X and to use recently introduced methods that yield a better NSTableView display. * configure.ac, GNUmakefile.in: Added logic to try to use gnustep-config to determine the value of GNUSTEP_MAKEFILES if it is not already set. * configure: Regenerated. 2008-05-13 Blake Nicholson * DBModeler/SQLGenerator.m: Updated to use new gsmarkup file. * DBModeler/Resources/SQLGenerator.gsmarkup: Initial import. * DBModeler/Resources/SQLGenerator.gorm: Removed. * DBModeler/GNUmakefile: Replaced the SQLGenerator.gorm resource with SQLGenerator.gsmarkup. Removed reference to ConsistencyResults.gorm. 2008-05-13 Matt Rice * DBModeler/Resources/Menu-{Cocoa,GNUstep}.gsmarkup: Remove a TODO for an old unused hack. * EOModeler/EOModelerDocument.m: Add some comments about the new hack. * DBModeler/Resources/ConsistencyResults.gsmarkup: initial import. * DBModeler/GNUmakefile: Add ConsistencyResults.gsmarkup. * DBModeler/ConsistencyResults.m: Use gsmarkup file. * DBModeler/Resources/ConsistencyResults.gorm: Remove file. 2008-05-12 Matt Rice * DBModeler/Resources/Menu-GNUstep.gsmarkup: Use openPrefs: action for preferences menu item. 2008-05-12 Blake Nicholson * Modeler.m: Use NULL instead of nil for an empty NSMenuItem action. Removed the main menu creation code. This is now handled by Renaissance. * DBModeler/GNUmakefile: Added DBModeler.icns to the list of resources, and set DBModeler_APPLICATION_ICON so the icon will be set appropriately. Added gsmarkup files for the main menu to the list of resources. Added dependency upon the Renaissance framework. * DBModeler/Resources/DBModeler.icns: Initial import * DBModeler/Resources/MainMenu-{Cocoa,GNUstep}.gsmarkup: Initial import. * DBModeler/main.m: Load the gsmarkup for the main menu. 2008-05-11 Blake Nicholson * GNUmakefile.in: Add EOInterface, EOModeler, and DBModeler to SUBPROJECTS if GUI_LIB is apple. * Modeler.m: Changed use of the NSMenuItem protocol to the NSMenuItem class. The NSMenuItem protocol is deprecated as of OS X 10.5. Modified the menu creation code so that it creates a native-looking menu on OS X. Added a top-level app menu, as well as a services menu. Whitespace clean-up. Changed everything to spaces. * AttributeCell.m (drawWithFrame:inView:): Changed access of instance variable to use an accessor method instead for showsFirstResponder. 2008-05-09 Blake Nicholson * DBModeler/*.[h,m]: Fix includes for OS X. * EOModeler/*.[h,m]: Fix includes for OS X. * EOModeler/EOModelerDocument.m: Add return statements to suppress warnings. * EOModeler/EOMInspectorController.m: Use -removeFromSuperview instead of -removeSubview. 2008-05-03 Matt Rice * EOAccess/EOEntity.m (-[isValidPrimaryKeyAttribute:], -[isValidAttributeUsedForLocking:], -[isValidClassProperty:]): Test object equality as well as name. 2008-05-01 David Ayers * EOAccess/EODatabaseContext.m ([-initializeObject:row:entity:editingContext:]): Remove debug logs. * EOAccess/EOEntity.m ([-_dictionaryForInstanceProperties], [-primaryKeyForGlobalID:]): Remove debug logs. 2008-05-01 Matt Rice * EOAccess/EOEntityPriv.h: Declare new private method _hasAttributeNamed:. * EOAccess/EOEntity.m (-_hasAttributeNamed:): New private method. (-anyAttributeNamed:): Add a comment. * EOAccess/EOAttribute.m (-validateName:): Use -_hasAttributeNamed: instead of -anyAttributeNamed: * EOAccess/EORelationship.m (-validateName:): Ditto. 2008-04-24 David Ayers * EOControl/EOQualifer.m: Include explicitly. (getKey): Accept pointer to a va_list instead of the value. Remove usage of useVAList (_qualifierWithArgs): Ditto. (qualifierWithQualifierFormat:arguments:): Pass NULL as va_list pointer anddrop obsoleted va_list variable and useVAList parameter. (qualifierWithQualifierFormat:varargList:): Copy va_list to local variable before passing a reference to it. 2008-04-03 Matt Rice * EOAccess/EOSQLExpression.m (-[prepareSelectExpressionWithAttributes:lock:fetchSpecification:)]: Conjoin the fetch specification qualifier with the restricting qualifier. 2008-04-03 Georg Fleischmann * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m ([+formatValue:forAttribute:]): Fix quoting. 2008-04-01 David Ayers * EOControl/EOKeyValueCoding.m ([NSArray-valueForKey:]): Readd special handling of @count. This make it WO45 compatible again. The intermediate behavoir broke many WO bindings. 2008-03-31 Matt Rice * EOAccess/EOStoredProcedure.m (initWithPropertyList:owner:), (encodeIntoPropertyList:): Change key from attributes to arguments. * EOAccess/EOAttribute.m (initWithPropertyList:owner:): Handle parameter direction being a string containing a number. Use boolValue instead of comparing against Y. * EOAccess/Entity.m (encodeIntoPropetyList:): Encode flags as strings. 2008-03-30 David Ayers * EOControl/EOQualifier.m (getKey): Fix parsing of '%%' as literal '%'. 2008-03-30 Matt Rice * EOControl/EOQualifier.m (_qualifierWithArgs), (+qualifierWithQualifierFormat:varargList:), (+qualifierWithQualifierFormat:arguments:) (getKey): Don't use a pointer to a va_list. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 Also move variable argument parameters to the end (_isLike): Fix a crash when matching the first character. Fix handling of '*?' glob, comment. (operatorSelectorForString:): Add contains. (stringForOperatorSelector:): Change string for not equals.. 2008-03-29 David Ayers * EOControl/EOQualifier.m ([-dealloc]): Remove empty implementation. ([+qualifierWithQualifierFormat:varargList:]): Move implementation to... (_qualifierWithArgs): ... new static function. Update getKey usage. ([+qualifierWithQualifierFormat:arguments:]): Implement via _qualifierWithArgs. (getKey): Add useVAList flag and optional enumerator to use instead. * EOAccess/EOEntity.m (initWithPropertyList:owner:): Call [EOQualifier+qualifierWithQualifierFormat:arguments:] to avoid invalid stack access. 2008-03-28 Matt Rice * EOAccess/EOEntity.m (initWithPropertyList:owner:): Pass format along as is. * EOControl/EOQualifier.m (getKey): Add some exceptions for invalid qualifier formats, and parse binding variables. (bindingKeys): Return the binding variable keys, not the qualifier keys with binding variable values. (EOQualifierVariable -description): Implement. 2008-03-17 David Ayers * EOControl/EOClassDescription.m ([NSObject-classDescriptionForClass:]): Post notification only the first time the description is needed. * EOControl/EOKeyValueCoding.m ([NSArray-computeCountForKey:): Handle extended aggregate keys. 2008-03-16 Matt Rice * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m, * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.h, * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.m: Add missing includes. * EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile, * EOAdaptors/PostgreSQLAdaptor/LoginPanel/GNUmakefile: Link to Foundation and AppKit frameworks on apple. 2008-03-16 Blake Nicholson * EOAdaptors/SQLiteAdaptor/SQLite3Context.m, * EOAdaptors/SQLiteAdaptor/SQLite3Channel.m, * EOAdaptors/SQLiteAdaptor/SQLite3Adaptor.m, * EOControl/EOPrivate.m, * EOControl/EOAggregateEvent.m, * EOAccess/EOPrivate.m: Add missing include. * EOAccess/EOAdaptor.m: Only use NSProprietaryStringEncoding where available. * Tools/gsdoc-model.m: Remove unused variables. * Tools/Makefile.preamble: Fix NATIVE_LIB_DIRS path. 2008-03-16 Matt Rice * EOInterface/EOAssociation.m ([+objectDeallocated:]): Use makeObjectsPerformSelector: instead of makeObjectsPerform:. * EOInterface/EORadioMatrixAssociation.m ([NSMatrix-_selectCellWithTitle:]): Do not access instance variables directly. Use accessor methods instead. * EOInterface/EOActionAssociation.m, * EOInterface/EOActionInsertionAssociation.m, * EOInterface/EOAspectConnector.m, * EOInterface/EOAssociation.m, * EOInterface/EOColumnAssociation.m, * EOInterface/EOComboBoxAssociation.m, * EOInterface/EODetailSelectionAssociation.m, * EOInterface/EODisplayGroup.m, * EOInterface/EOGenericControlAssociation.m, * EOInterface/EOMasterCopyAssociation.m, * EOInterface/EOMasterDetailAssociation.m, * EOInterface/EOMatrixAssociation.m, * EOInterface/EOPickTextAssociation.m, * EOInterface/EOPopUpAssociation.m, * EOInterface/EORadioMatrixAssociation.m, * EOInterface/EORecursiveBrowserAssociation.m, * EOInterface/EOTableViewAssociation.m, * EOInterface/EOTableViewAssociation.m, * EOInterface/EOTextAssociation.m, * EOInterface/NSImage+Additions.m: Add include for . 2008-03-16 Matt Rice * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m (-formatValue:forAttribute:): Use unichars, and getCharacter:. in case insertString: modifies the string buffer. * EOAdaptors/SQLiteAdaptor/SQLiteExpression.m (escapeString): Ditto. Rename to escapeValue, since it works on values other than strings. 2008-03-16 Tim McIntosh * EOControl/EOKeyValueCoding.m ([NSArray-valueForKey:],[NSArray-valueForKeyPath:]): Remove special handling of @count. This is not WO45 compatible but is more consistent with KVC in general and with current Cocoa implementations. Also any sane key path using count with WO45 semantics will continue to work as expected. This change could be reverted if a valid use case of WO45 behavior arises. ([NSArray-computeSumForKey:],[NSArray-computeAvgForKey:], [NSArray-computeMaxForKey:],[NSArray-computeMinForKey:]): Call valueForKeyPath: on components with the rest of the key path to allow for extended key paths. 2008-03-12 Matt Rice * EOInterface/Makefile.preamble, * EOInterface/GNUmakefile, * EOAccess/Makefile.preamble, * EOAdaptors/PostgreSQLAdaptor/Makefile.preamble, * EOControl/Makefile.preamble, * common.make, * EOModeler/Makefile.preamble: Add gcov flags. 2008-03-11 Matt Rice * EOAccess/EOModel.m (-addEntity:): Reword assertion message. (-_setEntity:forEntityName:className:): Add assertion. * EOAccess/EOAttribute.m (-initWithPropertyList:owner:): Validate the name. * EOAccess/EORelationship.m (-initWithPropertyList:owner:): Ditto. * EOAccess/EOEntity.m (-initWithPropertyList:owner:): Ditto. (-attributes): Remove checks for duplicate names. (-relationships): Remove checks for duplicate names. 2008-03-06 David Ayers * DBModeler/GNUmakefile, * DBModeler/Inspectors/GNUmakefile, * Documentation/GDL2Intro/Examples/GNUmakefile.connection, * Documentation/GDL2Intro/Examples/GNUmakefile.eoexample, * Documentation/GDL2Intro/Examples/GNUmakefile.eoexample2, * EOAccess/GNUmakefile, * EOAdaptors/PostgreSQLAdaptor/GNUmakefile.in, * EOAdaptors/PostgreSQLAdaptor/LoginPanel/GNUmakefile, * EOAdaptors/SQLiteAdaptor/GNUmakefile.in, * EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile, * EOControl/GNUmakefile, * EOInterface/GNUmakefile, * EOModeler/GNUmakefile, * GDL2Palette/GNUmakefile, * Tools/GNUmakefile (XXX_NEEDS_GUI): Use lowercase value. 2008-03-10 Matt Rice * EOAccess/EOAttribute.m (-setname:): Remove call to -_attributeNameChangedFrom:to:. * EOAccess/EOEntityPriv.h: Remove -_attributeNameChangedFrom:to:. * EOAccess/EOEntity.m (-attributes:): Don't handle both arrays of plists and arrays of EOAttributes in lazy loading code. Remove some logging, and assertions. (-attributes:): Don't handle both arrays of plists and arrays of EORelationships in lazy loading code, and don't clear the cache. Remove some logging and assertions. (-classProperties:): Fix warning. (-addAttribute:): Don't create _attributesByName as _setIsEdited: will set it to nil. (-removeAttribute:): Remove uneccessary call to -removeObjectForKey:. (-_setIsEdited:): Don't set _relationshipsIsLazy flag, and clean _attributesByName cache. (-_attributesNameChangedFrom:to:): Remove. (-attributesByName): Don't call -attributes unless _attributesIsLazy. recreate _attributesByName. (-relationshipsByName): Ditto for _relationshipsByName. * EOAccess/EORelationship.m (-setIsToMany): Test if the flag actually changes. Call -_setIsEdited. * TODO: Add an item. * DBModeler/Inspectors/RelationshipInspector.m: Fix row index check. * DBModeler/Inspectors/GNUmakefile: Use lower case in HAS_RESOURCE_BUNDLES. 2008-03-07 Matt Rice * EOAccess/EORelationship.m (_makeInverseRelationship): Call -setEntity: last to avoid unwanted calls to entity -_setIsEdited. 2008-03-07 Tim McIntosh * EOControl/EOFault.m ([+initialize]): Handle runtimes that do not implement forward:: on NSObject. ([-forward]): Update comment. 2008-03-07 Matt Rice * Documentation/GDL2Intro/Examples/GNUmakefile: Link in EOAccess and EOControl to reflect changes to gdl2.make. 2008-03-06 Matt Rice * DBModeler/Modeler.m, * EOAccess/EOEntityPriv.h, * EOAccess/EOModel.h/m, * EOAccess/EOEntity.h/m, * EOAccess/EORelationship.h/m: Remove setCreateMutableObjects: and createsMutableObjects. * EOAdaptors/SQLiteAdaptor/SQLiteChannel.m: Handle a null number value as the string "0". 2008-03-06 David Ayers * DBModeler/GNUmakefile, * DBModeler/Inspectors/GNUmakefile, * Documentation/GDL2Intro/Examples/GNUmakefile.connection, * Documentation/GDL2Intro/Examples/GNUmakefile.eoexample, * Documentation/GDL2Intro/Examples/GNUmakefile.eoexample2, * EOAccess/GNUmakefile, * EOAdaptors/PostgreSQLAdaptor/GNUmakefile.in, * EOAdaptors/PostgreSQLAdaptor/LoginPanel/GNUmakefile, * EOAdaptors/SQLiteAdaptor/GNUmakefile.in, * EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile, * EOControl/GNUmakefile, * EOInterface/GNUmakefile, * EOModeler/GNUmakefile, * GDL2Palette/GNUmakefile, * Tools/GNUmakefile (XXX_NEEDS_GUI): Set appropriately. * EOControl/EOFault.m ([-forward::]): Make dummy implementation. ([+initialize]): Adjust runtime to use NSObjects implementation of -forward:: to invoke fowardInvocation. Useful for OS X, reported my Tim McIntosh. * EOAccess/EORelationship.m ([-setEntity:]): Modify remove relatioship from previous entity and add recursion detection. Add documention. * EOAccess/EOEntity.m ([-removeRelationship:]): Move call to [EORelationship-setEntity:] to allow recursion detection. 2008-03-05 David Ayers * EOControl/EOKeyGlobalID.m ([+assignGloballyUniqueBytes:]): Handle IPv6 addresses gracefully. [BUG:22486 reported by Blake Nicholson]. 2008-02-06 David Ayers * EOControl/EODefines.h (GDL2CONTROL_EXPORT/DECLARE), * EOAccess/EODefines.h (GDL2ACCESS_EXPORT/DECLARE), * EOModeler/EODefines.h (GDL2MODELER_EXPORT/DECLARE): Synchronize dllimport/export handling for MinGW with -base. (Attempt to fix bug reported by Tim Kack) 2008-01-22 David Ayers * EOControl/EOClassDescription.h: Avoid unnecessary include. * EOControl/EOAndQualifier.m, * EOControl/EOFault.m, * EOControl/EOFaultHandler.m, * EOControl/EOKeyComparisonQualifier.m, * EOControl/EOKeyValueArchiver.m, * EOControl/EOKeyValueCoding.m, * EOControl/EOKeyValueCodingBase.m, * EOControl/EOMutableKnownKeyDictionary.h, * EOControl/EONotQualifier.m, * EOControl/EOOrQualifier.m, * EOControl/EOQualifier.m, * EOAccess/EOAdaptor.m, * EOAccess/EOAdaptorContext.m, * EOAccess/EOAttribute.m, * EOAccess/EODatabase.m, * EOAccess/EODatabaseContext.m, * EOAccess/EOExpressionArray.m, * EOAccess/EOJoin.m, * EOAccess/EOModel.m, * EOAccess/EOModelGroup.m, * EOAccess/EORelationship.m, * EOAccess/EOSQLExpression.m, * EOAccess/EOSQLQualifier.m, * EOAccess/EOSchemaGeneration.m, * EOAccess/EOStoredProcedure.m, * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.m, * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m, * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m, * EOAdaptors/SQLiteAdaptor/SQLite3Adaptor.m, * EOAdaptors/SQLiteAdaptor/SQLite3Channel.m, * EOInterface/EOTableViewAssociation.m, * EOModeler/EOModelExtensions.m, * EOModeler/EOModelerApp.m, * DBModeler/ModelerAttributeEditor.m, * DBModeler/ModelerEntityEditor.m: Remove references to NSUtilities.h. Add includes for missing header references. * DBModeler/Modeler.m (-[showEditor:]): Add cast to avoid compiler warning. 2008-01-22 Peter Cooper * Tools/NSArray+GSDoc.m: Include NSString.h ... * EOControl/EOClassDescription.h: Include NSDictionary.h to compile with new versions of -base/Foundation. 2007-11-27 David Ayers * EOControl/EOClassDescription.h/m ([NSObject-validateTakeValue:forKeyPath:]): Implement. 2007-11-21 David Ayers * EOAdaptors/PostgreSQLAdaptor/Makefile.preamble (ADDITIONAL_NATIVE_LIB_DIRS): Correct include path. (ADDITIONAL_LIB_DIRS): Remove redundant directives. 2007-11-21 David Ayers * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m: ([EOAttribute-_valueTypeCharacter]): Correct references from _valueTypeChar. ([PostgreSQLChannel+initialize]): Ditto. (newValueForNumberTypeLengthAttribute): Ditto. Handle nil return value of valueType. Bug reported by: Eric Johns . 2007-10-31 David Ayers * Makefile.postamble (after-distclean::): Remove generated GNUmakefile. * gdl2.make.in (ADDITIONAL_NATIVE_LIBS): Don't force linking of any GDL2 libraries just to get the version. [API Change]. * variable-processing.make: Remove file (functionality is now supplied by -make). * EOInterface/GNUmakefile, EOAccess/EOModelGroup.m, EOAccess/GNUmakefile, EOControl/GNUmakefile, DBModeler/GNUmakefile, Tools/GNUmakefile, GDL2Palette/GNUmakefile, EOModeler/GNUmakefile, EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile, EOAdaptors/PostgreSQLAdaptor/LoginPanel/GNUmakefile: Remove reference to variable-processing.make. * EOControl/EOGenericRecord.m ([-_infoForInstanceVariableNamed:stringName:retType:retSize:retOffset:]): Use marker that matches underlying type signedness. ([-_getValueForKey:selector:type:size:offset:], [-_setValueForKey:selector:type:size:offset:]): Match 'offset' with underlying type signedness and update marker. ([-storedValueForKey:],[-takeStoredValue:forKey:], [-takeValue:forKey:]): Update signedness of offset to avoid compiler warnings. * EOControl/EOClassDescription.m ([NSObject-validateValue:forKey:]): Correct signedness of 'buf'. * EOControl/EOPrivate.m (GDL2_PrivateInit): Fix assignemnt of GDL2_EOEditingContext_recordObjectGlobalIDIMP. * EOAccess/EOModelGroup.m ([EOObjectStoreCoordinator-modelGroup]): Correct method signature to avoid compiler warnings. * DBModeler/EntityView.m ([-mouseDown:]): Match class with return type of initializer method to avoid compiler warnings and unnecessary cast. * EOAdaptors/SQLiteAdaptor/SQLite3Channel.m (newNumberValue): Change type of 'data' to match usage. ([-fetchRowWithZone:]): Cast return type of sqlite3_column_text to match expected usage to avoid compiler warnings. 2007-08-17 David Ayers * COPYING.LIB: Update to LGPL 3. * DB2Modeler/COPYING: Update to GPL 3. * *.*: Update copyright notices. 2007-07-11 David Ayers * Version 0.11.0 * README: Update prerequisites and project names. * TODO: Update. * INSTALL: Remove reference to GNUSTEP_SYSTEM_ROOT. * ANNOUNCE: Update for release. * NEWS: Ditto. 2007-07-11 David Ayers * EOControl/EOAggregateEvent.h/m: New files with stub implementations. * EOControl/GNUmakefile: Add EOAggregateEvent.h/m. * EOAccess/EOSchemaSynchronization.h/m: New files with stub implementations. * EOAccess/GNUmakefile: Add EOSchemaSynchronization.h/m. 2007-05-05 Matt Rice * EOInterface/EODisplayGroup.m (-deleteObjectAtIndex:): * EOModeler/EOModelerDocument.m (-adaptor, -saveToPath:): Return with NS_VALUERETURN from within exception handling block. 2007-05-02 David Ayers * EOAdaptors/PostgreSQLAdaptor/LoginPanel/GNUmakefile, * EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile: Include variable-processing.make. 2007-05-01 David Ayers * Documentation/GDL2Intro/GDL2Intro.texi: Cleanup node structure to avoid build failure during documentation build. * Documentation/GDL2Intro/Examples/connection.m, * Documentation/GDL2Intro/Examples/eoexample.m, * Documentation/GDL2Intro/Examples/eoexample2.m: Minor formatting tweaks for documentation build. * EOAccess/EORelationship.m, * EOAccess/EOAttribute.h, * Tools/EOEntity+GSDoc.m, * Tools/EOAttribute+GSDoc.m: Remove references to GC-classes in comments. 2007-04-16 David Ayers * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m (newValueForDateTypeLengthAttribute): Correct determination of seconds and milliseconds. Make optimization explicit. [BUG:19503 reported by Manuel Guesdon]. 2007-03-10 David Ayers * EOAdaptors/SQLiteAdaptor/LoginPanel/Makefile.postamble: Replace spaces with tab. * Makefile.postamble: Replace INSTALL_ROOT_DIR with DESTDIR. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m (_evaluateExpression:withAttributes:): Use the channel's encoding. 2007-02-22 Manuel Guesdon * EOAccess/EODatabaseContext.h (recordChangesInEditingContext): Collect propagations in collections and then execute recordToManySnapshot:dbOpes:, nullifyAttributesInRelationship:relationships: and relayAttributesInRelationship:relationships: at the end. 2007-02-18 Nicola Pero * configure.ac: Check for GNUSTEP_MAKEFILES, not GNUSTEP_SYSTEM_ROOT. * configure: Regenerated. 2007-01-25 Matt Rice * EOAccess/EOModel.h: Forward declare NSMutableArray class. * GDL2Palette/README: Document some pitfalls due to lack of project management app support. 2007-01-11 Matt Rice * GDL2Palette/README: New file. * EOInterface/TODO: New file. * GDL2Palette/ResourceManager.m: Uncomment some code. * GDL2Palette/ResourceManager.m: Add .eomodel files in the document path. 2007-01-10 Matt Rice * DBModeler/AdaptorsPanel.m: Add responder chain, key equivalents, autosize controls, and don't release the window when closed. * DBModeler/Resources/ConsistencyResults.gorm: Add responder chain. * DBModeler/Resources/Preferences.gorm: Add responder chain. * DBModeler/Resources/SQLGenerator.gorm: Add responder chain. * DBModeler/Preferences.m (-switchButtonChanged:): Handle -1 as no row selected. * DBModeler/EntityView.m: Call supers dealloc not release. * DBModeler/EntityView.h: Fix method declaration. * DBModeler/DiagramView.h: Ditto. * EOAdaptors/PostgreSQLAdaptor/LoginPanel/PostgreSQLLoginPanel.m: Fix typo. 2007-01-08 Matt Rice * Documentation/GDL2Intro.texi: Add a chapter on EOInterface. 2007-01-06 Matt Rice * EOAdaptors/SQLite3/SQLite3Channel.m (-evaluateExpression:): Continue evaluating the expression until all statements are evaluated or rows are returned. * Documentation/GDL2Intro.texi: Add another section on relationships. * Documentation/Examples/library.eomodel: Add relationships as class properties. * Documentation/Examples/GNUmakefile: Add GNUmakefile.eoexample2. * Documentation/Examples/GNUmakefile.eoexample2: New file. * Documentation/Examples/eoexample2.m: New example for relationships. * EOAdaptors/SQLite3Expression.m: Implement +dropDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary: and +foreignKeyConstraintStatementsForRelationship: to return empty arrays. 2007-01-05 Matt Rice * Documentation/GDL2Intro/GDL2Intro.texi: Add more docs. * Documentation/GDL2Intro/Examples/eoexample.m: Use an EODatabaseDatasource. * Documentation/GDL2Intro/Examples/connection.m: Load the model file manually if it cannot be found. * Update Email address for Matt Rice. 2007-01-04 David Ayers * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.m (assignExternalInfoForEntity:): Remove method replicated from superclass. * EOControl/EOKeyValueCoding.m (computeAvgForKey:): Return zero for empty arrays. 2007-01-03 Matt Rice * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m: Remove NSLog. * Documentation/GDL2Intro/GDL2Intro.texi: Add more documentation. * Documentation/GDL2Intro/library.eomodel: Add a connection dictionary. 2007-01-02 Matt Rice * EOAdaptors/SQLiteAdaptor/GNUmakefile.in: Add login panel. * EOAdaptors/SQLiteAdaptor/LoginPanel: New directory. * EOAdaptors/SQLiteAdaptor/LoginPanel/GNUmakefile: New file. * EOAdaptors/SQLiteAdaptor/LoginPanel/Makefile.postamble: Ditto * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.m: Ditto. * EOAdaptors/SQLiteAdaptor/LoginPanel/SQLite3LoginPanel.h: Ditto. * variable-processing.make: Add comments. * GNUmakefile.in: Add Documentation subproject. * Documentation: New Directory. * Documentation/GDL2Intro: Ditto. * Documentation/GDL2Intro/Examples: Ditto. * Documentation/GDL2Intro/GDL2Intro.texi: New file. * Documentation/GDL2Intro/GNUmakefile: Ditto. * Documentation/GDL2Intro/Examples/GNUmakefile: Ditto. * Documentation/GDL2Intro/Examples/example.GNUmakefile: Ditto. * Documentation/GDL2Intro/Examples/GNUMakefile.connection: Ditto. * Documentation/GDL2Intro/Examples/GNUmakefile.eoexample: Ditto. * Documentation/GDL2Intro/Examples/eoexample.m: Ditto * Documentation/GDL2Intro/Examples/connection.m: Ditto. * Documentation/GDL2Intro/Examples/library.eomodel: Ditto. * EOControl/EOMutableKnownKeyDictionary.h/m: Remove usage of GCObject. * EOControl/EOFault.h/m: Ditto. * EOControl/EOFaultHandler.m: Ditto. 2007-01-01 David Ayers * EOAccess/EOAccessFault.h/m: Minor cleanups for autogsdoc. * EOAccess/EOAdaptor.m: Ditto. * EOAccess/EOAdaptorChannel.h/m: Ditto. * EOAccess/EOAdaptorContext.h: Ditto. * EOAccess/EODatabase.h/m: Ditto. * EOAccess/EODatabaseChannel.m: Ditto. * EOAccess/EODatabaseContext.h/m: Ditto. * EOAccess/EODatabaseDataSource.h: Ditto. * EOAccess/EODatabaseOperation.h: Ditto. * EOAccess/EOEntity.h/m: Ditto. * EOAccess/EOModel.h/m: Ditto. * EOAccess/EORelationship.h: Ditto. * EOAccess/EOSchemaGeneration.h: Ditto. * EOAccess/EOUtilities.h/m: Ditto. * EOAccess/EOSQLExpression.h/m: Minor cleanups for autogsdoc. (EOSchemaGeneration): Move implementation from here to ... * EOAccess/EOSchemaGeneration.m: ... new file for autogsdoc. * EOAccess/GNUmakefile: Add EOSchemaGeneration.m. * EOAccess/EOUtilities.m (EOObjectStoreCoordinator EOModelGroup): Move implementation from here to ... * EOAccess/EOModelGroup.m: ... to here for autogsdoc. * common.make: (GDL2_AGSDOC_FLAGS): Add extern declarations. 2006-12-31 David Ayers * EOAdaptors/PostgreSQLAdaptor/PostgreSQLValues.h/m: Remove files. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLPrivate.h/m Remove references to PostgreSQLValues. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m: Ditto. * EOAdaptors/PostgreSQLAdaptor/GNUmakefile.in: Ditto. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.m (attrRespondsToValueClass, attrRespondsToValueTypeChar) (newValueForNumberTypeLengthAttribute) (newValueForCharactersTypeLengthAttribute) (newValueForBytesTypeLengthAttribute) (newValueForDateTypeLengthAttribute) (newValueForBytesLengthAttribute) ... to static inline functions here. (getDigits): New support function. (__dummy_function_used_for_linking) Remove link hack. (initialize): Initialize new static variables. Use new static inline functions instead of PostgreSQLValues. (NSS_SWF): Remove macro in favor of real method name. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLChannel.h (encoding): New instance variable. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.h (PostgreSQLException): Move declation for documentation. 2006-12-30 David Ayers * EOControl/GNUmakefile: Simplify documentation declarations. * EOAccess/GNUmakefile: Ditto. * EOInterface/GNUmakefile: Ditto. * Tools/GNUmakefile: Ditto. * common.make (ADDITIONAL_LIB_DIRS): Move handling from here... * variable-processing.make: ... to new file. * EOControl/GNUmakefile: Use variable-processing.make. Include common.make early. * EOAccess/GNUmakefile: Ditto. * EOInterface/GNUmakefile: Ditto. * Tools/GNUmakefile: Ditto. * DBModeler/GNUmakefile: Ditto. * EOModeler/GNUmakefile: Ditto. * GDL2Palette/GNUmakefile: Ditto. * EOControl/EOFetchSpecification.h/m: Cleanup for documentation generation. * EOControl/EOGenericRecord.m: Ditto. * EOControl/EOClassDescription.h/m: Ditto. * EOControl/EONSAddOns.m: Ditto. * EOControl/EOObjectStore.h: Ditto. * EOControl/EOEditingContext.h: Ditto. * EOControl/EODataSource.m: Ditto. * EOControl/EOKeyValueArchiver.h/m: Ditto. * EOControl/EOFault.h/m: Ditto. * EOControl/EOObserver.h: Ditto. * EOControl/EOEventCenter.m: Ditto. * EOControl/EOMultiReaderLock.m: Ditto. * EOControl/EOKeyGlobalID.h/m: Ditto. * EOControl/EOObserver.m: Ditto. * EOControl/EOEvent.m: Ditto. * EOControl/EOObjectStoreCoordinator.h: Ditto. * EOControl/EODeprecated.h: Ditto. * EOControl/EOUndoManager.m: Ditto. * EOControl/EOKeyValueCoding.h/m: Ditto. * EOControl/EOQualifier.h: Ditto. * EOControl/EOClassDescription.h/m (editingContext): Remove duplicate declartion and definition (see EOEditingContext.h/m) * EOControl/EOFetchSpecification.h (EOPrefetchingRelationshipHintKey) (EOFetchLimitHintKey, EOPromptsAfterFetchLimitHintKey): Remove deprecated declarations. * EOAccess/EOAttribute.m: Cleanup for documentation. * EOAccess/EOAttribute.m (newValueForBytes:length:encoding:): Avoid creating intermediate NSData object. * EOControl/EOControl.gsdoc: Added Documentation. * EOControl/EOUndoManager.h: Remove content of deprecated header and add warning. * common.make (GDL2_AGSDOC_FLAGS): Add global GDL2 documenation flags. * config.h.in (RCSID): Avoid reserved names by relying in static declarations and avoid recursive call. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLAdaptor.m (assignExternalInfoForAttribute:) Move implementation to... (assignExternalTypeForAttribute:) ...here. * Version: Update variable names. 2006-12-28 Matt Rice * EOAdaptors/PostgreSQL/LoginPanel/GNUmakefile: Fix path to NATIVE_LIB_DIRS. * GDL2Palette/DisplayGroupInspector.m: Call super dealloc. * GDL2Palette/ResourceManager.m: Add comment. * DBModeler/DefaultColumnProvider: Set switch buttons to ineditable. * ChangeLog: Add missing entries... 2006-12-26 Matt Rice * EOModeler/EOModelerDocument.m (-saveToPath:): Handle saving with a .eomodel extension. * EOAccess/EOEntity.m (-dealloc): Only set parents to nil properties which have been fully loaded. * EOAdaptors/PostgreSQL/LoginPanel/GNUmakefile: Remove references to libgnustep-db2control/access * DBModeler/MainModelEditor.m: Set the windows title. 2006-11-16 Matt Rice * EOControl/EOObserver.m: Use an NSHashTable to store observers. Check that objects and observers are not nil. 2006-11-15 Matt Rice * EOControl/EOObserver.m: Fix leak when removing observers. 2006-10-23 Matt Rice * EOAccess: Revert previous changes. * EOAccess/EOModel.m (-dealloc): Set entities model to nil. * EOAccess/EOEntityPriv.h: Add functions for maintining list of relationships and their destination entities. * EOAccess/EOEntity.m: Implement new functions. (-dealloc:): Set attributes entities, and relationships source and destinations entities to nil. (+initialize:): Initialize static map table. * EOAccess/EORelationship.m: Call functions to maintain destination entities. * EOAccess/EOEntity.m (-dealloc): Add missing calls to release, reorganize. * EOAccess/EOEntity.m: Break retain cycle for parent/sub entities. 2006-10-22 Matt Rice * EOAccess/EOPrivate.h: Add notification constants. * EOAccess/EOAttribute.m: Observe EOEntity's notification. * EOAccess/EORelationship.m: Observe EOEntity's notification. * EOAccess/EOModel.m: Post notification when deallocating. * EOAccess/EOEntity.m: Post notification when deallocating, and observe EOModels notification. 2006-10-14 Matt Rice * EOAccess/EOAttribute.m: Remove usage of GCObject, and its subclasses. * EOAccess/EOModelGroup.h: Ditto. * EOAccess/EOStoredProcedure.m: Ditto. * EOAccess/EOModelGroup.m: Ditto. * EOAccess/EOExpressionArray.h: Ditto. * EOAccess/EORelationship.h: Ditto. * EOAccess/EOExpressionArray.m: Ditto. * EOAccess/EOEntity.h: Ditto. * EOAccess/EOEntity.m: Ditto. * EOAccess/EOJoin.h: Ditto. * EOAccess/EOModel.h: Ditto. * EOAccess/EOAttribute.h: Ditto. * EOAccess/EOAttributePriv.h: Ditto. * EOAccess/EOJoin.m: Ditto. * EOAccess/EORelationship.m: Ditto, and don't retain source and * EOAccess/EOStoredProcedure.h: Ditto, and don't retain model. * EOAccess/EOModel.m: Ditto. (-addStoredProcedure:): Fix error when using non-mutable objects. (-dealloc): Add missing ivars. destination entities. * EOAccess/GNUmakefile: Remove slash on last header file. * EOControl/EOPrivate.m: Update comment. 2006-10-14 David Ayers * EOAccess/EOAdaptor.m (databaseEncoding): Use NSStringEncoding enum symbols instead of literal values. 2006-10-13 Matt Rice * EOModeler/EOModelerDocument.m (-windowWillClose:): If document owns the current editor, reset the seletion path, and unset the current editor. * EOModeler/EOModelerInspectorController.m (-selectionChanged:): handle an empty selection path. * EOModeler/EOModelerApp.m: Remove usage of EOModel -setCreatesMutableObjects:. * EOModeler/EOModelerEditor.m (EOModelerCompoundEditor -setSelectionPath:): Fix if statement which always returned yes. * DBModeler/MainModelEditor.m: Add more information to comment. * EOModeler/EOModelerApp.h: Whitespace changes. 2006-10-13 David Ayers * EOAccess/EOAdaptor.m (databaseEncoding): Reimplement to not rely in GSEncodingName. 2006-10-09 Nicola Pero * EOInterface/GNUmakefile: Do not set GNUSTEP_INSTALLATION_DIR. * EOAccess/GNUmakefile: Same change. * DBModeler/Inspectors/GNUmakefile: Same change. * DBModeler/GNUmakefile: Same change. * Tools/GNUmakefile: Same change. * EOAdaptors/PostgreSQLAdaptor/GNUmakefile.in: Same change. * EOAdaptors/SQLiteAdaptor/GNUmakefile.in: Same change. * EOAdaptors/PostgreSQLAdaptor/LoginPanel/GNUmakefile: Same change. * EOControl/GNUmakefile: Same change. * GDL2Palette/GNUmakefile: Same change. * EOModeler/GNUmakefile: Same change. 2006-10-09 Matt Rice * DBModeler/Modeler.m: Add ability to change the editor. * DBModeler/MainModelerEditor.m (-activateEmbeddedEditor:): Don't modify editors view subview resizing behaviour. Dont call supers implementation until we have resized the subview. * DBModeler/GNUmakefile: Add new files. * DBModeler/Resources/Key_Diagram.tiff * DBModeler/Resources/Locking_Diagram.tiff * DBModeler/Resources/ClassProperty_Diagram.tiff * DBModeler/AttributesCell.{h,m} * DBModeler/DiagramView.{h,m} * DBModeler/DiagramEditor.{h,m} * DBModeler/EntityView.{h,m} * DBModeler/NSView+Additions.{h,m}: New files, initial implementation of diagram editor. 2006-10-03 Matt Rice * EOAccess/EOEntity.m (-awakeWithPropertyList:): Setup the connection to the parent entity. (-encodeIntoPropertyList:): Encode the parent entity name. (-init): Initialize the _subEntities ivar. (-addSubEntity:): Pass correct argument. * EOAccess/EOModel.m (-encodeTableOfContentsIntoPropertyList:): encode the parent entity name. (-_addEntityWithPropertyList): Call -awakeWithPropertyList: 2006-10-02 Matt Rice * EOAccess/EOEntityPriv.h: Rename setParentEntity: to _setParentEntity:. * EOAccess/EOEntity.m (-addSubEntity:): Ditto. (-removeSubEntity:): Ditto, and check that self is the parent before setting to nil. 2006-10-01 Matt Rice * EOAdaptors/SQLiteAdaptor/: Initial import of SQLite3 adaptor. * configure: Regenerate. * config/sqlite3.m4: New file. * configure.ac: Add detection for sqlite3. * EOAdaptors/SQLiteAdaptor/SQLite3SQLExpression.m: Override createDatabase method. * configure: Regenerate. * configure.ac: Change SUBPROJECTS to GUI_SUBPROJECTS to reflect what its for. * GNUmakefile.in: Ditto, and move so its compiled after EOInterface * EOModeler/EOMInspector.h: Add IBOutlets. * DBModeler/Inspectors/AttributeInspector.m: Remove unused ivar. * DBModeler/Inspectors/GNUmakefile: Add AdvancedEntityInspector. * DBModeler/Inspectors/AdvancedEntityInspector.[h,m,gorm]: New files. * DBModeler/GNUmakefile: Remove subprojects hack. * GDL2Palette/GNUmakefile: Ditto. * GDL2Palette/ResourceManager.m: enable the creation of parent assocation when creating a EOMasterDetailDisplayGroup. * DBModeler/DefaultColumnProvider.h/m: declare default columns as extern. * EOAccess/EOEntity.m (-addSubEntity:): Remove the child as a sub-entity of its previous parent. * DBModeler/Inspectors/AdvancedEntityInspector.[h,m,gorm]: add ability to set parent entity. * GDL2Palette/KeyWrapper.h: Add QueryType. * GDL2Palette/ConnectionInspector.m: add/remove comments. 2006-09-28 Matt Rice * EOAccess/EOSQLExpression.m (+createTableStatementsForEntityGroup:) (+dropTableStatementsForEntityGroup:) (+primaryKeySupportStatementsForEntityGroup:) (+createTableStatementsForEntityGroup:): Return an empty array for abstract entities. * EOAdaptors/PostgreSQLAdaptor/PostgreSQLExpression.m (+dropTableStatementsForEntityGroup:): Ditto. * EOAccess/EODatabase.m (-snapshots): Return an autoreleased copy. 2006-09-27 Matt Rice * EOInterface/EODisplayGroup.m (-selectNext): Implement. (-selectPrevious): Ditto. (-enabledToSetSelectedObjectValueForKey:): Handle query mode. 2006-09-22 Matt Rice * EOInterface/EODisplayGroup.m (-enabledToSetSelectedObjectValueForKey:) (-qualifierFromQueryValues:) (-equalToQueryValues:),(-setEqualToQueryValues:) (-greaterThanQueryValues:),(-setGreaterThanQueryValues:) (-lessThanQueryValues:),(-setLessThanQueryValues:) (-qualifyDisplayGroup), (-qualifyDataSource): Implement. (-_queryDictForOperator:): New private method. (-_qualifierForKey:value:defaultOperator:): Ditto. (-setValue:forObject:key:): Handle @query keys. 2006-09-20 Matt Rice * EOInterface/EOGenericControlAssociation.m (-endEditing): Fix copy/paste error. * GDL2Palette/Palette.[hm]: Load bundles from GDL2PaletteBundles key. * GDL2Palette/ConnectInspector.m: Replace static map table with walking the list of connectors. * EOInterface/EODeprecated.h: Fix typo. * DBModeler/*.[hm] * GDL2Palette/*.[hm]: Update copyright. 2006-09-19 Matt Rice * GDL2Palette/KeyWrapper.h: Add LocalType. * GDL2Palette/ConnectInspector.m (_localKeysFromDisplayGroup): New method. (updateValues:): Add local keys. (_oaBrowserAction:): Enable ok button for LocalType. Handle relationships explicitly (browser:willDisplayCell:atRow:column:): Enable and set leaf for LocalType keys. * GDL2Palette/DisplayGroupInspector.[hm]: Add editor for local keys. * GDL2Palette/GDL2DisplayGroupInspector.gorm: Ditto. * GDL2Palette/DisplayGroupInspector.m: -revert: update local keys. 2006-09-18 Matt Rice * DBModeler/SQLGenerator.m (-executeSQL:): Fix memory leak, Remove a hack, add a FIXME. * EOInterface/EODisplayGroup.m (-initWithCoder:): Move fetching on load to -awakeFromNib * GDL2Palette/DisplayGroupInspector.[hm] * GDL2Palette/GDL2DisplayGroupInspector.gorm: New files. * GDL2Palette/IB+Categories.m: Add display group Inspector. 2006-09-17 Matt Rice * DBModeler/SQLGenerator.m * Tools/eoutil.m: change Postgres to PostgreSQL. 2006-09-16 Matt Rice * EOAccess/EOModel.m (writeToFile:): Use the default permissions on .eomodeld files. 2006-09-16 Matt Rice * DBModeler/Resources/AllowsNull_On.tiff: New file. * DBModeler/GNUmakefile: Add new file. * DBModeler/DefaultColumnProvider.m: Reorder table columns. Use new file, for allows null column. Remove out of date comments. * DBModeler/Resources/AllowsNull_Header.tiff: New file. * DBModeler/GNUmakefile: Add new file. * DBModeler/DefaultColumnProvider.m: Set column header image. * DBModeler/Inspectors/AttributeInspector.[hm]: Implement valueType pop-up button, and add macro to clean up some code. * DBModeler/Inspectors/AttributeInspector.gorm: Ditto. * DBModeler/Inspectors/AttributeInspector.[hm]: Merge private dictionarys without conflicting keys. Replace Integer/Double types with a generic Number type. * DBModeler/Inspectors/AttributeInspector.gorm: Update interface for 'Number'. 2006-09-16 David Ayers * EOAccess/EOAttribute.[hm]: Add documentation. (_valueTypeChar): Replace char type with ... (_valueTypeCharacter): ... unichar type. ([_valueTypeCharacter): Add comment about caching issue. 2006-09-15 Matt Rice * EOInterface/EODisplayGroup.m: Correct selector name. * EOInterface/EOTableViewAssociation.m: Remove observer notification suppression. * DBModeler/Modeler.m: Add some debug code. * DBModeler/Inspectors/AttributeInspector.h/m: Implement. * DBModeler/Inspectors/AttributeInspector.gorm: Update interface. * DBModeler/ModelerTableEmbedibleEditor.m: Send notification on displayGroup:didSetValue:forObject:key. 2006-09-15 Matt Rice 2006-09-15 David Ayers * EOAdaptors/Postgres95/{*,*/*}: Rename from Postgres95 to PostgreSQL. * Tools/eoutil.m: Ditto. * DBModeler/SQLGenerator.m: Ditto. * EOAdaptors/Postgres95/*.h/m: Rename files from Postgres95 to PostgreSQL. * EOAdaptors/PostgreSQLAdaptor/LoginPanel/Makefile.postamble: Remove symlink creation/removal. * DBModeler/Resources/ModelDrag.tiff: Update Image. * DBModeler/Resources/DBModeler.tiff: Correct image format. 2006-09-14 Matt Rice * GNUmakefile.in: Remove reference to config.make 2006-09-14 Matt Rice * configure: Regenerate. * common.make: New file. * config.make.in: Remove. * GNUmakefile: Ditto. * GNUmakefile.in: New file, merges config.make.in and GNUmakefile. * configure.ac: Remove config.make.in, add GNUmakefile.in. * EOInterface/Makefile.preamble * EOInterface/GNUmakefile * EOAccess/Makefile.preamble * EOAccess/GNUmakefile * EOControl/GNUmakefile * EOControl/Makefile.preamble * DBModeler/GNUmakefile * Tools/Makefile.preamble * EOAdaptors/Postgres95/Makefile.preamble * GDL2Palette/GNUmakefile * gdl2.make.in * EOModeler/GNUmakefile * EOModeler/Makefile.preamble: Change to compile as native libraries. * DBModeler/Inspectors/AttributeInspector.gorm/data.info: * DBModeler/Inspectors/AttributeInspector.gorm/data.classes: * DBModeler/Inspectors/AttributeInspector.gorm/objects.gorm: Implement interface. 2006-09-14 David Ayers * EOAdaptors/Postgres95/GNUmakefile.in: Install into GNUSTEP_SYSTEM_ROOT by default. * Update email addresses for Mirko Viviani and David Ayers. 2006-09-14 David Ayers * Version 0.10.1 * README: Correct modeler application name. * ANNOUNCE: Update to followup release. * NEWS: Ditto. 2006-09-14 David Ayers * EOInterface/GNUmakefile * DBModeler/Inspectors/GNUmakefile * DBModeler/GNUmakefile * EOAdaptors/Postgres95/LoginPanel/GNUmakefile * GDL2Palette/GNUmakefile: Add missing copyright notices. Install into GNUSTEP_SYSTEM_ROOT by default. 2006-09-14 David Ayers * Version 0.10.0 * ANNOUNCE: New file. 2006-09-13 Matt Rice * EOControl/EOObserver.m (EOObserverCenter +_forgetObject:): New private method. (+notifyObserversObjectWillChange:): Change omniscient observer arguments. * EOControl/EOEditingContext.m (NSObject -dealloc): Call _forgetObject:. * EOControl/EOPrivate.h: Add category for EOObserverCenter private methods. 2006-09-12 David Ayers * Version: Update to 0.10.0 * GNUmakefile: Set package name for release targets. * EOAccess/EOSQLExpression.h (deleteStatementWithQualifier:entity:) * EOAccess/EOSQLExpressionPriv.h (_aliasForRelationshipPath:) (_flattenRelPath:entity:, _aliasForRelatedAttribute:relationshipPath:) * EOAccess/EOSQLExpression.m (insertStatementForRow:entity:) (updateStatementForRow:qualifier:entity:) (deleteStatementWithQualifier:entity:) (selectStatementForAttributes:lock:fetchSpecification:entity:) (_aliasForRelationshipPath:) * EOAccess/EORelationship.h (intermediateEntity) (_foreignKeyForSourceRow:) * EOAccess/EORelationship.m (_foreignKeyForSourceRow:, _leftSideKeyMap) * EOAccess/EODatabaseContext.h (databaseOperationForObject:) (databaseOperationForGlobalID:, recordDatabaseOperation:) (_openChannelWithLoginPanel:) * EOAccess/EODatabaseContextPriv.h (primaryKeyForObject:) (_currentCommittedSnapshotForObject:) * EOAccess/EOEntityPriv.h (_keyMapForRelationshipPath:) (_keyMapForIdenticalKeyRelationshipPath:, _mapAttribute:) (_relationshipPathIsToMany: valueForSQLExpression:) (_parsePropertyName:, classPropertyAttributeNames) (classPropertyToManyRelationshipNames) (classPropertyToOneRelationshipNames, dbSnapshotKeys) * EOAccess/EOUtilities.m (rawRowsForEntityNamed:qualifierFormat:) (rawRowsMatchingValue:forKey:entityNamed:) (rawRowsMatchingValues:entityNamed:, rawRowsWithSQL:modelNamed:) (rawRowsWithStoredProcedureNamed:arguments:) (executeStoredProcedureNamed:arguments:, databaseContextForModelNamed:) (primaryKeyForObject:) (destinationKeyForSourceObject:relationshipNamed:) * EOAccess/EOEntity.m (_mapAttribute:toDestinationAttributeInLastComponentOfRelationshipPath:) * EOAccess/EOAdaptor.h (adaptorWithModel:,adaptorWithName:) * EOAccess/EOModel.h (_classDescriptionNeeded:,_entityForClass:) (_addEntityWithPropertyList:) * EOAdaptors/Postgres95/Postgres95Channel.h (_evaluateExpression:withAttributes:) * EOControl/EOMutableKnownKeyDictionary.h/m (arrayMappingForKeys:) (subsetMappingForSourceDictionaryInitializer:sourceKeys:destinationKeys:) (subsetMappingForSourceDictionaryInitializer:) (setObject:forKey:, removeObjectForKey:, indexForKey:, objectForKey:) * EOControl/EOEditingContext.m (handleErrors:,setSharedEditingContext:) (faultForRawRow:entityNamed:) * GDL2Palette/KeyWrapper.h (setKey:, _key): * EOModeler/EOModelerEditor.h (selectionWithinViewedObject) * EOModeler/EOModelerEditor.m (initWithDocument:) (initWithParentEditor:) Correct method signatures. Add necessary forward @class declations. * EOInterface/EOMasterDetailAssociation.m (establishConnection): * DBModeler/ModelerTableEmbedibleEditor.m (addDefaultTableColumnsForTableView:displayGroup:) * DBModeler/DefaultColumnProvider.m (setupTitleForColumn:named:) Cast types to avoid compiler warnings. * EOControl/EOCheapArray.m (dealloc): Supress compiler warning. * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.m (dealloc) * EOModeler/EOModelerEditor.m (dealloc): * DBModeler/ModelerAttributeEditor.m (dealloc): Add missing call to super. * DBModeler/Preferences.m (sharedPreferences): Fix implementation for new compiler semantics. * EOControl/EOMultiReaderLock.m (init): Correct NSConditionLock initialization. * EOInterface/EOInterface.gsdoc: New file. * EOInterface/GNUmakefile: Update variables to build documentation. * EOAccess/EOAccess.gsdoc: Specify title. * EOControl/EOControl.gsdoc: Ditto. * GDL2.gsdoc: Use sections allowed by DTD. Remove reference to MulleEOInterface. * README: Update dependencies. Remove reference to external EOInterface implementation. Update comments about DBModeler. * NEWS: Mention major features of current release. 2006-09-07 Matt Rice * DBModeler/Resources/DBModeler.tiff: New file. * DBModeler/Resources/Locking_Header.tiff: Ditto. * DBModeler/Resources/Key_On.tiff: Add check box background. * DBModeler/Resources/Info-GNUstep.plist: Update info panel copyright. * DBModeler/ModelerEntityEditor.m (-dealloc): Don't set the datasource to nil, its handled in EODisplayGroup -dealloc. 2006-05-09 Matt Rice * EOInterface/EOAssociation.m (-establishConnection): Simplify to allow posing. (-canBindAspect:displayGroup:key:): Return YES by default. * EOInterface/EOTextAssociation.m: Minor formatting issue. Include privat header: (-subjectChanged): Set empty string when nil/null value is set. * EODisplayGroup.m (-initWithCoder:): Fetch when auto fetch is enabled. (-setObjectArray:): Select new selected objects. (-redisplay): Don't call notifyObserversObjectWillChange: explicitly. (-setSelectionIndexes:): Implement displayGroup:didChangeSelection: handling. (-selectObjectsIdenticalTo:): Reimplement. (-selectObjectsIdenticalTo:selectFirstOnNoMatch:): Ditto. (-deleteSelection): Ditto. (-insertObject:atIndex:): Fix redisplay timing with respect to delegate. (-deleteObjectAtIndex:): Implement. (-association:failedToValidateValue:forKey:object:errorDescription:) Ditto. (-editorHasChangesForEditingContext:): Ditto. (-editingContextWillSaveChanges:): Ditto. (-setValue:forObjectAtIndex:key:): Validate index range. (-objectsChangedInEditingContext:): Add workaround until issues can be investigated. * EOInterface/EOMasterDetailAssociation.m (subjectChanged): Qualify datasource's relationship independent of selected object. * EOInterface/EOTableViewAssociation.m (associationClassesSuperseded): Implement. (subjectChanged): Reimplement. (tableViewSelectionDidChange:): Ditto. * EOModeler/EOMInspector.h * EOModeler/EOMInspector.m: Cleanups. (selectedObjects): Reimplement. (selectedObject): Return last viewed path if no selection was made. * EOModeler/EOModelerDocument.m: Reimplement. * EOModeler/EOMInspectorController.m (init): Ditto. (-_selectionChanged:): Ditto. (-_selectInspector:): Implement and renamed from selectInspector:. * EOModeler/EOModelerEditor.h * EOModeler/EOModelerEditor.m: Add documentation. (-initWithDocument:): Initialize instance variable. (-debugSelectionPath): Implement. (-[EOModelerCompoundEditor initWithDocument:]): Remove initializtation. (-[EOModelerCompoundEditor selectionDidChange]): Implement. (-[EOModelerCompoundEditor setSelectionPath:]): Call selectionDidChange instead of sending notifcation directly. (-[EOModelerCompoundEditor viewSelectedObject]): Implement. (-[EOModelerEmbedibleEditor dealloc]): Implement. (-[EOModelerEmbedibleEditor initWithParentEditor:]): Observe EOMSelectionChangedNotification. DBModeler/ConsistencyChecker.m (+modelConsistencyCheck:): Honor validation preferences. DBModeler/Modeler.m (-new:): Reimplement. (-setAdaptor:): Bail out it adaptor cannot be located. (-application:openFile:): Fine tune path checking and correct return values. (-openPrefs:): Implement. * DBModeler/Inspectors/RelationshipInspector.m (-displayName): Implement. (-selectedEntity): Validate selected row before commencing. (-selectedDestinationAttribute): Reimplement. (-updateConnectButton): Update enabled state of connect button. (-refresh): Correct handling of src/destAttrib_tableView. (-tableViewSelectionDidChange:): Allways call updateConnectButton. * DBModeler/SQLGenerator.m (-openSQLGenerator:): Reimplement. (-executeSQL:): Handle invalid adpator or connection information. (-saveAs:): Handle abort correctly. (-generate): Handle missing expression class. * DBModeler/ModelerTableEmbedibleEditor.h * DBModeler/ModelerEntityEditor.m (initWithParentEditor:): Correct autoresize behavior. (-activate): Update selection. (-needToFetch:): Do not reloadData in _topTable. (-displayGroupDidChangeSelection:): Update selection on parent. * DBModeler/ModelerTableEmbedibleEditor.m (-addDefaultTableColumnsForTableView:displayGroup:): Call tile instead of sizeToFit. * DBModeler/EOAdditions.m: Fix leaks. (setIsClassProperty): Reimplement. (-[setIsPrimaryKey:]): Ditto. (-[setIsClassProperty:]): Correct call to function. (-[isUsedForLocking]): Implement. (-[setIsUsedForLocking:]): Ditto. * DBModeler/MainModelEditor.h * DBModeler/MainModelEditor.m: Update view handling. * DBModeler/DefaultColumnProvider.m: Update handling of properties. * DBModeler/ModelerAttributeEditor.m: Update general GUI interaction. * DBModeler/Preferences.h: New file. * DBModeler/Preferences.m: Ditto. * DBModeler/Inspectors/RelationshipInspector.tiff: New file. * DBModeler/Inspectors/GNUmakefile: Add new file. * DBModeler/Resources/Preferences.gorm: New files. * DBModeler/Resources/Key_Header.tiff: Ditto. * DBModeler/Resources/ClassProperty_Header.tiff: Ditto. * DBModeler/Resources/Locking_On.tiff: Ditto. * DBModeler/Resources/Key_On.tiff: Ditto. * DBModeler/GNUmakefile: Add new files. * GDL2Palette/KeyWrapper.h: New file. * GDL2Palette/KeyWrapper.m: Ditto. * GDL2Palette/ConnectionInspector.h * GDL2Palette/ConnectionInspector.m (init): Initialize _values. (-awakeFromNib): Update handling of horizontal scroller. (-_associationClassesUsableWithObject:): Implement. (-setObject:): Fix assignment issues. (-_keysFromClassDescription:): Implement. (-_keysFromArray:): Ditto. (-updateValues): Reimplement. (-_oaBrowserAction:): Ditto. (-browser:numberOfRowsInColumn:): Refine implementation. (-browser:willDisplayCell:atRow:column:): Reimplement. (-ok:): Update associations in active document. * GDL2Palette/ResourceManager.m (defaultEditingContext): Try to find defaultEditingContext in document objects. (addResourcesFromPasteboard:): Reimplement. * GDL2Palette/Foundation+Categories.m: (arrayWithObjectsRespondingYesToSelector:): Fix leak. (arrayWithObjectsRespondingYesToSelector:withObject:): Ditto. * GDL2Palette/GNUmakefile: Use PALETTE_LIBS instead of ADDITIONAL_LDFLAGS to link libraries. Add new files. * GDL2Palette/GDL2Palette.tiff: New file. * GDL2Palette/GDL2ConnectionInspector.gorm: New files. 2006-05-09 Matt Rice David Ayers * configure.ac (gorm-palette): Add configure option to exclude building of palette until auto detection works reliably. * config.make.in: New file. * configure: Regenerate. * GNUmakefile: Include new file. * Makefile.postamble: Remove generated config.make on distclean. 2006-04-24 David Ayers * EOControl/EOGenericRecord.m ([_getValueForKey:selector:type:size:offset:]): Replace deprecated use of GSObjCGetValue with GSObjCGetVal. ([_setValueForKey:selector:type:size:offset:]): Replace deprecated use of GSObjCSetValue with GSObjCSetVal. * EOControl/EOKeyValueCoding.m ([NSObject takeValue:forKey:]): Replace deprecated use of GSObjCSetValue with GSObjCSetVal. [Report #16429] * EOAdaptors/Postgres95/Postgres95Private.m (PSQLA_postgresCalendarFormat): Change format from to include milliseconds suggested by: Sergey Golovin, svgol at mail dot ru. 2006-03-19 Matt Rice * EOControl/EODetailDataSource.m (-editingContext): Return the master data sources editing context. * EOControl/EOGlobalID.m (-description): Correct conversion specification. * EOAccess/EOModel.m (-referencesToProperty:): Implement. * EOAccess/EORelationship.m (-referencesProperty:): Fix bug in or when sending messages to nil. (-validateName:): Return nil if the name is the properties current name. * EOAccess/EOModel.m (-validateName:): Ditto. * EOAccess/EOEntity.m (-validateName:): Ditto. (-relationships): Handle partially converted relationships array. (-addAttribute:): Remove unnecessary cast. (-addRelationship:): Ditto. (-removeAttribute): Remove property from the class properties and primary key attributes arrays. (-removeRelationship:): Remove property from the class properties array. (-_setIsEdited:): Rebuild _relationshipsByName. * EOAdaptors/Postgres95/Postgres95SQLExpression.m: Fix warning. * EOAdaptors/Postgres95/Postgres95Values.m: Remove c99 usage. * EOAccess/EOEntity.m (-relationships): Fix whitespace from previous commit. 2005-12-18 Matt Rice * EOAdaptors/Postgres95/LoginPanel/postgreslogo.tif: New file. * EOAdaptors/Postgres95/LoginPanel/GNUmakefile: Add postgreslogo.tif * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.[h/m]: Show logo, and make the login panel more visually appealing. Switch databases table view to a NSComboBox. * DBModeler/KVDataSource.m: Return nil in unimplemented methods with return values. * EOAdaptors/Postgres95/Postgres95Adaptor.m: Add braces to typeNames to avoid warnings 2005-12-18 David Ayers * AUTHORS: Add Matt Rice. * GDL2.gsdoc: Ditto. * EOControl/EOMultiReaderLock.[h/m]: New files. * EOControl/EOControl.h: Add EOMultiReaderLock.h. * EOControl/GNUmakefile: Add EOMultiReaderLock.h/m. * EOAccess/EOAttribute.m: Translate comment to avoid non-ASCII encoding. * EOControl/EOEvent.[hm]: New files. * EOControl/EOEventCenter.[hm]: New files. * EOControl/EOControl.h: Add EOEvent.h and EOEventCenter.h. * EOControl/GNUmakefile: Add EOEvent.h/m and EOEventCenter.h/m. * EOControl/EOGlobalID.m (-[EOGlobalID copyWithZone:]): Optimize to return self as GIDs are immutable and they are used as dictionary keys which are generally copied. (-[EOTemporaryGlobalID copyWithZone:]): Remove. (-[EOTemporaryGlobalID description]): Implement. * EOControl/EOKeyGlobalID.m (-[EOKeyGlobalID copyWithZone:]): Remove. * EOControl/EOEditingContext.m (-[forgetObject:]: Clear registered snapshots. 2005-12-05 David Ayers * EOControl/EOQualifier.m (getKey): Fix parsing of 'nil' EOKeyValueQualifiers. 2005-11-30 David Ayers * EOControl/EOQualifier.m (cimSEL, spaceSet, alnumSet, digitSet) (spaceCIM, alnumCIM, digitCIM): New static globals for unichar handling. ([+initialize]): Initialize new variables. (getOperator, getKey, isNotQualifier, whichQualifier): Use unichar instead of char. ([+qualifierWithQualifierFormat:varargList:]): Ditto. (_isLike): Handle unichar characters. 2005-11-28 David Ayers * EOControl/EOSharedEditingContext.[hm]: New files. * EOControl/EOEditingContext.[hm]: Use EOSharedEditingContext. (sharedEditingContext, setSharedEditingContext:): New methods. (-initWithParentObjectStore:): Handle EOSharedEditingContext. (-dealloc, -faultForGlobalID:editingContext:): Ditto. (-objectForGlobalID:, -globalIDForObject:): Ditto. (-initializeObject:withGlobalID:editingContext:): Ditto. (-refaultObject:withGlobalID:editingContext:): Ditto. (-_processInitializedObjectsInSharedContext:): New method. (-_defaultEditingContextNowInitialized:): Ditto. (-_objectsInitializedInSharedContext:) Ditto. (-_defaultSharedEditingContextWasInitialized:) Ditto. * EOControl/EOControl.h: Added EOSharedEditingContext.h. * EOControl/GNUmakefile: Added EOSharedEditingContext.[hm]. 2005-11-02 David Ayers * EOAdaptors/Postgres95/Postgres95Adaptor.m (typeNames): Add serial and serial8 from patch 1777 from Simon Stapleton. 2005-10-02 David Ayers * EOControl/EOAndQualifier.m, * EOControl/EOKeyComparisonQualifier.m, * EOControl/EOKeyValueQualifier.m, * EOControl/EOOrQualifier.m: ([-description]) Make qualifiers user presentable like in WO. (-[debugDescription]): New deprecated method for old description. * EOControl/EOKeyValueCoding.h/m (unableToSetNullForKey:): Remove deprecated -base/Foundation hook. (setNilValueForKey:) Override new hook to call unableToSetNilForKey:. (unableToSetNilForKey:): Raise exception as documented. (takeValue:forKey:): Implement here to avoid deprecation warning. (takeValue:forKeyPath:): Ditto. (takeValuesFromDictionary:): Ditto. 2005-08-25 Manuel Guesdon * EOAccess/EOSQLQualifier.m: change in EOAndQualifier and EOOrQualifier -schemaBasedQualifierWithRootEntity to allow nil schemaBasedQualifier. fix in EOKeyValueQualifier -schemaBasedQualifierWithRootEntity: to handle key like rel1.rel2.rel3 (see Testsuite EOKeyValueQualifier01.m) * EOAccess/EOSQLExpression.m: added NSAssert in -sqlStringForKeyValueQualifier: * EOAccess/EORelationship.m: added NSAssert in setDefinition: 2005-08-24 Manuel Guesdon * EOControl/EOEditingContext.m: fix _processRecentChanges for insert+delete before saving changes (see EOEditingContext03 in Testsuite) 2005-08-23 Manuel Guesdon * EOAdaptors/Postgres95/Postgres95Private.m: added PSQLA_NSDateClass initialization in PSQLA_PrivInit() * EOAdaptors/Postgres95/Postgres95SQLExpression.m: fix initialized in +initialize 2005-08-23 Manuel Guesdon * EOControl/EOGenericRecord.m: fix -willChange call (don't call it for takeStoredValue:forKey and for -setXX method). * EOControl/EOClassDescription.m: check if value is not already set before adding/setting it in _setObject:forBothSidesOfRelationshipWithKey: and addObject:toBothSidesOfRelationshipWithKey: * EOAccess/EOAttribute.m: log in -validateValue: 2005-08-17 David Ayers * COPYING.LIB: Update to LGPL 2.1. * configure: Regenerate. * Update FSF Address and Copyright years. * EOControl/EOEditingContext.m ([-_processRecentChanges]): Invert logic for propagating deletes. ([-saveChanges]): Propagate deletes if they were not propagated yet. * EOControl/EOPrivate.h (EOHashAddTable): New compatibility function. * EOAccess/EODatabaseContext.m ([-dealloc], [-rollbackChanges]) ([-_cleanUpAfterSave]): Guard against missing hash table. ([-registerLockedObjectWithGlobalID:]): Reformat. 2005-07-10 Matt Rice * DBModeler/Modeler.m (_newDocumentWithModel:): Don't release the model. (-new:): Release the model here. (-newFromDatabase:): Ditto, and add error handling. (-open:): Ditto. (-application:openFile:): New method. * EOModeler/EOModelerDocument.m (-saveAs:): Add error handling, and remove check for an existing name. 2005-07-10 Peter Cooper * DBModeler/GNUmakefile: Add Info-gnustep.plist to project. 2005-07-10 Peter Cooper * DBModeler/Resources/Info-gnustep.plist: New file. * DBModeler/Modeler.m (-applicationWillFinishLaunching:): Rearrange menu layout. 2005-07-09 Matt Rice * DBModeler/ConsistencyChecker.m: New variable doc. (+endConsistencyCheck:): Use the notification object. Use unsigned for array iterators. (pass): Use the new doc variable. (+attributeDetailsCheck:): Use unsigned for array iterators. (+inheritanceCheckForModel:, +relationshipCheckForModel:): Ditto. (+primaryKeyCheckForModel:, +externalNameCheckForModel): Ditto. (+modelConsistencyCheck:): Assign doc to the notification object. 2005-07-09 Matt Rice * EOModeler/EOMInspectorController.m (-init): Don't release the window on close. (_selectionChanged:): Fix view swapping. Set view as needing display. * EOModeler/EOModelExtensions.m: (+mutableAttributedStringWithBoldSubstitutionsWithFormat:): Implement. * EOModeler/EOModelerApp.h: Add -removeDocument:, -documentAtPath:, and -loadDocumentAtPath: methods. * EOModeler/EOModelerApp.m (-init:): Add parentheses around assignment. (-allPasteboardTypes): Initial implementation. (-removeDocument:): If removing the active document, set the active document to nil. (-documentWithPath:): Change array iterators to unsigned. (-registerColumNames:forClass:provider:): Ditto. (-modelContainingFetchSpecification:): Temporarily return nil. (-nameForFetchSpecification:): Ditto. * EOModeler/EOModelerDocument.h: Declare consistency check notification constants. Add -adaptor, -appendConsistencyCheckErrorText:, -appendConsistencyCheckSuccessText:, -addEntity:, -addRelationship, -addAttribute and -delete. * EOModeler/EOModelerDocument.m: Add consistency check notification constants. Add private category interface. (-firstSelectionOfClass:): Change array iterators to unsigned. Remove debugging logs. (-validateMenuItem:): Initial implementation. (-initWithModel:): Add parentheses around assignment. Add the model to the default model group. (-dealloc, -delete:): Initial implementation. (-isDirty, -prepareToSave,-checkCloseDocument): Return no temporarily until implemented. (-saveToPath:): Break long messages into separate lines. (-addDefaultEditor:, -addEntity:, -addAttribute:): Ditto. (-addRelationship:, ): (-activate): Remove commented out code. (-closeEditor:, -checkCloseEditor:): Add comments. (-canFlattenSelectedAttribute): Add temporary return value. (-windowWillClose:): Remove self from the open documents. (-checkConsistency:): Implement. (-appendConsistencyCheckErrorText:): Ditto. (-appendConsistencyCheckSuccessText:): Ditto. * EOModeler/EOModelerEditor.m (-initWithDocument:): Add parentheses around assignment. Don't retain our document. (-selectionPath:, -viewedObjectPath): Return nil. (-[EOModelerCompoundEditor dealloc]): Implement. (-[EOModelerCompoundEditor initWithParentObject:): Add parentheses around assignment. (-[EOModelerEmbedibleEditor pathViewPreferenceHint:): Return nil. * EOModeler/GNUmakefile: Remove extra whitespace. 2005-07-08 Matt Rice * EOInterface/EOAssociation.m: New variable _objectToAssociations. (+objectDeallocated:): New private method. (+initialize): initialize _objectToAssociations. (-dealloc): Discard any pending notifications. (-establishConnection): Retain display groups we're bound to. Retain our self and register our object for dealloc notification. (-breakConnection): Release display groups we're bound to. Release our self and discard any pending notifications. (-subjectChanged): Add comment * EOInterface/EOColumnAssociation.m (-establishConnection): Assign our dg ivar after establishing connection. Use the dg ivar and move 2 if statements into one. * EOInterface/EODisplayGroup.m: Remove debugging class/category for emptyArray and emptyDictionary. (-indexesForObjectsIndeticalTo:): Fix typo by renaming to -indexesForObjectsIdenticalTo:. (-dealloc): Remove our self as an observer for any notifications, as an editor or message handler for our editing context, our observer proxies as observers from the observer center. Don't release array/dictionary ivars that are emptyArray or emptyDictionary. (-setSelectionIndexes:): Update to reflect change in method name. (-deleteSelection): Remove unused local var. (-fetch:): Call -redisplay. (-updatedObjectIndex:): Return -1 instead of 0 until this is implemented. (-setValue:forObject:key:): fix comment in exception handlers. * EOInterface/EOGenericControlAssociation.m: (-subjectChanged:): Remove unused local variable. * EOMasterDetailAssociation.m: (-establishConnection, -breakConnection, -subjectChanged): Implement. * EOInterface/EOPopUpAssociation.m: Remove unused local variables. * EOInterface/EOTableViewAssociation.m: (-breakConnection:): Remove our NSTableView object from the map table. (-subjectChanged:): Remove unused local variables. Release temporary retain on selection indexes. (+bindToTableView:displayGroup:): Don't retain the table views in the map table. Release the newly created association. (-dealloc): Remove self from the tvAssociationMap. * EOInterface/SubclassFlags.h: Fix bitmask on MatchKey1AspectMask. 2005-07-08 Matt Rice * DBModeler/AdaptorsPanel.m (-init): Add parenthesis around assignment. Replace label with window title. (-runAdaptorsPanel:): Remove unused variable. * DBModeler/DefaultColumnProvider.m: Add missing braces, remove unused ivars. (-cellForColumnNamed:): Autorelease cells. * DBModeler/EOAdditions.m: New EOAttribute KVC methods -allowNull and -setAllowNull:. * DBModeler/GNUmakefile: Add new to project. * DBModeler/KVDataSource.m (-createObject:): Return nil after throwing exception. * DBModeler/MainModelEditor.m (-dragImageForRows:event:dragImageOffset:):: Enable drag and drop for relationships. (-initWithDocument:): Add parenthesis around assignment. Don't release the document window on close. (-ecStuff:): temporarily reload everything in the outline view when something changes. (-viewSelectedObject:): Remove NSLog. Rewrite editor activation. Fix leaks. * DBModeler/Modeler.m (-applicationWillFinishLaunching:): Add new menu items. Don't order our menu in. (-new:,-open:): Move document initializition to _newDocumentWithModel:. (-_newDocumentWithModel:,-newFromDatabase:): New methods. (-validateMenuItem:,-generateSQL:): Ditto. * DBModeler/ModelerAttributeEditor.m (-initWithParentEditor:): Remove unused variables. (-displayGroupDidChangeSelection:): return early if there is no longer a selection. * DBModeler/ModelerEntityEditor.m: (-canSupportCurrentSelection): Remove NSLog. (-displayGroupDidChangeSelection:): Ditto. (-dealloc:): New method. (-initWithParentEditor:): Remove unused variables. Add parens around assignment. Release local variables. * DBModeler/ModelerTableEmbedibleEditor: (-addDefaultTableColumnsForTableView:displayGroup:): Release table columns. (-addTableColumnForItem:tableView:): Ditto. * DBModeler/Inspectors/RelationshipInspector.m: (-selectedEntity, -selectedDestinationAttribute): New methods. (-selectedSourceAttribute, -indexOfSourceAttribute:): Ditto. (-indexOfDestinationAttribute:,joinWithSource:destination:): Ditto. (-selectedJoin:,updateConnectButton,): Ditto. (-refresh): Rewrite using new methods. (-numberOfRowsInTableView:): Add fallback return value. (-tableView:objectValueForTableColumn:row:): Ditto. (-tableView:selectionDidChange:): If a source or destination attribute is now selected, select its counterpart. (-tableView:shouldSelectRow:): New method to disallow entity selection if there is a destination entity. (-tableView:willDisplayCell:forTableColumn:row:): New method, set the cell text color to disabled text color, if we would disallow selection. (-connectionChanged:): Implement disconnection. * DBModeler/SQLGenerator.h/m: New files initial implementation. * DBModeler/Resources/SQLGenerator.gorm: Ditto. * DBModeler/ConsistencyChecker.h/m: Ditto. * DBModeler/ConsistencyResults.h/m: Ditto. * DBModeler/ConsistencyResults.gorm: Ditto. 2005-07-03 Matt Rice * EOAccess/EOAdaptorContext.h/m (-channels:): New method. * EOAccess/EOSQLExpression.m (-_administrativeDatabaseStatementsForSelector:forEntityGroup:): Comment out login panel. * EOAccess/EOUtilities.m: Dont declare EOMoreThanOneException and NSObjectNotAvailableException as static. * EOControl/EOPrivate.h: Declare new class GDL2NonRetainingMutableArray and -registerAssociationForDeallocHack method. * EOControl/EOPrivate.m: New class GDL2NonRetainingMutableArray. * EOControl/EOEditingContext.m: (EOEditingContext -initWithParentObjectStore:): initialize _editors ivar with a non retaining array. (-dealloc): Remove the editing context as an observer for registered objects. (-[NSObject(DeallocHack) dealloc]): for associations, remove the association and object from the private hash table. (-[NSObject(DeallocHack) registerAssociationForDeallocHack]): New method. * EOControl/EOObserver.m (EOObserverCenter): Replace GSIArray usage with GDL2NonRetainingMutableArray. (+addObserver:forObject:, +removeObserver:forObject:): Ditto. (+initialize, +notifyObserversObjectWillChange:): Ditto. (+observersForObject:, +observerForObject:): Ditto. (+addOmniscientObserver:, +removeOmniscientObserver:): Ditto. (EOObserverProxy -initWithTarget:action:priority:): Don't retain target. (EOObserverProxy -dealloc:): Discard pending notifications. 2005-06-26 David Ayers * EOControl/EODetailDataSource.m (masterClassDescription): Only resort to EOClassDescription if _masterClassDescriptionName is set. Otherwise ask the _masterDataSource for its classDescriptionForObjects. 2005-06-17 Matt Rice * EOAccess/EOEntity.m (-_setModel:): Accept nil argument, comment. * EOAccess/EOModel.m (-removeEntity:): Comment. 2005-05-18 Matt Rice * EOControl/EOObserver.m (EOObserverCenter): Don't retain observers. Use a GSIArray instaed of NSMutableArray. (+addObserver:forObject:, +removeObserver:forObject:): Ditto. (+initialize, +notifyObserversObjectWillChange:): Ditto. (+observersForObject:, addOmniscientObserver:): Ditto. (+removeOmniscientObserver:): Ditto. 2005-05-17 Matt Rice * GNUmakefile: remove GDL2Palette from top level compilation. * GDL2Palette/GNUmakefile: Fix compilation flags, include gdl2.make relative not the installed version. * DBModeler/GNUmakefile: Ditto. 2005-05-11 Matt Rice * GNUmakefile: Compile EOInterface, EOModeler, DBModeler, GDL2Palette if gui is installed. * EOModeler/EOModelExtensions.h: Update copyright header. * EOModeler/EOModelExtensions.m: Ditto. * EOModeler/GNUmakefile: Make EOModeler a native-library, add new files. * EOModeler/Makefile.preamble: Change link flag to use FND_LIBS. * EOModeler/EODefines.h: New file, initial implementation. * EOModeler/EOMInspector.h/m: Ditto. * EOModeler/EOMInspectorController.h/m: Ditto. * EOModeler/EOModelerApp.h/m: Ditto. * EOModeler/EOModelerDocument.h/m: Ditto. * EOModeler/EOModelerEditor.h/m: Ditto. * DBModeler: New directory. * DBModeler/COPYING: New file... * DBModeler/AdaptorsPanel.h/m: New files. * DBModeler/DefaultColumnProvider.h/m: Ditto. * DBModeler/EOAdditions.h/m: Ditto. * DBModeler/KVDataSource.h/m: Ditto. * DBModeler/MainModelEdtior.h/m: Ditto. * DBModeler/Modeler.m: Ditto. * DBModeler/ModelerAttributeEditor.h/m: Ditto. * DBModeler/ModelerTableEmbedibleEditor.h/m: Ditto. * DBModeler/main.m: Ditto. * DBModeler/GNUmakefile: Ditto. * DBModeler/Resources: New directory. * DBModeler/Resources/ModelDrag.tiff: New file. * DBModeler/Resources/ClassProperty_On.tiff: Ditto. * DBModeler/Resources/Key_On.tiff: Ditto. * DBModeler/Inspectors: New directory. * DBModeler/Inspectors/RelationshipInspector.h/m: New files. * DBModeler/Inspectors/AttributeInspector.h/m: Ditto. * DBModeler/Inspectors/RelationshipInspector.gorm: New gorm directory. * DBModeler/Inspectors/AttributeInspector.gorm: Ditto. * GDL2Palette: New directory. * GDL2Palette/GNUmakefile: New file. * GDL2Palette/ConnectionInspector.h/m: Ditto. * GDL2Palette/Foundation+Categories.h/m: Ditto. * GDL2Palette/IB+Categories.m: Ditto. * GDL2Palette/Palette.h/m: Ditto. * GDL2Palette/ResourceManager.h/m: Ditto. * GDL2Palette/GDL2ConnectionInspector.gorm: Ditto. * GDL2Palette/GDL2Palette.tiff: Ditto * GDL2Palette/palette.table 2005-05-12 Matt Rice * ChangeLog: Fix previous ChangeLog entry. * EOInterface/EOActionAssociation.m: Implemented aspects enabled and action. (-establishConnection): Implement (-breakConnection, -subjectChanged, -action): Ditto. * EOInterface/EOAssociation.m (-associationClassesForObject:): Fixed argument passed to -isUsableWithObject:. Assign count (-init): Assign self. (-establishConnection:): Add unused local variable to pass to NSNextMapEnumeratorPair instead of 0. (-breakConnection:): Ditto. (-initWithCoder:, -encodeWithCoder:): Initial implementation of methods. (-valueForAspect:,-setValue:forAspect:,-valueForAspect:atIndex:): Ditto. (-setValueForAspect:atIndex:): Ditto. * EOInterface/SubclassFlags.h: New file. * EOInterface/EOAspectConnector.h/m: New file and implementation. * EOInterface/EOColumnAssociation.m: Implemented aspects value and enabled (-objectKeysTaken): Take identifier key. (-establishConnection, -breakConnection, -endEditing): Implement methods. (-tableView:setObjectValueForTableColumn:row:): Ditto. (-tableView:objectValueForTableColumn:row:): Ditto. (-tableView:willDisplayCell:forTableColumn:row:): Ditto. (-control:didFailToFormatString:errorDescription:): Ditto. (-control:textShouldBeginEditing:): Ditto. * EOInterface/EOControlAssociation.m: (-control): Ditto (-editingAssociation, -establishConnection, -breakConnection): Ditto. * EOInterface/EOGenericControlAssociation.m: Implemented aspects value and enabled. (+objectKeysTaken): add target key. (-establishConnection: -breakConnection:, -subjectChanged:): Ditto. (-_action:, -endEditing, -control:textShouldBeginEditing:): Ditto. * EOInterface/EOMatrixAssociation.m: Implemented aspects image, title, and enabled. (-establishConnection, -breakConnection, -subjectChanged): Ditto. * EOInterface/EOPopUpAssociation.m: Implemented aspects titles, selectedTitle, selectedTag, selectedObject, enabled. (-initWithObject:, -_action:): Implemented method. (-establishConnection:, -breakConnection, -subjectChanged): Ditto. * EOInterface/EORadioMatrixAssociation.m: Implemented aspects selectedTag, selectedTitle, enabled. (NSCell -_selectCellWithTitle:): Private category. (-initWithObject:, -_action:): Implemented method. (-establishConnection:, -breakConnection, -subjectChanged): Ditto. * EOInterface/EOTableViewAssociation.m: Implemented aspects enabled, tableView. (-establishConnection, -breakConnection, subjectChanged): Implement method. (-bindToTableView:displayGroup:, -editingAssociation): Ditto. (-numberOfRowsInTableView:): (-tableView:setObjectValue:forTableColumn:row:): Ditto. (-tableView:objectValueForTableColumn:row:): Ditto. (-tableView:shouldEditTableColumn:row:): Ditto. (-tableView:willDisplayCell:forTableColumn:row:): Ditto. (-tableView:selectionDidChange:): Ditto. (-control:didFailToFormatString:errorDescription:): Ditto. (-control:isValidObject:, -control:textShouldBeginEditing:): Ditto. (-dealloc): Ditto. * EOInterface/EOTextAssociation.m: Implemented aspect value, enabled. (-establishConnection): Implemented method. (-breakConnection, -subjectChanged, -endEditing): Ditto. (-control:isValidObject:,textShouldBeginEditing:): Ditto. (-textShouldEndEditing:): Ditto. * EOInterface/GNUmakefile: Make EOInterface a native-library, whitespace changes. * EOInterface/Makefile.preamble: Change linker flag to use FND_LIBS and GUI_LIBS variables. * EOInterface/EODisplayGroup.h: Comment on whether ivars are retained. * EOInterface/EODisplayGroup.m: (DG_SHOULD_CHANGE_SELECTION_TO_IDX): New macros. (DG_DISPLAY_ARRAY_FOR_OBJECTS, DG_SHOULD_DISPLAY_ALERT): Ditto. (DG_DID_FETCH_OBJECTS, DG_CREATE_OBJECT_FAILED): Ditto. (DG_SHOULD_INSERT_OBJECT, DG_DID_INSERT_OBJECT): Ditto. (DG_DID_CHANGE_SELECTION): Ditto. (NSArray -indexesForObjectsIdenticalTo:): Implement category method. (_presentAlertWithTitle:message:): New private methods. (-_endObserverNotification:): Implement notification observer methods. (-_beginObserverNotification:): Ditto. (-objectsInvalidatedInEditingContext:): Ditto. (-objectsChangedInEditingContext:): Ditto. (+initialize, -init, -initWithCoder:,): Implement methods. (-encodeWithCoder:, -setDataSource:, -fetch, -allObjects): Ditto. (-setObjectArray:, -redisplay, -updateDisplayedObjects): Ditto. (-selectionIndexes, -setSelectionIndexes, -selectObject): Ditto. (-selectObjectsIdenticalTo:, -clearSelection, -selectedObjects): Ditto. (-selectObjectsIdenticalTo:selectFirstOnNoMatch:): Ditto. (-setSelectedObjects, -selectedObject, -setSelectedObject:): Ditto. (-insertObjectAtIndex:, -insertObject:atIndex:): Ditto. (-setInsertedObjectDefaultValues:, -deleteSelection): Ditto. (-observingAssociations, -endEditing, -fetch:, -insert:): Ditto. (-selectionChanged, -contentsChanged, -valueForObject:key:): Ditto. (-selectedObjectValueForKey:, -valueForObjectAtIndex:): Ditto. (-setValue:forObject:key:, -setSelectedObjectValue:forKey:): Ditto. (-setValue:forObjectAtIndex:key:, -associationDidBeginEditing:): Ditto. (-associationDidEndEditing:): Ditto. 2005-05-11 Matt Rice * EOAccess/Makefile.preamble: Change link flag to use FND_LIBS variable defined in base.make * EOControl/Makefile.preamble: Ditto. * EOAccess/EODatabaseDataSource.m (-entity): Look for entity with the fetch specifications entity name in a model group. (-databaseContext): Return a registered database context. * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.m: Cast before calling -initWithIdentifier to remove warning with gcc 3.4 * EOControl/EOEditingContext.m (-encodeWithCoder:,-initWithCoder:): initial implementation of methods. * EOControl/EOClassDescription.m (-snapshot): cast 'value' to get thwart warnings. * EOControl/EOFault.m (-superClass): Implement as returning a class. * Tools/gsdoc-model.m: Include headers alphabetically, include NSCalendarDate.h to thwart warning. 2005-05-03 David Ayers * EOControl/EOEditingContext.m (_mutableSetFromToManyArray:): Add internal documentation. Filter managed objects instead of attempting to convert gids to objects. Reported by Manuel Guesdon. 2005-05-03 Manuel Guesdon * EOControl/EOEditingContext.m: o fixes in _mergeObject:withChanges: (IMP initialization, variables (re-)initialization) o added NSAssert in -_mutableSetFromToManyArray: 2005-04-24 Manuel Guesdon * EOAccess/EOAttribute.m: o fixed test error in -newValueForBytes:length: 2005-04-24 Manuel Guesdon * EOControl/EOPriv.h: added GDL2_allocWithZone() * EOAccess/EOAttribute.m: o fixed -validateValue: rewritten following David Ayers's advices to handle EONull values validation and fix width validation o fixed -newValueForBytes:length: retain problems and wrong invocation target o fixed -newValueForBytes:length:encoding: retain problems and wrong invocation target o added comments and doc o added allowsNull in EOAttribute -description * EOControl/EOKeyValueArchiver.m: fixed int and bool archiving following David Ayers's comments (produce NSNumber instead of NSString) 2005-04-24 Matt Rice * EOAdaptors/Postgres95/Postgres95Adaptor.m: Removed externalTypeNames and internalTypeNames variables, replaced both with typeNames. (isValidQualifierType:model:): Use new variable. (externalToInternalTypeMap:): Ditto. 2005-04-19 David Ayers Fix bug reported by: jim _at_ uchicago dot edu. * EOAccess/EOEntity.m (-primaryKeyRootName): Recurse to through primaryKeyRootName of parent entity. * EOAdaptors/Postgres95/Postgres95Channel.m (primaryKeyForNewRowWithEntity:): Use primaryKeyRootName to construct sequence name. 2005-04-19 Manuel Guesdon * EOControl/EOKeyValueArchiver.m: implemented EOKeyValueArchiver * EOControl/EOKeyValueArchiver.h: removed private methods * EOControl/EOSortOrdering.h: added EOKeyValueArchiving protocol to EOSortOrdering * EOAccess/EOAttribute.m: put back David changes in -adaptorValueByConvertingAttributeValue added some docs 2005-04-07 Stephane Corthesy * Tools/eoutil.m: Added -excludedEntities option when dumping; added use of local autorelease pools; splitted SQL execution in different phases, to allow dropping then re-creating tables, in one shot; now fetches flattened or derived attributes; now can dump NSCalendarDate, NSData, NSNumber correctly; no longer tries to write (in db) flattened or derived or non class-property attributes; now ignores and log exceptions when -force option is used. 2005-03-17 Manuel Guesdon * EOControl/EOFault.m: added instanceMethodForSelector: to temporary fix defaulting problem with NSAutoreleasePool optimizations 2005-03-10 David Ayers * EOControl/EOKeyValueCoding: (-unableToSetNullForKey:): Deprecate and call unableToSetNilForKey. (-setNilValueForKey:): Call unableToSetNilForKey. (-unableToSetNilForKey:): Use default implementation. 2005-03-03 David Ayers * EOAccess/EODatabaseContext.m (-forgetSnapshotForGlobalID:): Handle deleted globalIDs correctly. (-forgetSnapshotsForGlobalIDs:): Ditto. (-_commitTransaction, -_beginTransaction): Ditto. (-_rollbackTransaction): Implement. * EOAccess/EORelationship.m (validateValue:): Document. Remove unnecessary comments and code. Handle EONulls. (+initialize): Implement. (+relationshipWithPropertyList:owner:): Move to top. 2005-03-03 Matt Rice David Ayers * EOAccess/EOEntity.m (initWithPropertyList:owner:): Reformatting for GNU coding standards. (-attributes): Fix memory leak. Use global class cache. Handle partially converted attributes array. (-_attributeNameChangedFrom:to:): New privat method. * EOAccess/EOEntityPriv.h (-_attributeNameChangedFrom:to:): Declare new private method. * EOAccess/EOAttribute.m (setName:): Call -[EOEntity _attributeNameChangedFrom:to:] if attribute is in an EOEntity. 2005-03-02 David Ayers * EOControl/EOKeyValueCoding.h/m: (-setNilValueForKey:): Override NSObject's category to invoke -unableToSetNullForKey:. * EOControl/EOSortOrdering.m: Include EONull.h instead of NSNull.h. * EOAccess/EODatabaseChannel.m: Update formatting. * EOAccess/EOModel.m (setName:): Remove from group before changing name and readd afterwards. 2005-02-22 David Ayers * EOAccess/EOAdaptor.m (-hasOpenChannels): Make safe for unsigned. * EOAccess/EOAttribute.m, EOAccess/EODatabaseContext.m, * EOAccess/EOEntity.m, EOAccess/EOSQLExpression.m * EOAccess/EOPrivate.h, EOAccess/EOPrivate.m, * EOAccess/EOSQLQualifier.m, EOAccess/EOUtilities.m * EOControl/EOClassDescription.m, EOControl/EOEditingContext.m * EOControl/EOGenericRecord.m, EOControl/EOKeyGlobalID.m * EOControl/EOKeyValueCoding.m, EOControl/EOKeyValueQualifier.m * EOControl/EOMutableKnownKeyDictionary.m, * EOControl/EOPrivate.h, EOControl/EOPrivate.m Unify GDL2 identifiers with GDL2_ prefix. Replace GDL2NSClass_alloc with GDL2_alloc(NSClass). Replace GDL2NSClassWith* calls with AUTORELEASE([GDL2_alloc(NSCLass) initWith* calls]). Rename GDL2PrivInit to GDL2_PrivateInit. (GDL2_NSArray, GDL2_NSMutableArray_allocWithZoneIMP) (GDL2_NSMutableDictionary_allocWithZoneIMP): New globals. (GDL2_alloc): New macro. (GDL2NSString_alloc, GDL2NSDecimalNumber_alloc) (GDL2NSNumber_alloc, GDL2NSCalendarDate_alloc, GDL2NSData_alloc) (GDL2DataWithBytesAndLength, GDL2MutableArrayWithCapacity) (GDL2MutableArrayWithArray, GDL2MutableArray, GDL2Array) (GDL2MutableDictionaryWithCapacity): Remove. 2005-02-20 David Ayers * EOAccess/EOAccessFault.m: Include NSThread.h. * EOControl/EOPriv.h/m: Split into... * EOControl/EOPrivat.h/m: ... and ... * EOAccess/EOPrivat.h/m: ... files. * EOAccess/EOAdaptorChannel.m: Include new privat header. * EOAccess/EOAttribute.m, EOAccess/EODatabase.m, * EOAccess/EODatabaseChannel.m, EOAccess/EOEntity.m, * EOAccess/EORelationship.m, EOAccess/EOSQLExpression.m, * EOAccess/EOSQLQualifier.m, EOAccess/EOUtilities.m: Ditto. (+initialize): Call new private function. * EOAccess/EODatabaseContext.m: Ditto. (EODatabaseContext_snapshotForGlobalIDWithImpPtr) (EODatabaseContext_globalIDForObjectWithImpPtr): Move to EOPrivate.m. * EOAccess/EODatabaseContextPriv.h: (EODatabaseContext_snapshotForGlobalIDWithImpPtr) (EODatabaseContext_globalIDForObjectWithImpPtr): Move to EOPrivate.h. * EOAccess/GNUmakefile: Compile EOPrivate.m. * EOControl/EOClassDescription.m, EOControl/EOGenericRecord.m * EOControl/EOKeyGlobalID.m, EOControl/EOKeyValueCoding.m * EOControl/EOKeyValueQualifier.m, EOControl/EONSAddOns.m * EOControl/EOSortOrdering.m: Include new private header. * EOControl/EOEditingContext.h/m: Ditto. (EOEditingContext_objectForGlobalIDWithImpPtr) (EOEditingContext_recordObjectGlobalIDWithImpPtr): Move to EOPrivate.h/m. * EOControl/EOMutableKnownKeyDictionary.h/m: Include new private header. (EOMKKD_objectForKeyWithImpPtr, EOMKKD_setObjectForKeyWithImpPtr) (EOMKKD_removeObjectForKeyWithImpPtr, EOMKKD_hasKeyWithImpPtr) (EOMKKD_indexForKeyWithImpPtr) (EOMKKDInitializer_indexForKeyWithImpPtr): Move to EOPrivate.m * EOControl/EOFault.m: (+isFault:): Update comment. * EOControl/GNUmakefile: Build EOPrivate.m instead of EOPriv.m. Do not install private header. * EOAccess/EOPrivate.h, EOAccess/EOPrivate.m, * EOAccess/EODatabaseContext.m, EOAccess/EOSQLExpression.m, * EOControl/EOEditingContext.m, EOControl/EOKeyValueCoding.m, * EOControl/EOMutableKnownKeyDictionary.m, * EOControl/EOPrivate.h, EOControl/EOPrivate.m: Remove global selector cache. 2005-02-19 David Ayers * EOAdaptors/Postgres95/Postgres95Private.m/h: New files based on EOControl/EOPriv.m/h. * EOAdaptors/Postgres95/GNUmakefile.in: Build Postgres95Private.m. * EOAdaptors/Postgres95/Postgres95Adaptor.m: Do not depend on EOControl/EOPriv.m/h but on own private files. (+assignExternalInfoForEntity): Use objectAtIndex: instead of enumerator for speed. * EOAdaptors/Postgres95/Postgres95Channel.m: (+initialize) (-lowLevelResultFieldNames:, -fetchRowWithZone:) (-insertRow:forEntity:, -_describeResults, -describeTableNames) (-updateValues:inRowsDescribedByQualifier:entity:) (-_describeBasicEntityWithName:forModel:) (-_describeForeignKeysForEntity:forModel:) (-primaryKeyForNewRowWithEntity:): Do not depend on EOControl/EOPriv.m/h but on own private files. Improve optimizations. (pgResultDictionary): Simplify unused static local be reverting optimizations. * EOAdaptors/Postgres95/Postgres95SQLExpression.m: (+initialize, +formatValue:forAttribute:) (+sqlPatternFromShellPattern:) (+sqlPatternFromShellPattern:withEscapeCharacter:): Do not depend on EOControl/EOPriv.m/h but on own private files. Improve optimizations. * EOAdaptors/Postgres95/Postgres95Values.h/m (Postgres95CalendarFormat, Postgres95ValuesClass) (Postgres95Values_newValueForBytesLengthAttributeSEL) (Postgres95Values_newValueForBytesLengthAttributeIMP) (Postgres95Values_newValueForBytesLengthAttribute): Remove. ([NSCalendarDate+setPostgres95Format:]): Remove. ([NSCalendarDate+postgres95Format]): Deprecate. (LPSQLA_StringDefaultCStringEncoding): New local static. (+initialize, +newValueForNumberType:length:attribute:) (+newValueForCharactersType:length:attribute:) (+newValueForDateType:length:attribute:): Do not depend on EOControl/EOPriv.m/h but on own private files. Improve optimizations. * EOAdaptors/Postgres95/Postgres95Values.m: Remove dependency on EOAccess/EOAttributePriv.h and EOControl/EONSAddOns.h. (attrRespondsToValueClass, attrRespondsToValueTypeChar): New static locals. (+initialize, +newValueForNumberType:length:attribute:): Remove dependency and used static locals instead. * EOAccess/EOAdaptor.m: Consistently use unsigned for array index variables. 2005-02-18 Matt Rice * EOAccess/EOModel.m (-addEntity:, -setName:): Call -willChange: when modifying the receiver. (-setConnectionDictionary:, -addEntity:, -removeEntity:): Ditto. (-addStoredProcedure:, -removeStoredProcedure:, -setAdaptorName): Ditto. * EOAccess/EOAttribute.m (-setName:, -setProtoType:,): Ditto. (-setDefinition:, -setReadOnly:, -setWidth:, -setPrecision:): Ditto. (-setScale:, -setWriteFormat:, -setReadFormat:): Ditto. (-setParameterDirection:, -setServerTimeZone:): Ditto. (-setValueFactoryMethodName:): Ditto. (-setAdaptorValueConversionMethodName:): Ditto. (-setFactoryMethodArgumentType:): Ditto. * EOAccess/EOEntity.m (-setRestrictingQualifier:): Ditto. (-setCachesObjects:, -setReadOnly:, -addAttribute:): Ditto. (-removeAttribute:, -addRelationship:, -removeRelationship:): Ditto. (-addFetchSpecification:withName:): Ditto. (-removeFetchSpecificationNamed:): Ditto. (-setClassProperties:, -setPrimaryKeyAttributes:): Ditto. (-setAttributesUsedForLocking:, -addSubEntity:): Ditto. (-removeSubEntity:, -setIsAbstractEntity:): Ditto. (-setMaxNumberOfInstancesToBatch:): Ditto. (-setStoredProcedure:forOperation:): Ditto. (-setParentEntity:): Ditto, And add comments * EOAccess/EORelationship.m (setToMany:): Call -willChange when modifying the receiver (-setNumberOfToManyFaultsToBatch:, -setDeleteRule:): Ditto. (-setInverseRelationship:): Ditto and comment. (-removeJoin:): Move -willChange call after error handling. * EOAccess/EOStoredProcedure: Include EOObserving headers. (-setName:, -setExternalName:, -setArguments:): Call -willChange: when modifying the receiver. (-setUserInfo:): Ditto. 2005-02-17 David Ayers * EOAccess/EOEntity.m: Remove unnecessary include. (-setClassProperties:, -setPrimaryKeyAttributes:) (-setAttributesUsedForLocking:): Remove unnecessary casts. * EOAccess/EODatabaseContext.m: (-_currentCommittedSnapshotForObject:): Fix crash in logging. (recordChangesInEditingContext): Remove shadowing of local variable. 2005-02-16 David Ayers * EOControl/EOClassDescription.m ([NSObject-snapshot]): Return valid dictionary for EONull. * EOControl/EONSAddOns.h/m ([NSString-hasShellPatternCharacter]): Remove. * EOControl/EOPriv.h/m (GDL2_shellPatternCharacterSet): Remove. (GDL2PrivInit): Remove usage of GDL2_shellPatternCharacterSet. * EOControl/EOMutableKnownKeyDictionary.m ([EOMKKDInitializer-arrayMappingForKeys:]): Correct call to GDL2ObjectAtIndexWithImp. ([EOMKKDInitializer-subsetMappingForSourceDictionaryInitializer: sourceKeys:destinationKeys:]): Ditto. * EOControl/EOGenericRecord.m (-storedValueForKey:) (-takeStoredValue:forKey:, -takeValue:forKey:, valueForKey): Use GSSelectorFromName instead of sel_get_any_uid. Omit test to islower. Format according to coding standards. * EOControl/EOKeyValueCoding.m (-takeValue:forKeyPath:isSmart:) Use unsigned for index bookkeeping. * EOAccess/EOAccessFault.m ([EOAccessFaultHandler-init]) ([EOAccessFaultHandler-dealloc]) ([EOAccessArrayFaultHandler-dealloc]): Use GSCurrentThread instead of objc_thread_id. (-completeInitializationOfObject): Correct comment. 2005-02-15 David Ayers * EOAccess/EOAttribute.h/m (EOAdaptorUnknownType): Remove. (protoOverride): Increase range. (isAttributeValueInitialized): New flag. (extraRefCount): Make standalone instance variable. (setValueClassName:): Use isAttributeValueInitialized flag instead of EOAdaptorUnknownType. (adaptorValueType): Use isAttributeValueInitialized flag instead of EOAdaptorUnknownType. * EOAdaptors/Postgres95/Postgres95Values.m (newValueForBytes:length:attribute:): Remove reference to EOAdaptorUnknownType. * EOAdaptors/Postgres95/Postgres95SQLExpression.m (externalNameQuoteCharacter): Remove. 2005-02-14 David Ayers * EOAccess/EOModel.m (-writeToFile:): Clairfy documentation about setting receivers name and path. * EOControl/EOCheapArray.h/m (-initWithArray:): Correct signature and only initialize instance variable if call to super init was successfull. (-shallowCopy): Correct signature. * EOControl/EOClassDescription.m (-dictionaryForInstanceProperties): Remove casts. ([NSObject-shallowCopy], [NSObject-snapshot]) ([NSObject-updateFromSnapshot:]): Ditto. ([NSObject-validateValue:forKey:]): Correct key determination and use GSSelectorFromName instead of sel_get_any_uid. ([NSObject-addObject:toPropertyWithKey:]): Use GSSelectorFromName instead of sel_get_any_uid. Minor optimization. ([NSObject-removeObject:fromPropertyWithKey:]): Ditto. * EOControl/EOEditingContext.h/m (_objectBasedChangeInfoForGIDInfo:) Only generate an entry for objects that the reciever actually maps. (-recordForGID:, -recordForObject:) Remove unused undocumented methods. (-updatedObjects, -insertedObjects, -deletedObjects): Reimplement. (-unprocessedObjects, -unprocessedInfo, -pendingInfo) (-hasUnprocessedChanges): Remove. * EOControl/EONull.h/m ([NSObject isEONull], [NSObject isNotEONull]) (isNilOrEONull): Remove. * EOControl/EOPriv.h (_isNilOrEONull): Make static inline function. 2005-02-13 Manuel Guesdon * EOControl/EOClassDescription.m: o use IMPs o avoid NSString build in -addObject:toPropertyWithKey: o avoid NSString build in -removeObject:fromPropertyWithKey: * EOAccess/EODatabaseContext.m: o added and use EODatabaseContext_globalIDForObjectWithImpPtr o use IMPs * EOAccess/EOEntity.m: o use IMPs * EOAccess/EOAttribute.m: o use IMPs o optimized -validateValue * EOAccess/EODatabaseContextPriv.h: o added EODatabaseContext_globalIDForObjectWithImpPtr * EOControl/EOPriv.[hm]: o added more helpers * EOControl/EOEditingContext.m: o use IMPs * EOControl/EOGenericRecord.m: o use IMPs in descriptions * EOAdaptors/Postgres95Values.m: o use GDL2StringDefaultCStringEncoding() in +newValueForCharactersType:length:attribute: * EOAdaptors/Postgres95Channel.m: o IMP optimizations * EOAdaptors/Postgres95Adaptor.m: o IMP optimizations 2005-02-11 Manuel Guesdon * EOAccess/EOAdaptor.m: o optimization in 'for' loops * EOAccess/EODatabase.m: o include o replaced isNilOrEONull() by _isNilOrEONull() * EOAccess/EODatabaseContext.h: o added _snapshotForGlobalIDIMP * EOAccess/EODatabaseContext.m: o commented NSEmitTODO in -objectsForSourceGlobalID:relationshipName:editingContext: o added beter exception format in qualifierForLockingAttributes:primaryKeyAttributes:entity:snapshot: o fix compiler warning in -relayPrimaryKey:object:entity: o logs o optimizations in -objectsWithFetchSpecification:editingContext: o replaced isNilOrEONull() by _isNilOrEONull() o replace [EOFault isFault:] by _isFault() o use _snapshotForGlobalIDIMP o IMP usage optimization * EOAccess/EOAttribute.[hm]: o added EOAdaptorUnknownType o added _adaptorValueType and avoid recomputing it each time o added _valueTypeChar to avoid string comparaisons o use EOPriv classes declarations o Temporary reverted David changes in -adaptorValueByConvertingAttributeValue * EOAccess/EOAttributePriv.h: o added _valueTypeChar to avoid string comparaisons * EOAccess/EOEntityPriv.h: o moved -attributeForPath: and -relationshipForPath: to EOEntityGDL2Additions category * EOAccess/EOEntity.h: o moved private -attributeForPath: and -relationshipForPath: to EOEntityGDL2Additions category * EOAccess/EOEntity.m: o better exception in classProperties o fix compiler warning in -setClassProperties:, -setPrimaryKeyAttributes:, -setAttributesUsedForLocking: o moved -attributeForPath: and -relationshipForPath: to EOEntityGDL2Additions category o include o replaced [EONull null] by GDL2EONull * EOAccess/EOSQLExpression.m: o optimization in -tableListWithRootEntity: o optimization in -formatSQLString:format: o optimization in +sqlPatternFromShellPattern: o optimization in +sqlPatternFromShellPattern:withEscapeCharacter: o fix in -sqlStringForKeyValueQualifier: o added log in -sqlStringForKeyValueQualifier: for not handled readFormat o added log -addInsertListAttribute:value: for not handled writeFormat o added log -addUpdateListAttribute:value: for not handled writeFormat o changed EOFLOGObjectFnStart to EOFLOGObjectFnStartCond o changed EOFLOGObjectFnStop to EOFLOGObjectFnStopCond o include o replaced [EONull null] by GDL2EONull * EOAccess/EOSQLQualifier.m: o implemented EOKeyComparisonQualifier -schemaBasedQualifierWithRootEntity * EOAccess/EOUtilities.m: o include o replaced [EONull null] by GDL2EONull * EOControl/EOPriv.[hm]: o added. Contains various classes/selectors/IMPs * EOControl/EOClassDescription.m: o handle EONull case in -propagateDeleteForObject:editingContext:, -addObject:toPropertyWithKey:, -snapshot, -removeObject:fromPropertyWithKey:, _setObject:forBothSidesOfRelationshipWithKey:, addObject:toBothSidesOfRelationshipWithKey:, -removeObject:fromBothSidesOfRelationshipWithKey: o fix compiler warning in -dictionaryForInstanceProperties, -shallowCopy, -updateFromSnapshot:, -snapshot o include o replaced [EONull null] by GDL2EONull o replaced isNilOrEONull() by _isNilOrEONull() o fix in -validateForSave o rewritten -validateValue:forKey: selector build * EOControl/EOEditingContext.h: o added -hasUnprocessedChanges * EOControl/EOEditingContext.m: o added -hasUnprocessedChanges o added NS_DURING,... to catch exceptions o replace [EOFault isFault:] by _isFault() o IMP usage optimization * EOControl/EOKeyGlobalID.m: o replaced isNilOrEONull() by _isNilOrEONull() o include * EOControl/EOGenericRecord.m: o partially rewritten -description o include o replaced isNilOrEONull() by _isNilOrEONull() o replace [EOFault isFault:] by _isFault() o changed variable name type of _infoForInstanceVariableNamed:retType:retSize:retOffset: o rewritten valueForKey:,... to use cString NSKeyValueCoding * EOControl/EOKeyValueCoding.m: o changed NSAssert in NSArray -valueForKey: o optimization in NSDictionary -takeValue:forKeyPath:isSmart: o optimization in NSDictionary -takeStoredValue:forKeyPath: o include o replaced [EONull null] by GDL2EONull o include * EOControl/EOKeyValueQualifier.m: o fixes for EONull/nil in -evaluateWithObject: o replaced [EONull null] by GDL2EONull o include * EOControl/EOSortOrdering.m: o include o replaced [EONull null] by GDL2EONull * EOAdaptors/Postgres95SQLExpression.m: o float formatting in +formatValue:forAttribute: o added -externalNameQuoteCharacter o added +sqlPatternFromShellPattern: o added +sqlPatternFromShellPattern:withEscapeCharacter: o replaced isNilOrEONull() by _isNilOrEONull() * EOAdaptors/Postgres95Channel.m: o logs * EOAdaptors/Postgres95Values.m: o logs o fix in +setPostgres95Format: o fix calendard format to handle timezone (%z) o optimizations * EOControl/EOMutableKnownKeyDictionary.m o removed EOMKKDArrayMapping +dictionaryFromDictionary:subsetMapping: o include o replaced isNilOrEONull() by _isNilOrEONull() * EOControl/EONSAddOns.[hm]: o added NSString(ShellPattern) 2005-02-10 David Ayers * EOControl/EOEditingContext.m (_globalIDChanged:): Make assert more accurate. (-_invalidatedAllObjectsInStore:): Implement. (+setUsesContextRelativeEncoding:): Implement. (+usesContextRelativeEncoding): Implement. (+initialize): Set default value of usesContextRelativeEncoding depending on whether we are a gsweb application. * EOControl/EOObjectStoreCoordinator.m (_invalidatedAllObjectsInSubStore:): Implement. 2005-02-08 Matt Rice * EOControl/EOEditingContext.m (-_globalIDChanged:): Add key to the snapshot dict before removing the temporary gid. Assert that the temporary gid and the new gid are not equal. 2005-02-08 David Ayers * EOAccess/EOModel.m (-init): Initialize _storedProcedures. (-storedProcedureNames): Simplify. (-storedProcedureNamed:): Reimplement. (-storedProcedures): Simplify. (-writeToFile:): Call _setPath: after preliminary testing. Write stored procedures. (-initWithTableOfContentsPropertyList:path:): Reimplement stored procedure handling. (-encodeTableOfContentsIntoPropertyList:): Handle stored procedures. (-encodeIntoPropertyList:): Fix encoding title for stored procedures. (-addStoredProcedure:, -removeStoredProcedure:) Make more thread safe. (-loadAllModelObjects): Implement. * EOAccess/EOStoredProcedure.m (-initWithPropertyList:): Call awakeWithPropertyList: to finish initialization. (-encodeIntoPropertyList:): Implement. (-description): Implement. (-_setIsEdited): Implement. * EOControl/EOEditingContext.m (-_objectBasedChangeInfoForGIDInfo:): Make a little more gdb friendly. 2005-02-07 Matt Rice * EOControl/EOObjectStore.m: Assign correct key names for EOUpdatedKey, EOInsertedKey, EODeletedKey, EOInvalidatedKey. * EOAccess/EODatabaseContext.m (-_objectsChanged:, -commitChanges): Use EOUpdatedKey, EOInsertedKey, EODeletedKey, EOInvalidatedKey, instead of hard coded keys. * EOControl/EOEditingContext.m (-didSaveChanges, pendingInfo): Ditto. 2005-02-03 David Ayers * EOAccess/EODatabaseContext.h/m:(_numLocked): Removed. (_lockedObjects): Use hash table instead of plain memory. (-_registerDatabaseContext:) Only attempt to retrieve entities with valid names. (-dealloc): Update _lockedObjects usage. (-lockObjectWithGlobalID:editingContext:): Inialize local variable. Fire fault if necessary to obtain snapshot and raise upon failure. (-registerLockedObjectWithGlobalID:): Use new hash table. (-isObjectLockedWithGlobalID:): Ditto. (-_cleanUpAfterSave): Ditto. (-invalidateAllObjects): Call -invalidateResultCache and make more gdb friendly. (-invalidateObjectsWithGlobalIDs:): Call forgetSnapshotsForGlobalIDs: on self instead of the _database. (-commitChanges): Execute the commit if a transaction is open to insure held locks are freed server side. (-snapshotForGlobalID): Move implementation to ... (-snapshotForGlobalID:after:): ... here and call this version in the _database. (-forgetSnapshotsForGlobalIDs:): Implement. (-forgetAllLocks): Ditto. (-forgetLocksForObjectsWithGlobalIDs:) Ditto. * EOAccess/EODatabaseDataSource.m (-insertObject): Do not insert object into the editing context. * EOAdaptors/Postgres95/Postgres95Adaptor.m (externalTypeNames): Add new types. * EOControl/EOEditingContext.h (_objectsById): Rename to _globalIDsByObject. (ignoreSharedContextNotifications, isSharedContextLocked): Added. (_sharedContext, fetchTimestamp): Ditto. (-_insertObject:withGlobalID:, -_observeUndoManagerNotifications) (-_processDeletedObjects) (-_processOwnedObjectsUsingChangeTable:deleteTable:) (-_registerClearStateWithUndoManager): Remove public declarations of private methods. (-didMergeChangedObjectsInEditingContext:) Rename to -editingContextDidMergeChanges:. * EOControl/EOEditingContext.m: Update header dependencies. Declare private methods locally. (EOThreadSafeQueue): New local class. (null, EOEditingContextClass, EOAssociationClass) (ecDeallocHT, assocDeallocHT): New static local variables. (EOConstObject, EOConstChanges, EOConstKey, EOConstValue) (EOConstAdd, EOConstDel): Added experimental variables. (_mergeValueForKey): New function. (-_mergeObject:withChanges:): Implement. (-_objectBasedChangeInfoForGIDInfo:): Ditto. (-_processObjectStoreChanges:): Implement. (-_objectsChangedInStore:): Reimplement. (-_changesFromInvalidatingObjectsWithGlobalIDs:): Implement. (-_uncommittedChangesForObject:fromSnapshot:): Implement. (-_mutableSetFromToManyArray:): Implement. (-_globalIDChanged:): Reimplement. (-_processNotificationQueue): Implement. (-_sendOrEnqueueNotification:selector:): Implement. (-invalidateAllObjects): Reimplement. (-_forgetObjectWithGlobalID:): Implement. (-_invalidateObject:withGlobalID:) Implement. (-_invalidateObjectWithGlobalID:) Implement. (-_invalidateObjectsWithGlobalIDs:) Implement. (-invalidateObjectsWithGlobalIDs:) Reimplement. (-_resetAllChanges:): Implement. (-_resetAllChanges): Implement. (-_enqueueEndOfEventNotification): Reimplement. (-_processEndOfEventNotification): Reimplement. (-noop:): Implement. (-_undoManagerCheckpoint:): Remove TODO. (-processRecentChanges): Ditto. (-_processRecentChanges:): Reimplement. (-_clearChangedThisTransaction:): Implement. (+initialize): Initialize some static variables. (+objectDeallocated:): Implemented. (_objectsById): Update usages with _globalIDsByObject. Do not retain objects but rely on new objectDeallocated: mechanism. (-initWithParentObjectStore:): Initialize undo manager. (-init): Make more gdb friendly. (-insertObject:): Use standard autorelease macro. (-_insertObject:withGlobalID:) Always insert the a new object into the inserted objects independent of previous GID mappings. (-hasChanges): Also check unprocessed changes. (-revert): Enable undo manager handling. (-objectWillChange:): Register for revert. (-recordObject:globalID:): Initialize ecDeallocHT and insert objects that are registered. (-forgetObject:): Remove objects from ecDeallocHT. ([NSObject-dealloc]): Added hack to automagically deregister objects fromm the editing context and association mappings. * EOControl/EOFetchSpecification.h/m (allVariablesRequiredFromBindings): Rename to requiresAllQualifierBindingVariables. (-setRequiresAllQualifierBindingVariables:) (-requiresAllQualifierBindingVariables): Implement. (-setAllVariablesRequiredFromBindings:) (-allVariablesRequiredFromBindings): Deprecate. Update various setter methods to make them promotion safe. * EOControl/EOObjectStoreCoordinator.m (requestStoreForGlobalID:fetchSpecification:object): Add all information to the notfication. (-invalidateObjectsWithGlobalIDs:): Reimplement via map table. (-lockObjectWithGlobalID:editingContext:): Implement. (-isObjectLockedWithGlobalID:editingContext:): Implement. * EOControl/EOObserver.m (+addObserver:forObject:): Cairify documentation. 2005-02-02 Matt Rice * EOAccess/EOEntity.m (-setName:): Validate the new name and remove the checks from here. (-validateName): Don't check if an attribute or a relationship with the name exist. Check if an entity of the same name exists. Return an exception with a valid reason in all cases. * EOAccess/EOAttribute.m (validateName): Return an exception with a valid reason in all cases. Don't check if a relationship with the name exists. * EOAccess/EOAttribute.m (validateName): Return an exception with a valid reason in all cases. Don't check if a attribute with the name exists. 2005-01-27 David Ayers * EOAccess/EODatabase.h/m:(EODistantPastTimeInterval): Added global variable. (snapshotForGlobalID:after:): Implemented. 2005-01-27 David Ayers * EOControl/EOEditingContext.h/m (setDefaultFetchTimestampLag:, defaultFetchTimestampLag): Implemented. 2005-01-26 David Ayers * EOAccess/EOUtilities.m (NSObjectNotAvailableException): Reactivate correct exception name. Correct a few whitespace issues. 2005-01-26 Juergen Lorenz Simon David Ayers * EOAccess/EOEntity.m (-initWithPropertyList:owner:): Correct test for file existance and reformat. * EOControl/EOFetchSpecification.h/m (-fetchSpecificationByApplyingBindings:) Remove obsolete method. (-fetchSpecificationWithQualifierBindings:) Implement. * EOControl/EOQualifier.m (initWithKeyValueUnarchiver:): Implement. (-encodeWithKeyValueArchiver:): Ditto. 2005-01-22 David Ayers * EOControl/EOQualifer.m (getKey): Allow literal numbers without class declarations. Reported by Dirk Lattermann. 2005-01-18 Peter Cooper * EOAdaptors/Postgres95/Postgres95Channel.m ([-_describeBasicEntityWithName:forModel:]): Ignore droped columns. 2004-11-23 Matt Rice * EOControl/EOQualifier.m ([-filteredArrayUsingQualifier]): Handle nil qualifier argument. 2004-11-04 David Ayers * EOAccess/EOModelGroup.m ([+globalModelGroup]): Search for .eomodel files as well and call -addModelWithFile: with full path. * EOAccess/EOModel.m ([-initWithContentsOfFile:]): Add assert if file could not be read. * EOControl/EOKeyGlobalID.m ([-hash]): Improve quality of hash values. 2004-11-03 David Ayers * EOAccess/EOAdaptorContext.h: Only use ASCII characters. * EOAccess/EOSQLQualifier.m: Ditto. 2004-11-02 David Ayers * GDL2.gsdoc: New file for documentation project. * GNUmakefile: Build documentation project. * EOAccess/gdl2.gsdoc: Rename to ... * EOAccess/EOAccess.gsdoc: ... new name. * EOControl/gdl2control.gsdoc: Rename to ... * EOControl/EOControl.gsdoc: ... new name. * EOAccess/GNUmakefile: Update documentation project name. * EOControl/GNUmakefile: Ditto. * README: Remove reference to potentially obsolete name. * Tools/eomodeltemplate.gsdoc: Update encoding, DTD reference and minor reformatting. * Tools/gdl2gsdoc.gsdoc: Update DTD reference and add myself as coauthor. * EOAccess/EODatabaseContext.h/m: (EOStoredProcedureNameHintKey, EOCustomQueryExpressionHintKey): Define missing keys. * EOControl/EODeprecated.h: (EOPrefetchingRelationshipHintKey) (EOFetchLimitHintKey, EOPromptAfterFetchLimitHintKey): Ditto. * EOControl/EOFetchSpecification.m: (EOPrefetchingRelationshipHintKey, EOFetchLimitHintKey) (EOPromptAfterFetchLimitHintKey): Ditto. Use globally defined keys instead of local strings. * EOAccess/EODatabaseChannel.m (_selectWithFetchSpecification:editingContext:) Use globally defined keys instead of local strings. * EOControl/EOQualifier.m (+[stringForOperatorSelector:]): Return selector name instead of nil if not given a standard EOQualifierOperator selector. 2004-10-20 David Ayers * EOInterface/EODetailSelectionAssociation.h/m: New files. * EOInterface/EOMasterCopyAssociation.h/m: Ditto. * EOInterface/EOMasterDetailAssociation.h/m: Ditto. * EOInterface/EOMasterPeerAssociation.m: Ditto. * EOInterface/EOMatrixAssociation.h/m: Ditto. * EOInterface/EOPickTextAssociation.h/m: Ditto. * EOInterface/EOPopUpAssociation.h/m: Ditto. * EOInterface/EORadioMatrixAssociation.h/m: Ditto. * EOInterface/EORecursiveBrowserAssociation.h/m: Ditto. * EOInterface/EOTextAssociation.h/m: Ditto. * EOInterface/EODeprecated.h: Ditto. * EOInterface/EOInterface.h: Added new header files. * EOInterface/GNUmakefile: Added new files. * EOInterface/EODisplayGroup.m: Update includes. (setSortOrdering:, sortOrdering): Add deprecated methods. * EOInterface/EOAssociation.h: Remove redundant include. 2004-10-17 David Ayers * EOInterface/EOComboBoxAssociation.h/m: New files. * EOInterface/EOControlAssociation.h/m: Ditto. * EOInterface/EOGenericControlAssociation.m: Ditto. * EOInterface/EOActionCellAssociation.m: Ditto. * EOInterface/NSImage+Additions.m: Ditto. * EOInterface/EOInterface.h: Added new headers. * EOInterface/GNUmakefile: Use new files. Remove superfluous header files directory variable. 2004-10-16 David Ayers * EOInterface/EOActionAssociation.h/m: New files. * EOInterface/EOActionInsertionAssociation.h/m: Ditto. * EOInterface/EOColumnAssociation.h/m: Ditto. * EOInterface/EOTableViewAssociation.m: Ditto. * EOInterface/EOInterface.h: Added new headers. * EOInterface/GNUmakefile: Use new files. * EOInterface/EOAssociation.m: (-[debugDescription]): Remove debug method. 2004-10-15 David Ayers * EOInterface/EOAssociation.h/m: New files. * EOInterface/EOInterface.h: Add EOAssocitaion. * EOInterface/GNUmakefile: Ditto. * EOInterface/EODisplayGroup.h: Add missing forward declaration. * EOInterface/EODisplayGroup.m: ([-insertObjectAtIndex]): avoid warning. 2004-10-14 David Ayers * EOInterface: New directory. * EOInterface/GNUmakefile: New file. * EOInterface/Makefile.preamble: Ditto. * EOInterface/EOInterface.h: Ditto. * EOInterface/EODisplayGroup.h: Ditto. * EOInterface/EODisplayGroup.m: Ditto. 2004-10-07 David Ayers * EOAccess/EOAttribute.m (encodeIntoPropertyList:): Encode numeric values as stings for WO45 EOModel format compatibility. 2004-09-28 David Ayers * EOAccess/EOEntity.m ([EOEntityClassDescription awakeObject:fromInsertionInEditingContext:]): Only process class properties. Remove inactive code. Document. * EOControl/EOObserver.m ([EOObserverCenter observersForObject:]): Document as final. Return immutable copy if observers. ([EOObserverCenter observerForObject:ofClass:]): Revert to using internal map. Avoid allocating spurious enumerator. Update documentation. * EOControl/EODebug.m (TypeToNSString): Use #ifdef to test for _C_LNG_LNG handling. * EOControl/EOFault.m: Include limits.h for UINT_MAX. * EOControl/EOGenericRecord.m: Ditto. * EOControl/EONSAddOns.m: Ditto. 2004-09-26 David Ayers * EOControl/EOObserver.m: Update includes. Document classes and methods. (+[EOObserverCenter addObserver:forObject:]): Do not retain object. Add logging. (+[EOObserverCenter removeObserver:forObject:]): Do not release object. (+[EOObserverCenter observerForObject:]): Use +observersForObject: to obtain the observers for overriding subclasses. (+[EOObserverCenter enableObserverNotification]): Raise NSInternalInconsistencyException when called to often. (-[EODelayedObserver objectWillChange:]): Use the receivers observerQueue for overriding subclasses. (-[EODelayedObserver discardPendingNotification]): Ditto. (-[EODelayedObserverQueue enqueueObserver:]): Relocate assertion to safer place. (-[EOObserverProxy initWithTarget:action:priority:]): Implement. (-[EOObserverProxy dealloc],-[EOObserverProxy priority]) (-[EOObserverProxy subjectChanged]): Ditto. * EOAccess/EOEntity.m (-[setName:]): Skip the uniqueing if the name is the same. 2004-09-25 David Ayers * EOControl/EOObserver.m (-[EODelayedObserverQueue _notifyObservers:]): Fix prototype set queue flag. (-[EODelayedObserverQueue enqueueObserver:]): Fix setting of queue flag and registering observers. (-[EODelayedObserverQueue dequeueObserver:]): Break linked list. Correct highestNonEmptyQueue setting. Fix setting of queue flag. (-[EODelayedObserverQueue notifyObserversUpToPriority]): Dequeue observers during processing. 2004-09-24 David Ayers * EOAccess/EOEntity.m (-[setName:],-[setExternalName:]) (-[setExternalQuery:],-[setClassName:],-[setDocComment]): Use ASSIGNCOPY instead of ASSIGN to deal with mutable strings. 2004-09-09 Simon Stapleton David Ayers * config.h.in (HAVE_DECL_PQFREEMEM, HAVE_DECL_PQUNESCAPEBYTEA): Added new test markers. * config/postgres.m4; Add tests for new markers. * configure: Regenerated. * EOAdaptors/Postgres95/Postgres95Compatibility.h: New file. * EOAdaptors/Postgres95/Postgres95Adaptor.m: Change default data type for NSData to bytea. * EOAdaptors/Postgres95/Postgres95SQLExpression.m ([Postgres95SQLExpression formatValue:forAttribute:]) Format bytea data. * EOAdaptors/Postgres95/Postgres95Values.m ([Postgres95Values newValueForBytesType:length:attribute:]): Decode bytea data. 2004-09-08 David Ayers * EOAccess/EOAttribute.m (-[copyWithZone:]): Override implementation of GCObject as it isn't safe to copy EOAttributes. * EOAccess/EOEntity.m (-[addAttribute:]); Use NSAsserts to check integrity of parameters. Insure that attribute is not used by other entity or stored procedure. (-[_setModel:]): Rename from -setModel:. Assert that entity is not used by another model. * EOAccess/EOEntityPriv.h (-[_setModel:]): Rename from -setModel:. * EOAccess/EOModel.m (-[_addEntity:]): Use -_setModel: instead of -setModel:. (-[removeEntity:]): Ditto. (-[addEntity:)): Use NSAssert to insure that entity name is unique and that the entity is not being used by other mode. Use -_setModel: instead of -setModel:. 2004-09-07 David Ayers * EOAccess/EOAttribute.h * EOAccess/EOAttribute.m (_parent, -[setParent:]): Do not retain backward reference. (-[setName:]): Mark as editited if parent is an entity. * EOAccess/EOModel.m (-[_updateCache]): New method. (-[_addEntity:]): Set model via public API. * EOAccess/EOEntity.m * EOAccess/EOEntityPriv.h (-[EOModel _updateCache]): Declare private EOModel method. (-[setName:]): Insure model updates its cache. (-[setModel:]): Set instance variable directly without retaining it. (-[_setModel:]): Remove. (-[gcDecrementRefCountOfContainedObjects]): Do not decrement backward reference to owning model. * EOAccess/EORelationship.m (-[setDefinition:]): Allow definition to unset. (-[setEntity:]): Mark both old and new entity as edited. * EOAccess/EOStoredProcedure.m (-[initWithPropertyList:]): Make return type explicit. * EOControl/EOGenericRecord.m (-[_infoForInstanceVariableNamed:retType:retSize:retOffset:]): Replace usage of deprecated GSFindInstanceVariable with GSObjCFindVariable. (-[_getValueForKey:selector:type:size:offset:]): Replace usage of deprecated GSGetValue with GSObjCGetValue. (-[_setValueForKey:object:selector:type:size:offset:]): Replace usage of deprecated GSSetValue with GSObjCSetValue. * EOControl/EOFault.m (+/-[respondsToSelector:]): Replace usage of deprecated GSGetInstanceMethod with GSGetMethod. 2004-06-23 David Ayers * EOAccess/EOAccessFault.m: Include privat headers locally. * EOAccess/EOAdaptor.m: Ditto. * EOAccess/EOAdaptorChannel.m: Ditto. * EOAccess/EOAdaptorContext.m: Ditto. * EOAccess/EOAttribute.m: Ditto. * EOAccess/EODatabaseChannel.m: Ditto. * EOAccess/EODatabaseContext.m: Ditto. * EOAccess/EODatabaseOperation.m: Ditto. * EOAccess/EOModel.m: Ditto. * EOAccess/EORelationship.m: Ditto. * EOAccess/EOSQLExpression.m: Ditto. * EOAccess/EOSQLQualifier.m: Ditto. * EOAccess/EOEntity.h: Remove declarations of privat methods. Reorder declaraions. (+[entity], +[entityWithPropertyList:owner:]): Deprecate. (-[sharedObjectFetchSpecificationNames]): New method. (-[setSharedObjectFetchSpecificationsByName:]: Ditto. (-[addSharedObjectFetchSpecificationByName:]: Ditto. (-[removeSharedObjectFetchSpecificationByName:]: Ditto. * EOAccess/EOEntityPriv.h: Add declarations of privat methods. Reorder declarations. * EOAccess/EOEntity.m: Reorder implementations according to headers. Include privat headers locally. (+[entity], +[entityWithPropertyList:owner:]): Deprecate. (-[sharedObjectFetchSpecificationNames]): New method. (-[setSharedObjectFetchSpecificationsByName:]: Ditto. (-[addSharedObjectFetchSpecificationByName:]: Ditto. (-[removeSharedObjectFetchSpecificationByName:]: Ditto. * EOAccess/EOEntity.m: Adapt usage of deprecated -[entity...] and privat methods. * EOAccess/EOModel.m: Ditto. * EOAdaptors/Postgres95/Postgres95SQLExpression.m: Ditto. * TODO: Add comment. 2004-06-21 David Ayers * EOControl/EONSAddOns.h/m (GDL2_ActivateCategory, GDL2_ActivateAllGDL2Categories) (GDL2_DumpMethodList): New functions. * EOControl/EOKeyValueCoding.m (initialize): Make order of initialization more thread safe. (NilToNull): Remove helper class. ([NSObject -unableToSetNilForKey:]): Implement. ([NSObject -GDL2KVCNSObjectICategoryID]): New method. ([NSObject +load]): Ditto. ([NSDictionary -GDL2KVCNSDictionaryICategoryID]): Ditto. ([NSDictionary +load]): Ditto. ([NSMutableDictionary -GDL2KVCNSDictionaryICategoryID]): Ditto. ([NSMutableDictionary +load]): Ditto. * EOControl/EOClassDescription.m ([NSObject -GDL2CDNSObjectICategoryID]): New method. ([NSObject +load]): New method. ([NSObject -validateValue:forKey:]) Introduce temporary variable to allow correct formatting. ([NSObject -snapshot]): Reformat log string. ([NSObject -addObject], [NSObject -removeObject]) ([NSObject _setObject], [NSObject -editingContext]): Reformat. 2004-06-04 Simon Stapelton * EOControl/EOAndQualifier.m, * EOControl/EOKeyComparisonQualifier.m, * EOControl/EOOrQualifier.m: ([-initWithKeyValueUnarchiver]): Implement. 2004-05-16 David Ayers * EOAccess/EODatabaseContext.m: Replace EOFLOGObjectLevel and EOFLOGObjectLevelArgs with NSDebugMLLog. Remove some superfluos NSLogs and replace others woth NSDebugMLLogs. Reformat. * EOAccess/EOEntity.m ([EOEntity primaryKeyForGlobalID:]): Ditto. 2004-05-15 Matt Rice * EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres95Channel describeModelWithTableNames:]): Set class properties. 2004-05-15 David Ayers * EOAdaptors/Postgres95/Postgres95Values.m (-[NSCalendarDate postgres95Format]): Return ISO date format. (-[NSCalendarDate setPostgres95Format:]): Deprecate method. * EOAdaptors/Postgres95/Postgres95Channel.m (-[Postgres95Channel _setDateStyle]): New method to request ISO date format. (-[Postgres95Channel openChannel]): Call -_setDateStyle to set ISO date fromat. * EOAccess/EOAttribute.m ([EOAttribute initialize]): Implement class caching. ([EOAttribute *]): Use cached classes. ([EOAttribute adaptorValueByConvertingAttributeValue:]): Only convert attributes when necessary. 2004-05-14 David Ayers * EOControl/EOEditingContext.m (-[EOEditingContext validateChangesForSave]): Use processed changes instead of unprocessed changes. 2004-05-12 Matt Rice * EOControl/EOQualifier.h: Add NSMutableSet class declaration. 2004-05-12 David Ayers * EOAccess/EOModel.m ([EOModel entityNamed:]): Fix typo. * EOControl/EOQualifier.h/m ([EOQualifier allQualifierKeys]) ([EOQualifier addQualifierKeysToSet:]): Implement new methods. * EOControl/EOAndQualifier.m * EOControl/EOKeyComparisonQualifier.m * EOControl/EOKeyValueQualifier.m * EOControl/EONotQualifier.m * EOControl/EOOrQualifier.m ([EO*Qualifier addQualifierKeysToSet:]): Implement new method. 2004-05-07 David Ayers Alexander Malmberg * EOControl/EONSAddOns.h/m ([NSString initialCapitalizedString]): New method. * EOControl/EOKeyValueCoding.m ([NSArray-valueForKey:]): Allow ommitting keys for computational key paths. Correct key capitalization. Update documentation. ([NSArray-valueForKeyPath]): Ditto. 2004-04-23 David Ayers * EOAccess/EOAdaptor.m ([EOAdaptor availableAdaptorNames]): Return unique names if multiple Adaptors are found. Document. Reported by Matt Rice . 2004-04-21 David Ayers * README: New file. * INSTALL: New file. * NEWS: New file. * Version: Update to 0.9.1. 2004-04-20 David Ayers * EOAdaptors/Postgres95/LoginPanel/GNUmakefile * EOAdaptors/Postgres95/LoginPanel/Makefile.postamble: Allow clean and distclean targets when -gui is not available. 2004-04-18 David Ayers * EOControl/EOGlobalID.h: Correct size of _bytes. * EOControl/EOGlobalID.m: Update includes. (sequence): Define plattform independently. (sequenceRev): Remove. ([EOGlobalID isEqual:]): Fix declaration. ([EOTemporaryGlobalID init]): Ditto. ([EOTemporaryGlobalID isEqual:]): Ditto. Remove access instance variable directly instead of relying on superflous accessor method. ([EOTemporaryGlobalID assignGloballyUniqueBytes]): Rewrite and document. ([EOTemporaryGlobalID _bytes]): Remove. ([EOTemporaryGlobalID encodeWithCoder:]): Encode contents of bytes instead of pointer value. ([EOTemporaryGlobalID decodeWithCoder:]): Decode contents of bytes instead of pointer value. 2004-04-17 David Ayers * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.m (vfmaxf) Make static. Reformat. ([Postgres95LoginPanel dealloc]): Use DESTROY in favor of RELEASE. ([Postgres95LoginPanel init]): Minor reformatting and more tempRect usage. * EOAccess/EODatabase.m ([EODatabase dealloc]): Use DESTROY in favor of release. * EOAccess/EOExpressionArray.m ([EOExpressionArray dealloc]): Ditto. * EOAdaptors/Postgres95/Postgres95Adaptor.m ([Postgres95Adaptor dealloc]): Ditto. * EOControl/EOCheapArray.h ([EOCheapArray dealloc]) Remove declaration. * EOControl/EOKeyValueArchiver.m ([EOKeyValueArchivingContainer dealloc]): Ditto. * EOControl/EOMutableKnownKeyDictionary.h ([EOMKKDInitializer dealloc]), ([EOMKKDKeyEnumerator dealloc]), ([EOMKKDSubsetMapping dealloc]), ([EOMKKDArrayMapping dealloc]), ([EOMutableKnownKeyDictionary dealloc]) Ditto. 2004-04-17 Matt Rice * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.m (vfmaxf) New function. ([Postgres95LoginPanel init]): Redo UI layout. ([Postgres95LoginPanel _databaseNames]): Reformat. 2004-04-17 David Ayers * */*.h: Format declarations consistently. Add -*-objc-* shabang line. Replace remaining extern declarations with GDL2*_EXPORT. 2004-04-16 David Ayers * EOAccess/EOModel.m ([EOModel writeToFile:]) Set path (and name implicitly) of the receiver. Create backup file when necessary after removing the potentially existing backup file. Raise NSInvalidArgumentExceptions upon failures. Add support for .eomodel files. Document. ([EOModel _verifyBuiltEntityObject:named:]): Add support for .eomodel files. 2004-04-15 David Ayers * EOAdaptors/Postgres95/Makefile.preamble: Add link flags for Darwin. * EOAdaptors/Postgres95/LoginPanel/GNUmakefile: Ditto. * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.m: Include GNUstep headers for non-*-gnu-* configurations. * config/postgres.m4: Generalize test for PostgreSQL. * configure: Regenerated. * Makefile.postamble: Remove autom4te.cache on distclean. * TODO: Start tracking major TODO's until formal auditing is available. * EOAccess/EODatabase.m * EOControl/EOGlobalID.h: Added documentation about EOGlobalIDChangedNotification semantics. * EOControl/EOSortOrdering.m: Removed superfluous define. 2004-04-12 David Ayers * EOAdaptors/Postgres95/LoginPanel/Makefile.postamble: Create symlink before building. Error reported by Ludovic Marcotte and Matt Rice . 2004-03-29 David Ayers * EOAdaptors/Postgres95/Postgres95SQLExpression.m ([Postgres95SQLExpression columnTypeStringForAttribute:]): Implement special handling for text types to ignore precision and width as suggested by Matt Rice . * EOAccess/EOModelGroup.m ([EOModelGroup globalModelGroup]): Create single global model group and cache it to allow persistant manual adding of models. 2004-03-19 David Ayers * *.[hm] Use GNUSTEP in favor of NeXT_Foundation_LIBRARY as requested by Marcus Mueller . 2004-03-10 David Ayers * EOAdaptors/Postgres95/LoginPanel/Makefile.postamble: Don't remove GNUmakefile on distclean. * EOAdaptors/Postgres95/LoginPanel/GNUmakefile: Add include directive for local GDL2 headers. 2004-03-08 Matt Rice * EOAdaptors/Postgres95/Postgres95Channel.h ([Postgres95Channel describeDatabaseNames]): Declare method. ([Postgres95Channel userNameIsAdministrative:]): Ditto. * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.m ([Postgres95LoginPanel init]): Added parentheses to assignment to quiet compiler warning. 2004-03-08 David Ayers * EOAdaptors/Postgres95/Postgres95Adaptor.m ([Postgres95Adaptor createPGconn]): Insure cleanup code gets executed before exception is raised. * EOAdaptors/Postgres95/LoginPanel/Makefile.postamble: New file to create symlink to be able to include local adaptor headers. 2004-03-06 David Ayers * configure.ac: Replace generation of EOAdaptors/Postgres95/Makefile.preamble with EOAdaptors/Postgres95/config.mak. * configure: Regenerate. * EOAdaptors/Postgres95/Makefile.postamble: Replace removal of EOAdaptors/Postgres95/Makefile.preamble with EOAdaptors/Postgres95/config.mak. * EOAdaptors/Postgres95/Makefile.preamble: New file replacing... * EOAdaptors/Postgres95/Makefile.preamble.in: ...this file. * EOAdaptors/Postgres95/config.mak.in: New file. * EOAdaptors/Postgres95/LoginPanel/GNUmakefile: Correct comment identifier. Include config.mak and other potential makefiles. * EOAdaptors/Postgres95/Postgres95SQLExpression.m ([Postgres95SQLExpression dropDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary:]): Remove excess quotes. 2004-03-06 Matt Rice * EOAccess/EOAdaptor.m ([EOAdaptor dropDatabaseWithAdministrativeConnectionDictionary: administrativeConnectionDictionary:]): Correct documentation. ([EOAdaptor administrativeConnectionDictionaryForAdaptor:]): Documented. * EOAdaptors/Postgres95/GNUmakefile.in: Added LoginPanel subproject. * EOAdaptors/Postgres95/Postgres95Adaptor.m ([Postgres95Adaptor assertConnectionDictionaryIsValid]): Added test to insure channel is open befor attempting to close. ([Postgres95Adaptor createPGconn]): Added exception to raise. * EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres95/Postgres95Channel describeDatabaseNames]): Implemented new method. ([Postgres95 userNameIsAdministrative]): Ditto. * EOAdaptors/Postgres95/LoginPanel/GNUmakefile: New file. * EOAdaptors/Postgres95/LoginPanel/Postgres95LoginPanel.h/m: Ditto. 2004-03-06 David Ayers * EOControl/Makefile.preamble: Fix --disable-flattend. 2004-02-26 David Ayers * EOControl/EODebug.h: Include missing header for non-*-gnu-*. * EOAccess/EOAdaptor ([EOAdaptor _performAdministativeStatementsForSelect: connectionDictionary:administrativeConnectionDictionary]): Add cast to silence warning. * EOControl/EOCheapArray.m ([EOCheapArray autorelease]): Replace objc_thread_id with GSCurrentThread. ([EOCheapArray release]): Ditto. ([EOCheapArray retainCount]): Ditto. ([EOCheapArray retain]): Ditto. ([EOCheapArray dealloc]): Ditto. ([EOCheapArray shallowCopy]): Ditto. * EOControl/EOFault.m: Include missing header. ([EOFault dealloc]): Replace objc_thread_id with GSCurrentThread. * Tools/EOModel+GSDoc.m: Fix include. 2004-02-26 Matt Rice * EOAdaptors/Postgres95/Postgres95Channel.m: Added missing include. ([Postgres95Channel _describeForeignKeysForEntity:forModel:]): Fix typo to unsure using correct entity. 2004-02-25 David Ayers * EOControl/EOCheapArray.m ([EOCheapArray dealloc]): Replace usage of objc_thread_id with GSCurrentThread. * EOControl/EODebug.m: Include headers for non *-gnu-*. Format function headers according to GNU standards. (objectDescription): Make static and return something meaningfull on failure. (IVarInString, TypeToNSString, DumpIVar): Make static and format function headers according to GNU standards. (EOFLogDumpObject_, EOFLogAssertGood_): Format function headers according to GNU standards. * EOAccess/EOSQLExpression.m ([EOSQLExpression foreignKeyConstraintStatementsForRelationship:]): Create constraint even though no inversRelationship exists. ([EOSQLExpression foreignKeyConstraintStatementsForEntityGroup:]): Create constraints for all entities in the group which have no parent entity. ([EOSQLExpression foreignKeyConstraintStatementsForEntityGroups:]): Reformat for source level debuging. ([EOSQLExpression tableListWithRootEntity:]): Honor EOAdaptorQuotesExternalNames. ([EOSQLExpression createTableStatementsForEntityGroup:]): Ditto. ([EOSQLExpression dropTableStatementsForEntityGroup:]): Ditto. ([EOSQLExpression primaryKeyConstraintStatementsForEntityGroup:]): Ditto. ([EOSQLExpression primaryKeySupportStatementsForEntityGroup]): Ditto. ([EOSQLExpression dropPrimaryKeySupportStatementsForEntityGroup:]): Ditto. ([EOSQLExpression prepareConstraintStatementForRelationship: sourceColumns:destinationColumns:]): Ditto. * EOAdaptors/Postgres95/Postgres95SQLExpression.h/m ([Postgres95SQLExpression externalNameQuoteCharacter]): Remove. ([Postgres95SQLExpression createDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary]): Honor EOAdaptorQuotesExternalNames. ([Postgres95SQLExpression dropDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary:]): Ditto. ([Postgres95SQLExpression dropTableStatementsForEntityGroup:]): Ditto. ([Postgres95SQLExpression tableListWithRootEntity:]): Ditto. * EOAdaptors/Postgres95/Postgres95Channel.m: Define EOAdaptorDebugLog convinience macro and use it throughout the file. ([Postgres95Channel _describeResults]): Rename externalName to externalType. Avoid nested messages for source level debugging. ([Postgres95Channel _describeBasicEntityWithName:forModel:]): New support method derived from describeModelWithEntityNames:. ([Postgres95Channel _describeForeignKeysForEntity:forModel:]): Ditto. ([Postgres95Channel describeModelWithEntityNames:]): Use new support methods in an autotelease pool. ([Postgres95Channel primaryKeyForNewRowWithEntity:]): Honor EOAdaptorQuotesExternalNames. * EOAdaptors/Postgres95/Postgres95Adaptor.m: Reorder external type mappings to correspond to EOAdaptorValueTypes. * EOAccess/EOModel.m ([EOModel beautifyNames]): Remove log and reformat comments. 2004-02-23 David Ayers * EOAccess/EOAdaptor.m ([EOAdaptor sharedLoginPanelInstance]): Maintain instances on a per class basis as reported by Matt Rice. 2004-02-22 David Ayers * EOAccess/EOAdaptor.h/m: New globals for GDL2 specific administrative key handling. ([EOAdaptor sharedLoginPanelInstance]): Implemented. * EOAccess/EOSQLExpression.m ([EOSQLExpression _administrativeDatabaseStatementsForSelector:forEntityGroup:], [EOSQLExpression _dropDatabaseStatementsForEntityGroups:], [EOSQLExpression _createDatabaseStatementsForEntityGroups:]): Implemented new private support methods. ([EOSQLExpression schemaCreationStatementsForEntities:options:]): Added support for EODropDatabaseKey and EOCreateDatabaseKey. 2004-02-19 David Ayers * EOControl/Makefile.postamble: Remove obsolete dependency and target. Add dependancy and targets for target specific config.h file. * EOAccess/Makefile.preamble: Add include option for target specific config.h file. * EOAdaptors/Postgres95/Makefile.preamble.in: Ditto. * EOModeler/Makefile.preamble: Ditto. * Tools/Makefile.preamble: Ditto. * EOAccess/Makefile.postamble: Comment empty target. * EOControl/EODebug.m (EOFLogC_): Log thread in a portable fashion. 2004-02-14 Matt Rice * EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres95Channel describeModelWithTableNames:]): Implemented. 2004-02-12 David Ayers * EOAccess/EOAdaptor.h ([EOLoginPanel administrativeConnectionDictionaryForAdaptor]): Correct spelling. ([EOLoginPanel runPanelForAdaptor:validate:]): Move to EODeprecated.h. ([EOLoginPanel runPanelForAdaptor:validate:allowsCreation:]): Declared. * EOAccess/EOAdaptor.m: ([EOAdaptor adaptorWithModel:]): Reformat. ([EOAdaptor adaptorWithName:]): Do not append EOAdaptor redundantly. ([EOAdaptor _performAdministativeStatementsForSelector: connectionDictionary:administrativeConnectionDictionary:]): Implemented. ([EOAdaptor createDatabaseWithAdministrativeConnectionDictionary:]): Documented and implemented. ([EOAdaptor dropDatabaseWithAdministrativeConnectionDictionary]): Ditto. ([EOAdaptor runLoginPanelAndValidateConnectionDictionary]): Ditto. ([EOAdaptor runLoginPanel]): Ditto. ([EOAdaptor assignExternalInfoForAttribute:]): Ditto. ([EOAdaptor assignExternalInfoForEntity]): Ditto. ([EOAdaptor assignExternalInfoForEntireModel:]): Ditto. ([EOAdaptor internalTypeForExternalType:model:]): Documented. ([EOAdaptor externalTypesWithModel]): Ditto. ([EOAdaptor assignExternalTypeForAttribute]): Ditto. ([EOLoginPanel runPanelForAdaptor:validate:allowsCreation:]): Implemented. ([EOLoginPanel runPanelForAdaptor:validate:]): Deprecated. * EOAccess/EODeprecated.h ([EOLoginPanel runPanelForAdaptor:validate:]): Deprecated. * EOAdaptors/Postgres95/Postgres95Adaptor.m ([Postgres95Adaptor createDatabaseWithAdministrativeConnectionDictionary:]): Removed. ([Postgres95Adaptor dropDatabaseWithAdministrativeConnectionDictionary:]): Ditto. * EOAdaptors/Postgres95/Postgres95SQLExpression.m ([Postgres95SQLExpression createDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary:]): Implemented. ([Postgres95SQLExpression dropDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary:]): Ditto. * EOControl/EOClassDescription.m ([EOClassDescription initialize]): Use local GSLazyRecursiveLock instead of old locking mechanism. ([EOClassDescription classDelegate]): Ditto. * EOControl/EOGenericRecord.m: Use GSLazyRecursiveLock instead of NSRecursiveLock. * EOControl/EONSAddOns.h/m (GDL2GlobalLock, GDL2GlobalRecursiveLock) Remove. (GDL2GlobalLockVendor) Ditto. (GSUseStrictWO451Compatibility): Use local GSLazyRecursiveLock instead of old locking mechanism. * EOControl/EOFault.m: Remove superfluous include. * EOControl/EOKeyValueQualifier.m ([EOKeyValueQualifier initWithKey:operatorSelector:value:]): Use EONull instance if value is nil. ([EOKeyValueQualifier evaluateWithObject:]): Use EONull instance if object is nil. * EOControl/EOQualifier.m (getKey): Always interpret 'attName = nil' qualifiers as EOKeyValueQualifiers. * EOControl/EODebug.h/m(EOFLogAssertGood_): Remove dependancy on superfluous category. ([NSObject isa]): Remove category. 2004-02-01 David Ayers * EOAccess/EOAdaptor.m ([EOAdaptor adaptorWithName:]): Use NSSearchPathForDirectoriesInDomains() instead of GNUstep specific environment variable. 2004-01-31 David Ayers * EOAccess/EOAccessFault.m: Add #includes for non *-gnu-*. * EOAccess/EOAdaptorOperation.m: Ditto. * EOAccess/EOAttribute.m: Ditto. * EOAccess/EODatabaseDataSource.m: Ditto. * EOAccess/EODatabaseOperation.m: Ditto. * EOAccess/EOEntity.m: Ditto. * EOAccess/EOExpressionArray.m: Ditto. * EOAccess/EOJoin.m: Ditto. * EOAccess/EORelationship.m: Ditto. * EOAccess/EOSQLExpression.m: Ditto. * EOAdaptors/Postgres95/Postgres95Adaptor.m: Ditto. * EOAdaptors/Postgres95/Postgres95Channel.m: Ditto. * EOAdaptors/Postgres95/Postgres95Context.m: Ditto. * EOAdaptors/Postgres95/Postgres95SQLExpression.m: Ditto. * EOAdaptors/Postgres95/Postgres95Values.m: Ditto. * EOControl/EOCheapArray.m: Ditto. * EOControl/EODetailDataSource.m: Ditto. * EOControl/EOGenericRecord.m: Ditto. * EOControl/EOKeyComparisonQualifier.m: Ditto. * EOControl/EOKeyGlobalID.m: Ditto. * EOControl/EOKeyValueQualifier.m: Ditto. * EOControl/EOMutableKnownKeyDictionary.m: Ditto. * EOControl/EONSAddOns.m: Ditto. * Tools/EOModel+GSDoc.m: Remove usage of -version. 2004-01-30 David Ayers * GNUmakefile: Build EOControl before EOAccess. * EOAccess/GNUmakefile: Remove LIBRARIES_DEPEND_UPON handling. * EOControl/GNUmakefile: Ditto. * EOModeler/GNUmakefile: Ditto. * Tools/GNUmakefile: Ditto. * EOAccess/Makefile.preamble: Correct LIBRARIES_DEPEND_UPON handling. * EOControl/Makefile.preamble: Ditto. * EOModeler/Makefile.preamble: Ditto. * Tools/Makefile.preamble: Ditto. Add -lgnustep-baseadd as ADDITIONAL_TOOL_LIBS for non-*-gnu-*. 2004-01-29 David Ayers * EOAccess/GNUmakefile: Test FOUNDATION_LIB to determine whether to link -base or -baseadd. * EOControl/GNUmakefile: Ditto. * EOModeler/GNUmakefile: Ditto. * Tools/GNUmakefile: Ditto. Update title. * EOAccess/EOAdaptor.m: Include GNUstep-specific headers for non-GNUstep systems. * EOAccess/EOAdaptorChannel.m: Ditto. * EOAccess/EOAdaptorContext.m: Ditto. * EOAccess/EOAttribute.m: Ditto. * EOAccess/EODatabaseChannel.m: Ditto. * EOAccess/EODatabaseDataSource.m: Ditto. * EOAccess/EOEntity.m: Ditto. * EOAccess/EOModel.m: Ditto. * EOAccess/EOModelGroup.m: Ditto. * EOAccess/EORelationship.m: Ditto. * EOAccess/EOSQLQualifier.m: Ditto. * EOAccess/EOUtilities.m: Ditto. * EOControl/EOAndQualifier.m: Ditto. * EOControl/EOClassDescription.m: Ditto. * EOControl/EODataSource.m: Ditto. * EOControl/EOEditingContext.m: Ditto. * EOControl/EOFault.m: Ditto. * EOControl/EOFaultHandler.m: Ditto. * EOControl/EOFetchSpecification.m: Ditto. * EOControl/EOKeyValueArchiver.m: Ditto. * EOControl/EOKeyValueQualifier.m: Ditto. * EOControl/EOMutableKnownKeyDictionary.m: Ditto. * EOControl/EONSAddOns.m: Ditto. * EOControl/EOObjectStore.m: Ditto. * EOControl/EOObjectStoreCoordinator.m: Ditto. * EOControl/EOObserver.m: Ditto. * EOControl/EOOrQualifier.m: Ditto. * EOControl/EOQualifier.m: Ditto. * EOControl/EOUndoManager.m: Ditto. * EOModeler/EOModelExtensions.m: Ditto. * EOAccess/EOModel.h/m (+/-[EOModel version]) Remove. ([EOModel init]): Handle version internally. ([EOModel encodeTableOfContentsIntoPropertyList:]): Ditto. ([EOModel encodeIntoPropertyList:]): Ditto. * EOAccess/EODatabaseContext.m ([EODatabaseContext dealloc]): Use NSCountHashTable instead of NSCountMapTable on hash table. * EOAccess/EOAttribute.m ([EOAttribute newValueForBytes:length:]): Added casts to avoid warnings. 2003-11-28 Manuel Guesdon * EOAccess/EOAttribute.m: o introducing new number types: ('u' for long long / int8 and 'U' for unsigned long long) * EOAdaptors/Postgres95/Postgres95Adaptor.m: o added int8, bigint * EOAdaptors/Postgres95/Postgres95Channel.m: o handling bigint o fixed types for int2 and int8 * EOAdaptors/Postgres95/Postgres95Values.m: o added missing number types o introducing new number types: ('u' for long long / int8 and 'U' for unsigned long long) * EOControl/EONSAddOns.m/.h o added number accessors for NSString o added NSObject -performSelector:withObject:withObject:withObject: * EOAccess/EODatabaseContext.m: o in -prepareForSaveWithCoordinator:editingContext: Try harder to find primary key (for linked objects with more than one attribute for PK) * EOAccess/EODatabaseContextPriv.h o added -_primaryKeyForObject:raiseException: * EOAccess/EOEntity.m/.h: o added _instanceDictionaryInitializer. Permit to have a restricted dictionary initializer (i.e. propertyDictionaryInitializer minus instance object ivars). o added NSObject +_instanceDictionaryInitializerExcludedPropertyNames o more information in log/exception in _parseRelationshipPath o added -_instanceDictionaryInitializer o added - _dictionaryForInstanceProperties o added -_classForInstances * EOAccess/EOModel.m: o added asserts o clean warnings * EOAccess/EORelationship.m: o asserts o fix in -isReciprocalToRelationship: * EOAccess/EOSQLExpression.m/.h: o renamed _useAliases to _flags.useAliases o added _flags.hasOuterJoin o call qualifier -sqlStringForSQLExpression: instead of switching on qualifier class in -sqlStringForArrayOfQualifiers:operation: o asserts o fill _contextStack o added outer joins checks in -_flattenRelPath:entity: (Used in Postgresql) * EOAdaptors/Postgres95/Postgres95SQLExpression.m: o subclass joinExpression to avoid building join expression (it's now build in -tableListWithRootEntity o sublass -tableListWithRootEntity to add joins in it. * EOAccess/EOSQLQualifier.m o fix in EOOrQualifier -sqlStringForSQLExpression: use sqlExpression -sqlStringForDisjoinedQualifiers: (problem was missing () around expression) * EOControl/EOAndQualifier.m: o implemented -_addBindingsToDictionary: o implemented -qualifierWithBindings:requiresAllVariables: o implemented -validateKeysWithRootClassDescription: * EOControl/EOKeyValueQualifier.m: o implemented -validateKeysWithRootClassDescription: o implemented -initWithKeyValueUnarchiver: o removed duplicate -initWithKeyValueUnarchiver: and -encodeWithKeyValueArchiver o implemented -_addBindingsToDictionary: o implemented - qualifierWithBindings:requiresAllVariables: * EOControl/EOOrQualifier.m: o implemented -_addBindingsToDictionary: o implemented -qualifierWithBindings:requiresAllVariables: o implemented -validateKeysWithRootClassDescription: * EOControl/EONotQualifier.m: o implemented -_addBindingsToDictionary: o implemented -validateKeysWithRootClassDescription: o implemented -qualifierWithBindings:requiresAllVariables: * EOControl/EOQualifier.m: o implemented _validateKey:withRootClassDescription: o implemented -validateKeysWithRootClassDescription: o implemented -bindingKeys o implemented -keyPathForBindingKey: o added EOQualifierVariableSubstitutionException; * EOControl/EOClassDescription.m/h: o added -dictionaryForProperties o added EOEntityClassDescription -dictionaryForProperties wich use entity -_dictionaryForProperties * EOControl/EOGenericRecord.m/h: o use EOClassDescription -dictionaryForProperties instead of building itself it's dictionary so we can always use the same EOMKKDInitializer to save (lots of) memory. * EOControl/EOEditingContext.m/.h: o added -setLevelsOfUndo: (for GNustepWeb) * EOControl/EOFetchSpecification.m/.h: o implemented -encodeWithKeyValueArchiver: * EOControl/EOKeyValueArchiver.m: o cleaned 2003-10-24 David Ayers * EOControl/EONSAddOns.h (GDL2_BUFFER): Added experimental macro. * EOControl/EOQualifier.m (_isLike): New static function to implement -isLike: and -isCaseInsensitiveLike:. (-[NSString isLike:]): Implemented. (-[NSString isCaseInsensitiveLike:]): Ditto. (-[NSArray filteredArrayUsingQualifier:]): Adapted to use experimental GDL2_BUFFER macro. 2003-10-23 David Ayers * EOControl/EOFetchSpecification.m (-[EOFetchSpecification fetchSpecificationNamed:entityNamed:]}: Implemented upon bug report by Philip Moetteli. * EOAccess/EOAttributePriv.h (-[EOAttribute _valueClass]): Declare new private method. * EOAccess/EOAttribute.m: Remove declaration of unsused static variable. Format documentation. (-[EOAttribute serverTimeZone]): Remove duplicate implementation which is always overriden by the category and correct the category implementation. (-[EOAttribute valueClassName]): Minor optimisation. (-[EOAttribute externalType]): Ditto. (-[EOAttribute valueType]): Ditto. (-[EOAttribute newValueForBytes:length:]): Use -_valueClass method to insure correct valueClass usage. Bug reported by Philip Moetteli. (-[EOAttribute newValueForBytes:length:encoding:]): Ditto. (-[EOAttribute adaptorValueType]): Ditto. (-[EOAttribute validateValue:]): Ditto. Use -width method to insure correct usage of width with respect to prototypes. (-[EOAttribute _valueClass]): New private method. 2003-09-29 Philip Moetteli * EOControl/EOClassDescription.m (+[EOClassDescription initialize]): Initialize model group after callback tables are initilized. 2003-09-10 David Ayers * EOControl/EOFault.m (+[EOFault respondsToSelector:]): Use GSObjCRuntime functions and correct casts. (-[EOFault respondsToSelector:]): Correct casts. * EOControl/EOKeyComparisonQualifier.m * EOControl/EOKeyValueCoding.m * EOControl/EOKeyValueQualifier.m * EOControl/EOQualifier.m * EOControl/EOSortOrdering.m (-[NSObject compare:]): Add declaration to prepare for removal of declaration from -base. (-[EOKeyComparisonQualifier evaluateWithObject:]): Adapt vraiables and casts to use correct prototype. (-[EOKeyValueQualifier evaluateWithObject:]): Ditto (-[NSArray computeMaxForKey:]): Ditto. (-[NSArray computeMinForKey:]): Ditto. 2003-08-25 Matt Rice * *.h/m: Updated to new header layout. * Tools/eoutil.m: Added missing include. 2003-08-23 David Ayers * EOControl/EOKeyValueCoding.h/m: Rewritten and documented. Declared and documented EOKeyValueCoding categories currently implemented by gnustep-base/Foundation in NSKeyValueCoding. Removed FOUNDATION_HAS_KVC conditionals as gnustep-base/Foundation implement NSKeyValueCoding. (-[NSObject takeStoredValuesFromDictionary:]): Added declaration reportedly missing in Apple's headers to compelte EOKeyValueCoding declarations. Most implementations rewritten. * EOControl/EONull.h/m: Define EONull to NSNull to allow pointer equality checks. Implement EONull as NSNull subclass that returns the NSNull instance. Remove old assertions. 2003-07-11 David Ayers * *.m: Include GNUstep.h if GNUSTEP is not defined for OS X. 2003-06-26 Manuel Guesdon * config.h.in: o added EMIT_TODO control * EOAccess/EOAccessFault.m: o commented debug logs * EOAccess/EODatabaseContext.m: o more information in asserts o asserts o fix in -relayPrimaryKey:object:entity: for nil 1:1 relationship value o add -forgetSnapshotForGlobalID call in -refaultObject:withGlobalID:editingContext: o add -forgetSnapshotForGlobalID database call in -forgetSnapshotForGlobalID: * EOAccess/EOEntity.m: o logs o fix in -awakeObject:fromInsertionInEditingContext: to avoid setting already present values o reverted code in -awakeObject:fromInsertionInEditingContext: My (old) tests show that we create 1: object not on mandatory property but on propagatesPrimaryKey one if someone has an example of EOF creating an object here without propagatesPrimaryKey, please send it to me. * EOAccess/EOModelGroup.m: o don't autorelease return model group in -globalModelGroup as it will crash. I haven't find why :-( o logs * EOAccess/EOSQLExpression.m: o fix bug in -assembleSelectStatementWithAttributes:lock:qualifier: fetchOrder:selectString:columnList:tableList: whereClause:joinClause:orderByClause:lockClause: by adding () around where and join clause o add detail in sqlStringForSelector:value: exception * EOAdaptors/Postgres95/PostPostgres95Channel.m: o add more information on exceptions * EOAdaptors/Postgres95/Postgres95SQLExpression.m: o fix escaping string in -formatValue:forAttribute: o fix bug in -assembleSelectStatementWithAttributes:lock:qualifier: fetchOrder:selectString:columnList:tableList: whereClause:joinClause:orderByClause:lockClause: by adding () around where and join clause * EOAdaptors/Postgres95/Postgres95Value.m: o Change log in +newValueForDateType:length:attribute: * EOControl/EOCheapArray.m o removed some logs * EOAccess/EOClassDescription.m: o fix in -validateForUpdate o logs * EOControl/Debug.h: o donditional define of NSEmitTODO() * EOControl/EODetailDataSource.h/.m: o added -setDetailKey: * EOControl/EOEditingContext.m o logs * EOControl/EOFetchSpecification.m o logs * EOControl/EOKeyValueCoding.m: o fix in computeSum, computeAverage * EOControl/EOQualifier.m o logs * EOControl/EOSortOrdering.m o use valueForKeyPath: instead of valueForKey: to allow sort on related objects * EOControl/EOUndoManager.h o protection of include 2003-06-23 David Ayers * EOControl/EONSAddOns.h/m: ([NSString -parsedFirstVersionSubstring]): New method. * EOAdaptors/Postgres95/Postgres95Adaptor.h/m: Added include of pg_config.h to access PG_VERSION. Added databaseVersion to list of meaningful connectionDictionary keys. (postgresClientVersion): New function. * EOAdaptors/Postgres95/Postgres95Channel.h/m: Added instance variable to hold the version of the database server. (pgResultDictionary): New static function for debuging. ([Postgres95Channel -_readServerVersion]): New method to set Server Version. ([Postgres95Channel -openChannel]): Call _readServerVersion method. ([Postgres95Channel -describeTableNames]): Adapt select statement according to database version. * Postgres95/Postgres95SQLExpression.m: ([Postgres95SQLExpression +dropTableStatementsForEntityGroup:]): Adapt select statement according to database version supplied in connectionDictionary of the entites model. 2003-06-22 David Ayers * EOControl/EOFault.m ([EOFault -respondsToSelector:]): Adapt to current GSObjCRuntime API. * EOControl/EOUndoManager.h: Correct includes. * EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres95Channel -describeTableNames]): Removed incorrect code left by copy and paste action. Reported by Markus Hitter . 2003-06-01 David Ayers * gdl2.make.in: Set GDL2 as auxiliary preprocessor flag. 2003-05-22 David Ayers * config/postgres.m4: Added /usr/include/postgresql to include search path. * EOControl/EOClassDescription.m ([EOClassDescription +classDescriptionForClass:): Replaced deprecated GSObjCName() with GSNameFromClass(). * EOControl/EOQualifier.m ([EOQualifier +qualifierWithQualifierFormat:varargList:]): Replaced deprecated GSObjCSelectorName() with GSNameFromSelector(). 2003-05-20 David Ayers * EOControl/EOFault.m ([EOFault respondsToSelector:]): Temporarily add private declaration of GSObjCGetMethod() until the replacement is in place. 2003-05-16 David Ayers * EOAccess/EOAttribute.m ([EOAttribute -encodeIntoPropertyList:]): Encode missing aattributes as reported by Dirk Lattermann. Also corrected encoding of parameterDirection. ([EOAttribute initWithPropertyList:owner:]): Corrected parsing of parameterDirection to account for WO 4.5 compatibility and previous encodings. 2003-05-14 David Ayers * EOAccess/EODatabaseDataSource.m ([EODatabaseDataSource -initWithEditingContext:entityName:fetchSpecificationName:]): Create default fetch specification if we cannot obtain one from the entity by name as reported by Dirk Lattermann. * EOAccess/EOEntity.h/m ([EOEntity -addFetchSpecification:withName:]): Corrected name and initialization as reported by Dirk Lattermann. 2003-05-08 David Ayers * EOControl/EOObjectStoreCoordinator.m ([EOObjectStoreCoordinator +initialize]): Insure EODatabaseContext is setup to receive notifications. * EOControl/EOKeyGlobalID.m ([EOKeyGlobalID +globalIDWithEntityName:keys:keyCount:zone:]): Use AUTORELEASE instead of autorelease. * EOControl/EOFault.m ([EOFault +initialize]): Fix initialization of cached class variable. * EOAccess/EODatabaseContext.m ([EODatabaseContext -dealloc]): Corrected debug logs. ([EODatabaseContext +databaseContextWithDatabase:]): Use AUTORELEASE instead of autorelease. ([EODatabaseContext -initWithDatabase:]): Ditto. ([EODatabaseContext -objectsWithFetchSpecification:editingContext:]): Ditto. ([EODatabaseContext -_dbOperationWithGlobalID:object:entity:operator:]): Ditto. ([EODatabaseContext -recordChangesInEditingContext]): Ditto. ([EODatabaseContext -relayAttributesInRelationship:sourceObject:destinationObject:]): Ditto. ([EODatabaseContext -createAdaptorOperationsForDatabaseOperation:attributes:]): Ditto. ([EODatabaseContext -_fireFault:]): Ditto. ([EODatabaseContext -_batchToOne:withHandler:]): Ditto. ([EODatabaseContext -_commitTransaction]): Ditto. ([EODatabaseContext -handleDroppedConnection]): Use RELEASE instead of release. ([EODatabaseContext -databaseOperationForObject:]): Ditto. ([EODatabaseContext -_fireArrayFault:]): Ditto. 2003-05-05 David Ayers * EOAccess/EOEntity.m: Replaced autorelease with AUTORELEASE. ([EOEntity -addRelationship:]): Update _relationshipByName cache. 2003-05-02 David Ayers * EOControl/EOKeyValueCoding.h: Use base/Foundation NSUnknownKeyException for EOUnknownKeyException to allow use of base/Foundation NSKeyValueCoding. * EOControl/EOKeyValueCoding.m: Add EOTargetObjectUserInfoKey and EOUnknownUserInfoKey. ([NSObject +flushAllKeyBindings]): Add method. * GNUmakefile: Remove setting of GNUSTEP_MAKEFILES. * EOAccess/GNUmakefile: Ditto. * EOAdaptors/GNUmakefile.in: Ditto. * EOAdaptors/Postgres95/GNUmakefile.in: Ditto. * EOControl/GNUmakefile: Ditto. * EOModeler/GNUmakefile: Ditto. * Tools/GNUmakefile: Ditto. * EOAccess/EOSQLExpression.m: Import GSCategories.h only for NeXT_Foundation_Library. * EOControl/EOKeyValueCoding.m: Ditto. * EOAccess/EODatabaseContext.m ([EODatabaseContext -setDelegate:]): Fixed assignment in while loop as reported by Stephane Corthesy. * EOControl/EOAndQualifier.m ([EOAndQualifier +qualifierWithQualifiers:]), ([EOAndQualifier -initWithQualifiers:]): Use GS_USEIDLIST to optimize vararg list to array conversion. * EOControl/EOOrQualifier.m ([EOOrQualifier +qualifierWithQualifiers:]), ([EOOrQualifier -initWithQualifiers:]): Ditto. * EOControl/EOClassDescription.m ([EOClassDescription +classDelegate]): Make access to static variable thread safe. * EOControl/EOEdtitingContext.m: Added declarations to avoid compiler warnings. 2003-05-02 Stephane Corthesy * EOControl/EOControl.h: Added inclusion of EOArrayDataSource.h. * EOControl/EOEdtitingContext.m: Added declaration of +[EOEditingContext(EOEditingContextPrivate) _observeUndoManagerNotifications] to avoid compiler warnings. * EOControl/EONSAddOns.m ([NSObject -resultsOfPerformingSelector:withEachObjectInArray:defaultResult:]): Added cast to avoid compiler warning. 2003-04-18 Mirko Viviani * EOAccess/EOAttribute.m ([EOAttribute -awakeWithPropertyList:]): set the prototype. ([EOAttribute -encodeIntoPropertyList:]): likewise. ([EOAttribute -serverTimeZone]): return the value from the prototype. ([EOAttribute -columnName]): likewise. ([EOAttribute -readFormat]): likewise. ([EOAttribute -writeFormat]): likewise. ([EOAttribute -scale]): likewise. ([EOAttribute -precision]): likewise. ([EOAttribute -width]): likewise. ([EOAttribute -allowsNull]): likewise. ([EOAttribute -isReadOnly]): likewise. ([EOAttribute -valueClassName]): likewise. ([EOAttribute -externalType]): likewise. ([EOAttribute -valueType]): likewise. * EOAccess/EOAttribute.h: removed ivar _prototypeName. * EOAccess/EOModel.m ([EOModel -prototypeAttributeNamed:]): implemented. * EOAccess/EOAdaptor.m|.h ([EOAdaptor -prototypeAttributes]): renamed from +prototypes and implemented. 2003-04-15 Mirko Viviani * EOAccess/EOAdaptorContext.h: include EODefines.h and NSString.h 2003-04-01 David Ayers * EOControl/EODeprecated.h: Replaces EODepricated.h. The original post was correct. Sorry! * EOAccess/EODeprecated.h: Ditto. * EOAccess/GNUmakefile: Ditto. * EOControl/EOUndoManager: Ditto. * EOControl/EOClassDescription: Added some comments. Tidied line breakage. ([EOClassDescription +delegete]): Moved to category named Deprecated. ([EOClassDescription +setDelegate:]): Ditto. ([EOClassDescription -displayNameForKey:]): Use AUTORELEASE macro. ([NSObject -snapshot]): Ditto. ([NSObject -updateFromSnapshot]): Ditto. ([NSObject -addObject:toPropertyWithKey:]): Ditto. ([NSObject -removeObject:fromPropertyWithKey:]): Ditto. ([NSException +validateExceptionWithFormat:]): Ditto. ([NSException +aggregateExceptionWithExceptions:]): Ditto. ([NSException -exceptionAddingEntriesToUserInfo:]): Ditto. * EOControl/EOKeyValueCoding.h/m: ([NSObject unableToSetNullForKey:]): Implemented. 2003-03-31 David Ayers * EOControl/EOFault.m ([EOFault respondsToSelector:]): Replaced usage of potential future runtime function name with current function name. 2003-03-30 David Ayers * *.h/m, *.h/m): Used #include instead of depricated #import. Avoid including entire library headers. Use export macro where applicable. * EOControl/GNUmakefile: Removed EOKeyValueCodingBase.m/h and EOUndoMananger.h. Added EOArrayDataSource.m/h, EODefines.h and EODepricated.h. * EOControl/EODefines.h: Updated for GDL2 & gnustep-make. * EOControl/EODebug.h: Updated. * EOControl/EODepricated.h: Updated for current state of GDL2. ([NSObject +flushClassKeyBindings]): Added declaration. ([EOClassDescription +setDelegate:]): Added declaration. ([EOClassDescription +delegate]): Added declaration. (EOUndoManager): Moved declaration of interface here. * EOControl/EOKeyValueCoding.m ([EOClassDescription +flushClassKeyBindings]): Added empty implementation. ([NSObject takeStoredValuesFromDictionary:]): Cache EONull instance and use it instead of isKindOfClass:. * EOControl/EOEditingContext.m ([EOEditingContext +initialize]): Tidied. ([EOEditingContest -deleteObject]): Use NSUndoManager instead of EOUndoManager. * EOControl/EOQualifier.m ([NSArray -filteredArrayUsingQualifier:]): Added minor optimization tweak. * EOControl/EOClassDescription.m: Removed inactive commented code. Added private declerations of EOAccess methods to avoid compiler warnings. ([EOClassDescription +initialize]): Tidied. ([EOClassDescription -classDescriptionForClass:]): Use GSObjCName() instead of objc runtime routines. * EOControl/EOFault.m: Exchanged direct usages of ObjC runtime routines with NS/GSObjCRuntime abstraction API. ([EOFault +superclass]): Ditto. ([EOFault +targetClassForFault:]): Ditto. ([EOFault -respondsToSelector:]): Ditto. ([EOFault +initialize]): Cache static class variable. ([EOFault +isKindOfClass]): Use static class variable. ([EOFault +handlerForFault:]): Ditto. ([EOFault +targetClassForFault:]): Ditto. ([EOFault -dealloc]): Ditto. * EOControl/EOGenericRecord.m: ([EOGenericRecord +initialize]): Tidied. * EOControl/EOKeyComparisonQualifier.m: Tidied documentation. * EOControl/EOKeyValueQualifier.m: Ditto. * EOControl/EONSAddOns.h/m: Added declarations to surpress compiler warnings. ([NSObject -eoCompareOnName:]): Adjusted casts to surpress compiler warnings. (GSUseStrictWO451Compatibility): Added function. (GDL2GlobalLock, GDL2GlobalRecursive): Ditto. * EOControl/EONull: Remove implementations for foundation libraries without key value coding and fully rely on NSNull. Added assertions in all intance methods as instances should never be created. ([EONull +allocWithZone:]) Corrected method name so it will actually be used. * EOControl/EOSortOrdering.m ([NSArray sortedArrayUsingKeyOrderArray:]): Tidied. ([NSMutableArray sortUsingKeyOrderArray:]): Ditto. ([EONull compareAscending:]): Sync with referencs implementation. ([EONull compareDescending:]): Ditto. ([EONull compareCaseInsensitiveAscending:]): Ditto. ([EONull compareCaseInsensitiveDescending:]): Ditto. * EOAccess/EOAdaptor.h: Added comment about API compatibility. * EOAccess/EOAdaptor.m ([EOAdaptor -contexts]): Return array of adaptor contexts rather tham GC-wrapper objects containing adaptor contexts. ([EOAdaptor -databaseEncoding]): Use GSEncodingName() instead of GetEncodingName(). * EOAccess/EODatabaseContext.m ([EODatabaseContext -_turnFault:gid:editingContext:isComplete:]): Use GSObjCClass() instead of trying to access isa by dereferencing from id with incorrect member. * EOAccess/EOModel.m ([EOModel -entityNames]): Sort returned array to insure comparable output. * EOAccess/EOSQLExpression.m ([EOSQLExpression sqlStringForArrayOfQualifiers:operation:]): Added cast to surpress compiler warning. * EOAccess/EOUtilities.m ([EOObjectStoreCoordinator setModelGroup:]): Ditto. * EOAccess/EORelationship.h ([EORelationship -docComment]): Added declaration. * EOAccess/GNUmakefile: Added EODefines.h and EODepricated.h. * Tools/*.m: Use RCS_ID macro. * Tools/EOAttribute+GSDoc.h: ([EOAttribute gsdocContentWithTagName:idPtr:]): Corrected Typo. * Tools/EOModel+GSDoc.h/m: ([EOModel gsdocContentSplittedByEntities:idPtr:]): Ditto. * Tools/EORelationship+GSDoc.m: ([EORelationship gsdocContentWithTagName:idPtr:]): Change variable type to supress compiler warnings. * Tools/eoutil.m (dump): Initialize variables to supress compiler warnings. * Tools/gsdoc-model.m: Include GSCategories.h to supress compiler warnings. (main): Added cast to supress compiler warning. Fixed typo in method invocation. 2003-03-25 Stephane Corthesy * EOControl/EODefines.h: Added new file for export/win32 support. * EOControl/EODepricated.h: Added new file for depricated features. * EOControl/EOControl.h: Added EOArrayDataSource.h and EODefines.h. * EOControl/EOArrayDataSource.h/m: Added new files. Some methods ( and qualifier bindings) are empty stubs. * EOControl/EODebug.h: Use export macro instead of explicit extern for function and symbol declarations. * EOControl/EOGlobalID.h: Ditto. * EOControl/EONull.h: Ditto. * EOControl/EOObjectStore.h: Ditto. * EOControl/EOOrQualifier.m: Replaced autorelease by AUTORELEASE and fixed typo. * EOControl/EOQualifier.m ([NSArray -filteredArrayUsingQualifier:]): Implemented. * EOControl/EONSAddOns.m: Use volatile in some exception handlers (man longjmp for more info). * EOControl/EOSortOrdering.h/m ([EOSortOrdering -copyWithZone:]): Implemented . ([EOSortOrdering -encodeWithKeyValueArchiver:]): Implemented. * EOAccess/EODefines.h: Added new file for export/win32 support. * EOAccess/EODepricated.h: Added new file for depricated features. * EOAccess/EOAccess.h: Added EODefines.h. * EOAccess/EOSQLExpression.h/m: Fixed typo for EOPrimaryKeyConstraintKey. * EOAccess/EOExpressionArray.h/m: Use volatile for variables usein in exception handlers. (man longjmp for more info) * EOAccess/EODatabase.h: Use export macro instead of explicit extern for function and symbol declarations. * EOAccess/EOEntity.h: Ditto. * EOAccess/EOModel.h: Ditto. * EOAccess/EOSchemaGeneration.h: Ditto. * EOAccess/EOSQLExpression.h: Ditto. * EOAccess/EOUtilities.h: Ditto. * Tools/eoutil.m (dump): Implemented use of -postinstall option. Corrected bug when getting adaptor's expression class. Renamed symbol EOPrimaryKeyContraintsKey into EOPrimaryKeyConstraintsKey. 2003-03-21 Manuel Guesdon * EOAccess/EODatabaseContext.m: o added assert in _primaryKeyForObject: o in -recordChangesInEditingContext test nil/eonull on relationshipCommitedSnapshotValue and relationshipSnapshotValue instead of only nil testing o in -recordChangesInEditingContext fix for value changing testing when commitedSnapshotValue is nil/EONull * EOAccess/EOEntity.m: o logs o fix in inverseRelationshipClassPropertyNames to test on destination entity property names * EOControl/EOClassDescription.m: o logs * EOControl/GNUmakefile: o added EONSAddOns.h * EOCOntrol/EOKeyValueCoding.m: o fixes in NSArray -computeXXForKey: * EOAccess/EOSQLExpression.m: o assert in -sqlStringForKeyValueQualifier: o -sqlStringForArrayOfQualifiers:operation: hanlde different qualifier cases using isKindOfClass: may probably be improved o logs * EOControl/EOEditingContext.m: o fix in unprocessedInfo (invert/change swap). * EOControl/EOQualifier.m o -qualifierWithQualifierFormat:varargList: raise exception if operator is unknwon * EOControl/EOMutableKnownKeyDictionary.m: o add precision in exception message * EOAccess/EORelationship.m: o more info in some logs o fix in -_sourceRowToForeignKeyMapping for foreign keys which are not in primaryKey. * EOControl/EODatabaseOperation.m: o in -setDatabaseOperator: Don't Delete a not inserted object * EOControl/EOAccessFault.m: o logs o EOAccessFaultHandler: -dealloc fix: call super dealloc o implement faultWillFire: This fix a hard memory problem * EOControl/EOFault.m: o -dealloc: fix possible infinite loop o logs * EOCheapCopyArray.m: o ucomment retain/release/... o fix shallowCopy for memory management. This was causing hard memory trouble 2003-03-12 Mirko Viviani * EOControl/EOClassDescription.m ([EOClassDescription +initialize]): initialize (if present) the default model group. This helps +classDescriptionFor* to work correctly. 2003-03-06 David Ayers * config/postgres.m4: Updated CPPFLAGS and LIBS to account for distributions default installations. * configure: Regenerated. * Tools/EOAttribute+GSDoc.m ([EOAttribute -gsdocContentWithPtr:]): Removed superfluous semicolon in method definition. * EOAccess/EODatabaseContext.m: Fixed minor typo in comment. * EOAccess/EOEntity.m ([EOEntity -description]): Return the description of the encoded property list. ([EOEntity -debugDescription]): Implements original description method. ([EOEntity -classProperties]): Added cast to supress compiler warning. 2003-02-24 Mirko Viviani * EOAccess/EOUtilities.h: added EOObjectStoreCoordinator. 2003-02-17 David Ayers * EOControl/EOSortOrdering.m: Added documentation. Check FOUNDATION_HAS_KVC to determine whether EONull categories should be applied to NSNull instead. ([EOSortOrdering +sortOrderingWithKey:selector:]): Use AUTORELEASE instead of -autorelease. ([EOSortOrdering -initWithKey:selector:]): Use ASSIGNCOPY instead of ASSIGN to set key to insure immutability. ([EOSortOrdering -description]): Implemented. ([NSArray (EOKeyBasedSorting) compareUsingSortOrderings()): New function. ([NSArray (EOKeyBasedSorting) -sortedArrayUsingKeyOrderArray:]): Reimplemented using [NSArray -sortedArrayUsingFunction:context:] with new compareUsingSortOrderings() function. ([NSMutableArray (EOKeyBasedSorting) -sortUsingKeyOrderArray:]): Reimplemented using [NSMutableArray -sortUsingFunction:context:] with new compareUsingSortOrderings() function. ([NSMutableArray -_sortUsingKeyOrder:fromIndex:count:]): Removed. 2003-02-13 David Ayers * EOControl/EOAndQualifier.m: Added documentation. ([EOAndQualifier +qualifierWithQualifiers:]), ([EOAndQualifier -initWithQualifiers:]): Synchronize implementation. ([EOAndQualifier -initWithQualifierArray:]): Change ASSIGN to ASSIGNCOPY when setting qualifier array (insuring immutability). ([EOAndQualifier -copyWithZone:]): remove (use implementation from superclass). * EOControl/EOKeyComparisonQualifier.m: Added documentation. ([EOKeyComparisonQualifier +qualifierWithLeftKey:operatorSelector:rightKey:]): Use AUTORELEASE() instead of -autorelease. ([EOKeyComparisonQualifier -initWithLeftKey:operatorSelector:rightKey:]): Use ASSIGNCOPY instead of ASSIGN to insure immutable keys. Added comment about possible selector assertion. ([EOKeyComparisonQualifier -copyWithZone:]): remove (use implementation from superclass). ([EOKeyComparisonQualifier -evaluateWithObject:]): Try to call the receivers selector before attempting to fallback on other mechanisms to evaluate the object. Adjusted local variable names and fixed fallback Equal, NotEqual and Contains comparisons. ([EOKeyComparisonQualifier -description]): Fall back to NSStringFromSelector() if +stringForOperatorSelector returns nil. * EOControl/EOKeyValueQualifier.m: Added documentation ([EOKeyValueQualifier +qualifierWithKey:operatorSelector:value:]): Use AUTORELEASE() instead of -autorelease. ([EOKeyValueQualifier -initWithKey:operatorSelector:value:]): Use ASSIGNCOPY instead of ASSIGN to insure immutable key. Added comment about possible selector assertion. ([EOKeyValueQualifier -copyWithZone:]): remove (use implementation from superclass). ([EOKeyValueQualifier -evaluateWithObject:]): Try to call the receivers selector before attempting to fallback on other mechanisms to evaluate the object. Adjusted local variable names and fixed fallback Equal, NotEqual and Contains comparisons. ([EOKeyValueQualifier -description]): Fall back to NSStringFromSelector() if +stringForOperatorSelector returns nil. * EOControl/EONotQualifier.m: Added documentation. ([EONotQualifier -copyWithZone:]): remove (use implementation from superclass). ([EONotQualifier -evaluateWithObject:]): Implemented. * EOControl/EOOrQualifier.m: Added documentation. ([EOOrQualifier +qualifierWithQualifiers:]), ([EOORQualifier -initWithQualifiers:]): Synchronize implementation. ([EOOrQualifier -copyWithZone:]): remove (use implementation from superclass). ([EOOrQualifier -evaluateWithObject:]): Corrected implementation. * EOControl/EOQualifier.m: Added documentation ([EOQualifier +initialize]), (getKey()): Replace autorelease with AUTORELEASE(). ([EOQualifier -copyWithZone:]): RETAIN() instead of NSCopyObject(). ([EOQualifier +variableWithKey:]): Corrected implementation. 2003-02-06 David Ayers * EOAccess/EOModel.m ([EOModel -encodeTableOfContentsIntoPropertyList:]), ([EOModel -initWithPropertyList:owner:]), ([EOModel -encodeIntoPropertyList:]), ([EOModel -addEntity:]), ([EOModel -removeEntity:]), ([EOModel -beautifyNames]), ([EOModel -setCreateMutableObjects:]): Do not access _entities until cache is triggered. * EOAccess/EOModel.m ([EOModel +findPathForModelNamed:]), ([EOModel -gcDecrementRefCountOfContainedObjects]), ([EOModel -storedProcedures]), ([EOModel -initWithContentsOfFile:]), ([EOModel -initWithTableOfContentsPropertyList:path:]), ([EOModel -initWithPropertyList:owner:]), ([EOModel -_classDescriptionNeeded:]), ([EOModel -_entityForClass:]), ([EOModel -_addEntityWithPropertyList:]), ([EOModel -_addEntity:]), ([EOModel -_verifyBuiltEntityObject:named:]): replaced NSDebugMLLog with EOFLOGObject/ClassLevelArgs. * EOAccess/EOModel.m ([EOModel -description]), ([EOModel -addEntity]), ([EOModel removeEntity]): Make temporary objects autoreleased versions instead explicit release handling. * EOAccess/EOAdaptor.m ([EOAdaptor +adaptorWithName:]): reinserted accessing adaptor class by principal class of bundle as fallback in case EOAdaptorClassName isn't found. Raise an exception if the provided class is not a subclass of EOAdaptor. * EOAccess/EOAdaptor.m ([EOAdaptor +adaptorWithName:]), ([EOAdaptor -fetchedValueForValue:attribute]), ([EOAdaptor -fetchedValueForStringValue:attribute]): replaced NSLog/NSDebugMLLog with EOFLOGObject/ClassLevelArgs. * EOAccess/EOAdaptor.m ([EOAdaptor +adaptorWithModel:]), ([EOAdaptor +adaptorWithName:]), ([EOAdaptor +availableAdaptorNames]): replaced autorelease with AUTORELEASE(). * EOAdaptors/Postgres95Adaptor/Info.plist: Added EOAdaptorClassName entry. 2003-02-04 Stephane Corthesy * Tools/eoutil.m: implemented. * EOAndQualifier.m: replaced autorelease by AUTORELEASE * EOClassDescription.m: added #include and note about subclassing NSClassDescription * EOEditingContext.m: removed EOAccess inclusion; note that we need to rewrite -faultForRawRow:entityNamed:editingContext: to break dependency to EOAccess * EOFault.m: implemented +doesNotRecognizeSelector: * EOFaultHandler.m: added #include and #include * EOFetchSpecification.m: added #import * EOGenericRecord.h: declaration of -valueForKey: and -takeValue:forKey: needs to be done only when !FOUNDATION_HAS_KVC * EOGenericRecord.m: removed #import and #import ; added #include ; declared +eoCalculateSizeWith:forArray:; corrected +initialize (doesn't return a value); renamed +removeDestoyedObject: to +removeDestroyedObject:; modified -initWithEditingContext:classDescription:globalID: to no longer depend on EOAccess via EOEntity; some methods need to be implemented only when !FOUNDATION_HAS_KVC (else they are already correctly implemented in NSObject), some others only when FOUNDATION_HAS_KVC (-handleQueryWithUnboundKey: and handleTakeValue:forUnboundKey:); in -smartTakeValue:forKey:, removed dependency to EOAccess via EORelationship; corrected problem with macro NSDebugMLog, which should be replaced by other macro anyway; modified -eoCalculateSizeWith: to no longer depend on EOAccess via EOEntity * EOGlobalID.m: added #include and #include ; added cast in +assignGloballyUniqueBytes: * EOKeyComparisonQualifier.m: added casts * EOKeyGlobalID.m: replaced retain by RETAIN * EOKeyValueCoding.h: removed #import ; added - (id)storedValueForKeyPath: (NSString *)key; declared some methods only when !FOUNDATION_HAS_KVC; declared hidden methods for MacOS X. * EOKeyValueCoding.m: added #include ; implemented some methods only when !FOUNDATION_HAS_KVC; corrected problem with macros NSDebugMLog/NSWarnLog, which should be replaced by other macro anyway; declared -[NSMutableDictionary(EOKeyValueCodingPrivate) takeValue:forKeyPath:isSmart:]; corrected zombie in -[NSMutableDictionary(EOKeyValueCoding) takeValue:forKeyPath:isSmart:] * EOKeyValueQualifier: added casts * EOMutableKnownKeyDictionary.m: added #warning about missing method; moved method implementation to avoid warning * EONSAddOns.m: added casts * EOObjectStoreCoordinator.m: corrected problem with macro NSDebugMLog, which should be replaced by other macro anyway * EOQualifier.m: added #include ; corrected problem with macro NSDebugLog, which should be replaced by other macro anyway; replaced retain by RETAIN; in -doesContain:, no need to test against NSMutableArray class * EOSortOrdering.m: replaced retain by RETAIN; avoid autoreleased objects; replaced mutableCopy by initWithArray:copyItems: 2003-02-03 Stephane Corthesy * Postgres95Adaptor.m: made some changes to externalTypeNames (needs to be reviewed completely!); avoided needless autoreleased object * Postgres95Channel.m: avoided needless autoreleased object ; added arg to NSDebugMLLog (should be replaced by other log macro); use macros RETAIN, AUTORELASE; when invoking PQexec, added ending ";" to statement (necessary for inserts, at least) * Postgres95SQLExpression.m: replaced #import by smaller #imports; commented out use of external type 'datetime' (obsolete?); corrected bug in +formatValue:forAttribute: (error when escaping special characters); overloaded +dropTableStatementsForEntityGroup: to append CASCADE (maybe this should be done in EOSQLExpression class?), else it is not possible to drop tables which contain foreign key constraints; overloaded +prepareConstraintStatementForRelationship:sourceColumns: destinationColumns: to append DEFERRABLE INITIALLY DEFERRED (maybe this should be done in EOSQLExpression class?) * Postgres95Values.h: made Postgres95Values inherit from NSObject, else ObjC runtime doesn't like it and crashes! * EOAdaptor.m: added #import ; corrected bug when instantiating adaptor: class name needs to be taken exclusively from infoDictionary, because a framework's principalClass is indeterminate (is it?); corrected var type; added empty implementation of EOLoginPanel class (is the method named "administraticeConnectionDictionaryForAdaptor:" correct? Shouldn't it be "administrativeConnectionDictionaryForAdaptor:" ??) * EOAttribute.m: added #include ; use -[NSTimeZone name] instead of -[NSTimeZone timeZoneName] (also on GNUstep?) * EODatabaseChannel.m: corrected bug with macro NSDebugMLog (which should be replaced by other macro...); in -fetchObject, added support for raw rows (works for me, but I'm not sure whether it is totally correct: _fetchSpecifications ivar is used nowhere!); avoided use of autoreleased objects; in -_selectWithFetchSpecification:editingContext:, uncommented last part to allow support for raw rows. * EODatabaseContext.h: added #import * EODatabaseContext.m: #import only when FOUNDATION_HAS_KVC? ; added declaration of -entityForGlobalID:; replaced some retain by RETAIN; in objectsWithFetchSpecification:editingContext:, added support for raw rows (adapted code of non raw rows => needs refactoring); added missing cast; corrected bug with macro NSDebugMLog (which should be replaced by other macro...) * EODatabaseDatasource.m: added #import ; added declaration of -_partialInitWithEditingContext:entityName:fetchSpecificationName: * EOEntity.m: corrected bugs with lazy loading of ivars by using _flags.updating, in -initWithPropertyList:owner:, and by using methods instead of direct access to ivars; in -classProperties, corrected problem with vars containing sometimes strings, sometimes EOAttribute/EORelationship! (very weird way of lazy initialization... Should be reviewed); added use of _flags.updating in -relationships and -attributes; in -isPrimaryKeyValidInObject:, no longer tests against [NSNull null], because [EONull null] == [NSNull null]; replaced some retain by RETAIN; in -addAttribute:, -removeAttribute:, -addRelationship: and -removeRelationship:, corrected nasty bug due to mutableCopy: now we are independant of mutableCopy implementation (deep or shallow copy), as implementation changed these last days and might change again. Added -_setClassName: to allow modification without calling willChange, when necessary (init); modified _setIsEdited to test _flags.updating; in -awakeObject:fromInsertionInEditingContext:, corrected conditions to create relationship (propagatesPrimaryKey has nothing to do with it, whereas isMandatory is important) * EOModel.m: added #include and #import ; changed search strategy for models by using NSSearchPathForDirectoriesInDomains(); replaced some retain by RETAIN; avoided use of mutableCopy and copy * EORelationship.m: replaced some retain by RETAIN; avoided use of mutableCopy and copy * EOSQLExpression.m: added declaration of +sqlExpressionWithEntity:; added +foreignKeyConstraintStatementsForEntityGroup: and +foreignKeyConstraintStatementsForEntityGroups:; in +createTableStatementsForEntityGroup:, corrected call to listString; in +schemaCreationStatementsForEntities:options:, reordered defaults[] to allow correct SQL generation (you drop first, then create) and corrected method to invoke for EOForeignKeyConstraintsKey; corrected -columnTypeStringForAttribute: and -addCreateClauseForAttribute: * EOSchemaGeneration.h: corrected documentation * EOStoredProcedure.m: added #import * EOUtilities.h: removed duplicate delcaration of -objectsOfClass: * EOUtilities.m: added #import ; corrected bug with macro NSDebugMLog (which should be replaced by other macro...); corrected type casting; added type casting. 2003-02-02 Mirko Viviani * EOControl/EOGenericRecord.m ([EOGenericRecord +initialize]): import NSAutoreleasePool. * EOControl/EOGlobalID.m ([EOGlobalID +initialize]): removed dependency from EOAccess. * EOControl/EOFetchSpecification.m ([EOFetchSpecification +initialize]): likewise. ([EOFetchSpecification +fetchSpecificationNamed:entityNamed:]): readded since it is replaced by the category in EOUtilitites ! 2003-01-31 Manuel Guesdon * EOAccess/EOAdaptorChannel.m: o replaced NSDebugMLLog by EOFLOGObjectLevel/EOFLOGObjectLevelArgs * EOAccess/EOAttribute.m: o replaced NSDebugMLLog by EOFLOGObjectLevel/EOFLOGObjectLevelArgs * EOAccess/EODatabaseChannel.m: o replaced NSDebugMLLog by EOFLOGObjectLevel/EOFLOGObjectLevelArgs o Move registration for EODatabaseChannelNeddedNotification from +load to +initialize. (David Ayers ) * EOAccess/EODatabaseContext.m: o Move registration for EODatabaseChannelNeddedNotification from +load to +initialize. (David Ayers ) * EOAccess/EOEntity.m: o in - (void) _setIsEdited, autorelease instead of destroy * EOAccess/EORelationship.m o -validateValue: don't raise not implemented exception o initialize variables in -foreignKeyInDestination * EOAccess/EOSQLExpression.m: o added NSAsserts o use anyRelationshipNamed: instead of relationshipNamed: to find hidden relationships * EOControl/EOClassDescription.m o -displayNameForKey: use -stringWithCapacity instead of +alloc -initWithCapacity (missing autorelease) o -validationExceptionWithFormat: initialize variables o -aggregateExceptionWithExceptions: initialize variables o -aggregateExceptionWithExceptions: autorelease copied value o -exceptionAddingEntriesToUserInfo: initialize variables o -exceptionAddingEntriesToUserInfo: autorelease copied userInfo o -snapshot autorelease copied value o -updateFromSnapshot: autorelease copied value * EOControl/EOFetchSpecification.h: o added +fetchSpecificationWithEntityName:qualifier:sortOrderings:usesDistinct:isDeep:hints: o added +fetchSpecificationWithEntityName:qualifier:sortOrderings:usesDistinct: * EOControl/EOFetchSpecification.m: o added +fetchSpecificationWithEntityName:qualifier:sortOrderings:usesDistinct:isDeep:hints: o added +fetchSpecificationWithEntityName:qualifier:sortOrderings:usesDistinct: o removed +fetchSpecificationNamed:entityNamed: (implemented in EOUtilities) o Insure that EODatabaseContext is initialized early. (David Ayers ) * EOControl/EOGenericRecord.m o in -eoFormatSizeDictionary: handle /0 o in +eoCalculateAllSizeWith: don't de-fault objects o in +eoCalculateAllSizeWith: manage a local autorelease pool * EOControl/EOKeyValueCoding.h: o added -smartTakeValue:forKey: o -smartTakeValue:forKeyPath: o -storedValuesForKeyPaths: * EOControl/EOGlobalID.m: o Insure that EODatabaseContext is initialized early. (David Ayers ) * EOControl/EOQualifier.m: o +operatorSelectorForString:]): Parse 'doesContain' instead of 'contains' (David Ayers ) * EOControl/EODebug.m: o include NSDebug.h 2003-01-21 David Ayers * EOControl/EOQualifier.m ([EOQualifier +allQualifierOperators]): ([EOQualifier +relationalQualifierOperators]): ([EOQualifier +stringForOperatorSelector:]): fixed array initialization and renamed 'contains' to 'doesContain'. 2003-01-16 Mirko Viviani * EOControl/EOObserver.m: Added implementation for EODelayedObserver and EODelayedObserverQueue. 2003-01-16 David Ayers * EOAdaptors/Postgres95/Postgres95Adaptor.m: Added import of NSDebug.h/EODebug.h Removed NSLog of connection information * EOAdaptors/Postgres95/Postgres95Channel.m * EOAdaptors/Postgres95/Postgres95Context.m * EOAdaptors/Postgres95/Postgres95Expression.m * EOAdaptors/Postgres95/Postgres95Value.m: Added import of NSDebug.h/EODebug.h * EOControl/EOControl.h: Added import of EOUndoManager.h * EOControl/EOObserver.m: Added empty implementation for EOObserverProxy 2002-12-31 Mirko Viviani * EOControl/EOFault.m ([EOFault -editingContext]): simplified. Converted NSDebug* to EOFLOGObjectLevel. * EOAccess/EOUtilities.m|.h ([EOObjectStoreCoordinator -modelGroup]), ([EOObjectStoreCoordinator -setModelGroup:]): moved from EOControl/ EOObjectStoreCoordinator.m * EOAccess/EOUtilities.m|.h ([EOFetchSpecification +fetchSpecificationNamed:entityNamed:]): moved from EOControl/ EOFetchSpecification.m * EOControl/EOFetchSpecification.m ([EOFetchSpecification +fetchSpecificationNamed:entityNamed:]): return nil. * EOAccess/EOAccessFault.m|.h ([EOFault -databaseContext]): moved from EOControl/EOFault.m * added missing include, include config.h in all .m files. * EOControl/EOEditingContext.m ([EOEditingContext -tryToSaveChanges]), ([EOEditingContext -saveChanges:]): use respondsToSelector: 2002-12-30 Markus Hitter * EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres95Channel -describeTableNames]): implemented. 2002-12-30 Mirko Viviani * EOAccess/EOSQLExpression.h: added missing declaration. * EOAccess/EORelationship.m ([EORelationship -removeJoin:]): added cast. * EOAccess/EOModel.m ([EOModel -dealloc]): removes observer correctly. * EOAccess/EODatabaseContext.h: added missing declaration. * EOControl/EOFetchSpecification.m ([EOFetchSpecification -copyWithZone:]): fixed cast. ([EOFetchSpecification -hints]): added cast. * EOControl/EOClassDescription.m ([NSException +validationExceptionWithFormat:]), ([NSException +aggregateExceptionWithExceptions:]), ([NSException -exceptionAddingEntriesToUserInfo:]): renamed local variables. * rearranged header inclusion in all sources. 2002-12-29 Mirko Viviani * EOAccess/EODatabaseContext.m ([EODatabaseContext -initializeObject: row:entity:editingContext:]): set nil instead of EONull * EOControl/EONull.m: included config.h 2002-12-17 Mirko Viviani * EOAccess/EOEntity.m ([EOEntityClassDescription -inverseForRelationshipKey:]): Fixed to return a relationship name that is a class property. 2002-12-14 Mirko Viviani * EOAccess/EORelationship.m ([EORelationship -foreignKeyInDestination]): use destinationEntity to search for pk. * EOAccess/EODatabaseContext.m ([EODatabaseContext -_buildPrimaryKeyGeneratorListForEditingContext:]): check if the relationship propagates the pk to an entity pk. ([EODatabaseContext -relayAttributesInRelationship:sourceObject: destinationObject:]): record updates for relationship with fk and the ones that propatates pk. 2002-12-08 Mirko Viviani * EOAccess/EOEntity.m ([EOEntity -classDescriptionForInstances]): retain newly created classDescription. * EOAccess/EOAdaptor.m ([EOAdaptor -isValidQualifierType:model:]): implemented. * EOControl/GNUmakefile (libgnustep-db2control_HEADER_FILES): removed GCObject.h * EOAccess/EODatabaseContext.m: * EOAccess/EORelationship.m: * EOAccess/EOEntity.m: * EOControl/EOMutableKnownKeyDictionary.m: * EOControl/EOEditingContext.m: replaced EOFLOGObjectLevelArgs with EOFLOGObjectLevel in absence of args. (fixed problems with gcc 2.95) 2002-12-07 Mirko Viviani * EOAccess/EOEntity.m ([EOEntity -isPrimaryKeyValidInObject:]): check for NSNull objects. 2002-12-06 Mirko Viviani * EOAccess/EOUtilities.h: added prototype. 2002-12-05 Mirko Viviani * EOAccess/EODatabaseContext.m ([EODatabaseContext +_registerDatabaseContext:]): added a warning if the specified model is not found. * EOAdaptors/Postgres95/Makefile.preamble.in (LIBRARIES_DEPEND_UPON): added postgres libs here. 2002-12-04 Mirko Viviani * EOModeler/EOModelExtensions.m ([EOEntity -classAttributes]): ([EOEntity -classScalarAttributes]): ([EOEntity -classNonScalarAttributes]): ([EOEntity -classToManyRelationships]): ([EOEntity -classToOneRelationships]): fixed to use class properties. * EOAccess/EOEntity.m ([EOEntity -initWithPropertyList:owner:]): read .fspec only if exists. * EOControl/EOKeyValueCoding.m ([NSArray -valueForKeyPath:]): implemented the case of invoking an aggregate function using a simple key. * EOControl/EOGenericRecord.m ([EOGenericRecord -_infoForInstanceVariableNamed:retType:retSize:retOffset:]): renamed GSObjCFindInstanceVariable in GSFindInstanceVariable * config/postgres.m4: check in /usr/local/include and /usr/local/lib * EOModeler/GNUmakefile: install headers in EOModeler/ 2002-12-01 Manuel Guesdon * EOAccess/EODatabase.m o in -entityForObject: test for EONull or nil instead of just nil * EOAccess/EODatabaseContext.m: o in -valuesForKeys:object: test for EONull or nil instead of just nil * EOControl/EOGenericRecord.m: o replaced GSObjCFindVariable by GSObjCFindInstanceVariable o replaced GSObjCGetValue by GSGetValue o replaced GSObjCSetValue by GSSetValue * EOAccess/EOSQLExpression.m: o changed assertion message in -sqlStringForAttributeNamed: * EOAccess/EOSQLQualifier.m: o finished EOAndQualifier -schemaBasedQualifierWithRootEntity implementation o done EOOrQualifier -schemaBasedQualifierWithRootEntity implementation o modified EOKeyValueQualifier -schemaBasedQualifierWithRootEntity: to use EONull for EONull value relationship attribute value so it will make sql like is null instead of = NULL which doesn't work on Postgresql. 2002-11-30 Manuel Guesdon * EOAccess/EODatabaseContext.m o logs o changes in _primaryKeyForObject: to handle inserted "child" of already existing object case * EOControl/EODetailDataSource.m: o implemented -description 2002-11-28 Richard Frith-Macdonald * EOAccess/EOEntity.m: Patch by David Ayers. * EOAccess/EOExpressionArray.m: Update for latest GSObjCRuntime stuff. * EOControl/EOGenericRecord.m: ditto * Tools/Makefile.preamble: Fix library lookup for link 2002-11-27 Richard Frith-Macdonald * gdl2.make.in: simplify libraries ... let which_lib sort them out. * Tools/GNUmakefile.preamble: ditto 2002-11-27 Manuel Guesdon * EOAccess/EOModel.m: o fixed typo in -entityNamed: 2002-11-27 Richard Frith-Macdonald * EOAccess/EOModel.h: * EOAccess/EOModel.m: Appplied David Ayers patch for programmatic model manipulation. Fixed typo. Use NSFileManager rather than mkdir(). Tidied some use of autorelease for memory efficiency etc. * EOControl/EOGenericRecord.m: update to use GSFindInstanceVariable() 2002-11-26 Manuel Guesdon * EOAccess/EOEntity.m: o implemented flattened relationship handling in -EOEntity _parseRelationshipPath: * EOAccess/EOAccessFault.m: o fixed logs in -EOAccesFaultHandler dealloc o added [super dealloc] in -EOAccesFaultHandler dealloc o added logs in -EOAccessArrayFaultHandler dealloc * EOAdaptors/Postgres95/Postgres95Channel.m: o removed log * EOAccess/EOAdaptorChannel.m o Handle direct SQL query case in -dictionaryWithObjects:forAttributes:zone: * EOAccess/EOClassDescription.m o implement some cases in -addObject:toBothSidesOfRelationshipWithKey: * EOControl/EOGenericRecord.m: o avoid infinit loop in -description * EOAccess/EODatabaseContext.m o implement some cases in -entitiesOnWhichThisEntityDepends: o changed return type of -entitiesOnWhichThisEntityDepends: 2002-11-25 Richard Frith-Macdonald Tagged all files as 'with-extensions' Committed new versions of very many files with dependency on the obsolete extensions library removed. gdl2 should now only need the base library (or perhaps MacOS-X foundation plus a port of the Additions library from the base library package, when someone wants to do the port). 2002-11-24 Richard Frith-Macdonald * EOAdaptors/Makefile.postamble: New file to clean configure generated files. * EOAdaptors/Postgres95/Makefile.postamble: New file to clean configure generated files. * EOAdaptors/Postgres95/Makefile.preamble: remove .. generated automatically. Fixes suggested by David Ayers 2002-11-18 Mirko Viviani * EOControl/EOKeyValueQualifier.m: * EOControl/EOAndQualifier.m: * EOControl/EOKeyComparisonQualifier.m: * EOControl/EONotQualifier.m: * EOControl/EOOrQualifier.m: remove references to EOAccess. 2002-11-16 Richard Frith-Macdonald * EOAccess/EOExpressionArray.m: Correct reference to obsolete behavior function call (removed from public api a few years back and recently removed from internal code too). * EOControl/EOFault.m: Remove GNU property list method no longer used/nneeded. 2002-11-14 Manuel Guesdon * EOAcces/EODatabaseDataSource.m: o corrected bug in -description * EOAdaptors/Postgres95/Postgres95SQLExpression.m o change in +formatValue:forAttribute: to handle string value for dates 2002-11-14 Mirko Viviani * EOAdaptors/*, EOAccess/*, EOControl/*: removed some warnings. 2002-11-13 Manuel Guesdon * EOAcces/EODatabaseContext.m: o corrected bug o logs * EOAccess/EODatabaseOperation.m: o -setDatabaseOperator: change to not update deleted objetcs * EOAccess/EOEntity.m: o -_attributesToFetch added exception handling * EOAccess/EOSQLExpression: o use sqlExpressionWithEntity instead of alloc/init * EOControl/EOEditingContext.m: o _processOwnedObjectsUsingChangeTable:deleteTable: bug correction in new/existing value handling o doc * EOControl/EOGenericRecord.m: o log changes * EOControl/EOKeyValueCoding.m: o added -takeStoredValue:forKeyPath: o added -storedValuesForKeyPaths: o corrected bug in NSArray -valueForKey: o corrected bugs in NSArray -valueForKeyPath: * EOAccess/EOUtilities.m o handle nil value in rawRowsMatchingValue:forKey:entityNamed: o handle nil value in objectsMatchingValue:forKey:entityNamed: o handle nil value in objectWithPrimaryKeyValue:entityNamed: * EOAccess/EOAttribute.m o destroy docComment in -dealloc * EOAdaptors/Postgres98/Postgres95Values.m: o comment o use stringWithCString.. instead of alloc/init/release * EOControl/EOMultipleKnownKeyDictionary.h o added -debugDescription * EOControl/EONull.m: o added -NSNull -valueForKey: * EOAccess/EOQualifier.m: o in getKey: autorelease key o in -qualifierWithQualifierFormat:varargList: user [NSMutableArray array] instead [NSMutableArray new]/DESTROY to avoid memory leak if an exception is raised 2002-11-04 David Ayers * EOControl/EOSortOrdering.m: o changed -sortedArrayUsingKeyOrderArray: * EOControl/EOQualifier.m: o improved -qualifierWithQualifierFormat: parsing 2002-10-31 David Ayers * EOControl/EOQualifier.m: o improved -qualifierWithQualifierFormat: parsing o added NSNumber -initWithString as EOQualiferExtra * EOControl/EOKeyValueQualifier.m: o changed -description * EOControl/EOKeyComparisonQualifier.m: o changed -description 2002-09-22 Mirko Viviani * Makefile.postamble: install gdl2.make. 2002-09-22 Mirko Viviani * configure.ac: added adaptors configuration. * config/postgres.m4: check for postgres db. * EOAdaptors/Postgres95/GNUmakefile.in: new file. * EOAdaptors/Postgres95/Makefile.preamble.in: new file. 2002-09-20 Mirko Viviani * configure.ac: new file. * gdl2.make.in: new file. * config.h.in: new file. 2002-09-20 Mirko Viviani * Indented all the sources and removed many warnings. * Moved EOCheapArray.m|h, EONSAddOns.m|h and EODebug.m|h to EOControl. * Moved EOUtilities.m|h to EOAccess. * Moved EOQualifierSQLGeneration in EOAccess/EOSQLQualifier 2002-06-03 Manuel Guesdon * EOAdaptors/Postgres95/Postgres95SQLExpression.m: o NSWarn -> NSWarnLog * EOControl/EOKeyValueArchiver.m: o added -isThereValueForKey: in EOKeyValueUnarchiver * EOControl/EOKeyValueArchiver.h: o added -isThereValueForKey: in EOKeyValueUnarchiver * EOControl/EOSQLExpression.m: o changes for usesDistincts o logs * EOAccess/EODatabaseChannel.m: o fix for refetched objects * EOAccess/EODatabaseContext.m: o fixes in recordChangesInEditingContext * EOAccess/EODatabaseDataSource.m: o logs * EOAccess/EONSAddOns.h/.m o added NSArray -arrayExcludingObject: o added NSArray -containsIdenticalObjectsWithArray: * EOAccess/EORelationship.h/.m: o added isBidirectional: and associated methods (for use with smartTakeValue:forKey:) * EOControl/EOClassDescription.h/.m: o added -relationshipNamed: o added -anyRelationshipNamed: * EOControl/EOGenericRecord.m: o added -smartTakeValue:forKey: * EOControl/EOObjectStoreCoordinator.m: o logs 2002-05-14 Manuel Guesdon * EOControl/EOEditingContext.m: o changes in -saveChangesInEditingContext: to avoid return in the middle of the method o logs * EOAccess/EODatabaseContext.m: o add rollbackChanges on exception in -saveChangesInEditingContext: o corrected bug in initializeObject:row:entity:editingContext: o logs * EOControl/EOKeyValueQualifier.m: o implementation of flatten case in -schemaBasedQualifierWithRootEntity: o logs * EOControl/EODetailDataSource.m o correct bugs by using -decodeObjectForKey: in -initWithKeyValueUnarchiver: o changed _masterEntityName to _masterClassDescriptionName o added -classDescriptionForObjects o logs * EOControl/EODetailDataSource.h: o changed _masterEntityName to _masterClassDescriptionName o added -classDescriptionForObjects * EOControl/EODataSource.m: o logs * EOControl/EOGenericRecord.m: o added -willChange call in _setValueForKey:object:selector:type:size:offset: * EOControl/EOMutableKnownKeyDictionary.m: o corrected bug in -containsObjectsNotIdenticalTo: o logs * EOAccess/EOSQLExpression.m: o logs * EOAdaptors/Postgres95/Postgres95SQLExpression.m: o logs o corrected bugs for empty strings in +formatValue:forAttribute: * EOAccess/EODatabaseDataSource.m o logs * EOAccess/EOEntity.m o logs * EOControl/EOQualifier.m: o logs * EOControl/EOOrQualifier.m: o logs * EOControl/EOAndQualifier.m: o logs * EOControl/EOObserver.m: o logs * EOAccess/EODatabase.m: o logs o avoid fault access in -entityForObject: 2002-04-15 Manuel Guesdon * EOAccess/EOFetchSpecification.m: o changed -fetchSpecification into +fetchSpecification * EOAccess/EOKeyValueCoding.m: o logs o corrected bug: added special case "count" in NSArray -valueForKeyPath: * EOAccess/EOGenericRecord.m: o logs * EOControl/EODetailDataSource.h: o added -initWithKeyValueUnarchiver: * EOControl/EODetailDataSource.m: o added -initWithKeyValueUnarchiver: * EOControl/EOKeyValueArcher.m: o added EOKeyValueArchivingContainer +keyValueArchivingContainer o corrected not autorelease bug in -_objectForPropertyList: o logs * EOControl/EODatabaseDataSource.m: o logs 2002-04-01 Manuel Guesdon * EOAccess/EOModel.h: o added +version * EOAccess/EOStoredProcedure.h: o added +storedProcedureWithPropertyList:owner: * EOAccess/EOEntity.h: o added +entityWithPropertyList:owner: o added -setDocComment: o added +entityClassDescriptionWithEntity: * EOAccess/EOEntity.m: o corrected bug in _keyMapForIdenticalKeyRelationshipPath: (dictionary construction) * EOAccess/EOEntityPriv.h: o retyped -_parseDescription:isFormat:arguments:; * EOAccess/EORelationship.h: o added +relationshipWithPropertyList:owner: * EOAccess/EOAttribute.h: o added +attributeWithPropertyList:owner: o added -setInternalInfo: o added -_normalizeDefinition:path: * EOAccess/EOAttribute.m: o use an id instead of a string for userInfo,... o added -setInternalInfo: * EOAccess/EOExpressionArray.h: o added -valueForSQLExpression: 2002-04-01 Manuel Guesdon * EOControl/EODetailDataSource.h/.m: o added +detailDataSourceWithMasterDataSource:detailKey: * EOAccess/EODatbaseDataSource.m: o changed allocations * EOAccess/EODatabase.m: o changed allocations * EOAccess/EOEntity.m: o changed allocations o corrected not autorelease bug in EOEntity -classDescriptionForInstances * EOControl/EOGlobalID.h/.m: o added EOTemporaryGlobalID +temporaryGlobalID * EOControl/EIEditingContext.m: o changed allocations * EOControl/EOKeyValueQualifier.m: o changed allocations * EOControl/EOObjectStoreCoordinator.m: o changed allocations * EOKeyComparisonQualifier.m: o added +qualifierWithLeftKey:operatorSelector:rightKey: * EONotQualifier.m: o added +qualifierWithQualifier: * EOQualifier.m: o changed allocations * EOAccess/EOAdaptorContext.h/.m: o added +adaptorContextWithAdaptor: * EOAdaptors/Postgres95/Postgres9Adaptor.m: o changed allocations * EOAdaptors/Postgres95/Postgres9Channel.m: o changed allocations * EOAdaptors/Postgres95/Postgres9Context.m: o changed allocations * EOAccess/EOModel.h/.m: o added +model * EOAccess/EOAdaptorChannel.h/.m o added +adaptorChannelWithAdaptorContext: * EOAdaptors/Postgres95/Postgres9Values.m: o changed allocations 2002-03-29 Manuel Guesdon * EOAccess/EODatabaseOperation.m o logs * EOAccess/EODatabaseContext.h/.m o logs o added +databaseContextWithDatabase: o change allocations * EOAccess/EORelationship.m o logs o corrected not autorelease bug in _foreignKeyForSourceRow: o added +relationshipWithPropertyList:owner: * EOAccess/EOJoin.h/.m: o added +joinWithSourceAttribute:destinationAttribute: * EOAccess/EOSQLExpression.m: o added +sqlExpressionWithEntity: * EOAccess/EOAttribute.m: o added +attributeWithPropertyList:owner: * EOAdaptors/Postgres95/Postgres95Channel.m o logs * EOAccess/EODatabaseChannel.m o logs o added +databaseChannelWithDatabaseContext: * EOAccess/EOFault.m: o logs * EOAccess/EOFetchSpecification.m/.h o added +fetchSpecification * EOControl/EOUtilities.m: o corrected not autorelease bug in -objectsMatchingValues:entityNamed: o change qualifiers allocations * EOAccess/EOAndQualifier.m: o added EOAndQualifier +qualifierWithQualifierArray: o added EOAndQualifier +qualifierWithQualifiers: * EOAccess/EOOrQualifier.m: o added EOOrQualifier +qualifierWithQualifierArray: * EOAccess/EOQualifier.h o added EOAndQualifier +qualifierWithQualifierArray: o added EOOrQualifier +qualifierWithQualifierArray: * EOAccess/EOEntity.m: o changed EOMutableKnownKeyDictionary allocation in -_dictionaryForProperties * EOAccess/EOMutableKnownKeyDictionary.h/.m: o added +dictionaryFromDictionary:subsetMapping: * EOAccess/EOModel.h/.m o added +modelWithContentsOfFile: o corrected not autorelease bug o allocation changes * EOAccess/EOModelGroup.m: o Changed EOModel allocation * EOAccess/EODatabase.h/.m: o added +databaseWithModel: * EOAccess/EOAccessFault.h/.m o added EOAccessFaultHandler +accessFaultHandlerWithGlobalID:databaseContext:editingContext: o added EOAccessArrayFaultHandler +accessArrayFaultHandlerWithSourceGlobalID:relationshipName:databaseContext:editingContext: * EOAccess/EODatabaseOperation.h/.m: o added EODatabaseOperation +databaseOperationWithGlobalID:object:entity: * EOAccess/EOAdaptorOperation.h/.m: o added EOAdaptorOperation +adaptorOperationWithEntity: * EOAccess/EODatabaseDataSource.m: o allocation changes * EOAccess/EOStoredProcedure.m: o corrected not autorelease bug in -initWithPropertyList:owner: 2002-03-28 Manuel Guesdon * EOAccess/EODatabaseChannel.m o removed logs o changed logs * EOAdaptors/Postgres95/Postgres95Channel.m o removed logs * EOAccess/EORelationship.m: o NSAssert o added _docComment and associated methods * EOAccess/EORelationship.h: o added _docComment and associated methods * EOAccess/EOSQLExpression.m: o NSAssert o logs * EOAccess/EOEntity.m: o doc o logs o added _docComment and associated methods * EOAccess/EOEntity.h: o added _docComment and associated methods * EOAccess/EOModel.h/.m: o added -adaptorClassname o added _version and -version o added _docComment and associated methods * EOAccess/EOAttribute.h/.m: o added _docComment and associated methods * EOAccess/EOAdaptorChannel.m o logs * EOAdaptors/Postgres95/Postgres95SQLExpression.m: o corrected bug in formatValue:forAttribute: * added Tools/ 2002-03-25 Manuel Guesdon * EOAccess/GNUmakefile: o removed -SystemProjects System o added -Declared EOAccess * EOControl/GNUmakefile: o removed -SystemProjects System o added -Declared EOControl * EOAdaptors/Postgres95/GNUmakefile: o removed -SystemProjects System o added -Declared EOAdaptors/PostgreSQL * EOControl/EOGenericRecord.m: logs * EOAccess/EODebug.h: added EOFLOGClassFnStartCond EOFLOGClassFnStopCond * EOAccess/EODatabaseChannel.m: logs * EOAccess/EORelationship.m: o setDefinition o corrected bug in _makeFlattenedInverseRelationship * EOAccess/EOEntity.m o logs * EOControl/EOQualifier.h o added qualifierWithKey:operatorSelector:value: * EOControl/EOKeyValueQualifier.m: o added qualifierWithKey:operatorSelector:value: * EOAccess/EOModel.m: o removed assert for non EOGenericRecord class in -_classDescriptionNeeded: 2002-03-07 Manuel Guesdon Too much changes 2001-04-10 Mirko Viviani * EOAccess/EOSQLExpression.m ([EOSQLExpression +foreignKeyConstraintStatementsForRelationship:]): implemented. 2001-04-07 Mirko Viviani * EOControl/EOKeyValueCoding.m: import EOControl.h * EOControl/EONull.m: likewise. * EOAccess/EOModel.m ([EOModel -writeToFile:]): implemented. ([EOModel -encodeTableOfContentsInfoPropertyList:]): implemented. * EOAccess/EORelationship.m ([EORelationship -setEntity:]): remove self from previous entity. ([EORelationship -setDefinition:]): remove joins. 2001-01-12 Mirko Viviani * EOModeler: new library. * EOModeler/EOModelExtensions.m/.h: EOModeler categories needed by eogenerator. * EOControl/EOKeyValueCoding.m ([NSArray -valueForKey:]): fixed @x key. 2001-01-06 Mirko Viviani * EOControl/EOControl.h: defined FOUNDATION_HAS_KVC to use Foundation key value coding. * EOAccess/EOAttribute.m ([EOAttribute -adaptorValueByConvertingAttributeValue:]): use EONull null object. * EOAccess/EOSQLExpression.m ([EOSQLExpression -sqlStringForSelector: value:]): likewise. * EOControl/EOKeyValueCoding.m ([NSObject -takeValuesFromDictionary:]): ([NSObject -takeStoredValuesFromDictionary:]): likewise. defined FOUNDATION_HAS_KVC to use Foundation key value coding. 2001-01-03 Mirko Viviani * EOAccess/EODatabaseContext.m ([EODatabaseContext -faultForGlobalID:editingContext:]): use the correct class property array. 2000-12-23 Mirko Viviani * EOAccess/EOEntity.m ([EOEntity -isPrimaryKeyValidInObject:]): fixed. Do not returns from inside an exception handler. * EOAccess/EODatabaseContext.m ([EODatabaseContext -prepareForSaveWithCoordinator:editingContext:]): bug fix. Do not release an autoreleased object. * EOAccess/EODatabaseDataSource.m ([EODatabaseDataSource -fetchSpecificationForFetch]): fixed fetch qualifier. * EOControl/EOKeyValueQualifier.m ([EOKeyValueQualifier -copyWithZone:]): do not copy _value. * EOControl/EOAndQualifier.m ([EOAndQualifier -copyWithZone:]): use correct zone. * EOControl/EOOrQualifier.m ([EOOrQualifier -copyWithZone:]): likewise. * EOControl/EOKeyComparisonQualifier.m ([EOKeyComparisonQualifier -copyWithZone:]): likewise. 2000-12-20 Mirko Viviani * EOAccess/EODatabaseContext.m ([EODatabaseContext -_recordChangesForObjects:operator:]): create dbOperation with the correct entity for to-many relationship objects. 2000-12-11 Mirko Viviani * EOAccess/EOModel.m ([EOModel -_registerClassDescForClass:]): check for NULL _entitiesByClass ([EOModel -dealloc]): release _entitiesByClass ([EOModel -removeEntity:]): bug fix. * EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres -_evaluateCommandsUntilAFetch]): raise an exception on error. 2000-12-10 Mirko Viviani * EOControl/EOKeyValueCoding.m (newGetStoredBinding): fixed value of class variable. 2000-12-09 Mirko Viviani * EOAccess/EOModel.m ([EOModel -_registerClassDescForClass:]): fixed class description registration. ([EOModel -_registerClassDescForEntityName:]): likewise. ([EOModel -addEntity:]), ([EOModel -removeEntity:]): save EOEntity in _entitiesByClass. 2000-12-08 Mirko Viviani * EOAccess/EODatabaseContext.m ([EODatabaseContext -prepareForSaveWithCoordinator:editingContext:]): get the object value if the key is a class property. Added code to handle propagatesPrimaryKey for to many relationships. Fixed code that merges pk values. * EOControl/EOClassDescription.m ([EOClassDescription -awakeObject: fromInsertionInEditingContext:]): use NSMutableArray for to many relationships. 2000-12-08 Mirko Viviani * EOAccess/EODatabaseContext.m ([EODatabaseContext -faultForGlobalID: editingContext:]): set only class property's object values. ([EODatabaseContext -faultForRawRow:entityNamed:editingContext:]): likewise. ([EODatabaseContext -_recordChangesForObjects:operator:]): likewise. ([EODatabaseContext -batchFetchRelationship:forSourceObjects: editingContext:]): get key value from snapshot rather than in the object. 2000-12-06 Mirko Viviani * EOControl/EOKeyValueCoding.m ([NSObject -handleQueryWithUnboundKey:]): raise an EOUnknownKeyException with the correct userInfo. ([NSObject -handleTakeValue:forUnboundKey:]): likewise. * EOAccess/EOEntity.m ([EOEntity -isPrimaryKeyValidInObject:]): check valueForKey: exception. * EOControl/EOClassDescription.m ([NSObject -changesFromSnapshot:]): check for EONull values as toMany relationship array. * EOControl/EOEditingContext.m ([EOEditingContext -processRecentChanges]): check for EONull values in dictionary. * EOAccess/EOModel.m ([EOModel -initWithPropertyList:owner:]): check for an exception in the entity awakeWithPropertyList method. * EOAccess/EOJoin.m ([EOJoin -initWithSourceAttribute: destinationAttribute:]): raise exception if source or destination is nil. 2000-12-05 Mirko Viviani * EOAccess/EODatabaseChannel.m ([EODatabaseChannel -fetchObject]): fixed refreshing objects. * EOControl/EOKeyValueCoding.m ([NSArray -valueForKey:]): fixed array and string selector. * EOAccess/EOUtilities.m ([EOEditingContext -objectsForEntityNamed:]): ([EOEditingContext -primaryKeyForObject:]), ([EOEditingContext -entityForObject:]): implemented. * EOAccess/EODatabaseContext.m ([EODatabaseContext -prepareForSaveWithCoordinator:editingContext:]): lock the database context. ([EODatabaseContext -commitChanges]), ([EODatabaseContext -rollbackChanges]): unlock the database context ([EODatabaseContext -registerLockedObjectWithGlobalID:]): fixed zone size. 2000-12-04 Mirko Viviani * EOAccess/EODatabaseContext.m ([EODatabaseContext -_recordChangesForObjects:operator:]): when updating relationship keys look also in the object snapshot. 2000-12-03 Mirko Viviani * EOAccess/EOSQLExpression.m ([EOSQLExpression -sqlStringForKeyValueQualifier:]): bug fix. * EOAccess/EOUtilities.m ([EOEditingContext -objectsMatchingValue: forKey:entityNamed:]): implemented. 2000-12-01 Mirko Viviani * EOAccess/EOUtilities.m/.h: new files. * EOAccess/EOAccess.h: addes EOUtilities.h 2000-11-23 Mirko Viviani * EOControl/EOEditingContext.m ([EOEditingContext -initializeObject:withGlobalID:editingContext:]): ensure that the next 'willChange' notification will be processed for the initialized object. * EOAccess/EOEntity.m ([EOEntity -globalIDForRow:]): fixed globalID values order for compound PKs. 2000-11-22 Mirko Viviani * EOAccess/EODatabaseOperationPriv.h: new file. * EOAccess/EODatabaseOperation.m ([EODatabaseOperation -_setGlobalID:]): new method. * EOAccess/EODatabaseContext.m ([EODatabaseContext -prepareForSaveWithCoordinator:editingContext:]): fixed propagates primary key code. ([EODatabaseContext -_recordChangesForObjects:operator:]): in toOne rel discard PK to PK joins. Discard 'empty' toOne rels. ([EODatabaseContext -_setGlobalID:forDatabaseOperation:): new method. It replaces the globalID for the gived operation. * EOAccess/EORelationship.m ([EORelationship -initWithPropertyList:owner:]): check for 'propagatesPrimaryKey'. * EOAccess/EOSQLExpression.m ([EOSQLExpression -addOrderByAttributeOrdering:]): use compare selector defines. Call -sqlStringForAttributeNamed: for the sortOrdering key. 2000-11-19 Mirko Viviani * EOControl/EOFault.m ([EOFault +makeObjectIntoFault:withHandler:]): do not turn into fault the nil object. * EOControl/EOEditingContext.m ([EOEditingContext -refaultObject:withGlobalID:editingContext:]): does nothing if objects is nil. * EOAccess/EODatabaseContext.m ([EODatabaseContext -refaultObject:withGlobalID:editingContext:]): likewise. ([EODatabaseContext -refaultObject:withGlobalID:editingContext:]): does not remove the snapshot. ([EODatabaseChannel -fetchObject]): fix for refreshing object. * EOControl/EOSortOrdering.m ([NSMutableArray -_sortUsingKeyOrder:fromIndex:count:]): use defined value for compare selectors. Fix when aValue or bValue are nil. ([EONull -compareAscending:]), ([EONull -compareDescending:]), ([EONull -compareCaseInsensitiveAscending:]): ([EONull -compareCaseInsensitiveDescending:]): if value to be compared is be treat it as EONull. 2000-11-18 Mirko Viviani * EOControl/EOEditingContext.m ([EOEditingContext -processRecentChanges]): get toOne and toMany keys from object instead of the editingContext. * EOAccess/EODatabaseContext.m ([EODatabaseContext -_recordChangesForObjects:operator:]): new method. Fixed foreign key update for inserted objects of toOne relationships. Fixed dictionary and foreign key update for toMany relationships. ([EODatabaseContext -recordChangesInEditingContext]): moved code into -_recordChangesForObjects:operator: and check changes also in inserted objects. ([EODatabaseContext -_dbOperationWithObject:operator:]): new method. Find db operation for the given object and operator. ([EODatabaseContext -commitChanges]), ([EODatabaseContext -rollbackChanges]): reset ivars if no transaction in progress. 2000-11-16 Mirko Viviani * EOControl/EOEditingContext.m ([EOEditingContext -_handleObjectsChangedInStoreNotification:]): refault updated objects. * EOAccess/EODatabaseChannel.m ([EODatabaseChannel -fetchObject]): fixed notification for refreshed objects. * EOAccess/EOSQLExpression.m ([EOSQLExpression -sqlStringForAttribute:]): fix id attribute is derived. * EOAccess/EOEntity.m ([EOEntity -setAttributesUsedForLocking:]): fix release of the array when no valid attributes are found. ([EOEntity -setPrimaryKeyAttributes:]): likewise. * EOAccess/EODatabase.m ([EODatabase -forgetSnapshotsForGlobalIDs:]): ([EODatabase -forgetSnapshotForGlobalID:]): use defined userInfo string instead of an hardcoded one. 2000-11-05 Mirko Viviani * EOControl/EOSortOrdering.m ([NSArray -sortedArrayUsingKeyOrderArray:]): implemented. ([NSMutableArray -sortUsingKeyOrderArray:]): not fully implemented. ([NSMutableArray -_sortUsingKeyOrder:fromIndex:count:]): modified gnustep-base shell sort. ([EOSortOrdering -initWithCoder:]): fixed. ([EONull -compareAscending:]): implemented. ([EONull -compareDescending:]): implemented. ([EONull -compareCaseInsensitiveAscending:]): implemented. ([EONull -compareCaseInsensitiveDescending:]): implemented. * EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres -_describeResults]): does not coerce attribute className. * EOAdaptors/Postgres95/Postgres95Values.m: fixed pg calendar format. * EOAdaptors/Postgres95/Postgres95SQLExpression.m ([Postgres -assembleSelectStatementWithAttributes:lock:qualifier:fetchOrder:selectString:columnList:tableList:whereClause:joinClause:orderByClause:lockClause:]): does not return mutableCopy of the string. ([Postgres +formatValue:forAttribute:]): implemented. Added code from Turbocat's development. * EOAccess/EOSQLExpression.m: does not return mutableCopy of a string. ([EOSQLExpression +formatValue:forAttribute:]): return value unchanged. ([EOSQLExpression -sqlStringForValue:attributeNamed:]): bug fix ? moved code from +[formatValue:forAttribute:] * EOControl/EOAndQualifier.m ([EOAndQualifier -sqlStringForSQLExpression:]): doesn't return mutableCopy of a string. * EOControl/EOOrQualifier.m ([EOOrQualifier -sqlStringForSQLExpression:]): likewise. * EOControl/EODetailDataSource.m ([EODetailDataSource -initWithMasterClassDescription:detailKey:]): set masterClassDescription. * EOAccess/EOSQLExpression.m ([EOSQLExpression -addCreateClauseForAttribute:]): ([EOSQLExpression -allowsNullClauseForConstraint:]): ([EOSQLExpression -columnTypeStringForAttribute:]): ([EOSQLExpression +dropTableStatementsForEntityGroup:]): ([EOSQLExpression +createTableStatementsForEntityGroup:]): ([EOSQLExpression +primaryKeyConstraintStatementsForEntityGroup:]): ([EOSQLExpression +primaryKeySupportStatementsForEntityGroup:]): ([EOSQLExpression +dropPrimaryKeySupportStatementsForEntityGroup:]): ([EOSQLExpression +createTableStatementsForEntityGroups:]): ([EOSQLExpression +dropTableStatementsForEntityGroups:]): ([EOSQLExpression +primaryKeyConstraintStatementsForEntityGroups:]): ([EOSQLExpression +primaryKeySupportStatementsForEntityGroups:]): ([EOSQLExpression +dropPrimaryKeySupportStatementsForEntityGroups:]): ([EOSQLExpression +appendExpression:toScript:]): ([EOSQLExpression +schemaCreationScriptForEntities:options:]): ([EOSQLExpression +schemaCreationStatementsForEntities:options:]): ([EOSQLExpression -prepareConstraintStatementForRelationship: sourceColumns:destinationColumns:]): ([EOSQLExpression +createDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary:]): ([EOSQLExpression +dropDatabaseStatementsForConnectionDictionary: administrativeConnectionDictionary:]): ([EOSQLExpression +selectStatementForContainerOptions]): implemented. * EOAccess/EOEntity.m ([EOEntity -primaryKeyRootName]): bug fix: calls -primaryKeyRootName on the _parent entity instead of -externalName. * EOAccess/EOSchemaGeneration.h: new file. * EOAccess/EOAccess.h: added EOSchemaGeneration.h * EOAccess/EOModel.m ([EOModel -initWithContentsOfFile:]):, ([EOModel -initWithTableOfContentsPropertyList:path:]): fixed _name and _path. ([EOModel -initWithPropertyList:owner:]): use _path instead of _name. * EOAccess/EOModelGroup.m ([EOModelGroup +globalModelGroup]): search models in bundles and frameworks. * EOAccess/EOAdaptor.m ([EOAdaptor +adaptorWithName:]): changed adaptor from bundle to framework. Looks for EOAdaptor.framework ([EOAdaptor -createDatabaseWithAdministrativeConnectionDictionary:]): ([EOAdaptor -dropDatabaseWithAdministrativeConnectionDictionary:]): new methods. * EOAccess/EOAdaptor.h: added include file * EOAccess/GNUmakefile: added LIBRARIES_DEPEND_UPON * EOControl/GNUmakefile: Likewise. 2000-10-05 Manuel Guesdon * EOAccess/EODatabaseChannel.m: added NSDebugMLog and NSAssert * EOAccess/EODatabaseDataSource.m: added NSDebugMLog and NSAssert * EOAccess/EOEntity.m: added NSDebugMLog and NSAssert * EOAccess/EOModel.m: modified -init * EOControl/EOFetchSpecification.h/.m: added EOKeyValueUnarchiver support * EOControl/EOKeyValueArchiver.h/.m: implemented EOKeyValueUnarchiver * EOControl/GNUmakefile: added EOKeyValueArchiver 2000-09-28 Manuel Guesdon * EOAccess/EODatabaseContext.m: added NSDebugMLog and NSAssert * EOAccess/EODatabaseChannel.m: added NSDebugMLog and NSAssert * EOAdaptors/Postgres95/Postgres95Channel.m : added NSDebugMLog and NSAssert * EOAccess/EODatabase.m: added NSDebugMLog and NSAssert 2000-09-24 Manuel Guesdon * config.mak: added include directories in POSTGRES95_CFLAGS 2000-09-23 Mirko Viviani * EOControl/EOQualifier.m (getKey): fixed pointer in key-value parsing. 2000-09-17 Mirko Viviani * EOAdaptors/Postgres95/GNUmakefile: remove Postgres95Exceptions.h 2000-09-17 Mirko Viviani Patches by David Wetzel * EOAccess/EOAdaptorContext.m ([EOAdaptorContext -initWithAdaptor:]): set default debug. * EOAccess/EOModel.m ([EOModel +findPathForModelNamed:]): look also in the current dir. * EOControl/EOObjectStoreCoordinator.m ([EOObjectStoreCoordinator -objectStoreForGlobalID:]), ([EOObjectStoreCoordinator -objectStoreForObject:]), ([EOObjectStoreCoordinator -objectStoreForFetchSpecification:]): bug fix: changed notification object. gnustep-dl2-0.12.0/configure0000775000175000017500000043533014636001533014742 0ustar yavoryavor#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias PG_CONFIG CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP GREP EGREP POSTGRES_DATABASE POSTGRES_INCLUDES POSTGRES_LIB_DIRS POSTGRES_LIBS PKGCONFIG SQLITE3_DATABASE SQLITE3_INCLUDES SQLITE3_LIB_DIRS SQLITE3_LIBS EOADAPTORS GUI_SUBPROJECTS EXAMPLE_SUBPROJECTS VERSION MAJOR_VERSION MINOR_VERSION SUBMINOR_VERSION GCC_VERSION LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-gui-projects to disable building GUI projects --disable-gorm-palette to disable building gorm palette --enable-examples to enable building examples from top level Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pgsql-include=PATH include path for postgres headers --with-pgsql-library=PATH library path for pgsql libraries --with-sqlite3-include=-I{PATH} include path for sqlite3 headers --with-sqlite3-library=-L{PATH} library path for sqlite3 libraries Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # If GNUSTEP_MAKEFILES is undefined, try to use gnustep-config to determine it. if test -z "$GNUSTEP_MAKEFILES"; then GNUSTEP_MAKEFILES=`gnustep-config --variable=GNUSTEP_MAKEFILES 2>&5` fi if test -z "$GNUSTEP_MAKEFILES"; then { { echo "$as_me:$LINENO: error: You must set GNUSTEP_MAKEFILES or run the GNUstep initialization script first!" >&5 echo "$as_me: error: You must set GNUSTEP_MAKEFILES or run the GNUstep initialization script first!" >&2;} { (exit 1); exit 1; }; } fi ac_config_headers="$ac_config_headers config.h" #-------------------------------------------------------------------- # Check for Postgres database #-------------------------------------------------------------------- ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f -r conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f -r conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check whether --with-pgsql-include was given. if test "${with_pgsql_include+set}" = set; then withval=$with_pgsql_include; pgsql_incdir="$withval" else pgsql_incdir= fi # Check whether --with-pgsql-library was given. if test "${with_pgsql_library+set}" = set; then withval=$with_pgsql_library; pgsql_libdir="$withval" else pgsql_libdir= fi cppflags_temp="$CPPFLAGS" libs_temp=$LIBS # Extract the first word of "pg_config", so it can be a program name with args. set dummy pg_config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_PG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PG_CONFIG"; then ac_cv_prog_PG_CONFIG="$PG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PG_CONFIG="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_PG_CONFIG" && ac_cv_prog_PG_CONFIG="no" fi fi PG_CONFIG=$ac_cv_prog_PG_CONFIG if test -n "$PG_CONFIG"; then { echo "$as_me:$LINENO: result: $PG_CONFIG" >&5 echo "${ECHO_T}$PG_CONFIG" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $PG_CONFIG = "yes" ; then if test -z "$pgsql_incdir" ; then pgsql_incdir=`pg_config --includedir` fi if test -z "$pgsql_libdir" ; then pgsql_libdir=`pg_config --libdir` fi fi CPPFLAGS="-I$pgsql_incdir $CPPFLAGS" LIBS="-L$pgsql_libdir $LIBS" POSTGRES_DATABASE="no" for ac_header in libpq-fe.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_header_libpq_fe_h = yes; then { echo "$as_me:$LINENO: checking for main in -lpq" >&5 echo $ECHO_N "checking for main in -lpq... $ECHO_C" >&6; } if test "${ac_cv_lib_pq_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpq $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_pq_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_pq_main=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_pq_main" >&5 echo "${ECHO_T}$ac_cv_lib_pq_main" >&6; } if test $ac_cv_lib_pq_main = yes; then pgsql_ok=yes else pgsql_ok=no fi if test "$pgsql_ok" = yes; then POSTGRES_INCLUDES="$CPPFLAGS" POSTGRES_LIB_DIRS="$LIBS" POSTGRES_LIBS="-lpq" POSTGRES_DATABASE="yes" fi fi { echo "$as_me:$LINENO: checking for PostgreSQL database" >&5 echo $ECHO_N "checking for PostgreSQL database... $ECHO_C" >&6; } if test $POSTGRES_DATABASE = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } enable_pgsql=yes else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } enable_pgsql=no fi if test $POSTGRES_DATABASE = yes; then { echo "$as_me:$LINENO: checking whether PQfreemem is declared" >&5 echo $ECHO_N "checking whether PQfreemem is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_PQfreemem+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { #ifndef PQfreemem (void) PQfreemem; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_PQfreemem=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_PQfreemem=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_PQfreemem" >&5 echo "${ECHO_T}$ac_cv_have_decl_PQfreemem" >&6; } if test $ac_cv_have_decl_PQfreemem = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PQFREEMEM 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PQFREEMEM 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether PQunescapeBytea is declared" >&5 echo $ECHO_N "checking whether PQunescapeBytea is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_PQunescapeBytea+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { #ifndef PQunescapeBytea (void) PQunescapeBytea; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_PQunescapeBytea=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_PQunescapeBytea=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_PQunescapeBytea" >&5 echo "${ECHO_T}$ac_cv_have_decl_PQunescapeBytea" >&6; } if test $ac_cv_have_decl_PQunescapeBytea = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PQUNESCAPEBYTEA 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PQUNESCAPEBYTEA 0 _ACEOF fi fi CPPFLAGS="$cppflags_temp" LIBS="$libs_temp" if test $enable_pgsql = yes; then EOADAPTORS="$EOADAPTORS PostgreSQLAdaptor" ac_config_files="$ac_config_files EOAdaptors/PostgreSQLAdaptor/GNUmakefile EOAdaptors/PostgreSQLAdaptor/config.mak" HAVE_PGSQL=1 # AC_DEFINE(HAVE_LIBXML,1, # [Define if libxml available]) else HAVE_PGSQL=0 fi #-------------------------------------------------------------------- # Check for SQLite3 database #-------------------------------------------------------------------- # Check whether --with-sqlite3-include was given. if test "${with_sqlite3_include+set}" = set; then withval=$with_sqlite3_include; sqlite3_incdir="$withval" else sqlite3_incdir= fi # Check whether --with-sqlite3-library was given. if test "${with_sqlite3_library+set}" = set; then withval=$with_sqlite3_library; sqlite3_libdir="$withval" else sqlite3_libdir= fi cppflags_temp="$CPPFLAGS" libs_temp=$LIBS # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_PKGCONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PKGCONFIG"; then ac_cv_prog_PKGCONFIG="$PKGCONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PKGCONFIG="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_PKGCONFIG" && ac_cv_prog_PKGCONFIG="no" fi fi PKGCONFIG=$ac_cv_prog_PKGCONFIG if test -n "$PKGCONFIG"; then { echo "$as_me:$LINENO: result: $PKGCONFIG" >&5 echo "${ECHO_T}$PKGCONFIG" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $PKGCONFIG = "yes" ; then if test -z "$sqlite3_incdir" ; then sqlite3_incdir=`pkg-config sqlite3 --cflags` fi if test -z "$sqlite3_libdir" ; then sqlite3_libdir=`pkg-config sqlite3 --libs-only-L` fi fi CPPFLAGS="$sqlite3_incdir $CPPFLAGS" LIBS="$sqlite3_libdir $LIBS" SQLITE3_DATABASE="no" for ac_header in sqlite3.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_header_sqlite3_h = yes; then { echo "$as_me:$LINENO: checking for main in -lsqlite3" >&5 echo $ECHO_N "checking for main in -lsqlite3... $ECHO_C" >&6; } if test "${ac_cv_lib_sqlite3_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsqlite3 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_sqlite3_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_sqlite3_main=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_sqlite3_main" >&5 echo "${ECHO_T}$ac_cv_lib_sqlite3_main" >&6; } if test $ac_cv_lib_sqlite3_main = yes; then sqlite3_ok=yes else sqlite3_ok=no fi if test "$sqlite3_ok" = yes; then SQLITE3_INCLUDES="$CPPFLAGS" SQLITE3_LIB_DIRS="$LIBS" SQLITE3_LIBS="-lsqlite3" SQLITE3_DATABASE="yes" fi fi { echo "$as_me:$LINENO: checking for SQLite3 database" >&5 echo $ECHO_N "checking for SQLite3 database... $ECHO_C" >&6; } if test $SQLITE3_DATABASE = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } enable_sqlite3=yes else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } enable_sqlite3=no fi CPPFLAGS="$cppflags_temp" LIBS="$libs_temp" if test $enable_sqlite3 = yes; then EOADAPTORS="$EOADAPTORS SQLiteAdaptor" ac_config_files="$ac_config_files EOAdaptors/SQLiteAdaptor/GNUmakefile" HAVE_SQLITE3=1 else HAVE_SQLITE3=0 fi # FIXME: Once we have a generic reliable way to test-link GNUstep projects # this should be replaced with that technique. GUI_SUBPROJECTS="" # Check whether --enable-gui-projects was given. if test "${enable_gui_projects+set}" = set; then enableval=$enable_gui_projects; else enable_gui_projects=yes fi if test "$enable_gui_projects" = "yes"; then GUI_SUBPROJECTS="$GUI_SUBPROJECTS EOInterface Apps/EOModeler Apps/EOModelEditor" fi # Check whether --enable-gorm-palette was given. if test "${enable_gorm_palette+set}" = set; then enableval=$enable_gorm_palette; else enable_gorm_palette=${enable_gui_projects} fi if test "$enable_gorm_palette" = "yes"; then GUI_SUBPROJECTS="$GUI_SUBPROJECTS GDL2Palette" fi EXAMPLE_SUBPROJECTS="" # Check whether --enable-examples was given. if test "${enable_examples+set}" = set; then enableval=$enable_examples; else enable_examples=no fi if test "$enable_examples" = "yes"; then EXAMPLE_SUBPROJECTS=" Examples" fi #-------------------------------------------------------------------- # Record the version #-------------------------------------------------------------------- { echo "$as_me:$LINENO: checking for the version of GDL2 we are compiling" >&5 echo $ECHO_N "checking for the version of GDL2 we are compiling... $ECHO_C" >&6; } if test -f "Version"; then . ./Version fi { echo "$as_me:$LINENO: result: $VERSION" >&5 echo "${ECHO_T}$VERSION" >&6; } #-------------------------------------------------------------------- # Write the Makefiles #-------------------------------------------------------------------- ac_config_files="$ac_config_files gdl2.make GNUmakefile EOAdaptors/GNUmakefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "EOAdaptors/PostgreSQLAdaptor/GNUmakefile") CONFIG_FILES="$CONFIG_FILES EOAdaptors/PostgreSQLAdaptor/GNUmakefile" ;; "EOAdaptors/PostgreSQLAdaptor/config.mak") CONFIG_FILES="$CONFIG_FILES EOAdaptors/PostgreSQLAdaptor/config.mak" ;; "EOAdaptors/SQLiteAdaptor/GNUmakefile") CONFIG_FILES="$CONFIG_FILES EOAdaptors/SQLiteAdaptor/GNUmakefile" ;; "gdl2.make") CONFIG_FILES="$CONFIG_FILES gdl2.make" ;; "GNUmakefile") CONFIG_FILES="$CONFIG_FILES GNUmakefile" ;; "EOAdaptors/GNUmakefile") CONFIG_FILES="$CONFIG_FILES EOAdaptors/GNUmakefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim PG_CONFIG!$PG_CONFIG$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim CPP!$CPP$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim POSTGRES_DATABASE!$POSTGRES_DATABASE$ac_delim POSTGRES_INCLUDES!$POSTGRES_INCLUDES$ac_delim POSTGRES_LIB_DIRS!$POSTGRES_LIB_DIRS$ac_delim POSTGRES_LIBS!$POSTGRES_LIBS$ac_delim PKGCONFIG!$PKGCONFIG$ac_delim SQLITE3_DATABASE!$SQLITE3_DATABASE$ac_delim SQLITE3_INCLUDES!$SQLITE3_INCLUDES$ac_delim SQLITE3_LIB_DIRS!$SQLITE3_LIB_DIRS$ac_delim SQLITE3_LIBS!$SQLITE3_LIBS$ac_delim EOADAPTORS!$EOADAPTORS$ac_delim GUI_SUBPROJECTS!$GUI_SUBPROJECTS$ac_delim EXAMPLE_SUBPROJECTS!$EXAMPLE_SUBPROJECTS$ac_delim VERSION!$VERSION$ac_delim MAJOR_VERSION!$MAJOR_VERSION$ac_delim MINOR_VERSION!$MINOR_VERSION$ac_delim SUBMINOR_VERSION!$SUBMINOR_VERSION$ac_delim GCC_VERSION!$GCC_VERSION$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 67; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi gnustep-dl2-0.12.0/Apps/0000775000175000017500000000000014636001532013725 5ustar yavoryavorgnustep-dl2-0.12.0/Apps/EOModelEditor/0000775000175000017500000000000014747431374016376 5ustar yavoryavorgnustep-dl2-0.12.0/Apps/EOModelEditor/SQLGenerator.m0000664000175000017500000002251514636003765021063 0ustar yavoryavor/** SQLGenerator.m Author: Matt Rice Date: 2005, 2006 Author: David Wetzel Date: 2010 This file is part of EOModelEditor. EOModelEditor 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 3 of the License, or (at your option) any later version. EOModelEditor 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 EOModelEditor; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA **/ #include "SQLGenerator.h" #ifdef NeXT_Foundation_LIBRARY #include #else #include #include #endif #ifdef NeXT_GUI_LIBRARY #include #else #include #include #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include "EOMEDocument.h" static SQLGenerator *sharedGenerator; static BOOL loadedNib; static BOOL goodToGo; static NSMutableArray *adminSwitchButtons; static NSMutableArray *otherSwitchButtons; NSMutableDictionary *opts; static NSString *_adminScript; static NSString *_otherScript; @implementation SQLGenerator : NSObject + (SQLGenerator *) sharedGenerator; { if (!sharedGenerator) sharedGenerator = [[self allocWithZone:NSDefaultMallocZone()] init]; return sharedGenerator; } - (id) init { if (sharedGenerator) { [[NSException exceptionWithName:NSInternalInconsistencyException reason: @"singleton initialized multiple times" userInfo:nil] raise]; return nil; } self = [super init]; adminSwitchButtons = [[NSMutableArray alloc] initWithCapacity:3]; otherSwitchButtons = [[NSMutableArray alloc] initWithCapacity:7]; opts = [[NSMutableDictionary alloc] initWithCapacity:8]; loadedNib = [NSBundle loadGSMarkupNamed: @"SQLGenerator" owner: self]; return self; } - (void) dealloc { DESTROY(_document); [super dealloc]; } - (void) awakeFromGSMarkup { [[dropDatabaseSwitch cell] setRepresentedObject: EODropDatabaseKey]; [[createDatabaseSwitch cell] setRepresentedObject: EOCreateDatabaseKey]; [[dropTablesSwitch cell] setRepresentedObject: EODropTablesKey]; [[createTablesSwitch cell] setRepresentedObject:EOCreateTablesKey]; [[dropPKSwitch cell] setRepresentedObject:EODropPrimaryKeySupportKey]; [[createPKSwitch cell] setRepresentedObject:EOCreatePrimaryKeySupportKey]; [[createPKConstraintsSwitch cell] setRepresentedObject:EOPrimaryKeyConstraintsKey]; [[createFKConstraintsSwitch cell] setRepresentedObject:EOForeignKeyConstraintsKey]; [adminSwitchButtons addObject:dropDatabaseSwitch]; [adminSwitchButtons addObject:createDatabaseSwitch]; [otherSwitchButtons addObject:dropTablesSwitch]; [otherSwitchButtons addObject:createTablesSwitch]; [otherSwitchButtons addObject:dropPKSwitch]; [otherSwitchButtons addObject:createPKSwitch]; [otherSwitchButtons addObject:createPKConstraintsSwitch]; [otherSwitchButtons addObject:createFKConstraintsSwitch]; goodToGo = YES; } - (void) openSQLGeneratorForDocument:(EOMEDocument*)sender { NSString *adaptorName; ASSIGN(_document, sender); while (loadedNib && !goodToGo) { /* wait.. */ } adaptorName = [[_document eomodel] adaptorName]; if (!adaptorName) { [_document setAdaptor:self]; } adaptorName = [[_document eomodel] adaptorName]; if (adaptorName) [_window makeKeyAndOrderFront:self]; } - (void)windowWillClose:(NSNotification *)notification { DESTROY(_document); } - (IBAction) executeSQL:(id)sender { EOModel *eomodel = [_document eomodel]; EOAdaptor *adaptor; EOAdaptorContext *context; EOAdaptorChannel *channel; adaptor = [EOAdaptor adaptorWithName: [eomodel adaptorName]]; Class exprClass = [adaptor expressionClass]; EOSQLExpression *expr; NSDictionary *connDict = [adaptor connectionDictionary]; if ([[_sqlOutput string] length] == 0) return; if (!adaptor) { [_document setAdaptor:self]; adaptor = [EOAdaptor adaptorWithName: [eomodel adaptorName]]; connDict = [adaptor connectionDictionary]; } else if ([[connDict allKeys] count] == 0) { connDict = [adaptor runLoginPanel]; if (connDict) [adaptor setConnectionDictionary:connDict]; } if (!adaptor || [[connDict allKeys] count] == 0) { NSRunAlertPanel(@"Error", @"SQL generator requires a valid adaptor and connection dictionary", @"Ok", nil, nil); return; } RETAIN(connDict); context = [adaptor createAdaptorContext]; channel = [context createAdaptorChannel]; /* FIXME * this is a hack for PostgreSQL because it requires you to connect to an * existing database to run 'CREATE DATABASE' statements, it should probably * not be in EOModelEditor. */ if (_adminScript && [_adminScript length] && [[connDict objectForKey:@"adaptorName"] isEqual:@"PostgreSQLEOAdaptor"]) { NSMutableDictionary *tmp = RETAIN([NSMutableDictionary dictionaryWithDictionary:connDict]); [tmp setObject:@"template1" forKey:@"databaseName"]; [adaptor setConnectionDictionary:tmp]; } if (_adminScript && [_adminScript length]) { NS_DURING [channel openChannel]; NS_HANDLER NSLog(@"admin exception%@ %@ %@", [localException name], [localException reason], [localException userInfo]); NS_ENDHANDLER expr = [exprClass expressionForString:_adminScript]; NS_DURING [channel evaluateExpression:expr]; NS_HANDLER NSLog(@"admin exception%@ %@ %@", [localException name], [localException reason], [localException userInfo]); NS_ENDHANDLER if ([channel isOpen]) [channel closeChannel]; } if (_otherScript && [_otherScript length]) { [adaptor setConnectionDictionary:connDict]; NS_DURING [channel openChannel]; NS_HANDLER NSLog(@"exception %@ %@ %@", [localException name], [localException reason], [localException userInfo]); NS_ENDHANDLER expr = [exprClass expressionForString:_otherScript]; NS_DURING [channel evaluateExpression:expr]; NS_HANDLER NSLog(@"exception %@ %@ %@", [localException name], [localException reason], [localException userInfo]); NS_ENDHANDLER if ([channel isOpen]) [channel closeChannel]; } RELEASE(connDict); } - (IBAction) showTables:(id)sender { NSEmitTODO(); } - (IBAction) saveAs:(id)sender { id savePanel = [NSSavePanel savePanel]; int result = [savePanel runModal]; if (result == NSOKButton) { NSString *path; path = [savePanel filename]; [[_sqlOutput string] writeToFile:path atomically:YES]; } } - (void) generate { EOModel * model = [_document eomodel]; Class expr; EOAdaptor * adaptor; NSArray *arr; int i, c; NSButton *btn; adaptor = [EOAdaptor adaptorWithName: [model adaptorName]]; expr = [adaptor expressionClass]; if (!expr) { [_document setAdaptor:self]; adaptor = [EOAdaptor adaptorWithName: [model adaptorName]]; expr = [adaptor expressionClass]; if (!expr) return; } for (i = 0, c = [adminSwitchButtons count]; i < c; i++) { btn = [adminSwitchButtons objectAtIndex:i]; [opts setObject:([[btn objectValue] boolValue]) ? @"YES" : @"NO" forKey: [[btn cell] representedObject]]; } for (i = 0, c = [otherSwitchButtons count]; i < c; i++) { btn = [otherSwitchButtons objectAtIndex:i]; [opts setObject:@"NO" forKey:[[btn cell] representedObject]]; } arr = [model entities]; _adminScript = RETAIN([expr schemaCreationScriptForEntities:arr options:opts]); for (i = 0, c = [adminSwitchButtons count]; i < c; i++) { btn = [adminSwitchButtons objectAtIndex:i]; [opts setObject:@"NO" forKey:[[btn cell] representedObject]]; } for (i = 0, c = [otherSwitchButtons count]; i < c; i++) { btn = [otherSwitchButtons objectAtIndex:i]; [opts setObject:([[btn objectValue] boolValue]) ? @"YES" : @"NO" forKey: [[btn cell] representedObject]]; } arr = [model entities]; _otherScript = RETAIN([expr schemaCreationScriptForEntities:arr options:opts]); [_sqlOutput setString:[_adminScript stringByAppendingString:_otherScript]]; } - (IBAction) switchChanged:(id)sender { RELEASE(_adminScript); RELEASE(_otherScript); [self generate]; } @end gnustep-dl2-0.12.0/Apps/EOModelEditor/DataBrowser.m0000664000175000017500000001247414636003765020775 0ustar yavoryavor/** DataBrowser.h EOMEDocument Class Copyright (C) Free Software Foundation, Inc. Author: David Wetzel Date: 2010 This file is part of EOModelEditor. EOModelEditor 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 3 of the License, or (at your option) any later version. EOModelEditor 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 EOModelEditor; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA **/ #import "DataBrowser.h" #import #import "TableViewController.h" #import static DataBrowser *sharedDataBrowser = nil; @implementation DataBrowser - (NSWindow*) _window { return _window; } + (DataBrowser *) sharedBrowser; { if (!sharedDataBrowser) sharedDataBrowser = [[self alloc] init]; [[sharedDataBrowser _window] makeKeyAndOrderFront:nil]; return sharedDataBrowser; } - (id) init { if (sharedDataBrowser) { [[NSException exceptionWithName:NSInternalInconsistencyException reason: @"singleton initialized multiple times" userInfo:nil] raise]; return nil; } self = [super init]; [NSBundle loadGSMarkupNamed: @"DataBrowser" owner: self]; [_window setFrameUsingName:NSStringFromClass([self class])]; _tableViewController = [TableViewController new]; [_tableView setDataSource:_tableViewController]; [_tableView setDelegate:_tableViewController]; return self; } - (void) removeTableColumns { NSArray * columns = [_tableView tableColumns]; NSEnumerator * colEnumer = [[NSArray arrayWithArray:columns] objectEnumerator]; NSTableColumn * column; while ((column = [colEnumer nextObject])) { if ([[column identifier] isEqual:@"_#number"] == NO) { [_tableView removeTableColumn:column]; } } } - (void) setEntity:(EOEntity*) aValue { ASSIGN(_currentEntity, aValue); if (_currentEntity) { NSEnumerator * attributeEnumer = [[_currentEntity attributes] objectEnumerator]; EOAttribute * currentAttribute = nil; [_tableViewController setRepresentedObject:[NSArray array]]; [_tableView reloadData]; [self removeTableColumns]; [_entityNameField setStringValue:[_currentEntity name]]; while ((currentAttribute = [attributeEnumer nextObject])) { NSString * attributeName = [currentAttribute name]; NSTableColumn * column = [[NSTableColumn alloc] initWithIdentifier:attributeName]; [[column headerCell] setStringValue:attributeName]; [column setEditable:NO]; [_tableView addTableColumn:column]; RELEASE(column); } } } - (void) dealloc { sharedDataBrowser = nil; DESTROY(_tableViewController); DESTROY(_currentEntity); DESTROY(_editingContext); [super dealloc]; } - (void) awakeFromGSMarkup { } - (IBAction) fetch:(id) sender { EOFetchSpecification *fetchSpec; EOQualifier *qual = nil; NSArray *results; NSMutableArray *keyPaths = [NSMutableArray array]; NSEnumerator *attributeEnumer = [[_currentEntity attributes] objectEnumerator]; EOAttribute *attribute; while ((attribute = [attributeEnumer nextObject])) { [keyPaths addObject:[attribute name]]; } [[EOModelGroup defaultGroup] addModel:[_currentEntity model]]; NS_DURING { if (!_editingContext) { ASSIGN(_editingContext, [EOEditingContext new]); RELEASE(_editingContext); [_editingContext setInvalidatesObjectsWhenFreed:YES]; } else { [_editingContext invalidateAllObjects]; } if ([[qualifierText stringValue] length] > 0) qual = [EOQualifier qualifierWithQualifierFormat:[qualifierText stringValue]]; fetchSpec = [EOFetchSpecification fetchSpecificationWithEntityName:[_currentEntity name] qualifier:qual sortOrderings:nil]; [fetchSpec setFetchLimit:[fetchLimitText intValue]]; [fetchSpec setRawRowKeyPaths:keyPaths]; results = [_editingContext objectsWithFetchSpecification:fetchSpec]; [_tableViewController setRepresentedObject:results]; [_tableView reloadData]; } NS_HANDLER { NSRunCriticalAlertPanel (@"Problem fetching from Database", @"%@", @"Ok", nil, nil, localException); } NS_ENDHANDLER; [[EOModelGroup defaultGroup] removeModel:[_currentEntity model]]; } - (BOOL)windowShouldClose:(id)sender { [_window endEditingFor:self]; [_window saveFrameUsingName:NSStringFromClass([self class])]; [_window setDelegate:nil]; [_window orderOut:self]; [self performSelector:@selector(release) withObject:self afterDelay:0.001]; return YES; } @end gnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/0000775000175000017500000000000014636003765020344 5ustar yavoryavorgnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/ClassProperty_On.tiff0000664000175000017500000000066614636001532024462 0ustar yavoryavorII*r€ P8$ „BaP¸d6ˆDbQ8¤V-¿â`Ä=þª Ò0U"’I¥h$r;ÈdrÈ$ªg›I rèìj_žOÀèí…¢D(Ôxm&K¦Dè• V­W¬VkU°þP NX@j¦®(=R/Users/dave/dev/gdl2/trunk/Apps/EOModelEditor/Resources/ClassProperty_On.tiffHHgnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/EOModelEditor.icns0000664000175000017500000105644014636001532023655 0ustar yavoryavoricns] is32Òˆ 4… `™ %7Lew‡œ©ÔÙ ›ÆÊÙÝÏÈÏÇÐîæ§ŸéÜÚÂÃÎÎÇÒôêÀ-Œ¬¬ÕÁÙ½¹ºñöîÒHx´—ÕÏ¼ÍØÚøíïÞf[Æ“ÜÑÆéÚòö×ïå„C¿„ÖØÄÛäùãÉñå ,¼«ÕÕØG¹äüØÁãæ²'µœÏÓÅÓõîÉÄáâÅC¦¢ÁäÌáüÞÉÜ×Ñ™CˆÒÑ̶áñóúøâãˆcmU/vÿèÛ·”mK%€AS%ƒ‡ '‡Il(&;Loˆ•¬Á¨¢Ÿ ¡ÍÓßïÀ~uz±Ã²¬¤óâì•50.Ò°¿5’¯¶ÊHPYzjËÓ¸ÃTµ¥™@`¿ÐËÓË»ÄtaÉœ9†Þ¾ÖÐŒ¾¿’H¤LeÕÔá³Sijª/òÏ]RcÂEë…,±ª±0¿Þ±CVÔÐA}Ìš»O¯§Äö¶®ê±”Ó®‡{SÛÛÓÈÏÌÒÔ¹¤™WjvZ8kÙijvS6€8Fƒ‡ ˆ!+6'•´»Ñ@LEENphBŸa‚¹«™:R`WcmjDŠƒcΤ™7jy^|jYMoŸJÆ”¦E_ƒt…bI\S¯0È·ÕWNT‚‰DU'WA¬6Ä¡çµ;O‹5ŠŽ(§Y´©ËþÀŒŒqr¤h-[^•âäÚÔ“w}qRF9n|\AS~p`I;"€!&ƒs8mk  JƒÒ^ %?]|ž¹Óëþþúþ'ÝÿþÿþÿþÿøðÿóÿS ãÿöøéðùûþüÿõÿƒÈÿûøùÿþýüýÿöÿ´°ÿöôýúûþýýÿûÿÝ“ÿôùýûþþþþþþýû%vÿõúýûüþýýýÿ÷ÿPYÿøúøÿúýýþüÿõÿ>ÿúÿúýýýþþûÿøÿ¯&üýü÷öýÿü÷øùòÿÙéÿýÿûõ÷ûþÿûÿÙ,×úÛ¶ÐÿûÿðÖ²”T)" eW;il32 ”“€€ƒNK „€‡  «w ‡ƒ $â‘@€…-=L``©ä»€5ƒ 2EZiz𡍫ª¬²ÝåÑÀE€Nax‹œ©²¹¾¿ÈÉ¿º¾ÂÉØáâëêÞÕ¡VLáÍÖÑÐÎÏÏÑÜɵ´¼Äº®ºçîìäÕ©b3ÃÃÜØÛÝÞßẵÈÒÔÑÒÓ͸ïðîêÚ·n"ÄÊáÙÝÚÙÛ³À×ÓÌÊÎÉÎÁÔøîðîÝÄz.´ÅÝÛÚÛà¼ÅØÌÍÕÖÐÔÖºíóòðñà·>£Ë–v¥éÈ­ÕÒÓÖ¼¢¡§¥ÓûñôðóäÕ–M‘˰N™ï³ÎÈÄÕ°¨ÍÑͰæùóöòòéÙ¦[ |Í¿ŽžÛ¶ÛÓÖ±¬îßÞÚäøôöïïòìÛµhkÃÕt•ã¼ßÎܪàåØÝÖéøõ÷ÎîòïÜÃv)UÀÔ¡äËÜÔÕ©æåáÜÞ÷öúéÅïðñÞÌ„9>¿Ä‰hÌÎÜÓܪååÞÝèùôûØÄèòðßÒ“H+¶ÅdÕÊÜÔÞ»Áýßßò÷úîÅÐáôîáÕ¢V ©ÇÄjÜÉÙÛÕÚ®ÇéçùõýÝ·À×ôìäÕ°a ¿¸ŸÐ×ÇàÓÙÓ¨¬æùõøÎÏÀÅñêåÔ½m(€‰Äœ™Ñá»×Ú×ÀÓÜõôûèÄÑѶêêãÑÇy7|³Ôc¦ëÖÆØÎÅÒäúóûÔÐÑ´ÉææàÍΉGk©Ú¡êÖÜö×ÙóóøîDZÐ×ÙåÚÊÊK U«Á•…Ðß×ÙȸØúðúܳÉáçáâÜÎÑZsQB£¶©¶ÜßàâèÝëõòóðð÷ñìéàÚÊÎ,11š»øãÛÐÆ¿«¿÷ðõóôòëçà×ÐÊÁÇ¥“™•›–‘‚Êöêìçåäæ$âÛξ —|rdRE%7ççðöùúôçÒ·—tR3ƒ5)Šÿß×·—sO.‚‡YG$ ƒ…†‡”€“ƒ=7 „€‡ P‡ƒ "£b$B€…0CUfm‹zˆ›9ƒ"5I`p} «¯°°´½¬ “½œJ€Rd}¢°ºÁÉÅÍÜÓÆÄÌÜêðÛ´¶ É¯\OéÓÝ××ÖÖÙ×êÖ’`NJO_y¸Ì¸»¤½¸j6ÊÉäàäæéæò«I5:=>:=+XνÁ®·Äw!$ÊÑêâåäßë–6FKFFGBJ7ÔÀĶ°Ì…2ºÌåããáî±8NHCF>9=:GÍËÊþ¬Ð”D©ÒšzªñÒ[fPFH@Ygh;‹ßÊÏÄëͥT—Ó´PšÿšCO[VG™ÅÇĦËÖÐÐÈÆ®Æµc‚ÔÄ“îxQQKDÞÇÈÂÍÖÓÔÌÅdz¼ÄroÉÛx–òlTVLVÜÌËËÇÒÔÓÔ’ÃǸ²Î.YÇÛ§óyU\EjåÎÐÉÌÚÒÙÃTÂżªÑ‘@AÇÊŽeÛˆU^L\çÍÑÊÔÙÏß”3¹É½¥Î¡P-½Ë”bäœY\ZB¸ïÆÏÙÚØÔb1ŸÎ»¤Ä²^ °ÎÊjæ¿d]YPOÄá×ÞÖã°>4„з¦·Àk ¤Ç½¦Ñè~]YWICuÏßÖäy8:_ʵ§§Ëx-€ÍŸžÖë¹e^VHJgâÖÞÈHI5hȱ§˜Î…=ƒ»Úf¬ðå°]IYJ¯êÑçš>6\ØÀ¯¥‹Ë˜Nq²á¤ôÜî¬UP\ÚÙÙÖV3|à㼪¡ƒºS ZµÉ—„×éÞæÓƒ åÑàºl²ßÎÁ³ ‘‚mn|zF­¾­»åèëéðóÞÕÖÔÒÙÓ¾º°¡•„z[834¤ÃÿíäØÎǵ»ÔÐÓÑÎľ»®¢˜……l!™›¡ž¤Ÿ›šºÐÇÈÃÀ¿¼·´°©Ÿ‘j ¡—‡|lYK)9ÇÂÌÏÑÏǹ¦ŽsV;#ƒ9-zÙº³—|]?%ƒ†M9 ƒ…†€‡–“… ƒ€‡€‰ƒ 0+B€… 2EYfw`1;Œ¡<ƒ6#6Jbs“¥¯´¶µ»¿XC7¶¥KSf“¥³¾ÆÎÉÔãÛÍËÓçñÿ¾FW3±½]Qì×â€ÝÞáßôß•]GCI\wÄ„J^5’Èk7ÌÎíéîïòîü¯D,16732%AhU]>uÓz#%ÍÖóëîíçô™.=C@<:9@7ceZZHYÕŠ5½Ñîìëéø¶0GA:;;:;/;p_aWPCÍF¬×ž}¯ùÛWaI=@>>eqcdWX6¹²Vš×¹Ržÿž;IVP@OOPDJ}ikeZ[4œÆd„ØÊ•Ÿ÷xJLBE`mccUdukmfV\:|Õt rÎâ|™úiMPGH…kd`ZsqjXcYC]Û…2[Ë⬄ûvOV@Z•il^n€mwdCjVMCÔ™BCËБeâ‡NYFU¦io`{nvS6kYS3Á¯R/ÀÑ—dëRWS>—”cqŠ{|sD4c\U.¤Ã`´ÔÏkíÄ^XSJH”~‰Š{ƒg72Z_S1Òn ¨Ìê×ñ|WTQD=^„€P34D^P8_Ú}0€“Ó¤£Ýô¿`XPAD^•€†t}ÿ÷ÿþÿÿýúøþþþÿÿÿÿÿÿÿþûúøüî5`ÿïêóûþÿÿÿÿÿÿÿýûùùúýÿÿÿÿýÿ*HÿúÿþÿøèÅÀý÷ûþÿÿÿÿÿþðØ¼šzR "ÊÁ{X5$žÿ÷ÿúéбlK. ®­‚cA&it32~Õÿÿ×ÿúúûh(ô 2ÿwò “îŒó ÙÔºô tî¼Ôô ÈÚ½ßAï PîÉÅßi€€é ¬äÉÈÛî .éÍÒÉÖ³€áŠñÇÖÌÎ͂وÙÜÐÒÓÉß8 (85ч€eøÎÙÑÕÈàh4_du~„ІAŇ€„ ÂèÏÖÍÑÆÙŽr‘ƒƒ|wvoz`¿‡€„! &5HXju†‚“îÖÖÓÑÒÈÛ¢W~tyxz|z|q·€‡…( %5HXjx„“——–“r¸íÓÛÕÔÔÍÖ»_…€‚~yxxu~¯€ˆ… %5GXjy†—œœ›˜–‘ŽŠˆ€†‡…€çáÚÛØÖÕÒÒÎartoryxzsƒ0¥€ˆ…$4GXkzˆ“›¡¢£ žš—“Ž€‚ŽŒ”{©ôÙàÛÚØÖÖÏÛsœ¥¬vxzrƒH‡…@#3FXk{Š–Ÿ¥¨¨§¤¡š˜––—–—–——––••”“Ї„‚rÚêÝàÝÝÛÙÚÓà£Æêäàxtzs^—‡…"2FXk|Œ˜¡©«®¬«¨¦£¡Ÿžžž€ž'œ›™—“Œ‰ˆ†ˆˆ’Ÿž®ñâåãâááßàØå¶¯àÑÞ†m{tzp”†…!1EXk}𤬰²²°®«©¦¥¤‚¥3¤¤£¡Ÿ›˜–’‘Ž”˜ §²»ÅÎÖÛâÝæðåèææäãááÚãÆ§ä×çšh{uu|”…!1DWk~Žœ¦°³¶¶µ³°®¬«©Bªª«ª«ªª©©¨¥£Ÿ™™–•–™£ª³¼ÅÎÔÛÞááâàÞÝÙÛÄêìçèçææåãâÞàÔ ÛÖä°fyvr.„  0CWk~Žž¨³·€» ¹¶´±°®®­­®®¯¯°€¯®­«©¦¤ Ÿœž¢¦ª±¸ÁÆÐÕÜ߀ãáßÜÚÙ€ØÙÚÙÞÕ×õçë€èçæåâáÞà¡ÑÛàÄiuvqE0CWk ¬µ»€À¿¼º¸·‚´³´³´³³€²°¯¬ª§¥£€¢¦¨°·ÃÇÎÍÓÖÚÚÜÛÚÙÖÕÓÓÕÕÙÝßÝÜÛ€ÜÚÝÎèðèëééèèçæääÝç¨ÄàÚÖpovp~[Q—Ÿ¯¸¿ÃÆÅÄÂÀ½¼º»»ºº¹º¹ ¸·¶´³°®«©¨¦§§«¬´·ÁÄÎÑÙßâÝØÙßéêç忀â,ãåæèèããÝÕÓØÝÞÛÚÚÜÛÖôëìëëêêéèçåæÝê´µãÖáivpxm ¿ÓÃÆÂÁÁÀÀ¿¾¿Y½¼»¹·µ²¯­ª«ª®®¶¸ÁÅÍÑØÛÞßàßÞáÛÒÔàêèÓ°¢£…‰’”‚‘¤¹ÂÔéíáÕÒÛßÚßÍãõêîìëëêêéèæçàêÄ©äÕç“bvqsyŒ !°ÎÂÆÄ€ÅcÄÄÂÂÀ¿¾¼ºµ´±²¯²²¸ºÂÅÍÒ×ÛÞßßàÞÞÛÛÙØØÜÙÒÛíçÅ‘s\Sr‹™¢­±²°­¥™‹’jSjŽÄçîÛÒÙÝÍñïíîíìëëêêéèçãçÓ¢ß×ç©^tqo*Ž#¥ÔÂÇÃÄÄÂÀ¼º¶¶µ··º½ÂÈÍÒÖÛÝßßàÞÞÜÛÚ€Ù€ÚÛÛÞÞÔÜîÖ•lYuÂ×ßÞÜÜÙØ.ÚÜÞÕÐÚlQZ‹ÔíàÒàöëïîííìëëêêéçæåà¡ÕÛâÀaprmBŽ “ÕÂÆÄÃÀ»¼ÁÃÉÌÓÖÛÝ€àßÞÜÛÚ€ÙÚÚÛÛƒÜÚÛÝÕÖëÖ‹Vf¥ÑâÝÓËȀɂÊÉÈÈËÎÓÝâΜYJsÌÖìòìï€îííëëêéèèâê§ÈàÜÓikqmzXÖÃÅż¾ßÝââãâàßÝÝÜÛÚÛÛÜ…ÛÚÜÜÔæåˆU}½áÜÏÇÉÍÐÒуÐÑ€ÐÏÎÌÇÆÎÝáºu;Âüëñ‚îíììêêèéáä×àxdrmujnÔÅÄÆ¹¶ãßÝÛÚÚÛۃ܌ÛÙÞØÖì«[tÁâÕÈÉÏÓÑÐÏÎÏ€ÎÏÎÍ€ÎÐÑÑÍÇÇÑé‹Ùûëòðïîíìëêéêâî¬åÕç^rmpvŽ \ÐÆÄŽ¬ÝàÜ–ÛÙÞÕßäwR°àÕÈÍÒÒÏÎÎÏÏÎÎÏÎÏÎσÎÏ€Í ÎÒÍÔ­§ÿìóðñð€ï€îìëêëåëÑ£áÖè¥Zqmm|(Œ HÌÉÞ¬Ûà–Û ÙßÓçÂR~ÚÛÉÎÒЀÏ΄ÏÎÎωΠÊ׊Ðüíóðññð€ïîîíìëêçèß¡ØÚå½[nnk}?Š8ÂËÃÄ©ÒâÚÜ“ÛÚßÔç²L¦åÌÌÓÑÏÏÐÏЀÏÎÎÏÎςΠÏÍÎÎÍÐÉÙ«Œýïò‚ñð€ïîîíìêêåé¦ÌßßÑcinjyUŒ'¸ÎÂÄêÎãÚÜ’Û ÙßÓê§LÆàÈÓÒ‚ÏЀÏÐ΂ÏÎÏÎÎÏÎÎÏÎÎÍÏÎÍÑ|Éþíóð‚ñðïïîîíìêëäï°¾äÙßsbojsg «ÐÂÃÄ«ÄäÛÝ‘Û ÚÞÔç¡[ÕØÊԃЀÏЂÏ΀ÏÎÏÎσÎÐÊØ¡‹÷€ò„ñððïîîíëìåð¾±æÖçˆ\pkot  ›ÒÁÃÄ­ÀäÛÝÛ ÚÞÕè£WÙÒÍÔÏÑтРÏÐÏÏÐÏÎÎÏ΀ÏÎÏÎÎÏ€ÎÏÍÑÆ{Éüïó€òƒñðïïîîììæîΧãÖé Xokkz%‹ÓÂÃı¶âÛÝÚÛÛÚ€ÛÚ‡Û ÚÞÕæ­L×ÓÏÔÏÑÑ‚ÐÏ€ÐÏЀÏÎÏÎÏÎ΀ÏÍÐÊØ“–òô„ò€ñòñðïïîíìéëÝ¢ÛÙæ¹Ymli{<ŒxÓÂÂó²áÛÜÝÜÚÞÛÛÜÞÜ‚Û ÚÜ×ßÇIÊØÎÕÏ€ÑÐуÐÏÐÏЀπÎ̈́ΠÐËÕ¸Ñöòóóƒò€ñòð€ïíìëèé¥ÐÞàÎaimhwQŽfÐÃÁÁ·¬ÜÜÝÖÙÞ×ÜáÞÞáâãÞÚ„ÛÞV­àÌÖÑÒ€ÑÐÑÑÐÑ€ÐÏÐÏÏÎÏЀÑÐÑÐÐÏÎÍÎÐÍÕ‰©ìöòôóò€ñòðïïîìíæð®ÂãÚÞpcoirdRÌÄÁÀ¹¨ÛâàðêàóéàååäáãÞÚ€Û ÚÞÔæ_†ëÉÖÐÓÒÑÒ€ÑÐÑ‚ÐÏÏÑÑÐÍËÊÊÍÎÑÐÐÊØª‰×ðöò„ó€òñïîîííæò»´æ×ç„]ojmp‹&AÅÇÀ¿½¦Ôáè·î€¸÷ª5ÝáâàÚÛÛÚÝÕé­yðÈ×ÓÒÑÒÑÑ…ÐÑÌÊÐÕÙÜÛÚÛÚÕÐÊËÏÐ΂¸ã÷ò€óôô€óò€ñðîîíîçñË©äÖéœYpjix#‹)0¼É¿¾¾¦ÏãÝzý nÿ¨±ìÞãÚÛÛÚÞÕçc“ÿíÔÎÕÓÑ€ÒÑÐÐÑÐÒÍËØÞÖǹ­«®°»ËÖßÝÉ× ›Ùéùòôôóóôóò€ñï€îéíÛ¤ÞÙç´Ymkgy8‰*!±Ì¾¾¿¨ÅåÙ…ý;:ðÌòÛäÚÛÚÞÔê‘d—‰ÜÿæÍÐÕÒƒÑÐÐÑÑË×Ü¿œƒvhuqgsiq„ŸÀâÐÄÙ÷†ôóóƒòñð€îëéç¤ÔÞáÊ_ilgvNL¢Î½½À¨Âàì$\ÿ|èÔõÙåÚÛÛÚÛ×VËÞ­‚¡ìúÙËÒÔÑÑÒÑÒÐÑÐÍßÂ|ozx}–Œ—wujsŽi¹äàýñöô‚õôôóó‚òññðîííçï¬ÆâÛÛmdmhp`G ’н¾¿¬»Üò^[ ±ìÝäÛÚÞÓî‡oæÅÛÑ¡†¸öñÑÍÔÓÐÑÐÒÐÑÝœy~Ž¥»ÉËÑÓÍÌÈ´¡ƒƒ†Þôöô‚õô€ó€òñòñðïíîæò¸¸æ×æ€^oilnJ€Ð½½¿®³Ýï•:Kmt~ÍèàãâÝÚÝ×âY·äÐÐÏÛÈ•ÌùåÌÏÔÑÒÏÓÑ~{‰²ÑÛÚÖÕÑÏÐÏÎÒÑá‰xÄÿðöô…õôôó€ò€ñðïîïçñÈ«åÖé˜Yojhu +nϾ½¿³¬ßâàâõüÛHdâáââÝÜÖå¸aäÒÕÖÓÍÓÛ¼ŽÝôÚÊ€ÒÑ~ƒ¢×ßÙÖÖØØ×ØÖÔÒÎÌÍÒ¯’ôöôö†õ€ôóòñðïîîéîפàØè±Znkgw6‹<\Ì¿½¾¶¥ßÛòž,÷M dŽðÛæÝÞÓ탎íÍØÓÔÖÒÍר¯¯èìÑÎÕv‰…·çÜÚÝÝÜÛÙÙØ€× ÖÔÏÊÎÌöôõõööõõ€ö€õôôóóòò€ñïïîëëä¤ÖÜâÇ_klgtJ‹8HÇÁ¼½¹¤ÙÚ÷nþ+fÿB*íÛåßÛØà_ÃâÑ×ÔÔÓÔÕÐÎÚÒ£’Äçæƒ„мíÛáÞÜ€ÛÚÚÙØØ×ÖÕÓÔÇêøóöõ„öõôñòòñòñðïïîíçî©ÊáÛØkfmhp]‹"9¿Ä¼½¼¢ÒÝò…ÿHIÿ— ÕãáãÖå·cçÔ×ÕÕ€Ô!ÒÔÔÏÑÛÊ™¢„yˆ¹óÞäßÞÝÜÛÜÜÛÛÙÙØ××ÖÒØø€õöö÷÷‚öõöôò‚ñððïïíîæò´»ä×ã}`nikj Š 'µÇ»¼¼¤ÈäâÓT!TÿŠÐäàæÒï†yóÍÚ€ÕÔÔÓÒÓÕÒÐÑäŸe•öãæààßÝ€ÜÛÛÚÚ€ÙÖÙÒçúô÷öö÷öõôôõ€öõð‚ñòòñïïîîæñîåÕè”\oihrŒ¨Ê»¼½¥¾èÜí° ´à?êÝääÔìy£ïÏÙ€Õ€ÔÓÓÒÒ×ÌØž‚‹åòçäààÞ€ÝÜÜÛÚÛ€ÙØ×Öôöô€öõôööõ÷ñåîñ€òððîíçîÒ¦á×ç¬[ojft2Š ˜Ì»¼½©¸äáßíãÑàæÀÍäáâãÙß\ÇæÒÙÕÖ€Õ3ÔÔÓÒÓÓÔÏ€zµÿèèâààßÞÞÝÛÜÜÛÛÚÙØÙÖãûóöö÷÷öôõõööøñÿ¹ ûìó€ñòòðïîíêêà£ØÚãÃ_lkgsGŽ‰Í»¼½¬¯äßåÙáöòÃs¤ïÝäßÑYÛÝÖØÖÕÔÓÓÔÔÏÛ²tˆæþççâààßÞÞÝÝÛÜÛÛÚ€ÙÖñøôöö‚÷#öõöö÷ð§¸ôññòññòòðïîíìçê§ÍßÝÕjglhoYvÍ»¼¼¯«àâáî΀"vàáãàãÈrèØØ€×Ö€Õ ÔÔÓÕÏÚk¡ÿòêäâ€àßÞÞÝ€Ü ÚÛÚÙØÜùõõöö‚÷$öõ÷óýвÉåùðóòññòðïïííåï°¿äØâ{bnhkh Œeʽ¼»³£ßÜïia!xÿ׿âßåĆíÖØ€×ÖÖ€Õ ÔÓÔÐÖˆzÀÿïéäâàÞÞÝÝÜÛÜÛÚÛÕèùô÷ö†÷óû®ºÅÝûïó€ñòððîìíäð¾±åÕè‘]oigqŒRƾ»»¶£Øáæ®;a7JÿÞåâàåÈ™îÕØ××ÖÕÕÔÓÔÓÏr×ÿîéåâàáà€ßÞÝÜÜÛÜÚÛÑôøö÷÷öö÷ ö÷ôùç¤ÒÂ×üîó€ñòðïïíìæîͧâÖç¨\njfs0ˆ$AÀÀ»º¹ŸÎæßðì¢) pÆãâàæÄžðÔÙרØ××Ö€ÕÔÓÕÊ{uäÿðéäãááà€ß ÞÝÝÜÜÛÜ×ãûô€÷öƒ÷ øòþòÙÂÌûïó€ñòððîíëçéÜ£ÛÙã¾_ljfrEŠ0·Ã¹ºº¢ÉåáÜßðø®9&ãáàçÅ¡ñÕÚ‚× ÖÕÕÔÕÓÕÉp~éÿðéåãáààáàßÞÞÝÜÛÛÝ×ñøô‡÷ ööó¨ÄÑÈÂøñò€ñòððîíëéåç¥ÐÝÜÒhhkgnWŠ$"¬Æ¹¹»¡¾çßçàÝÚìöÔÌâãßèÅ¡ñÕÚØØ××ÖÖÕ ÓÕÉuzèÿòéæäââ€àß߀ÝÛÝÙÜøô€÷ö€÷ö÷÷øôüÒ¥ÔËоñôñò€ñðïïíêëãí­Ââ×ßxcmhjf ‹žÇ¸¹º¥¹åààëØÔÕ0 ¬êàáèÇ›òÖÛØØ€×€ÖÕÕÔÔÍ€qßÿóëæåââààáßßÞÝ€ÜØðøôøƒ÷ö÷÷øôù±¸ÕÊÒ¿è÷ïò€ñðïîíêëâﺴäÔåŒ^nhgo‹$ É·¸º¨­æÛî•)YÒåÞéÊò×ÚÙØ×ØØ×ÖÖ€Õ ÒÕ‚tÎÿöîæå€âàà€ßÞÝÝÚÞùõ€÷öƒ÷&øôúä¢ÏÏÍÓÀÞûïôðññðïîìêêãíÉ©âÔæ¤[nier. ~ɶ¸¹«¬áßÞQ“ÿ…õ×ëÌzðÛÙÙØØ×Ø×€ÖÕ×ÑØ™t±ÿúòçæãââ€àßßÞÜÝØêúô€÷öƒ÷ øõû¾·ÓÍÍÒÁÏýñõ€ñðïîìêéäé×£ÜÖã»]lidqCŒlÈ·¸¸¯¥Øë¸Æÿ.cÿ(BóÙæÝ‚âã×ÚØØ×ÖÖÕ×ÐÛ®n–÷ÿõéçåââááàß߀ÞÜö÷õ‡÷öøë±ÎÏÉÇøòõòññðïîìëèæäã£ÒÜÝÎeijemVŒ3[ĸ¶¸²£ÖçË @F  EëßáæŽÒìÔÝØÙØ×ר×ÖÕÕÔÖÇ}ˆÖÿ÷ïçæãâ€á ààÞßÚäûó÷÷€ø-÷ø÷ø÷øôûѳÒÌÏÎÎÍÉöôôóññðîîìêèèáêªÄàØÜtckgie ‰AHÀº·¶µÑáçX$Mg‚§ËíåãÜ÷ÒÞÙÙØØ×Ø××ÖÕ×ÐÜ‘|­ýý÷êçæãâááààÝáÕìùõø÷ø)÷øôø©²ÕËÏÎÍÐÅï÷ñòñððîíìêçèàìµ·ãÔä‡]mgen‰ 9¸½µ¶¶žËäâçæùÿýîŠGÜäÜúÔÞÚڀ؀×ÖÖ×ÒØ¾uÑÿøóçæåâáàÝÑ÷ô„÷ø(÷÷ÚËÑÍÏÏÌÑÄçùñóñðïïíìêèèàêëâÓæŸZmgdq-‰A(¯¿´µ¶ž¾çßâïÕžM\ãááæÈˆòÜÛÛÙÙØ×ר××ÕÕ×ÎÝ–šìÿùñçæåãááßáØäûô÷÷…ø)ùö÷»·ÒÈÒÍÎÍÑÇßúñóðñïïíìéççâæÒ£ÝÕã¶[kgcpA‹£Á³´¶ ºæàài(°ú€ã ßá€ÙëÖÜÚÚØØ‚×€ÕÒÑ|‰£ûüøñçääãááàÝ÷öö÷÷…ø)ùôîž­æÓÊÎÑÍÐÈÒûðóññïïíëêççãáÞ¢ÔÙÝÊbghclT‹"”ò´µ£®åßÞ@´°ìÕæãÝ裬úÓÞÚÚØÙØ×ÖÕÖÑØ¾t’§ûþóïìçäáâÝçùó€÷…ø*÷÷ÒžŠ”ÎáÐÉÏÑÊÍøñòññðîíëêèæäÞæ¦ÈÞ×ÙobidgdŒ †Ã±²´¦ªãàåó¯0WßèâäÝé²wûÙÜÛÚÚÙØ×ÖÕÕ×ÏÙ±i“žîÿùíèèææÜò÷ô€÷„øùöò´À× ¤ØßÌÊÑÉòô€ñïîíëêèååÜé°¹áÓâ‚\jddm‹:tı²³©¡ÝââØçî¶<|ñÛçÙã‡ÍñÔÝÚÙØØ×ØØ×ÖÖÕÔ×Íܲs•ŒÃûÿüîèåãùó€ö÷÷ƒø+÷÷ݬÎÍÚÈ”³àØÍÀê÷ïòðïîìêêçååÜè¾­âÑå™Wjebp,‹%cÁ²±±«žÙãáììÙðçÉ€§îÝæÛâ°›û×ÝÚÚÙÙØ×Ø×€ÖÕÔÖÎÙÁvž–•Æèùúìíùóö÷.øøùööÁµÕÌËÐÙ»ˆ‹ÀèÄÕúíóïîíëêêèååÝäÍ£ÞÓã°WhdaoA‹=Q¾²°°®™ÒáéÁ‘íÜÞãìæßãââ×á‹×îÖÝÚÚØØ×ר×ÖÖÕÕÓ×ÍÝÂ[}{‡˜§Êüóõõöö‚÷€ø+÷é­ÈÑÎÐÌÊÕÖ¬~™ÅÕöîòïîíëêéçåãßßÙ Õ×ÞÅ\eebkT‰?A¸´®¯¯˜ÏÝò‘ÓÝåéëðåáââ×â² ûØÝÚÚÙØØ×Ø××ÖÕÕÔÕÒٜǠ{uyÈÿï÷ôöö÷0øøùöøÏ®ÔÍÏÎÏÐËËÙÎyºøíòîîíëêèæäâàÛâ£ÉÜØÖi_fcgdˆ*1¯·®®°˜Ãàî¤ãôѺ„ÞââáÝ×à|ÓïÕÞÚÙÙØ×Ø×Ö×€ÕÒׂÜÞÙÒ½ª£õöóõõöö÷ øøùöñµ¿ÔÍЀÎ#ÏÐÊÌݽ°÷íñïíìëêçæäàáØå«»àÒà{Ygccmˆ"¦º­­°™»áë³I#€%"ÓåáâÞÔê“gÿÖÞÙÙØØ×ØØÖ×ÖÕ×ÑÚ‡µéÈÑÑÛ׿ùò€õöö÷øøö÷Ý«ÐÎ%ÏÏÎÍÏÏÇØÈéòíïíìëêçåãàà×丮áÐä’Tgc`q,Š™»«­¯œ¯ãäÏ\޲Úíæ€â%ÜÝÕèV¥ÿÑßØÙØØ×Ø×ÖÕ×Ñܰ‰éÓÔÕÒÑËíùóöõõöö‚÷1øõõÁµÕÌÐÎÏÏÎÏÍÎÎÑË{åóìïíëêéæäâàßØàÆ¤ÞÑâ«Sfc`oAˆ$ ‹½«¬®ž¨äÝâÿîòÞÕÛââãÝÜØáÀFåéÖÝØÙØ€×€Ö ÒÔ~ÈæÎÔÑÓÒÜüó€õ€öƒ÷õè­ÉÑÍÏÏ‚Î!ÐË׊sÏøêðìëêèæäáßÞÙÚÓŸ×ÔÝÁWcdalUŒ{½ª«¬¡ŸßÞåtëÈÚéõî€â!ÞÚÝ×á¼~ößØÛØØ×Ø×ÖÙÐÝŸ•ñÑÕÒÒÔÎêùòöõ€ö‚÷øõ÷Í®ÔÌЀÎ&ÏÏÍÒÇÞ„ÍÆ÷êðìêéçæäáÞÜÚÔÛ ËÙ×Òc]dafdŠ"j½ªª«¤™Üàæ¢ÆñúñÈH`ïÛåÞÚÚÝÖâªý×ÛÙ€×ØØÔÕÈxÛâÐÔÑÓÒÔøõôõõööƒ÷øõð´ÀÓÌÐÎÍÑÇݨ|ÏÖÉ€îìéèçåâàÞÛÛÑߦ¾ÝÒÞuVdbbnŠ7Zº«©©§•ÑåßõõÈ~/ ›éßäßÛÛÚÞÖᜢÿÕÛÚ×רÙÐܦôÐÕÓÒÔÏãüòõõ€öƒ÷1ö÷ÛªÐÎÏÏÎÏÎÎÒÆÞ®oËÖÚµíîëëéèæãáßÝÙÚÐß±°ßÏãŒQda`q+ˆH¶­¨§¨‘Íâç¼5 !âï€âá€ÛÚÝÕà—ªþÕÙÚÖÙÓÙ¹}ëÞÓÕÒÓÓÑô÷óõõö÷2øõõ¿µÖÍÐÏÏÍÏÑÇÞ®lÁרáÁäòéëéçåâàÞÜØØÐÛ¾¥ÞÏâ¤Nc`_o@ˆ9¯®§¦¨‘ÂäåÈ,I•âÜßãâá‚ÛÝÖà’¤ýØÕÛ×ÑØ¼ôÏÖÓÓÔÐÛü€ôõõ€ö‚÷1õç«ÉÑÎÏÏÎÑÍËߨrÂØÜØä¯ÕöæìèåäáßÝÚ×ÖÑÔËž×ÒÝ»Q_`_jTˆ)¦°¥¥©‘¸èÝëîš"{ßåââáÜ‚ÛÝÖß—–øáÔÔÜ¥…øÙÕÔÔÓÔÏîúóõôõõö6÷÷øõöÌ­ÕÍÐÎÑÑÉÑÜŽ~ÍÖÚÝ×â¹Î÷æëæåâàÞÜÚ×ÔÒÎÔÍÖÖÍ[Y`_dd‰œ³¤¦¨”®åàßÛððª$®îÝå܃Ûܨ܆æëÍÐ{ÓïÑ×ÔÔÕÒØúõ€ôõõ‚ö5÷øôﱿÔÍÑÑÌÊÛÉ€„ÏÖÛÜÝÙâĽöåéåäâßÝÛØÕÒÑÉÙ¢ÀÜÒÝoR`_`m‰µ£¤¦•£åßåäÝØö÷ÞŽÄéßäÝÚƒÛÜØÜ©‚¿ñ“•ûØÚÕÔÓÖÏæûòõôô€õ‚ö4õöÙ§ÑÐÑÌÉ×ܦs§Û×ÛÛÙÙ×ÝѸóæçäâàÞÜÚ×ÔÑÐÇØ«²ÜÊÛKa_]p+‹ ¶¢£¤˜œßáââãï¤V^ÂòßãâÞÚ„ÛÝ×âÁŠ|rñðÏÒÕ×ÖÕÓööóô€õöóô½¸ÖÉÌ×Þ¼~~¿ÙÔÛÜÝ߀à Ó¥êèäãàßÜÚØÕÓÏÏÆÔ¸¥àÔí§H`]\o@ˆp¶¡¢¢š’ÜáäÝív$}îÜåÞÚ…ÛÜ×ÝØ§t¬âêãÔÍÒÏàûòõ‚ôƒõ4ôä¤ÁÐ×ܼ‰u¥ÝßÜàÝØÕÑËÁ˸´ìèââàÝÜÙÖÔÑÏÎÈÎĜ˲¥}N\^^jTŠaµ¡  œÓæÝì´ˆÿÿ|ÔãááÚ†ÛÝÚØçÄ’ÁáèßÒïùòõƒô€õ7öóöʵêÕµ‡{šÑÚÎËÐÊÇÈËÖÙáèïõîäâàÞÝÚØÖÒÐÍÊÈÂÓY9=5BVY\^cd‰P²£ žž‰ËèÙñ@ÿëüæšñÛäÚˆÛ ÜÕÝãÊ¥v€¿Úûó‡ô8õõò𫣈sn‹ÀÐÈÐ×Ùåêðõ÷÷öóïêääâàÞÜÚ×ÔÑÎÌÊÇȼÙj6URYY]`dcn‡?­¥žž‰ÂæÞâˆÿöÿÝ”òÛåÚ‰Û ÝÚÖÜäÚ¹•jÙþðöó‡ô8óñ«mhÁäëëìöùùú÷õòîëêèçææåâßÝÛÙ×ÕÓÐÎÌÉÇȻ֋=[PWXXW\Wu.…1§§›œŸ†¹âì QO(¾êÞäÜŠÛ ÜÝÚÖÙàãÑööóŠô õøýÿýøõ÷õñïïíî€í&ìëêèæäáßÞÜÚØÖÔÒÏÍËÈÆÆ¼Ï¥6PNX_jvƒˆ˜1‡"©™›‡¯áì /;c~¹ã€áÜÛÝÛÚÑãûòõ‹ô2óðéîññïððñððîîìëéèæåäâáßÝÛÙ×ÔÒÐÍËÉÇÅŽƻX€…‹‰„zk]=‹’¬™šœ‰ŸæÞéßòøøóîçÜÜÛ ÚÚÙÞÔíøñôóôôóóôƒóôöôòòññïï€í"ìëééçåäâáßÜÛÙØÕÓÑÎÍÉÉÆÄÂÀ½Ê]PE0! Ž „®˜™š‹—àÜÛÛÔÐÐÑÓÖŠÛ€ÚÛÛÜÜ€ÝÙßúòôˆóòò€ñƒð*ïïîííìêééçåäâáßÞÛÚ×ÕÓÒÏÎËÉÈÅÃÀ´ÖKŽ v¯—˜˜ŽŒÛÙÜÛÞ€ßÞÝ„ÛÚÚ€ÛÜ€Ý ÜÚÙØ×ÖÙÔëøðôóƒò†ñ)ððïïîííìëéèçååãáàÞÜÛØÖÔÓÐÍÌÉÉÆÄÿôÕy ‘f¯˜˜–‡ÕÜÚÛÚÚÙÙ‚Ú€ÛÝÙÛÝÛÚØ€× ÙÛßâååâÔöòðññ„ò†ñð€ï$îîííìëééçååãáàÞÜÚÙ×ÕÓÐÏÍËÉÇÆÅÃÀö͚”W®˜–”’€ÌߨÛÚÛÜÝÜÜ€ÝÜÛÙØ×רÚÝáäåäàØÌ¾« |Éÿêóðññò‚ñððñ€ð€ïî€í ëëéèçååãáàÞÝÛÙØÖÔÑÐÎÍÌÈÇÆÃÁ¿À·Â¹ •/Fªš”’“ÂâÛÞÜÚØØÚØ×Ö×ÙÛßâååâÜÒÅ´£’„xqnpqwïóïñðð‰ñ€ð,ïïîîííìëêéèæåäãááßÝÜÚØ×ÕÓÐÎÍÌÉÇÇÄÂÁ¿½»¸Ì#/8¥œ’‘”|¶áÒÙØÜáâÝáäååàØË¼«šŠ|snmpv}„Œ˜„¶ÿêòïð†ñ€ðïîî€í'ìëêéçæåäãâàÞÝÜÚÙ×ÕÓÑÏÍÌÊÈÇÅÃÀ¿½¸¼±ÕG/)Ÿ‘“|ªëäæßÖþÒò¡unklqw†Œ’“’‘‘}àõëðî‰ð€ïî€íììëêééèçåäãáàÞÝÛÚØ×ÕÓÒÐÍÌÊÇÆÅÀ À¼À¯Ñh‘”¢Ž’{¡Â’‡rf_Zmgfiow†Œ€ŽŒ‹ŠŠ‡Œ~žýéîíîî‡ï€îí+ìëêééèçåääâáàßÝÛÚØÖÕÓÑÏÍÌÍËÊÊÈÄÀ½·³°¶¬Ï–‘ˆ¤ŒŒ†mXdfqw~}ƒ‡‹€Œ‹‹ŠŠ‰ˆ‡‡†‡‰“•¢‹Ðùçïìíˆî€í€ìëêêéèçæääãáàßÞÜÚÙØÖ€ÕÓÑÐÍÈÃÀ½»½ÁÆÌÒÔÔÇÅq“) {¦ŒŠ‹ƒ€†„†ƒƒ„‡‡†…†…„ƒ‚ƒ„‡Œ’˜  œ‘‰lsöê€ìˆíìëëê€é èçåäãâàßÞÝ€ÜÛÚØÔÐÌÇÆÅÆËÑÖÚÛ×̺£‡hI-—*l¨‹ŒŠŠ‹‰……„…„‚~€‚†Œ’˜œŸ—~lXC0ÿàîêë‰ì ëëêééèèçæå€ã€âáàÝÚÖÒÏÎÎÑÕÚßâàÙÊ·_@%‚–]¨Ž‹ˆ…‚~€…‹’˜œš’†vcN:' €ãïæëéê€ëƒìëêêéè…çæäâßÛØÕÔÖÙÞãæçãÙɲ–wW9 ƒ—N¦‹€†ˆ‹•™œ›–Œ}lXD0‚  fÿßìçèé„êéé€èé€êéçåâßÜÚÚÜàåéìëåÙÆ­pP2ƒ›?¤¢› Ÿ–‹zgQ;' ‚‚Æ÷àêç€è€çèééê€ëéçäáßÞßâæêïðíåÖÁ§ˆgG+ƒ…˜ ,‚}jV@+ ‚…&?ûàçåæççéêëëêéçäâááâåêïòòîãÒ¼Ÿ^?$ƒ… '! €Œ  þÝêæèççåâááâäèíòôóìß̳–uU6ƒ…€§“!íåààÝÞàäêïóõòéÚÄ©ŠjJ-ƒ…€®˜uýÚííóóïäÒºž~^?$‚…Ñ çòÙʯ’qR4ƒ…ÙpK(ƒ…€å…æ…ó€ô€ÿÿÿÅÿÿ×ÿúúûZ$ô -ÜUò‚³Wõ¸}ô f¼x‘ô ­œ{™+ï GÄ„…—G€€é —­ƒˆ•cî )ÇŽ‡’|€á|Á†•‹Ž‚Ùˆ¾ ‘“’ ' );7ч€\Ïœ““‡–J=`l{†”˜DŇ€„ «¨ƒŠ€v}_‚˜†€z„g¿‡€„! (8L]o|‹“Áƒ„‚yƒcc†ƒ‚„†„‡x ¶‡€…( '7K]p~Œ– ¡ –™|©¯ƒŒ…†…~ƒpb‰ˆƒ‚ƒ€†®‡€…2 '7K]pŽ˜ ¥¦¦£ œ˜”’‘Ž…Å—Œ‰‡†ƒ„}W€|z|ƒ‚…~Œ2¤ˆ€… %6K]pœ¤ª«¬©§£Ÿœš˜—€˜™š–…¡¿‹•Ž‹ˆ†ƒˆZ¢®³‚„}Lœ‚‡…%6J]p‚‘ž§®°±°®ª¨¤¢ ŸžŸŸ€  Ÿžš—”’ŒzÁ¨“˜€”’“Ž™zÏïìæ…~Šc–‚‡…$5J]qƒ“ ª²µ·¶´±®«©§¥€¦ƒ§*¦¥£¡Ÿ™–’‘‘—›§¨¬Ê ¥££¢¢ ¡™¦…´çØåŽx†~„w’†…#4I\q„”¢¬´¸»º¹¶´±®­¬¬­€®3¬­¬«ª¨¥¢Ÿ›š—˜˜¡¨¯ºÃÍÖÞãêåØÀª¯¬«ª¨¥¤§¤ìÝî¡r…€„”…"3H\p„•¤¯¸¼¿¿½»¹¶´³²²±±²³²°®¬¨¦¢¡€ž/¡¥«²»ÅÌÖÜãçêêëéçæâæÇζ°±¯®«ª¨¦ ¥™“æÛë¶oƒ|‹1„!3G\q…–¦±»¿ÄÃÃÁ¾»¸·¶µµ¶··€¸€·¶µ³±¯­ª¨¥¥¦©­²¹ÀÊÏÙÞåèììëêèåãâ€á€âçßÏͰ¶²±°¯¬ª¨¤££ŠÝàèËr€{‹J 2F\q…—§´¾ÄÇÈÈÆÃÀ¾½Š»Gº¸¸´²®¬ª©ªª®¯¸¾ÊÐ×ÖÝßãâãâáàÞÞÝÝßàãæçåääååæãçÔÓ¿³¶´³²°¯¬©©¢«†ÍåãÜzz€{ˆaVž¦·ÀÇËÍÌËÈÆÄ‚ÁÀÁÀÁ€ÀO¿¾»»¸·´²°®¯®²³º¾ÈÌÕÙáçëèãáåïñïïòðïððñððïééäÞÝâæçäãääåÓÓ·¹·¶µ´²°®««¢®‰¼êÞèˆs{‚tŽ ÇØÉÌÈÈ€ÆÅ…ÆYÃÃÂÀ¾¼¹¶´±²±´µ½ÀÈÌÕÚàäçééèçêæÝÛåðóãÀ­«{w~€~x™°ÉÐßðóèÞÝäèãèÕÔÊ·¼¸¸·¶´±¯­­¤®©ìÛî›l{}‚Œr%¸ÒÈÌËÌÌËÊÉÉÈÇÆÄÂÁ¼º··¶¸¸¾ÁÈÍÔÚßãæèèéççåäâááåãÛáóôÕk<$%#(**-/3;@]KJqœÐïôäÝâçÎÕ¾¼¼ºº¸·µ´±®­§­›™éÜï²i|zˆ.Œ­ÙÉÌ€ÊÈÆÂÁ½½»¼½ÁÃÈÎÓÙÞãæèèéççåäã€â€ãFääçèßâõå¢a$!5CHIIKJIIHHFFHBEJ<2=_™ÞôçÜÖѺÀ¼¼»º¸·µ³°®ªª¥áàëÈk{|x‰FŒ œÙÈÌÊÉÅÁÂÇÉÏÓÚÝâäçèéèçæäãâããäƒåäãçàÝòå”9%=KLGA??>‚=->=>=@?@GNK<+B~ÚÚׯ¾À¿¾½»»¸¶´²¯­§®ˆÓååÛrv}x…^‰ÚÉËÌÂÃåãèèéèçæääâããää‚å„äãåæÞëò“41LLD>>@BCBCC‚BAABAA@<:=GOE)%¾Û½Ã€À¾½»º¸µ³°¯§³ŠÂëßèo}x€qvÚÊËÍ¿»éääãââããää‚å‹äãæãÞôºJ4NI??CDDCBABB…A@A@ABBA<8AL1ÍϾĀÁÀ¾½¼º·´±±¨³‘¯îÝï–i}x{Ž c×ÌËÌñäåää€å’äâçàæð+MJ@BEED„B…A-@A@AA@?C?G"wï¼ÇÂÃÂÂÁÀ¾¼º¹¶³²«²œžìÝð­e|xw†+Š OÒÎÊËÅ±áæ–ä âèÞîÑDGNBCGED€CBCC‚B‚A@@AA@@A@@>D%½ÚÀÈ€Äÿ½»º¸µ³®¯¦‘äàíÅfyyv‡CŠ>ÊÐÊÊÈ®Ùèãå“äâèÝîÂ)&RECGGEEDCBC€BABAB„A€@A=?@CCB@C4dèÑÏÐÎÍ€ÌËÊÈÇÇÅÃÁ¿½º··­¹‘ºîÞïŽh{uxz‹.GÌÌÆÆÄ¬Üèïš¿õŠÀý²=ãèéçãääãæßð¸DoCRNIKKJIIHH€G?FGFEGFAAFJKMKKMMID=<@C<%-¦ëÉÓÏÐÏÎÍÌÌËÊÈÇÆÄÂÀ¾»¸·®¸š©îÝñ¥d{vt&‹-5ÄÎÆÅÅ«Öëå|ÿqÿ¬¶óäêãääãçÝòdjÒ„PGPLIKKII€HGGFFHBENMB:414769AIRP@B0,RÚÚÍÑ€Ð!ÏÏÎÌËËÉÈÆÅÃÁ¾¼¹·±µ¥šéÞï½dywsƒ=‰)%¹ÑÅÅÆ®Ëí߇ÿ:;öÐ’úáìãäãçÝó˜*H¦°oEJO€J€IH€G=FCMH2+7GJef\cME>8CSA/ˆðËÓÐÑÑÐÐÏÎÎÍËÊÈÇÆÃÁ¿½º·³²¯àãêÓkuxs€T)ªÓÄÅÇ®Èèò$^ÿ~ñÞýàíãääåâå9=M-&e¯šXCKM€IHHGHFFO4.Wl}z‡ƒŽy{fT<\ZÂæËÔÐÑÐÏÎÎÌÊÉÇÇÄÂÀ¾»·µ¯¶Ñéäãwpyt|hJ ›ÕÄÅDZÀäù^g"±õäëäãçÝõ‘ _AKE+5}ªJDMKHIHIGHJ$M‡„ƒ£±´º½·³°ž•ƒŠ†@“èÒÓ€Ò€ÑÐÏÎÎÍËÊÈÇÆÂÀ¾»··®¹¿íßíŠjzuwvŽH‰ÖÄÅÇ´¹åö— 1Ebq}ÊïçêéåãçÞïJDaKLEK?*GŒžhCGMIJGH@!p’€›»ÈÈÅÄÀ¾¿½½¾º«‰n¬íËÖÒ€ÑÐÏÏÍÌËÉÇÆÄÁ¿½¹¸¯¹—®ïÝò¡e{vt"IvÕÄÅÆº±æéååüÿäQpêèêéååáëÇ.bTQROHHJ:/]”‰U@JIIA.‡ŒÄÎÈÄÃÅÄÅÅÂÁ¾º¸º¾˜‹ë×ÓÔÓÒ€ÑÏÏÎÍÌÉÇÇÄÂÀ½º¸°¶¡ëßð¹ezvs:‹dÒÆÄŽ«çâù¨3ýSZ•øâíäçÜöˆ2kMT€Q%NHJH6;m’rGFD"~ ÕÊÇÊÊÉÈÇÇÆÅÄÄÂÁº·º»âÓÕ€Ô€ÓÒ€ÑÏÎÌËÊÈÆÆÂÁ¾¼¸²³¬’ãâëÏjvwsQ‹:OÎÈÄÄÀªàáþqÿ-dÿA+ôâìææßíLQcOURQPPQLGJF5H}vO„†¦ÝÈÏÌÊÉÉ€È ÇÆÅÄÂÂÀÀ²ßÝÏÖÓ‚Ô ÓÒÑÑÐÐÍÈÉÈÆÆÃÀ¾¼·µ¯³Öèåávqxt{d‹9?ÆÊÃçÚäú†ÿIIÿ™ ÛêèêàëÇ5jVTSSRQPOPPKIKB9R#hŠ£äÌÓÍÌËÊ€ÉÈ€ÇÆÅÃÿÅèÒÓ‚Õ€ÔÒ€ÑÎÊ‚ÆÄ¿¾½¸¶­·ŽÅíàìˆlztwt Š$,½ÍÃÂêÏëêÕ_'Pÿ“ÔìæíÛö‘3tOXTSSQ€PNPNKFQ$R¦åÑÔÎÍÍËËÊÉÈÉÈ€Ç ÆÄŽ×âÏÔÑÓÕÕ€ÔÓ€ÒÑȃÆÅÁ¿¾¹·­¸”²ïÝñžgzut} Š9 ±ÏÂÂÄ«Äðâö­±é8îåêìÜ÷zIqOZTTSRQQPONNOIK&v…ÐâÔÒÎÎÍËË€É ÈÇÇÈÇÆÆÄÃäÔÐÒÓ‚ÔÓÒÒÑÓ˽ÆÅ€ÆÇÅÂÀ¾º·®µž¡íÞñ¶fzvr€6Š9¢ÑÁÂį¿ìèæõåÐæìºÑîçéêáëO_iRYUUTSRQPPOOLN<<„¢ó×ÕÏÎÎÍÌÌËÊ€É ÈÇÇÅÈÁÒäÌÒÓ€Õ€Ô ÒÒÔÎÛ“‹ÝÁÈÅ€ÆÂÀ¾º·±²§”æâíÌjwwr~MŽ" ‘ÒÁÂIJµìæìÞéÿûÏ‚¦÷ãìåß>naVYWVTSRQPKQ+U‰ÒðÕÕÐÏÍÎÍÌËË€É ÈÈÇÆÈÁãÙÍÑÒ‚Õ#ÓÒÒÓÐÑddäÄÈÇÆÆÅÂÁ¾»·³®¯ÚççÞusxsza2~ÓÁÂö±èéè÷ØŠ*läéêèéÖKw\YYWWVSSRRPOPLK-f™öãØÓÑÏ€Í ÌÌËÊÉÉÈÇÈÈÄËè€ÑÒÔÕ ÓÒÓÐÕ³L^ÚÍÆÉ€ÆÃÁ¿»·µ¬´ŒÊìáê…nytvq ŒmÑ€Â,º©çãöqYxÿàìéçëÑ[|Z[YXXVUTRRQPPNE0~¶ÿÜÙÒÑÎ΀ÍÌËËÊÉÈÈÆÊÂÚáÏÕÓÕÔÔÕ ÔÓÑÓŽHJÌÕÄÉ€ÆÃÁ¿»·¶«¶‘·ïÞñ›izus{Š6YÎĽ©ßèî­3i=KÿâíéèêÕk{Y\ZYXWVTSRQQOP<DC>VÖÐÆÈÅÆÃ¿»¸´²¨³¼îÞð—iztry‹9 ˜Î¾¿Â°´ïâõ "$QÙìæïÔv\`]\[ZXXWUTSROA2xÆÿåÝÕÓÑÑÐÏÎÍÍÌ€ËÈÍêÕÖÕÕÓÔ‚Õ(ÖÔÔÂsB@A@IÉ×ÇÊÅÆÄ¿»¸³²¨²–ªîÝñ­fztp}2‹0‡Ï¾¿Á³²éæå H‹|ÿ‰üÞòÖg–_`^\\[YXXWUSSPH1s«ÿìßÖÔрЀΠÍÌÊÌÅÝäÒØÕÕÓƒÕ(×Ò×›KB@@DC±ßÇÍÅÆÆÄ¿»·´±©®ŸšêßîÄhxup}HŠBuϾ¿À·¬àò¾Åÿ/eÿ,Dúáìæx”g]`]][ZYXVVUTOP,Y•òúâÙÕÓÑÐÏÏÎÎÍÌÌËËéÙÕØÖÖƒÕ'ÖÖÑÍj:D@?E4åÅÏÇÆÆÅÀ»·´±«ª¨àãè×ptvqy]Œ@cÌÀ¿¿¹©ÞïÐGO Bñæèî‘uZa]]\[YYXVTTQQ7DŽÍÿçÝÖÔÑÑÏÐÎÍÍÌÍÇÖéÒØØ€×€Ö*×ÕÖÓÕ´ZAA@?E7|çÉÎÉÆÅ¿»·´°­¦­‹Ñèâæ~owrtn ‰AOÇÁ¾½¼¤ÙéíSC`z ÆïìêãöŽ…†Xd^^]\ZYYWVTTNJ'{§üõåÙÖÔÑÐÐÏÍÎËÏÃààÖÛ€ÚÙØ€×)Ö×ÒÑŽM@AA?D9aáÍÊɯľ»·´°®¤°ŒÀìÞî’ixrqx‰B@Àü½½¤ÒìéëéüÿýúšPâëäõ®|”Xe^^][[ZXXVUTPP2H”ÇÿéâÖÔÒÑÏÏÎÍÍÊÄéÖÚÙÙÚ.רÙÙØÕºe>C@B@A>NÔÔÈÉÅÄÁ¾»·´°®¤®‘®íÜð¨exro|1‡A-·Å»»¾¥Æïåê÷ÞªYSéèèìÑ|žaa`_^\[ZYXWUTUMM%z”æþæàÕÔÒÑÏÏÍÐÅÛåÕÚÙ€ÚÛ‚Ú*Ø×ŸU@?BA@@C<½ÝÄÊÅÄÀ½º·³°®¤«šêÞî¿fwsn{G‡D!¬Çº»¾§Àîççs/­ÿêéêæêœu\c_^]\[ZYWWUSRM>1‘•úöäáØÓÒÑÏÏÍÍìÛÙÛÛÚÚÛÚ*ÙÚÖÎxEVF>@B?D:©âÃÊÅÃÀ½º¶³°­¦¦¢âáèÔlssox\‹>ɹ»½ªµíæå<·¶óÛíêäð«ˆXf__]][ZYXWUSTON2Dœ™úúáÝÛÖÓÏÑÊÜèÖÛÚ€Û‚Ú+ÙÙÖ¸e"4ORC>?F9‹æÃÊÅÂÀ½º·³°¬¨¢¨ŠÕæããzntpsl Œ< ʹ»½®°ëçì÷¬+^ëñéëäñ»i©_da_^]\ZYXXVTSTLM,@œ‘èÿíÛÖÖÔÓÍéߨÛÚÛ€Ú,ÙÙØÐ™R>,":RP>A8jãÆÈÄ¿¼º¶³¯«©Ÿ«ˆÄêÞìhvpow‹<}ʸºº±¨åéèàïò±6øâîáì‹›~Zd__]\[ZYXVUTSTIM-EŸ„µøþðßÙÒØëØÛÚƒÛ0ÚÚÙÙ×Âv>BE<%%ASL;QÖÍÅÅÁ¿¼¸µ²¯ª©ž©Œ²ìÜï¤cvqm{0‰lÉ€¹5´¥áêèòóáùêÆy¦õãíã빇[d__^\[ZZXVVTSRRIL71¢œ‹µÕåèÙåã×ÛÙƒÛ0ÚÙÙØÔªW?C?BD5"*GUEÀÒÁÆÀ¾»·µ²®ª©ž¦“¡êÜíºbuqm{F‰=Yʏ¸· ÚèïÉ™ôãçíõîæêèéàëœx\d__]\ZZYWVUSSQSIP4!uz…Ž—½ðØÛÙÚÚÛÚÛÚÙ׈D€B$@?CC05E­Ö¾Æ¿½º·µ±­ª§ ¡›’äßèÏhqqmw\‰?GÀ¼¸·¸Ÿ×åù•Øãêîñõìèééà뻋\e``^][ZYXWVSSQQPJ+0>=Udr~ÂîÓÜÙÚÚÛ€ÚØÕ¶e?C@€B#@@E>,™Û½Å¿½º·´°­ª¥¡œ¡ˆ×äâßtkrorlˆ:6¸¾¶¶¸ŸÊçõ©èýßŘåééèæàê}ž}[d_^]\[ZXWWTSRQP:$eUIB?;^ðÛ‚ÚÛ€ÚØÐ˜N@€B%AABA?>I3|ݼľ¼¹¶²¯¬©¤¢˜¤…ÈèÝê‡esonwˆC'¯Àµµ¹¡Ãéò¸R,ØìçéçÝò›Vµ[e__^\[ZYXWUTTNKQiELGS<¡õÒÝÙÚÛÛÚÛÚÛ€Ú×Ât@CABB€A$@B?A;^׿À¾¼¹µ²°¬©£¢–£†¶ëÚî`tom{/ˆ¢Â³µ·¤¶ëëÔS‡²Õíí€é1åæÞñY‚˜Uf^^][ZYYWUUPP0-rQNNLIQâäØÛÙÚÛÚÛÚÚÛÚÚØÔ¨W?CƒA$@B?D9<Ðļ¿»¸µ²®«§£ –Ÿ‹¤êÚíµ`sol{Fˆ”󴶦®ìäéÿöüèÞá€é"ååáêÉA¬u\b]^[[YYXUTOE`hIPJR@‹øÕÞÚÚÛ‚ÚØÊ†EBABA B?1u²Ð¸Á»·´±®ª¦¢Ÿ—š’“åÝèÊdopmw\Œ7„IJ´´ª¦çåìvóÎàíü÷èééæãæáéÅqªf^`]][YYXXQO&8zPPNLPFÊíÕÞÚ€ÛƒÚÙ×¶e?DA€B€A#C=I‚ײѹÀº¶³°­©¥¡˜•˜ˆÛáâÜnipmqlŠ6rIJ³³­ äæîœÃúý÷ÕSföãìæäãæßë²t¤\a^[\ZYYUO?nfLQLRDsõÙ܂ۂÚÙØÐ—LAC€B€A$CEDpÛÜäåà쿷ͱ·°¯ª§£Ÿ›—”ŽŽŒ‡ÝÞâ×gflkpl‡!¥º­­°œ´íçæãøò£³õäë„äæàæ–_qLDp}RVRPTE~÷×ÝÚ‚ÛÚÚ€Ù3ØÏ•NBDCD@AK6,ƒÛÜååæãëέϱµ¯­¨¥¡ž™–’Š|ÐäÞèz^mkkv‰˜½«­¯ž«íæìëãáûøÜ‡Çñåëåƒäãåáåµh]]5Ž_XSROUGÄïÓÞ€ÚÛÚÚÙ6Ø×¾sDEC?@JD&C³åßæãââàã۫γ³®ª§¤ ›˜•‡y¾åÖæŠXmkiz.‡ нª¬­¡£èèéêéö®cjÎúæêéæ„äãæàéÎ{) ¤†RRQSULhî܄ڂÙ6×Ô¤[CABLI/)sÏÞÜäãåçêëëâ¡È¶¯­©¦¢Ÿš—“Ž…y«ëßø²UljhyE‰y¾ª««¤›äèìäô€…õãìæ†äåáääµn{pidWLTB¥õÒÜØÙÚ€Ù6Ø×ׯ~CEKE-%V°èåçëèãàÚÒÅʲ¡Ï·¬«§¤¡œ™•‘Ž…Œ}–غ¯ˆ[ijjuZŠi½ªª©¦—Ûíäó¼€ÿÿvÛêèéã…äãåäßíÎ’`@L^d\[áâÕÚØ€ÙÚ€Ù8××ÖÕ³kOB--Z¤ââ×ÔÖÍÅ¿ÅÃÆÊÍÒɯ¬©¦£ ›˜”‹‡}GIFBOcfhjol‰W»«©§¨‘ÓðßùEþìûåøâëãˆäæàæîÙ¯dCA=öÒÚרØÙØ€×6ÖΊ:4X”ËÐÃËÍÊÓÔÖØ×ÕÐËü³¯®ª§£žš•І}|sHK_bgfilpnw‡F¶­§§©‘Êîåé„ÿõÿä”ûáìã‰ä æãÞâìèÆ›RÇëÑÚ׃Ø×8ÕÒ”QaÃàÛÖØßÞÛÚÓÐÊÄÀ½¹·´²°¬§£š–’‹‡„€}|r~VPe`deddhc1…6°¯¦¦©Áéó§VX/ÁòåëŠä ãåæäààåìÛëÙÖ‡×ÖÖÕÚèïóâ€×/ÓÎÊÈÅÅÄÂÁ¿½º¶²­©¥¢Ÿ›™•‘ŽŠ†‚|zpz`D^\eku€Œ 6…&§²¥¤§¶èô¢,7^{”°êèéèå‹ä ãäæåäÛßæÓØÖ…×Ö€ÕÔÒËÈÍÐÍ€Ì)ËÉÇÄÁ¾»¸µ²°­«¨¤¡š–’Œˆ„~zwovgYŒŽ”’ƒufF ‹›´£¤¥“§îåïáöÿÿýøòååäããâçÚåÞÓׄÖ×Ö€Õ€Ó/ÔÕÑÏÍËÉÇÅÂÁ¿½»¹¸µ²¯«©¥¢žš—”‰…‚€}zvqqnO_L:)޵¡££–ŸéäãåÞÚÙÚÜÞŠä€ãääå倿ãßèÒÖÕÖÕ‚ÖÕÔÔÓÒÑÐÏÍ€Ë%ÉÉÇÆÄÂÀ¾¼º·µ²¯«ª¦¢Ÿœ˜•’Œ‰…~yskh^m'‚Ž€· ¢¡˜”äãåäæèéèèç„äããääå倿 åäâáàßãÜäÞÐÕÓÕÔÓÓÒÒÑÑÐÏ΀Í*ÌÊÉÇÆÄÂÀ¾¼º·µ±¯¬ª§¤¡ž›˜”‹‡{xurpounˆO‘o· ¡ ›Ýæãåããââ‚ãääåæâäæäãâàßàâäèëîîí×çÓÑÒÑÒÑÑ€ÒÑÒÑÑÏÏ€Í)ÌËÊÈÇÅÄÃÀ¾½¹·µ²°­«¨¤¡˜”Œ‰‡†„…††‡‡…‡|Œh”_¶¡ŸžˆÔèáäãäåæä倿åäâáßßáãæêíîîéáÔÆ²¨ƒÄæÈÒ΀ЀÑÐÎ΀ÍËÊÉÇÆÄÃÂÀ¾½º¸µ²¯¬¨¤¡ž›™˜— –•“’Ž‹ˆ„€zz“0M³¢ž†ÊëäçåãáàãáàßàâäèìîîìåÚͼ«š‹€yvx{{âÓÌÏ΀ÏÐÏÎÎÍÍÌËÊÉÈÇÆÄÃÂÀ½»¸µ³°­«ª€¨§¦¤£¡žœ˜•’Œ‰ˆ†„‚}z‡‘0>®¥œ›ž„¾éÛâáåêìæêîïîéàÔij¡‘ƒzuux~†•—¡Ž¶êÆÏÌ̓΀ÍÌÌËËÊÉÈÆÄÃÁ¾¼º¹¸¶¶µ€´²°®«©¥£Ÿ›˜–”’Œ‰ˆ…‚|}v/#.¦§››†²óìïèÞÊÆÚ˺©—ˆ|usty€ˆŽ•™›€œ š™š„Ö×ÅÍËÌƒÍ€Ì ËÊÉÈÆÅÃÂÁÀÀ€¿%¾½¼»¸¶´±¯­ª¨¥£¡žœš—”’ŽŒ‰ˆ‡…‚~t‰C!ª™™œ…ªÈ—Œxle`uoorx‰•˜€š™˜—–•””‘–ˆŸêÅÊÈÊËËÌÌËËÊÉ€ÈÇ„Æ(ÄÃÃÁ¿½»¹¶µ³±¯­ª¨¦£¡›™—•”’‹‰„€|xvxr†a“‘¬–™—Št`mp{‚‰ˆŽ’•€–•€”“’‘‘‘“–œžª’ÊÝÀÊÇ„ÈÉÉ‚Ê.ÉÉÈÇÅÃÂÁ¿¾¼º¸¶µ³±®¬©§¥¢¢Ÿžœš˜”І„‚ƒ„†‰ŒŒ‚L“2 …¯—™••ŒŠ‘‘Ž’‘ŽŽŽ’–›¡¥¨¨¥›’wwçÅÄÄÅÆÇÈÈÉÊË0ÊÉÉÈÇÆÅÃÂÂÀ¿½¼¹·µ³±¯®¬ªª©¦£Ÿš–‘Ž’•˜šš–Œ€o[F2— v°•—”“”’€‹ŠŠ‹‘•›¡¥§¦ –ˆvbM9"‡ê¹ÊÅÇÈÉÉÊ-ÉÉÈÈÇÇÆÅÄÂÂÁ¾½»¹¸·¶µ´²°¬¨¤ ššœŸ¤§¨¦ ”„pZC. ‚–.f±™˜–”‘Ž‹ŠŠŒ•› ¤¦¢›lXC/ÚÏÂÈÆÇÈÇÇ‚È%ÇÆÆÅÃÂÁÁÀ¿¾½½»º¸µ±­©¦¤¥¨¬°³´°§š‡qX@)ƒ—U¯”’•™ž¢¥£ž•‡vbM9' ƒ  cï¹ÇÂÄŃÆÅÄÃÃÂÀ½»·³°¯®¯³·º¼¼¶¬œ‡oU;%ƒ›F­©¤§¦¥Ÿ“ƒpZE0ƒ€‚¼ÙºÆÂ€Ã€ÂÃÃÄÃÁ¾º¸¶µ¶¸»ÀÃĺ­›„kP6 ‚¢1‹Š†s_I3 ƒ…&<ëºÀ¾ÀÁÂÃÄÅÄÿ½º¸¹»¾ÃÇÉÉÄ»¬˜eJ0 ƒ€†¢-' ‚€Œ šã´Å¿ÁÀ¿½»¹¹»¾ÂÇËÍËŹ¨’x]B)ƒ…¨‚“ßÀ·¸¶¸º¿ÄÊÍÏËõ¡ŠoS9"ƒ†®–pç±ÈÇÍÍȾ®™€dI0 ƒ€†Ò  Þв¦uY>&ƒ…€Úa8 ƒ†€å…€ç†€ô€ôÿÿÿÆÿÿÿÿÓÿø ö/ö"$ ö -ö,÷0#ó 4 ‚€ë /- ñ?#$!!‚á .=#)$$ƒÙ‡G1)*('$ *=9ч€&L*0+**&H_q~Š’™•FŇ€„ J@.2.-.'/Ž›–’Œ‡†‰j¿‡€„! ):N_r—zT65321.."kŠ…ˆˆŠŒŠŒ| ¶‡€…( (9M_s‚𢦧¦¢ž›‰dK6965403"b–’މˆˆ…‹®‡€…2 '9M`sƒ’¥ª««¨¤ š˜–••”—|cC;<:8737%K‰€‰ˆŠƒ‘5¤‚‡€… '8M`t…” ¨¯°±¯¬¨¥¡Ÿ€›œ€žžŸ”qY<@>=;:68+>˜¤µ¸…ˆŠ‚’Oœ‚‡€…&7L_t†•£¬³µ·µ³¯¬¨¦¤£¤¥"¤£¢¢Ÿ™–’{oN@C@@?=:;0EÞñôì†„Šƒg–‚‡€…%6L_t†—¥®¶¹»º¹µ³¯­¬ª«/¬««¬«¬«©§¥¢ž›—–”••›¡©µgHGFFDB@>;82Àëàì”}‹„Š{’†…$6K_s‡˜§±¹½À¿¾»¸¶³²€°±²³€²0°¯¬©¦¤ Ÿœ¢¦®¶ÀÊÕÞæíñó—YIKHHGEC@;?)¦óãö§x‹„…‰”…#5I_sˆ™¨³¼ÁÄÄÃÀ½º¸·µ€·¸¸·µ³±®«§¥€¢ ¥©°¸ÁËÔÞåìð€ô!òððéó¼qRKMKKHGED=C'…ñàô½uІ‚2„"4I^tˆ™ªµ¿ÄÈÇÇÄ¿¼¼»€º»»¼€»¼»»º¸¶³²®¬©¨ª­²¶¾ÆÐ×áçîñ€õóñîìëê ëííï gLOMMLKIFE@E-gìãñÑw††L!4H^tˆ›¬¸ÂÈ€ÌÊÇÅÃÁ¿¿¾‚À ¿¿¾¼º·¶³±¯€®<³µ½ÄÑ×ßßåèìëìëêéççæåèéìïðîííîîïëòÖƒYNQOONLKIGBD6MÞèë〇dY¡ª»ÄËÏÐÐÏÌÊÈÆƒÄÅÄ ÃÂÂÀÀ½»¸¶´€±µ¸¿ÃÎÓÜáéðôñìêîùúøùû€ùúúùùøòòíçæëïðíëîêõ¶qSQONLJHEC>:ÉîæïŽy‡ˆxŽ !ÌÛÎÏÊÊÈÉÊÊÉÉÊÉÉÈÈÆÅ¿½¹¸µ¶´¹ºÁÅÎÓÜáèíð€ò&ñóïæäíúýìÈ´±•zƒ‚|•Ÿ¸ÑÙèúüñçæíñìðÞ”dQV€SQONLIGCE0®óâö¢s‡ƒ‡Œ'¼ÕÌÏÎÍÎÍÍËÊÈÆÄ¿¾»»¹»¼ÂÆÍÓÛáçìï€òIñðîíëêêíìäêüýÞ£o<!"%(.6;\KKv£ÙùýìçéõÀ}YUVVUTSQOMKIBI-óá÷¸o†‚€Ž0Œ#²ÜÍÏÍÌÌËÉÆÄÀ¿¾ÀÀÄÈÍÔÚáæëîñòòñðîíì‚ë€í(ðñçëÿî©d"+:??@BBA@@?==>:cŸçþîé§nTY€WUTRPNLJDI0qïäóÏq‚‚}ŽHŒ  ÛÌÏÍÌÈÄÆËÎÕÙàäêìððòñðïíì‚ëìíí‚îíìðéæûïš94BD?8676556€5654868>FD7)E‚æØŠaVZ€XWUTQNLJEH7Vãèîáy|ƒ}‹aŽÝÌÎÎÄÈìéïîððïîìì€êëëìíí‚î„íìîïçôü™3(CE>668:;€:;;€:+9:9887414?G@"*žU\YZYYXVUSPMKFF>@Ðîèïˆuƒ~†v {ÝÍÍÏÁ¿ïèë€êëëìííî‹íìïìçýÂL+FA97;==<;†9-8988789:9408B(ŽjV][\[YYWUTPNKIDE3·óäöoƒ„Ž gÙÎÍÎŵêê‚î’íëðéïú„#DB9:=>=<;9:;9::€988‚9*8877:7=^™S_Z]\\ZYXVTRNLICI.™õãø´k‚}‹-Š RÕÐÍÍÇ´çìì•íëñæ÷ÙF>F9:?>=<<;€:€98€9†8%5:!ŠwV`\]]\[YXVUROMKCJ/zòäöËm€|ŒFŠAÎÒÌÌ˱ßîëî“í ëñæ÷Ê)J=:?>€=<<;<;<;;:†98795?"A¢\_]\[ZXWUSPMKEH6]ééðßuz€|‰^Œ.ÄÕÌÌͲÚðëî’íëñæû»3K:??==>><=<::;::99:€9898%996;ŠVc]_^]][ZYWUTPNLFG=G×îëî„t|„s ¸×ËËγÐñéî‘íëðçøµ>=>=€<;::;:ƒ989€8':6=!0¥h_a_`_^]\ZYWUTQNLHDC6¿óæ÷˜n|€ ©ÙÊËζËòéîí ìðèø¸@E=B?@?>€=<;;<9::…9€8(78sšYe_a``_^]ZYWUSQNLJCG.¢öäù°j}}‰*˜ÚÊËκÀòéîììíì€íì‡íìðéõÄ@F?D@AA??>>=>=>=<;:;;9:‚9€8*96< '£w]daba``_^[YWVTQNLJCI.ƒõåøÇk~{ŠBŒ„ÛËËν»ñêíðîíðîíîïííî„í îëíß#8J>EAB€A??€>=€<;;€:998ƒ9(782e¤^ebcbba`_^]ZXVTQNLJDH2eíèòÝr{~zˆ[ŽrÙÌËÌÁ´ìëíçêïçìðíëïððîƒíîë÷I'Q>F€B€A??>>=>€=<=;<;:;€:+789989'™‰]gbccba``_][YVTRNLJFF9LÝíìí€uzƒo]ÖÌËËıéðîý÷îþöîõøòððîíìðåû`\>ECBBA€@‚>=;8276567:;:7:,Vªjegeeccba`_^[YXUROLIGD@:Çóç÷”o{~‹'JÐÎËÊȯãïö¤Èü˜ÉÿºEêððïìííìïèùÀBj=LGB€CBB€A@ƒ>:=99@FGGEEFGD>538:4(‰š^jdffedcba_][ZXVSOMIGBE0«öäú¬j|{‡'‹17ÈÑÊÉÉ®Üòì |ÿtÿ°¼úëòìííìðåüihÒ€IAIEACCBBA@A@>=:CHC€B€A@@@??:FB% 5NSnlakTG<09M:*s¨clhiihffedb`_]ZYWUROKHBG0nðçóÚp{~y‡WL¯ÖÉÈ˱Íïø$_ÿ~ûë€ÿçôìííîëï95D&"b­–S=I(#]vxS5B1,HY[tjY5 YSšŒ`mh€ihfedca_][YWUROMICE6Sãìíë~uz‚lI  ØÈÈʵÅìÿ_ s)°ýêóíìðåþ—Y:C=%2{§|C=FDABAB>@EMa&%./(&,/Kf9…«mj"iihhfddc`^\YWVROMIEC<>Îòéõ‘p€{~{ŽJŽÙÈÈʸ¾íþ˜):Zo{ÇôîñðîìðçùL>[DE=C7$C‹šb]`ZUVTTSPLIC<1+R¿tkmklkjjiigffca`^[XVTPNJHBE,–÷åùÁk|y‡=‹hÖÉÈÈÁ¯îéÿ´=ÿ[Qšÿéóìðåÿ.eGN€KLHAA@07kmA?=šAeg``_^][ZXVTROJ?;"^¥fqlmmllkjihgfdb`^\XWTQOLHBG-wòçö×p|}y…T‹"SÒÊÇÆÄ­èèÿuÿ.cÿ@-ûéóîïè÷NK]HOLJ0F@B>0E{rIOzffdca`^]\ZXVUSQKH2¤‰esmonmllkjhgegc€[XWTPOLHCE3Zçìðé|w~z‚i‹BËÍ€ÆHªáëÿˆÿKIÿ› âñïòéôÏ3eQONLKKJIIJE@B:4Ppg#‡lnhecba`_]][YWVRVFa¯hmopponmllk€id_€YXXUOONIDC:DÔñêõq{}yŠQ/ÁÏÆÅÇ­ÕóñÙi-NÿÙôíõäÿ—0oISNMMKKJIHIIE>KS¡„urkffdcb`__]\ZZYTXG•˜cphlponmml€kj]ƒXWSONJEA@4¼õæú¥m€{z‚"ŠP!µÑÅÅÉ®Êøèþ« ®ò 3òìñóäÿ~EkITOOMLKJJHHGIBGEetrjhfdcba`^]\ZZWXS\±ulmlonmlmlkgb\YXWTPNJG@D-ž÷æû½l€|y†9Šp¦ÔÅÅȲÃõïíûçÎìñµÖøíññéõQ[dLSPPMLLJJIHHFG2:y? }wnkhgedcba_^][[W]L‡¦gtnrrqnookklipEZƒSZWXXWTQNKH@E,ôè÷Ôq~}x„QŽ –ÕÅÅȵºõíóäñÿÿÛ ¨ÿêóíè>j\PSPPOM€K!JIIDM]Yn¢wuolggfedba__^\[YYU¬…kspr$smjljle3M“\[\WYXUQNKHBD0bëëñç|z~yfEƒÖÅÆÇ¹µððïýâ–2bèðñïñßKsWSRQQPNMLKJIJED"iM¢’{solihffccb`_^]Z^Qw±lspƒr$mmlioP6Jk]`[XYUQOKHDC7JÛðìóŒtz|v ŒqÔ€Æ>½­ïêýyQxÿéóðîóÚZxTTSRQPPOLLKJJG:,xe»…|roljigfecba`^^[_P¢•ivp„r#qkliEA9‰t[a[XXWRNKHEA>7Ãõèù¢o{y€ ŠI]ÑÇÅÅÀ¬çïö¬,qANÿçôðïòÞkwTUTRRQPOMLLKHK0>]€À€|rolkihfedcba_]_Xm·uqrrssr&qrlo\\«Á~spnlkigfedbb`_^^³ƒptqs„r qnbD=85_‘_a]€XTPLHF?C.jîêòãyz~x€cŠs(¹ÎÄÄÇ«Ìöìöíçê÷þÜÈïñîõÙzTZUUTSQPOMMLIL,A[´Étqnmljhgfdcc_dUˆ²nxpstrrssrqsmnTF988Q“e`^YXXTPMHF@A4Oßïíñ‰uy{t ‹B¬ÐÃÄÆ¯ÅõîîùîçéBÄøíðôÛz…UZWUTSRQPPNMJM-ER«×„ƒusonmkihfecb`dZ®’ovƒr(srsqmgKG5;8An^`ZXXUPNJFB?:;Êôèùžo€zx‹E ÒÃÄÆ²º÷éü­*G àóíöÜwŒVZWUUTSQQPOMKJ62g㌆vtpomkjhffdbe\x¹wvttlqr)qtqoZM@698<Šx\aY[XVQMJFB=>/¯÷æú¶l{vƒ5‹BŒÒÂÃͶòíí@yþÿåøÞh’Y[YWUTSRQPPNMI@*o~ðœ‡yuqonlkhhfebgW¢¢n|vrmƒr(unnMA998;:zƒ]eZYZXRMJFCÐòè÷™oxw}‰RCÅÆÀÀÁ¨ÙóðïìÿÿýÿªYéóêüµ|R_YYXVUSRQPPOIL$LzŸóŽwvtomkjgi^¼x€}~~}xyyzxu]@;889€8?r_`ZXURNKGD@;<0·öæú°kyu‚3‡/¼È¿¿Ã¨Ìöìòþé¸e#L€ï(ôÚ}›[\[YXVTTSRQPOOFFƒaÑׇŽwuspmkgk^³ t|‚~.}|{zyxQJ86:987:3}[bYXUSNKGDA:?)˜öåøÈl~yu‚J‡@#±Ê¾¾ÂªÆöíï9©ÿñðñìó‚špW]ZZXVUTRQQPNKF4*•Xìdž‹{tqpkmczÆ‚€€€~,}||y{lCGL?57:8:4w†ZbYXUSOKGDB:@)xòçóÜsyzv~`‹B¢Ì½¿Â¯»õíë8¼¹ùàôñëù²‡ŒR`YZXWUTSQQPOMGI'A˜RÛˈ„xsnqbª²w„~€€€~,}|zz^O-JK:58<5cŒ[aZWUROLHDB;>.[çëíì€t{wzq Šr ”ͽ¿Á²µóîóú©&cö÷ðòëùÃj§Y_[ZYYVTSQQPOMMEG ?™I®Ø¡„yvvpvÇ~‚€€€~~}}{|qVM3&4LG684N__ZWUROLHDA=<3CÖðéö”n}wv|‹;ν¾¿¶­íïïè÷õ¬0†ÿéõèö™yT_ZZXVUSSRPOOLNBH!C¥I^¨²£‰ƒq¡¾|†3€€~}}{}cR<7=3;MC5>‰g[[VURNKHDA>:92½ôæù«i}xt2‰=pͽ½¾¸©éñïøùêÿëÂs¥üêôëôÁ‡šV`ZZYWVTSRQPONKMBF,)¯†CUs†Š€Äž|†‚ƒ€2€€~~}}wYL8:7:<.$AM:~nX]VTQNLGEA?9=) öåøÃh|xtI‰:]Ê¿½½»¤áðöÒ¥úéð÷ýöíñïñéô‘štV^ZZXVTTSQPPMLKMBI+|ƒqS=-mʆ€ƒ‚€/~|~kRC6:986;;(-@uuU]VTQNLHEA?8>'€óçôÙnxyt}`‰,KÅÀ¼¼½£Þìÿ™ßêîòöûòïðñéôÃŒšW_ZZXVUTSRQPOL€KB$+23Xnyz«²zˆ‚„ƒƒ‚€~||^O::€9$:86<6"j~T]VUQNLHEB?9=*bêêïê{ryuyq ˆt9¼Â»»½£Ñïü­èÿìÖ¢œîððïïéóœxV^ZYXVTTRQQONMJI2_OC833WЄ†„„ƒ„ƒ‚€~sUJ6;9989:967?.XƒT\WTQNLHEB>:;0GÚïéõŽlzvu|ˆv)´Ä¹º½¥Éñù¼Z5 Ýôîððæü¢U³V`ZYXWUTSQQPNMICMb=EAM6Á{‹„†…„„ƒƒ€€}€eQ?8:9989899876G„WXVTPMLIEB>;854Ãóæù¥f{us1ˆ'§Æ¸¹¼¨¼óòÚI€¯Õïôïððíïçû]”PaXZWUTSQ€PKI''mKHHEBGÈœ€‰…†……„ƒƒ‚€zYL8;€9'899897;2)‚^RWSPMLHEB><69(§öåø½eyusIˆ™Ç·¸»ª´ôëï’ÿöÿòæè€ð!íîéóÒA©pW]WXVTSRQPOH=[cCJDJ9}Ì€‰…€†5…„„ƒ‚mSE8<9:989988:6-tolNXSPMLHEB><6<%ˆôæôÔjvvs}_Œ‰È¶¸¹®«ðìò xûÕæòÿü€ð"îìïêòÎr§aXZWVUSRQRKH3uIIHEK=µ®}‹…‡€† „„ƒ‚‚_Q<:;:9$8;4@…äoPWSPMLHEB>;6;'híéïæuovsxq Š9wÉ·¸¹²¥ìíö–Âÿýûã_lýêóîíìïèô¹t¡V[YVVSSROI6jaFKEJ?hÒŠˆˆ‡‡€†5„„ƒƒuVJ7;::99:8:4B ráíœjUUSPMKHDA>;79,KÞíéòˆhwss|Š6fƸ·¶´¡áóïýþߘC‘ùìòîííìðèó¨|™SZXVTSSJECyJLJFM;£¾އ9††…„ƒƒ€‚fR@:<;9:99;3EVäáö’pXTTPMKGDA>;8615Éñæ÷žcxtq1†Rø¶´¶ÜòôÍKáýñððï€íìïçò z“TWYSUOH,z^IKHIFR̘…‹ˆˆ‡‡€†6„ƒƒ‚|ZO:=;;:9:94BO×çéù·p`RTOMJGCA>:946'®óã÷·`vsq€H†C½¹´³¶ÐóôÏ!O ïèìñïðíìðçô™m‘ZSXSJ@VzJMJGN;ŽË‡‰ˆ‡‡€†4„„„nTH8=:;:<79B![ÙçðèùµshPUNLIFC@=:938 óäôÏcrsq|_ˆ0µ»³²¶Åøëøô“Œöôððï‚íìïçò `ŒeOOF!&†[NLJIKFÁ§‚Œ‡‰ˆ‡‡€†„„‚‚_R>;€<*;5>:säåíîéóÇzkOTMLIFC@=:927 níæíánlrrvp‡#«¾±±µ »õîíëÿôž¹üëò„íTïèïœ^~lF<kyLOKJN@qч‹ˆ‰‰ˆ‡‡††…„‚„wVL8=<=79C,'ˆäåîíîíóÜ€nPRLLHEB@<9825$Oâëêñ‚etrr{‰À°±´¢°õìóñéëÿ÷ÙÉùìò„íìîêî½iYW0ŠYRMLIN@±¶‡‰ˆ€‡:††…„…fRC;=89B:B»ïèñíìëéèçŠoSPMLHEB?<9733*7Îìáð’^tqo0‡ Á¯±²¥¨ðïðñðü¹mxÚþíñðî„í ìïéò×$¡‚L OF_Б‡Šˆ‰‡‡†8…ƒƒYQ::;EA&$x×çãìêìîò÷öõ—nVMMKGEA>;8630/&µõêÿ»[tpnG‰~¯°°¨ŸìïóêüŠ‹ýêóî†íîêíí½qxjd^QFM=–Ä}Œ†ˆ‡ƒ†6„‚…lOC;753.1•äùbppo|^ŠnÁ¯¯®ª›âôëúÄwÿÿpâñïðì…íìîíèöטa=FX^WSÇœ€‰…ƒ†9…„„ƒ`XJ6#'\­ïïâÞÚʹ«œ—ˆ€zuvoQNLJFD@>:642..#6TJITjlnoup‰[¿¯­¬¬–ÚøæÿKüíúå¡ÿéóìˆíïéï÷â·gB<8Ì€‰…ƒ†:…„ƒ‚„uM84Z™Í˵µ¬œ“ˆ„~wph`WQOMKHEB>;8521-,%(Xdknlorvu|‡I»±­«­•Ðöëò ÿõÿé•ÿèóì‰í ïìçëôñÏ¢S²¬|Š„†……„ƒƒ‚‚zrJN®Á±£œ›”Š…{vnga^YW€TRNKIEC@<:6420-+'&]khjkkjni„3…9´³«ª®“Èñú®[a4 ÂúëòŠí ìîïîééí÷ÛÆŠ‚†ƒ…=„ƒƒ‚‚|¹´±—‡„€yrnjeedcbca^\YUROKJGDB?<9541/-)) Ncdkq{†’–¥9…)¬¶©©¬•½ðû£ %/Wt‰¨ïððïŒí ìíïîíåÑ­~†ƒ€…„„€ƒ ‚€~{snsvs€q+pnljgda_]YWVSQNKIFDA>;8530/-(*Z“”š˜“ˆzkK ‰ ¸¨¨«—­öìõâ÷ÿþÿÿüí ììíêòÞÆ”~…ƒ„ƒƒ7‚€€~}~~zxusqokhgedb`_]YXUSOLJHEC@=:7430.+()DhP@- Œ“º¦¨©š¤ñììïèãââäæŠí€ì ííîîïïîî×·ƒ‚ƒƒ2‚€€}}{yvutsqponjigeca_]ZXVTQNKIFEA?<9641/-*)&$ ‚Ž„»¦§§šìëíìïñòòñð„íìì€íî€ï îíëéèçíãÌ™{ƒ€‚8~~}|{yxwvusqpnkihfda`^\YWUSOMJGFC@>:8530/,)(%#t¼¦§¥Ÿ”åîëîììëë‚ìííîïëíïíìêéèéëíñôøöøÔ»‚~…0~~}||{yxwvurqpnlihfdb`_]ZWVTPNLIFDB?<96420-+('$"–c»¦¥£¢Ûðéììíîïíî€ïîíëéèèéìïó÷ø÷òêÝι¯‰¯ªt‚|~~€~~€}.|zyxwvtrqpnmjigeba_][XVTROMJHEC@>;8531/-*''#!“Q¸§¤¡£ŒÑôìïíìêéìê€èêíñõøøõîãÕIJ „}z{€w½ˆz~|}}~~€}1||{yxxwvtrqpnmjigec``^\XWUSPMKIFEA?<97420.,((&" “1B³©¢ ¤ŠÅòâééíóôïó÷ø÷òéÜ̺¨—ˆyy}ƒŠ’šœ§•§µs{}}‚|4{zyyxwvutrqpnliigeda`^\YWUTQNLJGED@>;9632/-*('$! ‘/0«¬ŸŸ£‹·ûô÷ðæÑÌãÓÁ¯ywx~„”› ¢£¢¡ ¡†·‘t~z{z3yxxwvusqqpmljigeca`^]ZWVTRNMKHFDA>=97430.,)(&#!‘.#£®žž¢Š°Ïœ‘|pidztsw}†Ž•›Ÿ ¡ Ÿžœœ››™›‘•ºv{yƒz4yxxwwvutsqqomkjhgeca`_][WVTSPMKHGDC?>:9631/.*(%$!•—±œŸ–ydruˆ”˜›œœ››š™™˜˜€— ™¢¤°—±o}w‚y€x2wvutsrqpnmjihfdca`_\[XVTSPMLIGFDA?<9841/-+*'&$ •  гœŸ›š’–•—€”—–•”•˜œ¡¦«®®ª¡–q½{vxw‚x5wvvutsrqponljihfdca`_\[XVUSROMKHECA><986320-*%  —{´›š™š˜•”“‘€“–›¡¦«­¬¥œ|gR>'"p±h{t€wvv€u-tsrqqpnmkihgecb``_]\YWUSQNKIGEEDB?=94/("œ jµŸžœš˜•”‘•›¡¦ª«¨¡•…r^H4" ³†owt‚u)ttssrqponkiihfecba`_\ZWTSRQPNNKHE>7.%…€˜Z´š–••—šŸ¤§ª©¤›{hR>+ƒ  Q¹gwqƒt#ssrqponmkjjhfdb`^]\ZZYYXVSME=3) „œJ²®©­¬ª¤™‰v`I4"‚€›”gvprqpoonkihfdbababba]ZSKA6+ „‚¢3‘‹xdM7#ƒ…/»konopqqrqponlkihgh gc_XNC6) „­0*‚‹ ~£aumoonmlmnnmlhbZOB4(ƒ³‚’ ±tgkikmn€q okcYM@2$ ƒ¹–\¬]rmomh`VI;- ƒ€à ¨wRQA5&„€ä/ ƒ€òóÿÿÿÿÿÂt8mk@šRZÿ¾ Æÿá,YÿúÿS ¯ÿóÿ}Dóÿùÿ¥  ”ÿûýÿË.àÿýþÿé3yÿúÿÿþþTÉÿûÿÿúÿ}  [þýÿþÿùÿ¥ $7Wn  ¯ÿúÿþÿýÿè±ÊÝôÿþÿúÿÄ  "6XŒòÿþÿÿÿÿÿÿÿÿÿÿýù÷øöû? !4RlލÆÝòÿÿÿþÿÿÿÿÿÿÿýøúûþÿÿþÿúÿn 3RjŒ§ÅÜñÿÿÿÿÿÿÿÿýùùþÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿ÷ÿš  2Pj‹¦ÄÛðÿÿÿÿÿÿÿÿýù÷÷÷ùûþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþÿúÿà 2OiŠ¥ÃÛðÿÿÿÿÿÿÿÿýù÷÷÷úûþÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿæ* 1Nhˆ¤ÂÚïÿÿÿÿÿÿÿÿýú÷÷÷ùûþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþJ1Mh‡¤ÀÙîþÿÿÿÿÿÿÿýú÷÷÷ùûþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿp/Lf…£¿Ùíþÿÿÿÿÿÿÿýú÷÷÷ùûþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ™ /Ie„¢½Øìþÿÿÿÿÿÿÿþú÷÷÷ùûþÿÿÿÿÿÿÿÿÿþþþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿ .Id‚¡¼×ëþÿÿÿÿÿÿÿþú÷÷÷ùûþÿÿÿÿÿÿÿÿÿþþþþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿä)+Hc »×êýÿÿÿÿÿÿÿþú÷÷÷ùûþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿþÿÿÿÿþúúûüûüüüüüüûûýüþÿÿÿþþÿÿÿÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýH»ÿýÿÿÿÿÿÿþúø÷÷ùûýÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüøûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúøüÿÿÿþÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿn €ÿøþ÷÷÷ùûýÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþøûÿþÿ÷ÜÔÜÏËÎØÛÔÈÖÑÞêìøÿÿÿû÷ýÿþÿøüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ— Ÿÿùÿþÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿýùþÿÿëŵ¨¥ÀØãçíïðïìêàÕܺ«ÃìÿÿþøüÿøýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿÀ%™ÿúÿýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþúýÿöȳ¨Ããûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúݺ  ¿öÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿã' (Žÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúüÿ÷Ä£¹éÿþÿþúúûüüýýýýüüüûýüÿÿÿÿâ­˜®ïÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüF %|ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýûþÿ¿¤ÌöÿÿüøüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûøýÿÿöÅŽíÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿl"møÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüúÿØ¦Æøÿþùüÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùüÿìõÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ• \ìÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûüý¶§ñÿýúþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþøûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ¿PàÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿäœÏÿýúþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿá&CÏÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿÛ¢èÿùýÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûD;ÀÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿÕ¦øþúÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿi3«ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿÑ´ÿúüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ’-›ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿѰÿùþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ¼  )†ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ×¥ÿúÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿß$ $výþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿæ úûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùA!eòÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþø¤êÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿgVèÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¨ÐÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿJØÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿѲÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþÿÿþÿÿÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿº ?Èÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ¨ÝÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿÞ#8¶ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿÀ¶ÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿü÷øõóö÷ùþÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø@/£ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿô¡ûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþöñííõóòôñëíïúþúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿe*’ÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ¸¼ÿøÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõìðøýÿÿÿÿÿÿÿúóííóüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ '~ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿžîÿýÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþÿüïñüÿÿÿþþþþþþþÿÿþöèóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ¸ "oùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ߯ÿúÿþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿùïøÿþþþÿÿÿÿÿÿÿÿþþþÿûôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿÜ"]îÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ»Ñÿúÿÿÿÿÿÿÿÿÿþþÿÿÿÿþÿ÷ëýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷?Qâÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ¥óÿýÿÿÿÿÿÿÿÿÿÿþþþÿÿþûìüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿbDÐÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿàªÿûÿÿÿÿÿÿÿÿÿÿÿÿÿþþýúèûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ<Áÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ·¼ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿýøéñÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ¶ 4­ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿµÚÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõèÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿÛ!-ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿñÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿíôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö= )ˆÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúëþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿa $wþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿñµÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿòîÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿŠ!gôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿñÅÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿòöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ´ Xéÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÖÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþëúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿØ LÚÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷Ûÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿýèüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿô:@ÊÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÝÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿûëýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿ^8¹ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÝÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿûèýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿˆ1¥ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷Øÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþçûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ± +”ÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÎÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþîøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÖ 'ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿõ¼ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿññÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿó9#qúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÊùÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿöëÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ] _ïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿ×ñÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿýíùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ†SãÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÌàÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõñÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ¯ FÒÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿáÓÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüîùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÔ<ÃÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿôËÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþøíÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿñ85¯ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÇôÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿòðÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ[.žÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿáÜÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþðòÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ„ )‹ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿàºÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüððÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ®  %yÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÐëÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýóìùÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÓ!iõÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿëÚÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýôèíøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿð6Yêÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿ×îÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöúóëìïöüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿYMÜÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿíÞÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿýøñòùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿBËÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÊïÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ« 9»ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿÈ­ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÑ1¦ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ¢Ùÿúÿþÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿï4+–ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿãšüüÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿèìÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿW 'ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿëÐþýÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿìèÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ#sûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿëÖÿüÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿõêÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ© !aðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿåßÿûÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿôåÿþý÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿÎTåÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿãâÿüÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿôáýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿí2GÔÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿààÿüþÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿôåûÿþÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿT=ÅÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿãÜÿýýÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿêéÿýÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ|6²ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýû××úÿûþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿüèèÿýþÿÿþÿöüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ¦ . ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûæ×ðÿüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿóãöÿýÿÿþþþÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿÌ *ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿòÝÓïÿþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿùãçüÿýÿÿÿÿÿþÿôöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿì1 &{ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿûäÃßýþÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûýÿÿøèáòÿþþÿÿüüûøñþìúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS"köÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿîÛÙÞõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþöæâíÿýúõýúõõõüúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿzZëÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿ÷íÏØæøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ÝÞ×ß÷÷ôùøöþýÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ¥ NÞÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþÿûñÝÇøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿü̱ðýûüüÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿúÿËBÌÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿ÷ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿä':½ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúýÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüüýÿúÿÂ" 2©ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüðË` ,˜ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùîàÑÀ¯†^9 (ƒÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷¬‹~ri_UG3#tüÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü‡LE80' !cñÿþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿ Uæÿýÿÿÿÿÿÿÿÿþüúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ™ IÖÿûÿþÿÿÿüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿ¼>Çÿûÿþÿÿÿÿþÿ÷ëÙÜÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿÚ$6´ÿûÿþÿýÿÛÁÀÁÇÓÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýó@/¡ÿûÿþÿþÿòíÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþýýüýþÿÿÿÿóD *ÿüÿþÿÿÿÿÿÿýúúûÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþýüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüýÿÿÿÿÿÿþ÷íÝʆ$ &|ÿþÿÿÿÿÿýüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþüüüýÿÿÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿýýüüþÿÿÿÿÿÿüôèÚʺ©™‹|c="m÷ÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþýüüýþÿÿÿÿÿÿüóç×É·ÂþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþýýüýþÿÿÿÿÿÿúðãÔó¡’„xnf_XRI;# \ìÿýÿÿÿÿÿÿÿÿþýüüýÿÿÿÿÿÿÿùîáÑÁ°Ÿ„vrgÂÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþýüüýÿÿÿÿÿÿþ÷ìßϽ¬›Œ~sibZTNG@8/(! PÞÿýÿþýüüüþÿÿÿÿÿÿýôéÛ˺©™‹~si`WPF>7QìÿþÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþýüüýÿÿÿÿÿÿýôèÚʸ§–‡zpf_XQJC<4-% AÆÿúÿþÿÿÿÿÿúðãÔij¢“…yne]TLC90(  }ÿúÿþÿÿÿþÿÿÿÿÿÿÿÿÿþýýüýþÿÿÿÿÿÿûñäÕIJ¡‚vld]VOHA:2*# 8†ïÿþ÷ëÝͽ¬œ€ukaYQH?6-$ Îÿúÿþÿÿÿÿÿÿÿþýüüýÿÿÿÿÿÿþøíà‹~rhaZTMF?70(! &Tƒ¤¢•ˆ{pg^UMD;2)  WÿüÿÿÿÿýýüüýÿÿÿÿÿÿýõéÛʸ§–‡znf^XRKD<5-& -JUWRIA7.& ¬ÿ÷ÿüþÿÿÿÿÿÿûñåÖų¢‘‚wld]VPIB;2+#    Dýþÿÿÿÿùîàп­œŒ~siaZTNG@80)" CÜéÚ̹¨—ˆzof_XRKE>6.&   *^ytmd\VPIC<3,$  9FHA:1*"   ic08íp jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ìƒÿ“ÏÁ ##3AROn»%$WŸýú—ž[ ú³À5Ebìå(;gW(·¡´ø§;ë—Š<žTFHÇ]çk™;*àJvÌL;-ßÎ!ÝÏÀÈOÄ|µkgµÔ“ ‘RÑðÆá m(ðöSõ³Îö­hi˜ù¥Xâ7¸Ë‚ÉÁ‡E‚±¹ÏÀà$_üAþŹ?;^‹ÊÔwfã”9w’ôlóŠÓ3ÛîÑQ…½Ù˳Œ—&ؼSt#LGeÏÁ ƒ®Ü<^žrÿu™{@fZÓR…Éÿ¡¬=¢{ %¨||ÇÁµ¸Æ˜ßõ 6Ü–[æ:Q0Ì·sÿ*£%µ–`8¸½ûÇàƒ‚?Øc¥ÀÚæ#uÎ6‡œÁ,µ4´oŒZ°4TøˆÁϽk©ææ¯{“H‡ÓñuÄÈûÏk¸½iÃG`¼q…0ø‡ “ÿ4Iüá͈Œ ÷xÊš £t-ù¥ƒ|ß¾õ@bÿkÖ…—§mt(ŠÌæaWü–jÂ|ÿÐ0´èL`šÖ:œ,‹A„úÑdž‡Ek*°b¾¬RÚ^½ìÙì?I@^Íó©ÔËjâoŠ,¤z¨Ê?6„² ‹‡ñÕÎÃí1‡Ú]Ú`-ì³²¬S–´Pò ó|‡|·ÂŸ£ÀCP–Ô$:Ùt0q¨-3ÉÆ‘ÖAÕZ8¸)ô] xÿ$‚DS.ï{§ŽÚ›ôÆââA™Ò› °z“G:›ÕÜ=ok%ùŠaI¾œ/žwö7*Â_ØF$WÂxz?´IàËF8%A:µª€<©&#õÇÃí7‡ÚgÚh@U˜‰¥Á)Òà$º ³Yurö›2¢˜¦mù‚›® .>Y JäZýaõA·­ÏX/¶%#©ŽÅúTÙ`êßPˇéGÁÛo𤆇äÎ$»èóStp‰(– U„ײ²µ¼V« Óºâµ[„­dV:I>‡K ½2Z6µÞ­3h (¨-õ/„ ÄË^Lï²»ÄC¶BšÏÌæ~g0üÀ9cvÛ+|ïWGòöE†¯íE;àñHmÆË;|Ë×å '@A‹1¶?Ó#‘ØÃ°–ÝAÜAH¬;E”K¼ ԨԠ䳇÷Nhþ'g­äDþÉ­ùÌ@h¡T“¹8r/Í.uÊéì§ÿbOð=¶,w$¾Í¨æœó=Q”&í*js“v3WöMüA·)js))ÀáÙX½üŸéP,û²}ʘÚêÇácÇábCð²€e—aÄ™?¤ÌYw:ÉVr³qÃæ¼¨ò˪ǔǀÖh£?ŸçW»ôÞèGÁ·Yû°ÑÐÑ#þ6pUo+¨¥»ðSà]ַƨÌø|{hFb˜btƒÛ…˺9pƒÍó1ÒxaCЧeEg±ì[€Æî‰þôs¹˜9þ×áJÿR7¼>ô®aÞ„Û]Rn(ß´tp§…ÜJ¼“ÕÛ\ðó^ÿ?«àOñüç‘©Ýc#Š×Ðjín ¯ú€\n16 #+>ùÒ‘C!ˆ‘ Ó®–C/K ]9lPµ4F›íÁ]øCoƒå¯LË}`òU„à¬%;¸­t)ÐÐä¤é¬P¬ ¦•¦žÛm¢:– ÿjºã¸…‹ÐÈñ…NÕ¶ôø ÇëÉ|Œc«9¼ÁöæéŠÁq¿ªjL+Ÿ}rsgdq" ÍeÝÆlÅøÄ£ €bN«Ç-ª kiª¤·bÐN]\½žèšÑ±¹3‘UÊí÷t©ú¦âáH+^ŽT¯=»,þ2XžIú¨qç”7õÀ?“R‰”¯¤4öÇÔÿ¼jû<Ý åÒ[t*òO¶ìH¢ÿ`À©N»ÑÚ‰zWV:™©˜(a‹Ô„/þ0u]‘Ö cY².ɺ°oÀ`0¨;1äTa9wŒqœPLkhÙß…NØùà à ô•d¬*I¤fàÉßWh£Œ¾BW=£è₞Cz¶d[º´ÑJÕר’çªx~˜¾y¾j·üËŒÑ:«ßb¢V"Ãí£¡öÐÐ}´PH #³!5V’MŒ”¾a(ÕÈÝgofDê¿xI)ß“…}zHq­ÓQä^Kð†hT’-?ל¡Ü3äy‡—0û\;¿‰q؃ó(º€à—ÜzçÊ}'oÚ€’Xá;„ÍNJç‹]DˆX½¡CÌy 8Ûü×(kù0èô=‘ c¶Õ(|†Ø²¹«ø´HV‡„<(7eáKçúy Y‘çÃÃÇI‘Ì'N7ó§ÑõK¶,À­ ¤–"UXM· dšçéçöõ– …àá•^m Æù åÊ¿ºÌ[:#;#Ô g–}WéÕºãÀ#‹æ‡¢åí¯ÜÊï­xz\|<§lK¤F”pyÕÉ€¬ƒœè:t¦ùbH3$‚.t¢€¿è_ÁÛÛwÄ·G>PwD.}kƒ06jÿ@$= \‘ëË: &vubE(æ"b—®š¿"ˆi~D¾˜e©k$ñÄT¤î&DH­›·"1=‹ïƒ°Ò9™‘,ª¹HZ8ü†¡ª¦)¿ Çí¶’b5"§¯BôQšWFKèUˆà1’Ã(ºÃí¨!öÓ0ü)@„±d }/¬åàp6’7'ªÕÃ8úýŠ&öÃ}Ný8»: Îoõ)œØø)ÎÒû¹mÙ/ßû½7FO‰6Qlpý’awG> :8G vk´®.vÁçÜúà0ÁÅ-ˆ„¾3:± ¤˜8Û)—Xª·éZÚ+#š´xçâY5׆[uûPtÊ&‡å‘º/¨NµLR¦ê›aÚ-°99?áÅê|’îCG"û—½ ÃåÙÆWŠ@©"+¯Vº/@ðæQÔÏYŸHÈÁ~¤ëÒâÓõw0~›”9?>®ô/h¿c•Þó#䀀$ÉÓ|‚=õóQ‡YãÝU³»æÜ DÄìuÚ–¬éy`Š¿\™« h¬{çÚûî8~kÒ÷¾ÎÞ× 8rD\Uoé.5.Ù8¯ĤYd£9†¾ €õ;VD“Èq°HýîkÇOçír3]÷…ôr 4a¨½ãwó’oú󧥸á ÄûhðoHä-hh…¨»×¥s¢"Á «ô}Kcç6h m*“*;×%Ú›u`KÿlÏz* tüÞq­‹P?„o¼¦f¾¯µ½z›ô¨B–¹ËS#óÏs²ã,HÍ`µ ÖIj.UnòÕØn°8<à£hÄÂ?´íÆ€%¨°Âhã¤%!PêQð!¦»?Ä“YÄ'(ºÙà×—ï†nÎë”x­$8Hþ¤ˆlë «i—l´úð´ëf F8O}r½¯ûçNu*¸Ü¾28A¬Pe¥¯Þ(jü 8BîJ“pÆ«Ôñ¯¯U$—n£öN9hÞúqb¯ÊpGJ îuMåË Šð~ "ré’å°pÛ „nW¿XC5a*ÆíbÌ6ÃÆD×UzÝ3Q÷+±Ã-so»mÎŒAoj[tªTì8³‚PœCô™’¡øõW„pq([ ±âÜØLO4>ÙXŸÊ O€~|/÷½S°æÇæA¹Ö·püùF1ú/QpDÄ3øú}>éÏϤ¹ùôcâàÅ—XÌw0¢ÚlV&ð8Ê›5@œíwð;‡±.Ô´YÊG^Ñát B"݈ž¢Dר©«nÉ[‘²STŸùü`˜¦€¬x“JÊFXD Ci'6öãÒÀê{;éî#“MÒÈÎ…†¹¡Æª«°éØB.~­t–ÿkW´ÚNþ]YDh+meدШµCÄÊ:iQ+ò¤Q¢CÿhÀ‚‡nCÍI x´®iž‘®ëîåf/0¹S(épgÈü²Ò‚H€½ÉX§yÄ€™åfÏ™žªî`yn©5¤Öškœ?0‹X^—:€Ôõ¦u£–—UµÅFc¤÷r,Ê… =ígÞwÛ_èT·—•«¾^i]NNßvTp9æ~¬ñ€¼äuzÒÌþ«L˜$ÖÄUß6,o,0¹ö 9«ç•jaO&nCðòË’BHæ¹ÑØÙÙ¡à:ÖXµBzÎýÂNbñ‡+‰ªÌ¶ƒ*²YYb‡8ñxì~Ÿìý½ WsæÇídRÆÊÙŠM·ö+žŽ`ãˆ\Cb£³ƒ6„GPIZ>HRzÚÛàóôµ^ãˆ8¨Fnå« n"†ëñDA)B@±‡Ž1Öç4Hˆ¢Õ¬À*8¹¸nš-ñ®\ÕBs@VO½íÐ\ŠoiJiŽj¿´„|3\Þ9.íw&0ÜÉÉ‹ó˜0JIõMžL)gÀÿ ("‘àܲ{ åáa&¥-Sá*ˆëé‰ê¼èÊ`–®Ì7ÄùMÛ qÖË|h^ßþi¼²ü?uÙ÷¾%QÅ¥¯ Xº›Þ»xƒÛ匰’ܲ;õL8ˆ%¥Ìñ;uí7‰î§$Í,+QÐIâG€'ÂЄNCB0ŽB]8÷AŽyËKw‡×U”j&6dåìÓ¨S°¾vúŒ2¦€*T§ìnéi”Òôwè¿G8†âßh ‹„!+.xÑ›Ç0>È~ÄdÞÓF$F@Ó˜'…¬_Äù•ÙÅð6@U&•`ƒ#1г÷Ñ’~hŽ€‚¯)‚—ƒ+…ŸÉO6Ë´ÝÃF1ív«§Lß¿¢'ÿWÇi©Ä"ÝzÌIèÔ£Í莞ŒY…7ô{»-}âå ‡­·C„úm?ªc’ϱ8a`_‡<^èõúVú\òí% Î¥œ-.7—³-sB{™Ñ aó>Î ƒ®’ ¬rºI«ñB[é&z¦€QØ|†sW¦Ç{¼¥ÿyo™nÞªÞ–å5»/üAê|q踹»è‘~ìõГ )§uéÊ’é ï©ÿ(ùõÔ<µ†ÚÚŒež²sô¯ý5+?¸nÎf)D½øÕO#¤âæÎh¯Ó»$c=¥µÃïd5'¾©Åp?ÖdÒP´¡ºkÚåªõ³ô|°aQd¶ø‚ÙêÍŽ&Hû^e®(´dŸ•s·#¼+«kûŠ‹”Ó`·›º9¿£ã6Aãgã–Sqjèh¡tÅßÙ²$ï{b ÌD–±ðö9ÛšÌ­Ž·}•Üàélto1‰$æó^ûP¾…ØqvàTnµÔO€v”ZòâÁPÙ¸“WV¯ä·=(°柔˜ã!°^Î4ÞcóËL|ã…ë€|†3¦;3¾7ëJ1: G‰Ñ[x`¤`#t )~iðcI‚xú2š3DޏÞ$nÔ)óI{r_6~ó—åqËí)xól ÉsrÞà$³BÙ~NXó`¯æ£Í(-Ær«©Ÿ—ÑZ׆áíqG8~UèÛ²¶¿sp¤aç$§¾aúëœìjFúI0ø/ÿL™‘™37G,L©^9ƒÅ`JR¿XçæbÄø_Ô€,)Úʶ«ë ?p`´‰Q ¥¾¯XA—(hÇá²ûuÖ†Á€ƒ.éæ_D|øeÊ ÅÍ­Ç=-Mw‡°bóÅ>j‰ŸÖ3*;¬&ÃKEžßwÙÈ/²¤2kò½´éfÇôS« êmì&$àQòD>°}Nq@ç ïŒfø~ÐC­ËK¶@?ótg€Z<²÷hUÉò¬¡ÜlköÙ v¸Éx#þ½š$‹A¼‹ƒ.ËbÜ„g–Ï€OÒ" 0¿2•°òãX‘¸Â5˜'%wHŸœ„ÁȃÝn'4:Ÿ)3WÜF!ç;Èü}÷ß“‚i¦0í‰úrŠlŒÇ“Å"~Ç™$„ª”'Eó(ƒE‘‚ 2³èŦ.h /wê”ÑQxÝèîáè@?R&`>( ×kC3Á‹«z;n#Ôû\ÿ‚zÃÕiÙÉWðØA(t¸Ö}ÇŒ¥œ“ç¶2<)Òûl–„EsªvÏghEb>¿Aæ²wÞà‘gÎõ¢¦r¤UÜ`‡ÈE“ /Âpíaï4N% ¹‰¬îº½ó³¸ùh«-SŸì½{¹øè?_7(´‹¶[ÇêuqG åààˆª·ü³ÃV—Vµ£¬µ*…ð¨EœÔIß׊‹‰¹5›‹‚r7¾Û%aÜšx©‘Í„1¯ó‰v¤×¹"¿\e:|ÐÞñMq‚{äž>.cGÐ#å’‚ËH þQ7Íi’ãåÒŸ‘àU.Jä]Tiœ=U+Ó^½2¼@íšgú*’#C”[ }<ˆÀzÒ"v%Õ7ëí‚Õ˜ø1¹;èá–„’=ÊÂV;²?Eà€2³$çr7ËPJ+Të´J²RîZ*Co= u(†üxàÁ”¢2»È:ÄO¨¨ ØÒèqw§L®ôi¹~',ëçø–Œök]‚öK0¹¢@÷ ÌsLcÆ $ÚEcøŸñ&„hx²{RÇüpÆË§«àl¬³lØBBo¢R=žHǃ²zizòÉɺ¹¥ŸÁÕ’ ý¸æ¡j¢Eú/§… iBß0sñ™Ö³©hE.ºâ "N#¼¡â.jÆ} ·?¡Â^¹HÎ7ó4€´6ª¡Ä’·;{f’Õª£vb5[c­)à¶ÒӸǴÂݾ?Û-é¼mMzŸÝòþf²½¾-wîÁÇç0*Ãc«uÂz±äćZÀß·¢3!Œ¹[Ù0Au’wñ·‰¾ø²tß{IQzÆeý7<‹ìRÞm‰8f³i'ãþ½Ù¦SbŸ˜àÝ–0;¯;{%û§¼úíž‹Ù"WƒæHà„¯Clõ‰Ý£_z‡ãDĪDÞ¨ŸÛÿf"q˜Qßù?DRÀt9JÇËè °{;Yaš±ê”=ÀuäåREŒ1yÈb4aÜ"Î×#ŽÂMqZ%:Vä;Å£ZÚõêŸÙ84æÀ¾ò[yÄÏLVÏ9î:@ŸÃäÐòtá@f%•„J=rq;ÃíÛˆ}»1ÃgÀƒ>|2¸Ýcî<¤#6P½€³tø©Ñ™Yb{ÉÅÔ­õV¨ ÏòÔ>)[Œ¤\îúY7 ÎuSC‘¡D¦Ô¨@ƒÄ— Tiù9šŒå0$˜ûª†Á£Qæýf(Ü_=…Þèo4œÜ³bÎO¬Áò5á æ±q7é&¸%ñS»:p2TOúˆH @±:ÄL1ŠÀ-Á+c¸hjâîΑ‘Ž[X±ÄÏ€:–À£Š²^H-ÉGÝô :Õ½%~)1öN”Þ¦7vî¸þ^XÒ‘([Üs"æ4Ü}úm¥Ò¼¸s,1O¤tLÞîé5m;(b<ŒÈKÉ œóË9Œ\@êã[¸P§g”Jð$IkmˆfnèÙ)¬Ï™Å–Ã=³‡‰ˆmPsæÛ¨G´¤)T0 !Ò)4×Iº„§9GÙôÇí`áÛ߯deïö“I‡v.<ÍÔ0ˆrÚ1†ìüëæv-Ñ'ñ¤`NÄïb´_Ý[C­kø$«‚¦™\ç÷$âîaßÄ&Ÿ;âå4 —¦W•ä ƒÔ¨ºKªÉÃ*Ö‘'ï?L3¾‰|hõ$º~Yj³õ®›sõµ¬Ê)ÑQïWmëµQsjù_–~$Ò9­OÑL1®þ°)ôýU:û‹@ ‚„»žRûnnдôhÒKÊ$‚ŸQJíÙ\9Sb@ü6Ò—¨_µm°m(ýH—ì©GÖÑŸõ‹ê/ѽ=ÞÆÁ@ÌîQƒ{LÜ;Px.¸/Zs!Ò©T/]˜f²Ìµ £^°oˆ€É<Þ¥îÜ…¬ò·šß$úIľQ~òdžî—ÛK,‡sDþ2h‚h OC ÆD~Eí"¢fR®aBKk¸¡pC!+¹œ~› ªó«Á ìjÞi¶(ù·)¸ØÞË á8kÿašd¥kiis°ÈD„ªâ>Ú¢Òƒ&…3FÁ8Ò2qQ;@)~als#]Ò<žk1ùgŽÚÇ9QÇêÙ>Ðã¸DL—M¥sIÜÞ¡è{H®³ÉE”¼W*Éͳ?Ôè(ÉßžÄ[ËMƒ—;u'@¢Îªð$À4äðj„¹&U˜©êü£úŒ˜¿SÛ€‡„[¸7¨Õí//tà‹¥ÎæïõVá˜Åz´Ø¸k2\3õöB©mS1ÝV¼ ¬g¶=MW lÛUÚíNýDоB/¾×ã„}õ1c××Ûòw%Ã=(öh W‘Ì'= AÛë(£ùØ/;kQsªrÓ jÀŸ4ÃÛ¾tÒ”±–Ç„uDŸ©œªåZJtN¸Œ`Z‘À‘§;/«F©ržÒÕâìdÚV3‚ p̨×dlɧs† ûÚ+ÉfŒÇéá6À„ÝËUE;)uDh¯Ï ¾ôáŒÅ!'ô“?~ ˜CÆW1ȼό(Âx•{8Â+^Ú“8ÑßrIØÔ”›¬§ß+ëj Qù‰µ jWˆ‹tÛÕ¹‹Lâxå+òÓáVPr‚îPÏÁé½x%þMRϯ¤iç·Í"yÕ4ýìÂ*ÿEûö³hTóuEÈdʵj¸†3 âù6Ùɉ+”iT³“ëÅb¤ŠÖ«Ô³EÁ~AÍnoàÇY© bëûÄ;6¦}ÉRt–x £™ëlþ Ùβ¾T9xè~ÏÏWãðÖ˜>ÝQƒ?R&qòO¬3"ÉjʼnN"Im‡u\ K¼lýÔR»éG¯5 r‘:wúNcSõkìY±z5m¹¦ª] ž"¡1‡GÓÍšáØ¥ßŨ-È G…IýnW ß³74 ¢ÏqJL‘ w©ÊŸ:âž(eØm1W(å.pýÏB‰ ß¾ºÄ”–£ç@vŽŠ´ìß—Ýw¢ÕÒ[—” n|÷î¸UrrtKÁ£èã^IVyIè êMqfgÓþ'e” õW¨w…Œ6ä´ˆ"\'¾yê㛢ѩÜÿ óÖïy„MÀÖ&»Ðž˜ðý¬0¨×;¡ÿiP¡ï˜jÂ¥9©ß(hÒQ„IE-e²ÂP¾EFÌvô\þY 8Ï“@5Û«­öÞ!Ÿ¯Èdø/ç#«ÚAÎ✗R$²ö¬ÛÜŽžÁ°þHAYð‹-½ÌÀ (¼›A>K1„ù¦çÚ?T¹¤ìà-’î7÷ä¦UƒýJâsñáeé|ÃÙÿs6ÏÁd0 –í'!´¤U†–Áõk)Q Òk$óIª"Q>4!Ïò OÁR+Ã:Ï+Æ›ÒTbõ 4¿\?ò/WdDÚ¸ÃiÓ:nm÷%aRÑAÊXGßàðuÚÝÜ\¼/”c2oØ}™0•ºÙE\÷`+-,@dþë=T浘ãùh>w 6hÅp ”ò´bz]·>.ÕÚ´Hfl…Pji« ´uHþ‚‘ý¯³¡¥£ÀÁÉÐéÅäÚÊ®(675¶Â†ù h\sãÇd³-ï/³´BÍ(GFgÝ Þ1dŒqŠ nŒjÑͨø9ÐÄmOøÝXÏEÿY9“ïëIŽB:?]ëwy8ìv'r˜éÄŸOv‘ŒŠéìwB:y/Ò6´Éâ£t[<'¹w@ I$0öí»y¥jíQÕ4ø³€v|ÉºŽæÎ=æþz=>rHi"j"L¨J ’ uñ³HˆÏ6úIë7o3‚›šªEe¤ä[K Öè›T ¢ÓZ ðϬx¢ØZy0Oާp6ƒ5¢´7‘?¦ƒÏ ÆDgN°ð—@×¼§º2ÏÝÈÉ‹j›Ò³ãj­¢¹t1¿ÂbEi&‡Mf™p.†=æÌxêc:“]Õ6EwYæ!pÒ.1Å=J»·dIÌ+v¹Ò5-ö}XÀ/©»×ÿb<šcþŒü‚„ Ê+ù%¤³ hÙ¼£}mHölµ µü 9wèÝ€B:½´è â¢Ùº VÌÊ4u«?žR~/œˆª‘ 9Áø«i{ƒ²Ž§–‰]ØäB T*p‹ªÐ9¦ªÓEž[\"inb:{UzsuRRxòFUÝÔ(ŽÆ0ôߣ«†òÄðû¨±×[ô),çh@݆Ùa8&LJfpSu±ºÔ=OÎÙ§ÝÙB謌[Yç²cöpê/.÷ÑŽQa®ü7k<¤&ÛîÞݬýñÕ ÷82u Û$›PçÔƒô8RýñÞ*á‹\Ž s^âHäe¢—&~·Ø;u–ª:´¾s×øå³>-Á7Õ7å8Ãbda‹9›íéõ(󫌧v6:Ùæ”ã“YÜë,U:Þ¬_5WM¼ã÷]K/vf  wë—~ hdœàHØZÆQ æùÜ¿[ËšÿiCP@(¨Óoö ò&ê}äã­Î䃻C_¼ËÕT‚Eâñj$v°•ð²–u+Cë#ZÓcHÛëŽfûH‹®´´îSSc¡ü™VQµytgÇGoe¿Ý@ÊxóÓÈò:_ãÃ9T©–¤Ã¢ìÔB“K´¿µA1– ²2Ç)~ݾrì$e ¹5(šÌ*0† 4>ïѬ͎j]8ü[ûýܘ—î­®îã Úæ‘?-fö|xäO®x¯`%¯,GAšoùìº';Fp^Í‚]èU‘VTò,“¤\Ç—¨Wê¦ ¥Ü¬G¼ ;_32Ò‹`½¥Lõ64"ʹ Ù)æ+Ò_fý°¶#¯á°¦ÿ/ÁïŒß—õÞ^Ø0é!åTi:µ¼4Ò=è]¥$¢ "·Ž¢ÏÇÀ8¯K,øXÛQ0æ®§æ¶cw²Ggm%ù¸ÂX6³;—ŒØ ¿·¦Ùׯ¹XsË âÚga6Ɖˆ°%Ü«yÌ €Ø“Õt”Á*åR€ôsä+Ž<½×È `CaÄûÆÿIÖ"#0yàùñ¦çÍò0éQ ª$—Fë¦#"ú Çåo8§ôÒpÚòq2'y‚¤ õzÁN \»ºÅ5 àÑþkdeˆô0`^„ ëu|Æ!µ<¤½òðú’—Òkð;\ dVS:|Â(3Ÿ(çt>—.M}d䢸dá®–¸ÅôgQNúLFs@¾ŸV^h76ðó=­…kV+eú–b:­xÅ{IØ“^SçÈ›–™T²Q=aü’ÂÌ®ñ¨›+Ñ4¡ø¶þÀ("‡vM¥Pͭâh0a7ÜmÇ¿˜A—°Öl¢Þ_¸C<qÅê”õÂÈþ˜‘‹J8ß×R‡J’â&À2CÞúézÖwþÒ»“ær-‹ú¶L[L@Ùz²tâ§Pqô2…DLBÙ—< åíÖeâ-%`aH¤ÕxaTÚ}õãê®<¨ K*è¤Âæ|{Ù>P3è0Ü0N‘ü‚çõ#kÍñ¶dûf\}»µåŽ7’ãx Uú"d>öpýÔÁrsB%¬Ö>;rsDSƒ’ÙÜKô:%ð^Zˆzÿ7$ØèY[&*“7 µš½å½W~·vÅd»1ñŸˆÙâøUÉ`ýi‘¸2‡fø©¨÷-9Ò»|Sëùj,¨b8w¿îš¬1£:öîñØ57ÇþÖ>wZ»–°+°qKÄ‚híáç°þR¡KÇJ‘m“ÖΊ8øÚ‹- ,k2©–²ÿDZe²òƒ•sÄãÁµmvs,>I¸§¥ÅD:î<¬sŒ„Y^ô‚Íùã=ˆîG"Rfç}Yœ¶?³u¹ vÁ¾T”RnóÆxÑ"à'ŠÛh¥ªuN”ÿ±63›IfþOÜÅ«Çiš;Aþã·ºÕwÍá©íã·Écè—á/¸÷f5¼%y‘ø‰‡¼ÀI(y“á»öbŠk`—õ’½ñ¦ÓJ“µI‰ƒJw”"h`¼'žÁR&¤[ùÜÿl¢ON>‰Éj¸4§ÚºUœÃ63…òç–I½€(cú B¹lY¨°ïóIMƦéD@ÁâªÅ,6.VT0Ãíôe‡ÛèQ·Ñ0Ç¦È ÖO~)¹‰$%²TÍM 5>F¸µð][ÓÍ>>æz˜ƒƒ‰êÙwø(Š»ÍOÌ SªW³J¼»¿ÔÇÑUO±Jwgé“Ñ>µ;,fhÏÄë?QÔN<¹'ƒ ¢{dxÎ É^`W€­YÛP0ôÒ$µçã`G·&²‰ýË­E5OIX¤ö$œÕf Ò×ÈombÊ^‚õâ-ïãͼ åZY™ú€lœfjŒŒ²F S,·”2CÛSô³£]¿SŽ fevÁWÑñ#ŒgßGx‚¤±OÁ‹¦ åpæOg‰ÀÉÙ7PJÖˆp*÷ú—O@K7ÑE»®Óßeyô”Mðág)›Wˬْ|,ª¨4£èã8_ŽFÛÿ™Ëìåcú©£S/̬‚)+Юómf`~ ÷úà;êa^ ÊY¥ -©Æõ{™£¢Û¹0² ¿¢9TåÃ¢Í ~…ÌéG`ÓÑnÊ•¹Ï' ?Eø'Î_1vÃ3ÍFyÌÿ²ë q,寚wK¶²ƒy“«Òñmyo²G:2ù,xÕ%”/ GÄ6òT[.VJ>øW„-.؃>ÏPhꪠB+È(Âñí%"M>ª¬½/ô&V(µrb_2#y¸:•ƒR=‘sÃF¯xô-²2óž ¹mgìº1Gû÷‚Ì9÷Ék8arx'˜1Í–ug ÍÃûi.Å@7"UGÆ 'ÐÈø dxyRÜXÔØ_| uë]¶¢Á>×ü‚*ë>åGUƒïlôïfm ç³!Ê/êî"¼Gݪ΢¯ò­í¤Ja¹HI•J³§–)ÀÆzZé³MêN“Ѻ‹º­[ç«ÿb\îü ùìb柑f¡‰ xçj,Ç·(ÓlŸ€ÍZ-¶ô©¿“ ù*o4~[Bx’“ˆ=ŒÝcŒÿ-ܧ¶×ÓhŠ©^þâE¤"e„E†P]öúLÁ¾×¦©ýÉR™[?ü):5—ï´Mv9ÐçÔÊ4]ïÓ?¾&^`¶‘Þ6ŸjÙÑ%ÞîhHÜN4Þgí³ ìÓhèò•ú90è‹)¿…²òz” ðרYÄ~&ˆðVÂ-L‡3qUN497…nmFhâ)»¸Äp„+wÏ5]±h 佨M%ÆMŒ{Ÿ†’·t›¢ùü¦ÎÀD¸Ðôªp¿h+Ù;zÐÆ^ÓÚÀ¿ÇðÔžOÈYnÀNUå ,‡ õ³ŽÌm§S`xa¸•þƒÛ¶ò ÒçFW­+ðøO¸vSs²DSƧCìX=¼[Sý‰™øx꧘™îÞT:ˆã^ÙAk² |­ÓRDZ«V篡ÂîÎíºƒJedݳ}½¶ÍRƒÙàò+È/:¸ÁÌh¬5'àtZ´èFuZßT8 p>¨˜>ƒ¹ þT”;„(iFr–QUÀxf´ìš–Ç&/7È —?<Æi'dÐ0AØO ˜{õ¸†[¬ì92ÇÂs<¥Í×ý.oúáð²×î<ií‚ʲg˜ ¾|E|ô~`0²À¾óÒ85›c@(UwÇ+ÆÛ÷bHd~ÀIµf…2â¾ç1º<þqG{2Cä}†•,÷ç éh/Єò )·qÓxÀ‹ãyļ==t£ †ûy&lx»Ø1§öº.½_¶6°)'2Õ˜…‚³;!î¶õƾµ¾Òr ¤cÎ"µD7D I–&ú‰’©„¢õªnn ðß ¦Î¡ãZûa¡ >þ~p ÆÄÏ«+FÒǸß~úÆ™ÿ”zòžOªÙü;öJ;¹ÒäÎ aªN’パ¤’|#º8˜¹ÏH½ÑJ N¾þcEåßÖò”§låó¨3ê}âlxKr5­‰w_F,)¸{qTFÂUI`¢›¿‘M˜˜Â`[¸ôhõð±4×ד•7)Y–j>_¨Æ çC@WJÅ'Ľ«Àâ×Ñ_ÍÓ^ɪ0×Ï ²L—j¸ó¿KHQUñ–.¶3šêS%ÿ*£`Ô.Ùè”±G¤(Ñí÷µï@~°qbé„ÎYÆpßÒRLJÈCpG¶Ê;ê™Ü*åf¥]Wˆ;óÓZrõÖÐ~ˤÚi±ÅñÒÏ´f>Ÿ¬¯Aø6ªh žºQ"IæŸ4÷@ ±…=8 m]$a.¥gá`ç[ÙÿBC¨ÿrЄŨE‘ãðªøfÅNq!“‡+ÝPÒPJpÁ¿g€¡ÃäÝïëùN—O™Â4xK]2×Ù§h¼ N3i…ß•«xì0þÎ- z£Ÿ Á¿úL‰$L‚9`²hUÈõXПÅ…áÏäªnm“$xIîå–f‰(¶„Uܤ»ä‹ó¨¹ˆòÜ Ù›É(ÞK•’¢˜ {þ®±S*~S£4Ü`ÔÕ[ ¯zºˆbÝ>kÏ|ãÆ"ÌãQ&®CífÉ{D´ß¡,¢ï|YµŠùÍlïÑÿ ïF8Ÿª¤`ö™mIºÂd&àdæ}GmD£ÅIY*Áó·…=þÛ: qÐ AÁÄ\ ”¹câ6g™¡I #©Âµ 83%¾a¹ÛxGŠìöAlmlŠI4éáĹŒ¾)ºÊ\„L¾‹ÛHG¬ Øš™Ž³Á±?`líoÁmw €?kêõöàĬŒ¶†úÄpj²o-ÌLú\ò 7{—è–Ø4ðäœÂŠùàœ´ }›Ãt±}5«áíNë}Œ»:_áÞ›¤Ü_÷Œrc—TG:V‘~:z“ç ²„æð%å„ûöŒ¼ÁàOÆ¥¶; deŒvŠ%™;•ä ”^C=w"Ilds.ç «SJ‘Ä.¬1Áu^L‡Ç†LöÓ4Ö¥+1„w 5ˣˬåbåxý"ó/Îæûöųº»î»þ†Âhu 82,ùs“³P·£Îã5QÉ¥’Ä-Õ7$4ó™=wmFÄa ?Ú~ ¥ ͸æòoƒØõ†þÙç£ÁnÉ™sŽDcAÃËyÇÙŽ™R݉5ÕlÇG!(꺑J4Ù§kŽ7¨•Á?™Û«ÃÃ0yèšæsS óyÆÚ50hXQÓ‰šÔŸ_Ö÷[t…"vF©ØUŽÞŽ»È[ ‡Ä#[=b$ûx{ä¼ ¼­§t‹e©+ÌÀ’‹ZdåÏSp£s·áLBZ@2£õ´=€‘ï`6 ðu¦°Doë6>{“©ö¹F÷ƒæãߘ½’2|Š™ŒÞT_Ý*ÔLŸ9Œ@Ö£øè ‘jØQ¼ŒêŽí?¶M»ik-Ï¢¦Òþ~e)²€žCWKeC”¥êd‘evµSaôì’Fn¯"úÌ.f#³è4çKeJI;Û/@t$ÒãàŸ©ìÃfð§Æ;¨Ûéå-Q±J#ê€Òöó‹àixÙÜþÉ´ì«c!¼ôk!G{5·…Ø=•íBºV¼/_UQý¾Nwê`ëê´¼‰(£ÑGr(†fÎÉþx‡ÍïŠ{»oÉR‰z«¤ÞåÕ»²ÚEzÿbÍâLÿ>f_ÒQ¾=’0L¹¯Še¢è4÷¦#”Uf¸»ý0#~› ¢?#õWEÉHÈ0jD§g)v•1°«Òÿ‚J }õmwС‚&wz#‡h¡Ç©“Hè .4€&œõ"å™óö8gð,vz.´îØÖ*qu{ŸØ ›ÔCb¾}Ø3Ãíô°‡Ûèá·Òê/¬ƒül˜‰´ÍzªK†[Yße˜X hå³FZ‹S¢H¢‹ÖQ[h¾ 7¦qíI»{‹ß6}›7RËÎ?ïÍdõ öí§“uWQìʈ0ž2'ù››®…Œl‰ˆbh:›\lØçÉV*W‘ œ+z— ÎÂÍ*­*×í‘Q_hû{…yÕNŽ,Êô¬å>x/E’V=øF Öaz ú”ÎŽþaæk’„Sx ä;,'žx9Ù”"ÆúI4ú|ß7ÎȤDšw?<8‡XfAH³xÈý·^â7#~ÀDÞa)‚ËÅÁuÊxË*òÉBš§‚x2 2Pƒ>~ÑåÓâ¬ÀŸCºÙë0ÑëhàÒ8Éÿ-.€,`™'8ËP@Ô¼lÑÛ°^F¦&RÙ É®DMù¢Î_ö³ê8‡{.p_b¾k˜ü Zÿ67?Œ_‰!ïûL­ r CP¶Ëòÿ¶¡ÇòØ·ÀN¡±8wc(¯öÍeÛ;²`AÓm­‚ú¾É†Š¾)Øü\C1bH¤ƒ ¯xM{¿d˜-R(?XXwðÙKk(À6Ðm,Îé‹P›ÅxŠ…7V–ö!ü}eãõucýTMÎl~1ÛÊú^±Ç=±òyúC62lÓoA´ÒY¶gh©M­0"NAXÝËs „õ<á ¾½4 \Öàfƈ Ðií^þI$æOV™­Aä{œÝê”Úw_žÊã?¨f^€ë÷8ØZ4¥S²€óbì,*4Pkþ~.8UzÏ¢MzüÑn\η’¹Â“©Æ½fiÊ&ygK~?¤ŠÄÑ’¼;Aâ§ö³—´Z¶y}™®ÝðÖ+Ò»®g×…f×]Ó+e'+5¥åÝÉô|ƒ:Q¿f þé'Þœ~ó>ùYÉŸŸŠ5òîêücU%¥ë‡ïñ@¡ÚUZtï?Nø&A=½³““`dPµp;¶åˆË/iuПÌÄÎÌ£š•+\ŽžTAÿ[KZm =™ûk4vWIáI‹Éˆ`/ì\ŸïLd¼mWŠ#šUUA`‡°JI¡ÌŒÉ”§@¦“! Kd‘ºÛç#ôÆØÜÑpKÉ(v uÏØé¯Ù󖟺)AL¥óÓgf>‹ ¦4 ß7‘Áö».”¼­±’€þ@Õ‹ZIRÿ‘<G¥¿8(çýV °4·Î³EûàŸ/¬Ir¿¯€) > P'^Ú•)ŽÚÝ<3iTäôÊ~¨‡8×/^æ¾âôʼe« ýÕWÍÁµ~ó y†$z³+;›™U([&ÿ‚ e’´÷‡a¾p`–³c?ô¥é@´µ.ÝsS«º+z­8…ˆ £LÒ4-‰aPk` aP($¿ïÙç£c†Î,ÖM s‚Ö¢Ö$îC´dÎ.‚9§Wd\OˆF[†±G³¢ ÜÍÆ× g¢ÛÇó²È&n#ö_¨z@¼ò©‡n>˧N˜p(Á®×_ÛåNmwÆÂ×/çƒ?nb¸WmîÇž‰ŠPQÁþiE~ÆV.AƒÞÃS—ŠG¢Îáå §¥7ò•ŒogÏd‡Q¼«…IÛ‚M%ÀkD'º3\0KoX;Ù ý¶Vïí0ËD.¿‹°­ü¬}¼°ì¿V/-R™5qâ¤ÅK/ Ñ ƒ¤ŽÏU `œQlJEsE|·ž{§ô«Õ™Ôæ®/ ®äµ†ë½kñZö. ÂIÙç]LSNýJy¶–xŽüJgY\1 ?Ç|³ÎÇ¥A•ãeçeÕDßqˆ2¦¬ˆruÕBØ–ð-¢µÙ·žšÒrÖ´*Jê‘ùm—'ÞÚ…zí¯®¹"µN‚±yùvŽ µ8ëê¿úhuÚVP;ÇÒè5b˜!ªA/‘âa×´XhÙÄá±öBF/®çB5Ë´)¿mÞÚx:¹æÈV`3Òy+Øp ¸Å5Å'ùø‹Ú^pX%ƒ²Óudìî™=ˆÁÆF}>px˜”+îU—CY‚b˜=2ž„Ô'Lô§ÿ<ɪgÛ­gÌ\Þ»Ú(yØ*‚¦òÄWé3÷ærŽ¿wz§ ±FûÉn(µ}ÞQ¼”<%ø)YðØ Œ¹®3XÙô+îÜÑüNâ.é2õäwåÙõ Y»ÞYZÄšq•“ù¸fÄgscŠë…»šŽõ(jgÿoî™w÷+žäå=]Õâo0ºBs®+CžÚø•‚¢ÒèÙéHÜŸH·†ýhLÏPëþ›»§<Ÿ:ûŸý°åuïñƒãâyŒ{3÷n1^'*Î:àE¥-Çþ¾ÖgÐçBªŸAŽØq0gîí=@³€"úgï9v±õœôGB§_oÊã…äþ‚²æïÌ#;øL½»u"M†ÓDÞ¤|7<\R}1$6 ¶dŽS¸.|°ê¶2Ü#nÄ®à. ÓW_6²@˜çOÈKŒÞ­¬‡ ,ˆH1 ß–T ײ! ¥Ær%aæÛòf^¸¢—µû¤\B7ª} JŸì(ÊlQ2óe©åþ+×e[íïÑÔ¿ɬ5o‹÷ in8š—·‘Côx<ÐTáV4 ð åWYtó ·«+˜©‹ýä›ßôÁ-H#2J5û# ¤5Oߘ%K`’‹+:Ƨô–TV¿q[±ºƒàSÁâü¹%¢±GµÄ¹[t™Á«x ŒÇ ®ž~Ý†ÇøŽé)ÿ0œ’2é¤ÒTIâ+n¬¡àNf°ÖöÞBØ!6'â~¬¾óÄKožŒÐp¦°J»4‹YÒž¶0§(5£ÒXÞ¿>j‘ìåÆJÄcoå-q( ©#l±óÁ)M¢´ÖØ:z£­¢Ô|ÀŠÐ.Þ^7ÕëHbu»¯¹ï¡¬¾J¾Þ]Rìð1À¤Bó-ü´03,XRhä*ê=†qßÉfô3pDË“Ÿ6>‚¿–°ÑˆÈ/ùÂÝöH%ÈcoŸùØÏƒ1­MOPáù¹Zgø¿pÑ™?aA\{¼›ŠËmØ1‹¬ÇO/ŽyÂbø*aI#;®}/jô,j‹ÿZí“2^îJ3UoÛèþã¤X$|L?)LXyÝ–ëM•.j|²qZÔ°ú ²èné¹³žQ?‡º]¢¾ Ï-ãELZœº>ÔïRŠ6µBûüDP¶ËÒîÕüðÔB™W*Vw¹·I¡‰/ˆpîvNb_FÚÀÅYò 6³æÜÙ°d’>9U·EÝØÇ­I«J$S¼®æUaêË-å{¥"| VÊ“û³}£2ˈ‹, Q‚Ô…ü¯BŒ žÅ|ö¢ˆÒöÜöÁh@¥,`rcw6o“ÀC£uX«y©œxm¿(߆Ÿ K\²–~𯖚ÌLÁ Êgµ­®œ¹ƒ"ÛZžÌAì­å¨T>êjj¤ÎœÓãåVÿ'ÊÝ—=”XÝX¼ào§y“¬âÉwðÍ’²ÏF[À7ØáúÆÔËSÛ¦QûGA‚}|ô CøÎB"ñd+)m©ôÀ*ôÝ’U×CMu¢{V¿æ‘Ù7¡™·ëíþHÎ$u/űfK±1ƒeÿ#Y9·ÆLcG2×Êó¡3G™üg>4ïþ X8•Ç3À\´Àã/;_q2h @z/ºfAÆHtên£®xzýQÜ^‡_[]{ã(‰n”Qék¥FÕ^ø]ß:|ù‰“×P[U¾_5>c[xÉÃl Pª§™ðÛõÛKzÌ1xê—¹7 (Ú-™nIÌßÒKÒR%etV¦ÒK'E]á패x7íLZ&ÁAuuœõœ$Ä´ðšß˜~J(½Ôhžg^>ìë:.ª`}`)›¶_4н®uÇáØ¼~’GáÖXÈ+ä°¿í¸ØÚv²ÿ!@Ruä(¤Ô]=Ç”À'Bn]kýHFYq31ŸÖñ}èÇY8BEl«W³EHîñ;¶þ;ð””Æ ÝõmñƒA>rna{hôã\I>Þ •¾(>Ñ’57.rvÄ0˜'Uì£ÐN—øè-T^C×®q lhTŸÿ''Z$>ݳ1¦ž,Â'~õH¾ö+b*fæ°S[ZkŸ ÙÛ(æÜ{w§)/ŠTtÎ&»g€‘^Ól<õ¬R¤¯cÚü=°ªÒ%Ç "Äôf¯³Ru'0óˆw½ …íJ{³þ>×!U"ç>jD:¨þ27@ºPÿkTì’[G¸ZY” ãBùLz&) —HÍX¸HÞ ŸØƒŒHX_wó1\ÆÀŒ8H7ÿy.2gv¶G§ýݰ[Q¥p*PõM¼¹Äfwèf"±éµâýgåÚ·9[8¶QK¡EEXæ(#Øç”£1ê­¹³ìxËyMàe^‚B+Ÿ!Ýwñ£ñ٘ﰣ‚øòæ‡Ë–XÞ%%=ËwfË1q ôIñ^A¬9‡žöc÷¢¯>gpwÅuØdœÆ×xIÉÞgõCHÒ–z'{€ä÷f _ÿ#þŸñÙ„Á@)Z’Uaï7ÔÀOU{¼’¼½0Ï.žaemiUp\žÀÞ¦«¾+w±V`ÖéÀv<7v˜N!¥düí~ ß%× XAQ)¸j)ØÄúVùá¢YÍø®Å[ €šî-ì…)Ä‘J:ub1Ö@$>‚Bb«¡ˆË˜ß±¤ÊÚÚ‡½„óIlÓø¶ô‚±&AÙ”†˜E è ëÆË¨¯]˜,“Å!/)¨¨×•—X|ÆÛ…?mŸ!îö!ù¡•.ášóÄ·žcP‹À‚=Õ’ß‚¦vŸÈÈïi!·k5̯i«ž`&P9…£æîx@ºt¬Dßp¤_Ë,kj÷úU×7’ýe,ÝàFc„¬°@†É¤ý™>Õ‘rºá”áF–¯ÌÓô+V{:Ìy<Ñ58Þ䯪ÜÛ™Šø^¢Î9=-)¸^=`|) ±Ç…Û  ÀÈÆ•WÌ(͉Wý•-íÑ9ÙNþ³ ýNÆú»sßÛÎÛ¤v`BöIÖ¡€žç:«B$÷š^ª<艹¿Ÿ…4å€py…ùõÔ«srcâÖ[M„(ø¬{˜E¾ñßeG"»44Wô†Æ¢¬Xf‡úž”äG›mù6ôJTžÿ+O|•бï,ô;Bz¦ÅóOËèè}ÒlãÑȵo}_yoÄPŽÁ…Í'çÓ(Áù¢Ö˜Kþý¦;N³€~L\ö—hSêZÈLƒ˜_¾þ˜ª%±Î 0®¿fæ}¾ëǬÛ! èL#ýè$†Á‰ÕV(ÈÈ¿‡p#(/ÄU7M¹;À$ !#¨Y ¡óCÆ¿€.Òg¿ÒK"ÃÀgZjáyÜ! õ:=lWŽðÇ»$úÊ0tñq8(ïIHOÑoɹȤ(¹ÈS!ÀÐm™Yót4óãÀßÂo}ѺªÃœY¼CíútË¥ ‰ä¸Фq!Ü})j{ãúáøh°)ùxGÒ”}}/Sè,œnاÚd€ð¥L.<¾GjôÌó¼´óÀŸÎ Ð`ÞGáZäþ‚²é Šü„¥hÙ³ŠñaED¹OS6ýÞŒwcxúk”é¾Ô:èÿ5 S:Æ) s¨à‡¢ê Çß’a¢=å¹µm3»åKÈVýÚ|É37êµø¤ùÅP$B#,"1ØS¢n”ò• ÀùÐ=R]ßûMA:͆§úøäéÍ‹(‡%¿Š}·ã?.0ç leÒüDl¡£žÌ=[vs«.žª’‡à1ÛICxH{Ê¥dU¡Å|}£¼Øža&F奜äú~C‰æ0t<vP;¾m¢á; Áö ö¹2—/`ÌÍÌËùõ++ÑC–„âé}å=L‰ns•Õ5©Âß3w ÉJ ½UB¬dšÕol»#œÿWYòüÄð7äs ÿU–®›dbrºñIVðñ+ɦp«ÓNåó89• mó§Ãß–Ј 6²àÿ EZŒÈO¾>ÆÁ¹uW1ž™ŸKªË œ“aké\¦¤n.s§þ€"^ª+Að3ê03è×['5½®ê¦{bWXö¢-Ç;W5CŠùÉ観ÐÂý­‡-AÓšÀ"éÃd-¦©žV‘ X²¥#ÙTà–™á½H; ¥Qt¼Sh6AéÏe¥íãsi£ÜîÓAuÎt‚g³¥c³Õð¡Î%™ú ;¼XåJ· ÚÓ9â×¶ý°jTúe@ÁÀß/’ùDØ@ó†qxèfðK˘ð¡ ëå“mÃÏç¶C:OÍ®TØÀþz:´Éµù{PÀ£ ’ãÈyRúk©—±oÔD•~•М}î÷ÃüåÑu™SïÂîYZÁ2FüéýØz¢a s›«!؆™Ç_ŒÌ[•ø)ƒ°X.n7¶L’4í*ß@ƒæ\`2~Ά¡ü1cážÌë‘LL‘X„ŸèÕû—õçðïúû}¿‡¬åöú9çðôþÀQ›íïÇÛÝuööÿ~—wÛÝø÷жFÇ‘GnΦg”µä@󕦃¾"{öĤëö¾×Ä›-C_ŒËƒ²0E=ŽúJ‹•ËÓ²=®>A¥égƨté§cNç/º:ï%\í«¥ &E³fšïŠM(›[´¢¡lüž‹ƒ\z“‡ÖY`ƒFJ¨ïÓÓR½-÷)²±î¯QwâXFÁúô,j쨠·¶ÖšIg!l¾H'»’œq$3V ‚‹³+Ã(¾>O]Îïi­†"Vó£@fc×nÓç=±42އ¿«\âæ¨N|·\›ùA!‡¿ÿ*Èq×fMwÿ@4W-ª¢¡.²a²ÁÓα%!ÿ,£t‡®äKŒ¼® Ïõú{ Øw€Ý-V´ÞZçe‡Ì[¬/ŒäfÁ½a·IH—iD´SàOÜèx¢È?4ÜC+üS4Þ<+–¦a®ÖëG.Xç»z£_'‹Q²¤èvaÛáî+;ìzÖþï÷ì¦ÕíJ¢dg1áÑåž¼AÆ$¢6+¶Ø>M`œ‹q—[QìQ'A´óvÊÙðo¹ÆUfìñ¿šr2Vsˆ†ýK=yÖ;-aÀ‡« @®9ëŸÆ9ù(›«x©1¨$¢Ë ‡…5@h/ä>vs> w„eŽR(åJ¾ûGÔ\Øë—»,ÿyâü‘BÆcåHží-S$V4– ãÌ,_¿{œ£®®ATÈ»qų™e@:†Ìj£ Y—ÚøÑ‹ðLþqðP™Öµ,£G°]Zk5X;Îjœ²»DZ~¢;2¶Rqôß2¿I§9 YÅ<ú­ AÏFÍÒ¾G­ú¤¤}2AV;#Æ޽]QYóFEƒÌŒb Ž\ƒÙÆW :FaðÚCNCµñUÒt¾áĺS¨ã˜ÇN–qb¶¿J0ùÄå t´ža8È.p¬åØjÂj¢a)Aï]E¬R¨Ü‡zHÛ“áœSS$JcÐÐKð”4ËC‘'!mQapRo¨8‘¼Àmv&•øÊFÇa¨úG[ Bö¶ï@šÀ{pn/Õ”ï q>­f¹ Fi¯a5ªEÒšôœL` $¼"Äaíp>†ªúûpuBDUå±Y¿j@!‘Â`æÕÊȦkƒÇfè=IóÜ(Š›þ­+ùBoì•X¾×¶LÀ߿˥n¦IʆÖK(¶]»¼{‘öHØ [jw¬Hr›ÒL*ãL¢¾ÀîËfÃì¹áòr±í ž2EÅŠ‘r~)† ÷S¸B†ØÆ0¢\ì×çÓ±ì‰gB<¿÷ãQ;-¿‰¬²×gÔ|þdküÜÕD:•JÍ2~ú{ØêéÖG\È鬯WŠúç|ßò‹zÁa‡½qEp¢h«§dùñiÄY´÷Ò9&¾›`¡âÃÞèT¬]³ÇáœoÑÅ|øAuø/Œ6þ1uô‡T¬›Xt¾\¬³Ì1\ܸ?—޼ÁÙ°”ï{íS¹lÈ®í,c¦ßzÑIägo“x¡Š€&„ Qx£n6SáãeÆQÚ˜1ÏŽOfîåøHcÁqBÞÕ+šešÐšâFi°‰Žo×CŽ.š›…e ]AO²hÔÒö¾j²b}Ýä$óØy€Ð›Ù˜Cý÷èvXAïi-¼·N5]½¥‘E=f¦ª(FP·ajqJ0ÛL7y/'ièüaÝå†â+å÷=O¯%Òïô†a^¥BçPÖZöÌæ÷qù§ ¯ïç%Ê?öø¤åù‹ Ÿ”ø³°á¯¼Ì8gœÈ(ÄÃȃ¿Ù E» Þ~ÿWÄX…r%-C×É+ØëÜ–J>a—t†úù¬OÍL…#“Ô:¾}"è*ÞXcb3;‚z”Q ¶ãîø©BåôËTÊÚG½¸(qY¸T›ãýˆŸ¶:¤úqüàèé¾*C™Yö𼜠ëÍ UŒƒ#žô½ÿkla®¶¹Œ?ìfȳCG§²¾ ü³ ¢¶è4øèsµ·<±ô¡fBgHû‹~ÄKweì ×=B(‘ VbØDN£Øè Æa6|ù¥~‡€¨êAê‘|XøTë…ˆq¾›I…}ºŒß}ø}"–îS’˜üPük¯A|êË"ÉlØÛó"ü•½ê5¡ÖÄÜ>ýl¡—57(¹ï÷‘·È;½„g‰¾û±{§u&çu܃ëÉP#»8´!œÒìOjýed?—y€B“,Gý.˜ ø–(ìں߶OÅÞp^Ÿ°üø ÏžuLñ|Š¡ntZh÷aØ5]k‘UÀ55ÆÄÞ*óHÏߺ´þ¹â<óêm[!ä–.H<£†!@8Ôãu—8ßMçüEÉÐxå7oé(vðœL²ÿTêÊÌägt êšø\Î;ªÅ¸a¨O©H W¢ˆ¯mÏc§J™“ã ¤êТ›Ëæ›>íŽþÁÈ†Õ X¥˜Õ3Hf×I2ôCj£p“ôÙ.4:ù–eÆ…qE¡SÕ‘kCuô¡†0ëôÕÞâŒg5&á íNÓ•»`›ÞüeØ›6 yzV–Âí:,ßÚl@túOíBdr0¹T-<Ü<µªVVØÏœ>¼h}š  ÛŸ0àDdÖÅ\dÌÍþ8)A$å‹GŸ,û¥ÇÇqàãT ZÌZ´3‚ìYšgè·m¬žoÊóM—´ºIiÑ"5ˆ:æÏ­‰yÓ—gA-¡f§9à™p‰¹•òâÞ¢BûnN€ÆäçÅ}õÀ ÞÝõ†qµã¬on`‚ôOiÀâ|—Å—Î8ª¤H¼ÄçSÒì݇ȒCãæ¶ 6T2ø0@Ï>øºxâ1X!vE¡öññ­«Æ¢9V1"륑|®fR1W›ÇžÆ©u>©›Xç, /ËÉ p_¬©QTe¨­Èjƒþ_7Ȉ' Ž\š@LMÐ’Z‡©á–Þm$Û­<´ÓŠ ðÈ.‰ö+e)ÕôdŒJ‡¡= äŒôXL’1p'õc¥U¶ xÌóé Â@Ã0ÛÝn(“ôìüÏ‘6tx–Fn¿Wãi]©»a¥h ÛÚÜ9¬¼…]DT~/ÄqjR<‡âìàÿ7Ñò›LkHr9/‘†:”ÂS[&3á»,‡ºÚÛzÉиñDðNÚe“ ÏmtYª¡$½ãæ~n\$’i·Kdfn~¤m®J­âu\ÿlÿ7ÔÓšïnIVõ’ÿ§A²2ÁK‘ µ}a౫Îè‘[³iätóƒ’üð¿¤ì ±ˆç"!ÌÐÞßo4>òü˜s¶Öà©{iÛÂà e3J&‡ÝãZLQK(?SÒó$WÊÆJyϱ"çkj”D€™¥¾ÃP纴åÓDÖŠè+Å#è ö²ÖsRÍYÝ€˜Ë{’àâu{°ÈH¢F1÷¿NN!Ь0eý)í‚×Ìñ| ý;wm¶a/6Þel=\1Ó©¬Š%t7=~†^ñ´ùQš h/C®‹ŽL#/§Á¿LƱ+滋 ¶=á©—¬mò£&]¿ßÞjLSvBza(l€ö¼ÀÓXõ£ÜGõ#éL þNÁíÕ—º½ë'cÙ¼âDƼ8W!L\¦@3ØÁˆRo¼mt,ü<¨“ë’ñÆNºYÑùRˆ¹ÑbGAãša=1`‰­ÀP—¬Ê“°OlA:üH.XOxg`³­­ÖL³€­è»ÌúàÑ'AB l¿<ƒö#Õ^ Ü°[*Ü®òIU#¼–ûTvîR¾ÐM¯|ÐÉ<ŠÝ}ñ…oÙBy–fàl:»&ˆ¾Ø²Õ@°5yp/z8+ãnÝBÚJRX+± ¿#«W³æ5m&‰¸D%wT€çDMéW¶GåýúÅYAÞØÌÓb±‡e|FZóT„wX& †ë9̳ž³d\©UQì–†ªN³{ÛIrGÿ,.Q«œö»gS~â• )Ð6õêõš—rB_!Y_c*¬Œ.–*­ÃdÇÆ £Эîb)6²bÁŸRž·æuH/°µ%°Ã¸0@žÇèOãK¶*• ÷2õ ìÊ*[ŽYÈ)9G >Í1‡VÎU•ØjÎhö=+ÆSP\ºáè„KïL K»í2V#?òÇvÛÙålv·ó¢âeí)ÆØ²Fàuò]ÓÖHȼä‡þ£ŽƒfZ¿DÇ?PúØWºªCsÇfÑëo4"OÀ.炚ðøÝJÏãFñYÈGÞKížbïyëµÄ5C8+'Œâo=éÈp?±aÜôD =Å$¬i=žQ—Û^©á$bàHZ –qŒ‘oÝÕˆüõ›ñ‚êh Ãx^¾¡L럡b+ôôÍ—}žå¬-¶ÉÓ€v ïE©¹ló‘¨V’²À z´ä–»j"3#„i£Ži_ï_#+|j[HWp:§»rA§IÕâŽPÃ<˜ô=0D÷êã­})ÖßæÛŠ¦m,ÚhTÞ\¼ËKµ!PSR‡ýÝìÄm“å¡U4NñkŸ×hyE1â¬BkF‡}Ȩ»~ac|J`5B÷?6|ÁòêÍâ*™½ñéœÍÀümÌ’T’=}Q£ü‡È˜Íšsþ‘1l8sM%¢ªÁó\b%/5î ‡¤€),l^æ‘„h/s EhŸ’-"M ý1ÏeÈ~¼,S9Ø™PÞÛ<“ ) 7„0<}¯àŸ+hh^;? Xƒs»{¨Uœa<9Aòtººàž™¾éˆ3×úhŒbùª© ¯Xbiy€lka:õ‘Œö\œÑ.f›`Œ@oÞ`øÿ6Ÿh1%µ›@†À#i?s‡¡c0ºhÌØqvJs*ýöSºNr Ž…{÷p‰,ˆ<"–î¥Ç„kæ“SvR[¤—DWà†G¦!µuz!½ÏüÉ1ƒ .¨‚?•Ý+–ø· Ÿßãl¸Éi«Á–nÅŽúJë­KÛ\mœßPÃŽPzášØ»Çj=tô3H(ÕCM±}r+~8lÿ~ò$b€Ý?Û>I*Ȟϸ½ú‘ük–ëreïXå@Ü«¥3"ÐZ_fßYŒ$ŽUÇ®¦l¶þW¶R«É‡è—ðAìÒÉös›LÙÉ8ý£Ù¨‘KŠ nËüË¢#òtg<â°­’{Ç!¡õKQ‰Èf—Åœ ÜaBð+pd¶q [jþã!¦›|}Æœxؽƒ,ÁË)wzý«@a+ê4NÅ•õ*$YçHcv¨ê*Ù“1•Þœ4`²’H迺äÏŠòúï¦=©¹­/È6Î¥]DîIц*‡¬­å`Z[Vªrw µÑ0 yù‘×$¼6‡@Yþë¢ê¹6ãa]ÕVªH\d ¾þi¸ó¿È¨Ãj”3¿M2£ðMÕw†æ‘ŒåÁv ÀùÀ‘¹ÔNšYé(vaîvcË8ƒ¹"Ë,ôá˜à°t…³´nâ™f›–ÀÿjúZø÷ œ$“£Ã Ið%äÕåpäâFÉö+~œD[†X™ ÉZ§f´0«¥8#;ŠÎÈ7¥¾^0ÕOÄîϯðFUÌ\ŽÉ‰‡=l²½Â£ä…uíéF¼PioTxâá“Td•68²šH œ5ðŸ7½*ÜWn,o&`š ,FS_CA[`,%à¢CḀíËGgƒNc‰E4Q[ ßåvìÂSjn‰¬’4¡œ±ÿ8†cóæCˆýùõÅaðíéoTŽ”}ÇÆ3·-ØÉĶ#o Ì(@ðÖ¬]J¯£lŸžŸjU_ ±¹—g©E³LÀX¢…s6 ^w>Ùæ#4¥r‹ÄPf%‹P A¯‰`Ã*t«ÂÚø]v1YÇŠð@_ ™!Íáõ~[èÐìÊiqXN½é<Ô±“Ì––ÓÅ1çigHáS²»š¢g ˆ 䬂 ¦1ļݨ¹Õ^{óMG$~¶¨ãfm¿€„;º·‡Z«¥]—Zä¦b³¢\ØjËàý z«ÝÒ ~«Há:ãLº#¦C4±£<@¸´\Ûª f Š¬ì¨–_Å|õ·1vR+Tœë;Ú\V2B/‡—¢êvzƒ¢ü6#˜yé—üªF÷ÑM§|ICýP®/Ë€–<¹ÿM<›×ãÕµ \±áa»hã]ø$.ŒþJÈuMÍÁ!ö͹Ïq&Y¿^Úê7úD–Àê‹°ƒ¤ŸàOèäºþ£Qz½#äó…é$ŽžÎ߸ÀÛÂæñyÓDã0o¶T‘¥­ÕyÀÇ´Dä)ÁcYÃu%`†›€óµt‚ÈUŠLkb¬5¨@Ì#ò¿;ÀÕX´4@ª›sTÍsŒ8]›~•SÕ×L#èSw’µt”6­V]‹¹ÜíÆÙúu Nõø‹î1øQî…¦Ž`ø•6Â<õR”ì cˆ/çÐéqM²Ò1&¤G.im[çJYˆ=ds~ÝáŽÕÍ8_Û‘øÜg¿…¶¢¹d!>ŸÂãÇiÓŽYÙðšÙ0$!Oá¥ÚªA>«æè„•Ox!대óÍ4£jêÚ5Ö³Ÿ Ô—dª!ï3}ªPKS‰üÚr36KZ-¬G(ÑéêûÀr‚ ŒÛÈ­q8.«±q²“?~=Œ#'˜Š,ï’b‹³ß±‚šl²þCÌûcÓq9]]n´ûu•³q3Ð<‘‹ÿ1×”‘PBtÓz+Zþù(6>¯7j¢…vÈ^kŒÀƒú ¸YdÆy„XíDšâª HíIZ-j‡™°íi*Jfp«öòd]9Í8åÒ®C ?Ë'Ô—ñÊÕñغXR¼pŠç)€ÜR¤Œ*]+¥ømÃ3c³"cþo€™ùêÒ,° ß×Gøe|Á訷%¨iAK(è—É=Û]¹W@‚_Ul`NJÌv³ ™šsŠfP©k䲜/XFWÇ—óm»Í( äeÑœÞK­«wSq8 ±½CgÈ(¼ì©CÙ^²äk}Æš¹ÑEH,yY÷ðó=ÍióL«ŒtC7Ôzy“ÂÞ¥çþ‚0©~â—à4œ–IðʽTCÏÏÇø• 8–y>KÐJ¡5ÉKñí7úÚÁIS‚Rü*x{çx'‰’i&´8LªêûCÑ~a¡¯ù¬|\ý_/Òe–­JpVÖlnÕG.Ìj«¼Y6 ö'Úy osÕ|6|¬Í…pǯC}fõáóX€ì—ãôÝ@¹¦´W_÷¹nÖB®P Œ©ØOëæ ÔÛøÀ¸¼e_‡Œßö¬Ü>ŪÄÉ"uƒ®áþO|Ç!Q@7ÆÚIÿS'M ä” ;^ùOë"8š̠p,…QG YL ÝJ›áòuZ¹+x¹+Y½bÕ§º×Z.•æü²ñäQi¤“oÔ߉<ìü&UVî©ÇXM¦qÃá ¦B«C1;½ّ(ïD¹· ¨CJ2Eü¡•›¡PX5‚„7+T[ÅNj¯ÅÌÈn/ɦ T;Þ‘®¨G,ÎaYçQ4îίÝÒ5ùô?Ú@ã1Ùù÷È`ßå2L;P9£^Xþùš^Üe†M1ÊÉá-&س%öΞcC< ÿ‚—6! cÂY$ˆƒaÒØ^n…ñ« iS3à4tð†© ã9ñPë÷dP÷tBgèM€Ü œË˜@Œç 1ܯü’¦@œ–ì)+ÉH¯%Ë0‹\Ì,È7.$éTN™ùÞYoÁg ä´íÎÎCG@/(_ÏÌ`¤àÈ(šòÊ6 ñÔŽ™dwt²”ÿufÛdž3Ýÿ3Ü¥°¶¤hzRÁõ*Üx³)Ú§Vû¨̙{ž˜=sMCŸ#ŽÈ‘×d˜i $L¤GÄú*Y/¦J/V+wçlºùsÏ Q[jTÜU@‚!oׯtu ø°ÛÒM¹làÕ»,D¦"»‰F `.s˜ËâSùÃì°;hía 83±Æ6Þ×iBouð‚d)„áW7úMÊûižn·k˜¤ÚV¢®R{ÉŸt"=zÏ€mX¢F&éÉ`åƒ (±I6Ñ», ;Cþ× ØKúõK\«óét `¡.̉«ü¢0,‰M)¼@/JÂÈ¡ÌÐæóÒqæ” µD€j˜t ácýyõ°€Š0 ¯‹N5Ùm_åU}aÞͦÕsæê¦Ú¡ƒAˆ¾œ89ˆÐÓ9£4•O-–£òù¾©RyÁÒŸóôÅ^þîŒoGÁ4É›‰ø…n´c›B )7WÃ,e<Š›™Ò3Y@fg*ižb}”žS…Ì2;æ@àI PÒ`‡Èz)ÔX)œPÈ«„¢YòyAóFáù™L¸êø| ¬4‘yŠN‚F‰¤{•Ö&Aç°&œÍd¡ªqлÓóà<ªkùž¥iðHh‹ÓùÑœ”Ó$(l3u×bÓ,øWÆS iS« \æ?ùc«\;£xð©ZçjÓkýx¹Û°*\ ³•¤ÚDS#`üÔw´ÀM”LÑÜ,þ…ÔvõÀÊ©œåŽW%ï¶ÁfñôߢÕÖóÒB±jX`õ†Fû¤ãî± ÃŸrGzE^ñö-Äz>”{ŒÛû!š(˜ŽòøMEŽÓ/ô?B8vT ¿ Üì-3¹WTmƒ”1˜xÆ‹7ÎtòeЭÎ÷úš7„bC^¶íÈó/œY‚§¹Šå  Î#y‚èúš‚6CYV^öí„Ìe ðñÞó(ïD>ÿ úk3Óc÷ŠÐÛaVhðžüÑ>›¨M‚Ç…m7!]=UõÓ"}ƒç.…×új)lG¹ÄÄÕÊý½zϧ_u‘~@b||Ì™CqäÅÞÕº ÿ\ÿ,(=-![?ûîÌû‘$ø"ÅÍô°Ò— * ¡O‹Æè Œbåun†IÙR $8äqX•ÔI{À·­3ö+ŸQ+oõä)”T_üÚ R3TJiLtn)³í•ڲ΀q¼ú¡&R;EúÀQg2äµ(4Í¢x«ÏŽˆ@pMâáÀmÅŽDÿ5È}><‰@ D{ü÷Ñ¥”¤‘òšÖ„ ÿkümnhâÿj¬;™3ô¸`C4¯mtCšÉvûâÞÄn,XÅsD¥ñ§h~+4K4F­C—Õ îÁ ø 0V?ž{† ´Ô8€hƒ¢¯Ð³cA^ \Oï† D÷>Z\K¸ LÑsNÞ€j2"F¿wQ˜v „ÆîÖù bl¬TNST%¬4™ÃT>#H¤‚_òVÆ ¯>sO¼=¦ª"%(•Ç™ Š–ÿh‚æ­¸}Ö‹UÈ׊|ó¢ÐÉ#}²ÚÉV ‹Ÿ8B0ž:F¹g~vv-.Ø嘹ÜAŽ¿sse\ÿ?h¼±ººdšsñô¯.Ø$÷¦é\¸‡°‘åÈÓ+SwdÔÅSýžXM8¤2198Z¾½³~ ª(‘ דŒO1Ñ‹¼«=:)Œ¥§®ä0€ Fo¿¹™¢‘†iðÀ­±ˆñ@RŽHqÌð¶©ÚßÁ«PTDùf Z„ÔÑ» Ëžo¦ š/îq¬Ú€ùôæ'âšN´ï«N{š94¥LÇ)UÊÆ…6¸ÓÏT—uQÌò¹öפ[kÃEY™¾JŒ—ŽJLª‰X+Ê×™KZs bÜ=RÖÚ-‰y*‘hÀ«nØyKÚæ(‹þ1äÜ'‡>xy×ß»µrí¶wGf±OвÞ2ôj ‘ $hĨ,YÇ>µ¦Fe’÷5óNFï•t(Ê«T¢„Œµž[!S>%”Q4Y>L[º^´4Œ /8dKyLòxÿ@š+¤UÕ>·9ÿìK;OÙ3ÿZ°"iM"†vêsž˜'aäN®bNzcÝ‚›~cEõ‚O²ÿBúI﻽Ֆü,¡Ñò¦UÜÉ“ç¹ÿ3V;Nø¢<­HZûÅà·€ª«ºèd8RúëïöDjeÜÞ(‹$mçy%÷ Ë È'µŸ~ì4Oª„ ï/ßó¸Jñ® ñò•bþhÕ –Ö#êjáóe¤äs`Þûa)· ¢#X5JxõÀr5óf„q‹×Y¸«r;Fm¥t‘ˆŸ@iÛ~ÑM¡Ø…]ôP‰<Ù¸á“ûÝK\S!#4¢Ô±55í³@‘”É÷3ô´[¯ë°Ö/FÛK7A:Ðò1;Û‚°U ©Ž Ó×Tàò±ˆö88D¬d^µ—C¹ˆ±×gj#NrT“0H8EÊ-¤ú:­€ ºL>€ë²º|ßÓÓ±26’©¤:(?v&/d¿Wæ»ïŽí³¹¡õKX…0M©tQŽËôG¼H|k2þ¾<µxŠ–šdûA¬±c¨›ø•Î,q÷Ž9oAü(v|ÐG2pD7ž^Y7ñX²£¾§å†<&ËY$ˆèãIÓ$rUT·Ä¢ó&» ‹&üe¡eÂíëZ¶äDâxÞ©Ntîá[é2 RI…‰l¿«ÅÄñ& dtO-Wù;-嘮³iƒTiW"ëi.óN¥ò{@†VC:÷7»ÑãóGŸ;4!{¼¨­Ÿ,Äès/ÈäaYbØ»íˆ× ?o³a.õýeáÝtĽ\÷D¦ÓôV]ŠÖ;ž1±£Ì…!t¥W³Ü6žùVP=Cî“D—uN>àj%Ù*/÷¨Ñ¸sf‘Ù²‚4$èNå*¢L!öoV¸pÆÐׂZˉԶ· õ "Ÿ¡Ñn£æçPÃ’¡ñµÏÏðvè‹åaAsrñö)uޏõý]±•?Ó[Â\GÌl0«ñ[¼ä’r}Ž„H À6AúÆ(½kº€\xñ6ê ådûOÞQŒ‰Ó½úˆÙí)Î1 ¢SäˆÓ󇳩ÐþP~Oýü¬U—ðbÔ=öÄ®”šd'%?VLŽ:t¬ ,k¼t`îÿ¥g^Ù} jìboipç‰á´q°™ÆÌ¬¸R$BñëuJ6–>Ây/cƒ7BŽÄG¦‡ÈMÀ2«Šž…¶+¤ZI¸«ðòŠ}œ~«ÂLú‚Ì… ¬y➯Æù`ö¬`%‰pžV ªLÈ F"A øÀú/M2äû0ìè±~¸vþQb Õg‰Èÿ[ܸ*eåZĉ/ 2Á»]¸æ)8ÊŠlL'(O°PjÎ7%éá½@oï:Gf9T?ÀÅ~{[±ÜWlâtóöm/Bt$GJ…AîZ=éŠßö«à̦‚LXÓ×"1×äŸ:®eõ‘qhpšÒ/ä­n’féïpqFɼc%@xÖt ÌïìÔGè×RQG1ÚR_qó-Y~ tØŽG½éþú)á—õz+‹kp _´Wj·¿¡™ R]ž"ÿw×eRÖ°Q‚Ž /¨öªN¦2»â*,LT¯®Êø¢‡ qU]|ìäøñiJ7~áü„ïl‡üÞ5ßi¶7c±’:8~hÝ/ÙÏyõƒþ¤ì]dC§æI{  k=\–‰’N„1>Aš¹*#/ðÎ5|ñ,.œ­ñÇÎ- §tÈÛKë ª©Õâ "Á‘<öéÕÄçæÙñLŒÌ{+\1Äew“—¡%9ºs‰9ÁÏlˆ>Ú¦iÆcž…÷5èåSby¦zs%ÚÊcdŸg7•O¥XÇ3ó¼ì…ÚÍ+/4i3' h&ùò‡ú¶,£Z)}àà?‚}ˆÀª á;…# ¦ëÌo þÀŠ~—f§PdÖ¡˜¦/J¨Nê¶jϺ!²†Ö&çÚÌ"ñ&nÚúcwg:‹„Ex"t}?äÛ{¡òyóšüùI‡M²°ÞÞÚžVmq 7aoaP¬ )‘6Cù« ሜµmÌ:Í? Ž>z•Æï’šŒËÊU“VGi¢f*HÕƒ+òÚØå'QÝÍóáòÕSž¢Ñ}Œz“Œ,Én™µŸÊñ0h(aûˆ%e¡+[€ª°<•<¶^'u‘#ƒs¨~,?W IyÿRºxÿ'ž™^©í—\Ë÷.$2]îþUŽÝÐ.•çù™´ù :?Úè ÈJÔm9‡ä5¢åúØœ£ÿÁYŒR»ÔD±ûÞá”aåX…/‹÷E‘zZH9W3w–D§Xhz¼2Ë#J啤ÕÛgÇŠâïþŸƒ¹?ÈI»´ÃO÷s¢üŸ%è[Ýq…u -`8Àlu˜é¥‹C]ÌÐY ¨®ÆÞEž½ƒ\±\¤±»UÀ%²s"Ù8JŠ“:‡¶í´R[£þʯ ^Ìœî;Ä1 ™ê,ƒ¨3jìO 5©;Ûknʪ#â{•ÅTÖ* ýd{ä¦ìA‚[ø– iÄà-`0p²Ô¿UÔÊ\º¹2Ì‹I5)†£Äed0-Â?}Q¦šÀ¬E•GÙÚ2•qˆPÍ€Q,\†…=¼ ’lªôëø*¿¥  ÷ö°eVw¹Œ£IPåßÙÊuU"ÿ+&üõ—“¹„£›Éuó×–Àc€gJ¼ã3ÎYškºík òQ`·ë;]»á²¶³tÕ Ö@lúöªÁ™ò‰eÌ«¥hVÞfcïkÖ%c^ ³^RœD]f7~_΃¯’ý¸6•fOBBŸtŽƒ•)ï-G³^­I2iÀþ^|‚â5 o.Î9zGº-ôâ«UKîÎ}±¦÷Möå´b¨]7’1Ѐ¹°ûWn. ï„™í Ÿ:Øäk%üPñ¿I`~K&±¦[ð–Øï©vbsaH儸óU™Dºv8Ù£yE:Z>Áw „y{_>%4xýVU.%ú$D­O¨áýˆ$ È€.v]DÞìýöZ¤Û¸\§ÒÛn?ö3·-Þ¬2Ê^ú»ô¢dÉwaĶBç[†ÌsžCЋOlyrœô=ÓÞµ7³#¯ýÄÊ ?éH7e[¬¶{œ[6#•œ2Ës ”ÂèÆÑ­þŸÀ¤½ÑÄqï=,ºd>”ûØU+7¼cAm¬kb}1¶¡­×PG 4˜BŠxég«|u.P½5êAHœÆöng˜/Ö3®-ÝØ–ZÈÅû~áS ÛÍO)“«ý@ÃzwЩ‘:“XÒþHäøW‰Å¦Q¿Q-÷‹ÓX*«‘¤²«¨ïµšLýg Ä6^;Š>HÎ a´À (¶"¬P/1õJ ‡ û?4-æäÉ©k/ Uf›‚…X³cw86$ïhôóŽŽr4•NócŠ1ãxÞ]ˆljí*“ÍnÎLtàµ}Ù N×°Ï+Üú÷KËJqŽ9,óÝî‘ÔåÅ¥>ËÀ®H®úiÔuá.X;^„—#i£‹Q¯ÆC”‘õyM%|’I´Ð[×»ÄáUÇû={YÕVkÍLÙÞv H+Rl¬×®ÒŒÃbnêYÿv%ïÍøÍOüKWh¸’EšÓƒZ£ÉFÑ»J?Ù׊—ªwcÍÄý ^ʱïÐsÏÎq2=¿K™Ž }¼×—o¥ØU“샺bË2qŒÝ½rÙaÞÉT"éšÕ”ãGÕu‰AÚ¯r<ôÀX !p¨zù´¸b›ÎJî‰.˜t ³jȪþp8óWNMŽÅS˜rlÌü}ñ]K=>Ä)TI¤[‡ewÆLÌbF ~ÐßeQ©bfgM9˜sBV(º|—ÂGÛa£R¯øQ¹,`y%[)øI!åâ=‚k1ºn˜Y:áÎÅ&Ù –Ï?U F¿ò๠ÀíB\•Pˆcu¦c¶Y|?Ô·†CšX¢>äÿp…*FEÀODK%]2£+k”™ì¸'?w’CñÈ+`2úXÊfH Ìº ­«v”ç0¦MS­k¡Dé&§Ãë÷Ù·õò-D,kPæ·x®æÝý×$ÄÁçTÇ.`UÜiDЯm§ùVܳÓ>ào‰šäYjŽÖÙ¥’]©-Iœpš@i€áüù›…E07“ýÿMæ< ÿ\Èw~,˜“è‡rf£Û }(1¾´Í÷)Œ]qùú!!¯aM¤rß÷×äì¹À ]\ñÈÀÓmáEHϰé ]3‰VMкtŒÖñÌL ë1¹j)‚¦NÌ ›ÓâxCt‡.¼S`˜uB$ìUÜöKVŸ1B¥[éä²)`­øÓ¨]xƒÎpÄA“À8‚x ´;ñùE‘nP®\ pàŒIù¶—±È} ®kR¶ƒ—á ÿáßñFLLCµR¹übÍÒ!òuô§Å«Eÿ)Kð›Kû¿¼O!MÞ²‹þÅ +VI‹žÈú“$Ò;_¹éUèÿ‹PÈ¿ý8ÈŒ¿ž­+Ñí9àÄ‹@&Ìvt ÌÀ€ ƒ ÷ö»6 ÖõsF@˜V˜MR…C•—/…ÞùÕ.°êóÍÛp®Ô^$…YfÏ„Ã@í¥[vo~ H™Y¢2¾cùøsÌ…&BµÇ¯O¡R&£!ô(Ç­Êãé—a:L‚79±Sx¥î¤ý"ÑâIÇ~‹ilò_+R¥¯ÓLÖKWg Îתø=8 Ö~ŽBn½öÖãÜòcà%N6€wLº¹ÒçåáÇšXšã^cJü/6ŒÜî¢!î}Ètü‹c¨xi£qã£Pà–‘¬ã $$¬úØôfV~ P5iQ¨9b€ªÌ¶‘xèqÄé»Ú*»5!“ÓÕŽ³ìŠF®½æîTâºK‚ÎÍù¯åúÊ…¤ª7xSò!m y ºÝŽ‹/†¶t;áI¥’)>ÍëÎjVKn¢+ŸäÕÒ×tŽ’Í,øÏ½ã#+þ©íÆuÒ–eßFeQ†±€]ÕT©Ïc˜ÿw8™‰g%ä°w] íݼô¢?hV £.Z£ ©Ý79téCyó¢õúèyŒÆ—:”/%è¤È à¥3ß§LVRsãRw>”$¢ªÙsÓÊ?‚>[“à•„@Ô<àF^*0«ÅírË?‘—ï3q]ðJæU¸G½-k 0g¨O¥ Œ neR˜Ào†6—íjÙùSG”•Úѹ‚™üUgªÔ:EskˆÙÒ†$·%ü V–’­¦Õ¡Ž÷¥R€·  Õ!o³¤"ìÿÒ Íâ;ÕmàÕàgSÄú=ŒÕkÝ]FQ9õŒì…¡Dáè«B¬‚2k_Ê_¢¬—±šn!.PH.ØÞ´ ÐéS\Ame~¿4ïÈ#Ñ*øÚhddõYµ>­‘(®ãÚê;.ó½ƒÄÒ/ŠáÇ>÷dßF »i¤W‚Ô±Quq¿òö2Ê «÷«•Ì—ÞÏnØa1,^…tI´Ìå¤* zoƒ–9õNörw¯®Ò½+k}D^ÈÎÙ°ú&¼®†­i-$Ûùm¨ }¶Aö×Úâ›CŸ—ˆp¨ü+q˜áûÕïí£q{R€Že§*\â/™:¥mXwTŒµ{ÝÞÓI!û ©‘à ;‰Nw¿EbO¦«Yfæð¡*ø­OÞ(ð:Þ0O‰A†~‘¤È£ºãX™yÄ:¡ŽSÜCæ,-ŽQ©ÿvÄ7ۖ佇ä¸=&Íp Uˆ4/èÞCÍÄ ¡AäŸôûˆŸäd7w…€ R Ü/ÆCè”Kþ:íÂgO¹|*½ÕŸŒ?ˆÄîjðt |Þ–;Ž„N@ÏF l(wj+NÕž‚d²g²Ñio ‡N‚$†¨JÚ‰iØ(çSÚ­çÏú› zY²ó¥¥sâ ¨ö,ܘ¤ÿInêО.-‰ÅÆ(?Å£Þ;QXhn‹m)¹y}úQÿmö£ÍßLJŠ˜Ra"°ï)¥u0ª^z“ÖµáÄÓoýðY(.D»I+ ÝÓÙàÖ]ÎU¤WƒXûtª•Û"Ù"ã1þá7`»ï4g/ÓŠ|‹ ˆq!îó(¢EÂôH@ ‡ þó¥Ö´V%Î}PÕ¤‡¹/ÉÀ:g(S`î ¿óÐÈ'çÙE ý‘X~W–êŒóñ.N•:—V"M~³Sñңܼ}èÚb…ƒjT"ÚÁf‰ÐZ Û2Zü[ï±êÁšg®öâ –Ä·Ç1õ¢<[?oät»ì†“‚ìþŒýFs 2¯PþËX^æ‚|zAÅ‘ÝÙÔ€£@?tÊ˽65v‘ëk§È¢‡)õ+6œ|ïvZ +ox§ü7d” š©<ï΀«ÑV]]Eü#J䆇Â4›2%pÛŠÒPÃþÇ' T ˜a̤×öl:Ô-~õS¾»6DPœÑJ©›â¾¿¢õ!W’pì¥7C®~BD;œµŠÑñ¨¸ø:g¼~ñò0€qÒárwÓhLêš#]™áõø{?Èx§Èªô»ˆ‘‰+úÏNItCiå¸ràì‡eÆ­ràš)]e%e5›´÷ÃRà×ã­çáªDº‰ÐMú…o–Û†È9á•¡à…ùñ­l¹y&í+‰:‰` ™©–6jÑS!½ëd’Ê×à%õÔª–%/=%±x* ÀK†‘!lé ”Fò¡n’È÷W3ÖgÑaay$¡¿FnwΕ‡h‰ðÓY_l/ï8™&Ì‹F1«‘têÖpŠ©¾òÝóï#÷÷q(—¯Çt}Ÿ—¼dºà©h%]Fl Ô¹Õȶ(ëÃRWhu`º SÒGša<-Q°eôo-ÇÌp®þJ¾R¸•Oc­2v”Y;èû a ÔŸSát/,C¾Jjkiû 1?6nðã l$Rè©O‰=$¿åŸFÑôåiÀå—pneÖ'W€3Ð{Ô#6Ca?áEt*nðPa›!© –$ƪ㈑i*ÀÂ}wG”œC­6#ÓÞÕc_áµÞÒ55²nQYS…x†ŒQú¾ê”%øÕàd9&®L£ó!„\f¾^Ôrx¿r0…â¾ gí/ÿz¹½§ÿzsæØ‚h¼V¶rÓ0w!í¢N·&ýb#1âŒQBªs?:þ±tmd=&Ȩêãï‚r| Q•'÷ω’÷MÓ£œ§¢¤®’²0Æù“nêtZ÷ %s®g Æ·Ê|q(¦ƒËÄo9†ÊŽðà<Ùa).·Ø„9“ +B×1%¡Ëĵ÷‰CÅ»cf„ïè9 ·2ïÝ)vVu&Ìk8V³rC»!•Ò¹H¯³#N[0†¥»Â†;9kU”7øk¿T‰crFé6 ÉëVw¾æÚp9®ß:¦¥¡Hþ qAüâøâÆó9šñFb¶H”l —n uo†v}m¶î0/U…eU(1²·ªò ,œ›`sÿ1b­¤P>¬ä)oÑþ§´7-¢“Óó¿…FQ=3Š®¼bÁHpŸLÉe"­FØC<ϰ ãtf¼¿¸:p‘ãFBlÝáöà (ˆ¸†(ÙJ5ðš›þr·5iðQÂJuŠ‘üËêpú‘úœ'ËÚ}JwzåbG ù’cµ*é?3Q·•°oJæH@z.¸©7>Ï}¾jÔ¢.J{â @Œç?p]YÈ6ö¨ý¾_–~AYÉ ôGPTqCˆH"J`|ºÈÅá ¾êËZîöQ5‰r5ðMQs vé "ôËi©ÆìæýEdÒ¶hôŽms'6 Ü€j?}ª8×]8ODU?ˆŸÓ†-•ô™ëyïsƒLñuàsn[ÆÕ÷àM¥ãnTS*¾Y奦,cwï-K¸í\ÕÛõQ×%"/SjePtM¦„Ûà+Е_ƒ \h¾k®ÍÓ“^#ÃWD¤í¬[¥:MÏÅ:ý¨—­ªüxaâiª¥Ö“¡¾Í4K¶oGÛöUIJ7…`n¤î£ÄTÎñ‹]*=¯8×Dr—Î l÷¤j–z&“ÌçÑt’ çO#ø'ËÜ'¢’{?ƒ^tª¬c·ßÌ(Ä·• îÅ96Åùá*½MšMúÕ”Á5P0E:vé:™¶xž|r}óÏ"ß…žrïá†oá+ÿQ¿ŒÙÖÙ¨´ø×â­AMðôx5Cµ±ÌS«,– áY‹T}ŒӦķÛÝ'£%†ˆ†±V8KoD/@xÛ0ƒPt$×Üðrà¬ÕÚªâÃ^͇Ÿ3ª$›ªp>Ë{»]ÃŒ°Ë´çxv|T~!ˆ 1î\$¢Â¥²Ît…yÿ za—C+³PÐUˆìnGËX‡!}@ˆ%%¬†ÖÀxjÉvAñWW8솴•cÿdÉ™?`ÞDT]ëbÔv×ãxòiSòdBÿ =µ¼~ùæqœ`³®Àz^Q±²Þ5º[ÇŒ.9×Áb¬I`þJ%¢·®?t’ ­h)r¼ñäc»ª[:ùE^·Ž¹T7¢Ôõ¸‹Ü£éާ¶« î|ÍçK§ºéØzion¬®âÊ60 ËÛ#´O;Ù.²·gNwàówáHë¸/d c=ó@4Kr¿Bdç¬pì8„%‰ù#}‰rŠç¢¶.‰ñ[¹'[ bS$XW¯Øe Wæ÷ÃÿQ„º`lÂ;áv 1 E9ÉÆ¨ÿ¸:rS6Ý­¡üs=wVB¦Õ‚S2Y÷8ŒÏp_cë¦ÂZÊM ¤ÿÍâ Èš$ŸQɾbS!ˆi[C^Óì}viÁ1ôÓk¡{6Ó¶õT–ž¾³´öd¤ï’T§õ¶osã£d;þ·8²«Z¦ ȱÓœÎ÷Jz×\G$þ0~°§ÿ^93ËÿH—‚v f~kxߤ¦ÚÒ Õ2Ø:„0G¿© [ýü …1@êѬݬ–Ö’%:âW¬Ïâã+–½wqüïì·®!s'=ß;§K%¯ÄóW¼ñ~Ì7¡jÝ·¹µL[^Ï4]œÂæVPLãW>\}‘yzn8žÜçE7C/C¡¬ä\gš”T}ÅõHP,¢—ÏÉ÷D›vp"Ù%6ÐMMÓAA›3B]ýÖ•œ.t/Áç,6öNþUͪ Ts#z2öÏ‚ £òUÞªÈj¿x¦…Ê”ž&'§äñŒ¦Ÿ¯¯AqjüÊc–~þÔÉ—p}Ô”÷z¡@;܇så=Öø®Ï…ͨHü/È•xÿ´ mÎx›•tU`X“D¹˜¯LyÜ,{×_Ûu|>"‡_)DY —¸Y;Ø&Ji½Ùì)²s`’«+еyÏÁÜ“&¼é«À:ÿ%ˆÑ›Y–¬ ½•gÌÚ€h§ >lÿkû<¬—ºIÏ^ÿm:ôÙ¼ó¡n]‹`ßgmÏó$¹AöJÇÑ~¡Öøƒÿk޳Fã©c{äºWp2tß˳͑Äî¿*‰·tOÐ÷EœÇÇ!)9àj"!ˆ,¹.ŽÚÚ`àg¨ÇŽ·üݬ$OÔu‚ûÞš\3¦)œéælíq¬:©†x+.ƒÌ8!ñQáž#^™z®EÓ#rQ~¶‹šeÙi´°ï£Î÷lÒ„]ƒ¡‰Wö&Hp#G«ýç±à¿ÂØFãž7úõpjÕtö€`ðbuž¨ i*ׄ áeÔ"àQà¸ý•n ©ÈXÁì‘c…¸~£”îkog¥k˜z3¿`¢ ‹jáäB6¾ÇÎ!‡ùõˆ§g¿?bìk]ž}©–äÄ„ZÏÿ+é`_ù=Š·4&”:†`ó;›ä8ÿC–>v+ãÔºlE‘ ¾ë2…¯ÕP.‚neE½¾t‚NŒT3ìó`wE©¼iÁ(ç%`ÆA”lçBNXŽ˜…ï gï¤Vxg3Ì $IÎ{ºÆX3ÈÝi!°mä )M0ÀíP-zçÜÝ7êUqMA<S·)‡ÂÁF)®®´¢4"øÃ};ü¤6óÍ—þŽò,èÖ6ÎEâ’=ä0›³ ±Ž¢ëZ®CgÁQ"2,J‰nBŠ,D†Ç>; Ù¼­-¬7s!÷»KÃ)ñRC\¯Ä˽®ÃY@I»NEðß“{üÑ bÝê_³4xõ]œÎÔ#òØ ½±ðf±³‘W.¼|ØYybõö2e<²/XÔ+T;ËÖð ÷‹"!öŒþ;F0ß'ÖÍ‹«m“Îiv›÷oÝ ¾j‹·‡ özKæe£‹€ÐñŸ&¥˜'¦R7«ù¯ÏNsQ^/)€•«ÇM Þó†l7æ´Ÿ}ù›Ñ<åÈÌ“¼UÃeÜt0¡4(ßgb™øÙ(p|C³Ž'‡lîŠv `ˆ”NþÞ¼¯Åq³Uíú¤Æ§)'ƒE¨š2Dz.]0ßFÈ‚p© ZíÌ&ê]ðþébÇ@}›X ž†« ™Ž]$˜g{Ã1QöW†@e^ ûŽ!"±ök檸à%¶"Ì_Ì~¼ÉsiI°M4î÷¶ž6…t’uÛýí’×õ#ªñ-h×2=[DÚ–ø+÷¬qý©âPš¶¾ºá¤¾ÍšÏˆ¾xBh› $C­†@™Ò”¯€»÷ °/y2£wX$.£×?þή(‰àK—ý[„¬ZX/ªórF’#Æùñw|ûâ–¼!¹vôA‚ò+3˜fƒúw…9»Ã\\XVü10ù›®­n—é`s{»ˆ† ¾Nó¨á¬Æ½Ï¨®ÈÓ}zµé,ÏãµèÛ ´â'S›Éµ©é(Bø^QM n/Ê".ÃJ'—«ÖJ¤%14EÃiÛólކ´%Ëì³ýü UŸÕŠ–«HDºÜŽœv󊈸£”ÌBó\FÌ3´Rõí…wËÊOý_¾n°F¿ïào…€M܇ôö=±=²‡¤Gö¬~ –XàEêA—Šïkedçý"XL¶GÒBÉ*mF¡cønÖh¿÷žN¤ÛkÛ é Ew¬ÝôxþÊÏ åô#SCõãï((öïL¨þdp 8=@cQÍ+뺒iy^@ÔK•/@öAÄ¥êðFózZ7>~öë7C_^fÊSz1±/¥S¿!/“# ÈS_—ûà Á”’Tn%¾} Ƽ§ •”ÆSˆîîE·¹õ¼t~ÔlNs¹R†Î{ä>ƒ÷!e4OƒÊkÚLü¨"ÒˆŒ$VÖŒú»GLN(FüE wT­Ï¶GUÛ;jý¦­¹Ý‹ÖëPË\[»åµúÀQf3¹Á±Ç1–_ê*I$åÚxTß™cÌ&ùºgnØŒ¬ÐˆâˆM±t?ÊΛ‹çS÷isguŠ‚\OçËà#'³5¨HbQèªîšNŠ_O³šI¾Å·šFek‚;q6‚ËU \açž՘^4 ~ê1³3=)ƒ¤×òD™Î¡òöÐùâbqç½pM¸){­%òªâ4yqÒ€oNzqp“XˆO$X:zTÛ¦@¶IQ|«sDWÒU$„6‚®B ãe彿a»é¦tVQb3ümoZKf—†š~g…à©3Ì“³e‰ßzåm–}ì@ïiÎã*;ëSt'q¯ Oðs⢙~¹–wôVTY÷’ëÊ•¨Ø-x¢Õ«íûŽîJµ@¬ ûìš¼8‹‚T4Há~=¨ñÃ×g*9ÆàtBîØÚ©ƒi±ÙWÁOþÆÇ}þŒˆ¹œ'Û¤ÜìX§Cõ…¥½8 q;¥etÔ”xЖOäc{ï ÃóáZÌÄ¿Cϵ¹ƒêi8‚d;÷|t"UqÃ9ȵ S¢½bÛà“`êM bWM¬K ¥@·T éóu1JfᘎÓ.)kŠÞ4\!™ÀMؽ ±#µkE©¯ZÚåµB¢n°-Šs@<ƒ“³JGŠè]iD[JY"Î(éü ‡p&y£©ðc×Ó †]x3p8&ŽqéÊwoÚ©0»[³÷“•®+[’¶5ÚQéç±6°@9¡ÞÊý½éˆ-¢ž­3PVà¨fb]9ÎQâJÝÜçÁd #jòÝ> º»W TB~V’µtÓuíæ‚A´7`häOT:(Óâ08Ö¢®N@@p.¸h]½‹%s?e•W&òl¤MIº²1,}½ï¡[ Ú‰Ò;=Óµ¿Z”#,S^’·?‰;¼ ËÓ·×ÙZ>ª°¿.;æ7iûÇEâÕGê¥%²tc-úù5~Já©^V„XÁ½6K˜Iœ°OÂ]8ïë¢tœj9ÏñàYœÿUáé™aÅ„ˆfNÎlÿc>““së+ëA„½!+_¸MÚPn¯Á ÷âÙ`cäé6{¤YÛ/rŽË „ÛoÙ¿žýì4î¬;SW ` C 7¨.Ë×.&(X©mí•iYʤٻ$¨’TœÂ&2$4„ªÅ\0ðhFì7|.xî7½|h<~Ú¿0bÃÀn¸0¢U„4æêƒ&fAUû@a(ëÉØ×$¬øG |±q+ÊéðÌ>T˜<AÐ(ó+˜)ü¶OF£«Ü‰œüe)‘”,.‡{·³YC1I4–\D-£:Ný›A¯Öü_V'ŸÊÔn~âÄÞd½qÚl}ñ.ÄqdÅü ¹ú‘¬ÿDÈâA=È7]æˆ)•'I9Ò—EcMž™°èÁÉ'Õ%'.&ÿL!'šP“h^÷íXVVŽ`yN²È22tlç¢G?¤Ñà+oÞ<;ãÌç7›yVÏO{ýn&O2œÂæåZ,›HÚo´²éœh(u^Ðêgt~^’ÿ@KP"Ù¯,ecùÎî3kÙ`lVÌ<î“ÜžÜìpÂzCvŒ,')â.%)Ùúé6 £µŠ›¡Õ(j‘EÊ™]š¯hó! ½6z!íƒ.°NÆxíbI‰Çz& ƒquÚVuКþÐ÷B)óaC:œ…¹õ‚xømؽZ-§ ãt툓4‡ Ÿ×57- ËÅûE—îæN„ba°Ëcí×rqµòvw³Îëër171“+AOÖ"z> 9ú¥Ò|}<<{‘’¾´2Ò3]¡"#¢†%ÿ€¼0Â9Õ]»ÈRHE^Î[ AÂ_D?o·Ã§Ä3™jwsMšMƒ“‰8ȃ’se[%|th§XŽf®§¡ÿsðm3R:zê°eUÜš.€¤÷ ¶Ö¯S¡EB’ÿw÷¶x»'ØŒŸ£ŠˆÇüÏ@ ,h0…š‘Ë8Oçí57Þ{?"7e}?ð9Çü™v“0N—–7ÔQÓø’Á›5-ã¿ùA.8©ÓBBª½¥PYû–˜F…•Êä¥: ¦™”¼'Þ@8jRØuy†ÉRè! ±æ€ê8ž>O Óu¯õ8x?Ò‡læ¿ÞŸÉßü·Ò< ¡~2?§qb÷y ^BâùïX1ÀMè2•¼cÅÝÓYO™@Æl‰ÃØCƒï`£áÓ—°v \E±ûФaŠÊdÞI™c¬:‰“ŽüäÖŒRÀòŸ¢˜ÐròA§‘²l4hRá'ß´j½…àÈUÜÔ‚§Ll`Mãàp¹]g€¬ñˆWÜ™³X¦qœƒp~6Îh{óÕ•Äç†Xg¤6YìM(4Fò—¿~XZ½&ˆ CÈÆùrÿdëh°†Õùo+bn!$ú:ÇãÀÇ RËtEŒê˜T„—¨P&úç™æäHëûæ»[7Õx\ìÒ{)¬Ç>H„‡éõA¹©Ø†Ñk®O!Q¥ðÿ+w4ä·+ÃdüÝÈDN ï<›Š l"µ:ˆ hòØSÇÎÇ·Áüz“7í˜'1õ ï'Ôì­ÈËÇK°¢\àŠ7ÁÑLVÛdÍoˆW »Âðoˆ¼õ…ÍÚ«/ŠHQ£Zü™À¶W<°Únô{ÎE—!ó‚~´Œ½ˆË(­šFÛOdëÁ-Ê&,j·+Ñ'¾„8¼Ü‡¹·h5ß¿ÄÍ<÷í¡ЉªAÛ‰L™gûy EcÒʤkçÔoS}ÑHËüê-Å#áj¦bÞ8RP_ݧ H‹3ëcà‹”6NÃ]àÉpÂM0gw×%Aù^:lÀíx|Ä&RNŠUÏ0°,SúoE!ÀdßûW囓ÕýNýü©µ;g¾-"´€ƒ4kôOžPUƒ –v $ùXû %'?Ñì‰é8ŒË/«øÛmΓE{ù6xY-®NÍ’æAÌEìYo›¶/+ò{7m€ˆ2‰¸6„½ô|NÖ±V¢ýϬå^›—àý©ì¨®ë­ŸWo:ŸÑna¬=ÑÜ|Yñš‘h8ð¿uɵ-õU‰|uy>˜!…«FÓÔ:e2N›]ª©Ã‘-tO*ŸAÝtý}o»ùé®±W ¡#ïoz¤s_<ñÝbоÌ~`}Ûïè%®ró÷@öúö#:GþH•{£¨êtr"øùìnüûñÿŽË±®ó*ídöñ)Û¼FØE¿39Jg-<M¾•j$è¨ •8#òøàÛãÛrC²ÕÆ‹ë"óuè„5;Û@±:ËÛºÛœZgx"u1Úp_@;Á¥«BŸë‰Å#ŸM£“O ßö'sÖJ’GÌI}Ȧܼ#ÈŒå—Ò,ºqñš–ã*Œç4zÜ› áJºñ}Œ)Ý¡/âúº½ý½ _Wy?·¿?W\?««ÿjîKõwƒõue|þ¸ïŸÜGêîDö[ŸL;¨É‘yK·¡ö§³Óæ"GÙf÷(…]-³µvP =¿Äp÷hmŽÁ,ÆùÌo"CWôç5®ß<+äž™¯Šÿ >¢":KäÊŠ8HÝú‹îFkõÌ»ˆzþðÖs<þ´< ñ!¬cœ¥îÚ—íY&»vÇ=Æèå_ŠÚx`û‡hŸñAW9HH åáB°ŸùØôõwZU5rögVAüÖ#)}ñÕyÿm'ýk£s®ûÁÅ â¯(é!ÎóûÃyE+÷€GŽB^?d#ŠhüíŸrAiõ•-³£é2Ñé95‚l7®Uîëû%Ö$´öÅXÄæàò¿¥è;‹?7ùà§“¾ËîP³°Òï´b”‰¸¸¯ž¥>QFÂ`fNJ¶þ¶l”•X8**PW9ÿ)®.—NX4ê·êâmú‘ö9v  ï¬BÔxk­÷«-æúKÂ>X•0eõꆉÐ5±ˆr!ÿ.®ŸêAˆMÁrü­ Ö“‡„¼»¿Å\" Ò˜©,?RQM|×·’†Õ ü¾Jµõï|AÁHìȃ!9¤X¸æ¼’Þ­å(zîŹd§u¾ð—wd¹–?IÔ¡ŠNüN^K;¼òL¸jˆx~'}Bý9¹™RòDHyÅo|BÎl:AË>”r=w‘™Jx YêñH1SÉ÷Š ¿c ÈW9Ÿ¸Ý_Y —ì4à•ô5,뽡UÎÚ§gû×4˜‡¿†Ì_ܶ4#aplû‚fઠ‰Wh÷Æ$Mø\<ÆÒó º*GÂÛi: =<‡¡_)Å.rÊ\Dh,ZEòÃRùTã½^x¿Ø­VEë} ’þ=”{’j*gdÃJ»£†zt¸Â=?Æl‹ÒLŠ7˜õÃ|碔^@‚çqZ,ÇÄR¡—+ô×zH•kÞa…|¾,˜¿¬q쬕‹€F{òq¿S*R½\A= Q$³so¯‚½Ää'ýRžÂ½Û%Ñæ{tàñ›åÚhÿjXI†[¦G]¡Ñm-¹IŸø*õ=SÿCoýÿ it´ñ™¼='Y1ƒ“ÏÑ €Õ¿ 7ìÓ*f$ïo_¡#^C46ß™Tˆ²è4k]ØénÉ–u¨cz!ÓèwŠOÍ»‰ðŠ™*`Ÿ'Ød˜ø¢lŽìš—>G‘°zO= DCðºÞàܳN¡5¯½Û‚ĸ‹]2„A%ÃE¨*}×ûè˲IÆ£2 ¶®Ìww|ŠˆøÏÔYÖäá}ÏüÄd°¬fæîöëDö?0Nl6lû6²i˜JNú)„‰€Od¶ß@änm=4YåOy‰Å½ãët>}–ô§Æx×{íä’üZj¤6ƒ.½¸ý¨¥‚7+œN%}ǖȑϛ”ÿvŸ×=•ÆéÌføô·ÛqSH¶¸:¬9Õ¸á½æ6ö6µeX-ÛâáÐOoËüƒ>>XnuK™Ìoõ`c…RuÜ™Vqé[Í[dÏ5Öú¿o”Šq; aᾎXIåÎ`~bh0G2„Æ3¿äÎþ/­R,ô†D>·@娠a†´èr.Ó@àÒÈŸ ¬ÄS%HÒvm†¤ ^¶Ôé¶Â+§ÍE˜ -øŒsóJ‹Ð'™{ Ù‡…c`åò“òdH8ŸHIéÑùî¤þ»¦¸à9…=æ]Ä;ÅÃO1ËEle¡äI‹†óh¼”L”/åël#"aHýB`QÆ,êÀ Ä5¬gµÚÛlG»ZËW9Gàà`¯Òee½±vÈ‚CõXÁWFLêÓ´ô™ÿ7·…ˆ8ë—?œo¸A}sá’ÖIî­š”è0жŠ+|TÿX‰Ó*ì… Ÿ’«e–¦|†å¦ßªÜ@â}ºWòz]Èù ¢A0æ]ù °VZx=Ž3¸Ñ„Ã{ÁÜðöØsRVüÙ_N™kWhn(½o4Àyíhñf¹¤© ²b@Ýàx4šf€åQý_fp¹½ýç•N# z&Nx¿÷‰ûJVô¥qÞ>¤™:,Ï̽Jÿ-=FLM€ÒË ¢{&pýãì 7`§ñi!Õ]†t™E Iµf7³vé²ùŸJ•¸g_–Ý.C~®.’ϱõGé°ø¦X¦ò$ª–Pµyj%'ß4ÁêÀ#è—«/ñ$¶RgGì܆€ý·æTÔù0>;4{Ž X¾Úi]ërîB#Àç[0ô±¿2µ¨ër³zˆŠ8˜ÙOvædñ‰%å,W´¤Þƒ1¥TÂ) ¨-óÓËMâ6> k™BgIYZúçBb{¼¢õ³6$Õ±m,]Ñ Ó{.!Z(Í|3F"kWÓvúûò¾óÝ8ÔL)ç†6ÀJlTà\ GŽ^àmÑûÇŠ<äÖ¢²÷ŽÃp»—ÆŽ9O­åü?’Ò:¶d,†,êü7Sã ¯ïAR5pÆÓ9^Ÿ|åUÑ÷*TŒÎú›Ð¨éÙ -yìý·ýÁfÏM·å|èx`bðR§Ñ÷Ù1þ ôýAjúX?v§¯ÆùXäà1šk9°N#ïx!G¼bmŒE6ì;Z¸{> tN^: a°Ï§]/m|.‘ N²ÐõœT\5z0蟯¸•zF^L+fù¡âÇΘQýõ¨P§€Š»È  ÞÈyí§&RN¡–$,˜6Ì%ÓJ£¶0àÅ6)î…²‚à Dåwª› fáâgAõ —„ÑÀnj€mk{B“sñ [”¬)”‚¬´÷ã¸5.º92÷/8ÐA_ñ|zvDð~Ìœ“)ü“5¼¡ªìæ£pÝc‚½l©Ü¯oc»™ÂàZ|’’Œ;9î8hüÂeSÊO·+"âqŒ|ÍÚù_ÝW-^‹©ÐŠ«¯X»‘PÌYsÎ!‹[ÞÕž~-‘øÇø Õ1×L’&Ub*®•­Á7£vѤG¯-ÿ·´ôÈóu6·~}ÂÒÑŸCåpžƒ`ÐNýåH!ÞаO#ÐáX"xT7Æ,ú9S6-Õy} ŽºX•V³B׆qe{.«cŠÀK鯦ëS²:+6†ÚˆqÛgí•“Âñ䎽H=§XZ:‚{`„ßÖtö× éd‰uÆ-"©†vì_žäutr¬5²ìé GN¡Ù'Ws7¹cìa›‡è¶›·%ÇÏÒ9©¥èÄ{<Ÿ]¸ó8¿i@^r+z’@jŒý1ÃõQÒ¼IÑh¿q w¦B˜¹}[ˆµF?o05AU¤²ã¿pQ=¦î¤¡ÿ&h†O£Öbí{°DO,Ìø‘{ûÿy1Ö½\æ»F‰Õ¬¢ôˆ´Vaé ððpøA°â­ö§œ÷ôx±’Û=êŠ~²íi—WªÌ5"U½#ÑŸ® ™M$Vƒ'äU­ZomÛ*_ î…ó‚Û/ÌÛ+r $‘œû¬ú«­l±¶dúä|ù—Uò:%_¢VïÅ?Î “r€«ˆ_øÓb”Vžw—ûêN€üäX'z½8‡\óªwň¬îGßÝdW³‘\°ŽRÞA yP¬è§­‘&L…¯ç1?ÖåXŽCt¤ñî&ÜÍ€6!e¯CˆùãsF\¬ŸØT«d˜³å]šü9ðø"dæùcõá~•î­p#~«ç 5ûw‡•!f² §Éê¾îލœæÅ@"6Fx2r„¸’9éCü~Ž´Û¤ž4có;^uÁ⤫×Ï(”-}³g8ž¾;¶ëÍžVS¬H÷‰Ü N\48Z‡WaˆO1qt$¹Vò_o!6¸æÊ^ŽMKØ^"âv¯Ë|wcEDk3žüÝÚ#ƒKÃîE‡aí¡9Ð=£¡He½«­ˆm¥Óȡ)¿ƒEËB-µú”´ÓË#wée" gµ¬Ÿþ‡…ÿ'‡^–ž¸a\ã®Ã."þº’¹¿ü Úž0DX9ëÜÜ›_k•ü¡iR‰ø¿.œ.¬ÝY[Êgi†ÿ"—þ2@ðF}Sbƒúz1@?’Ô¥=ÆP±™¥6tU¼—ä^¹ŒU¥ßy™z5MK- t bJo¡¦î梙ëÁ}“8P´ÚC—ß›,=ü¥'À„º_˜¢¾W<»dàZKT…S¼¥×ŒÄ“wß¹´x«›ÅhtPklejúZ<³‚Ô5£óu´vƒ©„hP™¬Ÿ®,ñaNjñg_>ë≴ðùmP¦~Â÷翘"žéz|ñpguãD–.LÙ†‰a»Ù}‡æ}ÙÐð\~¡ó_í EÇà}[MÞ'§jQÃfUM_óƒCôW ®„€¶' TbÄè,ü‡‰½fôc‚iFR99£eo/çBøûÃô¥.{‡s_£v>§nÌâg³ÆN¾p—wà Süð(ô‰g ~ÕG?"‹Ýn}ƒ«] 3#*À98”nxüjîmÓ©‘ºXáwžhnËïqAlÞB@q*5:BEfŠ1ÿ õº{b*øƒ"âx¸„¯¸‰ˆjÙ\‡%]¦Æ§Êv£*2)1ë]n7÷å·„®19žô29´±Å¸l)#ñ š¿–w›&^žÍéïH¥•ÿm7‰0Ùi·›¡¹?OŽCWúרÅ/á‹ö¶\é¨,Bþ»&OÈ @sBhí-·\óîÔ#PSµ<Bt`»kYÁÃ@Ö SSµ†ßò}õœËW¸ >Woei‰ò“«þ=;+˜¬ÄŸ·ûÑPÿK=IÔ=žH°çFM ŒIþú¹æÒ‚ã-›fÅ Æ®ØÃÿS‡ ®Ë¹°NaGÆÒòÖ¡=6£Ñ$Åïìnþag®« i:…·7óü¢„þŽ6ŒØó&¢ÞV˜>³L"ËÚÙg&¾Õ\6ZJ»¨j…kTÀ ªLJ®ŸäEæ“\Ú¬úë‰SwØ1<œEFz̤•qâœÎJÚ†³»¢@æ6fHŒ©_!¡jL;¿fÖ£ˆf^¶w:;²«Ô4#³³7O•ÕAÓ ¿]`<¡Äb!Gv§…}öTKP9ûžQ_4ù®ÂÆöæ¢CîìÕ>¬†"å¥0°{nxÎõÎõ·LµÅaaHÅÙþ¦y^†XÖ>8ꑎ1¥…›?·\øúX•éÚÅ·õ|r2X÷¶_5 wþ6NƒùŽ»ŒàH c¾dEÈNµº¹[ÿƒË ‡¦È'éõkYŸ„×{Ë<õ¹çˉÇ;¹F¾T†ör`йùúTK =Y”jA$Aeÿ¿§ÅžŽ £— …Ã]ÈÒ­|kwPŽúÂS©Kn ÆÖ6Zõ͸¦ê½Ró„ÎÉÞ¹·J‰«)u’èü©£¸×ú›—üUƸýJƒ©ß ÑfXæc¼Æ¯9úÜ0§! îéngõŸö˜ù&Wì%¶O ‘^½îˆ’˘)±Î w£ò° gô¹¹¥ÏÆA³ÅÄX5>‰¹…á·­Ø ¯¡I’‡ ßð³ÊæG2Èñ¸›+…°ò~êõ¥+¢ä’Œ Üâ w±°ðn«Ù´×‚ ±ÐND÷<®Ïú4ÇõÔê:²³ ©’:Ý J@ƒÇ$‘›é~xiÚîì‡48\³×²¯çW  ˜ôU”¡´õ*!˜bKã—„#JÏ“ Ê’_Ǭ~ùò‘LÑ µÆÒ+ Áz°êáªcCE;wäÞáå‹.vÙÔ@(ÆBÓ“‘)ë(¼Dx.º +Ÿôdu9¡lAÐ fhå„íÌèZOï>Zœoð ¢³¥²$Ë‚X•á{!ƒŠ^6yï’ª¶+¨Ax<‰Ë5À¬_ômjˆ'ÆBÈ“ yé1¹#v¼Å ÇÔâ^Jõ÷½o%Îw;[Ϥñ¯åvŸxÔ5mOÍL¬ãQnê°ZM‚Ø×šÜå4Q˜“!Rîp–ßlJb<ÓË”ïbð¢”Eçþ/zc"ƒ^­}Íä8º‚ðìêR¡jB §Òvʹ`ž¦¥Âo/3”S_êÔwß–œÁµÊ$…/ì¥Ï ã¤fìÛ?ħ(¥EØ5[iv4$Ìä½R/vjEÇâøL¦Ë–‰m 5Š„Dæ™}tüd5]hs™Î} äi*² g¨È²&J;rtÈ91äËùVÜafc2l¶Í¬tÿ{ ˆø Ý,pg~2P: =Ðwc3y"mö¢]É.àúö—t]E` Ì|(Ä[kFFI+¢³q†ü¨"R¢0t¶o2ëYû¾ÌBdÓÍÙnÕ׸íÇ `É&/«u¥Z‘í=—é Ê?Äâ^„Ðá• æÎ‚è Šn%Ó¶•:e]÷·¢ðãÉvÚ»TîTRÔÝ̤@”¶åŽØ4rÉ£BÕÈ1H7õ¹÷˜ZÓNx̧^y¡|ô«”ƒwY‘‡:ÿäšÑÂ<]]øgÃÓBá˜æèJãÈžX_è¡~‘Yl*eX³yŽròäø× @ž²;w^ËåS÷±%†L°ié\Ì]q 5Ú¦Œ(ZÏÑMZÜÜî?ƒ•OÒŠ_'k¯hD´!Ö3›ãÁ ÿQŸ63ä®lG±ãéÿw¸4ç匇H]>\-ìP®àøÃ_…ે8L ;mè¥ï·gh€·†é²™_–<éåb²âò°5À[ùãí }†¾ y槪þ&š ¨)âºr_¿*¯ÖÅq8Õ“5d•ñ.U¹UïRü¯Q¤1b¿‚Ë—!<ÇÞ¥=ƒ>SB1Å ÞPÚ-eÞŠÝJ½­PþÓÙsY꩞3|íM³"ÿðÁ +«€K/5Ͼ¹ Zè ¼àÏ­KS~Ø/ð ¾óû°íkKzæ\™}ÿ؇‰D ·òÏʼnÁÚs/€ÔU cãoÕR§Å„ÞI ÛQ*g:"ÀãÁn_PV‰Å@ûŠ9ŽÇÿL÷’8*eÀ… ¼Å#4gfAz!2°cõ®Üwþ“Aó߈•zlƒ-e¤i, öë/Pê³Rêò€…ÄÁNmŠö4‚œëÐW,ë’„ê?³ÿíó˜»1‘¡í0»?)–qÇž…÷ºbÃÆà%|N#ËíSœ¸>d@8&q¢iûxþð«L³XUD\;t\çë_{U­â~IšÇÿeïðù¥¯Q/ECõZAî»×õwjÒ¦+ZG8úêèãõ¸Mÿ½•OdÖñ@ŽïïåÛï7Àø8ã¶]gÔý©F²þ¤#P¿½B7RJí91¿TõR² ­ôö¿»  V1ÄPæW7¬þX—’ŸS):§®f)ƒµ°S{i ÀÈbÚ(ÅçXµÐ €ÞRÕ¿Êψ¹ŽñýÊãˆ6Ú>äô?Óf‹OXóË$x3­\¦²qe!-D²m&½¿tlþ´Î Sðœà0ÁØG›¼ÒWæñ‹¬!b ‚>çp¸‡Qi’õž.2m9U‡j…i./‘GÇø05M‹R]Fò'´ÑYÚBÊ ‡ÛP?+-èß_ƒOs4=påp¥z²r˳_¯ÜÎaš¼¿Å‰?%HJb;ɦúÈê0~;n‡a83C§ˆSý—lŒù‚=KKŒ'¦ÃÄ×ðæ` Žb«3?aÊW#É)"(5ºž}ÿ)jÿNÔ†£EQÇà¾ìÆK•@Ó{hÌKt_Õô±*}Sj-£‹BÈ„M÷ƒ£‹[ŒV–øA5K}@ ">÷þ }èkf"ÿxàKg…¢áæý÷ÚeüKÄpGì¬3i ÏE>_pW8J¿L¨´7T¥#¬´ˆþ¿Ì¯¸Žë Y]F`º–‚!É€Ì3f?Jnô†°oK¼ïa6 Q§>ží“n ‹ª¾hÖÞŒ,AæäL]y*5UïrÅI·­Ôã¡sL2üEé^MäçBæÂQR º’46ÄŸ*ŠüÙÁÒû{Ï”Kj,R–ç“…ÀûÎ$ xË<»u?gQúL±a¹¾dÃnÕW?/BÅK¸22mŒÙ“k_˜GM¤{IñåT*ò2ŒÀåä&ýLM¤Æƒq…åk¼.mýõ¼98 d.%”i€)­bÃÊt2u9DûêTÌ?q#š´§…,庪—ýg±UÛ¥ñ¥Ü$‡xat™H¦$}V† Iô$„2ýZK)cuý#Ô¥¸ký3~Õ U«1 k_~ûð: õW¿¿I}æÅ톗5KΜXÎÅAò ÆØv"'<8 AjêýKÃ+Ü è²›‰ˆylæÜèåõêtaaV}Ò4Ñ5R•).xL–»»5ŠTîýeaôâ­€ÚÛÄê .nÞ†FÁ“ÔÛB 0JPŽQ›3¸ ÐEWœzeyç×p…ö¹/þA¯•ÀÝéê:ÔnÄs’Ožܵ.™sϲO{iHB“…Ûœ9¼QŒŒÈ6>‡ LšŒL>Nô²¥Êâ‚·Œ“r_ÜŒ°xorÏpȵ¶< Å´wBX§»òW\HS†¿[HjöÃEî §¿½ /¶wkÌþ:½oWÏR[C‡=²(M xòN*å7õ{øi»ã‚²>~\©š|ö`ÊLþÕ,0Âds)Ìq´Hm¹Sá‚4Pheá0E±F8·*&It@sæ§Ï[°«wÑÀ¹ñxäÕyóÿisàô1z±?,˜y:NÁ3áŽË);äu¾yíKcÙûr Yí.J%)‚×ÿdÅ_2O]¼þ~ê¥Y?!5b¿É;­¢F 5¯C°9â „»ÎPƒ¿"8ú?ÆÆªLfÑñð ¼D,PjO+÷öÏŠ”VÒÆ!tÚX «Â³©s@Ÿoze:iâ̈¯‡lõï;LGµY¥®/„õ¨^”£};†4Hf åB6ë®ËZ8>·¬ØRø¼"í"åi5=q ßv††U8Ë%\iQé «ï Y§AlìÕVQ.(Ïh'0‹!¹Çѳ¸ËR>N¸œ­1\+ý%8ÿñ%¼”[½º}̨˜”ª”’—áÍøðlD(Í<8wª¼ í tŽt¯; cÖ%Ûâtzt*Òz#õ(×2î$Etô‘Ù–—÷RœAG=zc0‘ׄ«cÅÛ,4¥ŽIy\¿5´d+¨tŽ.]7c 6ž•ÌY¦0zøC`ef=”ù2uY~íDôMŒfq~q¥,Jó³þ^,µl€!7%Bë\Àž;XËí¢ë×ÿ!a•Û ¬cÖ©i¶ÍÃÃJœ½ê׆á¸Q¡´<dÃÊé¯AAÎåóJ\çàb”¹ñãäX»=ñcö»¶Ü¬:¾Jñ¸%Óx–ç·/êôÒG€nD’ÉùÌ|h–히U9ÛÛ• påé@ÝÒй֞9]XŒ¡iÇÄ cP0 µ4Û—ï«8Ø¥Bš€º®w¶ÛªüªWÓ6y´™Ã¬nêw£ø[៸;ç›6R&¨J±Ê •UûމÙ8au7­H,¯ÕS¨®.•[‚ ȗϘûè¶m¥V³žJʳ¾fj½° át7o-r¢ž±[KŽÿ TÒÞÑ‚‘ˆð~u±•¦DÄwßVè¾ÃrÚr¿ts(ƒ4E5^`’Ô`6F›„”.¸8ähÅúðì^5+êO eZˆ$Á‡P~ô¦/´W¸:VA…Þj3›1®WÊ?ï£Ð@½sćաÖTRÃHÂÚØË}õÓrÈRÅ–]f-/3k™z‡*Õ‹¦ ÇÒ\ÊDéôl„Ç›—ë!h`ÔpQNîÓ¢˜=âw3½PÕ–/SÑé2-t«ÜÒ Ÿ»bí-¾gÕbާŒ^/ß+ÇÝbŠ{ÄŽžžïUgóÔìœaU$cû|§Ëœ‹›m´2”×)™EͲd –ξfë×CÕSÕoÔ>’{æglRªBÕ¤mNo “Wš¯( “h:b|âëx¸,RgVknvÔ…çÛÔkì¶¿æ4ÌÒÐ}Ë„d6²=HG|µH¡öåʼnkdÜH1¸x€?\êC¡/û!ÏÇ ª,Œ¸k%üâ…ÀIwá´/5Þ«ˆÈ|‰Òi2Û]¦R(ïc¤D_xçS $C]—zÍzìžÊÎ)=Ü.Ê{’H@P¥¤7~³K•RºÂ[ݪy?PUˆtËø²5à¥dT•»ö«&Œ}ì<×…yiÍ/ŸÑš¨éóáB%ìƒn³á¼¥Ó³å€5«¹HIÈxУ·…œš@!Äô.ó@äY)8'ºŽ mݨêÚÀ½•üÑ­¾¼gªû›LrÆ·4IbwðÌuO*2eµp9êz‘µtr/ì–}Ýki_$Ï êázgÎ%LhQ:Èpܾ ºäÀ‡/ô°-/º¡SÔŒ‡?úI]¢”<÷Rþ"s}S=üÓºá7phä c2Â÷<;€òEÛhôõ¼Åäø«LuΛSY` `Ð_üøÅ “‘÷›–n?yòÁƒøbÅGL®õ§úÙþrm+#çðÞ»íÛ+íéNûv›?‡AÃm¯·¢‰õmî·tÿ7]¿ný_VÈö[úÓ*èö/'ê`ñ®n'“Êö$<ñ÷ô˜|Jç£<ÀÊ‡× ÙÆxJ½XùLr=¡ç Q4–ÎècˆüN]7õüíɃ:›º¤Ó8ë¡ùd¾¸¬S–9p3ö…¦Tsƒ|q:P,·ø§åù ý;âP9~ ¼X>³S-îDÚ°¯úßyCÛýŸ#Üv|çç,¨ËŸP«û¬ŽÀäS’OBGÎ+Œqäåô­›r¢„”+aß± (²†~¾Æ¾OËÿ,03NÖîäÑŽ¥«Aè‰u õŸª ¯ß2 GóÖw ,LdK[AmðÊGZšyêZ¸LgUôÉXDdøJ…•ËÑÙ4™›üéY츩gËëv–ý¤ÐÅÕ&Á!u>ibÊ×Äu&°bæêK‰$Y2¬~Óï:\¨ò/”òpÉiYßÜÀ-<"†‚äÖ-ÿ?÷ºItuœlû‹ 9ãH÷X ZèžÀh>D²•}Ôè„MDÕk×Ô=¤÷CöÉ,j³`IrÿlârÇBwãÅÎJÄççt®'@(Öþ+2=ÊÇwãÄŒZT’}|¸J&?ÆYYšRq]°ëùó»áª$q“JYg»ÄµáÃížì¦¾$Jv=‡þø _ˆ„1àÈÌ«k é„$Ú£w§Ih°Â "…߯Òxh{2,<#œù€úN£ÒÒñl–sÿq”XÜiAlÈéåIÔD×@“²ùûZÕ1o£|š•n­ÔrÉ|’N´·‡¢ÃC¬u·¨ÂÂ|åÅ*Oòõ„D„ÇqS²_˜Ù¯zŸî#&Bù²Ê&\ãæ?r8’¬ù“E¡T(SÊŸÌ;ýoUÀY6Ñ~WKþÆ ðŒƒ.Aº¿KjÔ'Ô(v 78QIM•?¶%!ï¡ N„“Dy£&­å¨{‰ùÊ6Ðåñ=ã£x2Lò­‹¥5®.¼@h:1\a¼˜j ÛùÿÇ,šj#:Š8­¾xIÑJ2žµ&íÍVùƘã?^[ìÉ(QþY*`¼ ÉøÓ!#5ïX¬ÿ Xær›è¾6eSgcÂÙ“þþT>ÛyÉØXÛ @•ˆ Ôõ M:2X\fðxjà-°ÀôP‚ý|¡³œ¡¾»¬ß×ð°¿¥Šx“¾ÚfC"Ý¥ÓG>¶”¡Ë£nEoRSðkú°ÀÁÑÉ„Øm÷N?÷HÁ"¬¤ðŠu’§òÈ“ÒjÚŒ®®ÊZ«´œXm¬Ãˆx«ÍácWë {Dk6á ž»‡Þ>¸êjÃhÁŸÆøª‰ÿ%²ö€”…ýga@x¢òb„¿ý&@G¥äk™“y¼×‡uÓ³?£¨|ƒè/âÀôžƒ éyZË[,-´í°^EÝ[†U¾¾4úö”¶7+Š´!`ñ˜=ÚëØtŸpr ÆBÝ-ʰs[‡`øÄeÌÌ÷ÿ+ Îs¨æ¹¶õahFQéÖ¿ Ï‚&­‘â%U0›6 íÐ@ ×YÇãA80ÉË/ Å>eÁÑ Èí¨ŽÙöt3ÿ,NÊP}¼_âr0PÐÇt>ñÙ¯dIûI®t£ øGÓæK‘ÕÕáã©$ËJr\[jƒ“KW¸“S`Ô¬§o}SP¤r2 âmìíÙ¢ºáï¡ê ÇIL]œÿêÌ02Añ  Õ/dœµa–÷ôH£Ôtµ\Åa—zsa(Nþò„6±Ö¤j^Aìc´«•Qˆ$Z¹äÈx(ÊzÊÔöçP:õ„†›n˜ØKµEÎ튇‡0g†P(©:q w„émS&xØÃ’¢ªB" ÑhQ2wÓì]Æê¾|¨b̄д—Zæ¶ÂXœæxŒ$r êMRiëÁ-°²4È2K¨úÒO(h&¬  ༢Ñ\… S¡ÅÜÄô*yíšÂw˜áD¼Ù5vK;»^JÉ #îq…æšhÀš»i†b’ø”ðd½ÑÏXÚ‹nqú1Æy*¶{—p‰{!úñ&k±L¡IÍ~Ê)^0Ƙ֜¤ú9]Q=åüï#k€  ªA—x;^õèÃ3¼¹hNa¯8÷Úd£é’Ôà™ P··Š:CHÿtmН ´¾i]àVò÷5xSãë–µÊ %D§„$iGÚuГ©QÇà ú)3û¸¬4‰‘QKn?‰ž Z‰‡]œKû }NzËPeèGqîCИ¿°T°B]6&:|¹ÑÔž§›; · 2Äþ† ¼ÑCš¦õ®d†ÍèÔsüZ_ðÔ†ØL ÓA»¼åÙÒ²7qµ~,Á 5×ÏzÙKm÷ô ¦?1i' L¨ïÒ\è°=3¬Jc;MxŽJ&ºRh|˜ nºLé8›Ék.c‚2ÐìÙ|¿vÀ}ƒ‹¼ˆéç¨!—igrôþÀ[ïÉÏö=àáu\¦Ú¦{¯Q!úź×ä²5Ù?ÃVm¥kÖäøÿ_¡O¨û¦C²ž :vDóäðâÁ/ܸÁ[_Sä™Ë ácÎXC8™1DÃ~¥SGÝÝ€D/'pÂT"wSP7æÈ_ÁÈ劆Ez?QËô"ù}P”(ýÜ„;ßÊfºž?ç_2Þ‚Ç,÷'hå‘P”€«Ìyh!pJq7ÇéB–: ¡”)Ÿ~8:èÙFB‰V=k\>8E7—à„-NZûOœ°|{Sàì_ºÉêZº&ÓÚJó4õ,F³~I-#[9ׄ_~*È«É;pòÔ? "4‘ŒŒàÃû2ˆHŸ™0… ]éÍL²êSÓN£cúÎXæGq‚P wïõ~¼¶Ùæfí‚¶X?ÂUqZ#÷Í-åŠÎî÷m¨Ó%aš¢ãÏ ¤ y¶Pom®:Mc0c`~¡÷‡^~t+ 5-ý]Q4ÜYQE¿y÷Ñœså¢Rî™Òøãk>2z@tñe]–†ÇÙ*kQ¤ŠË>øáÊ» ¹&bßÈNa‚:''äÃC+nyº¦s™:§I§ ¬/o+z8OŠd}ŒÍwŸºá„­t´Ý´›™.·lHr¿Ú ×êómüµq¥˜Àj}eЩêrV«à8Δ€!ú“¼DË\öø’X¨…• ½é„=tÅG—¿o‡¥t„s…ðê:ÙiôsÛÎÿzºÇsÊH~g„¿pÊ2TÆ[àR’ï,7\ÍaTPÓÀ:)>ØX8øÍimE1g³8!îR´c:¾Qµêü¯‘iUóø{¬%g̱žÕ§bÜÿE'H¡ÓÖÉS3·UÎ|[#¬rd&˜µJ{Ó¯‹_¥z”•ÝÛF]ÂÙƒ P¤%Â>$_òÞtøºØ©ûÕyˆ+—k©d>I}Ý»Ñú}Á(Is^ñfIþ…§l×î÷åÌ‚¬>FŽMj Ý º‰%aìD9Ð^U †™°-шß`z¶Qæe$•ù2²ê“õC«îmÄð¡5³EæYÁš‡[×&¹ÂÒÛ9=½¬˜°Ïf寥±Ð@ß³Ô¹~opžd#U@ô:Ø¡üñYçX^‰yŠü¡©è¥À/öƒÁ=»-¿s@¨jŸlP7À§&u¦yg@FùòÑ:{–]R+޾z…Fr^çQÌÍ€MQ 'ât°øDŒû‰6Œÿ#ºJ}´ÝSguäMxì*®·ø»rÛÿaƒDRõ0Ëžpµ\ã$ÛçSÒϘ?ÚV)ˆ sv>šÿ#óP±»œMÚÐ%:9sÞžËË©Öã籯íÉ3×þ(®¸û¿ðò 5õY ,¹F îü§“# ®øÞ"ÑÔ×ÛãVsÃ9_úÿS|/lÇ%Ý%nϤ à‚!ýtTFäHDá&IÈó”¾+æ€g5Ædñÿúb£yö]JDÚ¦Š®¢Éý¤k®Ô-²ÀóÍ·oDùt›‹H^^ÉŠN¼LTµEmw ‚&%ñH õ#]`åöÞz¬4Ì“7ù¶¼D»Š­ãø@åûglÎ窉¬ô{xaÁ[6\Ç2Š ÖÃÃÁ¡¶/° .8!Øå¶AÓ"{8ôï ‰´Lx'8‰È†D¬5-ihlmS|. )àÛÍ‹Á(@7e_¹ÓfÆdA<Å,ÍO³ðæ'û‡8ÃâA#æÚ¼Aj‹z»5ý^ö8h"eš!&¬ y3ójœ{ÉÂøÛcâÕ”¬Êšwwns‚¯¨Vîj†¦¬ },ôL‡¡p_XÎæC³¿°^ Nadø®%,ãD{ šlïDèu×qÆ)G’æÐƒ„L'èìhÊ7ú4ŒEÅL]_cS+¨²$G™åéÜ}§•¡Ú³ç/,Þêòú+Cü®†»S­¿˜R·8»ä«Ø=ùØÌ€ãaÎù‘ôÅ · …”öB¿wo3‚VÜ[ë®ÿ†R(SÜ.ÿ€©p")½» ƒÃ˜ó®Þ¢DŠmeæVLJ¹UÓ¤ûtÚ œnøè§(C=˜HßÖ.U•0—s<¾‹ ¢' yC˜æ•œ­:Ç)ä”>A;Â/®T¨¥üù· šús¸K£XY@z`iGñ»WL¡#ÁÞKú2 xÁùÀW8©ß:Χj= JéÌÌó×U(ƒÂé-\l©‘ˆòÀGégLÚf/ËÛÀEj²éÜý÷¹Ú»ï€Š=øÖút¤‡+ÖäÛ1ˆ T©þL×Y›íeˆ"HÅmJg'jƒi§Wô¼Ò}­#çœv¾œæFû¨¥1}ó©?8l³Ãƒ ³ºë?‚A͉½uüšˆ9ÆÌ÷ÛõuQØ:•f5½Ç#~D /imïz…ñ¾×4ž„ÈÚØ@!ðŽów>Ú.nû[{ˆ¢×TLZð?gYÆúþ-¹0]\Eúc–ßìˆÄ(çŠÌ0kÛ×a'ˆ7V*1Fí:há/l¹%Xˆ¬ù"‘÷s L%‡é°Ã:JTR1žE˜©ÊË@wZÈ™´¡æJ—iõA.J+÷íh’ÎÆZ?aí¡>?¾–d­§ÿu&M’|®÷Ý ‹©äÖË^_æ&!а÷°ŒÓZP^HÖ…Èvýà C fî~Ê]«H<ÁMu*a ÝŸ!êl²x²'QH*Q8Ð{BÆÂ9¡¸áVú=Ö‘W®Þ!³o2Oœ¯(­Ív×HOV²ÿÙic09žM jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ `ÿ“ÏÃ@Àžfµ<ðEoû™íª# }üßŲ2zð+ØUf‡˜þ$‘„×E§ÿgÍ–®ÈŠü_èä Fœ£öè² »ãŸö¢¥–k0fýUO+‘„¸‰ST*™2£[Æ8Ú é3¡ËŽãnáå’ºÖPä ë3н¹ã¾g†uÏÚ"¶˜è íÍ/ŸqyÝ_ æۯN!_7† Ø ã[Iñ_y Ñ)Yx,òÂÏ-’¢®ºQÛ&Éõ*÷Q¾9âcÕa9õÑSÅ«6Ü:†ÉFbôÂO›ÊË¿óñ£ù‡Má§oƒdGƒUG=f³_=Dì©bïûohdfÎ¥?8:!5uÛÇÛR€M˜øQ„»Q4˜ðÿxþ$RD£¸ãšdYG•• _R%¯|ˆÚ”ÞËÌÚkº‡‰ÞÊÚË„ÁÜ!cœÜ®'Ó[c‘9”‘„¦áq˜ÿ±¶ƒ8‚ìµÒO–ÚÏ9ìmVõÔ@>Ѭó5ÕÓ0bÇË ß†fõ,‰¥®0»-– ÊØht/²6ÏÂûžeÐó/-¼c¼žíÿJÆD$©„]Sé˜e¯˜ÿeúœÆëw=(ý¬z(6BWcb¯Ëf*ÇÑ Þ+È*'hѹ*$ý!=°GXCH¤ëº&æ¥\èuLâ2.ñ4ÉPøÓéÂPñ»#‡;”ÊÃYG·§Ò`ç|®º„o%g0ùÞÛfU ÑŸSÓϰûKi9‚w8àuN—°àØh“…¦ª‘<ó›z ·£¹M”!*º@ì-ä@‹ŒŒoð½µØ¯«¨*–—jüWË(\Ù|†æ;Ç¢Õd iÌÌ•àlÚG›¨raí³ =¼J:3±ò–ܲJ·.G‡@¼ÎÒ9ŠÝ,¨ÁvÉ>q¤ÇÜTN8”¹xû󪬇HË÷#+)³4¨Üüq{r©f^ KOéõ¨TvGAžÒzÄ7 I2)˜n^â²ÛÃ+`Yú÷W[½Å€|”ØéTA0ãX|!}{îªàyÜOÛUOi˜/’C$Çsžu K©#± S±«¢“Ä„²)‡[yÿ2]¤É$"HTžj®àì.0™zܬeßÖÛT(f"æxf%š¦<:°æ9…/«¸eë1ßãA¹Oô„¬?뜬tz¡6úlaZúkéŽSÍ¢ò¹¯PDàJR“¸ß~Ù 'GÕ`ªç¢ø$ò¢Mã+•Iï_äm¸Ît0d\…ð7ZlbM&ˆzfÌDWÿƒ¾6'Ó"Ç?8kÛœ.ùxßn⤞ŸòbÓ€ù‚·•P«7‹&µ“À`Ø¿ö° n˜êm Lôõ¶hÁwùñXÙ§Ùžêi·ÜÅgE’<ºpÇ I ™Rƒ¤ 'ó4³Ì+‹”9éjš…å{x/ù¶ŠsÂ4~‰•¸*ü¤‰Âð–¥M3,Ãí¤aöÐ}´8H #³!5V’MŒ”¾a(ÕÈÝgofDê¿xI)ß“…}{¤q „·I&=øNÚ&Aô~àš«K÷ÿíxmì[ Mxó?<é,¿‹ïRõ€§•LÙ>ŽòÏÁ΂mK¹¨*…Á"î²k¼ÑØõþ|[pœ“¶N!×lb:±TY é±"`¶±übcdfš/=¨„<(7eáKçúy Y‘ÐjKO ·{¦BNŸï.³Åœ¦¨þ ¨D.4àzeƒ•R‡Q‰(÷º¸ù7æÝ– ýŸ¿œ}ñ(2uSù]EHÔV[e°¿üÌúúËpΕÄí6XšjpÀi%kV§*×­,POÛ³8×ÃãjmׯuIDÊÁͯgQ gózõvÙ§ØylÔßÌLXäúæsOøšô¢¢ãú_DV%cØe†¤¸Ê%ú=¥á%ÞU_úÁNEg9Ÿ¡¥i>Ó^/й½Ë ±a¹€@-ï¤e}ùv Šìe¾¸É³bñs¢ýùïY»y`]:ñ’nµHayÿnÃí§¡öÒPü)0„±d }/¬åàp6’6_ÛUì¤î‚UóƒÜCö²åÌÈ£«”¶¼´²pfáåŒިP2h@«]Ÿ ]&QÏí›æÅU—AÒøê‹ÐgD+×sw½ºèÛ|:<YË*»îCxäÄ‚/˜¦ê7ܪ#RVsù›ÈŒð,$Î(ÊVp\kž¥ùCç,à¤ú®aÙ¾íÞㆄ»9?¸(ñ"è€fkZŒÚ"Š‚Ì¶-Í)@A×ÆÝŠL«m³¥áä‡ú|o>»ñâ‡9]lXÙ ˆÙ)~¦ÔΔåÞÛ~³¸û…í).º§_ £$Vð›Wª=fo5©ê†Wxy±Lùõ õ/Ÿï>ý…÷DoÎ+  |Ùr¸Ü ÿ9à ]†)—µBA-á5RÛ~~kÒ÷¾ÎÞ׊&æûeÆ3áæýŸöÏÒ9`ï¹Xç‰úÂ5_aÅ"JOå²Ie$ho§2£E_þ¼:ð…C¤W] eùùl«C¸¤Ö’ÅúØÑYäE[ï“ì[®ó¤ÖLµHçl½$¦ºc«BùÏìaÞj²×6Z=½´ð·4Rø•¹.#ÇD[FÏ΢¡‡áO€œ“ÿŒL6QÆß–}‚èê ·ÃØñl»íƒjè6íL?8‚"ì¨PÎxPâÜœHZ‡2ün ]¯ß/XµZ ìî)ö*2€€}‰à@;œáZê½Òæ„4ÀŽÎ½7@>³e&¨ÏéÙ›µµ×H@Ký·…´D†2l]T@(oŒŒœØÓBµÌ¡õ3„]ÉV°@|ßSž‘fË”ŠÀôÚE-ËCØfïÍ¥œÙOçárÉðvb1ŽOÏöŒå=”4.”y¯–ÔxÄä`÷Ë7‰U®‡CP®ªx°S1Y’mÍÚ°›é­;Ûµ|?ÉVl}xsãì€háYÊfïA{3˜Í”û1F Áº4âRíy÷³² ×ÒW5Æ1ˆÜäÅ;¿l$~ì™K>l}ìãfW@¶—;PÆjgò€Ò£öN9hÞúqYI¨èo´©TÑ®›yŸQAŠu,4зHz‘<“·Ù˜P- {(cq¹<Ø­Jèî|y¼ª×»ºkÏÄdò‰ý]ؾ*Àøå-N‹ò}ˆb,p³tÙ<Ïo[ª¥C±Ú µí¤'œ²‹<÷?N‹6­&Þxj©úÑç4~1„Cé&ûÙ¸nÒ\ñþØI-j[Yª Ž´*ÏÏ¥9ùôqãÐÅ—V˜S!+Ä«B³*Áã ¾ùÞ$ËÿÒëÛŠØWD«ïaR%ëûŒ¨ØæbJÈðô ÂôV3Rñí‡V^÷±¨øºÈ;Öu Zþ\®'deɾ৹”Æ&ÎÂÐߨ“ÜVü‚ºó–Y¶èÆ.yX4‹*̶4ïãZ¾Çäé9b` Ìİ™k1mH* {¶d ¶üæÌ%I=1¾¢pQ( òEMƒO~?2I}{]„ý}Ø€P ~ ý”É?£á¸yMsBÎvcJñ)æ]¿¾E’M‘ìΫÒYËújcØ2cŸ€ôA]9AÈÊa¹‘ð8ØÏ"+/¡3Úƒ.ð ΀}«XÌåR€õ¦Ü~cÈ%ëá¼aLÇM닱Ұ:ŠßQîˮ̬,J€.$™˜nüãpðÏÅéÊÝh öšû­ð]Ù¼‹›Yõýäi¸ì0E²JV:‘›Ç@BºG¶ÚˆÜÉ+Mgío2|‡¨;šêc¸o‡àOÿß…­žÕvv:Ò÷@œD~·5eQni}«*|çõ’õ<6A†®s„ÀÍ· 3¬æ9³åm}6&LÊÙ;+.“¹‹1íc¦âDáeYó!9‘¦¢°q(˜i]‹N>øÃprþe6ij@¢Lý=ÚÑ_‹C~8ð´Ù$t%Þ©Çéh«–Žó>·<#”úù «]ßÀ°aïù Yze©"˜2ö”±IÇ2?”Ó~¢Í76én¯"ÉâUÿgÜžÎx–W*íl;?d¼z~w4í˜ÖË{Š'¢ÙÅîéæU@½F,ϵ¯ÙØë1&-U#’  —~w |™¾/é3ƒV¹³8ò‰KGåX|Mߘubš±Áúe G\ÉÕÑÛúÜ´UÔšp''/ëí\®´Ä$ït‹¬ ¸Ž“¦¸þûÛ\ÇJ†²7_¯ˆ^«úO›û z¤`VRÖ\‡.ŽìJ Qš!»Ê_w¸†]/Šô~/ºK‰Õq•Ü.7óL¢!¸ê‡Ê~RTNîŒi«jR´ç%ÆkOÔG¦²Û- ”æçHD5+¬ (,·½‘XíÃÒ~Øàùà@a÷!ØÁs¼j•ÝÕõºRë]6Uä—ˆc‘  h+“ºå!3Èl—˜ ή•Ëy¥å*ÙeÓŒ…Ï@vh¤*–QZk ±ž×F›ôèÜ¡2ƒi —*ëc” ñâº.‰}˺ꉖµ/\ù]=w84'È‘æW_f'„N÷°å"éÎó`XÉ d»†«hÀ<÷¡#Ö²áïµxñÚI‹}?P%3Ç—‚ç ´¸52›¼Éok\â^çn¢â‹:õ§H~…üU¾+xw:]À`›W×½¬ÈÜZÙÒ:ÍÝ+çB8ö|ÂÞí»|õHÈ}ÞæeèÞäÕIïn˜—–ΟÌkSªL†ciN£ž­‰êÞðÿ.Pû†M6!TÑ]úIòn È"Ý—½¾ÆæQ`mòW³ñÜA¯Jã]Ð×;q䉵B1{ á9oUÊ>ÆTF’ï}ˆ]DWÍ«ê(æÄð•O3 ,ªÃØ ÍÖRÀt,d”_k"<ÍxÐG«\÷©óK§³Ð)%”5náuX‘£ÈŠ»MÍvÉIé%†w¿ Èsxz4ŠwyQ†+,/¿y=B<(*ýÂŽ™kÏFÂó+ ‹•ìöck_\*Çé9äÆ÷0`V§M…3Ê+7ó‡_º n¿ÎîŒsúŒe9 䲄£û`'ÑÊ_òK†lPµ¹>m°Ö2³<ͦEY*UÒ²è^û-cƒØR’mrV}éøYÌ1§@,-Ðî=ýwìizùSßË™•4=ð*®ÃB4wÀ/S-$Ü­’‘BÆ Ø¦m*Ó¸ƒ~ œÂ ÍÊëC´™å&ÐTK0CÈYGm}޹?&·•Î’«ïiÒ3êÁ$Âú6Ë.ÿíŒÌóµ§¥(hóÕ HŠVÓÌóh¯€Ð²®µ, < "Gɸàà¡A û[EåÑ(ʣВ˜¢à÷*{ /¼O¸²ƒšãIiy^3Xˆ$ö`è¼ó0wE+Fy‹Q”&òÔŠ A\Ò"¦çp!@q1ª6*\ÌN‚!J:lÆ-@ õääí)YcÐÿ?dž¥·[¬kØž¸³‡9¥àpt ìàï0îOÁƱ;r¬íŸÀHRãm {T®Ü=§ JºýGòTÝ\r¼m’$öëF}ÊÞè]Çá³Pûuþ†¾€ƒ.éæ_D|øeÊ ÅÍ­Ç=-Mw‡°bóÅ>j‰ŸÖ3*;¬&ÃKEžßwÙÈ/²¤2kò½Å(©EI4 ),¥À§,O•©×ìk÷¤&]T‘á&w¨äŸ—󌬔e2òv¯ÖBÌh€bélŒ%Ò>Ú•VxúrRÝÌ^°ô ž!gv?SYç×Ö¢ÔËÃÊ¿äƒùÔÉç˜Y'0ŸXÆbH•æšûy¶‹·°k",õ”;¸ñÖ)ã°n7­½0u¡©©[¢®= Ë×´BKï,Þùê_Pª«öP²ÝšL¹‰ÝÝÎçŠòÃÔ <ØÂרƒqêpw´¹'Í[Äé4I»šoc|jóäMÞ£àÐO°„‰‚BFiKdÌÅwÉ k¥®+‰—øZ„CA!8Î ¾!ŸLnªÿTyã) ÷;ý”²LæØ³ À ÎTÐXÅEùc9BõæšÇQ/v;«±V?ã‹Ío¥J¥IÔšÇE‡~Óòw× 4Àºn¿} bB}>änàÜykîÇêuqG åààˆª·ü³ÃV—VþÛ òxÒA*ŒÇþÅå˜kN¦úêõd½I:“ú¼ZB€nl»jjQàúÓýÇŽ‡œ”âý3ÌXžH[m Ú'`@s³6œÖžôà4Õ«#¤N·A„û²R‘Ü%q}¬ä ?j`Ëä۫ÂÃmÊÄ,U°Gmp.ÓvÅž>ó<^{¢Ö© lò÷jHÕÏ Ï¨¤fò ùZèà3ô¼‹.Å#¥ ƒ&¾ÎÉ>¦ qY¹ËÒTdì‚“b£Æw-Gs .RGŒZ…q„é´ ÓÒy8òr7+Í{— /O<ä¶hÚØiej¬ß½ÛÊçŸEd%Ÿ=}ç+ñdwô$•0¬_|¯òëwõÓí´“ ›ÀËžËèóKbIÿ<.I‡Êb×wý]dm{æ·¦÷¡|ðó§n¬qÌE.`.ì2½Çƒ²z,ù’Mé¹å>M3K+ó5ê~vU~Þ3jvHh« áðQ¨Å¸N6rûbÃdú_Ugû#r­ŒÇjõF5%C‰æˆ‘ç‹aXõswÇwÙÆ`J©ts‡%àõ¥œ¼.ݲŽ)üQè^ fÂ%Ucä\AÀ.‘åè7‰±ˆæ?&·QÞHÌ‹`Hr؉ÖÃ,b—€ »VN%"û-µNÔþ\!šÝb:EMœK²=Û+NÛ`Ž#Ýu„Ä lÙ©˜g¿YÐ0¸8ª½íÆzWµ Q¾|Ñ1sÿB?ÀBN²,“k‚«'îH‹2Ê™˜rp’ƒ¤ï…`Ü/VWê%(IÚÖI~1{¨D¤"+Öî׈ 'ƒkÏDSÒfš":ÑëÈ6\X Ä«©ªô܇]$ï1˜;b1C ›OïAéÞÌ3îÈ$B¯Î¢Õä‚ÁGO#|Ž ÜfúF<ü$_Ÿ)'>^Ê*‰ÃíÛx}»?Ãi@ƒ>|2¸Ýcî<¤#6P½€³tø©Ñ™Yb{ÉÅÔ­õT†ëÀæd?‹4xÉ„øÞª¤êÏÝ"¶¡äœ‰óË!m·Ú4øÌRZö_•<Ôgb:@'KàT¥è±ãSçß.>Ý8ÝõRoí \#²k³Ôd!DƒMã­,Ó8î%døñJ.ýE-+oÄDÂ]ÖNü‰3jg\2¹³Ìd0 å~’ýq¡"(úÎõ¶Ùþ4’ éÁ!c>Éàø«ÑõsÇK`Û`èFʬ¾(ʲcf9`ÝJ ¶¡3’h>œ¸/.uStüJn³Lû*-µ×Ã8sH€Èý"@´«i=T‰}/^‡¡ßØ‹¨w x7" ˆ ÂÊï²I¡°þhþ4 Zñ.SÑ!H{HËG€\cgâV.“¬>ŠDŸ°ºÜ¯ÑVÕ'!÷W}±nÃæÍ+Ð{€È` h>XŒC¤OìK)ûµ…ÀÎn¿)í?M‰¨4ú”ŸìwW翣ɜìòø%ò/ýÄ«Úiž34lðyÒé]šì¼ÿ ›sõµ¬Ê)ÑQïWmëµQskN! » ¼\èÊ^ãE=˜'vnÊ;ùA{ÁT‡iÝ d¸Ú6›ülG$hçðPÁ ¢ç+$§|ð>xîtF:tádà©ÎÓjX}ã †§qiP;màÏ%›}nÁôgJks 0 b<¸0??º¿í? W­ŒÑ’ÊKI}ŠéúsáÑSQ¡]©Ø%Q|ÁиVÕŠùN³`ý|09†Û”¼§Î€¨šîRt°[œ> Ra6®…U\ƒѲ‰CiMk?Rµ²ÏèÛìrc®×+,“ÉV$ëÚ4PEåTášknöÀïNþmænCwÜ­ÿoF%)^êW?îˆIËhã«iÎÖè­éðý´ß¤òuWß ´`å0NÚõÆ;8¯“*õ´~FOÒ%xEÆÔÕ¼52eù#9  üþFi`zÀUÆî‰¯.ã#Ý ô»S<¦Ø©’>`Wþ…“ q7±¡˜‡´¿Ç(7„FŽÂ„ÞK%ú«¤ÝZÔ´{¹׸k2^ÿ©.)ÖOYXå€(ÚËàØñf&¡RžG¹ÕóyW¢Ò\ÝNFàúrâØBÓüýÑHø´‹(`×ÌVùt#}€XËb|ùÒœGMüŸ[l€Lžæ?iØOg¿P›ô¥ózlvðÞ£GW–º{_dd¢¡øíu…Õ>¦”2ùMçátx9Ú°ÿ1ú}§9ÓÈb9Ù6µÞå"ìBY$¼É2ƒ[Q@ãÒ?ËšÑRë'‰°T ~Z£ˆ^ˆ§Ýmj—[ÅŒÃÕ ,œ¡£È'eÙ±Tp…‚X+á(I¸ÁÞpE ŠpÙ¯ƒQ}.æ¢,-@¢„–§£S†ê=£BÐèUE)BOT”J l·á½™ÜRcT(V.ÎFþóx†ˆ™õý ™‹»ý©úÒÖl"!_d“2sXƒSœ,㫸ñÞeÍÑzuqÊåh˯­ÀÔ>vmb¯hk(­Bú $j噪ô‘ÞŠ­? VÒÍ÷1¨ŸÈ;x6bà°Õê˜æɧ,NÄ3ÆnÈá]’ȯGĪoɨÔ×i}ÏÏVãð×(>Ý]ƒ?QèX¹òG°šp€ü©ÑŸóæm'¬¾¦Ä‹Hï/¼zè÷ÀLën•«oc®Ël5e´WªHŸÛö3+ %O3ZÕ³<¹Ü¾tgÚõãQ¥¸N.^2\Ï„££ëö—€Ë^ÓÉõõ«O›MyOª¿¸¶%‰ê£×lÀžús½hÄ àŽ·ˆ¾iµ­ŸSîœQ AüÕ¾6­½4X‚s‡‚.ÿr¹È´øý²V4˜:<ÃGJÜPY»Š«ØÝlWþiAŠ+¹3NïËžÇÏö…¥À#³D†6ôÍ_2ª«z×s½9²/Ä+ÅO¯¼°íÎ]š[ãcæzF‡à¥mv€F[ÀÐ]X3>I6A“¾‡ìŸÿ( UëìjŠk½!AVœçé])>´ê,Û ßËásܲ}Rw¬3ÓG­+¿ô3Ç:£‡ôi/²s7ޤ7A€_i¯ðNøgÜgŒkÎ]ÚLÔtXµ»üª“÷>š·ö†ä“½?ª`š~µûjXKÅ»’D>&r^@š \)h.c3¶¯Š¡r¯{5\÷°q9A…Ûǘ¤ßeDø~+vˆp®U@DX±Wvå[Yô,Ë.g Í>ÐñÁ†ý×ÑIT;”K-(B öo ‘,ö S÷q«~Ò ÊWCQp› °°§ÝÛˆx‹dÚp¨ŠJEû‹úºÖÄä­PºP-D¯©H OºQÉmÛcÀAæ!¿\tÿ Ê©µ"âo IPžEž6^j¦r¼üùް/r…ÐfþÔó–™V‡3#…öÅŠ†,š}c ;ö$—F[œsœRÜäøBékßÞTvcõfú®"0=šžKÁÄ%{Æ‚fÞšOØæM½HîFƒ¿YFHm7™›ñŒàC0's}ížâ3¿ºpý>Åçó_Q›ÇÔ›áºÆ@Œ•Ý-o1Ø⽈ú¬«0Û©Þ´×ãm†/‡¬Ùo ¹ÝN{Aè u?ÀïòV·à+esøAÀørt¾ªk³€LL–N”²x­~iþ E _gÌÙj¤MXÑ–>5¯îØöž4ÒßÂ2ïÍ<”‰ßPoB§ÅtâÞ„ÈzHÜÞ¶¦Ì©•”G'K'è˜ô[RØ9¡9ñyµ€Üm B ÜßNíÐ:Iu´´Óë‹…ïÿ>Q²µ¥ÙØÃfkÞÜœ©RšöÙÝ»(§øž¤=šˆ«NƒÛæì,Ρ:’K…M§Ü[Ã=ïP}n}þØÏÏÛ"~~Ê‘ùû/€ì‡àŸ‘͘w!çqsdìM!·W çAþѼ±ƒ9ÚN¼*æf¸òk©·Eï‚’Ý>žŽ’”ŽòdíÓVUé ´ª>_¹·™8NÚ#Jb Ä&ͽ–sI™¥Š¯…ö¯ÔvT¿´`'ö;YU^&hÚ½½[ˆ{§ˆ ®Íý“>-zóìû:R$Å! ²ä¥H é™4Ÿ>réÑ€‡¿fÇx~4\þ˜Îh8Ëè§¡æÆ®"‰ã/>¶t“®bÓ5€þ‘fŒ¿´*™f¤b0a‚Æ7ƒ/%›RKÍtq­SüIe„‹b†0_y¯zÍ_¤{»'Ùp*ÓÌÝ)¡—fîfR¼4vÝE"ÄÞó™VúîØò,60mõ²Ó©Á¥7 =“wh|¿3 e†LEÝFXë á‹ðñòóŒÏ÷%Ð{ZHíü6ç. ,¬09 #iË;2ð2Ée’<Ž(÷·Ì~7óËhÁ¡#wöÿDE”ÚGR" xƒ~œOñ;Øb²ðâO"2BpªuÖö  ›¨ÑFf;h솵eq%@žƒñZþà°ŒJO…Y=®~¸]ÿ‚ÀÞ*qç­ôëX©RÑÌh="Í Ì-råU†Q¾\°vzr3¹±›ð/ä”n(¬æêñ×’¿ Ûà±Å’˜eÇÍÑ|Bô3D:"$õ—·b¤et€cÓS ×U»)(sHÞ}“$  •X†¤¹>ºƒ¤ks?’A¾ö8k}ñ!rh{—‘…Íülbþ@,ÿ³D©šp»æºý÷0âÿtÔúΧØÞœxUyô¹Ê-,vý _eúQaéE»ß¢¯Êh!T°‘ùÒ·a*%©d´p#;=û‘¶¶Ø™Œ¾y²W#UäÒú%DøS©™*Osö­é­lhÝ=j)™ÐïŸÞ8â¬ÜÒSè7¼'|@Ú[«$–<ãÛÁŠu‚Xž¸am›œ‹8G ô¾#gã·V³ßÓ ÚB¼,p¯ÐË~´&5ë=õ>€{Ö <{£—óÊ6~¾í‹Y³ó~ŸË½¤>/„o«)ë}¸Èù#§æ³¡Š’åü’rשb|_ J/9foÓ hª7ýÉtY¬JA8Q³tûÙD8-‘nÇ_*9 ­ýßF›ÔDƒta{jÐPتÐ\©_ï>e$é=g‚3ÒôŸE¶'b †ÂX#_láîW¦ô˜ƒŽ9²ó8¨–®eÅ’Ùðݬƒû1=x~¬‹Ó†Qò)é±›±dÂÐ5­°p‚¦oðO® ‡O‡s=8¾Þâ5sÀ´ýÆ3žp…5®µwÅ5î³;'ÖÃ[9Õ+Ko@†h‘Ų~åMÙƒUYð“7|l‚iæS[¦ §£œ/ˆ—,%~­¢N+70Wéš2úñç²NÁ³JµÿÞÂÎèò|æ“°ÁcÎíÄ$`Zß¶cQ Mšdn\t Ëÿ?$iE½ªø,ùZ“l?l‘ƒÌu\ŒTCÓR'Ä,r3Kå*£‡¤žüÑà¶„yü¨*Ñ¢©„þfõÈ&X|S ˆZRã.vw­ïŸ¡Üh$âJÍ’dóØwÍT`¶ÐZÇP¶ô.±ˆ›þÔ”K/,w@¢I#Ÿ*Ï–,ÐÍɆrAÊJ¸hSf÷5C\/Ûì+"ó*ÿÀN:†xe_s]²ÏP²!F¯Èð"ç8û‚Cüu¼móêrqâúÃ^ç’®ëŸÛ—ñ»6¨l}]äH—D<؆RZ7Ïiâ$4H¢¢¥ÙžåSàý.‡"Aš¸%8 ëáÚ:EŠi3¼{¦þJ0(ÑE³ r ùTFÕêê¨(¥w–É9¢Œpü¾Ý]e¸Y'96i`7¸Î‰f*ð<¡6ï3 ÅKêê¶G‹[aÑŽ"xxÒÛÕÜ–¬À]•#ctD† WR–Z\é=ï²s’egtù)úJÞû¥,­LB¯fz-:È“ó˜Êfg9¹àEÁ­d±\–J¶µ†ÆP=Ï?C£»Þ¢¨Åí‚¢‘”挭äeÇZâÚ¬BÜ9:VŒS¬ž³'ýQ+tÖA=pK}mpcÞ!Úþ“<|vgÆ8wÖ0!4v‚9¡Ã ,|Ó@z;VC­^;›Ù U]Øqü¦:¨û²¯ŸØ¬T’sn´ úƒ;Š>l«¡´ž>‚Îp?¦þ³å`¢mtñ/Ì^I%»ÄggG­i7~;ƒ9¨I0é ž÷# $AtèæU}ñj$v°„LïóT¸ï5E,4ÿ0bÝ‹XÖð#:ýÙõ<ƒzÛ6@_ŽxOv(3+®?®€~F¢/iÞ1üv®P_Wâj‹OkÞs¥•ÈÙ rNp Ó§×–Ç…ÉÁ9¨7©Ju ÇÚõJÒÝG›—SÃî ©ùÿF3{éö²\*ýbDçe^NŠÛîq "µ`æE¶Å\¿˜ìsP5Û¹”'&,FÿpÜQìɾ°PV°Î„€´ÑwETÐl(ÜSsØâ©EbÅô„'ýQN ÷¤9ót-eHâÈUö+öÅzdi%Òº¯ú£ é´ò;øËÌOøI±øB_Þ¾sÀ `ázk} G×’Õ'µ¦/ÍÄíì;L'†ýLõ±x ¤c¬]e•0NûXÚ]0O;e¡M½÷>¦JV†Ùs³îd£ƒ*¥°¬)HN2.Çt¾ÒÜHuÏ:ª‘ÒIÒCS óÁÔãqpSÄøïÑÇE>ŸlÀb+²we‘ÃâÚeâjïÝé•ÙŸs.拲¢ù }=•êµ^ç_íFפ’r X»\ÅìœÓ$¥r=ws9HŽ íöë]ë\@¯ñÍ.fÙ.³ÏqͧT}û÷Å"V^JÚÞ˜ô¡àvh¯(äñ¾º‹&qe;Íí1'gM«­n‡y-G~Ml©FÒtúÄFB^ èÆ¦z.Uò&K O„°ðn°ÔE8cЇi w4á:IÚT¾>ɜږ­p8°Ðl;Íö…s› —îËÐúØÈψˆk gðÊjŽ«¨Ež•×Hº¬ „.ñýåb^£Ñ¸‹´Mþc˜ò×ÛüZ®5;<¾"£‘ý»âÏ¥¼ ¬—¶WCÄ„FV¥Àk˜ Tü11`#ƒÀË€rgÛ‘úÞÄ-凇nIåèÝa•IŒ‡¿ä“4=ÇzµµPçžn7æÎ·*ªy¡½~>ùÉÚL¶ŸÁ]óZ3›X¬—µ+É- }‰ÐAE˜ø2ÿ!ü7‚šÃ³­ ¼Ûü_ðœ>À·F×ó1“µ!0Ù¿öšõ‘ÙÙ±{Gakn Ÿ¡‘ú¿üˉ°‚ÀÖ_dJ|½–:ço½r§êê¡úä/Ðu{X}d[¹­Ã2Õžs‘µöW@Ù±!å‰ç@‰^ŸƒÁ£'vÐü4¢_ŹJ7fØe`»jÖzÈ& 6éÕ=GoXR4ÿ7/¥Ï®3_¸¯tUËÝ&F³úðçøVú%—Ï…¹¨—ûVtJD%’Fl­LÀUܦÉ[h'dq¤üo,d…¼›!ÎÅjŽç%·i«‡c.—UÀö´¾ß¹»ÿ#ö…éÁ †‘ס¼H¯¼öƒCgƒåt0ê#:8òŽK‡ ž¥y‡‡Aǘ(B<&Jp—lðèã–µ«Ú+ð*„\ÒÝJo*@€ûm[r¡A5ÍEKŸÒÙ.*!¸ç‹V¶ÃÒ6›Kô¢ÏyïtüÕÕÒÙ+ÙÚ+¿øz[n*-ã6<ä#ÉWz}OG©ãÍ]`œæ¸Qß¡lÅ<¦§VÔŽ…þJêÞñFÙ7‹ƒÏ¢ÀBÀñ“«keY¦ß(ŸnKø$š+ë¸ „ñQêôýØÆF¶¯Mh,ó~u×íÎ=‚´8¸Òz:;/³`?¢»ÐyV—kgP|Hk,qî=lÖä"ô 9CÛ!dø„/à6ʯ«ö…—&Fªä8¾…Î!]˜º£Z务ÕföÌ9¿byÀ\®KX`1N¥dÊj§q÷^ÙÚ KtˆÀ@x­ƒ=]DRÜo°eǺ ¥2Šf±¼A5Qm¨—ÂË@£Ý!ŒËR¬€½v— ~Æ@ÝXl±%œ?Ûm¢<âÐOË &Sc´`Ûìʯ‹CAå4>“Ô6q±R³²“PÀ)1|2’ >%†y9Æ´5Äã‘[!m§4í2ÃßøÀƒœ:mU[ëÆÃ %Ðõq¬¡½[#Âò'ýScéu "s4‘S#­ÝŒQ ®D$:ú´4,`ó¶E @™(gSÑgïIÆ9Îj'½Mû—~ô Áþ)Êk_GÏžHŸ»%«¯ðPn!ÖE›IpÜkŽ-ê²)£RAzˆÿ"xQŽ®¿0G¨F ‰ñÍ'DŠ,îÇ«@ý쟰 Z1«s+¬£"T¯x^Vø´à”!ü¤Ô°ýÒÜ=*Q>¯Þy³=µí70!ò ç×3Ãs£2ÈW‚™gÍáy­Š¥zÐÂyŒŸ–çSq”/5§¸LŒøÅ¾î<ŽY“öÎÄtÃtƒJÃÈ߸}Ô½¢ò§‘7Z0ÁAâ-¾§Óü|ºz\^ƒñ|ÙåÔ+C8fÖšCå\ q8©‚6c)sbOäX³nÚ“÷c} '}MƒËÂ95!M€D¿OuôÚ´ãz„’%û²¾ Ûùû­ £¦Ñü¶Xãñ@Ìhèˆ?–…É~ˆ‘$Üë ¡¸ƒ6‡©UÕ·7à9=Õëaô’iÁ-?œö׬oºG9åZmÅoD‚ª’ýou¹ŸòyaµÔk!ÿäP¹Ëäñc~©èó-eEָݤH~§Aò§§$[M¤^Ði£9›[©ºC²¥ð*E”!KÃT s’aé´<ɦ{µ×ôÃó<ÌEy]®Û!«;CWR6D¡þâ¯ò²rT½îþâþU[USÊà~Yj#r.²ò¬㠩±»²Ô#?ÂS:uæ.]³hØ€5à òoõhÁp—L[w¨ñlˆ݃=!ªq&?ÀãsÜÝ1âÝá#Ðfí~eäÕZ,+íšæØæ ñÇf‚}Y¢˜(y £ÍF¹äŠz4J0x{n8E§ ?Â-vÈS’oÊ—}¤zÍÎóHR†¯_=h®ÔÍ‹kSÉØëKW-|ü›˜ É] è=­ƒ³Ãç._biÒÕÈ¢Ììäò”O8üá¡}üùŒâzö•Ù÷˜ †jb6’b뢻/‘½F¯’A¦žÚÏÈG<ï¶èþZpH#OŒG¬ª+ĸÓ€­Xe8û~9{È©2m‰¿U`O+ õWfÌŽö×QȯQyí½À©Úx*’ú„Rm8ˆv8äjvìõõOë„Á[Ñ9HåÈÇ1çSìÑ€cè‚®O¨ ‘©Zi˜ÜÊóå%o݉9 Q"úÇJ®ÿdôT ÒTÝÈ#åÕôbU’¾h©;ûfQ PÏæmõ>¥ÛlÈ3-ƒú+!’‘G¡Óen ˆ9µV©3Cò˜J)°q4õrÌ!Vß$ú‚ò–g_ˆdÕ‚öXX#G‡–Ð^sÜ3’ºu}”ሴð¶Û,ZøòÉ>ý©äV]†fÁõÎeÛ”ä£í—xV1”üŸ\ È''8¯W° “¤Û°òUÓŨï¿o6?LóMM†Sè]x¶Ö‰çÞw›“wÝ5«P‡ŠÑ/mÀ³xàž‡•_š¨»=]3×$¤wÞìob0CN­Óèì@Võï°äcQ³ƒ ¬öŽö#D—ç¾ò ¸.«ñN x ½ÿ(à89ê\ª‰ÆÒ¤&®€I×h’¯sˆó!jSÑöØ^»ìfãÑgaöqÓ';§O§0kÀw:&}O Ž '›» |ÉÙdÁ›¡†”G_h)½$É^A‚åH Hbvo~«Ç¯ñ'C™Zz~ìyâ÷Ÿ{+÷§_yùvb §¨ wй¸OÐ<­ûkÚ0åò%Àjšþ YÚF‡V–0 /ÇhÑhö÷—KÃíô‡ÛèÃÑ웋ùè}MWeÊסŽbˆ¤f·o› ÓsŠÀ^¼æ ø+P}yrÅ#z _ÆÑ*÷ù"ôæQ”á|舳Æn±:=Tzø…ʸ¦j‚°dq›;ÎcØê˜¯Áì’ÖÊZÐ^°- ª]KD‹R³bAŽäµ1zfZÞßy(™™ú~yNÇ·_{›Ê(dsAá‰!k%ø Zˆ°#*{{™…:VÒbÝhÄ|bjGéIsáWÃ?'dÌÇnÿ[¤/sÿsèuíS› wsºˆr&×jsñoPÍ}BbUš÷¨È{-0¿=fS‡Já6ÉU Õ4¹"LºÒÌòGÕ˜ì¾/»Â£à̳îI¥«Aþ]ûÓ5˜ØRWë åAT[ä¸ëЏ8f4Íd€lK!2žŠš¡äu.o||]ð…þÃÙ¢¢šÛà.£ÏWãÊîrÀõ b뇴ìåîn7¶Z\Ë’úÓõã³Ím¯ùµB7/¾«AüsÄ›(ÿBºê×àâ(—3mˆeDt¤ RUSα«Œ*%Dãyh‹ÙÂ’ijúÍ|Zx¦v¹b÷tÒ¤×\_2\FïPë‘AµŸm‹:Š #ªØñ¹èNÅU´ã+ë|}òýÙ¯}°'>¸~EÔêúßÒøAlGÓ:¥] ~™_ÓªáåHn[þ ñ$ÏB„-ÎtUšiíJ¾é·¯¼èG¯o¯d3p¨Õꦫñ£Ép3»e­{ámú7ÚEaÎ^.ªøRÅD-àŽÅ- ‚OËŠ•á@b‘t +Kq>év%1Ç ¨ŒCŽà¤oñÚoþ|^8ô*WZñVÍŸWg¤8®§qíZ474?ŒÈÐÊ ¸º½„Ââà‘*]ùlwv¼(núêìE÷Ñšð·×¬¡#*ñR\nëHQçÍÏŽ±šÖÚÿ|CFqHqj#žý2ËÆ¤ÖÃïÈ{*$„%÷{³7W‰ i‹0¦®¨i‡^ðÚ CEæ×J‡×ö›µyT{€EÕÚ/ri%¼Á¯Ow¥Gm2´âŽòç&Mam׫óL€TAAwk”ÎKj÷&“;¡¿G;zݳnøÃH5ZHÞŸ٢µ™Ï²Ö¢E7 Ò©³ó¾ {VJ’oÊõÒëgW ¸1ü¤=¤Œwõ”ÄgúÚWÓ¢K*ÈɧٻOlcöÁr£ç?C#žØW&.M$””å£B&…:– Ò9Q°oWvæ{ÑXñ¡o ÏukÆ‹áaМ‹ë [µ¦`è0º°û<›_Ø¢†2Âþ8B¿®.#¶c d¤)Ë]uy Œ”pLº-+s¬ß œ—À®èd$rXnù›)êÌÉAK:þ~ ž÷Ž”õ”je&AÂUõ(©¼äV-:Êì\« o¹wõk0 ˆÂjyžIEƒ ¾·¸oì’Ì}殪Á¶V-vË—]˜@ÝߤbNª¶}ÂSšuâa2¾ aˆ"¬Ã §X‹õJPWõ›¿´Ï{K´iœjb„Zæ 6½oíí:Ðð™CFË.0¸žôÒ}s/OI­Vü$ˆ†¼p˜@ãi[æR¨fè…ÑØœ{“Ú‘a³Ì‹>.²býïé”Ler¢W;J±.Ù牥ÖˆñÈçëuðá¶q»-²OÖeÓÆ,™„ˆª NDÚ}«&^u–ð54Ø8»žwû aÒ¶[:dÐâûA•”ýù³¿Qÿ-øÁ¸:ñ2ïõ—½WÛzëI˜Yͳý´§£ÊòÀ;u'éxª†³Ìü]¿4´I1ö ;´b3RÙ2m2äom ’Jþ û®b> ‚:^ZoXGôh·Fr¾é*‡IÊ‚ýhoHF…-î¿ÁÀÖ'¤87Š,äÞJOJ—ßF /˜b”K>ˆXGéİÓ'ð‚\ËrLeûk¼ŽPL\ZÆRÖòàæ< ¤=‡£Ö°±‘ÈEbEz¢¢€'0ˆUh9óLã±uÇ!}Œ<¬üTÄÉ.,ô‰/s$ 3ƒŒ ,‚xÒ±ÇE‚CŸxƽ;Œ:‹ô±£¯êÐJ‡.©Þ|Ël8Y"GgK—]¯œáë)+˜œ²HÜZ<Ô¹ž…Ðs4ײ=[®HÊ8Š£Xéà€zÂõ"G2ÐÆ`×ÂâèhløIÌ6¤4’$ÇEĆP»|y 0¡ŸõŸ¯õÿAöT±ƒˆæno¿s³œv?þì.K–XÚü\4qVÑî)çæ\G𨫔(¹¬±>)¨ñŽÈovR\¾£}b¯…váTdSaÙ3x\WÜÊL-ç§Z>z\[ÓMFuêÞàÎB=…¶äxj«©<Š\ìcŽ–¥ßX‘z|A–ÿ­icVN D9ÿ$Òé!  žäL´¤Dvesóý“{¹CÓ$ÑÑi¨âõõ´b˜¯*›Ž%YiûŸ¯ ðhA¥Öq»:rî‹â^Ì̈QòLÔ·]˜Eõ²l¤kž5ã]’ˆÊdÁ5Æ8W—ä¤îe œ­ÞÆ/n+Mg…°Ñ§‡žx³Ø\-Gd=üM  "·G>xä5'`;Fe<ÍŸH¨ð¯õÇʳ‘xWÉ¥ñ¸‚¨Ö Ÿãø¢'4KÞü[Ûé Rï&\È-!ÿPªëÔŸ÷ÿ_—çGð1¼-Šç{{¬ŒEAýuyKSå?_‚ú¨Ì†ŒòÌ©ŠŠ¼]dŠÂ°ÿ$<ñvi\m»hÀG‚+ë;À´Xα ¥r‘UÏß^úJ¼,ò3ÒôQEDºí‹‰/±ŽHÓç¦ÅΖäê~JlQã)€#°îA±Ñ¤°~k>q­Í–¾jn#œnýe´38ž<ýMg«dä;UÙÁÒJb. (®€åÛÿQê§\ʪ“@&ظŒ{Ê .¬r½*ÖÜ!Ká½KPîS %eÆTGˆá¿cÁ={ü€Óí¢ÍáÐÖ³ÚCDfþjëoÖa³QïwÆwH<¸FŸÕYUôuRŽ–|süµç÷–«ZÆáÀ3É¥ªVl¿åæëÓ¢q)~+uÅo Žq͹‘>Æ€‚Œƒìaaæ¬=W`»áÏÍ TûiXQ7°¼PïÚÀ²²¾³Ûâãlcc£ gü/.§•«îZÚ"¯Ø‘ Œ$µ÷¯’FÁKwœù¯ö;ÚñZ¹êN~ú9†-9gk€öÙ<ï5=ØS¯7D'xTÉm-ð¼U %˜š{V®8ü©ÊD_5SOÖå¶Ã^Ú®N&8™Ø › C2&òú9Lë4öœ/]²7Æeú¯ý_.îct±ÐI~¿­ÍVÐFÕƒÏ\C]ùü’ø£îª7]‰`ƒAlé’ôýA¿Np`®mEÕxÎ2ÉQübrJ1?¾‡,á–ÏœÿÔœnÇÊ!nŒÐkìšØuÈ$%Œº‡l•Slk_»0wìËE'#‚}¡ðÑÖT¼%À ¤O64ºöé•Þ5U5X‚£dª¾^f~®~’„EáJ6vï%Áj0ªú Zk<âå¬(÷ÿâ1@^iš°õa_›l 'Nã½¼{åkçóÇqÖ†ò·Ò¶"[¨îäÉW¹¯‚XËß!g³LXEo# ¢Ðµ A¥ƒAœÍ Ùh[ ~³Ñz(AøHm‡ —%\$/k+¨øíÎœÉæ;«C§Uä}GÁßYJ^þßB‰þÎ*çiŸ#ᯬƒŠ?¬Wô\gýfãf¤zàûnøVdKHxUc¾ÿhï «¾ÜàܳۯeZ¦ºa"{ûyß9Ñ¿l÷Wªþ¥»}æÉu&ȲŽÀ=RŠÙm‘…ÂGŸ²io‘˜WÁb\*/Ö#nÙºP¦Ó9bK >ýßþjØ *óCWç¢SIä¯Ãçü« \¾½‹hìν`U£¿Â°zÀֈᆌG¨v4GHo`¦öuXH ÿE,lX“=c1ØÊÅGÏ`å¨É_2µnôŸ¢‹¢·„O#)¢†¾±Âü¥+^»™ëÎQü³.‚Y3€H>@ÆýŒ‡Tmz ªà¾K›rQ Åß2(E#Kᔟ`0HõR™%²dnTÞfg€·½µKÞ%$²xÊ•ˆqdn.EñÆ%ô‹ß…ËÌüh±íÛÅ Ldu4··ºŽö¨Ã_ß[û¼·;'f |L´ tÇ.[lÞT .ÞtÔø)Hê£iðod®m";°Ž31z/{ÏátP‡éM9íõøM3ŠJÐðgå¾ïgÒÑw7çNCg]O…Hð vs¸Uì¥ #{Vß ;ö?Â_×GÎù>Ì*vÛb æqç\=âºÆ¡-–xMúéînuЛèUÕ>” ªWz^K¤¬ž¨©qóuM爒…Œe¡¤±w{Ë|Û=ÚqFÄ_óPxOÀ7åÌü=´Å†j%pÆŠÆZ>Ùóg2t÷2:HïÕrOïp½ï¼%ûtšW¡ñjŽ >1ÏOBÐí[p1z¤Ò‹ïÒÝ’üp%%g .¥_q¹+²ÁyNòñ ‹³©kÂIP¨s”„ψ™´Oߟ¤h5Ÿ³È WsßÎgÆF0Vãdik‡€0OhZ@R)4˜(ÕF`~<6·ô §Ïý¦oçU²Ê刈r4½l`9œq‰å-Q³ÔwgY¼jß”þ‹ÓLÄK+¸U?‰iö3�JžTQ,ãz¼^aÍК:t:ƒxûE6ÚŒ»Ki8ÎÑZ@së¡0â7P9õŠRDû‰¼r·)xºu¬.WˆY5¸°½ˆ*û>ËB4×7á%’ ñx¼G¥8Ë©ÆC£d‘¡ Â&÷A<¸WÇ,&@¿CoiñpÙš”­dõÐÒîMEþ?ÔYÜ'Çú*GÑõã%ýPDÅ"Ü^Ñÿ—GF1´Ç\å¬giýí@=®Õ•þÞþ¤Ñtª\b(ÇxIfÅgPÛâYgƒ•"µOÍ{D$o¼ÝV kY *)-[òÒÅlÀž‘U®G{®çÔIlí»lÑ&¥ I}!\e¯ž„`îúݳž0†¸æú:?ÿ3ã¾*¡Q«t´à¸f ®éŠ eÀ¶1¾þ´‚¢õ`Ź «U‰¾ã»Ÿ~æ{SBaH;$ø|’w|NJYˆ¢E€ú•ʾDE¬Œ|a)¯é#~‘ ­(OqybÀ§^µÇþ5ž=²ÕA3ÿBø" @üIÊ÷¯·ôŠ {"Uï™\G¤Z@¼~.ýI+•MNC=lC®çj²·”sA½¾–¿Îi /`1ØTCÏÃÒ 7ð©umä¼½¤í¡k\xLVN§ÖYˆ9 Ãqüìÿu,/޹è¶K¤ÛÓÛÖQ6>^ZñÝWÚ9ÚVõÓ„/Ù•eŸáÂO*ˆ¿ã´¶&WáI‹É§Þ›OæÜŒyÒ‰´m\›!탃P×gàÍ¡?Ü s.þ†p{Jˆ83 ­Æ½Í¢Å<ÂJ€ó¨} Õ.ºâ—« V:Ãß¾®Y cqüxyŽk›žŠl°ÃS \„ô&È´šÂM5·Oøã lqó_ó}|¥±‘òžfJâNÒ…™¶9;9r}k%îþ(4Sþ‡þ×YÚ£Ëk=œ=:o:-}¯aµö†tÆr9»Dë^0€~)‹ 3›WbjwÊD>N1_(.Èõ›™©[¡§ÃUêþ8f*êµG‰˜È•YË'b9P°Ó¿ÈtñÝ B&­i›:àÑ2:˜úÂDV t^Œ}¸‹}nYÊŠK%–¨Ú™Ý×ó»k@ihȤ]ΰÙE‘(®×0hBÜ!÷t)ù þ23®h>©…ШÒñÚ"©²æ ‚°íO!šêlHw8ïw²øAN €ÀÒI»´?ì/cȤ1I®­Díîå1® ?6ú•ä¾M,Öoâņ¸}qš?˜Kù)gÖ÷Å~ Ê<}ä´à@øjǰ ›]v” sõZ ò—NHå2éÍÓä'vròz–cš¼Ì*Ïò}IõÌ¥µþòcåŒ_‹¾6bêÆûç­Eå¨ä p÷™š¾ÅŒbx”ƒã MùvM…’’sÓPŽ½Û—$\x¶„Jqµ8œànML¹³OþüîŸPwÉ‚Žj• À¶‰#` ÒÓÄŒ(sSùu˜©””‡–t§' ëMŽ=Q3bg^©µ›e@‹xâ@4 Ã ®­-Àl`­ý|Y¤‹îœÆô-$~? ÒÛy°²ã·¨-ýfÅà0b€èˆW[(£þå`v¤s¯|ã·ss)Xž,þ>o°–¤ß¤Õi‚å7~¾Í|L Œã,¶„ÉÖÀm`2†çßÏß"¾žÐÕµæj‹1µÏŸ÷iR÷W4£«éC"þ¢x]Œð~{Iƒ<m˜)¢×Üñ v«ÜžOO!Ó Õè¨êf[Nn©—Ç~?Õ@'ŽÿNŸ(àF8uÇÝ·‡,¿ÈâÑÊkÑ64m4à ¾ù<õûŸi4„ÇáÚ¡¾<1ÿC½|ë¼ßxј[I¡±%ÓšgyiŒg#œp«£Äû)î—Ь»Ÿâ7\‹ ± •/lèaÜ2 "Xü”²`ˆ(Ls-â24žK:¶;ƒ%*Ä ¶ŸzJÙ'gj²X -'+Þ¡Ò”£úCœ*9$6WÁ$„ü®v/%;q/µ¬‹Ž¦4Ю7€­Ìõ«{‰ôl'ÖQ¨ò׿âå™ëÎf-3›_“a¿Š‘®÷ñWyߘ¦Ô®VÜCõpDSx­ŠA^›Ø"¨PeqîŠA4þ¯×rÄ4ÿSDåcâóñ˜Ê§þ1ŠÌ^ø>±åâÈBÄ&Ý%´8JRÙØ„ÍIYÕ®ÀHd׳DO· r_6ŸJߎ£BÎÊL»ô9B¢‡ÑtâÒ4ÿ* Xn®®ÑOsÓm4<\Š,M(atçïðÌ¿JªúA‘¸ñ÷-—¬ìÆGO¹ 'g–ü×_j Œ¥§POýó…¥½Gڎ艬톟•)k÷ƒƒdN ‚ŽÇáØ¬~ Ãðë¸È+ä¬Lå06µ ,¤Ov ^ìEªå…ß·÷ñ¦«ј<«KºŽù.‘u'3(üSæFt„í%~ýûBô:}iCšµÜ+¶Ðo¾»Ò€òóμ}W8’K_ú®=t˜Y'‰þäÀŸó–9rE Uç$+Éh³†J^Š7æÎBçјAæ~&¡Ÿƒ9ª ¬sÒ¬ï¦Á®ŠÖ‡Ê] È~ °º  óŠôLú9`Õl:mäÄ(š½wáZº rÍ‚{Pû~¬¬ùˆ{BuiþQp/wV,”)ž»Ð¦<*‰êqÍ€$…0›§@ë­Ÿ#+™žëQŸ•ä:qs{13Y1IÅ8Ϙú[ñÿ/~%4ŸËÝË&×êÀ$O¦`z¼~u2¸Ä=9™ñây+ÉÄ,”jwI#¹Èñ7EôÍk¤kÀMp«Ô‡§îN}™}"VÍv\d-3ÖÝ[ºµ¡sÆgQùàÆÓ==I‰¡1÷žnè¢óç­ï03ΗäVû\XÿO\È)  FÌ›¥ M“( :ð@)ØÎÈ4ÁÙL s½Ç;ÿRn8&TG› Ï¡¿'Å—Á¹Éø÷íÅ#rKíÄ7ïÂ¥rÔú¾T‚UW±ZNùéÏ©ƒ''Löq]gØÏá˜L-‡µŽ$7íØæyóŒƒÝÃËyÙá˜ÈTi…Yª«&êkžÿ ÷‰©æEmi5}éÊ]Q ÀÞpaˆ^‘6"Èkó>í®Fiê¼~8ê:iÊÊn‚†voê÷Qb[êïçOä8ñ>g0ßU%/V˲„më¾c¨ˆÏþzòAcÙˆ!=Çp 0“™pGL²æ²SŽsY¿ð½b‘X&Mk¹©ç6*„L>ãµófhU>6…ÑÀ2ãÇñ•-à;Eß1D=ŸŒw8lôÑ~(°¯eޝµå¡àÈÚkïáĤ’5“D0!à#ÆÇwB)B!+G‹§¦ý(WQØm>4$²ô¼¸øI‘âàñ =íngCТ)G|‚&Ò–uỦœ<—Msœ¡5QüVÁ£íÚÃá^|Hˆ(Æ&AË‚¼{^Ó/¸|kV¸N½Ì¦Ü U´NÈ›ÿi÷‚±É·K¥°kƒ«ÝoÀ n¨ìò`ãðH©ì̧ZŠ¡—|‰[ þiÔëàŒxëI’€¤‰© VËÀ†áXÄ É¯Ùk.ìÄ1—±ÂÇLj³'…g˜¢7ö ÷œf'®.KÑÊF°ô QA× 3 ùB‚JǦt:^wÕ†ß ªZI›ê(ò,;QÂÚÈ °üwÇYÆ(qæýnišrÚ_oÅ+¥ÊWmõ)Ü;L³/õj+oº{ {–ðG9zDö¦È5ŒXEF ˜‘#!}vP”ÇæŒ¸c¶J ³)R§ï$ÀâB dåÎþpâÀ˜Í0›³ýîATÈvîÏ‚‡.¨KOu<ó€\8‹Ý©p°(Ö:’Ó<ÄÉáP`Ð2M„„µs“|`ôUÜàÌûÓá÷q0×9¼ÅE"pä±EÃè¿L3“5âÄr™Ÿ±¤¿µÂOhˆóÚ=G@ƒŒþ_ò¿¬âä¬í§8ÿK_žK(£<àæ÷3ÂêE7§†û’èÙe¿ªÍúøÀ\njËë›H;¯²`ÕsÒgŠX*mV5GF¦ÊÉõéßî¾T ú\£‡öö‰¸òn6M¹›€Õ ›qlJ¶•ÞˆûÊ |Û|t¦wôù…ãY§ŒpÛ½¢i®gy¬ucED4~[ÌÃïòÌ<ÖÑx3†œ6[e"ª­þ^1lЍ›yä/P*é²€6þ/#wÆ0 )9˜ 5g.´>Á’~»Šþoˆ#Û+¶pq¡„°ôN§ñäéØºEãÍrôHÍË~Ë0FŸ›=»$Uâa|Í/ßÔi·ºÕµÂ8×Ú& BU†Ìè`&yö§róx5°€¹‘qŠM ¬,H\×+:­ÿ_ý AÕŠÉg„øÒ´_µU›ŒWb8«úËqËz;)øêQ¾·å<¾5R%õê\cXrZGXâÓBÀ¾QŠ¢´Îñ D‰3lk9¡#UœWôÛzº@= ÄÅZáSj¦}:þ¼FAáÈ#תL@*ª,8—Ät>ª|ó¢ç:¿DH?2 ÐzÖÝsðwÑJí´ª pè»ÈM4ŸùåÝÓwäõŠÌ/ÊDÏÅ#Z†þt¸ñ~-jšŒt>$5‰1cØé}¤ÿ0ª[)Kéo‰²iŠd1òÑÅûPj3÷ ínˆ.D×(ƒ=OÝî7@¯ê­A¾œñ˜§UCU´õp™pÀš«(" ¢ (¾( Ãò3Äq½{ärÇ¥1’íÉH35ñ¯ÂrÀš–Œe=è^ñ'²f ”/û¯E€îN¿µ€úìäm!ÊÜÖû x¨“‚`™±U°ö¼–N@›BÇ–Ýf¶‰F^G”Ã@¸=µ¶¬6œ¹½¡\•ó,w‚l“@Ré‰c xŸÄšR7ô ýØgúÞyx~24ÎD˜=?Nã‡C…°§Rêç¤%J ÕõLïæã]„“2Bò´FŠžzÇ¢ W÷fõl¢/ÀC7þõƒ”u®§ÝºÐÈÁmõË);T gó†'Æ3V$«ü'öópån~—nhVÀ¢à”èéÞZ¼ÒÃcDîb˜~ýoŽyÙ%½âÿJ·¬š€ÿ/׊@::‹°Ùùt@<²KÙœPõ:¸Ïk±Kî†n±_ï&šXÀ°·ÕÒ›]Øìðè›WQòæ^ã¿QKö¹íâJèð1¬´kàñU…¥)Zn2Yz{Õ†~(T¥¨99ïXô‚U2#ïñƒeë ÐKc é¥jü4ÕMÌ Qœ ‰òñ ÇkÍOà91‘Øu`y¡HnÀÿY+o¼oKèÅ"šÖäXKŸ5eÒP¯²›)MŽR)_Ëøƒq?tâ†Ý^ªÑ†œ^ó|äF³^—ºãøz E¿áëmü=(sùú_‡t—áêU>ßDÜí‡zÃÓÿ|=€õA´J¾“dnÍРë!³žnøûØ.õõÓÈzW°0ž`'¿]*+ûö/mVôsNŸr®õj6ÁzéÔ¸/D(AhäMª¯Ào¤¶…ÿU/Œ…Ï/@uÂsû«E=ËŒJµían§‹RiF ”xÓ„¾@œµ¡vÙž"58eœ³®Uþ úñSÎñD¬ß]Œ¨Y¼M^+mTô~Ýì;¹8n!baí½¥cˆþã´÷Ï'ÛDø*Â󖀃Ga5¶§á~¿©­KåI‰g‘œ“¸ˆ²©'zÛ­L—ö*µzTR'§Ðõ„ÃÒ+ܹÈ|»@‘à cBÚ¾HÓS]Íf E‘)> Ìϯ;[™ñ_PÊ%ˆ‰æàéT9±¨%Ò•©µssÃìͽ¤‰ö_¥3­Z3º•ÙûÀ›Üéh$k•÷ÁùÃ|Íõpi´ œÏ^ž'»Í"Ï€˜~tH'¿ÿ-Ø/¦Qä‚'¶‚PÁÜYåm ºªû¨‡¿Ö‚1·Æ¾$±Q_{àaœ|œÇØbŸÀˆ¸ågãËP)Ùº¾¤ ÀhË"f£*¬\Y¶ß} èFüª5ÝrÇÎéxKƒ$LÈ«gó#ÍÍ\ÙÇ$l¢Ã¹’Õz<†$Q½p”¾eÇüH8Ú …!rÕ*:FÅ!S* >¼Ã4èUµ¥güa¥ôÌárÝ¿-yßG-ð}S™¸Ã\0Øy‚½^Éߦ\Pü~êQ«ü¥‘{› "vnknXôfkΘ#Âl‡ïD"A!×b,P7è-:W XaB‚Á+I>62)áDë "òô-úYÀãÅ™3«¢ tóGðõñ^Rx ~Òa±Iè¡u¿½—ÏsÊKõŒ!Ò3eÒ«þ„|u9-%¹ÏQëÕ`¼ª·z¿~J'ü¾—0TÑê­”™§Î£ÔöãS!@¢öû‡ðg4ŒQjð«E~ùZ‡B]H¯>Ûíø÷gÑ8ùäCâ„ñL;ÒÜ(Y"{.¸šgšÈìy7„š’!Y¯tÝlÄ)¨>¨#'Ë;Že³üÈSÕßæþ>-ÎhrñlÔmP_7T8ÂÝqsEQŒ%dkçuûNî®Ñ¬Êþ÷6Ùý°Òß7Ðÿ„dšsˆå¬1V”¡eÛ”D¾”¿ÅœÖ™™ä–þ^Ž^¥­{p‚M5rˆ“X¡2¡õw®ý,èûkmˆHzUÍtDHd@·uëìM³dw°Ù: ¼a3¼Œô€i‚ÅëQ"Ë%Ô¨­ Ȉ y‘šn‹ÛnëètÁ ÚuüdEÛ9Ó†KÏcé-üNvj€[Â5D»yó“_Ç9«•ˆ4Áb’èEçºø¸Ñ€L]ñMÄÁ™<ÖiAô¸Ë¿ÖHèLâÇ›%­†l žÕ¢`¯®F»‚Š÷¯Ÿ«Ѿ‰’ ±E"ñ&‰ðCÞGQ‰2b샧҆$Ûié¡0ÑX| <,4úâ)í.¶ï"ozŸW÷““ QÖèçT<”üR#2Ôµ<µ¹È>°¼¥ ®`ÎÃÎ e¤ rNº *‡n’§xÚøÏ`ì²9œ¶WQ~·@î7Šy$$c!x5Ð\g%6 <ÖÚÎ11êbä Æ§e9¸Ä|±KL ç±=2°%Í•éLUäÆ$-AÛò¤Ç}¹â2ì Üòàš„hÍ#‚ÇʲÍE‹Q…V{’ûämeSÍ)& ¶;|[vmzta„TS£È R^ÀA,9Â¥œ„ò°6{L¤Ó ›êJre®N˜bÈ{¤3Ä…d¶Ãô;ÿ€„+I¥ ÇR¬¤Â1`žWò5xß‚ÿSn­ÞMésZbs f,&ö'ŵ€äÜŠJ¹n}É»aéJOµ°$e °Ï ²¡ùð 6ã)ç|À›`j¬| îû³¢Ôä)%ŸÜ4ÈQ|ö¬#LÀ9ýÒ+í_ "¶´J—Ýó¼6)gΰ<åÙ.bœúmùür ×äRÀØÝ/&OŒ'Ò_¦5u4…k¹ íS˜M²¤4Ð9ö-‘ ´¡ øs!o³™ˆ§ãå0ãr *¾“ws½ŠOqöîÉ{ÛX›µ“<éâæØ]gô¾»$ ãd³œ]QšD’uX=qACÁnS€ÅÓ|ðoI¾ $Œö७´×F»Ú:ñ§K޼Áì´V༡£¾ qž&$ ‰šÐu¶çþqìÏÇSå·Pµ‘ÊEçbPÕUë;eùé Šã …ÜNr@Æ6K{Ï|aœ8`>u-A›á¬qCè&zűö¨gN¨WM\—­„ 2,úb«C‹tO¸5Nµè8?ø0;H!°.TðYþ—ˇóŽày«"èËä6b˜6"™u!1Þeó5£E×çdÓÉÐ¥3°ò Áuç2ð‡†´PRR& Á¼˜P÷Ëâ û\‹‰òÓK#ÊigµË¢wx]S«Ü+ºµþÜ4RhzïÁÒ'AJæŸÑ`ýÔØÏûRœrOäëµeí=»Äõ›5 ì6/¥ÑÞ««NM_.›7-Zz§‡leìÜÔ/ïN왫äm5ÃTŠÑñj -ËK†uŠÃ˜Ðì)4IÖ\ÛÚ§·•%"|¹gô(iú )LŸ¼<¦J½ˆïÐÙHOñöþ¼ÅøÅ3žé|ç¼Ïý—"äd©Ù‚[ÙÓë&~mÜØúZ(¢lìtÄ©MGÔšK‡î ¥>›tØ”d¢¥lƒrê—ÝVÈh-öÉEjF{Hr·§\ýªvò×Y¾9 ¦ª5Æ•Œ¯b£Ò7v¸¡ìÎTú¤ÃyîÑÙaØÖ Mäo ë;>-ùtåRÛ” k³÷æ€\Xp¤ÐEfs¦t^Tm³AåŒÜb¬—VÔå*ú`W%#>hö(*8ƒBKVO¿ìÿPDE˜¬6×­/'/ܰê•êÇ£µZÆØ¶ÿ%àøêCU$é s?~n›Q‘Êäö¯Ãùž9j²0Qs¿á0V„²æÑJQ“Ñ©1èa·2ÊhHpÜT¬¢eÀÿjà¼ñÛgZÑÌCÝw8ZCÖò)‰˜?Û[¢ßHwÓ–@³ƒ±´É»ÆÃûü‚ÜT&(«‹Ns'b4ãe6'ß®XëÐQ&¯ë b¹nCèiAt•‹!^|pgÌ8ÁÃBgL§óÝ’rq&‡Q¢Üˆ;þ§p½¶ò ^¶·ûðw\‡*­ðÛ}ý,ƒ¯È¾Eã…ðÅ“áH¹‹•ˆÂö¦ƒ^¯=† øyÍŠ¬²²º\-«xYT(šüÏÚnOIÄ=÷ø· £œ‘·åf‚â¡äÓ>k¦l<4Ñ6+^i¢cdØ2‹šï5óÊ&$¸ é-¥|ÏÏ|ü´:ŠÂ„»Ç”ÀˆΕ´4Ã4ÿŒ î‡öË=¬ufšÃÐFçó'¯–lÈႳÁb !µô6jýÇÚ¼@]-¡Êƒ8pŽEˆhv¾HU ½–=n®ÐÓBdÞw•ͯ%µÑ$3Ö•ç¶·Г}:Ls?6ÞSÛ¾8O÷ã9‹ZŸä"(Ùêkq}¾—/äŸQ¿ÿ¬¾µX/þ,]yt“ß³ïÓ¬ìаSIgIx5ëèç¡ï•—鲟¾æl§²xÞƒKÐõçÌ.½Ú«:‚Ëÿ°¦ ¾Õv1©oÙ5ÚŸZ B Ê5º ÕÔžãIš€éÒìfýØÊÞ%䜥‰ñEjRÿ9Z4á,¬‘~K™1},ð0Öz«›¨\a͸澈ÃâE÷£1¡p6M¡F݃k‘x°}¡¹§ßÿ%š`Èð³9ÛH¼Ä2‹-郇í&JeÆ+ cP…jÍðtIÑO\¤Ý4O­¨¬ã¢á•ífˆå @ß}”§•Í Œµ/å¿V2¬Œ~Ôt=ÝÉá]W°þ1×Q¯1œ1ÕŠSàåÇþì´U+Y´u@¦.S³Ë¯—J©9,w½Y‡^¼¸ùÎNì§&÷š¬dÿecé S|ïé£àŸ¥ˆôŒÇ\å>€do$ I˜†S!×aO¾}È@¹ †¨9@Dz*±b±«;V[+·„ ç¾löÜM¡H¥Ïò®‰$ÊZÒîvùeÖOǯÁ€4؃±í…›zÕ)XZ¯ P ùw(t¸dHøèÌ_.}é¦tqi?h]˜7MÔ*ƒlžŒT•pk=Æ…äÃY‰öKxš½§^Ëè0”ë'2†™Ioíó ¢K|p~ S h«Ç*7¸oÃzdfä<“D xšêcÔoƒ}¿¶è7[ëhÙà‡®aF·„y—^ÑõŠ û—: µ{ZS¶xàMƒ½@¨Iû˜p=›ìˆª£rŠžsÊ…“`&ëlÉÿ+“r»Ñ× ÕŒë+ rF:lýÿ¨¼¡n°‚ð!Tm8-Œ÷½Çî€ð³l~¦èpdc´”RDÒyº<³'?Xå`IãoUÀÛ›#¨‚u>\³D¸q #©Páö‹W+Á¤•^"ÿ@•ÙêI÷¨XT½QÞ—«,~|¥{ß’¤©~5 ùw±¿„“<£Ë™k/ÌÀGy èê²F“0îÜMؤ)˜‘àÐVP%/3å‰óœíœd{²æõ¿·„‡Ö ñõ©¢´ÙçB#ŽþÓè²'3:$S™ùjÛ- „Óq;Ð'Æð¢>»“TáÚð ÷X)“È«¬ÛøD-†Ô÷Œo«™EëFòÏ›«z, hú®ÉÓðù›icå…%¨ÆçÅB9 è&¦°*ÏI[ŽÇóƒ¯w›ú·£¶¢PiÐå°‡k×W¦¾°à³âõVbš˜bêÞNà‰ä¸DÎbîPáLþÕRüŸv­I›,Qõç+>§Ÿ [“âæ§Åx9¥G…‡d-žOC‹“F¥9ªö[Ř[»ó{ð©Rb¡:ˆ£…¬Âã¦ZHÑsïK¤S¿«[­è%'H¶ P* †µy×gñ8ôùGÕn”A‚…Hƒ«1TLIb0-< Òœe¡ZÊà €‡ npøä%fin^õ! Äè“K8š¢o_Hr¿*ðPaÌ’ÊtR§FãÄú¨qèJ”ˆwD²êFÂ+¾ȰT¡û»Bð2ˆãðË6ìö1uøðdF7†'}vºý°ÃS1`$ÐÒ 휡zön‘ñ/&ª&òÊ1…ÍÞTy´#›;È¢cjÚ ›Î]Àã<áçfåòòMy³¾nv‰EHçÖ¦"J‚¨¶+w!ZçÄ G'zì6¿/}Ïh«¸ä;Aê¾ Ó‚_$gKÞn﮼¯¯á™·µcÔ}–½æ5>òþжféòþb;¸­ê>°¯Õû•Ý069è 3@`'sÌì2«1m/Ñ×lV¢ÇÆéç\õí@5€jð©Ý¡Á@ Åœ 3=JÁÈ%H:Âá$¬, ¼¨*ÊSU¿¹k2êÜ:ŽÛ§àD‡±®f¢œ–wC‹’¯Ü:z¦Æª:ì®™¢Ór?Ð|”Ä? ܉Sê?øÝÌXšq`ùˆ”dÕ7,J¼¨¥>*Fx]ÿtúñÐO1qbw¢Dz’PV[¬zE‰èû‡&ú8mTƒ¹®g&Di³•Oz+…–ˆñÛîœUl¡ª¯m’)Ÿb`…1êŸìÂiB†ÊSÒÃî%°ÓÔ¯”ºtøh ÒIJå]¼ÚÁYÜd¥jâªã»Z^¦”ß½°"fÜ®jŽ8ÞÀ™+ ¸€+U¿œìÖlìICD¥¤ÅÉ^Çäµ±°&†ÑÉ" [Ö YB÷˜³ô%dU8z]Ñ’iȾù˯²\䥚ïB5¿BT„œélåÉ †€™Ì‚¤Ûø`iÉš£;µÚH›†IHòDÕꀽˆ0-تŠ–.DÍ)ò„¶ÚœÂ ^0$2]š‹­lÏB‹¾Å&eÚœ–ö—H““½âPƒ(AOYÄ„Á&³Í/¤‚Ȧ(¿9]DàA¤…üÕ –âQåþ2S±ÿ–0óp®Ú'¥à¡0‰d4¢¡pè ²Óê é¡ä[?ÀïAÕ6gœ„12å»)ìóa?£ÿX3ØÀŒttõ³/=:×$”£¹"ò ì‡ÓîmWüL÷½ž=zcöä}¤¸ gÁ}vk`g'¼.Ãͬ‹,}™ñ?eÙ¨í| ¼àpì¥ý:ëphŠÊ8¸%@¸/zb?•Ø<¦>Ò¿n;®¶(ártwéWÀŽB@*‰ßÃnÕäÒå«XªŒ¤JMØ–ß¿®„`ÑŒ2(¡ä{/“à2β_w3Þ­Ù£óÀsNqë\ò›Æ:œê3*™3 -EéaˆE´õrµp´¹ý¡ìR Èò,a´0{o’ß›e>Á”Ä7r-ÁÒ#üÚŸììá)1ŒÄ¹ÅÑ.R^î¼!¨ÿgá8,†PEq#“Ï%í“‚›†Š®Äbõ²,ªæ(°‘ÐÁt¾1Æ»ÇÑ™B ŽíŰÀ¼6˜|3¾-ÿx×EHùúþÝZ^,ïä‚ögÙ´"!F7BÍwU‚P‹mëWWµ~¢ ¦E«ÉgtR±³lâÄQÿݸÞC| Ã×ÒBÊÐùôLv€ ¾Š ˆ¯L»gý±ò[Gç 5CÏ/®È÷ããaä Ø£îa=š+§±ž~ñ ²nɽËèRj©±âôUobçç5L¨‰Ü-·ZtgÊŒGœ}€‡§Ó0éC‰£iH­Óěӭà^סJåý]¨˜à1Æòªýxk˜€¿×lóc7þÝ>VX¹[Í£¦T y[³réIUÐûÃ5ÄPDr’ãÌI Ëî Ñ~²,½#“™+¿.úùé'»g:/ãèyõÔë.­žz†Vaœ¥*ÙãPô_õÀ€¯ŽáãÎÍ›S 47CŒa3ì•-Ó\€G®aìñ3'ÔAÀÏú½ kâµ#Š·ÿv¿ƒL,‰ŸªÉƒ†æsúšŸ¨ðäTÔÒ™Äd°¢ð,fÝ7â&¿ÔŸç<‘³Mžä·«š ÷jmó$rv-¾Aœ{-ý>|éÂÙ¹ñ„¾“nƒn #·oW›Eúõ=ñ!¾âÉ]Ô`?[ŸbCJUPyî™N‡AÐNuj·‡T©§¦ù.òšmC`K¹N\­Ñ¨bkÛ q¼Ž}'^OqüjÚ¾æÆ8ÓâõŽ·®ø*ã32|³iÆ»þ–F‚£¢PË ˯j§rWŧ÷aåx¢Fð†¥î÷rí9¾ÖÉ]Õ[“«*4‚«,E[,hÊ¥:­æýD3k,ö{&£C”ùÒÌQš€Lîö§•!ç8qÇYJƒf¯gî¬3}ÅCÉÅ6À_„3«¶Q4þ7©ÛÐrSGvf9èv4Ó1Àx[æ¢M¨úZ"NºþÙVÖù¨ÖI£j­z€0>/f’v>ý×!€;­°¼$Ã&·£âÀÀé’´óÌ7ܸ¹Ey;¼ð½ç+›Aæ¸Ù`ÌG—¾Î)¥ùãaÄäñ˜z•–°<ÇýÚ^Ö¾Hè&Xæ;\Ňҙ¤$ÊxÊaÜnñŒ$ÏÅ×e}Ùçzžh;~W=cõ7LEGtŠûÍ—ÎD ÿîd”[ƒÑÑšŒ4dõoC=Ò]Û8-!t]–öÂ1Ó…ŽÒÊz#xWpÏ«…®…9dòù!2VDiUG *Ó7ÂÅ™è/£«á_ªjÇY0StJµ…ï ‰H#¾4 ôžˆLÇ͉B Ìâ­¤&v½-‹VF™sÜ ¼åaÈScëx‰¹Ø_¢ûü=Úí“wŽ ù‡šÜôÉ…¯ñ™JÕl *BJ)Ëð0q%]KÚãi¤pGŠd.ƒYÂðpd''C‰d›DsRPmülX¿¼ÞÔbí®úÂè§4!14ˆ5Pª†¶VV˜zÛÞË­ËŸš|žS´ùJš©Vü‘‰ÉÙûXÉ}=·Ìã\™œÕÈIF:;bÃfqˆ¡MÛyĈ°“]€:²E} Í1ápíMF•7¦Y$Ї989«¥dƒóˆ%dëˆí»ªnË.×PáÌ”e÷_HtFŠàÙÅ\œuè¿UòÌÞ£Œ³•äèÝþ>Pw<·d*½3ѹ ÓtÄ<ÈPÆÂ¸îÞÆzð*>Ìhc]ðN“*=3«Ôé7Flšå>_!/o;\Ê=ÇAìóï1€ oI$êû¨þýÞ‚è” KÙê£NüÁáâÉﯓGwd=Œ æŠáˆájh`ßf1âàâ‘î50l¬rAâjÚ¦>¯ΕϪ ®£KCra„Ï>‡¸9­Nw]½÷‘ëÜnDͼ€`ÄèMÍdßQìLJ=ºLC¼:zYK­€w­ë@j:”"”JÞš„rª+~"ú¬D|ïŽðy…Çò&+€sgR¡ï+zßFÂ&N” Y »õ²ÿl"ˆTŒŽdà$§õú[ÔuAµdè{>5$õÏ+¾AÅÀ^£ µŽ›c¯ÐÖó©æ‚‚çÄHî9¿¤œxß±œá˜6X¼ºÉ_ÁGÊ/좦Šj Áóo æ¼j/Ÿî‰@ ÐîÁŒÍváiÒ¤¶MÈÉEª8ÀôhÄzfÊԂÇh¶Á Tì4£ànä˜m€‘-ú»'Ƥ U4¿Y\Ü¡{µ$½šDÈpÝ‚1&ù{îµ]I8’œ¥r–@(†,?¤pÝ+ÄWåqoü†HN¯Ü<ï8Üb]L²6B†îîÆ0ç˜Tüz™zMž¨K^lwîC!NX> m­nbiÞ9R’v Åá ®ë$æ}2æ-Ež¡«Ü=0øæñ:€Ce$g¨7—`±li<õ.@ÑÞ6kÒô©kr"°¬‡â-«²Ã›ž"{´õb²™ÂV>V4¾ çv¡f*îýÅ &Á?u?až†KiM®Œ6qçBÜr[í W*Ÿö·ûÖA>äó8n­t_$ »)¢±íò6Oqì ´'ϵí5åZõ˜a._¾„(Ìž$sðæs¡ ›Ym†¾×x¢vŸKRK}Qi7ë`g{K1Ëš³V%‚$² ‹ðµ<œX-ߎÂe'0jW‰5íñ™a$š´Ôµõ¥Ç¥{ZLý‹á÷r<ëú¦C’”žrŠD²^^Á £AXÞ®/ÐPÓLÌÕWUß÷¡5’KDúú¿kcÒ+Á¥™²é,½ÅøöSÔ·q½&¾©"ö†\òà¤â,ÞþØñnÐE}»´ôb}Œ˜÷Û# E¹¬íÀó£nÛ¾EwHï"Ý(gš¬ÜM/`ûÔ33«ÊÒÓhZØ[*—Ýâ]Ò[ø"/!¦Zè³ßëO=›ê´Dîðø8±‰ÚíP¦ê¦¡Ãþ·–ò]É쩪—4aŸ¼YÜb©E€€åÓm“o5¨±ŽCˆ\m¯‰)2LZø|ïšãºí”Ô_\ÉÀ”ë˜û4[gÏõó•p åum©š†{kPBIÍ„ùèÇu¾V±–6œy³ÀµWt2—bÞà¯l°Á¾Mtáè9;‰»Øáü¡íÅZ†ÌæH;DÉ^{¼,ìÉ&ŲÏÀÚ!ýLä7|þ/; Åõ(±/õG3:×_‘çã4n‰™v•@KøX÷iÜà aó4oÇÛáÀÕ8ü²‘#Ü+à¾QŸ­¥¬ù£þhghPw¶¼vÉÅÁ(U»ê e®)æo£m~î´¿¦>e¾Þ§SÏ(˜G€E-¶„ŒäR½#e™Øh[ö2]ÂäˆëʶÜ"ß¡ÂFÓ³¨¡ oYYÄ/ÎHìdeªô‰çO•hjºrW9ÄñÀ¡êw#~ËÆÏX•Ɖýˆ ×¬z޽ 3.^gË*ñúKÐ~­sžYyaçE½ '³ ‘¼1¤h“,ë%íaG®Sñ‚‰ ÑhÀîßzò öHsÞò|>ý éBÜkÈ;J™ç6…ÝÐJQÙÛÞ h9غÄ*e#ü!ÜÀâÕvçìß+yÜ‹¸¿îÇ'F›j::ÁÃgNˆ/Ü3Š×ùÔ™¢Ü&Q¸¢KC§è¤æy[]ÄzÎøDò¼B2°Ö%Ÿª¥àÿ;êËw·¸¾H,5 ÿ}%uiåš®’ xŠJ=C P&¬-›ÔsŒñ1´„€ Ùx;ÙB¹™‹ª9ÄmÅý®h‰W#Ví]‰*`ÓÀM¡f$Ëóñ-üéíWQ;"ôoOÍ’‡ŸkˆûЗ ®o÷eMfW•÷»WIoܾJD-ÖýŸ(Iå-ëÄ/oŒ¦¼”l¾'¤©Ë›àrãÀ•BCصFâHë´À½Ó¡l=¤v:= °¾]É$ÑkÃSEB-Q’lPÍ´(†28˜w—k7ü¾Ì×¶õÓ±j¸C]û™ˆÔ¡\ ÜÇ V~–>·Æ¶®}í3kƒü]=ýQLõ;©×ZmI’ZŽ+fóOTDóöB*޵QvGyâ £ÏÃÑâ—Öƒ¨Ô%?>{{«ýðjxÜ}³•°#ú-ŠYTkfæ³æ¹mÖÈŠOp´Ï»H žýWªîî¥ðA9 ¦^p`Ô‘£ÉÝ4Ò?ü˜fÒ|rN ¬(qÈöïýÁp A »i äÒ~É~-–Ùæýéø†4UI°pÿ6W1y-ìNóV^Ô0Ì Ç?ÃJMÊ”Š<¬‰¸ cÆ v4qJ|Á¦{V^®ÀÒŠ'Êž|V›ô$À€ùIÅÐŽ-´^[ÆœÂKÀMäYæÄ÷?†¾eb 2ôæÛ Xt‹‰èfº¬ô)š é”å8–Á–¦~äI/#Gó%þ"-œ 7%ûþVb†KG+z™ ’oo)®;غù>ÕEZö˜f'€ÁNýU™Ÿ,o,ùöƒ¡ê~ ÍÂx]ÇK—–;õŸ5«oÿ!€Ðµ´³QPçâ‹JOáŸJÕ&äd½-)‚õÓ”0$a<¶Õóý”7½£†BW¨´ž²Fâ}Bœ©±4þºòÒÃI *ê}RÕIEX©Vš:ÌWšWVêØQ.1óÞ9†J#7œëžÃÈÑŽ²é× „}|Ø¢jˆ0พŸOwñ–‰Ó¤h.Rõƒ5|÷ŒÅœÙF5í0²¢ìh»š==<–™Î,ƒ³¶’ÙNåtšî鑆  q(o/Oq¸Ê¿)Ž2%ªÝ¾„+ðgœÃ>tÿqášX ë_ýiÔÔîýÞÿ)ŸâªBÀçèûRðQû€&„üdÃ8ƒÄÈÄ{œ{ÄDÒÕ Úw—®.Íö±âøFš^cO’ ¯Ò!‚¼.®™íòUÜAvëûqa¥û òVÆ,y;38È ßÇÍY8U=üü ¦zÏÏ{D°nšÒŽ’ž h|Aƒå6Z‹jbýeí®ùÆð5#”œµ!=dhúY¥Ãy]üŠqÛ9‰€¹{0ëPíMxXµOlÙÁM@ðªÑ|‡æÓD(Úb’05­m9ý4£Ê©%Š–q ŽD¦ˆÝ²¿´Bìk½vcY.ò¦‚W*2MA JPj\9+ÁF³|‘÷ÂÿÈ,fçD,äe&–àõN0—„á†èŸªP£ »-ˆÉÉ6ý5‚§“üb!Œ|¹[[éÖÐ5„6k¶õz5PãqQ­/¸|§š…qÀ]ÉÖsD› ½FODÊw+ÕKšŒ¨ ,×ê$w„`ØüûŽmà’;¬ÞAÇ14É"…Ì_ºUX0ø1Ëâ_ÊÛ…_o”æí|'îüö¯²u†–týÛÝ j}ÞEîf¤Ã4[5¯—•Þã†3´DŠ©)UVxÒ´ç®eî´¨ù—Gš•YlžCÅú¿ºã+Ê&+ûͳ4,¦zþºçfÿ)û±ƒ½±6yÐÊ·•£ÙOF¡Eæuøw&åcŽÉ”3g¯ Kʾ2ºµÞLƒ³d°´=q÷Aº~)·³qå¾Ý ŒŒ5[IcwC¨™öÝÍi‹ ëf¤È,äÚƒÑA$=pˆtóŸ2b%Þ¤ºe"SŒúWOü¿OХﯼ5 M~»{Š ^O ŽOQbÃô9> :ütÊä<‹ÛI·?®öuv‚¡Keúˆù‹~™¸` w|Râ×¹I†Qÿvó@ê&ïWlq,A'h+E=Ý|«sÚÚâký™wûåÄŽntÞæ”G4K±$>~%çÿo`IžIiŽÌ n¦]F|Üude„‘ž¦8‰Îá/o$Bãj ßéúiØ4J;©Wa%Òó[$Åî‰(˜1ÈÞà@èŒõìÍýaý/K`0¶0I ¿4ÿw’FÃöÁ# õy­ÜÄ 2÷…¬Ži¥LìzˆmhÀýʹ¬ò!éÆ%øCŸ˜¬­mô üþà ˜X…éj0õÏ¥34£ÜïíAšªøä ƒ'?[G`å@ܤ­!T9&ÍdýÇþmŽ…¾EPXáî´·jé¼ÁDü–R†ú þ‘‚µP×çÚ¾6»=¿ûEXo¨d· ¤1Eí–Ó¦g7„˜"> {cêNT(&}8’9è‘<Óªj…(fXä ‰^žT¨èkõz@Æ_ʺs´å[ ë 5„£å[Œº-G"œ‹Pœ0aUò%ô‚CÙËX…ç ?g©™ÝV©@‚äÀýNv‹UÜñ*Ï…r ¾¢•,ï”&JK#¡šO‚>¤œJ-ÛQ<Î]ÚŒ±Ài·XzÎ2£6Åeá€TF‡ž^ä‹þ³äb-eqjøn·‹Æì8-˜@µÄ„ˆn×WœU?id+íp¶¿¦©Ç¶Ü &ðÛgB`æU8:’ìÒŸZ¿‹¿8 +üø€¦<ÀÅVZ^]ÙùØ¥è›D¤_ä~%gÝÃt• ø¨”ulЦGÊúÇö‰=^æ‘ÔO!¨Ì)²§!¯¸ën>ñ˜h¨iø~Öò  •gr4E]EÂ1&>ш+d Žâ ®,̮ߡ}8nçEˆ?5È}–Õ‹w[–«»݉½â³A¶™%E4µÕÁÀ~ ïÌ©ãÓ•‘ÕĉÍ&²t¢2U¿5dùÛ£õËÐÜß‚y”™ÎúÃõ¬Üÿ-EÓÐXœo]coa *­ZvЖ‹®£ÆŠí‰H>ï(˜»pÚóL§¿ÅZ@й«kƒ µõVÍzÜX ¬/Æ`'SDÑy‹βýÉågßè ¬.«fñ3A NfÜ?ñi›-0ÁûáºV–oµ&¢lÛ®.x`PVÒò5!å*t|†‘Õ…ÝmóÈ‚¥’o‡¨ …,‹D´Éb,«aïå›H$òn„1U 5x$8àøXt}Lô%F{­”k:}ˆÑ~]¨užéÐàÝìMmÇÙ¡š98IŒ¥SyM*šÑž™ÃŽËÆöûí¯ƒÎÓ3ýR1‘•d$•¤­Ž£É®‡Ènº{ºƒ¸“ç*¤Îwfw5—6Ïò?hÊú,È…?ˆ]`£ >¼­ê(ÇE9y}uB™J6ø  ’Ð¥¼¾õ”ÑI³É­˜fœôëMfÖ%ž¨Õ¤£(ñax ~öš-Þ´LØK‚ë»|eÕyžÇ)@ R2…Ó,LÑ|ZèW7c:^ªW“mÙ¶ÚHT@ǶËÌôµ¸uŹ7…‚’±Ýq4 ½‚[_Ý~ï هŗØr»…ž1±a ¡Îàè-èÑg è=j²Ýi· ¥ Ÿ…–„ç.wŽzU Ñ Mޮ߫©ðŒ!þFÕ?;RÖý³M+d ¹ðsÝ5Ët—¹Ó¦Ø{¹7¨ƒN£!¡¾¯rÓ:þc˜«¥ºve/2ØQY&Ê_®¢#UT'®!'Dm‡»Ä÷ÓÖÓgœrøtÛ›¶Ì¤’ùóÈVàifØzÄ㘲ƛ ‚e‚IðdIõ6´¸`łާܷÆÞï¦øF§µä*ì%¼HF掿jn*L¡Œ˜{v‘H+B&T‘ÿTtû:T‹±: 2ÏùÍŸÜÅbåqn£PÛ“î?eS•O¿0õA“Î ]Íô>CfJ&ÄÍé J3ﺱb3\}qF§ç!‚}V+ŸÅc½$S³ëÏ]µ}^4–ÃëÙ4vЀ=&h¶Véæ@ÎÑŸñù–íŽâW;¤n‘R1Mü]“J†“¸µ„Tr˜ Çñ8Ó)KÂëŸW« Š:„Ã(š)Wwò žOJ…É’2à‡6•iZw~]FF™ª,«Þ÷6û ƒôc÷¸´+)%«øx¢C8¯ÊÆ»“¨ë4¥Z‰3²Lnae÷/ƒ¿SÞÍÈT1žî·â`‹ ÝqÉ­(õ†dpõÞ-…HÞ¿¢”äÅï7d;ÒP-ÛAMËÎÿ+JÍUØ-q+"^DÛÞ‚Ÿdï¦äÕ¶4˜Ð­¾k´jiÉÓ2Y¿åìñQ•øÕ±@à^ÏrDý)žÁ“Ú~Ó'ÃWÉ›À“ù‹ÄºHQ@¶¿Õ°{™¼h)×:’ÑràÀ‰¡ii¸lè®tº@Î…ž‚ª`9>Þú*«(QÐ@Xv©*ê= 4/ `²„á>Ô¢ª=I„ƒ­–^®)¦¼P 4,ªÿ;`U0aää ´4uÕyC0E²Ó1*ˆÁ,†ï¡¹8ÌŸâIßKˆÖÉ.sÛ.µ-8„¼Â6ÆWðö«V¤ò7~ÿ²¤å½ÔHÁÑ„‘ûêÌ^+ŽcÛ‰cõ­Ú É×WFѨ“÷ÂΫfE[©ÇWÖëùB`1Žʉ™B½zj·Ý®yæ'.´T‡%ÌNéSA»Eÿh¹9úë@¼ªßµ8 ¿˜C_•G é|Þ­ñ· QS¹LÐÿ »ä}ÞϜNJÙè'÷(ãôeðg¯Í‘6ñ£¸QnUG;‹%/+$‘ûü§VbTE¨O?ÿ¶_B ÚµàYClH/e‡¼Æég«| ŸtCƒ£áu®ÂŒc¶Ûµ{vºÒ’™–Öà —Éׯ8Î$¶Øã?Ë?Ÿ¥Õlt[)Z N.R∌ßJß ôqfÄT¯]—ŸyøüòãÚ|dÀINùÇŠ ‚ÔæQœ‰ë£ýwñ‘..·˜A™R’£1¿S¢9–,¾Ý(L´7n½|#_%u™máBt"òâMöÙòÈe#n×ú‹­>¦·.Àýµ´ŸãE³Çg8|oÄ~™üÙs¬Óàæ…õ ÞÁ'eVÔh¨iNpî‘l] Š”â`ÁPø–ßÚ+H÷ƒÝï˜r?7žHWCh~ë‘2) ¸–¦ÌÔÃŒ¢[Y@”ç¿ÛÂȪæÎ±´'À‰ìExáÆq,ìtÙ» aêûÞÃ$ßC’ˆ7öàþsNyi]Ïw՚śÄâ‰ð׺Øù7ñ}¢,µ ©úþ ]clþæƒ=¥‰+ß›a“ÈÚ'öÑÉâ…ßî&)\J8\F;_=óz{©¡Ì¦«*Ïïf‹žz÷á§Ñׇã]3)ݱéG^`Á|OíV& ðž;òª¼åÿ bɧó‘âN'xSO¿s4ý#CfÄPO#«ka¦ÈgN±÷ðÚØK¿¡¥óœdÛ(ûtؽ™iš¤þ0F pU¬]Ø üoTÜá©“ˆýŸ„Ï.Cžµòh>Ò _]ŸŽëµf<$™d›Ï3íB¶‹H!³C=ž@HÁ©ºÐg%“­ÿv©$“²ÓÈñãÉNÞÆ|ÐTŽysÚöZˆn+’jˆß«K÷@ØQ|\–•z<0¨nkWË—Îo(6Ú”€’c—Cráðîô¿¼é¢#ìjÜHîz5¥ýêM™päâew\dw¸²Ò=ƒÝ ‘‰CÁ“2ïzÍ5Ë0ÓeÙÒή“Y·1Q5,†Qo€ºé/;"ú4IÇvJâOïÛ:â’a_r* +ÒEï^"X&v9ªKìwJ÷B¬þa·Ý릤ƜÒ'»6qŠ ‰ÆAV3jÓÅVæ}º ¥Ð6!ä÷¼‰› ÕGŽ/³\Qö×:£¡ð û²Øâ±PS°S„n [-¢[p¸µPz,eÝQÇ©W˜äÑQRÊcÛÝ·ûËÓ:'­ ]+ÖPâÈÜx˜rc=ÒhÂľÊÛézÝAØ$HýþɘHÚh#Ùž>WÖ¦©…qžF}ˆ{+†Gk Öfê·Ó!Ìï*Þ9WKb¹ÊË‘+€!ë)Õ{x5\ÆàIšË}µØ· ¡%]ñSyóÊþ`uÛ˜ôÍ$\œŸ_gÉþš—6x¨ºú’Y¶r~ ¢Ô@×¹­ñ'·® òW¶øaZ£À’ð‚% M„ý0Önæjá}]9þÞÖ?ot×Õè1ƒõtùúºÝý]Âþ®ó°~®£We¿«º›ç÷¨÷Ð×7õVÌ€:ó!tKkÎÊ«us)jJ,v]% –’å4ž¼âêjá·3Y°O„J¶3Ò>DÜè@cº=¹&†Šû‹eoúG—–+\%ßÛ8›©ÀÑ$JÊ1ÑC¦Ÿt;?Ã:ϲ9ÊÿÑ;?9¥[xþ%ø“µG ë0¶»5 ,‘®ÿ+†y8\$wëßÙ„äÎc£¬m3E³ˆ¿{Á>Eiº.%ø@-L9¾sòû ‚š9ÞG~‡(7Škè©Èøl{~%AÍ´)dëq-áýŠ«ú‰Û!±µ¥¸Â ßGÙ—Y޾TiR#á‹/KPø mädàE¡Ó£*NEqvBsâ?Ö `rÕ¯¿üôõ=f+Œ°geù ˺Y¦ámõªÖH#òKîjCÌÏ8D8*öU»>1nqJ3ƒák˜ÉêþÍ¥†gÖ¥âs`öÇé"Ïø‰ÖÙzÀ³ð«…Рðµj®þ_˜Dz/j¸¾˜80ìѱ›ÂµûJ|‚cF»E%2ðÕ\?ñ¼Æ¹hʇSwÔG.¶ñRáÐ~ß2}n-‰*6ñicñ·ÏÜKFZïÆ‰ÂYÝßW±ècf&Ô½báƒßø’¿[D%g¸P;–  Úy ÚÐHB 1ü©WÔõÊ0ÿu½tR8èL5ó–ºÙ6]ï8}'%'˜¯ÚÃ:£–b1 iŠK¶ïgÝ}`[4.•FUB ï‰^ùaïAÖ„~ö¼¹+0"ÑÄ6÷cÖ~ø/}Q£köR\Y{uBôG«!‡ žÁ;±eH¶_n@H¼Ãd»•˜d6믕^¼yÞçŠ9È–©¶Á!>=ÊÏsß…~¹´¸%OSBóŒ»|•ZCO!™p;1ÅÀ¾Í`i-‰qÿ€“ Æ; åÕÖØ‚3„4×¾ž8¬}5Þ%iŽ0.|9.7—z.g‘`ûW3;íÚ­ƒe¸NfS„+é(ÍNP.ÕgàùIŽm¯ˆè²×6»ÉôüÍyªvÅÂÏNÁº¸iòáÏþ Ë‘?À«™®•‚¡8q÷ ïÃŽ~gÞ?éÚe1QO,áAE—™Öïô€{W=.É>Ü4b)Ìfð·_ö¹˜ËÂÔ4v½(Â¥kf¶¤Ãé¾ì< U÷œÎ¦´ÑBÇ â>w¸„‹nƒÍWÒü ó?'¦L§ÞuVI±Ê¾‹¨ùIk/!ÍÙ?G\ñ¸ì>:Ï»éZžªmÜ0'‹ˆÔY?¶¦x)‰·&j{Jò$~ióåð÷fáÌ, Sºà¾8…—,ß%¯›\ òL%ñA·ÝuEÒMYô]rìûRgйClðѵYÛùyuìÜq—j!õR¿Ï³b"U†* ¦J¼ÿI÷)i¾÷*o5ƨ/ŸîVf‰²ÔÚ<¶®ÕdûR‘ÉR%¿{åhdÆóK×BGµpü\Ée<ÅFo_6èD”Î?B´®'UozwyGªð <ÝmÏÇXŒœCé -šÀ‰Gp5h÷.=Õy7­‘;¦=  ûÓÖ¤¨Ë¦6÷¦ÑæÁéEW Fµoz3€õû;G©é.îµS-Ä–ª¿ÇH;§À¸?¥:Á®àN-s|æf½AÏcX6t·í 5L1=æÄÝ!Š)[‚bŠ%©pøÑ!õ€£u]è®ËK¶– ²Âö XõÀ¬3!tÙNµƒžmI<°êP4*%Y"°Š…ntfáñÇcWIä¯-I=9Íì>l·øñ'HÏùüê?pòŠÌäÐÆ-6»À¼WNÉ ˜Ø9fŠŒØ‰ô‚ï*ÇC•NT‰Ñqñ^˜ùmæÂíÔsϬHÂH š–XøÇÌyÎ©Š€J^ää”^›£ÈKÙëb:Ù.ð–ø©à Ê,oÚ-µÊmÒË=ŠJ]'[„¾Ø!˜jm»Lñ°æx+ŸlZ…£€±‚Ù…A›³—DË èá>ßT¼×ÎY˜þÙ?«tÙiùêW­¥Ï†tsgÒ±·§\`Åre6˜h b U<»úøW›å„½¦|!Ó.ÀJ[Ðñ~ñ)5šÿ\$# ¤ù¨^¥çM1]yà–Þh{ sñ•¿_éqi´ÖØ×múeC”ï¯L~øN/Ü4†ìq ;T¢8 _ËÐ~„-¾¿?­µÕí+²û«Û›6óO’=“¬jtg§Þõb‚H÷Þ$±Û#CíÜti­ÓŒ$GÁHâëN hîÁžÌvŒ(2y Ãý2šÄQ˜âÅLÄÔ+{b:¨” ƒ_U— —‹Þmº6Ùÿ4Í—-ÇëFÜùüꌈnRÔLŠÄבjÛ³IK3ªzÝJÙzØ6u)DÿU”Ái°D¥^«¿´LÝ5ZˆwRa”0˜“ð:ØB¸V“i~©ŸhíÊo“š?[¸Îó6›-‚eÕ« uŠ—k†ºã0ñYÛ>â 96Û-©Cx”ã`‰?á®8Ù‹5°uĆ8þVøoæz,6ç©™'Ê?YÛCL+BT&ÁËà>4< „·Ã[HUßèXÞöŒÛ?ŸUN–6m\Ý:á è”ó€8¾@¡¥¸k^LµBíèz>ð(p˜¯hMŠøžOa;(s<B‹Ñ:Õåè²¶©åðõç¯ë'`P¢Ì«ôçÔ3´KKeʪñ2~Ë$}à%ò<_íÙrù„ Ǟĺ€8t泺ÕH:à]"ÌOr´­šÕ­ƒµC¾pž6EûP[õÚÒ%"<5.GÓì•h|¬>{t!¹ónׄ3À ú¸>°€‹‰Ž²yY¸¢×Dé#Ò]ÊŠP”*2™?Þ[÷ø³ß¹×›`~gAT8c#/ Fˆ¹o óÇËü?(=ÈèBvÝ„CÔ{Á‰QfØÀ{$IÏm¡Å†{쉩 A{çóª„UY´cß* ´Ùi¹3†+hÑ»)›hý‚•Ó†¶¯ÁQ]©i c€SÐÁm.Ñ9ÓÇ8»‹Úl™™#Å"s#’eåÄ’×cˆö~“ùK–Ë3õë9k¼jŽSÔÑÜaÀÏ”1ÝÔc8×4·a“õu{mA¬ÕIdTĆ¥ÁÞÞêŠ÷`謞÷M=Tý²Ì 4;IÔu4ñÔ§¥.ñ'î> N:…âØ"\»~ÔtÔ:㌎÷ DØ¿’¾Þª™z‹÷Û«Ï’îZÊÂt ˆ5’‡Íƒ¾ëe-zµžyUÝÓôßû$y\]ûÉ¢ ©œ)K2o=£ø|;úξXª‡Ø»²xÜ¡x¼ËI â(~´äNbâ  /„ΚPRD›Ä-‰˜Wz˜”ÿd@ÍÎq6ýøjµ¯[-"ŸÙRï· pþ‚¥Qà=2¾ÞV>5XQôF;gwq!—q”ñK-òg¸òú¿ ×&¤° ³sÅ*=~.ó{– õpqÎT>»ÎzÞ%7@Ðß ™R¶4­\· ±GæÔ:xyÁ¥CIžÍñ,&”<¤eŠ£›4ýt˜|eÉt&¶Ð¡Šêý‹†묠ÅÈš€ž ò—¾&ïÚó÷ý€'¸Ì¿™ ™5¦LÄTˆþÛV¿‡Ë!äè y™ùdQÄ\yývRÂv"Ĭš0ŒhnNê€b%i°ëŒ7kIü\¸¼xXž÷"*4’®L>W0¬×n|DW[A÷•§b Ìê^¦b©ìzy*ü鳟µ‡Š#·|:-à ÌçÂíXÅkêÁ(} û1ð]QЬ;@‡çnÍ Ìµvç\¨*D3Ué:srÚUq²OÕ5¼û¿c8 ÀîxÔÆ4ЬéFurjH1y,¾ytg3ñ7ˆJ–KîZ}ö;²Ð7×ÎåÂ4(–‚2·A^%¹щa±5—Z¯D¨GeEqn¯ž’³Ëþ»¼µ9¦&÷‰›ûZKF¹+ˆ&…ù3ìѧ¹Šgð‘jz¬Û&0°È™5‡ŠýPŠÏ"² ¼Wûpù[ –SãT:š…Cx¹.»éØ$,µƒTc]6Ï5ŸW…´‹‰,¾Ò?øFÕní?‡Á‡`£þI=–$ïŸDXÁÖüqüT4½xëò}tÝR¡‚öìŒÈÆ"9C±a*u–æãÛ.Œ$«\ke…p|^¥ ?mhzmäöö ¹8 ¡¬¨NRjM?/_OÚ=Ò«¡Úqñ¯Íü®¡´zŒZÏTÙý¢iÔyþ¡®(›[ŽˆEZGîôr–lˆ@Sµ5²_I@:¯ž:EÀ#9Lj_¨ÇÂp$å³ÄÝÇ’¥¯H”FgvyâyPþæû<2|$¶JC”Çœ&ÂÔÄb¿Ç*¦”YÏ·7H&Ø€œdkóùê öÚªo_ÜÓùRÉFù}‚ÐÈO¥Öj¿ÊÔd¯|üµÛšL·KGDýYAý¤%øÛ®ÍçÂä³¼;ÏÉýÅ”CÄf¶ÓW1°ŠFÇ‚ìëLmþøíU–ñZgu¨ }2ÓOxžÿ>á 6¦œŸÙ7Åþ rœ³¢i Ì,¿ïÒááý|˜„3X Ã|¤.)E…Ó;D»t17Y@ÐÌÓð‚f)üš—îóx'Ñ%Uøùú ùp«šh{™%?†Ê5G®kÏÿYµúaïv¦$ÿy+íÀ[λñDˆÉ…"¼ãÍ©Lö›V…¡ê™E¥;åäÖ9ò»ucÇ6­/ë­Ä Ÿ¼,yZCK@èßÑ©àU6>­”˜I‡J¡qà/”OÈR|Úçs&V¢+Ç¢ä"µ"ó’/ï•$Yïï°=´¯ŽWx²²§¬û>z‘¾Žó >ê†ãp0 é1à$ó´m¹YTÅždÓCæ2¥ÚÊR¼ãcš ZdÓœ%â*/ç³2š=yXÞQsc™Îr(ä¹z„’® ¨Ûq9—þD”å*‚‡»w¿˜u½vå¸NÓ_‹FA]JzÖEÞŠüÞZ¸Q å}1(’”.ç¼CàÕ˜‚¹Ï5kÊÈU ŒAëUë±Àbñ³þøc¤êÚ3ðÎ… a™…Ä i-py¤Žþ ÄÍ‘6êxù›–”tÀƒ\rb%/³“e[†aÃoc`è¬3&vãOç¤ -¢x<ËùÄÝ¬ÃØK¡EûW‹Ǽܥ’ ÛŒ±xXL8]`‚xm¸+™ÏoWß‹þ­ Õ2Kh¨] A"ÄJ upMèÎÎ3§”,ë`Ø>’?|W£’&Y¤à–虄ÿt¦.öÖ³Kdí<‚à íø%˜è'Ú2”GÏe§°E *·ú⦀Tº¨ZT^¢Ÿç¸bq­é½$¬Ý ‡¿º^9…I¨‹Ü]cía¨òöÔ©gœ]¹®Êl…1Ïñ¡Û¨}( ZOØC=)ü¹Ç”r¥)Âß²¼ùMðL幨LDËÈûl…4j[Yªÿ‡Ï£JÊ*œ¾ ›¦ß¢º’Ÿ¼[E3i‡Pçüƒ¹ã% ~ªW]¹¿£nîqÓˆYÅÛ­zke»O÷ ç|ÀÞÔˆv—¦¸[“@üðaÛD™S+{ïѺc¾ ^˜Ï²³„§ÉÛгÚ,ÎZ¶]Ã?ñ'-á8K?éí ¹Añ@³`¶ÿv r£SÃ'Ä–);-ˆÑÀ˜m:PC4¾qðar/þrÆÁ)pŸ÷Ç–ÄÛQÚ8ºk\nR³ìÖ¬À[×=š† ¹„Ænuκ¶ jž/$þ5˜FŽäDF>ê×`Ÿ«Hžûf«W8Úmð®¡Y•z4VÖ)]_‘·ÜŠô;Üë•fKÁõÿÙ¢.qMÛ¤ÁÛ)¼y-'Á•“¾ö÷/ð·'¡á¹¶©ȃg ”|O°áØ»”møÊ%Ô¬‰ºê"õí±hT„ñ\v5™"‚d|ûMî´Dc_:l[?´£|á÷.Mÿm„ª{ü…3qz_…ðÛœ´Ñâ͇ ׆-’•?í êQµ€³’ùbس-dýäI‚öÊ•A"mOQˆ§îïvõ.â©»Êp/’T„>ÜDõß­…¤ÈÇøûýåŸr l.Ùƒ›2ö¼ÓÆoú=|9é ³×íUŒŸhƒ,è5ŸçƒqÛ¿'šëXºS¨4z¯<÷:Qèm_šssþ´ß|°à±y 凳FëLêYó^f$ºsyûäž‚ó8Äu‡*Š^1Áçɱж®'–H3V<åøy"»¯†e ë¨zc\” ÚÉ„Òù]HЄyü¡9b_¢÷ÁÏOƒcü¬Ô>¬“:7êWOÈäQŽPRTsy \÷^ÕVú°Ž`ˆlt¦;?˜âçWsû Ôöi»<®ÄUÛ¨=|î&ù|ìÑ4§ÿr þy$vr¬™å“ÞÉpÑb€¸kÝíx‘ª~i½Bµ@ÖúO+á¬CËÌ÷tób_÷Ä›à0ðBxaµŸû…µš4†6½ÛGTüžá¹rîÞñ}9F‹©¿3QØH嘦_rnõÊ\߆‹“ØÈ1újEmÕĵ>¸³hÌÔd³Õè¸F'çÆç,VaþO±±ÇªE‹rçt¿Â)Ï£ ðf©Ï¿F¢ÔUÍòùÅ^ˆ¦¹“pJiÈé÷}ìGñ-TÅ ‚‘{~¯íYh„˜¬ nzš°ˆ£b®›-æ‚`O}q´E}í—Í„S¶Пö~8yîõú‡ ß|é³dŒ·’„œ¦%E“|)¬ù×´ ƒÍÖ苬HQ‚Ë"‘œ¾xñ`]æiOhJ.´È–"2V¢ÐE äô©¾²«DÉnIËg_2±_c=P‚Ý혘þ JÖ’>CmxÍI€p ,&P,T.Ö¿üxï ݪj¯ý|ß×í×ü뮎x'âí UÀɵò` .kYLË™ìôÇà±UÞ¢Lðj|yèÊ/ºR:_rv!IU£‘ebK íʼ ?ÃhmâRs²^J\ð[´;Ýk‡ðÅß³ËúèuÞVLCƒ÷dAßêw´Ñ!þ71›ÈEßñ]¥0›ƒH £i„õO8Û‘‚ܘ/%å¬àÃ’+¤Þ’™ …/tI΃ÈÖì¨,3ÚvFA¶ãˆB¸Â¶-“õ0SÈØ¯Þ4Ñ4\OSâúÏïÏVÆ2¡n¾D¯¯wòu9ƒ¬tÍuKžƒÇþ6ÓM1 íaiÁ¸‹Jí¥{èô¤Á±¥*¨ÆSÎ2rñy—ž¿«-Ü뙼žºê´µ·M³Tæf‹Q9,:Ž®ÁoRÉ'Ûˆ b’$=ÉEOâïtí¹JÃlƒÁíÞW‰oµ j(aræ°ÿsmÄ4¡zJ©Þùf­+A¾¿ÏÐ%ž ;Ž-}q-¥²š¿å9¢Æ™ò¨C&”¿oDx^6"ZRSÁ–ˆïU‚gs¹AÉär DÔéüÌi"f¢•nÝÎpÂ-ö¾öÏ1 åó¹¸åËD*Y²~Pך/óà•cà”¶ýzjÐŒ¬Gv¤~·çƒ>À°_’?ô2ŒÂ=¯ðD-ŸØrT]©ØZܶ}Ìú¿úÆY.ÕBÈwÈw ÕKÓ=²øiüSÐ…ÎiÈcã—Kß=ucòaÞÜ­C;xk;.­›•è0íó‘ƒ^-âo£‹aM@F’}îÿ6¬Ð[*pòy¡ZwÔ˜Å×\ñ\ê,)7[`Ã[-”p»˜ýŒV;o!¬sêÉ‹·SˆZ^ bÉš;&ã·¹ oa>œîŠ}ÀCVÁ•$RÄ¿©¦"µ‘6!®Ä.vt%o:!Îãvè–tk ¼n ¢¶Jd`%s^‚¯¢æ6h® dÓßy@ªV¡ü #µœï+÷ßäPC†4°)gœaF‡KöLìfZ\JIä-‡ÑHÒ‡Ðߘ›ÂêâhÊWL$jïz^}錤£)óº($ê…’ŠvÉ{ïåe±þl›¡ TœàJiIÒyžòpr KcªIžL~Sùf‹ÃL¾MªÀdfÊü;qØtc£¶#¹ÜF‚>=ý‘Âj5+DW )ëUË»>²²Háÿ' DÅ߯™þ¾Ëj Ð6g™á¢<Ξ™£ÆOë\aŒ¿­-‘ÉÏ[¡]Òòæ—¹G%ø´ùõ§–Ö4LF´NæOH…’Œ'ihÕÓg£<˜K/ö.2A]aï8Éìþ€6–áAªS;—0…®á¸¯Æ»»e#ƒÞ‹ þïöL^,„Û¡¹›$Ç<&„ö5@T“\®¥%á®JžcŠX°ç±Ãú“‹Cœæ meãNÓú$ÔPqØŠéÈ:[‘B¼±Iá(¸ùÚÖÞOP}Ii+­¿ïšE@±ÆJ<爣]nå Ô½buû¿LÙdä’©af Ù½}ÏH  ªD*`8BÞ¦ Ä¨k:Jx.cá#’vw3ÛìLéÍŸ¡ºÍ0wh:Ž—N4Þ•ª>o˜¼M¨ë†^„å±{ ©íº§„–iô5ºÛçrû«ìò!—‡+æ8Žg,ô/O3| RzEïzÁ”)\Qý ó~”>ÿiB±?òDÄ“Ü3=X~ŸÒ3üílåZH§3V ÚL‚]Ç0?®¹ý.V­Äv¯šè°¯µæk¸"äßǨ)’©/6N¨™E®ç­^vÙ)­Ïwn™D è‰HŸ')ÔfšÃ¢Ê ÜÊ8üê<‘ÿ{iúBbÃ1QƒžÓØ.ÖÄpT(¶°2]ËäÛCïô[P I½‡VkPÅc!Ÿáþ»íãí6­#C…¡x4ÓÄD/ˆ »2¬ÂØ]I è”­Þ¸É3ƒ=6!´ &›JÆ;7z¨`@ dOÖÈ6žaû¡KvšÉ*½uD’ôä±Và#½ñƒˆ;°$qqÂæcP`ÚAQ?Ô…˜ðÑ¿ºÁ§5ï ¤-½ h|ûÛ°K-”qÖ„—פ¦f­N¬Ï¸£0Ž’òD‘øK>Åz³Š™õÒ´« óòjÀKïY¥¿¸Å—|úÛ”R‡­å•kØ0‘ÖV W,C‚AM·Dy9!»ggS¸Ôg‡Z'Zb±"–eì£H`‘ Û^˜üRZéÿNÛMÔ"Â@v¯ˆ“÷P1?_$«ñ ðgãÒcpY9íØSX¡Ñ&þ$+ü¼¡çŽÍÆÃc'¯"ßy kê­™hŒ•v¯eé‰!h,lpScÖ1–oµNxÏ£œ ó1®œÞKª³Ž&gVÈàf•5>BÞ;Îo½eÓª.Á¼´³ÛUE§Õ’ùÖÈ‹¶ì ¬—KK8KáÐøçëy Ô?ž^MðÁ÷tO¨çÚʈ¶m¥L‰s©»åÁÓ6ý›t¹ÛGÂÌŽÚ+ ˜×Ù,Ò ø”¤øGVí:ßz E.·Î®sã¾à¸gU™a– d”² kApÒô爬OµfmÍwI?çæ6*LÇCšÙE¼© ˳DzÉg÷מÜp6©<™þŽœ3†öÒísƒ÷Eï§Ziº§ZùhœµÜ¨¹<‚fúëÄ‘Mˆ¥ðaà¯kúVf.sGÎcCqŸa!Eãó$îØÕ¶˜è÷Ø¢ÃNöøã‰ÓØõ† Å ÉrT[¢Òεua`táôü%ƒ3@–ëXpg6÷É^ã³ ò¿~ë$1²fÉçÛ—“’`Äã|FW¼ˆö5®cX¥ÕÅ~ܤڄ1"ã}´ñ¦")¹$ßÒÔÃä0Ñø¦œ#ϤHxÿ5†%³4¿BüAûu¿`×JáÌ¡vì, J–eq. ?NÔÆ£.l ML Á /Ïk7Ä;´Yû­“‹)nàœ`Uì±ú™½k‘ÎÖü0§ÕBQFg£0z¯ÐGj¬&FñÆõ³6±žQ!yPÓYòZ, ~g¶ÄÎ/zé]‡ ¿ör´¾ø€×Ó€£çŽ1¸:צÖúÀ´ÌR‡LhóíQ<úŒ¿nbw ‚$¨†”‚«–ôOFâµúa¡V[’ß±pfk©¸­R?þÙÔ(ˆ6ã t¥êÑÉ]õØê?SI E©í¬ÅNNäãÍ·hrošÊò.yBÅ#ä÷hšèzÖž2}4+¶¢©5ï`à-k]„J·Ìü9µš‡ÿnR¬1G—êtxO<,Ø‚pÛr€`V¡¥Ewœæ5à Å?Ì&µiÝÓU!6þe›{n2vŵšsÉDÇß_² )„6ubê÷¨¼û”ÍFõ»ÊÏÖ\“¨ á‘ô\d„˜\ÃÂô|¼Ì“±õ\·ƒâ¦n+5X—ùâ]¬ñ&¦„ ¢ð×Nê¿ÒxÿX/GoÓÎḆ¹©¥ôô*ÓÃëø³‰Ü 8^Ș¥«:«O¸UzI6h•žÛu„ÇL—àÓ. "Caºì¦ ‚<%j{NKÞ"þ³9åƒ;¨ÏRÇ›T“¯â´øž¶Wžh£Iž¸u|ɸ[H{ð6ùR%`Š0Û"e–f>Š“W­P†»M¥… 3álðü JÔˆ®*eÛö"ò…¦”^³î¹Ðé LWH§NJ–}wiŽqë‘»…ÈXyZøþ(įͥï@Ú92'YWˆÞ8xÝyŒBTþW-6þoåÛy"îÕeNâ”TŠR!aC‰çE *hãõO9þ>–œ Iÿ;A–¹œ“‘Â1o`#¬®Ø:뻂a9Æa˜qÆÝ\‘Õ3·R0Ûq¼{¦“$.PL…z~«!ÇD+%ËÇåßp]>ù´ §èÉN¡SúÏðÛÝTªýtÙÄ’Æ -Ù‹‘…–ÞÿJèßIX×ÚGÚê¦+{ê1Q³W… ˆH.éÜ>nx.ÈÒ1Sñ‰øîÔÀ8B4Þ¦Iߊڋ»M^Z B8¨/ªÙµÌÀÛL¾D+D¦~{ТJ·Ý3U†ê¦žáP³}~ʸîWôÀ»3l:CP?¨‡þÅ‹ ý“1¾s‚î–´‘–‡z©”ø9î{b%(ìÝ¿È9Øç©ð^n[.ö[ Tttªß9ø캊ïÓÇX=g*äU¸ãÛ :U›Vˆß¼-–¸Ca0°‰We!yz=Y÷*âŠÙˆ•²Xd²¡"ž šJ›[t])¡ŒX·QXê5ÊgŒâÔ#©û4¬ÔèèHúI% ë ƒñ˜×œ ŒÚ¹àÿG{áöÁÜÀÌP¦6Î.]û¬Y‘Ð KéOÐzéAÞKçu‰ÎQ‰QˆÄƒ< –’ˆJÛùꘛÛBž èÊUXV vP•\Р8=ø˜™‹v¼¾Yç²)VJXtâ#o¢„²ïÔÖW;•×ù¨$Q©Xy1~0îß·u骂 ‰[ÄmnÍp¡?+2ÊLT¶"íÐéѧè^äÃì1Nãäm×âŸÀbGq½Ýáɾ7 MPÜý¾»6\XÒ ?ó7A”Ó*ùöfì’y©_¿¦nîçÏóºÚõØôkUE¯Çv=¨ÄT›—µ¸Él”u…žúØ1E1ìF„4àνôo3û#9Uþ—NHy°mשѹ9þ€Ö¿Âlüλ‚%oAø1ìÌ15õ¦˜e åkž1 S oY*ªFi¡Ê6é Þ‰´øZ!yÜ6OxóÉe˜Ž2^±×âsËååü) öaòÄäX¼­ÞV´VÒÿ&f«ÐÞ)®E rJüqUûЄ!‘ú4 .¸CÙ—E¡¢Nm$-Õä䃦\¹5¯Yˆ Û ‰P Æ%#¨}¦<=®Qö³“‚9ÐQjÙ®à6¼Cõ-©?Ÿ€_º~j.Ýü› šÄZâ±Jq ±Õ?,†œ[…b„̺$ÝðWÕôbïl x‰8á}]gþÞÖ?o·Ð êë—õu¹ú»¾ý]ûa}]bþÞʯ«¼OÛß0ô+Kò²†ß„o¸¨.~~¬ôS¯H;‰ÞrÅ-‚ñÇ.q*„ª´WÏöutµiñ8¡ðóªSmz“þÍ(ŽN쨈O"š:«q|t3ø^m¹ïÞßù%üž•7þ'£2;Ì™n8ªåѱ¡À´,ûÚLlé{ç¬Â"Æ*»a(iT§N¨C‚Þ’M`þHt, 'ãÒ²¹ÀåÚó4+óØ4# ×Oòe\c°Æk1ݼéh7ÔW#å~¸iÝäaû[ÕˆJÌúl‹ ‰jæNâ>=d?a¿9ks—2nUcC²s‘™ÙÙ¥'šEOô¼š·6Êó_²V+áBÇÄMÒ7ﲈ+md°r./mlCä8G4œùÝozáûœpžúY'ú7î)6ÇA=ÁÅ¿,ÍåPì¼×åõò¬Ë©²9Xv‚M\1‡|pHŸžø‚auD̉ª®(ñÙÖÉ9iOÙÝ]T=Ï_~C0jôñ·%`àUìB4è/0~ó:'2ÒìÒDZ¡å쀶ÖáCRº ä_º87‡ëè4®ý%ÿ@íÀB×E…q‹2·ÏÈ.P9¢†ÝÕ4µz¤08]³ô}Æ »QÇM9}ÔÕ9:Rþ>úg“»ƒœžŽÒמÐ+B¾RŸ’pŒÐÿ)U3¹²¢ÎB8$dÖYÀØä‡?x&§Ÿ5¬ÎjÝ£H0àe¥¤ˆzeFïI¤Ó;IFÞëŠ"‹˜] Ôïl9Ÿ€õ8Š#ÙuÖM?· µ²±'T7QKH.Ž"s¶¦G-³M¯üÿá ð§Æ4æ5b†Ó»„{¨…1m ˜}È÷ú0j‡X#Þ­\­—æ£#­ „NûG™)ÜÔ²²;vŠãÿX§°°9îåàK¼[” 0RšµÉ†4ßê6´ n!A_€ì•‰Ã€ ¶Uø™l°Žø¸‰¶Ža–§‘£¸9y¥ˆ }¼qàÙ•*HÞïÔшrèÈרë‘ß…ë \ôØ`’D8„qæÒ› x;Er%^Ñ ‡¨ð4òpÓpÓGŒÒhΙ%SFG°ù™mØ5V9~ô‰êÙ8ÑyO]ä-»'„v«×QðädàrJŽgYIÚ+w÷&O7úÒÏZ覓p]fQ :¦_u? úÐ]îbg' Þ~‹ ¥™ônÆó¹£¥ Î ¥3hGÄú€räz¼í×°qw«mrÖC‘Û¥ˆ‘¯¶ãûž„!tSm“æ,ˆqÅä¶’#½Ê¸¤öt†Û•“«è¨Í+.”Ì“ÖÈFD'YO[Z ÆëèíhcÊ%aòôrµ‚H’£2 „)ÅØIÒI7éÙÐûMxMªþ¹Ð9{#yX¡‘¤ÒW ŠBRÝè¿Ý3Œ£…¹zäÛ“4®£ãGÌ2³ûëýÒ0Kt‚(`¶D‚Œ_-]ª„úô|Ð+¥àPÙ¿X$fô@ EgŸÚû|änÆë;`éËDPtk ¥³0}_Ù¬`_ó˜½ôÇ«Î4­²ß³ùoÏé¯Õ쪞Õê8àˈâN!ŠZN«öäþÏ„*9ôò u/)²kÍ<˜O6‚Ø|ú»ï%Ô§üŠí-óáûH&W7Ç÷€+ÊPºVvs($Œ0ÆvxLfÏÕ;nÊíC´êõ‘îäOìØCÁ%Ìe!‹Øï.›Gém®óGÓ!j«³ð®Ì©èè ô#»MNþå4ÞpØqóOþ´¨ü[s>N§s³ ÆhhÇlî&p‰ÍêÖXþ¦†U†òî*Ý.c9“z­”†VFn¡r«¬ÝKJs‚w\C`®J莶 © VÛпN>ó …0KŒ2ûHú3òè_™Çƒ†Â:£Zšyê…{­Öc{€á²D„.aÐc2ÐLþÑ`C´  “Í„«ùui2Ðæ=ÿƒ6ÁÝÄC÷¨,%>Ÿ©6{xmT¨ v\CÔ*æÓ>õ1›`àš¡0Ó¼ÚÅPzÅŽ§£§0wîiˆÉM—÷ãq*ÅšÛ¦ԟæ„„ò÷¦ZԛʉßGV·†êÇ[S’åmK«pÚíâ ÕÒ“fítH¼Žï@ÊoÃpƒfyÃɼ"_ÅäfC¶Á“ Dq:Éô•)­Ú—igÌÿDÙŠ~[ùY6}Ôw"ý`Ä@1d”R<® ußU.Kú@Íuˆ6ù鬜¸K<=üãát °E}æ€e-Á—[½ÇKoÔ„FRh‡Ž<ÂþÑ:š`9,L MY׈׬P‹Éê ‹íþ}Ÿ)ü×-÷úÑFœÌá ÿA¥ÿ|Æßÿn±ºk^ Ö*££^fÍŸ)O8ž•ŠÇ“Àëö‘4=è,fIsþTâÏÆvg9_˜"½`%A*òêæ‹¾¼G&AÑìΦ‚VBêw³˜vAôŠ™ˆ˜\jþJ–Nö&+ÓçŽHy±6f Iž2 äy¯µçÛ¢Lä̳»°;.n—´ýþªfîQ~”¶!é)öç‘€¶·Šj•mñüù^4Ê~×½u<¦-ÃÇ$Q6‚UÝl¶(IJ·bjä}®í¼ÚX'¶¦W·M;%Ÿ@U½Ùr-iÓ¹k½„7 Ä5A¢E’λ{SÍcßÌ”°=Æ{_k‚U_zLpµ’`ÀP¨ämò!Þkù YPþ}ÎyK ÌêÖk(Ì¿ç®Â ûÑ;Ï „cÇö±‘Êšl§úÖPïth“’|O£Õê©Yl-¼\9ˆaN1Ñ/ø’%ÑHÔMy#Fåg:îÜNš" P™Óç/\ùÖ}1=ï÷³ßC¢,¹š† 0ØÝU˜“™E¯²…¤ük­¬ xÂ÷ú`qQ°£S1rÎ05þ…}í™2µÛˆ>.â³vî*韬 ¦håhFƒ Z÷,³W‡ à4nC Æ´:…ÃûÊÖ¶‰¹T†ùçêý§wb­„CŽ4ú€ûÄ(E«nÇ“7ÆvC;¹]@›cy¡\PŽ|sÂÃîél«Qr˜Û-Ù7Ë£¿˜Äb¹ï!Ä„#@ÌuN¥-²]¸Ö–L7 jÅU7V<|.böþ$=ÔØŸ‚Fu_²Œ‰ÁÜÕ-Í?ÁFê—]ßš9 ¢b?'\.vU3ÏÇ'Й“…|îÍ̧%±¨½ÂÒ˜d9 %c€Êø¢º 7²EgJ}zk=å8Ô|EÅ®3‘"kýjóêÑãK½B8­ÿja>s\ŸRWˆüÉ#êïó¢œÈ@´Á\°@ ¿‚ÛÖÞ1mäRÉï…u³À|7R÷𮪘ûœZû;1¸ä¤Ðao©’p&,½PT&c£Ç^»)}ó)ÿY»ÿ&A®`+NZ£;ó,±&÷¿ÛÅgìÄÊéÇ]w–m˜ðÞëÿ"VÎT¡£ x 9Ÿ5«çåg´WK3 gTÑ`ÆóÊ@eUl«,ghNÝ`p¸M"QC: O®}€¿w³?›ÔÜ&uPL èL«Ît*ŽÚ_ÜhîžË0ÿ#àT{Kú߇wª&e5p¹Ÿµ2vkB7}´¼O(µ³2..ªyƒb>]G”{ PͽTÈå¼ö¥P‰—«“,jcfž8SvS?n:ÿ ö7çôž¤ÑTh9eûI‹ÑróꎨøšÈçîÈQYp—u)nTrÊÈ›¼ïLþQA/Õú-mõéå ¬ 'ùzP© á}„Ÿÿ=ò¢«%õó){WèH%é_ö’?wÒðy·‘YAÆ P«ìKw.ÛÞ»°£Ùpø&¡ ÷vª#&ºW‘”UJ4X%Zo<+¶èää‹loZqÒÀq4ÇKÁ¤“â᣽°ÈÀªA¤ÿo¾ä×…ÇMㇽYEßéÚpš!áÒg”·\§šµÔXH´¯vI#¡pŸ4~ai¶âPBÏEewÀ±qÜšSRJ³ñê`Û͜ƒÅže4nü(ýSê¶Z^÷À¸ayž`2»w‚Ô`¼³ âç­Z|1¡²³cÚ‰$}Ó.«4gE\Ž,¤°(ªi…ô÷ó‘•ñ š¿tÒVOl£È§O¤‰³çÔÀ·VRõ€Þ&` ÉkQ…€gà᱈{ÔKgx-µ‰Ko«8Òsðu‡ž1D¼Ù…¹ªßÊra®b>OŠÂ"¤¼1›r­íÝ«·M»&=̯r·äÝh·¦:Il°YmŒzfù •ŽÍ–|ê3B…–$øÞ¸•I”‹X«è׎é-Ò ü¯Ôs„8hùÝSAìßO¡± «ã¹O+¯÷…—ï¼®èç{ž¾Qhñ›?R^ ‰´ÌQS:š8‡‹å¼-K{_TáXÿv¬µ~q dMãNÒÕH…[@¥ðÍ/@¶DåˆÎL{VäÒ=Vâq©Yœy!"3 ¾cñÇ|‡= ×ÈϪàöTç%lìfà,qͨ±½þ ßõ‘Þ¡JªÿÒ[œ\ú>ãu'5£B£E!ͱͨÕ{®•˜):ÊM¥ÿ-¨°=õ±hI*G ëèø©µfw9È'®^¨:ç,V\çãÎ#bíô¦‹¤«­gÏ”Š•ÑsgÖ °[‡¶4e¼âëF= lîžôbµ¹Ì@èœ#-îÿPˆAÀéµJw˜ºìj†òÝïÔþ–£.ï¯áDWf˜Oð¬Ô­4ëLi´^UWãÈ|×’''÷¸7VT™d~óجôEŸmDtjÈÑ€Óœ÷þkN–ŒZÄ·’œÅ(쀚‘ Ì»A=ñQ±Í“=ËláMs™(D°©uõŸÈ•|’/~&óÎÿ¡ ãÜöðf|µMF8ìÍNLÄã&l ûùž?É×é£1´gC'mdMܹ‹|óóë:–uìŠÿZ*~w(ØTöˆÈʺY¾¸z!óúú[_óÖé×UkÝúqC-{ûý)[Rg‘jㆆg³'Jû7íI‘æ˜_…Ù¶û?( ÞìÄÿPFè¹ÍFšcH»Î?P¡Ô" é%YEûf„Ýð0û]lø™¥êÝ0¬Gó|Æ;»(m±¹ÝäJТþ²3ï*Ø£Ck(IdºÞ—õAb\~Å=£èCdÀ}Åè›G'<¯%|<ìñ$ïP{ìŸåÏÊbD2zvee”Мg`™LÖÿ2°ÚÕçbJ³v±¹di&5áOZQîÅu†„¢«° +ÆQVÙÑóo(jì¢H"2OÈâ‚)^/'H0È.ŸòõV zýuòpÇÂåf2TõRÉU^ý²¿áÌ 2ÿ/lCÃwb0Æô~Iq©9ùDª, é^rUGw ‡ –ÌO>´2Þܾ…t%W÷4¨ ܦš¹þ]d¹oêYKŽ('µ6,hQôY˜#P{ö³Xô} gHç§Íï\ ùáœQ/ɵªG[Œ2,Æ©%'@&Q”TQh°ƒ—Þä" 4‚Fp·hýý)Á×ìò“*:Ãk+–ÒýùQ'Xg¥Ö$`ñ'·‡<{ãrþrñǹRð±^tÀ…1Íõ&{\xÿƒÃW¦u-×¢uôØkýQìs?V¦ç*ÒÔFÅtÖýú¤wú=[e ˆrÒ]m ¥˜ÝˆLj~ŽD °‚Ô^€ý¯Ñ6ÂPìÇp"ÄÈbMý»le9Þì1‡±öff83½q·n›­þ+ukÐ-ºÑÆ_µxs"1{ήՆuÆÂÊ Ñ«UpåhÅ©?Õm}`O Ÿ©ÉK˜k>¼\Få9 jV´¶>È{P¶0n|j[³1$ñB¸½U;ï I>lĆ9³2Ú¶Ìotú£=š€‰ï"OdP4»=¡Ø›ŽÁ^×XƒòùÂ(1ù`WŒ@6Ž1ÊÿN,¼(Ò«ú¾Heÿ$Aÿ6úWZ”ž í*é–ýhË¿¯RÊ-U áK!`J¢ì„=¶; A\þÌ‚F{ ’ÚÈòÛ¸´C=³’âáå%³½þO=„`/_VQÇo_™ZK Ù´¾¯eHZñ}.Ú ‡§ƒÂç‘÷?2†]iWsÍb…pY$¥oz&à‘ø¹½.@8^Ui(v;2íȳ¼¿ïT|ìer¶_n0”àßN³A0óæÌúÎWÃ/MÇÙã²DÂVì]Ì@›ÃºŽ•×n²ÌüIå.[ÆS¹ÜÈ¥˜Þ/!s#Mì¸öJ ÕN©|½gN<%QÎM‹8!Ž5¼1Ò[C¦SõnÔw·¯ø!7»c¥ç%HpÎ8t"l-ýh:ŠZî>¾6 4’`‡¯»,lÝW®BÚdƒ¾x׺v”¦ë„  Ç“¯òšT¼Apd–ÎhAætlmºüUQF¯H¿|¬Ùƒ-L›Ðád8ÝôÆ*§Mù½2p1nŒ%¤FçYûxX¯>ôدý2×ר<0]©þöÇÿn­-}€}cà³ë (}~‰'‚¤(„*ŸÝ¦A»Á_\ÀÇ9»º4ñíZ¥^Š5hr)Ø)vOÔs™{¯]LÁ%¸[plÃàŸôïÆ>Òb¹½bK‡æá Ñô%y[ï°uÌ„›îäÑG°žˆ?òÿ61Ô5מvæYQøíYI¬›”¥ŒØ‰`fë±H?z¬éûLCɈûC,W” 9¸”ð{²å‰ ‚ŸÝ”eû ª™Ç@9——–‚b¯ö‚Jç%féùw}&ÚÐfKRŸÜÆ},<ËÕ7Øâ!EØ_mö …ÛD¤S{žÛÊb>´êFD`³‹¼€á*;ªKÒé<î¶í@X”ŠðA-tÁÇíᇆ› þÐÛñõÉohQè݈×wØ$øþ`’Ê>TŽ™­ÞV2,¾kQjÿ`Qú~l;YOý‘.ƪÂóeètÿodceâ]ñJ Àô^£f*ݲ´U­#ªãK<6¾çÉïÄ]¦å°ú%ÅÂ>³Ç¨1c úCÒý€ }YÛø¬9ê-é˜ÆމͥGý‡™ QSTñHóÁþî…ìEMôÛ´x“Ëà“\RË(‘Â}N_þ!¡ÍŠö¬R%/V”óŠ)ïÁR'ÿ>­öOϱ L…ð÷p*ÃŽžÉþ½::âºËÅ €lƒÑ4Tùõéý9Oãj¼&0Ê$.õ½“ÄŽÕö޵˦^r ƒÆ×÷Üǘ¦¥ l-4 ¦KŽêK+Gÿ5ÿKúž£:eËõÑ}Óë ZAX•ï°•ÈDè¹Â ÜÀŠâòl|«æ^•´YAcÃíj• ºþ‡Žõ6ÃQtsÀ{~•Àø ×¶¾(3‚ápß/x“IêQðéo}:Ï.•ÓX r»ñ“>|Ô?{iS´ Éäêd\ÃÓñ‘ó¯ÔoÇ–Ù¥»ÐÙ¾®´úȰ…Ï9ÙÿJ¿‰áM!sìËB7²CTT¤Y¡Ь wŒˆ gVÌZ¼ÔÕ›eqæ*Ø·´«7ëhⱞŸÀ\cYMYs[,C-ÙðJ ¨ÉD¿þœunj^íEÞFÙ†bZS¿Ã‰Á‰²˜rxUqdúiùøQ¿ÑñÕŽ¾´BlhëÑÎ;1ê}gö2»U•)[×”5˜(Ò!4:Åîó"pÀúj Ê i©$„ÝÄᙇ+".fîtv¸ÆÆ©Òî`zþ¼ûîÇJþ:k×rÓ77~eýïÉFýù¹Wk’Ð_Z|ŒÐ矺 6Múû ¿Ð´Žræ|Ó•ÒÃeÆ%¹gJ߀i¸Ü½Ý$L¥øôš°/èøŽÿÁ¼xÞéYZ…nîJL¨^†š§=uæìö“t« +þܵœÐR¨ê­œuR=Mž¬½ÏÔö—ä×›“±‹3¾)]I÷.Z¡„0ºÔ\ØâRÕQm ;l÷)>Òuk\äþPÁ¯òð3º&éMhžaßP%ðWVM‘·Bì±4#²<«þñ+ô,‹Jø` ;m5\¡GÓ&Éï¤Y+þxTˆ†M¨Ó?~ëvª·lK“Y•¤é4uè±Ûàá^OxbJÓ+ÙO¯ÑdÙq 3™ ”uêß°\ZÓçð[ü…ÜœoòÎa¯ôÐ$R€ºJ†8Ï)º¿,×üŠ›pç©§ †sÂûíz,sÀ\ÌÎdƒöô¾‹g¾£›€øŽæRf™wóÃM!g (_"„½FË*,¢Lµ‰\lC–gÙÛrÎ7ÁÌÅYXÞË굘û!o0ï*(#pÐpièÒ>9Ç’È_Ùôo6s´æ\Tõ!Ìþõ ó‚hjöf©øÄ…gƒÿlÛ©$«š+CóåÄýxsœêÊ0½x{ÂȽ¤2™Ýxüo"åâ'Ÿpá©·xßùú®¦„'NgÄÓ†CGŒTXü”Ñ«5¦P¾~¿IÏJÌ:I)áÈ)€+¿žÞóëØ¤W׌1³ËÖiP‚Æ]ö14ÕRà«IDäë# ®b|Y©”ý¯ YCªEZ픳{±žŸó4ÐQ­Å·ömËüÂÌ—Ÿë£b1RmÍ:R{^8Nâ¬Wþ°Q`½bçˬô¸?ãÙ>˜d–°Íµ=phèoX²nPý$N<»Z=ÚwýIåý 35+V8ŸlénËØm ÓÖÍÈÌÓ¾\V^}÷ô}”Çh– …'3šu¦¦¯yEÙjŒ| ÿpGöv¶ÞÂòæù\™>ë.°­<O’‡ÖÉ…Åy¶PZ´B9Âg;´³ÕƹH4—©1ÂÉmX0ªyûû™ý\ûwM©éfýž}P=¤Êý†~T¹[F¸ª¦ÈK%®‚,G¶1$ªW£Ï×ÝïÞåÅœVÈ(Ï̸B ä¾]nrªÚÑ[TŒ´àüf|?çKß7ÈøÆ¬ù(‹4“öæ^¥àÖ…«~åª_K^áÏ´òu “F;{Wgç‹Õñ¤¿Ôô|¨£Y ¿}–· w›Ùž)¡ç+ôfA}d ÃH¼»9z¬Åi虹ü´É¹bÂùˆ-ıü¨³Ú’©rD‚[å„]Š è’¼—ê[.q±2S‡ l4 1U -+­A¸vÍ•±ek¸§]H–—8Žî¾§S=¦ÿ_]Í`R·ýš¸:ÝzöÿZ(mÏK¹ò/r°mHüK)µ¡2ñÛ8»TœÂþœÉ‚l¥.#†__JÓà ½æµ¹ÄÚ³†@ƒùgއP®ž2ñÇ·dÚŸ):ÃjÚ8éL3ç0ó@õšp_^ý¦Ú©Ê®æ¨4}bŠ¿x<è8/sì©2ˆIþ/c9ƒùQ¹Ñà°D.DñÓ«[NKÍIŸ;Ýñ\5j÷¥Ÿ¨M8ÔV\MW]‚ûîUQÞfÎÔDø®Ä¶ý ^¼ØZ˜Î<1ãN¬±P…áü•# G¥àôØ·YìßÒ® tVŽÏPZîÏÄA‘H¶“íMœþßü?ß±ªM5ý.%nˆP\ë0×n*툃‡„¢£#RÖiøt’—æSãÛµÔæCZ¥¼Í1dæòf&j‰ûå› ƒ0üc÷c/· áAÕY¥0¡âD ˆ¿°ë‘]–ç[(mS† ë ä­Ÿ3œLµï7÷…:PÐãækÂ^D›1JAs~øN{ójœŽ«¥ƒÇ>­è[ê+¥vaÿAªÐ|¾(4ÛWlþQ/@ äòõÒàÐu[ºÓ˜Çg"(¬CyØ£Y s(L‹p?ô+Ù¥ /KúÙÉG…ŽL{W”“%†‰+褞ü +¡{>Ç|• /*}8P‘Sûe¢Çç¬àÓa®ÐÅ7ê —°Ã ƒ¯³S-Àî[”é½6WåÂ\jgÁË£\LÇt8ÖÌS‘0ÖcA w+ÃT鎿U¯µ ƒœ3P >G;š¬}ú ¸^`HÈßÛàë|0äÏcT¾Ï·`¶uæñåÚ{"+i 4pè¶ ¨“ë[76ÙÔµr7±•¿uÈA ™á† íu[Ì… Ð#´ùº%lºšŽî’Ãígýò¸;¬&lžà|˜gÄ>G¶¾mW;ÔÐ0¸³34dI@ìg›È“õö=1¤ÁÒä +«$ðæ¬t_…øÅ²Ÿµ§<°j‰»L"›#ü¢2-à ”)‰¾5MzÛ ÍžÏŠ~?Ú-¥TŒÞD>€ï ñˆ-x*©ü³Àþ˜Ô+¸ƒòF¿¨{QÒ¼8¨{OÙæ&ÐaàP¶m ÀN°½_ ½¢±%`z6Õ×g°ÀMÐppñë»Û†Òø¹‘\Èå1Bbˆž±[0/p9!4&&°³??ÚH Oœ?íºãÕë$)1¯=Ióàk'Ë`«@»f$L@b®ò2’‰pŒ[ÛgJªç¿À€jÂÈ‘ARcð{Fc¡²T›ÄmÕÑB쬭c4ÃbP¤Hѱ%Ù¾Içß;¡«úVdmí…ÞÊn ¹¬s^g©1µe0T™šl{ù¹ú•„5JŽQm]Vƒÿ4â:­4Îï—÷.ºÃéý÷á]ëFÍVø¯»è)æjÄ\GL̃&¤Ü¿<+ú¸Í?wàbÞXkêS°Åà °¬‰tfóÈkÿt£æ£¢_Y[„Š^ ‚Ùgò¦+‡g@WhM KÑyÔ3w¨uó¿˜Øý/waLÿÿUV¤K¬0ÅN/WáÁRð¢•Û,Z)éê©ö¹ýéî=þ'ZQÿ†–×PÂõ@h]ø ý=7ÎÇGZÐ<€ ŸBMG*¸nhq5VøP6ž… Ü4Ðý>ˆŽŠãÂ>%lŽ9Ð5ÝÓ§Ÿ¼XGqí“Z¹,vÒa¥sÿT÷ xÀŠàsªËÃ-ƒœ‚G¥ —Ê…pfϼ3å0 ¡,ßy F1ê DY¯°ˆ¤Ê£ [ò?#}¨še“ЊӴüY,xæ:jÑ&½%”Y‰² t:nذºqÍUîÜšˆ÷?ZïáMáóéz""ðNó2Úˆ‰æ%•n­Ì+”yô£Õ Èd{úŒ7EBþ]x=êg¿ŽO>nÓÆ«Ü{" —„¡]F›¦&C;6(PcÃà ÍËÔ±ÎJ’½m{擣괎S ²‹Øþ@'oð›¯å¦Si£œÆ&2«æÛc‰ÀÊ,¼Q̵¼Xžî¡ß\D9iK5e¯=/S;ÆX²2–™ˆdf¦êeñÊW^NäPZ]X\¶iÌü`Æþj¥47¯À&ÛrR=Ö²kíÖ¬j¹Ô óy‰T"mÐÓ@IaºÀHÓD• 6²ZË“ÕÅ):kÛËuÅž‹5›½³¥_îhx/«ø\¾Å¡r$öM‰jªò#q«A}‰[Jç7G P$ _õ LcÙˆäãønÿxmðé>ûv³Ãw?†ÐÿFWÛ¹˜þ§ü6øtCü6¼ð"ú—ø¾ ÇÏŒ9¨=Eú­ºµ!Ÿó>tÀ0ȰØúôm¶Y%û2˜n±N×hÊ0êü‰ÓãSDœ7Hå0¡÷Ìï*-ô„§½ —ä~¥IP³¡«í±úÕÏ¡Êü@AVÆfv&”yE¼#N©ÒÓAS¼™g¥$šåÉöóy6ø.Ú\7 ©‰ð"oDÞá<ºñæïÂßà}öQL ?LJútb"¨PŒP¥‰ 6ÑÀëйj?fh¤JȺ‹E¨¦ÿWž¸wÏZI>ÞS8e§¾öB½qôÊ«Áì‘ÓÛž¦Oœ}Ýf0¤À¥¹lœ&éðêeLUBžLÒ)VФ‘f£ÛóÛ¡îΑæ äQ>›~²ÝŠI½š©8 </}CþëS%¬¶*®ÍMçßä\Ÿ§¡Æ à$JoëY{A*¯=uR@XážöOXã¢APasŒ—±ÎìjQÏTY¦ª=ðÔ±ŽÃê)RkCl›ìÐ’M³šÉ×(L÷¼µAìô†_¬¼O…‚T}„ñâ•Eµ$ú‹1"yhåk3ˆà~ñ{ê!]¨-3iÞðö·Sy¤ÝÌÃj®ÓÒä7,»]M7oêÞ_õÿfÃßnç?<ÿMòZÄŰÃbzîiéÁ¥ —˯…R˜©›šY rw˜X}?› ßÁgŠÉìD8©}‘ÔÇm&MšÜ?$¡™—k‰4¹ù˜‹ê}Ú³e’sN#SVEØr:gZ{e¤‚ùÞ 4«¬X…­:׫p Yëõ´5¾ÑîÐê;¡¡a¶‡GV¦E¢åÎSõ§Ëbû*B0¤úŠ©ÁÔÿIí|$ýoHb11èÍgØçÞ}uªeáˆ# Á=VKjKàN{ ¶þQCž$orÐ…úî™\GŒBÈåzठ:P‹Ê9Q 1˜à¡{˜:›rñÝ)TŸDè#µ¡=CéŠ?R},"¦¨:ô4ùL˜öjêtz“¨ ƒ¾}µ†Ó#1á9¨n+–ÕZ0ãŸÒ@ pä¬óbæâQ*ÑŸÓ”¤“Xé¤ödgÐn†Ù#Chù3þø“ˆ”TA´"䳞à·=®!çr¬ªmq£déå ª» »P¿ 0ôó ‡Ú.<³쌕áÂÀA ^Y'ƒýºàP©säqK˦ãîMæsØhmpÚÐü¹±ýìÈÐ6ÖÕà‘lçÃM§ù9Øœ@µíÁ–ƒÖ±4ÃAº<™×öäEßÊzT¿óÑW™×žDôL”@½ôgd üúZ4}¬ùdÜ£«óL³gDQŠõ2þsÐZ¯U¿Þ‹<|èÞÃ{™ngUFsàÆ€gNCˆ;ïÂq ÛÉçCàÚû¥Ç(宀âἩ?•%Vg²ølÔÅâôÞÈvqÔéN3½¡³¸¯¡:«¨ÛðÊš ïÆþžÖ£ö&õG7Ýü|½ëp@ÊúsuÞå«¥K±V!Ë`ŽéRèCsXß7_ޥƞrêò†/(—;2ÿ&Ƀó².nŒšz@É×èYQåòþùgÁÈe™g¸ ͈?@yõ/<–ÿ30±Ôì+fXˆÛ,Qúý´%ÞØà:©Ÿ!aQ̵1å MQÖ‡°@ÙøoL¡Žl“Ù‘k.µp¯[O"®å]–¿d|Þ#* Çè3ÑÿEÊ!"áYðã~>È%`my®2Å`S¿Ð¦M$}8å}÷½¡²G[é1|Dg >|ÚÀHÄ’L&9ú–^6Hçßi2s¢$gþ/2õ$ªUlxÕxÔrZ²œ76 f“–ñ-mÔþ…Åsp-ìÊWhö+Ö²HÒ2.‰Öôƒ»lÀ*Ì ÏF€ïføûp{?ÑîNó ÆÅ§,9Ç»d6¶Zà;È+[›"àŽ_Fs~Lq1øŸ{¯+4ô³À=¯Ð/¸Á‡LÒiNC™0n«ÕÁù Kêçfç‡ö-ÚÇ4ÜüCòWÈ»²ÞÝB 1Ö-:½„„Ñó¯(|V2Å€å$q¦±çù’ò&ù‡=¶s-0·-:ê ‚?0ÚNβÂêë‹8rÏ& (Î]=¿d)xýV_¾ãÜWpŽIßM&Qõy³{ÐY ÆLoÐ|þaVGç-&ÿv—¸D-䓳ºŽ)³žYï’>Úa“‡SB2‚Vn~"%õib6úšI.𿸩cp°KÝYV0¹”®»I¦ õ¼ÚŸ÷}Ne†ŒñžÜôÖÛQ"B²1i›ûø6†ã)%ÈPü™ÉQ‘áþ6ØæýigŠÝnÈ+G]´å˜9s@Uÿ}Φœøñ1µ I§›xR6Ä<“=-Ç?Ó»îrÛàsÒß2ç›^ñ•€e{#µ>Bþ»$ °à.Õè^¬gªWÄX6|é©ÜÿmJ„SŒË“ð6ÊM¹Øñ4bô "œs=e}‹—þ¨sGéVꌹC~§¯uba«Æœëù¥—¼x¾ à„Åïû?L’jS +V¦¶h’–îY)[¦¥ 祋[OæBÐXžÁ=ýGXD²9rlð÷Å=ÉAƒLè‘f.4’tÃÀZù ú ÛEñn7Иåq2Ýú$Sì{_R{Eý×ý9lG•ÿ-Mõ$k¡N¨Åÿ>œPúÁNÄÐâpækH¢žá¹' \Ôª…5bŽbGïAlŒP›ãÖiÝ€!/ˆ°´ÚŒ>c4?©xhèVâuî€óJlö7±u~åÓ²”Í–;?Ç·T™#»ÿÌî`FâùË)6ÚíÅøñ4*õêFÕ8 ‹)Èó¶¡ôF{õÃÜ‹ºS âHÿc/x[Ó|oAKg-Ç%R¿dQqŽJüŽ“yT3gº¯9ÞÀ.sézYp öy–“’tm—"nõqŠbÖÒñt\3ÉÝ·Èí®²Dpˆjʆ!(솣qÀ>Æ€Ö…b~{Û†§!ÀXÕd¯p¯Œ¼k‚^æ ,š «áÜ6ñÉY}†¨;Þ.¢`$ìT¿çœi3d_³TÔBÿy#· þ»®Ž5§cËÁ‚2ûCkë1N“¬^„ä{£f‡¦¥s+Ø *g”XªÐa³Þo7fršþ¤E¯L¨½óñÈËîh—ûÃ0P.OšÌVBˆê«ÓÕPŸ’ô©ói+Äá…C¼*nQãN\›J¢g¬^&¿¨É‘úÿ”ÅFº%+£­‹jÑâ†9L\~ú`7•¹œôö¡²AƒÑ¡È[ͤ;£Æ'H£D‰0\¿þªÄ¢„ßôWÂð!”Ÿs5p©‹5èU/¯ô×W{ ªïr¥­6‘å2Œ©$§ £ú&ú­‰>uÏŒ’zÐÒëОfe]L`9fR/Ç>¥Â¤îÄŽ6ËÑ °P‚Ê| šÕïóz2CN\uLXnìâÙ[£Ÿ»åŒ™xÀ5×û Y^NHlŠpGø„„‘Þ÷·r ëAp’ ZÌÌvMŠ\c#Þ•~ø¸ùtYÁ°$›y¬+B[Z·‚(<òÏf9f#ÐÄÐ}<˜ðOv¼Äšžá$Û”¨X ÉÖœ/î2l´ Æé@ o’_HÕí§(q @™eM¨¸ê#3z(‡k4\¯KYá©*í7ÿ Êu‹ãXÀìÁ¬øB@ 8Pk¬eZn cþ†á5’$ét"ÕÂi¬wAÅz^[Y6Þ^F‰ ¨•"ò¢s”¹÷ì¶ïT9øØ±¼W·ª=c{š/òÕH鯢ÐF…–m¬‰ÔºæF|Òañ?"òý÷Ì8±uÇ\ß~*m!nœ­N5î]¥Õ2ê‰<à÷;æÝ¢3§iþeå´/¸€+¨›^¯o‘Í5$Œ‰^á•êˆïéý`A¬RïIÌ`€¾Z:/‚$'ç¼v‘40ê!?«ÉUО;ö1œ’¤~·'ÖüUú©¢–ÊzÞqÎNr›é§òî-Ÿìi4ò›ˆ•–Ïž\ªÜ?í¨?Lðe%°Â¿°7Ûù€Ì!Û©RûßõÁcÇSI8:,]-ÏkãËŒPô©’AùuùÄÆ|â8>Ý28øÂ9‡œS':Gi=J#R¨‘W§†FËÃ#¦ 4MÜUÀ²#€¬óüyR°¦® àë) ¶Õ¡¯Ø ¾¦|±H®»½]3msÒc_+¢‘µ{ѲÕ5/_‰NÐkàaôby\;ŸÒWŽ?2™éQ\Rõ8Òe0cÉK¤ % ã=B¿Èx ¤•@öZŠŠ` ÇÞŽ<~5Q š-;–‘àô²pŸš‰øÑSY¶7ÎU‘?$z>¯>²³¼Ì ³híî€A˜f«l¦°!-ÜçhY’ã.hÎkà|?fÖ¤MB§"7vZ˜¶?…’ ©Dv³ððãJÐøJSSwÖüwÊóE|}¨Úß=iB€æ}!GFy2 b¾²D—zCK2Üæáò*Ä£÷Z¼Þ½§ZptŠ7]^iVïø›J±×*7ã—ÊYý Õ±öC žr»ôÏ®ÎIÓÈa¦=:¹ 8Î|è~΋ÇŠÇÎËeB¡Èþ7yžÙ· #„5Xˆ•¢ ½Ú»£}ŸÛBÊÖ' NŠ_UÝ|GQ¾Çý,µ†9ÇiöÝÑ£ Zîµ"f£ «xÊ1ÕõTôßy PR¤¼?ÕS"¿7ûrj\ÊQûûG7º*TÜaìö;Ì}èè0­j¤ÃSzn@‘¡4f;0ÑîS Œ/+içswH"Eyë'ÕT,ÚÒì ž5Ïx§Þá‹NÍ~à8=- ?ïw&òÑù…ĚƹΨŽö™ü‰,Ÿá£[€ª2TVd1 }ç@èGŸ°¶é„»Š!:¼h·øAóJ´úػٴ°ÑY§w¿öQ^މÔ3…3Ȧ,Ž‚I6÷¨^ájl0‡+@Ü®ÉQ­ü-Ã'ÒÙ›œ†EŸ3ü’üªÝT ý—ø;2ŽšÑáÖ¢cè{öjÕÈ*ÃÉ*FI ×wŠ#xÞ*qàOkë YW“öß¡ÀE#¿§Šdíóöi{%Ÿ¡2Ðù%|« ÔC_õêpDœ¨ šé-¥•`½€#6«AM»¨­æ²Q& R°)q um^XÏôµ!)WOÂYV äʨy«õö—LÉAQ ËÛ½A«øÃÂxbÃÙÞã­Í?ÁH3𪢇ۘBjȨª¾ÔCCnÄÁiÙHøuæ k^—ÒLaðÀgO¸h]­Q^ê”ÞÌL®_‡+ÆÐ¨çæi[X×2býH¥Amæ‚ó>ªrûtk~Þ–ÿ7`?‡¢Oðïö÷—û{YÿCÔøz„ïÛé±û{ø¾Þˆ‡K¿·}o«aùŸUßü6«þYO«Fo·³?áÞ_ðîN' Îû{Çþ†ÿxz)ßoV¿ÃxÿC®ëíë>~ÞñŸU}ü5Gþ3ÇÏÓ‹ííøv#ü;¡‡ÉêÛ¾ÞûÿC¼ïøz+ÇÏíËøn—ðé¦ûzM‡ÉØÀøm†¥P£™YÝ•àð°öâ/|åùÞ~"g–Ê´=8ĉÄgèlŒx%‘ÈÌd&w¯ïO¸¿³Ô2E .! Û© ¿ÐÇĉ?ra~L™å;á;úA€kÞ9Pß`©í "CÜbÐD|ìZÈíµ/AÑ­$«Ñ”µ“Í’È×¼:2¡6ý§ [øÆ™®GKº=Ïá4˜eøƒ ±ýÛI’­!3蘪ƒ÷?ú€;èXN}D†©üIOËG·ÇÀgí²ÎY-G0O¤OçµÒIs9Ŭœ_Z‰”ÞeÏS¯HN§ò¶¾â²§ë¤Y)JRÎ`¥ áèS à’:pМÊïFCCT±_þÛv6‘-¾¨cp Wq;HÿC^-àt-%š(Ë3*ñ(Iø©¥ÒzOú”CÏCSЀ2ŸWú‰%jŸoN5ùðE«â‚…å1Sñ_ÅšøÓ#ÞÏæiäæU-ë“tñ½25‰·ì°P{ÓLB¹³En"p3¾é e¹ Ü=ÕŒÚ![6mÞ³…†’ôÀ4‡y•rÃ%p+Ï^ï Å­lb L{gçéó.n<ÖP‘±AÀ7š œ­øÖ2•Ô°?î#n"†<ȾŠtì‚)t ©+Ð8ô%Ê·_S†ë( ݨ%ÈáÄ÷JøÞáÑ‹ÉRcîÔèÒTFÃùý¿¡çpr‰…•^W ß®P"–å.«ÍÁù¬!Ç¿`6¿ÿ´ˆÕÔ1WdÐ2ß¡ô±ýSNÑ:é-£Ùì}©ð‡á)Äièe¯öIQ/(”I:‹ü¿*/+oNsÑ©8Tâ,æ;ˆ:ÛL; žŒ%&!ý!Ë“™±0¹6Èvk‡J4UÔIÉ®ß 4Ûÿ:ÊF4ÿ¾9v%»và=ÔèÀ@®uéÒ¢çŒýÒIXâëoa}jã3úŸ‡·˜…J€­€Is+-/ú¡ß{9«FGÄŽà¾ñÔs®â{U.©ÇÙbP&¶mR‰ë°TlŽ÷}u³`&t‘›Â´‚’BkC0bí¦ÙKˆª©rÂ' cC•TŸ|?Wê»nNSŒÉ(ß¹sàWÿ÷‡ö9ºCË8Á|D;](íÕhõpô¼~zFÁ§Å ¸=û¼±…ÍÒHëÆ¡ù2ÞùÏx1Ø,ð¡^ƒ£«Å¡k¯8qð5Ú¹<³¡_’ä™p8{™³×äªðJ±ª‡ªBšÒ*“°pÁrÉ”&²r"^õ¼¿ ä/jy‹`Pç¡,òxëºúãÕ|"ÜÎÐÞÙì׌÷`ż¯Ž™/€rìä|.ìÃÇKŒ]p¼5#3U"™ e¥4[.ŸLEÐD{^+W$6þŒ~dP¯¬©bÑ“€-¹áƪ9qBýe#þù4KÛb£ÕÅ?îÅ!!äT똗H}ãð- ºÝ‰‚«±HK÷Æ£B§Q›]8~ç÷Ž·æÜ:«KÌ^¦º…=Î1< ã8— ¨ìû ˨7‰8–l!Г'.:EWD©9ŠåŒ˜ÇŠC‰Ãijà‘ã訛o¢ä¥³OÁÊ¥xW|g%äkòˆànÑQdíà\ÀD™ÌŸ«§ðÑyÑÈÑÿ[JB¼—&WT=«©ÎÔ¶ ¢zÃ3‡ÔO*„Q%/Diã­_g²kÙ╜iÛ„Muég¾%:.è°Åò;¯ž{áŽm¢vés9ö¾ü+nšÝ%þ×Ý{ hýuc?íÿ[maFYøÐÕOÇÇÌbÐÈR$;¿Û4VÓé©¡kÈePëºNp&ôbQÊ'-ÔW¿?^¹åhÈ—)1½„ÇfÌú&qâˆ%R’‹Yl•·ÈëN°J†âÞ©¿¤¯CÈr X²’ÙÔéÓÈDÖ—#‰´þAÛ)ƒâ‘äNl«ËWº÷ÿvWZpèLÁf/¢/ÒJÇQv:Úƴ -¸˜b‘2·^džH¨%$Í Ç-:hdÿ}wÅ?Vî[s«ïvH7G‘ƒ2,0®D.BdÖQø‰ÆÊÉf–k\Ž5Ô@™XÄ?ÛÝÙÏóMÝ]qõ|®Ü×9Y$l®¦ëI¼Ï·e6= 5 ¼üK³«ÕáÔyn=wç‚~¢"´™‰ƒÄÊè{Í¢°Ëo¥­-÷€nûJMYzóÆíÉBéUã‰Øn¾üêdü;ˆ÷œcHŽ-(öy_Sb—ØÎ99ôߥÕå¢Ìì݈¨RhD`¾­Èœõ”O…:¾Í2 ó¢‹þçð‘ð0ŽPBßN±¾[ÑäÈHªI[µ„G¡AñèÖ•CQ \ÇŽGfjáÙçsE}ï„4ë•LÙ?dõö+‘ñèôTû«j¬)½Øq‚§ùÔÇ€x¦>Á¶`~¯¶ÿ{s¶«Ó¥Ù´½`0)”°5Ý,žq!2ÿr¦—±ƒ 0çéQ%¢ò»Ö‰¾Pí\ƒ˜Y¾˜Òàú‰\4wÙPŠaú¦ žR:ÑŠ&žê:5ÁZ3²¦ •^sàTôâp誗\p ´@"SŠ3!ü¸`•-˜2ó"rpÂaFø–e“›q_X«°mæC³õèâØ–1 @?uB«ýódRßà¿s7×`¦H½@OŸ¯~QfìAÚ4ñî™laä×€®N„ýëuçäÏC2Û§üÚb ·Ãè†S1©18—YýIUB4]ÒٸعȈˆþÉÀÇÐêë·ïÛß³;§ËÁpvßb°Ô´à“Ž j úÄ2Zï©ÿ¥HüA¬S/÷kò÷Û?"ËŠ¾5bĽ‰ÛEœ¼¡†Å~i§ôß,l\N_2ÇYEå÷ £íšð–±Òªg𜡫¬z6¯ü¢_$wî:Ó{¨˜$üõ—ü@éÅå¨VäÕ畲›22~ZQÀÅ‚¿1û(ª»àÄm³¢¡–}¡®½ðú"D ƒ‡õóY±Yl³&D³E„;¤0£R>º/]*Œ3|Ue2îõŸO¼t®˜µ¦¤8j±G†c˜6Œ×;„’š»¶n(•ug$ý»£Ò+8|„Dz çPkÑ¥^T±73êãð݆£…Ðç)Vüî„”¤^™30‡N=B$6Ù´íbMat¬[榲¯áÓ$¶ÅÐ,Ð "ea¾¡Ö³õÒsÇ'z«Z¾Þ˜pCHE?j˜¹5=L½«“ÈiíUK£P³ž® ƒ×»@¼_Fèp:çnsa;°É .Ùß týÍLâýœe‰¯O7ù™<Ã)ˆ—ú‹J¿û3övÜ"Ç|Í®·Îêæ ¼t°¾V›W¿ £‹*áÐs³y~eÕ¸`¡¼M.Ρ?¡ ¿¡J¼_A¾KüMë°Y¡^ÿeÁÎÉ\ÿ-|‰H˜)¿Cyc÷¥ÐúÿYç$õPp(æ1/eÒñÒ /kxÎT×ÜÏZ%ÞCY}†tô©ã®ãÒ‰¼“ñŸ’@Ø>ðxSaÃ}ççÒs¶Ä¶pW\ÇN-U§£õcÜ)÷¨Õ)é­mÈb?:”›@Ëxöï ÷k&@¬þŠ÷ ôø¼Hã!sš{v‚_•¼Bïv›Ö;ëP|˜ê>3ó2uÅD˜•Z#® ¯‡Ë– âï‘i v)Û/7 bú¥"R¤ÖC ä"¶Ý~¡!©ž³öåH<âlÿ ç^Ÿ飚)N0æýÜE”øñ˜'B:ÁòÔ›ÅpÜþ™-¨*“ îÄVCîoĨ– ÿrù«·Þ”q¹»øòÓ®*œ“/:}¸•K¬&ý¤. ×礋ª³(k\~‘,n—¥v—PŸntêœO l=ľšÈë†Ì°Åâ÷³„É‹ ´††Y8Àdaw°yš!hçÇ&…ù¤Vn7Ÿ5Ý¿ÿLF]œ>f6·‹=˜5€Ã]Ž»@2˜šVUGõÊ®|Üþ:¼òH?#™À-××ûjµŽË)l|òµï‚®Ê´¿"¡ç;Ö–„Æü'Lh²ÿ'嘰 ïEÔà}¾C*N‰¦ŠÃ¾†IrBÅ@nc¡ñ¨àÿ`²fªŒºªÑ/ƒ;L’$P5þŸÛ¨³—¤XXù©U—ÊöÂ@ä’šú®ÌàÊŸ&_ Îêõlw®ó× ·ÒÜp3’xpv‡B )œµuÓi@»w,Æè/+ˆïgÕ|ü§å™‰…_R…X÷Äü+uŠþ65›¶~ÈçÎ[îØÀ~oF–;%Ä©œ#ÍÃó%Î2µ ú¨k;vŒe—­ZQêìŽGF´û‚K~(&ô诮ÝÝÿ ¹xöQjòÉ[¦ç¯ÍWÌ“Æq%m"#èæ½›þâÏ?¼jŽÏ¨!†(ŠëÞµ³„FcŸÔ… Î>+ÎVW`g½Ãüt±¾gDnóVæd:IÃRikÍ£2ØQ‡(NO ïhStÀpûÿ ¾ÉQCòNkW;Ù•[jÁ‡m]‰ Žžë±1vn| Þ—vsƒŽÅN¿îè„È"çÕôÿÒ»½ «(2ݬ-ng£ÓÂ{o‰†Náf˜Èªœuñœ×cÀ©dñ«)ü Ü)_tk¹f.2s#¥²ºËKJœ µê@0—;ÊܯAŒ¼ÞÔ\J-`þœÃa øxsëeZì¶ØÜ¢lYål뎉ÜÚïW¯!¹2‡ÎQ\è—Å>/¹ó1;z#Õ½½Ød&‘vÉH„íù7ÿ×->GÒä”—tR/Lç¡–¥&(L#ÄLoO‰{’òQk˜G©‡t6}kÑŽø¬²ÌÕ ;€tJÇœóá³Ì5˜°y‡cQ ZÕö*Ðù­Ç^Á ¸gv»Kœ2§264—ŽƒÂ¸¨•æ´ÙÀpÓc¨DUAT¥Xç]fòxx 'º†©ÿkŽ}W„q¢H#Ôô pVÜÃ4°åYÍÊ Ñ*~Z BN(s¯¾ß Öz¡Í³@ø $ÙÇ_Æ Ê:`æ Ó‹äÚCU”fú²çÈKºÏ”ÒãÖÏIȵ‰?£_¥'?Ÿäq[-L,òNõA{ë2#±ª€|÷‰dCÉê’ѹæ~1×ÕÆ|^ñ™²útÕ=qzì?xÅèñÏ(f…|<¯ð©ø×™ØâÊÕÐy¸nìˆ`Њ`l»7o„ã,DŠ$£_Ù^#U_N¾¾»%šj¯îÚfÇwã½Õˆ]ž]ºêO£ë„ï%'\u¤»H“ˆ]Ôâó°£b£wÆ"}K5k‰áK2¼…šBÇP"ÂGLÜÂp¹ EKÛÖÑÏÜÿ ÌõlìD ’Õ¶‘3\¥þ‹ÐûéCt⊪ǗüœM¬JâªÞ¦0ÙÕOCn+àð„ª3‹uʯÒ ‡ ºëJiL?6Ÿ>.Á'Ù%R‡LD@:M〕ÜçÊ'ºÝò/¨Ö$M¹¶$KŒ´ýû (XµË p_o’•EP8{8jՉ゠ç9;˜Ä0rð4šo?y'aeæÿ¼µ†x«væû7¹ò¶(ò…g~±½ þ½~„¦žkÙϪÓÍ_øª!x þ¼Œ“ò]ÜR%ˆ¥Ç× t-ˆ6Ãõ½2˜Ì;’·ŸZ»‡e‘£s9ÜŸƒy[0fvíwòéê€sÃŽ¢^Ìê;Æë„…Õ§" UO`Ì »Õ¥¨ÄdQe±qÁšØESÁ÷¿O>4hå-iÁ»l S–L´ÕSÎûþolÅI‘ô:Þ–܇&‹k÷á‘Ï/.Ÿ{=gGe´áW§È*Q-"ú¦wùŽâºŒdnÀ$Ëëë2xd:ý­M¬åï¸21¯þD³É:"]3‚d¸¼ZÚ¼”qͰò>:à £Ð|©N`è¤{Z+⑦½°ºrcºÀIqÚãE±±pN¦ø:XæDŠì¨öá’Ê\$[`‘Œ"Œ`œh¬”V×¹Ðqƒš¥aã"‰B)©ÿ ÷©Ãøwè#ZÑV“²cײ…Û‡ØÄÛ6cÉõB< |ˆb{G•êRÌ*3>‰}~üÕ† NÎ#‡Îâ•®W¬MUñËßn]ó‰k7ûÕjrµßÙè¬7Öj·„©¼ÍØŽ:2¤"Ä^ñã9¾ýËüBîllµ'}ý@b+KÕïmR(™wb«t×´Å:_Iâý¥^!ú1>#ßOg«>//'ÙqÒ•Ÿ>Ú÷¾¦/é›PžŠ*‡¯Í;»[1mQN]ø4À¤Õä5&©€VŸ®§ }1r‡s‰t‡‡,|1µ1dùn;±ãƒ,&U‚žbö Ó®ÐåóÁõ£»´ôU¯ú3€Õ»s´Õ@gcu:¦ÅÞ{ZO¤eäÛY ÒÝ|,èx"D}Ddè´‰ª”5 ÇJvBÎ5ûåÂ3¬ùGš°‡ölN'•G•¿'Ûöí‹gßðh}óäv¤÷ªQiüްÒôÒC?e=€>[ÒeãDÁkTÁ~øÜ^¬d8SñÊ-­¬nA w+Lµ|Š­1$–ó, ÂÔ“ P>Zš½–JùV¸´Ô¶/²†¢i`¥-_±cûñ{¥V–;‘Bî%í§w´|/¯rî&öd|±'~ ¡ aþ¨$‹§|%JßÉäâ+{8§ÐJc2#¯[ŸÔ%ƳÎ}­ªj>ª¤žO¶‰ÄÆ`.l—º‰"‰ /‰á£z/® ‰ú÷qæ9í¦ýïœféí¸ö‹½‰A)îtÄκ˜VÒ¹LXøÊ¶Ç]IBËPæÓd¼1žMázÞWÙ9EÝýð~|ÚM Ka¯sÖ?Åêl„YI?þ{5(×¾ú`†Äy`+TM­Ò£Ú@QƳæ½Ùkõ"Ž¿eÂàâY…ûZáÆ3ØPÀeöx)Î|¦4'¶ Kâz£¶ŽHÌ{ì¼×,Þ —ÑÄpåUÚ|ذI§9«ƒ­EóWÝÃ,¶çNrß}£&wþSÆ Ô6°¶H—ûÐëôÐÇ¥È_˜–xú³o,O ÏÐÅÒþ®Æ³ÖÑA”Q@qµžQçsõ1Yxuv^3ð={TyKò7/dW¤âþŸ:æ¿£ò%ªqL9’ŠÁ¶G<ól@·ìPäu&^Z¸-Õn¿½ó£ Ž-@ž€ÝˬAüðîÎèV©óhXÑ ‚ízYÚIYÝÙTŒY†sFÛ(üì qm ]Ü`¶Æ7!tϳùé™f\Bö&?#„“ƒ‰·˜Ü7“õÆ1ñn, BV*­rèß …S —­²® ‹¬)“=á²ó*_<† ÿQV¥o™]7Òök~Sú]œJÛzéù|쉛xZ‚WŸ&ñÔ:&!>tÚ›k.òÈPIæçá^Èí}úOÌîß³=bûcQ°f4­O'½B6hØ(^®È*9ÃÑ hoòXôJÉK#nu5È¡ïYÏ)nÁÜÈN7Ôø[%Lþ¡§Wí§e½¸Du.¯)R™Jÿ.ñŽt çÈ«­fOÕ•M9)ä¾YäÔèÒÂ’Ù»=ü¯î;±Þ˜[t㘪îD¥ý¡•ªs¢Ø ÆzC…™oÀ~øG–¨¨T‚°äÉcÉ8±1iE¢÷åÉ,E·¬ux7_÷òC˜å˜8˯kÒàÃ8Æ œ”Îg²U³„ŸÁ˜9¢!¢ûâОB—kÙ_ÑÇp¶Iª²‚öI 2^%¬½ýÿ"ÂÎÜ|,ÕP!r=ÑIý)5x·xŒür;ïó7Gxkviëˆ0´†°L€¿¬¤Dy`´BîS }óáÅ·ÝøjÚK}°Vž¡Ž¬¹¥«u ÕͫݥW÷Y”EåœÜž"¼¤ízžú *ðÊ­¨fKbC÷#5LÚË›™nyÆå%öÿ@Â3E£(ßlA“sL’Cs™½43{ Ô|KiÀ&@¯ †· 5¡Î\a E§k² à¹wMŒÁ²6ÞÛ³Tü–ùܱªÒhgzjwæéìnZÓg{ìÃ1þ@dväEÒÒ™0kt=gá/yb´¿DLì¹ÜÍ ìû–K-üÝyÇ-BE-È3,eTýËðsLÄFÊ£X*Ë Ï^DmUMÉâfvLÞˆÎãcy™žZh@hÑJZ„'`Ñ*ìPçÁ’v¶ùlÚw ³çÏcŠÉ™uµàm냼X`½tY_ߎþ6L€ÇdÇIöljyçí%ŽsN³åÕJñ5zìÄ1Ÿ­Ô­ív›¼Hî—WâW½ådÚ%Gzµ0ßvE¶njÔ„rÇng"Oœ­Õ÷€“þ,5I0«[aX°­.±ïhà*½A2©_ïÄùD! Óy—m Ìš|ákË |‰F¶@#*‘d]u&¯Ãi¯kËmõL½Ï³`ƒBÀïaªu«Á¬”x®òßõ›µv‡=6)P6—ºÊQމds‡šä#ˆÈeàãŸt¯åæËqE@M{¿’™.bœ#º1¡AσlÏBŠé^jª7.ƒŠM˜­ "eç ;&A öt¹ysÁ¡Ä–Ÿ˜Á'XÇëi:ÞX*wØet#uÖTÄQƒ/±ºM§Ñ/Ž`Uã,d•EIëù×è­Tp!²§n‰áŸÚ¿P•cyâÓç3Ø^2Ùï{º¸œ%ðcµ‘ÁIåÎ%ˉŠú+éw@DåB97Ån¾á-bØBµ‚³0<­;Ñ@Ä×EÇÁ¥oMÿ,Œ®¶5TM¶¡ÓróW›_K0‘ðvšyæÚâž^t¤ü…gÎÑÅžþyt¨OaÚ3j0ŠÓQªKnÉxdirÃÁ{CAÏMì…w0Øx,¹ðÈ·ÞI›‘] úN~w­Ø7óNب‰>|Æwîf&ÆLô~ÅÜÁ«½Ösƒn¥ Ÿ¦à£þ†YHNÉtš¸!R'ϲãoÍÍÑÕPµ âŸ1o^Ä)·€÷#ˆ8¼!ÙAÆìŒÎ)‚g£óÓq\þºTŒDÿ‡§Ý•ˆ¨hR3…`À‹G5…¨Bü)©ºˆ¥%¯ž <[­s²{>ÏKØÒ‰á„8ðèä9‚?øGR%¸Í|jVJŸð)„Ò(ó©6±•ÆY%P‰†ÛÍ—@+Ô—›F'Ò&W‚E§‰–M[ÎCÇž¥?jÕlQvâ0¹a|ý›4³/ŠsßÂÊ‚öòá2<°<ÓeôÍ4±>g¥œr’ÄØµS†ÌÃŒÀÉ.¤‹iò×ðÝ\¨ÃÒ„'(Ÿ®r³‚ý"³Ð…„º (T ý!ÞéðèX»>'%PøÅºûV<äñ¥ƒ9 5Gö¿’€WôÖbX}…ˆÓq Tceoi!c4))y”6˜xã*éÁúÞp mGõ[*þ¿AY@Î]‹† ¾x‡œ,!2’¿’údðMŒŠÄ<›à,²î“gpZÝ6ÃÀHßâøé¾SÔƒÎüó ×FäNèUCƒ«<ØÀÎIGìËc¨ò‡kÅÕúˆÁ :ØéVˆÝ•ÀyÐëôëx½ ѰY—?&𘼠'ÏóLjk29ÂÜÏ“)T÷j4á'I¶w4˜ûÙWRñà.vŒÆ øI›lwtŤ7óB#u"ÎÞQWw‡RUmcœL?©O<pXšÆDÇ’‡EY¤è0Åÿ-ÿ 7ßbdƒG³Î\¿”1“Ëg –2ÌÒš.#ÍúŽ¡]Ê1‚sAQ@{ß6-D%šE&X†Ÿ…9¦LdÊÛë.Ôù©nXužöal¨##íü±¶'‡’ø˜‰‡¦êìé™"¼– ”]È$ÙÞJÂÄ‘^ú/®’#ʃ¼Y/ Å8=}B¼»ŒAª ëƒem«]ÜÉSwy;YVCÖœ‰§ã®âÑ(.Џ5Õš§û /‡L™C…þh_k'1.ô83ã=ڷ±kçÒºp âžjDÜÈs9ÎéêÜb5ÿ"jÌ5(I¤P=«4·Ôè{ƒÑ´G÷á…úîÌéõ8ÞF d¦úZ,/†L œ'”-CÈ›­&ÉNN4«&¨º=Qy=jöª·\'KåÕûÚ²w ¨„{ï”ëå9Ñ0&Û‡ÿ7ýÐü\é줴åÈ ©$Y—±ñ·™lµMõ]1uü7 •ü¹1³uã¦dìÚ–Zêhbàkfa•¦ºúÿB òúÍÝÂS·7š¶8Ö¹ˆð:HbX˜Ïå‰E+¼’£S¥ &ßÿMj„¯bW‘Ï'Ux1ÇQÍÅ”²œâƒø‘© voûª0ñvÇ@š|3 Ä&¤‰$öˆƒ–PÛMÖ¦ùÈÅÚë(ã. iLYEFÙz>ï{.PE,üñs‚×Þ‚\³¹;áÉÚË¢úݼo™d;'EB–ÎŽÐ_^Ý X86jÝÛS”¡'ë+ï~ÒÖŠ¹&Ë*whœ¦dÇ-c´žì}NGÝ8šð¥P—{•Ž7†ÓÒin¼҈䰿ZžøMÌÓa•å®1žJ¦†­Ä¢{*ÛÅð6˜¯-5§À¶Å‚,MåN]ëdÖ–]~ «:/"$óôðoiÍ*FÑAÜ£2 ÌÒ`S~vA‚ûyAÛ(´mY§{pÐåI›ZcIºœYeL½©MèN‹?ÐÑ}´q~TÀs¸sYÇBŒ¨ôÀ`Úeú¶ú•}~˜·W#ÚUz²‹eA —Å%sê€í™¼9ê! ±þÈÀ’Zˆ1.#S óG¨\;¬ûËŠ"ÿ^½ê½ü ±h†Î‹ݼœ[_*¹Yú1c}lfmû4„{™îõ)~J“|OCµ²¿u¢xe_N³ð ÙQO …"”Éë8ý>ÍX’à?¤ì_jàIΗ(Ä2N‰ÈÒMs 8z@;-燖’ÈNÈ;çwwÚÉÆ‡¢ô¢ØÃ)ªâÐÙ1Åb7YiÚû$Bá´7Ü ô4ý‰¨€»a;i³T‡ ­Èù‹ñßÊ\IVN´Sqë{=^ü\_Óù6÷ë/rtP\õ~]Hbi¿òY °õÍ@cdšH¾M—©Å?I5“]ŸÀÏl†ß‹&jï2”}Ÿý,Jšñ”ÒoßÕñê`O»_=+ĈWó„ÜBpP:{uù¦¼Ñq²ûêõ½!­B¹.¡üram¹f1œÐ¦d¹/qoõÚ‡ˆª­;´Òíÿ„$H ±è nx8¾k}¼ª™Ü˜Òõd×½~z­l¶þ)MQ¯ÎaÓÑ­ç·Úï~ñ,›5­“ô º'Ûò’²Gåz8©?Á båomÞÎW“)ò÷KW¼!¶.Ä—ÅC«:OtŒ½0Ró,4àÒX“ŠPþ ÜMŽZÙí0é9ðb-YnùáJ¬ZwÝf÷„©{Nxé(Kèµÿh{²Ñ¿v?ŠØ»×]5ð®…„LçEÅ܉M{ø‡ûåc;SbúJYM'Õ s ÷«4>¯äÖ´Kv å¹¼ìE@h¦8ò‰>Šú;L%½ºÙðц¥ŒL®Iêh7ˆb§…Ø <˜à8Ž%7&®ÕZ×Ô`˜#Ñ ¦`¤ÓjúúãG7ŒÕLX¾ûÄtS#½kwìCQ™?³ÌçpXöÙccJ8\.¤… ºsðlä kv”cºs+Óý¢0ĤIoÇgTþ ¯³\‘d¥idвoA*³EžÕL—äéŠ`N·`ñO^.×÷É;ƒ;Еî¬zŸGCË úwc€¡s¬‡†›u¨ Z/0J^p‘íFa€•™åoY„,Gy_š$ÖTá?]ö½¯ŸƒÉ°^~püJ.EMuò™6/ûw›ò1ï¼Äé{»Å² yÐêÛ<š$Iop†¾9öðÿBH¾¾ïñô³µ%£!åŽA,†©Þ8˜èü×Pno¯G¿=*k»Q£(lð8}ÀôaŒo´ ºT-±ŒönéGxÞøuÇ:(é(uׯI§µµÅÌ(‡øyŠŽnQÒ‹æ€&LÈäjL&Ñ¥÷¢€–¾t—lL2–ƒ×vVj“¦QŽR `½Øg½bãa''ybY¤MŸo|Õ¿b'Kî¬ìoð}26ûÒщ&ânÉÙM¾] /,á{la¼4è{#h`'G„º/懲ê$GË@c>Äv9ºï"< ’ïüÏÂ`¸=ÎcCL8›[ÃÏ90ÂûÙRTô‘þ»`%²˜,ö Ò¨: °ÅW3ý•¦¦÷:@Ó r‘bÐMë"ØÉH¡(kœ¥ÚG÷¦ŠÀÅ)‰3|%‘ßäßTtÊØXL/d^Ääd`ÌBŒ.Ð¼Ø }úät#çk‘àØzúK‹ùüóØŠu^ rs¢áôÜÜ7±ëvÿR¬Úb™skJ‹w àáçE«úªa=Q¬»=Å&Ã~B >ÒÇ.8u" Zäöê cmlQÊ#hبvà‹—awÊ4§Š)œ”·ẏü¯_vó§þÆ« ¾ ‹ƒ¢²ò=ßž4úóoå!¼ ràMr= ^ßµš:˜6‚W“lMWUÐXü¯™pí2  rw7‹–Ç÷\'n¢ö{]Õ'‚µj±›jn¤`·Bá.Z¦L¸ó! ™àz¿åáö>âqÇ‘´l¡6 Þ^:?´®FROéIÂbºJö°é Üö»uìÝ^Õó› øqœ²`= EU²¸ i,ÏèJ‘[hÓæ…’_õŸ¼å_®{ü‚û{h\\(HÆXH%|@ ÄÞ CøA öP÷”®2çeåÌ€Þn@yqÕ‘„H€Y0^K“¥f+àõàçˆ,dOšØ=ÙHǵLÏçƒ# uV¯$מ@à{͈Æd…NxœV -ùõöOÍX 7ÞQñßdÕ/Jë•ð›w¿†è㘠†g]ÉÖÆÍÆÉ´l¬Zï+"Ö“¦’ulÚm,Çk³%¼ù϶nÏÜgø„t(´&ºjاŸµ»Áï %ãŽU•ëÃÃ…ÚºêŽk6sç£"^8•ý4Ök3L)pB„æ|sGó§ÙÔ¨[ª.¿RhœE…øDt‡&ÒŠ¬bÞö8מáöD žLŠ`j‚üçxÊÄ?ëòo–ÊÕéh}ɺššê ¨¦Zx£ÈZM‡K1Å‹/}Iµ~úÒ¦RHf§YAþ ixÝ®êI¯/¡Y5¬Ý°WI¹¸ÛÙÍ4`3.´ é ÿx$ÐÛ¯»xyîOÍQ¤KùëŠ1ƒõjÆ÷ÊËۂ˜˜"Àw@¦%zŸ,’[À®å.‘pç,?YÌç© ºNöD_WÀ®Ó‰ÓfYçsÓ-4ÿ$·\‰RøRu=¯5ÕlþðÕ©8Ÿ.ûi52¬µ=:¦®ñš}°K·#¾·íÀrîjÌ÷pÍž}}8ÇøƒƤ7¶ùF²úØ´òÞÔçÉVÞN¦ÝeIWÀ6” ™/+»@*íÞœ«LªÈqn –¾?ëgóA¶¸DâœÛàü»”-…ËÌí0énFJúWàÛ†’‚­ä”øhɨô:—´––ÃGåÊW|¢Ž 2MT¿ôðt¡Û­R«˜áïã—¦CÿKÕ/nV:_wKÊWìŠ-Ð¥í¤’òÜÈvi†íþ¾ ‘úF_B9¯„ÑAÒQîfo->"£ëŒr,bƒjÛ÷~SUB8ºU‘õ®H”1-ù7§ûËu C7ÊÜ™€Âþ ¨ Š)Hwúón¶öøÁ°ÿ€×|­¢è\E}(Ñ/¶#ýF¥-óøÑ$b^`è‚/—T.Å¿ °ï‘!ð`Ze£­uÔ…,Í“ìI†sþˆÔKÔóž­®=ÒžG©±:)]óÔQåÚü/Üú¹¥ßᜟ¨¿ÝBfä‰ìä&ˆD ±É¬ïÏ0ÔWtÕÈCþ„¤-¡÷d@e§gÔ¸çýjAïŽÑ›àÞo°ð€@¥±a}èG´öÀG?Ð=yG_Ä1®6@þ¢éü&Lzî©Å޳<Þ#ïí˜)CzøŒQ/˜<˜ijþ\ßRÄ~êöädröò¯©]ûz@{Ï{—€Jv&£mÌ:i/Uþóg‰b±7ÌÎïÕ…ðUÍ >>Ð^DldÞ¾&lö¾¶Æ•à‚E,{úSX`õ†Cyv¡ˆXA3ĦPSò@÷zkô–êVà }~Å»pÂÇ6²îvwúÜ)”iÛ}ï´“ô±Þ÷gl‘t‹fLQ?õ8ÞžË%ÇyÖF#’í]Ü^'•&ñÿ ¬v‚ Ê×jÄÔc?/GO¯B"1cÒ FAø‘bÊCè3yQa"oÄ¡Êo^a tÒŽÉ"›¯Ö« ¾4"éÝú’üäÓ÷>c°xE'à,X¢ç7§•[,Ǩ¹œ™Ûµ½‚–w«ôsá2kȉÏ_­ bw2;ìñCŒî|Ãèøó…Âè@þ[rÞå¾Ä§¾Õ\×ÒúÿbÀ‹žQä.øQ–XÆ(h¯—ôÜh©âøÐ­G(àÚß_ ÞÅu¶\ ^'F=–¯e½VLs Rm¹!°škü4×Çv,«ŽŸàÜټcOùU!±ï½œ KBœÏ”»“¾M.£v¨’Dæ¼Öé5ZÝz>°ºc\¶Â›”ꜟdT™RG ±aè#rNQˆ¦mɾΛ§ò¼*tým{çêô·ÈŽ\,6·ÚÏ K7¼¢%áîH{vø¹ X+Úˆ©óIJ­Õ¿À‡ïaê ³ö¥ñ(ÚøŠ¥Ñ˜oR`”A×r’S©MO;ð¥:h¯•5J8óÈ®DÀO§Jf Œê² UGÓ²Ùv|+Žî,.Ý0´8±b¥½ÿÊO)x{€±#0è*¨õ<Ã)½Ù)ñxîÁ'Oô!ØG8ßú‚ýÛ/rK>îXu¬Ô6™V¸KE3¥Wr¢|~¤™ÃÆbrèÁý}·ÁØO›Û@½þå ~óëÉÜ,f+<Òágf.†Umã"ÌØ†!É ç{ºcZ=ÌèM UÞ"G¦»ñ%V¾aå¶]Â7ƒÉâ° ù2óª-ŸÓ+a‘sføÔ!³!*—¢ÌGæR Ý6ÞAÖWZA¢)©+&)ßbXùþ€lxÀ7­wûýÑHTíÃS«I*Çæ¾1Z³ï1ìq'm†—…ZçèŠÝîSO³ÿ`Ú’Ó‹dúdº~ck»ÊAæÂŽ;–¥{úâIX›¨hL?2þ:r­öÕ}ôDçkôH'ÏwYA†"Áê“Øh˜¸Ju}hñ”+ƺAN1ñ¼m›œ9ªP¤7Y{±‘ÓgÞ~âÛ|µãü—NíöÅHUZIÒE*±'i¥¤sœœ¯×l>o%‡ªíå¶ÿ/Q•YHªŽŒ”`¯ö^£)FT¤r.èÓIb¾$’cÛFáqìBpµê–úÍFªˆÌ¾Ψ´Éƒ'VéP­ô†Y°ÝÚ&£–è ±ßþšûf‘ƶÔPÀÊ>HÜâ¹R²,õnõc_¿ºâ¯—GÑQœ²Î¡.$¤zzÙ‹C+lOËEÀ§W ë\:¡›ÛÚªÐå<Æ•–Ü”.wã×ê´d4Áç3“ŠË‚JMjLã;ܘ¨·ÒñHVf%l|!"2¾_ë/° ,ËÀkg¹LskáÃÉk=€b–ñS„àFw.îðÈmÁÆÆ âì¬EɔؕÜ]©ÈãØ"RöÿgZU{«p°ÃH…m,eâ©§ÀPàDl„Á×p±íØQVùÝÕáqH v ¸ˆ“µàþq]Ô÷&Ø9>!ª¸$ i!3Ã0Ç{lmªHpQuÎ[jB;ÑMQÕ¿DŽ fakiɳŒS<µ®¢&^ÒÏJÓt¨Û èW©‰ï² ¦±uËe¨’ç—ßÎ);è£,2_,v$GNlØ… €djG¹Ox ÝÆ{Çã&)å7±öIñc+¸~pzªzW·òQaIå÷VÉ&Þ3yZeèQ®ŒáŽÙFGÊX‹Ëi)PÚ¡¡ÔtlzÀªg`1YõGç7n^@5þ¹‹þ·6%¥[û…R£î`è'íP3C•ÄXCÏšù««²z3.pÀ3À ·¼º7è4‹{ŽAfXÜž@Õ-jD\‹D dR/)ÙÀQÓ¶‹ÕŽ„+&|aJÍ"Q´ãÊ-\ s‘G)g`WŠ¡nÛuôãŠx¶KÙ‹•ý—ÆØ/DÎgìäAdó}óäù\$¥ é@:Ìùl f#¥ m\œµ‰»]¤*Ã2’Šñçg3m?ÙPä ²,O$ǸòÀܱåõ)Ä[cù€öÖñxŽK0êE¦a:¢YQï›9¯â…´Þ¥«IŽý½aùµCŽyh}¸S–ù6>øy7²—#ÂAn3íJ¹ú×((¼0Ñ þ½O/[˜1 #øøZ:ÝbÌúÎŒiðOd™‹O†.!­qÖ²ã¦ÈE ,ﯶ€pɉQ#`h EŽ ÂLº0/!q2 ¸ 55êQû¬m¨9=±ÐªN<æ˜]•d éoœŒõXOîµá ŸAæ¦&y©LØ20Ô"W­”»)hør D,Énþ…·ÍÉ«¯îvw° ´G4´/@Ü^?&*šdo/¤’OrOÐK1^Dp¸|` ŸekZeέ‰¾è`êL©…¶ü‚ªR³yѧpÓ83†«õͪçÌy—ýì´V`yîÇ'öS¿‘E)!‹ºc† qXdãŒÃë24 Ó³È8ÂÚ–GÝ68OÕ¹pJÚ˜ngÉ­(öc†´Fò)¨¾? žëBÒS™ ËzÃò43"n¶0ÕÖ/ügã-.ÞÍê~Œþ}@݃ýAç¢éšú³fÅ9µae(5µW‘ƒbzÄP’š:´¤(ì$<Û0ç?—¶*iÐþP}J6JV~uÞ?{ÏRŽ/kâïFÖ Ltx».|Ç€öÄŸ”Ùr©†=Í9æÛ cع¡?ãZÔ®5àCr\g8çÏuã׀ŃñmÊ!Æ«•\ Ò .ˆ/íUÑciJ5,ŠB'õöAâD€ïò^¨.¹xÙ5VŒShcaˆæ(æg€Ýoå`C¿ RK—mö>·[èÔ‹XÁé°Ø¯'=Ì3ä_Ô0ÙsÜ”š±{Èý>SÍÚl[8«*µZŽ™GÇݘß0©ÍôŒ„q@Õ$/¢ô:x‡q?«æLU„Ñ ž+IÿC>sm¤F‡ë¸Lk³È§ "×àliWÏ¢ÂøvØÙƒ¢ÿu?~læmëà(VØ+CáLVÂS¦àPLó{ï^è X>t6é<7 ã5fc”³‚2¨ÁlnÐFç Ýzfh›¢ ¯äfì@Û˜kà®—¡¤m¯…´MòèráŠ.lz#n‘Ћªž´yMõÖ` $º“ønBG¥ LÁÇ/PºÃüË0øŽs‹‹¹ù…UÂ) 5Á’x:­X È×™’¢ÔºäŠß¤®Jo$KsS‚×ÂNø¾°ÈÈ…É^X&º¯X—¿§FµÃvó°-¢Òü"A@ÊwȇY3ãi¾ôìYÑ©{ºÊLcoôÅx–ÊuãÂÐʬ>ìÞ8nÏ ÑMív‹C{ùê߯íqíü¤_´1>ÚÝItWvHùè‘&.[ª¯éIã“ ´&´‹duÂA±M9«Œ£_A ze0YhÝ=(¹\²D6ôëVÔߊ”Žaiè,I¨Jh®þÿR²w@<^ ‘äÓKÚ#±G;%¶¦Œ9Þƒ t´1ËÔ¥O´RËÒ—¾¶]¾W„ìþÜ9'@¿f   <å4;¼ ´‡cPMÆmy%ÈÊNÓð6 U€/Y-€¶‡ñ5  ½gd„ ê‚æª‘é$öÙç´pxÂ7ŸÝfˆsã"i~[×T‰t¦M¯Ç=({ñ@xAZÏì&îøî"öò€­'ƒÙ‡*.”J\E.P9áLÐq:䨖§›]æAÏ]z½kCè"Þà€Ÿk¿IfÚ¬yµC-‹hó›¶QÆ-W!KoÄb×jn%'ð:0=” ´¯Ö éBÏ7 áÀ“p‹ñyegA ‚óL&3QK^/¨Ÿ-—õêÐ<Ôœù§üÒpkAWî‚ó¯8êÊ–Õ2Z|ØVaœù÷¨|õBÖJ—rö=EoaÕÎÑ)%É]T¨' –µ€4}¯žt:}ÓR]¡kqqÜŸïº GL²RN= älßPw‚û{¸"ß›Eù%<ªí¾Ä$Kmqä-©¡¤E³OÍ&S™­!+A=¶Å’É öm_αä5{ú…¤6ªêå‰þZs;"tùÀ-æj$±“Ei6_*+œIXåP{ºþHšm“»¹èîÕ¿ø‡ö÷äk(&›•ºž«âL×ú<ýogÖóêfd5—!‰Ù(Su<ŽQ Z鯨=´ÍjçÜ,w0¸œ³uù¾Æè1–N9 Û/ü¯³k®Kl= ~Xo˜ÑÆñŠN+ŒNºÂ³ûoò&°+`h¹п` ËôIòÌH‚Ч‚cjRªËgs””Z·]2îÊ•å?|¾­ÚsuÄ/Ô7!0KÚT„¹@tûöhÏ©ÉlºhxáðIÇŸð+9"¨[Ç A~[ò‹(©ì¢.0;‰ù*}±ñ|;»3ç”x‡jzùEE çáã‹Öj.ò¥“²êÖµˆ‘ ‹ ÛÂ-2ªy*F§®¸kܾïím+ÆÕ¼\øá_ 0¾5öö±×·Ìÿ»cäÜ›‰u˜f”^ÊJ?ÞïpU͉ùvXVAâ‘L4€x02Ä#}½* z9]$CþQœ­æ>å¬ZùŠã|Ï~~Õ|23‘(¢§èùgý")3¿YÙ—¼nÌ:ƒO²àª¬Pˆjã{ l jÕQ%UÕß­·ÔÍ«CWµ|OI@}£Â ¹Óß>P¯5°W÷¶`²vìýÑ'ýŸYbϪ³"£¹rMmêŠ_µe#„6ý¬Hˆu®ô‘›»áÌ é’ѼÕq“,÷(Áƒ³e—Ì ÃíKÚ’­âp.-Èÿ~Ö«Þ<µ¬ Ü×»îÜ~Ô5ò»,ù€qàœ–E¥"6¤î8/ þ.žto%§q@˜èÉæSרë¤ÑD$p|õ;†úçœ}Ìvý8¶p.Ì,UH§¿¤O¥(¼>¿Çîa÷Í™Ÿ­À”z4}î¨ ?¤ €Ý–Dl‰4Ÿ©R³Ô£_è§œâèáý„vø´„lÌ@[x¡Ð£veXƯØöSÛB».¬ %ÿX ·ëšfÖ}ûV z˜ÝÇb5»xõsÑã+Žë½x^ßrØ ×ÓwVY™6÷»©²2Ãoï-6²ùa¤ôaßMBû¡¸/³\$±YH„µœ™.=<(³°Óå>yè’¥}\É)¥ÍIJÖc‚~ž 8†õqj†è¥‰¢~J´ª,™Jªˆ7RøipÚ½¶ØF0MÓAŠ:i¼â”¬»ž3Îo¢Äöë«4Úù™ÊV†:¢Vøy#¡$ʼà ~i_³`ë½§™b:ºyë\%UYTeÙÖ@KÖïUë]g´‚0R4“óÜ|G‹®%(Ô¸c›ÚUpÇHª^ewi–[;olì¤,MG€\Ä–ÆJú¹è`«Ÿ±™ÊÑt_’«t9wø+¢¨$2Ø ]¼ð8¤÷žËÑw•áË0²úépö¤®lXpZWj,cm½VOuSø+|ãàJÁ+àíqÝWÁ…pá¦´Þ SÝõZuÑîaymñµS+LÒé·m+Læn4QèvµLQó&Q]š+±!«Æ¾á/1¦G¿ÏF¦ßcYÞÜI‡ÒÎo,ε¸e£VކK!â’#ñŠƒä-®l<âÐÐí’j•RNÛÏoL²:_7›I¤ŽäVAP`% 9¨!…Z –ÀÒi4MZó© \Vq˜Ìæ/ºxjÒW™Éw¢Oöœá=<È=) gK6 ®¨Ã bÖ+„:<¸GÛUQ÷jæÈ£Ù±†oÃHOÊŠx'qÙ4è;8O)d<ÄŽ½ ‰Ð£!8±ìjFýúØ[ý©_FÒrg GMµ8€1þR[ݰßDØel,ÓîÕ”Ü÷·à€ÅDŽthzE]ò§§s‹ t‘w6NO†2‘¸Ö!¥S^IÉ+š"Ö +Eàª_- Á9“ì!3ÓòkËã ¬í>¿Z„™Ì¾VxtDŠrµ0RàEš/¹°¼ÉA>O³ejEºÿa¬}Ñ´“ë™ç÷àteÖ;ŒÝå“4„—Cjd„Fôüy4ÞmDÙÅܺ,wœ3Hcs)j1,n«¯cº&LÞpW1É$f5)ö¤#Ä'%Êœ"„Ó¶ÊSÍm¯æï3¡-}Ú‰ ë=w“Ú,a/›±Õz*Ë\(P:O¬_ñ#©ÀÁŠ9y;ÎK¼%ìeÎCCþ»A0÷^V®J„ü#­j-Á¸%gnÝõ4þY»¤Ã`7ÁÓåFGðà…)ó@»kJ>Wøá"™ ­]%ÞÆäÎqÚ%GP<‡‡Ò’ÚkÌ3ÛSÒ˜rvÆ:9Îvm"Dg:dh“ä[ùRqò’'[;¡é ei.Ûgâ꽸U*mßúª”Ñ€ð²ÏO/¦š˜ ½Plö¸gñq7 ¶”_àuÿ:×_rK›Gr)Æjú^* m>]þ ™±á(€,âáÚÐ3ÙøO5\ ~­æußnvÿC•£§Œas€>—Qñ8ZÜHxQ„òtŽ#ZÿP! æÍÃaŸ­¸„é×§´û„ÛU6ù¶é,7ÅŽuezý‰dluU[ gƒ+§"Ÿ3%Ù#Œ=à’@-&Y=kuÎ4ãõ©7›Fä£-TfûÎÕÍUO-¦FÖß^p9‡ÆØg.¡U›¹†Ö&(àOÌ´3*Í’ûzJ`CŽÒÐVûO麈ÏÖeø‡I„3@EÚðKDŒâ^.Ù:˜J_ãJ)„@ñ=¯TâA®küwݦ€9'd‹9¯žßG#5Ë÷Ì1¾÷tÓÈtœ Ä ¸ ¹Ó­”$¦ÍÂ×ì†NÖמ##»pÑò°ù©ãã 2ši{ %/ã“IÙaB"q»Vë©öՀəsp½™òb Ï`¸—HljFp—Rk;âØ¨z.•昬 lP0Nã~)‘–ŠÉæ ’xÒ¿¯C,…æcb6æ“md|óˆM¨ú@OŒðƳŸá>!ùåýHßɤGJ¡ˆý%3f^?¦…ëõ„¯£d°g9]r£CÅLby >ãÃ^f«³a¸¶ò¤ºñ~¯Š*Ðl”èœç¤Ì‰#Žü <&¯1K0–†VÃãä6ã5%ô´.‰9³ Õ ‘$œ¢Ì9Ÿ“›ƒ ~Ò©SŸ¬ {©áÏœ÷Û:©.Œ_s|!]•Š än|‹ñ ˜½Þé¶… ÔË]ͯ*xX=ˆž™Æ”d_vû±çܤþ|PaŒ* ?Ú‰<ò™ éÔAòÐÔ…ˆDóÈèÝJœèþ[‰hrªe¦óíZ¼ØeUòŸ ,æÏÄjœ »ÿ=“¹z>ìºÒØõë˜Ìj%‹r3÷[•ˆ“é Ÿ¸> üŽÑÙƒn½-”w³É`~ø ëSoc<6Ÿ'oFUÄ¿áÍZj+&‚K ¾ïûÜëQ@4––îëÑI;ƒ±û‡/imAåË=Oõ)Z£ÎF¨í¸Y9c›C†ºUÚIe¯ÍIJD¡viÁ¯D¥˜ryIâØˆI௠:ë>ߙբÛb«šÁïôÙU«){:Oÿk9Z,ÒXäbŒY˜·L~»*Yžgxfè|Ÿ’ò5A,qŸš^Ú{};-ß°êLVþÃ% ó’ÜNè³;ê°âÈDºÝ‹¿Âñ«6æˆëÿ ‡»§4ˆ»ààjLœ$:ÚT" jÊëMYFѧüáÃ:ësÊ.R6*ÜšÍËg?÷ÍË»ýìÚ¶ØãôPp-2ÌòûYv=ÄA;œ<.–ôkóƒœùàöv QqΟø…MŽy&²2å5¡/gUÕŒ”Ë7–ã =rù¨þV–—à &r?Œù]o?D¸I´’«ÚËú¸ž »¨ª<ǧn²oûö0AË--Ý õ‹t ‘œ7fõHâ0ìàã2Àe–ùI”#§Ó¶M¶hÌBï—ßѼr¼§ægó×®>꽿±næ&¦ãßFש1 ÔúÒúÚa]4»깃M¡0®=±åNƒÅ2¨‚…‡v¹u(-¦–Ÿ@'©Ä¤Mÿœ>­‹ÁE,8Á¾g÷à&'Óɸè©Ñæ¬÷`DôÏíÍ}õ|s(¢E¹µ¨7±^ ë)ï[GEßP7Þ».çf¾Š îÊÊ-zƒ®Àç OS1Èi¯ç¥–¼Ï |zà¬åFgM¬ýõcÁo“Ákc‰í|@ö›®iµw·Ø³„5YåmÖ|Øc£cùÊ»ùÖ Ñ…?pɧSîJÙT"•„—骹e–syºì]K²ëV>…«”šîÁ>˜¶òü¤ÑQKnÔ{¹µ;0#t×> ¿È8<8EdÄå<>&(•£ÏÞa–ƒ†VõC@Öa½¯6ѱ¶à¢{×Ämh¯Zùsp3dêªS+êfdäy{†Ÿ.õLVxò nD*K&|é¹ÓÓ«¿ ;1’ÖSU‚„ÕvsbiàP}šVå™AŠ Dè™ûÍâø$‚OrɃ,ÊÌóõ¬½‰ðàIô>”·Ý´ì•ùí9 xøƒ5"û•ÌŽ ÑxË-åOÜ37e¹¡iR)q"êö:à‹Ý °<9çº]X稥@ÏÑÄ\Ó+1U0L[ˆEm ÙݱöìÒîn¢»Ÿå¬[<¹¬¼o­O3”ÀñÖƒ¿ÆñœóŠþ?´§€6ˆI<¯äµY¶­v9sÉŠ`ØDlÕ’äËXÍ3À2¼ ;Áì*˜E«nipòù«ô“o·ÍÂתJ¤adD,ð‡ÖZ©øOúòöˆ×/:ýl˜E’bè÷äüÎL*] r¥6¶o¹…øÙ2üòa_¬y´nÇwd­’YURÛý#ÐFx‹©•åèáñ³ùÓËøæd=ì¾?è‘0èŽyv¨àð™jØRÿ%›º¹»ÈO< Åαà·GÒƒ¯!¥A![“‰µ:Î=uxøbH©î楛ý¯'cT váqXÔUê”ˆŽµ埤!µØ«zCÃÝí.óX#) ãÆÁEõY½åñ¥>eî¦Iº­ÆfrÒh&ðQmÁ cXÍÈð« â–««šmd·rø½bp¹uLPI9ÖuÅÊ7gŒF‰TŠ®Vr输TeÈ(Êù祑E¡Á@§˜P.o¡b%FxUô±ôKÐZÙÞ9u@œYd§$ºÆ&ÚQ‡ ‚R³Y#*,úÔ¦Šïµˆ`.ð9W¾YWì ±ksÎ42“¸oͨ¯ðÆý?E€'Ïïmœí7«+L\ͨ˜snVëi·Ñ÷WÍ;ÒW"Ðd`¹„æÖÈ^3ùàÀ˜d½Þ …·š(¶ °q¡ÇË J^à\É;ù:Þ›ëy"c¼¹ÐCðèfÚÅ?âUሴÍaˆÇ¢ÖõEâ™|:5áP™pvêë(‡ª³KG{-BšGϬ¿Vƒ…®1iFB`\J4̺Šþ™ùÛëòævp6áü¸…Z2_ª¹=,‰0,f<ÑPKãóK~ŽÀBlƒ%Þ4l¾ ¯MrÐ5å`V’Ì¢;ªf«Qçaùdp?]-»A ÿaï3ª#ácR/R ¶¯™yšùÇê/“‹Ç©íPÆF-œQ[« *¼Þõõßâš]¿»âáÙ™Ná"å]ßä&ÙYS§&ãb—÷ö,7Nt‚ßǺ½‹íÓ7@ $xú¥œÐT@+Ú¤’Æ)ÄQû(¥høwìSÙ(&e=µòL8ì ¶Lú£Ÿ¼FÖ/+¨à¿"ºË¯.©ðG‹ò=¦ݧ òÐö÷ZTêðV.Û…·©µ”ª‚vTǽÿrmŸŒ¸Ed¤>è ?0ù‘H·ØÿsoP½½ø‘"1#ž­f½/yInZé/>?¿$uýæ:xò(uùÿIU˜Ð1Öçî#;8÷ˆ=á§M]Rñ¿Á·¶\«Òzš3kŠÜˆ¤IëKb †òÌÂÁ´?Rü„ó¼di@GÚ„J÷a”--ÿ83¾X!¦ QE‰)KCbÔí‰ÜþŠRü;5?Jº!¼ín¼©Á%š‡ÿD=¡nU}î\ƒ” ¨·Ò5 – ²Ã‰ãÉW¦šÅu;f©.Su¯/Ë 1”â¬ÒY5ÂÛ{Ê MƒºTW©A zY"ûp"F~Âu›—D:“i\°ÂÉ'³¾Ð¬G8xä(A“hñêÂŒ( Ç.x×DÁöµús÷ôÉ ™¦(¡…zèêí€<®Qï·ÎÐò­sÛ=¡º›=ï•T'P9X.¤ ܰ»."*æ ÓëvùHa¹€ÿGšâe_ø ?ðë®uêJ óEîÂó‚ØKî³+»þæðEµl¬®g ÔbUÉ•­žM8ðÁÝZ4U×#ûÆCξ°ÍŠÏŸˆ bpíh怺‘^“¬™)rÌ mõC¶ß•–ï ÜžpƒÀŠÙ!®Œy´DÑ%9÷d|Õ<Âv“T:š¸ÄeæŸêûnèÍF«|7“¨BGΔ×uyLd›ÄŠÛæ…UÀÁ\LÿIƒ0^;hžoYÝøI@ÿù¦&W§Iàz‡°‹ ®˜ŠÇl¬¶p@þaoX4œXÖ÷D_ó(”Qý\cʼnöCÏ5j‹¾Ñ% vû•û?†~w9ç]êø‚Ž?ÅÍL»Ùƒ*lT‰üèí±7 ÿ.¤°þzX0§’™ß¹ïmÓA=Áo•%€7#/Ó“ÿqŠNr»!㕾ĒɎªÐ­ypudøŸÑ;iz|È8êŠÕt‘kŠì{HÂm>À¦ÿD¡1ÂhöCzõbš…Ÿ¨¦ ­L`î•×Qæ¾SÞ”B7Ú‡êóC­ª(ê6Q;­PzZHDŸã=bàÐä¦O 1’×bgÅ&º«›†{Z©õîžH¸°¡E»Sp§µ¿‡ñz g˜Êl,ŽÅ]H6)$CÈ|[ T#´®‡îa,ÄO5Jáãý—:ë´ða“ÖYÜn>.á£<ˆÙëyÕ{õBSµ•ôÛÌ'r°„ÄÍ‹¿vx¥reÒâ§Æ.ŠZ°Åá-Xì Ľôdð£š×E•^œ>ƒˆ×OØÞ’@Úêh@à 6°Ä wfd >P‰ ›”O*‚m2yz‚NºM(²¾">ìÇõƒÎs ˜+®³½›Üéé” ¼GZ]̪ºô ÚH^ðjÁÀ™!GÞ5…ºþw‡yÜ ÖW&@@YZàž-•¯©# Žò#ºƒ5͇É{ø×ÌZŸÌ”P þäþê{xbå[K²4Y2¨J·*ÎfrÎÒ´^ÙLAëPÅóõh³Õî´¸týòÇtt[Øl¼÷:N®‘2P;¥Œ«ÛKëËp½Úys¬ýfvLû¹I®ã3Vàöˆ:•m».å+ôpó‰¢[hÝ×7ÇQsKý.øqì&a,Ê{³âe²xl0áMƒ‹ŽçN ¶¯ ‚Wâ× }[Q¸Å‘þ~´r'ïA>ÒbøŽgf4 ]²@Ý£-³X×_cº•6KÑM‡Ò q*??PŽ¢ è2á^ Qœò+•®îUE•ÅubqëÔùš#9Kc“Ëf*8:f×Ê]³¡¿a¥píÌòÞR0ðÆÔý¹gÛ†dËÖÉÑ—=y3ã—€žïòírEÐgmâä*rÁOèB·ª85$â»S\L«gÙë¿Q~Uù¹»ìð<íx¼P çœ!g ì•À™'—åa²l.Õ5W¬ ,ÙgéÔLZÁhÜønŽ\ÑÇ ÈFç>& îÑYíí¡cÃ%Å*:w¹»Ÿ—Ebìœ`©ë!?Dï••RtÑHô±Å­·ép^ÉM\{h¢_À`¹ÛÊfœrpž¤ÚmϱV.Æc»eðh±)ŸbÅÙcبÍUÿ?ŒCÿXpo]Rì´åÁzy¡%ù¤ìÚšF´I!zŸÀ/ø__A(I¿sí–é&]õvMá#Ðpkør ˜¸hiáF£3 ¾Ótôã…Nžj*~bµÞ:`î„9_Ý7¶¤²8×¼¯=C†´}ÈåÚr–'æÖ…xÙä›4'¹ +˜—Ï[‘Ýþ@€”„806FÙúM¡ }Á’uÿw~Ð3ͯLØÝ ¥çë?C£M¥q¤:¿í¨ÛQxÕèm/ †Ç~íÐRL;ìÅc¨€Ldníxñ'iZmõÅà*#ÿbš!ê[ ŸˆžrIÑUà…òµ?ö3ÝÍ_°Ìm¢\ÿN’ûeR˜,‰F¸PȘLI •ˆ-€TœëfCoø,9IÆ+S1¹€½G÷Ä+åêZØ(ÚER؆-y á¶bÌS&/Ô®ƒP@ v±jRc­Yè·ç6V©Ÿ×Aý+ lhQ‰Õê&`¹f3E\•¸»ÍFÙ0³é1yGùS@¨…(¨ëð0Lâ!—BÉó$÷Ÿº¿KWÌ–~ðw-äßwö€ß%ïÂ+ñ.˜·–¼2ã¦×ž[›´kŒ6ÆÄÝ<Óü¹PG]­v×®å$g(þÌ4“3ÕÌj+ëpY á»“¿A䯘µ.D5¦.Db_¢#YªÖHóèzpu›,…äé>b’¹ÍÀÒÅtkƒMV9A‰CúêB,N¦µnq2"tOHPžE@®Öê˜ÍY¿Rùw ]#QL£©b&®ò ´¸˜Ø©8„{X1Ûáo8@›BÃØø»•ñ=Êjá¡•½ÐvÈ^”y”1h¦]–ЉûæÀ…)Eù³”U×õÎ$¦lÌÙ*€Õ“="dz ßpü*¦¼hq².´`@ñ©vᘸâiDޱ"´‹x»äµ‘&{òžs°¥ý.šÉc^J0É’j@9~íaɱ踔gžIƇF º9 éÿ®<0-J˜ÈçíZ<ÀìoÏè"Ͱécd¼ÙUÛ²›[$‘bp¨ƒE;Mh ®IôÒ gl§b³Ò2£jó¼¹§o­6˜‰IÁ»f(ÂÚzƒË¿4ë‚CQf8^‚­">ûèÞÊJ¤^'EñWic÷è}à³B1ªóÁÞn;l-†Ò} Ñ®VÜ©‹B?¢¶Iöc׆´'9à¡Ý«P8ŸA•ÉeôL¯´&Þ¡ÝK͘2¿•Æù/¾]«*Ž¥Þ­Ùs`î.ÀDÇî/·&Ó€1/ôwªjjwi(¾<µö˜û÷ŠpÝ\6Gö«<3H:ÏÊŽ÷SPʆö†ò´Íæ2êKº°ÛbÍÙ#Å|ü{AÃ}?®óšJÇÜz­?wiž¦´…žá ä8U8»¡µLG'/ŒÖ8¹ƒíË•*l×^ºzTû½Òa¹´¥Ñ0†ëƒæ~d)ߨ}/Io¡ö åüâI”UUÒÔ^"¨_ÔÏ%ÎÎr›£|NjýQW°R§æ]¸;z¼#¶%eƒö¥Ç§“¾u¾Š Læ«STØ «ËàÃŽrûRZÄ:‡äæž7ÊÜî”!)óÇœj`£ê'x¥ê^ u·dOö#CQÄßÛ¸9 ¬lœGûXâ÷ÈC~ê è3@ÿ{ xVàgêèÚ-DZªÉþC\°Îü•”þvX_L'Љ©–ÓŒsämÕT•væM̲/`Ã%»a:…d°¼¥;”3ë)ü¾wèšc'–óØÑž.ä†iYžðÙÃÔ¬Ùº¼\Üô¦ýȺaíH,†¬/TðgóÅþ„T‘½:;°×R¸œr™h)xȺ™xƒcgŸ\Ô–ç©>÷ô2‹¤â×ätcåÛÒë#Í#¼g‰©½Õ䔹£7‹ñ EÞÝeǰ›v#±—‰=‡Ôâ.òa¨ª9¿â¼ò6)âf§–ºkUBßßO í9 ÞöŸ1¶ü…#†GÔH´ïZC˜îïìM`hzWV+Hà}ï÷ˆ'fó{ÙŽA9œÙõ ]eÓaOÞhhSŸ¿š­m¤‰ëhîG§Gù+¢o<«î(‰ø†*ën¥šUr1˱@ÕAÉ*-¬²ÀæÁ Ó·9Í,ZVë#¼=P?mîéºÅ_—štמUÔ½.åªx .¹£û¾Î™œþ‰&Ò'& šÕeÖ¿È)q· YEEÆCò÷1]ÄàÐL{Ù/F˜ƒÇžÇáœÆáæ"_-¼gîA±Þ}ñHÌûGßòÁŶ7×ró¬ŽXG''ÜÀcºÙÀ®ŠÎDŋ뭫LTˆ«èĬ ^Ò|*‚ÝþI¬YàùbjÔ°‰ÁÁ‚¿Yd¤ð‹=+…eÎRD@p„¸ù÷FË*oõæz÷0%¿˜2ÉÓsû. 5·Ó£˜–6£ê;o]–³¬eßeF€dJÙÀ²'ιŒB“÷Uiêo­3õO¤ üJ~´§S ~ûž:k ·Bç héXÍtZ%Ø."WOKÑeÏ¢ù˜ƒ(\*ëúž,¸ «a ïûç?Ò«65>Qì‘£¬ñz%KŽgÂG« o°w1 œø@J[AhRŠú ©Q4¥:mW¶-ëV²&Kø¼É& w{›}0ÖfcªŸzq“ô]…å&b{l,±h܃žó˜¶‰MàÜà ;À§aŒ­@Òƒ»·ü=R¿ Š—f÷-»™‰Uq`ÞN+j´¥ü’eüô9DBåÉ='Çêg·~–þ¿Ãómô¥UÃÿyÂ){.-Žýùkts“À!®O!0‰Yÿ0K Ãgf*„Òf¬ý‚¶ÍÖ÷<ØiïpðY¤1ße^àc0Õ×·uŒJΫ¦ã7PêêpOD¸¿JS ŸÒÌó4r«¯ñóì•Ó Eœr“§4³U\øÁh“kW÷£Êâ$àu›®‘Xw±RõerA¢…ÖMž] CtSøˆ¬fï¥,m*Ýò¡ß5E@~ Üâ¼Ùþd'ïó£F ö­ò›5dõl>¾X)t(Sbï§Gß(¸ <í„eï·…ÕËYÃqó{äWõyŽ+L½·šq ³üÛ§,½ë1Õe¥—ï¼ãVHW2jõUàòqÑ«±Ø»¼Ð²:nÑÚÇý~cÂöÁN»äÅ 47ˆï*?'H7²S…üÿ×—•Vªº­‹MÄ60…ۈؘ/h(‘<*ÌŸJ‹™¹IAdÐh$¸Š£“O}8ÓØÅaM¶HöÎÌ85]7{­*åØšÛnj¶Ãç‡i§HŸ¦Õ¥1NÛÆ§@Ì­j+o­y8u矔}Õgaã—©èÏ÷ ;½ç c)yVêÎ;ëÆç0ùC¶›äíKäê3¯C€Öb\*M²°ò¬¤:²W ä˜Æð~Žáñ×€ªÑ•Ϻ˜XŸ›p(åøw¸>÷¨Ì_c;á 3Xk|qDA$³‡Âd¡ª •^â>2ã?ÝC {Æ×÷pàoTÅŠÙc”–äº!³b`OÅÓ„ídËÈçe©w¶iùB—nÝæaþa™‰TÎTƒKŠ] N @ʃN§±¼žW lU …vgâÃVS¥Õ8´óK lM(œ…qÞk$ëŸ(ûïüDOTÕYø¦[ÎÁßÿq†§^…ú 4|=°‚¶Xý2À2’³|)U5ÛîØÝ9­­¦ãuË ™&& ÍxÐå¹·2u—"ÖÚgU2SQóðßCÙ­3R\Žw¦&§Òÿ0¸Ë)7ãVµlÄ WóµjuËîòë¢A”Óï¹½( 1p2ª•ÕÞåø Y6ÙÎÁ Ÿîˆ¦à¡¿üqüCX$…4,»MÌ<ˆXõÆírVx?ß6ñèЇ]O:¢½WȤÆiŠã »Í𥚂¾—õ r= e/ô^“¹GF:(RsJG­ðúÎGÀšÓö—á»ÚÍ@,ÈòÓ—r„õVƒƒö[þ£.È(›©S€¼szs0H¿}¶ëܲw©s– j‡¹ã‰Ü]}cÀ½uÝnƒ|®…RœìEÂ_¼)sÒÜ+Q&GLÇo½|·5Xael1Øø¿ªƒc…ÌžoÑÞÆɵó1ðÝгÁŒ¥¼ìÑ ›è6šä(ò•åÍÆ.ŸXU5=~OÐ*ð÷£ë³IsH9·åìä¯4Ö‚6fU”Ëh£V ±òHž'â—\ñ&l°&(<‰ôb(”›ÞG|7X"!i >ÔXƒ¯Š‹Ø‹ ztô5‘£l­1<)Ñ/£TŒØo@“{ÁGÉpU¨~T³Ã@ö®lâ8l0_x†‰öuU©Xr1ö^dÿ*èÄF>‹ÊÏp¼$›¶R¿«ËãÖ¨•[–Œÿ Õ—s["©å/2Ü+D ¶^k†c£ ¨J>|[Í÷îÅ Ïvˆÿ{WØê7Ŷ¥aÜ8t+êYû ËÄHi…`òK_“£±µÄ\£ˆ¦¢ê”; :”°Ó;{"d¶CÉë®áŠT0wyv¹:Œ_âÍdbU£”äµ»­-Jé/Y¸~Žc{oßvŽÈ)r÷ãÓVÚÐoé÷M¯òUÄìß}6Fíhüÿb‡–ŠüøïF·~bx'»•Î~Z´0eÕ²£¯©·NVo÷HL¢oX»gÊàã“OD4ƒ£”®×h0ÖW“Iw2y»óŒ§ 7¹—øGˆm%UÖõO e½H<5ðUäýS¥ÞIþ—P»Hãj‚K„: ¢Ë›à½¬v!o¨t+84kê;âk¶Q|¾bãZà¥Gjo§ïKä©S7Sº¡è7_²øùó fh,¬á5bÔõî¾ï&!´©¬XHx‹›)h<¿,_Ê•D™£F…'"ÞÔ¶(lÜþè+иýagÙô»è7Uù´fùJC:ªžž_+7qáQ‘y42åºÃ rM`$Vzça°•w!¥t’D̽´€½fš>Øú• æÿ.²53 ôPEÁ&/ [æä7æùô´5c.ÆèHhÊGW6²hÕ•¦ºÁev6°’DW†4àð—DÕŽ!t{ųXǽº¸ágLXWÌÅ‘8š~oÉÖÂî…§»I3ð"Úÿè¦ÍéÌiB¥Û@ìåŒ&úd¼YBÅŽH— ø˜‰\-dNÓV|}·ìcTñ¶.¾g-nNÅ)ú2]û–" õ­Ú­^v.+Qb°ùG\jL¦f3CW3J~*¡c΀¼‘êh¦‰IуnlÌW"Æ6·Él™¦ÏŸ(H»o”™AnSÃ:sÅ?Kæá®ú©gùr”‹bÅ”4I IÑØŒ6Ú·3‰<„TWz*2ø:.œŒ ¹oɬBøŽ3å£Ûâ)ô¸è¶.™c˜)èsD0£ë”GvÉ-Æ&ï’FS€$j¢ xÉ4UëMÆïòÙz/·°LH1ØÎÕÖ¢±3Mdžpfãnß&DG˜k {ö"†ØK©þ³³£÷†þl¨@³W¸š@¨Ty±±=FÒ K6ã¾EÛ÷ˆ=p` ·àÌ-uÛÚùd3äªhc0ÞŒL^ä3ö õ7Ÿ XBè]jA>‰^™–©ÄA–ºø“÷޹r&/B³½ÛÁô¶^ln¿6]öN¢±…Jµ»\Aá‘*@¿Å¢Q¢âˆƒh;ÁÖW2ïÊËhÝúe!h/0Ò²–kCå9Ä{ÕÁØ5K ;O“NO°¨rÖ>ì3©%¨ú•Û¾|ñ­ßGf†À°eƒ. qx»1ü!ÃOzø=—9ÈoÔ‡rŠ£T*2¢¶P¼~©ÿEô¼wôm‰–Éè6Ñ„d}êæ`N;‘/þil¡xz sÁ}Æu‚QëÍÒ°¥ëÐUµ[# ì‘áo¼Á œym£ÑXÎ"æNÐ/Y£¦¸{—´v‘4Yï>%Î-ƒçëʪ˜ŠàÑ‹ìÃA*¸FƒB6FA|.9N—a\s­0s}_èˆÎ4rq`}¹}[Öà>F±š†‹@”ºwçe³"äqHÖÃÊùˆtuq/&†)ï—Zʬ‘ãGÔ!Šº… „"FúZþ{|0dyg Å´VƪrNÆ]O\â›Þ´­äã Rs˜^8ɤYci—f8¸6D³kM3[uNíi¥à~à Åð(’iNΠùŒô%ú­Û.Ãå·$Ú÷ ¡öœz‘#ëTí‘c”gs&µëûp6)Š%´I5ždpÉ¿!ùÈ~Âgf‡8ç¼FŸ³>85†®5ãúÉi|¦¦5û¸‹MLɹSRû-Y.*‚èlÑ F…Úm¦. -Æsc3r„[{ƒ€Ö©pÇÅ>¬¿‹@éÑó¨þg7>ZZ@L™¼ˆOë*JËuÞעжF½æ:|]ìV“œ2j5å5ÿ3Hø¯ÙˆU8ÀfÇ5=òí§k¼_ô×e»|è³Ø¹,x†oË¿ôR²hÏ•¾Þ"ÜRöÌš4ÿ>oNgxE`Õ†sÉÌM^+8˜vÓcÉ1s¢Þˆ¸Ú³…@oQß ™ˆã}§¹àó’L”ú¤ŒEÀ¢*Yö:R«iÑÈ(Û߉YÖÜd&·Œ…ÁHÈ , y„ý,Âb²èí|˜fîç:?¡ð|L\hrΙrx¸ýk:Ñït&)Tz>Sh÷¸w#=<z¡ÒóðÅ›îfT}ÌAȵõ\&Zd "Eÿ|x~wòÞÏa$è®Ø5tÉIÅxÃGo¾ã4C:Çÿ |Aõ¨zØ~?ÌÏ:üYÏåÉ-@pn‘øSeìÇœ£ƒ¿ÝÈ\ç.Nˆ>h%pßߟBÓ˜ö¥cJ]5*¶•ÊU<¤3¿­;íŸLmË«÷Û×&³Ö [:l‚°ô©Š~)HÇ¥´az)o;ï…9?¦ÈÏí²,Í”x´érp•RýÆ}ߣx9éüÒv3¹?Þÿ!ve · ÑèIë<õÊR1m7‚¦ùha¾[£D Ž&ÖX‚Y@Ò8›i´œBBæHS¼ ÐMgÓK÷Å uNvÐæo±ÛT¢Å$ÇÊ\“AUb­P¬ã‡}Ÿ9±•(NýnþÃÁ`ûÝ_õé§m"‰8Qkeuw\ØâùggûMSªDêb›#+·Ìlå1'…gÄ» R®ˆqË|ç--áê*’7ÒAFç܆˼ Ø„IšÙÐïŠ]¹ˆÛ¾@÷§\;´Â^‘ÏwHŸÛÕ'T,*×€ÔÏEäS†#žxÆš# ýê¿…äinÆXªŒ Q|WOÞA§Táý9¤É/]'¨âúÌ”¡¿õt-r9þ5÷ØÃ÷p@üñtŒžëbô-­ÀÄû&È2Œ›¨ÍO%Iíïû k^ã$´`Öi½ücã´³w/pSàd1m½ ëŒÆ6hu²Ó.ÍPz‰õË£oüÿ,šÏ1¿"»6Çéê™ïˆŸú–Y½•b#‹R….P>Nº˜Gÿ.Òa3±v£f|ÜGÊÙ%`ÏJMÇzê›1&éëN…0ãAɵq½œÁö%šÇ|ìQßÏú)îhþ˜’WYTË£óÈõÒKÍÏû]H[›Ý^Ô+'ñÇH¥T°8$laøÂÌúîî6/koݘ®øKžKÄäÞ=`7X>í•>wo†û7©åD€Ým‰B¹ªÉI¢ÔG*)Â÷”è¡ü`‡*l]Øê ™¸ ®!râωౠxDIQ~Ô‰ñ^_£÷LáËåhsöúÁ>ghãë®ðqÌQÂU£èUÏThæ¦à¾ô¾ˆŒÔØRô1Ûj¶PE¥e_ÈÒÏT7§JÒ©ë‡â\6ß¹”´ËN0f÷GCeìÃ7 å†q´Ë¡º±'O÷8àìßg݉*Ï-κeO¾ÛfÎ,7¬ºòD/7€8a¤Ödx|óÊR»ªð.H‡3B’ÄÑ{ $âÇá5xñÞX¬ K©õA_ŸäY+ƒPz' !‰Þñ ¶±ÔÙ„µñÆ3ǔ͚"”•R*»“cxå0S>Õo~ûz eÎ(.О6TI$Ù9+6`ôajbÍj(BÞÅt÷nΣÂKŽå†HA¶½Z/ôÿ å—g<]ek°eVËþcäÅFÛ…ÍE4µøÚ:Ž:¶Ëpöu3ƒë;OÒÌ;wfÊO9Ö'S•ã¿QÇC•“¬é…CésÔ&ÔÚq¶`Á™9á½ÀÞ‘f“0à‚#¼õ¬üuù¤\üñ z”c½ng*‹äÃotîÐ|ê‰ê0\_7£–ç¯v>Ó¬ü7yŠ~»BŠal•‘†Ú1‰ï[½ŒAs±`Rò7 ’ÂŽ2Í"¬»žýâƒZª'_Grؼêì¦\hÛp¿šÕ+#¢ÂÉ“õðE(Îpì,YoÇóIeó›Ú7vé”° H9âŸ-ÌM{†|}¹'¹ö&5í92«,þ#ÓŘå L3´ÌèUgYZÚp¿•R"È·ˆY„ʼ¸ÕªòÈ> R¤ã`ƒÄG<5{iNõÎê`»£ÌD 0Ž¿cŒÝ ™)Ò=fjWX¬È.b\ÁGˆ‚ˆV‘àL&:˜5½IhºnR•ú/u»ƒ ïÚàh@S¬Ä–¦ÉF\ÞÝW-(K±HØ)w±LŸž¸6ùYÙí„þ´v¡ÚUÓNŒúhûKžp  Át´†à±’s—\ÜÃt 1G@uV!F÷èó§¾SQ’W (V¢t¿ÕŠÄŸÅðA«޳ë¿Âû. ø‰ö†>î  ½ÿ*Ýνqm°¸Ì0nüXû+ïß4õmº­Âäþ°as ùÎyî4Uá®™a»‘LÆ®Þ\o$‘ä¾JÒë„æ&•&6ÀÛÊ>¦QŽD—\ Y?™Ñ¯kŸ¶½iFÀÐ#½aŹ1^óŽžáâÕ½ûAnÞ‡cÈ#ÑYV•UŽÊ´dYL™]<–ÍžJŽÝQÇ%!`œøp‰c°4?Í}™¹„”1©ñ5{Þ„êxäÇ+ïÿ`Œå]fä¯×϶ ‹ø4…PQ˜Æ‡q*]S}ÎSq#"Áæ³aYß¾,qáˆëÓ®ñv‚﹚ìþˆüžÖöJ€ÇárÜOW¥5…#¼PÆ@r Lùݬþ?Ò¸þp¸„/'‹%,œ:]ûK–@üîQò³ÞímßVÇ$í¹MÈɨy$}Ș‡+ ©9–Ud)ŠÊÛ•Ùƒ¢Éƒ†AXyî âe+YÑï8Ù¾4l˜…Cž”VK.]V§^$Ê"BÛÚhý¡™Æ8#ýˆPÃ0URœÞCø”¥dÇ5쨊|-ruqÿ½A¾ÈyØ¡j_/\Ä rÍÛ3S#ÚÄ‹£•lš˜ÉWT½«O¨?c÷*‘eòY˜·)àIeº|ª›Ž*©R¸ÿ`eJ¯@/vpnY@ŸÛ½àEáÏjEMÂN5(é©fÔì+ðkÑ !î«»£±ßwqé`'_ð¤W¾þÀ—Ú‹"’‡*È®IŽé5kžEú Åj‘+ i¡=ÒV‰»ñw¹ßÝÎ^\““õ߬—.ñ;d ê-~A :î婆± Ù>â ¢à»h‰%%fW‘Wž 'Þ‚#-¹á] žŒD=è€ÛØ·!úÛE–¶ŽîJ–ÂE¢Q;ùÜwÄ|ƒS;§—éz,1%) öHp ‹»XåkìÿïÔžž$îG*$i*¹ÂKe„ÈÈ×¾ì þŒ£x –QÒ² ‡„^ÇÆ0DÂÅKcbn{Ú1DAI óäj´ã‘ …¬*#õaïdy'‚Ÿ&f!¶ ®Ï±qƒïPð›üÙ‘×­j×Ï¸å¥ø3DBù6=nó`­È¨¸å½e{ÏSÍì0K%m@[«m% :ŠÜxd1¯`N²Qêæ ËkòÄY¦:Û×öëøeYBÑ ˜K0ßPC$æWV†h¿uëí• h ’o¥$ø¤|ØÑlg¨lð¦Ï™€wÖ·âΪ(úÅÂԯɳ¯é¶‹^ûB6Éëð Ñ‘d·€Âß9¸§±_Ù<»gTd½ïH¯ƒ(dȪAÍŸÉ Û2μh,c#0ü¡l¾lh¿SoпG +''¾=q*NX€ ›îHì=[ÿ½Cµ4©ëY³•GQ\¥ ‹0é2öU>jZˆb»AŒñø”,F‡kLÅO0¤¡î¦—ÑÍ“¢.(ž¨µ$5 ôÌÏï<)åþ\,ð¦t»§´ÆHå m˜ÿ4>V„ÓÿW>· Sÿ#Ã(ÅŠU]‹fq=F^Ž”÷%³áck6DÃæÞü~k†|Þ#cc¨}º·´!jæi.žV_Þ†uö‚W•þÓÔöÄNo¤&:ÜòCÞÙVõhtŽVçdÙh_)þ‰§qüpl­¿+ÈaJ&Äï–êÞƒÁ ïk›H ìÍaÎJ-4E»[ òØä´&Xù³ÐlW«‹íi¯n²re‘MÎÛ§|‡ŸAÎ7y¥Õ ¼´uš™ð#3‚c€èX´ûÀJ9Kê}Ù!U|òÐÌ­Ë" Tºwr³§H^˜¾A-ZNóƒ=|.FYË)X§Hى룃ÎNJ(MÌnÓ¡&Ã|[Ò*‘q2’§m9 1i(N¸üA“ÏDAA¤’uCP‰céÞH¯çQ± ù‰M?p°Ö5acËŠ=_÷-x䇳‰úˆ=̆Da|ó~D“,câsq>+‡ÛÊö¨W•bfc©“z„²:enªêU[=à„'à¿# Ž18áETjʃW­?ÔSõÕ,J€zV‡ ™þvï8çàÓ ‘Éñô“”¬ Nèåvá/ø›ƒý· Kf$=ÑŠI”륫PÑ}ÄbNm³kkèZBo—!·oáúw eÀˆN]¦1|z/n®ET!Í2ŠKTN€¶xr¢Û¬æÑÐÅâ0ý $†§úž—Æõ?*V¦·ë¹}òño¯\ÝlÉâ‰áóXVº>m=Â7ø¥ˆ­ ÇJ~þiàlb'´PZiˆ»c¬ý¯ÂμLÕU°òÀ).F!üÐV¾Ê œ³©àûß>Hˆá°Žvc*ª]Å—ÕÚc¸<ˆxfÙ•46{o WϬZ’„]¡Èëñ¼¬)W²± _=löˆ]ÕgÝ6‚=Üf@¡šF_e+ú÷¬ÄÞͲS7%X.`FÊ‘áJ?(?ƒü†È[¸˜¢Zš4H^|±®+îÎ^ †z¾˜æ·¡ºoFA3cÚ-MêŠb$·i”¤«oþ³q³Ä¿8ôÕϩ⑈…¬©ÚËõªtIÖYüƒQwBÇ0r‘„žÔH…—YqÁÎÖíš/í ߻ưHÞXÊZI³´Ù­{¸øÌ°•!'{úéÄF0ø¤b©hX¯~@ßÁÜ.íñë€R£ÿ]ñâL iˆêÝ$½"–§._?H­˜ûgDY¬Œ}-{õ¢ÿmõœ-që¸ç,Œz—„,Z€þ¼ôv ])›K—?ù@Ô×¹ŠË8S¯¤BÖÞ·¶é± |“1aÐ…ÚÞŸXÇ=t‚Tâßj Ú^Ua%Š)½À××)¯d«{¾Ç!ÖŽ2Äã†ùusG ©Àz›ŒË¥P‰¢P™D@c¯…Ūֶ:—S û"uQQ£ÉYúŠEˆÅ‘g_]»bBà |Εi0y(nŸK°.üÏ™[$[Ö™œOSyÒñKêØê8èÀ’¾ÑOÁ¬ðÎoµA¯3÷#©è¥9˜wq’ÅncQÛ{0q÷6Ë`µÑå€cP{¸µ8}waêÙÆø¨ÄàÃL<ž½±Å¤ÕSÕj};²ò˜TS¤úà|¿Váü®ÂAÐoc¥ÄN±ºP¨l$ëïzéaG² ÿ0©\•¼¡Ô¡Ð }3o¯¥ñ2x¶K54 ¾`¥è샾JÍíÕÅ@ÿ f ¶TÖÖáç=/ÉHU© “š’ù±qtn÷\ãbÐ'ÆãG(x¡ól÷),¾A¥Mä;ZÈI6çóû’´´Î§¼!±Ú mîxä"·‡I7‚(ŒÅPY¤‰uWßñ*õU’þš%ùÑÉ0î¦,اƒ|ÀLz+­“wƒ=´ª¦›+³;ê~^ÁÂÎWõ½ó{5 ;ŒÎãŽ$•0-ÖëÒ]* ‚=o¤!ÝY@r÷Âö¼='ˆÅeû;³|‘h뎱Ú܃rõÿ}<­ktÖ ÎЂ¥ï𖨰`‘‹(r\Þ6l˘Ôà·UèÝ\?T¹¸ï>ïÈ­ppËØÖíP 9DzGMÕN‘îO[Ÿ«Y¿WM«±[çî >±Ÿ¡ûõt—>N–~^?ŸØÇêôEŸ'­|þÐ﫹?öú5Cáû¼Ÿ?h?oO1òz¿“¸€öÞæQâƒû8úûÁö#½'–Fxœ/àR¤)´«ï‹¾óÏJÓ=T5`M -# ŽÿBµ+'ͮϗŽS©° ¼ötÐJçn{ýA–”Ãp’Í%‹ë¥´j xšmëõ.Å$¿ãŽÎÏÇðÇ ôÖ üáîG»éÎùÍfDø‘×2&?¿i2[v ×oÑ$¥{I¡N2vò ðhfîGÑ]ç.tŸÌ Ï]ƒoD•ÂÁC$wÚa‡%ñãQQQ¤è­ú¡¾Ÿbè™<ˆžó䢅}^½SÁÓk¤|Ð OןBˆF*wÄŠbŠRo½Ã&ÃäK×z¤ŠÜhfíÂt=½õÖæ&KknÝý ˜-IÄO¸OX¨Øœa">˜¨d‚¿ŠÁk½¼&²³°QŸ‡,s¥ö>y|ÅÂdõ³:B2âêãã+ØPàntëKeÆbÁ£è`àÕ3­ŠzŽ™hpñ¯ðöÌøjWÿ`ÊHÚçV–šBhØymÍcÖk ¨•\§¿…\’G¡¶:¢ž÷ÿPc Pcs¿)—ÆÍñÝÌ®׃ù0QjE¨?-Ú£Þ“œNòD¨@‡åt¼Q›S®N¸PžAÝ·Ê…¼1©/v™Y ¡ºÿvc·5Ò$Rƒ V¿žTø$°V!“ŠªþÆ£²«çÌjM[YÝIzý¸{n$ö Áröf7'‚«ÁÔÜ2ÂÐJvÓa”E™ýòòÓÀHy_ßÔþ ÁØë› RŸÕ{±Üªë܂ӪH—¤7Ëz}ÉYEmÓ$;ç.@j#}œ¯=7½‚¬?"5/±ïñÆxMw § rÔ$aŽgÉ“ûÿucà…ŒBú_ ëéw—Èô˜÷ow=GB¦Îî&}øõãQ‰˜>ÄjtµpNRj0 MÿS­tëðÀ‘Aõ•3ð€ûMK—¤}Ü~¡œï£óJBeŒà©N5~«‡»il–¢ÉÅX{zݾ+^»[R>/hlqyÌ"ô©côg=w½|kÇ×rk/RÆdGÝé©ú X"ƒ< ÿ|üÝ!Ò*޳QP<@¾¼j–»Ãy‚ñ`T²½Ui¬ >’Ô-ßG¡ò‰äYšØ73` +ÏZâ6¶¤wz˜Žé”BQÛ‰q) 7â6Ê‚6è„èU ¶”ÌãêG¦qOç1pº3"Ýas-ßÛq·ÝÈΚÁEíw§³òÝ› {vœó--n6' %LwR´9¦Çœ½6À— ‡žÇBaþ‹´¼<¢g¹fz¡ ‚ÿC8~ÞfÃ@6.vþbÄ9mé"ò^õ #‘æ(nùµvóôðªåéª.]’v5#¬K“ªŒÆí:f/£íî+ZŒ°ïÍ(Èá(½IŒ20{AÄŽsG]óœ%¦R¥‘Ýš‡CÚø}´;é~ÄšàÇ í*¦Ú&+ŠDOÜç‡ÒzJKªç¼XVcƒÃÂ0¤“ÏÌî oÿ€ƒm°Ò[J^=ZcÛrÞR·ÕÀµ1ìÚºŒèK e‡‘§ÞçÆÍ‚Cé! *}“Ö*Ên‰ûŽ;†Ó8¾à³\͈iWhö§e²—;8’:£éPßÓÑt‡ltycδ¤J;s81 4ULüãû ̶ï@äÔa^è6È­~¶#ÝSúFlj«uPx¨ÚnÓá͉7™«uÜ«9ä«'¨<Ò‘ÒŽ ¿r¬„Á°[p[½-ì<‡l¾ÆS–ø‘ipúUd ð»wÈêã1<ùýR¡%\¡Ü÷¼µ0¸_«ÇîŽsè ŽÉ¨e¨’e¥i.¼çyŹçq,6ÂÒ:Ý× Pßpµìu4¹†Zclÿƒ©9¿W" [º¯þÅ&2,^ýUÝ[YtQ¡J†6êIP¦ˆgrÐgrゥ렱“´Å[Ĥq¡#f-Å‘ÞDYE¿Ì`Æ1õÉLоÔ¯\5TÊœ­{û¶¤9«F¡›‚ñ¸•ÔiÅH0¹å®¡Ö©N–æçYzË—8€ûnÝÚ>_V$9ùÖB]Þå±ÕÉóWª‹­4q¥ LjÏÑy>F|aòuö¾-þε•FÊÿRôS•ˆw9÷†v-S§±d²оŠ÷ˆd½­8Dª‹hH!f£K\£Pìó¬ ý`ÿÕ&8Ìcï=DgRðÒ×­§‚:ÛDøûHEÓ ¿=)'Ò64^WÞCºÖÍ{KIˆ™BJFW÷PH›0G )‘ɲEßÛf—¿¶ ’YoÖ¶ ð»»ÊÍp룞ĿÛ†õßï”Ï4ÿ·%øÃ'ÖßA¦ˆötjÆóÐA°è“g–KìS nÅ»úõ• ƒv 91MÄ»XÅí_ÙédãÜwX¹Ö^[ ­ä »‘=Eç÷•û7K‰@šPYUpóÿ^±Í@ÂóI$dd±rÆJ)a‘Ôʉ¢Ö•9ÊÞ ©?ÈÀO?hú/·!ÄãAŒÉÊØLP^»g@Éö0§•îÊt¤„Ỽ‚óQ¾IêfôzÙÍڮŒêˆe›¦@½WÖÉ@lÄÔwºhCh´ºryûÚ†ëÏÕJc˜ gíúнüø9Žn#-;P¶ïo£€`º,7†ìN¨¿#å'ÃWDmÒZ4T䫲eöhz8ÞYÑpWŠøÎ1Šm@€,xŸôZ¨©ï}·3寰š .»Ãíí]²lÑZ—–1ÚŸÞR…Ÿƒ\{Á.-ô²üˆã0â~‘íÐìÈÎɪV}­*'*P¼ìÒô¼“»ïJÎkê‚7'£G”1í[yBŸK710ɽ9z\]¤ ¦èÚ ¢~î›P"WŽªïÄXNvª¨>ÞELäÿQUâ#…¶¬i×¥ûªâ"ÝÃBÑÇ‘À‘C‘’N­5 j­±&plV”ˆœz/ÿNÃÐCqä }süÿ$¦Evµö8L×[Ú½V(ù8ÕToL3¨ïirú2« E}Ë«@ [½-©éq<-«wƒ âÁšIæ¤L7‹jä$eÈ›+ aë©´½˜ä 1ç±câÝ:.ÚÔÙƒSåÀÍåÐÂÛ×O6ÖàÎ`\³Ÿ)Í÷xÙŸ9N·$ÌÒ+XxIò†K#Oµǵ>1¯wRâ8ýÚüøD%Цáëj!ìÁ 4{x›ÆâßHë*»*qZ‘Oúÿb32ø+xöŽ)UËÕ„ºC†ÌOfhÌ|ºÊÞ—~ɦÿat”´¦Ô³*°¯î>¨êãøåÂØ«ÿz¥Ž&#Ø7äµ["Í´,Rc]Ø2¶«c ÿ=Z‡;„ ´©Ã±ÙìèCWh~©.v8ɵ´Àž¶”´>Ù¼ àùXîb—é4EyôvÇ,2Jýõ¡­›®zÓvØÑœv(ÛL¥Š{xh5+Ș<»WèGöQpã8_&Bk)tËë°·â&u…L‚¤`/8Q|u³iIzæ&ö¥êPLé–àE1U+̃© ‚$ÝÜò°—Ë cO-ªºË'²–dÍVºV8Ÿ›Ò~8jX&ý©‚dvá™ÿXÝC.´cíшµo”ÊÅ)•¹/öù’"¥ ±Ù¬CE¤È.ŒÌjÚüòƒå”ËpÀ dm¤ì«»ï†å*RNI·‰ éú¨¬ŠA”ª»ç]QùÂí¸ÅÊa}v£$íKBÎ3|{ɵ—вº·Ž#h8²{!k# ›åM}ì–¶1á©ReŒ¡Ô­%f5šsVûÍ8z«MêÎL) ñ7$Øk*&¦Æ ÍÃ6?pñ6û(Hýî6½ïÍ2MÈL|ºrC0ÆÐ¾ð›¹ãH‹é^ÒõæJ…¡ü²Ìá oTqQb|´ô¼èAkû ˆùCmħ ÅVLžT$©Qé-ÐÙa2-ïTÙ§fCFͺnh€¢ö]Q‹lºDHÜ/ý“ô¿›l¾ª ~9~O?#QÎE”®@Só}t:[&Q¶d#²ÜÓAȵô#Aù>#r< /—dõçmšA×el9ý'bDj€}daœºê %%³ZúnRÿT(JÚi\îwSÉÊ þü±­¹ Ë[X„¿t+<Õ„ªšC+Ú‚”0ÅÑëM)Z¤\oî:å­îPû‰Þ¿P»a85pÖÕ ·³NØ™ðb£³Åå>Ôéݪ›gGðuY«íǤv %6”6ü¢m*t!FÃÀÅ_ŒBj‚ˆë²¢‘:äR“ñnÛBŠåC/[-€Rã¯\ÛÒµÐJ4wÔzëµfL:ýá!¤“Ñ#³!}Ò8€,®e1^Nsm‹Ã1^noÆÁÍQû}&àôª-?éØÊ×S¿½(f;å/™Ý²Û½íË¿°Û>D‰çµ´þA~Ò ò}F+*»£•ֈᠡÀ¤ˆÆ…pLÊUшÔÉ„ÌK‚ËvýɆþTªdf‘ÉÂõŠE[§ÜÄN£°À;Po‡§¹ë† 3Øß |ôÖÀð L¨“Q7qëÆ÷ö/l•^PuGº«m:ØàV$Û*5€¢9I½õf¸~}à!å+¥ÜŸWöã°ŽÊkÌ\«…d Ããæ}èìL0Ç:F¹ÑP&A îŒY«Ïd¾%>Ѝ·‹5FÄÈÈpók÷´Ÿ2 ))`ÎûÔPŠKž^Bh+²±YÅ‹¡ òy×ÕÎè:g¡ºª[}/ÕaÒ›èL'ûn ®-û¿ÒÎíh10[Ø$ìMëxÛtÐ<˜úd L[¨£hy¦Wº»>•ÖVö4Xßàšañ¼$ÙêqÙ¢ Áì䀬Ñbq e¨n{tY²†Ã€–¸ cEXH¼ñf9²ãÞ%«¬9áÛŸÛíoâm¾?xsWèCO˜Ǧ'y¢ä8¾4Ÿ{Fjj·C%=[vN] ­Çβ‚N™»ÔE8(Èb9±Ó…U¼üš^‘°6*93­ª˜|ãeZŸÔÁÙ{îÐ3`”¨“wZiµþê'¢ó´j³(¸ÁÊ>æ9Y9Qé0†Ôy’ U­‹É3Æ@`á …åz™9¸ ó°ýs=ºª¾ë¨\kœÍ߈qìà]b8 ˜eöõ½æyý Uþ'ü|šúÊÚÖʷC ‘KÈu•ô±–RëÐbz-ãŸRÁh& ¤êBÒkéyˆ,Ô¶ qžhµk‹RÞ{c]??âÏŽTB$3$u«ð ä5ÃßM¹aQ÷$¤v•2VÙ«šh[X˜á¦9˜÷(C ÔÍò¦„ )¹õ1Òî׉£› ùð–p™{Ê·Y>–#Ý5Ûƒ‡ä.ê¼d?ŃðÈlãØë€r¶{ìN.TzPóÃ6U©ƒ.Ú+&Í=ПØyD`N¡4`w2t¾ô>i”—cXòEI=Z;hG]Æ?-Ž»L¿R8iyDÌ%<3Öj?Ù {Ë’œÅ|d:t³ÁÀÅIàw$ sµ»š«Ætã"£¥Ù)UÒ:ßx`;Ðñ[ÃÊ%Á™ŠÏË0]x‚îuµ8sj–µHB¡¸,i„NEnÞäÈÙÉ•ÔÄLÚaÜól½??~˜èa0( ïL»L:á®<~YÒáÅ@_ÍMÈQKUÆw@Sþb'¹§¥…æ ¼{èyQGfzpE‹Ø¸XZ-£×½ÿ^uRcœ3à“áa4Œ ÐieÂ=Äy`/¬ ²D¡Ž°Nˆàç”M0[?Àáyì!¾·™6\‡:ÍÏÀ´„L¿êIâŠó@%HøõÈ Ìonw‚”hŽÙÊÚ} ‘…»—Sé@’Óé U²À?’|eÓ^‚LF»  …0 Å«_ÄCe3¼2hj#|†¢ ©h1<¼k ‚³Ï#ì!èO‹s3vgE(·…¯JËkONmžòÑlyãîÙ%òƒH:õlÓÃóF¼ 0]K»kÃr«j¨Mù\âw9•À0ž>@‚''üŒ€ŒeYœ±?Ìžœ¾ØÁÔ·¶“"«§/—h†ßl„p¸I¸Cët¼œYÅnZäHø*²dPC…ÜÅ"r¨Ueð@½¨ÑËûŽùNDã ÛMù.íxW⃠X.Pàd.‘Ù ôZZ¾ lµ3ýó£Ö¼®ð¶ú¿Ž}S6ÊTôiN¿d ›þ©K¯¶­î@C—V¶:p±Bè°)00?âQÛ7}xo4C†‚,ÿnÉjõ¡F´77 f"€gxy ¯ÃãÅ/æÅŒÛ‰©7&lÅ~-“[_ðÔ¹*AØ´É–ˆƒ‡é+[(¯’vB;Þòõݾ•,xÊ+ÊÆíøÕU"(A<,œt!g«lœpP¶wÖX'f°WÀ¨¹w„ø_PšÓœhN‡ÁÒÞ¨-Öz;o:ÞŠÿ¿Œk«þfãµ2cpX,½+Õƒ—³½Ë§dæÍù±ìîŽXWÇóîŠO%‚»×c½qPs ³£;£—©`ÔXsúÙ4##ß•;Qé€Èûn"Û©ÊÕ]°ô·Wàá«TxÏßP‡4^ûFúêõó¨1m>RŸŽ!lfw£²Õì´¤½¸8`v².•IÈÇßÐ…Å~X:@’á÷ š½]d ²r¿&¸£mÚŒK£JÀ¶–7²cìa3‚…@1•‹2*耮 \ØMLš?ÿ]EÏÝî{oA~Ú~”Ùòí‡Ø?bq–Vn&Øj¸ÒhƒæÓŒ§«¹qÒëx€¸Ízü[“R['o£4ùÝ1ùèûpÕe—Þ°Q{SÂ!®’>«Ç»U^¬qåeæfÇ—Êjó~évò›àø&Ÿö9Â’œßºK.XëWv61ŸÈ„œÌéIª&;’Ê—çö`Ê´#¶èž3ö·šŒ¿¹zeR·É¤±]øsEÀ)HùƒXí¸jLWT³!u±ÊÞö Q¥(Ñ5|×Ïè­;¯—b¹ i|ƒ V£/ †6–Öêý.IlðýŒ—$ÖáLV?8JžZþœZ‡b÷N3{mÃ2°„ˆÖHFm;)µ{BüæÖ󞨾¤ƒc¬‘¥­m, ÎeJ;¿<« 9jæ :FçP¶È…` &Õâʪ\ÃÔþÓ W•[{×nlÇ<Ã3µ7ÚöOä|× Fi?´ûL›;a£¥™ÏŒ(ÜYaœ@wñ¼DqÞ8RÓ¾½G-úo¦€yû¤I câáÃBx6áOÉšÙNû¥òwÈ48œ>¾IktûllëfiM÷Ö¢E¢”¯Ÿ6¼ãfÏŠöе¿iFv\÷C˜Rîà ãUd“ñÓÓ}nDcw±ä‡]ä:µ D$ÖDx>üùøíyå(àÒw]—dS¾[GGSmÝTä ²7Æ Àⵚ¸ „Ò«· ¶–Ãã0Žü²&h˜!õL ý¾õú\±«(b[;[èË+^]ŸHJûÀŠ”+dv±|ÖiÌ….é,ì eïí”dÍiX[Ïï¿ÁJr„hÚÃܦ©KHŠ/yaÒ†§¦.OÁ¨ì£³r{8ZŒ a£I ‡…båÏ™¢g=§Û¡¯Yí©·À2A2£¡“®Ëñ Iï«Á†Þ:ÑabT¥ž u*â#ÿå‚Wÿ^mðÉöôJ™Ï'>i3´ä–?8q^ÿi‚ŸìILˆFÝDNÏѨ/ŒmòN ŸÙ$Øâƒ^#?Ÿ±Ÿ²w;i 9¤ÉrFŒ 1“žŽ¢3M ò»©èK‡"ò¿Vê’÷PàŸG[RÄ—ÛO¢57(ªmß’­¼u >ˆ‘áÝÖ‚þw(`sW>(¤ätí¥ fU~ƒÔëÏS‹da? v+úrMj{éj[œJ±&ÁÙ,°½Q¼ú€_¾ö ÚÏšI9y/ƒÒ¶¶¡,LD=bª‹“Çþ2€£+fidÑ#œÇvÂù<2éH2Ê<àz‰ö³p"­à¯G8anäöçžf˜5nO!{èÌMº>Ñd=wO—7˜Õ7_nšü‹¢¯_Ǩ:°þ7 hŽ6þ˜Óf ¡?rDšÏeSõ&ÒœåÕ Æ ‡EœÞºÊ=’Lõ3ãgA)b0ƒž ¸ÃfF~g!“lºË ¸Mst^‰Å5Ãy»±mÒ~zw~…•ÜsÀUã-;ÃUÃ'Ayµ ³O° ¦üh&ÙÏ-Ž× lèšIÉ›¨üÅòRèMzÞ1œÔ:•h»ET•}*VÙ›î¯3úÖ¾§Ñ³š"}ybÞô§@h¡‚t,ZÚÙ)H×7¦.•˜ìmç©GÆA ­¸Òç®ujµ'I(dÙ)ÁUýê¼\N>t†¶džïe3ºí·âkÌJú9b ímcn_þ„}9‡å^Œ ¢J¡§ÐAç¦p»ˆz…JÁÜ' o«˜brGl·ÄQ„MEaüÜñ¬Ñóܯ¢^‹÷õáFÆa» qÅY¥I:tîÍ€WràR\à ‰šPüWhói'{€Ä‰çÍR>d…h_&¶Ô<Ĉè1æ[rKƒsƒáBµ¸ue|`^ƒ1³È›ü„K‚|ײ±¥ÊÝc·áBÖàõUìŒôœ6Ñßõî" z{~˜±Þ½ Þ6á‘‚©EÀ¤1å :ÁÆlŽ¢YQØ¢*ø$è#ˆ‚îF½løF«˜V[øÅ[NXªôèpU'>ÃRéS4ÇD|ŠtÐØÔ´FGÝÐ ,ˆAéö|ö¦75ÿ:Óã!P^é^ݬɗ¾vž Ÿív_êXmïv¡VN'SPeð[Dß–hX5¿“†¬A@Cã_ËTÞ‡ãDZ`ï:§ÊFb~5­½…HæAqoCZ´àÝÔïŽT±èìÁaÑ&։׵¥jÄ~ÂVjT–×¶¢;Š´ýñÝÍ•¿ÜFèÏ^(TÔ:7‡tøà)lkOLÆŸþ¯7e|árÊ•êŒp{X&éôI}c²ŽKM„ªºÔ»@Ús¬3$ƒR`u²°†¿6ìâUýNÅâÊ®õç 3f 20í‚KO¹×î:÷°Oçd£€QW ouÉœGòÀ{6Fñ”šåNó•Bä‹™ah3ôçΑgl¯À¨F³v§½¿6Îþ&¯ÁÁH‡§Œ:zOëÌ´%›¸ò‚å«M‚à›8V´KP!ÊõÇTGü¦ _÷uB~Bj:6µÏï6BdÊÛ¤ñ5 0#}ëPù*VUús¬0*Rè¥`Ú¹å3È0Y}ÈŸÿ]ÐRNÿuޔᢠs^1ò¬yr¿#êeÌçúŸ«oâ?dÇþ,0«évaI±f°œWx|R×ÏÐ×n !RÝœ¿sÙ S@t¥ùü*{O³è€Oˆ³1’Ú ÇýÛ< [!Œ {Xªêq #Sï¤ojŒ&Fôô˜V¨^Q3”°V‰…×KØ·6œ³©Ô'p†âþW“œh,èTû'ž§¤Ü¦‰¦Ô3b€ÑÀhx ÅmîsšZýŸr•Õ½ß`ÓS3>urŸÎF4üH\º/=Ò쵂£ wâ­áউ8Z÷à ñ÷ÈõDÑ3©#B–ã¢ôÕ{6ˆ{_»“«VPÐNbF'–o}Þîc¥Š¶H¥Ô8xðÃÛ8kÉkž kaÆn™Çåêãàï94]†Çቀ€œñ Ú&‚MÅÙ®“™ÆšènEzÊøjžØFªü»F[eÓ?¸•d¾õÓFM~ŠGÔAѥ܈W·5,³â¸Ž,”Àƒ£ßîf:š—(ôþz»;o×o”¢ýãÆÕ ÓhŒþ~I@VEçE{Ø@Mß1 :ZQñc±¹À|9ÊÉIü¡&Ôš×¹¸è$îYaÓd'ŒºOîÆ ¤$v…Ðea–^‹çZ0 '‚éôGwÁ;oLšÊÞh²…;’Q¸†c½!œü˜nïΟøÓß'ÏØâs!:Ê‹s xõÛœ¡ìî.„–Üw²_&–*Æ KÉhÄ!kmƒhŠ^ºqø†‡j˜Þ¬k'â”u‡A~õE+d¢v8<§•+aéÅã¾®÷EèûûâP¢²G÷PÅ#ÌKõƒÊBÓ4¨]žeñ±µ;Øm ,:'¨U`WmüOÊkϾQ†±°hë¶dŠiF¦a£tå§OѵyÅ9ÅØenz ›X$?8Ï ÄD}þ+-°è?Ûj6ÁœOêJ }(]Æ–Ë rfK›ÝJLÝ«gG@r„ƒë›Zë¾Ot©RsÔL®›óÿV™ Z„¯zb†·Â©‹ ¤×=¶îMˆÀ˶cÏüCêò¾5´F3Z—‘žË—Pm'¦ŠÏ+½æQMú|5‰û¿üÁ*ãÁº««›tÎ%ÞæzyY4’0K-ö† £êÅeQ†³Æ˜@ý²w­µ:¶˜í‹ H´k´.* EƪÂu«]Æo‚¶pRëó’™…àÔ½P$’A •¾¨;'~né ©dޱGx/ÀÓÇï÷† ä^pø‰øó醪›K· Ü…+6Ë*…\²Ø|)M…m½FÕÒãHð¨„ç’MáÕA䎄†@Ó«ÆËY‚° &A•f¬,]ÊŸjž²ÿ¦ÏäôS¥ŽŸÜêf¾s¼C–ê¢bPè?;Ä•Ÿù œÚÊ}g4ŒÒH)yb%ÛÖMaDÊ <줘¾'ÛÄ‘¦("(ÿÌ:Ä ùØ¿^GÄ[ÄÿE÷Ç:á;“¶—ºÊDiC–wO‚ؽßÖËÀÂjçc¸¬œ8ð¥ô†²w™~ «2|šç~[ûÓk­æN—ŠGì ¦±%>öÜç˜ úåSHLš<û2¦$Ù›PÛô½(P;b®iä59c®ó#;Ú¼ý_Ð@¸Y.ŽQßEÕ1»;¹šæâ¹ÎÎ,óS‚ŸðË„M.ëØí"PÒ9?>™m÷ØS´ªÿzÌ5‹Ñw¬Øñ ÃGù(¢>µ' ñ3yµ)ÃÛ Âþñàûª¤]&€ð"À„{žðPì¥`†54;<^ÜUáz¢¾‰ è‚7ëõð¿Å@–éæoò1X¡AQ¸5÷M1õR¸šà5UúG­wW ÓtÓ¶AÌkÞpŠÐÚN·f© pø„…zû¬ïò4”Ìis—ó4;ú²nˆà“,>÷È º)Ó“ÕÔZðr½–` ÙO2Ñ;\`„?Þqc| Ûè;¯;ÙGdØïêBÁ€d$§„ë¹”-+û3~e(º/ÔÈD¦¯œ¹è,tÿ @⤖#‘“6[·gù’ é`R׋aŸ°°ì|zJ½þÕ¸Ù¸95zÛM5¼=û :tÛî~oÑ ‘Ê^Æ­RS@Ç?>Ö¡Ÿòor7#~UÍd©•12“ D‹»ŒØ_ør‘~¯„”¬Xt!Ša¯{'«‘3TSØÅrŒÂã"EÝ™Þ5[s¹ðϳ–úÁÚ?Ôs³Í¿:—Ì–¤5ýÍÝ(ú†åï,\Jö@KUñ95âN}rÅ)pv»º€ƒ‰–v{ožå·bÇþ|Ä­œWŽoGêí69óÒÁt„•ÀÈÔ<º­‚ËæoÉpŽPF¨Á<¿ës£pôUö¼ý_űâìðzá›%OW\.É÷;:õ©‰pxÚ|æ 9óÊa·?R蚘làœ5i‘‡t.ƒ0Õwï#§îîb¸Uʺ¶ÔÞlÎ:}²ƒl*®aipCê$ MóúŒÂÓ=ZÝ?Ĺ.ñÔ(W¤$ÍtJorÓ“#ãD$ðå.˜¤ùôbô«fnRh»dÚ*a×ðû³ÿI ¶–Ÿ{±û`Lîî^ ÐМê,¦ípí+Ñ|8ݧå®_K&.wåÙÈý,[’GשR#ˆ1kËÂ3®Û±=¯ÿ{å lÐö‘N÷Û¯ä& k:âv_güºì36Þ &LXíÇ¥¸çúFÖ´ Vm}@ašÑÞ‚ËâlØÛí1ä`€Â|ò›Mø}åÑe ÅÞ#ÓÉâ©k@ ÌDbw·¿UÛT4Ïjd–>³Î(ùÓׇrpÎ|~lÿwN›‚}´ êWS0‰¬SŸÑÕ.ÅDI(@…õsþ qüž©(-s̬ü×ÿXpºzв‰s†_ë,ãx±#Ê.p›÷£J’³vÜô¶K‰ æóóЕ!³†«'ogùY X"J¤¼9#„ͼÆ(ÑÔkÚß‹",-ÝŽøuƒêìúNXÁJ×p2èŽ"ÏIÜD«.9µÁ<^,¶¢½dAüH¾Fw§Õkqí©Ïõ)‘sC¹Ò„ [ š¬ëSžÀ,¬'M-:Œï«F´‡¿D?Öú¢„ ¤yÞÒ'Ò!©ÿ"‰YQƒûŒ/Ø&ã*¡Ì[£ ŸG¸È¡ðtôåò{¤^m ÷—wªû|üw윀Gó4Ì‹ Z°kkÊ÷‘OÞ‰¬«ÄÛVæ^+’Ó´Œôùžóc’À0’ùu’¬¼f~ˆb@ÈæßGw¡Jy G>ÝI51wÔY œœÚb“ÁLáFê K@â} kùg–¢¹“Ó. » …^Î*‚¶é²ü¤L¯(þ:nܺGA–ªTÄ?Ú¸ikzú(¿?^z8r6ŽeCF Ql†æqTi.Y§‘,8¥}™f+‰åõã‚ÝŸïvàfò!9Ðbúœ1Tßõ5xy:G‚ù²Ap)•W½ºO ¸›ÿa5¶O¤Éúñwošª’’×' n¾_4³ ¿aÖ¸”5—ö—C'ì¾½c…Úˆ¬€8`7´’?é²AŸ(0|{‡ø7ß4³\G«5¾š(PÌòÖøº¬1'W˜Ðå[pεZîõó•Öþ2dõ@^“¡N×ý„´N¦ö´  ¸¥Þ…©WkÀ‚p[¡oÉkh…1Ž.®Ú$4šÆpHŽ1I2ý.Ev-êݳ0GÙ|tü˜fgá©á•Z½¶C,¯)­ái*&™—ÄnÓ):åÅ.Ïã£êsÕ»JbK÷çïRÎkz6ªãr¨9¿ù/å +>çï6ÅÖlð($*>.ÔNvÙõkóF©½\»6Ã4Z)ó—ÚhÞçóK„m"S¢Ä¯ÂïËRu´Íñ J WZBóQäóRØ;Mšc¨ãpߟjIFð©k€KaÖ5®…5¸¹]„ÔlšD|áüç©Åè•t–­ÇV\´ÖfêÔ=²ö4¨Õ?Ä’*…kÂ%¢«çgð\i]ÿ«|æi9r:暸Œ»v;Îb|UT‘Vûrί Oüë·_5ó’¬K™OhônήGWU s­ÁÔ„=•^SY±=üRM§ÄLPŽX÷™/©‚¦xŒp|[À*›g‰=iö»ZÏÕQ‰eãý®j òC®¥ìÄW®·,DA«ÀvÈ3]û ¶ãÖ»²ÂÓ’i,buÓÔKþ×A3tœ[äb›œ÷rÃZ4PÖѰ« å«‘JYÝ9íû ç!iPû0ôPTGC±Š#gâ*FÙ¼\¨ÎR4ñ cqP UE|^W–3|ŽòÔ|ýoz)ï\2*¾Ð²k2´ §)¼ÎTí¤uƒ…[4~Žî\Väy½ >-Å‘nŸUøåBëÉæúÀÖiúZ±Õt@F%H`óéÛ¨ê yäAZ€l.íD±žæ$ 5Ÿi(4Ûn“Ö¢ŠS:Í,GÇ%'˜"|Á…8S#ƒÏšA‘ðÉvcR\¤þ'ˆÌ•îð¸½ÏvÙX÷›.9{ÐÅŒÞÑi\^±½ú wP6¾U™B¶_RQL’­ŠlÊøÇ)F•ÊY3Ö!D_® Sªí9£®|ÖÔÛsÐø© ÎÄY!PÝþE!­$m¯£“Š˜9¢– \n×—*泇E_3Ú ˆ¸"Î5yuE÷cáNh#IHŠúY¢ËQ¾Žl4ß(¥‰ƒ+‰´!çêÇn([¸êAèP('ÍF]Û¹ÖÇ=rü ähsɇCºvg ¢ëþ—‚¨GRwS‘Å÷Æ’”Š\Ÿ†fϦ‚ÁXXBºLº }Px–°h,öÀàáÕ׃TWd„À›¬«È7Ö¢´zü úC¦že#“eu¶èµ…wº¨g±yRÛPìI)©°æùŸOøÂL"ÖDzvÓ&½ý^77&Ãj19ý7вyżΔD=t‡ƒ†Ðý ©´esDA¡tŽGÒ:Mz:ÂZ,gL1M2Ud;+èdG'f4 üôøcååü¤!½T›à[™—±(ézMÁ˜O¬§ºXɾ(º¶D-›D~eµ·*åá '˜8ÙŠZ*ë4.§Õ2¢4†!‘mßE­â‰T]Ùî+=‚z “ezêW+ŠÔB’[k†É±ÄŠ$ݳ:ÜÒŒ”Œ¯˜?~žÒ®—¢¡µ õÔ#uZŒOôѪ˜‰"À'‹Ý?“˜eõo±Pk‰6“–Ú×Ùoí7È÷¸gU¶ E¥üðXÒ>¦ø8À 6T_´hõ3²s£Ë% «\Ìç\ ó V‰¥„L¬P=iWñ€nîâïê6ì2ïäFGù¿u‚ÈZiïåï8Ÿ%ÔˆUN3[çÖ:°n†á¿â°þ¶C]¡“'ÜŠ <8µ$"Ös· Knc“e‚Ù°4å"‡b¶µpÃÎ¥=ˆ7Ñ%F£«ÀÉ÷ÏËçÊjòxkðG‚4Qð\j¶ùΑXè/ü©r é™z¥‹ë=7üò]½#äG’9Ì™ýµÅǵGÞP1;C6†Í{\F'Yîê“æ¼Aµ¤Ï%Q]FèÖŽ‚×r|Ñ饺œ’ûÒyªÎNqˆ„ÖF¸Ã%ÔXSARºngZ)À!«ú˜Þæ½xÜú²™†ž¬£—Y}Ðã|º…:)dèÁ7ËTf–¿f͉O6¶œ5ó«ßE¢%‹ÿY)I¾lU|sIPžA÷-<} þœ/EßH °ÄS¤©ç&ïÖÞâ²nUl!uÅÚ÷óýÏ9ËÕn¨+½ä¤nÉ“³éÝÃû%¸GUï>7ÿN•T8Ÿ‰ðBå(‹WYxéi *8»å íS0˜–6j–‹ˆñIRRÃf€gÇ<™þz‡ZS >”üèH‘©5 øšjr_œé¬ÿï¯%F#é¸n8‘€SŸDcB¢Í,#zy£¬†_l&¨xŠþB5Ûo.ì‰DysS˜ÛúØ.à‹ª¹>äíˆ~_Þ¥Ÿ3†M‡>Eƒ”nÅÿ†šÊμ‡xå"v.â¦LÚ ºfß-;C ¨9\CaBC€ÀÁ¾/C"゜âBÝмÖþÐMÑÃë²WpßÍ3ôÿp£Œ~P*Cª=é¶„Êþ$Kç8‡÷šu¦èom»Õa­Qîô‰u@¼Ð}Jr÷|°¼Žgò•jÈ™ûùÓ'ðŠug™}?Ò%¨ ¡Â(«*ahë."8œ¼?ô2ÄLMòï§¾þåŸc']_ öhwôÖp6“éÐnuä6ÚÚ­Ï9›¨‰fö#M™Ùäéa0àZÜFóVµoðpVšÛZbze›Ê~fÃú ¾e‚ñ0ÊC›û ŠoÇ/Hgˆë­Í…àÞ©æ8Îûî|cä_^’9.ƒM» ìF¯¤/7ζ‹A˜ó´W8ù À<(ï†1:ÛœÕÒ Šý,Ö„Î7X‹Wœ©A1ß\æê<ËBbÚ*Wc4²ªï”­LGh›–¥ÀFŽ©¸Ëé•2Ã2…Ä™µ ¬êÞ‚Õlk¢åÿwpš—LŸ<ðXØÙ~>뜂ÙT #ñàÅV6³¬›òÜÏjÐùÅáÎÁ„æE|²"#ãÄM#î:éiKe·Ç{7aµ¶…¼Ë „ß[&&s2˜þŸL&Á©sÅ®bBp$΃"iFÀKÀ±ÙcVª¦(IÞ_¬‰ X‹*ë«Ijæàê3öúƒ ‚òyóT{˜44ìÚ‘ä4NÞÏC½È0ζÑeë@â(@ð)–"’n’éHž±4”÷îÓ[¾òÄç²ÊÔ ½ÞÖ5kß¹ìþ(=ÂWÎïË>`d©Š·×/¢D\E¶Qn¤É›«Wxrð½§ c4 þ¶xS"? c$ï–æ¦ñÉp Ì–r'íE©}l‰Yoº:ì¹P.›r§O–»«l¬^Ë«/Å—rz‡|0s’÷}B=š ¾£$ÈG ¸Zªö™t:÷ÝŌà Üo‡ êæº“£Ó ˆ+ ѹh×vl+Áª·@òG-u¨Ùpç6<úÊÛÕ||’¶ƒÃ#4U{j¦)tÜÞ‰üñ¿ïzC}ð>BÞ»®†³WöÞ‘ÑrYr*ªg²0a©<9OŒ‰3Qn;p¹˜tn¸,…žËAæ¾²À}¤ÀbFÆÛBAl1¤ÝªºsióŒ§3TÞjk¶™.õSÒvÊPÀoéhÀ\¤ƒšqô‹›©“@]Á6©º´+ ñLÎý'm Q3Û¯ë¶J´ˆÕšžóüÉí&Í!ªLd^W“Øn¢™?'…œR<@4Ú®v“Ÿ/WT NJ:ƽ£ ×°éÀn z÷æt¢“ÎrφùI—* ©žFÒ›:h5Ç6‡pUóö‰<×^¬a ›DÚK¡?h@/§>ÆÅ WYgy 7©‡Ê3nÚn†ìâ•p a7eŸ¨>h^#N™Çwla´- ^®bþŸë[—ž¶Œ¦«Î›Ò½€£¥Ã ôÛáeˆÑfšA>!EL̯¡#¥³õár9s¤ÜFäËö WüW ÷=ïw7ÿ3¼?c¢ÑªÒßU­ßz¸:ù¿Wg±Q:Ì4¤ÿP+Ð÷où혯K îXâ—ÁòR†&ªNäT £ÜƉ'*ÑÁÌ¿CÊb$ûhô‚Ç'ŠÐÐjƒB]Cyõ5«ÊJñ `)7(6Nû|C«sÇ%æÜÜ5€D6Î º±l›©S6¦w·Ë¶°p檧.Cˆ @ózg»öêä"çjg¶À’Šø‘1ÿ8ø(ÑDÉ#|DR7ÜÛ]cUçžÑt¬Ÿp¡í¬#Å0ô£ÖF6ÚPåu°TLè=ƒJ I“V¦Ñ…%¬.ýÞö/kX©åÈJ‡b•JžIIÍnd(ÿ)•7€/úÿey˜ÈN'®ôyÏÇf8µ”Ù„*fÏ2^4}ÄFî.0m[”NJØ@X”N\$á”¶‰-¶ø-¦Ç$j1-¯ô}ã7‡|¡éRw•«Ñè;É¿z°ò`Á#¯†Û­šϱˆXpv6Ð [³21o6½û^ó1ÙæŠ;†IdìÆÈ9•HS8s'»m•§jI§Èظ'ÚV·ZÙM{'òÑ?hÔ»Cê”à¦J˜çugm ²ôI0›4Öu¯¸·ì&œ­%æ_‡mÐ7±K3€›Ð28ªÖTÈaõ.Ó¶õI%Ë(׬(¡ïEª8s*?”1ø…Æœ.šS ¡nU ;75µ®øs™‹oðrBH†h¦;™ÿ6[c‹8·L?Æ ‹<{Q¢VÓà[ûH†¨ ƒ} .ý°µwáÉ–P”™6û-XQi*ºgTwxL퓽À†Àå]—1´!&äugŸS¡n)œþ·úÀ“¸0:É0Ä„\º¥7 Øs÷c3’Ñ%ÕÞ2:Gj™ÇÖ{“á!®iâå[Ä]VE½27=òé†É'íŒ%Òk`Ÿ u$+ÖM Õô¤»sˆñTHÇ3·1+Ø• ¼œ¥5² #ôžë³%£[¿’²ñ j7 7¬²?PúûrþD¬cÓ͉)¹À1mšzŒ©îÖp}Ê’ëÊÀª ‹ÑHÂ×U–3Ðþ¼³ð]—ÎQÄd µE#™­]b Që•i}›òóÐA¥y¨RÁõˆ¶ ãêô=ªÔZmÆ åçʵ‡ …Ajîø-Ä¿#Ó¤ÁÆSs½¸[+iºa[™Þ”i5gV)dÅ^\á‘2W/×áÛ¯™DÒž„­÷Ô S£-Øødÿ›²—Jନ¢ *ˆéS玤Y?½ÀCLÞÓD ëÕBОQ[£eå=6°Á(wü½1)9Pß¾. ›ùmnÔ[“:T£ÕGsœ1Nr2W ¿mL%T¹©ÌtWšRÕ5!wÅeÏ;‰èŸ@9/@=z:¸­Ý›Fè^ù_WtQn1Y"( %*äŸê “¹Ç{ü5Õ°µ¾Nx›; /®oͯ­£‹¿Ucd­ÂÄç, ¸=z=¾kD“¬b)!~å<0øUÃøáð‹çIþ(ºÆÐØ4ïõ}ÅLÑ@ú47Nl¹]˜}¿ÆK'“´\Ã[{è ªýŠu*‘_VòŸ£„]x +a ìk¦Oy™-PS=qé-vøAS–RÃÅ×Ö„0°,írâø"Ú”ú]ÊúòB¬/î'f`?Ü­+\ýwüÇðeUQíć`Ѳ}’À«ð²Ô,×*¹v)ÑSæBÅ#Ba©%Èô‘R蹫o(¾±Gðè(Ó±ÉÇ“;ÛÒ!qHCÄÎÿ*˜I‚?»9*hW›ÒâNù•VÁþ„ML%BнptµB—úJ ­È“;ÕÒ¦…±7ÑÁ Ž§„H_A#¾H~4Ûéx‹BÞJãªrCá$D©zpªxj圷0¤ÉÕûF„ žcÓHhdó5±tš"QÆòHB3*xr°|8™Ö€^îa1³@ÏDG¾R›x½*s’:Wþtç¿ê“³Åž­[a+ñØAqÎ)õ´h¤÷Ú-#޼ê¡ZÂOîG«·Ç'4Q莈ËFÔUò4à9ÎÑT äb ÛÅá eÅjºJ¯‰Å¨&næÞðÀÂ8ͧ;»a¨&õ(•Ñî4Ïg}h‡ÅÑá…:Sd¼ÂDÃͰÞ;Ún·bƒöd©eg{ibÅ-€ðŸ.­°æ^ÅO÷ªp¥î_f!’ÞòŸ†fï¡xÿ¾&kŠª…÷b)r_þ“ÿ€z»X×uBÓ| BeõUcÃj{üAN {k;âÙ×gTš@æ†äšÂå¦<ÎjyO;sµÝZA®Ò¡°x”Ÿp™´éLE"œ–Ô¼ÑI§h©J„eßï‚МïóÝõ 56Ú¿ß§¡9Q*# q[Ý䄿ò6A¡ö€¬w%õ”䈟ÏY¥œÌÚ¬’ øûèšÎ’¹+è;Ýfw.hW±?꺜*S{õ/X8ä ª^ÏbîTC: ^°Ô°€Mi<OZÕbyû`,Ü¥òPÇÂùFNÖ†ýßIv5ìƒ3éUœ×ç_éX${’ §Q_…}Aç¹z(<ퟟÁ÷:¸#ca2ò¢:þmºÛü»«’œ"“³ôû)ÓËÈ”ßÐzk>¬Ý‹D’2à!ÛuÛÏ X€‘WÚ‹(›« EÛ«µÖéãèšxY˜ÎÝ‹4,N I°g²WµÌÎ"£.nj Téeü¯¡«·#EM v†ýR+üÝÍÀ”§uišV68RÇWyÛu¨QÃUb‘.î;ðY›Í\áyQ<•ƒ ÷ƒ ør'8Øu»å.Ô!¥º;"j‚¨ ¬É=ÑÏ×ñç• ê ˆžïˆ‘lƒêÖXC_ V² ¼ì©Øî"²@?‡GJâ5EÃø½ùB å¨ÜIW€r®W/½}}?Y?˜Å|HÄ3(Á‰ÄdáT³õExø;ñÄGWU#.[¿-^ôh:>[ÿ»c³ Ý5$Ï>BiµWÀY%a'R·ï¼Š[ÆþbÓ¦ÞøÛÚ ev•~hj#ó”4‹øí2n~µÜï×(Dåê£Ê`Ÿ]ꆓç8ö‰¹ÿ>ŽìŠ\ÉÙœÞ}r¯>ËØÑ •ÈÌf\skæƒLF7•ã¦îM’Îc—R}§îï9åä¿F">}äÔzßãZ¿Ð] ¯µÙç L43#±Ë0†¥¯{lö{sëÀËJ/~D©·\\—ïÈ?šÑ¤=þ·"ÓÔ|ÿ.'…áÙë¹ÜoƒDÆôNÑ*žØÿx«Ïêœ W®H·ðüˆ4sŒ_½5˜}«êë´_=ú˜pì«åV¶ÿayv—¥‘ +éh-zÅ%RÁ?ÂÕ $¢'q…ÙxYh¡¯°aQyÉõ b ÷ÆÝ©]ÖB¾Ú8Vì<òŽ[\Õ%ÛqC(ÍÍœÌ(›4 á€Â°K T+œÝ2ü[°®ÛL˜ëm½#ô–Q”éž!v#ÅR㢃†^Á3î·Ä_ñ¨øðÊ´ˆvo¦+‹/q|¨‡V£RÕTøyçH®Èî“ÃØ¹ý×-Ï`ñ $±Ñ²–5 jù%Jµ‚ÁÙÜæ|ˆÖ’ÿ€äCÿìB W{÷3¶¾½æ×³Á#*“Ö=õn°xáÊfȧm(£_b{ó5gû‚™Å꿆œ t Ä—4aéc1¬KY3-]ÑXÏFƽm*k\xâÇPSiŒÓ±2G‚4DDè¯Áóhð=+îaxµ¯A/Wˆ´ËRÒ:$Ü¿"ˆá îmÄb*~&õó’…l7 ÑQõá68Ëî7Y±<¡”^ã¬Ò‹Èåp¬¼*¢ùT6Zù|´Øsx 8}“Oì}¦wÅ´ÑRT¼”Û;Þë^…4ÜÌi³«xGO‰ÐW̽µYÀwT¯ÿ`G·x@’cÔû‡1ôÃ2L‰ËP-*]¿#‹3ËjA PãRDÔÁÉ{/˜É,Ë-„óIÿJÿ4Ø(¹î·ˆe E-“.$E†ðN̖訽Åz½ÜŠ¿ZeôáSHø|n ?s­‚»Ä&—y»%’áDTZäÃÍç9Æóu«jîÎ LØ6vÀ­]U½e#oò9Ÿî¾²Jûœ&F .Z¯¾… ¦THìÜ79udY4—§ÿ:[F^ÆOÖTêùTô¤]Á³ÛIò ÷g‘šÕUßŘãßNçO­Ã·0À•¿ªSi[Û% +ä=¹»7vY272‹1¡y›\÷‹í§”äÎ(!>ä\(¡eï-çžÿ(•§fYg­{hãñš×Q }&åöôë…3/Ú¹  .ý¸ˆ8a™òwÍŽ.á`íßW…â‰XÇD"ÓSÍœö¬—u‹àȼ6ª.ÎÅÔ½Ú|»7…´…‹hè|Ÿÿt6öO/æ–Z"ª+àö´é¬Ò¶6­#›2ÔŒU@hœÓΜòGE œÓæëØ4ûƒ‰ªrì=iªdF#‹W0)ÅÖ{;ã`­Í0>ýÂÌPØ[XÅø©û÷U/îÁÝ‚L'Êàl¼td™`"C¨fd€¬+VRðÒ”-¡²/»ºoÉú|´ø[tEú<{ùt`lµBzñWh?¯_(ŒÐèg:lÿÑ–îGŸà'nåæ—'¢|¯0d»\­¥"½ŽÈk$tD˜d$I?78Ì.EÉ5üýšÄíìôù5©Œï·ù|‡Ù‚‰¡fddãE/,=üB&̈4¿ý®¾†¾wÐþ÷AÚ‘)!ãIÈl2<öòb‡€Ê_éãÆ³³%aÏýŽÔÃB´bì ©¬?[j^]]Vǘ—p [D&±¯*¦Úc|~ëö–­ôŒ/6 _P¸yW—C\{–´Š(Йåñ/´«©çÁø­"k½Üú“·‚Ù}\S2âÞ–6›(NæÀH8óÿ8©¼Û¾1ϤO@¬´kð$“H©ŒÓ‡`åÎúµb¡Î ɦ4”é' Ä,¶¯Œ8è÷Ï ÙQÝ»s|J«Ì]Ò_Gõhª†¿îŒÊã¿>1÷ÒÆn5èÖ†JŽ2É ,`ìÅÙ«v<23H@TøY–>Å/þ=1êÐêÜØñï^ü‘rêwuÍ$*p"JóÖ°¡µš—RÔLØ<½Û­‹¶øYÍq‡äc¯â?ñ ?¸Ø¥AÞúf«å›òÙ»Öxǧ&µi/2¤hYÙwð·=×Ѱi5óѲó»M,g—Ø"R[û ÔÃxYÑÏKã²õ`ªËüõ¤Ú+§ö zø€€¾N²%Ž£A¾ht8 ûJ„ˆÞ ^ñ(ò"Ö5e>NµDÞÖvL{$µãšèÓôhè¨Áô )³›+" I™Ð¥?izÇ£uR¦Ð5ž Ú Àµ—ÿ`ÄÎ üþ<ŒøoÞÏ­d¤’U)ÙyA£š´ñnEÖæ«+Ú>4V=`÷oDEXŸ‹¸dhcßt‰…w‰¹ ìæ#Ó|é`)2jÕûFÍÉ&¢ÑÉN±ák·ëétˆ+tßf³,=ľ|ˆí0 ¾ÚrœAyoaÑ1húq<ÀÏL6->F†Ü«ñç¯íFvÀ‘mò™—†©UÚ¶pûên—‘\°m½‹1'#ßWF„ ãÖ}Íø÷JÈ®0_TåiÎZS۴΋!Ï@ÔÿDÐÌ#×a{:ž•!ÖugÌdý>±ËŽg*6±CF®vÁ˜Z ^¹×‹û‚#fä0³™ÆÉîež°(Ž ]Œw!æ3)ÕÖ|6ÑZ6©hµÓ¡ '…lQ`ëþ\–2A$c7柤ðYBJ3a>ŠÚ“Á/ã9šIZ«,S9ò† ‰äk.v`ÎÆ¯LÓümãÆJúÜñW>¢®ØxÂùíhOvŒîî>#<·=&£üý¨ýMÖØ1›˜‡Éj€Í°À¿Ÿ¦AÎnd ÈGÌ‹£/î ­Â „à?…¹YVã¼zžmýý7c–Øí s’Óð™]sâ¾t”y‹ž<σ'¦kØÒñ°Z/©³ôsvõ!÷ˆ~ÖîÎï²!ݱzć lUãà’b\£fö?QT“Ÿ²ÀG#ÝìFgÿ K×ÎIˆ- l4ì"ë¾ù I ´ô¼sË r€zïÒðÝo¬àПÐe‘c$‘kÖKj•ŠpmRî5`´eÎâÿÜHƒ²ýòŽ»µ-üˆRP¸óÆ„¯…h”P2kçâƒ?<™ËÖUÿiYNÑI|D`̆)¨î::1B1G[(åÒŒM(\í²QinMÜ¿ˆ‹ ÏOÒ–5>EdOr™bwb¦Ï°ièŒðE¦Åa+TÊ8 Ï·¬™»òD„ ü5ü™Q2›hä»hé™$£Õ2£|<š¯ç1NdŠ‘5öDôÁ³çÕz²é¡Â³M\*ùþ` x]k3J¸ÔÛ'ùܯ¥SÞßÞÉlÅ‘Ü(B¶°€©ÂÚ-²5Ž”4èó/ãéìOr¾ôèâ74Á¹·—›W†ë×^G”úõÊèhɉ6¨mò¹u^ƒ2ïTúÂDìjÉ‹CM;Nq½6žÏ[K±Ôá0 ¨~wå„/[Z˜½±Lf‹äHqF;G;(îˆÃP•A¡½gÈù \ZúcM¥î ÄÇ~ìu(ghYÂ)zvƒU¨^Û ÃhuK~7ŵFâ`ñ‘ãÉ¡1Ø”Pœ8wÛûïºeÅ0‚^Òe-R¬jFiÒ;ðVP˸7~Èx¾Læ6D^yï•T¢!éÅ3gwK ‘>@–#ׂJ6 UQ|Ôq.G~Ç8áË]U¬I4µÕ}¶­@¤ÚuÈIÃ’ v/Hˆë2»^béT¨™s%A;h#gt£n„:ö¯®çÈÁb½æŒž¸1ålmáÓ…§ÔvOc®ýë$­,ʲ“ ÿL}H(’Ãû,¢3RåÍG¶ù„¼ýëT{Ô@ͺ› ü›Á©;c] î@ fí¶UÆß Òʃm»Øúò!:LÏoGSç ›°£RªH_5ahž škxÃ…MÔ7ÿR´ÛlË­{æW‘ÅÊ÷´Ú!Ežéø‹ .~WBÏKû#@ÓùyåFˆã™îÎØ…{Iís"p }IÀt /w™=ê€ÇÝ2l œ Žî0«Å[„%ûèa1ˆ¨ŠàA§8O·լЍ~šÁLvzã»ùrÈ–¶¼ô£µúF¹†þ^¾©7ËxcØÓ@ÝÓéX—¯ïùwÛe+ì§SÚWwT¥äªÖ]’w)Ù´nñZ'Jø)«Á@Ä T‘aSùkâBx•º´ßx_KIwE•¾°Œ:dìĹ k¿¾âß«mNþ·EŒÜŸonGˆ444½ÆÅãú]Š¡Jœm-AÞ†hSb"k„jÆåL‰è£°tKV€çu:ñè$F þ͆Á§¢Ïójšj­óГ(°ÓºñÔ—N¸u±÷ÏsfÆ2”2fk_·WG~eA é…¶†°}s©ŽfÚ6Ѹ€¡TX]Ìñ ‹öt¬ÏYé´¤E#¶éŽÝU®[áÍ#T*‡·Â¡uþ>-Ûég(‹¨.ip$G‹Z«K¼’å]‘¡jÝN=[õõBk@ÆéãA_”áíA›ÜVç螤  Ù5YÇ–AúÚŠùŒí¿©„„h©Ð…$zDW™•f•WûÕ«áÔB ŽÀ$1šÏ9LNˆá­«CÌž@â “5öªÌ¸hŸòwìOï$›b,!ò? »Ï hRKñÊàw*o®“È»’ƒßã™ã5OWoíɳý](8qË-Ï.Õ-ó`ÆÆ dåyÙ_üõÐCá’F±MË—~!fSôiKrP£VušlÔÈ4ÙgSk‹3Å ZÐd‘ÚÄP:*CЯ„tõõ86_05Là‘½„ÈÓ ÷÷ë ¨j`ÀçûG ¶Šúx?ú­Ä6<;ZÕí4w޾ì©@2¢ÚL™’2C#™y”0‡ûÚ1u,1‡ÒEÆ2ƒ0®Qògº’”¬¶‘‚pH¼ò†õü†!±¿hÄú‰³k¤KàÁÁë¡l @[·Cã㡤Ù÷8ø{Û•“jµéîœF}6¼r5Cul2åà%ÿ&O 1²Òýh C¬òÙwFźéJaþþX4]ÏÃþÇ|{Ò—-W0Tû›úAq}:ö/J¤7ä7GÄb+ÏÙ¡0¾x§8?™‘–•Oòµ£X|>xO€E ùlkÂÑÎH¤IwìòðÑa×E¤ÜQ°Š«&´âø„TD{â³&`s›'²,ÿ,ÊÑ7Û_Ø«)ç…áÍùr¿îßCh¼ˆý:Ö/Þ^ı9f”"é´ Tèü²t®º1f9ÇGcÕ‰Œ3U˜”RNßWC‘•eT”–ŸÑî +ãõ¿ø»Ø·~‚m…ÕÃ¥Â×նΚÍfzß5¼’¿’T:¥óÐaÉ,àøKì˜HEE,î/m^‹·‰i×N ×Äghú¼F¦’ç\ô“Â×­^4ÁèÇ*éæ]bR×(OKà{~ö¨OF•ó¦Ý]wˆñ(Sé,ú’Ï.y•‘‚D½»ávÇ K QªÇ”C¼cÂÄM/“A²‡>ï§Ïà]/– íîõlŽÇžæ±åݳ/JÀâóÂOÀþJ9šÝ–â„ùÍPZSi)nÄø:å›,‘j¥€4r!åö™yžÍ,Ô|®tÿ@œš[Öf5¥Ót…¡”#B@5Ü‹Èð‰¢X™fÆßyõ³·dN&&xÊŽXpɸj.eBÜ 3ÛꙌAPÙž™UÞù³ÞrTjz­®jH{£¯%â#ðKcØ=Ó î­ßëq€ú€Šµ%h°“Ô[ØŸ¬T›½FaÔEáÄfÂt-Iü¯þõu¥dÂð¯Rm1{¤ž^|ÿ!è¹Óÿi;êZš×±®]ù\ZuAÓF£eæ›m~;¾ÊóTk¼̲Åݪ¨ŸŽúD£Kºb p=v¶>^@z_Çþ‡¢ëØmõøðYŽzAªKVÿK0ÆôY·8 ?ׄõl$:0pa̬ö Q±àêNlˆ}øTÚоo,V¤lZ‰ÅºÃz*°w7kv—  M8®ŸëÙæQíP´%I®—CS6S„YÌåø¦Iô<çÜl ;kT[?I†¢ÙjPS0Å=ÂÃÉVàöS…ðC…B(ßæ¬mk¹‰JAx9ÃàŠ×u<|¿°¹i"¹ªbnÓ¥ Çi6Á/$ø™4Då ­qøó·þm8ÿ‡°]ZÀÙÔsMià‰ì˜wo,E?]<ßßñ`»7K§E(E‹¼B6ؽ')ÄK·‰G ‚8ìÒ¸uÄ ?`ðï‰î)ÎØèÒú4(ß#À$þç¸zÆÃš]ÙŽ\$_“ÜÊrøåšr6]°Û?ø*Tþ9CÓm~[)‹½¢ÃèAý= õWãðy‹ 0ó—AÛɇ²}çÙ/ª x¬{G€M–lrÆ¡îД…æ!„'ؾmX†ÙgAÿþ».7”¢ôLu2Àg‚ÀÞl­µØþx7n…D½vοÚ‡F}¢øF@% ®øK.aD™Šà4¤ô¢‚ºÏ5d6÷ð¼)½æ>2ÉTÒ†,…çE Š(=j$½bVø5R”pÉä„hÁŒï¡°>©Î†~fA«¿.¼Éí?›lÒG*‹£§8!*i¦ž¼OhÎC"‹irb¨ ìÆ™LˆSÝç­ª·OGAO:æ+U·MãÎ;ûΰ´¡Uõ:£íXNõ^sCÓôE„ØHĵÂ~ª9y{€4·ÀÒXËHRV¹×0-f(ª"pÙr0O/ïñëÈŸ¸jmFèš«h£¤)¡B õN½¨õá5µJoríë˜ý¤=CôŒþº±DWWÝ#`… tP'WµdÊ£RÌ&™)3vGØû€=BI¬8 OòEFwKN>‹'isó–Šâ%ÁsS?÷ÿJ†2 ½ì4ìrO ¶’³á®ÚhnÆûõ–G`µÕž{ÄËÖLw/© iØd'eÎ’hŸ÷¸Ÿœò3më¡‘cƒÊ*ŠŽ]ìÓx¾Qq¾NÕo-Q»èüéÕ«£À\ú‹Az™}f.†êhåÑêúf4ÒQ®ûÈhxí>‹“1oa>ò ÕÈ„lS î‡qÊâV¢V.¾í)IÇñ#qdû²J:'ï\Ü.ÈqE3×ÒiÏþè´ëH*.F>UK¼C Î&‚9Ú<'”±â\†°Ó‘,kÑýü84ùdƒäƒªÞ¬ÚîwÙiMˆÅ" >Çç´òN^syÏ‹“?ü(”SJC¨Íþçx–w㧦 Ư»Š~|Z#¿“0ÿ?«lŽ]›­vIƒB©§Ê£ŠÑ à¨Ñ¥kWCøÄ¶úî—Ø¥ K{ÏPÕ”s›Ñ«–Nµäq~´é¶é DÊ5Ù A[ÖIØ“AÛôÿqv¡•ä5æœÙ-‡ ÀÓt4ÌÊÛ?´â¥.>ØlW]"šiÄPÛ}SíÇ•ELI‹«Î+ÖÕ¼þè€jÑã M«ù&£ö!µ8,¡Ñ:M ñ7J>¹{QFõ|è¸J‡Äû7ôÏ¢Pþfg—k6܈°™òíá_™B§×@ª‚*| FùØœuÊ ˆ¦Ì6øœ“j{¾!Wæ„{¨€†ó °a~ðk#ÏýùF=¿Âí¬¿QÙÑW€Ù¨Õ“(ÐÂU/žwÀ«(b§7MmÃöTö0¸‰¯DeRÓædïÆƒFJˆâþ€¥„쫵hnî›qu %åÙ§=àrƒNeÀ)îæ ¥Fp 9Æ#óöS1XG±ã†áùLÈ×´]<ˆQ2J‰—\z3XN‹ÈÒe”?©3†²\uh4%*õwqûë8ÆVÆ•ôâEEv@!¸‰;Ä!É Ü{çwM:¶žþI—£ÿ=uV¡ƒýà0„¯Aê:™ €ÍÙС¨Y#FS'hãɽ²£ßCÛ>žÐÉÜJVÊW¤ÀgÉ@g{æ|—wÏŒØXÇ]9;ZÍ$ ‘£;ÿ ôŽZ‚½$+ð|Ÿâ ò·Õ5JFäôZã›SëÔdµ-ó\WSyŒyùkd´­›€AÇÇ5ÈÆ"­b&ÞÎ’»ó¿i›m†Öͱ0Ų́xoø‚QG©î3‘“çfË:QâdÌ‹j´ ²¹äz¯‘úžÐ CÔ´4B1/d–»©.hÌ/Ï)O„ùdö/½{\ïÝ>Êi•>Fd>9}^&¾@¾]hœ|ôÝ)šý¤‚\qC·o:Ñ•J•&é÷$nMÎ,ßåjÚV%*¡8? |ÁÍ%U‘2 oÍǯhZûEpÞãN?µ°óNF3ÜÅdP1_e¸9b„kQ;ö¸• ‡– e^#oþù¤K–}fÐ/[F!gÛÖ#¿ ƒÆG5œ¯ílóÂê4IòÎÛ‡tÅY|Æ™mÓZ HaúÉ™-LnÏÞsÌzÊã ªˆ$ªb7°ö²C²ÛÁ䣰üG «ëϬ`ŠÞYºÚIõžMz£*}ûY¸ƒð—èEŸ ¾¨mg ããyÙôây>duîAü²çêÀA8ªÚhc5Xà\ƒ;» :`,+ýåW !ÿ §C>ûùþä¼Â©ôï9Ö¥;ëÄãaÝš*$nÛU”$©¨SèzÕ]x>N!Ž‚›7ay¯Á eÍ·X¨Y¢'ü³y8ªê–ž2ß®0ûŸ;D²+1¹=¾˜…¶7fs‚ÌÂÎ.ëû%=P3àÎî‰cM#Ù<×"ê N­DüHa·â¶Gì6ÎêP¾áSqÝ5D´ÇàrÅG£Y±0ÙK›/?³]ÁÎÛèB~­Úº¶‹×à’ãçßëÿ'®u4j 5SLãÎzÝýrMËGö¾HÞÒ‡¾,A†/ò¯‘î†'Ì9†l ÷'*Ýà˜!y‰XåOB×DžÙóN¼·qQ!·pºt‚G)Ïv ˆ*[3sMþ?öÑœȹhÛ[3q² f,ÔÙô–õ" (Ñ´­æ³•„†àŸàX>Ï–òGN§Ú†È“÷dž¦»Œî1t±:¼½edjr´4}jþ£,7€ ļ¢:ºLÛxFR’ã8ní -åGÃÐpuc™„‚­ Ÿyürr:ØËÉ%T`‰ºí2TŒ7¼±—˜aÀ‘KkE’¥Ð¨óñ>í_ħL˱}³O­HUñ‹°渀Tƒª—Ð[ôWÛòH5·`]°ÔuQôwl6÷(J•Äa½¾ ú9DUW*k^ýYöF­— 'ãq(UÅ'½Ä…ŽÂ‡´¡­É“á GÙNŸÉËÖCz-+ë¾C|o“Ô?Ý÷ -þzZ®zÇ)Møs ôdœBàÄß%<‰Ø¶'Ãv ÷rXŽoCr5ø¦I%u9SKÛæÜgê쯮’GÐ-¨¢-„M;UX$   `ÕUwä²J  ÒA-¹œN:í’Z–aèê4˜‰8Î6C6}E1C]–,‹ý®¡Ö1ÓCôp@o„!ñ¤“@JìA uäˆ?…mÒÎû6wBe'†Š“ØÁ©Ü5é³q­ ˜$†'²fUp+jݹSÁ‘ê˜}BH ^îø ÷FIrG"×PLÇÒιV¼ºªiNA 8”píPò%ö¬Š´<Øk=&9BÙW­6ݸU8ƒ+oñ™A¥§?¸¬=_¥‹\;ŒN͈=¹ ë²[ Ö6œ¥Ìµ>T jõV*_×HŸïÞÇi®ÕóR8½óÜ®wçóe ¡}§á#ýs™”•ÁïîˆIï)@ê뵛͘a Ãay\Æ•4³Ù^÷N0Ny„MçJŸØŠÉmý+£ö"¤öwÚÉÆ¢8¦Ž¸r¶»“I%–²òÙ¤YhâJÞÇ4E YÎw«m3ÊäWÏF+ʉ‘ÙÞ‘nÌeâ 2¶Âꂊçq˜ 5¾xõv2g¾å°3]kç†ï¼a¦ÆT{=ynè &“a/óûôpõ/Ø•Ëng›AÒÀ$õ/OÀ¬½îK‰—äVËqe+@wË­A>ãët b‡†]Gôl\ol•ŽÉüiÁå_Ô-3æÃì ï[G}»;¿.[šOÉÇW²úï—€xK兩̄)˜6˜}˜Ô‡1 eþÈï=J© ¤á:’ éîêP4QT ºé‚–¤ƒGÃëáÝî†J&ù#=U‹ !̹ÞÇ¿­ç²z½Müâ7\?áßÌ\Òõï ïM‡:!f%Ìȧ;U·j¤;‘®££Ôk5ï5KE,• "c¿çƒk¸¨l¬TŽ;qOûùÔ°=(±UX< ] ñYÑ;n­h6™â`ãfL¿Œ;E|*:ò!ÆÁ‘b*â¤ãñÐÓñØ<¿ÔaáøÂê¿RøáÈ ø­´@Óo®: åáýa;ìÿtOÛ`šÝnæí 8ÛZRüð1–Ä9úÈfkL«üo QVgWuñ(02¡-·0ʉæçµ«¸xÏÔ“Ï¢ MØŽwšD#FÑÎ{Deo2w‡MFº¬YQôô†b]¨Fû}­Yt#Ÿó\}pÓM Ã| øTNf7ô(¾h¦ã•¿Ô`4*ÑùT¸­+3dªéø¼uà™»ÃcßS-éy'¢õnØw:9Ÿgµj[t¦CR)[좱Ú{J»½XÉ•›’æýÕ‰ö ¤Š¥‚ܸC¥c•Dw9غ*CÉÌŒ¢åã· QàôàÌœ2 ÚÎØ7#$8æû¯3H%Êž}YõËó¼[ýÉ$Û‘ÞMkîËJ\~5¶uç6Ù=·‘Õ½͹'_ÜøozpÁ;È[Çp{f³ÄH«ýñÔ¢ÕsJé× ² 9ò#ÇVƒEF{1p?[¼ç¹Ë…žEwb»ömâÊúÄ>×=x* ¼«¼}<ƒ‘ÁÒEÀ°pŠŒºf:íw¤éé/É’¼ÍâZ²"e/±.(š€%nº'u[šŠœº¼^x_&‘¾±(¸Wx)Í—#¹ÐM,·ÒRÔ‰KOu7YšùhLËuZj}4¼¯Žƒ+tA`ëpNK(Lû$4LÜ=ƒßeÿ01ò»#6ÚA}Û³ƒðÚ É÷-vT2t¿9üéÑå'¼+¯ðÓ4?7*×O‹¨[ ÀÒo‘'ÁÎþ·ò†§ò‡ò°ôAØ`ÃÂB9äÕÚxïË›ýÄ»OB–û[Ô™õC‘ðæ‚Hl'<ËKR%ï¹ÍU3¡œËƒX;aÈ>X1ffñ~Â8¨è†bcRD³Ÿ¢Û«ά¸Ïý‘Å«Gg"š2Ì…(Ê®¹FpÜðž#Þ_Ú˜AÔÞöûg*hKï±Ó'or¨ï~¶B„=À ¿ØoéRT•½ú8võ$ýv´f) 5À"þçõŸñ+,­ÐOc‡£qÕÑâS€Nm‚Tm›äöÝ^ŒÍ 4…w• G¢ëMB_6õéæU¹ì¨Ð—Îüt÷;†{‚_¤-^Þ?¡¸=¨ä5ÕÝèï–•5¥ÞðÄM®¢MX‡…¹ÇXÁÖ£4ÜÃok‚dìò³´üœ=ìÊ]ø7ã°YA[x^·¶$Є«Ñª PJ ©ÔíwR #¢q@Û¡: ÿR\€ ±Ç‚Ì6{sCêæ[Yž)ã/¼Ž´Ë@-O˜ÜhY+ôc~QJØÜÍÃé7²Ñ¼[ dõò !0%`ǜԵj®¸ ¨Sù[XnÿE9¼šD´Â‘ë:V8ª‚9´E…íÎ4ÀiçÇ|îÉŠ0ýæ&t<ŒE?oÿK>¿‡-ä>aO`)W.õ"BkóWQE¢á¨ý©F'öèδ›óhŠÌœ2|Þð…B ãágËðƒþsdõ^`ªD3Vg  «ÜÏ.(°åd4}ë …ÑŽ‰t[dšŽoý²¼ €/™£¶ã‚`LÓò†z¢ |O(k[¦Š›¾ *6ÄÎXta'eôë˜ðÔ¼-¬¯+6×ÞÎÌþÕ_ !¢•­ŒI~ÚAf?‘:,IôgmÅ(Ϩ³= ãt©I›iX~ni&Ï!ªÁû=´ÃIK® þE4]Rª?39c+þLagì\dCòšiÝ3û)¾ÙeØÑŽ“ YQ¨'š ÁFqv n¦Ü ;ë|ÐÙâ^Nñ\%$í^w³UeXè² ¥r ºKG°îo¾kpía¨ù”fäî«ýÏ?swU;U\Ø?îZ 5(˾7‡¸‡øúŠ˜ôvsSE-N›h%ÈDYµ{ööÛ0oRèžÿn.T¾¹a=u-zÉ“¬oŸh1ÇvMmüâGÐ0è%Huª½G6a&öI˜·10K{ÍÓš–› gmÞ{E5’ÇÆB¡º”>çMÅHípŸû5kIo*qù}†d›A&gNA/È]MaD&òrÍ\æ †÷Ò¥P"­O!IF‹„·ö¤…-pTw V$ÌæÞu>£<Ã|בùà…ª Èïü¦-×A4œos8¸‚°lHêAÛ&RÞpœ$!Ö'WPr”ä%%[üêi+9š±lÕ½Ññ9›ƒ0^œúÇ©ÞK»Þì^4û¾o¤ æÈ¾¤Çž´Š&tv)!Ý4OÕþˆH+×™ ý$àÛ,…k•3´ ×ÌLÆ… 0\2¼PúT4,ˆÆ—49 M‰èdœHOç¿ÌÛ£^ý!‚à.Î*É^ ãI®½ywHÝ#<»ó>†Õrú¼8 S¡ÑíXŽäº ýª¤Ûøû§-òª¿1¤nÖÔ%qÇ_M¹ >¹QŸ6jÜ6”Ÿ2zDg—΢Å}ša"™ê*"/®6B-!“Έ¬úùÝx%îXltùìÉ‘*|àœl"l¨¨$ NÍ0Ë{p¾‚ËÓ©¸ƒíÑS.§\Á úÛt¥Ï·@°D¨ß.­a)bp9a«ÿ_lŒÖŒ!Ãhª¾ìäW†Òþ\È®…Sš¸v±™\ËÿijõüCÅzéV%ƒ‚úcqGçùÕf›Ô ,%€-p ³‹Êˆ(£30 _  Ô­€l4ã£ú˜8—oÌcQ=GäÕò (=œùçÙo÷²´£[Ç0K¯fŽC8¯)îKƒØ– <†#øåVwÖw'eDz€÷˜¸åìðîÍK .¯qf ¶O²úg¶ƒæt° -ê“gG¡-¾^@E;kKd]3Ymp^l¥|ÓñÙ$ŒkAõr…fòµuf”ú®?<çîà¥Þ93|ÝÚ¢ÙíãÀ1 k€ÖQJ7•[–ω¬ùq!xAEôÛ€šðRØHu2ô²ñ'ÃÑSáî|þ‚o«I?­ÏÏíoöúÏŸÕ¿>j?·Ð«ý¾”óç÷'_ÿ7¡ÏÛÒ ùûIÅ>Me|ý)çÏèz>N€þ®«¯ŸÚ‡íï¢Ð~ý]‰~®å¿Ûè¥'­ïÕ¯_«£ëêë6|ýµá'ÃÖáô¯Ÿ?¥8ù:qùýþaÿ[襇ë{Ÿ?¶ÛÝOû}!#ä÷'ho«¥;êêÖ>NãøƒPƒSËÈ ; :¡{ t…_×ôØž²õ³º[c%²qJãÔJÀQ•²›U‚xî›å~9ÐXŸÐǺ·‹*Ç[¥6Ñ'€K¿Ý(ïwLXšð1=>‰pŸ1Ò˜æ~¥Ã¶‘°ŠÊÕzrá¦)^`.Y(®(d3‘ñ"B¢Œœo÷Æg½ø)Æp³$»3^»víóÁ$X¯¢‹Ta#¢¿" .K"\»v&‘ÝCë’„Þ˺¥ý8è(չöŸQý Œ<˜Hyx¬ïW)¨¬´ÕwJ°n[°£Ï×ÚÄÜ^½8@ñwÖ“KD»Z%^§lãr=M³Ïë6æÍÀ•[ù±r'½I©Èçæú¢Â¦S©’uå*£©6î®âê^EôÅG$É\L~DLÙÔTµ|´—sÉaæ¸s;§@¼ˆÌ®EGàWˆ“’ÖÖëÏ•Í l†bãèËû2½ ÁÔÙèºTô†£rà5´2ˆ '¿’±_¤xÅãì%ÍPhèý óXÔ˜ •'wÁ6Û§uQêö§šßZǯqµ³M±¹M\aÑ]~A½°ýü=9&Ií`»µ‘°Œª=:÷åÿeGqûñwö³ô¤-:'"?zKJÊÅŸò~p¶ˆJ³3*‚ñ’î¯Ð±åm},Á"2\¦R+’ ÉHÕj¬?;‡>1¯sn·¥×o:@t¹rµ¡z‹òW{‡¯Óœ”‘µ(¸5[e´Y'ã.Á fh>Ÿm ç‚ ciÆ®k‚J¦Ù†UÇIh-&7¼%?‰LÉÕºÚ‚å6œ‡ÄûO8¯éWß'‰—õ9?½¼Ê!ˆ@gaÂT»t·ðY¤,.bØX8ð h«i¼7IhJ]½“»r‘kþ¼/0¡_B Ä+,-ý”ñüéÀ× ž³/ý#ÃæÔy‹è„á±KßSit€'0OÌÀÊS¡ ’£2ËèŠÞärb’`½‹r•0åÜÒ4«Ïñ.æeç°Lñ8žO êèñ¬þØ—[îJ§U¸IF†xޭų¥}3†d‚Þà| Ž×ꯑ+th€5kEBmËœ?$Êk1š7x1¯½· Maž“-Éë»Z6+ÎzïlïÍ4ÁOçܲùÔWK’„kÒ¤GÔØ˯íºÉ„P©~`NÛ–¤•,w¬yõ@¹"}š^ÓK§°‹Ç6ÀòŒÈ䔪)!Xoýe6z?Ö¾º—6ZßñF HCüÝÛTZ; gR¡´/ugüÊÇn)ç’6B¤ísA#o¶¨e"Ü ¨K=Qé­óônøqäf6¾H ÆÆ­ 3ú6 #ŒƒÑtÉš1èîú{ÈH¨ª·{E Q‹B„oMáﮄ ÞoÓºAÌõÀj¼± °;Zs’£‹G¹æsï;XkN’r ·†~Ô“W¾D{c=r¾J®1ÔÏ.0ÒÔ÷X€5“I{Õ·ç»’–¢b ÊN±é¨±»¥Ï‚BPcWpƒc¡R`-õÓM£?ÎDd€&IBf»ªø…Þ¹Z^’gî§Æ\M"–'Ì¢´!²Á)R¾Ù´ß¼ÑtÕó⎎à)*'kÆ tVà3 p‘Bø´z$Â+èèÁLKÁ$Q=0yñiÂÎ×*¿;ÜGWqfƒ2ëŒÏ uãý(Ì–×pX¢´¢§„Yý¸*x¡Ó“u«ú‘¨Š1f6;zPÿuìÍk¼¿O§Wb)×¹Ã=Ŭ—^æüíÖ"ýkHçÆ –VëDhçT`•ˆ¤8(ìõãˆéiGÂ)>VÌ~êE@È3m“­»^Š’Q~þE7íðd‘ë‡3G7ó.o)«M#<.ºL¦!ˆÞ”…aD-8–6ÛU •*ª° ¦žnã3Ëôà‹Å™  ìD(\  ÎÜœ4ò­ úºÝ<$#}¤#ý˵z޶×B˜;ˆ õj3b­6íÏÏtF?÷‹{c;ï~TÃô¥¿àFû¯5®‡ˆϺµ2,‰¬ŠoÔÌä1òa6|°#žtL)ëIwÀ:_Ó¡Xä5€7é™.Øß–w¬1Œç÷ñû1^{PúM[ ÇqÇË-H2K;€ÄËò ƒžDfø-:~_î`3e•]÷JöaJfùLt{“~LUN¦'8Ü¡1}Å|éj(€vÃõaAF%2îþm ÒÑFî5¿^µðS½âÔv+?8núR—­«¯ÍÔ쪟98_"X!òËÍè»$lé´|¿#yÚï õÊ¡3”K*ƒê®;nÌœ¡/âTíj¾imDZ]C´ê&s¿g™Ò=ä.¼5j7K¨ˆÈÏ€[ËRÊ!:éñˆñí»£aY{5I-üóLÑ+L‹ªfƒŸ¸fl¶'JMºÓ¥AAßý±à縳…7oˆ»ýŸM2T{€ÆèÊ5¦‹ú–«ŽsëÑ)}¸Ú eîiÃô}~w_lì˜udôå'ôb(3¿êƒÎ¨ÿ]Ÿ½{>dÂOƒ¢µ˜²q‚æ&ˆ>É$¯ÂuŠþè1‚DOy6HP…ýšñò샎;j¼GµÀ¡Jš šþÄH—Œ‡œ D8oæX)s*RÜCWX8aã"ªú| :/.ŸÔîSøLÝ“¹:P’Ñ»àO@£¶pñçl@åUHŠbïe¥15l_¡"&–50pÖ‚v Ô¥ý`2j*Õª¨7˜‹ dŠïš‰Ë«œ2…ˆi­ƒå†x·ÕŽœÔM]`ïÛY Ÿ@ù±êrp¯›¶M·ÏyÊÒš©õ ¿;' Ù¨„¡œ–…¥ÇAS^çF£š‘˜þXö™0Þ…|¬³×CßFw’–ýé!.FØPûÍ(bÅòHÿI¤,Úòeº}dÅnäš²b¥ï vÉ ªØ†ùðÿFÙV=ÓkA5,lx6 LŸªX‰Dƒ‡’t9O”‰B”ÓèbE†•ʹ@ËRÚ(ñ«òìùZÉöê3*ÔâÃ¥ºTèIäÕ`¡ŠÃ ®á‡{ .sÙnTb¨ðx£°ùI›aECÿ»$“DêÔ”u‡þ˜ï«¹Ÿ¬[Â夡n,Žõk„ÛÚ4÷uD"VªV~÷î=€Oà•ç¥ä2û(áp Ûük4žEöî [‰áwâ5"jF”‡¼¶X»À+ \z¢W–¬ƒãâŸÌìXDDpB,ôÊÝ‹~XÆå¶s(ú4Æ8­®®†$•Œi4Õ‰'5&Ô0´š£‘.Éáf LÛHØqg¸±–ê(P—`RLOÑã\Òh0mãûö)Q£^/ý‚î/\2K‚7þpêSˆ Ã×Sk[C )6”«Û)'Þ•½—ÒÿGŽ.Pp™úÁÈìæéŒU!¿#i B.aк¸x®;¿GM?¢Ò±ì–þÏ[¦î)qU…ÖŒö˜ßÐ~3¨ðŽgÈë?™Ì´p ×éqH!Í«SKY±Qèðƒ&“9žá~9|„Ëi–­¯0ÞÊ#\»¬x~>7òökI‘`À?^(wëK5&¾ Æ÷-'Bž7RÌ׆¹j<ÿ%{Ýû ØOìµ:ãåÅ0†a¡N´Lð÷kÁ/Ø£{ º©í]œÅ;ŒˆÁ(ËïæÖ4¸·Ð¬£é€ÙO+MG:è Â# ’¼/Wž+'¿³1¶w*ey[Ÿ{³'ÜÒŸcF“w+ŠÀ¼¼šöÞÑ]ÞÊ®hn ÛG;v ²™·›Ì­Öèe „‹ÀSx…ÿ-£éçû#z×ÏD\“ä“òòlîÔ„<ä¦& †o‘9$‰Z+p|; v+ü@U©>bçRFqr~E!ÚH ÑØXãˆÏõ´LçUèz“{‘ıيÐ램xW„×Ƀ<Wlóµ¯D6þkdŠÏ'ò,ø×Õ¾£D8Nÿ²½LÜ[–€*MCc.tâT¡í”aPˆ~jlQNG± Ú9çóÈjJ›ø’K]yÅmv®z¢2Ϩ‰T“Œñ@Epfðß&›Ø®æE,³ã¸Å[“Ä´I‡gAjt@¡Næk{¹mlI 0eÅD>?ÂŒ5+¸ÆCšV¾õX.éÕj“”iUÿ;ñ'2lÒ¼\!Þr>‹Œ Õü¨®ˆ¼º_值nÒ[,W“¸{_e}oSp1Î÷1­—SÖ$]3n¾1JË–áR¨ûÏ®òÈ ü»›^lïÉ¿ìú–çêÛ§õé<¢3Èd΂~ØÑJKàø\}yåªe÷â¸,·Á`n?ÅDóeê ‹¤Nû”¶ Ë¡–„ûÀZA÷ÃÈ>@Ú¡PR§Mi~0ˆHáùúž8&ß|q|±§?ä±o rzYi=¶¥q)Îê?Úix&]¸²ûµ™kã1Ä=Ónâ™Fªh x× Í:BÃïxà@YëXÄ2?Ú‰’Ús¯—³ˆ£¾Œ|“,ÄÀ0jöü6ÁZ9Mì 20Eˉk¥ËrÚLúéêégîäŠi`”]=Öl¦Ã/¼áÇbä•eJd¬“é7µßÆÎ†É÷þw'¼“Fšàc9"4±2´2æö­|¾ßbe¼x³*îäW™TKxý»Ú43BÿîsÕŽ_K W»'ÅÒÈøÅZ ]êw‘ ‘JÕ$$×J–OCŒ‡ŠöŽ0¾±Z× pf{'G`bÝ´½ìÐã—LˆÑ£w±?Œ;晃íˆgY981 )ÍÕƒ£’3ÂÍ6nãcãY¡—ç®+ô®Âù‰TÝ7Áì×£ ~…ü¢±aëâ¼;Ó.âT\ØÖ©P%»ëbüûê“0\Ï·©2#úªŸ‘GIòbn0rb‘úÙ2b¯& ÉK2qüAOÌm°•ëfPØ`EK{ÆX4É84ÿS™;?ùžàÉ_=.¾gF›Ü€› ÀH¥Ò€um7K­Ãh‰ù&a±2ÿ5üƒÂ®+Øôx—È5×&f“Þ:øj—çñ ¦!¼Åœ«Èƒ2¢@á@¤s ‹53°i…º —˜¹…'ÓëLz)Ø¡€tŸ/‡ð˜dPÓf‚sÖ9ßï\h;ÁH×Ü¥¹Íx5‡9dˆ<x®ª9‹Üú4+Xp ²9ò”ô!¬”[GEmý¼T[©”&)},.º‡vRm+ÑfeÞDEÞ$ÂíÖfú“vLç0K o³±K °Çø„¶¹À‚¡¯`ŸþÂÏ]QXˆ K9Gy}æ^'£þÛàL¹lÔÕ}¤ˆšhgk~ É ~,>½žBÌlcTĵXèi…+Ô!Ü·äKâµçýíŸV@dÔºÐ)‡bª.\>hÃ_¬Ó9´Ñ“év†Á7Q-ÒŠjzš7ƒ“kUÃëxQ“ËžM¨s>öÚÀ¤c4uU„·Ÿ&V²-µÁábù&}™ìŒœ"þŽÚ‘—^Ãö…a€ Ýô©=ÔeêM:0Õ[ÀÇ¡Y÷•Úö9%–/“lÜvg€ÿTå‘E–‘–OÆöpÆ\whõ^Ýw7G)žë°‘éÜUÉwžêW³þõFºlù{‘U¼4ýð*ÓRŬ,²ö[Q+'÷¤Rºà8s›ùï'HäCƒóry¶+ìüþ…â$uó¿»_‹ \ÚÁãi$¤íÌÐôÕ'‹ŸµÝwã´*1«ŸlÁ¯Å½wO6lïܼé9¯u;6CÌôóG2· B¡°»*©Y¡…CíÊ„<>õNÜPˆ RÑlezZóebH„Œ,5/P¡¾H QÒû ÕZZSgn*" ;Þ`È"í9¼&_¥ÇÈ:s«„ÉoÇŸ XfæŒDlµ¶?‡ËßµrÿG‹ wXÇ Ô•.ïøÍo`¶…Bt¹+Nÿc€|˜–¡Õ¯šÅ?µPÍ»ú/LçAìÑíÙb“x”ýêÆ ³Í+…/¢^­Èó‘¸ãÄW—Ž[¿¢"µiB¤$>Ôóš“è?.$2Ú\›Î.È.:tWn=æ%ûÒæ£Ùá\ÖªSÖ»å›Ýð÷ÀÀù.åuî q,ÁHSí¢b¨Z¿–{ñ½*¼#½¶z´²[µö?æ[0çañ\¢Kø;˜>n\‰ô¸ÞÍ?Võ4ïòÂÜÇeJ~"Û íïv^{ªÇÔ¿nL!|;Ë«¦-º„ 2öħÁÆ”Y?fR4íb äÕ3)ÅUÿ*(G1âÐÙHÇ Ê6r,˜µÁÓ¥ÕEFÝ=»ì”äÚáN[ËýŠVÃdÔLªLð‹J0kum »ÀZ†ùÞRVóÀmÜ*õc¯qÖKrom¥?)°¤\›Æ­¦¤xŒ¼š …÷½YÏŽFT^NIÆÊb}誉Îc½Ö‰ñ âè2oÀf öäQ±oS_î¸rƒq:W§¹Ï#3öc/G…œ€;'v^š¾ç!%+x®Ð­Bƒ;µÍ+pò´ïô¯?7ªt»œÇ×Bh¹þO»\$½ÉaÙX±¾MõâѼtya†]¥—“_÷ŒW¨{9ºÊû~ƒ•-.•¢Œ ⛋h!<œ¡J9€%e<ϧ¯™‚M<Ü %hÂý—è5÷°¡è] j­ÞÊÕ¸*ÒŒpœÝž0ëгÏ×Jªã³)¿ÀÐäZ‚ÅQÓ?2èâ¬)J%‚Ô=Ѭ.EÇ9L×E(‹;žA â‘GÚg­V–;r¯ÿ NV‰‰þ³ä©7ûè'´ÍŽ#Êj-gâ)ý‹@-qþü¥„+<4SÝ:ˆWçø¼¿k²$§¦œ@f¨lÆñ‹ƒ¸—í¿j(¥í›ÊÂr¸‹¬S,+-ÕfåÇ/ÇyU^ õd€b•œ bç#nÍqàôHÿ3ëL­r¸|ýÝ íQœÔ/MT F1.8Ï—³.QIVäܘ Á<ø>àÀ'Ëš­xÃÛý\Oëàõ'ðkÃè¯ã9R+ ÷ÃöÌ¢^Î/k¤p1˜Eh,1ºÖ^`D™Öy[bwJýª!;‹‚¯j~Èø$‹Äz¢Lu¨ÒኪQR–­“G¡ÞÏ{†H÷o;™k§/#8w·Éâ¿uJ7k¦‚'ù^^[âJ¬3˜3BÈL´÷‹‘.Õ\†›¼!bûbuõ+PzøºcslåÁ}@#ã/’6‚*æèçg4NKè¸>3cÙtšV©ÒÐEeÜ<¡¹†kUòwñŽŽÉ¥^ê›EÛ{`rûÚð²‡æàäÛIKé1€\œÆÊ }£‹5ˆ‡t}c Ï—]b¶¾O¯U옂 SÙ%AƒBÙcœ•j¾E…I«÷ 2½;—È.‚0 §4#ƒ/‹|<Ћ. ãmá˜w‹€:ºG/½oo1$`v¦õaÓMÅ×>’XFd(´Í™I”x*lkh).‡½ñSn¡ÿE\üœ¬Etk%Æ!~v‚ŠïËËÉi<“Ù\·îا²mâ‡ç5 ÀÇÖɦŸvMà „ƒSP›õ!p×…&f"E›+6‹~…AºE´Ú,ÈQ‚ÍU«³gÇû»Üy«8Ñ9'u7ÏD,bùbÚ²y6<¹¥?=È^ìØ2 t ;šÎRJŽr.GÁbZQ¥Mƒ­‹P¼4/ [xæÀõ¥árçHÅ@¤ùµÔÅä– i€¢Ö‹£ÏíÙEï)6ñ8:Tïn=çî.vÊýJc;Žõ¿­EêéI0íÍÄU(‚ž1!‘NLëZŠC6Û[jpS!ëYæTF!æ†TÓ¸nÈœ¬Rþ%_'¡TÎ%Ú‘ø['Z,ù •!+Ês¯Óû>DdLü˜æˆ[šaçÙ݈“Bh Ú…aFÁ¬Üè[’ÊÒnl1•rd´tL N¬cæn <,XÈxú» "‡@0£ûRº¥a]æ‘ÌíTq<@9]zÞ¡l"ý&WtýKÖêfÑ3s3Ũg¿[&ý T˜ï=€ªØy)A§{B`©Ä„~–uWn—¡hñÅz.'ó…ïëÍçþ/OSq¶%È]OÁxÖqÌ-¡íéÔä —5Àùp$JÇ_غ•·½HÇ|FkuqC¸Î´X9hRöhæI‰µó¸iøŽAV$ºã~²ð;nbÕ”2¦çŒÇJKîÉr ÷¶w›'qÂ:m!¢ã¹/5¬YûÍøH gD•x4}ü–TPBâg•sL,-dØÏ¾0/ûÛkyð}"Š Ç+MW™$µj ³41‰ üö ã¼_[X¨[ææ˜½ÎA ° ŒÇ¤k¸V4;™Ó±¼05ãÐ÷"Iµ üŸ7tÂrX†ºp‚šj ôx{œ$fâ=/0»ÏÂL®>W«´ý»ñƒ)oe@„BRå¶ù\ÌÆwâtñ|;Š@¯2#ÌÒþ´zŒ×UÝí‘®ÿ)}«î -å3d¦z=Öü7Q ò;œ´!³…N•‰zú×|Hò”6jI"èÙÖûò:$³Ô“õ·Lç­1ƒ?Yç‰cÛ=²Õè©u(ÓÖ¯Ëîb 8ÚC‚%?š6‹hI¼ÚûGßcD¹ Ê”uÍ_ŸZÞ\ ^ý9ÿ PǬ‹-œÅ/UK¸ÖX¶x½°sÔµ§¦—¨#5t¨$ë SþçFœÏ汘Ox9CšÌÚjrQ&º$í’¥43¤Ï3¬°í_k|ýùˆþ«,U)‡< š …`/;$YêVSD’°TŠ¿:= .hÓ=ªGÄY·1"¹;tm`w»8"VŠu–du=ˆWñsð<{.7«HLË¥ dPt˜¸Á›k™5à¦ñ£­öƒ÷ãØJ—N×EݤN‚\²ÁãZôVòûÝ—¡=—ãKÌݜ۹ؠ–­”/Æw§~Oã‰:Sð…9¢/wéºå2ê’œª3"ßv¼Œ¤«À…Y[gšž‰Ï´§(ël™Q4× )„ïN™D½ùàoû|§ŸhU°_ë»T‚ òR·*º‚žõ…ê`¦Tcö”QÿU~”R¯fŽM›B·ëRN‹B¯–9‰ìÎ}èÖˆ1ë?DbÔíï¦)·UÃ!€%Sœz>‹Œæ¹+rt<'«œÒ•ø´¨Ï{g¬_gSP$Î\A„&­k_hDz$ìçŒë3ðM²†QB´SâxÿC:Œó¨¤°°Bþ`¡g|¿úSÿ_àÞÅ}ù;ÿ+^ø'ÂÄÙYE*"¢–ú½ÉÚd›äÌ:n Óª3q•‹ƒɈfù¤ÝÍGÆ:]œcömùmm˜¦«ŠrÖíªŒ¿]2+§þmq¦ è4ʦs:úÐpԲݱ„ü~ïyÎkBt§ÿ-n¤²žTÄ5[Ö°Õ”ëñö}2Ìuõ½€; rtp2N†6+n1Ði©·•æo煉¹€Ûà ½Öè±xA Ó å¼`I 8$`Œû&ÛAbùÿMh‡§~Õ6‘êɤ$½72Û­%ÀBu«üVÙ3„/˜à‡`Fa‚?áØÉð—_ÿf©áK«•¬OïÃÊ"I‡ðC\2íºöZ#%"–‚5L¾… Ïa S`°ðŽ2/7 Ï à2‚¦’~pãRî¤Û_ÁG£Žá=¹„Œú´ûèW“ϳó7Wä8}óó"#ˆç¸2¿ËØÛ%;üX‡üRøÑDC4ªjªãõ „ y·õJÍΔËhIé`JGý[½gQU!·A³sÀ¨¢¼g c)2ŸDÂ#H7¨³?]—¬HØLŒ®ÒË!šø@¦•MÂ#,ÑMG%̶4q/·ÞAXsÈA˜m¶&Õ»ˆ$îz8çˆÂ$™Ò²¡_"é3ZÊù Ýé J-\6j9ASBøÆÀîb_­wnsžã5%óª~ž“%ëÄfН¢EÑ1›û”•_ºÖ´?aДD}¶!®£•Aï[5¼GŽO- ¦D£é6A æ îjÉ!m<þOz-¥¢ÅH9Bõ²s¨Îh%xoÛO°RK…z^~…3"ú4ü춨*^g 9ƒçÿgè¤U‡M°À“ðE»«/+¦î×|¥˜|ø|›á_,¬P‰Ï¸7Y„¹j‹&ü‚бª‘„»›Î°I#qC࢘dþ)Z-}Š:PœÌ¢\gö"ÍMŸê8¨’InÛiâ‚&µ~n3MüÜ$ç×MH#—}–êÀ)UxÚm.Ärv;g&P¥Nhvª‹ ©užjÿd+à'- ¢ÐÐTܱ´§¹y¨ü…é=ÛAþ½âËú±Åì ôÞúAÖ¡ËÈ)fGLYམ@G2_xæJmþ œ!õ Â^«¢ðúùL'Z£+ëÒa×ìW´¯‰vDÄ×¶ôΗ®ÎLB%ÛAþÉÌ£J_ž› åÄpízlâS¢¶˜F|/¿‘A¥Ö”Ê[\ÌpŸ&J´—5tè©€C¢P! ~y~ÑžášÐI qqõ?;¿M¨u ãzt-HwI≮¢vÉ¿°È  ’˜+ä~™ùv*îêó–|Q"gžA¾¶Õm4m Zç%3}]À£N› ¥’ÓÒW— ¤ôg‚UÜ}Ú¢0›ü,¿qF³1ÍȧO^Þ¦C+þ‹aa-\ÁžÌõp¬¡}åp¹E‰¨v6´#äH›ÿ"Z¯‚P§×ðjˆ7ÆÚ‘J…à‹áne´]³¡"7"ÃBÝþ8Gk–‹\zaâÜ‘r¸à3£Ýx#®Âý'ƒŒ‰`¤ªbd—™Uªó?Ó¼"H >=«úTÀ&Ê"ǶÙV°ˆÁUQXòÏh™ ü©L#îuzݨv`4 |;úVÎÏæ´´²àäÆëJòËñüõU.i]œð7ÃËWàN/üžnt"„1WØ€?Ýåe­ÃvvñçMÿäÑG@À¢ïà *˜E¹ó6h‹²M‘Í%R ZšËؼ`rt Âå|Ñ%u•‡•9¨s>Ø Qƒ¥zh¡¨D¥žrö.„I@EIé]s­?߯eئûÝ?ÏÁÄÛõfFþž¾VÍLc([rÐÿM<«c(Š߉!ÑéÞV5—KŠ£,ß!•–%?¹ÃoßX°“\W'5ÚMJ9­+âëþ¬€ð¾`æ«+z59“H'VÔ˜¦¦X7*ÐMfÞB.ÿ>2Y.|~­”œ¢—/š¢6|}‘«Ïs=EŒ‚픢·S£¾_1ÙÄ\Êvp>€DgUõŒÃJõäÎÊ„¼qÓ®Vø‹:©¢OübNÉu–]‚% éJ/ÂþwÀĪŒ#<ºÉôç$èf¾äv î"-¢¡YIqÂi‡K¦6m®!¡¬ŒoÅ:UåÙÞHÀïùØ ÒB²wyÓìLm½…;ÛgòþÂe4}°íY„Ò,+ÞÇ„ìÿ,4E›+â“~Þ'oñ;p•F=°Ä¾±•1©1‰¿Ë»3·ÒÁRÚ&Þ%¹¥ÅÔEç³~ŽÂG›Qø³ûëÇtª·Hg. (wû<…1ÎrÓ¨‚A-1;?k—5o—ßùËjö¥<¿pÙ¡PRË̘uö׎ÕQ]ÔzP´KØf?SxÒèlÿ,{yHí oI”|¤áˆ¦.qVÛ‚TŠÄh߃¾_Ú:IëéXb}vçTÐÍár iúä…bì@HdŒ,ö.$”mÂuIaha`fšÞ=©>_‚ce™×¥œý¯#ˆ›ªñÙPʆpCÁ’|C<è}„Çx ýÙ­¢8%þÊ!cÁêlÅ©Í E)êPÈ3ï˜éÍaØ9% ¬©øî‘ŠñM)´É‹é»sÃG“i©³{Ó"ú¯/•2¥–ö¨®7ž(מï.ÃïMXßìùWÏ´ªj„øY3e9óµÞjéíGŸS®m?ÊúRAë` ànG>‹Îqž÷2ìÅœ¯ó+žŸ¾»X£l?muc(Ì&OpEñÓ¾!L¢ÜãÞc¢Îš’y€Á•žyí·0Ê_LNVÁÿ;‘3k)3↦QtŸ/Ô£¥Ç ŽKžCEιDÃR `/³s:ÿ.-}dò$_õþd×T.³HHDYc UÅ#ôÈþ¡f‰ £Û6{uá´‚ß’5šõ;U»NÇQdd&#¹–>ýòXÿ ¥S §ÆÄ yñéÔ!í Ю þ…öE¦Oª÷U ƒˆ!²Ö¨ª”ˆ ¼áð#/C¨+³†(þÐÙ¥t¤;[ŠpgÉÀ—*)fþz(î Èç?Ó7wsd}úˆ£ ¯›)—•±X3Aë7Š`ð9?µ/ $› _ˆ’>Åxò \Ÿ5DÆ Òm]×Òº”Ý'M|è2%Ë.ôV¬o?þ X"ôOB9 ,oB&,}ÍÚ‡ÉhKŸ²sa»¤e\²ÆxÁ‚ÙÃ'‘2ò:¹BÙƒö#È¢y_³Ÿ›h.ïˆð‰øóЈ9_äVòWŸà'×™}RW”Øv]KÃúõ*„=õ!Z›ˆ_ÚJxk0 ê#ÒÉÐ2—ñ9NÇP¡¨ù’žà•DlæáPĸ‚…ñºÐ½–cMg[²"UøAÊIuCJ¯ u†‡’IÒ²럟 Í÷õë ¨´“’þ2Ÿ…~w¦ îöBŒ‡I½Ë’xë;»ò8øl6]è““·Ñý€ZИB=Œ\ø7¨ VƒA~ ê³`7ž õúäòüû:–E;{=›º!JŠrúÍwDªŒËh§ÛÝÞ¶ýÆÓ‰um]Çì·Q#«wrOUz-'[²Ž…»q&×Á½¼Flç€â^úÕt*‚ô&÷> ¹êîð×òz2zg5ç¨Y}Z=•UrOY8™–MåKÕlvÀú‡?ábÙß´D@犸å°}ól¯1'‹)ŠñZÄš(^^βñÍëÒ1€óÝ:R*YC²Tina›–n¸ nÄ¢ÿp´ïí5©»Ó³‘tèd„—ܱ0,ž€ qûƒ¢t$ó1ä…`nÂÚ µQ_Z ‹Yø¿úž‡(ÐîÄmó‹ò¼‚(Á‰ué5'@nìDšÕ*öcÃGŸôȸòè¾íA{«q£d]ÌW¨èÒÝR-»høZ©Œ »Â®˜4‰g È…‰›5áa!Ž×PízÓÎ\­ýs0WêT¾S_Ì͹¹ÓÃæ_¦ê€î!–¹í7Q,Í×ü˃Òq‹Ò†áöøWkQ%äCžád=ªW"¥YËÞÅÀ YÌÛŒ¦x³§“Xk COϾÓ;K/vÛµ àJµ›ðaøgÉ©sÐú*K%3¢y¦Ëi2t˜”‹¶ÓKÞ§XòºàAF¾9EiÌ=ÛØ4yæÌzN:•™/Ô®1?Oz2/WlØ®+VÇ™Ÿ×Ù*LKðŞͽá¸2ѱà¶pv¦ÌƒÒŒ½ðª¯;GâÉX¨Ë³îЃ:€„˜¨w|á§IßöçzQÉY|òüí…’$ÄØ.*~‘kaÿ‚­êjÞ{I$vÚÀ"8ó[£Mžf.§ƒ•考hÑÙH³oXº9´ÝÆF‰ñéò †s†'AÁ4õÉw‚;˜­›|]¿…«6A ·+|³ÏHŠ:C^b’RÝäövà³*†¦Ÿ Ͷ¨Y_Àá­¬°½G•Åiã2+ø°5ïüMí^‡7ÜX3/åêS*ê¸ÜØw¾õͶ¹Jp3À>í]­ Î$^Á*–ö  Aùg;êç#ù²;ŒÒ­ÅŸ¼>Xš†¸`¬€¢í* ·G1bHyCdåà"—^£Œ½B¬æü è_‹¢FÛÀ7ƒKòy”ýŠÕšá;-énv·øÇU.€¾ðŽÈ“‡Kö¿w…û´o÷K‰i{ú{¦›Áo"ÎÐÄ*KKK—ãÀ¹›þé­óU3lÆgæö¨Pn§EyV Ö<1¸Ø’€<äËP8ì¦LRY¡þ³óËo×öuvñšàˆ®Ö ˆv+BµFP¬A@¦rÖ;”ÅÇŠ{ÃäMÙ¶O(í*³ mKêwÑJž¿Ë;p š&×ÅçéÛk‹NE/"öíBŽñÂØ¡ñRùÎVŠ;Ÿ p‰Åœ?õ=Ù­ˆÇý¤‰ÿ'v/Èn¾ÅðÀD·)‹oX²I„S@N:B¿ÄÙ€5ª§žujiúIÁªQZ9/XZhAš£gŠÔj€rL±°¿™77ûÌÙtœ]¿ºè7о—|l’oÇŸ-{Òtì§[ô” ¥HCWÆt("½OS”I‰ÂŽëª»ÕØd“LÔί`ð(,IúϘ~û,äþ©A¡KBX®ûÍ HÓàK»Ç¸{qZÿIØ6°]a0>aŸ¿í"•ˆT•Fƒt©@ä‚ËvòëÔ@›i©úeB/bÓZ púRúì½RW†M&Pê`Þ1%O¿ñG=ÞÏi‡ƒVëvpZ°æ ¼Ö,âs•Íûm©å@¼êT6‰•‡‹{q)Vd4#ýê5¶Uo" 5Ü´‰Ú«_€VÖàz14Ê»³Fs ùÿ¾m§Æ39÷N*„Ñi?@…§‰§[˜ˆ·«9Ìé#ùcX({ʪ V4‘àûkÔéo€Ô-7nYò¼?)Dƒ1å^Úc|ëõˆa ð»‘p¥+H+çÛŠ)\7ã#\Li}­bAËþB }dqRßeÂK÷Å…î`æ Ìk»/N‚ g*rê¾™ L©˜!ØpIëþBë䜊QA…V2ĤžµÁ}E"þ:wQôôR¢º­Ù{øÔÑju‘·SY¢b ßéVmÌÆû¦h²õà'¸fku„Jö†N©ny_M9tvŒÚ7mžWÄ‚Û C$këR`ÒœS­ÒjþåÞÚ«¬µËoeéÖj•‹r›0!ÇBFCÉvTt•¦€jvNÝDõw#U.Ä!@p­¸L_G‚tkÀWÿ_ ‡ø±ÿ_å]¾©ËZKCRJ˜«E¶ÌTsÞ ÅrØfÍ>ù‰úuÿ:èˆîÑÞGå*_‹I·ŒäVwn=§"¬EjïzMÛ Iv²¸Ýò½AÒ²æW›šàÕ¤Ô¼ðn£àâö9ð‰ü±D& “Ç ½x°Ý£ 6àI8^ô«'# Ýlen?F³wÇÓ|{ÆxúD]ÿö8¤ìÜ9d¤ž@Äãç¯miëþ…¸µpó&Ìm~ª¿ýÿ Äfðê[Xc¤ÄõRÄÔy,š¯öžŒþåºõVåþa¹ãHtg¿nÃI%õŸg£ÄÞâFaˆÊÞªœ%‹SüQ&´0#6ÞೄY9†S…L÷Q±E Ðq€¹ÿjU ‚Jãóè8ª\tŸ(õÁÍ¡@íFïgwGJ¨Y¹¬çß>˜lPz÷c“Òpók¢REœf\smepb§š‰ûø˜X†hÞÞì%sHø›Yª<²3WÏ g;xÖį½³¬…ûd÷n%ëÖ9Å.ÒÖ$e*k°Âs ¬w‡˜GÿT|¤7…²4=D…ßf/0dY¯qn£½cÏܯ`üÈvdyòØ4€‘ºÿ>¼Ô‡Y¢†Æ†y‹T즆á0œ×)>f¤{îúnCk£Aïô¨K%³1l eoÄ"À‘É#©â:Œ{œ—"Q’ä˜=nˆý!—vâ2êªíœÑn}†‡H!v l(T²0}d ÓG!cÝ‘°icžÊVì¬÷ðÍa=pLß&GGhü§Kí]­|9¨]±]Á t°§nÑÏÄü•Å¢_UìÄLÉ¡§ûáË IÜ)i.1Ø·\ÐÀd—aŠ}2K#%ƒ>é ­ÅS?'ϰè+T]Áñ³¶s†»ƒ£ØàÈ7ƒF¨ã´\AÐ飴Ý™h_¦ùu:òb¦ S,œ«[JZ& ަÅdè}Ô=Gy9FÀ°¼Mu@%}I€âŸu0uBäÐÒ†a« “Ž<¤øÏÉžÿ;G‘BrœÔ8ì ÔÚù[o¨íä6%ùwóæªnôå@°ÍîÄdžÉ¯m¦ Ç{c]‹+Œ²0 0<DYá8ìv×þ§¤¤ ½Ù(Ú»eð/ÀŒA!ŽÑûïÞ‘ædœ¨ö¹~Ým§^¨’¬i®³€ÕSžÅ‚£íì¤æÞ•—ª?£„¯Î)_bŸw,„Eõ„¿Í›ï_·.v5–ý„ ú(®u0<ÇR]•Ï(½¿éU yž öIç:šˆ1D¼¾¨;ñGŒA§{T+è„ÉS€Ul|÷{…}âLg§OwZÖk ÉÏM°¾œ¢5ÏÛØþvén/rO+V!З—|A¼ØìîæTOÚϦ6Ï¡grzøX§«%'©ŸP2÷X„„o(ÒÛ„õŸ¹6+=”c½›{èQpz7úGŽeúŒJíŽ%n«z1¾)UVG©’„¿LV6D­r%Ë;ZîŒeþ¢LÜ9ž èS×Dƒ:îç 1P8èŒ@Ã:çfæ` ™|qµÎu5T¨–#éjÍ*»édŽÿ eiµ›=¾-q$~ °2É âʵܶ”Íìr´{냗:ÄÓt•Ž"Sª×"¦:~¬QžÛ¾ ‚…U¿Rò€–ý±¿ÓÝö¸@Åš±ñâ™ØÛý4¿ÙGOƦS±¬J2\ivr]¢CÈqXE‘–¢äA̘|òJ©$².Py‚Œ#Žãä¼ÜäD:–j je§ †{ ³ §Eχ kÚ¿î2ò ,ô­r7ñ޾ùJnBɰ4 ],¦/Ø‚M¢¾ÉNÙÄI៙(bJŸÖ\aS¡}=qíµÿh¿N¾%VRtÉá}4­<†ŠÖ‘ÌlÝgEH-Bª¶qR(:¹VZôpõ¤#ùO,C1˰‘•eÏæ~&³a¡÷Ð0>·’çœô¦ „±z~ò•h–š°A„ÑKŠJžË¾iÖ¥>|{,ŒW 46 ½yvKTV´7Žžþc Uµ¯¼¼Âï^•öæŸèZ°E4)ɉ'Eg¬f ùþnMʶYËLÿWî al„¢²0oaC¾”FT>`v‡ÝpÚ×>P¥0QP‰qZ>_tvÌ¥ˆv`Ã:œÆàÉÁµ2 J4ÌæÊ÷4Üõwá{†Ú¢Ì*,?˜ç›7˜YGvaøCÀ#r…¼¾1t7˜ÕïÁþŸû²¿r”Ðz5u2… ôÈ‘ÕR¢€àŒ£òWŸ.jônÐPÍ…h‚¶¦ÙÍ M©þÚú0‘R§õS’­²†ÂL”L¹¹”L“K»çö5Û°~q>»ßÛPØd‚q c›* ìÖ*h*W•ªOémû–oíÒ ¢ ý3K1as”"jŠE^†ðþ¸Ò&êÙòEÊo™“Fc$š™W¹^䯀'²)?u0Òj±í[ &^ÂJxd~ä¾`îT™ccæMì«?•Ó®& (è)vú0y™•Åò6=B¦N‚[˜­tI4»>´|\+v´‘?â>ó”§ý› ¶Ç¬¶ƒ—ßý–tªˆvòmºì´Û¿ß„þÎ4¦þiÜúûçì§5…守ݶ#ôL E¥ „µ0 9íöI#¢µn*ïJKezÁÁ›”É>aXí k\äÍ=39ï‘}CÈúePÛGx-•l0îtß>zhzéŸH¾ð¸ù:_Þ–I£ChÁ*+«'Å•Ê8ª! Å<")þ{3õ3I]Y°7—_]ÀÞ-‘ŸX?y±õ…97)(›²ï‡Î¶©˜k*ˆP€5…Ž`'Å’G#ë:õ“½ÈÒ-h-¢60Žƒ·SPQ8âQ;H)o ÍÒÆ·kN´ýC&ABQ¾À@+t&Çóàmc“z¿¶Ê^ΦpN&ú@¼4ôÙCëÒoÄJJ0«–¬¢ÌØ‘ë´N8ðRp5p¦þî‡é̪åýk·ÕKÇìžFâW[Np³G¡9‚­¦ôVRW²ŸdSR:1 &%("»ØFg 3ƒÕä’Ÿº—LëHS™´²6´ö¡`ŸC„Û,>f£/®Â¤ìòбS é…Ã\ت[6Hñ‚·¤lÛètœ>©ÔˆBí‚ø§Ü§ºBIÚ‰3l¾Iý:­òŒbÀ²…tÏä ¨rÍSr½oí$åÑB©û–‹Ç®ÒïsJ\ÅSËêéE=lrePrߌÓÒÏ9† ]ï·%bÒŒ f¥kÁ‚Vg¹øS]¥fSnÆ´²û'åñÛ)Gm?áÛÉjŠÞHÅXº¯“ôùu\EšgV")EÏBÍóÈ¢ÿ8®ÅÑnGôëäé(Úײ×&ãüž_ߊÓúǪ”š˜œ®ÆÄT×Ü$ä¥Pe«‹z´Ø¡6 |Éçf%—±;Ô%A‡_å©íFàjó­íª(´ v¿%§ÙÎ`<ïëùž.Érâ«ã½˜uŸváíj¨zsµîÀ,q¸„¸‘`Fs—‹Ÿt¼ÛÆØløtÒê+ãŸeçÄNë#ðNû!=ÂèQúàÒ{öi¬90"³ò.Q *ÛÏ/¡ìxŠ ð’ïA%…í]ðtS^d|°¸°rÓ…ËKȈ­9M³Yço‘»Õö‡›ž‚›gil©<Þc#•b€ÞV4‰=÷ ü#×ñ'^éÊç÷áïŠI•£¬–m0Ýϧ¼®q^~¥î¾n{?#j|ÔF5<‰ö0¢x <Ò"„+Ã$´+½Zþ­^vL%ÙxÂ"ˆ{C‰h^ K:ÑÐÉ›vSá àÕÿ2'0Ø– ‚ìÛ*ù#RâÞdÈ}Ƨ†æK¨+EuƒbŽ[ób|ÄéIëó“·fÔšAT2‰¤ò€È/l ÈÞ-H ÌÕ•ªâ€6Âs¤Z9œ8ï [V¨–¥yèˆ6N¨‹²9-E’ ðğŪ!HRZñµ*½Ÿ²î…bàÄ;¤x{Æëè ˜zíüBÿ0Q!84ƒãÒ;v{ÙæÓÎ2»EߢA*ƒë ©MºIã¹Q@¸±4XjÏ5Äo ƒHÚ}z욊+ñ;nuÖ¸-Šr,ŸÈ‹¹îGé]‡"Ñrd®¬<øiy)xŒԌܜ–ùê’Ÿ—þˆ×lÉ ×?^º†°OGIÿdªýÇ+@³Öð]7žÖ*Ϯ՚ðïIàX«|(žÛ¼H`ØK³¶1(ÿ^¾W½ŸåbxŒ#B 1©±qt’ßÞºKdºÎ=FRú”ðÿ*˜›sþ°¥N}9O‚%cL¤…€× Ńa+Ë(L}ĵ–H©å\¡ 5#¬ MÍÅaårT˜ KÍ Û½]33‹·‡eC¡ò(óG\9¼ôQ¢S_œU£¬*˜- =—ǪÌÒ1¬§lýÿP±ZµçábE¸O±æçŽÑöC¤,Jrn9ïvrGC›ÿf¨X…-Z epØ£Ì{}¯èWÑ ÊYwàæi=ÄÞúJ^„ø]O"\KÕƒ .¼ëÍúvdük)RÜ6þ@ xúJ«"g¼Ú—¼0â¯: s…Û2fœÈÏ]›?Ì)ta)]줖:h%7î–9 ™_fÉ€ŒNr¦ç@ãÊ&0Û½7´èj5-³ß5ôµ$Ud†·ÿSÙÛ"瀒ëR#P[ÍŒ£µåOøPo±EAvÊþ¸$ã¶kï?°ÿ ¹­ðX¹›lQ‘VîŽVFEñMìX™~ÎJU*×at©ÝGó*šz÷\“(†Î¾Ç ƒ²Äw"í57¼5´° µ&–=À¯°T Íyÿ6ÞÅXZ^Oî« „RƒX0¨Mä¾(x V7Ó/3‹˜ÞÝB6%HUÁ[š+ˆ÷‹y5vg%ʪݘ=la?ØGŒ©c­<‘H ?)·*?:®B‡²¹ ÿ#öAËvÈÙ8:M^4þN VI £Ÿ‚zéÔí{[T#~ä6º: …"Z¼áSò#/ß8» 6=l‡¸‰ÆóÎ#ÛT´®¶sïP>6H‚~dú —ñ!N±b9ã@û ,¾Ö~ú[9ldÙ݉”]˦²¯ø©8B¥^w=uʦVH/ýH ŒÄÙDsÛ–·ô ™š{s¢Û‡oA™(I1èb¯þãy!˜'‡T ÉÄl©­1q뫜ðq×AÙuùgà2p_ [K7Þw—˜&–ꇸ˜Ú>d1¶™ÊÔ… ‚I²d{øÊ-R÷#ú$>2U¿¦¡ˆ™dÅKí;KµÚ¿íL8½èX«f#ÆBÁ¤£¢‹šÂ/=b,¿KÅýR=/'°.”}¥4Ÿ™¦UˆÇ*CšD$0JÎõŒ’Ÿ7üRãZtÆ~è†T“"àŽ-œøpbƾtαžž`ÈR¯Õ½qî2­›K¹Ú€Ÿ®1¾âX¥žÙ¬fwÌ_Ш<fìáõËdبêP´ô¹põ.AgWy¾Bêx„Ñ#Öðíýè¶‘‡ÃFeRÎôKๆY´§±vseÔ‰^‚}8möÝ”G££]NªC.F,v^VžD‡¾Ó<ön8‹kD?¨6mæù<ô×ò»ÄZ­,_jÞ¥-7–|jÎ ”“œ5\îÁã³c˲b¬/î øÞg¨=¡µ1™Y¼•½ O­KË®SÊ<‰½½!ðÝoäX{E#”Òqf"èí·ÔÝGÈÑ|³…¡¨+σfÓ3Êq2A{±ñAŒ¢=‹}sw[É]£¼ç ˜”ôažPm;iж®jG¿¾•Ƶh ƒ/—Š ¼g^%þß%E÷ÒF³<àªÅSË-½[E~P¯£÷dñqÓ =²õ7zxBÏôtâF†¥nT3o:hòsƒf/îÕM³à9–ùXÇX®‰‹IdíëŸC/¶eññs |fµßû*¨uû+ÛЮ®Ú·Î;–V€Ä5Sz§QÞqº®h1¬­ªOZõÍN®xK}?"²ê.qÒâ'AÓl1£D3“ëµ74 æêéÖæ€“WÁ놫¶¬ý;nª‰^‰ñ“ï÷w …ÄV ­œ1é»ÀW_MÚ9¯D\Ûï¿Ý£5Â^ècvKª&# S#Xö^Šön­†[gšè_H,^\é¨Í{Õ#[®> ©çʳç‚1š½‡(Eíh„bdéû7ßÔƒæÕ‘®sj\¡ÄTš¶ ÿt0xGRÜ$Jßëçñãíé¸ fm’š´hM·,ÕÿfKù ‚›Ðn–ê-/&d>\õ22}F‡I@uvŒÔö¾øÖ’¸å·p¬þÝ_M§¤¥hR2–eE¸š[9®€Í^ <x¶FP –Ñ$0;mãºe* iâïm–ž‚´ ¸ý&P4ëÊZDg«æãç/Àa4•Ùñô<3먯×R2Œ#ì…o§ …j&Ðþ¨H»ˆJ;jÌ‚p4ýʲ\3»þå]tµ,®Ê4DD†Žh6ô§ËæöA~N @«gŒw3Ús²%¦Ÿÿ]@ze1h^”VåÈ<Íx‚Žý¡²Ã°Œ7öå¢[¿ö¨:«¸Ù ÿ Úòƒž¬Ò­Í=âÆr¶! ¨ï@óƒ1"ßgl ùv:ÑÜw#\óÜ<Ço„ŽQ¹±šIðí,Ç6Ã`I=ýñ£u~µOtkq\eJUáš²“ìp8è&g/§è#œëÓeýï 2RÑ}÷ˆ.5ìÜC¼ºãvëb% †‘É™¶2ÌLU5¦5UÖÌS~þO÷xK½ÃlÜ R¥u-²á ÝÆw×?P¢ç(ᦼXGQu;°§—ü°‚Ö¥” éç¡Ù’þúÔ‡°zÅX!烙êt„©ë!}5Y½“š®Ë,®ÂÞV~ºe8æôM—Z)PaAüÆ“PZ‹­ä9#™¡åÛTŽ€îÚÓðûƒÒ1ÜŸ«ÉÏ?j¼A˜„$&g寖®Æëùw"ÚîÙº™Ì½0SÃnê…XŠ:ʰmi ÄDÉ»^Øyr‰îÇíCX.bàVÝoÕiæõ"Ȱ2ã"em1ÓG¸J©Å'Ú«µ'„BGù‡¾…ðˆKD}—Õ§w $w><·©äÚ‹“†±ÍåíTü«¥ô}¸\Π–*Xš‚%·KÿBºòRÖå/Ïmð׈ræ¤ÉlMJö¶æ"úEÞ³ 3\BNÁJ'B³éÃİ´ÄN?(~ÙQ·.QÞ)ËŠ° LÀØêÇ"S\3àÓ^•Ë8!à «F°B^,:CÖÖ[cÍf|°;Îw?²Ä¹æVGy»‘W·§œÓq«TΨ<±¶©|›U#¾…2c /'x4Sïøòì–ã‡;“Ï0Uh )a€™kaM ‚]ro 02¼§N…ƒÞ‚êê¬*)]«öùA- ¼ÇWï¹ÏpèŠN¡÷3Ç*”à!s¿ä_Ï7oíçhœÒùîðòúþ–8>Ÿ(“¶·uÔX=V‘… e‘LEëš ±MdÈN)ÿp{OÞø††›Ê=Äþõ*b_!LÎêè]à°V–­òÎ6î—'hÛŽÒ+0±¹£ê ðì4xêr$Pž ›Í9 ³Aþ±ÑŸ”~Ò -«½LÝÀÓ?aÒRe!âúÒq³ÒÛxz^§kÂ"l¬—žóŽBÆ ú? á¸mrüævèo(`‰£Wô·2Aô]g¡ƒ&_¥@Å(çjà)Gp$é9Âó3tXDd|®\'v€@¥¹Éü¶T´"z"?ùkÌßϬôÒöñE]âªÀê+…r EûÆÇáå]Q¿åù”|V¼¾Á ¤íÞ;;nº¥‰‹ið_A[s"Zómwé$¾'þÂÙN žáá°C‘œ‡‡~îÜ»bÆD¹3wø[ßäHúUûGšÁÏV»vöCâ¹Q¸ŒWÕ# ÷B ¶½*™±mr)z—/ZbdÑyUþU§&¦v(ÐNª¸’dž ÛGµ ±X‰ös*"yXÐ*åà ¤ x“÷'ØÛ~޼ü.”öÚUºeE軪¡lSãBÍÅò6ÏÁäþ<_áN’«vŸº[£×µíý©ÂZ‚ÿD7 |¨Ï^VpÕj¦K}áh‰,8®·Ë_K2~ n2U¥¬ÑU© êj©~b‡ˆ›÷»hjø§c ãKÙórîlœÿWAG¸Ú~ kÍ_U X…ê T-[ JÑêé60N} â[^‡ú»ó#¾»S›^ðкÏJ—ÿy ü+=õ79W´D~p„!8Þä1Ùù{fÊt=­î*Rzo¥¯ÑÐuACqÎwU©ÔîYôÁšaP¾6ÿ…>Ù& ßyêð[_ôÒGº7³¶û‚«‘I¦Ö=¤€ö2h-á|•kM¦ Vþkli^„Rú#n»#çó+=7ñQ¼{% Ô[Lȇ]T¼#Ù,È3·7¾øxè!âŽ,7Â~¹…¹ê ™½qO f€º`£r!häQëÇ…‘ï-ÌNm¾ÞhÞušq–4AæIï¢HÍ)þcךIÓuÔCÇÚ'ïe»²¹ˆÁ¥Ò#(óœ3´ÿ„^EkP)_"s½†ô~¬¤ªòyÙY \>Èšskß¢Ê A5¶(™koƒ6ÿvÜù¾€aEàãmºutÀT"&ÄÕ/¶¯n­Ñ"` e¦9L«Í÷B>õD»^h”«GRLZÖ)‚¿¤jÎ.s >6gó²Ö³…ê†4¶+ö(ðLkSé'bhùŠôõF_.aøj/ˆR¼Ê÷ï×ÖµmæÖà}É ;߯aDN=€,Ç3AÚáÒÍwˆoÛŠïñ­sµhÆ‹D’¦PM víÒ³°·R(8“î= ²misDmtÿX³#x› K“-ù=eÐKŒ¶1H$TŸWF÷¾|Dïx;ÌÑuh™0’ÉÇBŽ?gÌ­×Nâ0u„õ²0Çï_ãXy ‰zþù鉩9?œ ‹uØ$á•cŠ:Ï¡ !Ž[b²2Ï\]jÕUØsLsK÷ÆÿZà]wúw·jØþÓÜ}Ì}£=¨«»”V¨¾,…×å[™$cŸ¬Çbà4ñ¦,{Ùƒq“~›Ñ3Bó‚£1¤{Ñ÷ý•©°)&—ù–ŒÁéçû,‚?EbáG‡’Oðµ\¬ÝgEó,溣‰ª1~¥'Ó¬@`z¤0(ºÃÕü ½ÂóªÁ–ùÖˆ‹TN}°æÒ´¾AW<ôÌ2è9)øŸ¶´4UèlÁð$o¤ÖK`EÕÍ}y`’ƒOÐ{i{%oäŠ]£:ð·•K½õW'DÓ» ã-+¤ÐB[þÕa"F9éËøW.Îuß—F|<9Ä v’ë|;å*˜£sz‹Eñ²jsAŽD)| ZÓg‹d¾ßˆ•ì{ðy ŸŸ¼> ÈJΊŒz1Ïþ_Ä>f¬†í@äk= BuBÍfßN®è/‘-Ñz; 2g Ü'”Œ¯1¤CÞ}é~v^.ï0vÑþvŒË-~¦¥ñÑû9j1¹ël|¹\"·mS!ø§Ë¢ƒ…‚—]œÙáwuOd¨Q+TO»”H%5ç"•@ìf[ŸÊ~QúÚ§ºQ‘ Aq“æÌÀŒ´õ[„f4¯œoX*nºG‚o@d($˜ÕÑ9[Â&ßÔtcgTWOöæè¯¡º«úžüÙjäUqÖ ŒÿdÎô¸ìÅTË,?7V×ãK†Ê§X ÄTÑ}*‘ØMžlºEW{lw‚µ6{ã [FùÐ&ãÑÅáíõRp ¹ð&W´êà6ÃÇâ~ú窩@MƒLjâ:¿­$k&œýNKÍ¢99ËÕû*ö„‚¼}dT¾€Á‹“XšPn[] t¥E†c×âáàÖex{ñÊ-ø=ŸÊ}ÿ0t„&ÀS-îkž0·ø<Þ»~ÃÆû¿…µR= ¥ÛÕ‰{&iúÈÄe‚óqnÅŠfùò@[?®Ñ{ê ÆŽ•<ÒûÊÜÖ¹×UJÀ4Òj鉤êE¹„ËúÊø[8X æ C.Iû_Ê¢3¤6û•Ÿ3˪uzöÕ:MqeÔ`@Á¶\x¸ë7¤1”Ðvv2Mk&ßB„˜o¾Ö+tu|T™ŠŒûäð²ì-“{2ÊLûû™RWŠù­:x«”‡Ñ‘]ŽûI¼ã1«`=å5UG»»©fCä$Ïþ÷›pTu{2¿>AÆ„2×ÿƒ[™þ|Eð£IÝï¾î!½¼2 Á]‚­Y¾Œ»[úƒ¸¸4CG°‹¾Øuo|ß–D8f›X«Ò窟Uç1‘“jŒ©çö°°ŒÒZZÖX †üç1Ô©@á½~QXÔù@¼Ê¿ÿu=ñ±ÑÙ›ö“I–è6ÙÔ¨T‹I­_ÂCÕV¯cb@Ÿãš'ŠéM÷Ò¿6˜°ÂÍ •ŽÃÓZ¡Ñ}¸X2þ‘Éúu«a¬nKÉfm§?¡ôcô±A\ÊŒà;¬ ãûCéqÈQ*^†ƒ®A6âý!ÓV‰f ¬ÅÁ§„`9÷øÑt-ÊbdñÇ««Çgß6.%Ä20³¥a‡Ûvûܼ|„NMƒÛ(¤jNIÂÙäã`¬½´–/`–êFScJCs9ã èê¬mh)‘i¾©J„07‹i´É«`·b½Z s/ÑFÀ«^~N§0³˜÷h…JqÓ˜#:/ò†(Ø>§ƒt+ø·?Ù”ËìŽçEœ4õi2¶Õ¾&!^CFÒ‹/B85Vc,gì? çŠöP¹\B« u…ݲœ'~C™1·Ùv="a:x9PT«o¤ÀÛw[ƒ!þŧA úÒ X .aÕúMÈVÍ#r&Æ•¬|XiÒC›]Ê ¦l>ü}ß::·O8Dƒ%NÓŠõ» _ @iv²Ï¾4÷"”õjRb:Ï‹ï_3&ÍE-ÔåöyAÑùð-DÝ {Õ=½C‰ê ùz×åÃIF;ÝŽÜÁÑ;ì6œ’/THo<úÏSÜL¯‹§o¯MX]À8>Y5o6%æÒ‘¼,­®¯Õ‚wa{O S18ÿ=r–á±ìq7:™5×%RÉGPãdZÔ~µEòmzëxp~ùˆÈSì@°!}€’_¶a˜¯ÐcÜêÕi›•̘5ù¼£áD¤p2ó$p¡Èþ.¢[[  )˜íã¾këG­]ŠÔW—içoéª|©µ¤3¢( h<—Ó¢9Æö´sÆW‰˜vRÉ’¶çy——‚凄ªùK4 K ÎpË%‰ bª8ÿ.?‘c5å°˾ ùâ,/¬;IƒX•!Žìú­Ÿ—Á†‚ûˆŒ˜O‰=©Vžë¿ny¾+¹U÷S…öZüúSéåy¿*)rRw¦é”…·· 2ogúô¯Zf›rö  F!p@?TÏlwüÒçC_å‘Ò @/( ,‡¼´QN*mªhE4'¹‘ž?œ§¾rõ×Z Ù¨~þòÌ]ûÀè4¤¿õäSª{VMDŠC@¦‚ÈØ¢ˆÄ_RõÃb¾&Üy'v zEä´vO ÇŸ;¥iyí¢ó9&&5My"µ õPÇ%WÌ?Ó†‡¯§$WQMfn­xåBÿrä/[-äæa¶–H aßÎî´¤ÜaZ–&û8œ<ã,ö`ø•ÇqÑË ÇQ–örqJú,³++Þ½;­ü÷_Ÿ»{»Â!#¾#†pާ@oA±T8¾D³ÎQ ¤«®?$ÛOHÈ9î´L.°e!ÈX õî{Õc›™X!{Q©Ê}Ù,ä?úmPo#Ê*åšÚej'Ë\ÔÑCÚ˘@Š\9ìéÛ……½?¤~Æ"ÿ*‡›¤úí½fe"”`ݨÀÁ‹_¬&Þ øBÔxãךÃ_F|"~¶înÉ÷¢"aÕç—Èì(ÇÙ³?†àru^ælÄø}sp†ÍP°YºaļìgrÙݼy6 gzdz²úïlH’—™SÈ bÒÈæ‹¨\ï'ä—¯÷¼"†b$|ùnâ€LѺÁõäàŽW€0ÛZ{rüóî··Zˆ¯s á=¹ö1Òæéû¹Ø6¥ùŒ‚U)z´,y¨½ýºg§ӢyR² µiD&.B¥È,Èöóù/¯I‚ü]í©¤ý !÷]4B±›}T]šmã®ÏE\Ï h/1òÙÉUçÛPTY†é¿/Ùöm¥¯v Ç.ÅËA~©æÀ!™ ÿG„Ps[‰S÷ HàÀúïVã€~ü!­X¹€0û˜~Ò‚5ÚªK ‡!•nÄ£ü«Gõ•°®(}?z¹0>}ëŠôå>ßG¦`]ÂWÔF ©VG©« Ê¿ “q*ïÖFó@5lðFoö¦v Š­ñò̧ ûG 8µ˜¸Ñmÿ'ž&'y@{ïÁ£Îœ2á®P·ü$ ?Æ`åæ[©ð°±¥½> ß7V"ksõ8¾|ÑÌlû#<§F/lOÛ1¤mZˆUÙlÖàz¬`:!ç£kÍë Ä%7 ,ƤË:!ê¯)°rÁ^éBn½\ºÙ*}ý î*ÈånSDdÆŠ·wÏØÁÅ Ç(2,~Û^«ÿ *º ä2D×Ë,hq¼q/óà"žYY))­_¥„¸Øu½t k¨Ê Ä­Á¥áø‡¨3¬"Ç»ÜHP׃CÐ%XÈæ¦ª¸n‹ª!Ø4¨m`Re’·a`ì±ÓV%žæ|/ƒ‰ÐÓ ÎKÉñ½:؃±Äï4n'e1šHl²M5rŠ 7p1ÚΗï«úh‡Ù@'¯ô»“ߺ›…]þnç1ŒüÑR’âyÞ±êð€›ýæ>!ñ¤×$åDâ âïóe¦fikÈq1õB¸‚ÀK¯£Yñ‚¢s`ñq®NÊ—m®mŠëq?FjY·±‚N«\0ñ]×|„º qK Äá^VdF£}³m_$TX|– ÿfþV°ÎñAÀ¹9«SZÓ-¯p¾ôÞìvjmÕºÑÜLBÝ4‘0›ý£üœ?ô•"Vsh“ç–zO1RA²[ÿtP®æ¯q!0²ÖsM¥W¦¯°ŸÕ0YyGËõ¬†ç¿÷ÔkçÞdßBcmØU—bÌ£lb1ãæøúèÝ\tc?ÚÌîÅAŸ{hî0»yÀ2¹mZV1äPµÖ-˜v²§:<{à’E+þµukä1êL‡ ‡aw[¸”PÜyûØUðPX/üà…‡ˆ]–ÔÕ´hâp ×^y!ú5@¹¥î1iEÜă¶Óã¬PœPœ/`{<ûL*Kí#0ôºbGOkåB9ª©7ê$ ‹É7ÈÈy²¥yžÀz)Ò ¹Ì!Ó$ì¶q°c5…ç…j”êZ÷œ»LŒJÿ*¥äý{×}´ò{L«¼gQâhùy£*ci™¯Ïº¿²ãšôä“kÙ†Œ?*ÎUe†Ëš‰ÙÞ·ëï„Њ‘` dÀ”’/GpÖmu,k«ÑQ@¸lTÙ˜¿ðbwè×ò8®¯Õc'SLO¦·øé‹¨W™©òœí+)4¨eÂO`ºâ5¹Û£ekɺ¯ÍÙ±õ¯£^Æg®¼%õÌÎ6ŸÜ_¿ÊE4-CbÑ_Åì–@™‚ùñÖ8ÄõÀX¸DOìv~·EÙïky7IéVγà€ËRvû3õÚ™…I‚ÝØâk½!3:mðɵ_-ËD{Áœ™sž½|D5çA X[øÌ×󺋲×Å9•û½©ëvW4»ïaÊ\$ɽ²I¹øú*rŽ¢»Ø²Ã²öúØ8t³´]ïJµ\XSqŠ“ö‚Š:qÛ}wl¦ëã‘—4kOTJµáÈ!å»ïÂõQÕ•<š;£þ£w†é•OäsjN:~¤ï8RæOÐ/Ây÷zÐýñkvÁ•2É¡uìÛuKqŸ?€b¶6ˆ)ö±ŽG )†P-”ðõÝäœÅ ¶LXð´O¶D¨/ Õ\8 aÔˆÕç}MÊÿ0QhúQ®¥Ñ¢ûÖÚL9D=íénªL3eRÒéä°ñMNlÈÜ?û^îÁá}Êx:ßÍg°ÐF›+å…%A;þC ð¥GÇÎÇÑ!·\s"Yͺ7í¿=“$ß/Èz>.ÈTÕaŠõÐÆ€VÈø³nñjÕÓêÉ ûuàÍGBÞh…£O.ˆq »)üín6\^ªê²'3 ÚrQÐ?6PÍn& êCè&këGkž~Ès%”xŒ<òü˜ux¬\Í4JÛhӚĵËOè0‰‚áz!.! yfaGvûfé-ÑC±eÚ›·ÍHî0_ŸphRqU–‰+Ö@WZïL‘’Ù1‹ôþûyЗ'gÅZ ¦ô>„£þm**$Bƒ†öðÊÊ$ˆ‰Õ¾ ¬N¹ÒÓ¼ÏHÊ[I‚‹§ÅbÙåQƒšã¸ßé« —Ì<çT=z]ó`0È»¤Ó16¿†eÄeBðU‘M¼­Änô=~‚hC¸öË4ùõ1ïªK ?Yy•vCÈÍgÿ0·>Û?-\åè鉕Ðdfõv,6g-T¸3µ¼½iRYIÉ™z)~¯XŸ``X—‹ýU“OÃ㔜î ãt“Ì_\™„Ö¡"ÈHSÚ ¬ ¥æŸËáy”åYÖöK'·Í{C~½6}F¯:¿¼î€ë}¾*¾,ES™¯°1-0H LÁ“6ÛØc n7ت=GÜ÷è§î²'0ÂS¤iv¨ ‚ v öë†CGôT–í/uéf¿µ÷âh'DXƒà ÿ €AÏñîÃôDÕ²a w #=·v÷`‰!h.‰çöŸ“¾ö߬ ðÍ¡>¸<ÍÒ;K~¢~*#¼{>Ñ{£@‹ô·Á©ô=¯éÛÙ¡ïÐ hŒë¡È¶Ò"åMÄ>Y£Î§tiGÛ2˜Ù*›aeE—cL5;*ól-²"¶ÌHk Ë€eŒ+6)#¿¬xL£Ìz¼üõ:eMØýV}€Ï›äOÆÀ›Ò/²p8 ¢aœZ1¤n| 7ŒÒŒôÒ`¬±Ê.0r¢0Àä0Å<ÊÒßž«´0@"®Fê!âIhVÝ!Vø–lLmââ’NšŽ-BÉ¥“»´‘cBñÔƒ`uôßò+m& ²‹ë^þÿ<øÛûAüL,`8[· 0µÒÒÕŽ†Á¸Yƒù %E„VfÓ[Í…zç4¶&ºÁdRx÷ؘi¦ãov?­X)¬@t*×MhÙubªŽ*¾­`ò¢aɲàßË;8næÀš®bŠóÑg¢tæJ¨éÙ9ó©—D Ш|d=NÍLDW9[ãõ¹SØœÂbYhПfYñçÌðÐöîè ¼œÔ wk*‰ú™²TaÎSKÀÿK™+ùy:Êpã»rä@ßÈ>y—5ñ>¡?ÿ- “×*†Æ?Ö)ÏYæòЏC£øÒ–RÑ–ª©DáúcÄ"e¨,c©¬ ÔÞ±–üÇÀÒ<œOSìGÊ[ W™§¿ ãØP©áíñYãê9»%Ýæ—ñ¤‹öôúæ»2ØRʈ«³ÚRÖ±ù´ráSÌ¡†i¨óýŽ:dû…ˆ¦©Ñïß°ÿ ÃŒ7=6.TÀ-Q$¥€Û6O¬"iô$xœ¿¦Ç¼%x?ö DÚ&^#••”JC' ˜ìRÙ&³"-…9\o£Ÿ‚ ‘gÄE-¹ÁT»Écp%¯!Vr¢'íïÒ…TŸLmc2°pËbdV"/ òu>ìÌÎ+²½ˆ«ÀìPóúhŸO»èf7 5.{™,„Êtü¸Uªzo¿ÑžPÎÉÔû@8òIhXÌ>q—>9Ð%zÃâkC©nHµ®ñkZØÝód¯8à2.ÊׄK$£dÀF&||ÉÓë×qÁ\3ßèê:u»HÇ>J(æø$P–ÁMØ»ùg¡ø°-é¤pànÚ3ØÈó¢FÁx/Ù®;lÞPµ L…çP‚¦†Ò³¾¦©"࿬ j‚ «¦KÓU:Ú;®ç[ÇQ=œÁñ}2ÜŒ,™“‰AõbªŠ—3)†Dnß:Whóróûò›~4ÓJØ> ×cæXsÄ*–ÑfÓ›{Ð¥LÀkiaäÊ>Ì7ëfe„üt_—æScA ™Ò!Ž"˜ë&/ƒ· ÛzìH49—Œ¿ñý^vsB(äôÇìžr®-T®X˜©å/®©ñJÞ¦a,Œ(Ÿö¯Cù¹d[ŒÐ\[è—ŸYO®áºâ`<ëu=¥¸%ëv‹o0¸!{_ºw¡€sÉ&¼ü"SmÊ;ÍBëÉÄšàø×ÈjÖŒíH¿û(‰ølÇ6ÿu^6Fùׯc*W2ÆÁOÚ5H…²=u2…Á§µPý‹EE%/ƒO™k©l„È´ƒ^©ÈŽíÆ™[iÉöò6«½ a÷C"Ç‘  ‚þÕ]ìÃ`NN}í/“Ô;·ž Ä´Èöe¼uiùL–ôkêýNU¼¡ù‹¯ úà•­.E—J‚µh~F˜r÷ò0š×žuŽéo¤¶S)›5z+[öÕ>ôJrïÑJ1çÁߤwi'jñ+´’ex‡tN›Ž€jŽ+·q6Óéò¦˜æm«»+öÆ9€¡žp³‘øÐ: @PgH…e®b£3ègt¿ÌÁ¹®†ô÷L¹›ÚƒÞ]Pâ´¼'gÔ+àì+À=2²¸ë’òÏùÊ¢‹;–ˆö~ÄE(÷Ðê"»‘9¦Äaѹ‰Ò¿d”tÕ¹9䣾ìaîÆÀM}Ü|IŸì½Æ#(P:Rüª0iß÷<ùºv=H¯>‘VOØÙ09Å+–ʉRKO õJ Pë6ÕqS¤N½ø®Ðy«jýS ·¯9VßâÃ^95p{P£× ûÞFòû‘>щÿ™‡­"?#´èN¦;'‡ªlN±F«X©x/|6ÝßšüÊ-ªñë ïî|;üXr#ÂRšõ6&|Œ$KΤò¹Øð¸±ÔkIƱ^zï÷«^ Š# ²=¿½ãaçyWB1Áü¤S~ábù¬/µyÔÊR§Õ´ø3bóT§ò&”B=³'Á*!¬Ä• ­âPdsl°bq#÷uûã}å 8Ém«‚-/6 Ç AMìÀGë¢@Ÿ?@wx$Èh#QDŒž° §Õ¼ÎÀé–kG )4Ú1’¬Y•±xgéÇÕ9OX %Ë<¤A¼õ°h,âÏe/B\’t!|¶€ E¥*g¼TÑþ^[cà­üÔyÓȿɀ£ ,e:‹ÿ/p÷°VãÊ/íÑk8>«=—¾œuýÇŠ¶Ó\Ä ouÕu`ïIn‰‰’{Ïöb€Š0@3ÑŽ=US8Û–ƒ­ÅíY0 ~5RÌø¿è]¡•€&C•‘M38k„!¼`÷€½îÙÓ ·ºAÛ¶²Œ|B8¨•-}QOøº96MF¡Ì0š½hë­«î«ñÍéd§L‹Õ–«:”?z >ç¹ÎNÓÐ I“•—‘ý¸ð+Qv{äÿe°ä*µ<1Oœ;îy®RS•"ñ«´]”•={¶Rè[ÑÛË”Ÿ–Ü4«¡O 1‚8-Iò¿¶7h³q:ÝŸK8_ô Ežû‡Þ&›×Â#SЬE“b‰VRàJÙ™{Ó‰üí±ôœ>¼@à*9»XíýÚOýOGÞîºÇ\ñ{Áxùý˜þº9àom¶6İÕÞyì‡ cd€GÚ®&na˜™ŠXSù›#ô_ö©R:BÕ„ù\ñÂ4%),"ÚÔ¼‘BhÔÕyuô—ÉÞ6³šºØ„GñÁ0UxÏ`²ÍDÜ#n,@2°"Ó¬îðÁÍ½Žˆ™a)ø&L»,|)wK2~ñ¦· ”ÓT(5Ù¾EIzýÌHïÒì5ÈÏÑx’âL?÷6ŒÜ’•ó¿÷.mPÏ1f¼\ŸÜU)'0)ð¹5Sd1F3Ȱ‚ê¾ k¾¨ùCb—Î^¹Oš¶§²¦\ÃZIkô•¬[ý:Üq£61*ïÊv±ÝKL‘¡KíSz\þ x& ÍE à_ê.±i ¦=_H"K þÌ.ÝCÀ8Æmqã.ƒX/¾#OFO‹l–¬P±4$a`ŠN!))´úä}ʶ.‘¯?˜Ÿ64ïåªÕ¼«ˆN‘ð×ÎvëþUƒ,€:×ýìW»š™-n_62¾Í_mWÍ$t>sÌ,]×ëÐÞÛãmû·{Ô„<%E\·P9$¢:‘¾!¢{;ˆØÉ ½MH›Œ)ÿWÖL“râSÓÏØÂCÑE.ÅTFÚ}Ïêç„ñ“³QQ NBý‡ó§qÕP›üŸ¢v¼˜¯t{kŸêDr²W (±œ‚Zœ±ÆäÛëÝ®¹.j_VoB~AÖÞßÈ3ÜBPÔ³av²x:é¡¢/]*׋ñú¯þá}äÊÐ.Çq/ꥫ5é8pè òÈ^­vß쉪ý6%{-â£aÌâ–&…<·¿xâì@ξÒJýaƒÊaë‰3ƒç\Ï¥Ï#?½IñE.Ö7%ØBzǬÜ%µ±çl8|§{k¹|ø–—b؆ÈŠfÜ“ßm–LdéGl= ºÈk0¹Ê¹©ÈÀiL’Ê hЃ¸D_2¤(£ï·þãdä^õ[Æ;6LàÏâÃÔÒkÀ—ó²ô"U Óµoì)&& d‹1ƒÎ=äÑ ÔØ'ÂGP«7²slµ"ë⃠2V]ž³¦ŸQ+XíJt+¸lÝóô‰õyvVEæ|Òcö·\£„A°ùêèÛóç›6ä Ï:/檘N¢ã 2swh¯ÅÆÇÉYU™?º®ž—ÞÙQIèô c[€´‘º1°Å{ ÏVÖa ³v1­ë>‹MqWZÅœpÒlÔÞ5èŽû ÔK°*Åü}Ú¼ ¸E²,(C!‡,8Ú¯¼¥eøPÝgHÀÃEźG¢«/Ö±ˆ ÒŸ’9/Ñ£¡@:ªyÊñš˜‘ã BµçJ=¤ÖçQÊéÚG|n7?BëfjÚg¾F8p'V·ƒ–ÝÏ›±[Þ° ÈÖù¡–ñ¾Ê»Æ´Çi®LQøõù´QÊ#4±K¹uhw¼Þ»ËJkŽ=¡(^Ô§BK㘽P&Fûí•Ø?w°uBpg©¹Ê‘ìÍÁ¢Â½[ Òƒ,ÃT„F7PP±mé¤×· ¿M£y"ˆækÇ-+°±«VY‚†âöá,•lÁ€’æœc!#"Õ9jY0ÕMh3Œi}ˆ«ÊcÞÒxvécà%èÅÌXöƒÉ†kS%—D¿Äùs+ºzÀîý[IÕöȯx»¹Ë}²Qú¿¥uá7;Ëì#1±ã ®dSC ’w[<Éác$î»hÛ¨©qÓ ¡Ê5Ù<ã÷v'uŽÇ3L(^é“A1’râ'ö‘ô%$ÀIµàÌ8$Æ,<}GŒà<%¨¬Š Ƕ»ÙÅ×±‰-$jsÈï »síî§Ÿ£VNñiÅ•`Òÿ}å)SœÕl;ÔÏvè¾6|)°(£nó7aüµ³Žƒ˜ÐŒ…}œ$\¿kU"Ò–« SÑVȸ&*µ…»œ}°#É?“Uôûƒ»]º¨oõ»Ø¾†ÀØ»PÆIÅ-€´ýÉÆÖ„ xÊ/¿“¬l2oc80븫‰!.u<@.:JÍ»}‚¾¥«|Íeq»½¤ñVçÆ¦ÍSµ ‚vW×Ã2nžÑ®å´¹Î*Ð9¹¢"9¶ÒM:xxì!/>U«í}EðÙb@æk6¶ˆŸB·ä­`œÞ¸qÌYW0ý Ÿï+$’Æh†Å·¢Œb³‰¿¢ãS4 Ôv6ÓQâo¤‚Ðyëpdù”¹7ˆ³Õƒƒˆ+}ô•tRQñÖƒñ¾9—FÌÁ/|s²t… ,ßd8óU¿nÃÌYÒ&Çä·á7©[ ‚õÆ‚ððå³xŠ^°ÀQŠ»“9gßQµZA]Mð3ÁªÕæ9Òݼf@"V‹k·ñ'€“D¿ìRÌSNHo™w>’f‹äòŠCÇ꦳A¬ÅlÄY!å›È½¼fxeþ›WbbghÉbHq¢"ÿpIùAeÉÚ´¥À‘»²AK{g›FœÛ~ÜÀjÈÚ1€ÃDõ š_lž©4[Gdä™ úÈ€â,µž…u½lþéAhÇÎ꜒aCמKw®päœ ©Ћj|™½'a¼úöÍu"Ól4™Næ;š¡|µt F‡›am>…áX{Þ-Á´jdJ9tüäÜù©Ï0_¹5‘*Nr¯óeP½ºUÅàcŸ(iÿF³J«Î@TŽv*[ÄD]W1-¡ÚÖ &©&Ÿµ C¹óÆ&ÄЪñŒ-¢Q Öb…”@Ì]çl\÷:^hÏÜýÝæP°Ä C\cu/‰\"#­©<ÿ_¶¨Ú6¸Ú[Ôc¢.<^Ox¦É“y!¼J·JÝZ I|·ùY€–‹³ – büîÔ0¬)K0o·ï„çUZgÀ2žEÙ°/Ë®R²k÷Âxë?Ør‡!†%›3”[3‘x˼IåÎÚ'ð‘bØ `QÀÂ#&ËIÖíHaîæ "ô!T;Ô«å6â}­wìMŸ ë¼=9f[Jî–Û}ß>ç—ì>$rbÊÊþɾ\v˜ 3?%ØRü=¡¥R:@l ²­ëÑX‹~“€Sðn¬« Útœ;†3v`{¦SàIFí.Þ-.ænq¡ÏÁ+¾UÙÑXgšã¢úÚú,çà פœhn:ÅÆ|Ðéì$B+·L—!KÙÎE»û/ p³' ýâWÐkÔk 0QXЗ6$ íÇ+ÞäóôƒE,WIÃn)¤çYÍÛ‰àp‡¾ÐÙÎgãѨ-gçU¯ÛgŒˆÂ2׌Gõ¾9º†˜Æ\Ö¦™íÉ•ÌPçÜ÷Ã2½<+žr®Y*Êþ²YšQu…hÁ¡aƒî¾W—Vödž¥?²,¸ºõÏî¢yM¨Èd¶çÕü—æ ˆBd8ÆxTÔ}Sá´iEeuˆ„6»7Àü6,à¥q.ÍØhkËVù;ãÐ…K£—Õ8!¨_’ÌŸË>5]ëë%;Ó‡IUlò¬F]º¹wÁäŒió}¯×ÛVÿa©wÛd þS}µöÚÿxh×ðÚ­ûmßÛjßn‘ Xýº ûtƒ«í¬¿…翆¼ßmi}µ¿ðÚoáUGϨyöÖ—á³ø^‘óéŸç£—á²ÿa©3êÓž7ÛCÿeÿž_me}¶gð×Kí £ç×]öÚÿa®ßð¹#ç×ÃBÿCYo·J¯·I@øYO¦VLþøÎ™"©JÄ „|w›"Y›Ì.½Í¡žGÏ'¢iä·jµšyý¢ÅBŠ=ˆ‡x<ÂòŸàûŸ+žrxDáìŸMC$Ý kK™tù¤4ŒåMµÓK‚X¤áCÕ„”•‰×÷š %KÌj-Øé•°øƒ ±ýÛI’­!3蘪ƒ«R(4˜Ójþí5<µÑŽË~ j0‡TuðÎçuÙ±®U£Ë1ïËJeuWŒ1¶ÔÌ?öR›eMÃ.È›yÆõD%3«è ™ÌE˜¢aà0 ŽÖã_c• “sÈ2k”Td³¤›Œ’wJÊœÉ"tt€««{[2L£n:š3ãc0Þ7ÄmÊP9U ÝZ³›½¨Ý0®qw¡óø{ˆu"3i¡×#i(¯¯9®ó‘Œ¶`y¿¶\OP? „˜´?CšãoІ´tKT‘teøFâõë_C±&lÕ®ôŒr‰Óƒ?¨›×Ø?SÑÔ %†‰u¤,H¸9ì~-+ea±ØæA8ÕŠm×P‘¦i3Êð$ø*åÐÌ  À~ß )Ì1Y{^°QÑÖä Â^ñ|*R|T*VdÁÇ ×3¹.jÔ.P¿³¹ùRß¹õýRlšÙu:óD’‘I³ûKoÍŬ%s\„äuŽÕ”²cRPþq—ÈþV2ûÓ…†3ït¼ê¿éæŠåø²:uTJF-÷Õu)@—7FŠe|ûéLÿ@ó}4ßX‘‡z·iñ&þ½Ò*_ ;Öη¹ÕòD‹9õ…‘ X/3ä2¹’uø(Õ#šrÀÂÀ`ëôú©)Õ3ãÂ'G¨¤Ä¯X¦Qc7fÞõ~„~¬eŠÄ®-7jdÆRô RÆF‡øwÏ©3·cu5Á·ø9ð䘞Oh%%ã· A™r¼H3ë˜dJjìÒ ÂãÄc”Ñ·ŸŒi—ÎÕmñdÁAeL­éªÊüâ’ûwò Ót.*Ézè“gÊ—ÕÔCh?‡<*Gtxx¬SÕšËòlAÝ£ “Sn¦›®™¿‡íAôgS–³çÅSv¿C¿µß¦MüêBu2€õ¼¿ŸÒ…¯ ùœËi‡+ÎõÐÃßArV“*–Й‹À6­ ¥…&Ãëd“ö}&¨¸DôÁù¨§;ê³Åðèòød°¹[Èx3åT{½Ö¶RÇoèÆƒeÕ¢“´œ­Xóþ?´½sºˆõî}fnAl4‡—N hÞéA¿%]øKISj#Î.»_Û$r9÷ïP#„@\î49BH€Uó&'£Òr]Ç)‰üZ"Nœ’ ÒJ­˜œ%±³o…$2º¨éw×Z ÂxÙ ß½>¢:ÿe-zê†y3OõsçäKáÄÙ‚ºšÚ­¥“÷A4³³nôï"´º¸¯|Ê19eFS{ 6õ/b¡‹÷óåf‹k~RnÔÆ)»CmìÉÈ}îP*è†S1° €&b +ÅãèZUºPÌÐÌÝ¡óa`;Ž%®GÁ*¼éØhïÔ¾C–cçi¼¢gK3ú ϸ Z0z/]‰ú¦¡ý ^7c¢HEWjë‘‚ ËÏ·’¤Ë¾öˆ766gþ>ù¯M•G-ÕúüOXˆƒ3Ù•ö¹ê”LáÙÀJb+í»VܬÙfاΠ‚‡å¶Ÿ3ëÞ¼­tÃ$ÃãVÉ^jÚ‹ Â?sTNn?™ƒN|±H m@ÙêŽ>5x‚W=žé˜ZÄ8*—Ìì­¦9'‹†Tö ‘‡ÝäÎé¾ôÈ)eÓ§nÜá 4‰‡Å‰¦$‰}N5M·të3âúÃDû/HÔfÔó"~C3ÂTÈ£øà„ëíèâfKW€dÊzä:ŽïbÂäˆç«‡å´JÄAPFÝã¢u'6¦ïŠhâúìÆ;D+º ËßÒLܧîËaÞ¼X¤’|Îó!wm4v>¬qâqYL޲Lý»ÐK®ÙÍ÷°²ÌŠnI7Z™³<ø…WÛTª¢è$9û¹ ÅÝÓ6ˆB¥ì×/d&#QCÝzÌ©G¦Ö90šXq]‹£ò¤xêù PÜ4ÕáBÌÌÌfX"F­õN‹\‘|Âf—P€k3PÖºvè‡@Ï@pá0YuÁúå÷dY<ìÎ}ƒð~­kËW8¯"ÌXé+º$J“3ì`˜ü]wˆã¿j‘=µÍQͤ=SWMÒ"¡c´ ^ZÖO¸ õ°°Àá,ñOWÊۇô³EA‰‰1š¹Y/66’42{ÅTRÒ`®~ Øé…x†v]òžq­~¸ºä>ûÃi˜je‡ˆÙ¡6UVfapSWdkûˆ{l“ uÒ•—ãTÙë\—OÜHo8`z,ž\²ÅÏ«hAÁ;Šq < •nùA?¿®ÊÐ=M6Žâ/Ä5a^K¢¼hÀýüEÔÔ€9!¬½§Øý;L]¦‡?C©-(ú~0Œsmž.D”FAJ•®U'× >s*gx›XÜ ø’hœÿd²4줳0#I± ±TøÈ‚Uúú@F§sa"Òi B5•dˆ*˜·C‘Ý pÖI,‰v_fˆôÏ…×½¡ÜÞÖľæ^'Γ.ËRGÓ‹8 /P¹N{@øN2ûî´§|1åTT}‡ùžÔ»5Á#µˆ±•µõ¾û¬„Pmôâš Š9ëQŽ%(“½3«‚7Çÿ0³.~-$Ìd?{$(·É¥éÅg˜,Þª&š“pO‰N‡xN ' ‹Ï ÷üìrq¿–Äẃ±ž‘5b*½rzÊ&ŽàÒ«’{ Ëõ®>ΟϚMÚ“œ :=´:²Ò=àœAû;t[y$™ïg©itÊßmS"Jí—ŒBª%rÅPè l bµÅI¡Ò¼Á®JÀ¿4õ’*©þбüã>z#•Ê^¬ÿuÆäÚ#Q‡q´B•h6ø‡Ø>Y}¸ýW^ ”nÞÖœ¾,°’ã»%l‘m\MÒÀºiéþݹ*ÿuÓÊìêÂ|Û¤ lt?öDÇ‘•ît¥ÁXU”ÇÔ¹–—wÓ܃I˜û• w`xÑÅšÓTgÚÍߌ—‰ÌÖ΄–g‡>­C×»~8üh•èïH·ß]vÌÍ_Àvã?Ñ,ÑÈ»FœãoÀCì žÛ ¶I²ê¬ÿ3†î`n¡sƒp?¤uƒÊC9Kk‹Tëå_ëÞ+]Ý Åø‰¬"áʲ֬¤¢:L£­õ2ôʵMÿLB¢e¯tˆ—ðY?+Þï} •{Ö{Ñ?'@lkYßåt _¦½Ó¢¦$WÂ!$Æ+ÄÏ®*èÅS•+!ˆdx‡ú§Bìç,={ E ‰F`­…‘¢Iš€áp TÍÒA@ËìP%y“Ž¢‰žëIå•¥´OÒU°ô¥z}“MÝœåÔÏ®d=u€yI02Õ’oáúi6Ï"ßÞÒàÅIóÊŽ£5ý¼¬ª!")OÊ=á” ÃÌàA¿•£A«Ÿ°¢ìDšlv·é3¦à4ਲ਼×U+0°*´Ð ކîè=$cGÔߜ߿k9—Âr,ü×?ò ¦MïÓÅL¥‘r­B LHQ·—PßÑ=º?‚âT“Ù~I®;µ¯‘kÒ öš­ÞJ™|Íê€À|ø¹Ð‘ :Ì6%¯ø/y9]ð’ ÛûDßùU¨ü>ô¹av¼¼R4‚€Í) Ù.„¢8µ£6AçÔn€–«5g³Á~ªq8åÿ!˜JD<0”}Ÿý,P‹·¿Ê¢¢öF£Ü±K ÛÇP+’îÈã$ÚYÄf0TüÞz‘áö\Îý§ðƒ© ’ dÿ ©‰ üÝ_,šë%$Û)É6D¹²0ìóü¼š<þœ§Û;3“èõ…3²umq€VH2¢¤ià×ÑΡÖLùšc«Þ>Aôd0ÙKŽN,ï9tºj,³f÷*ÊÆáM¿ã×úñÌxÉ—è•rýF§h«æ‹ZÌ^É! ¼ÎÍ¢5[Èš!Å 9g|+uaKd°g`*Ï«ëØi/=eå¾µOËö]Ÿ,Ës×Ç­ÕNåëƒl8u¶’8MÄõù’•ˆy‚š±²@Äõ2l02:û iK½æ„>}Ê'ÎûU9„¨Ðþ>kÂ7vt|Z‘ÈÂX>Uáê°Q²öæ¥;³Ü¾ÈýŸ¿Ic¼Ù<Çi‚+QÝsîëptÿ{/}曺8©¹¼9ˆ`¨b³”I1¯½@›6éÂÌÿ€Oü¨+¹¾Çë#¦sâ_òQAÆ%ùE¡1áqN˜^¤ƒ$ÓÁÁ1»ïx­eÞsñ«É}'ÉêÅØ©t.?YÒÀz~m푢߫Ÿá§hH'8^ÏW½"ˆ^ßÞÌ@fÆšÜꢆ•Ç2‘åvì6,¾y²­øg¶vJ­y­·µ‰y´´ì#͆ +·q=føW<2H¨/¾ÛGó á{³BÿHFj®¹Ó_YTD "ÿ'˜Ú3'<}ãc:G€)²)œÈiûº_ï8­Öëë-¨Qz£\ª~Ï¡”!„Â#$ŠY¦‘Jöïÿ ºm9ÈZW›¢‹gì­C!b)C9¿s6éˆmhð¿B=iT¼jÁT(ÃåÁ¡“î­ÖÎÇ&Ó Â™ù‚¶Kɪ5MÊïúÜÊ¡ ‰GTÕñX÷ŠP»°š&obý'uoX‘õ†RPKM¬ùÐ,6~V§þ3m`›vÕ“Ìû3ú&EÅ—?tyD¨Êé‹Ñ¨¼‡ÒЃƒS¹ë¥Š0&sÕ’òn´åéë‚Ípºvï/ŒqXÜìxY£÷‹ŒŽâ Y/ÛâñWÉ¢~êóÝ78@ÉÕ½¼Þ5ycqjH‘³ú$É7!7±ü2ì오hzÍO`ÖLüËI Ï çxÂù†ö¬W˜4.ÚàØVS2}f­Ô»lpRüc¦·¢Ù$7Ï0yxê ë®VÑÄÕÄ{̽zÕ¬±´O°vqüSÛFB ¢v}ÚÁµaûìÛ;=Mè>Ù KŒÐÖCNUäF=¡’‚U/Ÿü†Éí8¨]§göSb€à@ù‚Æñq8î†_«%×tD Äì2u1®P§®ËÀ:˦xh_•!KòÏ)–n X"øÕø„t(¹IÚ¦cmà žâ%‚£×J5ìýÅ>ÅÆbã¹ú ÀGÙH{ÑÙ}¥³¬÷6rC;•¼›@ó8ÕSíw24êK~ôå'¯áNÆ:Ü\O‹h¢g_€èÒM®mƒ¿ØÙ$ÄÕH‚°½Òùx§ XÌÚ>Sê˜>|;ÂßûÛ ¥½YÿBK½:h„§ïýi%ªï¢ mÖKqÔï‚¡èíD˜Ay1q™D8e)Õýð å4¿íw —’){ .müÅ/ÚS´.õéOñ™z «tF™Pk·«Y»Í‡Pm¨)¸òÏc^F§GЖ}â B½Ã×b4>’ƒŸ¶˜ÜÔ7¼Ýæ ™Çç ·L/VOt|_Ð6ëæª<9~½-íé›&ï£Gã`è¼»,/.E]D‚/ó%ÁµY‡ÐýGÿ=–•µá}GOËYâíæî¤ƒZÑ÷”51X4à1â«ჟ–‰Ld·«G•¸bbôñdgRL.IÝg îgïÀ×|B!HHí^xûRUq{¦Úk;4åמö’‡;¦T‡¶.>}_F;cͶݥÁeÄ#¥$üÑ"ðaÇÆ´ou},Û°¦¿’¡s© 0ãÜÎøœC¾6zgo OâœehÛÌÚÖw%8yîþ÷Lj)#÷¨±òL³0X$¤í¨ýézoKî^«N—“4Î! 3¬íåÛ~¾åêÄý|zr$J,w‹|Š@zô]sÕ’Y‹&ÆÝ*x8Ôû^ÑòÖeÓ!±×ƚ̛„&“þýÔêBcO0#y¤qòcáúo2˶ÒèæS¬ŽñòWößíýåZG“X]»4†HMÿ#ÿ ÒE÷–Z;o„ ,T üÁ<À,òP)ä?pƬÕÜᬫ4¢ñÆa]a! ‚ç6KÞB$vžâ¢LÛ½‡Óó^̯¦­|¨¥Ìœ ^GQƒÇŽLo®«Eœ–€ô)ǸΉTõ’èño£þûCÑ¿§> üðìHµÒ÷¼É:*ò‹ÿ^^¬,“ŠU»&‹ûk¾Ñ¹ù~ÊÜ„k~8µ®¢&^ÒÏïã äº _C†\I«?ˆn^›¦UÿHTÃZ!X›tn ¿Hæ½iÛ»ãâ|b.àV~³–óµÂNŠdÿwQñU«z -EÝhcv¢UšÛD¡0Q÷1O¸A¡•¿Õ…˜ˆ-ëJP0ÉáƒtUA£6„Þ|ÖÒ©š k8`F½B'¯$<0¥Y.ñ 98ùqù{KÁ}ÉI†6ýXÔua.zßY2½±Y%3ƒ˜`þH³Ñ&ãüÔ†/e•¥c@—µŒõ߃`mf»½SÇ´ãÉúuY3%äîÍPræ´^hÖÑ'åÒÑв©CÀêŽ;,€J¦éñ•üËÙ³ÆY å-ð¹r>‰“Éé›öï©äG,³ƒ!/ê¢Y±!3–7o ¡e&À¯0•M•¤=¨wI=R1ô_Þ=–] 5ì– ¥}|YI Ÿ±ôÁµÿ>‘K×¶ 31Ñs+`úT¹+­ÔÀUÁ)øÆcðÃ’k°OOú^LH·a5$)¬Ã>çQDGfµ1<©ó„îŒmªQQ‹L]Å:é+œ¼žhµÃ[UÙXŠ»´ô*žeW å} ;®Ð¾ùL3E+Klÿ`ÃÀ2ë¯ÜÃ_¬œâ~18ÇÕnejoXJh&(:8™³ªÜÕ6ÓÈ1Ú,FP &¯aѲ{?¦gf×V 1°z‰©þ°Ú?(¦æöUð’‚VûÕt<ŸÜÞ“²1éFß,Âçç¤Ä»ß×§ÁÞ£?øí÷­a)ÇáŒFEc×6Ò‰ðÁîn+Ú˜=é*ª©×LúÃù–õ Ì{mÔp¹ÇnœÛ³[@#4ä`×lákª7:¿`;NÌô[Í9ðø<Ée]"Ëàá7!°Í~Ò9Aª¡%TŠK=Z Ù=W`"¥ûÀT9‡Rq7Œwiˆ> Ðô34’ƒë·ì1æ$G„ϼssS˜î½â«Üã‚9žSŸ|‡úü¹ýT\âíëHɤb¥²£¼óO—K¿†K£€HƒÝÙ.·áG:ó¥:2×ó‘׬nΤ[¡ÆÚö@,ƒûl/µ<¿iƒl J{ŲDÏÐ=îŽþ‚>ñ¶nWðýÚ]Ÿ—B=Ú_r…Ö­‡—@¾Ì°ÅŒçá+·y¹N#Á¬›£pzÄȇÊÏàû\Vp´äüЧÆX¾Ÿ2"ºt|(óçQº¹†Ó…jévëÿ âŽuWëL×µeÿHc ¦Ÿ&Qmy‰ÏSÆóPƒUK¶ò vp½ê­›Ý.iÉn ó£±¾0Ù+±_r³èå `(öÕ}¿ã7ñ”V"eXé‰,%Tê6úÌß8cG€(Âo44\ÈíʲLÂqKZv줠‹½ÎÑ<Jâ °©SÜ©€vî3$)àÂ,ð¿T‰'ÞugcèĺùÓ*ªÈ÷žÂ%gG’ßž•õ—J&:€f&Kö¸##=¶8ñvùã|»pWêÐrÇŠý~s«ÅŽÅ-Õ뢟…¹§ûgw 3»[ Þߌ>_ÊÑc&Tóí× ›{•¸kî!½ |gÝݳ 2¾ud Ì‚d‚­0¤ $a»öc€Ã¯R¢í/ŠO}šPÍZôa*Ý W#ã}ìýwŌҦ®b‰3Θ´ü%´¯ ™ÈâiRæy[Z‚dk úi£^Úª í]í§§¬>9ìËÏDû.l²ÖP–u£Ê $ŽWMEK5÷§í»M®B;$Ù=zØØÒlt7ƒWï&]žF`™ÉÁº+VÒhر¤<ˆ²ãäñ`<Ø`ˆ­@ÕÞÙ³›Û~êöÆû‹F°"ïn¦Ò„ ( Ò“|þ*³.°Ó–:%fç‰ÜñB ëÛÔšÕš•SžÛ aØ&K£ï¶øËô³ƒêB•úpŽÛbUžTý6góGìd®i×úbA×èq•1È–6[çJf‚·DM IħMH°‘¢!ëÑõu^’|“Þ @Õª¦ÝUäÂBüN_4:ÈwßâA$ eœ"ECCo—´#™w»íä AŽ ¦ªb`9‹D´s‹²DÆDøŽgf4 ]ÈxµÜò'ˆëUK~‰dëÖXs4º¬ëœÀ?K$Ð5hJ «9Í©úŠ+»{Ì|V.“{î¢,Í…k¶Rº­Kžõ¸ÿO¦;ðzÁ†=9þ@šÖ©Ø“ƒÓ…½S@à8hoa;d«¶æ¢SÁóF»!À.•\þ3YÞ±õ)p*œÙõ ]eÓaOÞh„©¢uÌ Z׸Q—䋜i/d(r:#NŸ]=ùÍ[Yª©ÇóŸ¨o£a)jÏP_8eÞùIÇõÿÝ4ŒÌÐ0:EXÎÒ\”xŒh®Š[{9ìu‹ÜsWr6ý­ϱßG0]»‹g°ÄOÉ‘U±¬Àñ&+¬^9Wã‚YÕDÎJiFà ò{1º<,EZ¨îá²)r„ÀxOWW™…IÙ×MÊîÎ(Ùž,3ØN}œŒˆùÓiƒ®¨WÀÖiM3ë/<޽Ô!_¿®Br¤¨[9cN¸7ô›ë›¤5Áµ:9¤ÞsQ6¸rö iS®×ñZDˆ(™JÖË~ì—=îÀ‹ã8Âà:۟οk-5Žç~3ÙÖnÓ¿ ÃUŽ—!ݦ>¹×>ûÖ«0=$-À–Ë-?2¦2‡âs‹¥UöÛ' …%jÙ©†Ÿ–úZcɈl§ ¤Âì›ïÒr­Û®G_/ºˆ>V`´C?")Ñ¿0œ¯´¨:hëqP‚ÛÌKlŸ^"(Lî¸q…u° £GCEi·æ°Mv¹¹™šÅ;o(G·â|x…`çaëT"yˆlS>8µ`Íñ§œÏ—Ç o´\ÒW) WŠ·A©6hIãs¥drÌ<;L¢‰‘ÃSK8,ÜÔ?Y2乨8 >&ú‘ä‘lÔ|л‹sÌ=eÓO‘ùHÀéæÓ»x²f¾ãbGj’yÁîŠóÖ%h6çÑG.Ó¨X‚…Æu”Ôœ@êæ Ë‚ª‹ôbNÌÄ-ƒ,_º ybòêóùë!º_vÌÖ•¡ â!q„q¾e!<Ñ?_9Õ+¬q_µÑwT©Ÿ´H¤\ÌœºâR‚‡'½{¦Jd67*ìLžÁ¯6Æ_ ”Ï~ï×s3ÔuzŸæ}-Ð"v£Ëÿ –õ·‡dv’>S[Z¹‹b.°?6ª7­R¨ ß£·l±1{ìc5å ìŽÊEÏÝs°Wø©dMip”étú>OsiL'¨Ën"©Ã£䟅µ¶ë/I>Ña_vƒg—ïïp£ˆˆºô þ±£r”©òOÆÛvÞéà]jaÒª/‰‰éh¬Áœ"Ÿæš™ñÄam*!²ÑÛg¶Ò‘) —²1ž‹Ö/$Q?ºª0ëê±ñøs ·êýéjoóžS¦J}ˆÚŒº:€ï[‘“Ôþ’ƒ²Àtñ­xÒT»Û˜ÿTã‘Ð(>–¡É¼cù4Á"‰¾õM¯"B¨ôÙÙ}?¢°œ4Àk‚þ¿Vo9²/íÜ@4HF­Æô׬#$Ž&•HDSŒÿ2áåÁ%Ò oޤÙX„µÝî ~§ àÒ°ŸgÔ=¿sQ:M"ðsfÚÙ'Xú *„,@T”prÇž»Œ_Z§ôŠBl2Ï!ùí¢dóãºÞI¡V…K+u'I»n³/XóÓ2ˆeÅÜä{‘ÜäY·ó ¨Êò€Ž>°[ ‰ÇŠùM•Lltü\?Ù’ÏðfFQêaZ!½¼ƒl— ¾ÔW yZ«ûŽ2.?YÆlȇèBk4ÎÛðv dͨttqp´…ËB4—3ˆ6o”·ű˜ùÐíBwùª¹ž­Þ™M[Í”Í#líO»œ‘–$…Ïà èzxñøÏ—³6æw&ß;ï õ~¶ó[$‘7æM‘Yžö4uÏ>ÀÎvu'×71Yš5Pï?2BÛ²‚™Èß² ³¥¯N¯N‚œZüß %u€ÁºäC"Czhô‘”ÛÞȼSEúO‡jœ{/Å®?š¶KQØSÂÚÙée¦Þë’°ŸãÈç¼…å(Øm}aà)¤ýÄ~”jÉ¥Ì2H/PÀõ>8Ü?ú£Ù²¿êW•NÝê%×T$åŒÅN‚x‹lY¹|Sà€Bæã€œþÿD9ï×ÌÄ?HµqeÍs¥k³ßQO€ö>ŽJmé=_º v\„9ÉË‚2ò®ºÇ6M¨ôbÙݤvâu±\³ºpø5*†·ýÚø©’ 2fà‡èVsQ§Á£Ÿ£¨ÏÎKú £„”ío\BÉÆ·|´Äï k B-õÓðn,x„;ýÈšèz†òHI¡H¶ô´+àú¹ ’n¾¨R[Ùp]B®÷²PbP; Á¼l¼\>ãýÌC„‹³?Ü•àƒ›=SWxåzŽP²ON¨!´3}Å«iIi}û¿äuV¿KÓAa–Xû‹Ée…“6p‚µ¦çŠpÇnO Ä8Ê$¦yœ `´c«P¥¥Ïñ®4ñÐmð9T‚Ñܵ±ù.ë#ì“yr…FÝŸ;¯@wŸÌ³Ê´Ó­œ''TŸAú.ð)øíçÿÙicnV Bðgnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/Locking_On.tiff0000664000175000017500000000064614636001532023234 0ustar yavoryavorII*h€ P8$ „BaP¸d6ˆD`Oøx%ƒE#(´n#‚Ç`²$Š=’@äÐ9LrO–Ëá2¸”ÆešGæðÙÌBm;’Éçô tz‡DžÃèô MO¨TjP(þF HN@`–ž(=R/Users/dave/dev/gdl2/trunk/Apps/EOModelEditor/Resources/Locking_On.tiffHHgnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/Info.plist0000664000175000017500000000467214636001532022313 0ustar yavoryavor CFAppleHelpAnchor CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions eomodeld eomodel CFBundleTypeName EOModel CFBundleTypeRole None LSItemContentTypes com.apple.xcode.dsym LSTypeIsPackage PBXFileTypeIdentifiers wrapper.dsym CFBundleExecutable EOModelEditor CFBundleGetInfoString EOModelEditor version 1.0.0 CFBundleIconFile appicon CFBundleIdentifier org.gnustep.gdl.EOModelEditor CFBundleInfoDictionaryVersion 6.0 CFBundleName EOModelEditor CFBundlePackageType APPL CFBundleShortVersionString 1.0.0 CFBundleSignature eomo CFBundleVersion 1650 LSArchitecturePriority x86_64 i386 ppc LSMinimumSystemVersion 10.5.0 LSRequiresNativeExecution NSAppleScriptEnabled NSMainNibFile NSPrincipalClass EOModelEditorApp UTExportedTypeDeclarations UTTypeConformsTo com.apple.package UTTypeDescription EOModel UTTypeIconName EOModel UTTypeIdentifier org.gnustep.gdl.eomodel UTTypeReferenceURL http://www.gnustep.org/tools/eomodeleditor/ UTTypeTagSpecification public.filename-extension eomodeld eomodel gnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/toMany.tiff0000775000175000017500000000046014636001532022456 0ustar yavoryavorII*j€ P8$ „BaP¸d6ˆDbQ8¤V-*Æ_ñ’«þÆ¢ñY‚?“Hã‰K-•DeñÙm ®Ö•zÓ4ø-¬¯«É&8ú¿tÕý°UžëŸZµ^•™»?èèk}®ê ½«Ê}ýçŸC`28uO¼XBšS_ÂUºRÒ?5šóv$p>À‘°uÑ–L­® ¬‰4NI·®GôŽœ÷w7ïpßøµ1œê¬¼xUæ‚O¨)éë ®$šÀà{ï ðåîòÉ·ä¹ñ™7¶2i³?|Øz‘÷¸¶ö}Þ–ÚOùÎ?ÃáÔ/zùU:iúVB›†&8üö.$ñn‡ãìÞyÎæ¦±Ö’FBcÐ…³¸ÁNïí\Íñ½€MøF—n:J%d®Âp÷¿çö6×ÕÓÛ#£&§h9=uÖ26qFÀÑ‡è„ àJx~ >7ïi8;OÿôÚw™ëgc$}°j*¯Ðw¹^úû;€‹ÎzgÕ× &šcZkñ2&3÷¸ÝH™"+u|wó.µµx ŸºZq „BÉ/ùS¼?‡˜svÎ]f šä€üÏ¥g\R¥ÌRE²>ÐßÞ.EÙ7ÕЮnb³ò‹çP¯É{a7eNõÞv(ÚX(ò¡èc‚kèš³úð±ÉbTjàò·íÀQcd8{}€³Cc-N¨VòßVÿ WûmåD1âê ­vaáeuúœÙ÷ [§]Xæb³j"®ë>´u|îiº´Íÿ÷mw45¹Ïma’f¾ùÃFUó;oÖéKÖ5`*íêDt:ÃÖ" ÷Uìç=UÕR¢kæ-­fsŠŠpZÝsFìrmaç-{²L;HhãpRkŒ:ŽrYF;‘¸­È}iPá´(²ÞÖ+›}mõ6%o VµÑSÒSÉX qìÜès~·å÷|¥—׆ø|\¥A¤6æ‘å4ßÕ´Óqn¿Ò‹µO®ØI›Ó6SæÈä ô9èܸ· z§¬I šôºü•m„.΄p‘zÓ#Á)x9Ÿ§ñÂ|ÏÍ ·FõȆ\¥£LIÿo720Úþý_À9+Ô!P›bC¦”dÁÙȸd„“ôä}ÚÓzÊqæË2%ö¹ËדæŒ} ™ÿó21–9„pAöã1ÇÙ=å²°¯?¡®Ñú⵿P–¬BÉËabÀ‡pÐB å'ŒS ð¢÷VM©ëêçŸ.ÝØŠ(&‹1§ßÇà‘àAŠžÄ‰.wË#5Ç„Óóš¹¥+éäì¯È‹Y$º‡•³ÂÝMÁµnî»[;|zWrW°ªRfWAÜÐÒppI!œV‹p?9Á·7¼çi¾ÜÍýH]°‚IήÀ51y§jà’¼.ІAY„*mŸÔvV¶&x›k_çjOR|Zºá¢¨E´9CöA‡À }÷£ãîÆªk“¹o*˜sŠ+˜¤éå€yk¡BÏ=ýÞQ¿•dÿcÕ^h|Ðn˜,%‡zªœÕß,Vôç´ùÉê„̃àjNTNö¾ùÞÌ‚^]:2g )Ã& Š6a$eÄ ¿hEJRÞ~îmî†{/çÖM”çÿ„Là*  $)4<(1:D=RModelDrag.tiffHHImageMagick 6.2.2 04/27/05 Q16 http://www.imagemagick.orggnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/AllowsNull_On.tiff0000664000175000017500000000074014636001532023735 0ustar yavoryavorII*ž€ P8$ „BaP¸d6ˆDbQ8¤%ÿc×úª=+H`‘¨Ü;‚HJÐØòª *’EdòéLŠ[ •&óÜÌ9›ÍepJ s˜Å'Ôý2iF›GË0ú­I‰Òê4ø:[¯Ðã3Ú-vÁ¯QìrXú… ²ØdvÈ5ºjV.ˆ¼Jõ{À`pRXþ| K„@–ÐØ(=R/Users/dave/dev/gdl2/trunk/Apps/EOModelEditor/Resources/AllowsNull_On.tiffHHgnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/Menu-GNUstep.gsmarkup0000664000175000017500000000575414636001532024347 0ustar yavoryavor gnustep-dl2-0.12.0/Apps/EOModelEditor/Resources/ConsistencyResults.gsmarkup0000664000175000017500000000151014636001532025765 0ustar yavoryavor