/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the files COPYING and Copyright.html. COPYING can be found at the root * * of the source code distribution tree; Copyright.html can be found at the * * root level of an installed copy of the electronic HDF5 document set and * * is linked from the top-level documents page. It can also be found at * * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * * access to either file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * FILE: H5I.c - Internal storage routines for handling "IDs" * * REMARKS: ID's which allow objects (void *'s currently) to be bundled * into "types" for more general storage. * * DESIGN: The types are stored in an array of pointers to store each * type in an element. Each "type" node contains a link to a * hash table to manage the IDs in each type. Allowed types are * values within the range 1 to MAX_NUM_TYPES and are given out * at run-time. Types used by the library are stored in global * variables defined in H5Ipublic.h. * * AUTHOR: Quincey Koziol * * MODIFICATIONS: * 1/3/96 - Starting writing specs & coding prototype * 1/7/96 - Finished coding prototype * 6/10/97 - Moved into HDF5 library * 5/18/04 - Expanded to allow registration of new types at run-time */ #define H5I_PACKAGE /*suppress error about including H5Ipkg */ /* Interface initialization */ #define H5_INTERFACE_INIT_FUNC H5I_init_interface #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Ipkg.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Oprivate.h" /* Object headers */ /* Define this to compile in support for dumping ID information */ /* #define H5I_DEBUG_OUTPUT */ #ifndef H5I_DEBUG_OUTPUT #include "H5Gprivate.h" /* Groups */ #else /* H5I_DEBUG_OUTPUT */ #define H5G_PACKAGE /*suppress error message about including H5Gpkg.h */ #include "H5Gpkg.h" /* Groups */ #include "H5Dprivate.h" /* Datasets */ #include "H5Tprivate.h" /* Datatypes */ #endif /* H5I_DEBUG_OUTPUT */ /* Local Macros */ /* * Define the following macro for fast hash calculations (but limited * hash sizes) */ #define HASH_SIZE_POWER_2 #ifdef HASH_SIZE_POWER_2 /* * Map an ID to a hash location (assumes s is a power of 2 and smaller * than the ID_MASK constant). */ # define H5I_LOC(a,s) ((hid_t)((size_t)(a)&((s)-1))) #else /* * Map an ID to a hash location. */ # define H5I_LOC(a,s) (((hid_t)(a)&ID_MASK)%(s)) #endif /* Combine a Type number and an atom index into an atom */ #define H5I_MAKE(g,i) ((((hid_t)(g)&TYPE_MASK)<id_list) n++; } /* If no types are used then clean up */ if (0==n) { for (type=(H5I_type_t)0; type= H5I_NTYPES) { HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, H5I_BADID, "invalid type ID"); } if(type_id == 0) /* Generate a new H5I_type_t value */ { /* Increment the number of types*/ if (H5I_next_type < MAX_NUM_TYPES) { ret_value = H5I_next_type; H5_INC_ENUM(H5I_type_t, H5I_next_type); } else { done = 0; /* Look for a free type to give out */ for(i = H5I_NTYPES; i < MAX_NUM_TYPES && done==0; i++) { if(H5I_id_type_list_g[i] == NULL) { /* Found a free type ID */ ret_value = (H5I_type_t)i; done = 1; } } /* Verify that we found a type to give out */ if(done == 0) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5I_BADID, "Maximum number of ID types exceeded."); } } else /* type_id is a library type; use this value. */ { ret_value = type_id; } /* Initialize the type */ /* Check arguments */ #ifdef HASH_SIZE_POWER_2 if (!POWER_OF_TWO(hash_size) || hash_size == 1) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, H5I_BADID, "invalid hash size"); #endif /* HASH_SIZE_POWER_2 */ if (H5I_id_type_list_g[ret_value] == NULL) { /* Allocate the type information for new type */ if (NULL==(type_ptr = H5MM_calloc(sizeof(H5I_id_type_t)))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, H5I_BADID, "memory allocation failed"); H5I_id_type_list_g[ret_value] = type_ptr; } else { /* Get the pointer to the existing type */ type_ptr = H5I_id_type_list_g[ret_value]; } if (type_ptr->count == 0) { /* Initialize the ID type structure for new types */ type_ptr->hash_size = hash_size; type_ptr->reserved = reserved; type_ptr->wrapped = 0; type_ptr->ids = 0; type_ptr->nextid = reserved; type_ptr->free_func = free_func; type_ptr->id_list = H5MM_calloc(hash_size*sizeof(H5I_id_info_t *)); if (NULL==type_ptr->id_list) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, H5I_BADID, "memory allocation failed"); } /* Increment the count of the times this type has been initialized */ type_ptr->count++; done: if(ret_value == H5I_BADID) /* Clean up on error */ { if (type_ptr != NULL) { H5MM_xfree(type_ptr->id_list); H5MM_xfree(type_ptr); } } FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Itype_exists * * Purpose: Query function to inform the user if a given type is * currently registered with the library. * * Return: Success: 1 if the type is registered, 0 if it is not * * Failure: Negative * * Programmer: James Laird * Nathaniel Furrer * Tuesday, June 29, 2004 * * Modifications: * *------------------------------------------------------------------------- */ htri_t H5Itype_exists(H5I_type_t type) { htri_t ret_value = TRUE; /* Return value */ FUNC_ENTER_API(H5Itype_exists, FAIL); if (type<=H5I_BADID || type>=H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); if (H5I_id_type_list_g[type] == NULL) ret_value = FALSE; done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5Inmembers * * Purpose: Returns the number of members in a type. Public interface to * H5I_nmembers. The public interface throws an error if the * supplied type does not exist. This is different than the * private interface, which will just return 0. * * Return: Success: Zero * * Failure: Negative * * Programmer: James Laird * Nathaniel Furrer * Friday, April 23, 2004 * * Modifications: * June 29, 2004 * Nat Furrer and James Laird * Changed function signature to return the number of members * by reference. * *------------------------------------------------------------------------- */ herr_t H5Inmembers(H5I_type_t type, hsize_t *num_members) { int ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Inmembers, FAIL); if( H5I_IS_LIB_TYPE( type ) ) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type"); /* Validate parameters. This needs to be done here, instead of letting * the private interface handle it, because the public interface throws * an error when the supplied type does not exist. */ if (type<=H5I_BADID || type>=H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); if (NULL==H5I_id_type_list_g[type]) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "supplied type does not exist"); if (num_members) { int members; if ((members = H5I_nmembers(type)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTCOUNT, FAIL, "can't compute number of members"); *num_members=(hsize_t)members; } done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_nmembers * * Purpose: Returns the number of members in a type. * * Return: Success: Number of members; zero if the type is empty * or has been deleted. * * Failure: Negative * * Programmer: Robb Matzke * Wednesday, March 24, 1999 * * Modifications: * *------------------------------------------------------------------------- */ int H5I_nmembers(H5I_type_t type) { H5I_id_type_t *type_ptr = NULL; int ret_value; FUNC_ENTER_NOAPI(H5I_nmembers, FAIL); if (type<=H5I_BADID || type>=H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); if (NULL==(type_ptr=H5I_id_type_list_g[type]) || type_ptr->count<=0) HGOTO_DONE(0); /* Set return value */ H5_ASSIGN_OVERFLOW(ret_value, type_ptr->ids, unsigned, int); done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iclear_type * * Purpose: Removes all objects from the type, calling the free * function for each object regardless of the reference count. * Public interface to H5I_clear_type. * * Return: Success: Non-negative * * Failure: negative * * Programmer: James Laird * Nathaniel Furrer * Friday, April 23, 2004 * * Modifications: *------------------------------------------------------------------------- */ herr_t H5Iclear_type(H5I_type_t type, hbool_t force) { herr_t ret_value; /* Return value */ FUNC_ENTER_API(H5Iclear_type, FAIL); if( H5I_IS_LIB_TYPE( type ) ) { HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type"); } ret_value = H5I_clear_type(type, force); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_clear_type * * Purpose: Removes all objects from the type, calling the free * function for each object regardless of the reference count. * * Return: Success: Non-negative * * Failure: negative * * Programmer: Robb Matzke * Wednesday, March 24, 1999 * * Modifications: * Robb Matzke, 1999-04-27 * If FORCE is zero then any item for which the free callback * failed is not removed. This function returns failure if * items could not be removed. * * Robb Matzke, 1999-08-17 * If the object reference count is larger than one then it must * be because the library is using the object internally. This * happens for instance for file driver ID's which are stored in * things like property lists, files, etc. Objects that have a * reference count larger than one are not affected unless FORCE * is non-zero. *------------------------------------------------------------------------- */ herr_t H5I_clear_type(H5I_type_t type, hbool_t force) { H5I_id_type_t *type_ptr = NULL; /* ptr to the atomic type */ H5I_id_info_t *cur=NULL; /* Current node being worked with */ H5I_id_info_t *next=NULL; /* Next node in list */ H5I_id_info_t *last=NULL; /* Last node seen */ H5I_id_info_t *tmp=NULL; /* Temporary node ptr */ int ret_value = SUCCEED; unsigned delete_node; /* Flag to indicate node should be removed from linked list */ unsigned i; FUNC_ENTER_NOAPI(H5I_clear_type, FAIL); if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (type_ptr == NULL || type_ptr->count <= 0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); /* * Call free method for all objects in type regardless of their reference * counts. Ignore the return value from from the free method and remove * object from type regardless if FORCE is non-zero. */ for (i=0; ihash_size; i++) { for (cur=type_ptr->id_list[i]; cur; cur=next) { /* * Do nothing to the object if the reference count is larger than * one and forcing is off. */ if (!force && cur->count>1) { next=cur->next; continue; } /* end if */ /* Check for a 'free' function and call it, if it exists */ if (type_ptr->free_func && (type_ptr->free_func)(cur->obj_ptr)<0) { if (force) { #ifdef H5I_DEBUG if (H5DEBUG(I)) { fprintf(H5DEBUG(I), "H5I: free type=%d obj=0x%08lx " "failure ignored\n", (int)type, (unsigned long)(cur->obj_ptr)); } /* end if */ #endif /*H5I_DEBUG*/ /* Indicate node should be removed from list */ delete_node=1; } /* end if */ else { /* Indicate node should _NOT_ be remove from list */ delete_node=0; } /* end else */ } /* end if */ else { /* Indicate node should be removed from list */ delete_node=1; } /* end else */ /* Check if we should delete this node or not */ if(delete_node) { /* Decrement the number of IDs in the type */ (type_ptr->ids)--; /* Advance to next node */ next = cur->next; /* Re-scan the list of nodes and remove the node from the list */ /* (can't maintain static pointers to the previous node in the */ /* list, because the node's 'free' callback could have */ /* make an H5I call, which could potentially change the */ /* order of the nodes on the list - QAK) */ last=NULL; tmp=type_ptr->id_list[i]; while(tmp!=cur) { assert(tmp!=NULL); last=tmp; tmp=tmp->next; } /* end while */ /* Delete the node from the list */ if(last==NULL) { /* Node at head of list, just advance the list head to next node */ assert(type_ptr->id_list[i]==cur); type_ptr->id_list[i] = next; } /* end if */ else { /* Node in middle of list, jump over it */ assert(last->next==cur); last->next=next; } /* end else */ /* Free the node */ H5FL_FREE(H5I_id_info_t,cur); } /* end if */ else { /* Advance to next node */ next = cur->next; } /* end else */ } /* end for */ } /* end for */ done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Idestroy_type * * Purpose: Destroys a type along with all atoms in that type * regardless of their reference counts. Destroying IDs * involves calling the free-func for each ID's object and * then adding the ID struct to the ID free list. Public * interface to H5I_destroy_type. * * Return: Zero on success/Negative on failure * * Programmer: Nathaniel Furrer * James Laird * * Modifications: * *------------------------------------------------------------------------- */ herr_t H5Idestroy_type(H5I_type_t type) { herr_t ret_value; FUNC_ENTER_API(H5Idestroy_type, FAIL); if( H5I_IS_LIB_TYPE( type ) ) { HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type"); } ret_value = H5I_destroy_type(type); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_destroy_type * * Purpose: Destroys a type along with all atoms in that type * regardless of their reference counts. Destroying IDs * involves calling the free-func for each ID's object and * then adding the ID struct to the ID free list. * * Return: Zero on success/Negative on failure * * Programmer: Nathaniel Furrer * James Laird * * Modifications: * *------------------------------------------------------------------------- */ herr_t H5I_destroy_type(H5I_type_t type) { herr_t ret_value = FAIL; H5I_id_type_t *type_ptr = NULL; /* ptr to the atomic type */ FUNC_ENTER_NOAPI(H5I_destroy_type, FAIL); if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (type_ptr == NULL || type_ptr->count <= 0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); H5I_clear_type(type, TRUE); H5E_clear_stack(NULL); /*don't care about errors*/ H5MM_xfree(type_ptr->id_list); H5MM_free(type_ptr); H5I_id_type_list_g[type] = NULL; ret_value = 0; done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iregister * * Purpose: Public interface to H5I_register. * * Return: Success: New object id. * * Failure: Negative * * Programmer: Nathaniel Furrer * James Laird * * Modifications: * *------------------------------------------------------------------------- */ hid_t H5Iregister(H5I_type_t type, void *object) { hid_t ret_value; /* Return value */ FUNC_ENTER_API(H5Iregister, H5I_INVALID_HID); if( H5I_IS_LIB_TYPE( type ) ) { HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type"); } ret_value = H5I_register(type, object); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_register * * Purpose: Registers an OBJECT in a TYPE and returns an ID for it. * This routine does _not_ check for unique-ness of the objects, * if you register an object twice, you will get two different * IDs for it. This routine does make certain that each ID in a * type is unique. IDs are created by getting a unique number * for the type the ID is in and incorporating the type into * the ID which is returned to the user. * * Return: Success: New object id. * * Failure: Negative * * Programmer: Unknown * * Modifications: * *------------------------------------------------------------------------- */ hid_t H5I_register(H5I_type_t type, void *object) { H5I_id_type_t *type_ptr=NULL; /*ptr to the type */ H5I_id_info_t *id_ptr=NULL; /*ptr to the new ID information */ hid_t new_id; /*new ID */ unsigned hash_loc; /*new item's hash table location*/ hid_t next_id; /*next ID to check */ hid_t ret_value=SUCCEED; /*return value */ H5I_id_info_t *curr_id; /*ptr to the current atom */ unsigned i; /*counter */ FUNC_ENTER_NOAPI(H5I_register, FAIL); /* Check arguments */ if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (type_ptr == NULL || type_ptr->count <= 0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); if ((id_ptr = H5FL_MALLOC(H5I_id_info_t)) == NULL) HGOTO_ERROR(H5E_ATOM, H5E_NOSPACE, FAIL, "memory allocation failed"); /* Create the struct & it's ID */ new_id = H5I_MAKE(type, type_ptr->nextid); id_ptr->id = new_id; id_ptr->count = 1; /*initial reference count*/ id_ptr->obj_ptr = object; id_ptr->next = NULL; /* hash bucket already full, prepend to front of chain */ hash_loc = type_ptr->nextid % (unsigned) type_ptr->hash_size; if (type_ptr->id_list[hash_loc] != NULL) id_ptr->next = type_ptr->id_list[hash_loc]; /* Insert into the type */ type_ptr->id_list[hash_loc] = id_ptr; type_ptr->ids++; type_ptr->nextid++; /* * This next section of code checks for the 'nextid' getting too large and * wrapping around, thus necessitating checking for duplicate IDs being * handed out. */ if (type_ptr->nextid > (unsigned)ID_MASK) { type_ptr->wrapped = 1; type_ptr->nextid = type_ptr->reserved; } /* * If we've wrapped around then we need to check for duplicate id's being * handed out. */ if (type_ptr->wrapped) { /* * Make sure we check all available ID's. If we're about at the end * of the range then wrap around and check the beginning values. If * we check all possible values and didn't find any free ones *then* * we can fail. */ for (i=type_ptr->reserved; inextid>(unsigned)ID_MASK) type_ptr->nextid = type_ptr->reserved; /* new ID to check for */ next_id = H5I_MAKE(type, type_ptr->nextid); hash_loc = H5I_LOC (type_ptr->nextid, type_ptr->hash_size); curr_id = type_ptr->id_list[hash_loc]; if (curr_id == NULL) break; /* Ha! this is not likely... */ while (curr_id) { if (curr_id->id == next_id) break; curr_id = curr_id->next; } if (!curr_id) break; /* must not have found a match */ type_ptr->nextid++; } if (i>=(unsigned)ID_MASK) /* All the IDs are gone! */ HGOTO_ERROR(H5E_ATOM, H5E_NOIDS, FAIL, "no IDs available in type"); } ret_value = new_id; done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_object * * Purpose: Find an object pointer for the specified ID. * * Return: Success: Non-null object pointer associated with the * specified ID. * * Failure: NULL * * Programmer: * * Modifications: * *------------------------------------------------------------------------- */ void * H5I_object(hid_t id) { H5I_id_info_t *id_ptr = NULL; /*ptr to the new atom */ void *ret_value = NULL; /*return value */ FUNC_ENTER_NOAPI(H5I_object, NULL); /* General lookup of the ID */ if (NULL!=(id_ptr = H5I_find_id(id))) { /* Get the object pointer to return */ ret_value = id_ptr->obj_ptr; } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iobject_verify * * Purpose: Find an object pointer for the specified ID, verifying that * its in a particular type. Public interface to * H5I_object_verify. * * Return: Success: Non-null object pointer associated with the * specified ID. * * Failure: NULL * * Programmer: Nathaniel Furrer * James Laird * Friday, April 23, 2004 * * Modifications: * *------------------------------------------------------------------------- */ void *H5Iobject_verify(hid_t id, H5I_type_t id_type) { void * ret_value; /* Return value */ FUNC_ENTER_API(H5Iobject_verify, NULL); if( H5I_IS_LIB_TYPE( id_type ) ) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type") if(id_type < 1 || id_type >= H5I_next_type) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "identifier has invalid type") ret_value = H5I_object_verify(id, id_type); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_object_verify * * Purpose: Find an object pointer for the specified ID, verifying that * its in a particular type. * * Return: Success: Non-null object pointer associated with the * specified ID. * * Failure: NULL * * Programmer: Quincey Koziol * Wednesday, July 31, 2002 * * Modifications: * *------------------------------------------------------------------------- */ void * H5I_object_verify(hid_t id, H5I_type_t id_type) { H5I_id_info_t *id_ptr = NULL; /*ptr to the new atom */ void *ret_value = NULL; /*return value */ FUNC_ENTER_NOAPI(H5I_object_verify, NULL); assert(id_type>=1 && id_typeobj_ptr; } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value); } /* H5I_object_verify() */ /*------------------------------------------------------------------------- * Function: H5I_get_type * * Purpose: Given an object ID return the type to which it * belongs. The ID need not be the ID of an object which * currently exists because the type number is encoded * in the object ID. * * Return: Success: A valid type number * * Failure: H5I_BADID, a negative value. * * Programmer: Robb Matzke * Friday, February 19, 1999 * * Modifications: * *------------------------------------------------------------------------- */ H5I_type_t H5I_get_type(hid_t id) { H5I_type_t ret_value = H5I_BADID; FUNC_ENTER_NOAPI(H5I_get_type, H5I_BADID); if (id>0) ret_value = H5I_TYPE(id); assert(ret_value>=H5I_BADID && ret_value= H5I_next_type || NULL==H5I_object(id)) HGOTO_DONE(H5I_BADID); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iremove_verify * * Purpose: Removes the specified ID from its type, first checking that the * type of the ID and the type type are the same. Public interface to * H5I_remove_verify. * * Return: Success: A pointer to the object that was removed, the * same pointer which would have been found by * calling H5I_object(). * * Failure: NULL * * Programmer: James Laird * Nathaniel Furrer * * Modifications: * *------------------------------------------------------------------------- */ void *H5Iremove_verify(hid_t id, H5I_type_t id_type) { void * ret_value; /* Return value */ FUNC_ENTER_API(H5Iremove_verify, NULL); if( H5I_IS_LIB_TYPE( id_type ) ) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type") /* Remove the id */ ret_value = H5I_remove_verify(id, id_type); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_remove_verify * * Purpose: Removes the specified ID from its type, first checking that * the ID's type is the same as the ID type supplied as an argument * * Return: Success: A pointer to the object that was removed, the * same pointer which would have been found by * calling H5I_object(). * * Failure: NULL * * Programmer: James Laird * Nat Furrer * * Modifications: * *------------------------------------------------------------------------- */ void * H5I_remove_verify(hid_t id, H5I_type_t id_type) { void * ret_value = NULL; /*return value */ FUNC_ENTER_NOAPI(H5I_remove_verify, NULL); /* Argument checking will be performed by H5I_remove() */ /* Verify that the type of the ID is correct */ if(id_type == H5I_TYPE(id)) { ret_value = H5I_remove(id); } done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_remove * * Purpose: Removes the specified ID from its type. * * Return: Success: A pointer to the object that was removed, the * same pointer which would have been found by * calling H5I_object(). * * Failure: NULL * * Programmer: * * Modifications: * *------------------------------------------------------------------------- */ void * H5I_remove(hid_t id) { H5I_id_type_t *type_ptr = NULL;/*ptr to the atomic type */ H5I_id_info_t *curr_id; /*ptr to the current atom */ H5I_id_info_t *last_id; /*ptr to the last atom */ H5I_type_t type; /*atom's atomic type */ unsigned hash_loc; /*atom's hash table location */ void * ret_value = NULL; /*return value */ FUNC_ENTER_NOAPI(H5I_remove, NULL); /* Check arguments */ type = H5I_TYPE(id); if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (type_ptr == NULL || type_ptr->count <= 0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "invalid type"); /* Get the bucket in which the ID is located */ hash_loc = (unsigned) H5I_LOC(id, type_ptr->hash_size); curr_id = type_ptr->id_list[hash_loc]; if (curr_id == NULL) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, NULL, "invalid ID"); last_id = NULL; while (curr_id != NULL) { if (curr_id->id == id) break; last_id = curr_id; curr_id = curr_id->next; } if (curr_id != NULL) { if (last_id == NULL) { /* ID is the first in the chain */ type_ptr->id_list[hash_loc] = curr_id->next; } else { last_id->next = curr_id->next; } ret_value = curr_id->obj_ptr; H5FL_FREE(H5I_id_info_t,curr_id); } else { /* couldn't find the ID in the proper place */ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, NULL, "invalid ID"); } /* Decrement the number of IDs in the type */ (type_ptr->ids)--; done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Idec_ref * * Purpose: Decrements the number of references outstanding for an ID. * If the reference count for an ID reaches zero, the object * will be closed. * * Return: Success: New reference count * Failure: Negative * * Programmer: Quincey Koziol * Dec 7, 2003 * * Modifications: * *------------------------------------------------------------------------- */ int H5Idec_ref(hid_t id) { int ret_value; /* Return value */ FUNC_ENTER_API(H5Idec_ref, FAIL); H5TRACE1("Is", "i", id); /* Check arguments */ if (id<0) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID"); /* Do actual decrement operation */ if((ret_value = H5I_dec_ref(id))<0) HGOTO_ERROR (H5E_ATOM, H5E_CANTDEC, FAIL, "can't decrement ID ref count"); done: FUNC_LEAVE_API(ret_value); } /* end H5Idec_ref() */ /*------------------------------------------------------------------------- * Function: H5I_dec_ref * * Purpose: Decrements the number of references outstanding for an ID. * This will fail if the type is not a reference counted type. * The ID type's 'free' function will be called for the ID * if the reference count for the ID reaches 0 and a free * function has been defined at type creation time. * * Return: Success: New reference count. * * Failure: Negative * * Programmer: Unknown * * Modifications: * * Robb Matzke, 19 Feb 1998 * It is no longer an error when the reference count of an item reaches * zero and no `free' function has been defined. The object is still * removed from the list. * * Robb Matzke, 30 Dec 1998 * Fixed a bug where the return value was always zero instead of the new * reference count. * * Robb Matzke, 19 Feb 1999 * If the free method is defined and fails then the object is not * removed from the type and its reference count is not decremented. * The type number is now passed to the free method. * * Raymond, 11 Dec 2001 * If the freeing function fails, return failure instead of reference * count 1. This feature is needed by file close with H5F_CLOSE_SEMI * value. * *------------------------------------------------------------------------- */ int H5I_dec_ref(hid_t id) { H5I_type_t type; /*type the object is in*/ H5I_id_type_t *type_ptr; /*ptr to the type */ H5I_id_info_t *id_ptr; /*ptr to the new ID */ int ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5I_dec_ref, FAIL); /* Sanity check */ assert(id>=0); /* Check arguments */ type = H5I_TYPE(id); if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (type_ptr == NULL || type_ptr->count <= 0) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); /* General lookup of the ID */ if ((id_ptr=H5I_find_id(id))==NULL) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't locate ID"); /* * If this is the last reference to the object then invoke the type's * free method on the object. If the free method is undefined or * successful then remove the object from the type; otherwise leave * the object in the type without decrementing the reference * count. If the reference count is more than one then decrement the * reference count without calling the free method. * * Beware: the free method may call other H5I functions. */ if (1==id_ptr->count) { if (!type_ptr->free_func || (type_ptr->free_func)(id_ptr->obj_ptr)>=0) { H5I_remove(id); ret_value = 0; } else { ret_value = FAIL; } } else { ret_value = --(id_ptr->count); } done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iinc_ref * * Purpose: Increments the number of references outstanding for an ID. * * Return: Success: New reference count * Failure: Negative * * Programmer: Quincey Koziol * Dec 7, 2003 * * Modifications: * *------------------------------------------------------------------------- */ int H5Iinc_ref(hid_t id) { int ret_value; /* Return value */ FUNC_ENTER_API(H5Iinc_ref, FAIL); H5TRACE1("Is", "i", id); /* Check arguments */ if (id<0) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID"); /* Do actual increment operation */ if((ret_value = H5I_inc_ref(id))<0) HGOTO_ERROR (H5E_ATOM, H5E_CANTINC, FAIL, "can't increment ID ref count"); done: FUNC_LEAVE_API(ret_value); } /* end H5Iinc_ref() */ /*------------------------------------------------------------------------- * Function: H5I_inc_ref * * Purpose: Increment the reference count for an object. * * Return: Success: The new reference count. * * Failure: Negative * * Programmer: Robb Matzke * Thursday, July 29, 1999 * * Modifications: * *------------------------------------------------------------------------- */ int H5I_inc_ref(hid_t id) { H5I_type_t type; /*type the object is in*/ H5I_id_type_t *type_ptr; /*ptr to the type */ H5I_id_info_t *id_ptr; /*ptr to the ID */ int ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5I_inc_ref, FAIL); /* Sanity check */ assert(id>=0); /* Check arguments */ type = H5I_TYPE(id); if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (!type_ptr || type_ptr->count<=0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); /* General lookup of the ID */ if (NULL==(id_ptr=H5I_find_id(id))) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't locate ID"); /* Set return value */ ret_value=++(id_ptr->count); done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iget_ref * * Purpose: Retrieves the number of references outstanding for an ID. * * Return: Success: Reference count * Failure: Negative * * Programmer: Quincey Koziol * Dec 7, 2003 * * Modifications: * *------------------------------------------------------------------------- */ int H5Iget_ref(hid_t id) { int ret_value; /* Return value */ FUNC_ENTER_API(H5Iget_ref, FAIL); H5TRACE1("Is", "i", id); /* Check arguments */ if (id<0) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID"); /* Do actual retrieve operation */ if((ret_value = H5I_get_ref(id))<0) HGOTO_ERROR (H5E_ATOM, H5E_CANTGET, FAIL, "can't get ID ref count"); done: FUNC_LEAVE_API(ret_value); } /* end H5Iget_ref() */ /*------------------------------------------------------------------------- * Function: H5I_get_ref * * Purpose: Retrieve the reference count for an object. * * Return: Success: The reference count. * * Failure: Negative * * Programmer: Quincey Koziol * Saturday, Decemeber 6, 2003 * * Modifications: * *------------------------------------------------------------------------- */ int H5I_get_ref(hid_t id) { H5I_type_t type; /*type the object is in*/ H5I_id_type_t *type_ptr; /*ptr to the type */ H5I_id_info_t *id_ptr; /*ptr to the ID */ int ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5I_get_ref, FAIL); /* Sanity check */ assert(id>=0); /* Check arguments */ type = H5I_TYPE(id); if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (!type_ptr || type_ptr->count<=0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); /* General lookup of the ID */ if (NULL==(id_ptr=H5I_find_id(id))) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't locate ID"); /* Set return value */ ret_value=id_ptr->count; done: FUNC_LEAVE_NOAPI(ret_value); } /* end H5I_get_ref() */ /*------------------------------------------------------------------------- * Function: H5Iinc_type_ref * * Purpose: Increments the number of references outstanding for an ID type. * * Return: Success: New reference count * Failure: Negative * * Programmer: Nat Furrer * James Laird * April 30, 2004 * * Modifications: * *------------------------------------------------------------------------- */ int H5Iinc_type_ref(H5I_type_t type) { int ret_value; /* Return value */ FUNC_ENTER_API(H5Iinc_type_ref, FAIL); H5TRACE1("Is", "It", type); /* Check arguments */ if (type<=0 || type >= H5I_next_type) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID type"); if( H5I_IS_LIB_TYPE( type ) ) { HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type"); } /* Do actual increment operation */ if((ret_value = H5I_inc_type_ref(type))<0) HGOTO_ERROR (H5E_ATOM, H5E_CANTINC, FAIL, "can't increment ID type ref count"); done: FUNC_LEAVE_API(ret_value); } /* end H5Iinc_ref() */ /*------------------------------------------------------------------------- * Function: H5I_inc_type_ref * * Purpose: Increment the reference count for an ID type. * * Return: Success: The new reference count. * * Failure: Negative * * Programmer: James Laird * Nat Furrer * Friday, April 30, 2004 * * Modifications: * *------------------------------------------------------------------------- */ int H5I_inc_type_ref(H5I_type_t type) { H5I_id_type_t *type_ptr; /* ptr to the type */ int ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5I_inc_type_ref, FAIL); /* Sanity check */ assert(type>0 && type < H5I_next_type); /* Check arguments */ type_ptr = H5I_id_type_list_g[type]; if (!type_ptr ) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); /* Set return value */ ret_value=++(type_ptr->count); done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Idec_type_ref * * Purpose: Decrements the reference count on an entire type of IDs. * If the type reference count becomes zero then the type is * destroyed along with all atoms in that type regardless of * their reference counts. Destroying IDs involves calling * the free-func for each ID's object and then adding the ID * struct to the ID free list. Public interface to * H5I_dec_type_ref. * Returns the number of references to the type on success; a * return value of 0 means that the type will have to be * re-initialized before it can be used again (and should probably * be set to H5I_UNINIT). * * Return: Number of references to type on success/Negative on failure * * Programmer: Nathaniel Furrer * James Laird * * Modifications: * *------------------------------------------------------------------------- */ herr_t H5Idec_type_ref(H5I_type_t type) { herr_t ret_value; FUNC_ENTER_API(H5Idec_type_ref, FAIL); if( H5I_IS_LIB_TYPE( type ) ) { HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type"); } ret_value = H5I_dec_type_ref(type); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_dec_type_ref * * Purpose: Decrements the reference count on an entire type of IDs. * If the type reference count becomes zero then the type is * destroyed along with all atoms in that type regardless of * their reference counts. Destroying IDs involves calling * the free-func for each ID's object and then adding the ID * struct to the ID free list. * Returns the number of references to the type on success; a * return value of 0 means that the type will have to be * re-initialized before it can be used again (and should probably * be set to H5I_UNINIT). * * Return: Number of references to type on success/Negative on failure * * Programmer: Unknown * * Modifications: * * Robb Matzke, 25 Feb 1998 * IDs are freed when a type is destroyed. * *------------------------------------------------------------------------- */ herr_t H5I_dec_type_ref(H5I_type_t type) { H5I_id_type_t *type_ptr = NULL; /* ptr to the atomic type */ herr_t ret_value = FAIL; FUNC_ENTER_NOAPI(H5I_dec_type_ref, FAIL); if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (type_ptr == NULL || type_ptr->count <= 0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); /* * Decrement the number of users of the atomic type. If this is the * last user of the type then release all atoms from the type and * free all memory it used. The free function is invoked for each atom * being freed. */ if (1==type_ptr->count) { H5I_destroy_type(type); ret_value = 0; } else { --(type_ptr->count); ret_value = type_ptr->count; } done: FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iget_type_ref * * Purpose: Retrieves the number of references outstanding for a type. * * Return: Success: Reference count * Failure: Negative * * Programmer: Nat Furrer * James Laird * April 30, 2004 * * Modifications: * *------------------------------------------------------------------------- */ int H5Iget_type_ref(H5I_type_t type) { int ret_value; /* Return value */ FUNC_ENTER_API(H5Iget_type_ref, FAIL); H5TRACE1("Is", "It", type); /* Check arguments */ if (type<=0 || type >= H5I_next_type) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID type"); if( H5I_IS_LIB_TYPE( type ) ) { HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type"); } /* Do actual retrieve operation */ if((ret_value = H5I_get_type_ref(type))<0) HGOTO_ERROR (H5E_ATOM, H5E_CANTGET, FAIL, "can't get ID type ref count"); done: FUNC_LEAVE_API(ret_value); } /* end H5Iget_ref() */ /*------------------------------------------------------------------------- * Function: H5I_get_type_ref * * Purpose: Retrieve the reference count for an ID type. * * Return: Success: The reference count. * * Failure: Negative * * Programmer: Nat Furrer * James Laird * April 30, 2004 * * Modifications: * *------------------------------------------------------------------------- */ int H5I_get_type_ref(H5I_type_t type) { H5I_id_type_t *type_ptr; /*ptr to the type */ int ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5I_get_type_ref, FAIL); /* Sanity check */ assert(type>=0); /* Check arguments */ type_ptr = H5I_id_type_list_g[type]; if (!type_ptr ) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type"); /* Set return value */ ret_value=type_ptr->count; done: FUNC_LEAVE_NOAPI(ret_value); } /* end H5I_get_ref() */ /*------------------------------------------------------------------------- * Function: H5Isearch * * Purpose: Apply function FUNC to each member of type TYPE and return a * pointer to the first object for which FUNC returns non-zero. * The FUNC should take a pointer to the object and the KEY as * arguments and return non-zero to terminate the search (zero * to continue). Public interface to H5I_search. * * Limitation: Currently there is no way to start searching from where a * previous search left off. * * Return: Success: The first object in the type for which FUNC * returns non-zero. NULL if FUNC returned zero * for every object in the type. * * Failure: NULL * * Programmer: James Laird * Nathaniel Furrer * Friday, April 23, 2004 * *------------------------------------------------------------------------- */ void *H5Isearch(H5I_type_t type, H5I_search_func_t func, void *key) { void * ret_value; /* Return value */ FUNC_ENTER_API(H5Isearch, NULL) if( H5I_IS_LIB_TYPE( type ) ) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type") ret_value = H5I_search(type, func, key); done: FUNC_LEAVE_API(ret_value) } /* end H5Isearch() */ /*------------------------------------------------------------------------- * Function: H5I_search * * Purpose: Apply function FUNC to each member of type TYPE and return a * pointer to the first object for which FUNC returns non-zero. * The FUNC should take a pointer to the object and the KEY as * arguments and return non-zero to terminate the search (zero * to continue). * * Limitation: Currently there is no way to start searching from where a * previous search left off. * * Return: Success: The first object in the type for which FUNC * returns non-zero. NULL if FUNC returned zero * for every object in the type. * * Failure: NULL * * Programmer: Robb Matzke * Friday, February 19, 1999 * * Modifications: * *------------------------------------------------------------------------- */ void * H5I_search(H5I_type_t type, H5I_search_func_t func, void *key) { H5I_id_type_t *type_ptr = NULL; /*ptr to the type */ H5I_id_info_t *id_ptr = NULL; /*ptr to the new ID */ H5I_id_info_t *next_id = NULL; /*ptr to the next ID */ unsigned i; /*counter */ void *ret_value = NULL; /*return value */ FUNC_ENTER_NOAPI(H5I_search, NULL); /* Check arguments */ if (type <= H5I_BADID || type >= H5I_next_type) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "invalid type number"); type_ptr = H5I_id_type_list_g[type]; if (type_ptr == NULL || type_ptr->count <= 0) HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "invalid type"); /* Only iterate through hash table if there are IDs in group */ if(type_ptr->ids > 0) { /* Start at the beginning of the array */ for (i=0; ihash_size; i++) { id_ptr = type_ptr->id_list[i]; while (id_ptr) { next_id= id_ptr->next; /* Protect against ID being deleted in callback */ if ((*func)(id_ptr->obj_ptr, id_ptr->id, key)) HGOTO_DONE(id_ptr->obj_ptr); /*found the item*/ id_ptr = next_id; } /* end while */ } /* end for */ } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value); } /* end H5I_search() */ /*------------------------------------------------------------------------- * Function: H5I_find_id * * Purpose: Given an object ID find the info struct that describes the * object. * * Return: Success: Ptr to the object's info struct. * * Failure: NULL * * Programmer: * * Modifications: * *------------------------------------------------------------------------- */ static H5I_id_info_t * H5I_find_id(hid_t id) { H5I_id_type_t *type_ptr; /*ptr to the type */ H5I_id_info_t *last_id; /*ptr to the last ID */ H5I_id_info_t *id_ptr; /*ptr to the new ID */ H5I_type_t type; /*ID's type */ unsigned hash_loc; /*bucket pointer */ H5I_id_info_t *ret_value = NULL; /*return value */ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5I_find_id); /* Check arguments */ type = H5I_TYPE(id); assert(type > H5I_BADID && type < H5I_next_type); type_ptr = H5I_id_type_list_g[type]; assert(type_ptr && type_ptr->count > 0); /* Get the bucket in which the ID is located */ hash_loc = (unsigned)H5I_LOC(id, type_ptr->hash_size); id_ptr = type_ptr->id_list[hash_loc]; /* Scan the bucket's linked list for a match */ last_id=NULL; while (id_ptr) { if (id_ptr->id == id) { /* If we found an object, move it to the front of the list, if it isn't there already */ if(last_id!=NULL) { last_id->next=id_ptr->next; id_ptr->next=type_ptr->id_list[hash_loc]; type_ptr->id_list[hash_loc]=id_ptr; } /* end if */ break; } /* end if */ last_id=id_ptr; id_ptr = id_ptr->next; } /* end while */ /* Set the return value */ ret_value = id_ptr; FUNC_LEAVE_NOAPI(ret_value); } /*------------------------------------------------------------------------- * Function: H5Iget_name * * Purpose: Gets a name of an object from its ID. * * Return: Success: The length of name. * * Failure: -1 * * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu * * Date: July 26, 2002 * * Comments: Public function * If `name' is non-NULL then write up to `size' bytes into that * buffer and always return the length of the entry name. * Otherwise `size' is ignored and the function does not store the name, * just returning the number of characters required to store the name. * If an error occurs then the buffer pointed to by `name' (NULL or non-NULL) * is unchanged and the function returns a negative value. * If a zero is returned for the name's length, then there is no name * associated with the ID. * *------------------------------------------------------------------------- */ ssize_t H5Iget_name(hid_t id, char *name/*out*/, size_t size) { ssize_t ret_value; FUNC_ENTER_API(H5Iget_name, FAIL) H5TRACE3("Zs", "ixz", id, name, size); /* Call internal group routine to retrieve object's name */ if((ret_value = H5G_get_name(id, name, size, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve object name") done: FUNC_LEAVE_API(ret_value) } /* end H5Iget_name() */ /*------------------------------------------------------------------------- * Function: H5Iget_file_id * * Purpose: The public version of H5I_get_file_id(), obtains the file * ID given an object ID. User has to close this ID. * * Return: Success: file ID * * Failure: a negative value * * Programmer: Raymond Lu * Oct 27, 2003 * * Modifications: * *------------------------------------------------------------------------- */ hid_t H5Iget_file_id(hid_t obj_id) { hid_t ret_value; FUNC_ENTER_API(H5Iget_file_id, FAIL); H5TRACE1("i", "i", obj_id); if((ret_value = H5I_get_file_id(obj_id))<0) HGOTO_ERROR (H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve file ID"); done: FUNC_LEAVE_API(ret_value); } /*------------------------------------------------------------------------- * Function: H5I_get_file_id * * Purpose: The private version of H5Iget_file_id(), obtains the file * ID given an object ID. * * Return: Success: file ID * * Failure: a negative value * * Programmer: Raymond Lu * Oct 27, 2003 * *------------------------------------------------------------------------- */ hid_t H5I_get_file_id(hid_t obj_id) { H5G_loc_t loc; /* Location of object */ H5I_type_t type; /* ID type */ hid_t ret_value; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5I_get_file_id) /* Get object type */ type = H5I_TYPE(obj_id); if(type == H5I_FILE) { ret_value = obj_id; /* Increment reference count on atom. */ if(H5I_inc_ref(ret_value) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTSET, FAIL, "incrementing file ID failed") } else if(type == H5I_DATATYPE || type == H5I_GROUP || type == H5I_DATASET || type == H5I_ATTR) { if(H5G_loc(obj_id, &loc) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get object location") if((ret_value = H5F_get_id(loc.oloc->file)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get file ID") } else HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid object ID") done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5I_get_file_id() */ /*------------------------------------------------------------------------- * Function: H5I_debug * * Purpose: Dump the contents of a type to stderr for debugging. * * Return: Success: Non-negative * * Failure: Negative * * Programmer: Robb Matzke * Friday, February 19, 1999 * * Modifications: * * Pedro Vicente, 22 Aug 2002 * Added `id to name' support. * *------------------------------------------------------------------------- */ #ifdef H5I_DEBUG_OUTPUT static herr_t H5I_debug(H5I_type_t type) { H5I_id_type_t *type_ptr; H5I_id_info_t *cur; H5G_name_t *path; int is, js; unsigned int iu; herr_t ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5I_debug, FAIL); fprintf(stderr, "Dumping ID type %d\n", (int)type); type_ptr = H5I_id_type_list_g[type]; /* Header */ fprintf(stderr, " count = %u\n", type_ptr->count); fprintf(stderr, " reserved = %u\n", type_ptr->reserved); fprintf(stderr, " wrapped = %u\n", type_ptr->wrapped); fprintf(stderr, " hash_size = %lu\n", (unsigned long)type_ptr->hash_size); fprintf(stderr, " ids = %u\n", type_ptr->ids); fprintf(stderr, " nextid = %u\n", type_ptr->nextid); /* Cache */ fprintf(stderr, " Cache:\n"); for (is=0; isid)==type) { fprintf(stderr, " Entry-%d, ID=%lu\n", is, (unsigned long)(H5I_cache_g[is]->id)); } } /* List */ fprintf(stderr, " List:\n"); for (iu=0; iuhash_size; iu++) { for (js=0, cur=type_ptr->id_list[iu]; cur; cur=cur->next, js++) { fprintf(stderr, " #%u.%d\n", iu, js); fprintf(stderr, " id = %lu\n", (unsigned long)(cur->id)); fprintf(stderr, " count = %u\n", cur->count); fprintf(stderr, " obj = 0x%08lx\n", (unsigned long)(cur->obj_ptr)); /* Get the group location, so we get get the name */ switch(type) { case H5I_GROUP: path = H5G_nameof((H5G_t*)cur->obj_ptr); break; case H5I_DATASET: path = H5D_nameof((H5D_t*)cur->obj_ptr); break; case H5I_DATATYPE: path = H5T_nameof((H5T_t*)cur->obj_ptr); break; default: continue; /* Other types of IDs are not stored in files */ } /* end switch*/ if(path) { if(path->user_path_r) fprintf(stderr, " user_path = %s\n", H5RS_get_str(path->user_path_r)); if(ent->canon_path_r) fprintf(stderr, " canon_path = %s\n", H5RS_get_str(path->canon_path_r)); } /* end if */ } /* end for */ } /* end for */ done: FUNC_LEAVE_NOAPI(SUCCEED); } #endif /* H5I_DEBUG_OUTPUT */ f-3Oߍ=Llแ3]V`͋a?*>^ERS0*} $=z5"ʽD:pN4c:¡[|hdӕ|AVTBiT7qԹ ÙB0-PݚTnRwqfZ䡮0)e5TO2XA=[ fr}|PjjSҀkX-;] b"#o]'=Ϻo]7#WC~u@4XT|;"@9 ׻t۵}}yiKqΎu&^Q!4HYץ\5m-=榥ߺ@C|IĿʒzbtPW9b6Vl~9 JNO{52^A% C\P~y׳8`.^fxcY֗RjA`)l  IdՍ4]NLJ$gx~hϲlˑhfo1-З:yZ\[l l_tlPsN VK!^x?NJO־{Y~Kf9-nmՍ -X 8F3i^^]-v5ҷ 6muZUiV1sN˚K|ܓzPSpxRIVq|%t R;xn#Gp}A:qϾ ) OM*TO] ԟ`˽u˹}EY97MU3v:Ϧva:%5R_YWl)jl[^`# ARkt^ift"+dj mbM%t _ o0#nigzo: =<9\w7+ =Wȅ^#K0EG76 E#^%i*h@:(=T`A 촔P].~FV=EZ8̅=PD?ҌPQvALjP =ǯVNVXIP9a0A:"6!R[#' 4>bxA8.ZCbN :z+7`֒JbHfIq BA+`+%BWCk ӰDt91ĽOK+ +Ѻ1P-N@'zdpdzI% ޙp@n2с *IF8 F8M~̳GL\ t ەQ@+FfsHb}Cd#hOFNX(ϤV[!QK*OY| ^[ljkjV6jwĿ{$x="{2lGYE0';d,)Q}+[0ť"̼Aoo"K!2cQ^˾p[)=TZ[#OK c]7%tfngZa@[^ '^{'#>XW)F$L;˝v}"`Bbr!M.;nqȚ-0M'Dȅ;Z!V"1q@$wJ->ؘّFJ>9'v'tav }feuBn"1.mTI6:KܬN=eT(@,w|cc\Y|ĊTN(ENؒ80Z;A#zi#ș}?]r(Z]Is[K'd 9 jGBEo9m{11%ײxBSxt΁{aFGr ^ŋA/2$j4$XR!MXѳ|QJwS:pD3_i'G,WD7ǧVa=]c˥JMַ f љ =^Z;:Pˌt0M]Cy2:,Ë ͪpօtyt@ZSz]/5FEdԝ Ġ k}iI5quܱae6MvqܶJ%4SXtmLe`QGTw@yE/#ih<֕n`(JV< t#bRVF2 2m7X99o 9Q%t'8yD$H02W+3"c!]ZhFr8\zP/ 8&s½ v#%"/ H ~қ0ʾ>.hi PVC:7)\Л Ou,$RîQ} ,sto˔=qNJ2&w&\x"ѴT1Lfs1 wFpaioa3*#D; 5GM"C1 fڑgEǏ9_T/KfU0j9T^w@ES9 ;ݲJeMWJXyZ*lFFNsTxAOl~.%%OYCڿX4/}9lkxnx F`6ק4, 3 sbs pQ<"Aڢ3^[\t-}H9Ecr43X+UUG3BOrv"(1X.XDVOi*vQn˰ rz% ˓BF|5um6]z!'ֵJJt_ܾ١*\(ID7uVIUe|"ԼɵycZ(=̼~I /KAbmR;D,}LM$$ڒj1@v-zv8cntŐ-|-"Z>1(᳖d $k0qUR :X`c m>m=nf֢f[Y-.G#!`g?;b5NJB?et*|r}/u2 $rH\i~E% iykRwPɉvV.7/1O3p/Adzp̸)xE|;R `o }"E@x ;41" y`sx7 7);+B\@ʚ)[R.Y͇d+6ha-6<$Nw`:)[;P0rr1d 3M ߠSɷx=#94LE\ܩD^e˵qH"AⶴE%);_/l#8,&vF//kat(tm"_BA!Xq(*VK낰cPd]Y0B*rzy$IJ9K*ir]~&5"V[<8|2D8C/ c/r2F֧2ɷu"(R)ދ> //d}"*AriQ#ΜI"v} 31B]WC»z]+Gje=@8Sv=xSibw>TG6( # k&=7pDq[גvV;ac3v`1)8MK(t0 F$w8A(`M۟CmQ?ndr+L4ƒ"VVJ,~ s Q"A3 4GHɌ]kxiTHҪKy]eY)0-ڬTJDe*Uwu-̸ӨTf;77  -t6Pb7nՎ$Ků+\-ì{0{^R(v,~I@+a 4'knj % w F?N/:WbF8rap)OW7~?g'8s  "9\ΒIBh7x*[ʟ/8!E9L۷ P%) W%B1"eaR!咈C9 W= 5x&c@8k]RԤ"mm&'($¨V)5o۷M +LGDkQ\1YYhf> V[2C(0 NlvM/Z"=-M\B>Ѿ,:IƟr#20EgZ`tGJ*%",f3yȌ(J8KZkjAk*v+! <٨A͆,`eY}&Z(hi*Ӎzm =α%_X[.Mo9e HWyuL_d{DM :ŏ[zI{mRڔ lmBJ H& hכXyCGzu3y\r̀2649sUn\MS,ЅhtQh*8 h0 l 9U HD9ȚIыV&q¼@ˁyb5r`St`ruSNWΌFT5 - 0O`Z+j&Kx:#~떣ߘcc1ڂa& ng4,sft\UK# pag|XDW >P´lǮ ,F(2ղ$'>TsNUwBH>]>`٬֔99GBvfСMwp ]:"9b00 0@W/h@S Ռ3(JЙ?Ut۞5#bMlsF8&M)}=\]L&eyu BXqް1T'1m!~^¿M4 wNߒS&u.u:\c_Z9lah2V'~/ yc]Ө,QfT"XgyPSwm6ζo4'{K{5a(isCsez_" ./}X,LK :MlŲ0.Dq&fSl\aKv@XH})CYy`Y*4'Y wҏɦҽF(Ց\֥K„"׬G7*::4s~ O=tpuhH]/~p sauMQ%lkѷUtxou: llYXl/by-tZ,N -&n@tPih4?eOdt*ĴT)Je|ոܤ&ɲxY~ʯ}C+>CN+M$q4ESŽZI~cMΜAMq.d$D)j_]ܴY[KRBY^m2MocytOsbM~$e*7A+\wדjo B& Yqߊq+7$~]MIo'StVQUFcZ*XRyPDFӆǼhMƻn}Ӏq< NN.HC#殺/L1Biap=yͭNăvn# ~Ǟ#jcNΚ[;\,RH[&ČQ+OwӽO E@b ˇ_੧9; F8 74]"79]FݭTId`[NZ(F1gB.P@mlIGUrSE ם)~"htݑχ~ªs} FULESkpg. !r,`钐ZP"NͽPH$˿"\7VoywR_1d7]rȇC zc $j'P9!JLtI!MO'J/ciק;Ӫv5J&Z+G%æQ@d [ܿ'Uzݠs¿#:lȅqnjh#FV0HD`\NY!G,CHi>$g aՍ`f]@D"Iv"DkJ#\fٿ0<ځN4uqCG^g0U NJWri8@K=lW*1Da3IFpG$6K2) 2`U{u5 dìkD(vwrADvMrbt/sUyA^a"{d]sq&~t3M&اN#~&V<_lު(t "vmg!IHLl \qFbhV/Zd'H ӱ, EbTԴ%e *7F=1&lXM{ ǂHo|H]:}@n ڎE0PYI2EBVN'vh z;uPB5r0혬K>h}5K{H,q1 P@\!yp~iVcv;;L2yQJ5aoN`[&HirJ?x%i ap!,rkuelUB.qG8Ms3]AXW1ٛ l,+XlsLc[ivVՅXY-s9Qg]ں ]yla"Ë\@Zn˽9ۮFUڱ(Θ޺czj1_HCg9T>OݠB:zz h}3p;S{ b}_⚛=VK7dVdPAƲ?5sȈ Kb$UMCa@>K&) {g]&E%z9&ȫo~V̓ey}z4V;geMǕ+WC)ãm;۫Z ;sUyAԊTl\fя*aQ'fQ kL,{ѡr&ɤ"5օ+*9XKCHeGxi-3Fԋ:ihlmY̗V[fG18jfR \)am2$hSbVy MAwQD?/Еz z/@ 1C~ Ƒ m84Cetu8TTAwgX~׌I2pzBJxڭ&yAEf:[є:!5@qw#:@ ɞ }2T**ؖٱ( oC{d2vvhUOIH1}`/ ۯi1FROdIDzF;Eu:HDej'u2vϱ$TAl `Ďw⭶OцgҖԆxrX,AoQ$ !,K-D؅rn/i/um6AK|AEW-`O/p_h/ .jmx(+pUNs9"zYy !p;qF KVj]ׄA6G0䓵i}%bĤjd+Kdxan,faoHGk#cyBuc1g \zcgB <C%Q7^EX'GP-#21Zlyt;gnC~S9ANu07)$[1(8#]Þ@ :%ޕ#zAݡϱJDP쑐噤I tJ>.ဆ{5؎/N ot ̛~+siWԫL /X}y_h˧B҄$l3.xUskqHג#(ܸVҔ3&>,!Vw Z٭ Yʠ<!5 z#N(D%LA /-ȆbzSR]yp n{FE8bHuq"=i^䃫hŸ=M4kw>3 y%[ONǣ#p,C `aBJtg >qAyEu,_"/޸;u_iT^@ )'Z-Pd594Ҍ^ǣd PPƔT~iHB;S9璐+sZݐ7t)zI1VlCæW)JwS"@vG7*p&)#/H4qD4wFZuبUc4s 챩''/%miUp _x؞\/G9+?̛%E],_܈V.TbB@JӾ::\\*DRHlg Qde8A8+E19+  :ŚJR8׷ j:2ovo 'j]&c67uG׉ҋ4]Zi6( Ϧ)?@W$Ϡ.-{ǮőO|PEDo6vϚNE[X4ķlgIJJ U)#"C?<= -FJy]#_m_ 7l<.Ģ:(H.,k758%H'Ǯ$LJLJGIlL!2h^VʚBJnk^7xD|fh'@~$)1.oԖb0~=[d GiuDԚàݤ,1!ҭe͚:ɧff)UI^ Ґ&r>f'AdT5)IqTkb"ss 3 #>*mum}3DVǓTU rqF]vm ~"hP^›HB'Ҭė2aJIl"%ۂ`LZx0 79Ѣ %BR0/ tπM܋W|GQ|%"gl*%߀ڸ\N\JYLg{TVJ8,G_^ޡ`pRᲺzʂ+{3K3=!q?8MnxΊA󨜡Q :z] d)\<\m>;Jz*$b<0Ŕ,p sbW^6^iZ{Yw\Ȧ<3:$ꊛH*kc鼌$eW=5NH9D ìE$MY™1MHB?o!yj6n:K\ V*+ ncc|Y76km29Ez@ye_v<WkidLHam O8/mR>GPoF]g g%^eR, /}x(29 v3ތXw0h1W{TiWLևYƆ}NICvDts ñv b"ǕL;s qZڇ)t,^Řȹ&em鵚d{lCi %2lKP Rs<c8gk!5]gʶ `d5I2ڵjyZ#*%ߨWP_KMsu6UV.={k<- a"LkGDJq36RVZ0(q JK$b~]ɠV!T5ТWFL4Sz7z[|Vp .2HO v[ afuwD٬ zjr)F(ǭALxgB}l-r `^zs^W(LjÇlL[eJ#PB}P <ϑ5Ȇd;/,P_q"^?Zլc o%!#"mPrMR%tGT,vPJiT`@12&baS(]aM ^R&PҀ)G]ɗ1 BùQP(GVWVJ&%qʓ$IXNrUBbiOEƂdѥH&n:J”G[vLaXVMf/]k3yX]$ʡs0(/a`Ja?(?(FQZ][[%TDY5t*7aimcJ*+eiIyDji ,ndJ@JxުT*y&$ʬ7ݖ$>jغMڠfa6|hӱŭ(8>%RG[~wUAj%Cq5T|/J-1x^}(nPbΦ0a;fh'I/D㴣;=.6eh;(f*3d.eP+oq .4 Z+#\2NBK-N--?;/]T82)^+rNj/)A>Bou0 ٯljf^y-8HףVyƭȦz1ͣVYϢ<|6Edm2ګ+tA)vro`Dٔ k tE*}~X1ȵdZ(Kjxvڇ#;OꈍPL0 >f@{%0QJ4ŒAtUKRY\y+rYw(?#/}tA=bѾaHzHSC(RKL=L)ۮJ5cە e}uR"COɻ@xYc%S([@ڦѾ{yR [΃aEDO5IW8/+tĵV/qn&;xI84®.Ef! ꫬwTR2@,A(I*`H+h}Q:G"XxUc3 q(!RNg9)(6ICzQX]SlCV Mb~aTx$l mњHSI vr&\9 G?.G؉619.,h:<00||Uu,pz!$Ԩs?Z;vkx2Y#ͼܫ9E|%  2@Cx,\ C+Hz׉) o$dSq@/1>P&IX13~=qPUQ !vfGITw2@>\QS,+NR<+58$^idiTS* g(dx 5G!\Oi Y}@1O'dH"0fdI{"*>ycR^l,񈽍Yʼn4!d$Rc-̮;K-avwwS NQMY䪊6V,Dm$' mH$Rq.B8 B:+k ~@ ?7ׯ@^)t;u/hf-](3_5L5 EVlFw 1smL֒!F.jizM<"/着+Zjy&tD! N &&}*ť\Ą/N u ǺfQ#7K2H2β*UrPH)N)mr:q/& ؔ8cx_OtƗJWV35 9*gVa}IwO |U/粡<&̱Dv#oѿ ~Q(JtVVqu>艔Yyԋ袞edJ0#cCh!zaxl $U;y R^_%L'nJ]Ih KRE84&}@v7BϸY-CQg 2 ͋mY[[IK˫J+rVb@\7WnྒgG pm|FG_-jyIDlVӢ>~\_+.~qǭy[8/ߜ-7gYV9Ak 0_Rnϼ^37~\zgo_>[[]>u<>:tQz}ݛ<9v7v_,—C5R`m W>l?ϟw}8?sqۆ^/Ξ=+=|SM#*cmhgPx4u ~ÿ9#$߼ƚ- ]`.`d;1 Ye36 ϛgK 7Α/û oԷX?pg|^{^{^{^Ol 태Zz_P>1ymm$-?$ ~%߅Yk+~~]ضD|_ϏIמממk//>?vg BgrEG+HWK߯,olq m{>=oV<{vr|et^zmN %ϟmk~ͳ}Ĝg[h:cڋs_V"r]:rٳoK/`[*=Cc~ >yLCo~AJ*SBaFQ9vq{Z:ǚjϹ7a{ac G~/||۷o^o;쮜SVCcs^G g_X%O|^:CK8/]8/ywBbK@>/@83A>~-@(0:†Y٩1uY+[BNc۫ŕ닻*!fI{0u5|J !zHfl-,ؿv`o7H']GUa7Kn qϖrdYXY6^#.UBH;dfoz3Ev$[tpXyvsU*$E[絿>+-?;/-¿祅3 >;2 oK >˯>쟟[|~<ǟy]d]Xny& ;G7ÿ]7%b2D6ZH)r${d3, ʑZciOMd:n5(eW_?;~Vd78G]2ci ̌>{_;>?Tf U^^,vQfZ_, # s%Q.w0UL$wILI{ojo}v`böc2p-d\l>#4s`/_ԯ^4z.q]@B$,wwE:ڼSy8HBS:ϙNqxV?1YȨ6ħR[Y|gϬo ˰SmZ'xS"|Omh~V)ڡ27p="NzM|cnRlٶF@0JozWfh n9] D((b/ƔIÀ^H?'y?[AA@Y89k}w=l/}L$i)ܩ[`5[A1©HIA+o K<Stk Ckp8Q;e(;;11ՈL`vQ\0y\v>!pCy8(Mg0)}8&q*fPA0ׅ31EaE7uW\=Pem=_޺Cmz!Y4l\=>*p`V4 {W6@/VPa! ¬Y2$ ݊"ٷ"]VGP#Z( S K1XL}2DnwP jݠ8G /}ALl]c`0.@W}OFؒ0уuq#֊~#Z{#)%k06,Ly:Lm/Y]h㭳 0`-9\0Ȯ8415¢f\Y"鴮v&#Vq 3-X-_S^EmXRguOt`pjB|yWXc 7C'CTtOp!v۵֐b۔eY3 B=2+,BJW@=j+ϵT[#Rp/9lsb2{ 0f^1|J;JWO *qnt=S|i2,}:l+SS ot FѲ'|,K3V>n(*yhxSÐx`b-Vs]+DŽ%)&<reGTLa.{8o)!%bHREƑ+;Ca9^W@ȸ~=s큦aBae\&G&)"v)tq5c0SLK_bL|x⽢ 'Q+e s*PTWS2cC!aTPTS*L~}uaUՁ[}?fG琸 aق6JLDL9K?0W&K Sg4JAPD/1fp遮W" v#*G"qR5e#4 sdvp{ ǩaہv'HsԿpN}/ WDCTF@SVG*ȵ}[EK[0v|} ~b59 g|P\߷SOw›-_bossEab J1?`•l,h-e:; (K)PG ~o_ "|P|KVЏkpj@GQS>Gcx_k&٢W0kvob$vt~/M]c^-ȝrgq%˅cMBĝ/弇 8.Ctl3 R͂ 9q fv7$Nr{8K~zC'2 j#qÈ4Lq̇x!$9C#;L#pEHO 36iljz%9Q;l)?aÂm5N9y~A @ bb)(nΩ7Q8 rV(_mLo7\Go[/7b|2aOdUO dF^?Uoױ|-=;B] ]3`pm&OPg @ .m C8kWX|>z2saEPٸ6#0ʼ3~dYȓ{0kl~d l(a1~ R]wz"Ӧk>d,M{+QJ/qqҷStCDȃPѮAu6{.G螈H~;GK98tN%_tb>r ܇6TkiRficffiqd! (*Ghf}mu#qyNEGǺ]غDMJe MHexO?\tin?t8y*GE"+weĖep}70f/wo_tg@GX:جJ :70LLί3:D]6k:GP$0n\l.hAmC?$·Y-l6d Ĥ桹o1rbCsw?)$ 4NcC8cnd1t?7 z" FxmXƄe :& Bŀ YH h=W' ]ss.>٦fQe@W`_ojz $+Kq- &;WJH2vZmqkyf:j\Tk"|>=ҮԷ5JtrD2+3(1߳&XVbbɋgw\Uˋ1ᄁM`V X~-L4d:&K CǼk8y.JH~6Xn=_0 bPH2۪=d{K٠dyl-Q6}ܑOD;\>CH~d 0J7RQ.dy|"-u'NaDNSuc;9͐6W<W}zt2aKJȎiv:%4Sg?'NSu/gC% sSB "Un*JdKv RT-NAԢ:K! %]h8^-q1* M#M`&O<3hJ~bfI@҅wv~A=]t,icF#Q耶M?>e~j.چoIzr)ТUetu,m}d F5~bND΄R|FsĞpʤ,C*dԪC.!9CpP_m xozwTک;~:_$r0~t/1+8)ќg{1yyDWݕ$vcLI F'gܯBS]+TgqL1t4߻1a7WǍc.MW65?xQALW "3q.GBVjJW#?Fxadϭ*݆29IJwB6rك^ѐջ+QVÓ*c8f4FF9j!W$7!ڝLajdϲ|e% {NEda>YBƒh,z'SL>2v r1/+K2WV,Lz_kC^;HSþIy4g_QNЀ5Z i/HRyD-໅9xIAT/~]/ÞOkGYTAuLtcg'a; d՜K _3ܓ`"_+%e'{<7^q_(;"l'Fo!Nf">]Bb҈RDeU$)H&}f{nK?31c0AU?iUS< LO, #0G4kOFL[Jǵ&@WuU'g UU;}t8tT "5/yW+˜|c$_e)h^Yw@7z2M)FFP`+9]0C1fwzDD8 3SAY$c6lRUrV#f;˨ƀ:k9{#Ȩa|xnroe-@MpQF)@hgd2F<u\(#$41 0ƤZgemm$OlV*4r.u/@32K ozf.ս2i?K)ψF0\qw-r^_ӻE`rٻӃYUrǧ~~EEX R$k o0ړC,;׵r{[{< d(|t'Qb9 Bk +(AWˇ Bz}7=}awxDf=ۘWT'x2AB9Oy7yF\^]p혌=, !D`i2 ͙jwޗvxw/$i_iOKN{<3wa/>ĩ_.V?œ\ϦXB} a#OLrEM% hg0\px˰,73o[ӛܛ ̛@&[w8(nkɆgz]m>}`0.OyXv < ^*CS?^m}a60NrB6a{>iէ=o!lߛXXP` n3}e<' , L/*{Fr*xfϼ\5}oINWhm0_!иi8%Hv 4?r| (j׃e%IڟCy% P\ o`bw YN/ `@ɩ  wa%Qla CD(q@=+0nf0Tz0HQk?3M&+øP5b.H-q]RDA}Ә[gm6=w|f1׬x+7'g_*t9G䵕04JW;JG|(KM;}͎YOSp`c?{ =fyGY zPBfa8syfdw:{'rzc'g<ɓ\{=i`Z=ţԾiw ƭ}Lo>QM=ZoZZ3!j֓ɯ{|A4zTN<:[)}_?]'"*>$*!Ο1Ϥ? )`"OTk=WӅyH3[?LU;WSymI̕6#0qWOhc`O2OVnCʴ'a yfELd?2}'rs#)\'rsw{f=ğgfs)hVJ?՛ _3?0 ҄'{{_33$Zi~I^^>3m3k:U?OWnNnϬ}*$OL߆}v6{)/& <9/G?ŮK,4'=|/e_xZMѿf__3Z<ݿ3%Oմ|?1?=zVwV۝fo g0 fpvD/ځ5nolGN rf&tW _37_lh:[-Tg)&oggڦᛅ 랶=S8EZezZ8s^-CvQV3N4+5exeKyS^_HſrOy?@zV"x tlٶFP|3}ӻ2;i-g] toThWg˂hnW .Lw;C0q,5;lm6vÏ>ȏ0M [;l[mӁöItoj-Sfk*cہ}ّ ^\W}̐5b%ҝ1LڧC)xglm!nPLu-mNۄʚIR1?EM |ڳ=X MxB(5";.p`7O֣ ZQ0i~|/dK5 N , qK_ ۱m4Jbмˢć 渁&_PpF:0-7h&Zte"鸎/#IRn C¸>6>;&96| GX*@ N7awkggS$7.OrZ{&Eqt{w` 35ʽ;:=h(ߡ x-0rg[-Zvs>Nj1?XךNU Uעk4?_x0;v%?Wq*e9Jq)Ax+XVNRS-*.OKF#XfdL$TBjؾHk9WgdH F l=$]HoKreL.l|cwWo1{Aby)G v1 =Vy!%fDIzK!_`\sE/ϵ䏯Cmz_ #79Q]~ 8VA|-ffzvZoz]-4eLT6"|fRApmi8EoɞAt.fe-҉/ I`?fp`9G{v \o=du&延Psؚ||Tܶe26-DS "dsGV&W'Ȣ~CTrل%56x7rmwbv? 3i낌5<5\ZfӠ4IvB I{a\v0JAdBV-#)L69.5mL%K)/*2M2mHgۘ?d?ՕյeDt +,g!ϨW .>\2i_ $pؖ=q;RK&AA{ t ]F" G8Vi&KcXaYd:rJ'ITZ0Hd/vraW[YRت1%]l3?J+n0@6aA͓s5Q<t WL:jedb kn6o`aJhI`v^|i/z>0i0Y+ \]1Â/: 2dMu WRm*onlIQFiEĤ8U*雤P2>ʱPs9eVN sT,. ¸]C-fǽc<7 B+t%hb>mf$I{7Hܷ_[}莉}@,q##Wab~H -qsjߕwa5.nibyi$Y`/[-:Hm}6I|NX0 MYcik'BL'ͣ}&~sQ+ ڒxh;s N6C/e6K8k%m*12MǫQ@x#YC_F$U,H6ڷD7vvm8toPpHRAIbBo.RӐޥ{*w_HHv%=jm}.D$%DIyH RW. kIO`Hnc_WxK$w-4K$'WZM 1̮V7Ź’zD[2NɭAr6#VTOH9#m7!OU]Kuuk"BROH'9#0^(5>+ٸVxţ,Eȷ򎬑[ OR!.MS6)^dK!a=mw5(3@q2TjMs=[S4'!YשC@%rK6g(WAFIe]3>whN ] !]^{x=bD;$E4.8H!څBQi}QbE $$Sفt gzЧl!P:~|ȩPqT|9_92jgk?(@~g5,Pt1|qAÒcQ}#~e>\|l@ q2@O2fHM:B0B5OL}0 uF#CFfa>E9>0"֞_ߡ%w-Dl\Vs 2 "#ZNqM5 F@O l'+X#2ԡg/.s>S?I &1 O2V $]"Yg Blh 2hF@]B^uن2,K(H%ʉ(*1c_0?4aU$rXxZ&< c4dl7So2pИTPTE`/®u a{rE&B-Tzn%>䢑R:d | \'mnz Ej>a&nH@,ȏC1SvVE]`D ߌ۸lqQv^|I2}$& ɳa[ 1ZA;@|[Z^pRYH5,Ջ̑RB^$''Ƀ'[? RiE/j9wߟs6X/ WtO{_0y `@+LP6V'75y,.M;8X 1 rUF|-C 8d z?oo=ߒ |>w6нKt)3yzQA]v{V;*J?i}2O7QcsC<-Z}_2}A90QC%UGxS7?59ͪE<{䎀Oxtlx oCx>gd]M5|Pw2)ArIO|' E>z#`&'Mn׾#jt\!zJ\~P<| ڸ/:ʶ򹏾 j_mM]GbCLT+OLPxw{"ǥАZԧ)wȿ]4Jm@#hh tIAoJ f#Ob}8:͉/]JHDȷvh> kPI7 V?:y5 _zfm D;Jok+sSIe'\X?`1huN9aс_\PR=i`LitonCҴ}{rw{kX~䪍炖0T+kyپ^:,ǫ F HkLy>ϖgкs7hZM+'x鯶5ͣ5&0\󏏑3zBuO ?ߖԒP#5`Gle/leT6_c2bah-zNcZ1ir=@p=W &Q.w|\⚵LŧJxW&ChD4Ggok \,p^{- U ocX B2-ħa(Cg8m':o4԰8"bХ5iYW|,\(8YWl!q9щ:BZ+ޑ+FL.wCݼ6x8.6}8.u~cazg*?]Po Mjh Q=°S,`VSS"6ѤQ$B},V,jcBAڀC3Wu$E-c XĬ8#gԆbvtcme?Uj7vmW׿ZZYS<|a WژS$Jme?ƚ O Fss9t|dM/9 0@>:|o~oo]lR:ӒBb?7;9mSq\1{ۧx:lsWD]Z0- E :E/R7*ooSnҺ34mY{5ś萺  7y v@ UquT 2o1:c=in5vQ5ig_ raaA(!;d\}];qbf۩KO\t"|4e~T ÿ67֩xFaxZR.Hht'ۃ+OӺzĺ O4G3?3#7·xy@:y:@=6ѽvl;Ԭ;Kg1Dnw ^3խcf!)~;S)@b1!|g6b"IʶN |Z忯_֕I8/&Ф~nR\4~,$h\  et^DV]DSL?r{DLw ]ql`tO}`ڃ4|Ky;3j:]{k9e8SOyeumZ:Hy+HGsm䌎\v-,l@:DXw+g&~м촆~a0 7#8X*?]JMW~ٷQ.63hc/$W3!jփزuWX/Ĉ:(-Zl+nVkXY4pz:ϟ3zϤ_ZKS?Yx͟Gf'wܶN+6&_+yva l5fr5m ȄTtѝ30YO O&09}<3#lJsS<پ(̥^7_Nj Ct᫤`ǽ<>#X~NNpaESo᠃ k{m+mm%ksOz;OP1zs:EjYvшW(f1\O/Ruo` iEAЗ&I/te+Zݣن|3+ksx?#,/r94f.w|nMrVWUӻZQ$)yGmMWjp^W%׵r{[{ͼIUxAxu\`;w|~g ?o&qݷvwOv>=si5K9'cgn6rB9ە6p󌎹\͞wv @.cʰR;G:жb97m>gvo0p!~?'kҵk?c כ0A͛f'm6Gy0n F4|8$L|qfڌefm^l9<Mt 2?}q"xxPlgoc6#|3!MV u` = Nk@Marh2plPVPPexs5v:(HfGD {((єgE%>? p!Qvd@J1@H Q = ur=ݰA/6&j-Vy?wdJ~GGGGG#^~N~5H";7:as&Ҁ GxqN_L$aҍ⤐5!%0!ߦ5[KKvq6="K/!pXryfY:(fyhSfM}G=7F{ҾNAJwhdI oON~'iR> ΔbbimswIό~2 GG_oe? [)Qe-,.6,ɏ[g[BE|{C6\ȳ䂄b~ci^Ҙۨ0&buR[06//Ao?[n ɭ)~R#P zE-nAM MwqALm7 = }b ;8m{u~+4{PvY !F?_,iH˳Uv4V<}BPQlqgAGW:PYSj Z*H@(n^,Щ}[ 3]J o!OeXRIZdgZ]lrʌmn*C2(vz$]>}Lԅ&SN;lj~j/1';plINGQS#zl5xEBQv>6 YV`RC.1c%°1z@j%ROt/,'{āl}<;a4?)0@b;sdRZl-K)[y+b{2G ht2k9 ­9'Vs]մpVu?3Mrv䲰X_<mo6?6vw?_wOD=.t(^Tlom؝Lz}a? §2ܴz6IX~dۣ_Hָf/\$XѤ RVvVž2{ m{ 1.x#E/-iĨ}o-!F`0i. `-:"@DK3wLD!,^>tĶK X{9Y uV`. -ۻߋ}!*q{~?õXqź}ou=,v=q66ZCiJ#+TV1Jf9ihlb<4P3A]Voqpg+b$yj fIC`MNP;Qo=Wc(Gd+7*}+ ї*ӷ Ŭ?1ђ D|/ӹ@V^}c(txJV$ BĆ,Jo_)~]Zv\]F D L'BuM ?TDsEaUđ%w7}Mؿo[QXx0dʒ#42,kivg<xAP&uu\hVm uФ^0N }^7ݓ7*H%hNaVy~Z'ΆXa` Y}Fr>*)<T g˛AxÉ1u&3 qYKShk-Vut#xfg|C"[naDDl9&|b5(؎mB@ȷr㆓ JCpEč%qMMlC 9IwwX2:Ar hJm ; x7.oZlA"B``ù6n5^'4IH2 QOvzi<%O}咵DDZ^xo(`U.DAyu*^az|0ob#w52؅vߠփp>,yR(aW&&A߀X-Cз"B{?@`c;ה>Tp]=̺X7펀wY ){DJVO#`zRT_Q\I;.5߇Cf9$$E5w/y˲̨V[G{'*m#NQ>[;qDA.%WqkcDTbRp+tpRE_jAڬ#^Edb#xеSc TK*l߲QnY̢,T2Euum&ҬLI MvW#Rn#,wyXtLxM\5N(@};Wh:dv[mCuN}d/ITft2mz`@y4?ٷ|ճX q;vO,»10WYɟoXDѬx O._wI.C?:av[yi$|ē&oA`ߕum/e#JȻ.93}N{+eIXcvIp|Vy(`NHծYl.r)YC*(ḡ#9QQ_9C8p\b9A}W&qW.EB6KG1 E@W.l kqOe׾H,2m;r<DQd~W fw:_}"AY% 4ItտF„.@{z51Ϡuҋ_TR!I!k∏BNJ-~5^n{ ſM,S+ö:X3o(8/OB'2n4Z*(2r K*dk%kAW[N!JL wI(S* w=>P $Ӗ}>I=B_bt@'L(┚7<Hk&9ܱ<;?^hHr2PoQ܎:ڋ 尛)p)D3w2yh = -B j ;ELʆ~>׍Iк.Z|LT]JXI$*be!5"&Z!*U0؛AKv]{.l7_"(QG Rx_>a,܅y~4|j|k[6SP{rw2:"މ5΍z8H+`6? DtP$\.N%. !;Z^lTR1үG`tdm 8e1&: ~,mNZa\XD&(KR⊴Z3nqQՖ쀕D n)rBeKpQV,o%^HKbYK68@7}X@("@'B3_w<LןC'ژDKd<<bGC6%j>V)<\K1~AԯRQ?哣  G { y]*zpu<Fp eTD84mDX_ $"ID83pϟ?,"ԿoD8^YEP@f61"mDPX:p3@xW ͈kFvy&F@'ItD8z=K^yNs9> cyКP3:&ftF",䧛1<5>!e`!cٷDM"o拯}қS:mk[}AbBW7t/pZXCitO\|ÑizdKhiSu: *"Q9֙RkI-Nz#.W^-""^.9J%4a!V>h4kG"^k#w?0B˭& ` ͅržf4ƴ8mt_V>PxPN38a/H۶u4K:J߰0w) 1=DmRF?タ <1~gy ZrH.= |nf$ܺvm19T =l$yHPn̦yfdX -sM_-`ǼV LN+W\] ,i \+ bo^E!yu+?08|gT#>ߥtc\"QoVEa c*)-Cfi͸ b*մGO1wo#`+vЏݢ5>;T}c=[ H JݴXM}ron3+աi7ט㶇h[ H(q\NϔR[5 7Co^uIm/ ԿA ^2e^ŤG~iN#l36(:S֢gOZ ̎J zSľ}2ہ~xFr=f@0|2Oݲ7׶ 7JR`<8Y9G dT)|? Dlv,^&ɠp7e+(6D[ȡ['0n.ޅvh`-̩CobVߜP}^}k+G?c(xӆS"3ɯCP_dꖏJ( ۘkS翵S<5}燾Cw~臾kt䓹fP[ (;{&F/JvYjKuT}4/T N iaX)e e0 6twS{7ߜh%-W!n.,MEP{KwftD/_h<82Įvv64}ۢͲ8;-\ Am~ӧ|b_G$g0VTU4=|+\0:aX.1 c`!VU1o/ψN7iW*+sx1#Wq52/q*Vם>H1M<dcUjJrzd|W.~c?#ZcGDiY3mQѨj51&YN/t=UN}g^C_4榠Se@OZKy;bQtBvAqHtۿdxrN ZS۞,y94Pݲ2>dO<^f1~@Tѷ;` 7S/Ŕw'ӕä́}=,KbA^Vj O̒6ZuW֪ߧx^/j3_.]d;Ƒ!\ikjn^Spy~douLgt3>5țwCVUjHTO>(!AW#ME45I}TY}e}ՙ.F!2<'wK]NRP~/2#)P:.`9QIT}>3hvzF!h:٦nD#3AA0;#hA\#B79MY)xVc#gVB`|py5y9Q)073;fht=fB߸Gz t`41TqchMScl&ƶr33I 'TT(:!tg9,@;ڞ!x:U*YeC& !{Q}~L~s`,U 3a=|(8<%gnҠ7,8cn:W:䪥p, w~"*uaxWeŸaSi j?|w_CV 4]g'*;cJ•!A$1 3p&[%1 *NB#LFC}s6&ĐC0f=-֙1b=a @{.=,F/!rٳwD0: Ih73݅P-`l0 xc#ZΔ90cpG1{xρ<,ڙՔ$r~Ȯ2=9'FdǴй zvg+dQ-=EWS`)ƃVL }a?Uj]zg&b Q )gLȇ!Sxg4=LQF f1Rgʜ#њ6DY[uU!?`m`f➧ٸp= weNjg@Mt~|%Ć 㮳0N?WJJO@dw lre̳0)l?s-*F泞Z}ЄM9O=Fg?j4^|,P+Ic]6^0 Wgpw*>h("T…B89a2Nmxxo8n8ݷc~Hq"Q Ob><ی0 v1{.Rzi1K:֣dD~»!;>&#xwtzȝ7*vӳF2hvRDtX2;vEBTkV*rBfp~˿U@8M?頬clUC+7g4I#2pA7-#a&o|xTn05 <(+\f 44iLĽ16%WqPeBq%sU"VB%0as0"Rm$L*" ت{&raRf;dyua1,<MʦK9 `51_a eo= RT/BbsW%?4s fmkc@$n\ħ`3E@եEۧe9Ŷf\-#̩r#a tײ` lmpF so}.7D@!ui( zqU;M_p4~NGIpjw7yxMAjB}_x; 7/PtuB&!.\Cz X82.EW71@Uǯf^g]tX/7tR`ZxIt 4=4>Abұ$>GC?= ?bP­%2 &/!YL Z^K@jssms0u-?ر˶:CRL>驏85*6VKXY9hXlに5]Uţ, ^ia!>ϵ}h飾5 atpeu5Lgcvꢖ uS#^R+ó lvv}a:8H(ӿݷZ|mSv; Nww{o;{?v0s7Py&9n(6&^1Bx P|ݔn5v}hZ >;&Bv[!,NfkeTy IQu9+!2:nv^nxty}p{ 6>n8ɳQ4эu/DV1WM=IXTCY'Uc,5gO蛾OزmG?ULP/ Ujmm5F,V nǴsgb\'<{{z&b{>;j%+sGjLs=?w|zt1rGqF܇渕U+\ {;nt`flle#U;|w4x0o{;{??czQw?gޏ[ Kmah}ngحFaڨ].PlhD]=U hrGg{ƔV*l8_6 ĕ,r[m38dx,r]@ v2"Vk4xb>IELsc p< UZs:#5>g?܄e-w'&+*\EZ8" rZ.gx{1/յ$x,,a叐*M?RM`~0ԍ‡%OwǶ(TIJY,7w; V%@g+?g&{'To)oen}9d}Ho>ziˮsmxХ-s+,Ym4:(a)c~4 s4) [ DEwv2(Ч,Pզ;kN[j +|Oj 7ͼ:ZS+e5|v=r_b{۫m#G.ױL-.QjDOV=~=|ñ[IQp{4 m9?t0Ɓ8k1xiOUv6 ꈖ-_Rphk?hy {b.Ŏ~?$̤ ~D^0 Q m/K(zӷSpkZ2 :HbfSE%59 ;f6< XQ|CCF3tYժ9eFˠꋏJ jdU0ecg8Uoopie3} ObΎ[=2uGj2U5_5VPrQP|<@/PȨЏ>+{pRkN)fύ]pܒJi?JzLIDG2\>ޜ:x JۄDl~B E5jڠ\ /M8|A%C+ljWmV6.{˫,ZPGkj.KDѯ/ oזL5L_4͡na& WMdTqAS(O`&*Cu%{(L@C,0n_t "F9|xÂ:bC|5(!$-`jש ʳ鬏Td/s,uv[R_`:qibFt bl ?-&/_ ^m$Ԇb`$7 UDj?1dR;aPjhTvQ!Jyva~ +71p6G&*%Cr#!פw"gA۾]l42.'M(\h* ?elІeʹV D!₷d _0gE=,]-OСd1)cn,/HJK9=x1 1d`3+Ep}WKXO+..o{K0[EKAZ*a+&5 B_ťg v%j~*~[nP\?ch|2ihCCWN.E/}|Wa vj cɫ>p& c<7- A2n'H/UbÖga3fSE9#P% F3 Fd qkY2n ~P_ӾpWWjMB (NhzAf =ـNj~>!U `X B|b[3|LЧO !g cP@}ȮGm;pQcc>ȏ1b͠).\F 1}~Z\_K\'̡9,?xY_. /_i={L2GgGT${`>9毠4{i26e~svwwvvvOgp`q;G;w3f@ ? N& xpM%c1(w Φ9bصl' ݭ6xtx8ֲVV0'4dHY5/c]*|OH涅7x2z3-kw8JfecûFUط8:C].Gѿu^TI/Kt>B'{t %LgF(ʯlRo_3B+~ptRČ*Km8O ?Y$Rp4W wh1f2j*x\ɚlJdR24 @ƷLs$6rT2mejעɫ$?vT/kS&:!!}\ɴ2}{~Z{18YbF2kTaJ[&LLC%k/P)ohGC.F $Mʻ/6mab2h5b[e" Wt|b ^]]Y[P:C:oi|R1h~r>ymZe!wt O{1K?%; } _O9c/yͧl2};2du˥,V_6/mk×_,_?O֗_Ph?~tèM?nrlt.t?!Ọ eOd+Zuh_?fhڢB]Yeu'.ħm؆+9jTrLD::J@wuFpmx2(>&z(n||"8VY,mqn2,c<cN4JxG\QORӇf/Xv5QYXע# b ؉ E'~ch69% ,М+S܋d}ȅIb䞴,+*:b TQbQ_ɑd"h_h +^K_6aLήJq?§Ie1M& E`Hw)-i M\(QI9c7~'4|)3@짨Ђ@Q#`eR? / aՉW_OdK!r`Jݸ-''+X:Ceo(q_9hK.NxAe '&To9~9 '~osHx7)v/3NWx[ gP맯hvRمZ2>EYEWWUV'W  umb2+ CZ ж᠄:A錙S4IE3'IéP5j^iG߁lD!MKLH,Qfl^B |@{{#x ^i^m.7/=כ#W_pWDTE'3QPڼlqBY`-:D>+#5 UWmZ./PL%>nd_"LXdRTaYu evs)/[UY^l}u-S>mfYSZ*)eqyͪ3~ BË>6+2 <`dq}p9')@3̟)DT%{.=v_92KJH<YtfዥeQ[̔ꋌ>9,`#|̭&-'/W.]A{K~=ko>]aQ*Hk|g8naķۯ8R6۶ĘivLe+U735>3[*XXpx1 559>^̧ "K;2u>VN%so W?0,bX95JN!SUgA.MHW8+}%bv9Q:"C#έ};[0Aâ/҉5h3.Ȫ^ ?ᩥaDQB`wy:`JP +4KYuO7n0l?jΑCUQ̉? O\K+<)`Vaɯ`M&XR6U t/ΡB([EjlcdrJ',V).`y*x?/T_<޲xIfEO*a!O5e}OHR8(HCD< &:Usݠw=W @(u0yIJ% *Z/.cx".<0κ_B@~NXI8`EB?>6^s#LrJy7J>J\p1p ),~"V䰚5*WgD]n?N#VN^#fP?>ʟtLg<ϟ9{,{^ _0XD=Ԩ'ґQݺrFo]2C)(EѳsmXZƚ%kIb#hYN",.)Q<^2'H`" D>|. oO I0\"3c#$XŠR] jI䝋<2[pFCA`s-hIXmѺ^W~]^ǵ|*^&::M O5bfg b) ncZLeaIױ,I%!xrdd137"fT))^fQ8(>UIM j(ZyR='TaeύdX_4ou-HLZ?]6OHvǣe  {YW41N e#eiN08|/o 6c7\QYZ7j<)5@<0 YEk/bQ[0å#xkYTeJh5/jBЄGI"S\jXl7lH>D5r(~ZF-6~cDOm);[Y_|sQǞqWqr/l*@zH~Dw>}MPjT((DˆCuwUcye{Tѫs,yszw#?OZK/^߿4FN+H[|gj*WfKoG/*n?'N0"G(Ģ7~OL=G2 cQj䇟j6uy?…ﵦTCq ǏcxYg F^kHϨ\8DCĖUQ[i9W'NWPۧj&5px)|e=x2AO()ی!:Y>-.V`Ih7Xhb[Y }1YfקqJk|Z/~1"AF$LGTK~\2N[͏ǭXBg,GS@BW1W+ UTu(΂ni 4k\,*DWtUÔ.*aZ<zOp҅-oF$s=5c|!+cΤgn9*rɰpdDvab]ׅϊ9MsEkk6+ܼ[˔R\x1V p!Le2=TwfB9P3\ELK+Ryn ug%S#5v!{s# rIpFؔU2啘߈w! k6BɋA})2&}6f=뷩m&A $-ͭzCMeX{Wh/—Ýidk3ucH7 ;rLc'87L#ݸ7-nq [ttFV9ezHW*:z>Mج;y p#Y@[1RUP.jIt9=۴@Z\ Ve/Xa!]\t;,z?UH "o{+Rs C ł[*9xL\|tHօOs~|/˛$)/߼-#{R]Fyk;aJrCOQ,Iq024YXIw䷭M+d/Q).` %bJ/n ƒ&򅹅/&{ ɣ@ͯnRC8'ѱ@Z:y2L6ZqVZEJxs1h9Oτ )%t "O tSm3m)QS˾ќט6g˟/QgfY]ԺA4Uj0Í/$xkS,fXjg+/}g'qߡZE/;Z̳ݍ~P<|vNe΅AM~44^L e9mBu.nBmPPԃ3:¬A^"uA6?8kta=STJ6\fB\x[DsMheڷPZEޥ-nA75}2ҩSOJ@)44E([g&YS"K&ocZe1i0F_0̦XDŽr5JUms *1"0+d ?bTA* O4Q|8)eEd/dTZ\3o i6=eI^[˳$AoYK5+xws}`'_<~lG']Σ/?Xgc.>p$($57q#~>zh'ƣ͇{tH8La2ݸˋ@~ ?pmT@|<~q=|\뛛$;tq}'^|ͳbYt⧋$n]^^ B˚Qo IX_,K,%4.YݣhaϋϨ׉ݣ N OԵ5J9jmC A.^hu}8 $Qʲv !R;_2M$e({6Gc5ױ˺W?c2?5w_|g^ b:ϧg{"Gn.Z#WVRyLLC΃ >VVQ-ssu7~B,ԙ|<4؈Gi0tpZdfzN(LN6VjBRb37\$[htqtj Z,Ns68hʒyoXRk_բ?1bJnovԃb%Zl\HɻL{ &ܧ$ا1XkvjݶCvkǓh_,]xd >cQ6&Dj//렿¼Ke|1Kz 2g)Oӏ/tnGT7>wK󧖸Aعˆ~x=W»8bXk&,m-[~|pxo0LN>|}tv}tz}蔂oYM_SAE'r:dg;};`XҧfζO^ݧRœA;~sٟ0t67D4лdm65Y*fﹷEd-U~hF\1e9<_`F2/OΏw7MԢ~zA k^;k:M4(hV|k<f`nm[؃t)/O;<^5J7.2*C}?/|?&qNxeۣ?+I M^>3 0O 8/&g=0kD^` ;Pt/NvϿ?Aň9sqSg5n8WqtUTO?mFSm6F\|}W_#*| ý5l1|{r*.Ng&?L~ho}}fEEw' XO`.̡-/->%~b_vu= LH-™rm[}vxA/'޴xEILo[(y]5jD[EQ-+{1| lRibDUk?\ʟa-d1#Tlld D F|vg 9Bw9秲ӇF/@W}o]l$<ū0d[6nٲl `>l>ME¨sl' W5(grWvKolwrѢ}No9Y(X8vpV!2)c6FKM<֜dۈ⽟_Bgj!OB F\8|bg gyI¹C <Зњhà| x FıMXKk Jnx+4:cuC -1T[uvcZ iva21SE(Lඎ@FK`> >p)zfY:Y|c>hk>3󿤴\4H1Z5wS˂܅r((!X>/O8/rQ\ԙ}'GT|BB@G}ĕ60P'&;!cAt S]2'1 ˬ`Ų jwA* d0p}xPy_ýBn(yBjc! !^L{q ,4;{p$J=$w'lϡ @zQ.,艬S͂p6}wY7@N3ޥOrʘ1ϫ UֿW9+- !4~E3/-P kp(\e>1L0-C4@W7giha >S #4{6kvBhFYK'^_U8;*8xQc+Ȓ?RHyuW _K֛f21[ NOU7|ŏwR@n>>䄽.)a[&O\7%[{e'Iu҄Q-J8 vT8j2ŭt _o ݼ0]7t.׼Ɲbâds߄먠msk!~cՉ3tNJ"?]+e_`x|]^#VprUFܥoהth,~`%CD: &FWSyS#wiBֹtCemr,xswi*"Ưwuޯݚ]`?(|,pSZ#*Ql=JhpWUXM5Ȃ3( [u4@g41uYLyu^t$e@t3V(^ÒsZe5l, 䨻{ǚ8eGU^Qp1ʣvrdTYNRi o͖cnR7vO˜IjW=xXo<~QC t ]7c'<|1~L?Qc*}Js7*?5(l݇_~ѵM操/6v/|q׵<^N~mY{>ꎿ Xk^}K}k˔e<(ֿ֟lmom>6l\XYYg?ZY_X~l}m%~XOBE2jeA˺vS'$pk~~|v,lIthmY˖wGwt5 ls~%d/_& Hcrޡlx[£ , XٯW}O!gGDiPkJH2:kj3'S}^׫: "Kd9CAwYt"[/H䕥ЄͷH<q>mO$Dp!_ Z=s>Fj)A[u#GVv9onSϏT -olW<|Q҇FDZ ʘh 1"8}_@$c8BL>`)B#O~O7ՃoGr~ي]bޒOwk4 YeCmF.2]>-t:?j,j^:9Ʋ~-5jpj5d5!lݷHox7OgRX'V~~,`PJo_Yt?tZ(=*Xop;MV܆k <|tL}W0ė%<ŧ1ށIr-_ăq&nZ.}^] /2«A .N<"S.?}FM\Ԏ@, ezzH=Q%(5(PHFǎq_h*cUI1_.a"0A?z${Ki#pKm^Tb` /BY;|m^PZ*,TT)bRXehsbWBl? qIu~aUYW*NsAHE B7mq>P>F}]]C*wBhlǵbƵA3ĩJLy‰Yhz'di,Gtw4cZzh;d%昇vWlHP{Ql1T-sI~j0;؃X0ڐ~ӵ%d֑ CNt>-{  (E!U(aEB󽊗=z(U*zl}jfk GU~b U=.k=l> 4r @:h1TXQk/1c>`xgd."pb-VJ54Ǐ].4V 5>bh]<& mHhYo `D{NrJUXn'WoGr ~#gJ(X0\߿4A7UJ1tuÍj'?'^7 妅Ox#\DꜾ033ҎooL+x T'{'V m8yBZGIv\"_-4L}re#kmMEnXXwO<K}`jUޘ(c᛹ԨyW:h<+X/UF5tzh4bw(Q(? 4FG9b &*TEi4bU0yX%٨ia? `0yfhS?| 4F#mGAVgjv,4Vj4<8$0RN⦑nP#FxN8~Ѩq_l52TFk8Iex4'yx*j˃Fa4oATk6jm1ڨ]#8;haqnbGmD_;ܱ4,wex2ܽ o/ =SqΗVc^ m"1VYUeg (a=Df V!A'C]`% `PZ.-`ȧo; 72"DzA]Xu=E91i6EؒY&F\avĢf!JIˍw$UUĨrT*aֱ]im™&`fۄ3We ;sE&/ fVM83]-ɝwR jaizLh7q[3ĕn'vWe.K&EZw# |`diC;kT0 ,fՖ#E#uƭi0v8cxtNflht K|VH!ZmG5]vh^/YKoJԺ ԯF ǘH>Xc(=`>e~ itDJ`շ@vm1S@d(._o(*ɇSPRUl~ۅO0Cp~w?÷9=Y|}?_Yj{G _Y"k/[.KwOyylX~|8Ρoum+QˈWEZryAsO^UO(˕T~Y`tÊ7:sK5Z_чeƇe{:#R+d) lPMְ][slްض.v{LslpRt|k;J5 [k 4ڶ!ԟHyI [S9uuϒ;YbHa=Kg{/K&%i=vVslްغ{Bwc8 gm?_51.o߻Y5fcs&'qa'qX0h7if5!vqуc]~𿿃,wwYw ?YSZ7_?8% ,[c]si^U~/9Ɯ'|b}fgK =XڹoE2|av^$pװF),kX럾ܐ]~ }M^=?}lWK8]dw)5-:-|V>"Ձ޹|< ïSEO\ Zʵ?_NܟW'Li(#wp[ʊuO*`um]">)&tšd. TL:fыEmdC;|?2?k GM5{(VN|سoQ_zJhK/]wl.^+Jkn}G?ɏAhq hѣG?~sFpVAϾjvCCDS= d J0.@t][G:7k<_ڶI6cT0 QՖPUY}Ǥ&,e_AA;T`(t[e 4BQ4l{KvaFcP7bvL8VFAYv, MG߼M[K=[b/xNrR 6j,d.@8r rX w앏4m;yܷ4jٰhQ+GmYm/ ||9Ĉƣ؀Ҥ5}R/U:Jv}oMtm>%{o&|5$5xLƣ[izy߶]꥽Q4i/D~Fi2~<,kQCȁy73|ecǚ'q|ut.՞ԁ nƹXsyox6ʭlc:sTkϴj] S1SLBC;5I(0mgšFʓL<_xm.m{Z[ּ>|`MD)MԃTp"cUڳz?p=gnjIf)qO)zͷ2 ~~i` V(<@bɡ h~o;r;!g鋝@Otު='] G@syĻnBfgׂWnX |*2Uh/0q\+a%>f;IhPm;ꕩ%:NtG sozI:T<ڳLT"h藣q7Xd7S7z}"iSA|2jZ5dn .L kГ'F{Py=|Gw?+&j%1O<.i]R~vN᯳Ӽt(*"xp{KjNQ$?a/ vkn".Y1u`i{b?}ϵ^h ,Ì"[[px&^W\$J0=Gcrl.Di-5v7CS=vR{3@`镩9:%soOl<~2K:Ɓ,4 ,]`-l&5rCpe]6~jECuȻS59UPev<ܙbi&סP@n~Ӄ -:ȧ-6CYeasPj_؞A탸 70b]nI}*Im=ޥuxf|&0  'SSjݼ޼uY 0غyﳋN2;E@_ 0G4XFay)0bA/ю-0b}Q''{`vJ/ ]j>sWiNC .)K.X$3}o[!F 0}~8Ar)lhÝ|ua8M>FڵNo'h+ P#WMvT,c|iEQC*c6 ;fZX3)x3&Г˦u`ZNFm:|̘eE }\ ޖ̱x1c!*Fw$_/Qp7/I15<"ϖu3&S$1ޥvr2^*Q!#]Ի^qo~ SΟM کypHcNt]k4L/"ܼ/ f))bt=ÒpE7b>c$AYyܸpj. \bרL['obxa~8䪿 19104wˍqpx]@9K.=O)OA^U- ; LI'37wPHʋM6d}NĠu<'d.@ُn*sBccx #1 <ǘ%xA6GW[<^,B. JYDoXI !JnACڵ</=7k@ڒҔ\(,A]RGk{T=* Q2 ( GfS@rws )~ t6{{tI脾MYk+>8ӳq-)y ;cQxuwL-n:Sc'mrܳm^{Z~_ /@)/etT>[[۝&pLQB]ZBj<,ZZX]Ma}HO~tpգ};lE0ٱPfx$A/B?0 2G!'p~|Hd5>Kt@|Nrw)HF=\֭oXh7%L^ GvGc| dJDTIe:~mvf/жO(W\xQGn- Aַ/, S=IRƤ:4z@gl0几~ bLˠQxnJ&MMy@uQB@s޼m3.Wdi\#OVA4N*n~^FA6 j!30 _!C/11?8OT[Z#M)(_wY oquZKt3RU߼2`ᏞKhGµA$k!$m^W61tmRO)co[1"? `>>% .|ŘLYi`(tpY%TAE6<2"<@`Oޛ.łj 0Tu{ PˊAaOyE[2JUp$)O sDs?}s8B_jYjN!WL5 ~`4ZbsCJ6:X`a:ЧTJ:by+/[@g)+Н۷ǜPٍ݈ &81+ 6l5yDaJzkm"D,N( ',{֘a,-ut '4 ڕ:~j5ȉQ 44kTE!!ތ,*4J j:@ڑz\u:g:=<2`l~xɱ\x^B/+2.Rbc;:e|fZ2f1+NPj.E;f=}fy1|}Lַ-[ey. ?KCJH~CxgC/_W.P~%ŕ&ߊSM?kJ!c͵`­ҡ2FvpGQ):~ed;/mδXsG uk3VG3Qk}{unPKv Z|]3s`!Oí@V)CG[AKX9 tC/$½0GB#F0 "/Gq*#ͤp1'bڀiC ~i vkz9If'pVWucbxnU)+َL9mp% EEcXK~5<0eEÊ{o*>dڠٝIr1矃e`Aw-󵎵JkԜ Ɍ>sH"96OбwRAMӡk2 ؎bvmǠ?٩L0f$e>^vkصe`56llhzu =ogXbaW]@A6W̾oj0(\P?s (W~k2RJ+g*jGrY 11F.B3Fa.`+xwY~[Dx7}+v"^#dcϼѓ;jqvy5/όH9Q;Lei%ȕ*)M`Kv9G1-;Zt8KOw3x\ie:a&˲a`vT)@qxȜIc>ɭ|t,P8 hAd.]NiB;2q%kL.]-eBX]rwF?=#xCۧİbt];6q]x'Jixcg91anfyuoRd];6O, K[Zz8Oψc ,r/4-a~M-w k#@ԡmdz4$ IoK4#|zE}[` o\ݴ. ۷쬯AM{נ0'tXB;6c9C$QX<=39fu#i/0tWr'VtWL2"1 OQ"6]R I7|}OC Wޚ D f& 1%ژJVerA$S+mשeW^r[ip;rI3:0%/bh^Mkywb"x<.(-wn ˽5I BF׃{K&lD:!cB-O"05$K,v-Z4Pyr8iX/ЊG\4uxch9mJ5h+p/AnA',N:|Th8K}?ʿq9ÈaedP! gs\ؑi$y7[4]8} #W/Q)HjgYMe. Bj`0ǒӴ@zQp #xJy XCϡ):Qܝ:;6ꆚ{J޾dY32憇,cqzpFTM*B/6ǾHCYߋٺ4Zqm'~XVhmO>nm٭غ$ 3QΪ.g׭95%7:ȅ'7KsoϮaiQ MA={\5{,Rh)Q4*nqpXc^iy^` }iY%oR 4 z" p?l ؜L/bش$ 24B7(-[tJ &V i ө'ps-:3a49椇&'NsLNڹNI4W95~paKM]la e:X8Lû4L@Zޡ*vXېƒK$82yZ]v3}YS :i$)A)I3 ??KR Jyu`+r ;8"9 ЏL5QrN?{Nv:hv:vJC,gdP2n+㓋;e)1[Zus g#l[ih +jL22i i(Wa&XI)k~C 'B˼GZ?8:4x 4 ]x=RM@z s\sA6H]f<_JCP)L(xg:D0aQB2%2mR_x%IȻtu'r-QCsbDޜKշ7ol.K1W> =rVof=P+H1wo{g,$!x`)GT GoH ˗§<^,ӫ8KP>.Q[Ym9]Ӆcy1qU7 ldCahҡz͐ u.\k"vRf|]~a, rU)/kHm$0:rke ZlKL ߶TC^&I7IF!x*q)h9dTv Jfu)@fVL,vB3y850 = h'ս1dQV,B,!*$pIsrL 'xѨ6a*MlP]̀k-cm4L,A8}8iX;vrhzy mE',NZekxVtIV<V,)G&OT]t|~}upp[)Fh2͕뱄CG{ ڈP(ૄh_/ځCDjcNmx9WYΚˎCrھ: B$däl4''T._Se1&^7T9XT}r(@TadWI<,+@&fޛw&YbyzfEdbEt0I6 \ |b]ak#|zY:5ǹK,ur5kQETYt_ko/;h$@䬎- po8 녒ٚr|M,ZM;.ޮok\̰߰5e?W^x/5VfbX4&j He db 8f+Њ!pAb%?~`]M Y0$1Џʲ!;ժKEiW]ˁ׉lHڹrKe0bP[ֽ U.HXmE(Zuz\\<ŧ3dS iD6 (8|[_Vة5S^ _bYŴșFvPdkVۆ5 K5Ҙa$s_m\{I~"* v`"/L7 x'jf-KI=ZK.[=&P//N)%e> PoWryG=WbG IQ2#xHn8eMJ|)!(>F6ٱ/+k@F'oxUǛɲ}f>@Gø8zY3?Vy aDyF'x 9]RE[7{ Y8/Pr {0$5rRD${Mrn\ZRcN^Zns˻O'R7F)1$>'U0u;;:UOxFJuFGj(rO®8g q)ȃl p]:m/`Sgy-3־]o;bv{{ux\C)[} Owbk$V?P2K'1ys΃gW%潋̥UGӌkT¾Dh$,F8 /!1Ƿ̮^!Ԋ E4.J`ľFvp؆(3|bLfHM+eTvm1#oZdi1jNj18>;4oC -,Щ̛Eu1C64* BZ\D6y5ʎׅץ|@ߝvK6i tpYK0SU;_}zW>OG9{1>F"rJ}MMyO5xnsfar˜*0}5c˶v>M[/N'!ja=*a1YVmhv\[6M`r)QHJiӲu2ھo _D09[ʺ#xв/@~9 :u+ :~'h* kX8ΕMbAP+GQ(>PpH^/)mM v- -+Lc$(nٱe(F0p(3/YbGkPqM.Qu{هYIK@=?ГhWOQE.y{zL .l Ȁ:o>CS5%%gH{%p_PmX*p_^|-% Xwv8e.:>@0ΣwsZvFLq6"ryq.*%& 91f̶\wrW~ %AֳWa5:Ixg!H$./;NSqW|7õ\qeuXz_`[hxu9("? DEA" ģevZ!F,QŹ$Y`~]A}Kد< Dq>]V((MH[a!K/('AOI ] bj?nkt,ʇ ^* ưf !#pʽػyۖ? ˕1'(p",`lm9U5KN8R rC/e2nDvaf/ĈqKQ+Q,[xD ؐE5^2[W |K%kH0HvI}E hȔcz{L)^qOØ?r?`i?vAnkquU'N0Io= ܳ5<&O"#ܴRɜnns2[!Y!kw9TRS}D  Fm*Hs>r YI9RtbŌ>6`V@oGP=<[E|n7!/SIĒ0z;aDst xAޡƚt͢ *q:*JT N5g k m#S\D+bW4 E a:K4ܩ΂ѿ5ޯ9DžIi3Y!˘_J@p12lx(adKGa0bUщBul5W m 4_<$^ + Z\Id]$.ue4Ő<1Hiv/!i~\"9ٲ0qyrhqR%J82Dt|eK MyO~97x9/zy|;Y4+G\[ݰB߇tH%܆mC2jؽu *Ui. q]Xw '[TUN6F5Ѧ?Od!Oec}x"U[6Nu5]rhOڴɚMg }M-S PQ* FiS1 }6iu ۮ@7 n*V w&CdG9NtG[唗g!5*҇FEa6[u5/xys\PMd59ü#cwA ,J|Ob*uL#tx;3fwGGk(gOoY]ogYf8=d"fһwn'ZȮ.>+ٴ6|T摵 xc]jC<&rC|i-m"ؚ{huR@f1`f Jzū !/'=b:Jky7y0XR‚V0poFBi .J=H|x3 `1/F01(f2v,h͊Q" "ЍezGTxe,TkdXeb^gPIZn%߿<"\tk fCa!Ӝ~s?f;Nd1鿜gϖ=-{>[|\lrzgϘϖ<ڛ?S #n51=['lJr La̖Mq(Lndб`Ŷ*h(B:3kU^:}ch+['-AqN88PVC,1KV`{= @7Jjηk >ǘN]N~o.Y또,O)~<3Ym-kȳh,sܼ?yI7A-m.և`3[GVۿ>$5 & Lp`iKQKdb9Q0<>f~xi^6ube@=Qv(c@rYz%{xsa-zLZ.lqcҋ.ỊYi`0EڢY(-Xrtaϼq@'A{xINHE6œan=M{v*AaK՟h󀞰a*M釲u;Ӻ?dCh.Mgu/c|}1oNKKS-\GIEi5=yyr<}CKҎc6& Rz3ȀueKc# 3 ])ͽ -notڗ<[Km{{\~/7"v @sep1_h;,\iN"D1e ovG#|X5BI'&d8:xp`2tnm#(1&(B{o;j$2 /N• Vhr2 SZ3Qؾh MLqbyyc\T u7/?Q,KYsQ ǔU9IMyabxaxeL2`o ;q_3EW^& .7K#nPabWӲΠ4T>jE\XxmA ¤ _f*5 Uκ-lvF\3MǘF@ޛ,8IaZz^<Puڦˇ#MVsA[$%^;I!Q<+Oݙ/95ZĂ+~:#+pQ(bt5)DroTo:DY^3VoŴnj^ ӜWikf^FlZk(ĹASY0]xkCML|&q9rء|Ϙϴ,O4t9vY'>!^x!xzj> V7QL"s0VIMԘc>T+h gМǜM>Iij&^oME,RO6`tQL@5J X}s:_jep.4f+8\j:x+ CQ֍=%+qd6]ikȏ( QW1{٩@/^IGyShj"@ P< {K:`=c5"1ME1vV5Q#C3;Hrddvm@FW`ڝg E $́~h&zR^ 8!vC50 Nf 9ˮOw,!6OG#d@\ ]cI˼c Te eYh _:ț—Tx^`Nm1N2$ MM{l`5YǩY^VSĞ^g\77̏}0ru0QդUIAϊ#)wZ{* C?^s½ `x2àSDiA'~u 7ӷP4hp82@ ( >d(1PM`jt ig:`G>t;ߩ2m՞뵼!=+^;,,W:1|Tz$ 6 ],Zw{ϠMip:{OLZ/~3m_:ƒv*ZN#j\mLLL+Dp+`]EhG2Mm-o͂]LAKKc,Xƒ?`D9]N½rx~Qh0y.wlnk=FKZƿ)度ON@ qP7yM4!cES0+d5q/Vm`Eڲ{+خĖPq\+~eX-؇X#7t\cZr~ҋzPX2旀P7j=9^iB*[l- Cx=MOK!TzF#'bsmxpD/2"m_7>F7OfM?l3C?j3#?n3c?i3f/Oe4>v鷍OύOfﶙ~{m3>6ӿ06axIY;`o&TnӁ1kNi01X z/u'#:WګnWYmhb%,taP 3w㭷0%L;a:D?!"+cNqQkOзڨ_/{7 40Ķ^ʛu x1|I;af?jA !gL+.(4ў_`Oz9g ߒUGGmf15ZR_BJA٥.2V+UGS51׶K'ez~0G`C\vzu.=-܎"dI[Zfg&áACl:ߍtwc?. u) MgN h9Ƒg}j;KLc_FZ>JaM:ǝpr;Zyj˜ <-m.#Si[0tR|J[C#>>c:Y11c: /c{I-Kt`Kr&_YjneCCj&8tz(٘Ύj!ɨp@'<@6LoWs ).֩!53ԙwIRǷ1lփyae,7xgN;j5cA )BXK7dP՘f>aC_G>2 +\}b}LGxZEFFtYp .B@sֆJgi)CN9o^4a^d&UCF,n É+KCr hin_ulZA.o朧1?O`7545fSL<ߠ6xLnއƌk!Q6Zj7@K:+sΟ^hq ̔k_1]3zE@rۗzNl=+m 9:OcnG|}۹YxK ls<">/14ts`;s;I󖞹%a詔H׳¯>!ZB-6cV||b5>aY5j!,ؾ9(4ý؅e3 V\N;h,8 x/nB^x4 Zuqcr^^p0BgPW3ȑ`iڢ9uXZ=d<,bޱtG33|ǥ0)>6|zZAdqcLV7$߈\fK+UbZ܇|y==b̳E)$ ^Z NEQs]_ϙ=_ rzRcG:#sr]KMMٺuQ˹Os+|bu4!3hzZ)Nl Ӛ Ӡ1D'y3C }kyKk=}D'Ęs ?7Ftx12t6Yu]^&Qv*3&c햅> ̮|.mQDIږuQz%!3wN &W^0bZHN.|$0NFA7L4Y,@ f&Bx=XWf=gWCdBm8;RT .p ѽ+చ/0-KrՅ O_|wJpG8[:]/b/!241u/Y1.(Sr >hT:FI|?չ.Ij m>%q:jYksI ;p pһp^YԶb-+0a')81(%q!5rB@҃+-%N.5+q iXrFopGS-'K!sYnGX7]ځkx~߆jsW]\M])Why'n)2S/vZ> C/x^;~J2-gӥm agvf >=, hiDID/훏ffw|=tD Fa1KbJS:t5$Y1r^ +Zl]_!o]6}jJ_g.1tnk>+5\q}̉ɤSudA IhUq:=MP#NYtr4Ȭĸoe9 "^Nh.Z u^#Cx%T-[7#օ1CvZ* :Q#=''׽inYS'~\t01G%}4-ODMG-ñ[?bQHiv.Ղ̼&P(e*=k?tl_]$$Z<2ǥh?g$G~;u0q lL g)=ru6g0u]GXBɜ7t"Tc\X\LK2JvEv0(ˆA3*o>gͻXJ@Z}r̆ʢX^F Ibz<.7\ND5U8oK{k8:Yq"; ~ǖH2!`Fx %c<j"_/F T.[hKHcMV<܅wc9vD~$@oo&PTAz  a rBΐDD'`kPJZ~]0`s`BIUI@C0\\'L. ykFoN2?;Mq(f {L? ?HRilӜʆ g?Tg(ѥmKꆡC$}O];GB9=Cwx3nsHH®ld7IE94`r{-nx;aHhvI1 7w2]Ga85Z/(J+6j#출_K^gh 4m:H *pKĔ*':YZ ~;xYCUzz!Zy 3$貮I>/s0c~k9a?+3+( 0+`);:|^GwZ1))zFp&5|Pe~$u2څ5/\)_A|Y ?e{''6Vn;eWV4u4I e@B8@V3726S2#6 w"&A m |+{)6/7'UOuO'⁡&n]uϝ}B,d1$9'{0u8S[þ4 ӟtVÝ 1&k:р2V0EbILjekv^N+++O3i@R|~$:@emke9C1n b& RGH:a4DAëR",^I00sPĕa_<9+aa@*y}ctp}BLN/ͻ5U~9+=:xpPۏ{=U2 loG6XYk 䐤$\2dn7t4݃C.vHfG֥&}뗐펅) [`d͝Mwzmi upgH+Ș :u* cH(sEo0 =!<#t@(p 9- ǻ/ph^EsGN4ka <BڢZD!`ayKu_|&7{:/"*WR|Ѧ0_/kN TcK`:>Z])\.!KDS[$ x9^pPas Cs^;4C> Åa2cɸ 1YTFE0sK|3e CǸw!f󜝭TigИ-Ϥ۷;ŻY҂w)ŗkBG#v(94z̘HgabK^0LaKc}ˆR/._=>!e8 ^Y@ bnf7VnQ5ØY/7: ZZXĚ/Nc=8{O16aAŤlE!=b/6^ugގ7A bYn#j##v)JYxC_ul,,8cV9Qj:f1X*ll;Fwʜ-,!ߘd&Z@f6Ơ 5KgAiE2Xta{. ix\cka7nƲˆrl2oH~9`N7O)}&ECy!/8o4o4fQNeLz(MzlDPy0/Sp6V%^МSYC>gkv],v=m,0,a<`vn5϶ S SxUqWdAV[#㡅;az=;$xjy[joݼ- "m ;!cIy)qY1DY.[̉/b=I^q| AŎ~؋97⢬) yЄz_1 cl/ #@2Q j{')-|pU n f[7=zx79O GVovS 4J]/|\B6~ 73x-{)LT55蟇iD _7XjdYӧct7õqBc$QzzpQ$ gx묟o4ESJS0K/p`$ЏZQf+x S%RΚ/XA~SĚ˲x°P HSiSdS.rG)¿M(Y?ӭ;晽g^TߚEnO9zFC>YaV(XHO&Xd[ʝcEäkvi+=~z"c:<8֏>D<O9x얋'D<]ɔMMIu0rO;nuFvO\.u^').J Vœl&`NL<ErJ@^˦.‡f j?vDNAF3y;ZV~SSe$MecHeׁqr[Aؘ xp=ޥֿ|dRLobZfc}\'-x v:7vm ^9'{k_ֽ /\ )Z1zaui7xzL&uȧټuktywlFr 0 ~5YfE+iǝ7o#I,pI^ c0\PCIĪ;>pB')s9 jX}R`CQPEXN{L&JeB)IǚlmIE#bzOH´DVDO^kŹ>89V Ge{2ٱpyr#_+ T^qлb~|"% 7/b! -ʐvo`# M,%="i#K@dWfL- #7޲ҙd*>WNb< dꔊ^MV}i0/ D#4(clP5s] $ z e tt@0Dz: , )9a8fLb(.^xAXJT1t7 {XmMm?)imsƂ>SQ a| cL+:_h@dE3j~R*Y0)q8,P)*'!W{֐juZr _ǘ'ɆF/Q8i(RYXQ"`: Ӿ /_W.4F>Aטyɂ1֡ _-2O FC5G|#p @ވ޼=yX#OG(D-Lr s.Ul*mcd"`s&`mn p5gpm_m.XوymnFtk-xn^% ;<&ؼyIss+ 6[R6\XVǦ<`3H3gy3W ϴ޻mԯGƃU<3jpis SǨ!BvDf[A(L ;͆&=c*MMl7{Iטz Ć?1) VM{`TF/uj g<'bT~0d8Ӯַ}E 6ڰtg14l9_ ^ۢܿRXIw,L%o?[g Q@A(^аc3.eݽ =9H|@aay`aVcoi',N+!B4{(N_gl =$ǎ3X'5+8>Dvg;'{֊{4:Eow3!EV83bXJyi:Td*Fߙ•jHe\n@ 7Jv|:8фHX5&ӻݔ% (|4#[ CM):/`><\=B^G(tq*\ ,%Fq8(9QPZSQH>9q9K} "g~XĂ(}_\YAH%KfW`# $ԝ>5i q+d1F.ט. @*(cvNHwz̦+Cc`>9oiKֽeLkAm,é|e{ci0XV/hHF&k9lb\3;YXǖVZzy_3@ɬ8~hR˳ 5{넜 e7M~~BKJq|m6xS`14#oN-gR vn _u"~Sq)t"| b#s?ZeMl=$"[t+uf~ I >r;[̽ y*e92RQ3q:Sm@ł9,/c}BE>[$(4߬MRx ͼf1 p>?-ﳅ8bd>ٓwP,[ԃR雏h٫^س}BPXd54-<%v$p}M9`Haٮ +ƺ9&@g='HsenvYgWCF*/A4 XZ*OY 5 sȒE Zhy%84MwqӅ}(̃70f*?-o g F:_hک[dbvg93vM L^0HK@(1ި5ñ*_*F2rs~zo8W^ µA&MSW Lh`t8y_ MUm2,݉їW +C I^:K!FuNs8{6&? ."*?e |$ 9LW  ŀs c*w=^\C;E٤A$W<`N`DfR 9@Y2?}wPKsxl32fg}BaY \-4Fq2,Q ^ꬥ:3TjIkf1S.[]ƏM/-/Auè|SR R=Cm?K8f)L/[lyA>0r]bG= ) B1ؽ%l~IL".sQ¤ /뀎&laq;k(@dU~Nd'@Z-QcdiEld8jxP&x&+tV7u]u\*;83_ ;$sjbॢ̑XV(0%0eupZ|[eĮ8@r9]J 4Ii'3Eq"m"!L8 аU0i$VdDz**;1ܘ0/ݔU29 5(3"mHgW+^Ya&\|:UY,I94}!;5ҒD'rLY<1b8KA0)C)Wْ$x"G+mVĞeRkEYM;HeRGiPP R*p)|җBL('ˇ"˰!.M EplIoh#0\ /h2Oom(^K)_I\Eph8gʝMLLK2oŜ[ѷ{#J  LqRQ0^*тdVXt` `ueSW<y7Lų#X7USs"rʼWk40b&77=Ԡ5'E׈= 0 NLMTޑ+GQG9Ӂ?ڹn68&xx)jUBhDŽWAK)JYh2Uڔyu (8{ d@ xyIV>QS.r->V15t6z Cvd !<#bO?C+pzWBVFC|r˂w*.-""K4!b]=9)5•m贔i䝾9.X-k'?}7GR=uy!|@#OE@ B69ss~xuo} Fj}y` },^Vb5Px>0$ mDVWѠʼ*$A.UWʶEtqb XIcڃނsp¶W)E/p1ӓX'c%;p&~{+.󽁧:Ɔٰ$%>|ji׃ Qa-[W*u?nZz"|.,:gNVtܴC*ׂuѳ3Q=8O9I;lx\Ox+vFҨE#翊hjеTAemXFLc q?rv`_yt`-ۼ—EiuT4a@HfAt~őFxt@Ly.'):cnpNNte=j'@FYeT"K\^טWC Oa[ȼ(+=gCյLP## ^P!L=(k>'Y( 34ӕ2EcPgYmR4tz0%0V@U~ɢl.7O1Vҵ3eBw-_~:Q/I |P71`CM\f1j.^-}E_~?S& A^R+z:,2%OeN=,[ J|Ev,C@w)k~ zNbkJDVePfQZvׁ7{]LXG/"j0 tU~GTF·=59cdSFсBLQeL5o(KCOrlP` z(M.Vs˵d$6r2i&xaAt/EoLӘZɣ7p#9\i\^v<ׇ#k4ͭ}5#T(\kyy/ 06.Q ‰/Tq P o#>z]+]^ߔm3{zϪ^f\,~`daWTrEUu\ vӼ |hj#5$U/&zgM[ޣlb%%9HZxH%+ ѿe3FsHؙEiJZ/Tnd>Vǝу\'a }48)HP H% 9T^.ШGu]$i\)y*EW4EHR LNx'cĂ<O,r& m˳q7T-s/2 QpfҢs(ra͒:>Ɂ1\S,:G J<(3ܻ NrSxrldY˲'M-L Ǒdj!~޶ZE2'PŨ)\GeA&իlɼd@=LK"_B'2sV̏/tie9U% SAUbJV< ݼ'}*+vJ0OD\jZÁ9lj=txpTbhYȜ5.[dUу3c16C=Gmv[[ TLz(r@r TUԈb9|V+:ljZʄ) $U`uz{˰1̜TJ,EE@ԏ5픶 OPNqTֹ3%to8& ;#.6U2`n3zUrٵri p^G?| v cI.gD'f3%5p-V=@5&# Xء ՜(kF[{ /F=$wlO>e'J`b$"aIC1ޖ)}?\UxGVGKO=i<^\o귱 3cRtE(5EgTQa5Ӄ"tuÚ˖rZaEqkBlR9D-ք6ZܾA('*-z(j.ZUM^=n"^M4R}u\-S/o"ʽ_Nxvj-Żo_)2E QkRiAE1VR 3cz2V\/v'3fS~3< #E Y%'&͑d+@ַm _ zKj9\ܾr$Z Ri }>B (ˆI;a <*)VɲMi$~ﭯF \GPS72j͸\y*8p/csePd*j\.ۏ, TL۴PGCfk 3N_9._hX=\v)nb*o+8ٜ '}LSN*.wdϵCj8U~ܡWu 5OJ > M_#T5bIB˔B\уҋEP49iD:@0ҽu+4JI-h|Q%T /[*jH}EǪgprV+Y zsFcU1~'XP a 8(*5ظ7'6dڗ F] No,`<&F0>[Ng&Bh:t&hrd>WP,GpݶAbD O߸AwClq9!/&d,ZVcJ=mzbv?-{ `AP}\s8w@e1sK"4:G9=n/;V9qaQ,=^M<?S pQЖ56+X)UVAc@garʲ"EͰ 0SIn]2~M- nyL<< 7r1(07\ A5b `XlK i 1"SgSM`HUpb&S]WEӣN-o=TzکBO A஥yr,-pwx2Y*>^0ķN Yɋs=DL[  '[;0NX7! 85Sz{[6ޕC᳑-*sc4SX~ilrEV5/itŋybn Bdع RѣEnV? \,c2y+ [eu[bj{ *y5EI^KFNvY؋2Tl$JW! G%ݴ.(nzILE?1@Vg-%>aU0r|-#}5ƪVYywxwY=DyvߠRQSC;YH/gfAU.k7uMC J$MU}AhN,ԥ21]bR>C[<}qlSYW _5Ea #PixGY:~Te?aDP6JL :Se@CDoS.C&Ӳ J&2  q;ҼFU'czd5ml=H'#LV;&/9 .LY~V' _ˮ)*U;>uLč" "OJu5o.\~aig2 !w ׼)",{Dm:^/ sNׁnʦ)gB;b"pB *0J+0Rz)"P-Lچ$ŨlM 帺kJ\fAM"D6.88lb_3Ur'hxZgK*L`Ҷ{(`%H}?\eڥ%X|~G\>:JƯhQLyC}:\\eD/s(Eܽu) eL8JLb.k|ٳPQ%CyݕSe")J$Eh*юr,.³敌CSy^,V"K]fyvy[P[y3/!3T].ֱcd Twȡ*iyl0 3l@Ay8k6S"UzJ0ss%ѐR;/Pji-ta %XC`-J` PB3 rtdSy,3UYR7#8ǟ܍ywr;.x , /gu ۋxqsO˪3#T  q`r˾Mk'> :x\wk^A59 眵4K,OHCsܨg)spQ*;\2}^Tp6]fP$`ߔ)e7C,we/;'XๅAk o7q]e'UPB;Me,cQ2 ~u;w+qJg"d"WRQg.(QRrY_eqd炜 jS攊J.gM펰zgDEo%QT2zKpn8G1&U93_:ڐ έ<%o2yw)ҋO٤o>|`,:&J(+^% ץO±skʂ +\-f?SxOejF~?c:o ǪiLY{be̬z3xa[2?K)>_:<Z,WKU#VeI)wT,/,OeQsD\#[K06Oر)˃Ys/5(j\휽~sHAl C̜3w"Z<>x;jY硓tO9ٙ㲠kT#٫P'[Ќ͂vcrr38~b_˼\2yC}u Ggia%Lc˂-?2 Oii8KU)"e ʝCuGU͒WX OSX~YE  p_ 2w]."'1k'"H@ 1ںe# 9r= 0*ӘPʻs΅2*ҁz,W),_xij~u ^{Rwrx iŌG7Z dcW erJDxkgkXTϩ }}?~rx= 7!i~fsBH:,#'g$e*w~Č&0Ȟ5Ұak-xi_ύ#fAX̹LP5s$H=W0JLHs Xbw!v0"8e -@"-5#|ax};`g _9gA $tSa r/Pqv(* {B8#w1Da@ރZB[Ix`n X?~P]A Y (pCfc,H2*XQbc^Wd0KuyZ\Hb݄񀉮QJ|iArJҖq֛h9tJ"LIcf_dUFp9P"9HQ]s|.mx)H5X of\%HpY^1\.Nж `z}Yi~.ڐŵ-D 䁐2#2)O9b4K2g,PYrsZ\Ũ 3S Mfތ#g9GOE%J i8G.%AEȥ5_c.8P1AheJ=nAUKmSaDe󹡀VP榞hwS >Yyѓ/?q6#哮EMnuݍN^ouhAdzwy&2y! ?zh'ǿ{pHĎ`( Q}_^7Wߺ`~`т0D;p7~j= 9gy eLx :}=銠kB=~|wdolQT. cdsH33ۃ,_n+'o)](:!J8.oY'bx;;sGpV,WuP,WPɟ5[aY4?_q>0o>>^ԝ*N?{ϲǑ_3 q1%Ň٤9e6*ٝ]JUGAgf&mDdUwScQhs`fefddddY׎`o%[؏]ah:Iڙt^޼, :2g&a0e_87EԍE:&ck2N?BStgg]iW`V.&ZLW 0?&[GX'|K@}{fb~aS捘3~dvlc[6\|&Kͯ%UhIUfU9|N$lR~{{He uм?oK;_h9qMbb4o ,zZFj{6r]WW<́:w&B^F-t: VvSO-3$@"O4LAX3[ص>% ZUCe`oЂtNE>؄uySr3'tf@)$-3 !W%~M?;;{ØåS|1ɭY 3Iؗ_}EW_L }np{e}2Ms): xd.I HH\cdAfN= ԪlU4Ei@Fͯc[K,p6Ht-\VEzd5|:v>w4AUVw s .8jdumdW`[-ɸ&z]* 2ȄVg&X1T/V[[S Vpӝ7i%.peKEM<~LO 疻6sp,`^.,k#[[#A> I5,bp[+:cW.'@e5JX6ݢ?>a`/ cdZAv/u ĩ7Q ՀےC`vKh_!qO@rq/Ļ}x_ir]KUP %cL06ձQD~t!BζBEx2 ǦkjmX}VdÉV<=³j~ >3lGtFp ]o级49::ȐRz~@3Caf)W|9#.>L(2ܡ[6C1P%dH<rN0'19F B8JBYB'y"~W< Q 4dC8<ۧHi÷L SM^Em~Qsz9:圸yU Θ <G ˇ̔!ow漂pCt`^\bݸtT$=YՕ - AG/cTVC &wW2]$bcita(e8AvfIqxU _(!G 臽łmHt劑q:h ^ToC.=29࠹F$70ymr,F]M#oHQ@Or'8 Am{ ##S+W S<& ߥօ^ /9R3U+.+\-CzyC/أԳna#]!O:m褻Al3>'4= :'!0o29')_9FW6w)"jönԳCEbr"C)hdL "J3v >rXh0iyzz͒WWxPG qfbC~T{ |-GV60SZ,@: /')s("(j-Ē@|X`DEʿzYfkFݖ;P+݂guWڌ2oŇІni!ȸyPӣ?`[кxvd  Oଧo#^ȸ|buMc7&m(PQWƹ Tڂb+je +?duqEnih!`x?L_Naq`ԗ>)ə ?t1nfĨעu7%AoQZlj`'芢_tT$&(L ~#*fգW 3lH~*6^prdl'6NC9`0um W9:;{ I"_dc4{gybYF>X0x7DBͲ^訬tZ4/"]Teyձ(ﻬAޑ{eV<7(rf-):GekJ=,~0W?.>v*b"~'<6Eu2B|9L_ٖCb!V [-ǧx _8B2o[t}{='-RfEp4ޑ?'> Hj!m4\q@P`23G})xܐWNU܅ ˅a3̎M]LBSYx ׍nKF3CY-R7 gn$oQTGbLɆG⁩Ji~d_{jDJEč \.a"_i^Ё\M}adm(]b[yӚj1+!t(83Vu]rasYfBנbZ,cnMfM :aZtbC~ .],@SzyR+?31瞟r+],_KX> !ފ J0ns_vc{ |LE/Ṟ>WtS]?Q,y.w_S@dFJnPW4e326{z`~҈Z*pȦP*d)­NI1 t`*cS|c/+:.;Db"sb6# 0*s}.+wWƢ: /`mVžwz @@~}r*eWU:Bittvp.:\*VзꆤܿXfNC幻Ԙep3r+S Ka1rUx pDV6M&4ݝ8m#hm_Uq 7lx6*Zć O k4){@]ʃ%+I'6q5I83ev\,Jb7·fģA -8}D{_ X_›F .5eG.@s33p+GZ_UO:t: جD 4=DRb|L1]}E-:I Zk>,[ixuxV:4rzJZa\hߨT`FEQf=zuTG-4 \.a%3x{n6ՠ'fk%bFT}8XkT%Sw~(գ? -t62*`ukt;V,Q:o7ؚ&h6%&4ł{@y/Ԃ ަVD =lJbПA2lgc]PQnG`|7dF=fro_]"* g&}p)2.Pi8g ?沝d"f^s  ^>&|g>F_4kO, X /Y~1K_~WYLa59 Y\g»!^Yfo#@إl負j{MZinG0 eg_7ht W˖GY|.o4 ,R$[ r7 Qj5Y _+a`wdMa]OKUv6L`b7箨) fCH7w&FHUa/'kyio\X2cռŝ/Y5".S/ No6|ۦ L&^m|gZjMr都rjhsGrlSkPdp$iuߡ!.r)g@V$d؇R &4)0q:4g f\4.,4q] 3ST@r%#='& f :P 9;tnNU݂qPeT.n ߕ)ASMYhq&`L׃ @3j7Q5]V6w sn3<x|$ZI_rVݝ..82ƃ|wB6̘aTGpYx߼ #*j/u{F8`Z7eO%.=S[|¾C^fĒ(TayEA[}72jzN7Rl!]?qy={|Rkwd& MQ:0[AԿ7b[b'r;?E@ 䪆<`ߟLC ]KϽ+/RaR+=`a&lLLcX0y51&x)YIO]*|~|[Rˀ2c+_EAѧ^նѦXƦ%"~#mԱޏsu2RPXY] ^#{ +,CVT|9d+a>/4\P?UpQk9Q[a7JV ûZj} 5UӀ#S}hX7y3eiبR,u I@ f^ywL#X,I;Et`WDfW{[MX}+>al" [xǁEtş!|21Gɑ$3^ 07EuEAYfBe+G߈]-V= 2nD [>Xɼ\WssrW狞~R.o"7/E$|kWuCcµB8,)e3Jy9!F*9r_c]lD^zĮУsbs66.]Yf_f&ds #8o(ۙf*=m./3M'ŏ"u'~O*tVFkdAqox#?۱ٿ{=ss'N˃MMdC=pEf-6I޷V?Rԟ~L>+^>!p?G_O} }%U>)NU f9 b* ʊǒyT(=]%f)JZ^D3L95yS.V$)*@ jJeA1J#a5>|i>|^iHt|N?a]0 7bnQŒLx"Z0\-F/mW͈-c/r =m5tx&6ğ4h7gch rhǹT\M+]C&W }ܷd2d,ϧ۶\ty鳟Yoҧ*yc=QNp`K&Uɧ~yOfq$:bݙN3I1cqˈ\s O剽W*L_Z ۘUWN&^pTƤE6%f:MA*K60υ3hy 3ʂ0rE'}^M-npP"m"c,xe+I ܖD//5G8_=挺O)^e$]~~O PDe60ܗ|)bf[dru4c~u);KIYR'@'pGkqve+mٓ!P̈c: M `N|1h+<سDP%G&t *Q&I7mJ.,qd.#dܝtz _&ʋ[w6Nld$SJHE8lnl'ľh#b7} =+F7Z I9|c`NLm,bH`m qU@fvkyCzjL݀0v !5ڌnGx*0v<OٞU?])VO^E]vqB9֑r{XM"7p9R*3YY8pyɊpCX*[I~* /Ҍb :v'r]N"+-6?S9.G;~_UN*y'G>+DATzі<:":+V+kubPR!wiLIRhRR߽U*L:fװrP$O#7/@$\i9sV̪4г\cDUΦ@)ךjGv5$å-V5_6an^5KڒνM"F9Lg g{b~wcmlR6>u{UwqF詘4,f2Rvxk> L, }Sqi6Ięgw6O泸}𵏭,%^ GCUَx ,oQehod&PVWKx G8S4VA+̤@{XD51ȑ "U>礱 :tgjM9MRYqqK;+q!I;t n鹥|ʷd9G&UEYF**,B7vMHS[Uuhzc4u3`DT꡹ӭ3 H%2,W,\y8ti.] GPT3w9])zשȦḿ6OWꪑmzGin̠u1*'ʺD_D&[&27qTyb}MQ1/B{zv4QQ5m*PAQA#oU6KvqϜeR>"al!eK.ܵSþԊo=>Z ;];aF8YLؒ U+N/JXpܤdc/Rɸ ͅ}36S ;^;"Id`Cu saLEB5(_W\TjdwކZ6Xc]zYڬU_a"#nzs[#~}!Z %>wes\Gڔ*C~\h]5Wzv2{Hupy{wΫXqGtاK guqHlܮV3fdٔX߽yTVϙfٕ 5W.f2](0@g,|gmM c3Tު~&ZbGنW;~$GOdYQDZU'z<^6/E5)$~*"-1+ό~Yu2plpt1-_}6 3ʭCkL|+b\/t_m\21"W_JH;쁓n!:#vvMv *裱Iɭ[o6m܍u/p󧛄F@vy}a, JZ:1]Ƒ4=?tK& Eq [9¹mduSE*XqN`f=\u,%8Ldu 'ZNcwGW:G6%{ Şx_vE2os}@;|$MRtuTW9 PI^Kf\q7퓴eB'6|(#D0cGĆ`O/o= Mer1놱9u?, n\ў2~x>9x/:9Q>j;+h_9elK?!h)9*eɼ[,}Xc5}c^KEO.9fe$-f26HI/9?ĿOIJ}0m3!Q{t Y&Ȩ⏣<˼jm?+woT4jMڏH6?$0 5G̫qD?{⳸Onv'ܳ3x GDOaĸt \u>wa?]撑űJ#Cc u#ĥ0tIPAn  eqTl2 (9!KPcrc]6Bb "֥o Zx] q,9wThTg22-F3c2q~*0TKq6ݟh,}|q~ 'E9˕>=U9qR*f2ڼ- 1m#A08H2UP`ـ;BN(Z&5őU)ޠœb &&C ?U=(ktn*[霊X`yFabpt*O?>7胝 ~wcӥ^l"pA ,LJI w`LN^ *U9a6@ƭD Xᤗr8C0S]WiD4iTT}񪯭.2w9.vZDZrR;+{~*wRiUP ob_W5% {ĝiU;-/"5s=&vM':H=Z!X/a7:r#_f\ 41%I%0n#a>&T4ݐZSR]|K 5c_x W58Q ?"5 zohבA\L(,㏪&fbN$FB8U8 yF(`=l2 #xM dHe(Aj 0v{D*wD@E]qWL"!XG)UDqi?Q{yqW`ǠIO{\xRPhM= -2dIWIz}u8k!>~}^j>,3kG31m}2--?7TIsL>"Bujj{hbDx襅 L핱7c;C?XȎˣX:.vv=M$oE.bjC1qDy3߈oTz,.ͫDˋt[fXb˓M:bRC`3/|Y7LG;yЊsx3LM']e},Y:*J$֊.@i]pP6 D $nk4)\Q9+Zւ%qGkM$/}pDI~Č_+rEt6/|ĘDxó t>K=`D!'ON,6Kk[X *C$97#os㇬yn]R$tКith.BLdA' â0Wb}l=%m5G-S^K,AI{1 LôgnF/+~Y9w7:OngEL{yQb$d̘_*yӻ7bYѮZ;Wӻ^a{Z᯸K 'lhX}ܟ׮Rrj~6o[o;@Td*eτ\kŇTT{Y69t0b㼫($ HY}O_XŀˡAWz<:watjGJB}Hrj[>" ū ?x;O,xedMQןnO^tJulA|}c7Qn0E; NVvn# bݩ\XKj"< Dב)mCnZW%+bV>>0i<k߯ nvm3>8+h+ = nUJ ~_#MVxtSOz2I`b^XI9FͧWCBY<|<Q*ARb Cm! OVD?WÜ"P"!StJuL ;|:>iB=E-\*Yυrt/IFp'B` (˭TD ;GHP`T*XVTz+e׺y%Wu":@Cοap]/[Voml^MuA/C_Ѥ_(ŒzZhJBF~X!djt6yn @>*Z MV[ Q^/9k!&8 suϕ'YySo拃O?|tREf ?Qmk07p$jK@*\Y~AGzQubGʚ-,:bʜI藭ޖYf[:;kcЈ,V$vą& "n:ٺӕvRQ +YLVn8x]7 z#a@9S>!T."$!9ŸOѵ%CL[?bdWKH\' T23q^':Q'SPx` 1KR!+<ю ]x尫-<_W3!0?ד%bIABXJZ:2Y&3`]$޸h9D(\*Ȍ^H'<S!%N)LIV_u,X'%d!G$&аQ|[g euZ.[0Ffe`muʃuhʍ:Cĥ|Fty6S)lbҘ A+P>\zpZpCkTJd/ ׸bn /p{Y$Ԉ!m$zx7Ǎ>IE0K$셈`{:5))V]Aq&˲+\)c'?)bsT6< M~G b-Tlxj5MBqv:p J E3M;W6Ꙝx?ja` --5euna=>+aJ"ˏMRZˏOm'T\o2YXp'b`D4:$[nϿPG3i9) >C98! D+|!%_@vEE[ڝD#؁ټsh 9[[3W3Bl ].A&4d-f|'X~a>zM,RQ}Io~nqHBb$%f:u'HI~) DƺC;-,Լ($ݐrjH _)Fv;@aWp~uĈQ.G;V\\)IPd{f;V ꩄ䗪6@ ?$8b:`WEl9_Wo =s`m65\`rzܿ.'eR$`) ,KSGs|3>ϝSPXbKkgn&QvWtjԌbG5ힻ'.q 5 wbp~:Ӥf!-Abub?go)fJ 4b0 XA8ռs-z.Ƌ4!Mđa[IF@E vіKu^b>P DT3:(ONS5ZVpL)f,fX 9u'':Sxv^j]0&G`yZ]Wi+XMZݰmfU |BiCȮJqNoxC1f'1&VCTI&^\%焥ȁIy-ŠQ6] }4iءo8(r&k匌\vB8JCVOebgm/j'3L`+HǠC5:-#UyHA,B8.E?_Ji140Ҿ*FAgR { #anQX(nXD\Gmragop8^f;/RhTfţShYۛ\te:f,3j0 rJ)ֆ_YbQ]23d(h*ui\xEQb݋mAD /8OQa X, Mq߶T3vX{SnLϙeoS{EsSUK_j.1?T&2\ 5xN.''Bg2y"KfclRjN~R$e>(G osN{E\c. :Dob3ck6Gaùj+A %TXW(I,O:+_#-e Wb+Y'?Յn%BdWRXPs I:)k Ո+񎈠Z@;9\W%g JR+@ YĶ\P]wO,P"nas Pr LG1jc]yļN T)]2B)2"GM It5TIB]$P"_bW tg:iz]- &]fcm[;@:=xPB]fkt!~z}t $T4xB}=cF}Y뱪C%xUxzSE ףы:M&F8m"qZΓtp0`+M%0t~=Ȇ\";@(IZhvqfB 1y#u0xah>AHߍ(bjkx}`il$ivޒ^Ӓ2?b1(OgM0S-lb~'5쑛qYs'h]VD®` +Nqasel6Tٶ/|-=O~ǽ\ vV.)ցgsROc~ϲ-lr>uRʥ9cuRT2sl*ڭS.6}Z W66q.-hАqXE:+"SZLPoYΊ~-pG\NeSI_V&"1VT\.H칛aBRaIt.èximHqG(YYRg)}Rabn.Є1R1<$4;"n9GD/ ĉՈ%gpa=3+өZI=C<=wyƉ=j!^F-n§c]S-c(gjn2oeOQEYmL h*LWpO~s󶜚C&vٜ><R+3uX- 3tD 4>^}" -0d 0Dv@R=۠?̍Ћ٭ = ۡ%!VBtKd07 xA!@01-U KPJ,L+رL@(Y[7X{'q*s(&l[=qf tue&5 (KR:'m1$\1(re