summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5A.c170
-rw-r--r--src/H5Apkg.h2
-rw-r--r--src/H5D.c4
-rw-r--r--src/H5G.c16
-rw-r--r--src/H5Gstab.c2
-rw-r--r--src/H5O.c128
-rw-r--r--src/H5Oattr.c10
-rw-r--r--src/H5Odtype.c6
-rw-r--r--src/H5Oefl.c4
-rw-r--r--src/H5Ofill.c25
-rw-r--r--src/H5Olayout.c4
-rw-r--r--src/H5Omtime.c4
-rw-r--r--src/H5Oname.c4
-rw-r--r--src/H5Opkg.h2
-rw-r--r--src/H5Opline.c4
-rw-r--r--src/H5Oprivate.h12
-rw-r--r--src/H5Osdspace.c4
-rw-r--r--src/H5Oshared.c6
-rw-r--r--src/H5Ostab.c6
-rw-r--r--src/H5Tcommit.c2
-rw-r--r--src/H5Zszip.c2
21 files changed, 272 insertions, 145 deletions
diff --git a/src/H5A.c b/src/H5A.c
index 1874187..a1e631b 100644
--- a/src/H5A.c
+++ b/src/H5A.c
@@ -41,6 +41,14 @@ static int H5A_get_index(H5G_entry_t *ent, const char *name, hid_t dxpl_id);
static hsize_t H5A_get_storage_size(const H5A_t *attr);
static herr_t H5A_rename(H5G_entry_t *ent, const char *old_name, const char *new_name, hid_t dxpl_id);
+/* Object header iterator callbacks */
+/* Data structure for callback for locating the index by name */
+typedef struct H5A_iter_cb1 {
+ const char *name;
+ int idx;
+} H5A_iter_cb1;
+static herr_t H5A_find_idx_by_name(const void *mesg, unsigned idx, void *op_data);
+
/* The number of reserved IDs in dataset ID group */
#define H5A_RESERVED_ATOMS 0
@@ -216,8 +224,7 @@ H5A_create(const H5G_entry_t *ent, const char *name, const H5T_t *type,
const H5S_t *space, hid_t dxpl_id)
{
H5A_t *attr = NULL;
- H5A_t found_attr;
- int seq=0;
+ H5A_iter_cb1 cb; /* Iterator callback */
hid_t ret_value = FAIL;
FUNC_ENTER_NOAPI_NOINIT(H5A_create)
@@ -228,6 +235,14 @@ H5A_create(const H5G_entry_t *ent, const char *name, const H5T_t *type,
assert(type);
assert(space);
+ /* Iterate over the existing attributes to check for duplicates */
+ cb.name=name;
+ cb.idx=(-1);
+ if((ret_value=H5O_iterate(ent,H5O_ATTR_ID,H5A_find_idx_by_name,&cb,dxpl_id))<0)
+ HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "error iterating over attributes")
+ if(ret_value>0)
+ HGOTO_ERROR(H5E_ATTR, H5E_ALREADYEXISTS, FAIL, "attribute already exists")
+
/* Check if the dataspace has an extent set (or is NULL) */
if( !(H5S_has_extent(space)) )
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace extent has not been set")
@@ -282,25 +297,8 @@ H5A_create(const H5G_entry_t *ent, const char *name, const H5T_t *type,
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open")
attr->ent_opened=1;
- /* Read in the existing attributes to check for duplicates */
- seq=0;
- while(H5O_read(&(attr->ent), H5O_ATTR_ID, seq, &found_attr, dxpl_id)!=NULL) {
- /*
- * Compare found attribute name to new attribute name reject creation
- * if names are the same.
- */
- if(HDstrcmp(found_attr.name,attr->name)==0) {
- (void)H5O_reset (H5O_ATTR_ID, &found_attr);
- HGOTO_ERROR(H5E_ATTR, H5E_ALREADYEXISTS, FAIL, "attribute already exists")
- }
- if(H5O_reset (H5O_ATTR_ID, &found_attr)<0)
- HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info")
- seq++;
- }
- H5E_clear_stack(NULL);
-
/* Create the attribute message and save the attribute index */
- if (H5O_modify(&(attr->ent), H5O_ATTR_ID, H5O_NEW_MESG, 0, 1, attr, dxpl_id) < 0)
+ if (H5O_modify(&(attr->ent), H5O_ATTR_ID, H5O_NEW_MESG, 0, H5O_UPDATE_TIME, attr, dxpl_id) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to update attribute header messages")
/* Register the new attribute and get an ID for it */
@@ -322,6 +320,52 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5A_find_idx_by_name
+ PURPOSE
+ Iterator callback to determine the index of a attribute
+ USAGE
+ herr_t H5A_find_idx_by_name (mesg, idx, op_data)
+ const H5A_t *mesg; IN: Pointer to attribute
+ unsigned idx; IN: Index of attribute
+ void *op_data; IN: Op data passed in
+ RETURNS
+ Non-negative on success, negative on failure
+
+ ERRORS
+
+ DESCRIPTION
+ This function determines if an attribute matches the name to search
+ for (from the 'op_data') and sets the index value in the 'op_data'.
+--------------------------------------------------------------------------*/
+static herr_t
+H5A_find_idx_by_name(const void *_mesg, unsigned idx, void *_op_data)
+{
+ const H5A_t *mesg = (const H5A_t *)_mesg; /* Pointer to attribute */
+ H5A_iter_cb1 *op_data = (H5A_iter_cb1 *)_op_data; /* Pointer to op data */
+ int ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5A_find_idx_by_name)
+
+ assert(mesg);
+ assert(op_data);
+
+ /*
+ * Compare found attribute name to queried name and set the idx in the
+ * callback info if names are the same.
+ */
+ if(HDstrcmp(mesg->name,op_data->name)==0) {
+ op_data->idx=idx;
+ ret_value=1;
+ } /* end if */
+ else
+ ret_value=0;
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A_find_idx_by_name() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
H5A_get_index
PURPOSE
Determine the index of an attribute in an object header
@@ -343,8 +387,7 @@ done:
static int
H5A_get_index(H5G_entry_t *ent, const char *name, hid_t dxpl_id)
{
- H5A_t found_attr;
- int i; /* Index variable */
+ H5A_iter_cb1 cb; /* Iterator callback */
int ret_value=FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5A_get_index)
@@ -352,25 +395,13 @@ H5A_get_index(H5G_entry_t *ent, const char *name, hid_t dxpl_id)
assert(ent);
assert(name);
- /* Look up the attribute for the object */
- i=0;
- while(H5O_read(ent, H5O_ATTR_ID, i, &found_attr, dxpl_id)!=NULL) {
- /*
- * Compare found attribute name to new attribute name reject creation
- * if names are the same.
- */
- if(HDstrcmp(found_attr.name,name)==0) {
- if(H5O_reset (H5O_ATTR_ID, &found_attr)<0)
- HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info")
- HGOTO_DONE(i);
- }
- if(H5O_reset (H5O_ATTR_ID, &found_attr)<0)
- HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info")
- i++;
- }
- H5E_clear_stack(NULL);
-
- if(ret_value<0)
+ cb.name=name;
+ cb.idx=(-1);
+ if((ret_value=H5O_iterate(ent,H5O_ATTR_ID,H5A_find_idx_by_name,&cb,dxpl_id))<0)
+ HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "error iterating over attributes")
+ if(ret_value>0)
+ ret_value=cb.idx;
+ else
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "attribute not found")
done:
@@ -690,7 +721,7 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id)
HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "attribute not found")
/* Modify the attribute data */
- if (H5O_modify(&(attr->ent), H5O_ATTR_ID, idx, 0, 1, attr, dxpl_id) < 0)
+ if (H5O_modify(&(attr->ent), H5O_ATTR_ID, idx, 0, H5O_UPDATE_DATA_ONLY|H5O_UPDATE_TIME, attr, dxpl_id) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to update attribute header messages")
} /* end if */
@@ -1267,7 +1298,7 @@ H5A_rename(H5G_entry_t *ent, const char *old_name, const char *new_name, hid_t d
found_attr.initialized=TRUE;
/* Modify the attribute message */
- if (H5O_modify(ent, H5O_ATTR_ID, idx, 0, 1, &found_attr, dxpl_id) < 0)
+ if (H5O_modify(ent, H5O_ATTR_ID, idx, 0, H5O_UPDATE_TIME, &found_attr, dxpl_id) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to update attribute header messages")
/* Close the attribute */
@@ -1405,9 +1436,8 @@ done:
herr_t
H5Adelete(hid_t loc_id, const char *name)
{
- H5A_t found_attr;
H5G_entry_t *ent = NULL; /*symtab ent of object to attribute */
- int idx=0, found=-1;
+ int found;
herr_t ret_value;
FUNC_ENTER_API(H5Adelete, FAIL)
@@ -1421,25 +1451,8 @@ H5Adelete(hid_t loc_id, const char *name)
if (!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
- /* Look up the attribute for the object */
- idx=0;
- while(H5O_read(ent, H5O_ATTR_ID, idx, &found_attr, H5AC_dxpl_id)!=NULL) {
- /*
- * Compare found attribute name to new attribute name reject
- * creation if names are the same.
- */
- if(HDstrcmp(found_attr.name,name)==0) {
- if(H5O_reset (H5O_ATTR_ID, &found_attr)<0)
- HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info")
- found = idx;
- break;
- }
- if(H5O_reset (H5O_ATTR_ID, &found_attr)<0)
- HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't release attribute info")
- idx++;
- }
- H5E_clear_stack(NULL);
- if (found<0)
+ /* Look up the attribute index for the object */
+ if((found=H5A_get_index(ent,name,H5AC_dxpl_id))<0)
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "attribute not found")
/* Delete the attribute from the location */
@@ -1506,7 +1519,7 @@ done:
*-------------------------------------------------------------------------
*/
H5A_t *
-H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr)
+H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr, unsigned update_flags)
{
H5A_t *new_attr=NULL;
hbool_t allocated_attr=FALSE; /* Whether the attribute was allocated */
@@ -1519,6 +1532,9 @@ H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr)
/* get space */
if(_new_attr==NULL) {
+ /* Sanity check - We should not be only updating data if we don'y have anything */
+ HDassert(!(update_flags&H5O_UPDATE_DATA_ONLY));
+
if (NULL==(new_attr = H5FL_MALLOC(H5A_t)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
allocated_attr=TRUE;
@@ -1526,19 +1542,23 @@ H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr)
else
new_attr=_new_attr;
- /* Copy the top level of the attribute */
- *new_attr = *old_attr;
+ if(!(update_flags&H5O_UPDATE_DATA_ONLY)) {
+ /* Copy the top level of the attribute */
+ *new_attr = *old_attr;
- /* Don't open the object header for a copy */
- new_attr->ent_opened=0;
+ /* Don't open the object header for a copy */
+ new_attr->ent_opened=0;
- /* Copy the guts of the attribute */
- new_attr->name=HDstrdup(old_attr->name);
- new_attr->dt=H5T_copy(old_attr->dt, H5T_COPY_ALL);
- new_attr->ds=H5S_copy(old_attr->ds, FALSE);
+ /* Copy the guts of the attribute */
+ new_attr->name=HDstrdup(old_attr->name);
+ new_attr->dt=H5T_copy(old_attr->dt, H5T_COPY_ALL);
+ new_attr->ds=H5S_copy(old_attr->ds, FALSE);
+ } /* end if */
if(old_attr->data) {
- if (NULL==(new_attr->data=H5MM_malloc(old_attr->data_size)))
- HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+ if(!(update_flags&H5O_UPDATE_DATA_ONLY) || new_attr->data==NULL) {
+ if (NULL==(new_attr->data=H5MM_malloc(old_attr->data_size)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+ } /* end if */
HDmemcpy(new_attr->data,old_attr->data,old_attr->data_size);
} /* end if */
diff --git a/src/H5Apkg.h b/src/H5Apkg.h
index a354a48..976340d 100644
--- a/src/H5Apkg.h
+++ b/src/H5Apkg.h
@@ -55,7 +55,7 @@ struct H5A_t {
};
/* Function prototypes for H5A package scope */
-H5_DLL H5A_t *H5A_copy(H5A_t *new_attr, const H5A_t *old_attr);
+H5_DLL H5A_t *H5A_copy(H5A_t *new_attr, const H5A_t *old_attr, unsigned update_flags);
H5_DLL herr_t H5A_free(H5A_t *attr);
H5_DLL herr_t H5A_close(H5A_t *attr);
diff --git a/src/H5D.c b/src/H5D.c
index 456020b..c388184 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -2891,7 +2891,7 @@ H5D_close(H5D_t *dataset)
case H5D_COMPACT:
/* Update header message of layout for compact dataset. */
if(dataset->shared->layout.u.compact.dirty) {
- if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, 1, &(dataset->shared->layout), H5AC_dxpl_id)<0)
+ if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, H5O_UPDATE_TIME, &(dataset->shared->layout), H5AC_dxpl_id)<0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to update layout message")
dataset->shared->layout.u.compact.dirty = FALSE;
} /* end if */
@@ -4134,7 +4134,7 @@ H5D_flush(H5F_t *f, hid_t dxpl_id, unsigned flags)
case H5D_COMPACT:
if(dataset->shared->layout.u.compact.dirty) {
- if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, 1, &(dataset->shared->layout), dxpl_id)<0)
+ if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, H5O_UPDATE_TIME, &(dataset->shared->layout), dxpl_id)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update layout message")
dataset->shared->layout.u.compact.dirty = FALSE;
} /* end if */
diff --git a/src/H5G.c b/src/H5G.c
index d30f6f0..23405d6 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -281,7 +281,7 @@ done:
hid_t
H5Gopen(hid_t loc_id, const char *name)
{
- hid_t ret_value = FAIL;
+ hid_t ret_value = FAIL;
H5G_t *grp = NULL;
H5G_entry_t *loc = NULL;
H5G_entry_t ent;
@@ -402,9 +402,9 @@ H5Giterate(hid_t loc_id, const char *name, int *idx_p,
if (!idx_p)
idx_p = &idx;
if (idx<0)
- HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified");
+ HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified");
if (!op)
- HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified");
+ HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified");
/*
* Open the group on which to operate. We also create a group ID which
@@ -416,7 +416,7 @@ H5Giterate(hid_t loc_id, const char *name, int *idx_p,
H5Gclose(udata.group_id);
HGOTO_ERROR (H5E_ATOM, H5E_BADATOM, FAIL, "bad group atom");
}
-
+
/* Build udata to pass through H5B_iterate() to H5G_node_iterate() */
udata.skip = idx;
udata.ent = &(grp->ent);
@@ -1544,7 +1544,7 @@ H5G_namei(H5G_entry_t *loc_ent, const char *name, const char **rest/*out*/,
/* If this was an insert, make sure that the insert function was actually
* called (this catches no-op names like "." and "/") */
- if( action== H5G_NAMEI_INSERT && !did_insert)
+ if(action == H5G_NAMEI_INSERT && !did_insert)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "group already exists");
done:
@@ -1793,7 +1793,6 @@ H5G_create(H5G_entry_t *loc, const char *name, size_t size_hint, hid_t dxpl_id)
if (NULL==(grp->shared = H5FL_CALLOC(H5G_t)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
-
/* What file is the group being added to? */
if (NULL==(file=H5G_insertion_file(loc, name, dxpl_id)))
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "unable to locate insertion point");
@@ -1825,10 +1824,11 @@ done:
if(H5O_delete(file, dxpl_id,grp->ent.header)<0)
HDONE_ERROR(H5E_SYM, H5E_CANTDELETE, NULL, "unable to delete object header");
} /* end if */
- if(grp!=NULL)
+ if(grp!=NULL) {
if(grp->shared != NULL)
H5FL_FREE(H5G_shared_t, grp->shared);
H5FL_FREE(H5G_t,grp);
+ }
} /* end if */
FUNC_LEAVE_NOAPI(ret_value);
@@ -2988,7 +2988,7 @@ H5G_set_comment(H5G_entry_t *loc, const char *name, const char *buf, hid_t dxpl_
/* Add the new message */
if (buf && *buf) {
comment.s = H5MM_xstrdup(buf);
- if (H5O_modify(&obj_ent, H5O_NAME_ID, H5O_NEW_MESG, 0, 1, &comment, dxpl_id)<0)
+ if (H5O_modify(&obj_ent, H5O_NAME_ID, H5O_NEW_MESG, 0, H5O_UPDATE_TIME, &comment, dxpl_id)<0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to set comment object header message");
H5O_reset(H5O_NAME_ID, &comment);
}
diff --git a/src/H5Gstab.c b/src/H5Gstab.c
index d270ceb..71b5603 100644
--- a/src/H5Gstab.c
+++ b/src/H5Gstab.c
@@ -109,7 +109,7 @@ H5G_stab_create(H5F_t *f, hid_t dxpl_id, size_t init, H5G_entry_t *self/*out*/)
* Insert the symbol table message into the object header and the symbol
* table entry.
*/
- if (H5O_modify(self, H5O_STAB_ID, H5O_NEW_MESG, H5O_FLAG_CONSTANT, 1, &stab, dxpl_id)<0) {
+ if (H5O_modify(self, H5O_STAB_ID, H5O_NEW_MESG, H5O_FLAG_CONSTANT, H5O_UPDATE_TIME, &stab, dxpl_id)<0) {
H5O_close(self);
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message");
}
diff --git a/src/H5O.c b/src/H5O.c
index 7cf7893..6c84e26 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -67,7 +67,7 @@ static herr_t H5O_share(H5F_t *f, hid_t dxpl_id, const H5O_class_t *type, const
static unsigned H5O_find_in_ohdr(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
const H5O_class_t **type_p, int sequence);
static int H5O_modify_real(H5G_entry_t *ent, const H5O_class_t *type,
- int overwrite, unsigned flags, unsigned update_time, const void *mesg,
+ int overwrite, unsigned flags, unsigned update_flags, const void *mesg,
hid_t dxpl_id);
static int H5O_append_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
const H5O_class_t *type, unsigned flags, const void *mesg);
@@ -83,7 +83,7 @@ static unsigned H5O_new_mesg(H5F_t *f, H5O_t *oh, unsigned *flags,
const H5O_class_t *orig_type, const void *orig_mesg, H5O_shared_t *sh_mesg,
const H5O_class_t **new_type, const void **new_mesg, hid_t dxpl_id);
static herr_t H5O_write_mesg(H5O_t *oh, unsigned idx, const H5O_class_t *type,
- const void *mesg, unsigned flags);
+ const void *mesg, unsigned flags, unsigned update_flags);
/* Metadata cache callbacks */
static H5O_t *H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_udata1,
@@ -1183,7 +1183,7 @@ H5O_copy_real (const H5O_class_t *type, const void *mesg, void *dst)
assert (type->copy);
if (mesg) {
- if (NULL==(ret_value=(type->copy)(mesg, dst)))
+ if (NULL==(ret_value=(type->copy)(mesg, dst, 0)))
HGOTO_ERROR (H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy object header message");
}
@@ -1629,7 +1629,7 @@ H5O_read_real(H5G_entry_t *ent, const H5O_class_t *type, int sequence, void *mes
* the raw message) so we must copy the native message before
* returning.
*/
- if (NULL==(ret_value = (type->copy) (oh->mesg[idx].native, mesg)))
+ if (NULL==(ret_value = (type->copy) (oh->mesg[idx].native, mesg, 0)))
HGOTO_ERROR (H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy message to user space");
}
@@ -1692,11 +1692,10 @@ H5O_find_in_ohdr(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_class_t **type_p,
* Decode the message if necessary. If the message is shared then decode
* a shared message, ignoring the message type.
*/
- if (oh->mesg[u].flags & H5O_FLAG_SHARED) {
+ if (oh->mesg[u].flags & H5O_FLAG_SHARED)
type = H5O_SHARED;
- } else {
+ else
type = oh->mesg[u].type;
- }
if (NULL == oh->mesg[u].native) {
assert(type->decode);
@@ -1767,7 +1766,7 @@ done:
*/
int
H5O_modify(H5G_entry_t *ent, unsigned type_id, int overwrite,
- unsigned flags, unsigned update_time, const void *mesg, hid_t dxpl_id)
+ unsigned flags, unsigned update_flags, const void *mesg, hid_t dxpl_id)
{
const H5O_class_t *type; /* Actual H5O class type for the ID */
int ret_value; /* Return value */
@@ -1785,7 +1784,7 @@ H5O_modify(H5G_entry_t *ent, unsigned type_id, int overwrite,
assert (0==(flags & ~H5O_FLAG_BITS));
/* Call the "real" modify routine */
- if((ret_value= H5O_modify_real(ent, type, overwrite, flags, update_time, mesg, dxpl_id))<0)
+ if((ret_value= H5O_modify_real(ent, type, overwrite, flags, update_flags, mesg, dxpl_id))<0)
HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header");
done:
@@ -1836,7 +1835,7 @@ done:
*/
static int
H5O_modify_real(H5G_entry_t *ent, const H5O_class_t *type, int overwrite,
- unsigned flags, unsigned update_time, const void *mesg, hid_t dxpl_id)
+ unsigned flags, unsigned update_flags, const void *mesg, hid_t dxpl_id)
{
H5O_t *oh=NULL;
int sequence;
@@ -1894,11 +1893,11 @@ H5O_modify_real(H5G_entry_t *ent, const H5O_class_t *type, int overwrite,
}
/* Write the information to the message */
- if(H5O_write_mesg(oh,idx,type,mesg,flags)<0)
+ if(H5O_write_mesg(oh,idx,type,mesg,flags,update_flags)<0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to write message");
/* Update the modification time message if any */
- if(update_time)
+ if(update_flags&H5O_UPDATE_TIME)
H5O_touch_oh(ent->file, oh, FALSE);
/* Set return value */
@@ -2086,7 +2085,7 @@ H5O_append_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_class_t *type,
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to create new message");
/* Write the information to the message */
- if(H5O_write_mesg(oh,idx,type,mesg,flags)<0)
+ if(H5O_write_mesg(oh,idx,type,mesg,flags,0)<0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to write message");
/* Set return value */
@@ -2189,7 +2188,7 @@ done:
*/
static herr_t
H5O_write_mesg(H5O_t *oh, unsigned idx, const H5O_class_t *type,
- const void *mesg, unsigned flags)
+ const void *mesg, unsigned flags, unsigned update_flags)
{
H5O_mesg_t *idx_msg; /* Pointer to message to modify */
herr_t ret_value=SUCCEED; /* Return value */
@@ -2205,10 +2204,11 @@ H5O_write_mesg(H5O_t *oh, unsigned idx, const H5O_class_t *type,
idx_msg=&oh->mesg[idx];
/* Reset existing native information */
- H5O_reset_real(type, idx_msg->native);
+ if(!(update_flags&H5O_UPDATE_DATA_ONLY))
+ H5O_reset_real(type, idx_msg->native);
/* Copy the native value for the message */
- if (NULL == (idx_msg->native = (type->copy) (mesg, idx_msg->native)))
+ if (NULL == (idx_msg->native = (type->copy) (mesg, idx_msg->native, update_flags)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to copy message to object header");
idx_msg->flags = flags;
@@ -3509,6 +3509,102 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5O_iterate
+ *
+ * Purpose: Iterate through object headers of a certain type.
+ *
+ * Return: Returns a negative value if something is wrong, the return
+ * value of the last operator if it was non-zero, or zero if all
+ * object headers were processed.
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Nov 19 2004
+ *
+ * Description:
+ * This function interates over the object headers of an object
+ * specified with 'ent' of type 'type_id'. For each object header of the
+ * object, the 'op_data' and some additional information (specified below) are
+ * passed to the 'op' function.
+ * The operation receives a pointer to the object header message for the
+ * object being iterated over ('mesg'), and the pointer to the operator data
+ * passed in to H5O_iterate ('op_data'). The return values from an operator
+ * are:
+ * A. Zero causes the iterator to continue, returning zero when all
+ * object headers of that type have been processed.
+ * B. Positive causes the iterator to immediately return that positive
+ * value, indicating short-circuit success.
+ * C. Negative causes the iterator to immediately return that value,
+ * indicating failure.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_iterate(const H5G_entry_t *ent, unsigned type_id, H5O_operator_t op,
+ void *op_data, hid_t dxpl_id)
+{
+ H5O_t *oh=NULL; /* Pointer to actual object header */
+ const H5O_class_t *type; /* Actual H5O class type for the ID */
+ unsigned idx; /* Absolute index of current message in all messages */
+ unsigned sequence; /* Relative index of current message for messages of type */
+ H5O_mesg_t *idx_msg; /* Pointer to current message */
+ herr_t ret_value=0; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_iterate, FAIL);
+
+ /* check args */
+ assert(ent);
+ assert(ent->file);
+ assert(H5F_addr_defined(ent->header));
+ assert(type_id<NELMTS(message_type_g));
+ type=message_type_g[type_id]; /* map the type ID to the actual type object */
+ assert(type);
+
+ /* Protect the object header to iterate over */
+ if (NULL == (oh = H5AC_protect(ent->file, dxpl_id, H5AC_OHDR, ent->header, NULL, NULL, H5AC_READ)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header");
+
+ /* Iterate over messages */
+ for (sequence=0, idx = 0, idx_msg=&oh->mesg[0]; idx < oh->nmesgs; idx++, idx_msg++) {
+ if (type->id == idx_msg->type->id) {
+ /*
+ * Decode the message if necessary. If the message is shared then decode
+ * a shared message, ignoring the message type.
+ */
+ if (NULL == idx_msg->native) {
+ const H5O_class_t *decode_type;
+
+ if (idx_msg->flags & H5O_FLAG_SHARED)
+ decode_type = H5O_SHARED;
+ else
+ decode_type = type;
+
+ /* Decode the message if necessary */
+ assert(decode_type->decode);
+ if (NULL == (idx_msg->native = (decode_type->decode) (ent->file, dxpl_id, idx_msg->raw, NULL)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, FAIL, "unable to decode message");
+ } /* end if */
+
+ /* Call the iterator callback */
+ if((ret_value=(op)(idx_msg->native,sequence,op_data))!=0)
+ break;
+
+ /* Increment sequence value for message type */
+ sequence++;
+ } /* end if */
+ } /* end for */
+
+done:
+ if (oh && H5AC_unprotect(ent->file, dxpl_id, H5AC_OHDR, ent->header, oh, FALSE) < 0)
+ HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header");
+
+ FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5O_iterate() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5O_debug_id
*
* Purpose: Act as a proxy for calling the 'debug' method for a
diff --git a/src/H5Oattr.c b/src/H5Oattr.c
index 9f92c87..28da005 100644
--- a/src/H5Oattr.c
+++ b/src/H5Oattr.c
@@ -32,7 +32,7 @@
/* PRIVATE PROTOTYPES */
static herr_t H5O_attr_encode (H5F_t *f, uint8_t *p, const void *mesg);
static void *H5O_attr_decode (H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
-static void *H5O_attr_copy (const void *_mesg, void *_dest);
+static void *H5O_attr_copy (const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_attr_size (H5F_t *f, const void *_mesg);
static herr_t H5O_attr_reset (void *_mesg);
static herr_t H5O_attr_free (void *mesg);
@@ -368,8 +368,8 @@ done:
This function copies a native (memory) attribute message,
allocating the destination structure if necessary.
--------------------------------------------------------------------------*/
-static void *
-H5O_attr_copy(const void *_src, void *_dst)
+static void *
+H5O_attr_copy(const void *_src, void *_dst, unsigned update_flags)
{
const H5A_t *src = (const H5A_t *) _src;
void *ret_value; /* Return value */
@@ -380,7 +380,7 @@ H5O_attr_copy(const void *_src, void *_dst)
assert(src);
/* copy */
- if (NULL == (ret_value = H5A_copy(_dst,src)))
+ if (NULL == (ret_value = H5A_copy(_dst,src,update_flags)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "can't copy attribute");
done:
@@ -481,7 +481,7 @@ H5O_attr_reset(void *_mesg)
H5A_t *attr = (H5A_t *) _mesg;
herr_t ret_value=SUCCEED; /* Return value */
- FUNC_ENTER_NOAPI_NOINIT(H5O_attr_reset);
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_attr_reset);
if (attr)
H5A_free(attr);
diff --git a/src/H5Odtype.c b/src/H5Odtype.c
index 4aee2b9..25b9c05 100644
--- a/src/H5Odtype.c
+++ b/src/H5Odtype.c
@@ -28,7 +28,7 @@
/* PRIVATE PROTOTYPES */
static herr_t H5O_dtype_encode (H5F_t *f, uint8_t *p, const void *mesg);
static void *H5O_dtype_decode (H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
-static void *H5O_dtype_copy (const void *_mesg, void *_dest);
+static void *H5O_dtype_copy (const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_dtype_size (H5F_t *f, const void *_mesg);
static herr_t H5O_dtype_reset (void *_mesg);
static herr_t H5O_dtype_free (void *_mesg);
@@ -904,7 +904,7 @@ H5O_dtype_encode(H5F_t UNUSED *f, uint8_t *p, const void *mesg)
FUNC_ENTER_NOAPI_NOINIT(H5O_dtype_encode);
/* check args */
- /*assert(f);*/
+ assert(f);
assert(p);
assert(dt);
@@ -935,7 +935,7 @@ done:
allocating the destination structure if necessary.
--------------------------------------------------------------------------*/
static void *
-H5O_dtype_copy(const void *_src, void *_dst)
+H5O_dtype_copy(const void *_src, void *_dst, unsigned UNUSED update_flags)
{
const H5T_t *src = (const H5T_t *) _src;
H5T_t *dst = NULL;
diff --git a/src/H5Oefl.c b/src/H5Oefl.c
index c795956..7472084 100644
--- a/src/H5Oefl.c
+++ b/src/H5Oefl.c
@@ -33,7 +33,7 @@
/* PRIVATE PROTOTYPES */
static void *H5O_efl_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_efl_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_efl_copy(const void *_mesg, void *_dest);
+static void *H5O_efl_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_efl_size(H5F_t *f, const void *_mesg);
static herr_t H5O_efl_reset(void *_mesg);
static herr_t H5O_efl_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
@@ -255,7 +255,7 @@ H5O_efl_encode(H5F_t *f, uint8_t *p, const void *_mesg)
*-------------------------------------------------------------------------
*/
static void *
-H5O_efl_copy(const void *_mesg, void *_dest)
+H5O_efl_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_efl_t *mesg = (const H5O_efl_t *) _mesg;
H5O_efl_t *dest = (H5O_efl_t *) _dest;
diff --git a/src/H5Ofill.c b/src/H5Ofill.c
index f79c2d1..c1d1fd1 100644
--- a/src/H5Ofill.c
+++ b/src/H5Ofill.c
@@ -33,7 +33,7 @@
static void *H5O_fill_new_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_fill_new_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_fill_new_copy(const void *_mesg, void *_dest);
+static void *H5O_fill_new_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_fill_new_size(H5F_t *f, const void *_mesg);
static herr_t H5O_fill_new_reset(void *_mesg);
static herr_t H5O_fill_new_free(void *_mesg);
@@ -42,7 +42,7 @@ static herr_t H5O_fill_new_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FIL
static void *H5O_fill_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_fill_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_fill_copy(const void *_mesg, void *_dest);
+static void *H5O_fill_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_fill_size(H5F_t *f, const void *_mesg);
static herr_t H5O_fill_reset(void *_mesg);
static herr_t H5O_fill_free(void *_mesg);
@@ -158,7 +158,7 @@ H5O_fill_new_decode(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const uint8_t *p,
} /* end if */
else
mesg->size=(-1);
-
+
/* Set return value */
ret_value = (void*)mesg;
@@ -293,7 +293,7 @@ static herr_t
H5O_fill_encode(H5F_t UNUSED *f, uint8_t *p, const void *_mesg)
{
const H5O_fill_t *mesg = (const H5O_fill_t *)_mesg;
-
+
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_fill_encode);
assert(f);
@@ -328,7 +328,7 @@ H5O_fill_encode(H5F_t UNUSED *f, uint8_t *p, const void *_mesg)
*-------------------------------------------------------------------------
*/
static void *
-H5O_fill_new_copy(const void *_mesg, void *_dest)
+H5O_fill_new_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_fill_new_t *mesg = (const H5O_fill_new_t *)_mesg;
H5O_fill_new_t *dest = (H5O_fill_new_t *)_dest;
@@ -400,7 +400,7 @@ done:
*-------------------------------------------------------------------------
*/
static void *
-H5O_fill_copy(const void *_mesg, void *_dest)
+H5O_fill_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_fill_t *mesg = (const H5O_fill_t *)_mesg;
H5O_fill_t *dest = (H5O_fill_t *)_dest;
@@ -555,7 +555,7 @@ H5O_fill_new_reset(void *_mesg)
}
mesg->alloc_time = (H5D_alloc_time_t)0;
mesg->fill_time = (H5D_fill_time_t)0;
- mesg->fill_defined = FALSE;
+ mesg->fill_defined = FALSE;
FUNC_LEAVE_NOAPI(SUCCEED);
}
@@ -579,6 +579,7 @@ static herr_t
H5O_fill_reset(void *_mesg)
{
H5O_fill_t *mesg = (H5O_fill_t *)_mesg;
+ herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_fill_reset);
@@ -818,10 +819,10 @@ H5O_fill_convert(void *_fill, H5T_t *dset_type, hid_t dxpl_id)
H5O_fill_new_t *fill = _fill;
H5T_path_t *tpath=NULL; /*type conversion info */
void *buf=NULL, *bkg=NULL; /*conversion buffers */
- hid_t src_id=-1, dst_id=-1; /*data type identifiers */
+ hid_t src_id=-1, dst_id=-1; /*datatype identifiers */
herr_t ret_value=SUCCEED; /* Return value */
- FUNC_ENTER_NOAPI(H5O_fill_convert, FAIL);
+ FUNC_ENTER_NOAPI_NOINIT(H5O_fill_convert);
assert(fill);
assert(dset_type);
@@ -838,7 +839,7 @@ H5O_fill_convert(void *_fill, H5T_t *dset_type, hid_t dxpl_id)
* Can we convert between source and destination data types?
*/
if (NULL==(tpath=H5T_path_find(fill->type, dset_type, NULL, NULL, dxpl_id)))
- HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and dst data types")
+ HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes")
/* Don't bother doing anything if there will be no actual conversion */
if (!H5T_path_noop(tpath)) {
@@ -849,7 +850,7 @@ H5O_fill_convert(void *_fill, H5T_t *dset_type, hid_t dxpl_id)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy/register data type");
/*
- * Data type conversions are always done in place, so we need a buffer
+ * Datatype conversions are always done in place, so we need a buffer
* that is large enough for both source and destination.
*/
if (H5T_get_size(fill->type)>=H5T_get_size(dset_type)) {
@@ -864,7 +865,7 @@ H5O_fill_convert(void *_fill, H5T_t *dset_type, hid_t dxpl_id)
/* Do the conversion */
if (H5T_convert(tpath, src_id, dst_id, 1, 0, 0, buf, bkg, dxpl_id)<0)
- HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "data type conversion failed");
+ HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed");
/* Update the fill message */
if (buf!=fill->buf) {
diff --git a/src/H5Olayout.c b/src/H5Olayout.c
index e829606..28db75c 100644
--- a/src/H5Olayout.c
+++ b/src/H5Olayout.c
@@ -35,7 +35,7 @@
/* PRIVATE PROTOTYPES */
static void *H5O_layout_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_layout_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_layout_copy(const void *_mesg, void *_dest);
+static void *H5O_layout_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_layout_size(H5F_t *f, const void *_mesg);
static herr_t H5O_layout_reset (void *_mesg);
static herr_t H5O_layout_free (void *_mesg);
@@ -343,7 +343,7 @@ done:
*-------------------------------------------------------------------------
*/
static void *
-H5O_layout_copy(const void *_mesg, void *_dest)
+H5O_layout_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_layout_t *mesg = (const H5O_layout_t *) _mesg;
H5O_layout_t *dest = (H5O_layout_t *) _dest;
diff --git a/src/H5Omtime.c b/src/H5Omtime.c
index 6044988..57e1de1 100644
--- a/src/H5Omtime.c
+++ b/src/H5Omtime.c
@@ -39,7 +39,7 @@ static size_t H5O_mtime_new_size(H5F_t *f, const void *_mesg);
static void *H5O_mtime_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_mtime_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_mtime_copy(const void *_mesg, void *_dest);
+static void *H5O_mtime_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_mtime_size(H5F_t *f, const void *_mesg);
static herr_t H5O_mtime_reset(void *_mesg);
static herr_t H5O_mtime_free(void *_mesg);
@@ -385,7 +385,7 @@ H5O_mtime_encode(H5F_t UNUSED *f, uint8_t *p, const void *_mesg)
*-------------------------------------------------------------------------
*/
static void *
-H5O_mtime_copy(const void *_mesg, void *_dest)
+H5O_mtime_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const time_t *mesg = (const time_t *) _mesg;
time_t *dest = (time_t *) _dest;
diff --git a/src/H5Oname.c b/src/H5Oname.c
index 0f1893d..b58246a 100644
--- a/src/H5Oname.c
+++ b/src/H5Oname.c
@@ -37,7 +37,7 @@
/* PRIVATE PROTOTYPES */
static void *H5O_name_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_name_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_name_copy(const void *_mesg, void *_dest);
+static void *H5O_name_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_name_size(H5F_t *f, const void *_mesg);
static herr_t H5O_name_reset(void *_mesg);
static herr_t H5O_name_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
@@ -166,7 +166,7 @@ H5O_name_encode(H5F_t UNUSED *f, uint8_t *p, const void *_mesg)
*-------------------------------------------------------------------------
*/
static void *
-H5O_name_copy(const void *_mesg, void *_dest)
+H5O_name_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_name_t *mesg = (const H5O_name_t *) _mesg;
H5O_name_t *dest = (H5O_name_t *) _dest;
diff --git a/src/H5Opkg.h b/src/H5Opkg.h
index 866e1b7..6ddfd92 100644
--- a/src/H5Opkg.h
+++ b/src/H5Opkg.h
@@ -62,7 +62,7 @@ typedef struct H5O_class_t {
size_t native_size; /*size of native message */
void *(*decode)(H5F_t*, hid_t, const uint8_t*, struct H5O_shared_t*);
herr_t (*encode)(H5F_t*, uint8_t*, const void*);
- void *(*copy)(const void*, void*); /*copy native value */
+ void *(*copy)(const void*, void*, unsigned); /*copy native value */
size_t (*raw_size)(H5F_t*, const void*);/*sizeof raw val */
herr_t (*reset)(void *); /*free nested data structs */
herr_t (*free)(void *); /*free main data struct */
diff --git a/src/H5Opline.c b/src/H5Opline.c
index 3485968..5319a92 100644
--- a/src/H5Opline.c
+++ b/src/H5Opline.c
@@ -34,7 +34,7 @@
static herr_t H5O_pline_encode (H5F_t *f, uint8_t *p, const void *mesg);
static void *H5O_pline_decode (H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
-static void *H5O_pline_copy (const void *_mesg, void *_dest);
+static void *H5O_pline_copy (const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_pline_size (H5F_t *f, const void *_mesg);
static herr_t H5O_pline_reset (void *_mesg);
static herr_t H5O_pline_free (void *_mesg);
@@ -247,7 +247,7 @@ H5O_pline_encode (H5F_t UNUSED *f, uint8_t *p/*out*/, const void *mesg)
*-------------------------------------------------------------------------
*/
static void *
-H5O_pline_copy (const void *_src, void *_dst/*out*/)
+H5O_pline_copy (const void *_src, void *_dst/*out*/, unsigned UNUSED update_flags)
{
const H5O_pline_t *src = (const H5O_pline_t *)_src;
H5O_pline_t *dst = (H5O_pline_t *)_dst;
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index f70443a..3e256e2 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -49,6 +49,10 @@
#define H5O_FLAG_SHARED 0x02u
#define H5O_FLAG_BITS (H5O_FLAG_CONSTANT|H5O_FLAG_SHARED)
+/* Flags for updating messages */
+#define H5O_UPDATE_TIME 0x01u
+#define H5O_UPDATE_DATA_ONLY 0x02u
+
/* Header message IDs */
#define H5O_NULL_ID 0x0000 /* Null Message. */
#define H5O_SDSPACE_ID 0x0001 /* Simple Dataspace Message. */
@@ -220,6 +224,10 @@ typedef struct H5O_stab_t {
haddr_t heap_addr; /*address of name heap */
} H5O_stab_t;
+/* Typedef for iteration operations */
+typedef herr_t (*H5O_operator_t)(const void *mesg/*in*/, unsigned idx,
+ void *operator_data/*in,out*/);
+
/* General message operators */
H5_DLL herr_t H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint,
H5G_entry_t *ent/*out*/);
@@ -232,7 +240,7 @@ H5_DLL htri_t H5O_exists(H5G_entry_t *ent, unsigned type_id, int sequence,
H5_DLL void *H5O_read(H5G_entry_t *ent, unsigned type_id, int sequence,
void *mesg, hid_t dxpl_id);
H5_DLL int H5O_modify(H5G_entry_t *ent, unsigned type_id,
- int overwrite, unsigned flags, unsigned update_time, const void *mesg, hid_t dxpl_id);
+ int overwrite, unsigned flags, unsigned update_flags, const void *mesg, hid_t dxpl_id);
H5_DLL struct H5O_t * H5O_protect(H5G_entry_t *ent, hid_t dxpl_id);
H5_DLL herr_t H5O_unprotect(H5G_entry_t *ent, struct H5O_t *oh, hid_t dxpl_id);
H5_DLL int H5O_append(H5F_t *f, hid_t dxpl_id, struct H5O_t *oh, unsigned type_id,
@@ -254,6 +262,8 @@ H5_DLL size_t H5O_raw_size(unsigned type_id, H5F_t *f, const void *mesg);
H5_DLL herr_t H5O_get_share(unsigned type_id, H5F_t *f, const void *mesg, H5O_shared_t *share);
H5_DLL herr_t H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr);
H5_DLL herr_t H5O_get_info(H5G_entry_t *ent, H5O_stat_t *ostat, hid_t dxpl_id);
+H5_DLL herr_t H5O_iterate(const H5G_entry_t *ent, unsigned type_id, H5O_operator_t op,
+ void *op_data, hid_t dxpl_id);
H5_DLL herr_t H5O_debug_id(hid_t type_id, H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream, int indent, int fwidth);
H5_DLL herr_t H5O_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
int fwidth);
diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c
index e130977..53f8c80 100644
--- a/src/H5Osdspace.c
+++ b/src/H5Osdspace.c
@@ -28,7 +28,7 @@
/* PRIVATE PROTOTYPES */
static void *H5O_sdspace_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_sdspace_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_sdspace_copy(const void *_mesg, void *_dest);
+static void *H5O_sdspace_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_sdspace_size(H5F_t *f, const void *_mesg);
static herr_t H5O_sdspace_reset(void *_mesg);
static herr_t H5O_sdspace_free (void *_mesg);
@@ -277,7 +277,7 @@ H5O_sdspace_encode(H5F_t *f, uint8_t *p, const void *mesg)
--------------------------------------------------------------------------*/
static void *
-H5O_sdspace_copy(const void *mesg, void *dest)
+H5O_sdspace_copy(const void *mesg, void *dest, unsigned UNUSED update_flags)
{
const H5S_extent_t *src = (const H5S_extent_t *) mesg;
H5S_extent_t *dst = (H5S_extent_t *) dest;
diff --git a/src/H5Oshared.c b/src/H5Oshared.c
index 0024d8d..59c8278 100644
--- a/src/H5Oshared.c
+++ b/src/H5Oshared.c
@@ -41,7 +41,7 @@
static void *H5O_shared_decode (H5F_t*, hid_t dxpl_id, const uint8_t*, H5O_shared_t *sh);
static herr_t H5O_shared_encode (H5F_t*, uint8_t*, const void*);
-static void *H5O_shared_copy(const void *_mesg, void *_dest);
+static void *H5O_shared_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_shared_size (H5F_t*, const void *_mesg);
static herr_t H5O_shared_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg);
static herr_t H5O_shared_link(H5F_t *f, hid_t dxpl_id, const void *_mesg);
@@ -98,7 +98,7 @@ H5O_shared_read(H5F_t *f, hid_t dxpl_id, H5O_shared_t *shared, const H5O_class_t
{
void *ret_value = NULL; /* Return value */
- FUNC_ENTER_NOAPI(H5O_shared_read,NULL);
+ FUNC_ENTER_NOAPI_NOINIT(H5O_shared_read);
/* check args */
assert(f);
@@ -344,7 +344,7 @@ H5O_shared_encode (H5F_t *f, uint8_t *buf/*out*/, const void *_mesg)
*-------------------------------------------------------------------------
*/
static void *
-H5O_shared_copy(const void *_mesg, void *_dest)
+H5O_shared_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_shared_t *mesg = (const H5O_shared_t *) _mesg;
H5O_shared_t *dest = (H5O_shared_t *) _dest;
diff --git a/src/H5Ostab.c b/src/H5Ostab.c
index b47ad3b..4b061df 100644
--- a/src/H5Ostab.c
+++ b/src/H5Ostab.c
@@ -40,7 +40,7 @@
/* PRIVATE PROTOTYPES */
static void *H5O_stab_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh);
static herr_t H5O_stab_encode(H5F_t *f, uint8_t *p, const void *_mesg);
-static void *H5O_stab_copy(const void *_mesg, void *_dest);
+static void *H5O_stab_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_stab_size(H5F_t *f, const void *_mesg);
static herr_t H5O_stab_free (void *_mesg);
static herr_t H5O_stab_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg);
@@ -179,7 +179,7 @@ H5O_stab_fast(const H5G_cache_t *cache, const H5O_class_t *type, void *_mesg)
H5O_stab_t *stab = NULL;
void *ret_value; /* Return value */
- FUNC_ENTER_NOAPI(H5O_stab_fast, NULL);
+ FUNC_ENTER_NOAPI_NOINIT(H5O_stab_fast);
/* check args */
assert(cache);
@@ -222,7 +222,7 @@ done:
*-------------------------------------------------------------------------
*/
static void *
-H5O_stab_copy(const void *_mesg, void *_dest)
+H5O_stab_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_stab_t *stab = (const H5O_stab_t *) _mesg;
H5O_stab_t *dest = (H5O_stab_t *) _dest;
diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c
index a3b5c80..75e8b8f 100644
--- a/src/H5Tcommit.c
+++ b/src/H5Tcommit.c
@@ -157,7 +157,7 @@ H5T_commit (H5G_entry_t *loc, const char *name, H5T_t *type, hid_t dxpl_id)
*/
if (H5O_create (file, dxpl_id, 64, &(type->ent))<0)
HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create data type object header");
- if (H5O_modify (&(type->ent), H5O_DTYPE_ID, 0, H5O_FLAG_CONSTANT, 1, type, dxpl_id)<0)
+ if (H5O_modify (&(type->ent), H5O_DTYPE_ID, 0, H5O_FLAG_CONSTANT, H5O_UPDATE_TIME, type, dxpl_id)<0)
HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to update type header message");
if (H5G_insert (loc, name, &(type->ent), dxpl_id)<0)
HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to name data type");
diff --git a/src/H5Zszip.c b/src/H5Zszip.c
index 5d0282a..42e588c 100644
--- a/src/H5Zszip.c
+++ b/src/H5Zszip.c
@@ -84,7 +84,7 @@ H5Z_class_t H5Z_SZIP[1] = {{
*-------------------------------------------------------------------------
*/
static herr_t
-H5Z_can_apply_szip(hid_t dcpl_id, hid_t type_id, hid_t space_id)
+H5Z_can_apply_szip(hid_t UNUSED dcpl_id, hid_t type_id, hid_t UNUSED space_id)
{
unsigned dtype_size; /* Datatype's size (in bits) */
H5T_order_t dtype_order; /* Datatype's endianness order */
0QA $Hl1"ư`$=L4R9?gC>}qa3!Xc*Wƒ]I@2 'h"HV&Z @=p x].-I2<~T=wD8VR&({ViU0(%|[FgvAQQ[ DIE:p䙶rh/SPIb-=z^7kR tUD4IK'"(b09vڛR~ha--/[g#.f QH(f.2)\$dAzUa_Vl SۄXFEg(j .)#}x]j&'I [H(*xt\u U]IX&F,d[as T(+%8Jjfut,FE"Qvu )bVdЋQdh RTv7SK|Ntca::+ 3 >$@7!C>Ƅ59eDh> pD%:F>FEjbrk?88܇8hvT`O:e1|ZP! ^SHo"GUY+GOZB?oMB& {z{^?P,3^x>f?=iA)i6N%;zf%A#\ 욁`{ Qul'zD/7AT" MuUP|čG+~> OLfjfnAW _^1?K80 '!_S's]A5Xgr~:~-3>Pvm% aufk<'g.~I9{S+$~+6:PX.$)Hs>L2hڠwGP!yJq_vO?4+=x7cx'e`A% jƁh[KJ(MBH8&)?K DeZ'$Mn8&aUB:otDCu£VHs7CTBb"vAFTA3}'GU*aL}`+(0`F~mjma[uekR @*lԒ՘+Ќ&Bڥs+07R" u:u6tc^:O=)l^qBDqy۰Oyq*ɨ4⿻pm Ji#HOumfG(`9OsbTDD >>l~%j.lPὂǁ`qV _& _-N)1~]/7J'$ =TUZPyGGK vômly!T ֓4x[qSyx7390$DM!hDӾ&тy;YNrj9x柉ywIOH@opޢ?̈́js7&0w?x&T zw'ږ;8ցȃ:`4xa??>u]]wbG7"~r)STST @~uSE 44R%*U4 Br5ZJ(2R(hDR ZCBDJPR!BUd'DR@TSIBQJSHb(hM:ZÁJQOVBC%jkq'b ?f{H?蒱q*)Ve}gtm*7g:W7MW3ri;4jVZLq4&֨3U|۟[k/~#Vɋ͗"H͔NbcT9Ͷ3a"3F^iyykBe ;̢mMHf* tɧ7@ө\n.؝+ZC ^k =JNfZ'Oy[cv446^.j"r+Rۢ*޲VMV[V`t<AGCgScyE5{sh^м2˭-hfhA; +HRޤju*nbiH3\]M^ŚuV ^HrP$i<޵+ƹ=&˜Թ{1C&FÖY\ʺ5rZ ޅAs?a}Kk_=%es-HJ_ӎr1|pʜ/e G!ҟeW)۾9gla{ߣ [_;v,]=zu:ve{pdt[GKl[.T:ӓW(jz+*wҝ{|#Zm笼(wUy#Jjϋad*]*TyQ{5/וeI6hRM k܏U톇* =䞰j{? PqD5?C*Irq={RD"?^A:NQondv8\({ fe8o?5D( FK:zE($EFXV?Q,|M$s;^|Z4q% X"UcKV*f{ݠ&b|Nz|Օt}?6yyT >^.z$0z>awpMTO;xE5@ g9v@ cEoE|[=x! QK{vfI # ;z&%g{p*ʘ!W@b zq+a=EfN@'l^BIS\r6D{<0ǃw4}ZA~f!8庶BQ Kiz+{j%f$˳:m|;)0_O[M=I*ZN.􉉨B.(\<"*|3÷>iΏ4?a5&K,2(I E><էBwlF>efnl`Gx:sHzU-;SR}:|a U&29@bffH}={JOP G/~e{~j'~'J SZq?BOۜOYooܧs%<#c9tvyӞK=]Ө=! EAT((9mj9zxD?ߴ*+?I\.!DC{C'{bɸnЕx,7g5+XRP(H:L(O!.a*vH)C$VC檓+~,Γ'rKāI^<ơ)9J:q!Jt[+_2np'ZۨG/,s00`unz4{M:Yr.9"M>RK˙:ߣxO2`!'d2Cd2 Mr;'NrZ9&y./F$08<S|xZ>y5 Wk Q|*m h.Uru'g]{~Zc?)94*(sTINŁ!˿?;]&R!IEQY6KET蝄$>d%bsfe?ΦmAs[gKRg`$osLdP&W2E0 IAD^\zQ5_(G!&5p8D$@DPH! "'#׻>SP"Jy&c%L"ʜUS6+- Vt 3JDU)K mC2mDH`Ya SJP h.mmj cjGm~o #q jvPy9dfX]Oh,?}?Tޭ[v(aa8jC>= ^o; a2 ,/YI*ct !i@ RNQK'vqAY+E%|kvˡG;5fgCqţ~4qГE4gLքu>_)f 9߿t7ݎK&̝*tTZ[hp()ԁ!I|rTNJ?_* )},R 8u'pvIA9 i

Gk0̾ ~磚΍%]0*1#US9?IH;ՐXI"\I4h%F0&`)dn"f96a@Θ3U"):_+1V24H\ݒ/3w_@yQj` =M9UAT34J7r T3[QJe%` uoL:1s ۋqR:i pZ5sp*+މ͚U!@@$ A(#v:ˀ)JrEOaɕ_J|Q{wlPV_,)~^FȆ0 TP=$S'PA %d+8S4$;b߇<Juֶ3O<:H׃64LE$MmՀ>2~\26:(c ׇ#ɘS;jv;'8]Hk5Y4IA)I@`tKaA+ Ϗ?/_Lq6MbzН`>d!R# %P\Nz%iR|蟯ҖS>-f$?~yp#Z蕆iZش* ԮJT?3M6K2JLQ. KgRЯZ TiA)]n7i/9ɪZVrt@e !KCH] @{%XPϽ?O_{h"nN7?b(nIRNLVu=#Q?cк!(am4HA{A{Nccih>=܏2ho|:sgZIw-fIBL94SHtB$P`#y<80SHD%0Tמ`n_SB:[O:F{Hq pHyʆ}LzI4R AB?RU! j )qIBStfd:6$@:+@4)u(hhJ E iJJTSºCc#Jww R,m:&uRBqr0=ClgNEqdjdr(g}VF|8.CHDIE:gyڠ/R)2Xk$H@ݓ pi9hjZKtiNN僐\r?^T:xy}8W-+"D  S  iiR"Y f  `(h f"@hFgr v{F'ld)HʉN}#Ѓp!{M!AIU4M4BE5鈊 SH*BJ#º)ZQJ?qݧ/诊T%Q '/h=/?%7=]K#|S`矷ى#!ZYy !F|uK*9K(qfgxYW)QQ5i< P@ Vba"(hh%IP *b ) %_)k:γ[iT+.!O_dd|78!)i(Ms )w _B03jJ:/Z!rHCzG-3|H(_]Qj\]At1mcW@oOYM&YnkI= ?== A FǙ JIt:ewA{~|_@>nQ};'?a %cg++ǿ̺al;7^W ]Tcl,chIQ;e8 Jz֞8-!wy3r]? D0_үj(A>t}}ކ`* "3|ONi)J/<m;w7r>14DHG-l׬ 1U+o9u$'SDM l|<6y=zUBj8\gj9d>2WOBr2pvNҝɥЇjWgYnBa59!zJn^! ՆNP"_#8~ | Cug^ހxs*|_ ä){1rL?'L|QCDBI}& j &>ПARUSIO!=C}? (H|x@: aWU!aZw=*7ƖQ^34A_얩) ƴtBw;,V anҴf[\AP@ mtBA3T Sƃ.zO|>}orc2>tU-h*~Xbvtͭ''rڊXڈ]%DTUOg_cٙToXdSꏉѥr:@WF+5 :sUJSd)fDJ ZƅQSHF(*\\8v>`ܤ3)t߮^c-OfPFS?=X4)]¦% HVȘVR0B+Q8 h j bq@XcVPs38%=Y%E栠x[_(֚4rLETf墅7PFko˓ߥx?>O.y|9eIVG]89b̑Xp䛸UԺ@l%b2#3 %916tDTR,6j3dzmH0y{V*%-V 'jVZruP:㳕ӵ=1O4N|US;x">}gzNVmƒG'*F !×öaKd3 *p0;~b}cMs8ߌ9Ze"9q.X}DJ?LT^6 1KxxCDz H1#LCM@PjG)AMJD3+)AS-;졿n`j((j1  TAB, Kuq`+܏y賠Ňlߎ1<>OzI'X\p# rdP94[ȕAF$ bWq$Suأ*S}!3!э=lfzBfA$  lBZ؄'89i0(>L!d& PSRNБqt@sUV,2&D.7%wbН*I2 {99 54;h$(Sz}I:⯇(1O V(d~Vu?ݏŞҳ ?OQ%sa>z=PN/΅:Y.,k%,Q/,ȧ8'm!ķ1V'mv(S E]> jai# Aa4% :PB?_>q2(_TK?OޕZϏ' P y^Lh`@((m-$Z+Y 5j11Ph~=~ZJс,24'"9@>?oo^wS%*Zk xPud?ʡOwmPCXW㽛Ѡ_}2*#Jk+??<?7 ߎ:eÒ߽CG:yrqB~KXd(:^RlW^X^W0u:3?Łrк0YZ#ԩ? CzI'[;$dSڀjm:d tN="a sZ>3J"A8Z]&)NJ;u8hjKY]JRh@ u44Q=HˠImqi4(}(}e4I^O6OaJP(mk>×L ѿ̯1C˦h&"jiII<;LGtvC[!Gב;u\CLVHP'S!q>r>³0~fDZWymg(w%rIE>]%иA'?%AJPҢ%$I2TF}dB̬ (*&URN`h*bE8hff%$D 1N:Ef3@llHM $_qi>Ca" j#lR(PNROosGC7*.3/9m<Y6+=e:3C#ۯW/ҒM~,' AO.b!yU tQ2TS޽a@ P|=VN/!p*88Ͻ>χ@X=ˍ>E*Ri$RjbA]+;'DzPI)&Sc[~X<8HBVΎ}ח ԃ`BiQuLH$rS)C4Գ @2!6|'\PϏ@o6@^Bh7&iL hCp2 reTMܒ@VKf.?z~žҦF *rx`9n'0R@4 u*Zj*R By&i}$t/PDД)AIJ1M4.΅)Jh( bD=#")D( F(^JZNMT~>}~_>p`& d~H*TIS&HDED5b<zØGӓ=_l1KḒ\l.ךS$ш #70yYc[v\ !vA э-WjI쀁Y  +9Z5b +JṟG)P}:kZ86A\|t1|^{$Fr-еN%'"}-O-!MͲ!ilvS;+#;U.-xE9h"f e~00vbS!,IQB ICQq((l41'{!3+ PַFI $S΁`z%=bVv_ ijw9BB:E`QlJπjztGܵEQ)}^~ru( CH hHFJO@]2x*Ch;æ}r()AJ ( R̓2rC{@(JP$"51Ӹ~p:>1̾֔_rлM1U>'t{PSKVLƥCOT; AcJ" ̬3qClJh9 R8crw؉ï.50p8>]-6U8iyB#gҭ)qjc|֠lƴmTաGXS 2VD`%nj )-y@MZe3FhJ%1RMeF@8:BXmEeO!HiNUl 5mi@+SN:r-Jܥ mMmQy(p ћFjJ)H kdJZmHDCBԤTBSA10K"P"T AMER >SqZ@;CNB{*W熌F{z/vHRt)ws)Ӿ\7q17u-M&ѵrw13{,l$_艤\Ng`&oH5iT$ A caeؼi8[#@РZ9jf"i>@oa8 $@ 8W?pCZ&݁ɠ=v[>fhwg3I3%5M)p!ԝU1 uT 50R&Qħ` ÜfJh,P>y" t/DhM aБ!ԇ$=D4vHlusdQf?D%%bcO$p,&O) )=h;N1N}A!=ёosqױGi:IOn5z{={z'@"U Ps԰ Rdj{zz u8 POUGv~[%LK) Hw=YH E ̚WXyX9IbND^y&9ܝpb0è` gh2}E%(Akh#J )P!mJ+ʴ`P2*$Ɠ$dO[$ 7%r%4ɂš):T<%|Aﻸ*^x΅(J`4  THE}oyII_p B(V/ ;kl=*6lhҞ$苡E ^{AɷJ9==UFfPsq̇JhK:c *l裬wq]J|¥Lp˴O(\(!l=*-TڊEAPF#Y[hom/0jh箝w:UTYƢV{x [eƢ W!EڈkBiGPЧ QG7{{}A$5AT6<\/:5õ2}t;L6o"Zdhyj F)O)XSUBLNs(djyQ4ĵSUM EE4 EN3jM;F `/ZH|"[bNاDF6v 4yl<Κ eA/i>xr"y@3O|_hHgtMU 0R@{lZP".' E'{ =] lTD3D֨5,Shh"ꦺy=2`F*zh1p+-FzC.I^jdlHͦ( 6rmE^sAub]SMuh-CJ j\3&L2a+PvYຑ:³<#Y*8RG!|$fB\^R92h',mxOu&fIPo=`.LNsdQdb(l5sS\4M!q;^S–=\ ֫׭MZ ׌z[]חEHIgԣZ d>H{L+eD+',vk5c98TB㕌7dѕ=o ,+^YWU/8e(ױQCġY֑!DLd=:{I +64j73ܚJXqEi)IAnp><gLL0TV*L(Í":X-#Ksa(,E533)Qc<וSU$φbvCjq! YDer֢M;.Jl5 TSAl/9puGgC<4D#>R=BQN2 ( t>| s@*#5"Q<[3gHZ-&;6[(Pg().Ø)uATRaX"C&{@9Fu70X{CeQEkuLMN3A};p`.՚=I|J:E"Spx"RoVzga3DTI$CsS'&<Ph4r$JKP,X)XC >wDIPɆC U=hJtB|%xyMiěROkr3ωUǭAmA|:|qXBm:3+^Yw;O\w +larL%5DD+MDU}%Zajz1d3.|KQi>b:Bd?v9$2 6gߌ@ޘ܁1Z}Y/C;5@tq% d efR GA3@Q;k%@ ^=N&pM S'7J2fN*HpecN)F2@ܻyudՔI9@)JejChœ!Ċ/q^?z⦴V Kԣ3%Eد] u ,]\^ Cp}{>|믯]`RwAU?1>}B qF'(*/2CZ-(rFܛl![b8(DM).ACmua:s2-p 2ޜrWX^b3:r.yH Ĭ Z$@ +4ylg0zMQ{gD%d'"/;F4,dY{3ۥ(&x'X ێ<+dTN3HH*:]ePtU=9(W0 QY Ol&\ sq%/U;tlW2u̩BR(ra+126?<{~7 k%Li;/2 hp)üwsXWf<|p'Q+Kj^$sgLdeKV(Q}ۜmYU18yQF&(B3e .Q)POCFU xb F sHT@mBRΧ;k!/wo}h)4\uԗœBA;Rɔyd'_<]d^ۓ?׊q8jn>9WX቎JW$ȡ" 't@~r (6>):B`:@Pah c#2hTNi>:$JiC75O(. .XPPRTāesr.!F ^AuM;b%~x*TwHB JQfa t]5;@9uo!Y4WsPtVN MY!IRZb.'#_D:B'o߱[tBja O_Ŕa2}Ns3c_C7P5=WQjIS2<LϯE-@dY  Q_zߺԾ]1aL-T:rA!njpQx@a(j%}lqZ*Qc㱹o*WK\Y{J)85*t lz:.㢈&'8Yd76f4D*wwvx 6w}]mSl_aA:( )C'BwBp9 4Ԭ| [(LZ:H:|<6d~]# Vg8vV뒈/,RҡKf2d5߿_o'nAAJ`N,ED Ѻ'h.+e(`@$UF]Y R zp+ ߵ݆Ұ}V,ϽjLy2(N.̟Jnkaw:#UFDr- #26pb@kf.GoZDHC卐=F$~u>A_54'm)DbC 峀Y92FJ5cw̜5{GrdOxMZJӇ6 `JHbt"Lh;.D 7 "4)jWΡFb3Ґ&YZ&,1To6_Ikdv$}bzחzu;asmzj$$/b>N(b@H'f=L!ݶI0N9ȚP|{c\Q>Aκ1)s{խ!TrʚW8iSR8#fW;ajiqM 3G.,Xθy5ʪ>GЯ" þц2\|WoMu>ϊ~V^8(Js#QC/T( ;d:(hӃ+M,U!G2Sf|zL]p'׷wQ:SrG  j@kшq< #xc"~+RUoӂDSP PA#\(FmPփHe6ԸBA4;6&դy6._ P¼L ړg0HtaYb2Qց^~LWe1 ]Mឧ).Ae WP#糊Γwc[,H֮CoU+8Jtu}GC'4f~AgJpIkR{vőo1Sk{[aWC:)Hg8'r_1<a:Ϗny z\1_;H$IG‹(7G$2׬>Ѥ"ʯً rHѧ vB!z"ɲEYlvH9P埝 !bGbMMA`erTB1bP$݌qWƹoebȅq>|"-8tCA,0@ &0!$2ؠCkfC޷38fPEK`>nA2Hl(o}zynPDq[B$Q豳$~lH IwՆWLxn#r!{"D|4;A@2B'~֋C{Si2׺ÞE567nY@LˀHZ( bE8إĂ@ws{|VQQ k98!$z9)^ƃƍ$( 8ToFZ]2B 빏w~_@dQdD{$O{vWbPFvQ[,2 v<0ubsdkCRr|_5zU EM OGI`&Lgtǥ5row4F\I,gU]Ϛ՘eSVdg~:Ҫg_wZ~; Fٮs7IOt|!rlFx4uZdl "c4%J7Z05aͿZfXb' X'G$YJ4w*WM(T=8G#T@ F6GSuHڀ4D.'O$"NsEB 7bR۽"*hX=Ό:Cխ1$G6^v׿i^fC $%y+VТUF) Y_cK&+F t| ;ڬ=zuXkڗ6jt<>9ɨ>H;PzۻWt3Oi}lH e@j3Td6@a>~gҮRz4+8ώR1ьaJE 豈 M5Y_s0 Ux^N $` jHxb^ܥk+ˆj ֊)6W`igb_;@"He=O''tet)hF:TTʹp%hbդR]ڵ ",%MD G~ŐY g3kr@$wQ#N,0`#u=1dz;\ (x`ъ3MƤ{f8G@6Eف2a(ʥ3 28% tESYknOS/C<1%RsUU<WHT֌L£d.ծhncBi_9. !r^M V6OX' !2DڏPQI@)^pu}7DQbf4ԟWYzACgӴ_ƔPC6p'穇 /%ֆϺuzpQj=ADt+y:kH'~o.OW|%CrVو"d8aF7Q#7Ӊ:PD#gqMVl|¯Z6ȩGj$:A h"fh8jDX|5CԨD'>9֣U Kѫ{:Ͷ0Gсfzt7+tB J;<.Ph@꥙=HInwٓFjvf:>Fź'SBHF Gb8d `HV/(mr.){gl"8*CH{{U}BvWkS 7'do=.з,FC.&<FTGǃEMywe ̞HbsT^X»f A#N;Tu֣W 3f hl4CG񍱴{>mhyx+[W`k]qY(ju/CWBD򐗹VfӯD:CTMN$LWAxIR8ƭ6lL0R"@1Ҫ /&RAׯqѺ2ԪrEv(!4PHw<6156j^k=8qdL\b':1CwS瑡 >(_T%OxP򐾶w8;v`INr4Ab Dk ߔJK'vP*>u*h\Mخ^t Ù{n'QMu:ٳOlxiDiY,' |2ֆL71S$nUsdc#.ߵܟrw]@03-ȠzJ0,8*$z}<ł`߷0(1'׹/ifќ'ы cQHT5!ԈD* \qL8Q IN5P8aZp } 0р L h#] G[dOȎ|K.ϪxYF_\c}!dBNң8Vk!6bK=*|랏r*E -[{׿s ,aGZS]3]k8xu i ?\)Cj);U( "M& atq:q1CFvt 8ܦbA]{{Je.:V8;shڵOz[x& ӯnx\ٟjGOyZד޾dYo~Q - ؙYW.~7rsV/FZ{"849%1悀&  pWADBTLYP8"ؐEx\U,Z޲Iތ PT81Hf̉\)v2^V܎Syk)8ԫl 5ދIΨS$}p)ha=W_W ⎵gmʝIեKY_U^y%̍\*(ꕘqYsno^3\Kzߒv:Yӷn/Վysq9G[cw;off=]̛Kc$>gNT_ƳS(JJm"UTzIGdvyhquX=י"cKjhϥw$GQq* 'DYmqk'W b]~ #mYD0b;蠕Pw2$K;LXYǫ^N0 PӗnǍܲ8p4c{ b>ӌm*:X_im}7P "YTJH#D]??H(S_h䫤&E EHSDE0SU$DēH1CL2P1MAITLMU UM5E4PMMDKTPATXԟ7^~hTRmfg-$N* }A 1>贄Gdy0$AAVڪ"joMf\}@(A eS7zbo I9"k,'S5Ёu;hD s9݆cܡ}zR[Hs&_aV L72Z:ﯯe52^oҊTPJPBH@Q5Ǣo׌z09sϹ9,Q=4:H#,QvOe9#ތb(Ę$obCDIO!Ì墼JH83{4G,Ϟ܆OI߯_G}NEZ3N&SVwy:nc9:u6G":W n`蝙h YGv(p$"~o+Sߋq6aBP""Źn_|}W`A\A.@x&k Rb0p@z2O79GJ;0,gh=Sǀ2hGCߕ1@f#H4>bOěUԂɶ(#B t桽_sJ`8 ;DAG-A'HpdLYˏu;*)zB{ 7,vTmd (,x1jj׏9NL2 pE0dE*Rrq ""&^i#yK2 B"f0Ss7J#]fɘ:w.$+P{.:8eQw>|$W=GR.qK>tϟ~(=ttWCaS =n;S Cof Pz?Wj!qp O!$(D{dJH>2zl#z >0o^)6g~=uPv^FOܵvXYPxlffxkpMEL.xUw0g8"A& (]^Ӽ@Ex*aO\q@C'vƐӧr&yI ̑!\)V# "Ml}QgOz)IdR%M%R1dBRK -zjB< ?]淞ڃ>U6}_ٞ2_dGIQH*_ [ՊVkٖuV6*ڭPqFJ^a7sƒ |mm>:"87rf}[uT'a7\h$) $I'A:V㏣kN +(R0/go20oU6Wz6ֽ&SI MQ(9-Amu*;}=9+ RZ .H0H&d6\&|xR+o_yo1 zɛQM^1$ IdgoL N$h]vbti$d)rÀ҄[ !$s&*ڡ ")cg=13վc0O=U?U5>y}VWB/>Ϫ&=|KPhξ*K}>APlzAG=8z#G:0S}dזD)FLezQ7@q m%ξYj+껕? %uDyz~:c{=37;M_4H3[^aJ{K;w nY: 6S)(t`*ӶEjféȯѹs9 iۡ;ۂԕAâ$fhn.Oflg(}~k$l-  }ЬFLkćAe; :Lד5ZkuKt@>vES *nzˮX8VAHOKJ렫xϏ=th:,E]x 6˦J44 )q͠AOFr=5?  ?Ѯx"zCJ\8xdWpl텻1^z*HF,{>tNIp'>kY8MR~w̉ʓ hnYLJލT`C]^Сm/*A?d-f*4fgk+p$! h篎_7tH0p <蠤HB@b|!@MĶ~2z>5{J*卦odlI-$$T z8ӁVͫ7/<,dj ,I⸫ΰ̮ɯCV"",RÇzNvbȥ$d"At@S_:=^+aσ;TFOG?P7erR lɤПд-rv1#}&FrCj@vЛd^`M:pĞPC88Kͨx$#}e`Iu~OC ZH%|C9~jvgv11^EDзQ+XRWo|#;*++*#BIp`"h}ס1P=K%~Rj.bI<@~uW69ÎhnCiEh]+@\ ϻv6G433_݂3 :Kԉ ^yaSja #kQe9Ѯ4J%RB2$B%42,ߥw YAQv=Q;z i*TP4fU?)S_PT|ם]5DDI/:(kgNwE3H",Jw6`*")j ny~g0!wnaNCޢ?l?(C12"ihR Jgs|LuTc U\UVv8ΑӦEn5p7Cj6_,X$kA ,- (: (uKJrOڌtEL("XѲ-|l|*H vF B(EJO胴vz@EDQR00HLDTPLCM- Q PЍ5ALI4 T!EL_"tcR 4+C2PRд}>4G۝ֲ  J(_v_с=/{lsˢuA?`z[aqşU7#X^nғ%@c!Yyejb,]f62eMgcOVBC=- 8@`$܅*t\*2|fv;?m^oZ,'F܋25Ƃ4J65\j hg}kJMo2RR#lEysje>2}2|do&AE4!^Gz <'6BgLZ4FEٷ[cr[53 rG"X⢭LYXi,}4 RTPbh*f* b" *f)(((*" -H=>>@O M=DD|0I4Nh֊@CBdT4OӬu㟇+~Tzduvmc*L Cw:]}[NBWPjfq,$G>HBdS5 @AETOrtO^nU#UT*zr>3i:ïKf=z)<3 wS5s Oc$+aPgVHzxsw ǧ:E0Hdޏ9r719o(RO?wQQ%uB<* (ȧ\hFpF6^t4gJX?^7$>[@ɑ6(1j[LH]KҶ9 )_BR 8 ;"hi$PT*~=/gѓx>_p /pwru<οнq8{zǺ©V DYݎz8PHVmH mi?dCˌES%ʐ?FRI 5JRj_ȧɑg}*<*JTJH~1bJKmii( i">yH9j~6+AQCzR3`STJ%i(ZJ% I D $Jf Y% @*Pd"JFp(dH P=w!=~fJI"* !e?XI kN|z Fk-|oI'A_h'=,I3E$C 9>i DZMH/ C*!? z^g@LA(1*i(R9x~~efz58(g,eGc/(`NP+fxW"z[42"欇mel QU,  ):]6+rX8sfR@@?7 bRp >&2 o'<]dIy*͟|:,;Z5lj'`gdkޛ轤(% {`M?7pft)EhA#U*n{$- 2|ԶSz|-5d2ebb`9@YG !R>g E 8}پq`֤u<^BtE mEG=RQ,<v/֧W3HFZdoKsg}y JnO..US )-U̾$J @y P$H|:= vd1 2 DV? J~KP-S!Z6ќD<$69>o+ANLhÒ)N9lܿD~|DTa8Ņ8?(%]kd_~o8UrRӗyLZO8ȀiAHa>tyIZzk]cN>6\q2; 1x* 4ԸFgki!, `l2 `I`#EOعuk%]+5I|6I 4HZeAAlZ6ucWؽfӀ9y|:c3l%ҤA%,zu%wK3TD/lL|NсBSn~1+BCKB{`hI~e %~?> yﺟdJjB"OY?&7F[wy7FA y qJRR߱]@Lb]w]"=*ǩyId]dzs ʘ|h/]p:מΏ,(pXXZ:zZ\ay<Ѐ;#*#LH~U"xwTf|:sczuW㳰7w#IU9ן:Uе(-\mS/L3Ke2󶸐/Wmq+(̈́8LV k3%ej5uy;N.X;FN{M%s﹮3p.OwkP1Rq)@G[B8o޼{̣>`ߦ9oաs:ض-Tv,-2l2r2v-KppcsxR59I|7:$~sXllT^|śKbYdPg$$OVV]I\:sbK+_^uljt UL;XiUX>qjҗWQx&GtZق4涭FjMW+i)N&R&h36 bnv^%k#+gVO [#d6Ha(QJAB焏94k=8B޷ՄueIiNѥ|ׂ9.s t+Qs]KҔe&3MF׵^cGSb/A6ÙD$ Z@33|몚yQC|8=zs<֨IVbwqIΪVu@k~ N0 \7 H6Fi8iO3kn_#!)}hGF ^ HY烑Jm=#8"ΡmgNjd^hI6Q?suS+>  38GH @!HLG:CK$2,0 Dȡ:F~HB $qT%PDo򆪊BQeTH:Eщ1"P{R^x7$E]QT4W?>\OSS] {kMltm?YʚgA2^ SD%Oj!d4EEQE#]ȱ%j_*6dCL1zv㜻S A:֤C4#K}K#J Eœ#o>`$ZhOw&z%T&$A$UQ--DLT? @rQA=xUP>AB^2[~2{SP d:'ٚ? ^ԣ'h&3brwz\8%&jbF ģԒED?G @".%θ?J( 4(ɥy$)hBT<'{s>ێ8NLX~ծBT);ID@Ky!TLdeb W8kXr Hh[&"d@b fJR 03aA F)RBK\J2Rpaj( 8rwTh6N糀00ʂ*sVEQCAe.Ҳf'#!> ?UAbj<}ِ&ܙHE )tN~KfMk(Ks1:l4"<|K:]l#* MEb94IPh $M5%5#',-  SPPLȲ, @@;Ed{mBu OQGdΡr?d0&ёNz@4~Kb2E2WO9ir mBQsHȰ{'0Jk~?_Ѭǃ?/Da4#T@?Z2V@) C_4D(* Y AK'4$QE Js#\*(e0hDST.-4^-oZ#hUi6[PDNֳI!wSԎI  ,k;6NbM;G6KrRzAAF49^JKMA!4xLQ`Ш%eC d0#ueJ&AOTV@dXr)׍(Xh4ikC(ijm*AN5/5`MF n Nc$y&JF8p\AO0_)#EIb(m+*eF`a׿ =WFM9fmDW`s?vy=}#|aחN!p 9qu)B:C|9̐:@xCHհhP I>D U! SOw=H9.ȥ@{$ 9(GHze O _oEzwP<Ćr=JPɾNnta+GE 4s`KN% [ h.sGX:{Mf4)ѡ2$C}(D9Ϧ<<;??[II:hUACܔPo_ҞduB< (&1zT#{Z#hM"{)ԁȢ_F}.gڧCCqbuӑT88i;Gu=.H9f]ɇ2Gvlc_)o Cҧޝ`mn'0P7厮z)貙74/XLL"oR A4Gp|ݎ ]zSEB+ټʬPdGXwF8Ҷ*?;:JEV@ywrZWYiZ@FMj&@8FjB%w Vx*PR"ДS4f4!D_un7 &`y;#؟P')h鹿##?4{!?E35R())Aġ4J) Fd&!L~7 y|>whM d`.@̡ ˻ CqqCP >RZ8(Dp &8mzhti P쐡1-%(E2 eQb*(D!>F)X2 K޸OBs$#C'^}y9`ztzF´:2EKJ<$LO0yv.b<MGԡ90}k:۾;r 7>]L_xp{@]|`6%{F l-}&ja`| Xڋchl`-bCGᶁ`3 IM %$kih`>1~ƘEja@A(h#AgBU2DƇMT\A5[(ѥb[S%F4lDr1qPT4H%@PȐ Oհ|R)@ КLAI IC0$S@yxwb(}9g:W0#3;N 244KRdTp(q }cwEtÞ9 5SZQ?&h]>Xw\!hQ` NZ*k[ݼ]z$:`}.DJj i*(J$bJ h&*ZJ$ib"RH~h " (zlӊNfbClG9mk&P8MP71Etk1E llV Fr|hS@N- 3IoS3Ӂ=ILDRDđ%HH&;h6_Iɻ0{ɧɠ2ЅR'[:D(c><>|(8h:r%9 h R R@l-P~|9kv.O5d\/̢OU)s>mjtLWMbvD8A>(;KG:1^O{yYfX!H`q߃ ڽhPph5* ATRN`Ʉ;Ѕ B8d^f[CćxZ| LbO~|az9)*jij1<;`] }Ae*kABy T̏ C0+1=G]0PNҕT,e[ŬR)lrM1xkemKyDJ.aYQUG5˹<@s =!(`(h6 Guxx`_\|_c1`H$2b+m+,ETWr]C,ZPF"mg9b'9fRHHdGnq]PU-ť"J )@ ".KD|p Iĭdl*lzvnH> :̯ Ip3(bi8уtmѶ-kh1DqmAef%Յʻ9sgZ6M[:ZZZeD\y*e%k AZX6b^iNVj.ל1dȶ@PQ% ^S<Ŕ1baU-AWQb^`DI4ARlѱm˱2'-g伹8ɨd"X8g!iam 6 kZGM-hNbeMʝ6{^m]nGA٨Pԡ@la~|MҊ6][tG?jRC!)Lq5&xSZD2RJIHCP^X=T@ұ+CM 44 KDPD3TQ5$T ADQAҔPRRD!@P3!E1IILU,$4HЍKIEȡ(Z),fi)zDDt%2n8@* B)]:'`79*MvB2xMeOp!JT(o#*E@Z@*ZU9*Z  DhB9B)Pe*:l Hh(k 伀&M$_Pqy+-P J!M)BRE1$PPD$JI0P1(H@ ĉIHM"R DP@P%"4)-+@-E4 M"SQR(P#QRҔ 41-( ґ ̀i(hJ)Z8 H iF") R)h(*RhЉEUM*V ZA)i4EtG$h!n4@m1 QII12BSQPDQM JPR(R4@(x04UDޭIk;wfdO mgTwLLN."d* ]YѪ  #)KJPK@v!)r$MPh hMjuhД:JĆCBh2>Q B_AhV* QA76"9խeiyC(p 毜-/>g8wUUcmќ30E3F}o> Lɇ  <}v;%'fY4nB=i#xǜDH 媙'2#Ӏ ^BD@#>;?>U?y'߃VBH'TA)Rh%v6''d ~j*&Ra*D:I*tIJTD2 BE! ,{zro a8?{4SIh;ػYd L .|:3MDK2U- h!J4R@N+H@/*:kTHɭ!2M3::BC%=~sz8L`(WP襌]$M TCBj5V3MɩNn)pgCRZ"Z@jV##KHʓ X L2|%kJ0F{~;kߞ?REQ̌grSb*`d" ADCHADAC7V_9xÇ}(sje/<׬n_`~똰ÇL[铇2ժAD%iJZC>A")I*@K3'viL}sgp}3ۇ 2Iu֊eGv# DGue-A뭟7/B;B1` l#fp=N*2dmmEy:þN! dCf!y 5u?^|zGJe) D>%%#L>k(\#v>z(iMP.qBd+Q 'Pc $=`b5ל^'yKE zOSC:ďI`PN[9K3RkuJ?@$/>C秧*B܊$[&D%9]ygx89UDAih~a\?@Di T8fdmo,)l9N%sGNqC io57?$}wa+_.=,򠶺C w'rԤ^_&w@ '?TOX _{{F'z콖jf+f$ 2ڀށ"P%S PD4,IID>aN ΝHqB. TYR"QVeD3\%bV ʂۘ,W}N %lP%R2uCq 1yA?)K؜D#lgt(>#8W1?iuQETA Zʓ6򌼞Ia{N?G5D ]?_'H#ueH!d7 =Gqkpd] #!CnNnjNgks?lAe]ro:-9 G$@kC (L5LK g^;s :ysTS!TNEE&!fѥ ?Ix]ӡ6 I9f~Л fﮧ}> ޽7\>&N-z\Vili1\.skxKky`塙nXK]Js4~zvGM&v_?ѫ38\C E^=*c_.e`NK[<=H4fp6WQ#g 2t|}JZ8LYHTOS-#m(Q J-t㞭' . NSG0i7B2yV!%9fh/5<TV~.nzJo(5Ki 'kbM\{ BF&2}M2kʼ̾YpZR'Gw9JgiLds{f*]Y9ie9&Iɞ[RrSkVV1hbg75&ϱ鬢l"'EQTMeLu8]-kflrh=6poUw7cZ.gr}n»ӯd=6A!jz0YSS<~{{믛=Q_J{П:b/bt7hgImKiyљb휴aj jBCQ.C]kn55ڣRR $UE̅Bl!wEvjP+2&@^ְtkhRKΧv ^ևD~湛ݤEbmnYA :uRSUѸ:oUr9O_;d&b9U l/9q0( t8"Z qDsٿP7'gϮ֛-]+u)d勥5ņLNwyjE'Rgu¬n"35%~r PCDH̳b>@bìV Kޏo>+iX>P6ӤOFg. 7t<>_}CKB1.M)0u|߿|:[r|f&))θe^x_㣟ߡ<@}R^ vbf2u"^q;WmM B; BSZ*e뚝톊X*hK0!(Oz>xN?]ѹ ʢ[]7!:ۓi~LRP9VH;sgHQ ״h4R4? _Y B)CjCѽfCgp='&&ӢOJ [b2HRT?%S_rnOeӯIѭ@ۯ> OON͂jNQ登. 7!>|>hi4ӉБ*URHPhK@RQ8:Iи ) hRBGCKJҔ4Pд.ؠС`P$H DA5LJz]KU$T)kΥ:7ƀ!ﰨcQ4$3F; $ ,5$ 8y8ysv{g幾^or٘N=ư_lX|0~}N^wFXxqIcWj!^3fIZNB Pڠghu*c؏ ;;חPwH85Mko0PL7(Ġ [^0L혆k;@e_$"\lr?V@:XULيDP 1ά2eoB}v! N 3?wAQ9'v02!J `PU@]f2VVyr,)Tyg ᙼtl3ϱS@6{xjZt:1v}"h DFE (O=B%GpgWd>25k-Dv" ERiDLhΝ2 \sDmi3#uQDKA|0S$ALU(L,); 86= Ce>6N0C'9)s F4i]m}t!P{ug;7Z\S <(Wydt:(t1 %$-BDQ1DjܚC*Ȳ{~=~eB",u2)Y |tDyJO#mU5EMkFEEITZ3ʊ*ubb)* *"3b#ilbӍ2O WUVբ+ P0N i(P$DPCK*fDZTDUM:) )UE$RPDTғR  AEU$1DM3UQMLMQRELC TUD%SILQ5CQSPvA43DT-P%,@ҩjv!EBd5=>{Lj10XsaR)֤+8 FNh|wgk87-r{PA#E%*P"|o}rbj`&TL^Д@˙n K}h!Q\va}46fICNL^E x]?R 8[m)1Ŀ䈇2cZqGـ4F$bʾ7S_Zhqo7o6Nq_]f{d[凐"!feW׺sRƌ:lg&8ҳ=pS'Q.l( @0`&eD&'‚I*bVww&IT3]u 9sx[Y1xvo&ugTxPgx`(N5צ#~i9dlA>)B=8x;V}4ǝTD ^!Y sKxXV,Zx?LsYYJԶ6f)<'v)yML}S鋶( !HϟY5'[Ì@ܮ?iNnd+ԘήޝA2|nd.sjf}p]s[ax): WmNt*;ӗ9N&XaO|:{:yCl}uDO4t=T@ : x.zj<7#:3U븜DȴvnYtS--kxr D0a%䡍gݡ5dž+KN=rD`j UH LXw1͌+8cFa1:ӌ?TylWF9b?I G\Y@e.pbx_]ùB}sBX@BӅartHBr6ׅΡқ$ysK]ju.̝eN)RT^ keх(l"q¼E,0ye8)M٪0denT1DK n4aqf¦"L,aDžN-]{9baC24Dw)A=zvNu^=L(Nv7j*}.9Q,2h&*N)fLł»Ûo/_8-uPTYilRu"ZcęхKNlMY†P\MqbZ(!m XjlSE0}'; -`[NÈi/ bZw;{7 _9栈|udܹ,6б9Ħ "QA4kUklk _چ!Qӄ)n]CK5SXU8it P%cߚOKhG1sI+9!O/z}bT$JVGŇf 2UhtNTl4 .Ao0?OtLlQT_@LcGvOr9$\E=5&r)'#rG |8w'+U>B_S!%}{ 5? mRxqKvԬ̓} ~A 6÷)R}*R*f"b+Jo>^pL@}^jNaL{r$ P6?__A Wi76-m:3e!W!);@4o{yv\0F#Dȸ XMj664 MQ=O8bm} 1J_COTL50Hsl'UvuĠ *h>%Y=)tJ߭/?߭u"/9峘zSS!e֮N7ٲXh]t-C1OvyB7[lGsh?2yJ*A&2e`, sV,(1d1 I QIb4aXQ4h]&fr. 6{ wo硩4}1=1y#rH @XMAb3FCpjrӽ0|N9,o*w,hO2zy]8kZ' WyyÏy%roF(@.h#Rh&Qy #KmKm<ȴ<>=z2#[PH{:ƭH m2HLs0mHQU(H4$"hITAH$Q)ݹǺB&ߢNbmzyx*3^*wYĕmʒy(R+gQbh5 ҁTe6X' uffߛ qԾdV[QK`j0IئKBQP$A^Žs1m+I?!#2jÄ$8ZrbyRHfBûN܋@F Q8HhwO@d"X1o[ӟXGcB??;T%TĦ%"P( I!kPZA^GWF>2j>{OXB'LRT= ᅉ{+^4VهgLr _UQbLmDR \驟Gb{:4QlQ[[mf%r~GE؟DB>Gsp캶1C# %ʩHAXC×`~f7틷x d'=lHU'C3̧ HE/0ccQqHvҳ2ma>BO%-w<?F(,Z%%8ɑ Wx ԉho=E0og};tq}zP=-1Aܟg}f9>?EGo"R)C'ʀ|I˳2* ygIJ}PRP 4A {0vR{e! }DVv%xrUx!Oobd۷r2M @GXPLTQ#58FGATKZ*kQA4$VG4=SYN0i:$uNu s݅EyfPp '_5upY7T֝[Z3,Uc1bчlN'8s,7R8]()ɪw]rG@X4'|kBlh|7%~S4WP (^7o/yo8f,Ls5;Gd傅:=^뗘ہ\ \sg3E#NEl ܚ#b\&^S h&) j * " (& ݧ> b%) ҅4T'T 0,073`C6fF :* qW~xW#o؃}fD8EiK[;$gu/IY[/ZYԹɧ* @ )d[ hv`lá1%:1ԣR %BkfY\$J,((?gA0h HaX$Ub!#)&Jl̠E h$ fS*UDԪ;~({T:Q;+DosDw#R2jS |)-$kHU#7_eʒ qvpPR:nm)nHMSL f) H!ZZ֝6}xnN_)CIDJ$^ݭԑ""Fʺ*̧\<.ɡfO A LRFV\% p.:՛"Dd'{n`br@9gǸM5nleMnm\GcaOy`S$D>D8W@#0r(Y8O&\磜E!1F>4!1^et?8D#J]PBswŢX!:AC^C63#xz8&lo<%1Df<!\`ly˩ћ}( ;Q*ZY`@2"$ 1| `NH{B(:9ȹb&wGΧJ:0$q,Bʣ<Á(EiB!R$@q[6GNw[nl1EQEE DN>تyxPQ ] *:C|#$˓c{<</)2 JN֝Ct{wg'4yz!T>χpIGҁM?N;>GۆU !%)2F>h?w9sJt9™|M Bj$*TR (BVf@JB'e (aG=߼ `W>P9C=&뇾^n+-RFpg"R[@P?Jq*bXU2Xd +e+(MԬEAVhvcܜ5TDCãwiy[u%yH6[ Fh4^q$E%(JSbTbՊ4LILDГJSDM(JBP#)B[H]I买=#çmrs*[8 5N7fuhh?Z C>>˜w9Tn2(#(w噗\TKyxk4L3u:? uuNɶXx%UZsIP=(UV)IIĔETDKS5PTU#&1-*ZQ2h>3q&U) LQ|T='#QvMAӿ 2>WС(W7KO|xir;9Zf "ʁW.a]dDWύ9G'WQ$QT1A࠺'Y-dM-2zq c) P'z${'# ;Q)͗oOҼQghx)2k}q f/ =@<? Oi@|S[">9f |O߷pWx{<7ģ!X)gM 4@WR bܮBR9`qUO@@ ~ NS S`)l:i>p dy›*q~ٯa1E5@*6>׳f(U@PQTKDMDHRCP =EQL@LR- JxN^.8_ ?Jj*i7oz|QHOXPOxei~np_hp4lZ:]1C9ڜ߭TE ]<QTIpR2TC8)mO9ˊz[j굲5E+(6AkkxWKmr4VZ]Q#xpmF"ܮxf5d9x))N6ܘ9O;ڱk}k`_Uێᇖㅇ%m]o䲆MhBB5 r6>퐒W)Zt4TTb&ɱҞu޻QSRY湭,mR4xrǝ;9گQf51.vi R3%-x5z垬1Tҳ㶅b IY`m6u-gmgݱu="r%woXJ z"ZDU&B#ZLyigj+UA K,#Jh4BDd:"$ܙwyʅB*}QL^j0Ym&rZĬ[˻Y6W$W4{[vN:0CXz}r^Trw}ɓ%I_}ܕT|0X )ZNq5kEy+F)ygv>RΥJʾxFT;XS22[{qJٕ880mئtwml (k+X5v%Mڗ0Mr mimƽfmR+g&׀S)ݮfdRK_-x3lܧ5+ C8ef\Pg 0-l"ryn0hu!O gu_kr;+"fE`W)CDqJ]+KL/M>AN5r8RYgi]wj]s^b^RK(785Cv`SF'Kl%ܳ.NӴя>j1ҘbJ5yͩȖVk̋J<( q82[G#Qyfw9M4F*kjfCRlhJq391]hj4%8Waj+~<:ט-oI=C$|lNU6)'zJ`r"Qk%ְ)loDܾX /^jSI Nkoq;øsp;P121Sa>~{(w>Q @BP3FKZFE{: #6 N_"\YL@ZR X6DU]aDZl`#|9=^,gD**j $Vb&G"YV"iF$fIj"FR" b abbde(BH) h")*֙!h(̧_[x% :Иx `x0X7Ĕ^,x`PΛn={8 ừUE%yz6Q[Ti Qko3h)͢UV֘]MRZ"ֵ u×&_Ճ~95 8ݭs焷}_\O|6;7hz7$)4J{fjIs]O]?bn̈́?  t_v XtPTI೼>+j/E4lkmݹ'*H.YYV RfQUuͯ9V d#4GlUfOTڦd] tnT@5TE-vԎ) *u`o9 {b @fO {;(O;isl4JUN;R (JJ톔Zt4Q9ǒ:@N46c4*4"iJT&aVBd@mrH5𓽪j:'[ eDLY3$XiZzB*)i h:4Ɉ("+Lq:`w{DDHiȠNEU2La(K@dg TJd 9MAf@PlPQB(h55(V Pwx'H,XeLŝ1yʅJ"jA$Y ,&)9#aw{$ f`)(%41U- mдb)HfS/^i(Ny!)" .\B?gȠ PD Iy:.Z\ z% J(NtDpCd^0+Aٜqm1Q><ӃeiZ8VTqx0hS@:Y)C T}$H=#RPNߡ܅:O#n1" 'Zq-p{! )ơM)GlE @0Y(q)@"uADm$i)JiB=IHHQd#B-ҥ3Kw-D@(yO&iBh !ԑ>C, LDJD(ALU!A4-A0H)HzA=PД"IT% B!H#QD1(#C@iSIHP4P*EM%)J ҁEP RR]"-H Ҧ9 .! $fiTtPB%J@ȠJRK %Zr1A7Qs!G@<Ҡ$UA\! QjnU]"$F" ))` 'i]a !^:tcMS,YQqyV̝Rbnӫ+!wY Ue ,Qߎ`((T* +H( )QB 4s1RQ5QUU2RCBLH( )JJ Q M=w <+E s/E۵0;蚀Q|sOz'wp( )JCZD:AG;fYRR}oB&JV[eEC9uPҴ[e?P!̈WRs=#v*3xf<'?q.OG2{}x %'΂"y7( qթНvBFi('qӢz)u%E̩2Xq&@մ5?ٶ#>z|Az{vRyMèMCvdrP'XH7ҽHSn#/ Xd;5됧 Pj(* yoqПICh g &OoRN"MVEĆA4d~sd۩*b9$1Ixu;df Ds*k@p5AA SAێxށd` ԡb+c `;%zb?TDC)<@|dPۈD @;C ~[ 2e|BD9I8OYI Bw#~0wo֑w@ 7 {PMB\ P )t FՀt-1:ߏ`xu PD() & tP@/ x(x$l^¼B43NrPj2{$q )='wdz[HrM) ~N!$8`0CНd=EJAz Wlӎc?ja(a҃e{W}v}@D0B;]],~|7جdG^)7*JǁegMwN~BmԽ ]k`8-=N@ ǯXDO@؊"ܔO?"(}w߯'DI9Ȉy !Xr- \Ss.3?hSCP^I(!JJ(V& 4vJh>+/ S;z'C&f [%?;QcIJPn"JV$ "*L5)B4RPB,, DBA븾3Qa5™I=37!E2'%H *R  ͦNKAZ% ȉnph^EC"()Bd(* ^ W>' x{Q@SP rBҏ 9BlxHR<4+@ "t INJiCB) Z@ iPt)M* #FHP)JC b/GA]Z(^9Օק;\0I? Q!Ea D)q sO!D>܃~·ڢ>(~hl\ӡt(D+ b? w((B(_ On "!)?&߱;1dͶv4 ̳3-oD_|k;W~;),(;˹~?OTa "9(BB*mn߮8wzL}^ x4zAt$j*!)idA$& !a<("X+8Cd~b/능XWh#JHc%VeB!CۼQ T4%A0-3 ,W)|,MȰTBPd&<Ӣq @@? $riO$h(]:+@]E; ZE)A%$H@": !< t(R}p HPZxq(S6N\HBjf'{`pV2-T檏Ԙ1Pb%[i `c̈́f,%gYK̈(%*3XTR4J+o݌>8:TEuƺFfDRuFd4D5㼼eT`,_:b_t9$1HXTLI+HR]zNKhV}dz99iP1wC]r={AGW{27ra9_e4Ҝ t=I8C(t$ )ħ+'X4f#AAPU }5YJ>xO;Kځޞ!w{8đ_1ئaMcYֆ 6nKCb2*H3 @$J("B JNE~P=YS'DA*XoeP1cLNʣy?$0z$B>CF!q^lANѴ?`~nCAT(2:tA%j"4蠪*B1TK0!D %QJE+E5@ѭQU(XbZZM!*)fZJ )t視UTAzFb>B`)$JLHYbR\6mfКhmSR$V@hMN%(: J&&CI;ÀPrdm.eJHJ:s@w04xM=_\>zGA|c*B=|/ }t8|#% )B$37˸h%21#LS[-AcsIs#C获xȔcfzuѣx1>~9y@UHB00;f ˏ/~ (Ÿ E:7P:v4;B$O} ()r AzR^bPDR2PQjΐo-: /Y*=yaVB;0n(տ:8L䊧ZZ8R\$4DJ@l)QwPӘ(B P"i@zHmȴ)Nیش""B] 1=aEKN''~+o Q)B/gȗOaQae|DSD.Gq$ڛݵqIuV!L@^N#%=N ²Tœ w(0 a6C"ss Of|y'_(}q#z@kuʝmzO_LoXl'r}y$4Ltbd6FK 4@_W:хSÉC㓬ՁɨcRP]`1&BI4 f(+dE09jQ}4)E{GKX(y)e8棭Q(d33Xjت8$^$ZtӾPެH@SS"$$Hw ?CSJDwEFY_:|X>F)C.囘i2?/A@R^W&J)Kk#sKY^e̩YkycXfC .y,7aʕ!UWX 4)bNSf#5 h(Y5|[ZZy(/!34t'8_ ꂦ,N~?w<'/xaqH~,O(J@hi8lT;!~j&i"iQxܟ] @AEE!444 LI%QK$M%)1LPDR!H!|kiYN[j@Ws(4-ZX^ib8p8A@K=O4(h:Q^)CmB4p,U= B< u;> tՊD=J*H&*@ό5Q 4U҇^wAm:4oᛴ_~2oۃZV-[ 2;LO *Boxv̔7P ;*"Ù ,mk)gX0'8l`Uf(!(t@5yB"\p*ڕa6  T@U~\{{Qͨq,ljks/^ӗ guI睲mKc%qh<S݋IS+]OiAA߂P?onk-m5-:ceTYY`,bu*hU\kм:ozpj21 %@NP ceKԤ0֔Tg sFKaN a*T5JTV(VE(4Ơil*.@81թx uqj ޴ҍ-LM`"w3{dIf#l47[[-T6(¥f,)mlG]br,c Q\SQ1S Zzs9C$: d!F2}|r ']kOW'1[xO\/|99s;:Ǥ!"@5A^u#4:%)JHrERr]AHСEР+ Zl#AJPJRAT%45@JRD@_;5Qz*:9"rb[I:a@̖Ft#9bG5[U*rf [ :=val ̓ClIêX f!(a4sqD4nZT12\],U[xY(@Ċ(lņ&1Df\I<3:0DˁtH:※`%s 2F ؊P%zaqAJB6RI{HMII=:tfl3s$"sDp, T&A{;<Oi{G+_|s;& eicAFZ,;n&s Z88C6;{N{EP4TIH'>&{I8b㶃H.ͯSn@:;ΘӌShr)8'N/X'$iOFmg8%#}~,E;b;|=%PNA<<̑ (35ĭJ4@LĐI)5U3RTLD%424 \y|z~hĴҴ%9XPq=6V$e`WА*%L$HS}<0b0fazǡQ^>|eFgJ')v(e%p|n;)^gFF$W|w^#ߤ"r?^hv5\yGVX;8V.0A*HE ^c)αk枻|'+n.ý1) y}"R.<=bn01 h=m=c10PZ>9OG'ܳE_j쳇OL5@PdXBx}>a>R򢿟~4mOS47'R`QS@ˈ|tTDrNqBx+Et "hnh)S"Ɲ{@0<_CsP@Q 00wGDцyL PRo|9 y);|NƘ8~(b4ARs%*N-ՇEd0/KVR֠|xy( Io!f-Lgtf |{,9=7|?ujA,J`lD0#.#`{gSBST 8X1703ҵ2mo(Q48>=6qSe:PmCRDPRRII>OPM9${ ʼn1!d1X-LLiDhBh,g飑T5;` ~0hf=9bĈ|ΎG<h*f&XL}>vF7Dߐ!Ӡִ(w;  @l7&wŬλ :}/uHd^d||gks%lxcƢ^E̵(sfNZ1Bٜ[a[3Q|(Ă>/| hVEejX [ @a( *J%8Dw8y|\/8)+ȽD2G'M+USJRT-P]5%u.D"y:iif墖 i (j9QLIL55RTDRAIKJ!@DQPPQ%RQLTXD"Uc[Se%՛Hh.h*h'Tys&)#Dm%c[ "j#V*+ ET]|^E{l3sY"Ĵ*ѬX;zV* 1JÖÍR/0U3'q!]eV/^9QE"HS;pxX0"A6 QO I9DEEDѡ3,MBm/Ub 6 &1rP- EŢYm˹MRZ9SJ K'uaLi~?"~ӿ/2}`4d1GKJACI WBhH{zAU}gwkq[?Q'.>i(b )-I/RDNlW>D@CH4/){suS׌dUv\ψӡ]L4e˞M ZD*j1@Fv)*6|,*Văye (*=0HI@ ̀ҩ2$TP,zԜQ!R}wwJ /~_AZURҥA$P@,WT6C  aė Ef "Ml -#~\GFU44J7,SKxLKZyq,kkuieMc i^ޝޝGljxPjK*m4]W=xࠜ7'%v1 ueVղyMĨU6זo!\`5c !R9i3 aD(1srQldכ(#uL1c#C;]5aaÝo.q8hFKS7-j2f[0L+kXkxģK\-NpܦV޵u%h&xA1$ox1dq2D)L-EKåJ%m%JU[vYJ3Bە%be&nֳV*[&7]3a$(ѹ+eUKVhH3nmYu' *.6lfrB Qfq̧5ۆN(jHHpH N70ۈ ?a9(- Z.Ez9*p Qҭ(!ExɎ%)М|*_} &&bFJ<;' >GjzHQHhyT( T)tch6G$("B޾ $(d!=Ŏ N=BR$hhB] D,E4$U,U&CP *d  "* fhJ(i('9&7/smv;)]L"M>#z]yûA5-] 曦 T3 tʦ&$?r7u42Eo:U;4@r]3EDP}?'o֥,-pۚqcrSxQXأE)1y?~^P/6 xAVpeﻮ5fb$73'u-;IKd/HLܱ;6a֣@jXdY ~~*=d}9 RQD\¼򞲻y?o8|H3uŦaRR'EGCpHRб+̟Le~΂=jh)' cZk׸: lN]z;M>!4DTpBh%jrマi`x; H^ TZRC @( g)J:5!KD@,?0@>|/)劫Hf6s]$tZ("!: bcn=t:0(?7 ZHAc:=NaϏڕ;n6d%LS>Yֵ)ݗ+^sѷUS,ҶJb' D9i)*[%Ka&hG՞G>ӌ3XVr)_Ав^ I-rLA;|8ˡzfvOpo(k[eYH J}f :tATP %D-$B%!B04@PDL g*c`$t$!sǓ Qp]U2#)(JR!(Ni!W@ `pAҤBQJ?^N, $M JŖHNQtɄE-$S}a P&"&Rb1`NU(1=`ʀ"TP%b(!$g**}4!l A =%EEy DB"J;O{ <3Nϊ$M3E *~ cpQE *RĀ"BD A5(_z 32  U0)Xhߘ.Nёi>Kp Pm .֓Y̓'4@_xxBTdUW<D?q51(@{%n@!8*b#n % JЕIG2%+Ԇ:D10%Zui;9ѳgV!ɦl{S$HmXUam[] X˝mLj\Q `%JmhɫBZ(l U#iXk5 A+{ftdkQ X[2U9=IA6%2D*h*tNNΩ4hi1?Nsh2*ҜZhZ\3T ")E%&QRrlBm4Di i `GAn#Ň,.VV.Jш(Zi hi*:PО2a8h!+G61T8cVƥbH+۪mQ6Ŵ&fHl^wP{SKEa ! fQbz8PG7[}=pPHF‡CkY̚Ұ"wsu*]IJ/u+j[R9+-+c4rnp)Ph^Kaq ۃ:D5Ƣ.AdWSWM)-bļɨ)^ZhҘIfi f6[meXZU֫mVՄM44 bz #$' GOV GeAD@ɓv|7q &ϖkFϤZo1L\Na<6?#4qw+㫝"jfMI ݍb~bcnYGٙiQ3r,e*z!5zB,~_yԋt TR(%l?a̷)2vMub(ҁH}gS k3x(VPƗ,*E5ђ%&XrAPzԜ ,(jiZ&5uk)eAZ# {ozCљ.~Z|u 5=Gg4>M^rUKs/ #XBoψgڌE$%nþߌxx`T|E{GLB#6Ys0nHcíIWq[JV̷]+0!/&)AッJsjLYA~PcӴѵ.iGs"L yf__ƿ"/l#iQdyף!$% 4U /y5GpW-koZg9c6v^4EXSj G"LMLajzY=.1(]5C@0>[w2@~VƲh=!hdiK&0Ř_kx/gKzE̯=oܣD!WB#]< ~UL aITBAіke P_E(q4@R;d3=u9`;>B?ϗwS{-3.h`*|[q dIGτtFO%Gә.hJ=7=ݩ m`K +|u8TsBIWgcnvwhlPg)'Y9I^V[j3i4W9CnzN() "yjvx-[X TY#B`!'Y1L(Nي'u54c5ށ )f#^d|.oԋ3|眭$tuW0F#KuG- 5*_3Y#b@l3z$G&>Hdrh]_~wb>RolT=U! ]e 1LzQ]LAVw*ꑤbt%,W#[{ѮuѯIi% w&C~vqŪsȚ"\1R4/nB6̵hlKX[|Hռ;aF]y|~<=4PhXH$F&_jtn+R\d;%d/@fM}gsOҀ>z뿇5cFg1Jbr]*dUq*HYyhX-ǯ']O׹dAIu{6bnzٍa, ߥG"u@_TK iUw`kkc>똲lǭ^D[G/#"V:ؓ3G\}k^0H䒇{u} '!R3}Q)WKNv>qr-%>Q8sم LGe+jbm=VDW,\Ⅼ#oHi`L p1P)6aeIa pġ !ֈilpݨ2X'k>*Mw˦pFY;X‰b l5UqQ¸Ϭշ7;^f–Í'Y$[.OIA$=kVM¬Pheq\zVYBh"7(Zd2*鍲ƍμۤ?-5KbԬ?VX}u<^Wr'X0RL"B0D 3}iJeTbPAGɾ āَ1CĒdaSϷk^Jo*u+XMsF`:h`JeՙB%uP/Ozv3CLw+Y=l7ADB}hu%v|Tn䬱zL߷&Ô5ʼ\;V @ijQ7V[PxN9s /-0*܎XH5F;jƛUh1 +aY< AKDHwB6ԾH1`M=Cd{( Ӏ@(>R&!@u8?jfm6uvoH&rig2jȄA=J$jwrG"zx{-ߝP'i${hȓVgHAlCJxxvck>+"L 3~~,cvF#}GT!KTGޖᰦ'pHע?Gf$sޕD<\?gM{:JI 4DpJ~%{MWE`))OP\ /PgOVrA>[#_ S^a>H5kX꯫O[⚖$[KÝ?##[{"JBX?rG]'`;w~]L-d#[%\wLzr$bR_ҍ2YNe7TPb hˋ6Q‹+cmRْ?:ޓ1y"e.tIF֜e\FH$ZFeqX!;C5୾eȗr&(^͂Ĥr1<@(75/*̆$,$gVaN/*!2<4Ã%s`mwF;WEP=g7 187+Me7=ZC)LYG](s^yRQ(֔ zؽM5w2dPK];kEl&bj&Xk,SêR)\,Kwϭ]ά ; 9O w_3@W4a. 4uZ$ #s Ye?HtE>S7^޳~k궳򞇷nկk^榁OO0g/R d #7=75{`1}O`}n|H{|'[I mi4kl+?RGÜ.}v>b]v@ߖ|au7zd] E 7+ϗVd葬_ ?~1~K ܰ3Jg DyCs|Y\A"'e9@lʪ`R-oa9jJo-m=VS ߈Z疺υ"WV}RnEK\-vlm;M/%l(eB)'m!dn7e DRlٴ j2(SN\gRNs3͋y7<m 8&o!PH7vѥ<)=$BJE_]i}ve{b,\^dSS$b0 ME H45@*&Jü#!T4.Nlm~ω__YyMZ11`;KNdC"<4sZ<ũTm`ml?ׂx0XZxEgum$// dӅ""@ƈF·k{^"Nl6N^vM1]σ:|{:su]}O>IDH`5_c`{Sqm4yw]'oˮZSFuzb+#!\YG H@KHRBSB+_NGS"!n9yI:@6G aZ{g0>^KCI˩釶fGE^^9׍vhA5NkMfB}"h+l1UCjmzm݄Q?? ttǶ @kc'`5_>IO1~rJC{Io{{~?~ڂYN5RI[i.AjnۨCv)W[u8ᤦ**(FmK{$ !.bͰ#;tCӺP{zVwW(qvn+sq]Τk4ν4"$H 0 SL2B 8!D -DTT?s* bT39PC Mw~>xv74A/Ļ:FK6]!w%QE149.ꦫ*)=h$lR=!d Vd`(o_ &|CHNЈgP=СWYnvpV9PW;W]X̯yu*س^׋:GRDJR9lŴLgpzz~4~X9Klڅׂ8c1I%N #N8!Vbo fnw'8!C1{Q9hk +U}/0%4 JspO-+QHadݶMO}8d*C/3yY9p'ag[&}s7ERMDf`xEH4E9s|?%߰=|>9c&^lH_wI@M!T~_Xo 'WKmE!qf"Ʋ,$DnDZ2E2AݺTTՁ 5EI=cRI1L3*B+ pQhMr^s#NR5 u)ÞBϛGKh`x D#^ NGMΠ\Эd4G&r:_DhG|ty!ZJ"]wcl㌚2U/4bh :) T1^j*+ZOu17kQ$^ĥO,X.ZCwjϼ{B([. L\2(aQ;d=t .>ٚ>0a"]޻"<͂"*_z@vm-Z(1  95ADNζ\͵P6h#S[9%ID( J%! Z$!3N}.X) ح!]yކ*ˌHO&T+5*(或ͥEhV,ԙTƲT]R0* 3xC$eIU0j*![lanK,Iq5w Hj]|p<=r8.lbX"9Y8,+/*]L-;qti3ijUFӺHLBqI1,"Sβ tn~\0:1Պ$&!ԫ f*8 NeEtAaC컃;yД!BQF i{;,sgc.nw4˄:Aي i7Ƞ?' 0ÿޙAce#ˆ./tgPğegϹAL4P!WۓTR>n8IR@xAQ[4ϔ0q|Aw "9[1||i{G|S_94p0C#ACMB/ڎwPY==gz{3̟hJE:pE9t:xC$P<'ᓯ I= _~_nuޠVk (<8.poyљCGi|>T)*^kUQr3:hsjέ\/h ܑ!j(Vŭ<Z'1SH>ʷ,TkjF,[i^ޕ11U*EZ-{aCc<\ݐYP"Znw ϗRG s,НPz|ˡfRJɪ+ڂ9{Zu둾M [;wUCV瓖q IAu5԰ɠPTťUց ,6uQņsV[U큄fhFHa뜮h/Y7brό[? >URަCl; (,z Ͱ Tw6}cyDXYw}y}8qB܇-'0C/"~l;1zt+AK,&+p/5p͡,2T8&qD䃶(2HA{oC rՐ|*QathyKD Lp =L3"g)f_S; Y>V>bC䡞8+6ʡTyqkDl6HҊicZĄU[D5KgD>yR+5>OCJWުCն5ciAL3W'Kyd1 ,JћiPYt%WyԭkQVE 37zz΄zy9CGc^H9ֵ[IJr_T*#/_nAizxQ&5%Q z^l,zSI$Խaϥ$Z͎(9OAR WoA8wV4"f {NrxésPi *B" (e1 Q1[z9s+RH[(tc^ B1h td9bC~^Vwμcxgܝwם`>LSQ{Zң ޥ9 UOIm@$5]Q")j߆kl <7 Al8u"O}zآ3@flY)WGMiWzc.e%w]>e#,bРdUDY_UZDX@9Ae_Xj#U*iUꔎx՝o^T*,@ 0p4MZ"U|T("0.vA R^e"(}+<4KE3Ll;2R Pb+:R*iLj1p`p $ך] xRQC  Un,tŃ%b&poHa=Ъb>1~Sv(dMY!@s#^&yF<3gQ@S YƩJ`_UUq;{"mz{Jkay@YI*y NVqn#΍rE -t:"-DkMu`̺Y\1pMugNSi2^9ӑ̖n 3߭k6뻆yۯӽ^u3j aH$Dy"`L"emg) rb eMYu3sY$75rDlYi;'$szzr ;Ḫaldi `4`fb0%PߓGHk|F'/4M}7^'bfZu=u\k S*Dr()ښ'd'p4|=>=ʶRW}iƉ{OHd #xg0 •`W=}z"/6ޜwsX|1qiE_)s:B$u2aB**X[eKfw)BUJ6塄e=bQ41#=Dyyak0rOyqm)- (< - hAъ " D%4't-:e^2eTș "% ' =8-(] (-]1ɪOi:)m =yyz0у"GǮЅD$ ETb^KsmJNC:B?qWT?Gj[4OҷUg|߯iiPuȋ0KIO2@ @+w̔':`f/*7t<&H ?$!:jaqY9q@h؞U 5Ŀ.9U?.wJP E(w@edJ*Ab$a` @iDXH6|ùOma4@P C(C<`U ځĨ$%(jOb$Rh4 lE04-S0P>(U|" $$E(&3ODL>,5ѰLѤ0p ?"y%oA/2=;8s(f70|}+3kSC-&ÓՏ|u-3(xrfōY~1=v-)Y, ?^[m0[ KN2SNnuǨBǺY$+!wąepiT'\̜M1״Wy敊ֹúӑ9gsu&;{^4TB^u"k|h-q#ѝ2Q,]bfg >H`܅Q G{) 9ɱ3'a,K%x2aAXvP ؘ*nR968 .Rܨ|H yS|^y*N<׉gGjpAL7{ר!E7$[2D8!A`X*0:ӍD2?%ladNX%&Vj(ܴV}vz'R|^;ҩf:O@|OAuվ8yAԱ>9˹_-N]v[цH/\μ>X$g#Z6q1Nu)+J$Lʘ@T44!9,*% L8<ڡ ?MQltmcc-PpH"h`b*ъDQALFڐ"Fp?T>q"( \Iz̏ךJ;O*L!5:9d&Oc#x \ׯVb#Ɔ]ФmHTC@P7B-} [E=oal=6jBjٻ)c5H!"WL4mܚzg|<|Ji6&EM&]ę`Q5(@'1E;4je LT!1T:dȦELbiH*Yle^A`.ƅ" zxVׅ=ГNl}Υ<Ƭ2NhCqFeBj}qE}cbcơZh) !$k捫Tc$DW[哯!Z8@Wv4m{߸ O{rE|:!a}5 QT[.Mbx;CBi<@˚Ԕ ,}!8@38c:Wjr\:Guu9h؇@s <kcND &Ц^zW3׎=Ǟƭ29׮lGW!'I1~0T\.P%pnG$4ҮAKڄ"Z .+AF 5 @Ħ@! ($CyP*R&#ZZJ4#EZ M+B ,\B5.5B R(Ԝ@R]xɭ<0Y7E ;b> z'pP8u6v)f'}"?w)S*ך, i)]D)9(W o P@҇xPC^w4'H`DYPOyӘ広4wr=Jф$MLl<^; hMe DZt vD9WzHsda99#-yOt|tv9= :\fNG 0W"cDtD!89t&4V؏d̫>q!0}s%:y4qd}W_s.v:a缶VB  拪ғR+drIU &hK&P\\==aD)XE{Ihkg ̥ IG']1$ֲ !8G+, avLRR~" .EZ$0!$ 9DRV_Ljc"gjmjY|^ݾ9a%٧N1IG=AtAvц&N8 yG>|y7lOVwpQ뙯98) tq8ҳ_i_V+mJj-REP]bv6Z.LAITQK<)Q-ԦXCcz8r!V2mV-FXӈ|p98ڏ֛ќdlީedyb*n+W׭fXZ<8Xs/yc%UFm,Y׬Z9UV0Ea$x^(|ׂstL5E2v|9am˂ʎ*olN _-j+ȿ8ɩt)i[[KKi^#JCR8[t2ZZS5ٍ3KG[[lDH6鋊4RѮQZZ;d+~./*2)ݚ.!5Tj{TB]r/?ᅧ_lV H$LroeDp!c BܨJu+='zi V.L^38|钤 D<40AH9-x !J#B̩MI$P^Ν+IAKNp4g)4wLld CpP*Gv@,F`ZQR|zM`C P'(B9vCZVBM|=t<9"hy 44R%"P4Ҵ%P 1 4!J4R *H4P!@4)I/ 䜖iZih' t&(h N$TK}hih'=4fNlDʅBQB2g ͫXuٽwPܣ)J*h҉x`)SFB"'چ0B@!TS;ye? z@j 3Ce/J~>BKe'hk ylj}|$,)/嘝h?<`B==ޱb.d3ྩ|$aq5lthA' A$)(#/~kqqD ?GTAk4qCNGyԴ0&+'IGӷ}~cR~Ҵ &p&䓩u^ QrC&dp Eyt|4lD{߸e #LE%)TRR!41(Us&m04 LID+g !iBe߶Gxɑ3ݪ^ E%QX0bh͹Ä63SUTSRQQrMEQ*P %D2)iE9T*ajT6o(ii( SiW)@$ 2x:7)X2$,͖A/Ha!J1SgT-\^U)&N|r,Oc|;Cy>/ZTANtT8Fe_eSdt DV_XrZ[haHR_GGmH"dv}vL5P}q=tS,쯁P>2m^SGyG!M"z9|J?P1CmH 23߀8Hr tkBh|sr(tJ`E |)+ǐAHEёPP\O.aK'x$3 (?JD( ܣ+z ⇀yDHKISJ`c=>4IB1>*Hd?G{rJT%JZ YJ")e8xa="$fx3ro?(9L"dkv ͊KmmY*`R"%-%d@ @~Cݿ{,LanӘTgOse+Y1bǏ3jҿ,s NtC>)  ɩs' TUP">=B .af4idӒ9~ +Ԃ)((TΈ$B!(*"e& Vr`@%"ER݀v EO !!Gg*.)0BN+n( Y P.aAAg-P'Ht&PH ?!4*|;|j:$;U(@aEQ @q<.0|Mm@11Yrru}#()zJ kӌ;f䧜;^2jUBZm$.NZqSiOd:>'PĜ^&-w{ AkuJD0P2TI*P-41CJ4R!KB4^g" 2И6&r =C; gP*$h" ^﷨sG&6J @|T+5?ޏ(i(1'phJv}_>h"x(2bPEQzT<0C#LQSTD BSPJL534U( ; a$SLCE4'q4syKn pr(^{}PIM!,3P2H;7!054h֣02~oW>BnA~<#+@ 0PjWR4-Q8aSfx44<N?!~p"LFJ!@62R@EȌO`tu;uM!BS!RPwPp:1|%қ\:@RЇW_G fcju=)v:B &D}o9=Aw8 h8M>8P j'eʽ7Ӎ3 rg^l6`au|:fװ9r kx>FZD (Z@)Oy0ۧrG!AEUQ,5>HATnX [xXmcm 3ep.d q*;mjJ#~YWy̠Say S'?~=I391P,X{rJ_ \\}A?G+ d/7*suQ`%VOcsbi( ,* `u{LUL֍1HhM:GNŃ3ӭLXC)e~8=P*x{ͦHEUy.0m!ϹXF;FF{kNk.5 T <|h?tJ&.BĔ'PP!%aod7)_]r%thW) L 4s-*s'1򍵐- lRM% bCI(F9&CRbBi(һa&u ]!bLB>SJx9!uIR'9Al@RfI+Rd2US&XMBC'0##NKN"!) 1rsGh2~0e;lN#?WL5C~\)x.H5qtNlZfW:oMMѼcho=KzTTB-IDA $A@}P?D P{ȿqq&߆I#4C3Ckrɒd@sW!ECR,wMi *),a-3@|N4o(< /(*lG~<3Ƈ@:ϛNHu CP(H+$fI S>⁹/?.Bk3OP!ӎvߦOvz G|PNF}r/kI 4H@e9L'^uv:X!DR&9v̸0кF)F!"CApxpDDTEDD(L!B+B EK EdLJ AwXeP) A-|4ä2 ؕI"Լ!nQx62FsJŭ$m=(V{bzA+`3- i& G|3!Y'-S FȹˣV'W*vhЃ)Ĺ(v).S4[?<4R@PW7 zE[ /LT> H028Fz?$ hPmaDҒw'Ln@'H:U0"x;tѿyHyU U1'A>K;(by#>M<"HrTQzd΁ 旖K:o 7늘]d48{O/8a]ƇCFLr2`UDhJHlUKUDl nxFMnVd~% 0oe(IuPR'}L FaHAar5 c/NwtO.z0kY뇦Z!žN5M1L$O{p8b} 3aS"U}Q:v; COsp|3`" ZHcr"$pZWjPօ~6;#\QS=ĜBEC6(0AKB;q^, H$Tvz"bLӓVuF}=(v3bZvU@8sΞzǬOhT|87(e!FͨQ8Y`  U7DZPLO+l (Ԧ'S1 ܘ->,aYC<>/Q8"z UVu SΕ´+$ѓܡTP8C1H($+Ř? 6Aeo6ܙwfgGd='[9d^+a!<,7hs $ @켛p6mi(M0"58::i.:+OL(ա{֢ii/ K3r[+/TeiD$[B CGNg~4J:LH %3NH.Pc@H`۱P&JfL[iyqniiKe{rahWYrҗDjCh),uatP*?$!% iPO=yzGYE E+kY|Ji&Ɔ+HѬTUQj@@RJzl綇 &:1B[|~|%(@