From 5a32a8491df9d81d54c3eb12e7b86abac7091bba Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 18 Feb 2003 05:08:09 +0000 Subject: We don't use mkproto stuff for the python extensions anymore. (This used to be commit 8d166ae093655a5a14a7478c7a84474b43e8ee97) --- source3/Makefile.in | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index c3b70f9986..bd41d9636c 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1067,35 +1067,6 @@ PYTHON_OBJS = $(LIB_OBJ) $(LIBSMB_OBJ) $(RPC_PARSE_OBJ) $(UBIQX_OBJ) \ $(PARAM_OBJ) $(LIBMSRPC_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \ $(SECRETS_OBJ) $(KRBCLIENT_OBJ) -PY_SPOOLSS_PROTO_OBJ = python/py_spoolss.o \ - python/py_spoolss_printers.o python/py_spoolss_printers_conv.o\ - python/py_spoolss_forms.o python/py_spoolss_forms_conv.o \ - python/py_spoolss_ports.o python/py_spoolss_ports_conv.o \ - python/py_spoolss_drivers.o python/py_spoolss_drivers_conv.o \ - python/py_spoolss_jobs.o python/py_spoolss_jobs_conv.o \ - python/py_spoolss_printerdata.o - -PY_LSA_PROTO_OBJ = python/py_lsa.o - -PY_COMMON_PROTO_OBJ = python/py_common.c python/py_ntsec.c - -python_proto: python_spoolss_proto python_lsa_proto python_common_proto - -python_spoolss_proto: - @cd $(srcdir) && $(SHELL) script/mkproto.sh $(AWK) \ - -h _PY_SPOOLSS_PROTO_H python/py_spoolss_proto.h \ - $(PY_SPOOLSS_PROTO_OBJ) - -python_lsa_proto: - @cd $(srcdir) && $(SHELL) script/mkproto.sh $(AWK) \ - -h _PY_LSA_PROTO_H python/py_lsa_proto.h \ - $(PY_LSA_PROTO_OBJ) - -python_common_proto: - @cd $(srcdir) && $(SHELL) script/mkproto.sh $(AWK) \ - -h _PY_COMMON_PROTO_H python/py_common_proto.h \ - $(PY_COMMON_PROTO_OBJ) - python_ext: $(PYTHON_OBJS) @if test -z "$(PYTHON)"; then \ echo Use the option --with-python to configure python; \ -- cgit From 030beddfb3c5208256c08b3cd2620332113f6308 Mon Sep 17 00:00:00 2001 From: Rafal Szczesniak Date: Tue, 18 Feb 2003 14:59:21 +0000 Subject: Fix of two warnings. pull_ucs2_talloc function takes char** pointer, not (here explicitly casted) void** one. Rafal (This used to be commit e77c44efd95d42a8194f5c3d36c043f8e84dfd1d) --- source3/libads/ldap_printer.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/source3/libads/ldap_printer.c b/source3/libads/ldap_printer.c index 87ea058896..f5cd4f2885 100644 --- a/source3/libads/ldap_printer.c +++ b/source3/libads/ldap_printer.c @@ -85,8 +85,7 @@ static BOOL map_sz(TALLOC_CTX *ctx, ADS_MODLIST *mods, return False; if (value->size && *((smb_ucs2_t *) value->data_p)) { - pull_ucs2_talloc(ctx, (void **) &str_value, - (const smb_ucs2_t *) value->data_p); + pull_ucs2_talloc(ctx, &str_value, (const smb_ucs2_t *) value->data_p); status = ads_mod_str(ctx, mods, value->valuename, str_value); return ADS_ERR_OK(status); } @@ -155,9 +154,8 @@ static BOOL map_multi_sz(TALLOC_CTX *ctx, ADS_MODLIST *mods, cur_str = (smb_ucs2_t *) value->data_p; for (i=0; i < num_vals; i++) - cur_str += pull_ucs2_talloc(ctx, - (void **) &str_values[i], - cur_str); + cur_str += pull_ucs2_talloc(ctx, &str_values[i], + cur_str); status = ads_mod_strlist(ctx, mods, value->valuename, (const char **) str_values); -- cgit From c536b88b2b71c264a1e31ada51e463fee5cb949b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 18:34:48 +0000 Subject: Use the new modules stuff to load dynrpc modules. Basically this means: - calling the initialization function in the module init_module() instead of rpc_pipe_init() - calling smb_load_module() to do the dlopen(), dlsym() and init_module() calls I'll merge this to 3.0, together with the smb_load_module() function. Discussed with Anthony. (This used to be commit 3757ed8df06ca2b306bef336bdb9c7671f5e6a65) --- source3/rpc_server/srv_dfs.c | 2 +- source3/rpc_server/srv_lsa.c | 2 +- source3/rpc_server/srv_netlog.c | 2 +- source3/rpc_server/srv_pipe.c | 31 ++++++------------------------- source3/rpc_server/srv_reg.c | 2 +- source3/rpc_server/srv_samr.c | 2 +- source3/rpc_server/srv_spoolss.c | 2 +- source3/rpc_server/srv_srvsvc.c | 2 +- source3/rpc_server/srv_wkssvc.c | 2 +- 9 files changed, 14 insertions(+), 33 deletions(-) diff --git a/source3/rpc_server/srv_dfs.c b/source3/rpc_server/srv_dfs.c index f6e9ca3d56..14c1cb4088 100644 --- a/source3/rpc_server/srv_dfs.c +++ b/source3/rpc_server/srv_dfs.c @@ -159,7 +159,7 @@ static BOOL api_dfs_enum(pipes_struct *p) ********************************************************************/ #ifdef RPC_DFS_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_dfs_init(void) #endif diff --git a/source3/rpc_server/srv_lsa.c b/source3/rpc_server/srv_lsa.c index fad8f5641a..0e4039326b 100644 --- a/source3/rpc_server/srv_lsa.c +++ b/source3/rpc_server/srv_lsa.c @@ -772,7 +772,7 @@ static BOOL api_lsa_remove_acct_rights(pipes_struct *p) ***************************************************************************/ #ifdef RPC_LSA_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_lsa_init(void) #endif diff --git a/source3/rpc_server/srv_netlog.c b/source3/rpc_server/srv_netlog.c index f377d3952b..c9e4fc1b1f 100644 --- a/source3/rpc_server/srv_netlog.c +++ b/source3/rpc_server/srv_netlog.c @@ -322,7 +322,7 @@ static BOOL api_net_logon_ctrl(pipes_struct *p) ********************************************************************/ #ifdef RPC_NETLOG_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_net_init(void) #endif diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c index 50127005a1..0b8b7b229a 100644 --- a/source3/rpc_server/srv_pipe.c +++ b/source3/rpc_server/srv_pipe.c @@ -794,42 +794,23 @@ int rpc_pipe_register_commands(const char *clnt, const char *srv, const struct a /******************************************************************* Register commands to an RPC pipe *******************************************************************/ -int rpc_load_module(const char *module) +NTSTATUS rpc_load_module(const char *module) { -#ifdef HAVE_DLOPEN - void *handle; - int (*module_init)(void); pstring full_path; - char *error; + NTSTATUS status; pstrcpy(full_path, lib_path("rpc")); pstrcat(full_path, "/librpc_"); pstrcat(full_path, module); pstrcat(full_path, "."); pstrcat(full_path, shlib_ext()); - - handle = sys_dlopen(full_path, RTLD_LAZY); - if (!handle) { + + if (!NT_STATUS_IS_OK(status = smb_load_module(full_path))) { DEBUG(0, ("Could not load requested pipe %s as %s\n", module, full_path)); - DEBUG(0, (" Error: %s\n", dlerror())); - return 0; } - DEBUG(3, ("Module '%s' loaded\n", full_path)); - - module_init = sys_dlsym(handle, "rpc_pipe_init"); - if ((error = sys_dlerror()) != NULL) { - DEBUG(0, ("Error trying to resolve symbol 'rpc_pipe_init' in %s: %s\n", - full_path, error)); - return 0; - } - - return module_init(); -#else - DEBUG(0,("Attempting to load a dynamic RPC pipe when dlopen isn't available\n")); - return 0; -#endif + return status; } /******************************************************************* @@ -877,7 +858,7 @@ BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p) } } - if (!api_fd_commands[i].name && !rpc_load_module(p->name)) { + if (!api_fd_commands[i].name && !NT_STATUS_IS_OK(rpc_load_module(p->name))) { DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n", p->name )); if(!setup_bind_nak(p)) diff --git a/source3/rpc_server/srv_reg.c b/source3/rpc_server/srv_reg.c index 04960f8e3a..8fc1d42b2f 100644 --- a/source3/rpc_server/srv_reg.c +++ b/source3/rpc_server/srv_reg.c @@ -374,7 +374,7 @@ static BOOL api_reg_save_key(pipes_struct *p) ********************************************************************/ #ifdef RPC_REG_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_reg_init(void) #endif diff --git a/source3/rpc_server/srv_samr.c b/source3/rpc_server/srv_samr.c index 3a31ec82e1..b75195ceef 100644 --- a/source3/rpc_server/srv_samr.c +++ b/source3/rpc_server/srv_samr.c @@ -1444,7 +1444,7 @@ static BOOL api_samr_set_dom_info(pipes_struct *p) ********************************************************************/ #ifdef RPC_SAMR_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_samr_init(void) #endif diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c index 5832ae876b..3023922a5b 100755 --- a/source3/rpc_server/srv_spoolss.c +++ b/source3/rpc_server/srv_spoolss.c @@ -1581,7 +1581,7 @@ static BOOL api_spoolss_replycloseprinter(pipes_struct *p) ********************************************************************/ #ifdef RPC_SPOOLSS_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_spoolss_init(void) #endif diff --git a/source3/rpc_server/srv_srvsvc.c b/source3/rpc_server/srv_srvsvc.c index 983c660965..7c5e317c87 100644 --- a/source3/rpc_server/srv_srvsvc.c +++ b/source3/rpc_server/srv_srvsvc.c @@ -527,7 +527,7 @@ static BOOL api_srv_net_file_set_secdesc(pipes_struct *p) ********************************************************************/ #ifdef RPC_SVC_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_srv_init(void) #endif diff --git a/source3/rpc_server/srv_wkssvc.c b/source3/rpc_server/srv_wkssvc.c index 1fed2cc6db..e0d662ea80 100644 --- a/source3/rpc_server/srv_wkssvc.c +++ b/source3/rpc_server/srv_wkssvc.c @@ -61,7 +61,7 @@ static BOOL api_wks_query_info(pipes_struct *p) ********************************************************************/ #ifdef RPC_WKS_DYNAMIC -int rpc_pipe_init(void) +int init_module(void) #else int rpc_wks_init(void) #endif -- cgit From 5eb7b6113b8d4b59de5177e8b1485dc0c3ae19db Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 18:43:59 +0000 Subject: Add -V option (to print out version) to utilities where possible (pdbedit already has a -V option..) (This used to be commit 5de622968d95c1436dbd34edc8d0a9bbff68916b) --- source3/Makefile.in | 2 +- source3/nsswitch/wbinfo.c | 1 + source3/rpcclient/rpcclient.c | 1 + source3/rpcclient/samsync.c | 1 + source3/torture/samtest.c | 1 + source3/torture/vfstest.c | 1 + source3/utils/net.c | 1 + source3/utils/ntlm_auth.c | 1 + source3/utils/status.c | 1 + 9 files changed, 9 insertions(+), 1 deletion(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index bd41d9636c..e04550cf21 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -597,7 +597,7 @@ WINBINDD_OBJ = \ $(PROFILE_OBJ) $(UNIGRP_OBJ) \ $(SECRETS_OBJ) $(LIBADS_OBJ) $(KRBCLIENT_OBJ) -WBINFO_OBJ = nsswitch/wbinfo.o libsmb/smbencrypt.o libsmb/smbdes.o +WBINFO_OBJ = nsswitch/wbinfo.o libsmb/smbencrypt.o libsmb/smbdes.o $(POPT_LIB_OBJ) WINBIND_NSS_OBJ = nsswitch/winbind_nss.o nsswitch/wb_common.o @WINBIND_NSS_EXTRA_OBJS@ diff --git a/source3/nsswitch/wbinfo.c b/source3/nsswitch/wbinfo.c index f03b0493de..68dc178bcd 100644 --- a/source3/nsswitch/wbinfo.c +++ b/source3/nsswitch/wbinfo.c @@ -711,6 +711,7 @@ int main(int argc, char **argv) { "set-auth-user", 'A', POPT_ARG_STRING, &string_arg, OPT_SET_AUTH_USER, "Store user and password used by winbindd (root only)", "user%password" }, { "get-auth-user", 0, POPT_ARG_NONE, NULL, OPT_GET_AUTH_USER, "Retrieve user and password used by winbindd (root only)", NULL }, { "ping", 'p', POPT_ARG_NONE, 0, 'p', "'ping' winbindd to see if it is alive" }, + { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { 0, 0, 0, 0 } }; diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index 81bb62486a..37ce597d4e 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -585,6 +585,7 @@ out_free: {"dest-ip", 'I', POPT_ARG_STRING, &opt_ipaddr, 'I', "Specify destination IP address", "IP"}, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_configfile }, + { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { NULL } }; diff --git a/source3/rpcclient/samsync.c b/source3/rpcclient/samsync.c index f941d70e5e..a4061d2a87 100644 --- a/source3/rpcclient/samsync.c +++ b/source3/rpcclient/samsync.c @@ -632,6 +632,7 @@ struct poptOption popt_common_interactive[] = { "Replicate SAM changes" }, { "serial", 0, POPT_ARG_INT, &serial, 0, "SAM serial number" }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug }, + { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_auth_info }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_interactive }, POPT_AUTOHELP diff --git a/source3/torture/samtest.c b/source3/torture/samtest.c index 17444c0757..a1ccec098b 100644 --- a/source3/torture/samtest.c +++ b/source3/torture/samtest.c @@ -369,6 +369,7 @@ int main(int argc, char *argv[]) {"command", 'e', POPT_ARG_STRING, &cmdstr, 'e', "Execute semicolon seperated cmds"}, {"logfile", 'l', POPT_ARG_STRING, &opt_logfile, 'l', "Logfile to use instead of stdout"}, {"configfile", 'c', POPT_ARG_STRING, &config_file, 0,"use different configuration file",NULL}, + { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { 0, 0, 0, 0} }; diff --git a/source3/torture/vfstest.c b/source3/torture/vfstest.c index 78d22a07ac..fef189844b 100644 --- a/source3/torture/vfstest.c +++ b/source3/torture/vfstest.c @@ -495,6 +495,7 @@ int main(int argc, char *argv[]) {"command", 'c', POPT_ARG_STRING, &cmdstr, 0, "Execute specified list of commands" }, {"logfile", 'l', POPT_ARG_STRING, &opt_logfile, 'l', "Write output to specified logfile" }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug }, + { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { 0, 0, 0, 0} }; diff --git a/source3/utils/net.c b/source3/utils/net.c index 33195375f5..ada0ed53e1 100644 --- a/source3/utils/net.c +++ b/source3/utils/net.c @@ -537,6 +537,7 @@ static struct functable net_func[] = { {"timeout", 't', POPT_ARG_INT, &opt_timeout}, {"machine-pass",'P', POPT_ARG_NONE, &opt_machine_pass}, {"debuglevel", 'd', POPT_ARG_STRING, &debuglevel}, + {NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { 0, 0, 0, 0} }; diff --git a/source3/utils/ntlm_auth.c b/source3/utils/ntlm_auth.c index 9e4318def3..b76308c55f 100644 --- a/source3/utils/ntlm_auth.c +++ b/source3/utils/ntlm_auth.c @@ -466,6 +466,7 @@ int main(int argc, const char **argv) { "password", 0, POPT_ARG_STRING, &password, OPT_PASSWORD, "User's plaintext password"}, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_configfile }, + { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { 0, 0, 0, 0 } }; diff --git a/source3/utils/status.c b/source3/utils/status.c index 094dc0ff1c..8014b133d9 100644 --- a/source3/utils/status.c +++ b/source3/utils/status.c @@ -560,6 +560,7 @@ static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, vo #endif /* WITH_PROFILE */ {"byterange", 'B', POPT_ARG_NONE, &show_brl, 'B', "Include byte range locks"}, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug }, + { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_configfile }, { 0, 0, 0, 0} }; -- cgit From e657bccd25a33a7382c0a9a355b37c8dd3c1d536 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 20:12:20 +0000 Subject: Update introduction (This used to be commit 46c99ff855ba273568785f118cd19a2788430c1e) --- docs/docbook/projdoc/passdb.sgml | 102 ++++++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 38 deletions(-) diff --git a/docs/docbook/projdoc/passdb.sgml b/docs/docbook/projdoc/passdb.sgml index e058439388..4e0ee93a55 100644 --- a/docs/docbook/projdoc/passdb.sgml +++ b/docs/docbook/projdoc/passdb.sgml @@ -37,18 +37,32 @@ Introduction + + Old windows clients send plain text passwords over the wire. + Samba can check these passwords by crypting them and comparing them + to the hash stored in the unix user database. + - Newer windows clients send encrypted passwords over + + Newer windows clients send encrypted passwords (so-called + Lanman and NT hashes) over the wire, instead of plain text passwords. The newest clients will only send encrypted passwords and refuse to send plain text - passwords, unless their registry is tweaked. + passwords, unless their registry is tweaked. + These passwords can't be converted to unix style encrypted passwords. Because of that you can't use the standard unix user database, and you have to store the Lanman and NT hashes - somewhere else. Also, windows stores some data for each user - that is not stored by unix. Thus, samba has it's own user database. - This user database is maintained by a "passdb backend". Commonly + somewhere else. + + Next to a differently encrypted passwords, + windows also stores certain data for each user + that is not stored in a unix user database, e.g. + workstations the user may logon from, the location where his/her + profile is stored, etc. + Samba retrieves and stores this information using a "passdb backend". + Commonly available backends are LDAP, plain text file, MySQL and nisplus. For more information, see the documentation about the passdb backend = parameter. @@ -68,7 +82,8 @@ password from them, but they could potentially be used in a modified client to gain access to a server. This would require considerable technical knowledge on behalf of the attacker but is perfectly possible. - You should thus treat the smbpasswd file as though it contained the + You should thus treat the data stored in whatever + passdb backend you use (smbpasswd file, ldap, mysql) as though it contained the cleartext passwords of all your users. Its contents must be kept secret, and the file should be protected accordingly. @@ -89,17 +104,17 @@ Other Microsoft operating systems which also exhibit this behavior includes - - MS DOS Network client 3.0 with - the basic network redirector installed + + MS DOS Network client 3.0 with + the basic network redirector installed - Windows 95 with the network redirector - update installed + Windows 95 with the network redirector + update installed - Windows 98 [se] + Windows 98 [se] - Windows 2000 - + Windows 2000 + Note :All current release of Microsoft SMB/CIFS clients support authentication via the @@ -111,38 +126,37 @@ Advantages of SMB Encryption - - plain text passwords are not passed across + + plain text passwords are not passed across the network. Someone using a network sniffer cannot just - record passwords going to the SMB server. - + record passwords going to the SMB server. - WinNT doesn't like talking to a server + WinNT doesn't like talking to a server that isn't using SMB encrypted passwords. It will refuse to browse the server if the server is also in user level security mode. It will insist on prompting the user for the password on each connection, which is very annoying. The only things you can do to stop this is to use SMB encryption. - - + + Advantages of non-encrypted passwords - - plain text passwords are not kept - on disk. + + plain text passwords are not kept + on disk. - uses same password file as other unix - services such as login and ftp + uses same password file as other unix + services such as login and ftp - you are probably already using other + you are probably already using other services (such as telnet and ftp) which send plain text passwords over the net, so sending them for SMB isn't - such a big deal. - + such a big deal. + @@ -150,17 +164,16 @@ The smbpasswd Command - The smbpasswd command maintains the two 32 byte password fields - in the smbpasswd file. If you wish to make it similar to the unix - passwd or yppasswd programs, - install it in /usr/local/samba/bin/ (or your - main Samba binary directory). FIXME + The smbpasswd utility is a utility similar to the + passwd or yppasswd programs. + It maintains the two 32 byte password fields + in the passdb backend. - smbpasswd now works in a client-server mode + smbpasswd works in a client-server mode where it contacts the local smbd to change the user's password on its behalf. This has enormous benefits - as follows. - smbpasswd now has the capability + smbpasswd has the capability to change passwords on Windows NT servers (this only works when the request is sent to the NT Primary Domain Controller if you are changing an NT Domain user's password). @@ -205,7 +218,20 @@ FIXME Plain text -FIXME + +Older versions of samba retrieved user information from the unix user database +and eventually some other fields from the file /etc/samba/smbpasswd +or /etc/smbpasswd. When password encryption is disabled, no +data is stored at all. + + + + +TDB +Samba can also store the user data in a "TDB" (Trivial Database). Using this backend +doesn't require any additional configuration. This backend is recommended for new installations who +don't require LDAP. + @@ -759,7 +785,7 @@ ntPassword: 878D8014606CDA29677A44EFA1353FC7 -Passdb MySQL plugin +MySQL Building -- cgit From 9c6a290512c7a326cbc437b058c229a88dd6fad7 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 21:12:28 +0000 Subject: Move all password database stuff to one document - hope this makes it somewhat more understandable for the user. Comments are welcome! (This used to be commit 847d05085147431de923c735b7ab6ea752e592c2) --- docs/docbook/projdoc/ENCRYPTION.sgml | 189 --------- docs/docbook/projdoc/Samba-LDAP-HOWTO.sgml | 593 ----------------------------- docs/docbook/projdoc/pdb_mysql.sgml | 159 -------- docs/docbook/projdoc/pdb_xml.sgml | 42 -- docs/docbook/projdoc/samba-doc.sgml | 10 +- 5 files changed, 2 insertions(+), 991 deletions(-) delete mode 100644 docs/docbook/projdoc/ENCRYPTION.sgml delete mode 100644 docs/docbook/projdoc/Samba-LDAP-HOWTO.sgml delete mode 100644 docs/docbook/projdoc/pdb_mysql.sgml delete mode 100644 docs/docbook/projdoc/pdb_xml.sgml diff --git a/docs/docbook/projdoc/ENCRYPTION.sgml b/docs/docbook/projdoc/ENCRYPTION.sgml deleted file mode 100644 index f903d7d334..0000000000 --- a/docs/docbook/projdoc/ENCRYPTION.sgml +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - JeremyAllison - - Samba Team -
- jra@samba.org -
-
-
- - - JelmerVernooij - - Samba Team -
- jelmer@samba.org -
-
-
- - 4 November 2002 -
- -LanMan and NT Password Encryption in Samba - - - - Introduction - - Newer windows clients send encrypted passwords over - the wire, instead of plain text passwords. The newest clients - will only send encrypted passwords and refuse to send plain text - passwords, unless their registry is tweaked. - - These passwords can't be converted to unix style encrypted - passwords. Because of that you can't use the standard unix - user database, and you have to store the Lanman and NT hashes - somewhere else. For more information, see the documentation - about the passdb backend = parameter. - - - - - - Important Notes About Security - - The unix and SMB password encryption techniques seem similar - on the surface. This similarity is, however, only skin deep. The unix - scheme typically sends clear text passwords over the network when - logging in. This is bad. The SMB encryption scheme never sends the - cleartext password over the network but it does store the 16 byte - hashed values on disk. This is also bad. Why? Because the 16 byte hashed - values are a "password equivalent". You cannot derive the user's - password from them, but they could potentially be used in a modified - client to gain access to a server. This would require considerable - technical knowledge on behalf of the attacker but is perfectly possible. - You should thus treat the smbpasswd file as though it contained the - cleartext passwords of all your users. Its contents must be kept - secret, and the file should be protected accordingly. - - Ideally we would like a password scheme which neither requires - plain text passwords on the net or on disk. Unfortunately this - is not available as Samba is stuck with being compatible with - other SMB systems (WinNT, WfWg, Win95 etc). - - - Note that Windows NT 4.0 Service pack 3 changed the - default for permissible authentication so that plaintext - passwords are never sent over the wire. - The solution to this is either to switch to encrypted passwords - with Samba or edit the Windows NT registry to re-enable plaintext - passwords. See the document WinNT.txt for details on how to do - this. - - Other Microsoft operating systems which also exhibit - this behavior includes - - - MS DOS Network client 3.0 with - the basic network redirector installed - - Windows 95 with the network redirector - update installed - - Windows 98 [se] - - Windows 2000 - - - Note :All current release of - Microsoft SMB/CIFS clients support authentication via the - SMB Challenge/Response mechanism described here. Enabling - clear text authentication does not disable the ability - of the client to participate in encrypted authentication. - - - - Advantages of SMB Encryption - - - plain text passwords are not passed across - the network. Someone using a network sniffer cannot just - record passwords going to the SMB server. - - - WinNT doesn't like talking to a server - that isn't using SMB encrypted passwords. It will refuse - to browse the server if the server is also in user level - security mode. It will insist on prompting the user for the - password on each connection, which is very annoying. The - only things you can do to stop this is to use SMB encryption. - - - - - - - Advantages of non-encrypted passwords - - - plain text passwords are not kept - on disk. - - uses same password file as other unix - services such as login and ftp - - you are probably already using other - services (such as telnet and ftp) which send plain text - passwords over the net, so sending them for SMB isn't - such a big deal. - - - - - - - The smbpasswd Command - - The smbpasswd command maintains the two 32 byte password fields - in the smbpasswd file. If you wish to make it similar to the unix - passwd or yppasswd programs, - install it in /usr/local/samba/bin/ (or your - main Samba binary directory). - - smbpasswd now works in a client-server mode - where it contacts the local smbd to change the user's password on its - behalf. This has enormous benefits - as follows. - - smbpasswd now has the capability - to change passwords on Windows NT servers (this only works when - the request is sent to the NT Primary Domain Controller if you - are changing an NT Domain user's password). - - To run smbpasswd as a normal user just type : - - $ smbpasswd - Old SMB password: <type old value here - - or hit return if there was no old password> - New SMB Password: <type new value> - - Repeat New SMB Password: <re-type new value - - - If the old value does not match the current value stored for - that user, or the two new values do not match each other, then the - password will not be changed. - - If invoked by an ordinary user it will only allow the user - to change his or her own Samba password. - - If run by the root user smbpasswd may take an optional - argument, specifying the user name whose SMB password you wish to - change. Note that when run as root smbpasswd does not prompt for - or check the old password value, thus allowing root to set passwords - for users who have forgotten their passwords. - - smbpasswd is designed to work in the same way - and be familiar to UNIX users who use the passwd or - yppasswd commands. - - For more details on using smbpasswd refer - to the man page which will always be the definitive reference. - - -
diff --git a/docs/docbook/projdoc/Samba-LDAP-HOWTO.sgml b/docs/docbook/projdoc/Samba-LDAP-HOWTO.sgml deleted file mode 100644 index f294ddd1ff..0000000000 --- a/docs/docbook/projdoc/Samba-LDAP-HOWTO.sgml +++ /dev/null @@ -1,593 +0,0 @@ - - - - - Gerald (Jerry)Carter - - Samba Team -
jerry@samba.org
-
- Olivier (lem)Lemaire - - IDEALX -
olem@IDEALX.org
-
-
- - - (13 Jan 2002) -
- -Storing Samba's User/Machine Account information in an LDAP Directory - - -Purpose - - -This document describes how to use an LDAP directory for storing Samba user -account information traditionally stored in the smbpasswd(5) file. It is -assumed that the reader already has a basic understanding of LDAP concepts -and has a working directory server already installed. For more information -on LDAP architectures and Directories, please refer to the following sites. - - - - OpenLDAP - http://www.openldap.org/ - iPlanet Directory Server - http://iplanet.netscape.com/directory - - - -Note that O'Reilly Publishing is working on -a guide to LDAP for System Administrators which has a planned release date of -early summer, 2002. - - - -Two additional Samba resources which may prove to be helpful are - - - - The Samba-PDC-LDAP-HOWTO - maintained by Ignacio Coupeau. - - The NT migration scripts from IDEALX that are - geared to manage users and group in such a Samba-LDAP Domain Controller configuration. - - - - - - - -Introduction - - -Traditionally, when configuring "encrypt -passwords = yes" in Samba's smb.conf file, user account -information such as username, LM/NT password hashes, password change times, and account -flags have been stored in the smbpasswd(5) file. There are several -disadvantages to this approach for sites with very large numbers of users (counted -in the thousands). - - - - -The first is that all lookups must be performed sequentially. Given that -there are approximately two lookups per domain logon (one for a normal -session connection such as when mapping a network drive or printer), this -is a performance bottleneck for lareg sites. What is needed is an indexed approach -such as is used in databases. - - - -The second problem is that administrators who desired to replicate a -smbpasswd file to more than one Samba server were left to use external -tools such as rsync(1) and ssh(1) -and wrote custom, in-house scripts. - - - -And finally, the amount of information which is stored in an -smbpasswd entry leaves no room for additional attributes such as -a home directory, password expiration time, or even a Relative -Identified (RID). - - - - -As a result of these defeciencies, a more robust means of storing user attributes -used by smbd was developed. The API which defines access to user accounts -is commonly referred to as the samdb interface (previously this was called the passdb -API, and is still so named in the CVS trees). In Samba 2.2.3, enabling support -for a samdb backend (e.g. --with-ldapsam or ---with-tdbsam) requires compile time support. - - - -When compiling Samba to include the --with-ldapsam autoconf -option, smbd (and associated tools) will store and lookup user accounts in -an LDAP directory. In reality, this is very easy to understand. If you are -comfortable with using an smbpasswd file, simply replace "smbpasswd" with -"LDAP directory" in all the documentation. - - - -There are a few points to stress about what the --with-ldapsam -does not provide. The LDAP support referred to in the this documentation does not -include: - - - - A means of retrieving user account information from - an Windows 2000 Active Directory server. - A means of replacing /etc/passwd. - - - -The second item can be accomplished by using LDAP NSS and PAM modules. LGPL -versions of these libraries can be obtained from PADL Software -(http://www.padl.com/). However, -the details of configuring these packages are beyond the scope of this document. - - - - - -Supported LDAP Servers - - -The LDAP samdb code in 2.2.3 has been developed and tested using the OpenLDAP -2.0 server and client libraries. The same code should be able to work with -Netscape's Directory Server and client SDK. However, due to lack of testing -so far, there are bound to be compile errors and bugs. These should not be -hard to fix. If you are so inclined, please be sure to forward all patches to -samba-patches@samba.org and -jerry@samba.org. - - - - - - - - -Schema and Relationship to the RFC 2307 posixAccount - - - -Samba 2.2.3 includes the necessary schema file for OpenLDAP 2.0 in -examples/LDAP/samba.schema. (Note that this schema -file has been modified since the experimental support initially included -in 2.2.2). The sambaAccount objectclass is given here: - - - -objectclass ( 1.3.1.5.1.4.1.7165.2.2.2 NAME 'sambaAccount' SUP top STRUCTURAL - DESC 'Samba Account' - MUST ( uid $ rid ) - MAY ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $ - logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $ - displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $ - description $ userWorkstations $ primaryGroupID $ domain )) - - - -The samba.schema file has been formatted for OpenLDAP 2.0. The OID's are -owned by the Samba Team and as such is legal to be openly published. -If you translate the schema to be used with Netscape DS, please -submit the modified schema file as a patch to jerry@samba.org - - - -Just as the smbpasswd file is mean to store information which supplements a -user's /etc/passwd entry, so is the sambaAccount object -meant to supplement the UNIX user account information. A sambaAccount is a -STRUCTURAL objectclass so it can be stored individually -in the directory. However, there are several fields (e.g. uid) which overlap -with the posixAccount objectclass outlined in RFC2307. This is by design. - - - - - -In order to store all user account information (UNIX and Samba) in the directory, -it is necessary to use the sambaAccount and posixAccount objectclasses in -combination. However, smbd will still obtain the user's UNIX account -information via the standard C library calls (e.g. getpwnam(), et. al.). -This means that the Samba server must also have the LDAP NSS library installed -and functioning correctly. This division of information makes it possible to -store all Samba account information in LDAP, but still maintain UNIX account -information in NIS while the network is transitioning to a full LDAP infrastructure. - - - - -Configuring Samba with LDAP - - - -OpenLDAP configuration - - -To include support for the sambaAccount object in an OpenLDAP directory -server, first copy the samba.schema file to slapd's configuration directory. - - - -root# cp samba.schema /etc/openldap/schema/ - - - -Next, include the samba.schema file in slapd.conf. -The sambaAccount object contains two attributes which depend upon other schema -files. The 'uid' attribute is defined in cosine.schema and -the 'displayName' attribute is defined in the inetorgperson.schema -file. Both of these must be included before the samba.schema file. - - - -## /etc/openldap/slapd.conf - -## schema files (core.schema is required by default) -include /etc/openldap/schema/core.schema - -## needed for sambaAccount -include /etc/openldap/schema/cosine.schema -include /etc/openldap/schema/inetorgperson.schema -include /etc/openldap/schema/samba.schema - -## uncomment this line if you want to support the RFC2307 (NIS) schema -## include /etc/openldap/schema/nis.schema - -.... - - - -It is recommended that you maintain some indices on some of the most usefull attributes, -like in the following example, to speed up searches made on sambaAccount objectclasses -(and possibly posixAccount and posixGroup as well). - - -# Indices to maintain -## required by OpenLDAP 2.0 -index objectclass eq - -## support pb_getsampwnam() -index uid pres,eq -## support pdb_getsambapwrid() -index rid eq - -## uncomment these if you are storing posixAccount and -## posixGroup entries in the directory as well -##index uidNumber eq -##index gidNumber eq -##index cn eq -##index memberUid eq - - - - - -Configuring Samba - - - -The following parameters are available in smb.conf only with --with-ldapsam -was included with compiling Samba. - - - - ldap ssl - ldap server - ldap admin dn - ldap suffix - ldap filter - ldap port - - - -These are described in the smb.conf(5) man -page and so will not be repeated here. However, a sample smb.conf file for -use with an LDAP directory could appear as - - - -## /usr/local/samba/lib/smb.conf -[global] - security = user - encrypt passwords = yes - - netbios name = TASHTEGO - workgroup = NARNIA - - # ldap related parameters - - # define the DN to use when binding to the directory servers - # The password for this DN is not stored in smb.conf. Rather it - # must be set by using 'smbpasswd -w secretpw' to store the - # passphrase in the secrets.tdb file. If the "ldap admin dn" values - # changes, this password will need to be reset. - ldap admin dn = "cn=Samba Manager,ou=people,dc=samba,dc=org" - - # specify the LDAP server's hostname (defaults to locahost) - ldap server = ahab.samba.org - - # Define the SSL option when connecting to the directory - # ('off', 'start tls', or 'on' (default)) - ldap ssl = start tls - - # define the port to use in the LDAP session (defaults to 636 when - # "ldap ssl = on") - ldap port = 389 - - # specify the base DN to use when searching the directory - ldap suffix = "ou=people,dc=samba,dc=org" - - # generally the default ldap search filter is ok - # ldap filter = "(&(uid=%u)(objectclass=sambaAccount))" - - - - - - - - -Accounts and Groups management - - -As users accounts are managed thru the sambaAccount objectclass, you should -modify you existing administration tools to deal with sambaAccount attributes. - - - -Machines accounts are managed with the sambaAccount objectclass, just -like users accounts. However, it's up to you to stored thoses accounts -in a different tree of you LDAP namespace: you should use -"ou=Groups,dc=plainjoe,dc=org" to store groups and -"ou=People,dc=plainjoe,dc=org" to store users. Just configure your -NSS and PAM accordingly (usually, in the /etc/ldap.conf configuration -file). - - - -In Samba release 2.2.3, the group management system is based on posix -groups. This meand that Samba make usage of the posixGroup objectclass. -For now, there is no NT-like group system management (global and local -groups). - - - - - -Security and sambaAccount - - - -There are two important points to remember when discussing the security -of sambaAccount entries in the directory. - - - - Never retrieve the lmPassword or - ntPassword attribute values over an unencrypted LDAP session. - Never allow non-admin users to - view the lmPassword or ntPassword attribute values. - - - -These password hashes are clear text equivalents and can be used to impersonate -the user without deriving the original clear text strings. For more information -on the details of LM/NT password hashes, refer to the ENCRYPTION chapter of the Samba-HOWTO-Collection. - - - -To remedy the first security issue, the "ldap ssl" smb.conf parameter defaults -to require an encrypted session (ldap ssl = on) using -the default port of 636 -when contacting the directory server. When using an OpenLDAP 2.0 server, it -is possible to use the use the StartTLS LDAP extended operation in the place of -LDAPS. In either case, you are strongly discouraged to disable this security -(ldap ssl = off). - - - -Note that the LDAPS protocol is deprecated in favor of the LDAPv3 StartTLS -extended operation. However, the OpenLDAP library still provides support for -the older method of securing communication between clients and servers. - - - -The second security precaution is to prevent non-administrative users from -harvesting password hashes from the directory. This can be done using the -following ACL in slapd.conf: - - - -## allow the "ldap admin dn" access, but deny everyone else -access to attrs=lmPassword,ntPassword - by dn="cn=Samba Admin,ou=people,dc=plainjoe,dc=org" write - by * none - - - - - - - - -LDAP specials attributes for sambaAccounts - - -The sambaAccount objectclass is composed of the following attributes: - - - - - lmPassword: the LANMAN password 16-byte hash stored as a character - representation of a hexidecimal string. - - ntPassword: the NT password hash 16-byte stored as a character - representation of a hexidecimal string. - - pwdLastSet: The integer time in seconds since 1970 when the - lmPassword and ntPassword attributes were last set. - - - acctFlags: string of 11 characters surrounded by square brackets [] - representing account flags such as U (user), W(workstation), X(no password expiration), and - D(disabled). - - logonTime: Integer value currently unused - - logoffTime: Integer value currently unused - - kickoffTime: Integer value currently unused - - pwdCanChange: Integer value currently unused - - pwdMustChange: Integer value currently unused - - homeDrive: specifies the drive letter to which to map the - UNC path specified by homeDirectory. The drive letter must be specified in the form "X:" - where X is the letter of the drive to map. Refer to the "logon drive" parameter in the - smb.conf(5) man page for more information. - - scriptPath: The scriptPath property specifies the path of - the user's logon script, .CMD, .EXE, or .BAT file. The string can be null. The path - is relative to the netlogon share. Refer to the "logon script" parameter in the - smb.conf(5) man page for more information. - - profilePath: specifies a path to the user's profile. - This value can be a null string, a local absolute path, or a UNC path. Refer to the - "logon path" parameter in the smb.conf(5) man page for more information. - - smbHome: The homeDirectory property specifies the path of - the home directory for the user. The string can be null. If homeDrive is set and specifies - a drive letter, homeDirectory should be a UNC path. The path must be a network - UNC path of the form \\server\share\directory. This value can be a null string. - Refer to the "logon home" parameter in the smb.conf(5) man page for more information. - - - userWorkstation: character string value currently unused. - - - rid: the integer representation of the user's relative identifier - (RID). - - primaryGroupID: the relative identifier (RID) of the primary group - of the user. - - - - -The majority of these parameters are only used when Samba is acting as a PDC of -a domain (refer to the Samba-PDC-HOWTO for details on -how to configure Samba as a Primary Domain Controller). The following four attributes -are only stored with the sambaAccount entry if the values are non-default values: - - - - smbHome - scriptPath - logonPath - homeDrive - - - -These attributes are only stored with the sambaAccount entry if -the values are non-default values. For example, assume TASHTEGO has now been -configured as a PDC and that logon home = \\%L\%u was defined in -its smb.conf file. When a user named "becky" logons to the domain, -the logon home string is expanded to \\TASHTEGO\becky. -If the smbHome attribute exists in the entry "uid=becky,ou=people,dc=samba,dc=org", -this value is used. However, if this attribute does not exist, then the value -of the logon home parameter is used in its place. Samba -will only write the attribute value to the directory entry is the value is -something other than the default (e.g. \\MOBY\becky). - - - - - - - - -Example LDIF Entries for a sambaAccount - - - -The following is a working LDIF with the inclusion of the posixAccount objectclass: - - - -dn: uid=guest2, ou=people,dc=plainjoe,dc=org -ntPassword: 878D8014606CDA29677A44EFA1353FC7 -pwdMustChange: 2147483647 -primaryGroupID: 1201 -lmPassword: 552902031BEDE9EFAAD3B435B51404EE -pwdLastSet: 1010179124 -logonTime: 0 -objectClass: sambaAccount -uid: guest2 -kickoffTime: 2147483647 -acctFlags: [UX ] -logoffTime: 2147483647 -rid: 19006 -pwdCanChange: 0 - - - -The following is an LDIF entry for using both the sambaAccount and -posixAccount objectclasses: - - - -dn: uid=gcarter, ou=people,dc=plainjoe,dc=org -logonTime: 0 -displayName: Gerald Carter -lmPassword: 552902031BEDE9EFAAD3B435B51404EE -primaryGroupID: 1201 -objectClass: posixAccount -objectClass: sambaAccount -acctFlags: [UX ] -userPassword: {crypt}BpM2ej8Rkzogo -uid: gcarter -uidNumber: 9000 -cn: Gerald Carter -loginShell: /bin/bash -logoffTime: 2147483647 -gidNumber: 100 -kickoffTime: 2147483647 -pwdLastSet: 1010179230 -rid: 19000 -homeDirectory: /home/tashtego/gcarter -pwdCanChange: 0 -pwdMustChange: 2147483647 -ntPassword: 878D8014606CDA29677A44EFA1353FC7 - - - - - - - - -Comments - - - -Please mail all comments regarding this HOWTO to jerry@samba.org. This documents was -last updated to reflect the Samba 2.2.3 release. - - - - - - - -
diff --git a/docs/docbook/projdoc/pdb_mysql.sgml b/docs/docbook/projdoc/pdb_mysql.sgml deleted file mode 100644 index 66c12a2339..0000000000 --- a/docs/docbook/projdoc/pdb_mysql.sgml +++ /dev/null @@ -1,159 +0,0 @@ - - - - JelmerVernooij - - The Samba Team -
jelmer@samba.org
-
-
- November 2002 -
- -Passdb MySQL plugin - - -Building - -To build the plugin, run make bin/pdb_mysql.so -in the source/ directory of samba distribution. - - -Next, copy pdb_mysql.so to any location you want. I -strongly recommend installing it in $PREFIX/lib or /usr/lib/samba/ - - - - -Creating the database - - -You either can set up your own table and specify the field names to pdb_mysql (see below -for the column names) or use the default table. The file examples/pdb/mysql/mysql.dump -contains the correct queries to create the required tables. Use the command : - -mysql -uusername -hhostname -ppassword databasename < /path/to/samba/examples/pdb/mysql/mysql.dump - - - - - -Configuring - -This plugin lacks some good documentation, but here is some short info: - -Add a the following to the passdb backend variable in your smb.conf: - -passdb backend = [other-plugins] plugin:/location/to/pdb_mysql.so:identifier [other-plugins] - - - -The identifier can be any string you like, as long as it doesn't collide with -the identifiers of other plugins or other instances of pdb_mysql. If you -specify multiple pdb_mysql.so entries in 'passdb backend', you also need to -use different identifiers! - - - -Additional options can be given thru the smb.conf file in the [global] section. - - - -identifier:mysql host - host name, defaults to 'localhost' -identifier:mysql password -identifier:mysql user - defaults to 'samba' -identifier:mysql database - defaults to 'samba' -identifier:mysql port - defaults to 3306 -identifier:table - Name of the table containing users - - - - -WARNING: since the password for the mysql user is stored in the -smb.conf file, you should make the the smb.conf file -readable only to the user that runs samba. This is considered a security -bug and will be fixed soon. - - -Names of the columns in this table(I've added column types those columns should have first): - - -identifier:logon time column - int(9) -identifier:logoff time column - int(9) -identifier:kickoff time column - int(9) -identifier:pass last set time column - int(9) -identifier:pass can change time column - int(9) -identifier:pass must change time column - int(9) -identifier:username column - varchar(255) - unix username -identifier:domain column - varchar(255) - NT domain user is part of -identifier:nt username column - varchar(255) - NT username -identifier:fullname column - varchar(255) - Full name of user -identifier:home dir column - varchar(255) - Unix homedir path -identifier:dir drive column - varchar(2) - Directory drive path (eg: 'H:') -identifier:logon script column - varchar(255) - Batch file to run on client side when logging on -identifier:profile path column - varchar(255) - Path of profile -identifier:acct desc column - varchar(255) - Some ASCII NT user data -identifier:workstations column - varchar(255) - Workstations user can logon to (or NULL for all) -identifier:unknown string column - varchar(255) - unknown string -identifier:munged dial column - varchar(255) - ? -identifier:uid column - int(9) - Unix user ID (uid) -identifier:gid column - int(9) - Unix user group (gid) -identifier:user sid column - varchar(255) - NT user SID -identifier:group sid column - varchar(255) - NT group ID -identifier:lanman pass column - varchar(255) - encrypted lanman password -identifier:nt pass column - varchar(255) - encrypted nt passwd -identifier:plain pass column - varchar(255) - plaintext password -identifier:acct control column - int(9) - nt user data -identifier:unknown 3 column - int(9) - unknown -identifier:logon divs column - int(9) - ? -identifier:hours len column - int(9) - ? -identifier:unknown 5 column - int(9) - unknown -identifier:unknown 6 column - int(9) - unknown - - - -Eventually, you can put a colon (:) after the name of each column, which -should specify the column to update when updating the table. You can also -specify nothing behind the colon - then the data from the field will not be -updated. - - - - - -Using plaintext passwords or encrypted password - - -I strongly discourage the use of plaintext passwords, however, you can use them: - - - -If you would like to use plaintext passwords, set 'identifier:lanman pass column' and 'identifier:nt pass column' to 'NULL' (without the quotes) and 'identifier:plain pass column' to the name of the column containing the plaintext passwords. - - - -If you use encrypted passwords, set the 'identifier:plain pass column' to 'NULL' (without the quotes). This is the default. - - - - - -Getting non-column data from the table - - -It is possible to have not all data in the database and making some 'constant'. - - - -For example, you can set 'identifier:fullname column' to : -CONCAT(First_name,' ',Sur_name) - - - -Or, set 'identifier:workstations column' to : -NULL - -See the MySQL documentation for more language constructs. - - -
diff --git a/docs/docbook/projdoc/pdb_xml.sgml b/docs/docbook/projdoc/pdb_xml.sgml deleted file mode 100644 index 87afb7b401..0000000000 --- a/docs/docbook/projdoc/pdb_xml.sgml +++ /dev/null @@ -1,42 +0,0 @@ - - - - JelmerVernooij - - The Samba Team -
jelmer@samba.org
-
-
- November 2002 -
- -Passdb XML plugin - - -Building - -This module requires libxml2 to be installed. - -To build pdb_xml, run: make bin/pdb_xml.so in -the directory source/. - - - - -Usage - -The usage of pdb_xml is pretty straightforward. To export data, use: - -pdbedit -e plugin:/usr/lib/samba/pdb_xml.so:filename - -(where filename is the name of the file to put the data in) - - - -To import data, use: -pdbedit -i plugin:/usr/lib/samba/pdb_xml.so:filename -e current-pdb - -Where filename is the name to read the data from and current-pdb to put it in. - - -
diff --git a/docs/docbook/projdoc/samba-doc.sgml b/docs/docbook/projdoc/samba-doc.sgml index e645a88f1d..e80b049fb7 100644 --- a/docs/docbook/projdoc/samba-doc.sgml +++ b/docs/docbook/projdoc/samba-doc.sgml @@ -1,6 +1,5 @@ - @@ -11,7 +10,6 @@ - @@ -22,8 +20,7 @@ - - + ]> @@ -81,7 +78,7 @@ PLEASE read this.
&UNIX-INSTALL; &BROWSING; &BROWSING-Quick; -&ENCRYPTION; +&Passdb; @@ -113,10 +110,7 @@ part each cover one specific feature.
&MS-Dfs-Setup; &PRINTER-DRIVER2; &WINBIND; -&pdb-mysql; -&pdb-xml; &VFS; -&Samba-LDAP; &CVS-Access; &GROUP-MAPPING-HOWTO; &SPEED; -- cgit From 7212d2be00b3d565751db8232de9c5affa1924e2 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 21:32:26 +0000 Subject: Use sgml syntax for warnings (This used to be commit 73def167a806d482472fcb137c64ee9fe4b6400c) --- docs/docbook/projdoc/passdb.sgml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/docbook/projdoc/passdb.sgml b/docs/docbook/projdoc/passdb.sgml index 4e0ee93a55..222b4010ab 100644 --- a/docs/docbook/projdoc/passdb.sgml +++ b/docs/docbook/projdoc/passdb.sgml @@ -842,13 +842,14 @@ identifier:mysql port - defaults to 3306 identifier:table - Name of the table containing users + - -WARNING: since the password for the mysql user is stored in the +Since the password for the mysql user is stored in the smb.conf file, you should make the the smb.conf file readable only to the user that runs samba. This is considered a security -bug and will be fixed soon. +bug and will be fixed soon. + Names of the columns in this table(I've added column types those columns should have first): -- cgit From 95e79295fd5ee1604d607028f0ca922afcffcdae Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 21:44:34 +0000 Subject: Few small cosmetic changes (This used to be commit a99e4bd2c0299851a1308158a50e24e69cab1158) --- docs/docbook/projdoc/CVS-Access.sgml | 2 +- docs/docbook/projdoc/NT_Security.sgml | 6 ------ docs/docbook/projdoc/Samba-PDC-HOWTO.sgml | 2 +- docs/docbook/projdoc/samba-doc.sgml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/docs/docbook/projdoc/CVS-Access.sgml b/docs/docbook/projdoc/CVS-Access.sgml index 98ef925f20..3c1adfd17a 100644 --- a/docs/docbook/projdoc/CVS-Access.sgml +++ b/docs/docbook/projdoc/CVS-Access.sgml @@ -12,7 +12,7 @@ (22 May 2001) -HOWTO Access Samba source code via CVS +Access Samba source code via CVS Introduction diff --git a/docs/docbook/projdoc/NT_Security.sgml b/docs/docbook/projdoc/NT_Security.sgml index 2259dae029..2843331519 100644 --- a/docs/docbook/projdoc/NT_Security.sgml +++ b/docs/docbook/projdoc/NT_Security.sgml @@ -31,12 +31,6 @@ the security of the UNIX host Samba is running on, and still obeys all the file permission rules that a Samba administrator can set. - - In Samba 2.0.4 and above the default value of the - parameter - nt acl support has been changed from - false to true, so - manipulation of permissions is turned on by default. diff --git a/docs/docbook/projdoc/Samba-PDC-HOWTO.sgml b/docs/docbook/projdoc/Samba-PDC-HOWTO.sgml index e6d6573924..c0be81d989 100644 --- a/docs/docbook/projdoc/Samba-PDC-HOWTO.sgml +++ b/docs/docbook/projdoc/Samba-PDC-HOWTO.sgml @@ -19,7 +19,7 @@ -How to Configure Samba as a NT4 Primary Domain Controller +Samba as a NT4 or Win2k Primary Domain Controller diff --git a/docs/docbook/projdoc/samba-doc.sgml b/docs/docbook/projdoc/samba-doc.sgml index e80b049fb7..54650f1ed9 100644 --- a/docs/docbook/projdoc/samba-doc.sgml +++ b/docs/docbook/projdoc/samba-doc.sgml @@ -76,7 +76,6 @@ and how to configure the parts of samba you will most likely need. PLEASE read this. &UNIX-INSTALL; -&BROWSING; &BROWSING-Quick; &Passdb; @@ -110,6 +109,7 @@ part each cover one specific feature. &MS-Dfs-Setup; &PRINTER-DRIVER2; &WINBIND; +&BROWSING; &VFS; &CVS-Access; &GROUP-MAPPING-HOWTO; -- cgit From 6b8c232c56f3ddd6e2de72ec3e166d82d544020c Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 21:49:00 +0000 Subject: Document -k (This used to be commit 44a862e55c426292f0226f5eec8719388d2c0de2) --- docs/docbook/manpages/smbclient.1.sgml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/docbook/manpages/smbclient.1.sgml b/docs/docbook/manpages/smbclient.1.sgml index 7e908e5d70..a08f6999e4 100644 --- a/docs/docbook/manpages/smbclient.1.sgml +++ b/docs/docbook/manpages/smbclient.1.sgml @@ -38,6 +38,7 @@ -R <name resolve order> -s <smb config file> -T<c|x>IXFqgbNan + -k @@ -587,6 +588,14 @@ domain = <value> This is particularly useful in scripts and for printing stdin to the server, e.g. -c 'print -'. + + + -k + + Try to authenticate with kerberos. Only useful in + an Active Directory environment. + + -- cgit From 4668623d62b3a7b133e26dd1397b956c4ddac335 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 21:50:31 +0000 Subject: Update to current status (This used to be commit 424cfccec2acb9a96538b67100915bfb00f84fd4) --- docs/docs-status | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/docs-status b/docs/docs-status index d4a7d976e5..30e9d40796 100644 --- a/docs/docs-status +++ b/docs/docs-status @@ -9,12 +9,10 @@ docs/docbook/devdoc/* - most of these docs are outdated and need updates... docs/docbook/manpages/net.8.sgml - Still not finished docs/docbook/manpages/rpcclient.1.sgml - Command documentation might be outdated docs/docbook/manpages/samba.7.sgml - Listing of samba programs is not complete -docs/docbook/manpages/smbclient.1.sgml - document -k (kerberos authentication) docs/docbook/manpages/smbcontrol.1.sgml - Document -s, samsync, samrepl, pool-usage, dmalloc-mark, dmalloc-log-changed, shutdown, change_id docs/docbook/manpages/smb.conf.5.sgml - 'restrict anonymous' isn't documented properly docs/docbook/projdoc/DOMAIN_MEMBER.sgml - Needs update to 3.0 docs/docbook/projdoc/ADS-HOWTO.sgml - seems outdated (it says we require 'ads server' when in ads mode, though that's not true, according to the manpages...) -docs/docbook/projdoc/ENCRYPTION.sgml - contains useless old info about smbpasswd docs/docbook/projdoc/Integrating-with-Windows.sgml - Should slowly go a way. Contains a little bit information about wins, a little bit about domain membership, a little about winbind, etc docs/docbook/projdoc/NT_Security.sgml - probably outdated docs/docbook/projdoc/Diagnosis.sgml - Needs extension @@ -27,6 +25,7 @@ docs/docbook/projdoc/Speed.sgml - contains outdated and invalid information docs/docbook/projdoc/UNIX_INSTALL.sgml - Needs a lot of updating (swat, ADS, PDC, etc) docs/docbook/projdoc/printer_driver2.sgml - Needs integration with printing.sgml, still up to date? docs/docbook/projdoc/security_level.sgml - information about ads and domain should be added (currently only contains pointers to the ads and domain_member docs) +docs/docbook/projdoc/upgrading-to-3.0.sgml - not finished yet docs/docbook/projdoc/winbind.sgml - needs documentation for ADS docs/textdocs/CUPS-PrintingInfo.txt - needs to be converted to sgml - Kurt Pfeifle docs/textdocs/PROFILES.txt - needs to be converted to sgml @@ -49,7 +48,6 @@ docs/docbook/manpages/testprns.1.sgml docs/docbook/manpages/wbinfo.1.sgml Stuff that needs to be documented: -Merge the various docs about wins and browsing Windows NT 4.0 Style Trust Relationship One Time Migration script from a Windows NT 4.0 PDC to a Samba PDC ldap passwd sync -- cgit From ff78c3bf5c3a73cf90f6517d9b2d6b8c12d22d68 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 18 Feb 2003 22:14:04 +0000 Subject: Regenerate (This used to be commit 1ab5a3b17feb677425bb1071357c3dbabcc46c7e) --- docs/Samba-Developers-Guide.pdf | 3778 +++++----- docs/Samba-HOWTO-Collection.pdf | 10647 ++++++++++++++-------------- docs/announce | 3 + docs/faq/samba-faq.html | 97 +- docs/htmldocs/Samba-Developers-Guide.html | 145 +- docs/htmldocs/Samba-HOWTO-Collection.html | 8652 +++++++++++----------- docs/htmldocs/ads.html | 86 +- docs/htmldocs/appendixes.html | 177 +- docs/htmldocs/browsing-quick.html | 70 +- docs/htmldocs/bugreport.html | 31 +- docs/htmldocs/cvs-access.html | 35 +- docs/htmldocs/diagnosis.html | 67 +- docs/htmldocs/domain-security.html | 227 +- docs/htmldocs/findsmb.1.html | 195 +- docs/htmldocs/groupmapping.html | 11 +- docs/htmldocs/groupprofiles.html | 565 ++ docs/htmldocs/improved-browsing.html | 81 +- docs/htmldocs/install.html | 89 +- docs/htmldocs/integrate-ms-networks.html | 105 +- docs/htmldocs/introduction.html | 213 +- docs/htmldocs/lmhosts.5.html | 94 +- docs/htmldocs/msdfs.html | 15 +- docs/htmldocs/net.8.html | 45 +- docs/htmldocs/nmbd.8.html | 370 +- docs/htmldocs/nmblookup.1.html | 95 +- docs/htmldocs/optional.html | 608 +- docs/htmldocs/other-clients.html | 59 +- docs/htmldocs/pam.html | 19 +- docs/htmldocs/passdb.html | 1646 +++++ docs/htmldocs/pdb-mysql.html | 67 +- docs/htmldocs/pdb-xml.html | 15 +- docs/htmldocs/pdbedit.8.html | 215 +- docs/htmldocs/portability.html | 23 +- docs/htmldocs/printing.html | 107 +- docs/htmldocs/pwencrypt.html | 39 +- docs/htmldocs/rpcclient.1.html | 100 +- docs/htmldocs/samba-bdc.html | 62 +- docs/htmldocs/samba-howto-collection.html | 673 +- docs/htmldocs/samba-ldap-howto.html | 55 +- docs/htmldocs/samba-pdc.html | 121 +- docs/htmldocs/samba.7.html | 160 +- docs/htmldocs/securitylevels.html | 11 +- docs/htmldocs/smb.conf.5.html | 3246 +++++---- docs/htmldocs/smbcacls.1.html | 77 +- docs/htmldocs/smbclient.1.html | 177 +- docs/htmldocs/smbcontrol.1.html | 96 +- docs/htmldocs/smbd.8.html | 345 +- docs/htmldocs/smbgroupedit.8.html | 156 +- docs/htmldocs/smbmnt.8.html | 25 +- docs/htmldocs/smbmount.8.html | 84 +- docs/htmldocs/smbpasswd.5.html | 67 +- docs/htmldocs/smbpasswd.8.html | 216 +- docs/htmldocs/smbsh.1.html | 179 +- docs/htmldocs/smbspool.8.html | 61 +- docs/htmldocs/smbstatus.1.html | 79 +- docs/htmldocs/smbtar.1.html | 120 +- docs/htmldocs/smbumount.8.html | 23 +- docs/htmldocs/speed.html | 57 +- docs/htmldocs/swat.8.html | 115 +- docs/htmldocs/testparm.1.html | 136 +- docs/htmldocs/testprns.1.html | 87 +- docs/htmldocs/type.html | 182 +- docs/htmldocs/unix-permissions.html | 63 +- docs/htmldocs/vfs.html | 59 +- docs/htmldocs/vfstest.1.html | 51 +- docs/htmldocs/wbinfo.1.html | 189 +- docs/htmldocs/winbind.html | 169 +- docs/htmldocs/winbindd.8.html | 230 +- docs/manpages/findsmb.1 | 39 +- docs/manpages/lmhosts.5 | 24 +- docs/manpages/net.8 | 20 +- docs/manpages/nmbd.8 | 70 +- docs/manpages/nmblookup.1 | 25 +- docs/manpages/pdbedit.8 | 75 +- docs/manpages/rpcclient.1 | 50 +- docs/manpages/samba.7 | 56 +- docs/manpages/smb.conf.5 | 1127 ++- docs/manpages/smbcacls.1 | 16 +- docs/manpages/smbclient.1 | 64 +- docs/manpages/smbcontrol.1 | 22 +- docs/manpages/smbd.8 | 64 +- docs/manpages/smbgroupedit.8 | 23 +- docs/manpages/smbmnt.8 | 9 +- docs/manpages/smbmount.8 | 32 +- docs/manpages/smbpasswd.5 | 22 +- docs/manpages/smbpasswd.8 | 67 +- docs/manpages/smbsh.1 | 52 +- docs/manpages/smbspool.8 | 17 +- docs/manpages/smbstatus.1 | 19 +- docs/manpages/smbtar.1 | 25 +- docs/manpages/smbumount.8 | 9 +- docs/manpages/swat.8 | 30 +- docs/manpages/testparm.1 | 28 +- docs/manpages/testprns.1 | 19 +- docs/manpages/vfstest.1 | 5 +- docs/manpages/wbinfo.1 | 49 +- docs/manpages/winbindd.8 | 63 +- 97 files changed, 21072 insertions(+), 17211 deletions(-) create mode 100644 docs/htmldocs/groupprofiles.html create mode 100644 docs/htmldocs/passdb.html diff --git a/docs/Samba-Developers-Guide.pdf b/docs/Samba-Developers-Guide.pdf index bb93380217..3b467e0ec1 100644 --- a/docs/Samba-Developers-Guide.pdf +++ b/docs/Samba-Developers-Guide.pdf @@ -1,6 +1,6 @@ %PDF-1.3 %âãÏÓ -1 0 obj<>endobj +1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>endobj 4 0 obj<>endobj @@ -12,48 +12,48 @@ 10 0 obj<>endobj 11 0 obj<>endobj 12 0 obj<>endobj -13 0 obj<>endobj -14 0 obj<>endobj -15 0 obj<>endobj -16 0 obj<>endobj -17 0 obj<>endobj -18 0 obj<>endobj -19 0 obj<>endobj -20 0 obj<>endobj -21 0 obj<>endobj -22 0 obj<>endobj -23 0 obj<>endobj -24 0 obj<>endobj -25 0 obj<>endobj -26 0 obj<>endobj -27 0 obj<>endobj -28 0 obj<>endobj -29 0 obj<>endobj -30 0 obj<>endobj -31 0 obj<>endobj -32 0 obj<>endobj -33 0 obj<>endobj -34 0 obj<>endobj -35 0 obj<>endobj -36 0 obj<>endobj -37 0 obj<>endobj -38 0 obj<>endobj -39 0 obj<>endobj -40 0 obj<>endobj -41 0 obj<>endobj -42 0 obj<>endobj -43 0 obj<>endobj -44 0 obj<>endobj -45 0 obj<>endobj -46 0 obj<>endobj -47 0 obj<>endobj -48 0 obj<>endobj -49 0 obj<>endobj -50 0 obj<>endobj -51 0 obj<>endobj -52 0 obj<>endobj -53 0 obj<>endobj -54 0 obj<>endobj +13 0 obj<>endobj +14 0 obj<>endobj +15 0 obj<>endobj +16 0 obj<>endobj +17 0 obj<>endobj +18 0 obj<>endobj +19 0 obj<>endobj +20 0 obj<>endobj +21 0 obj<>endobj +22 0 obj<>endobj +23 0 obj<>endobj +24 0 obj<>endobj +25 0 obj<>endobj +26 0 obj<>endobj +27 0 obj<>endobj +28 0 obj<>endobj +29 0 obj<>endobj +30 0 obj<>endobj +31 0 obj<>endobj +32 0 obj<>endobj +33 0 obj<>endobj +34 0 obj<>endobj +35 0 obj<>endobj +36 0 obj<>endobj +37 0 obj<>endobj +38 0 obj<>endobj +39 0 obj<>endobj +40 0 obj<>endobj +41 0 obj<>endobj +42 0 obj<>endobj +43 0 obj<>endobj +44 0 obj<>endobj +45 0 obj<>endobj +46 0 obj<>endobj +47 0 obj<>endobj +48 0 obj<>endobj +49 0 obj<>endobj +50 0 obj<>endobj +51 0 obj<>endobj +52 0 obj<>endobj +53 0 obj<>endobj +54 0 obj<>endobj 55 0 obj[13 0 R 14 0 R 15 0 R @@ -96,50 +96,50 @@ 52 0 R 53 0 R 54 0 R]endobj -56 0 obj<>endobj -57 0 obj<>endobj -58 0 obj<>endobj -59 0 obj<>endobj -60 0 obj<>endobj -61 0 obj<>endobj -62 0 obj<>endobj -63 0 obj<>endobj -64 0 obj<>endobj -65 0 obj<>endobj -66 0 obj<>endobj -67 0 obj<>endobj -68 0 obj<>endobj -69 0 obj<>endobj -70 0 obj<>endobj -71 0 obj<>endobj -72 0 obj<>endobj -73 0 obj<>endobj -74 0 obj<>endobj -75 0 obj<>endobj -76 0 obj<>endobj -77 0 obj<>endobj -78 0 obj<>endobj -79 0 obj<>endobj -80 0 obj<>endobj -81 0 obj<>endobj -82 0 obj<>endobj -83 0 obj<>endobj -84 0 obj<>endobj -85 0 obj<>endobj -86 0 obj<>endobj -87 0 obj<>endobj -88 0 obj<>endobj -89 0 obj<>endobj -90 0 obj<>endobj -91 0 obj<>endobj -92 0 obj<>endobj -93 0 obj<>endobj -94 0 obj<>endobj -95 0 obj<>endobj -96 0 obj<>endobj -97 0 obj<>endobj -98 0 obj<>endobj -99 0 obj<>endobj +56 0 obj<>endobj +57 0 obj<>endobj +58 0 obj<>endobj +59 0 obj<>endobj +60 0 obj<>endobj +61 0 obj<>endobj +62 0 obj<>endobj +63 0 obj<>endobj +64 0 obj<>endobj +65 0 obj<>endobj +66 0 obj<>endobj +67 0 obj<>endobj +68 0 obj<>endobj +69 0 obj<>endobj +70 0 obj<>endobj +71 0 obj<>endobj +72 0 obj<>endobj +73 0 obj<>endobj +74 0 obj<>endobj +75 0 obj<>endobj +76 0 obj<>endobj +77 0 obj<>endobj +78 0 obj<>endobj +79 0 obj<>endobj +80 0 obj<>endobj +81 0 obj<>endobj +82 0 obj<>endobj +83 0 obj<>endobj +84 0 obj<>endobj +85 0 obj<>endobj +86 0 obj<>endobj +87 0 obj<>endobj +88 0 obj<>endobj +89 0 obj<>endobj +90 0 obj<>endobj +91 0 obj<>endobj +92 0 obj<>endobj +93 0 obj<>endobj +94 0 obj<>endobj +95 0 obj<>endobj +96 0 obj<>endobj +97 0 obj<>endobj +98 0 obj<>endobj +99 0 obj<>endobj 100 0 obj[56 0 R 57 0 R 58 0 R @@ -184,50 +184,50 @@ 97 0 R 98 0 R 99 0 R]endobj -101 0 obj<>endobj -102 0 obj<>endobj -103 0 obj<>endobj -104 0 obj<>endobj -105 0 obj<>endobj -106 0 obj<>endobj -107 0 obj<>endobj -108 0 obj<>endobj -109 0 obj<>endobj -110 0 obj<>endobj -111 0 obj<>endobj -112 0 obj<>endobj -113 0 obj<>endobj -114 0 obj<>endobj -115 0 obj<>endobj -116 0 obj<>endobj -117 0 obj<>endobj -118 0 obj<>endobj -119 0 obj<>endobj -120 0 obj<>endobj -121 0 obj<>endobj -122 0 obj<>endobj -123 0 obj<>endobj -124 0 obj<>endobj -125 0 obj<>endobj -126 0 obj<>endobj -127 0 obj<>endobj -128 0 obj<>endobj -129 0 obj<>endobj -130 0 obj<>endobj -131 0 obj<>endobj -132 0 obj<>endobj -133 0 obj<>endobj -134 0 obj<>endobj -135 0 obj<>endobj -136 0 obj<>endobj -137 0 obj<>endobj -138 0 obj<>endobj -139 0 obj<>endobj -140 0 obj<>endobj -141 0 obj<>endobj -142 0 obj<>endobj -143 0 obj<>endobj -144 0 obj<>endobj +101 0 obj<>endobj +102 0 obj<>endobj +103 0 obj<>endobj +104 0 obj<>endobj +105 0 obj<>endobj +106 0 obj<>endobj +107 0 obj<>endobj +108 0 obj<>endobj +109 0 obj<>endobj +110 0 obj<>endobj +111 0 obj<>endobj +112 0 obj<>endobj +113 0 obj<>endobj +114 0 obj<>endobj +115 0 obj<>endobj +116 0 obj<>endobj +117 0 obj<>endobj +118 0 obj<>endobj +119 0 obj<>endobj +120 0 obj<>endobj +121 0 obj<>endobj +122 0 obj<>endobj +123 0 obj<>endobj +124 0 obj<>endobj +125 0 obj<>endobj +126 0 obj<>endobj +127 0 obj<>endobj +128 0 obj<>endobj +129 0 obj<>endobj +130 0 obj<>endobj +131 0 obj<>endobj +132 0 obj<>endobj +133 0 obj<>endobj +134 0 obj<>endobj +135 0 obj<>endobj +136 0 obj<>endobj +137 0 obj<>endobj +138 0 obj<>endobj +139 0 obj<>endobj +140 0 obj<>endobj +141 0 obj<>endobj +142 0 obj<>endobj +143 0 obj<>endobj +144 0 obj<>endobj 145 0 obj[101 0 R 102 0 R 103 0 R @@ -272,57 +272,60 @@ 142 0 R 143 0 R 144 0 R]endobj -146 0 obj<>endobj -147 0 obj<>endobj -148 0 obj[146 0 R -147 0 R]endobj -149 0 obj<>endobj -150 0 obj<>endobj -151 0 obj<>endobj -152 0 obj<>endobj -153 0 obj<>endobj -154 0 obj<>endobj -155 0 obj<>endobj -156 0 obj<>endobj -157 0 obj<>endobj -158 0 obj<>endobj -159 0 obj<>endobj -160 0 obj<>endobj -161 0 obj<>endobj -162 0 obj<>endobj -163 0 obj<>endobj -164 0 obj<>endobj -165 0 obj<>endobj -166 0 obj<>endobj -167 0 obj<>endobj -168 0 obj<>endobj -169 0 obj<>endobj -170 0 obj<>endobj -171 0 obj<>endobj -172 0 obj<>endobj -173 0 obj<>endobj -174 0 obj<>endobj -175 0 obj<>endobj -176 0 obj<>endobj -177 0 obj<>endobj -178 0 obj<>endobj -179 0 obj<>endobj -180 0 obj<>endobj -181 0 obj<>endobj -182 0 obj<>endobj -183 0 obj<>endobj -184 0 obj<>endobj -185 0 obj<>endobj -186 0 obj<>endobj -187 0 obj<>endobj -188 0 obj<>endobj -189 0 obj<>endobj -190 0 obj<>endobj -191 0 obj[150 0 R -152 0 R -154 0 R +146 0 obj<>endobj +147 0 obj<>endobj +148 0 obj<>endobj +149 0 obj<>endobj +150 0 obj<>endobj +151 0 obj[146 0 R +147 0 R +148 0 R +149 0 R +150 0 R]endobj +152 0 obj<>endobj +153 0 obj<>endobj +154 0 obj<>endobj +155 0 obj<>endobj +156 0 obj<>endobj +157 0 obj<>endobj +158 0 obj<>endobj +159 0 obj<>endobj +160 0 obj<>endobj +161 0 obj<>endobj +162 0 obj<>endobj +163 0 obj<>endobj +164 0 obj<>endobj +165 0 obj<>endobj +166 0 obj<>endobj +167 0 obj<>endobj +168 0 obj<>endobj +169 0 obj<>endobj +170 0 obj<>endobj +171 0 obj<>endobj +172 0 obj<>endobj +173 0 obj<>endobj +174 0 obj<>endobj +175 0 obj<>endobj +176 0 obj<>endobj +177 0 obj<>endobj +178 0 obj<>endobj +179 0 obj<>endobj +180 0 obj<>endobj +181 0 obj<>endobj +182 0 obj<>endobj +183 0 obj<>endobj +184 0 obj<>endobj +185 0 obj<>endobj +186 0 obj<>endobj +187 0 obj<>endobj +188 0 obj<>endobj +189 0 obj<>endobj +190 0 obj<>endobj +191 0 obj<>endobj +192 0 obj<>endobj +193 0 obj<>endobj +194 0 obj[153 0 R 155 0 R -156 0 R 157 0 R 158 0 R 159 0 R @@ -356,62 +359,62 @@ 187 0 R 188 0 R 189 0 R -190 0 R]endobj -192 0 obj<>endobj -193 0 obj<>endobj -194 0 obj<>endobj -195 0 obj<>endobj -196 0 obj<>endobj -197 0 obj<>endobj -198 0 obj<>endobj -199 0 obj<>endobj -200 0 obj<>endobj -201 0 obj<>endobj -202 0 obj<>endobj -203 0 obj<>endobj -204 0 obj<>endobj -205 0 obj<>endobj -206 0 obj<>endobj -207 0 obj<>endobj -208 0 obj<>endobj -209 0 obj<>endobj -210 0 obj<>endobj -211 0 obj<>endobj -212 0 obj<>endobj -213 0 obj<>endobj -214 0 obj<>endobj -215 0 obj<>endobj -216 0 obj<>endobj -217 0 obj<>endobj -218 0 obj<>endobj -219 0 obj<>endobj -220 0 obj<>endobj -221 0 obj<>endobj -222 0 obj<>endobj -223 0 obj<>endobj -224 0 obj<>endobj -225 0 obj<>endobj -226 0 obj<>endobj -227 0 obj<>endobj -228 0 obj<>endobj -229 0 obj<>endobj -230 0 obj<>endobj -231 0 obj<>endobj -232 0 obj<>endobj -233 0 obj<>endobj -234 0 obj<>endobj -235 0 obj<>endobj -236 0 obj<>endobj -237 0 obj<>endobj -238 0 obj<>endobj -239 0 obj<>endobj -240 0 obj<>endobj -241 0 obj<>endobj -242 0 obj<>endobj -243 0 obj[192 0 R -193 0 R -194 0 R -195 0 R +190 0 R +191 0 R +192 0 R +193 0 R]endobj +195 0 obj<>endobj +196 0 obj<>endobj +197 0 obj<>endobj +198 0 obj<>endobj +199 0 obj<>endobj +200 0 obj<>endobj +201 0 obj<>endobj +202 0 obj<>endobj +203 0 obj<>endobj +204 0 obj<>endobj +205 0 obj<>endobj +206 0 obj<>endobj +207 0 obj<>endobj +208 0 obj<>endobj +209 0 obj<>endobj +210 0 obj<>endobj +211 0 obj<>endobj +212 0 obj<>endobj +213 0 obj<>endobj +214 0 obj<>endobj +215 0 obj<>endobj +216 0 obj<>endobj +217 0 obj<>endobj +218 0 obj<>endobj +219 0 obj<>endobj +220 0 obj<>endobj +221 0 obj<>endobj +222 0 obj<>endobj +223 0 obj<>endobj +224 0 obj<>endobj +225 0 obj<>endobj +226 0 obj<>endobj +227 0 obj<>endobj +228 0 obj<>endobj +229 0 obj<>endobj +230 0 obj<>endobj +231 0 obj<>endobj +232 0 obj<>endobj +233 0 obj<>endobj +234 0 obj<>endobj +235 0 obj<>endobj +236 0 obj<>endobj +237 0 obj<>endobj +238 0 obj<>endobj +239 0 obj<>endobj +240 0 obj<>endobj +241 0 obj<>endobj +242 0 obj<>endobj +243 0 obj<>endobj +244 0 obj<>endobj +245 0 obj<>endobj +246 0 obj[195 0 R 196 0 R 197 0 R 198 0 R @@ -458,50 +461,53 @@ 239 0 R 240 0 R 241 0 R -242 0 R]endobj -244 0 obj<>endobj -245 0 obj<>endobj -246 0 obj<>endobj -247 0 obj<>endobj -248 0 obj<>endobj -249 0 obj<>endobj -250 0 obj<>endobj -251 0 obj<>endobj -252 0 obj<>endobj -253 0 obj<>endobj -254 0 obj<>endobj -255 0 obj<>endobj -256 0 obj<>endobj -257 0 obj<>endobj -258 0 obj<>endobj -259 0 obj<>endobj -260 0 obj<>endobj -261 0 obj<>endobj -262 0 obj<>endobj -263 0 obj<>endobj -264 0 obj<>endobj -265 0 obj<>endobj -266 0 obj<>endobj -267 0 obj<>endobj -268 0 obj<>endobj -269 0 obj<>endobj -270 0 obj<>endobj -271 0 obj<>endobj -272 0 obj<>endobj -273 0 obj<>endobj -274 0 obj<>endobj -275 0 obj<>endobj -276 0 obj<>endobj -277 0 obj<>endobj -278 0 obj<>endobj -279 0 obj<>endobj -280 0 obj<>endobj -281 0 obj<>endobj -282 0 obj<>endobj -283 0 obj[244 0 R -245 0 R -246 0 R -247 0 R +242 0 R +243 0 R +244 0 R +245 0 R]endobj +247 0 obj<>endobj +248 0 obj<>endobj +249 0 obj<>endobj +250 0 obj<>endobj +251 0 obj<>endobj +252 0 obj<>endobj +253 0 obj<>endobj +254 0 obj<>endobj +255 0 obj<>endobj +256 0 obj<>endobj +257 0 obj<>endobj +258 0 obj<>endobj +259 0 obj<>endobj +260 0 obj<>endobj +261 0 obj<>endobj +262 0 obj<>endobj +263 0 obj<>endobj +264 0 obj<>endobj +265 0 obj<>endobj +266 0 obj<>endobj +267 0 obj<>endobj +268 0 obj<>endobj +269 0 obj<>endobj +270 0 obj<>endobj +271 0 obj<>endobj +272 0 obj<>endobj +273 0 obj<>endobj +274 0 obj<>endobj +275 0 obj<>endobj +276 0 obj<>endobj +277 0 obj<>endobj +278 0 obj<>endobj +279 0 obj<>endobj +280 0 obj<>endobj +281 0 obj<>endobj +282 0 obj<>endobj +283 0 obj<>endobj +284 0 obj<>endobj +285 0 obj<>endobj +286 0 obj<>endobj +287 0 obj<>endobj +288 0 obj<>endobj +289 0 obj[247 0 R 248 0 R 249 0 R 250 0 R @@ -536,418 +542,438 @@ 279 0 R 280 0 R 281 0 R -282 0 R]endobj -284 0 obj<>endobj -285 0 obj<>endobj -286 0 obj<>endobj -287 0 obj<>endobj -288 0 obj[285 0 R -287 0 R]endobj -289 0 obj<>endobj -290 0 obj<>endobj -291 0 obj<>endobj -292 0 obj<>endobj -293 0 obj<>endobj -294 0 obj<>endobj -295 0 obj<>endobj -296 0 obj<>endobj -297 0 obj<>endobj -298 0 obj<>endobj -299 0 obj<>endobj -300 0 obj<>endobj -301 0 obj[290 0 R -292 0 R -294 0 R -296 0 R +282 0 R +283 0 R +284 0 R +285 0 R +286 0 R +287 0 R +288 0 R]endobj +290 0 obj<>endobj +291 0 obj<>endobj +292 0 obj<>endobj +293 0 obj<>endobj +294 0 obj[291 0 R +293 0 R]endobj +295 0 obj<>endobj +296 0 obj<>endobj +297 0 obj<>endobj +298 0 obj<>endobj +299 0 obj<>endobj +300 0 obj<>endobj +301 0 obj<>endobj +302 0 obj<>endobj +303 0 obj<>endobj +304 0 obj<>endobj +305 0 obj<>endobj +306 0 obj<>endobj +307 0 obj[296 0 R 298 0 R -300 0 R]endobj -302 0 obj<>endobj -303 0 obj<>endobj -304 0 obj<>endobj -305 0 obj<>endobj -306 0 obj<>endobj -307 0 obj<>endobj -308 0 obj<>endobj -309 0 obj<>endobj -310 0 obj<>endobj -311 0 obj<>endobj -312 0 obj<>endobj -313 0 obj<>endobj -314 0 obj<>endobj -315 0 obj<>endobj -316 0 obj<>endobj -317 0 obj<>endobj -318 0 obj<>endobj -319 0 obj<>endobj -320 0 obj<>endobj -321 0 obj<>endobj -322 0 obj<>endobj -323 0 obj<>endobj -324 0 obj<>endobj -325 0 obj<>endobj -326 0 obj<>endobj -327 0 obj<>endobj -328 0 obj<>endobj -329 0 obj<>endobj -330 0 obj<>endobj -331 0 obj<>endobj -332 0 obj<>endobj -333 0 obj<>endobj -334 0 obj<>endobj -335 0 obj<>endobj -336 0 obj<>endobj -337 0 obj<>endobj -338 0 obj<>endobj -339 0 obj<>endobj -340 0 obj<>endobj -341 0 obj<>endobj -342 0 obj<>endobj -343 0 obj<>endobj -344 0 obj<>endobj -345 0 obj<>endobj -346 0 obj<>endobj -347 0 obj<>endobj -348 0 obj<>endobj -349 0 obj<>endobj -350 0 obj<>endobj -351 0 obj<>endobj -352 0 obj<>endobj -353 0 obj<>endobj -354 0 obj<>endobj -355 0 obj<>endobj -356 0 obj<>endobj -357 0 obj<>endobj -358 0 obj<>endobj -359 0 obj<>endobj -360 0 obj<>endobj -361 0 obj<>endobj -362 0 obj<>endobj -363 0 obj<>endobj -364 0 obj<>endobj -365 0 obj<>endobj -366 0 obj<>endobj -367 0 obj<>endobj -368 0 obj<>endobj -369 0 obj<>endobj -370 0 obj<>endobj -371 0 obj<>endobj -372 0 obj<>endobj -373 0 obj<>endobj -374 0 obj<>endobj -375 0 obj<>endobj -376 0 obj<>endobj -377 0 obj<>endobj -378 0 obj<>endobj -379 0 obj<>endobj -380 0 obj<>endobj -381 0 obj<>endobj -382 0 obj<>endobj -383 0 obj<>endobj -384 0 obj<>endobj -385 0 obj<>endobj -386 0 obj<>endobj -387 0 obj<>endobj -388 0 obj<>endobj -389 0 obj<>endobj -390 0 obj<>endobj -391 0 obj<>endobj -392 0 obj<>endobj -393 0 obj<>endobj -394 0 obj<>endobj -395 0 obj<>endobj -396 0 obj<>endobj -397 0 obj<>endobj -398 0 obj<>endobj -399 0 obj<>endobj -400 0 obj<>endobj -401 0 obj<>endobj -402 0 obj<>endobj -403 0 obj<>endobj -404 0 obj<>endobj -405 0 obj<>endobj -406 0 obj<>endobj -407 0 obj<>endobj -408 0 obj<>endobj -409 0 obj<>endobj -410 0 obj<>endobj -411 0 obj<>endobj -412 0 obj<>endobj -413 0 obj<>endobj -414 0 obj<>endobj -415 0 obj<>endobj -416 0 obj<>endobj -417 0 obj<>endobj -418 0 obj<>endobj -419 0 obj<>endobj -420 0 obj<>endobj -421 0 obj<>endobj -422 0 obj<>endobj -423 0 obj<>endobj -424 0 obj<>endobj -425 0 obj<>endobj -426 0 obj<>endobj -427 0 obj<>endobj -428 0 obj<>endobj -429 0 obj<>endobj -430 0 obj<>endobj -431 0 obj<>endobj -432 0 obj<>endobj -433 0 obj<>endobj -434 0 obj<>endobj -435 0 obj<>endobj -436 0 obj<>endobj -437 0 obj<>endobj -438 0 obj<>endobj -439 0 obj<>endobj -440 0 obj<>endobj -441 0 obj<>endobj -442 0 obj<>endobj -443 0 obj<>endobj -444 0 obj<>endobj -445 0 obj<>endobj -446 0 obj<>endobj -447 0 obj<>endobj -448 0 obj<>endobj -449 0 obj<>endobj -450 0 obj<>endobj -451 0 obj<>endobj -452 0 obj<>endobj -453 0 obj<>endobj -454 0 obj<>endobj -455 0 obj<>endobj -456 0 obj<>endobj -457 0 obj<>endobj -458 0 obj<>endobj -459 0 obj<>endobj -460 0 obj<>endobj -461 0 obj<>endobj -462 0 obj<>endobj -463 0 obj<>endobj -464 0 obj<>endobj -465 0 obj<>endobj -466 0 obj<>endobj -467 0 obj<>endobj -468 0 obj<>endobj -469 0 obj<>endobj -470 0 obj<>endobj -471 0 obj<>endobj -472 0 obj<>endobj -473 0 obj<>endobj -474 0 obj<>endobj -475 0 obj<>endobj -476 0 obj<>endobj -477 0 obj<>endobj -478 0 obj<>endobj -479 0 obj<>endobj -480 0 obj<>endobj -481 0 obj<>endobj -482 0 obj<>endobj -483 0 obj<>endobj -484 0 obj<>endobj -485 0 obj<>endobj -486 0 obj<>endobj -487 0 obj<>endobj -488 0 obj<>endobj -489 0 obj<>endobj -490 0 obj<>endobj -491 0 obj<>endobj -492 0 obj<>endobj -493 0 obj<>endobj -494 0 obj<>endobj -495 0 obj<>endobj -496 0 obj<>endobj -497 0 obj<>endobj -498 0 obj<>endobj -499 0 obj<>endobj -500 0 obj<>endobj -501 0 obj<>endobj -502 0 obj<>endobj -503 0 obj<>endobj -504 0 obj<>endobj -505 0 obj<>endobj -506 0 obj<>endobj -507 0 obj<>endobj -508 0 obj<>endobj -509 0 obj<>endobj -510 0 obj<>endobj -511 0 obj<>endobj -512 0 obj<>endobj -513 0 obj<>endobj +309 0 obj<>endobj +310 0 obj<>endobj +311 0 obj<>endobj +312 0 obj<>endobj +313 0 obj<>endobj +314 0 obj<>endobj +315 0 obj<>endobj +316 0 obj<>endobj +317 0 obj<>endobj +318 0 obj<>endobj +319 0 obj<>endobj +320 0 obj<>endobj +321 0 obj<>endobj +322 0 obj<>endobj +323 0 obj<>endobj +324 0 obj<>endobj +325 0 obj<>endobj +326 0 obj<>endobj +327 0 obj<>endobj +328 0 obj<>endobj +329 0 obj<>endobj +330 0 obj<>endobj +331 0 obj<>endobj +332 0 obj<>endobj +333 0 obj<>endobj +334 0 obj<>endobj +335 0 obj<>endobj +336 0 obj<>endobj +337 0 obj<>endobj +338 0 obj<>endobj +339 0 obj<>endobj +340 0 obj<>endobj +341 0 obj<>endobj +342 0 obj<>endobj +343 0 obj<>endobj +344 0 obj<>endobj +345 0 obj<>endobj +346 0 obj<>endobj +347 0 obj<>endobj +348 0 obj<>endobj +349 0 obj<>endobj +350 0 obj<>endobj +351 0 obj<>endobj +352 0 obj<>endobj +353 0 obj<>endobj +354 0 obj<>endobj +355 0 obj<>endobj +356 0 obj<>endobj +357 0 obj<>endobj +358 0 obj<>endobj +359 0 obj<>endobj +360 0 obj<>endobj +361 0 obj<>endobj +362 0 obj<>endobj +363 0 obj<>endobj +364 0 obj<>endobj +365 0 obj<>endobj +366 0 obj<>endobj +367 0 obj<>endobj +368 0 obj<>endobj +369 0 obj<>endobj +370 0 obj<>endobj +371 0 obj<>endobj +372 0 obj<>endobj +373 0 obj<>endobj +374 0 obj<>endobj +375 0 obj<>endobj +376 0 obj<>endobj +377 0 obj<>endobj +378 0 obj<>endobj +379 0 obj<>endobj +380 0 obj<>endobj +381 0 obj<>endobj +382 0 obj<>endobj +383 0 obj<>endobj +384 0 obj<>endobj +385 0 obj<>endobj +386 0 obj<>endobj +387 0 obj<>endobj +388 0 obj<>endobj +389 0 obj<>endobj +390 0 obj<>endobj +391 0 obj<>endobj +392 0 obj<>endobj +393 0 obj<>endobj +394 0 obj<>endobj +395 0 obj<>endobj +396 0 obj<>endobj +397 0 obj<>endobj +398 0 obj<>endobj +399 0 obj<>endobj +400 0 obj<>endobj +401 0 obj<>endobj +402 0 obj<>endobj +403 0 obj<>endobj +404 0 obj<>endobj +405 0 obj<>endobj +406 0 obj<>endobj +407 0 obj<>endobj +408 0 obj<>endobj +409 0 obj<>endobj +410 0 obj<>endobj +411 0 obj<>endobj +412 0 obj<>endobj +413 0 obj<>endobj +414 0 obj<>endobj +415 0 obj<>endobj +416 0 obj<>endobj +417 0 obj<>endobj +418 0 obj<>endobj +419 0 obj<>endobj +420 0 obj<>endobj +421 0 obj<>endobj +422 0 obj<>endobj +423 0 obj<>endobj +424 0 obj<>endobj +425 0 obj<>endobj +426 0 obj<>endobj +427 0 obj<>endobj +428 0 obj<>endobj +429 0 obj<>endobj +430 0 obj<>endobj +431 0 obj<>endobj +432 0 obj<>endobj +433 0 obj<>endobj +434 0 obj<>endobj +435 0 obj<>endobj +436 0 obj<>endobj +437 0 obj<>endobj +438 0 obj<>endobj +439 0 obj<>endobj +440 0 obj<>endobj +441 0 obj<>endobj +442 0 obj<>endobj +443 0 obj<>endobj +444 0 obj<>endobj +445 0 obj<>endobj +446 0 obj<>endobj +447 0 obj<>endobj +448 0 obj<>endobj +449 0 obj<>endobj +450 0 obj<>endobj +451 0 obj<>endobj +452 0 obj<>endobj +453 0 obj<>endobj +454 0 obj<>endobj +455 0 obj<>endobj +456 0 obj<>endobj +457 0 obj<>endobj +458 0 obj<>endobj +459 0 obj<>endobj +460 0 obj<>endobj +461 0 obj<>endobj +462 0 obj<>endobj +463 0 obj<>endobj +464 0 obj<>endobj +465 0 obj<>endobj +466 0 obj<>endobj +467 0 obj<>endobj +468 0 obj<>endobj +469 0 obj<>endobj +470 0 obj<>endobj +471 0 obj<>endobj +472 0 obj<>endobj +473 0 obj<>endobj +474 0 obj<>endobj +475 0 obj<>endobj +476 0 obj<>endobj +477 0 obj<>endobj +478 0 obj<>endobj +479 0 obj<>endobj +480 0 obj<>endobj +481 0 obj<>endobj +482 0 obj<>endobj +483 0 obj<>endobj +484 0 obj<>endobj +485 0 obj<>endobj +486 0 obj<>endobj +487 0 obj<>endobj +488 0 obj<>endobj +489 0 obj<>endobj +490 0 obj<>endobj +491 0 obj<>endobj +492 0 obj<>endobj +493 0 obj<>endobj +494 0 obj<>endobj +495 0 obj<>endobj +496 0 obj<>endobj +497 0 obj<>endobj +498 0 obj<>endobj +499 0 obj<>endobj +500 0 obj<>endobj +501 0 obj<>endobj +502 0 obj<>endobj +503 0 obj<>endobj +504 0 obj<>endobj +505 0 obj<>endobj +506 0 obj<>endobj +507 0 obj<>endobj +508 0 obj<>endobj +509 0 obj<>endobj +510 0 obj<>endobj +511 0 obj<>endobj +512 0 obj<>endobj +513 0 obj<>endobj +514 0 obj<>endobj +515 0 obj<>endobj +516 0 obj<>endobj +517 0 obj<>endobj +518 0 obj<>endobj +519 0 obj<>endobj +520 0 obj<>endobj +521 0 obj<>endobj +522 0 obj<>endobj -514 0 obj<>/XObject<<>>>>>>endobj -515 0 obj<>stream +523 0 obj<>/XObject<<>>>>>>endobj +524 0 obj<>stream x+ä2T0BCs#c3…ä\.§.}7K#…4CCK=ccS=3…= D²F°£¯“£‚KjYjN~AjQ±‚{ifJªfH—kW SÙ?endstream endobj -516 0 obj<>/XObject<<>>>>/Annots 55 0 R>>endobj -517 0 obj<>stream -xÕ[moGþî_±S Rvö}?ú%Éh’ž¥ë§…l­m,)'¯zÍ¿ïCrfÈ]%HÃyÝHõèYÎÉ™Uþsæ’ÿ¹¤Î’¼Jn·gé<Å7ñ¯ëwôMR-þÞ&y;¯=xLgn“¶˜†3p›¸¬œ·†Ì+4/ç ­Ë¹ó€5‚iF‚ü$‘¬LÚb¦mR¤D1TÙäAO—ðz¸MÊÓ)g lh1¤rBç ®’ƒ-k(eXƒÁb¤¬ÁÛ$ËÒynd- KËŒIóÁ¼ƒÍëÁÈì÷²"eàˆŒÆe@N2üî°ÒJŠ`YÍ«(È@=ç2G.Œ¤Å¶*1‚²2lA&}è°žk -’‹œ4kÈÈHRŒ”®6À@Ás²ò‘3p›4% 9À,ŽéŠšLŒ¤uP§2P#<ç«°"’,X´©:U@ 91K”´öc¶–5la|••IkŠVïò‚Nê9—RÜ)i19¬¬ [Ð3 Ë@‡õœ&’‡µ,"+ÖŽ“#´` Ãz®¡-¤œÔ‘ZJR€Eg4ç ×3(Sȃ<ŸB$-^„81_Zç"i1Ø¢‚ï k0XhŽÅŒ²â¤].êÏÕ”R‹ÈH -µäHZL -q„D–§ÌÛF—R@œ2pˆ¬%d(Ä œÓ”´,V­1¢2%v^æœNé9™2r’ÖK-‹ºRV¦ÄºÅ]›3Ð)='sDÎ@š’Ò¤ -ZLSæp²2eÙè~Ï蔞ãÅSÎ@ še4¨ -pZ^” uCneÀ+¢Ùç‘,Y0§ÑÎü$ô-¦ˆ¤:éD -zŽRO™ä‘¤a²–‚Íï;$Çû.p¼ï”3‰¹Æ+g ­Fó•äùªŠ ” è|ž“ "g /YäyY"óå)ÍI^߬”„£XMh ÚŒ†<Ág A!¥¤ -õcœf tPÏq`*g &¤ -«œd»4*f¦Ôg tBÏ5´ñ•3©ÒphwÄ„ð,ÔA)3'MÇ“šÐ@t4 ?ÉÚ° ÊTŒàŒ -zÎaI¡j$9‚b‡Ò O! -ŽvpƒœLOÆåË ÈO¨ CR•f”'U°’R/32PAÏQs#)ªâKÊÿ"È@=çÐrˆzRgÌ¥ ‹ ôœC¶ˆzR‘,Ô9 TÐs²½)­X礤P• -zÎÕTI]$ÙFœ(/ ³Ëè(Q±.ŠàRQÍFê"3ü™E$D»)RÝ~SrßЖ|lËÇ‹€‡´©ÃB™ÀÌæ(=òýh£<;¬$ä4Û ÓPÈ…„ó­Mê0lÒÅj{³¢¡pƒçŠœç‡Û‡MßÝöÇo(t;“g¬z´ÇœKuƒaaÆ‹ù~×öëãmÜù/+å²93œZÍöÂQolŇãc¿éÝj½ÙÝóÓê‘ø$èБä¾&º¢8ü„ÍøÜá)ÖQÏjÓ ²ìؾ¥5 ½qróÓöF<Ž‡>•?·ãùÄ(\m*þ²M»—gSC!5;±©Û´»ÙÊràôËøU÷´¹ßqöÀ¥AëËðØm“`¶Ë6Ðh4¾›}t†Ü¸|žç§X žb¾DISG¼¹ø×;òžKž¾<õ÷«((qƒ>«;ZRÊ4&®€BCÔx™?vÿ%‰,Ÿ—.4kŸŽýç£4®ÖæÅ—]¿úƒí Î3Ü×<«uÃÉØÖ™ÜåORª_VÜz5e(xW´€¿¾úõ^D“†>¬nû`d3e q)©1sݱ]ï¤TÛSûί®‚‰¨;uRm´R^N‘lŸ°hõж¯¤ÖoØöÓ/?Û¨ -B5´¶¥¥ßÙøù£hÜ°b‹ý•Ý÷ö¸ã†Ï)¸Îò’fœ «zÐU“U’Uð†$ôŒÉúæ¾ïþèà -á}Æ”;É,ø·´12âa}6ÐÕË 1b¬ ·Z&óá)G˜5ânØ®úßÖÝÍñþ7»&ÓToÑÜÖi\=R{õ½cŒÏ ¡T_îC{ŒÛñ6^,Ž÷÷Ýxûàvòó›Ë%ãm8F¿g§ÏÁNmîíq Gî°[=JŽÀíKL7¾ÁK ž!M8½JÀ‘•®Èäf ©®LÃü8è<úó’GÑN}ãÆͲó8¥­ÙØù& }ejðÝ ÍãTXMQ‡MfÄGodÛjR )ŬWXŽ<\!ÔñÚm³£8Ç;kí’o¾ôÝþ°îóâð²¨-§\HÇw(³vÐt…§ìò—sô7Ç»?K¬é‡Y¸©úì¹PÐ}ØSò§…ëç¿ò§k1pý¿¯Åýx5IýõŽwh¯Ù oGOŠíâïãx©3¶Sxª¼ôzF=Ê7WO4+±Ï¡˜¯¾êúÅxÇÒÉi2íCàÐKîQäÔ'ê“óOÔÇ[ù õ¾?I—͉ú‹Aä›M;ÉÙ%xE‹ZËpýAÓžª>ˆ{U½á·SDOT¿êîRVž^vù°HØï7ª=׸gVÞùK`üqìv´´ªCÞ¨>I¢ÊÆIyµš_‚Ý7ø ÃT{5¨ž6ã -…È»ýzî^ù ódT½äØõR`‡®ø^ƒ†~´úì t‡†cÕ¥¼Ux^UŸn«¾~‹6ÉO1ð9\–U5ý?üÃüÀ$‰?(ÉSüÜÎê´¥'7`o–gÿ<ûá¿ñ'endstream -endobj -518 0 obj<>/XObject<<>>>>/Annots 100 0 R>>endobj -519 0 obj<>stream -xÍ[MsG½ëWÌm½ÑÓ=ßGYŽUɶlʵgš¢c®EŽ–Nüï÷èn`†Êjw«L*©Jøøˆn Ð=£¹,Ç¿.k|VÔÙ|u–Or|“þóñWú&«Ëÿ]eE7qÜgÓ3WY•8WY[M -#èÓ˜®È'­!‹š&,*|‰Aý¤ -€&4p•5ͤ3œ«Ì¹nÒÒb°§´¬Á`?¸*I!ï'5jZR–)d a †M¤æ¾Œ‚ T0pÎ9L¤Å4lK -$–¨êj¬aX i"åªL91¨wÒb°e…åSQŠªîØ%ìt4£!”ãˆrƒÂʈù\PÒbZ€3++ PÕ쉊.@àÚ–¦Lœ´-@"ÙYUY¨³$gEÎÁ¿Ð•I¤Å¤k9d  ¬¬LŠ°!Wr,U tÒÀ…IiqšTY™4ÊV vŸì ^eÞ5´IVT—´ßE%ªRà\î(Fi1Tª6‘a Û•pž²âÑœÜCšM*2"A9Úše—ëÖ”œÃ$Òb¨SQlª(…{Y—ìŽo$h`wå8Ü£\WA)å Ä|y3 -ëÈHµlɺ²vl‰Á`›ÞTY^Øæ‘7y%¤¤RG*ñ/ÙNÊÂeѨG¨`à\^"ï+)3zòoœ‘ -Y¶ÌÊÄm<íC%ePÎ’qP:hà$ËD²`ÑQ‚’`ä: -WåDÑ–Ö­` rk¨"*g ¬€­!eP$¾å4pœÛ•3–ÆÓ IP­Z]¦ÀO”34¥`WRE ÊÅqR0ÐA×Q}VÎ@ Z64h¤]U .§FBÉ»*r¼”3p•a«c¹y’3V†‚FI‹Ábâü$j1Ø–Ê¡Ê’®ÖP³r’®‘cå”3p•Õ-tUÎ@Ì—SH*i1Ø2G4*Ëîðˆ­ä¤{'r²‹ IùÑ×Ò*p2@‚bFà"ü’GeÁª`gÉ/¨`àœ+H0‘¢*–,Ÿg ª®eg ¼L¥Yå ¤µ©im’ ×+ï¥M¨¦£$‹%O¤BýÔy*8WR()‚¹)Úž -Îa.D@"ym\+¥•ý& ­Mä8)g yŠ¶ª’ƒ…re ÛRYƒ© ‚®,Ûé'È•¼²’‘sŽ‚YI‹Éa%FPV†­MÍv tØÀIh))‚H*Éa”aÊL‡x:‰9´D©É¢&͹À¹Ü#–•´vÀ›X¼$j1ØÂÓ¤Ê mæ@Ö`°8ºTFVFƒžZ0êÎs£pàh×ÂÛ‰´˜&¥.ðƒEvs–5˜bÚX••°ƒ4èÚ.¬Y"-Ƥ¾%…•5˜¦C›²<)wŠ!þøsš202C¢ ĈðB•)§f£‚¨œBp-µQ‰cEP!Ràñç¤H`dæDH“y˜¦œBšŒj¢r -ᇂêRâX’Éü9)™9Qb2^qå’’|¼§áiHž¬’ëA'©„Š ÄÎL”àpŠG›Åx@´«C<¦©Å%)É%Êqj‰Z¢"KO먂óðü9M=QB]9…àQYixòÕíÙË7¨Jyvû…—1Ç­ESf·w|—‚¯ç/ngŸïYÿ%»ì×»Åz·ýûí?!…ïHêœVbçžÄ^\~=ìú JAî^dÕ„¾‚ˆÀélõyÆ?ª&8´‡o¯0Áf=»S`#˸Åñ˜uÍÓ`hïd´1&ã]_¼£Ñ<îkªøÝÛÙzö»¨B«[–s£>v>|{qsŶ¡“ï&GýÇ54ÿ9åÂfd¬csqä!öÞÌ6³Õ«ÅK…ö-2GUyOæýú Í€•÷qm¾,eèÒ ¿>¦Ñã¹|.‹’^ÏÑ‹µêóëÅŸËùìžäP0š"¤ì)ìÇvÉ[w U\ ñ”ÇÅbà9î+l(“Y‡éå·Ùúî~¹þ½†v#eÉž‰†»sEðð?¾.w‹íÃlÎÎGƒÐvGŽç`]·Ž=v˜xþÓ®—k‰h\¬'{© .×ûÙnÙsþBwZ¶¡Šü\F;qλ°àØ´â¿Ò#ù<:òÃ~¹ù&A‹'mHU?פ8ºwjè%†Å[p¼é¦?Ö»ÙŸ¼ç‚âqŒgñÿ`·¿©’‡›ìâs¿ß±!ðB,ìTØ·“9cÅ‘·Òp ½'5…¡åÐ{ª04ⵘëß-v¯®ÞOi0Ô€ÊÇD¹ä DÙÍ£46Ü¢“ëñi½dgSgW×1åô›û;^!|}øv¨úOF¾•IÕÂáZÙT‹æ°Z ¹ÝôwûyÊ'uíh}ÄžsEFì¾O[jÐW NhËŸ“ “I°q’¶!3È›Øyà²/…Ôû?Öh¦¿.8Hñ°ô¸ùoäƒM¸¶·µ 5glÖÍl»ý£ß܉k8ž´«46ðG_ÒÒž×Ã"]36亟 ½uO²çÇ£CpÎ4QZam_/Ö?È`¤Êª‰‰ë-N ìÔ<òz>¦ùŠƒ§pÃ( ‰\ͺÝÌîúžø8%ÔmÌñŸ®^³eHÔy}’ôaH«öN;¹›~Õ˜n$ÓÑe½_}l\e”±<œæèßDo56»£6ý®Ÿ÷|>Áƒ™<•ÝË~õp³ËŽ÷‡e<±Ý™PìôHáO5Á‹1™óxd±ÖnÓUžøÄ+…lûc»[¬(èqõ]¹pÓá8'·O Çߟ>Ü5ÝÓæGóßÝ’1x¢¡~~ݯfÒb Üÿñæòo’„Ð=üèíÃåƒvRx0oR+.Çý¼;)¶ç»jdÄá`Úï7óPžÁ ˆìÅ‚ïAÎñÚ‹=c’ÏÒ—›ÅÝR.„éÒó)ÕÁˆÆ$H\!ãè]‹ ®Ñx»)¦÷ Wa'ÕE<•Lw4îûMè{ñP¬:íá3ˆ{™Ôƒ‡1¦6žâ˜ô—õ$è/×£ìâņï[Ø[š§ím ¹¯h©1¨x3ŠîãO«|ØèÁ„ÖppXz;E¹à2‰¨;<ë¿Ës¼Óã»xÕ‹¼Þ⺛~‚Sûx±ôF9®ÛR{³|àË5¼Ób£eIÊxÍ4Ê%ôÐø`7½Ü7Ž@9×[¾»½ž^¶8Öã5Žp™÷ÿ§Î'm”¡+¯F©RÎüÖÂ`ù6¶Þ?,Ödôà"ি_Îå~k€×ö((Ú†§ƒí'ÿ§lû°_lØ -z ;=ÿºZéÙbœ¡ÒÕÇÐâêèÝHåzÎ[å ù”­± ‘Ç\ø‹‰\#xäT8<¶N/ Èù‹‹^Mú¹E.Zˆ·²Æ{QΊOYøh¤NóÍB.GN©r°rãHu9§XŠÀØž<¶ /ïû­<ÌÃòħÐGÙbORŠ9¸?Ä"†p†|šë¾ÿ¶ç»j¼œ©/L¯^O%×üÜP{ܤJŽŽã7X¸»’~ä)'ý…YÔ@ò6âÇjGé­…b×Ë7x”ßG”ø .~¯oGL/Þ¾ºÈ^/¾/îû\f¿î—ò2H?ø(Q¤Î›¼£—–KrÎ/·gÎþ 1î)endstream -endobj -520 0 obj<>/XObject<<>>>>/Annots 145 0 R>>endobj -521 0 obj<>stream -xÍ[ÛrI}÷WôÓÂ>Xôý²/ÆƱÆ0Hó@ÄF#·±Ií‘å!øû=™Y••-Ùà˜E¶™ÐéÓuÉKeeeõü¹—D1þK¢*²2š.öâQŒ'ú×»Wô$*ó/¢¬%Ì£ñž‹¨ˆœ‹¨¬œ‹(‰ëQj:µlÃf%M'+F5¦S¤£ÂšŽh˜4&¿I¤Å`³„º ¬Á`«aÇ/¢4®=[ 6mF¹é¹ÈiÂi:*1áªÆ¼Ðœ Ä q:Ê i1Xè²r?,ŽÁ`ëjб ÓLü   Žsƒ(i1º-2M` &¶¡))˃M‰&nP:¨çd@ZŒn³lTE†5,t6` Û˜Rh+Sª3v^ÖvÁ LÉqn -JZŒnÓÞšZ ¶Œa¸ÀÊ P¹¨ Ê ê87ˆ’ë •Iø¶e -=Êòº(Š’ÝŒ‚Ô@RQ…w IþYäYpa¶ŽK`hÿ&‘Ólsê–ßeÖ`°9[MYQQWau\¤[%-F·º6¬(!©ØÜ"5êÖÀEÔÔ$ŠrR§ÏÕ”/Î@²†µÉ"B2‰ÈÄ ˆè8‘I9±+”HŠSå ¤ñªi1XWLU›Z ¶Ih®ÊŠR—e’ÿ¤ ‚ÇÙDà D§8ða¶ÚÐbš.O(°ƒE"iµ,/LÏ2]„N=¸%ƒ0]ÇQ.["VÑ›DZŒnq“Ö`°Øï1%eeÐXr[()ƒ0¨ãÑ«r¢Sœ^áyJZ 1lÀ ®a;¶,6+<ôl0؆ÎJ†5«jÒ¶,*=)¥aQ¨¨žÃš«ø³zyC§Lš|¾¦TJµ3ÓÁ¾ÔRâ¼E›¤¼É 4t\’ÐÆL'³R j0i(¥ù(+Ý"‹%?‘n„nçºUÒbé6q¨j*êÉ$Uõ0 Î@²„¬ô¢ÒCtŠì’()sEâE:—¹2su\cåhNoi1Íuƒ5˜ MÇ®ÐVEÝ#ŒAÔq²z%Y í¸ÎAø75c8;Z)M“ÎJqwµä—ÜÿÖ#e(¾bEhùŠSDµÄ3M• éå>Ê„¹AÁ8}R×Ôà8 \€àj²hà„âóž©Ë‹Gº]óo•×1RÚRŠa“QóomäN™” óÃî‹@°\’ÌEå‡(”îùdïÙKŠ4ÑäœÝ-F±¨Ê£É×ñxútÒ~šwQöËu·\_ýsò_´*0µÚ'/E³ý”š==¼h/×ÝŠÞ!Û@'gO£fDÐDàé„!Â}Ú¸GGý¢-é1Êfáñ»·‡OÜX)2$J8`h:ç£w,鞶7À‹ÉÉ›WoN©?”aÊ4sÄêrÊCc7n*÷l²j—Wítí/Ÿ¶‹îŒžbiIí^;»ìè!–mž¹évõ§Hh¨ýG\(ÙJœ°ÌØz+/ôÉø€ç• -Uë»îÏëîŠEC NšÔ CÍçÝò3K‚T·ªv-Ɇ†ŠTÃFnH–ÞI²ƒëõüq6m×,‚MS:é¸oU:‡Û{×ÐË–äC“ewlÜ­þrKæEzÛ^]}íWìŽXÅMâ=zܱu¤8sÑ]Ë'ý™³ rÅ Êzü‘oŽ^³¿bÙÖ~-žôŸû%=Å¡©®s±çýÈcGñ²!°nÊVÜ͈·Èv~þ„ËÅp)ªøÉhI£ñçõÁñÉøäÍäãÇÓôW¬Iî|Ðjng¿‹BfMtcÒÛ‘ð·ënõÍ)G#Î{Þ˜8•.«£Czc¹‹£;“àû;ù¡M˜GíeËݾ»lP_,±7ò.øýñvÊ%«i¬0%‹bÜküîýø=ëå¥Â-öèonÇHõp×rŸ’•x$ÝF \²m»ä© ÓÈË2/éø¢]I*ó¿¦#/–× öI”œ’{hÃ%œ|¨ lH·í“7Jwã>öê=/Ï{–¨©ËP6æ²kXÔΖƒåWmzìáêÛåºÿ¼j//fœHR¥I-w5;sÆ£¼ò¹nÏuô°e»ô‡PÝÅCú;HÓL’3“}±ÄŽ„¼âç.p'}Šë©q‹¾~ŽºóÙr¶Æt8/ÇGpþŸ;¿cl'BE·Ë&€âždK‚·«~ÝOû9Y§”G1}¹hØQ¬Úa;o<ì Ëï5ë»Í6nòTF̾Þ\Bãã#v›¶KÎká~!8¾óï¡ÎQºíú¶Áïë¹·¼jCÈíuò¡›Ï÷¿,û¯K²* -Y©?@ªPËtyï}  ã”±Ä;z7$Ù^/·K©”‚(nJ> Û‚"$YsúnIåFšºMGÚŧ–žáÊ+Éý©úíj†Sæò3TÀñ¾£²Z¶söf|7¡®«J¾‡eFózöR‹#ô’uNˆé|Óý>]­W®ÜÍæ1o«(‘h Æ8&¤p~饰fiìÏÃl–óv*• ,óÌš“ ìÄYì—âûv5ë¯Ù‚¨ÿ…cÁóvú…‹ÊnVxOè–gü& T¼Ë=Ï)‹a3ƒÜF0ÐO37‹ÃÏ5 ¯´|09z.u4: x߶j¿Ïß^:Ô 7\Õ¼€¨R¡Du|Äk¯ -õЃ!ç3쇬 #`tØN/ÜÚÅNÒ­’2v(WwAÅP+e”œ®-%<Ô=}•ñS¥œkSÜI Þ¼.>Ì–gýW 6¶þs:y–þ›f†JZH1o“F4ʯãx¡®}Ú¯gçþÄ\W;Ý•D`±S”Ã)iøaÄ–@öÈýáøț£X KÃhÿ@§ä’6`gæÈŸÞˆÖ* êaj®—ílÞû"!®|šÝF£;Æ/Z¸€EïdX‰íÆ°“ 9HáfL-øûå´_¸ÅL_^iÛDpZÑU;þvµîøÍ\û¸£ ÿïk%'òÖÆ(nè¡ŸÛlØxÜM¯W³µ¬?¦äBdèPô&߆®‚°O–ÝWzˆ‚^\øÊ´ò„bs¬ .JØßÊGðå'^>aŒÆk¤ÿí¼_²`°¬&RÑùª—Rö7­šü~zü‡¬ÂÚÙå6|»#T.†‡Û¨/©†Âý -Ùæ$(i©àÆ’I0p¥¦×MwôïXZÜô Ÿ"ÜË!×+»C¥llë'í·n%:ádõaLx»qGNºÑßD–.}íìÓƒËË9ÝBù×oä”*‘›?¾•·‡qÄþiçï½Ä^à “h|¢ñ@»¥HTÉ%è°ÉÒÈjû‘4¯û³k·q:z²ÐC×ÚH÷n²Š‘Ãf³jö‡ùá¬SŃ-Ö¶§]vÓY+u7ðÑE®QP\þ_µ‹ÿ\âÞóìQøä"Ëvš™zý9‰èë£õãïc¬ÇÑ,[9>žj¢¡¶çGœj†›ÓënÑË=-‹`ŽvÙ~ÈjÇ·¾æátÿz[¤ÉÀ½¤2¯9Äß8øs_Ù>²-¥â/Ì™@Ý)3–g2ã“vùº]òRAZõpùDŠ›‡ÚŸoøÊfðÔzKñb9¥«°‡yf'¦®2À$È(ß Âa¶™"cCZ!ŠOu†¾ÇªbD˜}šCŠZ†Kí×^2t›Èžõ.ÝÇÜz4ãE‡Oêüš‹ðÕÇ—_H_(ÝÜSTÙ¶~xËá{Gþ §«<Çÿ¦É€ã[,l[Ï¢£î¯nÞ_"É‹^]»K± ߤ6äóUÜÐW[³ÙŒ„z1Ùûmï¿Èendstream -endobj -522 0 obj<>/XObject<<>>>>/Annots 148 0 R>>endobj -523 0 obj<>stream -xÅSËr‚@¼ós4Ç}²ìQz‰©$ò¨Xš0bLåï3³"µ~A  -ª»çÙ,_‰A·§@§°©‚˜þñ±`RãéYö(;p„UÁ -¬Å4Ò"X÷¨#-‚Hé1‹Ä“ªÝ£aR3û¨F¸e$º¨²NyÍ)4nÖ^%‚8‡¾ d-‚<ä]BcLªÉ¸e¯Nòd4÷ ä;–\´:ù6˜Lôfëc ͦM})ëKû”R–%g8kØ¥ § ¦ûât)ÏÃöS=*²Ð\ÈœLñμõ²¨™4Ð]`Qo™SM¦:î5¹d‰òõV´íOs±†üp|T¸Ñ¬ÞœO—CJ榟“‰ó4¯FÅ‘ô¾Í¤îmò}úз÷)Ûj}âV¡‘ÕhúF»Ãñn- Ýñ.gxîÑ<ëvÕ -Sï鯹mº/'cx.¯å±9•ç߇m˜] Ú’)NxöäpåB³>/XObject<<>>>>>>endobj -525 0 obj<>stream +525 0 obj<>/XObject<<>>>>/Annots 55 0 R>>endobj +526 0 obj<>stream +xÕ[moGþî_±S Úììû~ôK’ Ð$=K×O +ÙZÛ:XRN–zÍ¿ïCrfÈ]%HÃyÝHõèYÎÉ™Uþsæ’ ÿ¹¤É“¢Nn7gYšá›ø×õ;ú&©Ëo’¢K“ù™›¤+ÓÒpn—WigÈ¢¦A‹*m1hS¥ÎÔ@f9 ò“D²2Y‡™6I™Å PU[=]"Àëà&©2L§œ°¡ÃÊUœƒºJZ ¶j ”a ‹‘²o’<ÏÒÂÈZ V–5+’ƒy-[4ƒ‘ÙïUMÊÀ9Ë€œd ùÝa¥•ÁªNë(È@=çrG.Œ¤Å¶®0‚²2lI&}è°žkK’‹œ4oÉÈHRŒT®1À@Ás²ò‘3p“´UšûAHÎ@ÌW6db#°êTj„çbVD’Ë.S§ +ˆ‚#'‰’ClÃβƒmrŒ¯²2iCÑê]^2ÐI=ç2Š;%-&§“ƒ••aën Ã2Ða=燉¤Å4,­eY¶r¼˜¡%Ös-m!å Ä ŽÔR’¤Ì)¢8£9hL¸.@˜A™Bäù"i9’!Î@Ì—•ä¹HZ ¶¬á{à šc1£¬8©G—‹:Às ¥Ô2r’By'’“B!‘å)‹®Õ¥§ "«DI Ù +1(ç4%-‹Uk¨L‰]FE†—¹` SzN¦ŒœdG‰õRA‹Á¢®Ô†•)±nq× tJÏÉ‘3¦¤4©‚Ó”\£¬LYµºß :¥çxñ”3ƒæ9 ª‚%œV”HÓ’[ðŠ($Aöy$+,h4„3?É@=GK‡)")‚N:d ‚ž£ÔS%E$i˜¼£`óûNÉñ¾ ï;å Dbn°ÆÊH«QÂ|%y¾ºfe:Ÿçd‚Èè A9D^žÄ|EFóE’×7¯¤á(@ˆ6£%OðƒÄHFPH))ƒBý§9Ôs˜Êˆ ©Â*g YÁ.ƒÊ„¹)õ9Ðs-m|å äFª2Ú1!| uP +ÄÜIÀñ$€&4 ÃO²6,ˆ2#8g ‚žsXR¨IŽ`‡Ø¡tÃSˆ‚£Ü"'Ó“qFù2ò*ÈT¥åI¬¥ÔËŒ TÐsÔ\`ÆHŠªø’ò¿2PAÏ9´\%¢‡žÔ )È"È@=燢€žTA$ uôœloJ+Ö9éTe ‚žs URI¶çÊ èìr:JÔ¬‹"¸TAT³•ºÈ &F ÑnŠÏTKeãÇøsòŒ« è)ª¤6±ŽBž‘%‹ a+“/Xˆ?G!Ï8äôôQ,„(:‚?G!ϸ–ÎD‘ºXœ½~ œ%‹;ÄÒr•ÔM™,V|ŽÃ×·¯Ë›Ç>ÙÝ%—»í¡ßž~XüRZ#’šy±YNb¯æç.Îé ä„&§#"¾L®úßûÇÝç~ÏÂPµnõî¸^õ$cŸw­¤Sÿqb$6…Ù¶0”*òÈDçjoâ¢_nØŒ:mÛò…˜ÜèÍÑ5Ëòd†$ÊKv~ótØ/o¼jmÚT/Lù`Äèÿ9é;+XáhËåÃòó¡ß³)hÇ΀.¥¯°˜!ïÖÛõa½ÛÒ׸ h3yty2í\áŸþØ.Þšó£UZåÿþçýî°»Ý=26„Âr»¢¯Ðú”mÆXn8ÊQöQKý—×ýÓîñÔ@ikë0ƇݪçÍ‚Ö©(ÿ‡mQ‘*¯ßÆHÎQO±Ä1š]ê}S£>Šw>¾YD{ëlÒ ‰6Ø‘Ë«ןί.Ïç rî*Šè]»¢EZL·_ŇÜ7´¥Ûòñâ# Â!k›°P&0ó¥G¾m”g‡µ„œfd +¹p¾µIý†M:_nn–4nð\‚ó|û°>ô·‡ãž7ºÉ3V3ÚcÎeºÁ°0ãÅ|¿=ìw«ãmÜù/+å²93œZÍöÂQolŇããa}xØ÷ËÕz{Ï{L«Gâ“ CGRør˜èŠâð6ãs‡§XG=«MƒÈ²cûÖ4ôÆ]ÈÍO›Ið8úTþÜFŒç£p8´©üË6m_žM-…ÔìĦjlÓöf#ËÓC,ãWýÓú~ËÙ—/Ãc·M‚Ù.Û@£ÑønnôÑrãâAzfœŸb5xŠù%Mñæâ_ïÈtR{.yúòtè¹_EA‰ôYÝÑ‘R¦1q%Üzl¢ÆËü±ÿ/IäEZ¹Ð¬}:>¥qµ6Ï¿lË?xñÑÞà<Ã}ͳZ7œŒmÉ]®±ñ$¥úeÅ­W[…‚wE øë«_àE4ièÃòv¿ F¶S–—‘3çÐÛ5üJJå°=µïüê*˜ˆºÓ´!ÕFÑ!ÕÉÖñÙ ‹Ö mûJjý†m?ýòS°šÐ2TCk[Vù=Œ›ÿ7ŠÆ ‹!¶Ø_Ù}o[naøœ‚»á¼x!iÖÉÙ°n]5Y%YoHBϘ¬nîý‡°BxŸ1åN2 þm#$mŒŒxXíƒ tõòBŒHƒôVËd¾Ê·[Öˆ»Ý~³<ü¶êoŽ÷¿Ù5™¦z‹æ¶Nãê‘Ú«ïc|f¥úrÚcÜŽwñB`~¼¿ïŸèÀÛ7°“Ÿß\!ioÃé4ú=;}Žvjsok8êôûíòQr.h_B`ºñ¥^j˜ð iÂéUŽ¬tE&7KHuUÎàÿÀAçÑŸ<ÊnêC¸7n6Ç)ýkÍÆÖ7Yè+›Pƒïi§ÂzŠ:l2#>z#»N“JH)fÕ¸Âräá +¡‰×nk>àµvÉ7_ýn¿ê÷éí¼,êª)Òñʬ4dái»üåýÅÍñîÇÏ»'éúanª‡>{.tö¤üiáúù4³¶`Í®ÿñ÷壸¯ &©¿Þñíõ ›áí(ïýîÇK±Ê¿?U^z½ £囫'š•ØçPÌ×_uý|¼céä4™ö!pè%÷(ršõÉù'êã­ü„úGߟ¤ËöDýùÜÙ´“œ]‚çQ´¨µ ×8ݩꃸWÕ[~{0EôDõË¡î.cåée—‹„ý®q£Ús{få¿ÆÇnG[@ûx ú0äê“$ú¨ü(`œ”W«ùõ Ø}s€Ÿ0LµWƒêY;®Pˆü±Û¯áî•Ÿ0OFåÑKŽ]/vèúï5hèG«Ï¾Awh8V]ÊëPõçUõé¶êë·øa“ü?‘ÃeYÝÐùï1ÌL’øƒ’"ÿÀá¬É:zrMöfqöϳ?æšñ'endstream +endobj +527 0 obj<>/XObject<<>>>>/Annots 100 0 R>>endobj +528 0 obj<>stream +xÍ[Ms9½ûWôm³)Ýìï£ãLf\å8N¤ÔžeY™h#©½úÈLþý>$nyÖ»[É3U‰žž@€ìο.²$ÅÿYR»$¯’ùú"§ø&þñéWú&©Š®“¼g¬’É…ë¤L{œë¤)ÇÎȸN²<7†Ì+š0/ñ%uãÒšÐÀuR×ãÖpbЬ׆´,Æ),k0ØÚõ. Rȹq…ꆔe@ +(–`ØHŠ`Úb® È@=—eéI‹i؆ˆ,/PÙVXR¿@âÊ•‰rbP—õH‹Á%–OE)ʪe—°ÓÐŒúPŽc ÈÕVÎ@Ì—UX%-¦È1³²²eÅá(èx®ihÊÈH ÐÒD’U¹:K@tVà2øºò/‰´˜t-ú¬Á`¡‚••I±È•K%Ôs~’HZ'UV& ²e=Î83x¸¬¦uˆ²¢¾¤ý.*1P•<—¥ÅH$-†JU†MdXƒÁ¶œ§¬x4%7‡f@“Šƒ=‡ÌHPŽ¶fѦº5De—a÷„_i1Ô))6U”½¨ +ö +Ç·4Ї»rîA®-¡”rb¾´î‘ƒÍÈHµlÁº²vl‰Á`ëÞTY^Øæ‘7y%¤¤RK*ñ/ÙNÊÂE^«G¨ ç²´@ÞWRftäß0#ô²l‘‘3Ú8Ú‡JÊ œ%à tPÏI‘dÁ¼¥<àDÁÀµ®Ê‰¢-®[Î@åÿ +7ÍývÀÅKZ†ÜÓ¦b;12b›½jg>åç¬%Mì–†®´á¸sø›ºb·ÆM=ýLJ›Úên}?žw›/4NTÎ…µù²” KƒÜÿú”Fçr©,BL:tz5>GK,ÖªÏo.ç³É¡`Ô¹OÉ%RØÝ’·&î@Ë°@Ã)O‹ÅÀî+l(“YÇéå·ÙæaµÜüÎ^C»³dÇŽDÃÝf¹÷ð?¾.÷‹ÝãlÎÎGƒÐ´'Žgo]·=vœxþÓn–‰h\¬G{© .7‡Ù~ÙqþBwZ4¾Šü\;qκ0çØ´â¿Ò#¹48òãa¹ý&A‹'OU?פ0ºË(ÔÐKô‹¶àpÓM~lö³?yÏyÅÃ/âoo·¿±’Ç›ìò¾;ìÙx!öG*ì»ñœ¿Ç±âÄ[©¿†Î‘½ÂÐpè=WjñZÈõ·‹ý›ë 5 t!Q.yQ6Aó( 7…èäÃz|Þ,ÙÙÔÙUUH9ÝvõÀ+„ƒ¯óßöUÿÉÈå²2±Zd¸V6Õ¢>®hn·ÝÃaóÆY];X±g„£Hψ£Ý÷yG úzÁimùK²a<öV NâÖÃ#¤ay:\öÅúðÇÍô×å#)–ž6ÿ Üa · ×ö¶¶¡æ ͺ›ívtÛq çѳv•Æþè +ZÚQÕ/ÒØ5CCnºù7ß{P÷${~8Ú±7çLe¾Öæðíbóƒ Fª,ë¸Þã”ÀþA}À#¯—cš+Ù9x +×2ŸÈÕ¬évöøÐu|ÀÇ)¡jBŽÿ|ý–-C¢N«³ CÂ[u´wšaÈÝu[®Ät#.›ÃúÞ°q•Q„ðxš“¼UÛlŒÚvûnÞñùfÒXv¯ºõã +g—=(î‹pb=¹%2¡ØÓë3Ÿk2¼C"2çáÈb­ÝÅ«&<ñ W +ÉîÇn¿XSÐãê»ÌüMC‚ãœÜ>Q$œ~:T·Ï›ïýÌ¿’1x¢¡~~Û­gÒbõÜÿéîêo’„Ð=ýèíüåƒvRx0oR+.‡ý²;)¶g„]50âø0éÛ¹¯/àDöbÎ÷ #¼öbϘä…ã³ôÕvñ°” az€ôrJµ7¢6 WÈÃ8ºípqÁ5o7…ôžàêÃï¤*§’É~‹Æý°õ}/Š•ç=|zq/{2ð8ÆÔÆs“þ²žxýåâºgÂq”ý‚B¼Øò} {KBó¼½m.÷ 5F=õ/b±Ã}üy•÷Ý›ÐXŽKï'(\&Ñå~‡'Ýwy®‚wz\®zQ€7;\wÓ¯Qp*.–nq`”ãº-µwËG¾\ÃK1 6êI–¤×LýÓT‹CâñÖyÚtR[Ý3§ }M#âáHlYŸüÕåüýŽ6Qu’Kè¾ñÞnz¹or®·¼ÞL.I[ëñ‡¿ÌûÿÓF›&m¾+/©RÎüÖBoù6ž¶><.6dtï"à®[-çr?€µÀûk{lÃS€Þö“ƒÿs¶}<,¶l½†Ÿ]o¾tl1ÎPñê£oqyòn¤ðrgž­r|ÎÖІÈc®t\¤Á&¥Âá±u|AÎ_\,ðjÒÏ-rÁB¼•5Ü‹rV|ÎÂ'#u²˜or9ræH•ƒU6ŒÔ,åKÚ“§¶áÕªÛÉÃ<,Ox +}’-öô$…˜ƒû³^,âagÈg¬¹éºo¾«ÆË™úÂÁäúíDrÍÏ µ§M*åè8|ƒ…»+éGžsÒ_˜E $o#~¬v’NÑZ(v½~‡·Aù}$ü€ÿ‚‹ßkÆÛ“Ë÷o.“·‹ï‹U÷ˆ Ãä×ÃR^Éñ> +©Q¶ôâÒrIÎùezññâßûˆ)endstream +endobj +529 0 obj<>/XObject<<>>>>/Annots 145 0 R>>endobj +530 0 obj<>stream +xÍ[ÛrÇ}×Wì›Â{¿ä%E‘²Ì +EËlçÁU©Jˆ,‚Véïsú2=½ )±ƒ’\%áà`fú6==½ëÿ>Ë’ÿeI“'EÌ×ÏÒIŠoì¯7/雤.;ü½NŠn’)X%Óg®“*q®“ºq®“,m'¹›Ôc°e:é[Ô$NQMZˆSå“J‰ã f­É¿$Òc°EFÓFÖa°Íxb×Iž6£™=›w“ÒÍ\•$pžOjÜ´[Éä MóIáHÁÂЕçauÛ6£‰eÑ”$ ‹2ˆ‹*§‹é1¦­3rMd&¶#‘ŒåE«®Æ]T€-8Y$’cÚ¢˜4‰c ›X‡ÁvDŠcE¤¶ààekW ¢HÊ©FzŒióчz ¶Ná¸ÈÊ¢0…¨,Ê .ªœ.b¤Ç¶hdEˆ0¶ÎaçÊXÞUUs˜ñF@‹:H&jðGR|VeCE@”V¹ Ž¿$Òc’¶¤iù·Ì: ¶d¯+&*R* â¢ÊeiE¶5ÒcL ­[ÇŠ²†Ý-Z3 i\']Kªç Mʲé1ئ »GÖa°ÆŠžiáBAÔS98¥D¥ç &Í+ZÒHÁb Ïò’e—Æ|#À– ¯9iIJT‘ôlÙ`—9Öa°ÈîµcÙ)eC +jÆ`N \–ñ¢üK"=Æ´8lŠ$õlE™Ê±›HqfQeÊSŠ¢8Öcäó¦Äެط&£ëî.Dû*GGLšDRB.:H9-” â@åTo#e`A> d*—áèŒËóF –g@y;”ÊÁgœƒØ*©oœƒ°kN§h$EÒ,‹¹¤d%UŽœÛé1¹‹öAdyÚ›ÔL.À¦ œLIiZòsd©°)šŒÍÊ•ŒšÕAX®B4 ºeåØeÅ£›.¶èB„•^÷77†-‡#vq—…ˆž.Ø»JœNCôÐúÉüU¡D­¸çAÙŸ‹Íéñ+ŽWlÛ6ìÅóáÝ°¡oÑOlÛRüù4úøU‚nH¬ûºUsâº]]}Ê•â¸wÚ‘ãDµ,¦ÑßðçÕñÙùôüÇÙo¿]¼ ¿bbÍJAo¹ƒ}®*‘‡èžÐw3áO·‹íG54®Fš®>˜P8Um«ÓúçrÍ£ÓàÓ«~ÈÐ.Í£÷r'Ü>¹mÐ_¬q6ò)øéõÊV5;«ë¼25«âÂkúæ—é/l´—*ÝìÉŸ<ŽQêáYËSj^5‘8XÇû¨žÜ É MӨˊ éô}¿•R÷+G^lnדõM£§Th/$T?tF½•;1y¯v÷žc/ï±ÃÙæj`ñ5× +eO–CêU_Ž¶_³±'Û×»áݶ¿~¿äB’:M湛奸3”M¨uÎøè£Ç#[Ë_\Bíåï¨LsEÎRÎÅ'ꊿvƒ«ö9ïŒ\§èw\}º¸Zn–;ˆÃu9^"@ðÿµâüg« + =]v Mîhðz;ì†ù°"ã–òUˆO*WÇ šU{*Ü­O†õ:\ÆÊ'­úò +Om¤‘ôíþšžràøê°ßp]‹ð‹ÉñMøúµ×-þTß!ªö”¼»O~]¬VG¿o†ò*Yy¸@šÐËÔº÷©°uêTò½{šÜÝ/kMi´‚¿PÞžÔ|Aö dHòdúdKíFÝ—#ýúmOßá‘WV†[õëí·ÌÍ;"¨b19C?d»éWÍxoÂB׌üê‚äúî{kŽÐ[H>8¡¦Æf¸ú¿½ÙmµÝÃækHÞÞP¢Ñ6Œ Lh¡q´ðnyîÃì–«~. 8¬ÌŽ‹ œÄE¶â/ýv9ܲÑÿ‹×‚çýüw2,:»E"a±¹ä_â²ÐÀć<óÔnôv˜ÁzŒlÀb–.`qù¹eåñvƒµf§Ï¥F„ÛÞìOù9h‡ô^¨jã (ˆ.ZTg§¼÷šØß¹ï¼8Y-q"²5œŠÉI?¯»g},¸î)Ë8¤´ó‚ž¡õʨ<Ý®{*yhú +i»ûË®Xµ\ks4”ýÁ gk£!Øâ×åærø ÉÆ÷.fßåÿ$¹ÐI‹%æCºˆEùç¸^Xh_ »åU¸1·ÍAO%ÑØeìípÒý³[Ùg3ö¯gSÖ0Ÿ¤ÖXgk$ø/tK®ù¢ává®HN{ÙÚ”A?ÌÜõ}¿\ ¡IˆG>Ýa³Ñ#sCP->€GåXÉíα³÷r‘“1óàÏ×óa­[™Þ¼²whˆà¶b{vúñf·àk4s›ã‘Šü¿?«¹÷>Fs#æq<¾àÒ#”LÉt1¿Ý.w²ÿ|’’"£ MoŠmØ**ûÍfñ¾DC/­Bg Vù†¿ÄáØ~>¸áèN=‚7‡ö´ß!÷«aÊÁ³VH%WÛAZ!8߬kòóÅÙ¿T±{çÇðÃÐhýŒ÷e +Þ¤+÷t[-¤À@›ÈZ÷`oP´HGjö¸é‘1BÚ›acàUlÃÃ*vÇFÙ;ÖÏû‹­Ø„‹ÕÃKö°#ïeTz¢¿¯ˆl]zÛ9”…Ç××+z +˃§°õ½r‡/U~¼+?ª)r<(•ÍçåQâÃŒ‹h¼¢ñ…NKQ¨‘‡ ãF$ÞZ,u·}N›WÃå­nBÜŽ¾ +]è…€qhí•{÷yÅéákÙàõ/ô¯z§IGG*,΄#ß\/æË^únà-£‹^§¤>zøÓ¯ÿ}çž—o‰B…\­LƒU#zûhoÿ„ç1^+’²—›á×ÓMTZÄf|8½Z¬yNFÛ"º£ßôïÔ_d³ã]ÈÐózƒ/òl^Ò™· +j†wÂ-/R_Ù‘Òð î΃ UK9á*ãó~óªßðVÁÖõÐz"Ç“‡6ÜïyËfô.Ôö”âÅfN6☃¸º)HW £}3J‡Å~‰Œi‹,>7 ¿øk†eŽpiŽ%>^joµ©Ð}!{9h¹‡¹íAÐ’7^© {.Á[¿ÿƒì…ÖÍ%@Óí·à9¼ïÈ/cávU–øß4ùp¼‹…cëùqrºøc±®Qä%/oõ¡XwR;Šù&íè­­årIJ½˜=ûéÙÿfÎtendstream +endobj +531 0 obj<>/XObject<<>>>>/Annots 151 0 R>>endobj +532 0 obj<>stream +xÅTË’Ú0¼û+t$´²–uIKv¹„„ìú ˆ]R~^[ùûÌŒmY¤*¹UP=­ñL÷Œü+I™€oʬd*c›:\@$ü¼,0Â2íà·fÊñ´{M"X3cxq¬™s\E\k–¦Žçc`•½e# lnnÙ×Lê”ÛèÉ*C) +S Ý<”ÁšåeÒAä"Ø5d"0°Fs±džp\óŒæõ\çVà"ݤØià"ˆÝ.#2ÆÀZ…¾‡T2À¸ Rz: ¸<‡¼‘ëòrE;@Nc^Ï9Ü‘‹ 4CÓÉÇ"yxvL +VìÀ7X0°ÑjVliÿ ¼™åºò¬Ý±yÛœ}s>}*~B–¥Á¬iŸ6•˜6™¿—‡³?âÜLx>/XObject<<>>>>>>endobj +534 0 obj<>stream x}Ž»Â0 E÷|Åa ØiHÃØŠÇÄ€ð 6•Š¨€"ø~\Ú‰Y–,ßã#? ƒ´¹CPu†,!d+ëác®³Óîš1pdÝoPŠYîÖpiÔò©¡ÒM5;‡²À&½ÓõvOýûW[§¹\¾WìÇ«EÆj–zÂ%»‰`žàƒÜ”>’ÑëŠñ`ØŠ9šÒ°7~endstream endobj -526 0 obj<>/XObject<<>>>>/Annots 191 0 R>>endobj -527 0 obj<>stream -xWÛRÛH}ç+úmIU–d]ÌÓrIØTa±“§T¥d{l++i¼ÒÂßïéYÛ¹lQŸîÓ—éiÉÿžø4ÂOI@aL‹òdäðIÿëéö$N¼ˆ¢4ðR*ÉO|/éPAÓ“ ‰¼Iφqà:…üž‘ï…bÏÔ h<Á¾¤(òâ0åÀ’â¬!s„æ(EVébŽÈ‘ÖÁ`ã òqXƒ$¨Óa\R0æž ¬‹Á&“ýr6N\ÒD¢ -R…‹Ç¶E~ bÒw0—#Åöl$®¨‰ÏÇãÓX{:ŽË;$w>LcIãwWû9©¦Ü‚ž³ñ Å'æû#V4ÔáûR£ø¬*Hêp0\Ç>ç:°›„|¤=+QC¤"34bW‹DØÁ\g²ÇZ×tlך -r\wlbžµ®˜uîŽ3¡P{:ûÂf yªC÷éD`?bâ'(È2ç@—ÃÄì â…Ò‰ Ž<á8’¾'\ª’èራ‚Ö‰%“.‹ƒGâ=këé:*‡¬‘ ×?aÙžt1XÜyÈö¬•õyŽÑVÑ0ÈvÏzÞ“.†¬ÌÈÀZÙ/‘¬€A¶ãüç(ìI³ìˆkéY‘ &¼Ò ËÍ´@dGÌw쓘m1'|áýÿZÄž–Ä“FBð4,»6à‚˜äÙ - &÷6DV05`woNÜ‚Xªû7¾ýb…ˆFÏÙê1ÞRÄh„9 ±£ï`”8–nô¬u… —(Ç`O"Ó€Kê9rß"\ÉQ?åÖ"׉[À¢„#ô‡t1Ø(Üs•ãàâ®úqy‹X×’±}H1 ]A‰'4(åËî È°Ûë²³}AØÍíã™éc„ äÈ®g~HAVPONºŒsLz*ípáú詸[¡8æ”0åø">?”zñpg0p¸‰Òâ½ 0pØšò0Hbˆ`îjvrþs5¢Ù -/q’Òl)ïødqz9oL-Ì›Ù7ØÅX!Öî ,Oï²ÆЧí23ÊÚŒ;›Sº {]ÑTmqMq”Ax…t}3ãA ØzDg2ÂЙmò†æZÿCø›ÑB…Z˜zEK½hKU™†Ì&3Tæ롹¢¶Q«¶ •®i«ô¶P´TϪÐÛ¼ZS“•óŒ@™nå•QµjŒZâß.¸\_jqÐ}04Ti³áJ]+ŽXý"¡—:7FU4ív¨eÌuk Я²¢A5±Ÿ³:×mCÛ¬F}(ÖæUKñœÞ_ѶÖF£#]zÉ‹E,t‰’òh†¥ÆAÔj6Ñ3¢w­C%Mß¿ƒÐ T†.®t‹`èëƘíÅù¹TàIž®×ç=*C »VÎ'¡é›*JUÿÙ[z?:ÓÝÙer˜œLŽ‘Êç-Ÿ+> E·ŸèVUªÎ -zlçE¾ »Å ì—ÓÛÇ»/oúª.1 ÛWî|ª‚«¸!zT´KÄyÉÍƶS†¢Ñm½À°ì2A¯zͽ¦èê¬È+…æéZõòòâ­š•´©‹Ûœ¯·…g¾wW&q® ¯uõlŽIEî×3‰©fí½Ëµ›KߣµÊ«|w”¹úðqJÝDÉCV*zR.Z±»×K%šø’p6HAìáÝŒÝjÁòèêéãåÍõåtF]Œ#£þWS—?s#@d*ݽ¬›Üàö¶µœÍ¾ÒøP™Z/[¹Þæ {`—'6œG÷mapbµÊ–|¹H‘>È)ðÓ¬7kÊùòÈbìZT?²ˆ<ªæånòµl†½²$f_J»ywõé–šW¬‘’C¹¥…wX½ÐÇÖlq璘•É¾$„'´½®¢ôåc}Ÿ-j}dÖ…³Ë››_XJ…ŠÄòîóÝ/,Q)ç÷¾­¤õG3z×°œ¯únXè(->/XObject<<>>>>/Annots 243 0 R>>endobj -529 0 obj<>stream -xuXÛrÓH}ÏWÌÛBº_ØTåØ,/¼(²B´Ø’W–üýžÓciÚv(ª §ïÝÓ3ògññ'0Yh¢ÔTë3ßóñ?Ó_Ÿ?œ~è…&ÍSÏ7kd±ïÑÊÌG6 ½œl‘y…I)6)¼TXÚH‘MB/1iœÂàÚd í - § Ìù$)f› pRÕ˜t:±EŠHÓ(‚ -Uý Ñ°%CäO2,’ ñª0U%™‰µÉø´Žd$^’Œƒ43 ‰Ôlœ{™bsÄ™‘Ô/ÌP hUÁµI ¨9NÁµAë´žDšä¾”=Ï`ÚÚT‘f4*’$¥:IšÙÒÅ‹H -³:!Ì+Váµ ýer¬5œ°.¬€¤ ¬5äX…¡‹éDÄŽUn£„…˜Xë6æ@5(˜ q«0 lÅ* ÃAÈ*Nºˆ ~P=N}“àŠðÁl(…$N‹.¢û+³àsØ׃‹hPQAÌBÀÚOœ‚ãœ8NÆfoc†®Lœ‚Œ”Ýq¤¤ç¹mYà#(‹$æ£öRXŸ=±È‘ŠÅÉ"ˆSptéHëçC*‡­T˜X³Š³8…O†«ÍX€xäÑ´‘Ljœ¢ŸKXm±‰Sp -u"%Ô¨HlŽ¬ƒâÑAzäÚs¤UÌyxû B -U$g#’yY›˜CeõDÁ3/Rœ‚°ésá9EÁF¬¸cÅ£,A€u‹У‚˜8ž Ç)ˆ ym8ÎfïïªH¤ÏÕaËUÅÌC#{•QÀH‘´f}»ò±Í (€œ‚‡Æ§ Îí«H†bÒìUÁCnÑN˜ÙË Àx‡Æ"G¦v§1OG(hŠ5Äq–à[ Š"ž€GÇ‘ƒÅ’+4«0Xœ[/^hXcn³àЭdí×> -ÂDUaFwÅʆ eu€Ä%Æ"IGì¢ËvýÒ~(h"ùœnã–äq‘qª0ìÆ<VVX…ɲ©šu,6N Y…Áb>cÅJ:ºl L‚$n¶†CÍÂðˆQb?£ÛIWc°§Ê±Ö-Þ1òd 2f+HÜ*ÌlœbfP Cžt­ád\âbX2<²Ø´ˆØ± -ÃpÊ5ªX…Áâ !¨I׺Edcã‘ åvda¨Ð¬Â,#÷½ÓÕ,Nl¦Xë]’‘²e¤ÜŽ¬-›cfyf¹eöã(/d>Re.ˆE$–†.«¨£c­®$ÖÊ -Rº#‹—3t«0teš+–1ÁvA1(ÎîȉÇ9£E€.MœlRÜ ¶q!ª Àp‚PÃ㣂‚Â9_¾â´ -Ç~î!¸æ&›ÒÍÔÞ°4S€ …“–}¹®‡ºßRà ÈØ á¶v}kÚ®–<m °ËnY›ê v*˜1Cù°:•L=³xªÍvýàU]ûh+¤­¥⹩7U¹2³¶\=o‰êXb—írÕ´ßM÷h¾>5C½Ý”•¸U)Ð Rв7M[#âvhÚ]94]{”5UÐÁ1ói×ô?$šóÃpà`þÜåïãã`0¡ÙC·̆eÞz•”£35,óÌ]=\\ßÏMÓšÒ|i›ßækׯ–ÇöpMzæºún¹«^Ï|ÙÖ}‹†wO]ϼGÑÍý¯Í~j6G™ãIÏiØnuýòT¾éª(ù‰z{U·Ïæƒpªˆ}¹Yv]o¾\_ -äpÛõƒiwë‡Ó1Ä(àûnèªn…έ7+LÈð,…Ô€ø©8[™ùíóv¨×ô:v -“w sÕ­KÔüóÇË¿D@[ÃírZìcˆÌ»]_dMm4㲯—Í ¶†+ -tZƒ16ó¡GCw½5sèDFHDÊN°òU«{™äÓ$C6ýÐúQàoç(€é~âè¢~í§ØÜa‚–æc³‘uVܨDS¯Xr8su¹¬û“˜qó¢Me³záBD$ JòÖþ3«~HŸÕ™ÆÝàaï7óÙŸÖ»–òPJßoꣶj*;=GV1¨”ú´«ûgœ³ÇNɉbÖ(:¿F ; Ûr?R/Õ#7Å0¯«¾^(žü"u¹ê¶ÇËŒ‰à†þ¦ë~ì6f~}5É -êO_{)6S":ê=ê}÷nqsÿáþÎô›êOÅ<ì~ÌîÓøçú¿]½ÌåÎWÝ~? W®ŠÎvÃS[•Cm“€ñõjMÎëžS8î 3·5:ì&Þô{éÙ-2ün7øÛ÷x7˵àÇÄ´À¯¹\µóÙíÅ ëég½ê6Ø.æîYJ¬çÞO”<Ïü‚·òìa;ðc€1¾…ó<ÆïÁ "þÏ»ÅÙ§³ÿþó§endstream -endobj -530 0 obj<>/XObject<<>>>>/Annots 283 0 R>>endobj -531 0 obj<>stream -x}XMoÛF½ëWÌ©iføMª—±“Ô¨í¤‘šô `$Êf#’*%×ð¿ï{³wdM;/o¾gvv¥&‘„øIK’Ë¢„Aˆÿ|z?™æA)y™¡´EňÖ2›X 6!åd•5l‘™a³˜°ˆad9 Š=¢ªóšMƒœd\Ю"µk°óš[^l^‰aá4R5SÉ9ÃC5‹˜ìȺ€“$ˆ¡:MÈ)Ðx=„b’1‚‘´˜M™¸g ;šg]¼1ZÂx£”^i¼ƒMša [D jÔu†Cvw4¬È>°( {Ö`èæ)‹èYƒÁ–ë?²ZÄ Õse^êÀPMCÊ°ƒÕîÖ`U[6¸•áÄƲÅ`1¨…aµRYº‘IKüvHÏf2E”¨WEžÌR×¼4C2E$]%Pä(H¦€œ5Õ9á1Ž˜‰'5œ-o–18E´ ÕbÊxFÖ¥‰‰Ò“áDÕ[rH3Ïrú³¡´¢çÅjØ -†.UœL¥Ä¤x2c-Ó’?Q¨è¸‚§\`Rä dG˜¤'-‹™‰-k0Xø.-k0¦$â:ó–-›pÃxÖœó¢ - 9ZáE…Ó‘´,fEYgVG$¦:—TíZLÃ+áYƒi¸`6ž5lÉ2¬Á`Ñœ#˳šÞhÙb°¨ia,»„°?õ8aP"I¹„<†[Ý †5,! {]ƒá6LX‹rŠI4ºï4æå¶o“Ž÷à ¢*HÎ@„zÃèHºLCŽ&B§E „¢ÞvéHbîJI°8JÈ9Ü*£œ6'¨F=„Ñ0CyýD2_ñóR^2_êg¥P拧Ad\ÏÎev~#×ý]¿Zý4ÿ{r†OVgH%†8¤ ónί®g×æ_¿Þ¾åùõ‡÷n)ÿ\< -ä÷‡zx’U?ÈÇË Ê„Çã`ôÙ½à2ýéóìó…̇ªÛV‹ÜVm½”ͦ>u™py[ïdv_!õ·ÝC{âïç½L=ü[òâWݪÁ{ÈÅð´ÙõwCµ¹o²m–µô+¹ËeßVM'ç»ûºÛ5‹j×ôšÁqp1rY¯š®¡Àö$ô;C¿ëýú6A }Û‡ê>kI‰ú\]n¥ê–ò ÿ ãp«ò¥^¯Ï¾wýc§â'nJa„`jF¡3LË8842«ÚoÂmrw‡ºíê¡«Ö'~! ·ç߶»=SS¦ñ`5ikeU-jÙõò¹šþa+oªÅw©»¥š>ÖEI4×C-óË7¯^JQ¸ûª»«¯.å¹X7(¡\T‹{Žª ôŸ½Ú±}gǾ0ó_šnÙ?nÑô×ño£š³-·ý®Y=i‚¶î²wµúru;ûŸ:áY”yW5ëyj µšß×òÇfÑ· ž‡tö´ÝÕ:ÜGnqçÀq½xšÝ“`>1òª«©ôŠ¦mz¸C!½ÃðTë¾ÃªúVþ¸½úó¤aq€¢ÿ -Áu½6´k{p°·j=¸®žêát>ð)L'd³Y›³s\ªá!Y3ÈK rÓ/œFþ¬$èá3‰VmS/šj½7ô³l«ö¯MµÝ.¿zÅ#?PÊÍçÑ©Œð%N 7uÛcóÝT]uWóøžZÁz™×[¤Ó¨‘ÕuÕA[6öÍG„òØK,µwÒ Û›y Xj±8HØšb•£ý£,{vo'°øý—ç‘á. ø?êØmÛo,ÃãRVÍZ;ðú]¹¿LøµY>åGqÞp¸$Pç7çØwÿÖë~ƒ¾Ëû¬LM/*J•=+Â)EírHñEY¦øBDJñ·óÉï“ÿ¥rendstream -endobj -532 0 obj<>/XObject<<>>>>>>endobj -533 0 obj<>stream +535 0 obj<>/XObject<<>>>>/Annots 194 0 R>>endobj +536 0 obj<>stream +xWÛnÛF}÷WÌ[ ¦ER¼ÈOõ%q ØŽk)y +PÒJbJrUriÇß3³¹’Ò¤0`ûèÌœ¹ììúçħ~|J +cZ”'#o„Oú_Ï·'qâE¥—RI~â{I‡ +šžIäMz6Œoì°Ð¡(äßðŒ|/ì{¦^@ãÉö%E‘w€)–Ç` ™s 4G)²HsDŽì°OÃ:ì$Aëà’‚1÷d`] 6™ì—°q’ à’&®[€”*\<¶-òNX“¾ƒ¹)¶g#qEM|.8ŸÆØÓp XÞ!9ƒ0AŽ%GÜ]ìç@¤šr zÎƃŸ˜ïXEÐP‡ïK~೪ ©ÃÁpûœëÀ:lò‘ö¬D ‘ŠÌЈ]-asÉk]Ó±\k*ÈqݱAŠa{ÖºbÖ¹G8΄Bìé@îC›ä©qPÜ#¤u€ýˆ‰Ÿ  kÈœeD\³ƒˆJ$‚8ò„ãHúžp©H¢„#® +Z'–Lº,‰÷¬­? ¤ë¨²Dv€\ÿ„e{ÒÅ`qç!Û³VÖç9F[EGÀ Ûq<#èyOº²2#keG¼Dv²ÙŽóCž£°']̲#®¥gE6˜ðJƒ,7Ó‘ 1ß±CNb¶Åœð…÷Cþk{ZkL ÁSÐ@"°ìÚt‚kb’g+€šÜÛYYÀÔx€Ý½8q b©Bîw @Üøö[ˆ"=g«ÇxK£æ,ÄŽ¾ƒQâXºÑ³Ö&\¢s €=ˆL.©çÈ}‹p%RDý”[‹\S$n‹:ŽÐ ÒÅ`£pÏUŽƒŠ»êÇä-b]KÆö!Å$t $žÒ ”/»/h Ãn¯ËÎö d`7·g¦b4#»žù!YA=9éV0Ì1 è©´[Ài„ë# §ân…â˜SÀ”?â#ˆøüP>êÅÃÁÀá&Jkˆ÷2ÀÀakÊà ‰!"€¹«ÙÉùÌÕˆf+¼\ÄIJ³¥¼Sà“Åéå¼1u¶0ïfß`c…X»3°<½ÏCŸ¶ËÌ(k3îlNé‚tESµÅ5ÅQ^áEÒõÍŒ%`ëÉCg¶Éšký7áoF ]jarè-õ¢-Ue2›ÌP™¯7†æŠÚF­Ú‚Vº¦­ÒÛBÑR½¨BoójMMVÎ3e6ºQ”WFÕª1j‰»àr |©ÅA{tg~k¨ÒfÔºV±úIB¯unŒªhþÖì2P5ʘëÖ@  ^eEƒjb¿du®Û†¶YúP¬Í;«–â9}¸¢m­FGºô“ŠXè%åÑ !Jƒ¨Õm¢DïZ‡Jš¾¡¨ ]\éÁÐ×1Û‹ós©À“4<]¯Ï=z*T†6 +v­œ5NBÓ7U”ªþ£·ô~t¦»³Ëä09™#•Ï[> V|@Šn?Ñ­ªTôÔ΋|A÷9ŠAØ/§·O÷_ÞõU]b@¶oÜ-øTWqC(ô¨h—ˆóš›m§ E£ÛzaÙe‚^õš{MÑÕY‘W +Í9ÒµêõõÕ[5+iS·9_o Ï|ï®Lâ\^ë<êÙ“ŠÜ¯5fSÍÚ{—k7—¾G7j•Wùî"<*su÷qJOÝDÉcV*zV.Z±{ÐK%šø’p6HAìñýŒÝjÁòèêùãåÍõåtF]Œ#£þWS—?s#@d*ݽ¬›Üàö¶µœÍ¾Ò¸«L­—­\os†=°ËΣ‡¶08±ZeK¾‡\¤HäxÈiÖ›5å|yd1v-ªYDUór‰N7ùZ6Ã^Y³/¥Ý¼¿útKÍÖHÉ¡ÜÒB;¬^éck¶¸÷Ó·ÊdßÂÚ^WQúrŠ±~ȵ>2ëŠÙåÍÍO,¥BEbyÿùþ'–¨”óûÐVÒú£ ½ˆkXÎ×F}7,t”žªb°YÖ;Þ==V@æXÈef¾.Õ¼]uµÎðÕµ?j$~­å€§ízÕŒk(99〔íPafTÍô°í’òõ&ã§vÉŸ\ÙõAæ’7¯É + X¹ Ø †Üå8xu`¥¥k,(osTNûúó%ú=oW¿ousÔ-nºõôK#DîIýþ’?”C˦Çrî pP4íîØê ÐØJMò?ÔJ¬Ö¯ÌR¨íeöŸ%L`¹—Ý`y_[­ê}0>(ßA­îÿ±Å©<ïek›}þï“ò‚#sLì¾vßÆ)^ýÒ1Þ”°Èåæýì䯓…˜V¸endstream +endobj +537 0 obj<>/XObject<<>>>>/Annots 246 0 R>>endobj +538 0 obj<>stream +xuXÛrÓH}ÏWÌÛBÝ/&\6U¹Íò‹"+‰6¶ä•e ¿çôXš¶Š*¨Ãé{÷ôŒüßY`|ü Lš(5ÕúÌ÷|üÏô××Ïgz¡IóÔóÍÚYìÅ{´2ó‘ÍB/'[d^aRAŠM +/–6RAd“ÐKL§0¸6YB»È)³A>IŠY…Á&œT5fÀNl‘"Ò4Š BUB4lÉù“ †$H¼*LUIfbm2>­#‰W€$ã ÍÆ h"5ç^¦Øq&E$õ 3TÁZUpmÒjŽSpmÐ:­'‘&¹/eÏ3˜¶€6d¤Š$I©N’f¶tqàÆ"’¬NóŠUxmB?A™k '¬ + †)Ã#k 9Vaèb:±c†Û(a!&Öº9P +æ#HÜ*LÃ[± +Ãp²Š“.b‚TSŸÇä¸"'¤Û¸e#y\¤Fœ* »1†•Va²lªf‹hVa°˜ÏX±’N€….S† ‰[…­áP³0ã@‰IÎäÈaKáZ¢ pBï¾FÎAd€]+käÄ]¸ÿRwœ»‘íŠËƒ‚ÖÝmp9ŒÜûÅÙ»OX YÜó31Í3³XÊ'¢oÕ+lW‘ùzñÏìòÇ«»Ýý›M·ýñúõâß³·¾y .„‚•‹!7ŸkÁ7?ËÕ„ +XUÂøZU¦a÷rvm®Ê¶|¨{3/×w¥™Ý^0ˆcÉÀ3·e_®ë¡î·82öB¸­‡]ß„¶«%Cì¼[Ö¦z„ +fÌPÞ­N%SÏ,k³]ßyU×Þ›ûÆ +ik©‡x.ëßMU®Ì¬-WÏÛF¢:‚Øße»\5íƒéîÍ÷Çf¨·›²·*D +Zö²ikDÜM»+‡¦k²¦ +:x"f¾ìšþI¢y{ÌŸÛ¡ü}\` &4»ëvƒÙ°Ì[¯’bt¦†ež¹®‡÷7sÓ´¦4ßÚæ·ùÞõ«å±=\“ž¹h‡¾[îªBÇ£Á3߶uߢ¡ÇÝÄS×3ŸPtsó«E³›ÍQæxÒs¶Û_]¿.ξœýì¤ó§endstream +endobj +539 0 obj<>/XObject<<>>>>/Annots 289 0 R>>endobj +540 0 obj<>stream +x}X]SÛF}÷¯Ø·¤(ú–܇vøH(S0;I2Ó¶ j,É•í0üûžs×Ö^a¦É p8÷ûÞ½»æßQ`|üLš(5ózä{>~Ó¹¿S/7ižz¾©Md=Z™éHc°q)++¬Â`³ÈK›„„Yƒ ó±—íU­×dì¥$ÃŒv‰]…­×T³ðzÀ`ÓÌ‹k Ç©‹aß›T5ì0T“€Éö¬ 8Š¼ªãˆœ‰×A(F #èIј‰;Va°ã¡9ÖÆ¢%Œ7ˆéUÄ«0ؘ¡)Va°YÀ z]kØgw{”á‹À°c†n³ˆŽUlž°þ=+ELP=ÛXæeÑ¡þ ÕØG¡«0XéŽbfPùвµ N¨,k ƒš)V*•ä¾™8Çw‹¤ñ,`‚!ãP‘xäÈ$¶Í‹Ô)DÒV9±YŠ‚$È)ˆQ½žSÀ™8RÂÁùò& ƒD«ÂPÍÆŒ§gmš˜(9VTR=°9‡4q,§?ñJmä¼X@Mkƒa€K$§ SÉ1)ŽLXË8çWÔÀ*Z.ãi—!˜X9Ù&éHÁbfBÍ* ¾sÍ*Œ) ¸ÎœeÁFÜ0Žµ§<‚¨BDN€TÁA8EQá´'5‹BQzÖš•‘‰©NM,ˆv5r«0XôÙ8]…Ábæ¬Âö4iËG !Ó"€Š +BQn»¸'1w¹‰ÐŽrö÷€Š +Â(§Í +ŠQaÔOPGj §F›•X#9ô8nì®4« Íæè˜#5f&¬«bgC]…Áb)#‰nmH¸:ePß#A$…¡Šª bÇ* 6 ºÖpbß;²K"’+7…P R–°'5‹“:`›ðE£t‹\‘Ž³¬0X\žË +cvå…ætm:xɦô©)@ÊäKêáþ•èŽ Å"KûTâ÷H°¡Ãˆ ×+JìXkÙ·o¥ÀÊ +Rº'µèY‰8Ûú`IPSA8ÅYʈÓw's "6Ë"qª0Øì«0@„ƒ¬t­åtÿjÁ»*1¡ Z¶'ö}  + § œ¢Ë©q¤UD\œat™ +°á27l8t/nÇ)ˆ Àãá8YŸ„õÖ¡Ã`s6ű6T+)mÀ«$$ñðrª\nŠc9,¡„U¬ÝX‘ƒÅf‹4«0XT=U¬Däö¹‚ob&§B5E=©1X¼ÇàT±HoeöšàЬ‚¨-ï(Ç)£¸[ÇŠ´±ÊW(²²W¼xÿ”áìÈÉnµ˜dOòL°‰|$I³ðSWšåèl6úð ¥ +ÌlÉOviž™ÙB>Õùf6?öb/ñÌõôÔLOoÌuûØ.—¿Ìþà3à ŠBRùŽ7§W×ÓëÛÙ÷ï“ü2»¾½¼Pþµxà™Ï»²{1˶3wçbÓš ½Þió†Ïôý×é×s3ëŠfSÌ·fRÔåÂÜUëòØgêÁç¤ÜšéSÜ?6»úØ)Þú{¡²ûYvæòWͲ}Ã}æ™óîe½m»býTÍͦZ”¦]šÉÌ\´uQ5æt·}*›m5/¶U+) Ë€KÌ3å²j* +lèePwÏÜuí¶·«7Ø1´u ¢ûª)9 +tu±1E³0÷ø†àöÌ·rµ:ùѴψ¹É„‚©)…N0/ýà€›iQ?·BÊÍ#ê¶-»¦Xù…,Üž>l¶š&¦TÖ`%imeYÌK³mÍ×¢«ÚÝÆœó¦l6ë¡2j"!p¾v¥™]œ½±¡TŒÊ=Ícyu!õ9_U¨¢9/æOŒm#¶¿«ûÍ`î¿UÍ¢}Þ íÂ?{-kÜLÚmµ|‘uåäo«õíj2ýŸJá ”ùTT«#yl Õš=•æËzÞÖŒuú²Ù–2ß·¸!Ḝïºjûb0¡˜Oó®)Ÿ©ôŽ¦uz¸ñ!½Åø«¶ÁºèÚÚ|™\ýuÔ²ÐCÕÿ€àªÜ¶98ØÛ?6&\/ew|Â(wÿž˜Žñ<µäNBKÏN±\–«v3—;ìg©då"{’ùc^_zÅøÛMžÇøK'ˆ˜âg£Ï£ÿzT²endstream +endobj +541 0 obj<>/XObject<<>>>>>>endobj +542 0 obj<>stream x•WÛRÛH}ç+ú¤Ê–-c°!O@`ËU,8±©¤*Ù‡±4²'Hef„ãýú==º ´Ùl¥r[ӷӧϴ¾…4ÆŸf:9£(;ø8›šÎgø}‚FRrtµ>ÝžÓdLë&g³9­cÂñ1¾‰Þ\ïDᤡ0 ÷2Q¹rJ示—îjñ°¢¥ÑNG:%‘Ço×ߎÆ4œLáâͽÈ$}”V§¥·ùSÇÒò ΪpÓ)RÂé0@„û›5û¬M) ëC“Ypæ]Ö1M™[ÒÏHËíPƒNS½Wù–œy¡³´¾^ŽËw>Í›ÇgG‹åçÑjù9 •È6‚tž¨´Ò¶µ°Ëº†ð¤Ê«òЭ6K'TŠÈ¹[=jWÒZÆf%ͳŠdûý{áÄÖˆ¬y0ð¹Ôðõ¢1fv@VJ2IŽÇaà~8oP}žðç ¶šœÒ€…kT–±oC'+©h:¤²"•™Ìð q;×ŒÝ q¬%§i#‘IîH—®—g‹ýñ^yL2ÛÈ8–1í•Û©œîî®É·hêKv¹v Ý÷68º“9àç¾5\òn+X{›P!©×Z™H#6)°~XsÂ*·½„Løh$r.E>/XObject<<>>>>>>endobj -535 0 obj<>stream +543 0 obj<>/XObject<<>>>>>>endobj +544 0 obj<>stream x…V]oÛ6}ϯ¸{J8²åx¶³ ’nݬndhŠŠ¸H¢FRvýïw.)9ŽÚa(âÔ‘x?Î9÷\þs–ÒÿRZLézN²:›$š/æÉ”fËþ?ÅU”‡ÓÉ÷ø:xp·9˜QšÒ&G¬ùrA›Œg2¡¼p{á åÈä´µFdR8OÞŠ<×ò»¿’ËÍß8~C)Nññ«ëY2C€‹4¹Nhu·ZÓJù»ûOëøæk¢«é"™ó›6—éd’&þ‹§L9iõV¹‰ÊÔÏÈeÞ’/4¾ð[‘®šRUªöÂkS“¨3jB…8Dç]:Z‰JÑZÙ–ê<Ô‰êÒk ƒœ«Íøv¹²ŽÎt™½£ûÚ+[+ÿö,í - ÒŽò¶,ÔÕ;ž’4¨D‹ÚhÛz*„ÃOFÞ/Š>Ié%5@#!CÙ{í ’Êz¡ë#ªQ´#üÁØŒ»6T!iÏ"}B¹±¤¾aÄO2%JG!ÐdµêY;ÐR‚ßRù¨w]>Q–œ3ÓŒp¥½8¸„î¡´¤Ñp·Jd`¥À_?ji3¹§‡ûU ÷¤[ ü¦Ê†r]¢).›D½h¹t—=)Óy”ÌA#‘à‘c’‹Qdë!ÀRŸ¨Lí}éÕ2ôì3(Ø™²åÖÑLäçk„š–YN ªãþnðUïq„W¹v‹¬Ä<+¼b8äp®TG4 È £ƒi-ý~»©vnW#–ŽŠÑ]ÎÜ¡°yÿy|ÿù¤ŽFȤ÷P¨š³@};DzƒëóâYjpÌŠAŸ[¼¿Ezt! & Hp§èãQr7ÔÖ)ÖËÊxÄ)°¬1&¾0ʨφ£,!¶ì(\rLÙiâ®Àf;í4*Nh3¨óIŠú)BàØä‘´k5$(² Ñf= /¶%>^´®ç‡ §dkµ? ²BûÎÔKªôsÁ3‚A‰°9ÍÃÚ´Þ³|Ü™©x®SkÊ’mú^ÿ2{úFaŽbɃ¬]áÑ^˜`W˜¶Ì¨6œ b° g BZèTQ¥*… û^/cAf·2ðÕFXøÖÙÇ QÙC¥%#5à†kh¬Ù´b@$:Ï[ÇþÌYKÄyÄ” ¶Åž#_˜ [9^dì0Rê(øΣ}ó9Z}ÚÔ´fDj‡ÐÁ™p…ïôpÜ œ0Ak¢{Ë` Ýr>ÕJeîéÛI;_Ú*)xT¿Qo7„QùaÆã yuO¯%„µ·(̳7Â÷Ý„BÐ$K¡«èÓ0”èÄVS^x°ë×Vµk%švqO…“h9ì”Q”ŠÒC :šÜÕÀäúT+Þ,r¸ÝQ*Gl/¯`ñ"Èž-ðT3t‰Ü7 dWE‚}2Îìó8_¥iìøýý‡õ˜Ïóöá;À¡ËõÇ»°7Æ…ÅB÷¿c|Âus~õñ’ôÂÂAóCyDÇ%x, M„UÆÄš›>줽°Ypü#˜Œà²”[SQçÁ<±ŽÒëÅËPbz}ÓÏA­ø#\+ÇbD…Ù£M‹-{Îp1àIáb©öYuk=›WA0ÈP!¶LØmx;Ü2”çqÇe¬jT6˜ƒíáÈ ¤'£ïãD}ûâvÒ: ¢#VºÖ•†–y:jÅ*‚ òÈqdíî€=½vÃPöF°N«'2Ž¸rž³Ç‚Ž·Š“¿1-|-ëó×{ÑWL³ÂãÕ0ÎÛ9ü"^:¡G4“ x¤7‰¯†'Pá |.üíî ´òÉ ÿ¿5An_MˆÎÆ–Ý;],“ùÍ Ínº«éúöãÝ-ýçƒEúk WåCWý»W‹ÉÍÞ±gËI²\ÎpÇ=wÎç~Ùœýqö/M5øþendstream endobj -536 0 obj<>/XObject<<>>>>>>endobj -537 0 obj<>stream +545 0 obj<>/XObject<<>>>>>>endobj +546 0 obj<>stream x…W]oÛ8|ϯطK€Duçë^Š¶¸yhÑC|ÈK€‚–(‹‰TIʪï×ß %ÙŽÓáHaÅ"wwfvvóãäRføw)·s¹º‘¼9™e3YÜßgw²¸»Åç9~¼–2}q5»þõ×÷<öúÀÇåÉ»Ï÷2ŸÉ²DŒ›Û;Y‚ûgøM~ú©RmÔäQ5+%|^™¨óØy}¶ü;¾¼_\-²9ŽŸÎ³ËLlô®èòhœÞ\Èååøæü6»á›ËÊ)\Þ5ÚFY›¢d­­öª·Ñ~ct/®”Êõc ½ó/AŒE^VÕõ6“e¥Çï–Z5R© Ñ]Ht’»&%:“‹Ë«!½®•ÞÄ WèZúÊä• ‘ˆ{V:Di]fUkžn½kLà±×ÚŠ®õZÙ\Ÿã-ÕÊÔ&nÏ%è¼óø$Ê"nu3w6D¯5Rop?²[mSD¹•F‡°•Ç/ÓùOŸ£Ë]=¤?¿ÉÄì!ŠªƒK%"g‡¡G•)VQzý£¤5ò /ˆ…§@&‚„Ūð;o…šö׆ÃT‰*(ÖwÖ»gå/k~¾OPÿÜþ#m­bé|ó^ž*…„V®‹)²wøy0Y›5Ø4!tú=ƒ]€}ˆª8…8øŒÇ%ß¼ñ@Ž8±ˆ¦«#8òZŒo¬l”7® Ò* ñJä«‹¡Òã‹Ÿª­XdT©áA㸊šàæ€\PƒX༮îѹ<=|}>/XObject<<>>>>>>endobj -539 0 obj<>stream +547 0 obj<>/XObject<<>>>>>>endobj +548 0 obj<>stream xuWÛnÛF}÷W ú°XÉql¹/…’ôâ"MRXAú` X’#i#r—Ù]ZÑß÷Ì,©D‹ ²MîÎåÌ™3£¯g šãß‚n¯èå UíÙ¼˜Óõü•|.oñy…ÿi£/ËëâfúâõúìÇ_ïhqKë lÝ,´® væsZWçWÅuAë]`S[·%×–õÅú ®\Ó'åÊìêf×õùzg#|ßÔT2ÙšMsIeŸhË)RìÝžÊ#u>$SÚƦ#BûÚÛÀ-» ±+ÖnŠk±¶ruà¥`¹¦äélb2”8&JQ¤Æ–Á„#m|ÐØðÂ$ê#®x×ɸhgo¨ò.¦ÐWãñ¼’Iäô¥íp@óßÅËâJü6Þmñæñ¢ OvSïLbØŠ¾eúðÀ‘jÞ0Ü$ÉDl•Äìp[®LÓÈ#S#‘qOƒ3¨GÜá?pr}ã€Ã)¦ª Œw‘Œ>ŽÉT{¤`ºf\BT«û¿©öjÜF Z«Ðš=¬ÐãL†¼aØBž`›x·mçc´eÃ=xI!öÜ%DK¾§°ºÆ$@Ó¢Ü;¦V›á¦c\Ì©#¢OÎ~vÞëµ0õ ‚|xÈõÍžE"Ä%¥˜0c%ï²0¤Ú±é²Kƒ84 $AŸ;-Z«ö¢1Ü‘>½ý8`•}›ìÇ‚~7OR Aæ~3ê;}àv”íüíòQš§¶Á´ÀŽHtÝ«nü'´¾GŸâê꣕…ÒÅ%j»†¿M\guGÅ!àT:0gœb*è3êk„xAÔ\²5ÕŽF)åÈÉ .[n=ÀˆGˆ@«Ãéùœœ½¼ÎcêªxU+ÛšÞj»I`ÿ9?»µJ @@ -985,21 +1011,21 @@ q ôü­G<âk6žÝÎïdiÿŸ¯)×Ëy±\^ãK Î,åæ/볿Îþ­lQendstream endobj -540 0 obj<>/XObject<<>>>>>>endobj -541 0 obj<>stream -xVmoÛ6þî_qßä¶bÉïF: iÎ@êb¨: ˆƒ€’h››Dj"ÇößwGJ~k2 ËbêøÜÝsÏÝéÏV=ü`BIÞêù=èþ“1þâoÉaݺZ×wS{­ñÆh<(´îáIÒþ°e…á%ô}ˆ¶4Ëcç·ß>ÞkÃó«èw Œ@·?ðC„h÷ýÀ‡%ßÁ—Ê•¯{iØ‹3@ÔæáØ‘¹E·& ÖÀ åqµÙ¹Lm`-2BcÈEÉ5—†§ÀôÌ¡õ`Ú€ üüdïÓµ˜½{Õ'¹ÞÜÀßt¯Ý0p¾sûК»ëÛ´¼oµ’^}ÛðsóÆekl/{D‹Ïsð:ÜÏ߃÷èÁÝâf<Ü}[~ˆ_–ÞF“Ŭ®¼7­×³,2!1¯·ÒpO)ëhþ[äpLòîX'ä•6%‘Ü'[V²‹®¿$Y•Ò¹ÁâK¾#è£ßÑìw^*P%ä -W&ñ¡;ÀIèç\²fBôh»dàÄØ ‡ÇÆû™—ÜC­+TüÇ®7e÷ä¿ì4€‡`:\÷ð§A8gá°Á#Ȩb_ŠÍÖÀ{™–¸ß£R¤ŽcƒtñÏøÿ¯GÞÄíÎR`n£úoD¿Â–‰ï¤œM¦b–‘n1ZTäðúî‡í¶T‡ÂZË,VÏGÂI¯g -Å=ˆ&MeßmR¨E]Ï ª>/XObject<<>>>>>>endobj +550 0 obj<>stream +xVmoã6 þž_ÁoNÄ÷ 7àÚKoz9 ç4E!ÛJ¢Í–š-Ó°â’— Uõ¶*‘D),721BIøÿ¶ÜœåSnò‰¨HrÁaŽØ\(tôÊÌ!>DÅãy¬·L‹„eÙ®…¹â%{?c¦LjÌÀö ŽƒvXìã…6ËYÊaSPH'\ië²Í‹Ã!mbƒ“ðc;躮Ÿ2äøä1w„Ç`ͽ&S e»ÁR¢­æêÜRL¤“Ä;`ä­[{«¹ª>Õ©FˆS9‰9Î [aœöš²1¹àßÕ-—I¦4F†š±GþàFÛð«>¨Ý“æHƒ­½\Zú¸ÚXŸƒ ëÆ8‘",U–©­ã§†D6Ïœa£æBZˆ"HT¦¤ów"XÛ$»{2A¾Qhk®ñ©‹)Q8««Æ¤ ßðnëÃ'^piçæÀž °Då¦_¶ì§}»Xï9ÛAŒc@hM3eцԱo>ª1bœ%øü\ÏËçgTRR*Ò7õ2Þ•ÊÀFŠœV¤|y‘Ù¾ái Rœ)ÂTã„TÛqÚÝ´î`¿}ê"Xµ!ô‘hðR*!W¸3‰ÝNJ?%“Õ#r/HÛ&=§ÆvØ?tÞϼäŠ]á¤â¯8Ïp¿)»(ÿe©<ãñ躃?]ÂI¿? û-ž@æqê'“EsÐ/®j;.]°_snb¡2T¦æ%RD ³ÀûÁ¸»•eÅš–+†ap‚s§Š])VkeZâ‚J‘®8Î ®×Æ?Ãwü¿y÷ ×;KQ¹~8è^ˆ~&…,?H9«LÅ,#áb.´©Èáõý›õ6W§ÍÂJÌ,V/ÂI¯' +ÅEˆ&Me_nR¨D] ª<µ#3Xº˜'l£ þ\°u=³ÓžF@Ü}ß>Ï`&SÔv +btR·¤ŠkéЛ¢P% rÇ]PÓ[Í\ÛVr×÷£Ã›U/to7ÿé®7Âzn®ÉÁ4jüÒøgæ"Òendstream endobj -542 0 obj<>/XObject<<>>>>>>endobj -543 0 obj<>stream +551 0 obj<>/XObject<<>>>>>>endobj +552 0 obj<>stream x¥V]oã6|÷¯X(âEr¤O .¹½´(êë=Ô} $ÊæYu"Ÿÿ}g)Ég'uCóØ"¹;;;;â×^D!~#š érLIÑ ƒF“`D£é‡ø¯%e½Ûyïâ~FÑ„æNŒ§ÍSÂî0¤y2¸ †ÍW’ÞßÝ~ú°,NéQ$µ>Á¹EØÎç·“`Œ“ƒOF’ÎÈ)ø)C®LV¢\Ê4Ø hÅZ²M•¨E!­¬M“4Sµ±|ŽÃÒ±””Ë'™Ÿñ#Ô@rj#]¦ÝöX§[F"(CV«tI‰Ès²º'c·Œ|AÝzÐÆŽAâÍWžBÐÌU.Ÿ¯ÿ"k‰uQ’ü&Š*—´Y©dE…ØÒJæRÇÊôÑV;Úh—§´©•õÀ/îCšu䚌U­J›-ÔŸ¯P5þýdºÊƒÅ¢ìŸQ?eè}Zœþü² ¾(ÑH0Á¬ig+g¹jcS|ñÄ•oÔvÂ3z3ªÆ0}M”©\tƒ.µ*u]ˆœ:^ ¾ŒŸX‹v4‰¨ œ®×Ï{ó›¶õ ¨§ô<ˆX?É]£8¥¯­ã¶Q3n¤g+ 豚`ÛåD¾[Óêrvú»F±Ä¶g¤š 8,Ï’a•¤k’_jkõ¸ÌuŒoO"w-´wÝ}lÛµÃû\òVXYÈÒIUëñ1\/„¼ÓAËë!2cIFcúVÌm®Öòº‘×K™~þŽf³éE8¹¸„ÍŒ¯Ãðú*:£ðŸ¦‡Éu7T‹A4œ.N;Üa0åÑâ_éDÞ´¿¥ËÃ?4/ë;áêfø»%µ <*¥Ü`ðD*kzçJæúÝþ €ŸÔ%2¥xëWµ|RÚaÂ[_ØÅìжƒª”Jm‰gj£ì ©N0‹'ý¾›®Cs¯+Á½@¦Z»%ŸÙ“nì² (¿ÀÞ,wf…Í°¶zû,»U…lŠËU)9²,íJØ$û(Ü…s·±ê‘•Ý"¼,÷|k\©L½¨<[ªdsÀ‚Q0°ç™EU¡ä—z ‚ fOiüôCóôÅÁªýš»t‰!~°´ ×Tå"F™‡÷ÃŽgZaK,A•nì‘ßVa¸`Ó©¹³ÎvÌÆ”º"†5t.Üj|­Ð.ÿ™ýpR9. êwöUu·߃ÃK$Ê«¥uu ¤ì¾ÏñhOÖŠý›wûwËå·ñ½­ö絓ý£ñdnv/º½4Ô±ØĸØv<ÈA>ÿùžï?&í3DŠ¼°Õ¶új”ƒ%îëb…»‚ÝÕ»cÈ¢(äh¬%×zí-•y•ù·ûÊðj|„Ýýê&j¿ÉsÔ¿Pãÿ =ŽŽ”pÌ?û†2剥ÂÁ18í]É¿;Xû1„ã«û,Ü/ÎeÑž¶7·h2 Ƴ¯Znþ¼y¼½¡÷|ÇÒ.bôÁ©ÔWyÞí=Ÿ„¸¸¤¯Þ G“Q0Oq3ÄÆ(d–îæ½?zÿ ƒ!;endstream endobj -544 0 obj<>/XObject<<>>>>>>endobj -545 0 obj<>stream +553 0 obj<>/XObject<<>>>>>>endobj +554 0 obj<>stream x•VkãFý?Ÿb8`+’åøG I“9ÚR÷ ÔŬ¤•¬FÚõ­¤8¦ô»÷Íʲåœîì&ØزôföÍ{3óåÂ#ÿM†ä)Ì/\Ç¥ÑôÆá}‚ÏC¼Œ¤Øþp3uÆo¯ßÏ/®š‘7¡y ¨ñÔ£yD€q]š‡=ßñš¯$=<ÞÿþáîáaÑ[\Ñ'}5ÿŽÈÃüè`8ü<ê}T$¢(-S­¨ÔTâé笊¹¥BgUûz`ô³T”¥JÒÚè “9E²MȈD _dŸp„´ Aa&…Ú£ØÌ8 ÷|gÈÁòÌ9ORòEJ¤’F”’aVRDÒ8ô±¤Mše$Ök©"ܸ¡R¾–MÖaeŒT%2 ª„rY"‘4Eiü&.Ÿ2Ö&%U# –ùºÜÖü[UŠWÒ±å£#KÜÎ…È% þ ¤öÝLü›˜öxN]—fMF¨>˜ üÙ8‹¹}Zô.ç+ÙʼnSS”–xg±P—„ª.®~h¸Îô¾¥¡q\?†i(W©9üÒp,+™_ŒŽªPß;ËŸÞl6½v'×>?¾uÝÛ¯Oî_§™tÂÛ¸R!kkÑ»ñ†®ZG!(¹“ŽcßÛ>çÉ›['¯Ïs°×À·¥ñQËUOŸŸÎpÕÏ°ÈN;§o¹:èÉ‚Ô’ß4 @@ -1007,96 +1033,108 @@ x B)ª@!Y|á6Ú<'FWk\`åö;ëÁâ' ا$Ó‡Ü2fŸáŒ ïkØe}‘Qïù}iÁW;7tˆ•+qÜÈv¢ÒdñLà4ÒEU‘ª¤ñ J `•¶óûlôXg™Þ§)$ŸML'Yl[k¸7À!tÕEø%.êð†¶oõ‡¯1 °ºÏë,¸•@»X-¼ŽrÝQ‘æi&Lš7I%‚lK* ¡v´~£E¸²}Q£dò`¨Æ˜uŸ­›Gí/#Ëʨ‚æ¦Âd²=½‘án5Ó"øÈ<Ãøà®®"–_*‘5c¦Ög­Œ§ÇÏOô"²Š•ª¿£Š4†,ý6Mòkš4öU'ú§ãZ$<éÎÕS×`hAü/À:O?'@ÎÖMοÌW‡½9ôþØ0t3rì¬]g=6¢@ÂÐÎ~ Çõ<ÆÃXc¿(Ʀ!¢ á®Ì[4R„+™K[t¬sƒÖ“hÜ׸e- —#ŒV±æþËù°†ac‹zžCü_÷;Ѻ¢Âè4!V èˤð"ë8n¦JQŠð™º[Š,~ Ù‘4)Ö9pЀø|œÀðë0Þ1Üm7´ø8‡E7ö L@½déª\äœ-Bc¹(kNyÒ k]Àén5õn|g<›ÑØŸÕ êowŸîïè©ÁgA*L¾šÅ vdÜ;˜¸Ø§¢Sûïh2r&ãéŽy!ç¿^üK¯mÕendstream endobj -546 0 obj<>/XObject<<>>>>>>endobj -547 0 obj<>stream +555 0 obj<>/XObject<<>>>>>>endobj +556 0 obj<>stream x…UËnÛ0¼û+ö˜ kÙŽåäÑi¢j{ P"e3•IW¤âúï;KÊy(i ò,’;»3³«_£ŒÆød”Oh:§j=‹1äS\g‹× ¾­¦:.Ìæ™X¼·0=‹ùpá¼}¸:¥,§¢È|‘Q¡ã1ÕÁTœú¬·tÕÙ*gýañNÌÒ‰ã)G-TÜš Rå2èßáîàî0mQ†˜üxuP¬Œ§ºG›ÖØàIé²[ÒZ{/—š8Ga¥û•Ú4šî¤U´qÞ›²Ùñ¿ó[ÞÒ£‘qwíÚµ Tvu­[AÅJsÀΦbÂèOÀמ$=ÊÖÈÁe»ìÖÚjŒôÐáÒ˜Ÿ:%Xs=äZºà<3þƒ“±›. Šuh…HKö Pç]rbƒ,}¤¸ûœŽˆëÃnKé=¢!Vªè>t¿§VÐMM;×@ÓÅåù·ëÛï·1G~¸5Mƒ„\‰Âvä©*Ú‘«ãýžø”ï EyÒ;¸MzO¢Þ+ÕþOnÄZî ň´mMˆ¼¥¥bí>Æ_hk[¸  þ+û¬ñnP-ÎÁM fR¡¯üÁºqd½Þ„ȧJ‚8pú¢—=¼ê*øÄ‚µ.@vA_5G×T¹5[ÇCýA/"šÖÅ[»È+·Ä<±yMÄ8l:67'^µJ”µ² Ê´º Í^ˆ‡aEå.Ù!zÝÍqvq-ûO1§â}¯¥Cï·1”äƒ ¦z×ØÔ´¢Š©ù€¢“þ‰·ÔÞLs÷ž á¹…l0 ™0 VÛÊu6è–3°zÛ«ýàÞá¨ýªV²•¶±Ö5N¨£„?d>õfÜô6?O€§ŠŸúvßö‹’5‡ôr[^e©b‹Ã –sŲԠB/µ<1ЖZV+˜ÁGÇ c™¾„/aÒÖw‰í>fOù‹BeŒÊ˜™fÍcu»2«--ÒÜôcuPxŠ„Á— ±èçz–/Äüô”¦³<½¾ž}:?à|ÔÛ°>×Q±ŠãýÞã||ºŸ!o_/³|&òùo Œ™lÂp—ÅèËè‘;6Iendstream endobj -548 0 obj<>/XObject<<>>>>/Annots 288 0 R>>endobj -549 0 obj<>stream -x…WÛnä6}÷W²ë lµÛv|™·¯õCâYwo, l‰j1¦H IuOçësŠÕ Æh]È:uêÔ)êëÑ”ÎðoJ×çtqEe{tVœáÎøçùG¾C—W—øÛÒùÅMq1\iš¥g×ÅžMo§üf¼âgŸçG“‡[:?£yW×74¯âÖ¸Sß5¢ ÒÑeAw¶RfI³~¹”>(kü‡ùïX|IÓiZ|z~SœcùñÌÒÆö´&P°$ªŠJ[Iþ=íBPQ¼øŒNϯŠK^òd$ÙšB#©½ *ÿæ©%_êœ]:Ѷ€#Bm—^²´v*È¡¶n¡<õ¦’Îa"pl=Äœ^$˜+á”í=¯ä¥5+‰ÈÈŒz/+Zl€ÇzI­õDÔJ’2$Àü.ËPм‘xcwíZº´Doö†¡i˜¨‘ºCÕb/l,º´¹uA,”VasBH ý$ä†8^yìPn2]Ì,Ã@•-û)ÐZi}{ Œk0¾&¨–ë¼Ok`86¶Héç]Ê‚r¤ ZÔ+Q‘JºKÈAèw[ D’ß:ð‡ü¨l„YJòZ-› ‘ÙŠ‰@ˆ“H”DYøµ¥³kå`¤ž´Î`±°} »ðeïkÓø‹äA"Öœ­-`€N®~&Å£Ÿ< ß¢¬=+vâmïJ9QÝ`„öÞO/fý3ÖýµÐwÖÚÞ.• $[àý«X -ý‚ÆQŒUhÈÒn#òÃÖI[èÌ9©“úµO=ÊÅè÷a£#m wC:#nÌJŒ%Í€ TÛX(>uS$NúØñ;I…zðý‚;áT–²‹ ïwž=R# m”FºךoJ®2ל¥Å… O^Ê–-$ú\ÖÒ9¼Ž^KâJìçÄ3§u´VS¬ RN‹ÐHØ«Såaú'Ps[‡Ó¯½å—sÒž°ËÇA·Ù“šº“‰þæ -­Lÿ­06ëà_C§Å‚Lî¢Ì˜à¿Þb½^µ¯ ë–¤×M¢+ Wù×`Ë¢ mn×û3 ¦l¿„™ö/”ªê£³rÒ­0ªT þØ £Á1=­›Š.N-z¤Ÿ ÍA¬ÖvÝœz‹ßï™È·ol¯+¶HlÊ^•¢ ¬8·._Ѓ‚ýƆx%»è@O® nÊv]O„Cú¿l]»€j´»‡‰E2 ¨{¯²®áy…‘¨¶{Ãûm'F]Ãg 01W‚eÕ&8y ]‡åÈôîña6™ýô™ÝQ± £ƒÀ±Ñ¦ø¯mð¬¶ýÇ -‹äÂ%ù.z¥+<6à4òVŠžFþâ¹*…Ö±õH«…ã¼s~ikNMªÌʾ%ÙçT†¨\Œ‚>iÄÜ*‰gLBÌZ9ˆýµçAºÕržpòTj…¬÷r‚† =t¬ï;6Ù“dÀ Ö*ª£œ€VÒìçÇO‘ǃˆsY6F!Uzæ¦Ç\“ôrŒAÇ‹`ïˆëè'U:ëѵ°·üÒ¶q‡—¨^¡MjT$ª¨„t‡O$•òÐ9¹ÆhìÅ2KîÞŠ3:Å”Ê÷¦Eœ]¸³nöéáþõáùþ~]í¤¡Àk{¨Ýh'¦G);5ú>G™°:>߆ɑ+kþ¢²H—4ŽÎö²@þÿ»~zÍŸÿ{7n°sýžÅÕ±°¦¿<ÍÍÙŘÿ/¦®ì6qgüÔPÁË1WÅ‹Z¾~O²^ ÜþåLJÚÊ*̤ݬ={g<€¸>pǼqfLLïû¼—'¼jk–'‘ˆ—cÇÂŽaäêïœKöýá}œ”´*Œ`Ñý¼ÐªFwD[é„k©Þ³Ã³S°í³œãs†2Ÿ” ¶z9f}¯aR1þÎT‚`^¡/1(†¥@{IúG%k]k±Imµ+«my¬Ä)‘Ñ Z‰W Ïe“ÆŽÂ0h„Á/ ã·øàê@ Ü{°\brAÙ~ùôz÷ôå·—cÔ2J‡áï ÏG³Å ùd ‡ ”Ò—|š…K·=à 5epܯ ~*ØĆ¡‚O&`vÿã/¤êƒ üµ{ š Ó‘s¿ÞÒqq‹/0ôÜ Äi=“âvo€"cßê„Ó&\ízxlÜ’{äfj_Ÿ;R¦Ô=†ë1Áo­4Œ¢¹~ž¦§ÃÕ0í#;qmü.¦ -ÒPaÙÂQ¾!’/š1­8·ÓÇKÔhÊ@o·Ø3sÉSv°Ãñpö âA â£)x ÁE—ÒðٵÇÛw­x㣤 ö;` ø»h¶püº«â‡ßô,œ<Ü ß§Ó[>/XObject<<>>>>>>endobj -551 0 obj<>stream -xmWasÚ8ýž_±ßš¦à%Ü7BÒN皶7¡s_2“¶À:dÉ'Éî×ß[‡a:™&FÖî¾}ïíòïÅø7¤éˆ>O(-.É€FãA2¡ñí”Ç“´º¸_\\ÓpH‹ŸÜNi‘δH/+/IšL C^¬$"uÖÓ.—†*SŠt£ÌšžŸî=½\z)i¹ÒºLº$'a2R&Hg„öIfÓ—ˆ*¼5±áã⟋õ‡Ÿ“b^Ê­t{k$!¦§oxOó‰þp’ÜPsh8LˆŸÆ‡ýÑ$ó«?lôÛ¨Ôf’TQj•Š ¬ñdW”æÂy(G:š³­=I,¡gd_VZ¿^ÅÄËÊçõ¯'y¦Ö ÓðêƒãÛV•Ic¬¤­sGÍüThõ_üåL)£s¥'kô¾½óK»•Ç+Ѫìu i[¸=KbkUd9ce®m¨N™rëÚ*(ä" V¨œ¡L^«) æS­Q¦|÷úËǘI§•M“ç M*˜C>ˆ¥Ò*ì©tv©eáÙ7©ÇÝšÞ>_ª©-÷N­óÀÌQ)Òñ©s2 =ÊjØÊd¥…SÙZ~ðdP Wy Ë%e*cˆc1 }[ÑÞVœL'á0õ Âá3Ùû7(…Ó‰—©€êP¡•oÊã´ -y<ì$þóøÅgQ,}ýõ]fñ’äLÝ7çꞃ¾ -:BÓÄZòu³ÅìõþûOhmeiiÖèK™ª•Âõ,½>·ìÈÄöcÔš+“nȦ .Od[aÂ!dÈ–u0¾v)ÐH­p¦aKËIhÂiÒýi¤é¹H–§è£¯aš=½ÎæóŸ¿,ÀW¥à·Š»«÷=>³'ŸÛJ£N$ßDÍ[%¨Ì–¯k’$y¹„Ã@æ'íäp€æ@“½?ƒSM:SJƒÐð¶[MCѺš4—é†Ä»ƒ¶Ù“X e@ æš-{$ôNì={]|_~m^uDƒZ‰TFÊtØÙ¨K[ˆú-¨ÔÕz}Øÿ6é»sIŒ¾„•…9«ËÚß 3(jÕüãG_J뽂Š±"«Fƒn &üoD0ÖBÓè…4ÁÓ5]ÁH@‘1·çŸ>u>»®ir…Ít@ß×µ´:çX…8"ʳ±µò›ßݱ÷˜L¸¬GÞ¬fUmaQ̨Tš]0³QôÌ­2 -g¤::;~PFGÁ-)¬ -bûBýúÖ*¦†³e¸'ùVj°ƒ}9ÒâwÔ¦ÃÁ•NÃ{Žr@Q7JÈ„hƒÉ™:ŒA©úJàù$܆c¡-ѱR®ÐÌ>prM4 x;ÜáÞÕ@d‚D6ï£ÿA¥J7PcU„èÁ¾í×Ò !ž8Œž¬qÏF9£w3ðóL²?¥,#®òçì.¡_TH±#~7{¯·Â)"<'Žù7Þ(Z®&ô7 …ÇÄ ’;ØÙÊÅiá±Ò0¿µ®‚Ìz˜}…Í* ã¯í'[H† -49mªb‰0à°|«WÌê­:ꣃ^ë<êµ)ŸÃåÝ,opa%5W Çh°OKlcìNK >Þê *¦–JòÄDŽõ†ä­(»Ã —>'ÈÔC5âöæÞ]Ç·5É`ËÁdG" ¼$jÄ]Ñ“¶Ð;NÇ0žú5}x–ÆÙrtåÄdéÅ}ï, €Ÿ˜;vmùÒ«µãQ€g§Œ`Gðb.@üf—*-n'aˆGÉÒmfjú¾ÀSC‹^ã5ë`1!Š Ž…s¼_uÜ´rôn×¹%·L|0Ül )'WXD÷‡FîXmÐûNiÍ×# b;ãþIÍ%cÉ˲ø· a¹aQgè/VÉßïPr׌TlÉðù3·¶WÁ3°'tÛO -øR§¸ÆñG‡…¦?¼ÃêÞoj^ÀÈ<¶£¸›Ç%6®qž¡P(Lúx¤GKБgíöì©…ØS.uÉôu2«ÒÆ<h¯Ì)‹Ä4Þ°ôáý†ŒÜðà|СTÊŒoÀ¦ ˜£#cé€:€(¾;êp1wK%.ðUÉMo>ˆ®~B¨Ã7%ÞRÑx ~ýåöð]k8½M&Nã›imzϳ§û=À³4Lãèk…õ_ê7gûÓÁÓdž‹¼"phncîÏGÌøñtœL'·øÈß Æüèqqñ×ÅÿYŠendstream -endobj -552 0 obj<>/XObject<<>>>>>>endobj -553 0 obj<>stream -x}XÛNÜH}ç+J<‘ˆ1Ì™ìÛ†-R6h—áa%$Ô¶Ûã^ìnÇm3Ìßï©jÛc†l¢`»»«êœS—Γ)]âÏ”V3š_QRž\F—´œŠ´X¯ðû kMÙÉçÍÉÅÍ'š]Ò&Ö«Õš6)aù%Þ$g×¹ª]Ó2¢{UÆŠn-­*ü‡Í¿²sº -;'óE4ÃÞ³e4ûj•ðÎ?”M c·aý‚¦Ónýl]ñúMn@¦¾v†ÈÕÔZó:¼`ÃXVpÄŽY³Í›RÁ,lIÐÁ“Ú„‰«à‘iò#ë£@åA,¯aðzJŒ[mu­ -`çu´ò‰ÆÚþ–Ñ,bõŽ²ÖŠh:)þTZ`+ýÞ7@oçêgDdž5P4þ76ƒôÔÚ„ÿ%Æzzƒô9öSÆè´ÿ.¾xMü¥l‹ÆLâ}£û¯*þ¬YvŒ=Ä|Pª3ca¼—Eb¡_zJ®’¼À ¾Œ#è't&H£ž_¤‰7C$°ÆfE¢(êæFÞfUÖ“ÞIðœb£ìþh0ÓZ#R­fÖó>¿zW2WnÇ*„b+(Ýè÷0—-²Ïº*²Bdß¾}ó¤_]5Ä>!ÑJcGΑM¦—Ñ|½@yB -«.ÚðjÈ/94Ö´šÄ†O.+lGΈÜèºç䜼ëxaó¾Q¶é¾qà[×Ø EÄÇA2ǸȆ>,2ÒEš0ËúGk^T·ýÁýÎk;²-¼#3~Oæ.Ç®½k©­)'» -œ»5Øi:r€m¬Æ*»EA‚®6[ [t[Þ¡›ü]ň"ÎÄÕ5*v±§Ü(µ]âHÅïJž…aG®›;Bñ2’¬`!4 &'³å¡ZÞ @ýª¸¼ŸÓÃæf²f1sž î£¶—eœòز^²2laU?\ßÏàw wY{ÕɨB‹¸3‚» HEBtZµ-jûµé:â†y†²Ôçàt.mp`-¤Š£ŠSk ÊJQÛ, ôt AÁÐHCh…¬¥©1À`úå Ñ ¤„¾QoàL*¥W0æ\éßæŸøÁ·7Í_‚àz× \¯úœa«#£Uëó§¡wýJ–Z¶‚—.§$8AÀ<Ϥ>~ )Ô&|duïßZöò|°" š;ƒØÙˆÃ($ÃÇüÀÛr¨d\š£’KSˆ™%wll`D¶6Õ5פlɦඨU¶vap;÷RQÆÚ; Õ(t'E1gyåK/¦ íÊ;Î"v&kh½÷~F£Ož1-õ3 6n÷ÂÌw»’¢I®“g9,+&’Ìh˜”òõ‡Ó¶qW=”€T‡z†<éb æ…g4 -%-zÄžbjeˆkCV#Š}¨IîP+ 9„w(_€ýNRnà}x VRÀ°ëýãÚ£XKŒI˜[çE&¸žÏsgË]2À¸ùûéáûíõÝ—¯œx÷xüýþúöVÎÅ8vƒ—ì PAGN/˜á#K…‰ñ邃X»Zqí²W(âIôáëù]hcLÅQÑűìxzâÏG&q<nmÆÌ@‹0»Åu˜×à×ã™×#á¶Ø3rï;¶©üsÈÎnpð,žœ…)ç„‚¡Çê‘›`Mòú©dþ"ºíµ ð#7CQ+¨ÝqÚI|ÂlZ)…¾â¹h[É(i+çYw‡"îihì]ÝB×o2DÉ8’áF:4§¾áÒÍAò`%ÝŠKCQš-Ï÷;h§ik”0¾½u" ]¸T[“Ð)R½¸DBíªä‚-ñm ·­a» -6/nÖÝM]æ2Ñóõ/ÿ;`±ZD««uë¦Köýëæ䯓ÿÚxrœendstream -endobj -554 0 obj<>/XObject<<>>>>>>endobj -555 0 obj<>stream +557 0 obj<>/XObject<<>>>>/Annots 294 0 R>>endobj +558 0 obj<>stream +x…W]oã6|ϯX´õ‰'i>îí.MÚ<´¹ÆnÑZ¢,6©#)ûÜ_ßYR’m¥hq¸Àú wwvf–ú|4£Sü›ÑÕ_R^f§¸3üyúïÐÅåþÖtv~wWšæéÙùUv‰g³›¿¯øÙÇÅÑôþ†ÎNiQ"ÆåÕ5-Š¸5îä“ÛJ4A:ºÈèÖʬhÞ®VÒe·ø ‹/h6K‹Oή³3,ŸÌ-mmKaK¢((·…äßsQ/eYÆ‹Oéäì2»à%F’-)T’ +ÑšÀ¡‚ð¯žJ‘ó… ÆÙ•utD²nÒK–6N™"”Öu!”§ÖÒù LL[w1gç)͵pʶžWr„ÜšµDdTF­—-·ÈÇzIµõDÔZ’21I$ó—ÌCF‹JâýµéÒ½l §¤!äD•Ô ¢¨{ac©¡K›[ÄRi¶Ç„ÒOBmˆã•Çù¶‡‹‘å4Ppaó¶F ´QZbwq†×•rÓïS[¤d86¶è@i׈r¤ jô+A‘ZºÈ(ô›­"É/ ðCýH(¯„YIòZ­ª QÙš@ˆã”D[øµ•³íàL=i)œÁbiÛ@véóÖ{Ëéð‹à"ö˜m,ÒœÜýOœýôz‹´žxfìÔÛÖårª Ô`„öÞO/öüŸp®‡kÁïžk»—W lï¿mÄ„PÐ „£8W¡A;P»Ž™¥’¶à)sR õs›4ÊÍíà÷a«#lwK ”7f&Æ–ö tÛX0>©Œ¡G&Nú¨ø½¢B>øvÉJ8”¹l¢à½`åàÙUÔFk¤[s¯ù¦ä.sÏ™ZÜh±ô䥬9ÐRBç²”Îáuh-‘+¡ßÞcúPF›a6ž ä´BÂ^ÊÇåS@ÏmN>·–_î‹ö„]Þw¼í=© +¡y?ê/.ÓÊ´_2c{|ß)-6dz dÎÿû›Í&+}™Y·š¢¼f]I¸Â¿›gU¨{¹ö±?‚Ñèê`È[Ø£Âþ…VmtV.ºfK…*ÛxÔ9¦§MeS3 ‚àÔ²Eù= }Ð{«µÝD·¦ÞB㇚‰xûʶº`‹Ä¦ìe`)d`%ÈsçòÝ+Øo”0È+ÙE;xú⦬—ÑõDÃÿi炬vªàîANL’.ƒ²5ð*kàžW‰n»W¼_7bpÑ |–&æJ°ÌÚdÇoRƒê°•Þ>ÜϧóŸ>²;jdlÂà plÈÿµ žÙÖ@¬TX$7.ÑwÙ*]౦·\´œhÄo·«EP.´ŽÒ#­–ŽëîëK[s©2kûšhß—ÒEåfdôA#æŽI6 ãÒÚ×a0¡esÿÚó»Qd` ÛÒÛ±~ìŠü· j=‘¥8… 'ÖAñnšP¢ð QD&¤;|")”/à‰ò × à¼ïI±„!ƒ öŠ))øä„ñÉÉ5Fc+V½±ôÊá­¸¢L©þÞ,‹³ w’›¸¿{¹º»ÛÏ®tR©Àk[¨Í`'¦E+5ú>G™°˜œíÂô‘ k¾ ‘ÙË¿¥K‡²½-PÿŸwO/óÅÓ¯·‹è{ןàYÜÝ!æô§ÇùÃï}u1æùÅôÁåÍ6,xžpW¼(åË·$AëµÀíàŸß qx¨­­ÂLÚ¯zÙ²wƈkÓ w¨g`Ήá}[÷Jbà„mÍê8ÑàrP,ì¨#Fßý½sÉA¡ß½ ‚“’V¹âƒÌ!º_À€Z•PG´•F¸šá=1 ±w +¶}¦s|ÃP¦á“’ÁVÏæ÷&Åñ÷†zœ|ó +²Äœè"æê’ôu!KO]±MªÚçàå.ÿ~ªÄ!Ñ''h-^4,—=; +¼@Î}e8}‹/nˆÀÒƒã +ô’ûÉžðÛ‡—ÛÇOÇY¢´9faÒu‹tPš28mÖ¿;;ìaÝLÁ 0¿ûá7Rå((ìD D/a8úÚ¯vpœßà òä8LBÒ±(V{…¬1úÜ÷¸6á° “…ZǧÆøQ"×»P‡ôÜã2¹n1ûxVWˆ |K¥áãàÌm÷ó$=í®ºaщkãgQ7¤Ðz…eGûºH>«†²âØNß.¼hŸ57»Ü{ä’¥ìåÃÃÑ{hˆ4ˆMð<ƒ‰®¤á£=z‡ï¶¯jñÊ'IìWÈ ÅßYµs€Qâo²»Ì¾Û9ëiJpzÝ}œÌnðüäâ,5õ¿“/®.²«Ëëä ³s~·8úåèñ4ëendstream +endobj +559 0 obj<>/XObject<<>>>>>>endobj +560 0 obj<>stream +xmWasÚ8ýž_±ß.MÁJ ¹o„¤Î5moBç¾d&#luÈ’O’!¾_oelÇt2MŒ¬Ý}ûÞÛ埋! ðoHÓ}šPZ\ ’ƃdBãÛ)ÿŽ'iuq¿¸¸þ<¦á+>;¹Ò"#œ h‘^V^’4™†¼XI*D꬧]. U¦éF™5=?Ý{z¹ôRÒ²ÒºLº$'a2R&Hg„öIfÓ—ˆ*¼5¿“±áÃâï‹õ‡Ÿ’b^Ê­tµ5’ÓÓW¼§ùD8In¨=4&ÄOãÃþh’ŒùÕï6HúeTj3Iª(µJEPÖx²+Jsá¼ ”#ÍÙ6‰ž$–Ð3²/+­_¯bâeåóæד'ktÝÝÎyŠ¥ÝÊÕhUv ˆŽ i[¸š‚%±µ*²œ±2׶ +T +' +‰L¹u]r+TÎP&‚@¯UŠPóΩ€Ö(S¾{ýåà Bmç`M*˜B>ˆ¥Ò*ÔT:»Ô²ð‡äÛL‡ããüÛÖ>_©©-k§Öy`â¨YˆøÔ9™†e je ®Ò©l-ódPiëÊ%e*c„c- }]Qm«“üq„Ã4g‡Ïdäß N'^¦ªC…V¾)Ó*äñ°“ø ÄãŸE±ôåç7™ÅK’3ußœ«{ö*È=kÉ×=̳×ûo? µ•u¤¥Y# /eªV +׳òúܱ;ØQªLŽC¶ Xpy"Û +ö!C¶l‚ñµKFj…3-Y:JBH“Ö§‘¦ç"íIž¢¾iöô:›Ïüú¾W\•‚~Ü*î®®{|¦&ŸÛJ£N$ßDÍ[%¨Ì–¯k’$y¹„Á@å'íä0€ö@›½?ƒSM:SJ‹Ððö¸š–¢M5i.Ó !hwì²'±Ê€Ìþ4[öHè¨=[]|_~m_uDZ‰T6”92ÊV^ÚBÌÐoA¥®Öë½Â è²¾;—õÞ8áKXYX‘ÈÑ!#кlü Bƒ¤Ví0~4¦´Þ+Èø+Òj48Ô†ÿ…ƺBhšÞ¢&xº¦+ 8#2&÷üãǣϮž…\¡I3Ðøu£­£s¬‚BœNåÙØ:ýÍïîØ|L&\Ö#oaV³¬¶p +¨(fT*Í.˜Ù¨z&WH…3Z?{(£¥à–Ö ±ýG¥Î~~í$ÓÀÙQÜ“|+5èÁ¾ùaшÖ<×áÇ Ë ©a>= ‰¨Ž% t–´AåLíÇ ƒV}¥ð|nñЖhY)Whf8¹¶ P¼Ž>âÞÕ@d‚D:×Ñ!ÈR¥ȱ*áBô`ßêµ4Hˆg£'+@|„g+Ñ»øé +&ÙR– Ûy„sv—Ђ/*¤ÀX‡¿›½×[á”@žÇ€ˆ +oWú ŽÂsâÉüŽlåâ¸ðXi˜ßZWAf = +̾Âf•†ó7þ“‹-$CšÆœ6U±DpX¾5«fõVuú8¯sóºŒÏÁòn”·°°Ú+b4ا¥ ãµ1v§%/Í|•FOK%yb"ÅfAòV TÇÍá} „Ëž`š¡áa[sï®ãÛÚd°ä`²#0V% âªèI[ȧcOý†=ÓÞaqï·%/`cc +ËQÜÌã +·8Ïȃ?¨}8Ò£%X„H@³ñzvÔBÔ”K]2{̪´µNÖ+sJb'1Œ7,|8¿!#w{884(•2ã°gåèÇØ9 ŠozÚ_Ì ÁN‰ |UrÏÛ¢§Ÿðiÿ=‰—T´NŸ_¾ÝÓNo“ FÓøfÚXÞóìé~Fp, ËÃ0úRaûã—úíÙþtpÇ,™ç¢­šÛ˜ûó3~c<'ÓÉ-¾ò·‚1?z\\üyñxD‰Âendstream +endobj +561 0 obj<>/XObject<<>>>>>>endobj +562 0 obj<>stream +x}X]OÜ8}çW\ñD+&00t߶´h‘º­vVBBNâL¼$v; óï÷Üë$3 lUª’Äö½÷œs?ÜŸGS:ÇŸ)-g4¿¤¬>:OÎébþ)YÐâj‰ßgøÛj*Ž>¯ŽÎn>ÑìœV¶\.¯h•–ŸãMvr]ª&è–.ºSuªèÖâѪÊXý+;§Ë¸s2_$3ì=¹H¦ a_«2Þù‡²yeì:®_ÐtÚ¯Ÿ-“K^¿*'¯³`œ¥\û¬5©ö”'x¨ìO!c£#§¤<™º©t­áR>~ 9BÃjR©{Ölõœ&³KD[·–B©©Q>ôñ”*§gÝnIå“ÒeÿcÑg*  +eëºuéº ge.×´Á²]­ñ ®«*âËÓyDeSš¬¤ÌYcwÕ“u•jɇøx +î¬h]M_~Üaa®µÖ>¡;ܺ‘ +¥Ã0¸ÖáŸ-¹‚‚®g2Eô`ZícX?ò92wðµ7D®¥Îš—ñƲŠ#v¤Èšuj³°%AGOZWd®G&”Ö÷Í”±¼†Á(0®µÕ­ª€×IÔÊ'Ú×–ðw‘Ì" Vo¨è¬ˆ¦—â»Ò+Xé·>½kŸ‘yÒ@ÑøßØ ÒcThþ?Ž”ë èÒçØ£ãá»øâ5ñ—º«‚™¤Û ‡¯‘*þ¬YvŒ=Ä|P® caº•EbaXzL®‘¼À ¾Nè§t&H£_¤‰7c$°ÆfE¢¨êæF^gU1ÞKð”R£ìö`0Ó:#r­fÖË!¿W +WUnÃ*„b(Ýè·0ײϺ٠Ù÷ûoß<é—L7Ø'$Zm¬âÈ9²Éô<™_-PžÂª6¾óKM5-'©á“ëÛ‘3"7º89%ïz^ؼʆþgÀ¸u½PDz$s<›‘lèÃ"“!]¤ ³¬væYUx;<ÒV{6 …7d¦oÉܔصuu åaWsÿ F;¡'ئh¬²ka%èZ³²U¿å ºÙ¯ÑUŒ(âÌ\Û¢bW[*]…RÛ'ŽTü¾DÁaàYÆAp亹!/#À +Bóhr2»ØU˨_—÷Sº_ÝL®XÌœ'¨û¨íµƒ„ö2NyƒwìY/Y·°ªï¯ïf𻃻¬½7¬Š¶‚› 8E>ôRµJûŽ´éUÂýòUiHÁé\ºàHZÌG gÖÈ”•ššvEÙé1‚€!‘@è„,¥i0°`öå ½H {{=æUüœHµ´ +†œ ýë”àó#=øöª×âKÔÛà: ë B„3‡V›Î—c1îû•¬ ´ìÝE/]NIt(8‰€<œìH}øR¬M‚ù^¬+¸ÿÚ²—çiÐܹÅÞÎÈF!>æ;â.f‘K&lÕ\šbÐ,¹Cc#%`²³¹n¹– `K6E·E­²µƒÛ¹—Š2Ù‹f‡TPèNŠRÎòÆ–AMÚ•wœEì&L¶ z?îþüŒFŸ=aZf„QnÜî…&ï]»’¢Y©³'9¬¨&’Âh˜”ò ‡Ó.8h‹«J@®c½FÉžô ±óÂ…’½gW1µ2Dĵ1«Å6ÖŠ¬t¨•„$Â;”/@ŒÇag)7ð!<+9`Øõ„þqÝA¬5Æ$Ì­Ž#‹\ό繳ã.a\ýýxÿýöúÇ—¯œywxüýîúöVÎÅ8vƒ—ì PAGÎϘáK•Iñ錃X›Vqí³)W(âQôáÛgù]hcLÅQÑÙ¡ìxzâÏ&q<nkÆÂ@‹0»Æ#À›œÇ§÷ŒŠ4{¨„"Œ›]0hÛ‰P€ŸµE7u{æí\É2ûœdÑ›×á½æÎChU²†ð<æ…s{ð~Æ +HÇc{8yøÀÞÈh¶À¤Êa±«/Ó‹«x Y!YS³ÆpÏ™*ºs¸ŒÕZ"<¤¤>wꇞ9Q £™Üã@Ê,2ðCsÚÕÎwP‰½™‘æ¼ÔÊza.S–Û¡òjéAºAl¡ªÂÃã2)³- ý(z„ä u`O`]HU)Õs?4ÈågŒƒ³šUÆe3Eá"µæ’‹×¢žrÖçóüz8ñZc$\W[Bî}‡6•ŠÙÙžÅS².åœX0ô¾zä&T³²}¬™¾„n)$üÈÍÐcÔŠjó¦pK€Ê ÔBßð`Œ ´kd–ƸUò°»Á5´öèG@Ûo2EÉ>/XObject<<>>>>>>endobj +564 0 obj<>stream xµUMsÚ0½ó+vr)™‰Ë6þ8’¦i;ÓL?p{â"ì5V 2•dþ}WÐ qHHé0ÆöH»ûÞÛ'ïïŸ~’ŠyÏg>ÄÏ҄žº4Bµ^ð9½v, ¢€Å] Qu§Š‚K»"ÂÁAöDD&,êJÅ“¬.ün¸qðíEÞ;¿Š€sÈ+'Rœ&—@Bù>äE_Ìf°¬ T­*¬l”+~!´JÞ‚±Zª©apÙ¨7ŠF-Q[¸©QÁBC‹`°5ÎOóŸ=ŠPβŸ0pïçWpªV À #âI«2¸…n H“•ÅF—¨Y½ºëSXBD)$¯¥ƒw¡DSh9ABZ#Ì׉J¬¤Âr'!ƒ¼F³Ý$È ­¡]xkQ¹ÄÙÊE¸<#1Ÿ€Êòt¤²ES"Û2!ðñóBþ—gðöÇðÓ¸?i«³EcƧ\*¶ÕN\*僰ÐT•A 7ÒÖN‹¶ªP»BQŒœ:^E-´(,©´OÀàËÁx–bÖ"¡Ù¥…0ö®Á«…sÄŠT§Ï¡(sFUžT‡d8@²Ü2ýï—#"¯—ÃõjËÚÔ YÜç1L¤ŸÂLZ;CU)©QQžk+ƒávïŽÙHòÉàÄvvoæhåœl®‘LA Þ䊓¿å'û™|<ó0pŒ_Éw¯[ãu{F‡Ÿ­]]6ž^_ áij4 ÔÞ·²Dgï~§—ø™ÛºÄEIÄ’8]ÏJ» ïòÞ×ÞÑ.’ëendstream endobj -556 0 obj<>/XObject<<>>>>>>endobj -557 0 obj<>stream -xµVÛrÛ6}×WìäIöX )Ò¤ä>ÉmÓz&N]KÍ“f2 JhI@Á8þû€¤uµs­<’I‚Ø={v÷,þäã/ dLaLY5ð=Ÿâ(öÆM\ñÕœ -·p‰G““ ã©Zˆ’N˜ -§Ïì£gvÓàØÇõbðúÍ”‚ˆ‰'¸È Aø>-²á¥zïÑ|þ~öv¾¦Mq±QõÅGV.ÏÎcsDAÐnlÖÜÔdÖœêµÒ†–à ¦T˜åÕb%yN¥0¦ä#.sÁ$ iøŠkb†TQ`3Á=³’à¯Àþ‘QÎ(<7œðëµî·ØG¡è o¾t‹1[Ì_uõXÇÝ[‚Ÿø}–[ÍM£eKoË„3ຑ¹G¤§bõ•T†Ùh-³?mGóÇYF÷(ý²’ýß8µå»_º>‚2‚ÕEŽÆÀ;¬¦WÍÿã~ñê3i¸´!îåá{BüæDæôJ`õdF}O"%ogïè–IfÛ}Ϊ”Ñìîæ„Šx±ee±5Õ<3BIÊyi‘ò¶ô‹FºÇ5IÞòV±8±=÷w?SÆÊÒ#gIÈBéŠ9kk–Sʹ´¾wò RÄU¨ô‘ø'V )äʵW‹6S9œH$ -·Œy„B¹ÊšŠKã¼xtc¬6eNR8°X!œ´Ñ™4VC)ß^V;«îyïÛǹÔ}²5Ót¾ašUÔÞäÌ°þú\ï-k»¸<ûé8iÛ”õÉ!¤/ç…#Rž•Qz™£¥©‘IˆÿüöšŒf²fmšÑ6@dRóJ°½/õAäAçï,zn¸®a¹‰´@º\î%b˜Çè³B•¥z¨¯ì&ÌîÑ8nKÕ‘wår,›*E­BcÓGĸر“òâªmTÖÆsC3’½ÇíS‡»$‰ª©èe¨k‘­ûbL9صs„ç{¸!ìGžv€¿àÉðE> ‡>£WHùFÙ³€î'ýÓ( €>fxhÍB9aÌ!|ÎL|l¦­ûC[ˆm¬¥ê€ ÚáïÑ÷ ·c‹ÓêwåíJÊQ¿#>ÛÆÆI©jjt4G+¨Œ¡ pª©BKèǧZë§GÒ¢ýfÒÄ‚ËЋ§SŠ“®Ùç³ÛëýÂ?òRm€„~k ;@LÜ»£Ä‡Òtg§—|QyI<é*=±F~] þüƒìM|endstream +565 0 obj<>/XObject<<>>>>>>endobj +566 0 obj<>stream +xµVÛr›H}×WtåIvƒä}’“Í®«âÄkió¤ªÔƒ4»0h‡!Žÿ>g°îÎuå’ Ó}út÷éùoà“‡?Ÿâ¥åÀs=ŠÂÈQ8Žq=ÂWqÊíÂ%.Œ&nxl!Œ}8b*˜œØ„'vøÿÐÇõ|ðòÍ„üæ9‰Æ¸ÈAxÍÓ᥸¾çÒlöaúv¶&M~±®ê‹O¬XœÍÿÁæ|¿ÝìŒblÖ\פWœêU¥4-†~D‰Ð‹3ªÅRòŒ +¡uÁ.3Á$ ©ù’+bšª<Çf‚zz%$Á_Ž5ü#]Y£ðÜp¯ۺß`wXÐ>@ßüèc02˜¿êò'°Ž\º7?ñ{’[Åu£dKoËDfÀu#;rHOÄò;©þ +³ÐfÚŽæ_Ž14ŒîPúm%û¿qjÊw·t=rü2‚UEŽÆÀ;¬¦Ïþ|?ñ•4\šwòð3!þp"³z%0zâaß“HÉÛé;ºe’™vŸ±2a4½»9¢"ndX™¯DM5Oµ¨$e¼N•Hx[úy#íãš$oy+Ù¿œØŽ‡û»W”²¢pÉZ2¯TɬµË(á\ß[y¨Í„Q¨ä‘øgV +)äÒ¶W‹6­28‘H:n;#ò…²*mJ.µõâÒ6ØÉJÃáž»´BÓf6óØ#/1* +Á’‚wÉ÷hÒkkG¤‰è#[‹ÅÂIk•J}a4”²Íe¹õ¸ìž÷¾= KÝ']1Eçk¦XyAíMÆ4ë¯ÏÕÎÒ¹2‹‹³ß“¶IYŸBú2ž[B!åi!¥›ZZš™„øÏn¯I+&kÖ¦`D&/+ ¶×â¹>]èüAÏ5Wõ!,;‘æH—þD ó}–WEQ=ÔWff·3ŠÚRµä]Ù˦LP«ÐØäQ1.¶ì$|‰¸j•±á`bhfC@2÷¸}êp›„“6 ©(ãÖ0ö­µùmÍ•ì³(›’ž‡ú°éª/Æ„ƒ]3Gx¶ƒÂ~ài ø3žlßä*°ïÃ2z…”¯+sPý¤ßbeЇLC÷­(GŒY„§ÌD‡fÚºß3´ØÆú Pª˜6 -þ}Ïp[0¦8q[Þ¶¤ ð-íÙô5JeS£¡9:¡Jºg¡šJt„z|*µ~xÄ-ø—oÆÝAÌ¿ Üh2¡(îz}6½½žÒkþ‰Õ@è²cü;~<¶ï:±¡éŽNÏ÷Â8tãhÜzlŒü>ü5øIMOendstream endobj -558 0 obj<>/XObject<<>>>>>>endobj -559 0 obj<>stream +567 0 obj<>/XObject<<>>>>>>endobj +568 0 obj<>stream x•W]oÛF|÷¯Xø¥6`1’,KrÞ”¶) $AZ -Z0ŽäѺ„¼Sy¤Uå×wö>(ŠVŒJºÝÙ™Ùåßgãß„SºžSV“1Í&ÓdJ³åÏSüÕ’ ÷ÃÍøå÷ïÖgoÞÏh2¡uÁgÌ— Zç„sÆcZgu.ñ–mÒ¬©1½»Ê6´SeI©$+þÙ­ä‡f#qyÓÖZæÄç$´ÆW™(Kd ÷ô(¶êáâáòrýålL£É5b\çUkÊ%–šL4g)K•¬L½Oxéǵ˄ÜWÓ]ß&sÞ‹¬$Ü9Š­¨E%¾%òÞ´dÚ§ ØJ_‘Òn©©sö©šÄv+±Yg2.è΢±}}ËW¸ÑtžÌø敦V[õÄIO攪;ù„SWŸïH·U*ë„þDvcÚ2÷¸q~Ï¢l%àl6tÿûêã’Ð冴iè«6»L»ô)"Y²uIçÒfµJeþ¬‰ ðõ#^Ýÿxw÷Ù¦Vú ¸»Ýü8@/T•)Z5Êh -Åù ?¬>ÑG¡rv…éÕ57Y[IÝÞêùP¨µî`½ -%|¹•õ3 Ó¨jdÉT•j¨„O!`<¥Â"€v»5z€Ÿò2à€O ¹ºå•Ã™70]ˆ¬Á¯åQZ\Ók>=€ ¼ -ª»á·8%ô´ì( 5Eåt—AùÅõá¦Hÿ•æ¸÷¼Ùuµbí]½^1Æj€àQÑ°½pF”Îï]uÎIhÆÞ™ž”ÎÊ6ô9o?ÈgYž÷‚ìrŠ9ÌiEL_Ñ‘ëI=ËÀõÍÉ3Ý7øÆÂLÛ¢qv,(øS …€½µÌ$öñŠA’oè§{>å¸D6¡Ïµ´m%RÁùQÐ/ŠÅZP”¡­ò:ÓM ¨—t·pp';æ@Í-Âps@æ¿P˶iGªhvÝíNÑ]ªÓñjp¦Ü_¹Ô†qz_`ùôMÖ†J©ŸšÍ‹:Î}´£SfrW¡¬T’‘(wbo]ðÿÇ>àñ@l¾aÜÁ=- 5+aÃP‰„ß r=êEá åë=|ç Öõ&\Ë?¾yKuÆ9ºžxϾIf 4ü›kVÞ†ýÚرvÊ‘ûJ‡bÐôpádÎ$K÷T;E>\ƾ‚VÒu–^OAƒú? Ä?3ðO¥=÷ûÎöƒ ±9¼O3+DÎÉz®ì9;Žûµ×_O· ‘Af/æÕȲô1‰Ê´ø0ø€Ãì`£uRó -ó]EòGFsç0z1”äòâ‰Ó;a[œc1Ÿ—C±#ØFÔM´‡ãN’'èf#¼_ôêf!nAçAÙÑéÙášÂ&p7ÄݦM6‚•Em*^‹fé(1È™”ëëL%kkXG]°Y`’81W¯ëÔ¢×–n¦ÉÒM' ×&˜¤Ÿø“,%ײ«Qç‚=;‰˜a&q²¥åqÏZ•–ìã”›ÓÄ~”5¿Twfy¸Ø›vwô|¡á9ÊŒ0×¹3 ¿Ý^Ýùd€uh“ýÑC¹†þ€j±‘³Ë—MÐ2åþ1ÈY8ò[ÝxÁñÀP3)A‡#íAXϺó|=÷³·ˆ«ñÃ幫{L˜!Ùe¬„ÎóƒÇP…®ÏA›9>eʧIJĹ3Æ‹PéÚà¹ó…B‹ÄÌ4Hl ™X–¾ÅÒ·;'‰ù9màÂ$ÈàùyÍ…rè;h¾N!™ñl†0¸;•…Á(„ŧð8Ê‘v”=^z pBŸŒ{—Q¹Z/¹· ` èû¹7˜nœ*Ô?ÙFÔÛ¦æa5ݵ¸Lh®—ˉyilÛ‚9™ ¤S÷ëýpá ÷jÝg¨;îÝ  Nc7u¡{ϵPõ0‹ ò ->G6T̓`ñ~×….äÓë6A -Ró'/»üÖd‡—â•nfè7ï—áÕs²X&óÛ[šÏœMݯ>¾[ÑO<7š-¿¶ýÒªÜquWŽã[v´ïôîÙb–,æKty¬™,9ˆŸ×g¿žý ãæ=endstream -endobj -560 0 obj<>/XObject<<>>>>>>endobj -561 0 obj<>stream +Åù ?¬>ÑG¡rÄ››¬­¤nïôt(TRw¨^… +¾ÛÊúÈi”%²dªJ5H L§/žRaq»Ý=¸’Oyo€'F\ ÝŠòÊÁ̘­‡@DÖà×r(-®é0%Ÿ0ü ^ÅÔ]€ð[ +zVvŒ„˜¢pºË ÇüâúpSdÿJs\~{ÚÆìºR±ô®^/c5@ð¨hØ^8Jç÷®:ç$4cï¼OJge›Göœ·ä³,Ï{Av9Åf‡´"¦¯Èȃõ¤žeàˆúæÔ™î|_á +¦mQ€8;Öì©…@@ÞZfûx'9ê9Nú©Åž9®‘Mès-m[‰Lp~ô‹jñel«¼Îtê%Ý- ËŽ9» êŒ8Ü ù/ܲmÚ±*š]wûTtW€ët¼¤)÷W.µaœÞX}“µ¡Rê§fó¢síh`Å”™Ü•(+ÔŸd$ÊØ[×üÿ±x<›owpO CÍJØ0d"á7ˆ\zQøBù‚ß9ƒu½ ×òoÞßÒF] qŽ®'Þ³o’Yÿæš•·a¿6vF¬rcä¾Ò¡Øc4=\ø™3ËÒ=ÕN’—±¯ •t¥×SРþOñÌÏ TiOþ¾µý`ClïÓ Ä +‘sr}î{ÆŽã~íõ×Ó-Cä_УÙ̃{5²,}L¢2-¾ >à0;ØèGÔ¼Â|D‘ü‘Ñ݇A¤ä ꉑÓ;a›œ£1˜C²'ØFÔM4ˆã N²'g#¼cô +†!nAïAÝÑêÙ ašÂ&7ÄݦMF‚•Em*^‹né8Á‰öŒ™” ì\%kk˜G]°[`”81X·ëä¢×˜n¦ÉÒ'à'ؤø“,%³+Rgƒ=?‰˜a(qº¥åyÏZ•–l‚ó”ÔÄ~”5˜¿Tny¸ØÛvwô}¡åYÊŒ0×¹s ¿Ý^áù!l€uh”ýáC¹–j±“³Í—M2å2ÈY8ò[Ý€ÁñÀQ3)A‡#ñAXÏÂó|=÷Ã÷ˆ«ñÃ幫›L"Ùf¬„ÐóƒÉP…¶ÏAŸ9>eʧIJÄÁ3Æ«PéÚà¹ó…B“ÄÔ4Hl ™X–¾ÇÒ·;+‰ù9màÂ(Èàù‰Í…rh¾[ÑO<9š-¿·ýÒªÜÏlqåh1¾eGûNóž-fÉb¾D›ÇšÉ’ƒøy}öëÙ¿U^æjendstream +endobj +569 0 obj<>/XObject<<>>>>>>endobj +570 0 obj<>stream x•TMoÛ0 ½ûWð˜¬ÚŽã]‚$]‡Y¡véE¶éXƒ#e’ܬýõ£œ ­klXaÄò½Gò1¿¼zBH#˜'Pí½€g1‹èÒ9¢Fh¼uá]ßæ¦P4”’d!5Px@QÍlÁ`£j„ªåšW5X^vxUü¤ÄBŠw‰~”²„RgÔ– 5·ŒÕ}e{8ÑÕh*-J¬¡|†=ri@5°zØÜݽ¸X!w*%éø–Ø0(Z48@Ùv@Äᜪ"âwÁŸœB*Þ»ßû|@ⶰ¶Ce-¸„^±“¤KH‹;Ô.קҨõ,dàît½pÝV¥zi~Ó—oê<¶¢j¡Q]§Ž#˜h sC0êõ‡%ͧXkÂ*{œ…mA¬P’wgøû@S0T"7`5kðÐz¨ÅNXóx5’O)^FrUÓ´`}{ÿ}»òÆ^Hn‰ã4Ëùè}»¿àI%ýô† ç¬4ÂJ¦X%Ð_% î;wâ4¨7 ’h8(çÚEëCÆvž¸Ê¾iP/—Ë‘ÐlŠ±…åŽD;âæ5¬Àÿ`åS¬d¿/I¹ð‚%d£ôž»é¢A»u½KØâìêà„w}›—8\ä,ÌsˆÂa_V_×+¸Á'ìÔµ/½¨‡¥óÃ4c Eúi» ùç¿DœÆ,M²3kîúó¹ð¾yd`endstream endobj -562 0 obj<>/XObject<<>>>>>>endobj -563 0 obj<>stream -xVËnã6Ýç+.Ð…m VüªL1‹™ AÈ¢E Ì¢ÚÐm³‘HH%ñ|}Ͻ”,?’™&ÈÃyçžsÈoWcá{L‹ M甕W£dDÓ»Y2¡ÙíÿOðSiZË‹ÉttùâóòêæáŽ&#Z®k¾¸¥eNˆ3“¬¿U» +š'´Üjòå*Éœ]ÓÚz°üWöŽqïpʉ—yžŒzÔ¯&S}²ªØ{ããêÇÍêÉ"™óêÏÊóÂbM)82O»ÊeÚ{“³¤¨0VÓjßüÅ/¡9Å ºº¢°ßiOn-k<‚© /+¹5ß -ƒKÑp<åM¥Š+ýŽfÓþNUªôI–>ðb€;œÌ“™”[(ûÔ¤Ò#ÊòH‚2ÖØ Š-öô²5AûÊtÂÛ‡èhæ}ÀŸññüÞ•¥¶á,àJoŒ•x/&lIãêRäui†™+‰ãÏ;WÛœ¼ÙXÝû­ÇO{¿ôÒÁiÞÉeÞ¿u ÂlµÊšáõÔös–^!ÛN[òßj{U©ìIÎøÏEªéeª?LÍ,úI–=9é3ÛbG† r,Á‰\¯U]DdÌI:8v³'¿vƒâkSù@áÅ ¶ÊæX _³¢öæYcT‘tÎkža¶% ë* ƒºÊ(Bn…c -'#ë€ tÄ*Ÿ)k‘lí*~sL¡!µè[#ÊøE†Ô!x¹áÙoxVE}–¢Ñ9X>J F÷¤-t¨D„Á‰:Eq–Nˆ“ö üƒÇ%«%9/•9ÅxgåæÙäŒQåJ$E62Sé4øV»?PïcO8Íf5†Ù¬†ÓqÔ$´õÏWD¸¦¯ rΛ‡ãa-v ØmÀ0( 'å VDzØç™{`¹H;í§Z×6ê(í{­)c6¤ýé}:ÀKðLï3à ×±úEøsHÅzJS E‰Õ¶ïQœð•qZéLÕ˜“ Ül0k¹I0ÃùxxU :¦‹áœãÄ•‡èX$}l“ãt&€ÀÑ€O]å 7kyÍSï¨"¤¥Rí[£$c¡!ØíqÞ„>ùÎ:‰­Ï°÷ó~ ~FžÌ•;H“OÞˆÉãèˆ=P=”ܺý‘^ZKÿrRM pHÞµ!4f²<ñTŸuµRÁ”R¦Çͦ -À2UUFm4øêÊž×Þ:œS¯0õka¶Fça§­téžu~ÑÑɶ=<ÂÇ™úŒ|¨”‰²›hQmq&:9ä jü´›˜Å±Üã±ÜA:ºÇ1hl Tœ4ü†êjô§gÏ)Y˜¾^ȲÒ`~³Y—Yå<ã0;L9®‚M°â¯p,ùBùí{`G¬Ó”-9¹…mÅ<Ùh÷bÚ´’ƒž‹Óº3Z€‚÷´ÀiT§pФ}ëì°CR>±£óYûpPgùÉ1ÉÕ(:´$w#û¦¼6çâ‹|€;ò&Þ¨8¿³™ -Ϊå2ÁÚÎêªjoï = 4ýªJ.× ›‡ݵ··Y´^j¾¤ú¨ÔG­DÍøP17Ó´Ì(ákf¿Ý,uñHO"HŸrH.Œ_]]°‚Њ›ƒ¾WÚÿ)‹«øa·Ý¥uÖ\qïr/ž-fÉb~¯}“—øûò꯫ÿ§j§òendstream -endobj -564 0 obj<>/XObject<<>>>>>>endobj -565 0 obj<>stream +571 0 obj<>/XObject<<>>>>>>endobj +572 0 obj<>stream +xVËnã6Ýç+.Ð…m RüªL1‹™ AÈ¢E Ì¢ÚÐ2m³‘HH%ñ|}Ͻ”,?’™&ÈÃyçžsÈoW#â{Dó1Mf”—WÃtH“»i:¦éíÿñSiZË‹ñdxùâóâêæáŽÆCZ¬k6¿¥ÅŠgˆ'yÿ~«vAW4Ki±ÕäËeš;»¦µ)ô`ñ¯ìÍãÞd‰«þ,¥ô¨_M® +údU±÷ÆÇÕSšÕãy:ãÕŸ•ç…ÅþšRpd2žv•Ëµ÷zEÎ’¢ÂXMË}ó[¼T„æ7èêŠÂ~§=¹µ¬ñ¦‚¼¬tî6Ö|G(@.eHÉhË-šJWúÍfýªTéÓ<|àÅ7ÏÒ©”[(ûÔ¤Hèey$AkìÅ{zÙš ýNå:åí zš«>`áÏøxH~ïÊRÛpp©7ÆJ¼¶¤ñ u)òº4Iî +@âøóÎÕvEÞl,ŠîýÖ㧽_zÙà4ïø2ïß:a¶Z­šáõÔös–^!ÛN[òßj{Y©üIÎøÏEªÉeª?LÍ,úI–=9é3ßbGŽ )r,À‰•^«ºˆ ɘÓlpì4fMÆ¿vƒâkSù@áÅ ¶Ê® +°@¿æEíͳƨ"#èœ×<Ã|K@ÖU@u•Q… +Ü +ÇNFÖ.èˆU>WÖ"ÙÚUüæ˜B µè[#ÊøEê¼ÜðÆl7<«¢>KÑŒè,¥„N#‰ƒ{Ò:T"ÂàD"Œ8K'ÄÉúþÁã’Õ’ž—J€œb <‚3ŒVæÙ¬£Ê•HŠld¦Òið­v ÞÇžpšÍj!²Y%“QÔ$´õÏWD¸¦¯ rΛ‡ãa-v ØmÀ0(`Eʬˆ ô°Ï3÷Àr‘vÖÏ´®mÔQÖ÷ZSÎlÈú“ûl€—à™ÞfÀ®cõ‹ðçŠõ”eŠ«mߣ8á+ã´Ô¹ª1'¸Ù`Ö&r“4`†óñð8ª@uL9Ã9lj)*ѱHú"Ø&ÇéL£ŸºÊnÖòš§ÞQEHK¥Ú·FIÆBC°Ûã¼)}òu[Ÿaïçý@™),wåÚä#ì„9bô8;bX5·v$˜ÖÓ¿œ”²w}™-O<Ög]-U0¥Ô)ˆÅy³«±\U•Q …º²gÌ?”çãØ+ŒýZ¨‡­ÑzØj+]ºg½ºèáÈeÛaäÌ}†>TʈŽÐDÙM´(·8”Nž‡rR5†Ú©MÜâXo€ñXo`Ýã4¶*N~Cv5úÓÃç”-Ì_/lYjP?€Ú,̼rq ˜¦WÁ'X ó—8—|¡üö=°#ÖYƧ–ÝBȶbžlô{qmZÊIÏÅiÝ!-@†-ð_Ù)œ4Yß:›t¨CˇIw|>köÊà0?9'¹E‡–ärdßô‘×æ`|1Ð0cKÞÄ+çw6WÁY€¢Ü&XÜy]Uíµã½30¥”¦_U Àåtó0¤»öú6ÞKÍ—T¥úñ¨•¨*æf–µ“¦|Ïì·›¥.éÉ@éSÉñ«« 6CZ±esÐ÷Jû?eq?¬à¶»µN›;îýO.ÆÓù4Ïnã½o<ä_\ýuõ¤õ¨endstream +endobj +573 0 obj<>/XObject<<>>>>>>endobj +574 0 obj<>stream xµV]oâF}çWÜ7“¼ØPC¶›H¤MV•²Y­–Vª–< önìê±Ãf«þ÷ž;c‹š>”(‰±ïǹçÞsÇvà' qHÈâ¼3ð…CD£É×!~ IKû |}ñàzÖys;¢  Ù±¢É˜f !Î`@³¸{¯KIåZ”ø#Ip´ôI’ÙˆXZê,ÓÛT­ø9mu‘gÊ7¼2o i¤*›çZÕŽ´åVJÕ“PðœããÍþè ¨ ýPº©²¡K½¡,U²G›¬2öÖRW!C,eÒdp¶i¹ö¨ö42ÖÎÎ>Í»¿KÓ£_¼œb]í¥*NQ¦Zùó³BH@¸ƒ+ÌÙº²&¯E!âRÆ2’®”.dBZÑ"êÑ&Ã#¤uÌ‘Ä¥^"Hž#ñi¶–ÏÖ÷\«ìùüEÑ(J¯Tú 1¹T‚*œ¹Aò\"»Ëã³ó›Û €–›ØxäþÐ'‹ÿ§}üŸª´x4Îo×ü~ÈÍozŽF·Í•_E¾Éä[ç1 ‹:Q8r‰¨þXd¤€Ž.ióId:oç‚æó¦Ø?á|ìûÝ›\º-ñ€üºÜ}؇£”§I’Iç“:Wº?cï~=†5ö[UkÒ°iò…N,!YHm°Ý¦:=NDïØúª©ÿ¿½¼$ú‹ÞÕå\Ñßtóñö¨žÝóÆÙ:6·É ÐG²…·{Ok½ ï‹G÷Ó7„Q;öyÖù8ûK~›ÞýzC÷wÇZ¯…Ic‘eÏ<Þ`+—Bñù)JvÀkC¿9æDËhMPµaÆ¿ÉB¶LŽ®? |´!X#(bãL1ƒPÌVÒ£’[›e~fAox£HºOœ_Û#~Úæ{¹TêÚì’;¤ÈfÄ9n&õkNðÃÐ..(nÈ>O?\Oégù$3½áCý}³S?O¬m<À¡—t_q¤ŽÆ#M\¹aÀanfO±Ý™endstream endobj -566 0 obj<>/XObject<<>>>>>>endobj -567 0 obj<>stream +575 0 obj<>/XObject<<>>>>>>endobj +576 0 obj<>stream x}SÁŽÚ0¼ós[X7 !CAe{Ù]©jº§\Œã€Û`³±CËß÷Ùí–JU)ØïÍ›™7¼bDôÄÈÌ3ˆÃ(b²yÆ2¤Ëœ¾z;‰&\,²ý¼¹X—£‡ÇqŒ²ñ Ù2GYƒ€¢¥°R8e4ö’ײƒ²PµÔN5JÖØžÁ5ÌQj¥wØv\ü”ŽŽj8Ù”æn(r{ Ñû¡Š¡ÜËIùcaÏYBcÇRû"jy)ž7ïs,|ÿ…ó=3"|mš3ø#:™%K=N#ïøA ´JKϺV'"^CigÀ‡ ž(Çkñô}èà¾Qu÷o=oaÕŽÄé0=ÀXéq´7¼=½@¹éÌ!”À ŸžÁß–phù+ Š= ϵ¿<áîªJßU“”¦ƒÒ‡ÇbÒÙàfiJû&ÑKXÌPlMïý– Oô}Áduâ÷;&ë}I؇icat£vhTìâØ*‡^÷Ö;¡œMNaêý~ÈÂVþžâÌ…˜R¥5z éÃÚ¸½¿S‚Ú¸æíÙª[»ª±\ûÈT“–+”]cºÃ›°F’ÁðÊÛ^ÚÀ 5”Ä'ÅACÚ-…ŽÌ%FtN *d//¹Žó%ËVdÚü’³oÅóºÀgy’-e·³øÒS6|ÓìZ;Ë£Õ]Mó”åÙ’þ€äg’øæM9ú:úqendstream endobj -568 0 obj<>/XObject<<>>>>>>endobj -569 0 obj<>stream +577 0 obj<>/XObject<<>>>>>>endobj +578 0 obj<>stream xW]oÛ6}ϯ¸00Ì\%vÒ8¶kѶ¥[\ôÅ/´DYl$Q#);þ÷;÷Š´]µ†¦@"‘÷ãœs?ôÏÅœ®ðoNË]ßRÞ\\eWôæöMvG7wKü¾À§©”sy4zñvuqyÿ-®hUÂÖíòŽVÁΞäÓw•ê‚v´ÌèOÞ><>‘iIÑÇÖ¼Ð'ëêâÕê³X˜/ ¯¯o²lL—Ù<£‡68[ôy0¶NÞÐ|O.–Ù-Ÿ\UÆ~ùʺ@…ÍûF·B¥ð—ö¹3íÉÛF“-ñXã¸ïñHNä¶-ÅyEO¼%ÓtµæûŠ½~zD;#ÕJ°Wôz~=„XÙ==©f£(·¬íM¨Øz“ѪÒjÔ*]wÔi ›´¯,)àY[ûlÚ-!:6ýóë_?¼. fœÚ˜Ú„CÆùÂÙâ6»á,í|8‚n)ØÁ´í9n\ó”¤Câ€:…W)¾OÈ·Õ€t—¼0ƒçø‹¿e¶Èè£×®Uöÿ¾Ô:gƒÍmM‚´m}@TÈÓkê£ ö›ë.dô^9¼g¬Ó-Oë©ïóŠpùÝãßï¿6?þðûǧõ+¸ØijíW–PU×p°BZ­X|''ymÀ+â+B ›.€Î\K–gü®§rÁä}-wN8:;X˜sæ 4ÎÚ©ÚÐ “{ Ì°æ€ÃN»1¯R @@ -1107,8 +1145,8 @@ z 6ÞQµÂf c‡Ã.hÃÆ "3æP<ì â Nµ9KÅkžXòÜkî|c=}KØ°ô×Â=ç¡Óèõ[ZÎ``Ÿ‚YE„áXR§.$3Ü)¸+ÎY >P•X)O¯àk”þ(÷Ýãbã´Â†îã÷‚ŒbŽi 6í`Ò¸Øy,àÆ`±BŒÃK{¹î‰–ÊÔÒ4I>ôeÉjÕ¤À6…}ËvòyTT÷méB[§OµyÆ&Ѩg=`ç‚Q€tä]–g$=g¶Un.ïïNŸj×WÃÓÿû¼YÞdËÛ;|Oâ»gqÍîÞ¯.þºøuªìÀendstream endobj -570 0 obj<>/XObject<<>>>>>>endobj -571 0 obj<>stream +579 0 obj<>/XObject<<>>>>>>endobj +580 0 obj<>stream x}WÛnÛ8}ÏW ò²i‘(¶ãµ“Ç^ÒE€&éÖîòBI”Å–"U’²ë¿ïRr¼Ú`8H$r.gÎœÿ<™Ò?SZÎèjAEs2É&´X\á÷üz‰ß3|œ¤*¾˜Ïn²ùK/n&ÙlüüíúäòÃœ¦SZWð±¸^Òº$ØŸLh]œ­k »/·Ò M­õ^å¬î‚²ÆS°jå©u/šsR¦Ð]©Ì†:/¤F´-œ“0%UÖüVoe¡*U¼Z?™ÐÅô ®Ë³Ã5œ¤V¸ ŠN G¾F(>ãÓ—nhŠ`9ê‹«92ƽe6Ïè“ð~g]éÓ±çä.fËlÁÇî…ÙÓêþ-ZIpPz÷øùöÓÇ/«s”cäÍæ[e;ÏVL™?}ï|ˆJ!s·'gQE#9b¥QÎ\£ff€;[$p¿õë&E„ yÔVf´.U,:0šú%ËtêØßV†܃3cW+Ñä÷ø¶TØVÒN…a–|Oÿ…Î3<Œäéà4¨ªOɶLOÔH5l!OÉ0–íÖrŒYU¡zå!Ëä²kÅA†DWœ0]“ý­RvŠ±‘þœÀW÷RT©¨CX#Ç)H¡µÝ V)°s+´BÅ8™­è SoDQ£rôtö­*pyŽúªÌìe=½zXZËŒÛ6i ·O˜52Զ䖜ÎQ«dô`ƒÄE…os•Â`d”Ö‘Iû^Îz[22 Cpé´e”Á:Ì×Ç|¼ûüíÓúîñ! H¯aÝ)%ÜëÿÕº?3úh F‘ƒ8–ñƒÒ­ Å ml§Y6ƒLÄ?HL8ʨ“9žvRëb/‹H>θ `¢,ǼZ#¯á23Ñ“Ø"üˆDgJtŠ ÷«K°³dŠK³UΆ!jNÓ¡Gu6ð˜?:èÏàwGñ@Ï|4…V?dê÷§WTÔÖ&¥°‘²\>”¡ޅ úé ÇrŒÐž…îßÙ„±º‚Pu>7ÇpÔe‚ᥳ[Å P®Âô ¤hÚF|çÑ–&&+}dci}´å£öåQ"]ÍØ @@ -1118,8 +1156,8 @@ R ø°«>èCèÁ_lri†ò6 P Ìü6®%\Ë^X÷°û¨Š´Ãe[Ê{ÌÜK°¦ïEçdŒK½>˜N+Kœ½¢^~¸î¿·L—×Ùâ憓k^ïWoîß¾¡÷¼bmtžþê°­s<ÃÉ‹åäæå/ óå<[.®ñ­–fs¾u»>ùûä7BP…endstream endobj -572 0 obj<>/XObject<<>>>>>>endobj -573 0 obj<>stream +581 0 obj<>/XObject<<>>>>>>endobj +582 0 obj<>stream x}W]O;}çWŒòR*AJ MàåJ|^U*ЖTèJ•®œ]oÖe×ÞÚ^Bþý=3Þ„°ÀUÕ*õÚž™3gÎŒÿìŒèF4=¤£ eõÎÁð€>Mñïø˜ÿ=Ä_¯©ビ·?ŒÆo|8›í|º:¡Ñ”fŒLŽG4Ë h–íN‡“!]h»¢k—ëðqöÛÇ4Â.Þ¾ˆ 8°{_jKŠî®Ï(«Œ¶‘\£mÀRa*M&’  ç±Ô(MÖVÊÓ ç»kÜ= èh®©©T¦sr–b‰pzH³R-»ÄØ Ùî¯Ý‹Ë›þ½¹½¹Ü#ùùãòô¢ûyÿãËl½|úõk·zu~FÊæi÷Åíݯ™bEËREqˀʢq$”®­rvPU•[ÂÃù @@ -1131,8 +1169,8 @@ x}W]O;} .ž^²‡— —fÝ­A ÆeiÐZ`nËáD¹¤$À™µÀ•0&tyÑÌ—ª÷ÐÍHû JÐ]o+¸à)Ó>/XObject<<>>>>>>endobj -575 0 obj<>stream +583 0 obj<>/XObject<<>>>>>>endobj +584 0 obj<>stream xmUÁnã6½û+¾4lÅvÛ9&»I`½íÂÚC.”4ŠØH¤JR6¼_ß7”ìÍj‹ ‰M9oÞ¼yüw4§~æ´^Ð튲z4Kf´œ/’-7k|^à×1£ÇýèæyIó9í YmÖ´Ï á³í³«ªSE¡T|[ì<ÎÖXÑžgÓŠë ÙP²#Ïî ¾ÍJRžþÒæëžrk~“ÃMc] FĉÊi´5d‹~)SUu½ÿg4£éü0÷ù•29é@%®RUm} Œ]PÚT'J™ )*Yå*+Qˆu´ÝQŽû+ÛŠ`/IŽêRæ’o·}$Ɇ)K9æ=(])T–ô‹U²@{TÉr€TjÛ@«;ÛP%YÇ$ycUž´ÁåS¤`3[ÑëH3ož*ý·À“ DG§¿^'´³5å.óŒ[³ªÍ™ÊÖäŽs/Õø6­É„M¸+8…‘¶l ÄͳŸ#'ŠÏÖÿé´ ßòeö+‡{«ŸL[ ¼‡ª’¬À (Ôᥣ ‹M‡ rš)CY©ÌGŽê$ÿOt´î=¡­2ø.‡sûõ—r‹¤hµAgëN+‘f?ÆUhÛ‡ë}pmZÇ}G s.íOǺá¼F!÷2AU”¢…‹_“Kã>¶õÂnB/!´Èpƽ¥B¹×ëžéfןZ“ÐÓ’ÁþÃH (ÌÝP{þ¬uŽM@æK%m#µFиü˳;_Œe6£ì&t,5æã*1Ö0¶ƒ Qz’!½¿pÄá½MîúÒfïÏ#ß©96£3Õ¨TW:hF @@ -1142,8 +1180,8 @@ Iag }át¿Ä9Qø ft–†÷2¶OÏVn³VzêÏ4ööëƒÆüÂû}dí]Ü´`Í —J¯À xdWpN¸·¼(£8”ÐÈl¨ŽƒJ¦HJÅÄ' ±ìH.BTÑÍó¦NçëM²º¿§Åf%ÏÇîaûø@Ÿ>/XObject<<>>>>>>endobj -577 0 obj<>stream +585 0 obj<>/XObject<<>>>>>>endobj +586 0 obj<>stream xWkoÛ6ýž_qç 8®íºNZ`Öu M·xø %Q6‰ÔH*ŽÿýÎ%)?”ÖHä}sϽúçbJüÒõŒ^/(¯/>¬.^}zK³ ­J¼Y\ßЪ Éx2Á“|øëV4^ZºÓÊŠ\é 9Qg‚ÜÞyYS.ªÊ½\}‡‘9M§ÑÈÕìf<ƒ™áj«•ª’TH—[•IG[³#o¨0tf„<ÌK2šî‚}Ù{O¦õ´Û OÊ;\âvÖè âaãø§§ÒXbBWÓ×ѵßJ*…ÒžLI[)¬Q[ª¤½iIXIVŠ‚íy6„óúð¦±&Yµç°i…—ãd~¶Ï9³_rß"õ}‹#Ž2QðöÌÿEf$ÕâI+OδºÑ÷Öyä¡/=ÉÇFæ>œE– ‚CÒ™¤i÷ÔXéýžÞ]­_ö\ßÞ``§ÃéÖ)-Ó­FñÊ`,SŃÐ^làO[­b¡dž Š÷¤QdT(7µ¤òÛ0ý’„Z¯*…È‚ Ü3;ê†Øk£•76X;åG:‹œÌÆŠšACYPú#ˆòÑ[YK„Âm~h!³v³áwB£Î•3€µjØä¼Ý(ÏX³GÑk xq >b•xD:ÖLƒ9žµNö2NI05Ù‡ù(4,;%BÕU ¯À\Óð×çÊ d8±$©+!bâþ‘ª,¥•`kˆ é“gñr™>+Ýž`‰¦H&\h Îw×ê)ßµúöŽæ¬éx½Iò=ìÒíëú¢Èþà¨Ì·¡+mu£`ØѱíÆņ`"T3è:ëBÑ"=ÏçÛgõB°QÌ î?f# ìXiT¢#ƒ\ž¡ŸÔ­WæN}¢"s±ÙjÙV~LßXt!leÂÌk¤†RjDÔ];4ÿÓ€Gµ‘ž*ƒ€Ž±÷¼§Ìƒn•*8’<,°´3°’@Ñ–å!Ž·2qháœÛbŠ:³hO”Oú%ÛhcûBFÜzØê @@ -1152,15 +1190,15 @@ Eº ‰´1.!Öϰડ¯Ëç 9Ðh-†Œ†HnAã^T uHÊ+ÛíMÎc¼ÙŽI¡êI肃¸€²cLcb¡k¨Î5÷ÂåeÔSôœçn Ãxd&¾vŠ˜ ›P¾* ¿¾Á–ýþE‚~ M;Ïÿä‚ë6¯ÿïéÄÍÞ¿˜>ëí‹ñqE\•ƒ´µW±0ߎ#ì0BÂÂïFiý:ÝûÂð {xè-æ^ÞZ^gzuLèÆMœ§a¾UUƒÜ6@è“i•Öú D&<~:¬!Å:Ï3PÇšw º Œ·QɺÉû~Â~ÐóI¾¿benŽ,oÒËþÜ™_ÏÇ׋|1Aaf×lð·ÕÅïÿ¥­\Œendstream endobj -578 0 obj<>/XObject<<>>>>>>endobj -579 0 obj<>stream +587 0 obj<>/XObject<<>>>>>>endobj +588 0 obj<>stream xTÑnÛ8|÷W,òä±l«†­8’4)´—61P—ÑV1/©’T|þûÎRVšú¥…aX¹³³³³ûm4§>sZåôfIe3še3Z,O³‚Å Ï9¾ž©¯GÓ«Íç´®²,V´®×g3Z—ã[2í\G ·UŒªÜp•^Ä [*•¥ÊÑv£"?³'Ir–pJ¥Ñl#Uz[ª.hûH­w†›@ÊöH[mÌñú¿ÑŒ&ó7YŽüãRµ±“ŒÆ$¨° ‘¤3&ô€¡y¨¨QO²}l¾Ì{çhã¶BKxkÙ·ž…£äЙþ¤÷lÙmG×XùrƒsïºGùer]l»Hµó¢ë}Ökz²ÀƤÚÄ·¢Š 쫤\³!£+`ñÿªi Ÿ®‘W58}I¢ë `ã†ZöA;›„TTk]ÓÖu¦¸‚ØA⤲\ dUè;Ñ{…îëÅsOèdÚyÔl+á`´…–tfè{BÕå“43:È¡O×&*y+¥×mDu¶kØ÷}=ª1n{”¬1ˆ X0Œƒ }UÚìMS¸:læ9ïHÇ ˜H;“òP« É›°ÕQ«¨Ÿ9£µ£G<ô¦µ¤+VäêžÇ`dÑ@j–þ¢X¨Ö…µšE¸Z ðJ¤s€ÁöŽ¨éf- ÐxZñóÔv½¡ ÖX2@YtÑ£‹[¯#+´ü¼4´•Ù@çZX-ö† ZAqį;Õ<¨·CÚÓ~l'ù¢7ÿß­®(/òeñOÒù~|ôBéè„nþ½}÷åöþ˜ˆþÀ´ÑåÙÅÅåÝ?½¸Ž*¶š«ûã!ï KcõKä/·7}ø ìßBþ¡ Æ>_J†u?6%‡ŒçwƒÚ‡ØÛf¨ûWr{VÕ$É,F·|üwÖì2:‡Á“ºðŠØªaeÃϸ¯6Ñ‹zýaSŽái°´¥óžËøzj“…§WÅÞóU‘-OO)Ï‹ý~:ûx~Fï°/ &óò¾ƒI~2ܬfhl5¾ÀöÀú¢TaB‘#Hûéõ>”ÈÅj‘­–8¢òB^]®GŸGßýQçœendstream endobj -580 0 obj<>/XObject<<>>>>/Annots 301 0 R>>endobj -581 0 obj<>stream +589 0 obj<>/XObject<<>>>>/Annots 307 0 R>>endobj +590 0 obj<>stream xWmOGþίåK@Âw>l„*B€¢âbWi*KÕÞÝÚÞr·{ÙÝ3øK{ŸÙ;;`Ò´ ^öm^ž™yfüu/¡.¾ö¨? ¬ÜëF]ìlÝ_ï%ÇGQ—Ý~—¸•DƒvUЄïSÿ8‰z|6Eývµ=ëE'8K†'x×+>K†½hH½ÑIt„Ó^··+>}¾ÆéÑ1n5w7r{xÏöô†Gü2¬¶g¸?:Ù:~= >{?Ý‹¯FPFÓ9¼ Ohšg±“í_,E奥QDwSú`J¡4Ý/Þºƒé_áe2l^vúGpxšï¢$¢í­ÉëÌ+£››G”$íÍÞÊqsºTŽr“Õ¥Ôž2£=¤;Rznl)ø)yC•5+•KšMx4öÁùæðQù%f“œ´+•IwH¼ijO~)IK™„á-Ñ¥NÒoŒ„$~"-Lõ3øº[”aϱf3§¥÷Õ»8†ÏÅÒ8eie¦Œÿ.²"ÎÔÜiŸH"ÿäƒÖ”¦kº­dÔªí ,x ]Ö¸ ©2Ω´ì¤“…Ì< À ^Šœ­Áç…5uE³}øʦ¾Dâ­£éÅ8¾CŽ÷J/Üì>ç;N‹9‡’Ÿ›´P á]“•©10Þ¯+ è¡®2Z”ò*áÏ_Ùáäê ˆ»y]k^MX ÿv5W••™žÃ¸¦9â’Šì€óÚÔ–äS%­’òBa$b‚ȳ‚Cv%¼øœ*ØÉŒ…@N×œæ¹ «Å€6ˆÚdÙn@¦£‚%Ò#¥Ë¬J½¥´’2$¢$…Sð/‡}+Î&kJ„!X„K01)ÎSpk‹Î“Fbv°cÐô¥Ñ‘|’}15¼-Š&Oa*áy–ƒÍ}ì O¨‰l „dn )9dˆÇÕlP)Ö;Js™TPHœËéí§ëOw‡T8a«, çìÊ­2šZ¡@Vª’.¢—õɵú¤à¤©:s,“¥ ‘¬!T®2:ÏË«…¢-@¥½xyã*°Z:vš‘·"“¡pµH¤åãReË€áŽòB=È* ÂÄåd™VŒ„ÿ0)Î gBLX`m2\•U!SÁó– où´0 -["ÙdÛ&¥Øq?³ëÊ›…ìÞ±¸Ös¹‡ MIÔøG{•ªûN,Ä @@ -1171,38 +1209,36 @@ lIU xÿo¯®‘±‹8[¨Nªt\Î]ÜMâê8†ñh(êEÜí’ïÙûM)¸‰n´ë%§4èåõ­£æ1@÷dæþÖrÛ¾XJõûZ¡Y=ç£-¸¡f©‘‡,† ¥U¼i´ÏuÐ]K>m:s®dK%™WÑ0ÛÞ*`Ž6jYæýåõŸ“?Ц 5¼¦¹fºOÉ<|…üŠ¯0°mÇ‹¶ÙþüËíÇÙlòe2½Äß‹Cû LèÑéqÔ ³¨ ÌèÙl,,Z¨¼p¯åÞè¶û @¸ ‘äÞSÛêÝšÊ$Lê±KvV‡v?Gí24·ÀЃ öÆuµ‘½ãËä|•€¨XÒ›[%RU Ìß½!‘šU3ÄWÏg¯œ÷RXî%j ˆ£»H˜·¡Z<µT{ç6=j)ÀÌçÆ*ž¸xTÐt>¾ÝE㌕È"Œ LhôøiiØ›wÐWB®-ÏlRc´¡îšvžË9â© †± €Ø°ð†Z‘2²pò‘UíRÑ«¾…äÒ†J‰ö–bÇ Âc!Hîð8 ¬è£Â@†8‚,›ÉÑ(ê¥(Ù t$øT*îJÞ„ÔÃG„ΆÛ>Šª‚`4§û›°?]˜¦\;5ð˜ÚႳƒ`x‰‹Y;ßÇØÌ0a¹S?ÿé7Ldtó!Ð ÂõØì^‡‘0l¿ÔkÅW'mòvzÇÔéó¨ùñH„ÏÃÁIcQoÄ]N÷~ÝûÊ5³endstream endobj -582 0 obj<>/XObject<<>>>>>>endobj -583 0 obj<>stream -xWMsÛ8½ûWtå²N•Éè[ÖÌ)O¦Re;Þ•¦ö°ÞD¶$ŒI€ €v4¿~_ƒ„¾’Ö+Rèîׯ_7ÿs5¤þ†4ÑxFE}5È4]Ìñ9¹•Ïþ9¦M| KÓ=Ï&ùâòÁ§ÕÕ‡Ïiµ‘Ûg·sZ• ƒ­ŠëÕŽ‰¿©"PÍÊh³ýPòF´5d7ôªœ¶­§ZmuA…5>(¿úã*ƒ\Z^s’ßø™ ÇùH–ÄŽã¦Ú;‡Ã…-™”)©õ,vÂN…ÓGo;6¤èͺXŒÞ¬¹°5{¬Ö\¯ÙÉ1E¥­•6Ñüàhîù:XZ3•ì §×\R¥»ç÷9}Vºj&68­3°­ý™m]Uø{àõ© ˆÀºÐ9«i/vO̪ʱ*÷g.Ê“F³|" LŽ8ùL–dwáöM°[§š0÷HE„˜9¸%»WvOÊ{xV.9˺”7ô†ý;8ÜV%©ª²o—\ Š2[&œ6ý9­‘ôaJ–JAlËFRÞ!SY³Í€jMž½¼ð>§}d¨±X[WôJŽÿ`.Â~ð]¸ðÂÜD—ÁAÕVá ûäο¿ƒqÚÁøáó‚†ÀuCÙhJÙtžß -¢‹|ˆ?ZÚÖv,ˆa>°ý6~csñå·€ Çi”Ó/ŽKAnÿ œžž>ÀŸ¨²ªDL›˜.zÓa'°ÑC‡ÛÏÔš’èF }‰ùEàª&è¢+n¿÷ëŸQ’vl -Náõú¡ë¦â#©V}i‘o›Xš¼«‚È®žðÑ:½Õe±§µ÷]k -eh WýFsUJloYů\!ªÚ{¹hCË<ýBOºáNùÎ’v¯ óÅ ‘ÚþD³e[HèEe/KºZ'ßðòÿOmJûæ{ò:È<±à@UÝe ´‡¨ƒö)§ÓcN‘ÑGD5AÃepmÉKeêîþ,ò‘TK2g,u\hÏ8ñbìzœ»0–8“‚.–ôÀÈfékI¯{,~¿{¢ÇÕý×ß¾>ÒŒ¯lø?àÁqáX§‹<µt¿hí;dä´täÔÁ„ä|Š§Z~¹‹"]S†u5@^fŽ_µ¨z†v¿¥d‡™|Žò<—ïÇœ8ßFK']p™ ³i6³Ét–Íoéÿy40EÃ’…ô+Ôíú`è ìÉå“9"¹¬Ì^ô¤EäwÝn è6Ú aPi}« ÿ“%Ý…åƒôÛѼ£Òxá!¦š€â²™£3¢È¥ˆòÀ2@óªª6vÀ=ù] -ôjM¤TNƒo˜®0Ó #´F®£•ÒÆèášG׳ÐP颅roGñä*Ó>ÀE¿ßߧÕ>^JÇ`"»ˆ4 -VD¢b³ »ˆò‰á/>ç8 -ÄÜøl0È‚oE¦‚L'¶:E‘-GDåô×5-Î ü|Ý•ÙiÀÊ[ìæù½Ø‰ŠRªVÌQu?‡à2® Ü¢xCô+|½¶Jr¤;D_é~ù‘–.jçÞnÑ | †UÆh#^&HRbÈ_ óC(]mȤ§DMÀv‚ˆ„yaS":‹æ(UÈðNtÐøNòÐt”sj/E}î†O–"µPäUå¶;èù…9F“JÚ¶˜ÆHÊ †jêj1únî¦ðŸºøû>Ì©T2>÷ê ½S¯RÁ(ft£8 ¥*̤Ý3`%ü‹ù¹pú@c4¨ÊÛ¸/²´iðCÇ:à‚•ïSæü˜7}Í'óF“4ôä–<]ú‘¶ ’ºÆ@`Ñ16V†ê4Äœœ‘+z¶P’› ƒÝ9¤fWƒ“T÷ƒ0E¨w:Ù_Û¥¼õ`¢q(=«6¥z¥üaìG¥³»¹ŸbГæ}–oû—ÂátœÏ šÆùx÷ ~>}¤»nØQý­ÅKˆ• ç·qw6,ÒÔx>]Oæ“|>»íßrê×ÕÕ߯þ 2Cº¼endstream -endobj -584 0 obj<>/XObject<<>>>>>>endobj -585 0 obj<>stream +591 0 obj<>/XObject<<>>>>>>endobj +592 0 obj<>stream +xWMsÛF½ëWtù²r•“àwr²£8å*IV–Lía•Ãh’df ™ùõy=ÀðKÞ¶T&Mp¦?^¿~ÝüójHü i–ÑhJyu5H4YÌð:žËk†–i¾G“ï}1šŽÓÅåŸVW>i8¤ÕF¬Oç3Zƒ­òëÕŽ‰¿©ÜSÅÊh³ýPðFíum¨ÞЋ²ºnUj«sÊkã¼2ÞQm‰M[±UrÒ¥ïW\%ð£Åõ(%ùŒÉp”fòHüXnÊ=±µ¸œ×“2µŽÅß)úÕëŽ )z­í3<†hÖœ×;<­¸Z³•kŠŠºRÚˆ»ÁÑÛÓµ¯iÍT°Ë­^sA¥òlŸÞ§ôY鲘8`Ù·ÖÀµvg®uY"ßgœAЧ Úú.VíI»õ‰_UZVÅþ,D1Òy)›¦ce|Äi´H§òHNçvßøzkU³æN©€Ó{»dûÂöQ9‡ÐŠ%{`YU€ò†^q~‡ˆÛ² U–õëe0ƒ|§Ì–I£¤Mo2¥• ?"M)R!ˆmÙHÅ;dÊÚl Z‘cç„/ϼOé¿_jj<[—ô…WË0ø`?„.TxfnBÄ  jK†} ç÷7(N:?|^аn(É&”Lfé\]¤CüѲnmΡ`Ç~¦ãQ†ãóðŽÃù3à\Y…“´±u%€W5ºŒ}ºäuÎô¨òg´«„¬Öõ ?½NÓÁt"^Û’>º&rê®™îXoåÉ¿Ð<¨²¥w+º ì}‚ä]^B¦ƒ•ÏKù]fúH(×7Mý7ÿÆåÿ8 eñü D}ê£,‚§,¥Ÿ, ƒXÿœQž>Á¨¬Uœ6¡\ôªýN`£û·©5[‘òê‹ÄU Œ×y×Ûnï%£³lŽ:…ïDëôGY«öÒÑça¸è) ^zn»ƒ˜_¸c Ч m‹MŒdˆ¡ *Hæ¡«Ù›•s8˜tªàï‡ +§bwÈêÜKw óN½Hÿ¢•1ŠÂ{0vß+¡_¨ÏEÐc:•®çR K›Ö?Œ;¡ ˜„zŸ2çû¼é;>º¿p…¡ç¶Ôé2Žx™T–!‹q±©eŸŽ ÌÉ1Ñã°…ŽÜ\8ìî¡4kü*8)u/;HSDðˆz§’½Á0+嶋ÎÓ¯jQ +©—ʶÀ^µÎlj?Á’'“û°(Ïû߃ÃÉ(.4ÍFéhΠ>}¤ÛnÓIý¥ÅïI*Îæát2,âÆx¾Ygãt6÷?rëçÕÕ¯Wëö¹Ûendstream +endobj +593 0 obj<>/XObject<<>>>>>>endobj +594 0 obj<>stream x”ooÓ0Æß÷SÜK˜;Áqx×n+L¢c´·(sÜÖ¬ù3ÇAƒOÏ%nYË"wŠ*Uò=?ßÝs¾Ç …? ƒˆƒ,'! ‹”Ä‹ÿ3üëá ï‰;`!'|ì€2:®à=ü¿+fÙäÝ<C¶Æ¬8¨Í ÀœÂ2ù&% ?¸®ºR™Üêºjßf?ˆ:QÀ”ì#)Åjyw ŸT^(öw£œ úOÀ±X”Ⱥ,óª„ßc¬®Àn”­i$4¹|P¶ÆøKÂp×¥zìTk?œ^„Ý hDXSø†§àøø€i¬Où9ì,g¦«ÂϘ½Š1•~̥àCg‡’˜p½uÆ¡uÎŽ;×N]­k'±#뛯òJW¨×½-Žá.ß´ [誢–8•UÅiú!lïè\›ÖÎM¾ñ'NO'^|Î_Cð¹p[Ûü|±'‡¥’KÕÃ…‡q[/ºÕÍN=y›A}ƒ‰¥ÌksS¨²ñBØȺ63‰õBb?ä[§ýí{ýaŸ ¶Fôy#+k:i;£|k$"¸F¾¹¹‚ ×à‘amõ…CÚG]ôã1¸×¶%Npxýh=Üä67ç°}LOÇP±g4„§)p¬mØ.«éb6…+õKíêF™>b«†µbƒ$LŸ·ä‹}'1I¸ÀŒË*žÇu6ù:ù ‡µendstream endobj -586 0 obj<>/XObject<<>>>>>>endobj -587 0 obj<>stream +595 0 obj<>/XObject<<>>>>>>endobj +596 0 obj<>stream x­UÁr›0½û+ö˜t‚Š È-§­q¦5éÅÉd0ˆX#\$Òäﻂ›ì6ÓaìÑj÷½§·«_# 6>|\I>²‰ Ìe„øøîà¯äÕ ã€’ oÁ\pL’žTŽÍˆÓ·@é@ Ï}_û<}þ¥eȃ>D) Û†(9 ‰C\|à:š^^Gí½F[#ÆÕ« ¸,…V' d*’X yZä¿Añ¤©%dÂÁ¦±¤¡oH‹¤Ê¹Ô<5a‰È#úIÃÍnÑ¢à’1lâ{~Rÿ6XÔEþXܵoŽImKÄr‚ZÃÀ#0‹öRh– æÕþü ’1ÉÕåÝ|:A~i‘ÇHÙ|(]V‰®J~sÜpa=2Og‘ëtOM÷ª„¬r(2PÕÒŠ+½*J¡WFÔm¡nrkwû5¦†³”%Êœ–ZòòãÉþÔ»FË`ù¬‘|V”;ìÁ‚iŠV™à%œ½ˆôübŸVòwªP¶w(«QUí)º•ùí!ô(Õ6ϬÐüôŠïâDî´_+þ{ÅK~ÈçŒÀ<úa:G—Ø{­—zZ¶f|C²ŠËÅ-œâ«¬ÖkKó226Ùä3îŠU"D' Aòqx̦ß&U%ER¤¼Í¶âqÊËd«>¶v+q$eǼæò^¯ ªnæµÛiq(e?ÁÓîkMWÉ푾Q­v\wd­nÎp°YW –U–¡—7…À ºWÌú†ÅìJÍáìQòçÕtòi_º-Û7 ›Mí°îáÖÜ‹va4ËbO{›º-b: cëàe SÏ!, ½æ^™Ÿ]žŸÁ„?òu±Á6€¯•H¹afQ?¨c-ßÍÕ\A0o'¼2QžïŸxçš+¬êÑèûèÓW>?endstream endobj -588 0 obj<>/XObject<<>>>>>>endobj -589 0 obj<>stream +597 0 obj<>/XObject<<>>>>>>endobj +598 0 obj<>stream x­VÛrÚ0}ç+ö‘tjÕ·Ú憴¡ ÅN_’NÆ‘(c,"Ëiøû®°I€“K‡a±òÙݳgw}×rÀÆ¡ ^tѲ‰ cü(Äß.~‡éÚà{ ^2¸‡ N=¢—´¾|ë€ã@2EïABÂ=Û6$´Ý!.ñÆ£îð®ÚÏgzn‰œ šjΠÌ•ŒC¡•ÈgW''É-"ˆ–1ÛƒQ⹕ٯ͘§åx˜ Ú+dÓ=È]@kûé—ƒæe–Yš«…È×ÑVQn;¡óT¥¯¤‚Ù±öäFUð5‹Ñ N&.R‘fb–¿•¨)ÚeÊ’ZÂŒë=À·nVšÃÆí_¡ç ç†ùTi“’9ÄÃÌyʸªÓÙTâqMµX¤ðÎz4ÁÚ`aRLÒrÁsÏ‘Ò6A½3ºfµl«c-ê'q׆K`ÜûqÝM’ ŠCÞÜrª!ÕØ7¥æÅ:Ã~p"d®Nùª-r0J@H9ÍÊJ3XüúÆTðŒ5•ÿ÷xÐÿt¸iL™””˜P˜„T+Lh)–Lí§±#«WàÖ¼äé‚¿ôØÜ0Ñ>ÑŒ Û ûh¸§¥zŒT‰¥RýǸáïJlktƒ]\pu/(?.8ÀÏñùõÙ¨Ç]XÊLÐÌÓœe|?s¤i3‰ª/]»alî Ä'ЯãAßÌE&)JOf)”T—Š6ÇÏRáÄDk½6¢ ƒ_ ð†ç™¿N“Ö¯Ö?+CO-endstream endobj -590 0 obj<>/XObject<<>>>>>>endobj -591 0 obj<>stream +599 0 obj<>/XObject<<>>>>>>endobj +600 0 obj<>stream xÕV]OÛ0}ﯸ“€‰„& I»=ñ1P¥R´6ã©2ÎMã-µKì4ðïw„Ò"¨˜x@ªH{ÝsÏ=çØî}ǃ.ýyùÐ /:]· a/tCú=ûô*ÒºônðZÁnÿµBºþËÏOãÎÑEžqJÍÃ~qÔ¸Û…˜ï•Áo`2¤¶B®dš nàM…(m J)¸J´)„œC†,Á˜L^« £1Oi0 ªLðÌ>”éßAü»ÓÇëÑ8Ù2œ™5pŽrn2—P‰K%ò$"5QĆ„Ñ*_aⶠ~HòÈz˜ÏÁ<.i’WBª @@ -1213,14 +1249,14 @@ c3l( ~äÂÙhßN'7ÁßÈ’þÜÔÿOûL®­c»bÐo//ðÝp0€Ð¯¯ÜéÉÕé œã sEg†ËR$h“ãxQ¿^éDݽX›[ ¦O·W}°QàFaŸ~JЊ^`¿ø#îüìüm‡×endstream endobj -592 0 obj<>/XObject<<>>>>>>endobj -593 0 obj<>stream +601 0 obj<>/XObject<<>>>>>>endobj +602 0 obj<>stream xÝVQoÚ0~çWÜc»Aš„,„½Líh;¤[I»‡vB®cÀk§¶SÄ¿ß9 ª&¨/Ó4P$ˆÏßÝw÷ÝÙO-lü:Ðs¡ëMZ¶eƒïØ– ^ÐÃß.>’Á¼Xðê\¿‹v¯vœ…­“‹>8„stâ=#@¶ !=ê[®ÕµœÀ‚¯×çƒ)ÜQÉ"–jNbAó„Ò$ÉîÃ߈å¿`u\ßòíˆ.‰¼ ~•ë^µŽL:N)ƒ-æ>Hg×ê&ŽÎëA¶¡”6R†”¡T|úÈçjΆ㋉‹¤“ÏL¶Æ¹!!™SKöòf'¢c¡ÙgX-YÊô’«-,cD*à),×SΔnÃZääJƒ& ¨ÈÖ æ¸™Uát(‰iÍ"؉ð´·9”Œ2þÌ¢6<0JrÅ ÂV<Žñ þŒc•?(ãIn¡€.}TVá3“LåIa­ME ÈB HO5>@ÒW®IŽ®Ð”!VÌN'©‰C[Õž&ŠôO¯oËZ½)Š²$ ,¤$aªÜ°QÙ¾@†ã0¸kÐÙü@F¢ˆ§‹6Ì…¯ó°Ö˜ö˜/ÒÄdeÅõ¦£3X21Y„½õž»ÛÉpð¡>þL`¾Œ ÄFVÛŒ«&Ü¢ÓêqKÖˆ[²Ò°i‡¤¡\{§vú€P*òÕùß6üsq5¹,æQ}åc±Àn¬jƒÝ<¥í›Íð7UäX0ÁÏT7£f.¶£¯ fD@ŒS1§a€j)-g<šð™ÓÀýf<ü6¸®Od$Ì0+æ ä)§"bU¿7âtéºõ ‘$Áñj)â8¾WSVy8h‚8Àµ-ßËîäJÈÇ…yöNÜâìwü†¡L$õàj“Ÿð(…ž¢îû€Au›pzå÷ûà÷<+0WŠééèìFq"cxê^æ<*bgcÛéÙ}cZÞ `º9ô‹#ÆC žà•-ºŸL@çaëGë´Î¾Cendstream endobj -594 0 obj<>/XObject<<>>>>>>endobj -595 0 obj<>stream +603 0 obj<>/XObject<<>>>>>>endobj +604 0 obj<>stream x­VßoÚ0~篸·µÓHó«I覶” i…­M·—JÈ$xKlf'íдÿ}g'ÙÊ AÝ "ßÝçï>ßùÖsÀÆ·¡ ^Iѳ-Ž!>ýH?]üH @@ -1233,8 +1269,8 @@ T É Ž-‡Ë)Ì×zdz–„§ø}ì´\Û ëÃÙœ¾Ãéåìêb„`Íœ”4£’ò„šÖhQZÂZ§fBìiŠ§"© l5M¯ÊšvÙWÂ]:òªÀ)ÔPL¡&­ÞtÈúžïŠçãì¹Ø¾ùH~Ž2ˆ Pɨ꠽¯ |Ä|ºx[¾þÛm KJR*kÊQs 9¾kƒa ÛoŸ³Sê#VT*x[áøÕ!}'ŒŒg?´qX´W\·w‘ÑÂ}+ "üïž™dqïcïß~LIendstream endobj -596 0 obj<>/XObject<<>>>>>>endobj -597 0 obj<>stream +605 0 obj<>/XObject<<>>>>>>endobj +606 0 obj<>stream xÅVMoÚ@½ó+æVÕ®mÛô%"i9@Ô`z U´ñ®a‹½Kw×Aù÷$Á-ª*d Éã÷Þ̼ÙÙ_ü¹zÐ É;Ží@à:¶~âÅ ­^ô¢žm¿¸Ž;Ÿnp]ˆSÄ ¢b ˆã8'Ýéxøupï=ˆ"T,}¤2×–ûã,þ‰ŸùÍgÈm¹=$iƒ˜b"a0–p…à‰¤ ´Q\ÌaÁeJׯÄÖ&rNâûý ® 9Û?:¸=N†ƒV"”~܈î7iW¢½Èö˼û¶gc .l(™†ãÛ;˜u¥\¤ò#dì™ez@… سÀ²`³³ÙY[»–ÔÈÓá8Žh½¼¼„¡´¬®‘0g|ëéÅ0 Ÿ‹œ knØ¢ È&£ë¦mÖv× ŽkCÓÛŒ‰9òœƒ÷p¿ß çûå‚ʤ(‹ñnÍÊBö§"EçÂJrŒPôÿzçÕþGÓÔSÐrפmŽÁ¬Ûž²m;µÛŒÂþR5ȨºŽ9døÀ†éäæþÕñ…Æfr.”®ßÖ±aë±4ì3p´¦,2 @@ -1242,14 +1278,14 @@ O '¢,y²”§Ã¬ˆÖk©(dDÐ8ý'êzLˆ€dAÄÛrZÁÞ ó5‡Y¯žý, ±cq°U;í0ð4W‘eðOjêDñ•ÙÚ`§«_)™òŒáFÀ“¸}*œ¾¸s)W,1R½‚š%éúžôû„^>pQN®F×W0(—¡\áE¾œVÃh¹aTÅZ¡Óß©01ªHL¡Xµýзà » ‚õ²7qç[ç7 y*endstream endobj -598 0 obj<>/XObject<<>>>>>>endobj -599 0 obj<>stream +607 0 obj<>/XObject<<>>>>>>endobj +608 0 obj<>stream x­–ßoÚ0Çßù+îmÝ$²Pž¦VÙX¤–j%쥚PˆðìÌ?Øøïw&©ÖVÅxŠ8üõÝ×çûÝ ÀÇ_ц!›ÞMÖûø%„ €¬ÄÂ8‚Œ€ïù¾Yq5Ÿ¦_“‡÷ÙOŒµQ¸° ½^­Å†a’ZÈɶ g… ”–Œ¯`MsBeÃxÚ©ÿ2O§YÞ¤+Á¡†ë3(Ëœ@+õGHrl88,i®¨„4éã"L¤0õyn6°²åÐñý>M>>ˆáDfC¹¦–¦,ñ\µ`ø)A‹ï9ø¶x®s›©²ÊW.‘Å:—AøáÓbUŠ¡~ÑKQ‡g;!o‹È“½zœˆMÎøÉðSjÕœ¢Ýˆ¡µ›¢9ò²OòÈw$yä£äg~¨sBì ^î4U”FIþ­snëðɱY—-|èúw!ôšÊ…bD¹h‰™Îoo‘÷Rûï÷€6U³4QN?OÓYöà¸úÖÐ<Ƕ÷Ò:®\ƒ|§0¿UF·f/$«õ×R”¬¢ØPõú‚ØWÏÉå2ü üÖ;å*`G;ªOÒäÑ:¾éØŽ[¸ÆKá’Ôå)G—;ûfs`“û»^¼&"nçˆ Š½p<Æ™c?JÌ®ïn®!¡[Z‰šJõKúO‘ýÈÛ©cì ¼¡3-Ma[ÒþiE#/ cb0bÛ…Ÿ³Þ·Þ?áFglendstream endobj -600 0 obj<>/XObject<<>>>>>>endobj -601 0 obj<>stream +609 0 obj<>/XObject<<>>>>>>endobj +610 0 obj<>stream x­UßS›@~Ï_±Ú)W>´£FÛ<˜h‚}ÑN†Âa®Ê…ÃjÿúîИ¤Ž“aÈp»ßî~ûÝîï< lâl`\' >8¾‡ÿ-| i}à˜¡«lêïùÁa8øt⥦Ýõ=À¦ a¼“È,âf£ánø MÝÖÔ@[ƒÚÄBëáätŽ—¢Êæ%OÊmöÉTª+`‰Z~ilƒ.®åGãÄ"Â#0û6O&s:? §pµ“K.+JPnÙ»EzÊE„$p‘J(UÁÅuyµÛOÚÃrè±TlJÆ æiYD¹EԽ±âRì}„<ºf@MÒ/…ǶÅ#>¾1ERY`hNçê!×áGŠ•Á—7µ?Æ¥.1Ý=íA×xœaÚ Î+V±—ŽÖÇ!»ãñ @@ -1257,8 +1293,8 @@ x ë[{µÛ+wÁ“„éclCKÛ“Z^ðö}2~èsÛUTM¨`JDÚvënãGÐ_ûíÉñb4mkxÝ-ê—LÛ¬ñšP‰DÆUÆP`Éó:º9nSBÁ²¨¸éWËLƒ·Ðë„ïw…?«…ÿ&±_ŒG轉‘%Ý•à±LX{éÙ†õ­‚<ò2Æö¼š—ƒéñãL8 §ýnw.z3b)Î1=¸Z`›±gå~_F¿M"ÒJ9n@¦,Jú8ÿ%GtX¥)+4Híú8¥V&ÿù=ÒŸÔ…Æ_VÈ^¯,‰M„n—Qo\v|Ö윆E†Ízxœ$åš~-Cà¥yCˆvù4üv¯QÇ"n€ëí‘Àª·Ûìàôðpr³[™ë]öµâI=× êùµµá™ÁrÂLU¬ª‚Õé;îs×G5àV±ï8œþv£8{endstream endobj -602 0 obj<>/XObject<<>>>>>>endobj -603 0 obj<>stream +611 0 obj<>/XObject<<>>>>>>endobj +612 0 obj<>stream x¥V[¢H~÷WœÇÙdd‰â¾âÆ´€ ÕmO6‚P¶µƒ”Sc÷¿ŸÃ­íNf×Ú]D±8_}—:UßFèø6`fÂd Ùi¤k:L ]3Á²gøÝÄ p¹dôëj †ä€Líp¸®É>=¬bÿñç/ä/fõðäؘ`-’:§yÎÊgž©„ºdÏ)TR4w­ñþURH ö\Ò.Lñ¯THàG @@ -1271,8 +1307,8 @@ $;ÑŠ 7¬«œá~Q!ø§}aèO^°~RE´ñ‰–ì¥7Ia-ä–1è zOÔKîV»[5щ7+mv¬Ìù7WéÉíé£&: µ‘F‰[Ór¡Îf/ h|âFáaopkäzã&©„,-›nÐîN{±Ñª·×YÜ=lÁ]ßšÝ{,¥Õä;1Á]_'¦¡üw`ÿjh -â E¯­¡tßé¨Äm.ÐÂÍ:&Il¾tv 2f¶6ÏñˆØžƒbÇwXRlwüLE¿×,oûÃx9žéóë‘ b)êLÖ‚¶-ךYÚljã™U–Þ`ydt?úÌRçendstream endobj -604 0 obj<>/XObject<<>>>>>>endobj -605 0 obj<>stream +613 0 obj<>/XObject<<>>>>>>endobj +614 0 obj<>stream x­VÛRÛH}ç+ºò[X‘lÇ—G°qU ›Ô¦Ö[ÔXÁ$òŒ¢دßÓ3òu¹U톊 ¤q÷éÓ}Nϯ½„bü$ÔoS§Gé|/Žbê ‡øìúølã%)/:ühçÅñdïýY—’„&9é ú4Éâ˜&é~üÐÅoüNu=—•p’Œ.IjW)ii.ªŸ2£w…IEñî`ò{MÀ"¶’NÔFÌýñ·›É÷ËÓ›“/çG£‹›Ó‹ëópz#ýêpü0i7󞘹PÚF4¹“TڿDzZÈŠ„Îø¯ð–JQ‰¹t²´Ú:šIº¸þü9zY»uÙõèbÒi?æªoQY—›j~£²'b-«üöetòÛó¡J£4°‘3¤ó…@¯‚¤¹øa*Výbu9–ÒÿK,÷XJš®ºEÍ”£\É"›¼òíÌ¥f>Çø½ëúb4ž\½ÐR»Hâä†[€Òk­R“I²˜h}K&'&ëµ½žå†Ó4x_ÊÔyjJ—“Å1øó¯PõSš)E–1~ÌÖ­t»Uu[³GhWêVC¯÷ÊÝ¡`Q9®×APãócº“"“UƒbH Ì '¯âN7heu":_]~$Ãâ›TB[‘:º—]ª²ê%BH§Ýz¬³3 X&P……‡¬’>┪Üö"÷Ðtx ×–×ê$k4Éç¶Ûôø䜚# V–R£³:u€ëKÚ×¾‚Áq?‹” aa¶Þ(÷§ÓËÑåétºm?¢ï¦¶“« æcf¨V“ ¤Ç*à〴ìh® @@ -1281,24 +1317,24 @@ Iw ËÖ¡ µ’‡y'kmjµ¹¾Ínñtð3.@ðà U€Í…üWÓpî„YDJ‡uãG è.Gô†Ì[BiJœî³CpÜéŠõY¶ÚNÐ!§æcŸ¼ëîT‘›¢0÷€e,O2€Pø¡€Oì¢çY iC ÓÇ^Ù\4ümg!ŠšÙ–¡nàÁü¯r1\8>º]âÂø\I[mqabeøQ—³ð”xºÀ“U~ KQek%®ÎAÞ¸™÷iîÂ;Ï÷%üÉÆ» nä»­m‰®‚kw' Dßj–EÖ¢ -ùÈÁØ:*¤€Ãµ·×Êt¿¬ÌLÌpA gzÀýBå­yƒiLq(³¬°?|ƒÇÎÞ,QX¯ +ÌXªÍ¦23¿Ÿ³&EØi|#`œXkŒsµí V`c©p¥Ó¢{_ÛÜ’µº{îúšñðEïë‡Ü?Ïíû³A³$’þ ê ‡ÔûÐo.ÀGçÇGt"²€¹ã~ú{v3¸Öòl«y]½qËvûݨß`#â;Ý„CNö¾îý©,—»endstream endobj -606 0 obj<>/XObject<<>>>>>>endobj -607 0 obj<>stream +615 0 obj<>/XObject<<>>>>>>endobj +616 0 obj<>stream xÅVÛŽÛ6}÷WLƒ>8@¤ÕÍ·ÍÓîfØ8n­ê>еfV&’¶×ŸC]Ò…³N AmX–EÎÌ™3g†þÜ )À;¤QDñ²m/ðÄc?¢d<Â}„æTô®ÓÞÅ4¡0¤´€Ép<¢4'lJ³þThc_“´|m3%ÿ$\$ϬP’„¡-Ë9YEvÃi¶¸ù•Ì†iîSŠßOvnwÆÒš7ÛwFÈ{â2ÓÇÊòüeú©Æ@—æýŠsP:7¯H*KYÉ™ö,´µSÙQ˜À8•¨šØn-¹¥9ÛòœxNï˜ÌKNKË,?‰ÙÁ3\ºl Ë56"Û|õê"iÎò£K–e¯,]-fÈq»…_ãÓ3¶<:x¹#++•áÎÊùôÛxÑÐO\Ž©rdhnT¹çùåÉjù•A(Õ~2rP(VU Áņ=Bž WVÒúh¹iA;ä®,A˜Þ ‰LsZ­³ÅíjE\P¡à»~_Ü4tPñ‘•;¸3œK2Š DEA©ÆùZóRj¼Ó€&h¼(iÒ¢ö%$°hhʤùg8µ—݆:úú(xŒ†T1Ͷ¦c# ü±ãª³y±Â«Édµ* ÓUö¢[ûç;xàm¿ÆòÇ%p·Iâž^wÙ~ϹÑ{³Þù(v‡µÇ[ܵóÁ‹×Î/¦ Qd×M^Œ¶ÊûÒöéäõð´ã¼Èu\ÿ/ÓöTSbÍZXË¡ãB•àÜuŒæÐ* ò€ÂÓ›Ì\sZ&M!x™ÿ}¢¥™„@½³G;ñKÕ¶ <{@QsfœWØ­²ºµÙ…˜˜SŒ$V–”xNnµÈ£æÖõjÇjÛÂxµ‹ùÛ–ˆÁ´ÚÉü—t)„h,ÓuNœ¡ß›Sç<½[^ÕQæ·é݇·æµzóZ²2¼ÒÐAØM+ÆÁ×æuM¦ŠI¶ë݈ë#Ÿ¦ÏX|dZ°5f„=VüÃ?fótüc[Çæ7¶òjÍoÙ'ôßžkƒÞ=ëëòð¬ÅÏC7È…üÈ£ÿyÔ"‡¬+%1Œk¹Û³HαŸµøy¬ÇÀ¾jNß©f÷´Ö;ä€8Õק[Y½<‹î\>ÉY‹çÿ‹B>ÛÁ#fI;L¼ï žÛ¸íæp4ö‡“ þ–Í ³¼z}EoøçP….¢·;‘ק¹×íõFÎ¥g¦n2JüÑpŒ¹ŒÕ¤Nä6íýÖûv•Ýendstream endobj -608 0 obj<>/XObject<<>>>>>>endobj -609 0 obj<>stream +617 0 obj<>/XObject<<>>>>>>endobj +618 0 obj<>stream xµUËŽœ0¼ó-åÂƆðØœf7ÏC¢\žlO,St¶ßÙúHžšliuá|û‘²A?ºÃø Ï0Û€û5Yxh¿RIƒ?Ì?®:i9Zñ.N«ŽH™ÙN´:J.Kl¡Tƒ4'“Nˆåù9—´”ÈûV ¾¤ ^уÆþ«ç40ôp; 6´¤örèhY#“ k!QŸ>@Gœu…Çòß™µEÞ›cloý¢p «EõŸáú6×”æ‡/eÓƦKò’(g‘Ýl>oÞ]màÞa«öØkx=PYÐêwí* r[š³5‹¼w[§1K“Œþ5­Ækûêeá}ô~"Êð\endstream endobj -610 0 obj<>/XObject<<>>>>>>endobj -611 0 obj<>stream +619 0 obj<>/XObject<<>>>>>>endobj +620 0 obj<>stream xVMoã6½ûW öÒ¤ˆUR¢õq*ìÄisH±M¼è¡) Z¢lmôá%'î¯ï )fãfm§‹À#g8o޼ᗆ"‚ÒjÄ<"ˆ½DáÚÇ_« 7Hhûí†?oOÌ£Ÿ®à9 ã`Æ`‘ž%^àù÷àîãåßeú¨:È›£}é•î.p¡7M­Õ,‹:‰?»Hëæ©TÙJUªîΟ1Nøg쇞ÀHgŸn~[Ä°U­.šº’Ÿ­¡ 1Ý1Çe«6å´¬Hí.gì™MÎ÷Œ_ÜQÔß‚½#D·Û¨ÃΛZA“C·Vp{Op.ÐTÝWúäåóR®«ÿ 3åšam.‘ Ì¿w¶z'S @@ -1308,64 +1344,64 @@ Z âå0ôZeîƦÉ7¶GMí®Û­Þ¦6‰Uª±/ìíåRc¡ÓÎH˜¾¸¾Œ ÙùUÀÈÑZD“isŸÖq<çá|vml 9Y`KCEg^Ljc¸“#¸$0ñ4Ž'WLÐ Î/~9Ÿ §ãyœO!1g¾ûN~}Wp‡:!g¼[Ä+«7ñ»?l‚5r¹ëÔŸ<üë0+Äd¤‰¶ û.ߨ"²zPÞÃN÷J¼çÖeõ . ›ê )¸Üœvý‡A‡˜,s¤£¡ðZI"z‘d†'$—q]XŽ»1ÖòÂÙéuÓ—8’Œ.Sy‡aBg§éã>>¯®E=pVò¹ÓÅ?GT-Šª¯¬ÖT…¦1fdŒ¦ÐYà ï@t‡“ðD@lýT[ø(—ßË.µnÒÕ193…ì°+WmÓoPL&§Ó@÷È>UšÁdj³,M‰°ÎÞÂå:ÇuÃêbqÒ•ç¹;–ÄëÙåì_´mhîÓ ÅtM½Ãø¬Þ³Ç|ÖHVY>ÉF"¢òŸÎIV¸Ë2ž;\ø^˜$ø hz?½MáJmUÙlð¿ô8aˆµcáûmÇCĔ—üj:…,D$¼(ŒñQ‡»BЧùbôûè_Q#ÜFendstream endobj -612 0 obj<>/XObject<<>>>>>>endobj -613 0 obj<>stream +621 0 obj<>/XObject<<>>>>>>endobj +622 0 obj<>stream x½VÁNÛ@½ç+戸vHçÐiiËDÁ¨‡RU{¸µ½fwƒ¾¾ob’‚ BÊÎΛy3ófï{¹øx4ЉOQÞs—|Ïu4 Æø€?-)ÙŒ¼‘¼và'/¦aïß< ~0¦0&¸.…ÑÁíùeüüuþÙ°6C}ïèa|0ìÏÖV’ÈÒy‘ËÂR)â8-æÇ$æ"-Œ¥›‹)-¤ˆ¥®¼4`ým7G$fÆjÙ>noÎèúêÓïóDD²»Xæ$Š˜¤6©„pWj¾CQ–r0©¡¥A4È€-L"õÛ [HÔBi”¤D¦ŸÔämÒÎÙ›8 Ñ9›lOãXKcèúÇn¸.õ~eÏåð|Êd1·‹vbªsfÄ.$WPr¢lÉ¥¡b™e¦ò´Vu—¥TºªGå¥s IÌÔƒ1õ™$îã]T3Cù^jüŠški¦)*ÝPÓtâ5ŒúJU€}¡Ì¸D‚<7,T-ÈQU–e¶F¯F¥ÝÇv.VÖ¤hD(üû¥4ÿ9Üéóº€p©ßÒåÉðFEó4n¯Ð£Ôj7×ÐŽÈÈH1æW?M`Ý“íN™L¾Á[µ&ßP,M¤ÓÊ,…Æt5Ù{iÌm˜#Øefë¹lZi[8)ØÍÐ:˜¡ÚœîÜ•ëÝvpøž©@ªÈÚ‹SW»ô‘DÉÒîÍ`ãYUtyæógÏ…B0›ŸL)£4IeÜ sDêšuaÅê©áöH>W¦¹IõÕD«¼ê­ñëÐÛq#*÷—Рý¢’c‘a}5zZ©ÆKiaÉ—ØEkRæ›ïW5aK·¸ex|³LE ¬ vÎ9w&c—3Š…,j¬±uG¿º`u-Ñr+W@l„í)lŠ×Ö”Æø‰ ««ªw–·FS%¦¨=!UJ]ÔÃÆæ:=C¥8m~!„W[úÔûÕŽ?™?ⵃ{sz1=¥Ï¨LÆ€†¾.‘ GÕolûcwò¼ŽéÛÓke'c?ÀÈŸ:#¾tö¾÷þo°¬Äendstream endobj -614 0 obj<>/XObject<<>>>>>>endobj -615 0 obj<>stream +623 0 obj<>/XObject<<>>>>>>endobj +624 0 obj<>stream xµVÛrÛ6}×Wì¸/r§b¨K))}èØ­›x&Q\›™ö3ˆ-ÔI d÷ë{ ÑvT硺Œ(r±—³gpßRˆ÷¦#G”nzaR4‚MfS\ðÕ’r÷àÇpD/=OgÏWœÇ½7¿Mh8¤8gïÑlJqFˆ†§}A•H拉LV²Èda©,È®$Uª’Tˆ¤¤_ér)–ëG÷@Vê\¤29%Qdî^YQQo–R'§§ñß9oBs0šDíσq0 f]_ýò×µ4‹Roèú¿"jV„°¼ýçËE<‘X¯Ët…°Þð šÁÙówdÔ?’ÊÜecl½¤LXAª å£•¦Â%Õ.å È*-MZ¢´‡£aØ «ScOŠqS¹’X†L4쾖ƶ€´å=‹=£T©\§e}¼Bo† °û‡ðÎ9_½•Ù1ì9º.TàC–©âöbß“øóÍÅÛ+GŸcÞ™LZn„½tÛ"-«õ£_ª€99dÆÃ/T µîúfz0…û1Ü‚±ìPŠtÕ:^ÄnÎ/ñ‡Oï>-‰3ÇgÃ+ í”]½íxÀºÀ½ºQ™Å-aš Ì¯®g­¾îEK[k¦P&½ÑWa˜¸y¡sàGoüÏYz×õ¼G“åL (†›c]¦ÒÆGS¦ Ü-nO¡Ÿò¤/ƒ[J’«Ë«‹$Y¡«ÃÍ0‘ «EarôÎ<‚ù'Lré²FØéKVC×)Šƒ> ¬$µ®Jý*5e%·+eŸº¸+Ê]tq<èÅ¢´ò­sÒH†Cáæã9Åœ”Hm;gìŽ'Ógmw%ÕP ¶ÐX­1—.ãsÊ•6–×`ŠÂQôgpP g$æ;cþ—«µ¤ô?¾w2ÃÀ¸gȧ„zþy˜”©ÊÂHWÙÖ³‘,†6âÁ²ŽýÀWÚ) ¬kÛ­ÂEÓR'16Î óí"±ä¸¬Qæ“bZ÷Í ä=#é±8„ÖÛRÛrßñƒ#q›­r¿Ü·}®M0ôF;)…BøÜ®¾îVÂõˆE·Þo[ÒÒ±úI…,q Ô[Jl~GBQŽÜ¾Ä¨*&Þ^©32%åB£4§=R…²J¬ißÕFÉÅxiû9D°-ò‰ÀtÄá$ÁËO[’½5Ûô„KêlÕûÑêXƦ±~qS阣eúµ®1øæõž½Lü?¾wwæ õ·@Òî ¯Mý‰ý¬9§ '8‡Íç8Q¹ÈÍÙÇó3úUnåZ€a~WƒlÜÔÁ3¶LÃù—c½—"[L¦“`Ípľ6‰øÖEÜû½÷/áfêRendstream endobj -616 0 obj<>/XObject<<>>>>>>endobj -617 0 obj<>stream +625 0 obj<>/XObject<<>>>>>>endobj +626 0 obj<>stream xUïoÚ0ýÎ_qªö¡•ŠIBH ß -[¥µ£%“ö¡Òd’ d;µü÷;ÂÒ‚4röó»»wÏ/ z»zÐ ^4æ@Çí±øÝ~{ô)Rp]—¹: ß?DÖ0×…(¥3‚nQ„ï8ÅçRãD3„§Ñõïç¨!-ù4G1Õ3Xàb‚%d&’þjZ8ÈDOøR¡ÒÀé·}ÐçB¾æ˜L(4,* ÆRhž‰‹èOæÛf}n0Öè2µˆ´!£ìˆ$\óK:.Ϋ$SÞa6Cž`É bkèo²jzó öšÖ•Yà2¿íAÓ Y—¾Mp“¡ 7 ¥€9A§ŽÑf“Š nFUH¡ð¡U ÝöÀ%²)¿bØöj†=ÖfÑ÷q¢’ Åc | Œ²ó6Ý<7íS¦!"F šÒ¦Œ¸‚æs U1SPðò“ n•æ“c0Ö’N4‚I³aFjËñû§ª¥²³ì’JBâä0&EoKß,Pºš %8o~ÛqAÇv·Ó K~$ó,^ÒZåï’[GVÈi_\[~{+× Í–K¸©„ýcÔ% ŽÙ‡¤:Ôë\ªÊe¿këŠõêo0Í*He¹ÍgbF6]Öe§ŠýZ[»~³™Ìwe´c´ar½?8o^¼zm[ÍÝð‡å: ç„'ànEµÀÒè!*É·HÈ7rAÆ¥ŽÃZ§Ø&{ÀÒªfŒq‰ú(Pšžà÷]ÊyUÀøîæ8£tmŸÖm d¦áҩܬ†Žfå8«¬6ngšØ&…Ç2F°÷³µ_²ÏÚÛöŽ*V#¸òˆIæ²4±$£»b)+ȳùJñ­aw}=¸a—½~‡u\{Œû÷ƒ>Üà_Ìe¥‚¯IÚ߬W7C§W3=eÉ~è³0èÒõJ©ùVm·Qã±ñŽ 4žendstream endobj -618 0 obj<>/XObject<<>>>>>>endobj -619 0 obj<>stream +627 0 obj<>/XObject<<>>>>>>endobj +628 0 obj<>stream x­T[oÚ0~çWœ·ÒixqœÐ—‰Švcj¡wOH•IÌH µ^4í¿ï8÷uÒ@(Æçä\¾ó}ç±AÁÃ/…ȇ€A2oxăv;"!„q„gJ¤2„,À¿» ^HØ.C@=âï2PÊvºû”7>w€Rà,—Åð°TÏž4;$ ŒP7ò±”Úóôgoþ-ŸaLž6¿û½ÎÖVìºE,Íãr2‘ E–©Ö£´Vïý[~ã拉zÂH¹˜KhA™gI‘JÐFeù|eìá93S0ÏFGú@¾áé·û.ç7ûã™SŒK#E»ëxp xŠ%§RgJ¦ ’Dê:Ør~ì uØû{½(r-×Ûðà ü«áÅý×Ao·]Ä~–%¯0y:Ûµ6%M©òý±0/dyš%±]®·d˜@¯bŽÞ¶°%\—R½B?ŸpUU³Ý‘¥_sPy|*1ú&3¡5Q-˜—ÚÀX‚Am™ 4ž…±NöN9¶‰®ElÛè=¼þ¯ÐZzP¶Ú•nGM1Óˆõ±}¯·´E˜ˆ¼‡0Qk™§ERÎ%j5…÷K÷_º[Nm¥åjÀÕ–דó óÆ'?t²Ð¨íd £æŸW*8^\‰±%P"´„àÄbµyÛÞ¼ý¹áÕ^Þ÷çCH‹¹Àšlš0“Or¦!”´1»ÀÕ½¤_]ïJª_uPŸâòÆ‚œ¨?è„!Ê]ÜÇN:±“ÎYŽóP(9à ÉséUåm,|Õ¯$dUo|¹š­[½¸óä‹QRa„#W\/pÅ„u:Às°Þv/O»Ð³P ©4|)³´Ú%­¥o+òpd®tæJ.d¾¢÷0 IÄbÝÂئ<ãëÆo>“âendstream endobj -620 0 obj<>/XObject<<>>>>>>endobj -621 0 obj<>stream +629 0 obj<>/XObject<<>>>>>>endobj +630 0 obj<>stream xåTMoÛ0 ½çW=¥«’íÚò1mº k»Å»4IA=8R*ÙC¶_?Ú²·´u³Ým¡øH¾÷ÈûŠy Ir3£„ÂéiNRHyŽ¿cü: ë>æ1ɦñs–§Óœ’ø1ÒY9;yScP®±«ŒçP*ÀŽ(…RÎ ’NbŸ´ßZãõqù ²ß Qœaߥš~U&q§CÇ‹X‚E1N!mÚv¢©¬iM£wÍC¼h?ãeˆ«´Gº„z%TãZß@eÖÖmúà9Ý´ÎvÇ;)eÇ>2zt­@Ù¨Œ?ßJ©½GÔ@*ª€L®¡'!aÖN€‚Àåj×[m`¥%•ÿÈÅl½ZaZ÷­öóQ T` Bî%ñŒï×þWâ·FY‰ú£ì¯•ê¿ƒê-1ŠÌtGÏ{%éà1´ÔøÞ ‡ü…>Øw£Á^çµ×{ÒXøî±³&ÎÀÍõå—wWËçWckëJþ€;aT­¡±ðUƒìJ¦k‡‘÷œˆõ_bÅ¿6@=Ò*ÂÃfn碮á§vÖßwLÒŽÙ•Q• Þa‹Ã¸|8{,ç$+ Èï¶rµøp¶€¥þ®k»ÕÎÃÛ¶ ;/£œãó ÇÅp+5”ÝaÂÓ± §£«•â‰Ï3ŽñÓ¢û뢜}œý8-Ëendstream endobj -622 0 obj<>/XObject<<>>>>>>endobj -623 0 obj<>stream +631 0 obj<>/XObject<<>>>>>>endobj +632 0 obj<>stream xÕ•Ýn›@…ïýséT…²kº@ï9i-9vÓÞ$‘…a¬ÐKXˆä·ï`Ö?$&­Õ´ReYBÚÝÃ93³=ý8´g™[˜lסgNÿaµY°»8óL÷Ø &˜i?]8÷{ï.=`6ø+z»pé!z³eö=s`2fÂd>„‰”?ªæãÑüÌÿNÇ0Ö3¸CÇúSYâȪtYYĨ ÎȱÊe¦ÒJ•°DPAŠ¨çû*T¥Ùh“¥¶K¶I]{!7׸ÙúÜ…hv~žMŸ¦£fÝÖJTSƒ ¨˜$UÇÉe‡k¸²(Á¶”q¸÷ëxêx·ÖAÜT¾ÍÆ£7Ý"UÉ°J©lA$Ó€ G…†eµZaA^cZ)^W?«ûpÚ nÂÞA—iíVA)ë~'Ä ¥ªrÝÚc Í®”·­¿¯C—Ô–ÀVÃÂû ¸aâ®»Ú¡LóKLÖí LÀr]¢zÂàF·)ä5… Øí®X`paêúâ²Û‡X õ³wßJ[²•îᶟĪ&*XÊG¼={Aö>›™¿äUÃÂ[´ü²Ê„—¢Š¬ ™nÈ[h×G÷ý(Uš¥H“Q`YÍ[ƒ&d‡Aª CTª ²ÉÆ ÛÛùGÜÌâ)}ÂúÀÖtÍß¿ÆÜü?‡ñ ½|¥Of?ÊŽN\WßQÌæ¦ð<} ÷çëó!Œð™c¡àcG›»Ê`Ž»Ùi8–·ƒãøEm;¶é—h#ˆÞ[u¢ ¿÷¥÷ŽçNendstream endobj -624 0 obj<>/XObject<<>>>>>>endobj -625 0 obj<>stream +633 0 obj<>/XObject<<>>>>>>endobj +634 0 obj<>stream xµ–ooÚHÆßó)FU_$§xëµMßœÐj \pÛ“šª2ö8¸5»Î®–o³‹IpKH«ÓE <ûÛÙgž™å¶ç€M/B¼ÒuÏf6ŽÍ\ð£>»ô/róÀ‹<ýøà<î½x€ã@œ+ˆBˆ3 ŽmCœž¼¿œŒþ8¿PßÑN–ãÑqvÒðL¤Íydbx²FX6yŽ*QÐ#¹ìv±ö ³Átü‘7ëÏĪOo¦Á jK„Rˆ¯´eS±#ìt•ÈG€ì—›šèäI©°Ü@-®ÊDl1ªe“ÖÄ?·ö[5Ìa܈ùZŽ>ó˜ã2—ÁªJp…Ýìl°Ü`:ºœ~¾¿~ü´­šIGä)R!;b¾›ÌbÏ}œ¹§3\Ÿ”…Ò§K–â¯O»™v°¿c‚_.üÿ”«Ñu2úEKµ"S ’K±¦ÊÝ6¨ê3èÊsÌgÿõ([µÆH.ãÔŠ<+Rr Õ¤)*µ­YšTw«åù;ãù fãøâòÍå d•B¬í›¤5̨k2˜UëÅ]k/†,жWJ[ÛLä@Ë 2/ÔÉWä 8Ô«BAEH$¾ÒY8Ì÷\Cˆèu²$ÁV@*8GCнZ{2>E͈$òbz^SÈ?ק …@›ÊM¥X%J}2SFkÊÏ ˜¼ÔtJ#áp5šƒÀ·¢^²™5Ï®éo>™õûN„g µ uyQ"¬ž•ø3»à7?‘œ:¸/ üe4 ¨(úpöwß³mƒ´ºùê€aYÐPƒá*)Kä7HiêÅb°3Yç™ÉvòŽææÃ-v]¦žJÄRŠªoqÓ‚I!Í4$Ž»‡h…Ðßï­ÉݬËôÅ{”E¾¹O]"Uã!í…¼ƒù­ ƒaò¾ËÚ„Èø)ì` â†óöwÓm¹yþ·#° Sv]»-ðO–a^pjÎ\HZÐvÈUDÜùŠúJntãhaöïÚû»à #L›¾uíï¶ß…uƵƵ™·-¥Kv<ÜÕè8¦½|^õ&¯û’çxÛt¢ö–u|—ý>!]±‘§GÂb0=Àï°JoR^/³œ02ÑVh÷uh{-›î¸ Me¦¢§~è³0ˆh˜RàKG¯ǽ¿{ÿí\¨kendstream endobj -626 0 obj<>/XObject<<>>>>>>endobj -627 0 obj<>stream +635 0 obj<>/XObject<<>>>>>>endobj +636 0 obj<>stream x¥VßÚ8~ç¯éÊž MBB߶ímµ»{W¸¾”SåuâÛ`ÓØÙ”ÿþf‡Â6ÝV:!Áóã›™o>óeAˆ¯æ1ÌRà»Q„ÎÒ …$›ã÷ßµ€Â$Ù« :˜Í²a8I‚xÈ# r¼Y^^¥E°.VšÍaB CXóñru —-!~}±þMoŠÐ§Ñ ­óqø5,ºÓ>Ðôô˜b,õV+x«•­uõ|(Ñ…Z@”&jøADPÄâK#Œ…·%«*¡¶Þ­GÂ4¦RÆ·ÚŠ×P¹üFÔ¢ÅvŒeµ5ÐJ,ζ^l6/€—¬fÜŠÚS9HÍ~œ. ›vXNóJ eÉÞ–vŒ—R‰ (mÝ &v's©¤•¬‚%S7L±-æÛ3cZ]çP2SN€m™TXk[JŽhÑvUSNiL#òÉ“ô®L¹Ÿ”´FTlÆ•n}Y›‹€""áZYUp/8Fîc¢%õzÕõíÏÕJØÍ…Gã¼NãH3Ša¤pÑ©¶O `.ƒø]üЭƒnÀj`UËr½èÆ‚…šÕ±›± (€åÍo  ÷Õ·»«T8k¬íIV VJ¿¾¼BjyºOãì”XH-O«Îð”L~êï®ßýÞ­B£rÍ›’Aäpß SK|tˆ¾­ÚÙ†ü}{½ZˆöŒ¾’\çÄàÚ·÷ÿ…õäýå°´$Ÿ²~ŒÖ‰ØÄ VI¨½¤QÙ¨æêIçLsoh:¨Ü ï8?[‰ÕžñaÍózÓUô3½XÞ½ÿ|}{u×lH2|×¥}Aì"Rºóé)v¦gÛy=‹æø—`±€tã¼ûV—7o.áx•ÆkÌÀûÓPØio;‡‹_¹Y“yÌÓ ·ã¾rìÿc=úkôxf•4endstream endobj -628 0 obj<>/XObject<<>>>>>>endobj -629 0 obj<>stream +637 0 obj<>/XObject<<>>>>>>endobj +638 0 obj<>stream x­VÛrâF}ç+úW,Y, y·ÔVÙN²(Oë”kzé[mY +V[„JCôa§ÞÅeùrÑ&BLFÔ‚8aB/øŠº‘Bãq…IÖžäs¦¾>!C£Z¡:¤öÿ‚«Ù’˜ÕvGA%Huß-jãïð]ÛªÐX%H¶T¢¨8ѤA[ÎQëJVÕ–Û2eÅBȵè @@ -1374,33 +1410,33 @@ T "«íî%ì†Àçi'ã°g—þ<Ÿ#_¸K`3V mÜ—n܎ǧc/}3'Ä’ŽxF]p”4 W•´ºÞPU«•G? ‡e¼\œÆç2|0ê('ùe=»¥’Ë€gFßCu»ûME:û âw85Rêât=iai=láÚÉe³q3¿Ïzîîø9*¼¤®qF¹À ùG];yЃ‚Dü¾û¦ø…fé<ù‰Ü©§a|FûR¯¶ïDr0îi»q÷ÓóQÀÝ´ß>>ç¯_ž~kOœ2¿Ž´ÊiÙ•põ®¢J”òø’#‡õ¦ò‰§ÍOV’Û%!ƶ{­ÁüW»ýz7=ñ£Ô­ü¼XÈã— °¦A¦HÞ~¦iHZ/¾ ?lL¿cßzÇŽ2và[]µžñ§AçO“'x”3éå²ßh®û®D¾W¯$,åÖD®Üº([½º‡Â[-9ÆεæLÏý|ùH(¥òâîì—ôYÈ%9D§¹Q·dbÚÓÙxLÿhýéäéfw¸ÂZ6HTýjI7U°= £ñ~#yÇìÕàWã`8‡Ùˆš’^§.Á}Þû£÷/®Ì„endstream endobj -630 0 obj<>/XObject<<>>>>>>endobj -631 0 obj<>stream +639 0 obj<>/XObject<<>>>>>>endobj +640 0 obj<>stream xÝUMo›@½ûWÌѩ–/cÜ*ç«”:jŒ{Š„,ÉVx×YÀMZõ¿w†…[D=U•jd ¼ÃÌ›·oÞ>Ž°ñr`ê‚@ºÙ̆À X~8Å{¿šCÞ,x®Ç¡wâ2whÁ ýá…Àcþá 'ÑèíÅ ¢Qᢠ‘mC”ŽgÌÇËapÃk^VGÑ7Œ^â-7ÀœQ6^Î?Ç—‹‹kà·ØŸåxˆ#Êd‹ ÊJ×iUkn"»Ò…º¡IfªºTµÜ(Y¶±e¿^_ž½y½f-3•Ök.+žÁ]ç\ÃF |Ôû4å;¤§7çgËד–\o1Oªy†‰ER” Úÿ*±æØa²Þ@²ÙðD—P)¸ã î¥Âxf²Ú0#ºMÏH0Ñ#r¸o“BdqÙn(ÔFúlÜ~\ÿyð ígu¹ˆœÀ>/XObject<<>>>>>>endobj -633 0 obj<>stream +641 0 obj<>/XObject<<>>>>>>endobj +642 0 obj<>stream xÕUQoÚ0~çWÜc+A›„iš+« ¬ÅöÒ-|` JhM„T‹°èÿz<=?~G…=T¡ñ„Ý€õ:Ò|µÂœ]˜_`{m7žG¡äóË:ÜšÓÿPX'ô Tyf†ã‰¼Ï’'’YίœG‡W\ 93¸Nr{–|ÿiŒr2Ÿ•‡¿—?q¨åv»à¶©åëé?íû=¸â;ž Ô•„ëm›Ñ×"žoö¶<»[Þ)'î^Çs,ÏõñæE׎®Ó€5n?„X8bendstream endobj -634 0 obj<>/XObject<<>>>>>>endobj -635 0 obj<>stream +643 0 obj<>/XObject<<>>>>>>endobj +644 0 obj<>stream xÅUïo›0ýž¿â¾µ“ Cø±/Q«nS¤6Òö©&œ„•Ø)6Ͷ¿~g 4Þ˜TiKé*_Þ½{çw~¹ààŸ !/€t3rlƱgûàG!Æ¿%ƒe}@¼1þûÛÁU2zû!ׇd‰XA„Aˆã8¤ç±=¶‰ ‹Ë[¸+Áß$ß0?×mò-bþùL(ö64]眧9ÇÊr+¸ÄX¶d)ËX?@íœÝߟAº¦%M+¥­°H€Ü;ÀYòŒg¹àps;K”xduHœ:4jPìS­H]œJŒV^åÏŒë<}T²§ŠIu¼V%YÙ1o² ö²ÚЇÉ5¨:^+Ú)5-5Rº6ÌJÙöþy:KÜ 9ö[¥q¼–ëÙDkã|w—€uj*ÖaòX« ¤¢âʤdâ̦‹d~šÔáì_ÓM¡£—Gwç64/d!z{B¡=rº'ZbÇpêx¡ÒAÀ2Œ8,¦× 󟬧?íŠ;™g_uÞ—Óô^/@,µù:L±ÆP/N5g‰T£»ä ~`K³,ç+Pü Xh‘¯8ìrµ©h©té½Öµ³zŠö‰Ýy½G™¡ËÜ-‰Wa´Û¥ÁÀÕX¹Vƽ8o7œYï` 1®½ì¡—÷HZîÛÖœá?ö#R܉òG®pƒ*+©þÆ4Û;¬_ SC³Ùoý»µà #;ˆcÂv}ãô®.áš=³Blñù‚UžÕÝYû\+tb½É½®~èÛaá[Œ ãúxŸŒ>~«{Vendstream endobj -636 0 obj<>/XObject<<>>>>>>endobj -637 0 obj<>stream +645 0 obj<>/XObject<<>>>>>>endobj +646 0 obj<>stream xÕUMsÚ0½ó+öH:ŵc›\:ù.3 iÁÉ¥t2Š½µXr%9 ýõ]ÙÐØBÒca` +=í¾÷võ£çKo"†!¤EÏu\£Ðñ!ˆ#zöé£ò:pÄ»A8t‚];|ÏuÂ]¡ÿ눓¤÷î"σ$·é„qI”’ëB’ö?^ù®‘ßQ$ßhå<Šç0 ¥ƒa@ $Yä„̦·³ÛSHš¥&¬À >ñ›Û3\øåGûÎ0ç5äRYr %­~ ,ï°‰)ÄÖï‰Ï]™µ °l÷'Òà躀>à ˜È@ÿä&]Â[U\Ô\(Ô¥-PÒ¯ª`÷«uÓÄ80MÏ’üÙ@ôiãØLÛ„Õ'¦<׊•¾c ÌûSÃ¥€Ãùl ÷2‡/¸!)™Ö\&R„%*¬kCÔÖ±Øq»rª}ŠõÙ]Â[IÜ^ÏÞ>/XObject<<>>>>>>endobj -639 0 obj<>stream +647 0 obj<>/XObject<<>>>>>>endobj +648 0 obj<>stream x•VQ›8~ϯ˜‡>¸@X •úÀ&Ù*ÚmÚ&´÷PV+×8nÁ¦²ÊýúÉ]Ú,«S‰àñ7Ÿ¿ùfœŸ#lü8¸0ñ#›Øà{>qÁ |vñ[qض WW /-x¶Gü‹ áïï¯ãÑÛ›)8Ä[Lî‡ø&¶mˆ™1%˜ÀŠ×°áÕžWð—b+Çñ_¸ÓÇévZn€;•¬ù;Èùžç)¨w-8ìiÞp  2Ѿ¬øφ«št0HàM¡ÏìXw‘¿çó»À¯«å&^»Ýº×¡~–3AáIuÄÒ8±þõu¹Š'C(ÏYÍvÝÉÎI·0îm”lÍU)…ú%¥ –{äý¿Å>ãýíÓrþǡ/e&j,[-a³X[¬–«›OŽí hq1r@Ú ý‰!E~š¦<…l ½ìíZYWÚ B ëo^Éd¬“wºõjT¼n*´Ð!iÆhͨ†1®ÔInt˜6©5ñŽ ̪CYËÇŠ–»ŒÊRr «沠趨AŠZCfRœ°zÃ[›¢õ[@Ðms¾ÍD¦#û´GÑuåZ‡Giš‘cFnwŒ·7—”Y¢ê9ü8ÔȦJy…š 2-°¦ÇdUµI3ñ^øŒ‘mƒÐª¢‘T¤õ®<29+ÿ"1nÍù“ùb‹Ù5pÁ´Rx2M ìR¦´¦0‡FiA÷î‰àvÀy!Ÿ·‰1”óŽ @@ -1410,8 +1446,8 @@ E 0Ö ìé¿×îK¾x$ðCœÁˆzj„E<ú2úra¡endstream endobj -640 0 obj<>/XObject<<>>>>>>endobj -641 0 obj<>stream +649 0 obj<>/XObject<<>>>>>>endobj +650 0 obj<>stream x•VÛrÛ6|÷Wœ§FN(V²e]<ÓÌ(LÒz_*Ñ“‡(0™ŒIBÀ¨úûîE™fÜN;u98—Ý= > i€×&'t:&Y ž…SM'x‚?£hí˜ÍÂQ÷ûwñѯg4Q¼FªñoBšÁ€bÙ›…“ð$¤£–:?Ž¿#|DÃaÞ?™ ¼õß.i¡£TäA$iÙQd9z@ý“1ÊrýBK’ºØTN‘UÖfº¤µ£O–~£«ÞÍ—¯³0ž} êƒ0 æI²êE2ˆìê˜_Ý´ç´8…¸O ¬ŽÉ·4¯\ªJ—IáT€ %B¹ÔS(R$¬UÆ­zœ¦ý#ò “Ç¢ó}ááixÂóŽ!eû˜o³ÓäuIßuVfå=¡%Jt!²Ò¿•y†i›å9é$"Ïw$œSÅÆ‘Ó$SQÞ+Êœ¥ jnµIH”I;‘Ô¥3:Ï•¡Bì:}µ®¬âLÕ&ÈD‰Ú¨2áv@Q÷™ufNœÃw6¤8ÍlÝ“È­&-eeh«Ô·¶vÊl…IlØ™2:‡f€oœjÕchòUï…|ØY*óC™›ýHKå@Ñ« –A§a䈉ý 9L‚!‘z»^õ P€šö ¸ ß•ƒ¯ùfÈLž·¨F_-Òö¡åNñ˜õÒÌS èùDÕÙYô ‹ X+O•l§Rs nÈë§:HÞB‘çt \úÄú >ÛTYæ2×÷¬ Ý–Áª—•2K '‘¨d+™¢‚h¬,/¯Z€Yu‘AuÉKö?h½Rî³¾×åRþÃêmÚŸyŽƒÒyjoÀÄpì—ó'öµ@õŸ˜í Ûlo#‹ÍqË¥Ëh—óËš¢gèðT;ÝÁyš7ÍaìžÉʵ^õ@à·ÒdÜ^¼–ïm œßˆ¶b ÍN·OŽåK´òÿ‹à9GÛÜû§ÃÚ‰ÙÕOCŠtQ@+Þ§_puxÖ:3Öý“sµ\ê*OèN5öŽ÷0Šr§KE9ÌEy몀 °TŽ%ÉÒÄÇΰ…i†ƒ 5”"LÀ~`‘¥Þ–ôCä• @@ -1419,26 +1455,26 @@ x èºY2LÜ|Óõ¢óæÔðÎ/ýÞÔðäÉO¬ýÓQcjÓ°«jUqo_ Çüäæ%×DùöÞ’hY±!r•[µ…¾Ô¾ÞtÿÈ;œLÃñlFãñÏØœj~ùnNïZ®7Ž~¯pså~ÛŸ fú³ôh2 'ã)ÆÀïg3>ö!>úóèo×Ü«:endstream endobj -642 0 obj<>/XObject<<>>>>>>endobj -643 0 obj<>stream +651 0 obj<>/XObject<<>>>>>>endobj +652 0 obj<>stream x•moÚ0Çßó)î%•f7NBöÆZUjÓ­dê&!M^0#«±['òíwNš–nÈ%àóïþ÷àËÓ€‡ƒØ‡ ‚|3ð¨‘Ò„IŒÏ>~€U³øŒÆÿ.L³ÁùEŒA¶BV”Ä-9žY>œÀüjE \AšÁ\äµ)ª=àŸ‹a)Ìno~Z“²2u^ÕF,Î(dk±ŽŽõ ª5ú×fóñ,û3`4 | ~L¼gË¡Û¢,´"iJæõ¯I]­Y÷àw¥Ôî&Q/½Ûê=§Ÿn“óŸ ÊUÉý‡F®§fcgMD€úˆ¨1…À”`€Jïðî„äU±˜™Ss‡7Ì„U}~1¶é%ú¶âÇ4¡ˆ½R’–NËWó—j`¢ÞŒÑü›B¦ävÇ6F¯e$~ÔúIk)m [rWglÂÚT`Nñˆ×trhq¯\ºˆp®uÎ¥à;ŸŒà•6p»SÂ`†Ý¬à$Ö¥Ñõã ,æì½®¹0Xþ ÈVÞÉÈÀ\ S<`µ*žê¦=gîü…í2vmÓ†M/øÉaßúÔƒ“{0ƒîØìÝžGŽ(f—õcÏ~âªV*ª6}Wu¦¼Ê×}W-®T% Ïí¤èü”áè‘´}Q佈¨õq1QZí7º.¯õo­CþÀAÙi!ío(Eiçr_¯ŒHìðñÅèç¾’“Ähûÿ@áRox¡ ת2ZJeÙóÉÍt3±R?â̆˺X6#,Nc{ã·ñ~ì]Æ!£ßËHŒšû9|üP_endstream endobj -644 0 obj<>/XObject<<>>>>>>endobj -645 0 obj<>stream +653 0 obj<>/XObject<<>>>>>>endobj +654 0 obj<>stream x½UÛnÚ@}ç+æÑ‘X×ëËÚô¥22 K\Zl”$Ë…%qklâµÓôï;kLJb ­‚BÂÌΙ3s³ ¾)Ø: VÛŽ¦jÀ ¦20¿ëø)8lê€Å,|<0lGÕO(ÕÛ~Øù4d@)„¬ÎÂ5`eMƒp¥,•iYž‘*K*¾'–77áL2›$äJ¨ÈáZ %Ñž¨ETUÝŸ;€“ãƒK¥_%iI’ Öù6N²K¨¢AÕµ=b¨)éÖˆUña­ôTl[…[ž¦äg–ÿÊ`î{ÁKª]ö§¸2‰€DõÄUyŸIùã´â]ˆì⢄|<)ïyßëB^RÆ_` .ã£"¯vNtŸsdÜ›M¢‘ïIXö0 QÕª¬ ¬Ñà,‚Á<ò§ÃYD¡.îÆù]ž¡øb—g‚7“Å94²Ý9ž}=¨/Ä~ÖQÛgÕ=dñ–~9/EváúÓ¨&‰=F®7ñ§gq¾à«¡=¡—åNÔFÔv šg‹ü;ÙÑb„gq®HÖÚ9«GË—p']óAFóÙâkô¬Hãóã½Z—ú ß”ä/]é¤aKÏ ÿlk}]ý ­¿tœ&¸‚Þá!wì»ÁU<ä4+…âÕÃz=`ÌnîwÒwÁã<Íw¸`T%k.[%‡³ÄÖz—÷·i›ªÍ¼ps³Z×AØùÖù[ÞË_endstream endobj -646 0 obj<>/XObject<<>>>>>>endobj -647 0 obj<>stream +655 0 obj<>/XObject<<>>>>>>endobj +656 0 obj<>stream x½•_KÃ0Åßû)îã|hL³4I}‘¬«£¸­µI>Ù2P÷ÏÉÔïu›ø0ú „6B8çÞròD@qE ôÌ×%8#¸’¸eøï,ƒ ®ïbˆ"°Kt%Á.Õ”‚÷ª|xse_PÃÏšPÆèéìÏ2A8:{£ýö°Û<­Ý…mXLt>mô8צÁºMm²Ê´ºÅï¢ýB®öæ-´Qk“ÐŽêÌØNp™ܲ˜eUw#îû`ÖiZÔSÛe'sæ>˜Í£±Ù¤+äØrYåÝ Yø èô¾.»²ô\eå8Oµ-ªÖjNš¨sFGR‘$ âSÙèÉ@ÃÐ}¸Õvçöï0:>/XObject<<>>>>>>endobj -649 0 obj<>stream +657 0 obj<>/XObject<<>>>>>>endobj +658 0 obj<>stream x­WMsÛ6½ûWìä%Ó’¬Zv{Šó1õ!‰Ó(mžÑ€ ("! -kúçû%[ö´$ñdF$Èýxûöíòú`BcüMh>¥ã’ÍÁ8Ó/gÓlJ³Ó9~Oñß**ÃÁññ#狃£·g4Ó¢„­“ù)- ‚1îÈÑ«Jt^YšŒ3ú$š\Ð¥Õ­×íŠ.Z´¢vÏ_ƒÉ<Ú8<ž!€E1ÂK“Œ^æÎ[!}|lF“Izl:ÏNø±E¥¨ëmgœ"S’¯´£ÂȾQ­'üö†:knt¡È™F‘n^U8jq‚zêðD «ì[éµA`ÚoH´!D#ìL‡“ã\¡œ´:Wð»ªÈJ:@*ë…n©TÂ÷V…{é¶0kG²ÖÕà-{,÷YÊ}šíU @@ -1451,8 +1487,8 @@ d) °~Ä.„¡Á0Ì]Ø|…~ …- :©5À°PcÐR8l÷½{ùeyùÇÅûÅòõù§å‡Ë7ïYJ—*ÁNÏ"ØY𬊘¸«A² @$¸º­0éÂn&À&q#tZ>ìÚ¸ýtÞXö"¶Û79l\!Ö â©têV*U`Ï@²ÄZƒ8þEL¸„ïзwøô9ºX%£c.óz¶2ÂØ„~l°yñöÅBª‰]!  p0É8+øZl#·®´¬ðþ°Að Iôƒgè“%JY‚-.REµE   Jã¹ïUm;«íí‡Ñè+l«Ø'rqB¹áqB:]ò, ±0¶[ÿQP¨Q¾2ˆuPDU‰´1Å Øv§å7dÖw”oÐ]Jö løžð%±ÓÙ°‰Ïâ&vô¡Èº/`%,!Û¨èùÑý8ão„QÜãcïïSú×éb‰Y¿ìGd Ü’°ØW¡7[xx¬"Â|„£`†sŠãÂPwWÏ®ü¯FÊ÷Æ9plYîcÆECGoOw«1ö‰ðÑò?ŒfóY6?9«êÉ1côfqðñà,n@Âendstream endobj -650 0 obj<>/XObject<<>>>>>>endobj -651 0 obj<>stream +659 0 obj<>/XObject<<>>>>>>endobj +660 0 obj<>stream xWÛnÛF}÷W òÙ°dIQ$')ZøZ¨õ%•&„¹²Ø» —´âù÷ž™Ý•d9¶¡½$Ïœ9så×­µñÓ¡A—^õ))¶G[{§mzC£)nô÷ñKJíV»Ý¦QÒ ð¯Ê =®ÈUª¬ø÷w´·C‹™6TÍ4ýc'þ–NÉÍ­Í3sC;{Û£¶ÚÔì´[û]beF€ªÚ @@ -1465,36 +1501,31 @@ I µÅ£3œ‡ ÏØRÍBh²«ò”6j)¸¹²ÆÎ,ëqðfM&_ÇkE®n°±ÜØ÷ÍîëUº°ðSöDÍ™Ûo;ÒqãÒ¿ô,·4ø8=ÃÀ’†Æ²0ˆÂæ¤ò¨Çr'Šá :ÜëÒÔPéqŒsß Y8ÇúÄ¢ËUZ:!Æ¥õ{¦ŒxcM3ÕSUçÕ£cÍûé96J$»³ è”Y5·|¸-bzT&ï„“Â4M)¼ü Ûvf’¼æN‘·°aV †À_εyï·â“oöY «ã¯€Þ͵Œ5ÄfÃt`˜b€úœ¦K¢ô4µ’é¸JÚ ­Öñ°'#Ï΄ûCË\ÚÜOqÇ×%VM,ôü…ÀKýƒðj|‡'$r’/{§ûa¢wû­þ›7Ô ü®}up~xÀrëÜb+rô{¥â}3>Û´ù«ºq4SsþÁ1]©b¢HÀBùëĨܱl½A¯5èïûÙïñÑÉh믭ÿ‚¸¯endstream endobj -652 0 obj<>/XObject<<>>>>>>endobj -653 0 obj<>stream -x¥WïoGýî¿b>Õ$5gÀpÔTJˆ‰Ü*àâ“¢ªTÑr·˜M–[²{gìþõ}³»‡11‘"ç—"Î7óæÍ›7÷£6µð»Mýõ([µ’õzgø·;èãßþZI‹ð ÕþþÁ»ôètÔ¥v›Òbõ}JsBœV‹Ò¬1)ô=¦hær!*]Ò{y«2IM.I ´+•9mT¹¤µUEI_ÌÜ‘*¨\ÊøÉ·JV’Ò÷ïšàS»QNžøç!Ú‹ôËQ‹ší³¤ƒä [92óR¨ÁÖ¬ÂI‹'_dVÒf)CšL+‰ÌʹJ:ôA–˜ù¬¡å­Ôôæ uf/Àp¸2ál§£sj£R.¹yÖMºœ·ÝJº —¢¸‘—ï醰C‘-UqCfAW\!\ cW¢T¦álvúIÃý“šƒ{¥5j!ZàÕ”þUBŸT‘›£qzÚùs›/€¢±)Õâþ`ÆOÌÇÆدŒÖwä!Ú¯Hr'¤˜)ZçÔ\ ± ,ôÎI{‹òJC•“4½ò,rî¾È–Ö¦r `§_™g *8•yRÄ¥ã·cZŸ&“–[’!@à­hH”¥Uóª”.¡t ˆ™(˜A@YTzÛíýì¡I…”¹Ï÷µ0ˆE”(ª–#-…C #ò½*ge(ÿFðñø§r‹G6°´—ÚCdzmøÀDžp£d…àOn -IàDY‰‰2¶\šSí)‚ÀPæ:‡@T8`4Ëø÷RnÕ¹Ó5 á¥ÆtzAÐ)¢"šÊÐ’勆;æÓs Vk-W<8OuÃ͹á+ÛxS¹B]#(t¤¬+ã0HAšw4kÐt4ºŽiö‚œŽ²è.Í~2`ÇÂlÌ:½>…§õäø‡[xH5–w?Ê4~n&.g¨“O”ƒZFÃç&˜Êµ¾Ÿ¬e<‡DÚÅúŒPs6• +Ýò‰Â}¡–Ÿmb³3HÚ犙@ô˜9ÅF ­³¡`Ä­PZ°÷`ÄɦsB}~ZÀ;léüÞjíbnmŒÆ3~Kè5—ÿHŸ¡(Kš5~Nƒûðy€Ìº¨Vaüµæ!‚)oÄ(ñÄfô[ -¾¦ŠLW¹<µëì³ë\²d”;CY3Ny®K1Wÿ ‹¨+ ‡€ ,¼ý²¡¯ývýÞewL–}“—®É¤Ãþ\ÄÔõbµòF9ì ŽÌñ©Á‡›çh ÷É¡n­±ŽBàãá1ÌÖ7.8ø ãëí“ÐÍ„Þj½—^ZËoš"èÁÁ7oaPìËR«•*`y\Ï-:Û¹·óð5ù_à]ò¼°ú½Åhâ'uúV2`Ï ¯S”Ý*á¡»‘„ÍigD/îX9Ø?ZמŠãÀG¹Ž0¦ Fõ~Í -ºZå; ‚!×­o‡‹ .áÚ/ÔÚ&ã]"ø¸±°fyOÄè@)‘Aâ ³†òè÷ -nb¿ÂŽkù@4p¹2…ÂAwÂdÎsDt5½§ÓÏãIz9úûóä*½œŒ¯qøÙ*+«°%øØ£}æ]ÏZã¢|f Äî&–mL—×í&œ>ÐÕÃÏËÖðUê…ƒ[“ÝÃï3>Y<èC=Kã·—¸:Œ§j…{Ñ_JÆæ/Ç Ë‚G>Òá8Äc¬aàä¢âgrY9L*¤h¡œ8°õýƒ0¸e†—#Pç ÏÏ×FjÍ,CI|fmO«=2ío/ÐZ: îW_«Ž«EÀõY¼®Vo=BõPñõôp|1¹Êô§ahí#cZ;qƒCnï½zzK`L®qÁ9rUæ]+ÖoˆÝ£Mto’8N” Õ‰–団Ä!ŽøZ؃TÛ— YfËÐô -^Œ ãÍß,àÆÜØ([™µsÈòOœŽñj÷Iïüß²b×o?¾{Ëß©¤†ü¬£•ÊýÝÕ¬¶ÙoÁ -Ÿóí¤Ûï&ýÞ \^½W é"=úëè{¦_êendstream -endobj -654 0 obj<>/XObject<<>>>>>>endobj -655 0 obj<>stream -x¥X]oÛ6}ϯàÓæb»©íô-qæ5@—d‰¡˜ƒ–h›­Dª$•Ôûõ;—¤,Ù‰4i_K¾çÞ{νù~Ôc]üï±aŸ½°´8ºœNºìœM—x0ᇌu“n·Ë¦içá#óÿ¦kÁ¬0Â0#Ê\ -Ëž¤[3®7†oØÃÝííçùÍíôzòe~}3¹_]L/Ž§_ºì¤×MF0Û ¶³ÎT©« ¬Ì:©VŽK%2&a칡æíÙq ö{É€ Žcx×Kæaºæj%˜ÒN.eÊÔŠá£,LZ&Bô¹àÎúÊSd¨{”MÆwã¤ý½Ö½óŽ"V¨Ìâ{@²çÚŠ;#•fÖ™0í°O¿1§CÜÁÝRëÆ>é'+¯2MùI{À¤â„%[]´Í!e½t *@›Õ€¸5wþµÒˆG©«ƒVÛ("àñÄ-Ë -nìšç9`Lµ1"uù&»ä@¤Ú­RŠTPJwÜÛ|2Z­êÚÖÍòB륱õÁ{˜Ïÿ§æb˜uîn?_¿Ì?Ý\ÍŽNÆ2 «”Ÿlز2èó’õf=Bˆm·¢HØã]†¾`øý«^øTO'g¬× cwÒ÷íLS–VXçÒ:i§™£[•¥6.tñ/œ¥(ò= +d€Þ?x!•T«]´_äÈUª:‹÷IŸɚǹ-µÎ­+—¤ôü€¸’3zãŸûh6soæïè­ÓIÓ8&#¢¼>ë†,<­“ôOzÑ@xƒ­“þ(é7Ñýµ]ºT§Àº}žê*‚ZI§ÈÞ1[,2_iÝBXËÁ¨›tVäKƺ -è$aT–XŽ=Øš¢Ã…3\ÙB:ª Ç<‚/ª-ѯ¥Ñ)zïumZÐDRíQK ²Ê5Ϩ¦W—{~+3µ.ºÕåÐ,Ô¦0ùèdDz -m·ò®Eщs­K®Kt7’ö…ÅK§¡²Iꂬ.+•ƒnù¡nÌHÓ+D›þ¼°+â<ÿeo²®.MÔ<Æeý+-ÍEøf"•–øù>­04,4”Ldv$†˜µO?B<臈Ès(²´ §LÔtdPLˆ lÊt½‡"‡Å6±ÈO{ÚàŽ@íOÈGОD¹b¢€ tÒ/EÊ+‹Z9Vjk%ÆR!‘ŒŠ…ü‹*w²Ä !k‹©6͇qmP¢vÀ¤pÊ!ÿʺ½T 2ȶ£^j܉•6¤âACrÅ A ïQüFL±ï -x–M,±,;c@¥Ùóî…Ý";ät7f<…ld”-‚!ØcNµXëEÜ‚{y½-…ºkÔµV‹š ¦°êY÷Ê2ȧ8h•ŠBñ~ïÍVÚ)´˜{ qÄ~5ñÐfÃB6b… -LXŒè•Ð’˜<ϬÔÐ*ôa»¥=[ákÙ블R…˜çú‰=ò¼ŠýîÅÕ -„»äÆ -E–sˆËýä¦ýÞúð¶xž­ƒ5–@Á/ŽE ;©¨,~YûŸûpõË­Õγ‚õZ:uDö#=Ø//è×Óqì2ç+ ¡"vÐt&–~e¥ÇvíE†¨ -c*ñÖrBÆ]ôHœ°TU,¨…– óåGSEžåé7ï°–¿Ð)l‡ï†t»ä7ËLg_œžgð’a·)‰ó D\û|”coîÃÎØìOñÚ£~&½ÝýƒbðR¡ÀzVÓƒâõN¨:ž…6s¿êVŠ®&•PUVú…˜¾Àª»¨œ?M^OB¥óɶ•ÿnýlo° .q£§Ì©§+UïøøäõÌ:K¹–™—%š®÷ØÔ4”È4…£xñüûdÅ'“$ŒX–j (›qSiìÑë¸4_¶îI×”x3bä¢n9œNâ4Ì'wk‰½¯x™Øó%-²+z[EÁ©7ñ0¥ÚR•°¸Ð‡;Û \ -°°ï¯+£C1ÊŒ? -Œàߘ r}TP›(+€@ˆ…Îp3#Gh#®3 ù>/XObject<<>>>>>>endobj -657 0 obj<>stream -x5ËnÂ0E÷ùŠ»ª@"Æi– bÑ—šî² ‰C\‡Ú‰~}'hžæ³5Ôþ¡ôº7ƒ*–1“IJµ“&‘ÃÕ:>ƒv8endstream -endobj -658 0 obj<>/XObject<<>>>>>>endobj -659 0 obj<>stream +661 0 obj<>/XObject<<>>>>>>endobj +662 0 obj<>stream +x¥WïoGýî¿b¾™¤æ ˜ŽšJ 1‘[\|RT•*Zî³é²Knï î_ß7»{)r~)â|3oÞ¼y3|=iS ¿ÛÔïÐE²ÕI+iQ¯w»ƒ>þíào!i´Úß?x—žœºÔnSº@¬Þ OiNˆÓjQš5&Fß“±¦™Ë…¨tIïåFe’>Ú\’@hWÚBæ´Uå’Ö…2%}±sGÊP¹”ñ“¯•¬$¥ïß%4Á§ÅV9y柇h/Ò/'-j¶/’’7|låÈÎK¡ ‚/ +»z' <ù"³’¶KÒdZIdVÎUÒ‘ ²üÝÎg -7RÓ›7Ô™½ÀáÊ„³.©J¹äæE7érÞv+é&4\ +s'¯ß“09 Cà¡È–ÊÜ‘]Ð ××fa‹•(•5!à‡ÍN?éqÀ¿SKs°¯´F D ¼úϼJè“2¹Ý:§ç?vù,ÛR-îfüÄŒlmñ/£õ=yˆö šÜ)æŠÖÖ95×h ºçd±Ay¥¥ÊIšÞ ù¿N‚ áîM¶,¬±•c{ËÊ¢¿4ûÉ€= ³1ëôúžÖ“ãî\à!ÕX~ûQ¦ñs3q9Cm|¢Ô2>7ÁT®õýd-MLðRië3BYÌÙT. +é–Oül›AÒ¾|PÌ¢ÇÌ)6Jh ³ 6BiÁÞƒI'›Îaôù©wA¤ó{?¨µ‹¹µµÏø¬¡×\þ#}†¢@R,iÖø9 Âç²kS­ÂøkÍCSÞˆQâˆÝè÷|M™LW¹ò\?– c®þ¢®$6°ðöˆ¾öûõ{—Ý3YöM^»6“tS׫µwÊaq´`ŽO >ÜÊm„1•h0ª÷kVÐFh•ï +†\·¾.‚º„[¿Pk›Œ—IˆàãÊšå= #¥D<‰ ,ÌÈ£ß/´¸‹ý +;:¬å#ÑÀåÊ…“îŒÉœ5æˆ$èfz=N¯¦ŸÇ“ôzô×çÉMz=ßâô+ª¬¬Â–àkà€fô™w=k‹ò™1 O¸›X¶1]B^·ÛpúAW?/[Ëw©®Mv¿Ïødñ õ,Ž__âê°žª.F)Ù"ù]>ùhH‡7ె“ ˆŠŸ5Êeåü9©xŽ …râÀÖ÷Âà–^@7×gñºZ½õÕCÅ×ÓÃñÅä)ÓŸ†¡µŒiîĹƒ÷êéa,0¹ÆçÈU™w­XK¼!öÏv6уIâ8Q6T $Z–oZŒ‡t:âkáRm {\.d™-CÓ+x1$Œ7·€sc£le~$ÔÞ!Ë?q>Ä ¨Ý$½ËK|ÏŠuܾýøî-«’ò+}¨Tîï®fý³Í~ Vø¼ï'Ý~7é÷áöê½bPWéÉŸ'ÿ´¹bendstream +endobj +663 0 obj<>/XObject<<>>>>>>endobj +664 0 obj<>stream +x¥X]O9}çWømƒT†$¥Iè„Í© ,DZU›UäÌ8‰Û{j{ é¯ßsmOfÈJ…ö2“ûqî½çÜË÷£ëâ ûìý€¥ÅÑåôètÒeçlºÄƒÁ?d¬›t»]6M;™ÿ7] f…y†QæRXö$ÝšqŸ1|Ãîno?Ïon§×“/óë›Éíüêbzq<ýzÔe'½n2‚ÙN°Å˜u¦J]e`eÖIµr\*‘1 cÏ 5oÏŽ“h°ßKdpû^2‡Ó5W+Á”vr)Sî¤V e¹`Ò2¢Ï·p¶ØÐW˜"CåØ£äˆh2¾ß íï•°îw¡°BeoÜ’Í8×VÜ©œ0³Îìø€éh‡-xú9âî–ÒX—0öI?ùXyí”iÊOÚ&',ÙÒè¢m)ë¥Uڬĭ¹ó¯•F‚ö$Ê¡“äx)R^YÔʱR[+1†” +Œù(ЈÔ`T,ä_T¹“%^Y[Lµi>Œ£hƒµ&…SùWÖí¥JA¶õ +PãN¬´!2Ú+^jxâ7bŠÝxWÀ³lb‰eÙ*Ížw/ìÙ!§û»1ã)d#£l ÁsªÅZ/âFØËëm)Ô]£®µZÔ5…•PϺWvA>¥0À±@«TŠ÷{h¶ÒN¡ÅÜKˆ³ ö𫉟€6¾²+P€`ÂbD¯„–Ääyf¥†V¡Û-íÙ +_#È^Ç¥”z(Ä<×Oì‘çUìw/®~T Ü%7^P(²œC\î'7íì÷Ö‡·Åól¬± +~q¤(ÙIEeñËÚ¯øÜ×€‹¨7Xn½¨vž…¬×zÔ©#²éÁ~yA¿žŽˆc—9_a¥€”±ƒ¦3±ô++=¶k/2DU³P‰·–2î¢Gâ<€¥ªbA-´d˜/?º˜*zð,O¿y‡µü-€Na;|ÿ0¤Û%¿Yf:Ûøâô<ƒ— »MIœO â’Øç{¤{#pvÆfŠ¿Ðõ+éíîC(h„—j …¶Ð³š|¯wBÕñ,´™ûU·R$p5©„ªŠ0°Ò/ÄôîPÝEåüiòzB*ï€L¶­ü¹õ³½Á‚ºÄž2§ž®T½ãã“×#0ëp,äZf^–hBºÞcSÓPj Ó|Ž6àÅóï“9ŸL’0bYª-P tnÆM¥±G¯ãÒ|Ù¸']Sâ͈‘‹ºåp:‰Ð 0{œ8Ü­%ö"¼âebÏk”´È®èm§nÜx<ÆÔRhKUÂâBîl'p(À"@À¾¿V¬dŒÅ(3þ(0‚c2ÈõQA!Hl¢\¬!:ÃÍŒ¡¸Î€vTäó¤m žÂFùâY³{|è‡Û¿uŒ"E÷>t“Ýs6€ˆû¿<\üyyÁ®PÎ\C®-û£ÂHzß½á(œcçâ ¸0p%ž%lŒ8VâúÊ÷ì8\Ñcª ¦Œû»Þ•˜³áY2ŒÂ©2ýߧGý1cendstream +endobj +665 0 obj<>/XObject<<>>>>>>endobj +666 0 obj<>stream +x5K‚0…÷üŠ³ÄDk‹ØâRQ'.æ•avlŠt‚Å)ÕÄùõsñ‘¦7M{î×sÏo Ài ¨3‰òpÆ!åŒjœ(ªm§Q«,˜nc¬´2QÈ*žsde˜5½ùÓ0=´ñvÈÃ"Žè½3ö€VÛƒo`,¾ßvéûzƒºsÇ~LúýSYì¯^÷èê;D—ggüu”ý1c9+Ý—Îœ|çÆ Z–á7rUø—¢=ëž ]Ómù`¢X"ðDä‘T¸ ’‡@Ì9›ó¢Û_Ë×Õk}ÑmwÒ®ÇËÙTz蘕0¹X`¢HMvg1CÚö wk¶BÚm=Ò¢l†hœŠÃSB;K o:;Àb3%rO ©†«M|ÿðwEendstream +endobj +667 0 obj<>/XObject<<>>>>>>endobj +668 0 obj<>stream xVmOë6þί8â˸7´¥kË•øPv/S¥ 6èÝ>À„ÜÄi½%v°¤ýø=ÇNhZÆ„Æ‹š¸¶Ï9Ï˱úÔÃoŸÆ:QZô¼~?JF4œŒñ<À¿•”\ÌN.ÏhУyŽ%£ñ„æaz#éÑ+Qyi©ßOèV” A¿Ï®ni¦1¨Eá>Ìÿ ëûã¸þãé0`‡#,À’0ùR¨Â¬¥s‡Ø«™;#̯$¥µµRû&Hj2¹NReœ“üGž'‰J,T¡ü3yC5¾_ZSWŽLC9iˆ' On%P¢ Ô”¥Ñ½Gû§1?-Jé*‘céJú‹Ùõ-ñ(pY*ç­ðÊh:À3Eͯ q®XQŠ‚*a1ÑqÏÚ‹'R =:k+&C®šÆãáöËÍo_n~™ÞLnÆÏ)Òø‹ùõM3ôðÓìvN´é÷&èn”v9|cu´Íîå󜦟?ßÜ}šO|+0Ox™ßy8'U=ˆ,³ô7åÙ ì{ycç΢íã9y¥—o&Ü‚³]ÂOçd˜÷÷î»7ÜžÝåïÿ䲫ܠÛ)9UV…$ù$Â'd(h- •Q}à=jú}Ü- ³Å[`w7;§þÙ é&ð× ó|ÊUÿK’3¬#×ì®à mˆáWŽ2™+-3R:¸@´*Ä;Û­€ ŽÉ•‹Œ„sj = ^#ê‡-Pïá·‡ Mù­E½1¶‡A36j0i#ÅàU½™íø.ºÑ›¥Dl›Ð× ös^X_WǤ9‹* @@ -1505,14 +1536,20 @@ L Œl˜u•LU®Òný¬1¾¤ÄüâÕ¡ÓÃJaÿýH/3èÂPecÏk ib‚o²“OÛýbxG9Eãy‘z™%tÍ0Å{UsD)²ã†ÙÐrC›Ùz¶à}v à[Ô«ÛÓÉVú…{O›Ò* å{Ñû=*•®½tMÿšl¯‹ýÑ86å÷\J‡ãa2Mp¥Åmi4á0_æ¿ü[ueendstream endobj -660 0 obj<>/XObject<<>>>>>>endobj -661 0 obj<>stream -xW]O*I}÷WÔÛ¨AtõÞd_\Åìͺ˜]0wLH3S@_gºÇº%ãÍfc‚Àt×Ç©S§Š×£! ð7¤ë]\Q^ý6;:¿ÿJ£Í–xruý…f úƒ¾Éoתìh8êÓlÍôTç¶ÒfEÓ›?iºó«“ÙhbxLœ]\öG0rŒ;Ã>M9oœ;Ò†,d†·r;K÷.i8lï®ûWrïÑ0Ùe<¼Ð«û@µ³‹’+O[ÖT+ï‹iO:dx©jÝä9{O¹5ÁÙR.ጢL9¦m$Š /RÌÎÚ@*Dç•£-”×¾GÊðGkåÉX±—sÄÛdF7·^2žJýÂTªöªÂñ‚‚%U”Uj¥óì¿\g”¯9ñý6¬ÑUÿR ùÎ0b_âß°Û‘g§mãËm×lhËäƒr ÚZ÷’¢¸m\“‡ ãvÁ^¯Œœ(£AT5-z´t6–ó±±r¶AòMݧ±Ê×”«²”¤ä™ð@ Q€a>{üc<‰@=ë%9.y£Lx>ÁwH;UBp\ 4À ÕóĈ„]§(ùFˆ3¯•Sƒ‰=².V\ç: {ßÔu©ql±‹ñØÅÎ-XHšIù6elÉ*ÝF˜ à¥ÉÓÃ=Ç®ðÔx”@x^–v+õ±.œó›ü“ÊxA -ÒÔ4Új[*ÞgÂ*iÎ}mG.,hêuÕ”AŽ”Oa‚¤ûöð`ˆ€ÑiÕøp*aúšs½Aú4±®‚Äì é¸mb#C¨:~.Ïz©5$YUz+¦­J»Pe'ÀÌGDë¦òvÉv\[8á[«×FD0"†8cÁ¦ªZ¨-P>d`¨„Àƒsý¼#ˆ¸ÇB7Èôz»Öùº“UëzßÖÝàjZPƒG`Ä{á!¬lÑ”œ&¥cå&L•x8S »á,fžf·Ty”ed–*@ªZ–¯Áiª-ΑoT#]E%L"^‚9ðaZhT#íÒ,)°Ö,ªa£#ê0„ã½ ñV0…ƒ13ùÜ À4ÀM¸‰ÉRÆJ{év…za²è6sÝxÙA@‘µ-£¢rþ£p€Àð…MKÍY7 œ©l\QF#8íxx ¬6"GâFäŠ - ›cwø4Fâr“”`'ŠáÄ},ÍjTù¾Æ®Jh]d²B@QÒìK~2ˆO!¬¢x·× 09èd‘a$§ÓùÝxòm|»RŠ,ëd+ÈvaœÂܶ 9–.âÞókùÕ®V‚Þ&Jú;:nÓtLñ}ÏE(v­ ‚¾ y”În}„8k×,‰¨† €§Ð´Øì=ÚËÄoÀ”6ÀŽëuÐ`:gQÎï¿|ü¸üE­ÿùäòú²}õ¿`pçê«øÏŽþ:ú^<‡endstream -endobj -662 0 obj<>/XObject<<>>>>>>endobj -663 0 obj<>stream +669 0 obj<>/XObject<<>>>>>>endobj +670 0 obj<>stream +xWßO"I~÷¯¨·Aƒèê˜Ûœ‡¹³÷`Bš™zé»{`ùïï«îAÉìær1A`ºëÇW_}U¼Œhˆ¿ÝŒéòšòêä·ùÉÅÃi¾Â“ë›Ï4/h8ñMÞ»Û¨:°£Ñx@ó ÓsÛJ›5Ínÿ¤ÙÞ®Nçߣ‰ÑM2q~y5ÃHwFšqÞ8ö¤ XÈ ïäv–î]ÑhÔÞß ®åÞ“a²«xx©×köjg—%Wžv:l¨VÞKÒžtÈðRÕxÆ&¨ ­‘«™ofºÍsöžrk‚³¥\ÂE™rL{ÛHC:]¦˜µTˆÎ++F3Z*¯}Ÿ”)à6Ê“±b/ç:ˆ·éœnï½d<•ú•©,TíU…ãKª((«ÔZçÙ¹Î(ßpþêmXãëÁ•@òaľ",Ä¿e·'ÏNÛÆ—{ÚmØÐŽÉå´³î5E+p Ú>¸& Æ킽^9'PFƒ¨ jZôiål,ç bcílƒä›z@•o(We)IÉ3á@¢ÃbþôÇdzéé9.y«Lx9ÅwH;UBp\ 4À ÕóĈ„]§(ùVˆ3¯•Sƒ‰}².V\ç: {ßÔu©ql¹ñØåwÎ-YHš5Ú„Ëqÿ¢E¬µŠ(Gg…­”6ýŽÕE:!qõcD·wwOÏpøûíôþqBgâM¢9Mù7alÁ9*ÛFX à¤éóã#½ôbxj< ^—¥ÝI=¬ üCþI%<‡ hj µ-oÈ3a‘4ã!ƒ¶—´ôºjÊ  GŠ§0AÊC;Hx 0ÄÀè¬j|8“0}͹^šZWÁGâvЊtÜ6±q!L¾gýÔ +’¬*½SŠÖ¥]ª²`æ£ì¡USy»ä: +®-œp,®¡£ ºˆZ $ÚVòÜæäC³ZýÊlªù…Ä+Å%Ñ0´½)”C¾“-@ÛA ¬AÚµ•wL-U蕹Žþ¤ïØx(Ù@îp¥°& jwÓmÌ[£Êˆi&u®=¨€Vàƒ2K~0"juåè;Þû—Ón>ßúQŠb¼A%I‚­Õ[#¢Cœ±`3U-UŸ–(2°T‰âAÐÁ9„~ÞÄ +Üc¡d +ú¼Ûè|Óɪu}hënpG5Œ‚,¨Á#0âƒÐˆðU¶hJN“ѱò ¦H<œ©¥Ýr³@O³[©<Ê02K Õ -Ë7à4ÕçÈWª‘®¢&‘ ¯Àø0-4ª‘vi–‰”XkÕ0ŒQuBŠñˆ^È„xk˜ÂÁ˜™|î`à&ÜÄ$)c¥½t»B½0It§,‡\b“œ0„Ö¬¢qv˜÷øú0aÀQaJŽP1Ÿu‹Xi[àu3ä]å  žËU,Î_ +½Z±´vg7…¡“l¥€u„FǃÕ¼½ŸõeK”0„_êBi>kÎg³Gƒá#IÒ’qXrÈSárÚv'tN—PsÇo †¢ìžÎ¥“ '-Yº8ŽéÚ–:ß‹¦¶µOô‹‹cÐ(›Qh©(zÒý·ï’IÙ†KtO&í›s…@”}mmq˜Œ"–¤¶VÂì?m%/½‡ÆIž•u˜4ûÒ{ÆTíQËå€Ñ>6sÝxÙ9@‘-£¢rþ£p€Àð…MKÌy7 œ¨lXQF#8í8xK¬2"GâFäŠ + ›cWøiŒÄe&)ÀNÃ?ˆ5úXšÕ¨ò}m\•ÐºÈde€¢¤Ù—üdŸ,.>X=ñî AarÐÉ"ÃHžÌf‹ûÉôëä>v¥YÖÇV!íÂ8…½·m+r-]Ä=-æ×ò«]¥½m”ôwþtܦé˜&âû¾ž‹Pì[A}ò(ÝùqÖ®UQ O¡i±Ù!{%.´—‰ß€)m€×ëŸÁt΢ \<|þXÿ?}J‹ÑÿüÉqus5¸¹þŒß,X¦®¿ˆ·Éü䯓â/9}endstream +endobj +671 0 obj<>/XObject<<>>>>>>endobj +672 0 obj<>stream xVÑnÛ8|ÏWì›’ÀVlÇ°“¾¥Ms íÝÕ>ô”DÙ¬)RGRqü÷7KÊNêÅ¡-Ú†Ôrwvfvÿ=Ó¿Æ4ŸÐåŒÊæd”h6åš^Íñï þ8Iu<˜Î®ñß7Æ8˜¾u0›þéýòäânJã1-k<>»šÓ²"<<Ѳ<ý¶–†v¶£ÌË‘0d‹ï² ôpZ ­•Y‘Íc×V"ÈGQ–¶3ááŒÂZ’2A:#4U2¥= ä.VB꼬rú(Ê5•kaVˆp¶ü~2¢áøi.«ÓµðTH¼ßˆ l Ú?8«µX­d5 o ÷qK»¾¦Ùe\\ñÈûºEþš5áé·ãˆ3îoç£kÆá×+ãt>Íç³+옸:q„Ë“¿Nþëç-endstream endobj -664 0 obj<>/XObject<<>>>>>>endobj -665 0 obj<>stream +673 0 obj<>/XObject<<>>>>>>endobj +674 0 obj<>stream x}W]oÛ8|ϯØ7'…­ú+vronÓ;hp=Ô@_ ´DÙ¬%RGRv|¿þfIú£jîдIj‘»;;;;úûfDCüÑ|L“åõÍ0ÒýlŽ§üï­¤2|0½¿ÏÞú`2™gÓ·>=>þzâÃòæýï4šÒ²DôÙ~(‘‡CZæ·£q6ÍÆ}]¼Ð³öÒ–"—wË84¥Ñ(Œç8t»Ü*G•ÜËŠzæ ]üVÒ^XeZG[¡‹J’ó¶Í}k¥ë‡7Ò¿wÒ“5­WZ:2ÿoÜõ“„£ÔX³WàK›v]©œóÒ`4ÉÆ_òËh‰gDÓàán¬ÄQZªÅ‘”V^‰Jýƒ¨—œyõÈÔÐ× çdÁ¿ˆªÂ£©Þsr}’2TÈR´•ïw2p²*§Né ¥tP¸\ËYÉ‚Sd´ÄÑ!±Ré"†¤­i¬^ÒZä;‰ÊkS´@®46Ôî…Ûõ’NpoÐÙK{Ö¶ mxõâƒ+ ¯èˆÃUh2[“v £IåÊUËK>T¶:øm‡å‡%h/¾`©A[(OUu§›öÓËùd*£¯Ç°¨œ' ÕÄ÷&–S]|û 7vP@8¨ /@ªË/@Ы/ôî]Rž‡ôÒ7š?d³ÇGšÍãËd䞢Ž°²ÿÑb´9×ÁéÙÁ|ø˜ìÑÛï”Óù4›Ï`º`¢æ#>üiyó×Í¿Ãœî¬endstream endobj -666 0 obj<>/XObject<<>>>>>>endobj -667 0 obj<>stream +675 0 obj<>/XObject<<>>>>>>endobj +676 0 obj<>stream xVÑNëF}ç+æ¡RB”˜$ä&‡JBË-µ1Ò}ˆmì1l±½éî:¿ïÛbÚ !ÐÊ»;söÌ93üu4 >~4Ò阢ì¨ôi4îCM'Xñk™’rcr*»¿_„G'×# (LjÝÉP.ÍãßþÅÖþ endstream endobj -668 0 obj<>/XObject<<>>>>>>endobj -669 0 obj<>stream +677 0 obj<>/XObject<<>>>>>>endobj +678 0 obj<>stream x•W]o7|÷¯Xø% Ë–¿ä<Í‡Û“Ö ’y¡î(ã;òBò¬øßwvÉ;Ig·@aO$wvvv–÷ã`F§ø™ÑüŒÎ¯¨hN§§tyþjzA×s|>ß״:x½88¹yEg§´XaËÕüš%aù)žGo*ÕFíiv>¥?”ý ,)[Òí‚>©6ΗôÎþ±ÆÙ—‹ïrØlž;>¿˜žá¸#ìžMé½Þ•]±]zA³Y^z6Ÿ^ñÒ/&V+M¥~еkm#¹U®ÖÀ¾[ºM` …kZͲÖÔö˜ô€‰VÎÓj–jB&’ d݆žÒ1` <Å{££U›REM]@˜ÂY«l cIÿTE¬[P¦z$HíBC¬d8åAûiŽvvö‘ᢈҤVêPx³Ô*·‘Ãï>¼~6U¯; ö{ ›JqN¡Ã~†Š*ü©ÄN‚Eå\0võš—Ñ£ë€Ì"k$ f¦ô7ž…Êuu e¨’Ù*pÚª«ëÇ éÐêÂ(|­ò‘ÔÒu‘‚.:à„ÓGä~úëã|÷æãíÝ!/g+¬¼]±?\•)ý6J‡´ƒóý%‰ëÅ$YŠ2vÊŽƒk´Lcjå9ÙÏ·ï¿>Çî”Ð\*3Âu]È*ˆÊX7ÊKQ¥B¥KVM§Y¢Jtó" çó¡ÀߌF¬]‚=uÏ•QÃò¢þ‡0ßš9JÕLœ0#Z@)£ïlýó™ŽfˆJlUYŽo¸½,Jš–e„yWNxÁ@ÉâŽG—W´4qüí»;º×Xá(³Žü_4jmŠ¤ÍºŠ!9á.l‹¢ŽÂkS™¢b†Bt>´-ÄÓ¤‹ÚÀàEÚerûKM÷èk˜“ôæÚô†p8nÂ.Ý Ê ðàõGú¡êF•²&4(Š³Á¡å.$déÃÛ Ñ9ħÏÖ®w| @õ,“ÝÊg¿ÊePupÔŠGŠ{ª8™œhL ³Ç‰Sa^O²«4CIdÑ·£m‹Lb_ü‚ÆúÍ»® Ûç¯.Y;[~¾½¤Ð¥Ôë`j$±W*½yІÝl)*¹.¼$¸ÎúÛK1à•ñ!âáXVä.ÛÚ¬˜„Õk š%lDW¸¬Á阺”Ô[OnÞ¸€çlðºeÓrøzɑ囄;ï[k«½ÄåÃTÛj[²ÉÒµèuBÏ]3 @@ -1563,971 +1600,994 @@ x =”GãæÖ̆4®Ú{ Œa‘½E¢ô7mQ|òÑ,é{«Ó¹pޣɆûRš:L×~µ2gÇœåèвÖá2²Ä«Æ&³ǪƒNk<ãkPQ ýÁÝ S71Q–”Fî"ðß’¿O%£C-Gѹ‰´5ÛÓó÷½Ý2¨aäí Û²ÃK0¹ä‰dS]ŠZãVÎ÷ÈiÆcúÞaøîð4‚•Ípzžèe*"¿!üÊ÷ák€¶Ù_µØõž«‚4> úQÔˆÉù‚Œ‰’LÓjÜ=ý=ñhE1 ^è´’fí+'b:¹¹Þy‡¼JïsoþïKëÅüb:¿ºÆû/ÞÏæçŒïÝâàσo™endstream endobj -670 0 obj<>/XObject<<>>>>>>endobj -671 0 obj<>stream -xµWÛnÛF}÷W ‚–‰ºX–l£ 4uaÀIÚZi\ÄyX“+ik’«ì.­èÇ÷Ì.II´ 'uÀæ^æÌ™3—ýz0¤þ i:¢ã ÅÙÁ Ðäô,ÓøtŠßGøo$-ÞÌúg4œÒ|#“ÉItJó„p`0 yÜGÇÑÑüŸƒÍW’lv·ÖnZ¨Tò÷þ؆Ãp¼7šFï\æ¤M" -´¡k‘Ý ršÖÂ8«µp’TN÷‰;ý im´Ó±NI9Ê -ëèŽWRɇR­ï©XûÝà ݕ8¼v%zi!-ƒP@Glz©dN‚ - ó¹ÈdDsÀpE»iÙ%aýeß_ÞœÔp)K"µÇu.i#JoŠE;¥sºí(Ü”ªmVekm­ª@錒ðŒ}ŒS Çå7Gzá?0´C»µ óV‰½ã­ÊÝ-Y ☳lÍýŽÛ±ÎP¹Ê—07jª®?Ç jÜú|Ä4j;b¿¤7Hº†íG¤óìÕû:èl]$»ÒEšp©·Òq¥7ZÃÙº$¬¥A²¨ºŘ¯ÙÉUTàGÇ'èX·`° K¼ÊtB¼ôÄÂÛ£vÒ^©{¹A­|:¹E9ñÉWåÀ“.2wðµôN>ããAmS4˜<ï#/5*yÑ)(ºb†$©ºRs¶VÈä]©B+DOB¤ÐX7F¬×pe% :áeþ* ÷Vîœ2w¦$„0œVíøù·o0º= - tVOãP5¹_r'?/Tr~óÂÏËØ kiàGU?ŸgqŒÌ„˵ür~õ˼÷s*¬ëÅ+‘/eÏ©L¾>¿Ò(® fŸaÜw< ÷ÍR‡°-ÑÂó´Üén£ºKÕîìßÐéVE»Oµûå£-ô7l|_#»N·6á¿w’Ž3³ušÚµ®@jûÁ cj½UË\-T,@2_Æßx¼ƒœ ý‚ëäQó„ØÂØÕ¿˜Ô\Ò_—óÙÕÕßm»<Ždž|3q,WN¿ãÞBjDì¤aU» [üàsx¾·\¡Ï[_z-bøèVÌìY¨êìæª4¥…P)—8Lc*áQNä¥O…&ç&šrígò €Ö²»Ý„™ŽóYÌÎ;PC·1Þ·+‘c ØÎu>/XObject<<>>>>>>endobj -673 0 obj<>stream -xm•[oÛH …ßý+ÎÛ*€­ÈŽk;úô²(°½ìÆ‹-P÷a$Ñ–šÑ0«‘ìêß/9ò%õF~14òðã!õï`ŒD~cÌ'¸™!«÷«Áõû)Æc¬6r2[̱ʑÄI’`•Eï¹ý4Õ“¥!FfÉÔh -“ñ~ÏuŽ\i=ÕH9¢(=|•†S9+-\SwØsksXæGØò‘°¼ZýÔ nûÌ£É4žJî‡GÂ-ÇI²üô_îþùü×Û¯/=Ë—^>·üö÷1&ð}ùÇ›ÕHª ÏòžÓß<6­µp¦¢åµd-øðÇdm/óLht3‹ªó÷05ÁXËûÒm¯œH tF‘qU—롧F˼w'~âUFX'7ÛrGš?Áh|O4«’öxÆ¥+›Rtð¬a;ä Ç -³¬ü¥;O5íJný)#ö9d…q[/W{UŽöYOÍ^G¹&­†\Nùú*Æ1‚äP+(‰H<±ƒí!¾:Ø,:;äWº‘hämm*T­o -ÙT $á2vŽ²æBV¯ø…àùeÜÜPÅFÕ˜¦÷ë¾l -uÂãëó©ê´ƒÉóÀEÜnKw²ì± éÊdÖ{Ö©Ž<^£#ÿ«„g—{Õø¶µœû]ì5¥ˆã¢R6±”»é‡g†"h_táܤ,}õ9S— 9y¡%_jÚP-Õtà fÚ˜Ì4¤ê׋7rÚ˜Ö6§”yJb (¥¡ZKû?gyI!¢øsGuÜW?;-–ªO,¹Ãœª+E¶…/¢ދAC9$`‡L&Mµ‹qç:–~„š,#f.€ -12ã°ŽÂ19n·ÅƒGÇ{Kù–ŽÌ5glýú -[#UŸ£†¢>ÞK›Ba"•z¥¢¸)dœ*–àÉy™C8™'!긮LØϧו?Ñ£‘-vntMMvÝïËþäLE‹9\®ç‹xv{‹ÉtÏt!<Ü}¼¿Ã[Ú‘å'Ý ¿·ent¼;š'²dóHvÈMôŸ×’¦Ð´Óù4žÏò ‹óWúêÝjðçà?}˜ò£endstream -endobj -674 0 obj<>endobj -675 0 obj<>endobj -676 0 obj<>endobj -677 0 obj<>endobj -678 0 obj<>endobj -679 0 obj<>endobj -680 0 obj<>endobj -681 0 obj<>endobj -682 0 obj<>endobj -683 0 obj<>endobj -684 0 obj<>endobj -685 0 obj<>endobj -686 0 obj<>endobj -687 0 obj<>endobj -688 0 obj<>endobj -689 0 obj<>endobj -690 0 obj<>endobj -691 0 obj<>endobj -692 0 obj<>endobj -693 0 obj<>endobj -694 0 obj<>endobj -695 0 obj<>endobj -696 0 obj<>endobj -697 0 obj<>endobj -698 0 obj<>endobj -699 0 obj<>endobj -700 0 obj<>endobj -701 0 obj<>endobj -702 0 obj<>endobj -703 0 obj<>endobj -704 0 obj<>endobj -705 0 obj<>endobj -706 0 obj<>endobj -707 0 obj<>endobj -708 0 obj<>endobj -709 0 obj<>endobj -710 0 obj<>endobj -711 0 obj<>endobj -712 0 obj<>endobj -713 0 obj<>endobj -714 0 obj<>endobj -715 0 obj<>endobj -716 0 obj<>endobj -717 0 obj<>endobj -718 0 obj<>endobj -719 0 obj<>endobj -720 0 obj<>endobj -721 0 obj<>endobj -722 0 obj<>endobj -723 0 obj<>endobj -724 0 obj<>endobj -725 0 obj<>endobj -726 0 obj<>endobj -727 0 obj<>endobj -728 0 obj<>endobj -729 0 obj<>endobj -730 0 obj<>endobj -731 0 obj<>endobj -732 0 obj<>endobj -733 0 obj<>endobj -734 0 obj<>endobj -735 0 obj<>endobj -736 0 obj<>endobj -737 0 obj<>endobj -738 0 obj<>endobj -739 0 obj<>endobj -740 0 obj<>endobj -741 0 obj<>endobj -742 0 obj<>endobj -743 0 obj<>endobj -744 0 obj<>endobj -745 0 obj<>endobj -746 0 obj<>endobj -747 0 obj<>endobj -748 0 obj<>endobj -749 0 obj<>endobj -750 0 obj<>endobj -751 0 obj<>endobj -752 0 obj<>endobj -753 0 obj<>endobj -754 0 obj<>endobj -755 0 obj<>endobj -756 0 obj<>endobj -757 0 obj<>endobj -758 0 obj<>endobj -759 0 obj<>endobj -760 0 obj<>endobj -761 0 obj<>endobj -762 0 obj<>endobj -763 0 obj<>endobj -764 0 obj<>endobj -765 0 obj<>endobj -766 0 obj<>endobj -767 0 obj<>endobj -768 0 obj<>endobj -769 0 obj<>endobj -770 0 obj<>endobj -771 0 obj<>endobj -772 0 obj<>endobj -773 0 obj<>endobj -774 0 obj<>endobj -775 0 obj<>endobj -776 0 obj<>endobj -777 0 obj<>endobj -778 0 obj<>endobj -779 0 obj<>endobj -780 0 obj<>endobj -781 0 obj<>endobj -782 0 obj<>endobj -783 0 obj<>endobj -784 0 obj<>endobj -785 0 obj<>endobj -786 0 obj<>endobj -787 0 obj<>endobj -788 0 obj<>endobj -789 0 obj<>endobj -790 0 obj<>endobj -791 0 obj<>endobj -792 0 obj<>endobj -793 0 obj<>endobj -794 0 obj<>endobj -795 0 obj<>endobj -796 0 obj<>endobj -797 0 obj<>endobj -798 0 obj<>endobj -799 0 obj<>endobj -800 0 obj<>endobj -801 0 obj<>endobj -802 0 obj<>endobj -803 0 obj<>endobj -804 0 obj<>endobj -805 0 obj<>1<>5<>6<>9<>11<>13<>17<>19<>24<>27<>31<>33<>67<>72<>73<>77<>]>>>>endobj +679 0 obj<>/XObject<<>>>>>>endobj +680 0 obj<>stream +xµWÛnÛF}÷W ‚–‰ºX–l£ 4uaÀIÚZi\ÄyX“+ik’«ì.­èÇ÷Ì.II´ 'uÀæ^æÌ™3—ýz0¤þ i:¢ã ÅÙÁ Ðäô,ÓøtŠßGøo$-ÞÌúg4œÒ|#“ÉItJó„p`0 yÜGÇÑÑüŸƒ½ž¯$Ùìn-¬Ý$´P©ä…þ؆Ãp¾7šFœï\æ¤M" -´¡k‘Ý ršÖÂ8«µp’TN÷‰;ý im´Ó±NI9Ê +ëèŽWRɇR­ï©XûÝà ݕ8¼v%zi!-ƒPHGlz©dN‚ + ó¹ÈdDsÀpE»iÙ%aýeß_ÞœÔp)K"µÇu.i#JoŠE;¥sºí(Ü”ªmVekm­ª@錒ðŒ}ŒS Çå7Gzá?0´C»µ óV‰½ã­ÊÝ-Y ☳lÍýŽÛ±ÎP¹Ê—07jªâ?µ±À_ÒäG]Âö#Òyöê}t¶.’]é"M¸Ò[é¸Ð­ál]ÖÒ >Y]‹ZÌ×ì¤* +ð£ãƒt¬ÛN0Ø„%^e:!^zb áíQ;g¯Ô½Ü T>ˆÜ¢šøÜ«ràI™;øZz'Ÿññ‰ ¶)Lž÷‘—•¼èM1C’TM©9[+ dò®T¡¢%!Rè«#Ök¸²’𲉆[+7N™;SBN«vü|‰Û7ÝÐ:«‡‰q(šÜ.¹‘Ÿ*9¿yáçå l†µ4ð£N‡ªŸÏ³8FfBŠåZ~9¿úeÞû9Öõâ•È—²çT&_Ÿ_iÔV³Ï0î;ž„ûf©CØ–èàyZî4·Qݤjwöoèt«š¿Ý§ÚíòÑzŒ›G6>‡/‘]§[›¿ðß;IÇ™Ù:Mm‚ZW µýÜ„© +µÞªe®* ™/ão<ÝANá^AŒuò¨wBlaêê_Lj.é¯Ëùìêêï¶]žÆŒcC¾™8–+§ßñˆo !5"vÒ°ªÝ†…-~î9<ß[®Pç­/½1|t+fö,TuvcUšÒB¨”K†1•ð$'òÒ'‰B“óM¹vÈ3ÌŒù@kÙÝnÂHÇù¬ F稡ÛïÛ•È1lÇ:2«Š&1;¢upg +{?©<Ñ´ßyËâCEnWÈO«ŠÀ½¡‘oŒ„»ˆ/H`ÝÛàa³ sVÙ0`.Gi·¶ ùa7Q2+âXZüÊÔÛÈc¬^\ÍÄ– +ôŸÀDK!ñ9nˆˆ°±R-Û+ùM$2V™HQõ—ÊYÔÌAï¬K³Þ GƒëÔûðìZ|Ä°îUñ­§uŽ +è +C;ÖàÃöc£æ¯Œ—ÜL+7Üë)ß™æo;,3ŒeŽ9˜Ÿ2ACeW³$Ï*ôbàMf“°ÌÃT¿U^‹‘úQ9ë=¼¥ÑŒ²¯Þ ßg×ן>üùöUX«ÇÄèÃäﳯ…vÒVý¸qZåüpzMÎÎðžõõõìÝ›½Å[+Õh8–~C—ðÕ¹WïìMh)IxË>÷ŒOÇÑtrFàé˜ý:?øãà?5Ä»Kendstream +endobj +681 0 obj<>/XObject<<>>>>>>endobj +682 0 obj<>stream +xm•ÝnÛH …ïýç® +`+²ãÈŽH¶í¢@Óv7.vº#‰²´Íd5’U½}É‘R72 š yøñù4EÄŸ)3\ÅH«QF˜_ÇaŒùrÁ¿gü­ ùèn=º|?ÇtŠuÎ/XgàëQ„u¼·5自ž4ÑX¤šT¦ <)ç:[gÈùJë¨Fb“1ŠÒÁU‰?å³RÈ4uζ:ƒ¶öº|$¬.Öÿqê7CæÉlÎ9w€ýÃáVÓ(Z}úŒ/·ÿ|þûí¿/=«—^>·úöõø¾úøÇzÂÕùgug“Wy«5ŒªhuÉY »ÿá +Òzy"4¹ŠÃ¥èü£·-cTZÛ®4[ÏÁ 'â)P¤¶ª”ÉäÐQ#‡e Û™#H7öñ*Ŭ”áÛrG’?ÂdzÎ$«vxÆ¥)›’ôpVÂöÈ,ŒmP¨‹°ÂŸ»£ðTÓ®´­;fDWAZ(³ñ|uPe¨;Ëzlö&È5I5d2Ê6!>°8‡XA˜p$„ã±8èñzo³àä_é¬ÑnkU¡j]ƒ„É&l —Zc(mÎd Š_žÇÍUÖ@‰Õ ~íʦ`PG!Þ™!Ÿ¨Nz¨,ó\Øíº4GËÊà®ÌâÁ³F t€äð=¹_%<»<¨Æ·­¶‰ÒßÙiS²8› *ar¹ù0<›À3dA]Ñûs•Xî«Kɨº´à“Zò¥¦œj®¦Ÿ1“Ƥª!iÔ0¸Ž½‘Q®ZÝkæ ±- ”Æb-iìoÎ:ñâ|DöçŽêp¨>>.–#ªO–sï‡ÿ0UÖ‚Üo WøEÁ½g/4Œ†2pÀ)Oš jâÖô–ûá¨Ò”œŸ9ÊÇH•Á&ðÇdl»-Î<Ûiʶt`.©ljµÛ\`«¸êST_ÔÃý·ÉÆRyoÊ^cÅMÁãTY^ŽŒã9”‰ãyb¢ÆÖ•òÛãùôšò4¼žýÎ .©I/‡}9œœ¨Hš=Éåþút± ã›ÌæS^æ¼nïïnñ–v¤í“ì†?Û2ó79Ü,"^²YÀ;ä*Ä)à´—$‡ä/æá"^òÿ¾¹¸–WïÖ£¿F?æN÷êendstream +endobj +683 0 obj<>/XObject<<>>>>>>endobj +684 0 obj<>stream +x•Uao"7üίxßJN°B€´§“®Q¯ªÔS¯µ_"!¯×˺ñÚ[ÛJ}Çön`s¹S›„àyÞ¼™ñÛ¿FsšáNëݬˆ×£Y6£ÛÕm¶¡åfÏ ¼¬ rôýntýáŽ3Ú•8²ZohWÊgø†ï+Öxai¾Ìè·O÷ôIµ‡Ë• ¦h•pW»?#À|¦7Ëlˆ1NÌ3zŸ›Ö§š%Íç]Íb­BÍ®’Ž +ÃÛZhO…pÜÊ\8ªÌ‘¼¡š= +j _ Òâø:*ó­Å1SÒ–Õ9£›l–Qg4ß$NÌòJzÁC9™#V¢­¤æV°®Uͤöx±\*éOg\¦”9J}HDdƒž8›ËØGý¢¡ ³Ì u¢Òš:Ðéþ÷-å–i^¢€iÈN*EL9ƒ74ÅIi‹)ÐÀçIèÂØؼhY¶š{i4‹ÔA/Iâ+kÚCE œJí²dÊ]·ìŒ[dô£ÐÂ2E¿< û$Å1•¿âá•ÐÄt”„ƒ+ÁRìDkWçÅ$¾“·2©¥ +ˆ‘«˜…bJB{¢ü”LfµHÞ>-½{¡¶áû· „×(|—93¤5M+¦ ä3d&ñ)I"\F8ý§G 1»|}V©u§N}06`_„¢y&&ôóö}„F~£„R„†ÔÇaå˜sŸsÍ¢óˆÜ@Š ’«L«(HŽôˆg˜gAí­ ±·Æøw×hz ™^“u.D³¼uãc~¢BAª lv/5ÔêCDG‰àÅæCš§˜PX¬²˜šŸRÑë0“èFïu7^lý\oÅA:ȿ禮á {?\¥K|fã±@;)q1iú‹Éì!.÷m/Ö]¿s–‰(®öyØWºrŸ‰#žô†+í'tù³O“€šÏ°M±Äèëé´ó¶åžX#÷ÝÇ7¼.ÜÎzròñpõ]b¼:—d 1t+ýy¥ïî• .܉°«ÂWásAÁÐ!êôò,†ù:ðwËÿ‡Ñ¾ŒÌpë!1˜žå®2ßÄEblõ«H·u.Ò¦{ŽdÈM‡Þk5œ +j~¹y'¢¾$£ÂÒO·­Ÿ "÷ߊtO\”åòí Œcý1SÃöÚã·ÒØ°îê°Å߬n°›0z·‚ÒÓ +³»ÝZÞ\„àö6÷?=Š—ëe¶^mð$G2׫ Ã»Ñ¯£Ȇ€endstream +endobj +685 0 obj<>endobj +686 0 obj<>endobj +687 0 obj<>endobj +688 0 obj<>endobj +689 0 obj<>endobj +690 0 obj<>endobj +691 0 obj<>endobj +692 0 obj<>endobj +693 0 obj<>endobj +694 0 obj<>endobj +695 0 obj<>endobj +696 0 obj<>endobj +697 0 obj<>endobj +698 0 obj<>endobj +699 0 obj<>endobj +700 0 obj<>endobj +701 0 obj<>endobj +702 0 obj<>endobj +703 0 obj<>endobj +704 0 obj<>endobj +705 0 obj<>endobj +706 0 obj<>endobj +707 0 obj<>endobj +708 0 obj<>endobj +709 0 obj<>endobj +710 0 obj<>endobj +711 0 obj<>endobj +712 0 obj<>endobj +713 0 obj<>endobj +714 0 obj<>endobj +715 0 obj<>endobj +716 0 obj<>endobj +717 0 obj<>endobj +718 0 obj<>endobj +719 0 obj<>endobj +720 0 obj<>endobj +721 0 obj<>endobj +722 0 obj<>endobj +723 0 obj<>endobj +724 0 obj<>endobj +725 0 obj<>endobj +726 0 obj<>endobj +727 0 obj<>endobj +728 0 obj<>endobj +729 0 obj<>endobj +730 0 obj<>endobj +731 0 obj<>endobj +732 0 obj<>endobj +733 0 obj<>endobj +734 0 obj<>endobj +735 0 obj<>endobj +736 0 obj<>endobj +737 0 obj<>endobj +738 0 obj<>endobj +739 0 obj<>endobj +740 0 obj<>endobj +741 0 obj<>endobj +742 0 obj<>endobj +743 0 obj<>endobj +744 0 obj<>endobj +745 0 obj<>endobj +746 0 obj<>endobj +747 0 obj<>endobj +748 0 obj<>endobj +749 0 obj<>endobj +750 0 obj<>endobj +751 0 obj<>endobj +752 0 obj<>endobj +753 0 obj<>endobj +754 0 obj<>endobj +755 0 obj<>endobj +756 0 obj<>endobj +757 0 obj<>endobj +758 0 obj<>endobj +759 0 obj<>endobj +760 0 obj<>endobj +761 0 obj<>endobj +762 0 obj<>endobj +763 0 obj<>endobj +764 0 obj<>endobj +765 0 obj<>endobj +766 0 obj<>endobj +767 0 obj<>endobj +768 0 obj<>endobj +769 0 obj<>endobj +770 0 obj<>endobj +771 0 obj<>endobj +772 0 obj<>endobj +773 0 obj<>endobj +774 0 obj<>endobj +775 0 obj<>endobj +776 0 obj<>endobj +777 0 obj<>endobj +778 0 obj<>endobj +779 0 obj<>endobj +780 0 obj<>endobj +781 0 obj<>endobj +782 0 obj<>endobj +783 0 obj<>endobj +784 0 obj<>endobj +785 0 obj<>endobj +786 0 obj<>endobj +787 0 obj<>endobj +788 0 obj<>endobj +789 0 obj<>endobj +790 0 obj<>endobj +791 0 obj<>endobj +792 0 obj<>endobj +793 0 obj<>endobj +794 0 obj<>endobj +795 0 obj<>endobj +796 0 obj<>endobj +797 0 obj<>endobj +798 0 obj<>endobj +799 0 obj<>endobj +800 0 obj<>endobj +801 0 obj<>endobj +802 0 obj<>endobj +803 0 obj<>endobj +804 0 obj<>endobj +805 0 obj<>endobj +806 0 obj<>endobj +807 0 obj<>endobj +808 0 obj<>endobj +809 0 obj<>endobj +810 0 obj<>endobj +811 0 obj<>endobj +812 0 obj<>endobj +813 0 obj<>endobj +814 0 obj<>endobj +815 0 obj<The smbpasswd file)/Dest[679 0 R/XYZ 0 771 0]/Prev 814 0 R>>endobj +816 0 obj<>endobj +817 0 obj<>endobj +818 0 obj<>endobj +819 0 obj<>1<>5<>6<>9<>11<>13<>17<>19<>24<>27<>31<>33<>67<>72<>73<>77<>80<>]>>>>endobj xref -0 806 +0 820 0000000000 65535 f 0000000015 00000 n -0000000243 00000 n -0000001809 00000 n -0000001883 00000 n -0000001962 00000 n -0000002044 00000 n -0000002122 00000 n -0000002199 00000 n -0000002278 00000 n -0000002361 00000 n -0000002438 00000 n -0000002520 00000 n -0000002579 00000 n -0000002680 00000 n -0000002782 00000 n -0000002883 00000 n -0000002984 00000 n -0000003086 00000 n -0000003188 00000 n -0000003290 00000 n -0000003391 00000 n -0000003493 00000 n -0000003595 00000 n -0000003697 00000 n -0000003799 00000 n -0000003901 00000 n -0000004002 00000 n -0000004104 00000 n -0000004206 00000 n -0000004308 00000 n -0000004410 00000 n -0000004512 00000 n -0000004614 00000 n -0000004716 00000 n -0000004818 00000 n -0000004919 00000 n -0000005020 00000 n -0000005122 00000 n -0000005224 00000 n -0000005326 00000 n -0000005428 00000 n -0000005530 00000 n -0000005632 00000 n -0000005734 00000 n -0000005836 00000 n -0000005938 00000 n -0000006040 00000 n -0000006142 00000 n -0000006244 00000 n -0000006346 00000 n -0000006448 00000 n -0000006550 00000 n -0000006651 00000 n -0000006751 00000 n -0000006851 00000 n -0000007161 00000 n -0000007262 00000 n -0000007364 00000 n -0000007466 00000 n -0000007568 00000 n -0000007670 00000 n -0000007771 00000 n -0000007873 00000 n -0000007975 00000 n -0000008077 00000 n -0000008179 00000 n -0000008281 00000 n -0000008383 00000 n -0000008484 00000 n -0000008586 00000 n -0000008688 00000 n -0000008790 00000 n -0000008892 00000 n -0000008994 00000 n -0000009096 00000 n -0000009198 00000 n -0000009300 00000 n -0000009402 00000 n -0000009503 00000 n -0000009604 00000 n -0000009706 00000 n -0000009808 00000 n -0000009910 00000 n -0000010012 00000 n -0000010114 00000 n -0000010216 00000 n -0000010318 00000 n -0000010420 00000 n -0000010522 00000 n -0000010624 00000 n -0000010726 00000 n -0000010828 00000 n -0000010930 00000 n -0000011032 00000 n -0000011134 00000 n -0000011236 00000 n -0000011338 00000 n -0000011439 00000 n -0000011539 00000 n -0000011639 00000 n -0000011964 00000 n -0000012066 00000 n -0000012169 00000 n -0000012272 00000 n -0000012375 00000 n -0000012478 00000 n -0000012581 00000 n -0000012684 00000 n -0000012787 00000 n -0000012890 00000 n -0000012993 00000 n -0000013096 00000 n -0000013199 00000 n -0000013302 00000 n -0000013405 00000 n -0000013508 00000 n -0000013611 00000 n -0000013714 00000 n -0000013817 00000 n -0000013920 00000 n -0000014023 00000 n -0000014125 00000 n -0000014228 00000 n -0000014331 00000 n -0000014434 00000 n -0000014537 00000 n -0000014640 00000 n -0000014742 00000 n -0000014845 00000 n -0000014947 00000 n -0000015050 00000 n -0000015153 00000 n -0000015256 00000 n -0000015359 00000 n -0000015462 00000 n -0000015565 00000 n -0000015668 00000 n -0000015771 00000 n -0000015874 00000 n -0000015977 00000 n -0000016080 00000 n -0000016183 00000 n -0000016284 00000 n -0000016385 00000 n -0000016486 00000 n -0000016855 00000 n -0000016957 00000 n -0000017060 00000 n -0000017093 00000 n -0000017148 00000 n -0000017235 00000 n -0000017290 00000 n -0000017377 00000 n -0000017444 00000 n -0000017530 00000 n -0000017632 00000 n -0000017735 00000 n -0000017838 00000 n -0000017941 00000 n -0000018043 00000 n -0000018146 00000 n -0000018249 00000 n -0000018352 00000 n -0000018455 00000 n -0000018558 00000 n -0000018660 00000 n -0000018763 00000 n -0000018866 00000 n -0000018969 00000 n -0000019072 00000 n -0000019175 00000 n -0000019278 00000 n -0000019381 00000 n -0000019484 00000 n -0000019586 00000 n -0000019688 00000 n -0000019791 00000 n -0000019894 00000 n -0000019997 00000 n -0000020100 00000 n -0000020203 00000 n -0000020306 00000 n -0000020409 00000 n -0000020512 00000 n -0000020615 00000 n -0000020718 00000 n -0000020821 00000 n -0000020924 00000 n -0000021026 00000 n -0000021127 00000 n -0000021228 00000 n -0000021557 00000 n -0000021660 00000 n -0000021763 00000 n -0000021866 00000 n -0000021969 00000 n -0000022072 00000 n -0000022175 00000 n -0000022278 00000 n -0000022380 00000 n -0000022483 00000 n -0000022586 00000 n -0000022689 00000 n -0000022792 00000 n -0000022895 00000 n -0000022998 00000 n -0000023100 00000 n -0000023203 00000 n -0000023306 00000 n -0000023409 00000 n -0000023512 00000 n -0000023615 00000 n -0000023718 00000 n -0000023821 00000 n -0000023924 00000 n -0000024027 00000 n -0000024129 00000 n -0000024231 00000 n -0000024334 00000 n -0000024437 00000 n -0000024540 00000 n -0000024643 00000 n -0000024746 00000 n -0000024849 00000 n -0000024952 00000 n -0000025055 00000 n -0000025158 00000 n -0000025261 00000 n -0000025364 00000 n -0000025467 00000 n -0000025570 00000 n -0000025673 00000 n -0000025776 00000 n -0000025879 00000 n -0000025982 00000 n -0000026085 00000 n -0000026188 00000 n -0000026291 00000 n -0000026394 00000 n -0000026497 00000 n -0000026599 00000 n -0000026700 00000 n -0000026801 00000 n -0000027226 00000 n -0000027329 00000 n -0000027432 00000 n -0000027535 00000 n -0000027638 00000 n -0000027741 00000 n -0000027844 00000 n -0000027947 00000 n -0000028050 00000 n -0000028153 00000 n -0000028256 00000 n -0000028359 00000 n -0000028462 00000 n -0000028565 00000 n -0000028668 00000 n -0000028770 00000 n -0000028873 00000 n -0000028976 00000 n -0000029079 00000 n -0000029182 00000 n -0000029285 00000 n -0000029387 00000 n -0000029490 00000 n -0000029592 00000 n -0000029695 00000 n -0000029798 00000 n -0000029901 00000 n -0000030004 00000 n -0000030107 00000 n -0000030210 00000 n -0000030313 00000 n -0000030416 00000 n -0000030519 00000 n -0000030622 00000 n -0000030725 00000 n -0000030828 00000 n -0000030930 00000 n -0000031033 00000 n -0000031136 00000 n -0000031239 00000 n -0000031568 00000 n -0000031652 00000 n -0000031738 00000 n -0000031812 00000 n -0000031898 00000 n -0000031931 00000 n -0000032009 00000 n -0000032096 00000 n -0000032202 00000 n -0000032288 00000 n -0000032360 00000 n -0000032446 00000 n -0000032505 00000 n -0000032592 00000 n -0000032683 00000 n -0000032769 00000 n -0000032840 00000 n -0000032926 00000 n -0000032991 00000 n +0000000244 00000 n +0000001810 00000 n +0000001884 00000 n +0000001963 00000 n +0000002045 00000 n +0000002123 00000 n +0000002200 00000 n +0000002279 00000 n +0000002362 00000 n +0000002439 00000 n +0000002521 00000 n +0000002580 00000 n +0000002681 00000 n +0000002783 00000 n +0000002884 00000 n +0000002985 00000 n +0000003087 00000 n +0000003189 00000 n +0000003291 00000 n +0000003392 00000 n +0000003494 00000 n +0000003596 00000 n +0000003698 00000 n +0000003800 00000 n +0000003902 00000 n +0000004003 00000 n +0000004105 00000 n +0000004207 00000 n +0000004309 00000 n +0000004411 00000 n +0000004513 00000 n +0000004615 00000 n +0000004717 00000 n +0000004819 00000 n +0000004920 00000 n +0000005021 00000 n +0000005123 00000 n +0000005225 00000 n +0000005327 00000 n +0000005429 00000 n +0000005531 00000 n +0000005633 00000 n +0000005735 00000 n +0000005837 00000 n +0000005939 00000 n +0000006041 00000 n +0000006143 00000 n +0000006245 00000 n +0000006347 00000 n +0000006449 00000 n +0000006551 00000 n +0000006652 00000 n +0000006752 00000 n +0000006852 00000 n +0000007162 00000 n +0000007263 00000 n +0000007365 00000 n +0000007467 00000 n +0000007569 00000 n +0000007671 00000 n +0000007772 00000 n +0000007874 00000 n +0000007976 00000 n +0000008078 00000 n +0000008180 00000 n +0000008282 00000 n +0000008384 00000 n +0000008485 00000 n +0000008587 00000 n +0000008689 00000 n +0000008791 00000 n +0000008893 00000 n +0000008995 00000 n +0000009097 00000 n +0000009199 00000 n +0000009301 00000 n +0000009403 00000 n +0000009504 00000 n +0000009605 00000 n +0000009707 00000 n +0000009809 00000 n +0000009911 00000 n +0000010013 00000 n +0000010115 00000 n +0000010217 00000 n +0000010319 00000 n +0000010421 00000 n +0000010523 00000 n +0000010625 00000 n +0000010727 00000 n +0000010829 00000 n +0000010931 00000 n +0000011033 00000 n +0000011135 00000 n +0000011237 00000 n +0000011339 00000 n +0000011440 00000 n +0000011540 00000 n +0000011640 00000 n +0000011965 00000 n +0000012067 00000 n +0000012170 00000 n +0000012273 00000 n +0000012376 00000 n +0000012479 00000 n +0000012582 00000 n +0000012685 00000 n +0000012788 00000 n +0000012891 00000 n +0000012994 00000 n +0000013097 00000 n +0000013200 00000 n +0000013303 00000 n +0000013406 00000 n +0000013509 00000 n +0000013612 00000 n +0000013715 00000 n +0000013818 00000 n +0000013921 00000 n +0000014024 00000 n +0000014126 00000 n +0000014229 00000 n +0000014332 00000 n +0000014435 00000 n +0000014538 00000 n +0000014641 00000 n +0000014743 00000 n +0000014846 00000 n +0000014948 00000 n +0000015051 00000 n +0000015154 00000 n +0000015257 00000 n +0000015360 00000 n +0000015463 00000 n +0000015566 00000 n +0000015669 00000 n +0000015772 00000 n +0000015875 00000 n +0000015978 00000 n +0000016081 00000 n +0000016184 00000 n +0000016285 00000 n +0000016386 00000 n +0000016487 00000 n +0000016856 00000 n +0000016958 00000 n +0000017061 00000 n +0000017163 00000 n +0000017266 00000 n +0000017369 00000 n +0000017426 00000 n +0000017481 00000 n +0000017568 00000 n +0000017623 00000 n +0000017710 00000 n +0000017777 00000 n +0000017863 00000 n +0000017965 00000 n +0000018068 00000 n +0000018171 00000 n +0000018274 00000 n +0000018376 00000 n +0000018479 00000 n +0000018582 00000 n +0000018685 00000 n +0000018788 00000 n +0000018891 00000 n +0000018993 00000 n +0000019096 00000 n +0000019199 00000 n +0000019302 00000 n +0000019405 00000 n +0000019508 00000 n +0000019611 00000 n +0000019714 00000 n +0000019817 00000 n +0000019919 00000 n +0000020021 00000 n +0000020124 00000 n +0000020227 00000 n +0000020330 00000 n +0000020433 00000 n +0000020536 00000 n +0000020639 00000 n +0000020742 00000 n +0000020845 00000 n +0000020948 00000 n +0000021051 00000 n +0000021154 00000 n +0000021257 00000 n +0000021359 00000 n +0000021460 00000 n +0000021561 00000 n +0000021890 00000 n +0000021993 00000 n +0000022096 00000 n +0000022199 00000 n +0000022302 00000 n +0000022405 00000 n +0000022508 00000 n +0000022611 00000 n +0000022713 00000 n +0000022816 00000 n +0000022919 00000 n +0000023022 00000 n +0000023125 00000 n +0000023228 00000 n +0000023331 00000 n +0000023433 00000 n +0000023536 00000 n +0000023639 00000 n +0000023742 00000 n +0000023845 00000 n +0000023948 00000 n +0000024051 00000 n +0000024154 00000 n +0000024257 00000 n +0000024360 00000 n +0000024462 00000 n +0000024564 00000 n +0000024667 00000 n +0000024770 00000 n +0000024873 00000 n +0000024976 00000 n +0000025079 00000 n +0000025182 00000 n +0000025285 00000 n +0000025388 00000 n +0000025491 00000 n +0000025594 00000 n +0000025697 00000 n +0000025800 00000 n +0000025903 00000 n +0000026006 00000 n +0000026109 00000 n +0000026212 00000 n +0000026315 00000 n +0000026418 00000 n +0000026521 00000 n +0000026624 00000 n +0000026727 00000 n +0000026830 00000 n +0000026932 00000 n +0000027033 00000 n +0000027134 00000 n +0000027559 00000 n +0000027662 00000 n +0000027765 00000 n +0000027868 00000 n +0000027971 00000 n +0000028074 00000 n +0000028177 00000 n +0000028280 00000 n +0000028383 00000 n +0000028486 00000 n +0000028589 00000 n +0000028692 00000 n +0000028795 00000 n +0000028898 00000 n +0000029001 00000 n +0000029103 00000 n +0000029206 00000 n +0000029309 00000 n +0000029412 00000 n +0000029515 00000 n +0000029618 00000 n +0000029720 00000 n +0000029823 00000 n +0000029925 00000 n +0000030028 00000 n +0000030131 00000 n +0000030234 00000 n +0000030337 00000 n +0000030440 00000 n +0000030543 00000 n +0000030646 00000 n +0000030749 00000 n +0000030852 00000 n +0000030955 00000 n +0000031058 00000 n +0000031161 00000 n +0000031263 00000 n +0000031366 00000 n +0000031469 00000 n +0000031572 00000 n +0000031674 00000 n +0000031777 00000 n +0000031880 00000 n +0000032233 00000 n +0000032317 00000 n +0000032403 00000 n +0000032477 00000 n +0000032563 00000 n +0000032596 00000 n +0000032674 00000 n +0000032761 00000 n +0000032867 00000 n +0000032953 00000 n 0000033025 00000 n -0000033059 00000 n -0000036406 00000 n -0000036449 00000 n -0000036492 00000 n -0000036535 00000 n -0000036578 00000 n -0000036621 00000 n -0000036664 00000 n -0000036707 00000 n -0000036750 00000 n -0000036793 00000 n -0000036836 00000 n -0000036879 00000 n -0000036922 00000 n -0000036965 00000 n -0000037008 00000 n -0000037051 00000 n -0000037094 00000 n -0000037137 00000 n -0000037180 00000 n -0000037223 00000 n -0000037266 00000 n -0000037309 00000 n -0000037352 00000 n -0000037395 00000 n -0000037438 00000 n -0000037481 00000 n -0000037524 00000 n -0000037567 00000 n -0000037610 00000 n -0000037653 00000 n -0000037696 00000 n -0000037739 00000 n -0000037782 00000 n -0000037825 00000 n -0000037868 00000 n -0000037911 00000 n -0000037954 00000 n -0000037997 00000 n -0000038040 00000 n -0000038083 00000 n -0000038126 00000 n -0000038169 00000 n -0000038212 00000 n -0000038255 00000 n -0000038298 00000 n -0000038341 00000 n -0000038384 00000 n -0000038427 00000 n -0000038470 00000 n -0000038513 00000 n -0000038556 00000 n -0000038599 00000 n -0000038642 00000 n -0000038685 00000 n -0000038728 00000 n -0000038771 00000 n -0000038814 00000 n -0000038857 00000 n -0000038900 00000 n -0000038943 00000 n -0000038986 00000 n -0000039029 00000 n -0000039072 00000 n -0000039115 00000 n -0000039158 00000 n -0000039201 00000 n -0000039244 00000 n -0000039287 00000 n -0000039330 00000 n -0000039373 00000 n -0000039416 00000 n -0000039459 00000 n -0000039502 00000 n -0000039545 00000 n -0000039588 00000 n -0000039631 00000 n -0000039674 00000 n -0000039717 00000 n -0000039760 00000 n -0000039803 00000 n -0000039846 00000 n -0000039889 00000 n -0000039932 00000 n -0000039975 00000 n -0000040018 00000 n -0000040061 00000 n -0000040104 00000 n -0000040147 00000 n -0000040190 00000 n -0000040233 00000 n -0000040276 00000 n -0000040319 00000 n -0000040362 00000 n -0000040405 00000 n -0000040448 00000 n -0000040491 00000 n -0000040534 00000 n -0000040577 00000 n -0000040620 00000 n -0000040663 00000 n -0000040706 00000 n -0000040749 00000 n -0000040792 00000 n -0000040835 00000 n -0000040878 00000 n -0000040921 00000 n -0000040964 00000 n -0000041007 00000 n -0000041050 00000 n -0000041093 00000 n -0000041136 00000 n -0000041179 00000 n -0000041222 00000 n -0000041265 00000 n -0000041308 00000 n -0000041351 00000 n -0000041394 00000 n -0000041437 00000 n -0000041480 00000 n -0000041523 00000 n -0000041566 00000 n -0000041609 00000 n -0000041652 00000 n -0000041695 00000 n -0000041738 00000 n -0000041781 00000 n -0000041824 00000 n -0000041867 00000 n -0000041910 00000 n -0000041953 00000 n -0000041996 00000 n -0000042039 00000 n -0000042082 00000 n -0000042125 00000 n -0000042168 00000 n -0000042211 00000 n -0000042254 00000 n -0000042297 00000 n -0000042340 00000 n -0000042383 00000 n -0000042426 00000 n -0000042469 00000 n -0000042512 00000 n -0000042555 00000 n -0000042598 00000 n -0000042641 00000 n -0000042684 00000 n -0000042727 00000 n -0000042770 00000 n -0000042813 00000 n -0000042856 00000 n -0000042899 00000 n -0000042942 00000 n -0000042985 00000 n -0000043028 00000 n -0000043071 00000 n -0000043114 00000 n -0000043157 00000 n -0000043200 00000 n -0000043243 00000 n -0000043286 00000 n -0000043329 00000 n -0000043372 00000 n -0000043415 00000 n -0000043458 00000 n -0000043501 00000 n -0000043544 00000 n -0000043587 00000 n -0000043630 00000 n -0000043673 00000 n -0000043716 00000 n -0000043759 00000 n -0000043802 00000 n -0000043845 00000 n -0000043888 00000 n -0000043931 00000 n -0000043974 00000 n -0000044017 00000 n -0000044060 00000 n -0000044103 00000 n -0000044146 00000 n -0000044189 00000 n -0000044232 00000 n -0000044275 00000 n -0000044318 00000 n -0000044361 00000 n -0000044404 00000 n -0000044447 00000 n -0000044490 00000 n -0000044533 00000 n -0000044576 00000 n -0000044619 00000 n -0000044662 00000 n -0000044705 00000 n -0000044748 00000 n -0000044791 00000 n -0000044834 00000 n -0000044877 00000 n -0000044920 00000 n -0000044963 00000 n -0000045006 00000 n -0000045049 00000 n -0000045092 00000 n -0000045135 00000 n -0000045178 00000 n -0000045221 00000 n -0000045264 00000 n -0000045307 00000 n -0000045350 00000 n -0000046037 00000 n +0000033111 00000 n +0000033170 00000 n +0000033257 00000 n +0000033348 00000 n +0000033434 00000 n +0000033505 00000 n +0000033591 00000 n +0000033656 00000 n +0000033690 00000 n +0000033724 00000 n +0000037122 00000 n +0000037165 00000 n +0000037208 00000 n +0000037251 00000 n +0000037294 00000 n +0000037337 00000 n +0000037380 00000 n +0000037423 00000 n +0000037466 00000 n +0000037509 00000 n +0000037552 00000 n +0000037595 00000 n +0000037638 00000 n +0000037681 00000 n +0000037724 00000 n +0000037767 00000 n +0000037810 00000 n +0000037853 00000 n +0000037896 00000 n +0000037939 00000 n +0000037982 00000 n +0000038025 00000 n +0000038068 00000 n +0000038111 00000 n +0000038154 00000 n +0000038197 00000 n +0000038240 00000 n +0000038283 00000 n +0000038326 00000 n +0000038369 00000 n +0000038412 00000 n +0000038455 00000 n +0000038498 00000 n +0000038541 00000 n +0000038584 00000 n +0000038627 00000 n +0000038670 00000 n +0000038713 00000 n +0000038756 00000 n +0000038799 00000 n +0000038842 00000 n +0000038885 00000 n +0000038928 00000 n +0000038971 00000 n +0000039014 00000 n +0000039057 00000 n +0000039100 00000 n +0000039143 00000 n +0000039186 00000 n +0000039229 00000 n +0000039272 00000 n +0000039315 00000 n +0000039358 00000 n +0000039401 00000 n +0000039444 00000 n +0000039487 00000 n +0000039530 00000 n +0000039573 00000 n +0000039616 00000 n +0000039659 00000 n +0000039702 00000 n +0000039745 00000 n +0000039788 00000 n +0000039831 00000 n +0000039874 00000 n +0000039917 00000 n +0000039960 00000 n +0000040003 00000 n +0000040046 00000 n +0000040089 00000 n +0000040132 00000 n +0000040175 00000 n +0000040218 00000 n +0000040261 00000 n +0000040304 00000 n +0000040347 00000 n +0000040390 00000 n +0000040433 00000 n +0000040476 00000 n +0000040519 00000 n +0000040562 00000 n +0000040605 00000 n +0000040648 00000 n +0000040691 00000 n +0000040734 00000 n +0000040777 00000 n +0000040820 00000 n +0000040863 00000 n +0000040906 00000 n +0000040949 00000 n +0000040992 00000 n +0000041035 00000 n +0000041078 00000 n +0000041121 00000 n +0000041164 00000 n +0000041207 00000 n +0000041250 00000 n +0000041293 00000 n +0000041336 00000 n +0000041379 00000 n +0000041422 00000 n +0000041465 00000 n +0000041508 00000 n +0000041551 00000 n +0000041594 00000 n +0000041637 00000 n +0000041680 00000 n +0000041723 00000 n +0000041766 00000 n +0000041809 00000 n +0000041852 00000 n +0000041895 00000 n +0000041938 00000 n +0000041981 00000 n +0000042024 00000 n +0000042067 00000 n +0000042110 00000 n +0000042153 00000 n +0000042196 00000 n +0000042239 00000 n +0000042282 00000 n +0000042325 00000 n +0000042368 00000 n +0000042411 00000 n +0000042454 00000 n +0000042497 00000 n +0000042540 00000 n +0000042583 00000 n +0000042626 00000 n +0000042669 00000 n +0000042712 00000 n +0000042755 00000 n +0000042798 00000 n +0000042841 00000 n +0000042884 00000 n +0000042927 00000 n +0000042970 00000 n +0000043013 00000 n +0000043056 00000 n +0000043099 00000 n +0000043142 00000 n +0000043185 00000 n +0000043228 00000 n +0000043271 00000 n +0000043314 00000 n +0000043357 00000 n +0000043400 00000 n +0000043443 00000 n +0000043486 00000 n +0000043529 00000 n +0000043572 00000 n +0000043615 00000 n +0000043658 00000 n +0000043701 00000 n +0000043744 00000 n +0000043787 00000 n +0000043830 00000 n +0000043873 00000 n +0000043916 00000 n +0000043959 00000 n +0000044002 00000 n +0000044045 00000 n +0000044088 00000 n +0000044131 00000 n +0000044174 00000 n +0000044217 00000 n +0000044260 00000 n +0000044303 00000 n +0000044346 00000 n +0000044389 00000 n +0000044432 00000 n +0000044475 00000 n +0000044518 00000 n +0000044561 00000 n +0000044604 00000 n +0000044647 00000 n +0000044690 00000 n +0000044733 00000 n +0000044776 00000 n +0000044819 00000 n +0000044862 00000 n +0000044905 00000 n +0000044948 00000 n +0000044991 00000 n +0000045034 00000 n +0000045077 00000 n +0000045120 00000 n +0000045163 00000 n +0000045206 00000 n +0000045249 00000 n +0000045292 00000 n +0000045335 00000 n +0000045378 00000 n +0000045421 00000 n +0000045464 00000 n +0000045507 00000 n +0000045550 00000 n +0000045593 00000 n +0000045636 00000 n +0000045679 00000 n +0000045722 00000 n +0000045765 00000 n +0000045808 00000 n +0000045851 00000 n +0000045894 00000 n +0000045937 00000 n +0000045980 00000 n +0000046023 00000 n +0000046066 00000 n +0000046109 00000 n +0000046152 00000 n 0000046195 00000 n -0000046362 00000 n -0000046552 00000 n -0000049149 00000 n -0000049340 00000 n -0000052448 00000 n -0000052639 00000 n -0000056177 00000 n -0000056368 00000 n -0000056827 00000 n -0000056985 00000 n -0000057214 00000 n -0000057414 00000 n -0000059219 00000 n -0000059391 00000 n -0000061477 00000 n -0000061649 00000 n -0000063568 00000 n -0000063735 00000 n -0000065380 00000 n -0000065547 00000 n -0000067089 00000 n -0000067256 00000 n -0000068990 00000 n -0000069157 00000 n -0000070893 00000 n -0000071069 00000 n -0000072334 00000 n -0000072510 00000 n -0000073721 00000 n -0000073897 00000 n -0000075145 00000 n -0000075312 00000 n -0000076222 00000 n -0000076413 00000 n -0000078380 00000 n -0000078537 00000 n -0000080320 00000 n -0000080487 00000 n -0000082471 00000 n -0000082638 00000 n -0000083374 00000 n -0000083550 00000 n -0000084592 00000 n -0000084759 00000 n -0000086395 00000 n -0000086562 00000 n -0000087186 00000 n -0000087362 00000 n -0000088690 00000 n -0000088866 00000 n -0000089940 00000 n -0000090107 00000 n -0000090708 00000 n -0000090875 00000 n -0000092661 00000 n -0000092828 00000 n -0000094545 00000 n -0000094712 00000 n -0000096561 00000 n -0000096718 00000 n -0000097833 00000 n -0000098018 00000 n -0000099625 00000 n -0000099791 00000 n -0000100680 00000 n -0000100880 00000 n -0000102605 00000 n -0000102781 00000 n -0000104608 00000 n -0000104784 00000 n -0000105395 00000 n -0000105571 00000 n -0000106346 00000 n -0000106522 00000 n -0000107279 00000 n -0000107455 00000 n -0000108294 00000 n -0000108470 00000 n -0000109306 00000 n -0000109491 00000 n -0000110331 00000 n -0000110507 00000 n -0000111267 00000 n -0000111433 00000 n -0000112058 00000 n -0000112243 00000 n -0000113011 00000 n -0000113187 00000 n -0000114149 00000 n -0000114334 00000 n -0000115669 00000 n -0000115854 00000 n -0000116872 00000 n -0000117038 00000 n -0000117618 00000 n -0000117803 00000 n -0000118862 00000 n -0000119038 00000 n -0000119916 00000 n -0000120092 00000 n -0000121186 00000 n -0000121371 00000 n -0000122257 00000 n -0000122442 00000 n -0000123219 00000 n -0000123395 00000 n -0000123996 00000 n -0000124172 00000 n -0000124834 00000 n -0000125019 00000 n +0000046890 00000 n +0000047048 00000 n +0000047215 00000 n +0000047405 00000 n +0000050007 00000 n +0000050198 00000 n +0000053303 00000 n +0000053494 00000 n +0000057039 00000 n +0000057230 00000 n +0000057902 00000 n +0000058060 00000 n +0000058289 00000 n +0000058489 00000 n +0000060298 00000 n +0000060470 00000 n +0000062553 00000 n +0000062725 00000 n +0000064745 00000 n +0000064912 00000 n +0000066557 00000 n +0000066724 00000 n +0000068266 00000 n +0000068433 00000 n +0000070167 00000 n +0000070334 00000 n +0000072070 00000 n +0000072246 00000 n +0000073511 00000 n +0000073687 00000 n +0000074898 00000 n +0000075074 00000 n +0000076322 00000 n +0000076489 00000 n +0000077399 00000 n +0000077590 00000 n +0000079551 00000 n +0000079708 00000 n +0000081485 00000 n +0000081652 00000 n +0000083634 00000 n +0000083801 00000 n +0000084537 00000 n +0000084713 00000 n +0000085755 00000 n +0000085922 00000 n +0000087557 00000 n +0000087724 00000 n +0000088348 00000 n +0000088524 00000 n +0000089854 00000 n +0000090030 00000 n +0000091104 00000 n +0000091271 00000 n +0000091872 00000 n +0000092039 00000 n +0000093825 00000 n +0000093992 00000 n +0000095709 00000 n +0000095876 00000 n +0000097725 00000 n +0000097882 00000 n +0000098997 00000 n +0000099182 00000 n +0000100789 00000 n +0000100955 00000 n +0000101844 00000 n +0000102044 00000 n +0000103769 00000 n +0000103945 00000 n +0000105770 00000 n +0000105946 00000 n +0000106557 00000 n +0000106733 00000 n +0000107508 00000 n +0000107684 00000 n +0000108441 00000 n +0000108617 00000 n +0000109456 00000 n +0000109632 00000 n +0000110468 00000 n +0000110653 00000 n +0000111493 00000 n +0000111669 00000 n +0000112429 00000 n +0000112595 00000 n +0000113220 00000 n +0000113405 00000 n +0000114173 00000 n +0000114349 00000 n +0000115311 00000 n +0000115496 00000 n +0000116831 00000 n +0000117016 00000 n +0000118034 00000 n +0000118200 00000 n +0000118780 00000 n +0000118965 00000 n +0000120024 00000 n +0000120200 00000 n +0000121078 00000 n +0000121254 00000 n +0000122348 00000 n +0000122533 00000 n +0000123419 00000 n +0000123604 00000 n +0000124381 00000 n +0000124557 00000 n +0000125158 00000 n +0000125334 00000 n 0000125996 00000 n -0000126172 00000 n -0000127179 00000 n -0000127355 00000 n -0000128349 00000 n -0000128534 00000 n -0000129366 00000 n -0000129542 00000 n -0000130275 00000 n -0000130451 00000 n -0000131133 00000 n -0000131309 00000 n -0000132138 00000 n -0000132314 00000 n -0000133302 00000 n -0000133469 00000 n -0000134905 00000 n -0000135090 00000 n -0000135823 00000 n -0000136008 00000 n -0000136635 00000 n -0000136801 00000 n -0000137199 00000 n -0000137385 00000 n -0000138913 00000 n -0000139088 00000 n -0000140802 00000 n -0000140988 00000 n -0000142570 00000 n -0000142746 00000 n -0000144513 00000 n -0000144680 00000 n -0000145058 00000 n -0000145234 00000 n -0000146531 00000 n -0000146707 00000 n -0000148414 00000 n -0000148591 00000 n -0000150343 00000 n -0000150510 00000 n -0000152404 00000 n -0000152589 00000 n -0000153859 00000 n -0000154035 00000 n -0000155763 00000 n -0000155975 00000 n -0000157598 00000 n -0000157782 00000 n -0000158672 00000 n -0000158728 00000 n -0000158827 00000 n -0000158980 00000 n -0000159059 00000 n -0000159162 00000 n -0000159360 00000 n -0000159454 00000 n -0000159571 00000 n -0000159670 00000 n -0000159830 00000 n -0000159929 00000 n -0000160053 00000 n -0000160167 00000 n -0000160281 00000 n -0000160379 00000 n -0000160543 00000 n -0000160647 00000 n -0000160766 00000 n -0000160888 00000 n -0000161010 00000 n -0000161146 00000 n -0000161246 00000 n -0000161358 00000 n -0000161468 00000 n -0000161592 00000 n -0000161749 00000 n -0000161854 00000 n -0000161971 00000 n -0000162129 00000 n -0000162233 00000 n -0000162350 00000 n -0000162472 00000 n -0000162589 00000 n -0000162706 00000 n -0000162824 00000 n -0000162942 00000 n -0000163064 00000 n -0000163186 00000 n -0000163310 00000 n -0000163434 00000 n -0000163553 00000 n -0000163672 00000 n -0000163796 00000 n -0000163907 00000 n -0000164064 00000 n -0000164163 00000 n -0000164264 00000 n -0000164371 00000 n -0000164530 00000 n -0000164669 00000 n -0000164780 00000 n -0000164911 00000 n -0000165024 00000 n -0000165153 00000 n -0000165243 00000 n -0000165408 00000 n -0000165507 00000 n -0000165616 00000 n -0000165730 00000 n -0000165839 00000 n -0000165946 00000 n -0000166056 00000 n -0000166169 00000 n -0000166281 00000 n -0000166387 00000 n -0000166519 00000 n -0000166676 00000 n -0000166811 00000 n -0000166907 00000 n -0000167003 00000 n -0000167159 00000 n -0000167253 00000 n -0000167367 00000 n -0000167466 00000 n -0000167633 00000 n -0000167733 00000 n -0000167841 00000 n -0000167947 00000 n -0000168068 00000 n -0000168195 00000 n -0000168312 00000 n -0000168435 00000 n -0000168566 00000 n -0000168683 00000 n -0000168795 00000 n -0000168913 00000 n -0000169019 00000 n -0000169187 00000 n -0000169297 00000 n -0000169417 00000 n -0000169542 00000 n -0000169657 00000 n -0000169760 00000 n -0000169922 00000 n -0000170024 00000 n -0000170122 00000 n -0000170284 00000 n -0000170387 00000 n -0000170495 00000 n -0000170677 00000 n -0000170777 00000 n -0000170887 00000 n -0000170984 00000 n -0000171120 00000 n -0000171224 00000 n -0000171328 00000 n -0000171495 00000 n -0000171591 00000 n -0000171731 00000 n -0000171849 00000 n -0000171998 00000 n -0000172121 00000 n -0000172284 00000 n -0000172372 00000 n -0000172538 00000 n +0000126181 00000 n +0000127158 00000 n +0000127334 00000 n +0000128341 00000 n +0000128517 00000 n +0000129511 00000 n +0000129696 00000 n +0000130528 00000 n +0000130704 00000 n +0000131437 00000 n +0000131613 00000 n +0000132295 00000 n +0000132471 00000 n +0000133300 00000 n +0000133476 00000 n +0000134464 00000 n +0000134631 00000 n +0000136067 00000 n +0000136252 00000 n +0000136985 00000 n +0000137170 00000 n +0000137797 00000 n +0000137963 00000 n +0000138361 00000 n +0000138547 00000 n +0000140075 00000 n +0000140250 00000 n +0000141964 00000 n +0000142150 00000 n +0000143732 00000 n +0000143908 00000 n +0000145674 00000 n +0000145841 00000 n +0000146219 00000 n +0000146395 00000 n +0000147692 00000 n +0000147868 00000 n +0000149572 00000 n +0000149749 00000 n +0000151501 00000 n +0000151668 00000 n +0000153562 00000 n +0000153747 00000 n +0000155017 00000 n +0000155193 00000 n +0000156921 00000 n +0000157133 00000 n +0000158757 00000 n +0000158941 00000 n +0000159854 00000 n +0000160039 00000 n +0000161039 00000 n +0000161095 00000 n +0000161194 00000 n +0000161347 00000 n +0000161426 00000 n +0000161529 00000 n +0000161727 00000 n +0000161821 00000 n +0000161938 00000 n +0000162037 00000 n +0000162197 00000 n +0000162296 00000 n +0000162420 00000 n +0000162534 00000 n +0000162648 00000 n +0000162746 00000 n +0000162910 00000 n +0000163014 00000 n +0000163133 00000 n +0000163255 00000 n +0000163377 00000 n +0000163513 00000 n +0000163613 00000 n +0000163725 00000 n +0000163835 00000 n +0000163959 00000 n +0000164116 00000 n +0000164221 00000 n +0000164338 00000 n +0000164496 00000 n +0000164600 00000 n +0000164717 00000 n +0000164839 00000 n +0000164956 00000 n +0000165073 00000 n +0000165191 00000 n +0000165309 00000 n +0000165431 00000 n +0000165553 00000 n +0000165677 00000 n +0000165801 00000 n +0000165920 00000 n +0000166039 00000 n +0000166163 00000 n +0000166274 00000 n +0000166431 00000 n +0000166530 00000 n +0000166631 00000 n +0000166738 00000 n +0000166897 00000 n +0000167036 00000 n +0000167147 00000 n +0000167278 00000 n +0000167391 00000 n +0000167520 00000 n +0000167610 00000 n +0000167775 00000 n +0000167874 00000 n +0000167983 00000 n +0000168097 00000 n +0000168206 00000 n +0000168313 00000 n +0000168423 00000 n +0000168536 00000 n +0000168648 00000 n +0000168754 00000 n +0000168886 00000 n +0000169043 00000 n +0000169178 00000 n +0000169274 00000 n +0000169370 00000 n +0000169526 00000 n +0000169620 00000 n +0000169734 00000 n +0000169833 00000 n +0000170000 00000 n +0000170100 00000 n +0000170208 00000 n +0000170314 00000 n +0000170435 00000 n +0000170562 00000 n +0000170679 00000 n +0000170802 00000 n +0000170933 00000 n +0000171050 00000 n +0000171162 00000 n +0000171280 00000 n +0000171386 00000 n +0000171554 00000 n +0000171664 00000 n +0000171784 00000 n +0000171909 00000 n +0000172024 00000 n +0000172127 00000 n +0000172289 00000 n +0000172391 00000 n +0000172489 00000 n 0000172651 00000 n -0000172772 00000 n -0000172905 00000 n -0000173048 00000 n -0000173149 00000 n -0000173265 00000 n -0000173366 00000 n -0000173514 00000 n -0000173630 00000 n -0000173727 00000 n -0000173845 00000 n -0000173940 00000 n -0000174103 00000 n -0000174203 00000 n -0000174321 00000 n -0000174427 00000 n +0000172754 00000 n +0000172862 00000 n +0000173044 00000 n +0000173144 00000 n +0000173254 00000 n +0000173351 00000 n +0000173487 00000 n +0000173591 00000 n +0000173695 00000 n +0000173862 00000 n +0000173958 00000 n +0000174098 00000 n +0000174216 00000 n +0000174367 00000 n +0000174490 00000 n +0000174653 00000 n +0000174741 00000 n +0000174907 00000 n +0000175020 00000 n +0000175141 00000 n +0000175274 00000 n +0000175417 00000 n +0000175518 00000 n +0000175634 00000 n +0000175735 00000 n +0000175883 00000 n +0000175999 00000 n +0000176096 00000 n +0000176214 00000 n +0000176309 00000 n +0000176485 00000 n +0000176585 00000 n +0000176703 00000 n +0000176810 00000 n +0000176961 00000 n +0000177054 00000 n +0000177158 00000 n trailer -<<7fd6ff3b92a5faaa32c7fae07a75de5e>]>> +<<7b9583ab0e3792f751adca5026f42dd3>]>> startxref -174907 +177658 %%EOF diff --git a/docs/Samba-HOWTO-Collection.pdf b/docs/Samba-HOWTO-Collection.pdf index 1dedb444bd..fb5e53a515 100644 --- a/docs/Samba-HOWTO-Collection.pdf +++ b/docs/Samba-HOWTO-Collection.pdf @@ -1,6 +1,6 @@ %PDF-1.3 %âãÏÓ -1 0 obj<>endobj +1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>endobj 4 0 obj<>endobj @@ -13,48 +13,55 @@ 11 0 obj<>endobj 12 0 obj<>endobj 13 0 obj<>endobj -14 0 obj<>endobj -15 0 obj<>endobj -16 0 obj<>endobj -17 0 obj<>endobj -18 0 obj<>endobj -19 0 obj<>endobj -20 0 obj<>endobj -21 0 obj<>endobj -22 0 obj<>endobj -23 0 obj<>endobj -24 0 obj<>endobj -25 0 obj<>endobj -26 0 obj<>endobj -27 0 obj<>endobj -28 0 obj<>endobj -29 0 obj<>endobj -30 0 obj<>endobj -31 0 obj<>endobj -32 0 obj<>endobj -33 0 obj<>endobj -34 0 obj<>endobj -35 0 obj<>endobj -36 0 obj<>endobj -37 0 obj<>endobj -38 0 obj<>endobj -39 0 obj<>endobj -40 0 obj<>endobj -41 0 obj<>endobj -42 0 obj<>endobj -43 0 obj<>endobj -44 0 obj<>endobj -45 0 obj<>endobj -46 0 obj<>endobj -47 0 obj<>endobj -48 0 obj<>endobj -49 0 obj<>endobj -50 0 obj<>endobj -51 0 obj<>endobj -52 0 obj<>endobj -53 0 obj[14 0 R -15 0 R -16 0 R +14 0 obj<>stream +xUQ+–1¼ßÊ‘kGŽl;2²®À"c#‘‘X$G`IwèÙ׺(¾qOÑ%ùsÛN Šo$•¦š™àQÜ4FÛ¾Qz'`Ô/‹ËÞ~Läòì,û¯vuÓGo¡²— u›“jc™\ß±ÚXI3+cðÑEd‚Jk{Ãó÷çQÐ[ëòñ^X„àê¾øRƒo8ÐzÍ‘uá(dö*“GÉs(y›î üêõxÞ‹ÇYgäÚ(ï‘{E“ó䢡 {_‰3–û^ô¨žSd´î§é8ãæ„×<##~æ­•$:sð»›0Bˆ3ïå9÷dendstream +endobj +15 0 obj<]/Interpolate true/Filter/FlateDecode/Width 24/Height 24/BitsPerComponent 8/Length 223 >>stream +xUQ‡‚0 5âÀâ8@‹´öÿÍÚ4¥¦wo%w•R+©8¸çóCŒ+N"]ׂ*³ÏW ,D¶1Ž|áŠØi"%õ~öÄ0íÈ)ûÜ1ªlN!3€Ž1ˆìTÆ4HÔ†ÞË<ê <~õZ>ynõ¯.ŒHãê«>LÜê…K·ùbØŽ¼ÑŸ'4¦øËûŽžY}Íü-?f&tïA¿Â{2é“»7L}On4žïàKùIÿˆ" Ÿä õP†B‡hïG]áz˜$>—ÐÔ³å.mcoendstream +endobj +16 0 obj<>endobj +17 0 obj<>endobj +18 0 obj<>endobj +19 0 obj<>endobj +20 0 obj<>endobj +21 0 obj<>endobj +22 0 obj<>endobj +23 0 obj<>endobj +24 0 obj<>endobj +25 0 obj<>endobj +26 0 obj<>endobj +27 0 obj<>endobj +28 0 obj<>endobj +29 0 obj<>endobj +30 0 obj<>endobj +31 0 obj<>endobj +32 0 obj<>endobj +33 0 obj<>endobj +34 0 obj<>endobj +35 0 obj<>endobj +36 0 obj<>endobj +37 0 obj<>endobj +38 0 obj<>endobj +39 0 obj<>endobj +40 0 obj<>endobj +41 0 obj<>endobj +42 0 obj<>endobj +43 0 obj<>endobj +44 0 obj<>endobj +45 0 obj<>endobj +46 0 obj<>endobj +47 0 obj<>endobj +48 0 obj<>endobj +49 0 obj<>endobj +50 0 obj<>endobj +51 0 obj<>endobj +52 0 obj<>endobj +53 0 obj<>endobj +54 0 obj<>endobj +55 0 obj<>endobj +56 0 obj<>endobj +57 0 obj<>endobj +58 0 obj[16 0 R 17 0 R 18 0 R 19 0 R @@ -90,55 +97,56 @@ 49 0 R 50 0 R 51 0 R -52 0 R]endobj -54 0 obj<>endobj -55 0 obj<>endobj -56 0 obj<>endobj -57 0 obj<>endobj -58 0 obj<>endobj -59 0 obj<>endobj -60 0 obj<>endobj -61 0 obj<>endobj -62 0 obj<>endobj -63 0 obj<>endobj -64 0 obj<>endobj -65 0 obj<>endobj -66 0 obj<>endobj -67 0 obj<>endobj -68 0 obj<>endobj -69 0 obj<>endobj -70 0 obj<>endobj -71 0 obj<>endobj -72 0 obj<>endobj -73 0 obj<>endobj -74 0 obj<>endobj -75 0 obj<>endobj -76 0 obj<>endobj -77 0 obj<>endobj -78 0 obj<>endobj -79 0 obj<>endobj -80 0 obj<>endobj -81 0 obj<>endobj -82 0 obj<>endobj -83 0 obj<>endobj -84 0 obj<>endobj -85 0 obj<>endobj -86 0 obj<>endobj -87 0 obj<>endobj -88 0 obj<>endobj -89 0 obj<>endobj -90 0 obj<>endobj -91 0 obj<>endobj -92 0 obj<>endobj -93 0 obj<>endobj -94 0 obj<>endobj -95 0 obj<>endobj -96 0 obj[54 0 R +52 0 R +53 0 R +54 0 R 55 0 R 56 0 R -57 0 R -58 0 R -59 0 R +57 0 R]endobj +59 0 obj<>endobj +60 0 obj<>endobj +61 0 obj<>endobj +62 0 obj<>endobj +63 0 obj<>endobj +64 0 obj<>endobj +65 0 obj<>endobj +66 0 obj<>endobj +67 0 obj<>endobj +68 0 obj<>endobj +69 0 obj<>endobj +70 0 obj<>endobj +71 0 obj<>endobj +72 0 obj<>endobj +73 0 obj<>endobj +74 0 obj<>endobj +75 0 obj<>endobj +76 0 obj<>endobj +77 0 obj<>endobj +78 0 obj<>endobj +79 0 obj<>endobj +80 0 obj<>endobj +81 0 obj<>endobj +82 0 obj<>endobj +83 0 obj<>endobj +84 0 obj<>endobj +85 0 obj<>endobj +86 0 obj<>endobj +87 0 obj<>endobj +88 0 obj<>endobj +89 0 obj<>endobj +90 0 obj<>endobj +91 0 obj<>endobj +92 0 obj<>endobj +93 0 obj<>endobj +94 0 obj<>endobj +95 0 obj<>endobj +96 0 obj<>endobj +97 0 obj<>endobj +98 0 obj<>endobj +99 0 obj<>endobj +100 0 obj<>endobj +101 0 obj<>endobj +102 0 obj[59 0 R 60 0 R 61 0 R 62 0 R @@ -174,57 +182,56 @@ 92 0 R 93 0 R 94 0 R -95 0 R]endobj -97 0 obj<>endobj -98 0 obj<>endobj -99 0 obj<>endobj -100 0 obj<>endobj -101 0 obj<>endobj -102 0 obj<>endobj -103 0 obj<>endobj -104 0 obj<>endobj -105 0 obj<>endobj -106 0 obj<>endobj -107 0 obj<>endobj -108 0 obj<>endobj -109 0 obj<>endobj -110 0 obj<>endobj -111 0 obj<>endobj -112 0 obj<>endobj -113 0 obj<>endobj -114 0 obj<>endobj -115 0 obj<>endobj -116 0 obj<>endobj -117 0 obj<>endobj -118 0 obj<>endobj -119 0 obj<>endobj -120 0 obj<>endobj -121 0 obj<>endobj -122 0 obj<>endobj -123 0 obj<>endobj -124 0 obj<>endobj -125 0 obj<>endobj -126 0 obj<>endobj -127 0 obj<>endobj -128 0 obj<>endobj -129 0 obj<>endobj -130 0 obj<>endobj -131 0 obj<>endobj -132 0 obj<>endobj -133 0 obj<>endobj -134 0 obj<>endobj -135 0 obj<>endobj -136 0 obj<>endobj -137 0 obj<>endobj -138 0 obj<>endobj -139 0 obj<>endobj -140 0 obj[97 0 R +95 0 R +96 0 R +97 0 R 98 0 R 99 0 R 100 0 R -101 0 R -102 0 R -103 0 R +101 0 R]endobj +103 0 obj<>endobj +104 0 obj<>endobj +105 0 obj<>endobj +106 0 obj<>endobj +107 0 obj<>endobj +108 0 obj<>endobj +109 0 obj<>endobj +110 0 obj<>endobj +111 0 obj<>endobj +112 0 obj<>endobj +113 0 obj<>endobj +114 0 obj<>endobj +115 0 obj<>endobj +116 0 obj<>endobj +117 0 obj<>endobj +118 0 obj<>endobj +119 0 obj<>endobj +120 0 obj<>endobj +121 0 obj<>endobj +122 0 obj<>endobj +123 0 obj<>endobj +124 0 obj<>endobj +125 0 obj<>endobj +126 0 obj<>endobj +127 0 obj<>endobj +128 0 obj<>endobj +129 0 obj<>endobj +130 0 obj<>endobj +131 0 obj<>endobj +132 0 obj<>endobj +133 0 obj<>endobj +134 0 obj<>endobj +135 0 obj<>endobj +136 0 obj<>endobj +137 0 obj<>endobj +138 0 obj<>endobj +139 0 obj<>endobj +140 0 obj<>endobj +141 0 obj<>endobj +142 0 obj<>endobj +143 0 obj<>endobj +144 0 obj<>endobj +145 0 obj[103 0 R 104 0 R 105 0 R 106 0 R @@ -260,57 +267,57 @@ 136 0 R 137 0 R 138 0 R -139 0 R]endobj -141 0 obj<>endobj -142 0 obj<>endobj -143 0 obj<>endobj -144 0 obj<>endobj -145 0 obj<>endobj -146 0 obj<>endobj -147 0 obj<>endobj -148 0 obj<>endobj -149 0 obj<>endobj -150 0 obj<>endobj -151 0 obj<>endobj -152 0 obj<>endobj -153 0 obj<>endobj -154 0 obj<>endobj -155 0 obj<>endobj -156 0 obj<>endobj -157 0 obj<>endobj -158 0 obj<>endobj -159 0 obj<>endobj -160 0 obj<>endobj -161 0 obj<>endobj -162 0 obj<>endobj -163 0 obj<>endobj -164 0 obj<>endobj -165 0 obj<>endobj -166 0 obj<>endobj -167 0 obj<>endobj -168 0 obj<>endobj -169 0 obj<>endobj -170 0 obj<>endobj -171 0 obj<>endobj -172 0 obj<>endobj -173 0 obj<>endobj -174 0 obj<>endobj -175 0 obj<>endobj -176 0 obj<>endobj -177 0 obj<>endobj -178 0 obj<>endobj -179 0 obj<>endobj -180 0 obj<>endobj -181 0 obj<>endobj -182 0 obj<>endobj -183 0 obj<>endobj -184 0 obj<>endobj -185 0 obj[141 0 R +139 0 R +140 0 R +141 0 R 142 0 R 143 0 R -144 0 R -145 0 R -146 0 R +144 0 R]endobj +146 0 obj<>endobj +147 0 obj<>endobj +148 0 obj<>endobj +149 0 obj<>endobj +150 0 obj<>endobj +151 0 obj<>endobj +152 0 obj<>endobj +153 0 obj<>endobj +154 0 obj<>endobj +155 0 obj<>endobj +156 0 obj<>endobj +157 0 obj<>endobj +158 0 obj<>endobj +159 0 obj<>endobj +160 0 obj<>endobj +161 0 obj<>endobj +162 0 obj<>endobj +163 0 obj<>endobj +164 0 obj<>endobj +165 0 obj<>endobj +166 0 obj<>endobj +167 0 obj<>endobj +168 0 obj<>endobj +169 0 obj<>endobj +170 0 obj<>endobj +171 0 obj<>endobj +172 0 obj<>endobj +173 0 obj<>endobj +174 0 obj<>endobj +175 0 obj<>endobj +176 0 obj<>endobj +177 0 obj<>endobj +178 0 obj<>endobj +179 0 obj<>endobj +180 0 obj<>endobj +181 0 obj<>endobj +182 0 obj<>endobj +183 0 obj<>endobj +184 0 obj<>endobj +185 0 obj<>endobj +186 0 obj<>endobj +187 0 obj<>endobj +188 0 obj<>endobj +189 0 obj<>endobj +190 0 obj[146 0 R 147 0 R 148 0 R 149 0 R @@ -348,55 +355,56 @@ 181 0 R 182 0 R 183 0 R -184 0 R]endobj -186 0 obj<>endobj -187 0 obj<>endobj -188 0 obj<>endobj -189 0 obj<>endobj -190 0 obj<>endobj -191 0 obj<>endobj -192 0 obj<>endobj -193 0 obj<>endobj -194 0 obj<>endobj -195 0 obj<>endobj -196 0 obj<>endobj -197 0 obj<>endobj -198 0 obj<>endobj -199 0 obj<>endobj -200 0 obj<>endobj -201 0 obj<>endobj -202 0 obj<>endobj -203 0 obj<>endobj -204 0 obj<>endobj -205 0 obj<>endobj -206 0 obj<>endobj -207 0 obj<>endobj -208 0 obj<>endobj -209 0 obj<>endobj -210 0 obj<>endobj -211 0 obj<>endobj -212 0 obj<>endobj -213 0 obj<>endobj -214 0 obj<>endobj -215 0 obj<>endobj -216 0 obj<>endobj -217 0 obj<>endobj -218 0 obj<>endobj -219 0 obj<>endobj -220 0 obj<>endobj -221 0 obj<>endobj -222 0 obj<>endobj -223 0 obj<>endobj -224 0 obj<>endobj -225 0 obj<>endobj -226 0 obj<>endobj -227 0 obj<>endobj -228 0 obj[186 0 R +184 0 R +185 0 R +186 0 R 187 0 R 188 0 R -189 0 R -190 0 R -191 0 R +189 0 R]endobj +191 0 obj<>endobj +192 0 obj<>endobj +193 0 obj<>endobj +194 0 obj<>endobj +195 0 obj<>endobj +196 0 obj<>endobj +197 0 obj<>endobj +198 0 obj<>endobj +199 0 obj<>endobj +200 0 obj<>endobj +201 0 obj<>endobj +202 0 obj<>endobj +203 0 obj<>endobj +204 0 obj<>endobj +205 0 obj<>endobj +206 0 obj<>endobj +207 0 obj<>endobj +208 0 obj<>endobj +209 0 obj<>endobj +210 0 obj<>endobj +211 0 obj<>endobj +212 0 obj<>endobj +213 0 obj<>endobj +214 0 obj<>endobj +215 0 obj<>endobj +216 0 obj<>endobj +217 0 obj<>endobj +218 0 obj<>endobj +219 0 obj<>endobj +220 0 obj<>endobj +221 0 obj<>endobj +222 0 obj<>endobj +223 0 obj<>endobj +224 0 obj<>endobj +225 0 obj<>endobj +226 0 obj<>endobj +227 0 obj<>endobj +228 0 obj<>endobj +229 0 obj<>endobj +230 0 obj<>endobj +231 0 obj<>endobj +232 0 obj<>endobj +233 0 obj<>endobj +234 0 obj[191 0 R 192 0 R 193 0 R 194 0 R @@ -432,55 +440,57 @@ 224 0 R 225 0 R 226 0 R -227 0 R]endobj -229 0 obj<>endobj -230 0 obj<>endobj -231 0 obj<>endobj -232 0 obj<>endobj -233 0 obj<>endobj -234 0 obj<>endobj -235 0 obj<>endobj -236 0 obj<>endobj -237 0 obj<>endobj -238 0 obj<>endobj -239 0 obj<>endobj -240 0 obj<>endobj -241 0 obj<>endobj -242 0 obj<>endobj -243 0 obj<>endobj -244 0 obj<>endobj -245 0 obj<>endobj -246 0 obj<>endobj -247 0 obj<>endobj -248 0 obj<>endobj -249 0 obj<>endobj -250 0 obj<>endobj -251 0 obj<>endobj -252 0 obj<>endobj -253 0 obj<>endobj -254 0 obj<>endobj -255 0 obj<>endobj -256 0 obj<>endobj -257 0 obj<>endobj -258 0 obj<>endobj -259 0 obj<>endobj -260 0 obj<>endobj -261 0 obj<>endobj -262 0 obj<>endobj -263 0 obj<>endobj -264 0 obj<>endobj -265 0 obj<>endobj -266 0 obj<>endobj -267 0 obj<>endobj -268 0 obj<>endobj -269 0 obj<>endobj -270 0 obj[229 0 R +227 0 R +228 0 R +229 0 R 230 0 R 231 0 R 232 0 R -233 0 R -234 0 R -235 0 R +233 0 R]endobj +235 0 obj<>endobj +236 0 obj<>endobj +237 0 obj<>endobj +238 0 obj<>endobj +239 0 obj<>endobj +240 0 obj<>endobj +241 0 obj<>endobj +242 0 obj<>endobj +243 0 obj<>endobj +244 0 obj<>endobj +245 0 obj<>endobj +246 0 obj<>endobj +247 0 obj<>endobj +248 0 obj<>endobj +249 0 obj<>endobj +250 0 obj<>endobj +251 0 obj<>endobj +252 0 obj<>endobj +253 0 obj<>endobj +254 0 obj<>endobj +255 0 obj<>endobj +256 0 obj<>endobj +257 0 obj<>endobj +258 0 obj<>endobj +259 0 obj<>endobj +260 0 obj<>endobj +261 0 obj<>endobj +262 0 obj<>endobj +263 0 obj<>endobj +264 0 obj<>endobj +265 0 obj<>endobj +266 0 obj<>endobj +267 0 obj<>endobj +268 0 obj<>endobj +269 0 obj<>endobj +270 0 obj<>endobj +271 0 obj<>endobj +272 0 obj<>endobj +273 0 obj<>endobj +274 0 obj<>endobj +275 0 obj<>endobj +276 0 obj<>endobj +277 0 obj<>endobj +278 0 obj[235 0 R 236 0 R 237 0 R 238 0 R @@ -514,93 +524,96 @@ 266 0 R 267 0 R 268 0 R -269 0 R]endobj -271 0 obj<>endobj -272 0 obj<>endobj -273 0 obj<>endobj -274 0 obj<>endobj -275 0 obj<>endobj -276 0 obj<>endobj -277 0 obj<>endobj -278 0 obj<>endobj -279 0 obj<>endobj -280 0 obj<>endobj -281 0 obj<>endobj -282 0 obj<>endobj -283 0 obj<>endobj -284 0 obj<>endobj -285 0 obj<>endobj -286 0 obj<>endobj -287 0 obj[271 0 R +269 0 R +270 0 R +271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R -277 0 R -278 0 R -279 0 R +277 0 R]endobj +279 0 obj<>endobj +280 0 obj<>endobj +281 0 obj<>endobj +282 0 obj<>endobj +283 0 obj<>endobj +284 0 obj<>endobj +285 0 obj<>endobj +286 0 obj<>endobj +287 0 obj<>endobj +288 0 obj<>endobj +289 0 obj<>endobj +290 0 obj<>endobj +291 0 obj<>endobj +292 0 obj<>endobj +293 0 obj<>endobj +294 0 obj<>endobj +295 0 obj<>endobj +296 0 obj<>endobj +297 0 obj[279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R -286 0 R]endobj -288 0 obj<>endobj -289 0 obj<>endobj -290 0 obj<>endobj -291 0 obj<>endobj -292 0 obj<>endobj -293 0 obj<>endobj -294 0 obj<>endobj -295 0 obj<>endobj -296 0 obj<>endobj -297 0 obj<>endobj -298 0 obj<>endobj -299 0 obj<>endobj -300 0 obj<>endobj -301 0 obj<>endobj -302 0 obj<>endobj -303 0 obj<>endobj -304 0 obj<>endobj -305 0 obj<>endobj -306 0 obj<>endobj -307 0 obj<>endobj -308 0 obj<>endobj -309 0 obj<>endobj -310 0 obj<>endobj -311 0 obj<>endobj -312 0 obj<>endobj -313 0 obj<>endobj -314 0 obj<>endobj -315 0 obj<>endobj -316 0 obj<>endobj -317 0 obj<>endobj -318 0 obj<>endobj -319 0 obj<>endobj -320 0 obj<>endobj -321 0 obj<>endobj -322 0 obj<>endobj -323 0 obj<>endobj -324 0 obj<>endobj -325 0 obj<>endobj -326 0 obj<>endobj -327 0 obj<>endobj -328 0 obj[289 0 R +286 0 R +287 0 R +288 0 R +289 0 R +290 0 R 291 0 R +292 0 R 293 0 R 294 0 R 295 0 R -296 0 R -297 0 R -298 0 R -299 0 R -300 0 R +296 0 R]endobj +298 0 obj<>endobj +299 0 obj<>endobj +300 0 obj<>endobj +301 0 obj<>endobj +302 0 obj<>endobj +303 0 obj<>endobj +304 0 obj<>endobj +305 0 obj<>endobj +306 0 obj<>endobj +307 0 obj<>endobj +308 0 obj<>endobj +309 0 obj<>endobj +310 0 obj<>endobj +311 0 obj<>endobj +312 0 obj<>endobj +313 0 obj<>endobj +314 0 obj<>endobj +315 0 obj<>endobj +316 0 obj<>endobj +317 0 obj<>endobj +318 0 obj<>endobj +319 0 obj<>endobj +320 0 obj<>endobj +321 0 obj<>endobj +322 0 obj<>endobj +323 0 obj<>endobj +324 0 obj<>endobj +325 0 obj<>endobj +326 0 obj<>endobj +327 0 obj<>endobj +328 0 obj<>endobj +329 0 obj<>endobj +330 0 obj<>endobj +331 0 obj<>endobj +332 0 obj<>endobj +333 0 obj<>endobj +334 0 obj<>endobj +335 0 obj<>endobj +336 0 obj<>endobj +337 0 obj<>endobj +338 0 obj<>endobj +339 0 obj<>endobj +340 0 obj[299 0 R 301 0 R -302 0 R 303 0 R -304 0 R 305 0 R 306 0 R 307 0 R @@ -623,59 +636,9 @@ 324 0 R 325 0 R 326 0 R -327 0 R]endobj -329 0 obj<>endobj -330 0 obj<>endobj -331 0 obj<>endobj -332 0 obj<>endobj -333 0 obj<>endobj -334 0 obj<>endobj -335 0 obj<>endobj -336 0 obj<>endobj -337 0 obj<>endobj -338 0 obj<>endobj -339 0 obj<>endobj -340 0 obj<>endobj -341 0 obj<>endobj -342 0 obj<>endobj -343 0 obj<>endobj -344 0 obj<>endobj -345 0 obj<>endobj -346 0 obj<>endobj -347 0 obj<>endobj -348 0 obj<>endobj -349 0 obj<>endobj -350 0 obj<>endobj -351 0 obj<>endobj -352 0 obj<>endobj -353 0 obj<>endobj -354 0 obj<>endobj -355 0 obj<>endobj -356 0 obj<>endobj -357 0 obj<>endobj -358 0 obj<>endobj -359 0 obj<>endobj -360 0 obj<>endobj -361 0 obj<>endobj -362 0 obj<>endobj -363 0 obj<>endobj -364 0 obj<>endobj -365 0 obj<>endobj -366 0 obj<>endobj -367 0 obj<>endobj -368 0 obj<>endobj -369 0 obj<>endobj -370 0 obj<>endobj -371 0 obj<>endobj -372 0 obj<>endobj -373 0 obj<>endobj -374 0 obj<>endobj -375 0 obj<>endobj -376 0 obj<>endobj -377 0 obj<>endobj -378 0 obj<>endobj -379 0 obj<>endobj -380 0 obj[329 0 R +327 0 R +328 0 R +329 0 R 330 0 R 331 0 R 332 0 R @@ -685,9 +648,59 @@ 336 0 R 337 0 R 338 0 R -339 0 R -340 0 R -341 0 R +339 0 R]endobj +341 0 obj<>endobj +342 0 obj<>endobj +343 0 obj<>endobj +344 0 obj<>endobj +345 0 obj<>endobj +346 0 obj<>endobj +347 0 obj<>endobj +348 0 obj<>endobj +349 0 obj<>endobj +350 0 obj<>endobj +351 0 obj<>endobj +352 0 obj<>endobj +353 0 obj<>endobj +354 0 obj<>endobj +355 0 obj<>endobj +356 0 obj<>endobj +357 0 obj<>endobj +358 0 obj<>endobj +359 0 obj<>endobj +360 0 obj<>endobj +361 0 obj<>endobj +362 0 obj<>endobj +363 0 obj<>endobj +364 0 obj<>endobj +365 0 obj<>endobj +366 0 obj<>endobj +367 0 obj<>endobj +368 0 obj<>endobj +369 0 obj<>endobj +370 0 obj<>endobj +371 0 obj<>endobj +372 0 obj<>endobj +373 0 obj<>endobj +374 0 obj<>endobj +375 0 obj<>endobj +376 0 obj<>endobj +377 0 obj<>endobj +378 0 obj<>endobj +379 0 obj<>endobj +380 0 obj<>endobj +381 0 obj<>endobj +382 0 obj<>endobj +383 0 obj<>endobj +384 0 obj<>endobj +385 0 obj<>endobj +386 0 obj<>endobj +387 0 obj<>endobj +388 0 obj<>endobj +389 0 obj<>endobj +390 0 obj<>endobj +391 0 obj<>endobj +392 0 obj[341 0 R 342 0 R 343 0 R 344 0 R @@ -725,59 +738,9 @@ 376 0 R 377 0 R 378 0 R -379 0 R]endobj -381 0 obj<>endobj -382 0 obj<>endobj -383 0 obj<>endobj -384 0 obj<>endobj -385 0 obj<>endobj -386 0 obj<>endobj -387 0 obj<>endobj -388 0 obj<>endobj -389 0 obj<>endobj -390 0 obj<>endobj -391 0 obj<>endobj -392 0 obj<>endobj -393 0 obj<>endobj -394 0 obj<>endobj -395 0 obj<>endobj -396 0 obj<>endobj -397 0 obj<>endobj -398 0 obj<>endobj -399 0 obj<>endobj -400 0 obj<>endobj -401 0 obj<>endobj -402 0 obj<>endobj -403 0 obj<>endobj -404 0 obj<>endobj -405 0 obj<>endobj -406 0 obj<>endobj -407 0 obj<>endobj -408 0 obj<>endobj -409 0 obj<>endobj -410 0 obj<>endobj -411 0 obj<>endobj -412 0 obj<>endobj -413 0 obj<>endobj -414 0 obj<>endobj -415 0 obj<>endobj -416 0 obj<>endobj -417 0 obj<>endobj -418 0 obj<>endobj -419 0 obj<>endobj -420 0 obj<>endobj -421 0 obj<>endobj -422 0 obj<>endobj -423 0 obj<>endobj -424 0 obj<>endobj -425 0 obj<>endobj -426 0 obj<>endobj -427 0 obj<>endobj -428 0 obj<>endobj -429 0 obj<>endobj -430 0 obj<>endobj -431 0 obj<>endobj -432 0 obj[381 0 R +379 0 R +380 0 R +381 0 R 382 0 R 383 0 R 384 0 R @@ -787,9 +750,59 @@ 388 0 R 389 0 R 390 0 R -391 0 R -392 0 R -393 0 R +391 0 R]endobj +393 0 obj<>endobj +394 0 obj<>endobj +395 0 obj<>endobj +396 0 obj<>endobj +397 0 obj<>endobj +398 0 obj<>endobj +399 0 obj<>endobj +400 0 obj<>endobj +401 0 obj<>endobj +402 0 obj<>endobj +403 0 obj<>endobj +404 0 obj<>endobj +405 0 obj<>endobj +406 0 obj<>endobj +407 0 obj<>endobj +408 0 obj<>endobj +409 0 obj<>endobj +410 0 obj<>endobj +411 0 obj<>endobj +412 0 obj<>endobj +413 0 obj<>endobj +414 0 obj<>endobj +415 0 obj<>endobj +416 0 obj<>endobj +417 0 obj<>endobj +418 0 obj<>endobj +419 0 obj<>endobj +420 0 obj<>endobj +421 0 obj<>endobj +422 0 obj<>endobj +423 0 obj<>endobj +424 0 obj<>endobj +425 0 obj<>endobj +426 0 obj<>endobj +427 0 obj<>endobj +428 0 obj<>endobj +429 0 obj<>endobj +430 0 obj<>endobj +431 0 obj<>endobj +432 0 obj<>endobj +433 0 obj<>endobj +434 0 obj<>endobj +435 0 obj<>endobj +436 0 obj<>endobj +437 0 obj<>endobj +438 0 obj<>endobj +439 0 obj<>endobj +440 0 obj<>endobj +441 0 obj<>endobj +442 0 obj<>endobj +443 0 obj<>endobj +444 0 obj[393 0 R 394 0 R 395 0 R 396 0 R @@ -827,43 +840,9 @@ 428 0 R 429 0 R 430 0 R -431 0 R]endobj -433 0 obj<>endobj -434 0 obj<>endobj -435 0 obj<>endobj -436 0 obj<>endobj -437 0 obj<>endobj -438 0 obj<>endobj -439 0 obj<>endobj -440 0 obj<>endobj -441 0 obj<>endobj -442 0 obj<>endobj -443 0 obj<>endobj -444 0 obj<>endobj -445 0 obj<>endobj -446 0 obj<>endobj -447 0 obj<>endobj -448 0 obj<>endobj -449 0 obj<>endobj -450 0 obj<>endobj -451 0 obj<>endobj -452 0 obj<>endobj -453 0 obj<>endobj -454 0 obj<>endobj -455 0 obj<>endobj -456 0 obj<>endobj -457 0 obj<>endobj -458 0 obj<>endobj -459 0 obj<>endobj -460 0 obj<>endobj -461 0 obj<>endobj -462 0 obj<>endobj -463 0 obj<>endobj -464 0 obj<>endobj -465 0 obj<>endobj -466 0 obj<>endobj -467 0 obj<>endobj -468 0 obj[433 0 R +431 0 R +432 0 R +433 0 R 434 0 R 435 0 R 436 0 R @@ -873,9 +852,26 @@ 440 0 R 441 0 R 442 0 R -443 0 R -444 0 R -445 0 R +443 0 R]endobj +445 0 obj<>endobj +446 0 obj<>endobj +447 0 obj<>endobj +448 0 obj<>endobj +449 0 obj<>endobj +450 0 obj<>endobj +451 0 obj<>endobj +452 0 obj<>endobj +453 0 obj<>endobj +454 0 obj<>endobj +455 0 obj<>endobj +456 0 obj<>endobj +457 0 obj<>endobj +458 0 obj<>endobj +459 0 obj<>endobj +460 0 obj<>endobj +461 0 obj<>endobj +462 0 obj<>endobj +463 0 obj[445 0 R 446 0 R 447 0 R 448 0 R @@ -892,57 +888,57 @@ 459 0 R 460 0 R 461 0 R -462 0 R -463 0 R -464 0 R +462 0 R]endobj +464 0 obj<>endobj +465 0 obj<>endobj +466 0 obj<>endobj +467 0 obj<>endobj +468 0 obj<>endobj +469 0 obj<>endobj +470 0 obj<>endobj +471 0 obj<>endobj +472 0 obj<>endobj +473 0 obj<>endobj +474 0 obj<>endobj +475 0 obj<>endobj +476 0 obj<>endobj +477 0 obj<>endobj +478 0 obj<>endobj +479 0 obj<>endobj +480 0 obj<>endobj +481 0 obj<>endobj +482 0 obj<>endobj +483 0 obj<>endobj +484 0 obj<>endobj +485 0 obj<>endobj +486 0 obj<>endobj +487 0 obj<>endobj +488 0 obj<>endobj +489 0 obj<>endobj +490 0 obj<>endobj +491 0 obj<>endobj +492 0 obj<>endobj +493 0 obj<>endobj +494 0 obj<>endobj +495 0 obj<>endobj +496 0 obj<>endobj +497 0 obj<>endobj +498 0 obj<>endobj +499 0 obj<>endobj +500 0 obj<>endobj +501 0 obj<>endobj +502 0 obj<>endobj +503 0 obj<>endobj +504 0 obj<>endobj +505 0 obj<>endobj +506 0 obj<>endobj +507 0 obj<>endobj +508 0 obj[464 0 R 465 0 R 466 0 R -467 0 R]endobj -469 0 obj<>endobj -470 0 obj<>endobj -471 0 obj<>endobj -472 0 obj<>endobj -473 0 obj<>endobj -474 0 obj<>endobj -475 0 obj<>endobj -476 0 obj<>endobj -477 0 obj<>endobj -478 0 obj<>endobj -479 0 obj<>endobj -480 0 obj<>endobj -481 0 obj<>endobj -482 0 obj<>endobj -483 0 obj<>endobj -484 0 obj<>endobj -485 0 obj<>endobj -486 0 obj<>endobj -487 0 obj<>endobj -488 0 obj<>endobj -489 0 obj<>endobj -490 0 obj<>endobj -491 0 obj<>endobj -492 0 obj<>endobj -493 0 obj<>endobj -494 0 obj<>endobj -495 0 obj<>endobj -496 0 obj<>endobj -497 0 obj<>endobj -498 0 obj<>endobj -499 0 obj<>endobj -500 0 obj<>endobj -501 0 obj<>endobj -502 0 obj<>endobj -503 0 obj<>endobj -504 0 obj<>endobj -505 0 obj<>endobj -506 0 obj<>endobj -507 0 obj<>endobj -508 0 obj<>endobj -509 0 obj<>endobj -510 0 obj<>endobj -511 0 obj<>endobj -512 0 obj<>endobj -513 0 obj[469 0 R +467 0 R +468 0 R +469 0 R 470 0 R 471 0 R 472 0 R @@ -980,413 +976,384 @@ 504 0 R 505 0 R 506 0 R -507 0 R -508 0 R -509 0 R +507 0 R]endobj +509 0 obj<>endobj +510 0 obj<>endobj +511 0 obj<>endobj +512 0 obj<>endobj +513 0 obj<>endobj +514 0 obj<>endobj +515 0 obj<>endobj +516 0 obj<>endobj +517 0 obj<>endobj +518 0 obj[509 0 R 510 0 R 511 0 R -512 0 R]endobj -514 0 obj<>endobj -515 0 obj<>endobj -516 0 obj<>endobj -517 0 obj[514 0 R +512 0 R +513 0 R +514 0 R 515 0 R -516 0 R]endobj -518 0 obj<>endobj -519 0 obj<>endobj -520 0 obj[519 0 R]endobj -521 0 obj<>endobj -522 0 obj<>endobj -523 0 obj[522 0 R]endobj -524 0 obj<>endobj -525 0 obj<>endobj -526 0 obj<>endobj -527 0 obj<>endobj -528 0 obj<>endobj -529 0 obj<>endobj -530 0 obj<>endobj -531 0 obj<>endobj -532 0 obj<>endobj -533 0 obj<>endobj -534 0 obj<>endobj -535 0 obj<>endobj -536 0 obj<>endobj -537 0 obj<>endobj -538 0 obj<>endobj -539 0 obj<>endobj -540 0 obj<>endobj -541 0 obj<>endobj -542 0 obj<>endobj -543 0 obj<>endobj -544 0 obj<>endobj -545 0 obj<>endobj -546 0 obj<>endobj -547 0 obj<>endobj -548 0 obj<>endobj -549 0 obj<>endobj -550 0 obj<>endobj -551 0 obj<>endobj -552 0 obj<>endobj -553 0 obj<>endobj -554 0 obj<>endobj -555 0 obj<>endobj -556 0 obj<>endobj -557 0 obj<>endobj -558 0 obj<>endobj -559 0 obj<>endobj -560 0 obj<>endobj -561 0 obj<>endobj -562 0 obj[524 0 R -525 0 R -526 0 R -527 0 R +516 0 R +517 0 R]endobj +519 0 obj<>endobj +520 0 obj<>endobj +521 0 obj[520 0 R]endobj +522 0 obj<>endobj +523 0 obj<>endobj +524 0 obj[523 0 R]endobj +525 0 obj<>endobj +526 0 obj<>endobj +527 0 obj<>endobj +528 0 obj<>endobj +529 0 obj<>endobj +530 0 obj<>endobj +531 0 obj<>endobj +532 0 obj<>endobj +533 0 obj<>endobj +534 0 obj<>endobj +535 0 obj<>endobj +536 0 obj<>endobj +537 0 obj[526 0 R 528 0 R -529 0 R 530 0 R -531 0 R 532 0 R -533 0 R 534 0 R -535 0 R -536 0 R -537 0 R -538 0 R -539 0 R -540 0 R +536 0 R]endobj +538 0 obj<>endobj +539 0 obj<>endobj +540 0 obj<>endobj +541 0 obj<>endobj +542 0 obj<>endobj +543 0 obj<>endobj +544 0 obj[539 0 R 541 0 R -542 0 R -543 0 R -544 0 R -545 0 R -546 0 R -547 0 R -548 0 R -549 0 R -550 0 R +543 0 R]endobj +545 0 obj<>endobj +546 0 obj<>endobj +547 0 obj[546 0 R]endobj +548 0 obj<>endobj +549 0 obj<>endobj +550 0 obj<>endobj +551 0 obj<>endobj +552 0 obj<>endobj +553 0 obj<>endobj +554 0 obj<>endobj +555 0 obj<>endobj +556 0 obj<>endobj +557 0 obj<>endobj +558 0 obj<>endobj +559 0 obj<>endobj +560 0 obj<>endobj +561 0 obj<>endobj +562 0 obj[549 0 R 551 0 R -552 0 R 553 0 R -554 0 R 555 0 R -556 0 R 557 0 R -558 0 R 559 0 R -560 0 R 561 0 R]endobj -563 0 obj<>endobj -564 0 obj<>endobj -565 0 obj<>endobj -566 0 obj<>endobj -567 0 obj<>endobj -568 0 obj<>endobj -569 0 obj<>endobj -570 0 obj<>endobj -571 0 obj[564 0 R -566 0 R -568 0 R -570 0 R]endobj -572 0 obj<>endobj -573 0 obj<>endobj -574 0 obj<>endobj -575 0 obj<>endobj -576 0 obj<>endobj -577 0 obj<>endobj -578 0 obj<>endobj -579 0 obj<>endobj -580 0 obj<>endobj -581 0 obj<>endobj -582 0 obj<>endobj -583 0 obj<>endobj -584 0 obj<>endobj -585 0 obj<>endobj -586 0 obj<>endobj -587 0 obj<>endobj -588 0 obj<>endobj -589 0 obj<>endobj -590 0 obj<>endobj -591 0 obj<>endobj -592 0 obj<>endobj -593 0 obj<>endobj -594 0 obj<>endobj -595 0 obj<>endobj -596 0 obj<>endobj -597 0 obj<>endobj -598 0 obj<>endobj -599 0 obj<>endobj -600 0 obj<>endobj -601 0 obj<>endobj -602 0 obj<>endobj -603 0 obj<>endobj -604 0 obj<>endobj -605 0 obj<>endobj -606 0 obj<>endobj -607 0 obj<>endobj -608 0 obj<>endobj -609 0 obj<>endobj -610 0 obj<>endobj -611 0 obj<>endobj -612 0 obj<>endobj -613 0 obj<>endobj -614 0 obj<>endobj -615 0 obj<>endobj -616 0 obj<>endobj -617 0 obj<>endobj -618 0 obj[573 0 R +563 0 obj<>endobj +564 0 obj<>endobj +565 0 obj[564 0 R]endobj +566 0 obj<>endobj +567 0 obj<>endobj +568 0 obj[567 0 R]endobj +569 0 obj<>endobj +570 0 obj<>endobj +571 0 obj<>endobj +572 0 obj<>endobj +573 0 obj<>endobj +574 0 obj<>endobj +575 0 obj<>endobj +576 0 obj<>endobj +577 0 obj<>endobj +578 0 obj<>endobj +579 0 obj<>endobj +580 0 obj<>endobj +581 0 obj<>endobj +582 0 obj<>endobj +583 0 obj<>endobj +584 0 obj<>endobj +585 0 obj<>endobj +586 0 obj<>endobj +587 0 obj<>endobj +588 0 obj<>endobj +589 0 obj<>endobj +590 0 obj<>endobj +591 0 obj<>endobj +592 0 obj<>endobj +593 0 obj<>endobj +594 0 obj<>endobj +595 0 obj<>endobj +596 0 obj<>endobj +597 0 obj<>endobj +598 0 obj<>endobj +599 0 obj<>endobj +600 0 obj<>endobj +601 0 obj<>endobj +602 0 obj<>endobj +603 0 obj<>endobj +604 0 obj<>endobj +605 0 obj<>endobj +606 0 obj<>endobj +607 0 obj<>endobj +608 0 obj<>endobj +609 0 obj[569 0 R +570 0 R +571 0 R +572 0 R +573 0 R +574 0 R 575 0 R +576 0 R 577 0 R +578 0 R 579 0 R +580 0 R 581 0 R +582 0 R 583 0 R +584 0 R 585 0 R +586 0 R 587 0 R +588 0 R 589 0 R +590 0 R 591 0 R +592 0 R 593 0 R +594 0 R 595 0 R +596 0 R 597 0 R +598 0 R 599 0 R +600 0 R 601 0 R +602 0 R 603 0 R +604 0 R 605 0 R +606 0 R 607 0 R -609 0 R -611 0 R +608 0 R]endobj +610 0 obj<>endobj +611 0 obj<>endobj +612 0 obj<>endobj +613 0 obj<>endobj +614 0 obj<>endobj +615 0 obj<>endobj +616 0 obj<>endobj +617 0 obj<>endobj +618 0 obj[611 0 R 613 0 R 615 0 R 617 0 R]endobj -619 0 obj<>endobj -620 0 obj<>endobj -621 0 obj<>endobj -622 0 obj<>endobj -623 0 obj[620 0 R -622 0 R]endobj -624 0 obj<>endobj -625 0 obj<>endobj -626 0 obj<>endobj -627 0 obj<>endobj -628 0 obj[625 0 R -627 0 R]endobj -629 0 obj<>endobj -630 0 obj<>endobj -631 0 obj<>endobj -632 0 obj<>endobj -633 0 obj<>endobj -634 0 obj<>endobj -635 0 obj[630 0 R +619 0 obj<>endobj +620 0 obj<>endobj +621 0 obj<>endobj +622 0 obj<>endobj +623 0 obj<>endobj +624 0 obj<>endobj +625 0 obj<>endobj +626 0 obj<>endobj +627 0 obj<>endobj +628 0 obj<>endobj +629 0 obj<>endobj +630 0 obj<>endobj +631 0 obj<>endobj +632 0 obj<>endobj +633 0 obj<>endobj +634 0 obj<>endobj +635 0 obj<>endobj +636 0 obj<>endobj +637 0 obj<>endobj +638 0 obj<>endobj +639 0 obj<>endobj +640 0 obj<>endobj +641 0 obj<>endobj +642 0 obj<>endobj +643 0 obj<>endobj +644 0 obj<>endobj +645 0 obj<>endobj +646 0 obj<>endobj +647 0 obj<>endobj +648 0 obj<>endobj +649 0 obj<>endobj +650 0 obj<>endobj +651 0 obj<>endobj +652 0 obj<>endobj +653 0 obj<>endobj +654 0 obj<>endobj +655 0 obj<>endobj +656 0 obj<>endobj +657 0 obj<>endobj +658 0 obj<>endobj +659 0 obj<>endobj +660 0 obj<>endobj +661 0 obj<>endobj +662 0 obj<>endobj +663 0 obj<>endobj +664 0 obj<>endobj +665 0 obj[620 0 R +622 0 R +624 0 R +626 0 R +628 0 R +630 0 R 632 0 R -634 0 R]endobj -636 0 obj<>endobj -637 0 obj<>endobj -638 0 obj<>endobj -639 0 obj<>endobj -640 0 obj[637 0 R -639 0 R]endobj -641 0 obj<>endobj -642 0 obj<>endobj -643 0 obj<>endobj -644 0 obj<>endobj -645 0 obj<>endobj -646 0 obj<>endobj -647 0 obj<>endobj -648 0 obj<>endobj -649 0 obj<>endobj -650 0 obj<>endobj -651 0 obj<>endobj -652 0 obj<>endobj -653 0 obj<>endobj -654 0 obj<>endobj -655 0 obj<>endobj -656 0 obj<>endobj -657 0 obj[642 0 R +634 0 R +636 0 R +638 0 R +640 0 R +642 0 R 644 0 R 646 0 R 648 0 R 650 0 R 652 0 R 654 0 R -656 0 R]endobj -658 0 obj<>endobj -659 0 obj<>endobj -660 0 obj<>endobj -661 0 obj<>endobj -662 0 obj[659 0 R -661 0 R]endobj -663 0 obj<>endobj -664 0 obj<>endobj -665 0 obj[664 0 R]endobj -666 0 obj<>endobj -667 0 obj<>endobj -668 0 obj<>endobj -669 0 obj<>endobj -670 0 obj<>endobj -671 0 obj<>endobj -672 0 obj[667 0 R -669 0 R -671 0 R]endobj -673 0 obj<>endobj -674 0 obj<>endobj -675 0 obj<>endobj -676 0 obj<>endobj -677 0 obj<>endobj -678 0 obj<>endobj -679 0 obj<>endobj -680 0 obj<>endobj -681 0 obj[674 0 R -676 0 R -678 0 R -680 0 R]endobj -682 0 obj<>endobj -683 0 obj<>endobj -684 0 obj<>endobj -685 0 obj<>endobj -686 0 obj<>endobj -687 0 obj<>endobj -688 0 obj[683 0 R -685 0 R -687 0 R]endobj -689 0 obj<>endobj -690 0 obj<>endobj -691 0 obj<>endobj -692 0 obj<>endobj -693 0 obj<>endobj -694 0 obj<>endobj -695 0 obj<>endobj -696 0 obj<>endobj -697 0 obj<>endobj -698 0 obj<>endobj -699 0 obj<>endobj -700 0 obj<>endobj -701 0 obj<>endobj -702 0 obj<>endobj -703 0 obj<>endobj -704 0 obj<>endobj -705 0 obj<>endobj -706 0 obj<>endobj -707 0 obj<>endobj -708 0 obj<>endobj -709 0 obj<>endobj -710 0 obj<>endobj -711 0 obj<>endobj -712 0 obj<>endobj -713 0 obj<>endobj -714 0 obj<>endobj -715 0 obj<>endobj -716 0 obj<>endobj -717 0 obj<>endobj -718 0 obj<>endobj -719 0 obj<>endobj -720 0 obj<>endobj -721 0 obj<>endobj -722 0 obj<>endobj -723 0 obj<>endobj -724 0 obj<>endobj -725 0 obj<>endobj -726 0 obj<>endobj -727 0 obj<>endobj -728 0 obj<>endobj -729 0 obj<>endobj -730 0 obj<>endobj -731 0 obj<>endobj -732 0 obj<>endobj -733 0 obj[689 0 R -690 0 R +656 0 R +658 0 R +660 0 R +662 0 R +664 0 R]endobj +666 0 obj<>endobj +667 0 obj<>endobj +668 0 obj<>endobj +669 0 obj<>endobj +670 0 obj[667 0 R +669 0 R]endobj +671 0 obj<>endobj +672 0 obj<>endobj +673 0 obj<>endobj +674 0 obj<>endobj +675 0 obj[672 0 R +674 0 R]endobj +676 0 obj<>endobj +677 0 obj<>endobj +678 0 obj<>endobj +679 0 obj<>endobj +680 0 obj<>endobj +681 0 obj<>endobj +682 0 obj[677 0 R +679 0 R +681 0 R]endobj +683 0 obj<>endobj +684 0 obj<>endobj +685 0 obj<>endobj +686 0 obj<>endobj +687 0 obj[684 0 R +686 0 R]endobj +688 0 obj<>endobj +689 0 obj<>endobj +690 0 obj<>endobj +691 0 obj<>endobj +692 0 obj<>endobj +693 0 obj<>endobj +694 0 obj<>endobj +695 0 obj<>endobj +696 0 obj<>endobj +697 0 obj<>endobj +698 0 obj<>endobj +699 0 obj<>endobj +700 0 obj<>endobj +701 0 obj<>endobj +702 0 obj<>endobj +703 0 obj<>endobj +704 0 obj[689 0 R 691 0 R -692 0 R 693 0 R -694 0 R 695 0 R -696 0 R 697 0 R -698 0 R 699 0 R -700 0 R 701 0 R -702 0 R -703 0 R -704 0 R -705 0 R -706 0 R -707 0 R -708 0 R -709 0 R -710 0 R -711 0 R -712 0 R -713 0 R -714 0 R -715 0 R +703 0 R]endobj +705 0 obj<>endobj +706 0 obj<>endobj +707 0 obj<>endobj +708 0 obj<>endobj +709 0 obj[706 0 R +708 0 R]endobj +710 0 obj<>endobj +711 0 obj<>endobj +712 0 obj[711 0 R]endobj +713 0 obj<>endobj +714 0 obj<>endobj +715 0 obj<>endobj +716 0 obj<>endobj +717 0 obj<>endobj +718 0 obj<>endobj +719 0 obj<>endobj +720 0 obj<>endobj +721 0 obj<>endobj +722 0 obj<>endobj +723 0 obj[714 0 R 716 0 R -717 0 R 718 0 R -719 0 R 720 0 R -721 0 R -722 0 R -723 0 R -724 0 R -725 0 R -726 0 R +722 0 R]endobj +724 0 obj<>endobj +725 0 obj<>endobj +726 0 obj<>endobj +727 0 obj<>endobj +728 0 obj<>endobj +729 0 obj<>endobj +730 0 obj[725 0 R 727 0 R -728 0 R -729 0 R -730 0 R -731 0 R -732 0 R]endobj -734 0 obj<>endobj -735 0 obj<>endobj -736 0 obj<>endobj -737 0 obj<>endobj -738 0 obj<>endobj -739 0 obj<>endobj -740 0 obj<>endobj -741 0 obj<>endobj -742 0 obj<>endobj -743 0 obj<>endobj -744 0 obj<>endobj -745 0 obj<>endobj -746 0 obj<>endobj -747 0 obj<>endobj -748 0 obj<>endobj -749 0 obj<>endobj -750 0 obj<>endobj -751 0 obj<>endobj -752 0 obj<>endobj -753 0 obj<>endobj -754 0 obj<>endobj -755 0 obj<>endobj -756 0 obj<>endobj -757 0 obj<>endobj -758 0 obj<>endobj -759 0 obj<>endobj -760 0 obj<>endobj -761 0 obj<>endobj -762 0 obj<>endobj -763 0 obj<>endobj -764 0 obj<>endobj -765 0 obj<>endobj -766 0 obj<>endobj -767 0 obj<>endobj -768 0 obj<>endobj -769 0 obj<>endobj -770 0 obj<>endobj -771 0 obj<>endobj -772 0 obj<>endobj -773 0 obj<>endobj -774 0 obj<>endobj -775 0 obj<>endobj -776 0 obj<>endobj -777 0 obj<>endobj -778 0 obj<>endobj -779 0 obj<>endobj -780 0 obj<>endobj -781 0 obj<>endobj -782 0 obj<>endobj -783 0 obj<>endobj -784 0 obj<>endobj -785 0 obj[734 0 R -735 0 R -736 0 R +729 0 R]endobj +731 0 obj<>endobj +732 0 obj<>endobj +733 0 obj<>endobj +734 0 obj<>endobj +735 0 obj[732 0 R +734 0 R]endobj +736 0 obj<>endobj +737 0 obj<>endobj +738 0 obj<>endobj +739 0 obj<>endobj +740 0 obj<>endobj +741 0 obj<>endobj +742 0 obj<>endobj +743 0 obj<>endobj +744 0 obj<>endobj +745 0 obj<>endobj +746 0 obj<>endobj +747 0 obj<>endobj +748 0 obj<>endobj +749 0 obj<>endobj +750 0 obj<>endobj +751 0 obj<>endobj +752 0 obj<>endobj +753 0 obj<>endobj +754 0 obj<>endobj +755 0 obj<>endobj +756 0 obj<>endobj +757 0 obj<>endobj +758 0 obj<>endobj +759 0 obj<>endobj +760 0 obj<>endobj +761 0 obj<>endobj +762 0 obj<>endobj +763 0 obj<>endobj +764 0 obj<>endobj +765 0 obj<>endobj +766 0 obj<>endobj +767 0 obj<>endobj +768 0 obj<>endobj +769 0 obj<>endobj +770 0 obj<>endobj +771 0 obj<>endobj +772 0 obj<>endobj +773 0 obj<>endobj +774 0 obj<>endobj +775 0 obj<>endobj +776 0 obj<>endobj +777 0 obj<>endobj +778 0 obj<>endobj +779 0 obj<>endobj +780 0 obj[736 0 R 737 0 R 738 0 R 739 0 R @@ -1429,45 +1396,64 @@ 776 0 R 777 0 R 778 0 R -779 0 R -780 0 R -781 0 R +779 0 R]endobj +781 0 obj<>endobj +782 0 obj<>endobj +783 0 obj<>endobj +784 0 obj<>endobj +785 0 obj<>endobj +786 0 obj<>endobj +787 0 obj<>endobj +788 0 obj<>endobj +789 0 obj<>endobj +790 0 obj<>endobj +791 0 obj<>endobj +792 0 obj<>endobj +793 0 obj<>endobj +794 0 obj<>endobj +795 0 obj<>endobj +796 0 obj<>endobj +797 0 obj<>endobj +798 0 obj<>endobj +799 0 obj<>endobj +800 0 obj<>endobj +801 0 obj<>endobj +802 0 obj<>endobj +803 0 obj<>endobj +804 0 obj<>endobj +805 0 obj<>endobj +806 0 obj<>endobj +807 0 obj<>endobj +808 0 obj<>endobj +809 0 obj<>endobj +810 0 obj<>endobj +811 0 obj<>endobj +812 0 obj<>endobj +813 0 obj<>endobj +814 0 obj<>endobj +815 0 obj<>endobj +816 0 obj<>endobj +817 0 obj<>endobj +818 0 obj<>endobj +819 0 obj<>endobj +820 0 obj<>endobj +821 0 obj<>endobj +822 0 obj<>endobj +823 0 obj<>endobj +824 0 obj<>endobj +825 0 obj<>endobj +826 0 obj<>endobj +827 0 obj<>endobj +828 0 obj<>endobj +829 0 obj<>endobj +830 0 obj<>endobj +831 0 obj<>endobj +832 0 obj[781 0 R 782 0 R 783 0 R -784 0 R]endobj -786 0 obj<>endobj -787 0 obj<>endobj -788 0 obj<>endobj -789 0 obj<>endobj -790 0 obj<>endobj -791 0 obj<>endobj -792 0 obj<>endobj -793 0 obj<>endobj -794 0 obj<>endobj -795 0 obj<>endobj -796 0 obj<>endobj -797 0 obj<>endobj -798 0 obj<>endobj -799 0 obj<>endobj -800 0 obj<>endobj -801 0 obj<>endobj -802 0 obj<>endobj -803 0 obj<>endobj -804 0 obj<>endobj -805 0 obj<>endobj -806 0 obj<>endobj -807 0 obj<>endobj -808 0 obj<>endobj -809 0 obj<>endobj -810 0 obj<>endobj -811 0 obj<>endobj -812 0 obj<>endobj -813 0 obj<>endobj -814 0 obj<>endobj -815 0 obj<>endobj -816 0 obj<>endobj -817 0 obj<>endobj -818 0 obj[786 0 R +784 0 R +785 0 R +786 0 R 787 0 R 788 0 R 789 0 R @@ -1498,266 +1484,280 @@ 814 0 R 815 0 R 816 0 R -817 0 R]endobj -819 0 obj<>endobj -820 0 obj<>endobj -821 0 obj<>endobj -822 0 obj<>endobj -823 0 obj<>endobj -824 0 obj<>endobj -825 0 obj[820 0 R +817 0 R +818 0 R +819 0 R +820 0 R +821 0 R 822 0 R -824 0 R]endobj -826 0 obj<>endobj -827 0 obj<>endobj -828 0 obj<>endobj -829 0 obj<>endobj -830 0 obj[827 0 R -829 0 R]endobj -831 0 obj<>endobj -832 0 obj<>endobj -833 0 obj[832 0 R]endobj -834 0 obj<>endobj -835 0 obj<>endobj -836 0 obj<>endobj -837 0 obj<>endobj -838 0 obj<>endobj -839 0 obj<>endobj -840 0 obj<>endobj -841 0 obj<>endobj -842 0 obj<>endobj -843 0 obj<>endobj -844 0 obj<>endobj -845 0 obj<>endobj -846 0 obj[835 0 R +823 0 R +824 0 R +825 0 R +826 0 R +827 0 R +828 0 R +829 0 R +830 0 R +831 0 R]endobj +833 0 obj<>endobj +834 0 obj<>endobj +835 0 obj<>endobj +836 0 obj<>endobj +837 0 obj<>endobj +838 0 obj<>endobj +839 0 obj<>endobj +840 0 obj<>endobj +841 0 obj<>endobj +842 0 obj<>endobj +843 0 obj<>endobj +844 0 obj<>endobj +845 0 obj<>endobj +846 0 obj<>endobj +847 0 obj<>endobj +848 0 obj<>endobj +849 0 obj<>endobj +850 0 obj<>endobj +851 0 obj<>endobj +852 0 obj<>endobj +853 0 obj<>endobj +854 0 obj<>endobj +855 0 obj<>endobj +856 0 obj<>endobj +857 0 obj<>endobj +858 0 obj<>endobj +859 0 obj<>endobj +860 0 obj<>endobj +861 0 obj<>endobj +862 0 obj[833 0 R +834 0 R +835 0 R +836 0 R 837 0 R +838 0 R 839 0 R +840 0 R 841 0 R +842 0 R 843 0 R -845 0 R]endobj -847 0 obj<>endobj -848 0 obj<>endobj -849 0 obj[848 0 R]endobj -850 0 obj<>endobj -851 0 obj<>endobj -852 0 obj<>endobj -853 0 obj<>endobj -854 0 obj[851 0 R -853 0 R]endobj -855 0 obj<>endobj -856 0 obj<>endobj -857 0 obj<>endobj -858 0 obj<>endobj -859 0 obj<>endobj -860 0 obj<>endobj -861 0 obj[856 0 R +844 0 R +845 0 R +846 0 R +847 0 R +848 0 R +849 0 R +850 0 R +851 0 R +852 0 R +853 0 R +854 0 R +855 0 R +856 0 R +857 0 R 858 0 R -860 0 R]endobj -862 0 obj<>endobj -863 0 obj<>endobj -864 0 obj<>endobj -865 0 obj<>endobj -866 0 obj<>endobj -867 0 obj<>endobj -868 0 obj[863 0 R -865 0 R -867 0 R]endobj -869 0 obj<>endobj -870 0 obj<>endobj -871 0 obj<>endobj -872 0 obj<>endobj -873 0 obj<>endobj -874 0 obj<>endobj -875 0 obj<>endobj -876 0 obj<>endobj -877 0 obj<>endobj -878 0 obj<>endobj -879 0 obj[870 0 R -872 0 R -874 0 R -876 0 R +859 0 R +860 0 R +861 0 R]endobj +863 0 obj<>endobj +864 0 obj<>endobj +865 0 obj<>endobj +866 0 obj<>endobj +867 0 obj<>endobj +868 0 obj<>endobj +869 0 obj[864 0 R +866 0 R +868 0 R]endobj +870 0 obj<>endobj +871 0 obj<>endobj +872 0 obj<>endobj +873 0 obj<>endobj +874 0 obj[871 0 R +873 0 R]endobj +875 0 obj<>endobj +876 0 obj<>endobj +877 0 obj<>endobj +878 0 obj<>endobj +879 0 obj[876 0 R 878 0 R]endobj -880 0 obj<>endobj -881 0 obj<>endobj -882 0 obj<>endobj -883 0 obj<>endobj -884 0 obj[881 0 R -883 0 R]endobj -885 0 obj<>endobj -886 0 obj<>endobj -887 0 obj<>endobj -888 0 obj<>endobj -889 0 obj<>endobj -890 0 obj<>endobj -891 0 obj<>endobj -892 0 obj<>endobj -893 0 obj<>endobj -894 0 obj<>endobj -895 0 obj[886 0 R -888 0 R -890 0 R -892 0 R -894 0 R]endobj -896 0 obj<>endobj -897 0 obj<>endobj -898 0 obj<>endobj -899 0 obj<>endobj -900 0 obj[897 0 R -899 0 R]endobj -901 0 obj<>endobj -902 0 obj<>endobj -903 0 obj[902 0 R]endobj -904 0 obj<>endobj -905 0 obj<>endobj -906 0 obj<>endobj -907 0 obj<>endobj -908 0 obj<>endobj -909 0 obj<>endobj +880 0 obj<>endobj +881 0 obj<>endobj +882 0 obj<>endobj +883 0 obj<>endobj +884 0 obj<>endobj +885 0 obj<>endobj +886 0 obj<>endobj +887 0 obj<>endobj +888 0 obj[881 0 R +883 0 R +885 0 R +887 0 R]endobj +889 0 obj<>endobj +890 0 obj<>endobj +891 0 obj[890 0 R]endobj +892 0 obj<>endobj +893 0 obj<>endobj +894 0 obj<>endobj +895 0 obj<>endobj +896 0 obj[893 0 R +895 0 R]endobj +897 0 obj<>endobj +898 0 obj<>endobj +899 0 obj<>endobj +900 0 obj<>endobj +901 0 obj<>endobj +902 0 obj<>endobj +903 0 obj[898 0 R +900 0 R +902 0 R]endobj +904 0 obj<>endobj +905 0 obj<>endobj +906 0 obj<>endobj +907 0 obj<>endobj +908 0 obj<>endobj +909 0 obj<>endobj 910 0 obj[905 0 R 907 0 R 909 0 R]endobj -911 0 obj<>endobj -912 0 obj<>endobj -913 0 obj[912 0 R]endobj -914 0 obj<>endobj -915 0 obj<>endobj -916 0 obj[915 0 R]endobj -917 0 obj<>endobj -918 0 obj<>endobj -919 0 obj<>endobj -920 0 obj<>endobj -921 0 obj<>endobj -922 0 obj<>endobj -923 0 obj<>endobj -924 0 obj<>endobj -925 0 obj<>endobj -926 0 obj<>endobj -927 0 obj<>endobj -928 0 obj<>endobj -929 0 obj<>endobj -930 0 obj<>endobj -931 0 obj<>endobj -932 0 obj<>endobj -933 0 obj[918 0 R -920 0 R -922 0 R -924 0 R -926 0 R -928 0 R +911 0 obj<>endobj +912 0 obj<>endobj +913 0 obj<>endobj +914 0 obj<>endobj +915 0 obj<>endobj +916 0 obj<>endobj +917 0 obj<>endobj +918 0 obj<>endobj +919 0 obj<>endobj +920 0 obj<>endobj +921 0 obj[912 0 R +914 0 R +916 0 R +918 0 R +920 0 R]endobj +922 0 obj<>endobj +923 0 obj<>endobj +924 0 obj<>endobj +925 0 obj<>endobj +926 0 obj[923 0 R +925 0 R]endobj +927 0 obj<>endobj +928 0 obj<>endobj +929 0 obj<>endobj +930 0 obj<>endobj +931 0 obj<>endobj +932 0 obj<>endobj +933 0 obj<>endobj +934 0 obj<>endobj +935 0 obj<>endobj +936 0 obj<>endobj +937 0 obj<>endobj +938 0 obj<>endobj +939 0 obj[928 0 R 930 0 R -932 0 R]endobj -934 0 obj<>endobj -935 0 obj<>endobj -936 0 obj<>endobj -937 0 obj<>endobj -938 0 obj<>endobj -939 0 obj<>endobj -940 0 obj<>endobj -941 0 obj<>endobj -942 0 obj<>endobj -943 0 obj<>endobj -944 0 obj<>endobj -945 0 obj<>endobj -946 0 obj[935 0 R -937 0 R -939 0 R -941 0 R +932 0 R +934 0 R +936 0 R +938 0 R]endobj +940 0 obj<>endobj +941 0 obj<>endobj +942 0 obj<>endobj +943 0 obj<>endobj +944 0 obj<>endobj +945 0 obj<>endobj +946 0 obj[941 0 R 943 0 R 945 0 R]endobj -947 0 obj<>endobj -948 0 obj<>endobj -949 0 obj<>endobj -950 0 obj<>endobj -951 0 obj<>endobj -952 0 obj<>endobj -953 0 obj<>endobj -954 0 obj<>endobj -955 0 obj[948 0 R -950 0 R -952 0 R -954 0 R]endobj -956 0 obj<>endobj -957 0 obj<>endobj -958 0 obj[957 0 R]endobj -959 0 obj<>endobj -960 0 obj<>endobj -961 0 obj<>endobj -962 0 obj<>endobj -963 0 obj<>endobj -964 0 obj<>endobj -965 0 obj<>endobj -966 0 obj<>endobj -967 0 obj<>endobj -968 0 obj<>endobj -969 0 obj<>endobj -970 0 obj<>endobj -971 0 obj[960 0 R -962 0 R -964 0 R -966 0 R -968 0 R -970 0 R]endobj -972 0 obj<>endobj -973 0 obj<>endobj -974 0 obj[973 0 R]endobj -975 0 obj<>endobj -976 0 obj<>endobj -977 0 obj[976 0 R]endobj -978 0 obj<>endobj -979 0 obj<>endobj -980 0 obj[979 0 R]endobj -981 0 obj<>endobj -982 0 obj<>endobj -983 0 obj<>endobj -984 0 obj<>endobj -985 0 obj<>endobj -986 0 obj<>endobj -987 0 obj[982 0 R -984 0 R -986 0 R]endobj -988 0 obj<>endobj -989 0 obj<>endobj -990 0 obj<>endobj -991 0 obj<>endobj -992 0 obj<>endobj -993 0 obj<>endobj -994 0 obj<>endobj -995 0 obj<>endobj -996 0 obj<>endobj -997 0 obj<>endobj -998 0 obj<>endobj -999 0 obj<>endobj -1000 0 obj<>endobj -1001 0 obj<>endobj -1002 0 obj<>endobj -1003 0 obj<>endobj -1004 0 obj<>endobj -1005 0 obj<>endobj -1006 0 obj<>endobj -1007 0 obj<>endobj -1008 0 obj<>endobj -1009 0 obj<>endobj -1010 0 obj<>endobj -1011 0 obj<>endobj -1012 0 obj<>endobj -1013 0 obj<>endobj -1014 0 obj<>endobj -1015 0 obj<>endobj -1016 0 obj<>endobj -1017 0 obj<>endobj -1018 0 obj<>endobj -1019 0 obj<>endobj -1020 0 obj<>endobj -1021 0 obj<>endobj -1022 0 obj<>endobj -1023 0 obj<>endobj -1024 0 obj<>endobj -1025 0 obj<>endobj -1026 0 obj<>endobj -1027 0 obj<>endobj -1028 0 obj<>endobj -1029 0 obj<>endobj -1030 0 obj[988 0 R +947 0 obj<>endobj +948 0 obj<>endobj +949 0 obj[948 0 R]endobj +950 0 obj<>endobj +951 0 obj<>endobj +952 0 obj[951 0 R]endobj +953 0 obj<>endobj +954 0 obj<>endobj +955 0 obj[954 0 R]endobj +956 0 obj<>endobj +957 0 obj<>endobj +958 0 obj<>endobj +959 0 obj<>endobj +960 0 obj<>endobj +961 0 obj<>endobj +962 0 obj<>endobj +963 0 obj<>endobj +964 0 obj<>endobj +965 0 obj<>endobj +966 0 obj<>endobj +967 0 obj<>endobj +968 0 obj<>endobj +969 0 obj<>endobj +970 0 obj[957 0 R +959 0 R +961 0 R +963 0 R +965 0 R +967 0 R +969 0 R]endobj +971 0 obj<>endobj +972 0 obj<>endobj +973 0 obj<>endobj +974 0 obj<>endobj +975 0 obj[972 0 R +974 0 R]endobj +976 0 obj<>endobj +977 0 obj<>endobj +978 0 obj[977 0 R]endobj +979 0 obj<>endobj +980 0 obj<>endobj +981 0 obj<>endobj +982 0 obj<>endobj +983 0 obj<>endobj +984 0 obj<>endobj +985 0 obj[980 0 R +982 0 R +984 0 R]endobj +986 0 obj<>endobj +987 0 obj<>endobj +988 0 obj<>endobj +989 0 obj<>endobj +990 0 obj<>endobj +991 0 obj<>endobj +992 0 obj<>endobj +993 0 obj<>endobj +994 0 obj<>endobj +995 0 obj<>endobj +996 0 obj<>endobj +997 0 obj<>endobj +998 0 obj<>endobj +999 0 obj<>endobj +1000 0 obj<>endobj +1001 0 obj<>endobj +1002 0 obj<>endobj +1003 0 obj<>endobj +1004 0 obj<>endobj +1005 0 obj<>endobj +1006 0 obj<>endobj +1007 0 obj<>endobj +1008 0 obj<>endobj +1009 0 obj<>endobj +1010 0 obj<>endobj +1011 0 obj<>endobj +1012 0 obj<>endobj +1013 0 obj<>endobj +1014 0 obj<>endobj +1015 0 obj<>endobj +1016 0 obj<>endobj +1017 0 obj<>endobj +1018 0 obj<>endobj +1019 0 obj<>endobj +1020 0 obj<>endobj +1021 0 obj<>endobj +1022 0 obj<>endobj +1023 0 obj<>endobj +1024 0 obj<>endobj +1025 0 obj<>endobj +1026 0 obj<>endobj +1027 0 obj<>endobj +1028 0 obj[986 0 R +987 0 R +988 0 R 989 0 R 990 0 R 991 0 R @@ -1796,719 +1796,731 @@ 1024 0 R 1025 0 R 1026 0 R -1027 0 R -1028 0 R -1029 0 R]endobj -1031 0 obj<>endobj -1032 0 obj<>endobj -1033 0 obj<>endobj -1034 0 obj<>endobj -1035 0 obj<>endobj -1036 0 obj<>endobj -1037 0 obj<>endobj -1038 0 obj<>endobj -1039 0 obj<>endobj -1040 0 obj<>endobj -1041 0 obj[1032 0 R +1027 0 R]endobj +1029 0 obj<>endobj +1030 0 obj<>endobj +1031 0 obj<>endobj +1032 0 obj<>endobj +1033 0 obj<>endobj +1034 0 obj<>endobj +1035 0 obj<>endobj +1036 0 obj<>endobj +1037 0 obj<>endobj +1038 0 obj<>endobj +1039 0 obj[1030 0 R +1032 0 R 1034 0 R 1036 0 R -1038 0 R -1040 0 R]endobj -1042 0 obj<>endobj -1043 0 obj<>endobj -1044 0 obj<>endobj -1045 0 obj<>endobj -1046 0 obj<>endobj -1047 0 obj<>endobj -1048 0 obj<>endobj -1049 0 obj<>endobj -1050 0 obj[1043 0 R +1038 0 R]endobj +1040 0 obj<>endobj +1041 0 obj<>endobj +1042 0 obj<>endobj +1043 0 obj<>endobj +1044 0 obj<>endobj +1045 0 obj<>endobj +1046 0 obj<>endobj +1047 0 obj<>endobj +1048 0 obj[1041 0 R +1043 0 R 1045 0 R -1047 0 R -1049 0 R]endobj -1051 0 obj<>endobj -1052 0 obj<>endobj -1053 0 obj[1052 0 R]endobj -1054 0 obj<>endobj -1055 0 obj<>endobj -1056 0 obj[1055 0 R]endobj -1057 0 obj<>endobj -1058 0 obj<>endobj -1059 0 obj<>endobj -1060 0 obj<>endobj -1061 0 obj<>endobj -1062 0 obj<>endobj -1063 0 obj<>endobj -1064 0 obj<>endobj -1065 0 obj[1058 0 R +1047 0 R]endobj +1049 0 obj<>endobj +1050 0 obj<>endobj +1051 0 obj[1050 0 R]endobj +1052 0 obj<>endobj +1053 0 obj<>endobj +1054 0 obj[1053 0 R]endobj +1055 0 obj<>endobj +1056 0 obj<>endobj +1057 0 obj<>endobj +1058 0 obj<>endobj +1059 0 obj<>endobj +1060 0 obj<>endobj +1061 0 obj<>endobj +1062 0 obj<>endobj +1063 0 obj[1056 0 R +1058 0 R 1060 0 R -1062 0 R -1064 0 R]endobj -1066 0 obj<>endobj -1067 0 obj<>endobj -1068 0 obj<>endobj -1069 0 obj<>endobj -1070 0 obj[1067 0 R -1069 0 R]endobj -1071 0 obj<>endobj -1072 0 obj<>endobj -1073 0 obj<>endobj -1074 0 obj<>endobj -1075 0 obj<>endobj -1076 0 obj<>endobj -1077 0 obj<>endobj -1078 0 obj<>endobj -1079 0 obj<>endobj -1080 0 obj<>endobj -1081 0 obj<>endobj -1082 0 obj<>endobj -1083 0 obj<>endobj -1084 0 obj<>endobj -1085 0 obj<>endobj -1086 0 obj<>endobj -1087 0 obj<>endobj -1088 0 obj<>endobj -1089 0 obj<>endobj -1090 0 obj<>endobj -1091 0 obj<>endobj -1092 0 obj<>endobj -1093 0 obj<>endobj -1094 0 obj<>endobj -1095 0 obj<>endobj -1096 0 obj<>endobj -1097 0 obj<>endobj -1098 0 obj<>endobj -1099 0 obj<>endobj -1100 0 obj<>endobj -1101 0 obj<>endobj -1102 0 obj<>endobj -1103 0 obj<>endobj -1104 0 obj<>endobj -1105 0 obj<>endobj -1106 0 obj<>endobj -1107 0 obj<>endobj -1108 0 obj<>endobj -1109 0 obj<>endobj -1110 0 obj<>endobj -1111 0 obj<>endobj -1112 0 obj<>endobj -1113 0 obj<>endobj -1114 0 obj<>endobj -1115 0 obj<>endobj -1116 0 obj<>endobj -1117 0 obj<>endobj -1118 0 obj<>endobj -1119 0 obj<>endobj -1120 0 obj<>endobj -1121 0 obj<>endobj -1122 0 obj<>endobj -1123 0 obj<>endobj -1124 0 obj<>endobj -1125 0 obj<>endobj -1126 0 obj<>endobj -1127 0 obj<>endobj -1128 0 obj<>endobj -1129 0 obj<>endobj -1130 0 obj<>endobj -1131 0 obj<>endobj -1132 0 obj<>endobj -1133 0 obj<>endobj -1134 0 obj<>endobj -1135 0 obj<>endobj -1136 0 obj<>endobj -1137 0 obj<>endobj -1138 0 obj<>endobj -1139 0 obj<>endobj -1140 0 obj<>endobj -1141 0 obj<>endobj -1142 0 obj<>endobj -1143 0 obj<>endobj -1144 0 obj<>endobj -1145 0 obj<>endobj -1146 0 obj<>endobj -1147 0 obj<>endobj -1148 0 obj<>endobj -1149 0 obj<>endobj -1150 0 obj<>endobj -1151 0 obj<>endobj -1152 0 obj<>endobj -1153 0 obj<>endobj -1154 0 obj<>endobj -1155 0 obj<>endobj -1156 0 obj<>endobj -1157 0 obj<>endobj -1158 0 obj<>endobj -1159 0 obj<>endobj -1160 0 obj<>endobj -1161 0 obj<>endobj -1162 0 obj<>endobj -1163 0 obj<>endobj -1164 0 obj<>endobj -1165 0 obj<>endobj -1166 0 obj<>endobj -1167 0 obj<>endobj -1168 0 obj<>endobj -1169 0 obj<>endobj -1170 0 obj<>endobj -1171 0 obj<>endobj -1172 0 obj<>endobj -1173 0 obj<>endobj -1174 0 obj<>endobj -1175 0 obj<>endobj -1176 0 obj<>endobj -1177 0 obj<>endobj -1178 0 obj<>endobj -1179 0 obj<>endobj -1180 0 obj<>endobj -1181 0 obj<>endobj -1182 0 obj<>endobj -1183 0 obj<>endobj -1184 0 obj<>endobj -1185 0 obj<>endobj -1186 0 obj<>endobj -1187 0 obj<>endobj -1188 0 obj<>endobj -1189 0 obj<>endobj -1190 0 obj<>endobj -1191 0 obj<>endobj -1192 0 obj<>endobj -1193 0 obj<>endobj -1194 0 obj<>endobj -1195 0 obj<>endobj -1196 0 obj<>endobj -1197 0 obj<>endobj -1198 0 obj<>endobj -1199 0 obj<>endobj -1200 0 obj<>endobj -1201 0 obj<>endobj -1202 0 obj<>endobj -1203 0 obj<>endobj -1204 0 obj<>endobj -1205 0 obj<>endobj -1206 0 obj<>endobj -1207 0 obj<>endobj -1208 0 obj<>endobj -1209 0 obj<>endobj -1210 0 obj<>endobj -1211 0 obj<>endobj -1212 0 obj<>endobj -1213 0 obj<>endobj -1214 0 obj<>endobj -1215 0 obj<>endobj -1216 0 obj<>endobj -1217 0 obj<>endobj -1218 0 obj<>endobj -1219 0 obj<>endobj -1220 0 obj<>endobj -1221 0 obj<>endobj -1222 0 obj<>endobj -1223 0 obj<>endobj -1224 0 obj<>endobj -1225 0 obj<>endobj -1226 0 obj<>endobj -1227 0 obj<>endobj -1228 0 obj<>endobj -1229 0 obj<>endobj -1230 0 obj<>endobj -1231 0 obj<>endobj -1232 0 obj<>endobj -1233 0 obj<>endobj -1234 0 obj<>endobj -1235 0 obj<>endobj -1236 0 obj<>endobj -1237 0 obj<>endobj -1238 0 obj<>endobj -1239 0 obj<>endobj -1240 0 obj<>endobj -1241 0 obj<>endobj -1242 0 obj<>endobj -1243 0 obj<>endobj -1244 0 obj<>endobj -1245 0 obj<>endobj -1246 0 obj<>endobj -1247 0 obj<>endobj -1248 0 obj<>endobj -1249 0 obj<>endobj -1250 0 obj<>endobj -1251 0 obj<>endobj -1252 0 obj<>endobj -1253 0 obj<>endobj -1254 0 obj<>endobj -1255 0 obj<>endobj -1256 0 obj<>endobj -1257 0 obj<>endobj -1258 0 obj<>endobj -1259 0 obj<>endobj -1260 0 obj<>endobj -1261 0 obj<>endobj -1262 0 obj<>endobj -1263 0 obj<>endobj -1264 0 obj<>endobj -1265 0 obj<>endobj -1266 0 obj<>endobj -1267 0 obj<>endobj -1268 0 obj<>endobj -1269 0 obj<>endobj -1270 0 obj<>endobj -1271 0 obj<>endobj -1272 0 obj<>endobj -1273 0 obj<>endobj -1274 0 obj<>endobj -1275 0 obj<>endobj -1276 0 obj<>endobj -1277 0 obj<>endobj -1278 0 obj<>endobj -1279 0 obj<>endobj -1280 0 obj<>endobj -1281 0 obj<>endobj -1282 0 obj<>endobj -1283 0 obj<>endobj -1284 0 obj<>endobj -1285 0 obj<>endobj -1286 0 obj<>endobj -1287 0 obj<>endobj -1288 0 obj<>endobj -1289 0 obj<>endobj -1290 0 obj<>endobj -1291 0 obj<>endobj -1292 0 obj<>endobj -1293 0 obj<>endobj -1294 0 obj<>endobj -1295 0 obj<>endobj -1296 0 obj<>endobj -1297 0 obj<>endobj -1298 0 obj<>endobj -1299 0 obj<>endobj -1300 0 obj<>endobj -1301 0 obj<>endobj -1302 0 obj<>endobj -1303 0 obj<>endobj -1304 0 obj<>endobj -1305 0 obj<>endobj -1306 0 obj<>endobj -1307 0 obj<>endobj -1308 0 obj<>endobj -1309 0 obj<>endobj -1310 0 obj<>endobj -1311 0 obj<>endobj -1312 0 obj<>endobj -1313 0 obj<>endobj -1314 0 obj<>endobj -1315 0 obj<>endobj -1316 0 obj<>endobj -1317 0 obj<>endobj -1318 0 obj<>endobj -1319 0 obj<>endobj -1320 0 obj<>endobj -1321 0 obj<>endobj -1322 0 obj<>endobj -1323 0 obj<>endobj -1324 0 obj<>endobj -1325 0 obj<>endobj -1326 0 obj<>endobj -1327 0 obj<>endobj -1328 0 obj<>endobj -1329 0 obj<>endobj -1330 0 obj<>endobj -1331 0 obj<>endobj -1332 0 obj<>endobj -1333 0 obj<>endobj -1334 0 obj<>endobj -1335 0 obj<>endobj -1336 0 obj<>endobj -1337 0 obj<>endobj -1338 0 obj<>endobj -1339 0 obj<>endobj -1340 0 obj<>endobj -1341 0 obj<>endobj -1342 0 obj<>endobj -1343 0 obj<>endobj -1344 0 obj<>endobj -1345 0 obj<>endobj -1346 0 obj<>endobj -1347 0 obj<>endobj -1348 0 obj<>endobj -1349 0 obj<>endobj -1350 0 obj<>endobj -1351 0 obj<>endobj -1352 0 obj<>endobj -1353 0 obj<>endobj -1354 0 obj<>endobj -1355 0 obj<>endobj -1356 0 obj<>endobj -1357 0 obj<>endobj -1358 0 obj<>endobj -1359 0 obj<>endobj -1360 0 obj<>endobj -1361 0 obj<>endobj -1362 0 obj<>endobj -1363 0 obj<>endobj -1364 0 obj<>endobj -1365 0 obj<>endobj -1366 0 obj<>endobj -1367 0 obj<>endobj +1065 0 obj<>endobj +1066 0 obj<>endobj +1067 0 obj<>endobj +1068 0 obj[1065 0 R +1067 0 R]endobj +1069 0 obj<>endobj +1070 0 obj<>endobj +1071 0 obj<>endobj +1072 0 obj<>endobj +1073 0 obj<>endobj +1074 0 obj<>endobj +1075 0 obj<>endobj +1076 0 obj<>endobj +1077 0 obj<>endobj +1078 0 obj<>endobj +1079 0 obj<>endobj +1080 0 obj<>endobj +1081 0 obj<>endobj +1082 0 obj<>endobj +1083 0 obj<>endobj +1084 0 obj<>endobj +1085 0 obj<>endobj +1086 0 obj<>endobj +1087 0 obj<>endobj +1088 0 obj<>endobj +1089 0 obj<>endobj +1090 0 obj<>endobj +1091 0 obj<>endobj +1092 0 obj<>endobj +1093 0 obj<>endobj +1094 0 obj<>endobj +1095 0 obj<>endobj +1096 0 obj<>endobj +1097 0 obj<>endobj +1098 0 obj<>endobj +1099 0 obj<>endobj +1100 0 obj<>endobj +1101 0 obj<>endobj +1102 0 obj<>endobj +1103 0 obj<>endobj +1104 0 obj<>endobj +1105 0 obj<>endobj +1106 0 obj<>endobj +1107 0 obj<>endobj +1108 0 obj<>endobj +1109 0 obj<>endobj +1110 0 obj<>endobj +1111 0 obj<>endobj +1112 0 obj<>endobj +1113 0 obj<>endobj +1114 0 obj<>endobj +1115 0 obj<>endobj +1116 0 obj<>endobj +1117 0 obj<>endobj +1118 0 obj<>endobj +1119 0 obj<>endobj +1120 0 obj<>endobj +1121 0 obj<>endobj +1122 0 obj<>endobj +1123 0 obj<>endobj +1124 0 obj<>endobj +1125 0 obj<>endobj +1126 0 obj<>endobj +1127 0 obj<>endobj +1128 0 obj<>endobj +1129 0 obj<>endobj +1130 0 obj<>endobj +1131 0 obj<>endobj +1132 0 obj<>endobj +1133 0 obj<>endobj +1134 0 obj<>endobj +1135 0 obj<>endobj +1136 0 obj<>endobj +1137 0 obj<>endobj +1138 0 obj<>endobj +1139 0 obj<>endobj +1140 0 obj<>endobj +1141 0 obj<>endobj +1142 0 obj<>endobj +1143 0 obj<>endobj +1144 0 obj<>endobj +1145 0 obj<>endobj +1146 0 obj<>endobj +1147 0 obj<>endobj +1148 0 obj<>endobj +1149 0 obj<>endobj +1150 0 obj<>endobj +1151 0 obj<>endobj +1152 0 obj<>endobj +1153 0 obj<>endobj +1154 0 obj<>endobj +1155 0 obj<>endobj +1156 0 obj<>endobj +1157 0 obj<>endobj +1158 0 obj<>endobj +1159 0 obj<>endobj +1160 0 obj<>endobj +1161 0 obj<>endobj +1162 0 obj<>endobj +1163 0 obj<>endobj +1164 0 obj<>endobj +1165 0 obj<>endobj +1166 0 obj<>endobj +1167 0 obj<>endobj +1168 0 obj<>endobj +1169 0 obj<>endobj +1170 0 obj<>endobj +1171 0 obj<>endobj +1172 0 obj<>endobj +1173 0 obj<>endobj +1174 0 obj<>endobj +1175 0 obj<>endobj +1176 0 obj<>endobj +1177 0 obj<>endobj +1178 0 obj<>endobj +1179 0 obj<>endobj +1180 0 obj<>endobj +1181 0 obj<>endobj +1182 0 obj<>endobj +1183 0 obj<>endobj +1184 0 obj<>endobj +1185 0 obj<>endobj +1186 0 obj<>endobj +1187 0 obj<>endobj +1188 0 obj<>endobj +1189 0 obj<>endobj +1190 0 obj<>endobj +1191 0 obj<>endobj +1192 0 obj<>endobj +1193 0 obj<>endobj +1194 0 obj<>endobj +1195 0 obj<>endobj +1196 0 obj<>endobj +1197 0 obj<>endobj +1198 0 obj<>endobj +1199 0 obj<>endobj +1200 0 obj<>endobj +1201 0 obj<>endobj +1202 0 obj<>endobj +1203 0 obj<>endobj +1204 0 obj<>endobj +1205 0 obj<>endobj +1206 0 obj<>endobj +1207 0 obj<>endobj +1208 0 obj<>endobj +1209 0 obj<>endobj +1210 0 obj<>endobj +1211 0 obj<>endobj +1212 0 obj<>endobj +1213 0 obj<>endobj +1214 0 obj<>endobj +1215 0 obj<>endobj +1216 0 obj<>endobj +1217 0 obj<>endobj +1218 0 obj<>endobj +1219 0 obj<>endobj +1220 0 obj<>endobj +1221 0 obj<>endobj +1222 0 obj<>endobj +1223 0 obj<>endobj +1224 0 obj<>endobj +1225 0 obj<>endobj +1226 0 obj<>endobj +1227 0 obj<>endobj +1228 0 obj<>endobj +1229 0 obj<>endobj +1230 0 obj<>endobj +1231 0 obj<>endobj +1232 0 obj<>endobj +1233 0 obj<>endobj +1234 0 obj<>endobj +1235 0 obj<>endobj +1236 0 obj<>endobj +1237 0 obj<>endobj +1238 0 obj<>endobj +1239 0 obj<>endobj +1240 0 obj<>endobj +1241 0 obj<>endobj +1242 0 obj<>endobj +1243 0 obj<>endobj +1244 0 obj<>endobj +1245 0 obj<>endobj +1246 0 obj<>endobj +1247 0 obj<>endobj +1248 0 obj<>endobj +1249 0 obj<>endobj +1250 0 obj<>endobj +1251 0 obj<>endobj +1252 0 obj<>endobj +1253 0 obj<>endobj +1254 0 obj<>endobj +1255 0 obj<>endobj +1256 0 obj<>endobj +1257 0 obj<>endobj +1258 0 obj<>endobj +1259 0 obj<>endobj +1260 0 obj<>endobj +1261 0 obj<>endobj +1262 0 obj<>endobj +1263 0 obj<>endobj +1264 0 obj<>endobj +1265 0 obj<>endobj +1266 0 obj<>endobj +1267 0 obj<>endobj +1268 0 obj<>endobj +1269 0 obj<>endobj +1270 0 obj<>endobj +1271 0 obj<>endobj +1272 0 obj<>endobj +1273 0 obj<>endobj +1274 0 obj<>endobj +1275 0 obj<>endobj +1276 0 obj<>endobj +1277 0 obj<>endobj +1278 0 obj<>endobj +1279 0 obj<>endobj +1280 0 obj<>endobj +1281 0 obj<>endobj +1282 0 obj<>endobj +1283 0 obj<>endobj +1284 0 obj<>endobj +1285 0 obj<>endobj +1286 0 obj<>endobj +1287 0 obj<>endobj +1288 0 obj<>endobj +1289 0 obj<>endobj +1290 0 obj<>endobj +1291 0 obj<>endobj +1292 0 obj<>endobj +1293 0 obj<>endobj +1294 0 obj<>endobj +1295 0 obj<>endobj +1296 0 obj<>endobj +1297 0 obj<>endobj +1298 0 obj<>endobj +1299 0 obj<>endobj +1300 0 obj<>endobj +1301 0 obj<>endobj +1302 0 obj<>endobj +1303 0 obj<>endobj +1304 0 obj<>endobj +1305 0 obj<>endobj +1306 0 obj<>endobj +1307 0 obj<>endobj +1308 0 obj<>endobj +1309 0 obj<>endobj +1310 0 obj<>endobj +1311 0 obj<>endobj +1312 0 obj<>endobj +1313 0 obj<>endobj +1314 0 obj<>endobj +1315 0 obj<>endobj +1316 0 obj<>endobj +1317 0 obj<>endobj +1318 0 obj<>endobj +1319 0 obj<>endobj +1320 0 obj<>endobj +1321 0 obj<>endobj +1322 0 obj<>endobj +1323 0 obj<>endobj +1324 0 obj<>endobj +1325 0 obj<>endobj +1326 0 obj<>endobj +1327 0 obj<>endobj +1328 0 obj<>endobj +1329 0 obj<>endobj +1330 0 obj<>endobj +1331 0 obj<>endobj +1332 0 obj<>endobj +1333 0 obj<>endobj +1334 0 obj<>endobj +1335 0 obj<>endobj +1336 0 obj<>endobj +1337 0 obj<>endobj +1338 0 obj<>endobj +1339 0 obj<>endobj +1340 0 obj<>endobj +1341 0 obj<>endobj +1342 0 obj<>endobj +1343 0 obj<>endobj +1344 0 obj<>endobj +1345 0 obj<>endobj +1346 0 obj<>endobj +1347 0 obj<>endobj +1348 0 obj<>endobj +1349 0 obj<>endobj +1350 0 obj<>endobj +1351 0 obj<>endobj +1352 0 obj<>endobj +1353 0 obj<>endobj +1354 0 obj<>endobj +1355 0 obj<>endobj +1356 0 obj<>endobj +1357 0 obj<>endobj +1358 0 obj<>endobj +1359 0 obj<>endobj +1360 0 obj<>endobj +1361 0 obj<>endobj +1362 0 obj<>endobj +1363 0 obj<>endobj +1364 0 obj<>endobj +1365 0 obj<>endobj +1366 0 obj<>endobj +1367 0 obj<>endobj +1368 0 obj<>endobj +1369 0 obj<>endobj +1370 0 obj<>endobj +1371 0 obj<>endobj +1372 0 obj<>endobj -1368 0 obj<>/XObject<<>>>>>>endobj -1369 0 obj<>stream +1373 0 obj<>/XObject<<>>>>>>endobj +1374 0 obj<>stream x+ä2T0BCs#c3…ä\.§.}7K#…4K=3cS’¢` g`NÖvôurT(ÊÏJM.QpÉO.ÍMÍ+I,ÉÌÏÓ Éâr á ä«endstream endobj -1370 0 obj<>/XObject<<>>>>/Annots 53 0 R>>endobj -1371 0 obj<>stream -xÍ[ÛrÇ}×Wì[œªÂÞ¼¤t‰V,QéR^— (° Jößçœî™ž^€TÑ–HÉ®²uö`fú6==½«ÿ=ɳ1þͳ¶ÈÊ&›­žŒGc<±ÿ¼ý‰O²¦šâ¿«¬œŽÚ–ÙéWYÛ 8WY^ç£Úl8iY&˜´­GyœÔA £©#E˜ñtTa\5&%€ãHÕ“RälíÏ2£! j!¥þŒ”ƒ\Œ£)3ÖͨÁbõ‹Õl±r<*Ô(yV £Dˆacä„Þ§´q®²IÓ$ÎAˆ™OaÌDz f6­Ç`ÚÓ±¯²b\JÇ–tSÓšP¥àªD•¡JËYsp•M+›„ã¤*5Ýa=¦*å`INbÔ¨8’8›ò'µqrI±‘sIÆV*KVÓ±ÆUV`KF®-0.qŠ3sÇÁ™bÁ2ÇÜi Ç`¡eü-—Tq`^Æ¿X Ä Ü„FOœƒ˜t̸M¤Ç`‹|È: ¬ôcfü”´‚‰¤â6•lW@7pˆ}HdœƒˆŸ–&0ÎA -;¡žFz ¶ª)NbÛ08Öaª2¡¢6VUA³­P Hª±qsKŽNj¤Ç`KîMÇ: £}i¬Ã`Ûé`æZü_¶š`'ø_%€â¶ b`."é1X$,šX‡ÁNÚ«‹•l]E@Z4py)âé1¦m¦”7±ƒÅÄp[b+[Õ±“0ÎÒX‡ár9«.Ïs·Ù$—®ÍérãÄ’cŽO¤Ç`‘ù°ûm¨Ç`q:Á‰u˜ÊŒéòÄ:Ìøë1Ø¢a¨%Öa°rÌ%V QŠ­BÖQ`†ˆœhž8!nQÀö‰ô˜ªV%Ç: ¶ÃçŽu¬úŽuÊ ßûuU™I6r) )8•Þ8M#ƒ2ad^qO¥i=Æغ„íë0•a¼8Öa*C¿%Öcú­¬ë1ØépfQÙ!&nfÁÖ´WZ×c°²×ë0Ë4VŽsÊ)Îü] -$ˆc“‰$qJQ€°q(*"¤sÒ,œÔcš?ýVX‡i~ž­ibIie=‘” I8ÒA DŽ„FzÌi êi¬N+Ç‘è‰i¤i—ç,FzÌEY‘¤¡:-²,Uñ¤i—Sªb¤Ç˜V–s¬ÃÔ…§ªcf„–ƒ™U$T¬<7U$I¤Àq A#=¦H,Ãë0X\6¼i¬Ãx‚üìX‡ÁNy q¬ÃP§emfÁV,ÞÒXUE4C[•” \^”Œ#e`1-R˜)°‘˱M[leþ’¤Ç´‹–IJÒ-šFÂA®% -8ÐAätÖ,‰s;…EâÄz‰ôlͽäX‡iwæôÄJ^. ­ÀR@a¥tŒΡ©Ž?$ç &E²¯é1âNCuIXÂî…€´dà° iœƒ˜´äe#‘ƒ……`Zê1XÜu§ŽUàb¹qr?ð VO« ÿ{ÎA -$³:)¶¥Ý¸G+1žN8UË81)r*ÂÀHÁ¢L†ŒÕp–kî†,7 4¬ƒ(×ûDzÌE¹“ë0XÀð¦Mì1Xd\„Ibæ¶æ XÁbf„¦õ˜¬Ø×X±/Ï \E‘ý¯‚\ü!9iV)‰ô˜, AÏ& ¶dEìX‡Á6ô\bUÜÖ]¢sIÜÀ©|Æ9hâÄ #ä(±c,ÒZN‰u˜âòÔw¬Ã°=Tƒ26V•A5h†¥¢Û0 -‘ŒÅöÆ9hÊ” ³e«ÊDV…O¬Ã¦LbU™0¶È¢I`U5¾mT^ÜFUeØÿIœƒX²à­ ‘ƒ•nƒc‹¢af‹zLexùu¬Ã`Ñdñ¬*ƒ{KI3¼ä)ë(ŒÊ§Ê„qAx#=¦2 íX‡Á¢C$Öa®GžUqÑêMÌtÏ>ˆnTTmB\6dç –D/“Ú@ÁÊéãX‡Áâ`õ«@²ïa?‘@€lÓq>ó8ÔAÎAL -‡"«Ø@ÖrŸNn®æ(…b@~%k±4cäaŒHˆäb–?ËžNA_Í]þŠLBœ½Fc‚ب¥Ý çgOžþˆcrœ]Š(%1{[egÒ¨ÆãÙgÝùržõ—Ù‹~½›¯wÛ¿žýŠQœ£ŽÂ°£‚Ã~8}öêù3þz·{àx˜½Ùô¿Îg;yŽkV5 Ï_ö³›æìv‹~Mí©I©äèÛü“«z8N‚zè£ÖÐ’µ÷ž~hè=ÎæÝŠãpöM&Õ7•ÿÐjA£ä°q‘ARñ׳óínÓ×à°«¿3áÕ‘'­}ÄÓ¾‰º$„Fã"Æ×Oóõ|Ó-ùíµ¦ ®Éëí®[.-ì/ʲýÎToDGÔmNÃõnÓ_ÜÌâv©'ß™ÌûîjEˆiNzqÕ]ïæ>gjDÂÑ‘‹ó°éþ«ÿÄŸ ŸC2Ûõ|‚ÆÚ4)";V?ÊdŨÇçÝúBFGÕ¤3žÍ·’€pNXºBx<êÎR¾§?¦4ùË3è{ªAx«IÞÎ;Õ -Ù½ŽwWs± -^|L£¦«Nr)ËÆž]wïç’¹ 4–£•÷½õxXÔ?âñY ”.ö•~~³X^,Öï©$ZEä6ÅŸ/ÖÝf¡z27L¿ñ–Z¢º¶Ü×ò,x÷eó,ò“xíŒèìÅêºß캵Ä1ŠåÚÝv7¿–_c†&œJçÍÁJQéÁ±‰þè¾Î/6ón'Á‹J¹Š'émnݮΩ‹¿Iðh6ë×—‹÷7KáxÛ:ÎC:Ì.˹®‡]U=^A‘)èQÞ ‚ºÞWÝR‘ß¡¿÷7’ùIÕä¤xëœbƒú‰»q‰±døi±»;¡:GKìõ®»T'Ø“<—=ˆ¦hÙ6²ò -ïãt×mva‡£:­ÍÅw„‚æ@¤EûaÈö9Êu;á׫sý!ߣIþ|%ï˜3ê>ÌmHÑ¢»?ÓîTþrÓkEYpÑ -'Àb=ß]Œô3ú´mûXî šæRLÂ(‡÷ܪ©Û+÷l‰ƒ~úqþw -Œ7ELÉ -°äv45,ÇIrC¤Æ4–urn ÎýŽÓáýžY梛¯ô7l”hƒ)ªšx-@Wk?®Ï6¿SÊAT.[ ut¥>{˜m¯ºM8ÊðÓ2–´ÝÇn±ä•LBŸFÄÌ©êC 3å­e;ß|Ôò /*Æu8Nïä?û8×ú¼ÀÅÒ™hr!º×¸*†„Àwò–ÕoOp·@7ëÅo4RiÊ„³å7MyŒ¶ý#í›`¶Õ†ûeú…¶¸5?l‹—'§- fï.ß½—gØ(U«©w‹õô7{\ÅJ_Ÿéc_«ãqñáð×'§O yŠŽvºÏw3„‘HÎhÃÕ¹;6úø΀ †,ÑÕ伕PO‡ù>®Û¸Ö±äK~dήa’XÊR¼ì׉ãÛx›x×o>üƒ«à¥^æ¼SЯLä%¾%áB=Nø9ZLž/Ýûu¿›ï"Úèa´`4V¢2zWvGþÊò~fº¨ -n ÃrªèááU9õ×’ã¦Rž?~©‡zÕñ|øÌŠN•ðâe¸»¡‘Öø^£W½¹˜¢a¦»Û -¸k×Ïú%½»©¹+ûyþq.OÑõhâíùžã=>xPR‹z¯ä›Íb“7êM|¶”¼5aýòúø¿²±ü g÷ü´-Û‹”ÌUŒÿ7/8[ŽðŽÅáƒX&¯tSâõü~2ÒZß[äç~öÁÊ[5ƃõ& ò£åp¶Zž{ù_u××Aþ -å†%”_PI¬»•–(ø¶Ó.£@/þ©jâ»Ñø>JÅžà]í¦ÐhˆÙñxu½é?ÎåÊ]R/å|ÓŠù7^Y…x^¬%Ôв}¼íVç©8',e}±Š÷› —n¡o(ÕUÚ¬x³²_oœ  -ü¸˜K—Šq£özXú6ÛÀø4¼ù–-nÕôˆß3»Í‡sö5|î]7h–Ü\³"‰Çß<¢GSÞ1¢¢±‹öýò•~µåÍØûó …Îw*58/p‡è—7±aŒ¦QßÊ|% ÿÄ4Q)|Àé+d—{û°›mú­ÖoþìØޜ㎬Ïñ‚® …ìŸñˆäÚøÎñ©óÀm¸Í‹ŠþšœZÝé¦чn­oV›ÊøX#u€Ue fôÑ,=ölé:ÁŸPÍò׃I¤¼ÅÇò>!£ÀulèîƒÆØé|gžγÌz£ÍMw·=¨Þ¿>#ø>Ùà²û­Þð¡)ˆ`´ê Ä~¨ß_÷;›I)ƒÚéäí¿z{òË /îí Ì—ü]£ mñ‹Ÿ¡ïú%¤ÿË“WÏŽ_Sy|Œa»è.ñ¿ÒóBû!ø˜Ò‡ÀA?äÇ~3‹¥"^“Û^¶cuYjßR'ŸkW¸t=ÃÛ.«ï ô2ð#µBÔ”Ñø~ ‘W•Í÷°Å-] ‹~ÕéŽ`O0ÖmÝííàWòóg¦)JÆ^ o¿Ü€z"ÄžËë^ߊàˆHçAwÞßh_ßoØK=äøîbgJ8ãJ‰wÅz¥ì..pðoCqÎëþ#ž„E¸á•Œ¿_@ÕpøE)_Ý,w‹ëÐÊÄûyW\#>/»™ÉÿX7Ý;¨:ù‹þÝ}.¡P‹“ë%îƒR ð•ó4„åë>>QÔŒ&w“ÀI;·YöÏ­[;nh]sü -ü­‹“½ª®4|ôˆïåî²bÔŸæÉ×>¸¸ñýQƒ/&öµOüz);øZ©Äß1ª˜ÆÚñ”?_Pçž=ùÏ“ÿÿ5¤endstream -endobj -1372 0 obj<>/XObject<<>>>>/Annots 96 0 R>>endobj -1373 0 obj<>stream -xÕ\MsǽëWlù’ ö ä’¢H9aÊ¢d‘)]\•AP‚M`iŒ­Ÿ×=3ÝoÐ&)QN’*[ogvº§§¿få_žYŽÿY[fÕ0›.žå9~±¼û»ü’ ë1þ¹ÈªñAÁuvöŒà"kòGp‘Šƒ!#¸ÈŠ¢8(‰d ¶níýòJÆ`ÇõAÅc /²2Ï{33[ŽF4–1ØѨ?–0ôP5 e vXŒ™Š2‚ -›RF*yBœ¼ê‘•,K(/ Tà#×–u64Ž t¯*2Ž ¼0—ÉXt_ˆÎºç—Ê^$ ýáY˜Š ¢äc<’DQà¢D.¬Ý8‚Iã‚(q\\º‘ŒMgƒ(il;3r–°˜Q+J2–1ئC1VmÆCü ÀMœJæÁ(¨s*hW 4ëdxá¨ÒªæÔ(ðFn8:h3ç.2ì]NAè´!’1X¼Ä,a°Í¨?–0ضQl¹ŒÁŽËÞ‚CïUÙËX̯éúÌŒÁëÞªãøê^úXÆ`›ª·ª þ¡ø’´ß -\ý‘ƒÓƒ#(J”“æ$c°Ãæé¬x䦮ô(© @ÞH«ìAlx%»¦“È8‚x_!.ÃIƲֲÏ;ÒµÚÄŒeÓä\øÌŒeÓF½3 3áUÅWââ“â¸â#W`?‡YcdXH\IøÀÈG2Î8‚³”ñN2Û´²VÊ,¼N¢±ð ˜ -¾_L®£@D+Ùt'ƒ…Íã¥6”1ض賄¡ÜRü‡Õ%Õã\#®![RâÂœdœ–D¬.1-ageæ,c,i(ÇßYݶÃ"H¶m‰SOêA,¨”(ì$cÑ‘„0gå ÕM‚õ o$ŸÐâô:Gpä…:‰Œ#ˆ9sqåNêûÊ:„û±Ì©@Æ UÁÅØõ ÁxæÓ3ŸÆAºqœDÆDÄ/îãb™ù¡¾]2¥‰? –0XÄ.~)c°ð;% (†P…ÏÌl#É(±„ÁŽ·XÂâÄ l´UÛªFî´ÆÐDZ‚X0rèIŸTU‹dŠ26L‹ƒf±¡RàÓFN\ö×È0±Ò¿JŒ\h$c¬ÖŽõ8K,œ¶ÆYÂ`ᤠ^g C½uÝcÂqºípV -|Á‘ lA¼²’ãçƒÕ(H,a,(—cã,c°po°Q{-c°’ßË,ÒÞX°$¸Û–ff ¶Óïïe,V8’]·U©Ó­Nå«Ó @”HªÐÐIÆ`›F–¤óÈPƢƶÏ5ŽÄ&l,c°Ø Kl;k³±Ah@ÜgX¿'rŒ ú7’1ŒãCt–0رÄab Ë‚Åc:Ë,ÒÀKXvVRWÄǶ(])pq"WRþ9É Fql(c°pbØ;g ƒ…ƒ€°Î;Rïã,a‹³%«'VlÛ\L"Žº¼Äi)ãA¼²–úÑIÆA˜‚YõÐiÞb$Å  ‚ ™ ƒª3_Pä ÖP-pñJõp>±,Wv†XÂ`‘ºŽˆ R%W*ðE나ÆĤðKÒHƲ\q²Ä–劓%–0XÄvèÁg& ¦Álµ‹%½¥&rÈùZxDyP8‚²\©×œd,Ëc"–0XìLÅ&f,Ö™ËΫ‡­Dfc‡-Y’º’ÄÉ––8çò¤Œ1m.ÆYÆ`±@Ë,ÞÃcÃ’°Ar`Âø’"—`$c[’±qIqlð°¥³êa–KF@,a°ãB¶ÎÇ–P$Õ³Œ%©*ll082?Œ -DØà"²¿ÒHÆb…RÑ1ë Ö¢ÃYÆ"l.'Çff 3CÎÂbïŒa 1¡ -g ‹*$b9+™·«MµMŒ™·sšy§qšj;G0fÞÎiæƹtd í¡ˆ% R˜% vØ@4–0´‹0Á,c°š(úXÆ`µÅA,á°o,Q8eáiÙ·²'/c°H¯ Z3cZèeòšƒ…51«^´¡æV‹À 6¨¢ ý‡ »WEä¢MÉâ Ñ„—:KXT!Ý'b ƒE‰q|,aQ”¸EgƒkI;ka%~¨"‡s‡q -T‡˜¾Fl$c°ðqØWg ƒ…«™% ¥ÞXÂØÍ|fƲsâ*œUQÑ&·s®6A#ÓJ¶`Œ#ô_%¸ãŒ¸mg ‰ìÒI0Š H.Ç×9‡à`Ý%qE'rN|œCpZò§æˆ¶µx(µFý³cdÂ14Š &Ô†ŽsÁi2àœCY¤ÙÎ98&Î!6 ’VΔ •gsJ”Ç/äõÏ"›ÆøÈhL7Æ‚¸¶^e¼ŒB—;̆#‚~nbaåÜ"U" #(ÚÅÇ9„Tp!4N­W]ÖÒ?›•FF-ÎGxÜ>Z 2 "QÍRã‚‹5:çP–(Í8‚àÐ :§Ë/© ¦¶åGFlŒ£´|£Âò㨰|çtù‰Óõ:ç0-߸°ü8®ÔèiÜËóg/¾CU“gçWZÙç¸FlëìüRoØñóôùùäâz–uWÙQ·ÜÌ–›õ·ç?abm!£ÒÀ°A)Þ}œÜlf+yFì&¹|žÕò†øÃí|ú³>„Ó:*ã¯G«n­Óãâ{XÕñ׳ۋål£ÃïÓ/Wݯëùòƒªãó/äøŒ|ô»Ó¾ïV?Xu·7ú8®Wm‚;gþp;¿œÉãÈ&Ú2NpÏÿ•Cùâ;xÿ ¸ -³”P,¸¡”JÂ2ƒšŽçëéíz=ï–2ùHÜó•OýXiÅ‘å¶ÿZ«Îùš$Xw%ᜋ*ʺùC¿aœ â›w³E·ÑßqëfŸ=\.»ÛåtöÌ"ç¢N{}3YM³h8«ˆ,aÌ“è"* D‹µ·‘ÕWÐZ©ªN¨2Íž}ZNU-8Ch&F…m«¥MÌ—VKÙÊ– Jdp}ÛŽÀmûžfñþäôL¦„Ïj«h_zј/ÊÙ¶lúÍö¶wjælÒ§oÎU„cÛ³ÛxBPNÙqXt+Ý\¤IþàæãD=²Ý¡’n¢ùÌŸ?~«ïF˜k“g¼Yu›nÚ] ïì/ þŽ¨Môµ*©ë°N?½Ÿ//áre0Ú|~p“éÇùrä¯Å#v©É´ƒ -ùVßl†Û*=Åñ–gaÞy‘ÌûÝlÝ]ßn¢ŸDÚƒkÉhùoV—!ÁÛZHxĆæ àVØ„¶šÿÿNàŒ6•¢Þ÷“åë`¨YÛ<9ÏÉòR•É-šžª¡a ó2ùÍ·“õú×n¥Ï"fŽÛ4í«åtõéƈOSLsµ8qÕöÓÙdq1‘÷á&eø˜í¾[™U.óR””{<ÑSŠ’péÛ&q²Ü¬ºËÛ©/ÿ ]þÝKßÏhv÷„؉’'‹›nµ™,5Ñ©á1ì,Ÿ"êá‚ ô#{xÑ݆¤ß—¤#z6›Þ®æ›Oº7¨‹“}ì_Úþ5J*ßäm‰v }s/‡—ÿ¨“A0ÔmÃQ2Å=©ÁÙë—jÝ0K³î¾Å¢Ílæù…ÅêMW²A!w[B†}¼Ën9˜…c8ÓŠÏßFek<œÜàe‘î¦3Ý[Þç‚(žÜÄõ¤ÛÉgÎc²Æ9Ýzqq#þEfDmÞå¨[,¢‡‚בCÓÛÏ]íƒÆÑØ£Å!“ÿ=9 nÑXápþé&Äd-£´{ìs¾\o&××s@õ#¢àƒzÐÃUìw}tv<çkš­áó®j•¢ù¶ÝUoƼ!9•t¿ª!´ ¹— ¨p¯ænCâ%Y„ecñ,#šèiÄ@“Nc¦až7yäÓs]3zEþÌÛÕ|1Y©“Æý^²³ãn1 Á7³¥ì^u××!‹Áª*$??U# - ÀZ!¢Ò!GÄÙŽ«oW³Õì—ÛùzJ04tÊq:ïf“ËX}Ë' _5ÒìZRnP¹g -pÑÛ½œLµæÙRÊ¿w§û~‰ôóvÛ"$ºoàšÌøö•Ðn¹ÈÕ¬fp[Ãæy½Ý·5ÉB’­?…F*íˆ Jt9˜¢A¾#ôjç{=¸­²Üèu¨=Ä´‘và=†ËóÕíZ³#D2Ïr§S´ B i¥s NRîØÔÿìæËdà|è®ç© †æ­e™ùûöƒ4<‡ÿþê­B­_qõŽojq‚RávÊ=î©:cS‰Õ¹'¶}††ñåän3Dáq…ÅÇ;©Ã’óf9€úß]Ònˆ\›õ%ùqmÕÄtÿýÝ}² -µ±þ5Ž­Þå¾Ëj÷™b°d‹è·¦“þC–¶ìÓgÕX–:ÀM‡Ú -_F{îºOV(æj~Æ,É>l{g­µèà3$ÞÙv; -¼ÿ8 >1ÏzZ,[¯z²³kíë÷eÓÐ8‘ŽˆuŽNDyˆ8–é}˜mþ¦GAŽì÷Š÷ÀëXcâš›¸fÝVÅ’=Q\Ínßî5®:U¾4rõÝÕÔÿöâõ+Çák$wuÈí·+k‘z·}’ «¸ð]¬—›'(ÇV¡´þ«È€¯¬óp:Û ö³üÜ˾ï>tK=òˆêù®PkM¾%̱¢‘9ï„®Ïîl¶IiR/7 —\Üß}×M)¡‚¼VÝ¢+NŠ;$=h‹›Ùu’½ªc¼cÔo^žœþûèÍéù»7ßl~Ó3¯ -¥ “…]õ~nv—Ç(7Öxhþ"–‚î§ Ϩéîòþºhb‡Ó.P«`žÖ‰¸«¤þða%íá4¨O.ƒRr|²U -¥`4¨FEéºû½jÚ»öt·Kä·(¸¯CËù´9bW3‡6«Pv»L¾8Ümìm25¥l&ÕÀ5ú!| ñ¡×¶9þÁA¼~Œk¸m‰þ‡‹à(A¿F³s[„½™À/(uæW1í‘)S&š2h<Úd*{glµô.HvoÈöeÔøNA‚‹&híŒò/þ'Ïu#‹¸o²(³T?\x¿Ëò¹ì²‹×ø*ÑN™FV|n¦µ2q$LmW¸”„Oá=ÚÎC=àâ 襵²—ZèZ'+(ß\$Ï’„|Ì¿›JÖ4Ø®Älvƒëû³¥ŠÀׇsûø0Éãà¾Ý}{|¤CQi[±´œÍ.g—*2m ‘ãÁc¢àòÕ…ˆuÛÇå(Þó¶¹{å¾ÐE¸J–Ê=] îXÅn*üá™R%ácÿ)‡÷/ï¡d[ß ÚVÈþã!›Ë9ÒNm°Ÿ!á/{Oi7µÚQØ~U¿<>RÈ·NÍ×,4’ÙôïéDK÷õ#¨¨Õìè$~¹W\¦‹ê}çêî‹#)LUIøxh\<¦í}³Ñʃn†äKZq±éj讄,Öc)!ómæ„åÉÖáñYô+æ*ÉRs=[Ì!?G|+S:|?ë‘fûê@þ6Ç T¢áëtï!5®ÄR‰Á —}& ÷ «pï)_¦äÑEd7HDÓ51¾xȇéûŠÙãÙÅ<¸:©~š'²è2hë±7,R)÷g+áÝìò¡OòU”ðâ;|t>hÄù@é8ë· g‡¯_f(šM7Ùq7½] sn©…þ•'|ž7h¡F|3ŸË)xuþì‡gÿg¶[endstream -endobj -1374 0 obj<>/XObject<<>>>>/Annots 140 0 R>>endobj -1375 0 obj<>stream -xÍ\Érǽó+ú(ö¾.¦EIÉ"dù: ‰1Óð,¤ô÷~™U•ùz0I“eGXxóºª+³²r«–ÿû Èrü·Èº2«Úl¾zŸæøÅþç§È/Y[øßUV §EWÙëWY“O8‚«¬oN+XÚœCwÚGp•yko—2[å“¡ŒÁ¶²æ°rKx••Åtl¥/ªLQÊÓ&kÈH‚«l¨DLãâ•¥Œw2LZ–§­MªÀ'\Ÿ‹~Œ#(:¨D[F2)»ÓšØðÊ|ÀIþÊÈõµhÇ8‚òÊ\^i$c°u-¯t–0ؾ˜°¼§ZL¸Êºú @D‹Ï8ÉX^ÚB‹ÎªœM_aò(g&gâºZfÕõ•±—öÒ9‚xaÙžvD2 ›`6,fæÓ(ðåD®W!#(ÈEF#Ë+[Y­±á•øÑŒ«Qௌ¬iÈœ“óÜàäÈ~è@†ŒçÙ9=Ïiœžgçô<'N°s!ƒžg'ƒ-‘_×&Ëa –ãq–0Î3Ì‘ÇíÙ‡×NäúNÆGP–+NÂIÆ`ƒÁÚPÆ`¡ýšÇ Ó‡ýøXÂâœä 9ËlÙɆÚØ *¼„Ûž5ra›Œ#(¢ÊøÆHÆ`k]®³„E˜ -þ’Æaĵ:«Ë­1õxr°å&®ÓvŽ ŠNçŠ( ´ç$c°•¸Sb ƒ…»˜% v(§3”]ó™ƒEÈà™åÖ­x#y«Hª@íÞ!44È0ãb|d1Rç¬ä˜¤q -dN¥Ô¬â©¯¥§>@ ÓwG¯ÃÏMæƒÕhL,a°]7KXLº’ý´×2[w"¦³„Áö%‚§³j_Õ ~âôPsj_áý› ÆáPhDÑø¸ÈÁE`NãŠ$;É,ŽMÏ,a°ê!h,aQ Ab ‹u•“™ƒm hÃÇjL®ºB ‘œ• Ž™ŠêœC,¨ìaµ>0L -…˹³(ðI§³8çPtÐ ÈUF†Ik9ÐiR>iâtçbRÍ*#äИXHX©Ÿ4q:‹s1i+.¨22˜Oòd¬&¢@&%˜tj\Pq'Î b$c‘£‘W:KX¤ûá,a°Ã€óGc Ã@Ê vËXÌGÒ,b ÛÀ{ Äí‹ -ÚUàÚ\‘×òR#‹°âLj% Ñ`ÂÆ‚sIì|¬.©„³6Ó À–”¸°'ã¥ØÇ2#–°,I\§³á¥]ÈÄU¥iäŠR¢“Œ1-ÜsEl˜ÆgÆ[*ði#W #ʱwò¤Œ1-γaÚ&äÓaµ -|ÚÈØî"+d,**'¬žŠ"hH’S€L«§"qpâ˜UÔW:ĤZV9É,2ↆ2«6%,†"+s–1Xl öÛÅ,T0K¬F%Kg‰å@33‹™:f Kô–ã33^eu)õ–³ŒÁ"¤LfV#@¡¹˜nßžÈiòUGP¶§Ã7’1Xd,ØYg ƒj±ng C‰E)j2–1تž¼—1X8ÇÉXÂ`‘bó|fÂP1Ò˜”±ŒÁ X"Æ`µÜ¢±„±•äˆÎ†cWTßJ~ì"=‘‘Œe $üûPÆ`Q)a×},a°Èd Ž³„eƒ$èKX6Hš>Î2 ˆóc33†¢àþyÍAÚyˆq£Tઈ\«À’ŒdŒ£a% þ úw–°«ÞYÂå„5–±¨B-±„ÁÂVa>–°(Jݳ„ÁBå“™ ‹5ªm,c°].–l¬*¹Ðœ#*9Srâ -j ÛÝ’1…’£b–0X¸‡’YÂ`{ h43a‹ÖÄ2‹È„v¥­JË”Ÿ^kxI\ˆRNJ9$†¤•zœqc9䜖CiŠÎ&N¢ês!k±$ÈXÔ'¹'±„EAÒ["–0T€& ¿–1XÈ4a ‹úÄûøÌŒ¡‡R|¢³ŒÁ"aà5ÕÃø¬Ì*¸ê#‡J †dAˆŠ&lÁHÆ¢&i‹K¬¶ˆ%,Š÷ï,c°tx‰%,j’R‹XÂPzX±ŒEM»},c°(Ú D“7(ñÓjN žáÄûLï4Ž v¤±©Æ¡#`P0´o¤(8a°èIà8K,”’ž•]e æÍñ±„ÁbP¿³„¡`¬Î2 ŸÌï JBJï‡\[Zä‚iG Ò.Ta$c°ð_x¥±úJ¤"–éßöÂÈè Œq”ÞfTxY%usž9çãà®kâŠÒ¤ú³qêÉõ¨á„¥G=}-ÃPÙu駋q5[®u2<˜Wqäj±: yø A .=ª¡/±jé|caýiV&KXÛ“qu½¼ZÈ„5:ó¶:_3rƒ&>}úmÿÓ4²Ì“¾g‰êC‰^/vûkUGÞG9÷ºO¨—†"iíáb7ønsÞœÎÇõƒ|,OÛqßÂ6­Š§ž&æ›ÖŠød³˜ítϤªl£ˆ»Ký ñ×ñ·9¶wMõ*ŠHÌæóq¿ÞÉá›&Úê=ÊlâÈZ¨´ló?ŽÛíçR‹¶_0ÞÅf3nôáf¬/£"îQ~U’§ÈyïÚý;[lUëÈZÛ¦£Ö¹]lÞ‡3-×£e2Ú­Ù7Ü>ßPUðBîíï¦ ‹Æàd»c2/×ouÿË$ßóa¹»”ßp&+;¨ÛÕùüj ×+ rjSÒ½‰E/2 Õ)Ó‘ŒÞýè«q·H–øçð–$†þd¡XÖÃP‘ÿa$ÂV~q${uVëN£½–ÜköÑP†4¨îcl<”æk㦗õqðDsØöñýЬÿ9.×nÖÙ×2ü7ê½è©^éOè;XðyÊ‘Ü=öÑCáÑ’y ôtV´dÚ;÷}AA'ÒÄÁ&µ”‡j9¾ØÙúB‹lÌ´òËr}1~Ðcƒàäqm«\æ ÔžE‹¥½—€Õ ²Œ½‚}#úåò÷¸bßô¥®Ò¼Oaww„,×:_ìbˆFë,Dï.gjH“H±]Ì÷›åN_†´¸éRôÿ«¼¾?šdr!|üM~FØwë•‚¦È» Ür÷òüùó`%ˆ¦‹®wËq=»’bûqÍ‹$cË·ûÍLxaQ¤çC”ëküÏœ¯-dA'rsžÏ×»Íx±Ÿ§å61éüÌ©ïëñV½Æ ViÜVÈÀvE\¤”)fCÖÅ[Ù™ÎQNû±}ùZFŸ =ÍPéÐfëÅîøyN3òUóæý8P¸CÁ¯_W¹­–äöK¹5 £.÷ªƒ2¥ÔÞ.Ö©œK¹Ì}íÝÇß$:iàI¦b?mb¼š­4¡Fn™©Júi±¯öfÇèIY®ŠN|Šã©š*mEÛ½ëý&̉Èdnìçõò·‡/–ëýobÒl2¸Ò¨€…ªwÊFu”¸sº¡°±UL¬µ¼·¡æG=ÿçØÛ(Z²7Övt²þlà{/gqt·~ÿ ²­ÜBcˆ “Å‹òméÍ=%~·—Ž\ËR¸Ü!ª3˜,{½ÝÂmÍ/méÒëÿFZO—fíTãAß|üÕzìø£u—Ž@›UyûývÎ.wTÄÇöúF)+ÍbdइCç~14¤ø‚kõÅŽ¡ …j‰æÝÁ!BŽ6T-TýOvû(¸šM¯ìÕb÷øù߸&ÍŽzÑ'³y˜Bêöþ¾,¡Õ -J¹áb£EóI2¾xùý¯ÏTƉ—~ûƒ(óÍ÷ßrjîæç6fáèJ½ížÉ Ù±E’Áò•»Yì§ÌÚius‚7á†9FÿB=}¥[µЋq|zœr¡x_v‹dI˜#'4.q=Ö˜ýò.ö,¦,S)Š\\çUÅ-¡.*±’益v Ao8÷Ÿ·º^¸KÙg(øH¯êHø½‰I“k¶ÇÄz·œ{áŽÛVR„õ³áš¿ÎCW‰©ã:n*æfÔ{9{Ž·YŽïäÚÆoØ*¼Ëª›Q¯PYXÁ¡ÖÃÊí¿/Óþ­OT|uqpðnq×é稹ª¸Q!Ìß0)\‡jK&|»cV|‹úÔÜ?¦–O7©_³©bf#M±[ -×5æ– öü ->o\«–|,»ŠÑŸ‘Õ©ŠÏ8¿çÖOô.øÆ.ÍçÑ?âß‚p 壯¦íATãË^,cŽu Üßÿ?]ƒî°ï#™­BqØôù÷rñ!…v\“[ÇãX\£oû6=ŒïêÍ’®ñvlv^›®£‰y’¶ÇîyøìÛ½Ærv5¾Õ·AßUýéô µº:è,ËŽ$0ï¡RÍS8‡²­†¦KþrÔÅO0†iô:HcäÒf3óû)Äi+dìÆ…?Â8bPY¢ZÜh-…OÅüÒซÛ7Jrç ÐÕlûN½>:þ]ú¬àz¶ÁmÖŽ®\¾HkQ)ú5÷Ô—)æx¿…^ŽÙl·Û,Ïñ¡–¦bœì¬f××ÉV¡ôö–ñ“-©Ó^ÚÃgøÞ?~$ˆÿ‡—ºèð%$þ) ¾~ôòñ£ìÇÍø+¼nötœïW(ꬤCzÚ Hº|Ç—Ë¥,úïgþõàœÅàGendstream -endobj -1376 0 obj<>/XObject<<>>>>/Annots 185 0 R>>endobj -1377 0 obj<>stream -xÍ[M“Ç ½ëWÌ!§*KÏ÷Ç)µ–,[©HµÑ®K©JåÀåŽV´IΆä®ìŸ Àp(Ë*‰+ÛUß¼énF£Ñ£ÿ=É’ÿgI“'E,ÖOÒYŠ'úÇëèIR—þ\'E7ËX%—O\'U5«çà:ɲjÖ:Òc°e1jê1Ø:•¾­Ãë$GÏ^$ÁÅh\Á6­êFêx ]ó±T“%ÊYî¤*jêª 5a -î—õëà:éÒY^$ÎA¨šv³Â‘ƒE‡ceÈ<‡íâ lÈÀeYJÝ*I²GV€}••n!I©Ý2°n×–4kÊ9HSÊž¢¤Ç:¥ÆÊ”†~ó”'MYrÀª-Ì<쀑c3ÎAX½ÒNØêÉêÌc =[e˜SÇ: JÉxÆz 6oGm=[W˜×Öa°m=’Êc¸_šÂøÖÖc°ìzŽ%ç¬êÎœS€Niä²,‡w:²¤†UÍ.† †¸ ¨¡ƒ°’4T’ç¬ 7£¥‚Z1°9 œL’rbΚYåÚ9ˆñŠ–Õ†ì´UÖ°“ðz`Ž"¤aÄÒ°iØãÂ"ªXÃÀeX ÇH2M‰åK«m!€:QóËÖHÁÖŒdlÅÝ6 ¯>é‡u¸,k©¡’£Ûª Au˜í ‹cŸömɧ#[R²¶"pM¾íÀÀ\–ÓB*•ô˜¬Ä"9Ö0©Cý»¶ƒåYp¬Ã¤Mœ±ƒ…#y©D¬qÚîÄþ LÀe9ùx©¤Ç [5Öa°m:f&ujø¶kë0ÆJƒýµgÁV ©c¬Ã`Š8Žu˜bJ¯3VLQP‡Ñ Ì˲šDRÒc¨ƒ`T{Öa°u‹0çÚ:L¦ =ØX^æ%”nyH$^õ‘ƒãC"~‘8Ñ)¿'=‹•‚!µ©X!ËÜ‚d`Víª0½’£[¸ 5Öa°ý¾-Zt´Âƒéè ‘“`b¤Ç¤K]ë0Ø–’:Ç:L ƒ¶cE¤–6Î()pYZ"ÂJzŒAËÖa° mýÖVm(pÄAØ  ƒ(é1Ù¡ÆôÆ:Lv =ÀXv²î¤N&€e'‹ iùM&)vˆ”9qì`Ò.+ÉŒ5ap›nÖ0p’Jz E°v €±SàÈhB••A3IìEZ6hàÄ‘ %=Æ e±ë0‰DnïX‡‰m°ø=k,’6¬ãŠÀ©¤Ø"08p²JzŒn‹ŒD2Öa° åçŽu,–&ÎÚ:L¦Ðl¬Ç`Ëš¼EÛ²:y'é;«#@Õ‰\†¸\$Fz ‘ò -{‰c&e;ÌŽce3ÇŠH¤þ")pA%=V‘Œ‘b[¸@Š­ˆF¡ŽÉE"F[ìÝcE¤º¶¥‘30‘—¥ä‡FzŒn‘YBSmê1XL£gePlër6hàÈ—jlºô&ëâ0ºåŒÛXé3 Ñ,g`Ý.È®¤Ç¤ E3kÊæË -< ¹v΀zEÐ+pœ\ç`ȵã\;¶#ÔX§.s@(Zq@@:A9×6’kÖº$]€6Œ\¯Æ¤Ð‹Á6¢Ó¼Á5Òc°p«Â³ƒí(ÙvmÆåÓš±ƒÅÞéÛ’ÕÉui“`3 P«GŽÍlœƒ°zA]r'ÔÎAÈÊg#=&=iq¬Ãˆ(s0Öc°˜‡ë0éIÙ§kë0XLJåY‡aL¸—Êc°U7êYÜÛ…h/‘ À~$f¢mÍ8iWȉC^d`n8ñ¿LIiˆc-kiÈÀNüO9ay¬†R/ÔÐc°ØÑ2Çò’§å«K^µä9’fç7¹[‡É(hËš ¥ -ÿV=ÓæEC¤… ¥­Œc Z—þòo•?0äe¢”ƒbÏÁD’§–P[Û9®L!¿r,2Í‘ø· -˜ a -µ.zM̨‚pÓ8ƒà`׎ƒ!tàß:X`(üS}$º‚AtØqÙC9ƒ¢ªF‘ãÁªðo,02ûJ9ˆÁrÚŒ3 ',êž-bÂ;Ê„8¡Ð™$´c!!ÉåØsù· -˜òé5LviE‡xd*‘ûîêɷϱ¯¤ÉÕ[‰<´Jê¦L®n¸þŒÇ‹o®æ׫>Þ&O‡Í¾ßìw½ú­2jušåÔ웧ïæwû~KïPDFèäæXgFÏpJOÐÝÛåíýv¹¹%EÇðöÅùKzFÛLׄgoî=س›ån¿]^ßïûzÊ5ÚžòˆÐµŒc. ÿv¾ZýF N=¹ö¾žoæ·Ò UÞ…Qç÷ûwh´\Ì÷ËaCÍPtЕ՚ýÞmJ¯ûÑX,U`Ú+ŒvØ&ÉØ(y»œ¯¯çÔ„º‹OçVûI]„q“h ë1]—å÷äü|N4=뺑r2ãªÜ³ƒ¹ÂI+NËùÔÈõã+Õfdú³ !’ùi*ÆÓ_n£wFo67)geCW;äýKöþŠ´ vëëÙK€ÆDaªhmÛ\üRW0ûhÌë÷Ö°ØÁ­á‡Ý>¬_¬vl‚rìĈÿq‚_.Ûa7¼åY¶³ªŽÌ¡WÀ¦ºöž/W=‰Š h¦¼üm·ï×ôpQÅ~öÛ^ÞÅn Ë‚ÅöVÔÁŸ[b8Œ„öé  -Ä„º´sl-dB]ÛÅáÚ~±A¨º_PáZ™ÿúø_¾…ht†Dsäû¤†)J…£±_ ûž•È¿Â2ýîmyàÖT#!e>êÖ%/oçÖØ”¢_ÓækÞsw7lÅ‹Ñyv‰‰túçmuàˆYŠ -“wD”úÆÑë¶ÀáF<‘Ç%tza?:‚hsÖ4n!a“Ë?´ØOƒg~t„¿@v=ZE¤Ãt=ÝöØ-$ûÁžc›ûîÈÿþò_šœÔýN,ü‘îƒ>Hã -Ñ‹§Å‡…Ë~õÁ¿&Iɳíò¡ßrÀÀ½CSÄÜ*ftÈ·šŸ¿ÿi±-…×dìÕ¸ó‘úsµ Yþ •Š?”ýo¤²\½X:À -ÿš°­æÛ[Ù £ª6÷ëë,ûÍlà¬éB—ÅŒ˜]"ªÂÇ"'Ìú¢p ;&¸žšÌûùÍMœ1öÉy^õïÉŒ8åVYLz&±ÓéaÉC Î4ïEâMŒž½Ynn†÷ìJHßÍ<¯®øUœjÕbçox|, 4äaŸémKâ SøE51‰¥Íäi­ðï^`Ÿ‘=‰d{ÒÙ>4KÛ±žTã<˜ýƒDø*Ì -#qI^¬ÙUeŠP ÓlîjV»ž÷ND‡:ûš©CÇG³3.±ZΆ<ñH˜~ónÎB#°0µdý`hRÅÿNƃsE8š÷Ô8(—!~ìBØ('žúÁ](¬UÒft•hÎQ‘Šqûb¾øh™vlÙ‰3QIÜ*O”œ†éOrÔ]¿ÅvE -â{=9œzÖFýGípï6ÎåP2œÌàQåpÚ@CO£î´‘<]-QÑ`ýÚYk#£ñO ¢nt ÅQÑÌÕ æ·›a'+ ÷vE'Üñ>UãNŠn*µ˜fz“”›OY_W› îÝåŸÆˆgýõýímØãñ]‹¥5!- A"Õ4în; j¸–p€8ôH¥ŽK(Iâ›Cµ¦Qáhd±ä£ -ÃÍ@Zâ€1yAPôÕ”ãÝü¡çð+vÏGô×® YP»Ê&Ó9 ÊÓïï5dc,æüœ¾öÓr鱚$¿L=PÊg<‘h*æÄ)è„Û~´ÁAÚŽ‚÷$dþc¸fUq©åÝìÿÄÏóX¹ÛLf}¸ßßIi³}áSÃÇg¾ß•$èY†]Ö§/¸Œú UQŸšoä‚S§%íNa”¾7EMñeüXÓf¢éë¹8ðˆ®È (/Ûåïw¸ÚTùYè\ZG~£7Ÿ93¸yÇ•èÄÕ‹±níD·ó›‡ùfî'p—TÆJë…+U!\•écFS6j3qÈn¢Êë~¾âeæçéÆï0˜&M«mˆÇû%ÊŒ®¸pâÆ~òÑJ¢DWI¼ì¸áÚË}*‰zLZõýŠ£"+Nœ,ÿAÓu5Í‹»°j[·èP/ç¹Ôm’Õüy4Ñd\HDJ0–ÿå°•ŠŒ?Ø-†õݪß3kËhnúÇ‘p 8Ê‚ŽÔkvnâ©2¤™‘›x]àU§HãLÚ²‘»¯ìÎ}Ú,ß.%êŒÊ[ÿnÃ5bŽ…Ôë~ÿ¾ï7äEHDðu”(—øª ù:n®¡jãwáXЕOÜi’Ÿ^½ø7õ‰Â›- û]ÈGqIÜfn¤k”ˆX|L€TàÍÛqÇ­_™ŒR|”¨Æ~t~M;ç‚w$I§™Ñ?¸„¼&á~ÝgÄ8Œµø3¯f©»®P.Ë4™‡ã©;p5„½!¹ØK,hv*woyÄz'}¦fR©!妧È+*!‹—¹ÂËO»p—ÏÒ¯¾t¡rxx …Äd<[?’«ávJK䘬7Ãö™),ÿxwÒiù@çªÜÁ÷¤Üt¶ÆWÞªçë~ûSö=O-Ã)‘àÝËž„Èr¼§¨äHªðåjÙÇuŒ*⌃E¼…ów¯ækÙ?ñÙVø/Q<[.D;×sù~¹_¼c¥q§P†kãR|ù§Y*_þPõP³iaàb…r}öÄûˆ•ž’#ªà¤¯3û÷ª«PÅ?÷<¡³ªBGfjzàGŒz¦¿‹9v„ÿa;H`´Õ¾xFv Ï(4}=_­û$ -¥¼ºw<_~òb¸Ú&9Î2ú‚üp§gü×ýî~%áÒŽäé|ñ.ÞVáµ8wqÇû;¨óís|TÊ߇á{°¶À÷üU>>ù<ùÝ9íU?÷‹}òlXܯQ·Õ’nA÷ƒ”™4iG-È:ß_=ùדÿ; âendstream -endobj -1378 0 obj<>/XObject<<>>>>/Annots 228 0 R>>endobj -1379 0 obj<>stream -xÍ[[—ÓF~çWè-ìõîz侜 ›¼”Ø–ã —ýõûUuwUÉ6™YxHΗ>uwUuݺZü}Ï%)þwI%y•Ì÷ÒIŠ'òÇ›çô$©Š.’¼¸@Ì“‹{†\$e9© fÈEÒæ“Ì`†\$.OG ¥ÖnR˜¡–^$™kFc- 4¯Æ¨¡–Õ¤63[hSOJ‹zpåˆ+K-ÛÑÌX*ÌËI–¤BCBX—Nòð&DCoa¤ËšIkQCc,” -Eñ»bâãË›RwÚ:.`YÓ% -úHð²Õ9:0`.eÖ´4í ùµ4PøŠë…¯S^d—Ï™ÐEÖR=£˜!1)‚"&•–¦%)GÔÐ@‘¬Z‹š )%ÉÌ–šQ@0¨¡ÉÌR„Ž54m·¢^2QL¨"æ3@. ¥!NAöiPCE--jh–ƒŽå -"Gþ“ -ÂÄ×,sh˜–ß$ÐÒ~ZhIP?-¢Õ~&tÚ€¹"…-æZš¶5§Eõ -„óªù2¡ - ˜K3¸?¹u“0·†Æ´¨†`Š(ªT؃¢††¤ð((PPf)k}Ñ;HOKã4£˜!±¤#oSÐÒ@YŠú%‘WÅŒ(É,¨ç ` m™b†$P±  ¥Ö)B¯A M Qp5¨¡¡!ð`Çzv+_¤zþ˜P  i©M2Á )ì -Ø #]EV­C-MÂT¤kh†‹A MÂ!)ê…A}L†]‘ufL0†Ä´($ €”,³¬âȵ'hœ!C© 'Ë8Ž¬º³Ð@KcEðVy F MJ DmPC“ÿR«¨¥¢vl,jh S£±† -˱ëzB9j¼LÇÞ8æSÕ_Þ²ý@ÄjÉ•¨3cõk2¸¯b†¤]aG“– -Ÿ¯Šš4HéIQŽqŽ‹ìãÜɼ•¤Œ2Erúj>íQ–|æÈf¶&YÁ.? ë+_4“² 4¸:Ac´uyˆŒÝr¶þ‚º…“;Ê—E$N朣 ùž6ëœô±ÖÏã}{ÞmEùå°<› óÝ‚ -õ_QÆ -âjºÇt°¹¯×„à ùöCGÏàÐùÆ—N[ªøøM\„7„QùM¢K]Ê 7Æ¡†UtsúãG!T¼…춉BHõY¨„€7Ì‰Æ ©ÙT“Ô‰°‘w°c[øÉ#Ës‰pÒKñv3}ï-ŒN‚wWjßÙ9ãàŠã6FÙîåÅvXÇúÌžq.¦‹wÓ_|hBŸMO#›nýàÕt†úÕƒsp-'‡³Ù°[Æ@§§•~y=¬rX@ hëx -òÉ–bŽgÞ»§Kvxt~â‘"yùäákzˆžz%Qà jâøÿBõÙê -}¸6Ø3åçH j8 ŽMàõn½6,¥)]oÈéŸqÎЕª¸`‹qpöùYÌ9J0Jª8ªŽÙ¿Ø­VÃ:&¾ÚXŽØZ@bNÝúc·f»EMN§ÜDH24XÖÞ)×{²Í>t Nƒ¸BÔôìÄý¦ó§ó͇~E³Ã‡Ô;¶=‚‰¼É±¬ùæÙczwv’†³<­ù³êÝFß6®\Áçb6þf=F¥d{ƺ׈ˆ…X¢ê•BŠC1; -Ÿúí–WrŽ±¢Ó̸xÈŒà3.ÞëŒ?ô³Â£ã„ -Þ„ÿBš ø$øNv«ØƒO(ˆQsJD~óm~fŽˆÿ>ÿýòœž. -àŒÝÆ3ö1‡`͇ˆEÒÀÚ »õÌ­è¶H4› Wþ8cÖ{Þw0ÐHê|üŸ V:.×ÚЖ½•nñî ½š¤­•Á0mAìá?oõê…9³Õ+Øß+¾U›ºC_ÙÎ#E;ádXóM5}â.ßBÙßë•°igôµ¥9÷³¨‡uÍWdSCÓðÕ|ê¸-‹PÖ¦'¼<òªÁðå¹íJ²d‡åÎÿ!Ùì#;+n1ðõÔõÄÛ¤Gàð%Ã-šhÉí…%.{èå9¦/¦«Uì8ã¬.·Ä—ÊS_ã 1Jœž94nlÒaë÷D=TWÝš;KY©Å;«~³Ùù,‹ì[㲜´Yä²ý®‚Ä8¦â ŸGcâ@]M×ý&\bWéO’Hƒ,gøHÉF¸ç˜ÿóÕ|˜ýå"Úæ§Uø q5ÊPÊp-ÏѪøØwŸÈ±k?Á¥Md_wíoÁaH|Ù}ìæ|?€¸ ¥†ÝôÊO}vÐ ŠÂ8ú†m_œÃ«êó9_® ÏÅH~¹žþåË&äæpðö÷ GDô2ËØËVñœõå{ˆäŒ^¤÷bƒóª[¡s9 M­ßpUß¹Ôb%àËZùlt¨@ÈÛï°Á™:>¹Ž+^ïewÔIÓ­ ¿¢DM£§$´×V{ÓMýg4%¾{‰G‡Mÿ_ÞIúŽåʨQäAéÁ3|Çß+Uø2«Á?Ããï–ñ¹ÎÅÃW&¯×ßèv'O†ÙŽÎ@ÒMÏqn*ZN5nþðúGÚó§—÷~»÷?ðô0endstream -endobj -1380 0 obj<>/XObject<<>>>>/Annots 270 0 R>>endobj -1381 0 obj<>stream -xÕ[MsÇ ½ëWÌÍRU¸šïSJ¢b›U–͈t˜ƒ.£Ý¡8öîÌfv)9ÿ>@7³\ÆrÅ»ÊÖ›·iÝ=ú׳$ŠñoUi”•Ñró,^Äx¢ÿy÷=‰Ê¼Á7QÖ,ÖÑÅ37QQ,Jø‰šxQÎÀM”¹¾„Z ¶Îfb³’~œ‡WÖ -h¤›¨Žû!qBhœÑ|X -ëÁBÓoòB¡ŽkªE•ÊÉdâý8aœãjšo©œ˜LR-2C²Ð¢)©*@…z®ªE8ICR&"¶$/² -A¨ãêœÆ)g ­áþ@ŠÐ²a_”͆ 5¾¨á‹À¨Bu -Jö…Ha„:®I`¶B9ɦ1ÍFIšgì(Ê uœLM9!RÒ¨PR„f1;J„2B—Ä9ÙMI‹!6/0­ÀŠX, -r•ˆeÄ:N&§œŠ5ZG…’"”—½Ê uœHQÎ@ -(ÉBslfÚ6Ï:cÆ9®É¡gà $ÏÓ~ ¤Å`ñÊ°䋌·Šó…ž YØslüÀèÒPà8 ùq , ù $ÔbÌþöïgÖ`°e K˜±ƒmÒD%‹Ñ³Ôx’A0žã’¸¢))i1Ä"A¬²"6‘D->aÄ:©0‹2å „PNè©$çæ,–t‹d€é0 ¡b rœ©¤Å`ÓrÎ :À|a¬Á`±Å+˼‰RD#8_ÇZ 1ºÖ`°H:V²Å`QJ;Ö`,Aø†RɃÍ(âÖ`°y:³†Å`as;g‹Á– íàð^ƒÁÖ¼kð&Ê‘‡¬¾ƒÅ¬ì{Ùõi#EûZ€ºÞsâê@Zì]oXv½ŽeWÖ`ïzòëýXqu`-ö®7,»^Çf],0Æ´‹ k0Œ 3Ö†µ,§ù0Öb°(¤s;Ö`°eçš±ƒ…ö³÷ ±5³c &×73É“ë«™5Äõ•ÔµâzÁõŽ£BfTÒbr=e à 6§\dXƒÉõ k0S°¬Å`S6”ÎÊbrn6k0ت˜id1Œœ°‘U²Å`‘äáÜÀ F†ƒk0X,1«‘Å`9¡˜±ƒEU`-)îÃOè!îcÜç8·S•´˜ÜG•DXƒÅ¹p½ayyÉ9…ÃLÎ¥|iXƒÉ¹”nk1¹/¥½©ïµ,ŽpA` †¡8hÖb°ˆ=pŽµ˜\PÏ4âtKkIK'ddξž££¼Ã¿$Òb˜"a³Ö`1V…²âYÔtúÏ2žuœ1R%-†XÄ(x6°ƒEÔýk0XXS -¬Á°?ÊiØPY‹Á"YaÍ(+ê !P-ê0ê8.X,'%-&u¨B0¬Á`±³°$ÂXƒÁ¢>Æ„k0&ÌÏk1©C§ÌÀŠ:‰œ2EAÇ%•©’Ó„k²` ÆK¹à ¬Å`±Ï ŽŽ•)ÅrF•)1SrœÛúJZŒ)!MaÂ5¬¸5°cJ()±Ø”å“Ôr¾å"€¦d ÄòÆ ¤Å`QRUpÉ¡¡"¶¢ÆŽëp$ ‚XÇ91JZ ±ÈXƒISr®a ‹É–5lCÛ*Œ¥B;A s.vDâë ;\ÊY:kúqtžóRˆ´oD@³¬˜vÓÎ1eó‰åGÛ óQR¦r~–_2¶uTÄä”3³Á™³QR„""‡1B‡c&£œ$”Âg Y(*mäñŸU¤c0¯8R& Èã3©R,u¿ö÷øÏ*Î1\•2&HÝÀ(/K ‡w;±%6\€à0ã:puk^k8%¥ÍÓ_kÍ\§«~%nÂÞ­J¯T?87aWaë?•ˆÄÍÛǹ£P~°(7‹_Þu튡V-üéýLÏOJ“{ññ–ºO«äP««©ßßÝUA­'³§(P8­P}8K²ƒ÷ËQgm§nÕ/÷ý8ÏÐ8Ð<òh>ó:5Í,ô!9¬¾·ÝfœþÍóÆÍIævP´i·[Ø‘?·ßG¯ wœ<”*t±yë¤ØNH^²ÇN×½/èX]?‰@†Ùý÷‡ëÎUaÝÕ -Q¾¸ù¿PÊÕA)ñ -/Hè|œ‹ö·ƒ_z¸¨÷!ñq–ž{«ºj^à¡æ;ÜN¼•¶cŸa£wÝîv-å*aR—U¼Å5lݸ4`^óXD“Fܧ'ƒR§7YœþøñýùÏÿ¤!t#ðtôpös꜠:‹…8L͵¸8ý‰”@/[“lôóÐû“UéOzåû^¯ι³r=[¸4ì]óæÇ3vM(4¬˜Gþ³×M6›{Ñzš{æ]·ú¾åÃ,Z¡’ý¡nÅ;8Ÿ› ¸ù0µÃjrvFþÄ»öÙúëè‹v”l ÐA@ƒŒŸ÷† -QÜ„Šã=¨ÇK‡°Ú{zÜßHWbvØ<=ûö‚ŠöSìÛ KS³ çã[o$ËÄ2Z’ò`[b÷Íÿ¶]öÃ~ÜÝÐH¬”¤ñ;5þJõ† -§ßÃëqì N·“;¥$2ó\£Ÿ.x} [“©KLÁR½ç+?ójájÆîQRJe‚~ô½+áD­÷—í@¢Â%ñ P6fXyÑr®û·Ò-Ak¿‰½“ºx)Ö²E÷U;mI(–zRû.ºwC·”0›¿ª£‘{uøê%ôƾ\hN¯A3ÑŸÒZ.Šg¸ÅW™Ž¬K??]®èú±!pïªMÞÞ²€ñ8¿³€½õ³—œ‡ö—eõdìÏ[Û˜êýóa”¤í9/½ñ2¾ªS”:ê\Âñ/ñ¥Ž:D²%C«õˆÓçK×µ_´~aÓ‹N2ÜýÍò,-É´Öü¯dýÒT3W»F•¥[k}Ú¾šãÀm»&´„Ñ. YîóMÇÛ -%¬¦£|ÿܽ ñ&Õ&ä§nÚ¡«ðþé‡khOö²ÂÑ•÷]ãèv×I¾±ýå/ß ¼¾1ûü÷(jp|£sg½Kr´?oV#¯Œ&Gô;ÑæcÇëK#$“í„,ãÚú¸MÒºšzØŠD’ý5‚­ÆÏÃz”öµeüʉ>“ö­m:¶øŽúk–ÕðM8:ÿ_ÞzTûe±éÎàªtž®ú -°£)Øj¨<6É+(ôqo·üs|fã^âËgä·Òÿö¯W‚½5ƒþ0b—ÅÏ;Þqø­žñ£u»ïvŽðí‘ž:/OÏ_žó&Àµô¹d·o—¿²Óí^¼žÆ ?´ùím¿œÆÝxͲé›é‡è{ýSú²íÐwóÀ›nÝI𹯋ígéÒûÜzݯ]‹×ôš§Úk·è:Ióð¶Ýí°¶9`Í„H²¼i‡lo´Špþç¯$+Èê'G•¿…‘aL-o‘|Ÿ'ºº¾b÷Ùªá^½ Öjí»E(;Ë»CóúÑ—ÀAÏ…ìê>meyÓAUÃŽmŽœécßxMÏ꯱lÜLÅ_åJµÄ'Z÷î‹Nß4ÅËošš]Ø,²ìÁò¥±Ê«D‡e¾)îgïÓ‹p+ ®ÔluÑMŸz¹ÆßÛ %ùHÖí\ãz¸üzmgüíò€íîášêÿîáVŒb -²wÝ0·Ç -T‰šˆ^ß~äåI_)øî—zå~‡¯Dg=·â¯vXã‚žaφý4®nõêÆÇ ˜ÜéT9©*S àš`>ýﺡ›ZÎøƬ(}8é‡k.¯pý›Ôîá{ÿŸÿkÕèàê™{®Ô›îí|P` <¾¼–ņzðiÈ×®mŽZä~¥‚%Z7 ÎUøÐØ'ûnšÆIÔBtz€¬|tÚÿõa’qì¾s+…è1wÔ«=ʯfÕõ^Š{µsrçø=Ýz˃h©·Æe·c“ °æ_ñË ¯8}H4½œ·ûå”dûŸÈóNuj¼ü_÷ñ§IÈäY†¿ÒÉß¹âC‹Wo_¿ŠÎ§ñôa¢7ãòvƒ»ÑÖ__gT†PõZÅ }7ò©§ ú·Ëgö Rendstream -endobj -1382 0 obj<>/XObject<<>>>>/Annots 287 0 R>>endobj -1383 0 obj<>stream -xÕXËnÛ0¼û+xLVøÅS‘GSôP müŽã$,+õ#@ÿ¾»KjIÇ@íÜ: ``8ÜÑ—ZQú9PB¿^ S‹I;•„þùñGDmü¶Â„J%0·ƒ¶Â¹ª.¸¶B)Y…‚,1°ÆU¾d l׎àEKÜ --Õkj„ Ð@º®a€‘Ä”z¡™ä…µ} ˜8¥šJ‹šÉxE*Ër`â‹Ùd¡ 5ˆµ8Æ2•/ÎD²Äèc;Ô‘lc@¼—%e—d˜,1Ë2e¡¸®1=Y6qI†É³,³QÖÕ´êQ–@–M\’a²Ä,Ël”µ†je dÙÄ%&K̲ÌFY#‹’Ȳ‰K2L–˜e™²Ê%#e—d˜,1Ë2e¥)JF Ë&.É0Yb–e–dm¹d°lÏE™L–¸—Íl”õ>– ÷™%@²b ‚9™,1°ÚAu2ek¼G`ß’,›¸$Ãd‰Y–Yºé­ÃÞ“ºE(Km¦çƒ½'ÞT&n¯½†ôɲSm¯!ón Yº{ö²§gˆî‚Ý -¹Ã ¹wc(>P÷V¨~7†üaò§gˆúÔî–k3Ô¼Cá0Ct6:©ç¥Æ»[!ø„€‹ßþüd¥¶¯tåNâÙª’/ß>/XObject<<>>>>>>endobj -1385 0 obj<>stream +1375 0 obj<>/XObject<<>>>>/Annots 58 0 R>>endobj +1376 0 obj<>stream +xÍ[ÛrÇ}×Wlå%vUaïؼ¤(ÒvXe],Â¥<øe ‚$,b—ÁE²þ>çôÌôô cÙ"©¤ÊæÙƒ™éÛôôô®ÿû,MÆøšÔY’WÉlùl<ã‰þãí|’TEƒ.“¼ÕÜ&çÏ \&u5à \&i™ŽJ;°â¤y9š`Òº¥pR1pœCŠ0ãfT`\1&%€ãH•“\ä¬õo™QÕÒýŒ”\Œ£#)3–Õ¨ÂbeƒÅJºX>eÎ(iR + £ˆacä „Þ§Ôq.“IÓDÎ@ˆ™60f$- ³@ Öb°íiXƒ—I6.G¹asº©LiM¨’qU¢J„P¥æ¬Ê¸LšB'á8©JIwè@‹©J>XÒ‰'1jœ8¢8žkø“R9¹¤ØGI‹¹$c+•%‹fìb€*; K®Î0.rŠ3SÃÁ™bÁ<ÅÜq Å`¡eø-—tâÀ¼Œ±@! Šã¹ 91é˜qI‹Áfé5,6XnÇÌøÉiɉ[²Mœ¸¢¸žCìC"å DüÔ4rRØ õTÒb°EIq"k0ØŠ©À°S• Õ±N¤1Ý +…€¨Šç+W9±ä¸â¤JZ 6çÞ4¬Á`1 +ÑÇ ¶n3—âÿ¼v v‚(n!¦"’’ƒE2Á¢‘5줰nѬÍâVõ\š‹xJZŒi«†òFÖ`°˜n‹¬Á`e«Ö`²ÆYk0\.çQdËÓÔl6Ñåž«Sº\9±ä˜ã#i1Xd>ì~j1XœN0Dd ¦2cº<²3~ÅÄÊZ 6«j‘5¬s‘Cäb+ŸuPCN4œ7Ë`ûHZLU „’a [ásà V}à eïíºN™I7r. *ã9'½rª2JzeüÈ´àžŠÓZŒ±eÛÖ`*Ãx1¬ÁT†~‹¬Åô[6X×b°Ípf‹QÙ!&ff‹Á–´W\×b°²× k0Ë4V†sÊ)Îü Dˆc“‰$rJQ€Ðq(*¤sâ,œÔbš?þVXƒi~ž­qbIiy9‘” I8Ò@ DŽ„JZÌi3ꩬ›VŽ#ÑÓ +ˆÓz.M%X”´˜‹²"‰CÝ´xȲԉ' Në¹4k¨Š’cZYΰSžª†5˜šfv"¡bå¹éDEò·tQÒbŠÄ2Ü°ƒÅeÁÇL'Èφ5lÃ[ˆa †:™(«3[ ¶`ñÇ:eQD3´²¢²žK³œÑ¢¤ Ìš,†™:0p)¶i­Ì_’´˜v`ÑYVºYUI8ȵÄ495Kä „T1rb= ™!-‹ã*¬/²L»”U¤Ö`XVjÔÈZL¯°B0¬Á`á_+•ÅHV8åK3Öb°÷[œYN‹ ZË>(±´ãÝÓÊ/žÌr¬¬wâ@ÏÉM!rJÁDòCŽCDûÁBXPI‹iû”zDÖ`gû²°}À.ª:ÖÙ'÷`îR–.þœ <çdWÎÀ ŠrN?΋®¤ÅªJd*a¬ ùÈÌ0b…ŵ,¶EÇ:E‘ÀôvÅlVÈFsŠzÎi¦œAQ圢~¯·°¬’nA u_X¹8A⹊5oä ô÷ëÈÁ•Ò8Dåoãäg´8y»Æ]š£ËpÖL„ +‚ª(!x{ö”+ÞÜA~†û‡3PDaR/¦ÏžÏ4—L¯ë¨Ñ¯‹dz)Ýw<ž}3m/nçI•œôÝfÞmÖßNÅ(¤¢”£Žü°£ŒÃ¾9?~ù☿@"©36öñ0y³êÏ6òwÇ¢ñÏOûÙv‰9ÛÍ¢ïÈ2äŽ=ÍÿR§v§W§e -y¡ØÑ]*¯ÇtÞ.9‡ødR<©üûVóE‡³ä’Š¿Ž/Ö›Uë]ƒó½üÊ„ßWGžd´öQ.«.g# ¡Ñ8 ñõü›¯Ú[>Fϰʽk’E·Þ´··vØg­„ãRD*ÎæsðßýGþMÒ’ɦçÔ’MêSDræü(“á‡çmw)£Ç£b’ù§óµ$ Üðãš®ºsÊ÷üû˜fØ÷7yÍ\g +ÙÇ™äí¼uZ¡:(ÃÃÍÍ\¬‚·9MÐtÙJ.E Pé³»öz.™åN¬¼ë­Çâþk‚l t¶«ô‹íâörÑ]SIœuYäâ/]»Z8=™š'ÞÒ^Ë¡9Ð2ßÕr꽈‹ºzùI<‹ÛBpöbyׯ6m'qŒ +¬ÔD·ÞÌïäט¡ò§Òãys°RPzpl¢¸ÚÕùd5o7¼¸»á$=äÖõò‚º±¦x&³¾»Z\oWšÂQdŽSŸ“«ÅíÜ­‡]U<^A‘Ž)èQZ Ü]©ÈîÐOýV²â ?959)^¥ÇØ ~ân\š4~\lnÄN迃%6ÈzwíJªl‰IêÆËSÔliù…wq¾iW¿ÃѾ.ÕÅ÷„‚ËH‹úCŸíS¼zÂwË ÷C¶^$>„’÷Ìtæ6¤hÑÝži÷*µê]EYŒp¿ô'À¢›o.GŒ úÍçº~,wzMS)&áN”Ã;nu©Û*w|‹ƒ¾Ãý0ÿ'Æ' )9AÝŽï/4ÇIrC¤†4–´rn Îý–ÓᥥZæ²/Ý ·¢6J°Aƒª&\ ÒQ½×ÓÕ'J9ˆÊÛÅZC/÷0[ß´+”á§y(iÛíâ–W2 |ï2§S©)f”õ|õÁ•_hWKœÞÈöqêêó Kc¢É1¢»ÃUÑ'~h Yýp‚;Pm»Åo4RiÌ„³Ûnšòï"ißxC¤õî~iþ¢-懽mqúúü¢±fÁäÝÕ»ky†Rä¡šz·èšßôq*I<~5um­ŽÇÙûý_¿>žÉSôâÝx¾™!ŒD +t³®ÆرÁÇ÷œ7dŽÆÊ ïེó´O‘ïnÚàã²kI¾ä'Wúhzƒ“Ä‚Tƒä´ïþÆ×á6ñ®_½ÿWAǸôsÞ+è&Òœ H¸ÐÆ'üÆ.$ÏÓE{Ýõë°yÐd¬ƒ‡Ñ‚AÒXŠÊø¬AïÈ_XÞß™.¨‚È°æ·âE«Êù¬¿“‡4óüÙ©; ð†1œ¿³âƒS^%t؆§!4r5¾Õèä¦W×À fîbw¨Ð»6ý¬¿¥÷q7Uw%?Î?Ìå)_…Ûó+<Ç{|<ñ ¤+ê­’oV‹.$oÔ›øÏ+y0aýüêì?²±ì §÷ü¸-÷ÛILæ"Äÿ›Άn´^Ä2iá6%¾9ØMF®Ö·ù±Ÿ½×òÖãA„úŒI½üh9ì…­+Ï­ü/Û»;/rCÊϨ$ºvéJ|°ª—ÑÏä/ÿÔib»Ñøè‚J…þæ}í&ßhÙñ§íbö^"wQm¬úµä›A:ß^ —ãäÒîŪÿ2/^Xi~Jžó§xG¡w²ÃÓò”¹^õ[¹Çã-gœàÞ™¯·‹K—#‘R³Ïì¦Ò_4-¨‰ÙÆ^î)§‹õl»^ûf=þu´#§ÒNMSø +iW .=‚¯iâ…ºw‚í-ÊÊ{‹k†kZ U”¡(?îº~ÛÍæWc—áþ»7öˆox¢eƒ›ÓšÌ€_@›Ä„*øl Q*–Å;¯Ø <ÿÔÍÄ,ØCY~ŸYêÀü匰3Aê:Ð>qÆö^?ê†Å»³Wçô2jÜ:÷uòΚO½žumC¯ñtêZè¶YüêõTÔ±Må­ß!¶»´ìW.ÕØnn´šûÎí/ÛŽùå›ô—oe×áÈÔ"üÎ9x[YûwÙ—bt^¦õ°Ç-ä)—³²œÒ>ز¡¸÷çR†–ןðR:á´G9¾t†Í^û궷·ép‹IÞÎ×ýíVßÒ PÒbïõêÒ_¿ñN> 1NA{pâí/ËòÿwpúTNV¢>^ÔhbÑ]õ«¥¶fq˜5Z6\¶›ö¢uÆz"‚#$“6­9úø_X?çûGßÞ«·'ûÞ0q +áK“öÑrØMûgƒHÚ@{…cÍ•:³/ú­«tÌ%ó|>Û®énÙÿ^é¾$á5å—…;ªî7W/?à]Ixñ…w¼Õ$„íóþüå d|U¡àwÝlõé.ìãqöñ—Ôiw®Ì7YùUꎒΣƒ&ëg)ÙõÝÑÜ)5—þ8ú)“,¼T¹k×ëýêÒåTÔ°Ò&óêñ#æv{EÊôÀ[1¼ )Ex|Iï#'ý/>å9Êo~ÅòØmÿÑ(xŽï1âA )w7â›ÛvÑùp‹…þfþ›ì6Û3Þ Ž'Ùëéâ³Áj{5ÆôÔí£øæþÉD¾ga¯ _'TÙ;Û<=~C'™ëð=S>Ñc¯ kÑMö³áÞ&Ùåñ÷ÈÐT^$f½²åxG¸Ÿç¾fñŸ/=ås1tˆÇø€­Â?‡ Ÿ¿%{Ÿ»å¸–t]=nøuÙ‚ÑöÝôÙOÏþ|#žendstream +endobj +1377 0 obj<>/XObject<<>>>>/Annots 102 0 R>>endobj +1378 0 obj<>stream +xÕ\ÛrG}÷WLíÖó šs%¹/[¾f½eÙŠ¥”÷!U[45²˜ð¢Tlÿýžƒî0:‘lÙÉ&U¶»@£Ñzä_ïåÙÿçÙ¨ÈÊ&›-ï C|¢¼þžŸdM5ÁŸË¬œ òÙé=—Y=ìp.³Q5»q.³¼,;¤Ç`Gãî´Å)k Á´cŽ@qÄÀ¢Œé1Øz<(<ë0ØI9˜8¶–‡Šч +°‡F.Ï›A™5JzŒi!)„7ÖáðÐÎX‘ð2+†žnc=[ i Ùc°U5¨<ë0ØFÕÆ:ŒÇêx™ƒ)†L˜ì/ÀL9* ñ•ôÊ6cNk¬Ã4Å°;Öa*›seu¬ˆTO,h))qyA]Œô­8­c;j`aÇ: ‘Ä "ù¸$’)ryN?¬•ô-å¡Æ:Œ‡Â%&nlx(VO·F-À¹<ò¡JzL;Œ¨©±ƒäƒÚ³S¤v«õìhÒ®ÛVµ8r9ܻɌôXÖ¡Q4v,Ëj¬ÃTgOs3;¬Ö±Ñâqæb$î¤,ÞU•²5ꂪ + :.3˜ Ï4ŽÑ¥.¹&ÉY˜"GµÓ7eR˜œ— °‘Ësî×ZIa8/¬k¬Ã`áèpeâ ³“´ì¡‘ ¾VRVØÉDЉËáDãÌH¹Ú<ŠëpXÏƳXÏ„¹žt@ë1Øšvp¬Ã`'ì6cƒ:£‘ÂJ€©¹<¯øP%=¦yéDŽu˜êp‰ë0D’àa¬Ç`KF}Ç:LeÇ©Äy«¦'o €ê8¸ÌÆUbEâBä6Òcª#Ëѱƒ­ë0X¤Ÿ¹g†y‘p{6ŒlˆItX€ 9”§œƒx¤Äs#=Û0…v¬ÃHª c=‹<Ùõ˜¾2†Ün¬Ã`± ±Ó ŒÜXégŒ­6³Ç`ñœ¡cå(—ö@#J%˜¸Gö›Ž)*Šp”³-³§cÓÓ1ÚV<Åf1Å:´ðßoÖ×WÁ™Ñ¡Ië-§«é»v‰ -f‘?ŽÛå¦"ßò{E4»^=ê©wÚΰ~»ü>‚H•—¿£Þ–kê­Lê8à–~ÆדR¸Ùß­ãž^ɧ:Áf{ÕÎæÓEX Î&Þí6ó·×»6,3"›z,Â$mƒjÉö¼·ƒŒ¡T/ïvI£¶È¯ºK8é©úôÃtyµÂ3»N‘øÅ“çÏ(:;ªÎÓ4 jâX›èrRS¶/:KêÇ^oÎŒ>éìBBÜQ ¡³7ƒë"D&õŽ?žþðBÜ–%ŸuŸáT_kH1¦hGåȯ¢·z®ç‹ó@±Ó9úµäºñ¼Qô÷–¡è©ðxÓ⸠gkJõ—CçšO.xç +ÿþök•cY¸§]?¡ér84¾½ÈÝ…+&â^ã¼ë^ý¬åÇm\®C=œ¯Ó9Ìr!h$²«évû~½9qKóœs3ÚÕlóhHõ¼éðHÓPHL׸îÆbåPÔf Ý=¹ˆznù}»K^‰—]ÒÆÊVëÕÑl½¸^®8R³J,ú&?dëE¿Ø¬—ò!:Ï¿ëÙHšCÆð¦ú:n €*Â¥«áøs±ñËxþ–R#È[¢õŸc ˜ájqýn.¦à H²gGõp Ò]^´H{ËûW œQ‡ýÀ‰.CO…·H Å·¤ù³ƒŠ…˜ ƒ/<ÑÎC¤”ÎJ¿çÏE—Nsöñ*è‚#zœ’äõÕÃ÷,Ó˜¯¶»é"H$Ñú™T±ê1 þÌŸÊœrñ^Š‰¦*Ôi}~=³šùn‚ÚWRµ,D $hªÁ§áØøý†A,wp)USzz9ÝÈš»Ð‘m]El`˜§*wÑþÖ.(ÚIºSOÎœjdt,´+€&C +¦ˆÝrb¡Ø¶³,/ºXJ%2 âØp)U<_/qÞýô."}Q˜+K1lºhÜp0©q­.F…X% §rà¢Õoô¾/ϤleC@Ïñx(ã=™ÞÌWÅ/í”Ô98ÙÌ—Óy¸àS3?»$«è¬l>mÖ‹Eháý<¼ÆðÅ®^Ö|΃gÚN*|[„ˆbùýɦݴ¿^Ï·óøÚ°V|¿n§š4c¡‡ß¬=¸YƒnGxÅÚNeH»¯Ñ£éì—wè„ŽQªÓÎø­?Œà†ÜåÃx»p_…~2lÎx(Û7o÷] ó;tÞ¬6íúÞÔýñ5ÌQ†IûDŸlà•žÒŸªoŽ§³ËùJ¼“I´6WÏ6×[ Th#kG+»U'éßëù*U…>P<^ÌS_˜õ»†¼våQ{ c¼½¹yËPË+]OAH³ùVðñtu=•ˆb¾Lþž…r1ô;åâdá ,Ì x·Ýä¨|§%Cwé'v{µ:Âv8z¶øø7†=Þ$k æé+¯:vôo¾¾ýo–¡‘Q MÛß&ýZùS^{(4O¦uø>¬ž„·wdÔvÍÝ.tß +ƒA*n¼ãc|<ÜíÔz¼^.£kã-Èt.e'›5ŠÃe(«+W’ê"?ÝlÖáJKz­sH¨¯ñYR”ç~g‹‡Þ¸«2O?nw­Ôƨ¯5Vg'ëÅ|–zŒì¦bà®0ÌÅ|’˜%å1_C³OÌY…¦ÞIò+Ûë7¾¹œ†˜ŽÅÖæÀž-ýaDz‹p—íBî}ØÐm?›®èìÌ]5%~.ÁÁuÝßµ»Ê–À‘“[GçO(x««Xü }ì&h½&ƒ;KœâÔ‚a_ï½u˜‘¬ž¯ß§]a5âäÃã§2^†O›èVjÜòË•äÖ½+!\î8×R¤·§¨õíFó9êÛM¨·ÿ xH›O/ÛÚk’Ÿw2†ëwë•Ø§úðŽ{G•¤ÞGü•ÊîŽ>Ô“øåN]ÃÍç&ײpm¬fx½ž.SÃúj„Ыj9ºI:!BN¡Û7Jªì•ò +vÎíçzO^?|þò¿_½<{ýêÅ`Z¤òþP:d²°ªƒ±^`~Ê_žqýñ&Š]«ÝrÓü]&ðwÅ–Qã=Uâ7÷öZ‚ëì”Á=ÿ°ŒÑ?½#ð¯õ{ŠæÓ==¹m?œIÈD›Ý’㔺,”‚Ó >çéJÙlÇ"þSå*ÞÚÔDü½“ëM»ןþ>ÌÌì6­P¤å7ìmÛ›p¸Åá{='­¥!ã*à + &¿!Qðì»ãÿQÔëÁ(­ö5ú ÁQƒnœÞqqyÏÁLàW”:ó‹˜ötÊšÞ5ªs•gl»t^ ¥ ‡2êU8\$@›g<¼ƒô?E–h›‚¿—æ²BZ§_øYpÐ|.;_‡$ÿŇžiÞàpD{X[¬¸1MavdAb…úþÐ<¼#ÓXz®m-ï3Ó®V0ÞÉI‘%)ù9×%e:Ú¯h˜~]ø沕$—qz¾ÍåÜÇûvZÝ“'á… TÚZ,­Úö¼=}p—ª=Ÿ£Ç­ÇDÅùJZÇ!úí“ø²¿«ËfáÕ÷…ÞJ+…k©‹Þów6ÀÆÚT¸ýžÒãJÍ–Å Ý?ÿÀŽ…9:®S+õÖÖ‹’÷à_èn«^ayxOIzà«^A±mà ŒK5~?ëYùðú>/XObject<<>>>>/Annots 145 0 R>>endobj +1380 0 obj<>stream +xÍ\ÛrG}÷WÌcöA4g8ׇ­-_6mÙŽ7V6ûJQc‹1/ +/qò÷{€îÎT,Ç’¤*åÃ3}Ðíüò(ÏÆø7Ïš"›ÔÙlùh<ãûÏÿ’_²ºìðße6éFy‹ìÍ#‚ˬ8‚ˬ)Gµ#¸ÌÚzÔGp™åãÚF—ƒÍÛQEMƒ-†3[W£šÛ^fÅxÈ2[5qƒ­»@ŒÁ6í@"ÆÐo^ XÆ`Ëf bÆˬ1[Ùª”&¦ŠåieÆ +DËe +ÖHƲµ ê,aY‚‰¢ËGX–`2j¸-a°M7—0Ô8™Œ&Ô–±,.ŸÍ*[˜jV ¹®YmAL(Ø„‘ŒÁæݨ¤¦ŒÁNtÕ½-a°U.úw–0Xìl:g CÔ|<WvkÕÕ#îÖDRÝ­‰ÓíéAìÈ +Í#¸ÌºSuŽ fª»ÕIÆ¢ƒñ )c°Ø5iæj*„ƒ”<ìDÜBÕŠuÁñðHK‚˜®øçbÈ\Ú;É,ú)™% ¶«ƒ2–é惞ƒ-Å:}Ü Œz$Œ&raöÆ4aŒŒÂÄ–Qgƒ0‰ Â8KØ„16 +ÛðIP“±A˜J¼BF ¹n«®Œ#a +ñKN†NË FJ*ðN#׎á*ã¢ÓñDÌÚHÆ`k•ÃØ0$LV6R0)>däZq¤•qeHiï$c°e)ª³¦ŒÁ¶ù€UVåš¼zèdBѧ"Õ/…d,ƒÊÒ8ä„jär*p9#¯ƒ^#¨NkiœB‚ÇpC$c°’YNÙÉY§€M'qm‹•v°ˆP4 íd,CÖ˜ž³aÈF–? ©À‡Œ¬©ËJãÄÓ–ðÔ ÍÔÓ&N]«s£§uN=mj§®Õ9‚A=­“ŒÁȯs“é0[ŠÊ‰% òA“Þ–°ø‚ +jr–1XÄEXk4;‘#iVk6rm#ó5Ž ˆ*dž“ŒÁª±K,–ÓµŽ‹¨­(ÂYÂÁíq[q{ ƒ-$ô¶AÔ¢$»Uà¢F.,±qETÙ†¥‘ŒÁ–:]g ‹0HÔ–°#¦³aº*QZ>ÝÈ5â-Jãjàõ‡À=AE ÅHÆ`½ÁÈœ% ®ºu–0ØNÎeb Cб®’µe !÷,[x‚%- Ë®#Ð=ã’P4|¨rˆvðoHž´!µÏª † *0jRàó›M¥#@ '™”s1œî|'Ëd*ì@b ƒm$» –°ØˆøPgƒ-s,/±„ÁÂ0ZbÕ¾&‰-> @µ'áZâÚ΀ªAÌtÛ1€·‹Gt¢@8‚s’ËrÉ,Žx¨ÈYÂ`¡ìA[¢@±[jKJ€OàžƒENÚ¸zž0^ËIqô,µe,ŠRßf¬.ˆa¬V£aôh‰L8°Œ’ü¨ÿ +õèm’üYÚ8‚+Ôú}biÒ‰+ŸÄ 猒!ÂDñ>QÁéžsΡhDN(çBb,/ GPt%™µ#%nÒ\ŠÉHAÃ8‚à°!HU0¤×,J\¢þYlÕ7‰áŒqÑÔ1EPT¢µRé\:$N pÞΡˆ-Ô8‚àP¢Ÿú$(*‘ò…s!6|Šƒã\ŠJä–È9‡à`(JZ;-rÈ] +,H‹A’#XP±ŒqEJxjŒ£ H©ƒÄîD‘‚CQ†" +ávÁÁxQ-³>‚ÃàR¨Hã9„"5 7Ž 8l</äC±! +AjSër«BEû1Fí'2IP#‚˜"Â+ØæEw]6ÍÖûU0Ä;&ÒŸ+Ã'´7q®êÔáÿz½ÝΡ‰zÄýX¤Òo6ë:Yë"*âæpŸŸ&yò1›g +Ýõ^ô[Õ:rïÚ"“Ö¹í7¿†ãá‘ËÖì'žGªs½OAîÜWÕƒ/Ï2Ç“w(sÒ}[ýt­Y3fì‹Ó/dçm:ŠOæd—ý.Ûp(Û»ë˜÷ñé±ígûÍ|Rt¸‹¸ÿ.3EáÔ¶R8RB«ÉÖSM‘Ç)°ÊærÎÏσÅéaºøþf7_¯¦šJZb• Ðæïö›©ð"–\æuÑE|æ&ÿÜæu,q‰K'—«ý,M·úBÙàŸ”¥.TÌÒ$¸­ÌÕ…UKGÂ9*fïdYB.‰š§ïÙ—o¤WÔL¬no»ϲҎÍVýîÃzó>leÔd̘ëã“ý ~½oÍÖ‡ù´¼^à€5¿ÃÓÿÉ»~u•Ša)¾ù“Kñ Í‚PgRú#Ÿ¹%y5]jœsœ§ÂÏýv½Ø›)£æd!¸Õ½‚ z@ÚÖðD1ä^ž€ü¸šÿöøÅ|µÿM(¹€2'KXèÁ w¢íE¸Q#‡Õ6QI,?Z §iâõzê°†¿Ê +GðBüpUcÁp(ÂF–ñWÏuµÙ×KFuHxqÇу¬@8J=”¶°ÉW±äý »å.ÆÉëEŸE>2÷P8˜û +eåùnvmó— ¢‡=}ÿ@ˆ8wy¤7ÔüQsÒ¨™;@?í‡,f¸M°¸m¿ uÃAáE¼zðøKm +T³x^pmš ã‘NÜ,OîÁQÔ!£-àŽ†; +q»zJŽ>/â^õ¥Yöªß==ÿ^=Î]³“z|6….$¿o¿œ5ԚԜ᱉Çìx-ƒ‰øâåwß¿¹P^[îHô¸ÇšTvû|ªŽ¡yŽ@,Ý'‰`ÑPßDÀ#{>I3à‡˜ç]ûl4ã9 ¾b Qt2$ÑóWº$¼z/ÖëtI¨öü]½H¥Á»ŽC§ +œ<õŸÎƒ8âls‘<¸¡î¾Ü†9µ^Qü¶µ£jô©‹ËË Üè¹^âí~¥ Cƒ©ö•Ê”¯ã3§‚vÃl[0»Âè:ä†\(ÀP,©âªÜ+§BÞÆÏC¶eªÍÜ*Ê> ˆ +“o0 Üáñºö°>Ñ„<ª”›oVêQýûΉ[sãµfšªéÁö)ÜQÓ)GU7ˆìµ³{2“¯Âk5§.ɶ}¿\ôÛ`xfaÆ?OyVHåi~ë‰59‘—vª<>Ç~Ü¿ÍçØ'høDëDp¢þ5ÝãÆbµ“ûù”ÓãÁŠ/¨ü }_ÍDÎ(¼äÀqw ™3“O}9}.Áœ^Ë£¤Ç/ƒQÊóÎZ¯™ä½…EH'Tóyê¿ÕæéÞ7°Gûï”›£ß¢ê&ñþÝXøGÁÞh½&ìáºo÷óébýNGƒ¾'åÝkíAkgÒ„uÝmÒÕ©@éD4ó+T*k‹`Ñ‹„·ó]Ê­’û„ûò´UzäŠÕiµ½žÆBž*?X"ª«Èq6PXt²Ia·×Ie¬?¬úÍöz®O‘±—Õz¾uäíÒÂ[o})[üSô/õáùß›'/Ÿ>É^oÖ?÷³]ö|=Û/#X„ ÿß™ªƒ!5x܃Ïçó¹¬Ý?/ýçÑÿ¦hB endstream +endobj +1381 0 obj<>/XObject<<>>>>/Annots 190 0 R>>endobj +1382 0 obj<>stream +xÍ[M“ÜÆ ½ëWðƒS•³ùÍSj-Y±R–j#­£T¥ràÎpW´w†›™Y)þ÷yºÑàpôaI³vReï›ÇîÐh Òÿ}ä’ÿwI%y•,×ÒEŠ_ô/ÿF¿$UÑâŸë$o΃ÛäÕ#×IY.*øNšjQÎÀuâ +·È i1Ø*›²ƒm²EmǼN²¬,k1Ø¢ž²ƒmÜ¢03[ ;dé¢1¬Å`‹j"s^‘ óC`¦F™ÐÀuÒ6dB~8¡ª‹³i1Øl:­Å`디щ-&3•dDeË‚$Ì2È‚+H´ª˜6-È”´lÅž£¬L›¶$LË Në9‡mÚJZŒi›’U–[¶dqo\4-7p.­±‘´Ó™e ›×XÔŒ5lÝÂV†5æÍ‹EkX¸Éù@‰„ ¢Àžsi[•JZL"¥Ø5à .ˆEãXƒÁâNXƒ!°cut¬Å` rÒ8³Å`ëbÊLdžbD+¦¨Úx0JÑžóª+i±š"²bŠ0VT¬ÁjŠÈŠ)üX¯º²ÓÎÖØÄ(²ÅdŠŠ¶/Ž5¦p5mŸ²tVÊ"çÃÁaUYÂ@e#ÇQ6ŒsŽBL$-&—ÈÉø¼Mk1XœVHYƒ¡ f†ÿ+k1Ù!Ÿ¬k1ÙB“k0¹ÄT*‹Á¶~âXqlo<ì ¢Ãx®åáœP±#OJ%-‹8ˆ³¡¬,‰Ý¢ü'Ç•A\ÒsÎ¥4­’„!{`¡5쫬L›’á´ â´žCÄÅ®)g m)åãHZ¬[ªCýûy3þwKXÔut@$;`àØã"g òW©“Ð8Éê9ÌZ ¶t°„a † q$Œ¬Å`‘ûìX‹ÁVØÍXƒÁâ¸[©,†û¥)ŒÇZ –3¦a)Ay¬ßRº¥sŽªCRÂ- 1¹gX4Ð@XIò“Dòžeä tTà +¢ ôA#r²g~\KUPä ÄzyC‚ÆIYCG•QÐAÔÐsy ’ìí9ê58‡r¡„.ô$“dš)_M#€86Mà„lý“DZ E*ª1ãP®Eòš|Î[\@œÖsΑ$‘´˜¼6§EùY^Ô`Z”ÊOÃ,>mÇ’O ¶ (ÇŠÀ?Z“å ¢Àžs)I‹!WÄ–eÃX¬eubg0Æ"ˆV–5˜ÔáÓ±ƒ…#Y©D訵`Î ªã9‡B ¤Å Ž¬Á`›tÊLêTðm3Ö`Œ“ûë̃-©”4¬Á`kŠ8†5˜bJ­#+¦Èé–\‘A4…ç¨à‡HJZ uŒ°;‘5lÕ ÌÖ`2åàÈÊiE¨)/g@"aƒ±žCº€DʈI‘ê,i1Xœ,©CÅ +©\‘ä`3ˆVðeU˜^I‹1-Ü‹FÖ`°ýv,/šµæ¢#@ œ“HZLºÔÐÅ°ƒmÈŽ†5˜¥‚ÈŠH¸?èÁÈD‘<'w­HZŒE º™Ö`°5•‘•E+¹B±ñ3qQÏùE”´˜ì@oj1Ù’GdÙÉ2¸:™Z”,p´¤å'™¤”!¿iì¥õ5 £80«°Yþ¤e â@ÏI I‹¡ÎСSàp´¡ÊŠmöb[qQω#gJZŒEÑœÈ09ÍCC-&‘Èí k0±5¿e#‹* ëÌ"0 +Gƒ(°ç$FÒbL›;I‡Z  ,YƒÁâˆ`ã"k0Y˜Bsd-‹Û¼EDz:®‘òí/@Õ œC\α4=É6"áæZZÖ`R–:f¬Á¢¬3¬ˆÄgÐû¡È(’ç¼HŒŒH"k0…  ±YƒÁ"w·†‘ðˆ _±!Ähž£¦ 4UÒbL‹ÊšFÖ`°ØFËÊ¢pluäÕâß²¨çÈw*>Þù &M)Ä¡2-š.êÀŽA4¯ç¼ìJZLºP4‹CÙœÜBòµ6=Þ°…°ÛÐËs\\GÎ@Ür2žŽ3ëñ3’ƒE it¨Åt$¨J¬Å`j'¬Á`¡gmÇ ç~¯ëZ ; Ì·RY ¶l'3sÄÇ…ž|Œ#<ÿMÛ÷@ÓDíX?†ÿÖ1ž‘ë†R<QZ/ü·ò \ ÍÖpшÆÆIBw7P‚C0Eû1pìlØc½žðßêjž!ùÐì¡Çˆ2öÜW9–‰KÛü·Êî´¹ézåý/"’R„R‚Ã*¸ë…a,;îÎzæùo•Ý3ä‡ÆôË¡Ãr°‡ä“…ø0Î@pE +ù•ûîòÑ·O)¤'—×õ^ÔEr¹â7øyùÍewuÛ'ãuòxÜìûÍ~÷çËŸ1 +¾éhÔ™v–Ñ°o¿éîöý–ž¡Ã‰ù0Éê8ò‚~C%~ùéųñc(+ËðãE¿]»Ý0nˆ‚ª6ó3|7ÈÒ¸f¥Míì6+zÅfÑ„_›ÕøŽÅDJª+zÓB"¼¸d PCd­ÿé|¹ìwü$imf M·ã-K‡„èrÿøÃ.¨Ã'êgðß&«` +1Xš¬k¦ûçп674Ì_å…Ÿîz¸íY$lž®1²íPË´úÓjØöËý¸ý•gÀ%¦òÜ©µX‡ÁF¨ÅéþWW$Æ‚ÿÎŽµ¦`vóiP­ +BÇ-¡q{ +9Ðï›9(ƒ{K]è“Íôy2Ù´=ÔcæJåÅé·bªUЯ ¦ª”Sw|>®†ë_ƒCbkR/iòÕ²X©ß÷©¬_ ÕµxcÛLv¯šªü ‘kÛ-÷!®àˆêÖ½öohô¿rµÄþœÌjá4íöˆ6Ý–Îqê‚Ù^uë«Ž¦À•2Æ«å¶ïö< Z?i"ÖºÛýÂË¡ÍT‡Ðt×m»uåH F‘Õ¼Q²MÄ©+Ô¿¿]Ž:Y·ßo‡«{±GŒ‡ëîî.ø*Œ^ù úÙT·d}“¿rÎIg¸7~8Ix3 Yâz¸¹ßzéP{£³ï#óÅùsÞd¼jjÃÎ_ûÐŽœ¤¿­QDqv+$¼Zç€9hT˜U"ê xÛÝÞJ*@¥­3­»MwÓ‹s¢ØÐ×Ý×7ûaÙïGÕÞ"YsRü ›TL¥¹.GÅú“[ˆQ4Ó? >I“"!Ò'Á@ˆþ¨7>.ËýbR4=kmJCßzzXžì‡a[ÎçFþ¢üy +5ŽöëÌ!8A²X¸E>Õ$ŘVRÁ›£› xk€6슘ICän}µXâîoÞ<Ø66™ø¥– ôFÝGÏ°ì¨9Ã?Œ»½?¿u±H8œãª6øù°ÜŽ»ñšO$%Ø*0‡^›êÙ õ•§jÊW¿îöýš4À#×Êw¿í%Y ¼ÕÉ¥ F=ŸkùnüŸ ›\L¨G;kqe´Nƒ{ÎÔižmªî9‡†j3˜çóÜõëŽÎp‡žø>©1/L_Œûž•@áþ{Ç5CS¸55"I™ºµoãÖHJÁ¯éÖ½çþînÜŠcòÚ_„T†ÿ£)Ñ¥hãZGÌ玈ËÙJ<‘‡#ôà²ÏmÎêÚD_\ §iiñˆ'ó)ö¯Ú “SD:ÌOÑcªpcm“û¿ïÈÿþôÚ4ùÔýVZÍëƒ>Ä¡S!{ó¶Øûê«~ô¡~€fƒ'Ûá­¯Íñr¯ÎCû Tt¨·jH’ïÿ‡2áXJá3fÁ™yO`”&\ŠÜJ ˜¨¾©Šå'@¼]Ó‚í¶ÛÞH‚BªØܯ¯|·Ç&³‘«‚Iƒ]"¨Âß½ž0ò6 ùÞ¥: &hŸÌöý|µ +;Æ~‚%/úw4 Úz¥^õ61ÞàÞl1Äàxa`ï¿È3’cQH†æÜ*ð‰Ã¾ã¡3‰«Öt÷ +áKÍG$d‘äÙš]•E§k¾Vs—ãx»ë9w":T_vEÿDMÞ÷XËW³3þf(ú¨Â„é×o:eD Së‡Cã*þWò:¼¶Îss}Ÿ§úÝ+ç?²PÈ¥ÖSß›…üY%m&‰æü3^털}Ñ-ÁZ¶ÉÁø:”ħ3%çaú79ê®ß"]qìÀ÷–¡ö;Õn7h‡ÏLà<üU· ô9ô6ŠÞv¨‘’Ç·:¬_³p¡7rTŽSüt;è³âíÏ´Î{2t7›q''ÞDüAj<±I+Í‚ŸLw߯Ì$ú§Ó’›oY'Ìߟ°o^|Ür(ÿ¼°{Ò_ÝßÜø8cYãË$R-ãî¶#^{­% =ÐE©åÖ2>d;TkŽFv¯K>é0¬FÒ¯©‚#&Ïèô=µ +yÓ½í9üã !²ç)+´ƒns’½+7ÛÎyÀx_~w¨!cÙñïôI­¶KU2ü0Í@%_ØñD¢©˜· ¦ý`ƒvZ¶‹yyö÷ñŠUµ/3wŠñâgYxµ°™íúx¿¿“Ö2v9øÂÁvœ¶ zæemù‚÷½³Øó骢?Õmä’‚[g,ÚÂh}?l)ºšâ?ò›j*¯bl%ó²“ ¾²Òyå«åv¸ã|‡ÏrTþD:wüQßè«öSo]˜¿åÎ tâîÅT·f¶‹ç«·ÝféßOà+¸Â—WÉ…iU!\ú}aþðßA›™C¶3U^ö€†qŸV6Ã`›´¬>\è!°(cÞqñ÷äÈ'í$J¬5ÄŸ6Ãõ Û6éü8ÞŒ›c¢O^õûw}¿¡ÃHŽ/@%…$öÚû‘o2|dž|Òqô[‘ûOè>sf¥+|Âà.béo,SZþ¾áÛ§ÚÏñÅɤF +’¾ö:¿¢Ð³ä#Š,ó‡ªóào¢Ñ^PÚ’=vmÕbVäýqôðLúª¸ Nå?Z ÁñÔø:)½‹íøvXÉmϾøyˆÓi×ðŠÍ®º¤Ü¼ ¿¤œx™¹¹þ´óï2²EzâK«ýøß­o=vñÑšîÖ£$;&í1¾g³^Û_$ÔàS±ßå:ëuUå^°’róÝš¾3DcPõ|Ù¯ñŠB2^ì!Â)‘!ï·Ì ‡Ä$ùWa¶þ[«¯Õ üÐþ}ûßõÊ÷m5¦ÿ‘:ÿ×ø¼íÕùóïΑµÇŸñMZòd\Þ¯Qwê==§¦/EË:mék¸á-©ùýå£<ú?F\­Ãendstream +endobj +1383 0 obj<>/XObject<<>>>>/Annots 234 0 R>>endobj +1384 0 obj<>stream +xÍ[[w7~÷¯˜ÇìƒÕáÜçi“lRŸ­ãlì4û:–äD¤qu±Oÿý~H#É[w×—´çÄþæ’ € 8þýÈ%)þwI%y•ŒGé(ÅýçÓ{z’TE‹IÞŽœóäâÈÀER–£Êp.’6e†3p‘¸<ƒ­Ý¨0M-^$™km-›WCÖ`°e5ªMσmêQiYƒ1®He1زô\4…y9j0…MA21 )4P¦Ê*IS0Ø*#‘"k0Nk}—:¶l1dE¤,Ã’‘D‘<ç\>Ê“JI‹!Û…a Ûdƒ¶2hÚBÎ0(ƒ8¨ç\îhÆ”´ݶl…‘5˜4å9S–-[²?¨4pØ$‘´ƒfÄ6¬Á`ËšÖ`°°áʲCà,Œ+79;›GÉ +ì9#tI$-&‘ +XKdaûiRV-aÙ( n DC—’.ü&‘„3mé²fÔZÖ`´…gc–´­èGS3+D]<ç +róHJÂz «Æ 6ôœ+š%¥!‡”ÐAlè9‡iÇ„(i1Í™½a [“ãDVæÖÕ¼d2™ hPin-Š’Ò0ÍÍ¢0ˆ =G‹€iW’d/jòi”P;Êã(9!LZ`ÜHZL3@#Ö`°ˆ=Ö`°ìn±-«YTù°Oí P5G"8CZŒnÙplj1 LQ7²2hI‘$ Ê ê9‡Y-“BI‹Ñ-æ3·¬Á4h +K0m ÛUGVDÊ)ΑD‘<×ò)g :-xÙ””N³‚}L&—AìÔs^/%-&=É +‹È .9R–ݬ€5« + A9fÎ¥ M¿I¤Å4¨£É¬Á`y‡6¬Á`ò|ÃŒ¨Šž Žöl1XÄç̲ƒ…¥Ú¶<Ã9AÍW€ÎpàZ§ˆœ7-až‘´,o³†5,– KÀ“h0ØšV.²"nSFÃÏDq='ò)g Š«¤×·tpYƒÑ–ÃLâ¦X7ÃŒ¹G$‡2Ú³(ƒ S]&g•ñœH¯œªŒ’^ßÒ+YQ&°"|d Ve"+Êø¶”ŽBUeEø(m‡ìª9ƒ¨ŒçZZ¼Èˆ!3J$#i1XÄ ©ÝZ á)·¬Á`« +NnÚ ægYQ¦ D8(à *ã9‘^9Ñ©(£¤Å`‹Œæ!²ƒÅþ‡‰ˆ¬Á0$d€–q󌸢ˆŸ3 q DÒPcy"g †t"i1XÞ k0 D!:²"“ƒ•HÀ +ä9Ùs%-¦9¢m/²”d­$öœ + ^ ÄŠÑq-r¢OˆšÒb°YcS‹Áb§°³šY-I?Û¼5“ÀIúI‹Ñ-oG†5,ŒªI"+ƒÂ|5bg â žÃÑŠ*g I;$yÏËRBÁ›œêÔ@4„éaøM‘ÎzÓóŸ€ØÐsñj0Š qÒÐô9czÎe #)úcQßÌp§”[„”äEÎ@¨NÛÔÐb°0ÙÂ4µÆŽ|ÕVæ.¥“D˜;QÏѤ—ðz“¥¥¹spBtÚ0pÎQ¬ˆ$ù«(;ó²j‡!œrlø‘3‚’,‘3f§€DÒb°H(ZË ã  d1XÚA[ƒ1³Y⸼Ԏ÷> àÉ£¥œøS$¥an’rÇ 6ôœ«œ•SòØÐb°ˆüˆÆ`= [SŠ,Ûˆ™·Ô’ý+pä&™7OîÖ`t‹árËLƒVð”ر ÊGÿ0(ƒ8¨çü JZ¬ƒFV m‘Q`PeÉ6ùhàM“§Ù2=Ö¨LDÞ,•a«ôm$J*e D„sW2, E2 S­êñï*ƒgxTe"BE‹ÔžÚD„qxJµ‘$¯rl‚8ùknÇ¿S‡¼QxF¢¢RÛL… +D%±‚#›0{T`"‚ œr(õúòè§wˆiryÍ;xŠ[]$—.ƒâñøÕew5Ÿ&ýuò¦_n¦ËÍúo—¿¡bƒ£VÇ´ñ£ÙqFÍ^½ùÖÝl¦+z‡Ö:™¼‚#Žè<&<ù¼œ]Ϧ~åƦöoþÒí—<”m›Ì?¾šnî¦Ó%½ŽÙÀ6៙-'ý¿_ ¦YQQ—üpÉãaV²ðj·äÑPû(´ÛÏNÿÍ"`IË Úv=[~¥§pÙÆ…æé +ƒÑóŸÞÁ³Eý¬Â)®l1TæÅÈÐ.ÏÚR}%ôy6¯úu½¡öžê%=of·SQ¼®üã·³Õt¼éWpƒbÔ¦a*.¦«ÛÙx*s„„-o¤ÉèñÿkýصnGÁ|OÁÝ‚•È`ÎK”xQY9uÕ.îf›ñ7¯s]äO¦À=Sô¢l¶;X;±T»vçÛ¯_É x)`eaQO¶›op‰Ù¸ÛÌz¶Í +‡]Ù³~²Ë:¡0›W~iï‘éÿ{4ÂáqW¡ro­>¯ÅE±–ºVÞ=°ŸTªÁûU¿½áe²þqú–ÁÐsu™“ù¼³€ºäSZ¥ÎTÛ’ Çtvƒ£ —±ÚÓúÓt½³ÿaq›°É›nüÍû;…¬ »òŒ¿}hOê#k˜…pº\oºù\Í®ÄÑ.å¡uD쾞}Ý®´XçQ0è–7».‡JþÞZ.7+xB£øª_AÁçwo—¦ll maÖÔÊÑþÓô÷-â÷"ì—Ø$BÐØëø9áÛlGôý8~9]o‚; d«º$‘-·iðç[v(õ‹ÂçsèÆzQÞ»ÈÅÿÕc~™-f6VÂ8Lèëå~¢.̦U#qÚVÍŽ¡JÀÇsd'Þ'¢Ó¿œìad¯ƒM éî êðeáK %¶™Ôðtq³êo%7D…ÇÁj%©»Z!ÕóÆI9T¬s¶ä %h¤¡òîº[\uô•.ÝЂ´OøÕ¤ˆ”!Ûe ñN—õü–2ºéµ#µ2Ÿ!ëj¹ðh0(`T^ß'Ôèp×^Ïc'ML ÁPu{m— ¹‰fãëíÍM¿’íØÄ]Éct%qn)ÂDê žªžÈRcØ/G9UÏ« â‚—ÇKUs5]÷ómØÆP¯Í0_l¡O ëºTup Ô²‡ÁæÞ•ëè$#[<\súõöj9•ã!¢q–¿Àv0ÂU1­À1jÓƒÅÂÍê^ŠñsχR–æ|ɤ—tŸ|´ÁÒU‡ç˜ñŠº4nÛŠ:œ;þ‰¿Æ®»~õÞtòwz‚úÞ£ŸàÂDdð™eÞI%/¦Ýïs?%ïÇÉHSŽ¦tÞ !öËé‡ ž{8ÀÑáŒ5E 9÷ÇúXæc½‚ëD¾J_1Y—ÝI ®ù½®p ZíÏÒù§¾ÿtþù#¯5ŠŸ¡(òX +Ç~`ö¬z–îˆ`‡ÎýLº¿=?;9ý@2¡H«¾~ôßPè•ÅGp¸øÍpÞõ«qHsQgRÿÕ͆Έz¼ÝôÔ+.Ôã®tÅÕøGŒ(ðkØÂÕíÝ:ÔÃpðµ¤GW{¯CÜØîø;œˆ³îû_˜‡NúE'~€¯ó4X ôÖzÛžœúxY||°£4rQ¢Pï )ã‡~#õ*ÿ»«^4x1®!bz7c!© |~KqÝd‚ ~ík<¸® ùÀ£êu 3çjQµÚ©`!¹”­Î¨z†²ÇìÆ—¯P7i3lóºóµDhV=]l: ÄÎ#¯“=B DǺ?=BHd7Gˆ‹M7þ®%;\Þk}ù×w¼gQéK“´Å P‡«ÔÈÐP駵ç¤PqûBP:î^‰&«[ó¡"Ðx¯„ˆôŒiš×o llÆ^µ«N¹þ³Å~³N(#•(Á¿`&=‚§É¹;ƒâ)´ŸovÛÉŒ#LÑéE%7ž”Àýî¢ìßbàJâ±Êñ -‚ørmWƒýòŽ(J§œŠ¿@rj&>üêœT±Q¹lZÕî3D.œM´Êa<W ñØÙÝv³¹Æ¿lT„k¥é|=½û6]É]¾yžIJ:Üîi¹ï+o±FWÝz*±šMóEý%ˆ¿ïéðe^ö¾èv=î–œn<åO°ŸýÄÞ²»Ä{Û‡–çää`öÖ“19ÿãÀ¯%µà†DSŒu¿]ÙØðÑRÖ†[Þq?ÙϾng|xÂPM8'o~•íYZúÔÛ2JY»[0Ò†¸cƒÝݨvn)~Œ€ˆI49®‡âïì³fnu½îYÜ >)úß”Ûjìƒ òq^ +zÂ?±µ­;ð=ºE³‹)?¦ænzEÖ€¯ ÚôÙýXC%j/I³ýˆó4ß²ëâÆŸ˜¿X¢®ã¾zHª/çxŽâµ-_-º››pS€‹jýŠãçó/—ç¼®ˆRås×(QÚ§±Ž~ª‘“ºQõâ`ˆ½Á®_-º¥ÄY\í¢ê'+›ÌÖë­/iâ ˆ¿t|ÖmßîTTÀ¹2®w†1õM¿¸éV³µÿ_1þAÕërŒOm–‰oh‡ò_ôãïSÎóéâIë@ý Ý„]SËHÿÇ^tyð}Í„¿?HüÅ#±Œ+»‹“³×' ®6~çHÉÛ~¼¥mýˆ §o¶˜[3^¿¥ÅþÇåÑ¿Žþ÷Zendstream +endobj +1385 0 obj<>/XObject<<>>>>/Annots 278 0 R>>endobj +1386 0 obj<>stream +xÕ[MsÇ ½ëWÌÍrU¸Üùž9¥d*’YeÙŠHG>è2Z¥µ¹;ÌìRRòëót˜Ý¥­RI$“T%|ó¶Ñ@èßÒdŽÿ¦I%y•,Væ³9¾èÿ¼zN_’ªhñ¿«$ogiWÉÙ#WIYÎ*Ç9¸JÚù¬qœƒ«$- í„z ¶É'bóŠ~œ—‡.ÔÒÁU‚vEø!qBè<ŸeŽ¡Y†ž¢P&4pÍ|Ö&•rŠP(©¤·FÊÀ„®nfeR)ç ¥AÉB˶ÂðƒP*4r¬¯qF¡FŠPü„LÌ“X20¡khÚs„–ho¤­Z3TÉÀ„N†¦œƒšÖ³<±†"´¬ÌP%8‘¢œƒ$´šÕpW’B EhAþ²‚SÀ%â„çð~ã„ÐŒ¼ØHZ5%F¯«F÷G‹(r¼LŒsýµð6ãDyN¶àH¨Ç`krcEEx½®š’µƒŽü }*é1Í\Cb•e±V³®*6r"ÆHiîæ°²c&–:5–ÃEQ×l®¦ÀJ@:ˆ†s²°‘“X2¸c[¦˜+c¥ÓŠzCháNX§Kš ‹’ClÒ”±è‹ÜDÄ20±K‹šÆ£¤4ÌéclÈÀ.Ì´’ë$(+…+›AXö“"pAŒ’ClQÐh•¥Å· O^JaBIup…,„…i7ÃŒ‘ŽœjrÔÌA„,Ê<Æ9ˆ¡ ®¦Žd sè¢ +P #¯ÆXø‡Ü!å¼(-š °vk2êqÒ`*¬.#e0yfÑq…ÈŠ©uXMo¬˜>¶Së°š^Ù`úÐ6˜ÚXqe)º˜BYn’K^íÖÖaL2¦Ç`Ñ­±ƒÅ>ËÄX‡ÁV%×X‡ÁBûI¿ƒEl…ù¬­Ãdz*åŒõ˜L_OfCLCQŽ’eÎÀL8ÚÇ`•ô˜V=e Ç: ¶ \äX‡iÕSRr¬ÃdzÖÚ¯Ç`3ž(c&ãÒÞË${ ¶.'yŒINy’U²Ç`QoÀ¸Æ: “ ë0X¸˜•Ç`azkë0XT6~&Å|©ì'Ä| Ì| +WIÉ|TIdÆ:,Æ…éË+(JF†Ðj¬Ãd\VÇX‡É¸´Ë³¶“ù2 +¼ÚÖc°mJ&0ÖaL”me=‹Øë0™ ™h$évN‹=ìY34É\ „²¼£1Òc°ØÑ`µ©Ç2Qð +eÙ²i#»:¶¬µläRĨ5ý’H!1iÂ: Q§ñm‹Í<ë0æåtîXÁ"Y•ŽujÙŠ: LÀ¥[Ãmè—¬ŽÃ¤UŽu,VVáY‡Á¢>Æ€M²Ã0¯8c=&u椎¶uðQÃfÊÀÔ \šSia¤Ç4à†æ_›zŒN¹à1Öc°XgPGÛÊièhAf˜ )p²ôi—W‡¡zN0†„4…ë0X1«±cH()álÊòÂIQ éÂ@Câ…9Y(FzŒN!Fg9ÔTÄf²“9 Llà‚%=†Xä +ˆ5ÖaÒ”‚ªc‹å°¶ƒmyY)K…6r4ù +’v*³&ŠÂn†ÅzÐ>3´¡­\@”ƒè +‘Ëq<5¨fõÿÖ‰ ­±4QŠ!æ©•øomè„ÓAú1†0rá 4R,›1;᣿U\`°#ÃÉTd ‘8Š“J±¸Bvællþ[Åã™'Ê‚89l!ÔˆÅñ1OŒå´?Wq‘ Ê€(i|´37Πt†DERß‚ÃRE:SÎ 8Œ‰0r?œ?:~†["Ma ð§ÉwE ,YžŒ}· Ú¡ÏtÝ=‡›kú1îÎZÈ–z9—Ë+É•(D”¸ËÉÀQ ëø™¥jª¯Ý*„šét¾^®/†ìœÐÒ2Ûw-g;T@åIlA»#ìí¦eŸ§ÑÏçlaì4}sÚ‡gD+Þ¥±vûŠêÑíÕ®~b3:ƒŒ òly!Ar«µ·Wt1­Þúó°§Dª5ßnßw€£z-Í +ðGœ²ý¼v/ºõE·ÆÿÅè¶2*^ûe†b½ çh ]¤YKã:â»ÊH!ì•Y ú›M?ÎúOR`§d`Ž*ò.ÿˆÃo³;H½ë‡þ¼çê–ʦ<º³Ó§¼ŽËÚw9úý¾¢>xG‚åá]kgSr[¨ÃÉÜüø·—¤U›¦ü^ëø Ï_¸"$Åb +;ý—¤*Dk-ÚŸ\_÷ë‹å'Yêx“RשrwFÃ)/ÜÁS˜‹Jݶ‰ÅA {›åå—øíÞ.¯–Ûšö>—“Ó âІÆëR0õ^™î&à_þú5qën*ò>QPçÇõ“µ…ÓãiÒ=;ù…”À]‰&™ä×õ2x*qŸÊľ£R8ÖšdÚt÷ãéϧll»Ž‡íjCÜ©í[¼ê/~ì8Œ£,µÃ˜Ÿ–ë±Î’â6?yÕ¯ÞŽH¾Û£ÓS²'ƒš¸7‹ÛÿÇ 4Y@vÚ…Xÿn â’yÞõØUq談dؾ—´ÉûäôÙÿ7‘Zd-ܧ±±–ü¶³BÒqJ.3cÕ}µ³,qÕ7]–/ºÅr½6ï©%<%EÒ—ýJPãïDÐÁi*¬o¯Ç¡‚nGüXÆ»s¬uƒýËXÜbZÝ+‡ÁRªâ¡~îø[T —Õ»Jí—ô?†ã„P-¶ÝšÔBf%°,Ló¼d1¬/—ïnF®.i7FþåìXf˱¼îFÞ¾ÂÕÓ&žúá¤yÝ/$Là¦-zu2ÈŽÏUôÓç eÅÝAÜ´t¼ÍÄ-ÆÇѵ+/Å/wm™à„š'ÛÑ:žñq¶80>{g?oðœjwþ÷7÷:ÿôÜT½y¼ØØ!ÙÙl°Ò›ïÿF“×M'ã U¦ù—8 W# ËñLZEuÀÆÙŒsƒ‹¥i€&:m\cx³Jå¸[žäYZÓûÛ¤'â¿4Ô<Ô® EeÙæâC¿vk®ü&» àþÆÁ®/2Ÿå>¾ïyY¡ø4o:8o‡ÎoìèC?n–ÃúÍ÷¤ÞÙn{)ŽÛ xh’`ë'ùÆß|þJ`ÿÆè‹,,Õ8½ûÿ¯Ž7`{þ¾¿¹;äïûF®;Ôd/Ú¼ {ÂÊ%“ëY&\AáÒRWèŸÄ\‘HšÝÄãÀi}5È Þ Y¸û8ŒÄE…9ßA{M²þÉn©>£­ó—ÏÝ62úªf Û¶‘‡ù +½£óBö ºøÄÚçhßÆ_ò%ê•bmMà ®0¹^p{ä× ¯8üVt“«‡HŽð¶Mwç'/OyߌçêusÉfÛ-þ`£ûµx9+þèóÛ‹åb6Ã%˦.ñ-Nâ¢þ½œÜ€ý<ð´¿êåº<Š_g×åV,æV=íŵҲª» ëÃòðu·ÙÀ·9LÎ’ï»õ;žoÜ à}Æ×÷4—›‹ƒÊïGadWKà­[<ÔO^_¾fóùªáV½ ÖÅ•­ä´úfg*Q?zi¾ôàN{Þ}Ò‰{ÓF5&¬Ä 4U—¤ñ¤^‰ózÆk˜z~'Woª%ž)íh¹³Ý»-:}×–Çßµ ›×õ÷{ÈEQ,ªDÿ +mº(w.©oÓˆŽíB@Áª–]ÍY?~XÊ; +IZ2¼ŒÉ›Kc>/XObject<<>>>>/Annots 297 0 R>>endobj +1388 0 obj<>stream +xÕXÉnÛ0½û+xLfÅUâ©Hº¡‡mãp7qY©-èßw8鸨}ià$€Ç§yš›~M”hà_‰V ãÅ¢Ÿ4²þùö1Žoüö©܋ëI{áœôWÁ^¨Æ³J4¬1°Fï±6NvðJ×EA´¬`/‚•¶âÐÓ&ÀXöAñ”¸äs_T#ƒðLÖ8zêd[³ÖÇ,U¶î…nÔ‹Qºà¥ÎQ&ÀQfN)Y/d2ì ¨Qz‚bHœRˆ2‚SœW‡ ×YЮ8„ÎC}{h"ˆv„4’WÈÇÔî›:”µë•tYâH†É³,³IÖ4˜×$‹ ÈG2LÖ˜e™M²ªÅ¬'YE–8’a²Æ,Ël’m Ö$É"(²Ä‘ “5fYfQÖ†¦”,–Í\’)d³la“lÛ–’YE–8’a²Æ,Ël’õ±=¨Á,‚"KÉ0Yc–e6ɺ8í²,‚"KÉ0Yc–e6Éš6•,Î&‹e Œ† +UÈ«Ä[Ø$«m*ê (²Ä‘ “5fYfqÒ[ô„V‹¢,.¦™kãÚ^¸ +¦H LT‰†ñ• ®‡Š½šM^°à‰Ù aQt·VÌnpgáÅÅlþý~)†âí°—ëqûjö¬$-ZMÉlª£ÙÅÛ»ùøÜÄgâžz rs!´‘qLy™G¾-†Í¸ZßÆq×H« ={µ»¥—Øü’v ÕÁË Tô@Σ Ödôe>.î–h—zz‹<“?e“´œj÷¯¼Ù§y{·šß®‡mNœ“FÊÁïa‡™‡–Ê Ûyÿ}Žå0Ò4=¹]n©J°£Cf±Jÿ=YÊ6) \Xå! \U+Õ~U?­ÇÍp³[Œ«a}r.u¥H¦m»ç¾Þwÿr»ÝõÑylL×r]þ{ª¼€ý؆UÒDåy5[nÓ”¯šêˆö³Ò9Ý’š) ò¢£‰}¤•ô!/*ŽÀqÁ=×48– “ {Ík¶×Ñ€ôù„9ž”šíh@æÅ”–ë£Ùó ›æ°Bî´–s/& tn8Z!ÿbjO«P{~á´>l¹î´€ºP8- <"ž×>„ëÔa…àÓKL~uÐßYñ¸§´tg±·*›âi›'û*\’N‹·±³‹§«oF𥠃áÜõ¸º¿áÁ¡§ ùp7¤+|Ó+g!8nïྷ} ¬–Ö?ÓÕààLDÅzý¡£K ¤½3Fhøçã•éúòóÕ¥ø²~.£x7,v=\Oçùª`àË ƒç§mâã«UŒéýlòuò9ÍI¯endstream +endobj +1389 0 obj<>/XObject<<>>>>>>endobj +1390 0 obj<>stream x…ŽA‚0 …ïûï¨g;æ˜Gˆz3Ѹ?@ÆH$"ÁÿoN^LÓ¤é{ïk_ŠARŒÜ sˆ"MpÙA[XŸËl¤Ç„f ió+”Aí/GBh„årPC8$›¸yײÀmÚ'œ†øîR?UÓsè·¡ýFÙ.Ñ]Æ‚õš ©ê‹ójqÖéùÀ?®õ¤½·òxyÆœƒº«•ã;Òendstream endobj -1386 0 obj<>/XObject<<>>>>/Annots 328 0 R>>endobj -1387 0 obj<>stream -x}™ËrÛHE÷úŠ -oFaCøöfF¶ÚnÅX¶èÐÆ„$X$À@Ëúû9™E ’’g¢#l_ÞÊwVeú?G±ð_즉N\¶9D~éÿøúù(Ž‡ÑÄç“hà6.‰§ÑlÖîFÖ»ñ,á·›N¢ÑôÔPl\<Ž£¡+NVŽ&#åFã(Ù¡ ܸù,Š-7’¥ãš›ˆ'¨Êqe.rºP8ñ%Ÿi1l2ïmˆ¨ÅÇ€8Œ¬Á°³i47ìlÝh8%bv(¤"Ul0¬¦Æ°‹Ù8šZYƒÅì@\î5{³ÉˆC©PÔÅÓaX²M<5X¥N=ëÇ1Ö špEªØ`1›ˆÙÀ ;™‰ÙÀ,fgmϪÙ!­ ”ˆy|<#JF–5v,õ1²ÓÚÉ€rÖbØÑ€€ëš´ãÁœù\,N%¢8°ÃNd÷Ö`XZ÷@³Á85md-—‡âro×»<};&’õ¬W<”á‚UªN°Š¼OK¢¤<†5–!s k°Ä#[ÏÈ,NÉæ -¬wŠÁä/.ê„"ãTÇz'k0fÙ‡(¬Á°óš ö™YÉ\‡akÔkö.s•Ó+‘Ï£"ãrÇzkpïr`½Ë¬w1°÷.÷ìÞå½lÂINýzÖ»¬Qa–HØ0Š¼ËÃ2óˆ6°ò'Èr` –€tÖ`X®s´M` & ÎF«Y]Žg2þå>:G½ ïrÀ°ã '˜a †¥ÿÆ–5Xò(×Ò k1,cŸ·RoWìx*¯#3RQ¬H2– 8°ÃrÔÅ–5Xr!5²Þìd°?ejÄŠÔì0`ÓCˆö¬žºñhªÍ:“ë’"éS¬âÜ–bE>š€a©¬Á°D95¬7Ê<Ó'âPò @ô²´ƒr™E°'-£òž1¬ÁbT. †5–w š &Áì ‚íY‹a9‹­]‹åò ó2ÈZ Ké¬fŸcÞIÚ1·ŠúP\=ûhÄ‘S é`â9i -\€’¤1• \€’"¹A.@‚Lħž3Ž…qà4ÆŠ› -‚›§~.ÀÎÍÀ©›œú¸¥Rr í9áô}¸ápzä4ž,þ>+!(!tœú¸ fäTå¸{ ÊDWÙCÄxhðùD* ¨”“+pÀÄC8}M.@¸¹|X\€>cãÀIÆöN=½œpD½7.~(Ù”íä„›Ë> \€ìÞ|êb7P.Ò2vzNÓÉqëOÖ æhÊxì!¡³9åK • PÒ¢™:N!"–íÅÛoHü[¤Bˆ+;ƒ§£ „Óú.@qD6^à$': -zÎ@8~f vö „›è츋£“OظÅßì&Ó™[¬ôS¿dǧ˦­Ó¬ýcñƒu¼õëÞ¡äï­Óœ‰Ë'Ÿ¸EôÝ/‡€tmº\ç×Ǫl©¸–ø`ŸtœG}¾Š²iiDÍ°hæyïh¹¿ª'iÛs¿Ê¥Tt‘ÓS7§N_¯Gâkž²-¤÷H†ôÃËNc®FîîX¯Šò^W~(Ê´.üÂw&QÜ;|ã +6ÛªnS¹ió틺ÅÑ(r뜯›Í’*—wÅý®öÍsW¬sí±Cc H<ÏTu/ád©Vý0ÓÇ®eå6­7þ÷îü9T8‰ÜM›Ömž°H[É?^y=Å<Ú¶î88^~¦ÅÚ´ôÞ5y͇g^á–rH‘Ó¾cweñËeë‚fxezþJì®®6œvgW7oÝíÝí=åü—þu¹Ð¿’Ç·îêæ$yëò6‹¢È(?tŠÿÿànå;¿ã ©ÆUå?Zw[ÕÿÔ l§Ñç›m]ýd¿-ëê©‘0ŠÒéñ «ÓfWäâg‘?I¿w/bäYN£uÚšÝVè@«éµDzíº®ØBN̦Zïä$WO–Ñh½Î4««¦qÍnYæ~»,¥¹nòVK²Û’ÙÛóËNÅ®Œk¥oÂÚÞ9@îêë¿?½úvýÚèŠ]]œž_¾J -ýò©ª3É°¦Wö7‡–ß²ì-m±ßh•‹ôÑ°»W•L6ùo%¤ü—›1]VŒ1 -”®2ÎLM’Û¼:xRԋݺ-¶ì>fX^ߥÙþL°Õ§LWÛu•=ê¹rÈ B›Næhå½î5 -ø÷®È9/¤x7Z¼PÓ“ýïÒ¨÷uEáúbÜN kuaõ¬h²]#ãõEºù¶¹o "?nÜ›¯ùFòrZ– Ø,—‘Y§ ù×;› ÜoEÕÜÝ<—Ùÿ•&νaé»W~Ñœg•»¼Z¸îm*+ñ÷‰ïÇ13“ýØVÜ}dØ_ÜÈa°bgRòŒ ýª‚£ˆ¾$&@·{ÜU֮͌µ)Ãô—´¼`>ÈÁx¹p×iÓù4Û»w¢G? 3ðì}pÄw€ÙlÄ­Bïs.Žþ>ú/(Îendstream -endobj -1388 0 obj<>/XObject<<>>>>/Annots 380 0 R>>endobj -1389 0 obj<>stream -xš[o×…ßý+ÎSÑ>˜æýR (ä\±ãÆJÓ·‚"Gc^”á0¶þ}¿µg΢”F7Kkö}Ÿ}öŒôë‹Aêó¿Aš ÓhšV»ý^ŸŸtÿüøóyo’¦ói¯Ÿvi0žö†g´MÎälØ›‹MDév:ê œ5 »^²†wi8ê÷&›}š,zS™íÏ0? f ËlŸ§Œ5Œâþü’íË ‚£x4V8¤×à.'ÊJÇÜ¥ÅqãBÍh„²1È×Òip—f ï8ƒ„1œÊ`G:†%xu ;ôf.kXìB¹-š +A%¨cÃŽ´…±†aÑD‹¬a²;Œ4ul®éÞSMI(fEM ÃÎ'2Û±Y´?Í]È£$äd1B_ÖÛOµz[ ;à°±†aѱpÖ0ÁŽÔÀEÖ1ì|Лš÷£Ït÷8M…S†1Kµ¦Î–S³KÖ°êÓ§òE³cXº†€:»Ža“KYêž_‘u¬“£ój¬aØÉL©êì:†Å©êØœ*ŠŽÏ`¤†›Ê©*X©šÈla +U™-¬aÂÊBa³ÙÉ8·ãp@oM…YÃ(f¤àTa Ë)c cv ®-l6Kºb ÆúI 0kÅüœ¶)¬a9ýXX𤳅5,6ralÁ¸ÌÌ$Ë›]&}qÀ˜St\ œ©‚åÔè’5 Kf¨|‘5¬ /XÇ°dŸdt²Ù)ò¥A>ìë‚š’SŽÅFŒ-XŠÃla ÃNu;šfô2Cˆdt²ŽuH"…5¬C¢1f²†a©k뎙0«»;&EKÃü™#¥œâ roéŠ)œAjC’p§t ;˜©6…5 ;]ʆ]ÄÐ-²†I0mF];Ö±Š£›ÍXÃ*NœË"k– Ã#rL‚‡ã ÍŽa,m¾•FÇìƒÑ…ÏÑ‹cþ-7[FÍ7]ÇÆÍVØ,:çq7Û8D3É>š¤q ÐkX%Ðì3Ö0,Çpì¬aE§Æ:V 4IŠfÇ*Á¥WŽa™:3—5œKà^åpÇÚp™~Ä©@®aر­±†s2P\dIF‹s2pª°1£2†],ºgîai -YÇ°tœ{•Š¥Åµã8P®_Á°Ã‰²\XðìCg ÃŽ5½MÖ0,‡bá¬a±š…&k˜€è —u¬dè*²1£ÆLqƒÙT’­Á]š/ÔÉg¥¹W8ƒ8ËBHö;AÇ°mõƆ]Œ/dsm¸éò‹Mœ@Q–VTµì8Z±°†¥¸¯ Ö°r¤²°ŽaÑD&:YÇ°s¨Â†ËÚžb„‹—;6\4Öpë²±ár+›],¬ãÖec#„N–ñ¶ˆ ošäUvy>$›˜å…`ÂÍ&.†]¼°Y4Úr ]u(D ÃŽô’g¬a>/XObject<<>>>>/Annots 340 0 R>>endobj +1392 0 obj<>stream +x}YÉRÜJÝóoÓ8šjz›n0m?:0`W9è…7ªª,­¡žcþ¾Ï¹YRÞG‡#€£“÷æ3%ÿ}™ÿ"3‹M25›ò$ B<|ùxEI05“Å4Miâh̨0K®7“yŒg¥™MƒôHÍçA2rÑ,¥œ¬åJ—&šD\)ˆÕ¤ÓT¸tÄ@JÁÒ,æA¤¹”K'¡Ø2¥™ˆJaç‚r²œ‚°%¢MžÔl¼÷ ¨Æô#„JVa°óY°P,Â31i2Cp¹mBR(V¬„F± +sÛ(˜iY…¹mH“GÍnÛ8EŒA„BÐàÏ€Á"Úðdz +Sñ„yY§8Š°ÈP.H+ÌmcnëY…ÁNY8ŠU˜ÛÎéí(+Û&(©¤˜Û;äüñ¢BªY…ÁN˜%«0ê>‘.Ïj 6 ágQs–<‡ ä8äbá1Š©Ø³ +ƒ²µ«0X”î‘f…aTȶò²Óä„&û:“g‘+ÇxŠ '‚\=ƶiÌHyVašæ9Ù%¼YŽœ‚àpX©ý“§^Nê|rx•D)á[ K/èSpõÁ·˜1¼‹H`>jHñî‚)/Ý*”€A#ŽÜ7eezÎCìæN.9á"„I9p +Ò9^«Fîburö£<4«>DMgs³ÚÊ÷'<Ùœž¯Û®É6Ý›Õw¬ÃȉܺwPcåéuÖvæë~›uÖ­IkNÍŸæÞnͲ +@.4ïäH€Ôê1oͺ®üÎ̦. +»éòº2õÎüu{¿ºÅãíâ]m–Y¹Î̶Þô¥­ºÌ-ûiÓ=Zól³¦ Ì•éšg.¶UÛ7TÖ™¬(ûÊ‚}3P›¾i ç­Y÷iëÒvyi[Q&ÆYóåßë5µÀ¢Êš½mZ·,³FäU`Vؾ¬á~c7Ph`R{p¡ƒ/¶ì%kkvu_m ¬|ìºýŸggOOOAKOƒºy8îbÑ—Úí?Ì>{°¹+lÖZÓZhè%ö°¿~±áwÛ4ÏÿUš>Ù¢´ü.-ƒ¡.ÐÉ6G äˆÒ›ÿxóÕ|´•m²ÂÜõë"ߘëq€]ßN?Þ]{3$Ì9r¼fv‘´†BTÄ°U^mŠžiÊ»G €K~[÷ÍÆzKæQ'“2Ƴ®Þ9–IÅ¢â†Ì«(ïÚÄø°o{ö°/‚î× 1ÔèûG‹„¾EÐGš|öçæXÿ¼Ä°’³uaé×ûºêP’ö£N,¸ +ÆxåUÛ¡8%ÂÔŒ/¿£¡Q`þªŸXÊWn•Éå•E-Ï?]œ¿^‰/6C«° ÖÈËêà ÌEŸÛ¼z•y•5¹[øN +ÓÁ•6 4y¹¯›.Cq·Ý¿È[¤yßX´¾hlË5²\íò‡¾qÅ³Ë ;Ô؆(˜@?ÝyFR†+%éÇ>5Vtχtlð40Ë.kºÁ5‚ÎBÔ*üñÊè¶Ç¬(PÕ£À#&ÎÏ,/\>+g]kt5Uï8w:àmŹ…ŽÛWù/³)rÔ«­¯ÄvM]b^Þ.ßšûÝý~æÕâ—üºYɯøÇ[s»<‹ßÛm‚ PʇssϹwµÃl‚Q­¹¬«tæ¾n~üSœÐ…†‚øÜç›HaݶfÙ¯+Û™‹¦~jéÐÙá9…šºß{ê¡Ï·ÒÄÇêP‡—y»é[NÁ—1ÃI˜¯n˜?¾Ø²FáœWáÆr´5†ñëpǬÈ߈Š©Ö,Ÿ«Í iUÎxÅ…ï¯n–/r‚÷0X]››Û•éa]Y»ÃÃýo§Æؾ©»Ggò§%´EŒÐjùU§ÅÊñž )Ûºè帺m06_eÀ¹Õ`êíê¦t-ƒƒ4[c¸s±/^BpÊU]So{9)_8‚×'ðc»Þ ¶­9_×8ã–G^ÞÉ S‘Áç"”#fÚeŸµíÓ3¬Ä‘–Ñ¥•0†w=´ã8'‡†Æè¹¼xeâp}y~÷ê9ðÓóòóõ+]uC¶kóßO×f_ô¹«#üçØ8¯0GWÏ{)¤ÿ7G]Ú™Kö7ŽKSØŸ¶À)…¨ã!;¼5UÝ!hÅmÍþÛZ§ƒ'ÝY”ñÆr³Jy ¢âæ®ÉË #åRDå$hx£‘Œë$â= .6¶±÷y›£ü9¸Ñm/B÷QLël#çò¡‡/ô˜»‡AËVåàw¶ýÖ‚³x»’së)_'qré«]Š/£óyŠ ˆ˜Öü{uòùäÈþ¶ïendstream +endobj +1393 0 obj<>/XObject<<>>>>/Annots 392 0 R>>endobj +1394 0 obj<>stream +xšYoäÆ…ßõ+ê)H¦§ö 43v¢À³d$Çy ¨nJ¢§»)³ÙžÑ¿Ïwo5«%Ã08stx÷¥Š”~¹˜„1ÿ›„å4Ìa³¿Æü$ýçó?.V«Ñ<,V‹Ñ8ìÃd6g´ ׊a—“ÑBYÁ°ëå¼Ób”¼³éz`W1,vU³bØùr4»Ša±36¦j9­;†iÙ7ÍÉŽí7„äÁg—‘ÅxRõažâƒ&^‡™]ô[ (ža‰êkX™Ð1Ö0þöõúQXÇÊ„^lŒ5 Ëw·ËÕŠ*J ø¸‘‘\ÎdÔŸ¸»‘ ”›±`X¾,Òš…5 ››¯°†ay« o…5ŒÇœ.âéXÇ°S-+ƆåÆuŸ# üY¦ (£PÇréÌqMKc°†ÖEc c– u ˦8qÖ0,ï° g + Ý}Å®c¶rc·›ÃeÉs~&³" Þ[L@q…kXn'ë6®&c Ãr¡Ì\Ö0l\Á&k–ÉC¸Å®aÂ%‚±ŽaGº×Š¬cX®+ÊÛivÌ["Z›åÊ1,k¸Û¥Õq’OùØkïÎH¢¹“ó æ`@-r -¦Ü9X-¬aXî¬Ö°j ©SXǪ>k–9;uÖ0ìLŸ”LÖ0y¤Öä±óÊ1,Õt»ŽaIœGä8¿©S¿N³ÞÜ[¬Œ/¼Êi¦µâÞäSŠEù¢Ö|žÔý…û$*€8ƒä8`!«>Z£Œ5 Ë€ ÖN±c²È+$9îXÇ°¬Ód±°†UŸÁ…fÇ°üJÃí:V}¢9;Í9OÜ[1XN1(ÚÑ°ÂòÖ0,£õBÖ°Ò:U4;†åÓ.wšã2_æ¨^Ç:ÎQ„Â`k –‹Þ5;†eßá¤YÃj8àÂæTÅ('Ü<-å“Ó³es½ -kX‰Ôý6(¬aX>KÒ…5Lªr2:Ö1,[g³°†U„¹YXðL1÷Ê1lž´l$ƒ‰“×µM€Ò5-o«…+P-££×q¡’ã—ßâ¥2@QÙr¡£p*yêÑÂHá|ÇÌÁOŠ\¸2=¿óvÆ凞UI¹[¸á¸Fƈ9v~íØê4(WÜ®pÒâ|òÇ/r²+TäñY·ã -„‹õªÈˆ9¾NécüY§A8âá tÇGCè­\œ+F³~±pæ ±ñåºå"<¶þ¸*#¼%¼–‹x -W`^á"¼³\Ž§ã ¶á.Âkåør«¯8&_†*<-lgŽn^8zSo!ù˜ptyLjð -$„È…+.¾®@¸x“.\„_•;ΠB¿ðÅ \|&-rªzúxÓq¯¯_¼ú–a5H×·ú»„é|–®×ñ7 ýt½ú3²{é;©ëÓªÙö¹þåE?½¤?†<?„ß=êf¹oÒ»CSÓÕÍáÔ¤ÕêTošÇg£^º¾¯Òqwó°<?­ÓW‡Ýn¹_ëÁ—øÐ)ó†'ªt¸M›ý±Yn·ËÖþ€¢{nÚKß>¥æ€¦ýíæîTWéÃrw³LËcZ¦w×ãô¾Þì–õcúú°[nözŽ¶Ûª–ÑK]ü¾®êê×Óæ¸iªôcµ\oöwOÂà/3zéõrõñ®>œ²ï–jÓëœA85œ]ú]^^ÈŽ‘­+BEðíru¿ÙWéº>›tµZa­!ªý:ýó°Ù둯¶›J?#~™Éž¹;‘C»ÝaOt‡›mµËJ¾©ëC}|ö4)ýðxlª]zØnVª*“ˆÞn¶U<éó¬—~¾_6é€ uº¯¶iµÜ§7é®jþþLý¼÷¤éöP§Ÿ7ûõáÓ1->¿zûd.M,úáíÕ›wÿýê‡w×?þð}¯ùܤ¿vbﮟ*ýSÎy¨ò"ãì¹a®VMn•òôðDýAãÑBïi©í㹂]ó¬-ח꿬‡Xðÿ ‡¸ Î9ýõ´Ünn£¿ã UÙ÷UóéPŒ\{ÞøhJå)En¿›Špþ_°O ÅF”3µ>PÉcÕ$R´¿ú~³?}NÓm¾ìlê#OB¾.òÜ_§#GAg=÷–ž;BÏj¼ÝÔ Sy{ÚÇÝgø}¾*×ÕÃöð˜8z\1Üù‰ìDORðÄB—šK÷i~ó¯+Û!êraº­P{%ê|«jÇÅr$eçê<Û5H†é»ÚâÖaŸûè¢>Tç§woþ“ÞWõnsÔCéõæ|]¶Hsʪ´¤ï7Ç&”=Ñ…¶oªOJ¡.¿íx'&:ª‘~¬)Œò.òõf¹=Ü…bÏï¤Ýõóê“nÔ"…Ëí„=Þ/ëêIòy¥¥OZ·Bôði_ÕÇûÍÓ©¡OSO­ÓzSW«æÀ.d<7¢jÖ›ÛGE–Í|±,UÒ«—Ñuù<)9ôýU¯Ïch•GånyüȬ¯9:È<DÁðû}áå²iêÍ c7í–8¯Ð^^–ôSù˜ -îýÕÛ¸aÖtA]'¤KUÍÊùˆ¦=÷Ð:-OD±o6«n´¼úV_L´;kÿïÏy]œÇ^üáêíë+­K¿læÞê´C²“{©—==þrÖ_h¾ºÁ8ù’·cýyØ|ÌŸ -CŒô“o®_üëÅÿ› ñendstream -endobj -1390 0 obj<>/XObject<<>>>>/Annots 432 0 R>>endobj -1391 0 obj<>stream -x}YËrÛÆÝë+fw“…`¼Kù!GUVì˜tœ-BÀ@KÊ×çœÓ •TªRut¦ß== úÿññ_`²ÐD©©v¾çã/óÿ¾~¼(bÏ7ižâÿ;„©—ÐÖ¬.4'^¡Y…Áf)Ö*ÎB/§â8¥¨ Q¬ð΄AìÅŠµ¢Iᥠ-’‚DTa°yì%šUl‘À¼’Uf£ŒN͚ょáY ³yÆhЪ‚;-©âd¤(Rc:$éžÕjló€`f–y9b°q6ûG—4›f §4›L¢Ó¬ðÎD°ƒ&˜Yëdy¡”®`&ѬÍRˆ&b– -œIH–D¬h&äs&­VŸ™$QRȤˆlÉQ’ÀXäÈÜ—ÂAA$‰Ã¦ÞVa°yNÖZEæl ÌQ"ˆŠ%Ð$ajhŽJX@NAh Rz$'»±¯M92d± ‰ä¤&DRc°iÛŠU˜Í’Ðê,«1X$_kÖ˜Í3gNVa°E¸°k!w‰H˜’çpfòÎA2@U‘_Ç* £~¸P¬1Ø Ç`r²ƒr:°N³”=Ší*!u¶€z„Ã~Á<ÉI Ga°QVs¬ÍDxX3¬¿‚(jILvéþ0¦¤ ’Ö!ß>𜀃CG“Äî5“3¿âcFBÎ<'«1Ø<‚kŠU,Ü_È*Œ–@ç£Ùf»sæ-íj áêˆ$Oaa×ã2†q¢9‰a¦Ÿ|‹‰7M^BÔÌǨ&"(ŒD¡£CÍ*Œ`Ž–µ.¡Ã¤t> ‰b…¡‡bÇ*l§Š¥¡#‹E´Ð¬Â`£·ÃiÖ¬,ŠU,rŒ4Î^iŒ -ÈžæX.vY™AJ`œHÂU˜ Ç–U¬Â0볓«1âÀv¬5‹þ–A ƒˆVͲÃÌ2$Å* ëÆBVafJê7k¶fƒÃrq&„‚¬Y‡iVzʱ -C1Ê…bά(ŠãbÆam‘(–{<³)_Å*Ì4f Vc°òH8YÁ‹\i¶NI; ©¿xb[[…ÁZ'«0“œ¡PJVaæ‚Ë—c5¦Ë̶b‹G©šíUácÐîÔœ%128ƒÄ®Hw È)‘ph•“Ç1X,.ˆÆ± -ƒÅ 4«°U›e¬GÌXùä9̓E3jͶ<ña©“/$ñðj7ö+–WÀ"‰G¾fy9žVaăýo!«0|ÂÅemŠ±/ËW,Ë ‡¯¾#dŠ¥è3©1JfÖªõíÒ&ûO @ÔÊu8püàÅå˜I¡6ãXv¬dP¾7À% 8Ô*Tfw½@.º€™J¹$0 ~‚ ¥ ƒà÷Õ̉F yäg"æ Äðòã gkؤ¡¥n¬Ëzää3dæÄš,nÔh0T™bo×o®ÑtYßóÇ™4ÏÌz#?Ìøf]ý„– <³*ww¥)ÛùruûóúÏ ß\ÊÇîzágÞ7ã44wû©Þ˜«ýôX·SS•SÓµçÇ#jÌ»®½oöƒœ2MkÆÝWᔸįDÎ$~éÆ©iLin›jèÆî~Z½n¶µY½ŒS½3ÓPצk­ÛÔv¢ Ý´ðw_ÑÁñÜ^ ‡!Ààjß÷Ý0©‰™˜›vºÕ#jtb°žxË(ydy‘­ks³ëio4ë®ÛŽµX[„Kï›ò¡íÆæ‡Ô¨®öC3½˜mý£ÞÊ™EØÉkþj¸Pž¹í†ÚTÝ®ßÖSm6õX MÏ,™îÞŒç&–uJ=ó­mî4Á§î©5wõôT×­ùÞ´›îi4¿®¥¾ýzó‡ÙÌ/˜;gùÅÒ♫;”©¬Îò‘Ò×Óäë`p<óý±œŽúQÐîGƒ€ÎÊ„Åšíõ4ŸüÞ ½v IfÛ”Û­mYÞ‡EŸ–?|xæS³k&K'3ij‹TØ›²Ì'è/å8nîÌíËê·O¦ßî¹Q‹ÒbÃñÌÛ}³Ý ¡§N`ÿr]ø*L}“RôÛMX?O¦‡Õ§nØŒ¦LÝVÃKÏ›}üóY±gxæc=Éi»ö²ê¶û]k6åTšû¡ÃD—OåݶÙ…ûùå·ÿcþ_1æŒñÛX>¼¢½ÀÕ˜:Ü.\eŽ±ÿ8YonËê±iksUUݾ0€î»a7£²5ŸÞ_}Á¥ê -ò/ô{á6žv8¾ún³º²ÑÿÝŸø%~ÙÑÂÛBS«zøQg]‚ߪp´z¬wv­mÿMo¦N2ûõúb?3p¦y>„tÚ X‡pëOÍô(œUk)® ÍÏ(÷öãÐíûÑìʹÞaÈŸÛ@ÏΣˆ7ddÒÿÕ#Ô^bûºjÊ-¬L‡wd4¨ÇBúüNâ³Ç3žKŽ+è¹¹60›ÚÊ– ésO±pãþî†U­Ë‹ÍÒüòùûú3Pã!Yc·*NÈMm~4¥y÷ûŠŠO$_yTw@5¯äï«£jQ²äuƒ\ßÅ¡LÒŽ¬÷=ÛXÜ: ÔÁþ¤‘[¸ÙŒãÞN¼…ƒò¦#ò¾šñøjåIÿÜo»ÊÂ%ÇÎSO¦“§á¬.p-ûµ.QýæïÓËÁeMùlž1ÏãàÌ„úèzs•R¶ü*æçüwÊO««Û·Wêâzš÷]µgåúRåe€_Ïyü2ó ž×/IŒŸìó<Æ?HˆyüÃúâ·‹‚°ÿendstream -endobj -1392 0 obj<>/XObject<<>>>>/Annots 468 0 R>>endobj -1393 0 obj<>stream -xmWËrÛF¼ó+ææä@ÏpJQRd«ÊŠ‘ŽrÁ•›´¤¿OÏ,ˆ]>JUR5z{v¦wö¡ÿ&ùø ( )RTn'¾çãËøëéó$=ŸT¦ð{KAzñ€64Ÿ¸ly‘ÃizKƒÈËI ©ƒÁF)Y#MrO‰4gR‘Z irà‘Ís/!+H@†1“‚L³4öR‡5Ò(òB‘*&©Å,UÈͲFÂ:;« gÖ+Uª‘5R_›¢Œ$RcÖÌGn–i’GƦÿdfµÒ$=bñŒM2T#=°‰Âº&#k¤*lʽ€AFj1fUìˆe4ážH\A"u0'ìÑIJÏóÇ-)vßVÆ9 ¹B}6É &¥—’ *UF%ýÀÔ¤èDIÈbÄ4„e%nœeÎÎ0hŒ§ñ°¨l³A7²˜ Í0»Ã:xK!:8qX)5V”šñv4€ã:màt-éb°0ëˆu0§Äýàh 6Kà¡eqf ŽyûÄ‚¤V³”×ƲF%ƒý ç$H¤ÅÆ ºÐ²FŠIZ çRd¶˜Ë 9°e ‡}îËšÀ~6,ä>°ŠO¨xdEå‰éCÉÉ +Y,aFë`dœ§¨ËaÌ=ÁKkY3›ã±¬tL$½±¥\¡› àœˆIŒ’·i„å8L$_A–ÄÉ`ìçC>dJµø`¿eK8¶å^yCF‚Dê`–ò­aY#E²Ñ£ót˜õ€!U¼9,k¤8bäÀ‹ø–ˆ©Å<+Ÿ2ë`fù„sY‹ÁÂR¬ì`¬ ®x:²&)¸q"ÞÕ‘ NJ.̇;Ÿ32H2v0f…kG¬ƒ9c>a­ƒÁâKVr -Óá>’e7ˆ§5¤âãã²Å¡ KÂ,±8à[:dIì é&À˜STã`Äy”Ã:li¯“«;…Û„/ü’QYJ‹•¼b|Z”¿aÛ§Í×E«iÛ¬t÷ûâÇħ) !2Ÿyôµy¥þ¥7çlîÑsµÒ´©j#ž«ߣ']¬¨-ÞÎÕAy[õú@ŸªÃA½kõª*ûª©/‰àcÇ~Ê“«Oyvë|ˆúxÑÏuû«*5=åO -ÏëÆø'½ÃÂ`Éézÿ*óUŠߣûºo›Õ~ìÑ£Ìp‡{ôY׺-6TÕ/ÍiZ¸¾±Jz¹6ÚYÿ%\æÐmºm›öÂä:ëû¢\s®}Cµûš{•vmSêî‚]ýXôåzؽG…»­Š×ºé8ÄG³o©“èà™n¹ˆ“ñŒp{N±³®Ûow¼—ÏÒÁ›×£…îÎ7(®&ô__m6´.~Iyh‚åFwÒQWwÙpÈáágx ¥|Má›Ï®gôØ6?tÙÓmSî·8ŠÃQ2 ð:gÁ4õs?[v}[”=ãE–e1þ ‘ð—?“¿'ÿ½Ú,fendstream -endobj -1394 0 obj<>/XObject<<>>>>>>endobj -1395 0 obj<>stream +ù|ö#0NàydÎWA/糟9xCv©Œ[ðHÃ’°±²‚aIØJYÁ§7SÖ,˜ªÎ즙ízìM*6“Ý#ŠéÍØœ²1V0,çÑ@V°95%\‘l­V°ˆ3«–ˆ•²‚a9ugÂÆ€Vf³¼~ᔣPÆ°œ)8•YÁ°«M,¬`Ì’_Ì&YÅ°~·ÉltÊ*Oì@9Š¥ÏØ\¶ãNXÁ°3[¸Â +†åR7 Ë؇; Ý®`\æTR¯ÃÆZ'YÅ°K{AÍ9¾l´¸3-¸Y0«qi²2—éc7ãfc篘 @´c)“Šaùn@§ºT°åÁs˜YÁ–o‘Ä*†åDíÆÂú'ó*éÈÌF’Í_ÑíB1sä>ñ¯#º°±V0ìÒ'/Ë +†åvH+fV0³™IqbÃrP0™ Ë:ë}ÌÏ/ðA:’€z–û;NeV°ä#YÁ°„ddV0NñŒâ&V1,wGʬ`XZžñɬ`®¿]ízýL$ž¶’#ŠáfŒË´õRYÁ$"+§‚‰°Š-\«_–U Ë¢™++–õ4`Ç7……ÈÚ›BaI³ú¬–«ÝLeó^ËÅHs¥–“¡·c™ä;{*®^ë3J-g;Þϧ±ÝÎ"òF”›ŠüYgÃ2Xͬ`2ÅÔS¿Ä*†-ìã¡°‚a9~©_– Ën,”l5°c$Ë*†å+…ÚU ˎЈ“å±íó¬Y±ÕÀ®™­NóôŸPìÈIÑÄÕÑ®`¬ÚÑqɱŸÎ¤bXkU ËÙB¯fV0Yäå—«–~ë=4§[}&ÍŠa™Eµ«˜û0Ûå%Œ‚°ç}%p+ì#o8Á®·EfÃråÈ +¶€ì2•5+†åc.'ÍŠq™ÏI´cbÇ€(Bf °·Ë1¯šÃ2£}ô¯bZŠõÑk26¦Êï:„Ëw>;òT †õˬ`K¤}SYÁ°|H¥3²¬`R“‘XÅ°\ºÙ'™lEð½œYÁ°|†P¯Ã2P¤*Éz2â¯`pÙû$¢Ü7‰eÜô‡}†pV0²´ëTب˜í?XCN‰âžŠ2+Øòhí*²‚‰‡M‹Ù$«8æb.ltŠ_?ù;§*¿ärãɳ|rÂåÌ +†åç3ecÖ¿;dYÅæ”Ý"2B½®L5ãñVj¯Ž$½g¹7c6³‚qÊ_„ŒY>|"«d9iV Kר]ÅŒw^J²Ša9 ¨Abc¸\¨ýÛ] ÏQ¬‡Û³1¼Ì +Náf6†{–=‡—XÅ)ÜÌÆð{Y>i¬9¶ÍGój*ØÂ[@‰U Ë;}“Xz8;aêÉ£#W0ùÏ… ë… ë/ñ +&\—“]Å–Œ¡WŠa¹äÒ7YV°U×î—™ÕåòßríåÁÞ¥Š¸1üWk[@viV0lœ¨$û´›¨]ñ'ŽbÛd£Åãĺ¨ÿ®IÿœáÀ3„c‹ÌCæ2„óc0sbÓå¼â\?¬¿ù%×Ìn&±2â%Ò=1YpF1QÍ ;á3—a {ž¹XcŽfY —!S%®„ãË[!rÚ |qWè¿“~›fÀ²ìá–a=Á›ŸÅíßÆdDlt_ê{Êõù;”Ÿ¬LÊ)žö…É…Ñ.¹ç}ùææâõ÷,ÌI¸¹³?_X¬–áfëº07›?³Gám[•]}¸ïËÍC}¨ÂM{:vár³iN‡îÊÃ6ü«©öÈÛ]]ÙϺ&tUx×ìËú𗛟/^Ã+ßõh£µÙï›CøÔ6·»jµ|׶M{´ÇO/FáúéØUûð©ÙÕ›ºŠO#zW流Ï/Gᧇ² .´á¡Ú=†MyWá¾êþþBûjtv—]ÛìÂ]Ó†Ÿêöùz ëo¯ß÷2€5Bß_^}øßÛn>üaÔ}ëÂ_“؇›çJÿ®Ëýméªø+‘” ‚ûgóÕv¹éBIháM¹ùrz|¦`G(õöÓ©­vOQ[ïò®ÚJ®‡ê'#’\µÕ/§úXwUø\•[Jõ,‹Ñtä†ï[ªº}1+ïœÔ_N宾óü†‡TÔê~¨º¯Mûåy²ù„Bá)…§"ÜV¿,áIùéÝ[W¤-Ä!ó¶m¨ë±ê +Ïzßôšš"Zõ_¾»[oΰ¯ö·Uk'oW‡cWîvÖØ•ç°%Õ¨¼§ ­SÞU·uù¢ÇyËúƒòŸ«í?ËîY9X„>"4xôûŤòºêû©9µáuÕm^ioç£Ms¸{ñ° œqålšýã©£¡Ê8Ãö¸f— 7 +7CîºUû+“åÓã ÍäÕž´}­»‡pÜßn| ¼Tʤ}hº8°¯4ÙR›7Eˆ8ýòûEâ6J«'6KÜ8Ñ•¨“¿Exæ4WïdÝÕútÌ_mEùç;…ûœµÿS¨Ymüç¶ê,ÝVÕæÔÖÝSøÿ´LÅne¦!¿ºº…]ÝÊ]° +Õ÷§–­Úxãh.Ø,W‡®º7Övîuò}²ì8Uͪü(ú¡>v®L«Œ.ÊüŸºúj ´ãwCÞpÉ„UÈ~lÛ å)ðm]îšûç]Ž^šä|ýŠú`çk–Âå~Åʶz–fÄé’Þ-m¾ªöøPûÚÐ>àYaøl¶u[mº¦} +ÂK+VÍf[ß=YhÑΖ¥L6^méMGɲC«Ñ^íö¼ˆ6qYîËã¶}ËÜ «*U' +ÖßÑç^–]×Ö·,Þ°/qþe—PWJïÛÁ‚ûtùÞ;pKDÑm@AØpÉj9™žÐtà$Ú†òD‡®ÞüæRᛚÏ;–~Aïó´ò–ÏFì\¾Ð¨‘óBϽ÷zwÝ®m€t GÀ›+ex_oÚæØÜu£ßûy/{][UžK#=˜>sĶ=Åýñ2™æaËÌZ&¯OMëÇì@Í,ªaضQ«ÑH¹´æ¢¤ì¾þž÷T¿6ó22^Ù°úÝöúòý›K»ÕþL'sšlN{Ê’Ä^ÙïöìñWËñÚî—·T–f4³µZü-1ÄÌ~òÝÍÅ¿/þSιendstream +endobj +1395 0 obj<>/XObject<<>>>>/Annots 444 0 R>>endobj +1396 0 obj<>stream +x}YËvÛHÝû+°ëî…¾KÇ™$>Ø™H‰³¥$ÚaGÕ$e{æëç« É=§Ï±ûúP·PRþ¾ˆ(Ä1%9-7aâ/îÇ×U„”—9~n(Š’ > 5Í.,›%AbYƒÁ–eVqP²ã4bR;N+ü9Ϫ YfAvÌÃ8Ä])Š fE»?¼¡8Œ[ 6*ƒÂØZ 6)9.γÅ`óüh_‹ÁVɱ­ÁJ’cV㔲C(‘tâ) ‹˜É,⨠ò$"©“ß¹üœ…LlΫ k0‡QPVw sM]Tp‰cƒYSÁùñ¬Á`µ&+Ž3„ƒÓ¥ìX‘86,B\XÖ`N‡ÂÛªã2Ô "|e‚\œ²¼Ð *)ˆI©Ä,ã°on°§€ƒá!‘Òb>Ludj1Ø2 +"c«rÓP Ç+Hâ`0L³º k0XÄÒÚªã˜sR 2Ž'¶Èp›3ÏÌŠsø0¬Á?îÎãluÛ(u5 SAºmÊ®&¶ŒjϪ) +P*\ 2Š'¶àüfž5˜‹8gMŽÇ) +PoGÃ*Ç>aÝ)²¬ÁÌVn­Ø ¶(xãÙ`Åû{VE©&^E2¢&VExÖ`Í{V:¸b°•ϳ³(n¸ÞÖb°_<Ϫä<Ò’RÉ‚Œä‰U‰ž5ØIö¬JžlU¢g v’{|°Ñ‘?Ǫä”ï+¶MbÔV*H$ 6Oø´ž5,î¢ìYƒù@| k0KN¹lœ­Å`“âȳJN²Ã5àBO©dY2÷>ÃÌ’¥â¼­ÁØÞÚZ ½…ál«ŠaÌŽcž[Š4õƒE[‚cY+¬Á`‘Ìܲó¶’g«ÛâæÈË!‚4Ã1 HŸc¥›'U&ÅŠ_ )`Kaˆ)Òb> ccÊã!Aç’‚’1¬HÊùpl¹µÂÌiçÙçm%íI^ÒÎéW¤Gõšp› ê)„Jr"ŽC"HL æãd(Tà ¶âHÖ`N7 Ïj„S}ÖID¼«p ØÔ‘ƒÅ°ÇY=k0XtvdzƒEã¨,k0‡Mo«qŠõ©©O¨D+V2:<¾ð#Hƒè1+®8±ž5,TG¶«&„ØÙjC}Öám½$ˆÂ-.¢ïH‹ySn1ž·q¥BI†—›‰Óç¸'-†[™«ž• ñXûˆÚIeH”ä"£kÊ‹#æbQ$4Xc”Vý¢QÈ­Šø) SƒaŠ‡L«¦è¡òj¼qGERd°š†Òo•UÓX|ü§¢Xîê1›¬É±jžm*P<±h[1Ú-¯eVLµ ÂoÌ9V$¦ƒ•©éY5-+yyE‚tWžAŠašÅù]Ñ4L²T1XiØ‘c¥ GÙô|ªØ¯ ì1v•ž•2ŒR}äTüpP Š<ä8$ìVVª[ÕmaXþú¶-ØT˜"UÖ8`WǪ)B§Y*ȘN¬|¨î{ù˹†< Oí¦…~mç" ¸X® +=Ãqc£›“#œÖ(¸dßg“käStý㹤ÿCß¡$7õnÇ)ýxw?¿;õ‰Œ«ÂrÐõ›z ™í0ì_‰1†6_òÍ®îÛ-ñÜôͺå¯f¤nÇ7ë•%ˆæצ^ÑÐþWâfkO8.ÀzA§9÷Ž›†^Lëæ©YËymQ+⹯ŸÏm‘û¾E™¾Ê"V³5úæõºm04ÎÍ9L¼û·¯ŠoÓ¸ß"ڢϦߤÒuß "št¢‡ö•bÆRzš3¿U/§‡ÅDzZ€A”ž(ƇI‡aø懴•K M7än¾£Jw»f»j_ÎÓG%}A7­íºÿÃ;ß™`Ø|ùöãLÞ‹×õOPÑnò¯PöCóT2¾áç®>bÒ}j·û€Í¢ÇŒ/onxõ›÷åaôã³xXò¿%Äÿ¿Ï®>¿½â¾þW³é]·ÜoE7È.#|[ËË/‹°âõv§øš·,Sü3 ã¿æÿ¾ø”o£ùendstream +endobj +1397 0 obj<>/XObject<<>>>>/Annots 463 0 R>>endobj +1398 0 obj<>stream +xmVMoÛF½ëWÌ-íÁk~ì.ÉS!ÇuCÐ43M­%&é.)ý÷}3ki—±aÀÆÓ›7o†”ÿYå”á'§ª ÒRwZe*Ã'×_ß>­t£j²µU¨.”~GÚ¬x¢<ËU•)[TK6Á`M©lªM0ØÚ¨Q‘‰¥W6$.yŒkbAIâ k¹s{eƒ´À¢TP"½°6çEF6Á(ÛTìidŒŽ Yí•M1³jm¸˜ÌÊz« YÜSQi±ºHò^MçÀr¿‰RH¬3ØÏË7‚¨³”í¬¸dl .,6HÌÒ³D6H ×YHa]ª^0XËGdƒTgbC^6ðÁ +Òˆ¹*G%l‚™m¸ã¨M0XXŠa#›`ì§O¯lh +ÏžX\æøkqS²8“ë`qVrO‚¤ã£*\CÕÈ_¢¹ãšŠl‚ÁÖ5{qeCOx{Èý‡µ â²Bj(dX¬¦€"Yé`qÞ0)(’¸òð¨kÔÔ‚dT¿`t¤ù66Á`›üËÚ»íêöÁâíAÛ'~mÚº¢íNÞšm»ßŠBѦ==¶Ô;çƒóôñóƺcï†yú}ûcÙMÎOüvÇñ¹¢/m×ó8.ap\¶Câ¿6}”úŸ{?žŸ¥âÍ2•Ž±sû¡©ßæ31¦Èð½°qþ¥ï}m»ŸTpüÍbÔÿæžG?÷ÞîÎû·“–<éçaöãîÜÍý8H’´3x¢è“œoÔOã¯m• +eîÝãyOG÷âŽRd™³¡†óR8ïGÿN f[ÏsÛ¸×y¤–üy<û±sÓ;«0ùÜœpËÑQò¾o÷Ã8qŠÿƳ§IN`‚gÎó «ô{F¤Shöa=MçÓ3ûô¦Í6lÝÎi©D3›¹?éоÈx8‚Ç£›ä¢nê×ÓmŒÊê’ +ù"ÂnÖ_îÖôÕ?\7ÓýØO8×öº¦oPÜTYÃw»~œfßv3§ñ*®k&@þäÏíêïÕÿø“çendstream +endobj +1399 0 obj<>/XObject<<>>>>>>endobj +1400 0 obj<>stream x+ä2T0BCs#c3…ä\.§.}7K#…4 Œ™¹…BHŠ‚žP$YÃSOÁ=5/µ(1G!3¯¸$1''±$3?O3$ ¨ÍBÁТM¢Ÿr =  !)f \C¸¹˜T&lendstream endobj -1396 0 obj<>/XObject<<>>>>/Annots 513 0 R>>endobj -1397 0 obj<>stream -x}YËnÛHÝû+.z3i aDR¢¤Ù œ8é1:~t¤ ³è -Ñ6'"©!)»ý÷sÎ-²êÊ -ÞgÝG‘ùßY,ü‰ežHšÉ¦:›DüÆÿõõ·³E”Èl™E©$£Åv²:3°’iņ3°’ùâN å ¬d™zä ¬$Ž§Qj-;‹£¥agI4“Ù"09'§@M“êŽç ¤ÉY47‚ƒNé­u&³e”Á$\G ‘Œ‚“%#ñ¤ÅT»Œ¦†ujg~‰H4é -4’+Yd4é9¡4MhÒ“ƒ… ÄéYg§–ÀäbÆ(ФŒ$¦¯ž´l¢gXƒÁ.¦<¢À\I2™2Ï:—RT#³"Ç3š…‘øŒZ=g ÊX³ž´,ŒYµƒÍfÌ`5˜îÎé®g»1ÍÁ¥ ³«@k!@¨d¬MOZ ÇvÄ V`4È v®UæYd±O#ÏØ…Šè“ÅT¼`k°;8åYU¬ÏÞžÈú_׳ùBÖ[ý¨ŽßlÞ\Ö}Ûl›¾lê_×ÿų˜c±{ö”$xúÍú±ìdŸ·½lšºÏ˺“‡¢.Ú|'e}ßHSËcó,}Øõùn']^Ýå’×Û‘€à}ùph é ÕÕIs?<÷Ò乄XÕt=½˜È;]ò°½+»©‹bÉí—Oç«OÒùzÊ.r.cí‰ù…S×ê]Ãc–ôuù—lv%ÊéDly"¦qærq³z+ßï¿?àï²^þ¥ÿ\¯õŸäÇ[¹Y½OÞJÑo¢(2ÊŽù!ßó^.ïQ*pª“‹¦þG/ß›öÇ¿N3Žç‘ò‹2¨›Ž1ܶ ú¡:­RN&ΦÙry¡ü‰iÔçÇÇÆ)b÷BYßlš|)žŠÝI* uzÛ–µ¦Oóðíúò?œ¹|ÔüÉíGʘB©~i6?àòÏÔ¢î®òýž}ÃñÕy5´þÇÐ÷'¹¬ömóTlå®mž5þ²v£æuªpˆäuðTÏ£Ä+óØ«hçQ[wسMQÅA«é8¼†0~Í8fU×ìãxµãŽht曶é:éwh =[Ú|žrPm”³}Øû,ϨÑr8ê \jqÄE¯ÇqØã¾_^¯ä§ €ïÊGÏú˜+än¾þþÛ×›o·¯W´¿»¸¹:¿¼>I)ZísÓnxœn_ @îÜh«rÌ¿×͉ïÖ,VÇ(€jÜ66ñO%Ø9× f~×z¦*ßnð¨äÛ-Ž¦;ܨ$úê°ëË=6Š¸hïóÍPhöLpÈ7ûªõä´ðIkèWÌiÜC§ç‚ãÿãPn~`¦óèWzô¡ÊÞ¿g?´ ÎÆáܯkY+ä¢ì6‡®¶¹)J¼OFì9›ø—¯˜¡ÈËy]7‡zSüÂ¥Œ†:M;>SýTR½)dõRoþNQfYu¯Šx0§¹¾YËÎUÞ°T›º?ßÄþ*èe7n°à®Vœ¢[t5|ƒIxºOñ©GŽH°¤ÇÖ“›vëÊé¨18mòú -Ö¸ò¯×r›wšh+ŸêMû²×ŠÚZñ6ó:Ýø¿LšW×'“p|aÒI4ìsa'çZ…«bshËþ…*ß^ wu S½¿¼V<Åz±˜â‡ËÍœ‚ŸÖgœýAk†endstream -endobj -1398 0 obj<>/XObject<<>>>>/Annots 517 0 R>>endobj -1399 0 obj<>stream -x]’ÁRƒ0†ïyŠ=ê4 ±ÕÖñеy$A혤ÕñíÝЖf†Ÿïßü» _„ËC% —Ð:Â(Ã/óãåÔ’*JRxÉfõ ;’j¤RP~öN4ÑHq<¥‰v òŠÖ =ÅVãæØI%±zŠ¹ÒDÇ… gšj¤ŠÓ"¡¥ %Ȳ¦c+‡DLM$¶$ -ô\aª‘b\JqGA5.W¨ -ßÞ½…Ž¬4Yl$pº‹§ UÚL'À@·7%Å-¥°4ß›7;@è`·]ÁÚ·ýïaüþVï ƒŒç8¦6S…ø_áƒÏì©Â84Ãðz3ÄÒ >)Î)èw ƒ{\î‚s7Ѻبs§<甩§ÁÝÃÐÝr»ZÂSö¶á>´Gg±ßK{—85ú³ŠÕÑÿèÇ>˜c{1 -ÿ+U࿈PŬµ&Ïäª×endstream -endobj -1400 0 obj<>/XObject<<>>>>/Annots 520 0 R>>endobj -1401 0 obj<>stream +1401 0 obj<>/XObject<<>>>>/Annots 508 0 R>>endobj +1402 0 obj<>stream +x…YÛrÛÈ}×WLíK¼UŒ ’yIéboTeË^S[Îþ@$$!&mëïsN0ÝM¹ÊòÑA_§§»ÿç,q1þ$n‘º,w›ú,Žbü&üõù·³e”ºù*bW»,‰–#عõ™µ›eQb8k·˜AÜ+¡œµ[eÁ9k—$³(3‚ƒ'ÑÊ°ó4š»ù2…0¹ '@L*„Iq'pÒägUÖ`º» »õî&4—bfW€Ô‚B¨sÖf -‹c;b  +0ª²ƒ]H•™@ì1c¤â9o¡ úd1/™De öG§+Šg’JŸbç‘(6ìruÌ vÅ‹id †Ù„”µ˜ìI¶¬b°(íÌ°pjîfh ,ðE€T“B¸ÇÈšRÂ1l²`8¢GXƒÁΘEÃÌ`yx†5˜9ž3A³Å`Óå‘W3XIrõÁæìsS°4Ø‘ã}…ô˜ádÌ¡²r7= £8e »L¬²3Øå‘fï𜙟 Üè` -¦ÃsUÖ`:,á(k0ŽQFÖ`8œ¤¸EÊZ v–ÉZ ó'ìZÌ¡Êö¥¬Å`1qPoAÖb°ù‚U¡¬Á`W¼ñÊâJf ih½`’ ”I†ƒ•Éa°MiBCEŠi±O1’¨,R¯žZ¯ˆ·ʆvÓîÜûò[¹;IT¢N?uU#é“<üq{ó/ö‡Â]Iþܧ+ʘB©¾o7_áòÏÔ¢î>û=úÇ×õxð?Rá~"œßÕæ+nJÛ÷n}¸G­¹Ë®ý.™x3þž™{ìÚÃ^©ÇCµ-_&Ë)3Ùo}?öHs¹ðªÑv¦æ—ϨL\Ï‹¦iͦü…­n¢š_„±öSIq´tëçfóWÂÈðhöËÍíúD7òxݺÛwîçêVú.ZUÛ”îÏWÉŸ¿ºýtˆhÖ¬Í-2„~¶A}v)¬I‘»E$h}}»;H»ùØm}\G×ÐÇÕÉhèjߘ¶ÅPÜýIvñŸ`‘{9ƒL~ñí |hŠ·Èmï.îÛšs¹9tÕðüòÀ(¥Ûoh£ìÌ<›õ‡K÷¶ÙtÏûiн03ÇMÛœ—^¢Üâûþ{Ûmý±M/œ¸ú8z4Ayj‹‘Sc,H#<²Â[±ÃôDýñ²ƒ`žCÍõå‹“Äw;܈ë‹O§QJWýËÔI'ý?OÀùõaÏ¡ƒ(iye_|Ù)èü_ožÊÚöÏåNζªö¼Ú,ÿÏï®°sÆ ·G·øq±ÙàœFŠoè(ãàâe^˶ }vŠõ(q9³0jC+Çxþ7—ÕÚà„ëÓ†Lw1 ¦ÙIþ·Ohü¿/7U±ƒaèªû+î¡íüª29ñ“cÂxû£¨÷X;Þ_ß¼C¹A|”-Ž¤)üæÞ¼d9g󠽬-/Ok†/ Ëå ‹všßÞý~ö_>$..endstream +endobj +1403 0 obj<>/XObject<<>>>>/Annots 518 0 R>>endobj +1404 0 obj<>stream +x}”ËnÛ0E÷úŠY6 3)‘Ô2N› @ $µt«H²«@W´ùûÎŒ\‰F€«3œ¹¼¤ü3Aâ'«@È›@ +‰O–¯oA¬D Æ!¡çDr5ìƒÄÆ*ün ÔVDgµÂ8†¡Ã_Ê`¨WK㈭ÔÓH+´Gç©‘Ái´TdµNÕZ(‚*¦¾¬xª§‘‹›ò¨§P¡Á+õ5Rå.:û©(§e®¯Ðar±vÞÂÔ9(ΛÕÔª)Šb\©§É²¦± õ5Òù|Vêi¤˜£ßÙ×´!G)/kçK!éøñRpŒ,ȱ'ÑpÒ^èk¤‘¢¡ å$â„œ d³ZN6vr>ve±hV)¼ØJ|ñ|…º/álÓàöÁ Htdz|Å%¤ù'-¬€ÝÇþåé&}°`ƒ!*,a +ØNU]Tí‘°¼¤JÀ}_f#R”Pdcö– å•R¥]{¨ŽS½W$àu F§:«Ú±ü=Â)†_]_ ÐõP¶yÿqËby|eJ,à±ÙOÛµ›¼«§¦e[p軆M¢Åšn.7ë<ãÀâ ¾ïžÐÅt¬Ú#qâ‘8‘¼Ù‘Ü>¸sîI,¤Óø:Ò¡a´û»Ýöžûî½ÌGøÜåSS¶#ÙñÈ ¿™¸`ceBõ_Û±ïŠ)ÿ[á-p.¿.„Ž\~Iƒ—à@ûendstream +endobj +1405 0 obj<>/XObject<<>>>>/Annots 521 0 R>>endobj +1406 0 obj<>stream x­VMoã6½ûWL·6bÚ²ì-)ºÛ=´‹n|é‘–(‹µDª$µ^ûãû†”ç£Ú[$‡oÞ¼y£¿FMñ—ÑrFù‚Šv4S<¹û÷ùÃh¶¾]Í×bF-åë…ȇ_ Ýò~ºÊ×bNóÕßgø8EU\Èò9=³ÏÄâñó›Íhò~M³)m*`Z,W´)#<).~ªe”£LÐ/ö@ÁÒGãƒl’¦¤òn¯½¹þqógŒ“-SœqÄ°)/2£Ÿ•,)ÔŠZi¨“;åÓþ9eÙ°¶6ìßœï¢Rûàô¶ª¤ƒuºŒ k‚Ô†<ÙŠz¯ª¾!m*‹kdÀ^ ¬UÓ1â t´=·C A+þͦ4Îr…‹KkÞÚdY§L£¾CÌø w$o[jmvÔè½z—RA9ïRY .ˆøCZɆ•µÈ¯À08¦o·¥X=¤á‚¬£‡ážAå³<…1ÎVï£Ñ7j­SO‚²M‰"öFU^ðúx 8‹œÆ³ì'¤çZï @@ -2516,16 +2528,16 @@ t ¥éèÁÑYúÍm€›H¢›Õm{O_”ól?pøÔd\ÝVïê—›%úu´|ngØÜé{c9kTÞqRRš[…©id{š.’ÞÄx‰eøîûÚíà{²Øó¥è HO¯¡I+^¦o ­Ò˜½ìƒ§dA&¥„ݸïR„g7 L<½uÛY¤AËõÈ&@Ùi_‡tºa§’SõðÝJ…¢æŸÎ«¦Âí&<å³ ÇQé´ÙÇý«ºí›èŠ‚>¨í‘Ytüòò÷³ž;+š‹åæ–ŽcW·˜N(Þ Šýñã-Ñ00¶°©c4W˜DtœÌ0âÒØO><\†ÂÇQ…Ð^4›dÈñ½ÆûCœà(F›¼_ÝÏùyžæü¿yGš¯¦bµš§¾æZý¼ý>úí.tendstream endobj -1402 0 obj<>/XObject<<>>>>>>endobj -1403 0 obj<>stream +1407 0 obj<>/XObject<<>>>>>>endobj +1408 0 obj<>stream x•VÛn7}÷WLòˆWWKN>$iA.´F\Ü]j—1—”I®ý}Ï»•½U4†mÅ$çræÌ™¹=™Ò_SZÍh¾¤¢9™dšŸeç´8_áó ßNÒ&Ìf«ã«y¶>x¹>¿yNÓ­7ð±<ŸÒº$ØŸLh]Œ¦Ù"£WNŠ )Ô’|“SaÍFU­AYC¥eötý f4Åk6sŠ–04Z×q |{Ñlµ<òØ“2Ѷü¯xòm^*'‹`ݾ?,•Nå-ûÌèwªJú@{Û"sQ²…†Ã€óé<›±ó~7­Ö{ò6^,„!/%Õv=Ú-›óTY ¶’0áØßÖ‰"¨Bft‰Ëœvƒ‡[QaëHh}ÿuLžS^Ý”2yÅÉ"¼ÖsG²¦muI9€± <+S‘V7ìNù_žzÞùH¶©û÷µÒ6ú¯>á ×ý1~כּ©œm·ô+½¿zûùã—OÝåÙ4•æÞå¯5bð?±†»UËùØØ3öÇ~q3–ÃÀÞ_}@ù2»«UQw0R”Ä2¨z,I¾'aöÖHÚ©Pã3‰¢°­A‰-^º;éža†N⊇ʑ¶ªhD#ɺ>ÔŽcªIøXC¶‚JÇË]>ØHt@1¡A/C¼xÀ3Ô8½M.Hy°Â!¤M¢ÊËÏÿ¸¼øð6 ßÃÀ/§”A(í¯Ÿö•èó¯SþûøÍY×F#ЄPÆà“ÎúÐÐØП“ tB»p„^͸W‡/cÇÒÇH‰Æ±T¤W±œ—z3$õ{ŽÄ·ècn¸m›@é=Dè;.i«På»~+ µQp”Ú|$怆A^¸ïJ¹­FŽ¨–E]í ß»×â +†éÝqëÝXÛBè1ÊÅX«|w?ÍÎ2Zw‚ç:=I°Çþ8£>è¶^ˆ/Âm³µ.4Q$1—‡Æï„V%çg7\77´¯õÃCjBNµ"j+'hõæðG×?¨àÇwìÞp#¥5„>¤­(Áš®C}4ùÞ]¬Ô&‹!éWMzôÀ[ØgïÂð¸@sÀ½ýÈ.Ö.oÈ1©r  žÎhT|hû…Þ‰½g«‡E%ÀÅ'Äèµ0˜nþÊGéÚÑê/!0RÃZ£nò2æaðáaIîMß+„дÀ³¨­)AGh  ž÷â I,…lx г›z¤Œ o£Œ~³æ °Ä¬†ýÒRnCýˆ^'E ƒ‚óî¤9Ò¸ÑÇQÝâ²ÕEMJüÀ8(%æ3fé>ñóxŸqr±6ˆ#¡í²ÄÛÆ#B_Ø&ºÓˆ”mÑŠ±+²(?‹¸†;E’n6ôÓí¾“A<ÝÒ9`Mæù£ŠV ˆËJЯC”ƒóI¼vÌvì")ó^ö±| xëʤT Œ8ÙÐl†—žˆè=¹- m>¢iÎÚ$[ƒ ¨á>åĆ÷&ˆJ4þ‹Ä\€ÄÌ^û/ÑGÝìç~À¶ˆ²HÊ‘H EµÅÔáAŸz}f§“~kÁ¯UU,-Qÿo[UÜà?€4QF%â×-(pxË Q§ØçÝÌ.±ŸÏi9[¤%çòÅû—/蓳߰ؠSÒˆs…ã8휮&ØõÊÿ³o/V‹lµ<ǶÍï&lîõúä÷“ù »ôendstream endobj -1404 0 obj<>/XObject<<>>>>>>endobj -1405 0 obj<>stream +1409 0 obj<>/XObject<<>>>>>>endobj +1410 0 obj<>stream x•VïoGýÎ_1v?”(æà€v?9JÒZjצŠ"Eª–»=³öÝ-ÝÝ3ðß÷Íî]ŒÏP;‰‚Q<¿öÍ›7óo'¦þÆ4ÒhBIÑDÆÓhFãÙ”¿ãŸ‘”uÞÏ;ýO§ižÁe2×”`>Ð<éÆÑ$Š#ºqÂ8UÞRftAª”.]foæwpS÷Þp ÷îå—ùÇßh¾DçzÍžk•ç´”ª,“F–ŽTF[]Qe%]^Ü6üã-9 ëŒZTN¦d¥yP‰´Tˆ•8á€zÃIÄuvÿÔúž„ã8†B1x¶/¦Û—.é7ÞO íFôu 7e)•ž“r•6ŽâÑiß%«ˆ.2*µ[ré;fn)K)ì)‡>îe]S<Š†\|ìYÈïSW èJÛžµe“ëim;¯³ªP¹0ù0XOûUºò˜Ù¥®ò”–âA’( hš­¯ååÄ¥m"Ì{)7Ždªþ×C袀€ÜZ{ˆ,Y]È$£E;ø è´áÍ84”Zvá'¤(ÝAgÖå­õ+kú¹NDÞ·¢XˆþB•}[,@þhº3÷ÑV|j–ôÖ >/XObject<<>>>>>>endobj -1407 0 obj<>stream +1411 0 obj<>/XObject<<>>>>>>endobj +1412 0 obj<>stream x­V]o7|÷¯Ø-*ÖI')úðC¤Ž‰ÝV×EÕꎒhÝ‘ ɳ­ŸYRgK–“ºEØ9‰Çݙݙ%?Ÿ¤ÔÅ¿”F=ê)¯NºI—†ýa2¤Áx„ç~­¤EX 'øøÂB¿›&ƒ—BŒgÞe'Ë¥)e $ŽG”„ÄÝ.ey+3´VeIÊ““º ?:µÔ¢$oȯ$m¬É¥sÒf·ˆöf­Eºšñ»&C‹„Þ}õôš;~-ám]j÷† ’­«ëìý9}XÐÖÔT;òNÿøm@ÎoKIJ3­ó²â%Þ«Ä–JµÆˆJcÖ$|Ø!¡ÒtK>ˆjSJ×qwvÐv^X_oaIÚOzŒÄåVmÇP%z*ª¹ ²+ÊG Ð¹œPŠ’rmÛýA$“&£„2ËàœWz@¹•°Ò‘¸ªsP2„EÝí´‡˜¹2#Èx¾+éŽÍ$é¿A.ZÍóRIí©ý‘âKý†2ªhWÆy-*yÈ´<ÖýO”Û­L]´”žæ"Gn2 ¬|sÒ4¬0úÇPzMÎTÒ¯˜´r(Yn¬•¹/· ‰ª7moŠ}e<·:ô ïóVSP.4‰ÒšKÖBÁÍpRÒ=¿Ø`‚Oji K…þ$´Xâ1ÇѬåê|E"¨w¯Ñ7‹›åì´AÔq'Á|e Tˆì–Jy'KÈk«üöP~ ÓQ(V~®¥óè3m„s÷Æ`±0@ ݳÕX„û²'òJh ¢»Õ}«=vû°-¨T#ÕSÃX*¤‡¼\Òl$.$¾ÎCr6É.uSÄ{…z×þìö.Q„ÍÆ+¨¶ýûÍdÈM…ük ɯÐÃÀQ5vO~EÚèv,OÔº›F/zg½“­¡Î‚ &Tkõ°ëk Ðxüßù%î}4 u:û~éF©òo'ÛnT.J›Åˆ½¶_ ea³AÙ¼ýÉFãgö+$.!îÒ˜Te)_5MQú#/ÓhÁ—ŒvOyB³;åy%î$”iÃzJïlÊͳ'Aƒ‘÷Óð_¨’u€ÑÇö Uœì·58†ø‚þZaT¸¿ÙXAVJÇhM’=„_I÷Ü»—pÀnØSL,™PZhsŽa®ø„ŠðJ³½ˆÏÑ‚.W>vÈo7òüQ3&^1•;®ÃqcœFî»üt\LŽ$¿°¦‚-/®§gă @@ -2542,8 +2554,8 @@ x åÖrùuÂ?ŸÏf7®.®o¦³ÙO‘Os&Ód²;”4>¾‹sšá'ú+Ÿ]÷>žG kcqÔÂ÷ÿ+ rãÓ0mŒ)ìÞ¨¯ý Ø+ùì¸.”’IÇ25Õ? )K9·ÂË3‚pÃõ Ó@м^â¸1ÖŒws%â’8îÓ0Mã]eúöÓ»·ô‹5·ð]˜¼®pl'ÞÙn6´GÝ _þëÅd0$£á8Þ;ÒÇ~Ÿüzòù2Eendstream endobj -1408 0 obj<>/XObject<<>>>>/Annots 523 0 R>>endobj -1409 0 obj<>stream +1413 0 obj<>/XObject<<>>>>/Annots 524 0 R>>endobj +1414 0 obj<>stream x…V]oÛ8|ϯXä¥)¨þ¶[àpp¾ ‰›Ö:ä…–h› Eº"ÇÿþfIÉMÔŠ †e‘»³³³Cþ8éR]÷¨?¢¬8é$öúÉ„“1¾÷ð_JZó ,=~|û|ÒëL’ ÆäGõ†Ã¤[?iZ„@ƒÑWüˆú“N2úÝ‹q÷× —éɇÛÔSºØѤKi t(ÍκI·“Ðr+<ÍÖ”n•Ù8º¶æ§¥-Ÿþ~Ÿ~Çþu±÷_ôÆÈægXm¬çõ´ÇBGÂät°9/JOÞ¿|¢ÓýÖÒ¾´^òŽvJK²kò¥pÛSü& ÍÈU›t>È-bÈõHl„2ôx†ÐŒÙ»}Ð…ìáÍã{òJë°)º ÜîMR¯ìÀV¦œ€qj³õè†È9)­Çõlúyþe1[$þŇ øÕíôkÂlð.ö¹Åù*{Šx}y1 @@ -2555,8 +2567,8 @@ y@ *Ì\¹?4¥ŸÐÕÖFíp&èÇÛÌjº“ÏR3âߨ(ÅÂÅý%÷=.æq-„A÷”Ð2óQ«²Ä8€Íè'®Úílé Ï ÉrõåÛÍyø|¸ûgqNwÓùýtÞ=oñ†£¬yÚmmpÌzÆeHÚóŒâEUñ ¨ª4ÞKÙŽ“³×=úYñY0gÖ¼&”µE#žA\ óŠØ(IÏ…ønKåG¯l×13duŽƒí9#8V䎕÷Œc»¶Ut#Ù—EœEÖóÉLF¼Z*ºP¦ÜÛÐ ¤ ³Â:îVð|øŸÌ¡«P±{ìu‡Ë“ÄŠì(þ׳VáµiZ‘X£­´¥Ä‰eXÍ"Æ´‰M8Š› "©ÀÌ·µ+—U81¡l“ËõrƒîJ'Ëgö`ô' ÑN8‡±ÈÛ‡Q8óøدE{©HGà´7ê«¿ôpŒ†FÇ!]Eˆíæ˜d O¦ÉQK«F€*ι‚ŒëdÂ^yÄiÔbÐþ:¥h,ÏPpH×Öë‰{ËZk@˜¼FìÌŸ¶l¸d¸;ŒßÖ)´Â„:Vró‰]* ?´çoYëï ¸fƃd<šà’Í—Œ>ǹIO¾žüÚêaendstream endobj -1410 0 obj<>/XObject<<>>>>>>endobj -1411 0 obj<>stream +1415 0 obj<>/XObject<<>>>>>>endobj +1416 0 obj<>stream x•WMoÛF½ûW t©XŒ$+’}ÈÁ_‚:¶kÉI)Vä2Ú„ä2»K+ú÷}3K* íŠ"-îÎÇ›÷f†?Æ4ÂcšOèxFiy0JFôæÍqrBÓ“9ž'øç4åòâô4™ö?_¼~wJã)-s˜šà!#˜h™Ž“ñ(™&tçLLõ•rgKz¸yÿ7KŠ. £«@w¯–ß`hJãq44œÌaèpi©ñk6 …µ @@ -2571,350 +2583,380 @@ ZÉ° ßÛJpcØŸùÒFy«æ©ªrýwÍ̈;œP©ò°çƒ7 P®1VTíJƒ½jÃKÄn!R)‹¦ëÐ!Êo7àš7%xª*mß©Ú`‚ÈNAgÝbµ*/£çñòêæó?7·7WG$÷Wg—íã§û÷Ë+žnòâìúzX—dÁÁÈåui®LaB»õÜ´K²Xzwq."•?.1ù쯡³„>I.ÕöÖ ›·ˆø……Ã?EdqéfX`¾Æ[ÝX¾»ˆ]‚«‡KüÀÁß ·žž› JÀ•î, ÷Ô`Ë[yǘîã¦[ä±r'X sž™T+ì‘Ü®÷¿=^¿;i?ÊÆ3|žÓlŽO:þYœ}8?çýÆ‹Í¥M^¢„A Ò°»0œNùüÿúœÎ§É|v‚oJ¾9eƒW˃¿þ®ÂÓÚendstream endobj -1412 0 obj<>/XObject<<>>>>>>endobj -1413 0 obj<>stream +1417 0 obj<>/XObject<<>>>>>>endobj +1418 0 obj<>stream x5ÎQ ‚0à÷ýŠóh®M×6Õ z(Œô*Sc’Ždýÿ&—‡{ùྠ‹Ã¡2äv"Œ2H]P¡UìYÌÒc •!Û£ç0¸Œ7C±¦CDŒÁØäVž«ÍâÇÞì½ýLýÚàü¼1#Iÿ.ýÁ„SΨ Q¸9¸ù‰añî—ÓÁ£EýrÑ£©W-” Jêø¯é¾[WC®ä 5 1†endstream endobj -1414 0 obj<>/XObject<<>>>>>>endobj -1415 0 obj<>stream -xWMSãF½ó+º¸UF؆`²7ØÍVqX³)œÊ!¤R#idMVšQf$¼þ÷ûºGFì&) -0h¦?^¿~ÝúçhAs|-hµ¤ËkÊê£y2§«›ëä?Wø¼Ä·×TȃÅ|•ÜLÜmŽ.>þLË9m -غ^ÝÐ&'Ø™ã?ÙéûR5­ö0D÷uãݳÎ)õnŒÝ’±Tª³Íßbd±ŠFÎ/¯’%Ìœ.“EBÏÚ?½#WŒWã+Z,úËbÆÇOwdu»sþ {`&×Õ:+•5¡¦tO»Òd%e•Ñ¶ ”)K*Ëtàs• -»ªUV‹«ˆR 6g$ÁÎé|qC îû.‹·{rLT4œçü^© kÆa»K…– db,SèšÆy&í¡J|¯ç…Öí¨è* Ú_“úŠs'ôL٠ÑÈQ[§9wóWUÁ7¬wÒÔ °kÖIÚ\¦P§ Ž±uŸNƒ~ùßÓéOOgOgSFÞFÍ -ˆæ8hÈÐJµ -¬˜œaŠn½ë =ªÔT¦ÝËsQO.â€Uîj.f嶈x.g2o(2e¼Ô³27{BüÃçÛûuÒ~mÅzí P‡,^9ø—ÌF•õéõ—úĤ*oì3²Føå’VÍP -ò²2âæœdV½…ËÅÝ Ð;Ü(áC²5 %hÏûhbd‡Í!]øÌÂYEg@J½Ÿ¸¯ªa˜?Ü(€–MÏXxñùU{³ì§èŽHh)éÞu~ô1{­S„×ÜÄîQ(]WåÒ“A·½ "ë4üö)ŸÄ -ë­Ð˜Pú”ù8%úzC„XïÐŒoaGTw<<-šPcjS©€³z Í„ ŽŒŸMPõz«|^ñP††ìJ8}êz3ë³å&Gd ‡_'¹ú]€@ŠÔOÖ)¼@,ºÀ} -<¹ÇylA1¤c´|Fi‡RKµyÈZÍ›„ò2×C£3S^d(• ×t¬Mh½¹}”Íäw¡Ì«³`1óÑ¡Vœ ’~iÔöÙxgYù' £œ˜KÜ"·Ü"3\r—KÌeÊŒŽN«ɖ©&J”ÑAúëÍÆÄ1G’¼öŸ>™Fœ’\ä?¢lG #øsZÒ£-Úc˜¬—2ù9«ãØõ v¡SU¬ªèÏpfÈüxäìq?ÞΆq.ÀY?NÀa´ÿx·'pÊ㺢¨Qv®˜FÇ…Ì%îVÙx0çϱ­ã¡¾ðp×IÓ]a4¡IÆä¹â`)÷RèR¬Ê¨SwBŒ7²%=G!ËšT€äbý¤³Ú 5o¤wðbv#ͬÃyf$Ó²¬=ÜÎøâÄ©þªêfFÇýÊ2Ø9Žòú2^±ÅbOT[-ˆý`¡¸Lès\%6*v{ññ;›Ä}A¼Z"W¨¯x¼ Wº¥Ò5:®œ †lÆÉ/D)uÕˆ ¶^e_``ò~™Å„ƒ((ÊuÚm'©WÐKÔ´ %æ] -ª,òö"µ€Þ€õXuZŒñ8›tì5#9íJyõèßdâLrwè‹7//Z—óøÞó¿_ì®VWÉêúï†ØÁל÷/›£_¾:(ϳendstream -endobj -1416 0 obj<>/XObject<<>>>>>>endobj -1417 0 obj<>stream -x­WÛnÛF}÷W Œµ‰eŲóRøÔq][m^+r)mLrîR‚|Ï I™bâ¦(Ê8/»;3gÎœ}=i„!MÇtzFQv0 -Fô~4 Îhr>ÅýÿKM‰|O¾óájvpòqBaH³gOiÎhÝ[¯É¯”'“ñ[íòŸ=mlùL‰-ik«èœïÈ­l•Æä¼ISZhR‹Û-ùmÁÇhrº\ë’r•á££9®§ÛÇ?oÉädz/#†§Á>%&Õ™ÊÕëÅÀ -öuîñ¨ò˜ºŸ³±qEª¶b(5ΓMH­•IÅ ·R¥vAce|LØÊ“…'…¶M Î]”vãL¾¤‚ˆTåÄù-¢çØWj]³LíB¥t¸¬4Œ©(²Uî£ç˜­Ujâö}k¸ ïQg:[Hl@—±¹{¸þ‰"›ç:òÆæx‡‡“ϵÿd»!è‰Ý áW•“ d\[û²ª‡mãkëS Æeê,Î£Ô -v ,€–Ú{ea¼G®5ÈEi‘àŒqöÖ²µ¥B•H.²äHbÐ)סÀm,ͳEÜóÇäÈ¿öq€ð“€f+DéK=s¸À2‡CœW¨HsRüFà FÍàÇyšéåÆcí¼V1ÛÆ4žzæeó«>gx%¸ï. {½!×!7ˆ­ŽƒœÜnÀ–’2‹‡Ô<ëðXÄ]–H%„X¨²g\Sq¤˜M톭»ŠÑë0nå.­Œ/hg"¼0¶¼US.púZérˤCIõ½4BÛN[Cb䘵Q»Û7ЮèqC6…ráé”=ê -•5r€Ï”@ë9^Õ5ríƒÌ5ϾëDU©‡Ì£EÿËè[Ÿ±}—Cð«´™x'ñ3"­k=ÓÂ×LM,‡Í2iœØšS´á¡•¾38@mÚ´[Dx»û6°ÚÕgô ³ ‹hu¾º j–¶äoÛñ@°”b–={ -Äé‰ÞI{ cëЀ]‡;[úŒQs]¼ìîïg}"kµNÕ¬v5÷wóE‡‹ ×~~—fÍ Pè‘q^Aü_¯QŸRo¼Dß­TÚC…{¬YV(Wž2æGLø{ñ^4 wpQ éüWwÙ¦úJ[èÒCÉMî` ÒŠ -Š˜Ï“°zv{G¶Ý@&9icÒ0•Õ!|ía@¿BÜxø¤nBj­â<‰¿°Áî4‹ÁýáºÓE^· 8ųI­â(ÁXå‘ðæ•É…Ï(Óaf×ü óÐð;ž°ÀeõŒ|2ì‘M|/Zõ.1nµÂ(„Da„’jõ—:h4ž«Î4œªç¹š©Zr{B¹Çœdz*º¿‚Àƒ P5~Õ3ÍŠQw>èƒtÄAÃ36£ -io`ÔPò0ßr°ì¸Þ5®1æ€jûØWË6ÄÁ²Â:úPçdDM^ÇM§§_ó£›OWõ°À: -Î9›{ûîÿ.븻j?áþº¹ÇíMçõm Õ÷£—v%uo»÷ôòæYÃÿv½yÞž;Z†¯¾îݽíÕ;xõno훲ôMw^C`ò(]¿>¿¹š/c|xyÿNÿ›G{}ãOïÅÛÉ1 ¾ì}çjÞž¾¾’cN>ž7¿Ã3üà>?Å/èö—å姫K‚b~ááÆFU†éKD—‘¶†Ój#>úÑè;™N‚éÙ9¦e,§|Æíìà÷ƒ¿~5Ô7endstream -endobj -1418 0 obj<>/XObject<<>>>>>>endobj -1419 0 obj<>stream -x}X]O#7}çWÜ7@JfóAVU¥– -µ -¬öiåÌ8ÄËdœÚRªþøžk{&v&ÉŒ}?Ͻ÷˜¿†4ÀßÎF4>¥|u0}<øt5 Ÿéq§çøRÐ  ô˜õ?¼(\¾ï¼8~ü~0 þpC<¤þç÷vïñQŠð²ûeûˆŸ¦2g£o"ܧþ~5øq‰æšy.|Á¢øú O/)•Ú¼ì|>}½ž=<óÒOW'4†ØõG§ìÜ…®¬²NUϤ4&[Ï+é,= {4êÑøé˜r]U2w² ù¹&£k' /ºÇªûÖôÉ-¥•Thª´£µ°–æF‹"ÖÙŒ¼\6³«_ -K?ÑJäKUIKº"åzÑ¿>i_·/ÆÉ‹Œ&ÖÖ+I mØZ镬¾ -G¢,ƒm‰êV©0’]\¨çÚÀG§i.IU^ºÑæå>¯á0k°jµ.U®œ‚ÉV¼È§ãŒn‚4~»`?B ]eÅ]pïR¯”Ý LÒÐÔèÅçÓ‘’bAós]–ÂIo‚ŠT"i¶õ·µpÇà)Q­l×Shgl¾B§¨Š&X¤EÓžÞ‡ÈÈgX€5X¨ ͤ›^ß>P…xYí–©f—Å'£Óì„S?±6¸³“Œ¹Ö ¶zÝ#Yx -õ®®BB€?‡к¹ä°K¤‘Ì(pK#ebGÄw‹‘¨=än£ ­“À^¨Òä1Jƒãå«0y5¦~¢Ƥ>¾TzS2Pê\”ðß³õ,‘] ãT^—¸ó5”3¹4$¯¢râ™›h…Y×5r4ö)êúÉë8@ÄJ‡àóï½àLy»'ê„& ´½mjC5¾+6½XFv) ËXT¹Ç€x„PÊpã-q’‘é%ðæçFDF?pÛ%©Ç‘‘¹T¯¾È¬V3G¹ )D7vhS4h[ˆ|ö&ÜVûjlëЇ}…Àî3ål -˜j0 ç·„=ol\Éî£5ZUHnÇ¢vKm”Y9ôõ[yì2Ê%öÄ ZzU"½Mc 9tÌe.jdX4ÑAVdåGÛGpayï$&ÊW5’¹ ˜g?ª@F—[Ö>û‚YzÔ¢-«…ó0ÒêÚ䲉ø0ŽÐ›Îð m»©=È E³·ö?) :ÈÓœ6KÄ Ì™XIè=ðYŒÜ×´™ò¤Ÿsð -…Ø»ò-„²á ®=ø;Îj¥«þnfÚ¹ÀU„<­µò#¼_y¥Ö/Üš˜‰˜„˜”¡êYI§ð,½é“». 6Šç9˜¦/%É«¤z^εYj]Zø½¬c#º"Ê@t[q“Yƒ}ŒgƒÁË2;ä´?: ƒî!PŸ-'›†G>ÑŸ¨£Æ È9ÝnÙ%¶xÎ ’=AÏp»ÉS‘íOžL³á·©¿_øû¥¿Ž²FÃÌÓ k´Ý˜êÎo–þêï,kK7v¥Œ;»˜´v.æ¸Ø ‚ëï,+B ßQÕXA€´Gu ‘¦+„fz•˜› L=䦭sìð¥.r£AOEõÖtÙ¸5…âLoHþ#VঠŸ1s «60žÄh* œ€{{ Äx -4F4s5Lý&±žCÑXi²oU¾4ºRÿÀ {zô+£kÆié+ìüïZš·XÀ;äîéˆó¢™]ß%zEQ Å ,Öê\!v…×á}šuè}½½ÿã÷ûÛ/w¿ §¿Æ¾Ê¼6Dà ÃY 5PˆD×.ÝA 3TaG¯p‡—nã0²’@ÓlÝV €§L®Â,mœŠŒ0ò™D=¤:Y–žþø–  p+Ù›IÄ/q&€§Äßʪàð‹Hè'U¥kØå#k‘¿€ZÁA_.ïÐጣáø…_ølB/ÎÛ¼2Í-hžRŸ ’5!9žÁ®êÕl ,cV‚WìÊ^"ç!ƒYz[Dá,x<žûP&û‰‘‘7 /Â&‰j;yÉç·û¢6_Ê¢.ã”am€’3ÇœEm°TŽ6¸£O.zBÆÉ‚&s ÃN$½hÀ˜(4ê™÷wê)=¤ù1S*-~aï?]Ç“óðô,œñ¿€}˜ÜL'tgôw @„9Ç1|œ­å}ýfyÿlÀÿ«8e'Y8åùä…NÛo89;ÉÎNÏñÏ ,žó£ÏüÆzbþendstream -endobj -1420 0 obj<>/XObject<<>>>>>>endobj -1421 0 obj<>stream -xíWKÚ0¾ó+æIó ÀöÆc÷Ô®Z©$d‚Ùxì®í€¶¿¾3v‚ÙˆªÝöR©$gb23ßØão&ü¥0Ê B±ïL·7 \Áb‹ Ç(l ‰“$EÑýR­%·®©VGÃá#3–kœþ Œí-î; DiQ¹¹+¨€Ÿ¨Gœ'©¥ãý¤Aé6]ÍÂ>Oú4NÝ8sãÜ×}hY;W¼(ßf«É²ûfÙCÙjÄYçN¬-gi<¤Ø<Î,%õð„8Ѳ7êF™­æ/ƇÑ6H0ä žð¥+í§«ëŸC͸Û|5O5wPs·¤ùŠ â퀹>pmà(l œ#`[Ú|[ò=0ÍA*±Ê–J ˬ8à Ûs“©·7HSŸ\QæÖpbQUø¦„´P2¿SêAÈ;’Ì - ˜uG¥ð.îʵҥRPŒKHƒ¬4dk·Ã90¼£&Ê/¾ºV¶ì7+ŸÇíŸ÷v²ymÁ’%wOÎXËG¤Žw&|6ŒdtA~1bÔ}¬¸,8¨-ð—Ö &fAE¥ù¶ˆÙ%ŒTG?iÜùÛ©‚í`ïÏÕÚ2†¼ȲK›µìÅðµä„ó$‹R+)¾sÞìðtÖ{G>6jÏp…[NÐ¥[ŒÜq|Ÿîl1[ž1,-ÐEXÄ´LnPC!3„é,†‰K—x%3ç7>£ÐóÌ)DÁ"Ê4Fž[.ŸEC©‚=ð:¿NÜe¿ÿ=i²¾fäóSQ&*hHù ˆ'¾¡d#¬wæ¿ãæ¸]\¾óIw–êÒòÛÔýò ûãö/óyÃÆ—ù)¾Å ¦’k$¬~]DΨçwh=”b¯¬ëÊb-³· þFHtþÔw¤x‘¨‰Ù½=,JH¨ÔTôjÈËÀîˆx]ýÏNg,­k¡suNóB`Yq(öÂ*˜¾ÞAMÊ1ÔP!r¬ŠœË;5¶Á†µ™#6±Å ±¥HãTÀ5ß«Ö' -¢¬Ný\í_m· Á~ÆÃÒ‰Œá=íÍY'ùÊÆØ÷y"m²ö•ÃGÂ9e^”ÿ²$ýißûÊóMß>®ûöt8Š“qÃá»úhòq:OZÝóÂÂ\Õé%)Ó£F!%ô1ÙÍâA Sêh‰°X¡•ÁVÐ÷ñ¤0 âÑpŒ_ŸørzES׋ÎçÎ"¿aendstream -endobj -1422 0 obj<>/XObject<<>>>>>>endobj -1423 0 obj<>stream -xW]OãF}ϯ¸âe©„M ª‹Ë"ñ°YZ¢VUÕ‡‰=Žg×ö¤3cØô×÷ÜñL⪮*”„Øžûqî=çÞü5šÐšOélFY=§cº8›àýürŽ÷)^FR1º]ŽNïÏi2¡e#³Ë9-sÂãã1-³ã§m“•F7êoá”n,­¤{‘²!WJÊu-TCµ°NZýbñ)šœ*‰jpÃÒ‹ª*ÊtãTÓJršt–µæ„V­ûaùe4¦dr–NáÿØ•Ê’-u[åðH‚àAä[|'É*×úpÒpl:KÏùØCAR!2CF·Ó/ÒxŸR!Te}Ð…®*ý¢šuŽáG¶ ’hh!jiIˆ¶Þ°%|iHŠ¬„ó\ò@5"ˤµjUIj€Œ6_©0b]ËÆ…|>£äð’9GØA¶•F4Âr©j@ã¤=iï!m¤Z—+ÝšRkÀ«¬³>ù…‹ MRbø²ËãÆ9Yo -ÀðÌÿ‹Øí ú}¢¾JŒ—/L…‡Ãßh´ãŠYëgÎÇèš&ÅÛƒñ=qO_ÇBêfóQtEÖ:À_xÏ>¸ßO„Æ{–h%åBY›jë;‡+ƒŒ»:…Ç|1•{]nZÛ®:rßRk¹Mº ‰²ºBó¡y†ž§…t·ŸŸ¨<@´L’”–è Y@ےͬªU% TÞ•‚³_¼«%ÇKw»¬v…ŽÝyÖvzEе@½/(™ÓK&Á4½HéI:°lMí¦z±ÿ>ß“é<ñ©o=‰z%вY‰†eöà¼jrp›KØeœw·káQ¶ÒyOȶï @h@îpÕ[$} ]Ïñ^˜´Õ-Õ-0y§­Þ0È¡ÉÖ«~P¨4_öVVÀµŠ.<Á{-ØõǺÒ+QÙ?q"óV£» -ÉwX]ì´qÇ*¨Ô©Ýl´qôž¶ÒwÒ!¬A‘~…txÝD‘;d7F>+ÝzJNÒ«,çˆÞÞƒVbáÊe!ÚÊ“æS!’RÀ¶ó8pÊì¤ ì`]uô5øaÛõZBYso»Ý¬€¶¡!..þ -4?ñm€`-\n©’Üþ\Y\xÞçCïýŽ‹" üx¢*Ò©*{úS×p,š®¤£Cìÿ ñ㣎ö_¥ä†g}dZ±Û>I-XºÆ=i³w„ ê¨ƒ' $X ²a²fXŽßQ™0¬4ËÏçÅG8áVñ¤IéNÓâó2âö’ ½Dk ]|4,”ƒ »â¯á^Ä90²Ó…W¼fú öÑH …b†Ü¸ vTU™¤wd×h‹å ”\g-C?®=’¹Ä(¬ÐÒ Qî°§/Þp'2zdgä¦RO}Dà°FPzÔ¶ãŒÄÀkÄ…Ï@ZBà ½ð½’ß‚ª“lžØÀ!¦tcé“ÊŒ¶ºpp\´èWXˆ9„ŽÖ·£Î4®ˆŸÇ%vûèpéLm8N‚à¡g‰î)ºÑa©BU´®íê Exõ¾’ëΥǯg‘bL ž—j /"~Áx)Œ2вßN‡3`à.‹KY@õUË`›ë¥ì™À³¼ß”‘-^θŸŽ^ÜK@O²÷ºÇCÞ,š‰ï%b[ñ²ÊB­`§t~°ÈÆî!…NDaê‰h˜(X ür‡iþ -í¨(<´°øÒëúŽ.ÒD)7{!R¨ò`òžð@«âèÁ8Ž³íáqç/tËÑ£Qµ€N÷Øt{ÛtØ\>` 7ºØ|¬’k¨g›\?ÆŽN®—“냹•^[Ž12øê‚GEü¶Xú ÀI$òfׂ™~àÂõÒ1öP{c à Íìä³aŽïÇxÐþ¸ ²äUÁ’ß Nïÿu¾w¡½§k¿Þ!­}„?±Á7çý ´I¾y„k~œpÈÝÞŠö…ý»¾örÄI<ÌÇWßµ*žÏÏÓùì? y±³‘ËÑÏ£k¯¤Yendstream -endobj -1424 0 obj<>/XObject<<>>>>>>endobj -1425 0 obj<>stream -xÍWËnÛFÝë+.¼©ÈŒ$Û’\4â棈“Æ ²hº‘C‰ 9£ÌQõ÷=w”ÄH)²jmøÉ™û<çÜË/ƒ1ð9¦Ù„.§”ÕƒQ2¢ëùe2§«ù ¿Oðe$ƒÛtðäåÇ”¸2Ï(Í ÇG#J³ó{ÝHjV¢Á·ÒRU*I¯ß?¤tÿ&¥Ûôð"¥Rá¡$[/’L«‚Š²’¤ ÷ÏQ/Yi¾JC"kJµ$aÝ£w÷áÉ£ôÓ`DãËdïçeceU$tWÐV·8ÓÐB7+wëŒÏ>yy">ߔʒm×kmzJ[iý˜ÒùéuSjEBåß±à#|J¿*QË_NÙ@žŠT½È{oʪ¢B”5šl#L“„“irÅ9¥+‰z |5Mkmm¹@™l&•0¥¶ThÙº -µkÊ Ž ±…âìÞX”.!˜A}m(— üáÈñ;½£âBln´ùLhŒ(nʇRåpB7×CòMãzÅÿÞ§T‹l…îsï€NDé†-å²52G[{>×(ã@ì›y®kxô‰X‰ëù¿eÒeϱ‡ÈC!þž_ë½Xׄ'/oh T3¼/.¯|;&É4¡‡]énC…̈÷Í»ß_½{óþ-[Þ§ÇÅd–L];Ñf4æT£N–¹«"üà2в=ŸCWX¡Neå8¡$*ÎXóAhÐò€jÞ0ÓÒ—‚^ Û€‚.OüüxŽîí3ä~ N?îye Œ`Ò -zkÊZ˜m´ùàctUI3$Q5+Ý.W.E]圅:­+±µžÐ¸,íÇG =Çüȃ'$Pû‘âEŽ¼ —‡ô0‘(Û€MF×TéLT®Ë<\´®5`«ËÌÑ«[ð•øŠ¤#ꉱ\fåZ8~Åc-n× ÎéîhDLô€°•;è‡xzéÆ´$XY¿Ñm•3>„BºšÍ©ó9¤V –‡>´ž}Žø¢‰Ryœ60ÓóËUXi¥²¡ÜQ†¢OúZ|ÿ*ÓNÑXÇÄ.̾Þ±ïFR}-VµT ŠNáãDqx½aýÁ(Ž'2ìªxä`¨Ø´ä{‡1Ê+$]a™^ûÆ]ĵ%,'Y‹®¢ùíÎ4¤Ò¯GF~iK#ûD»—7C¿?ùFƒâ˜ÓhÆ·“™ˆ:/‚q` -æÎfà+67ÿƒšEÑå{guÄJè´h·BP@ó9X®H@hKn—Š‹ÇÍu ÆbfuCö¡WTýE b¸ûŒ\hÌ74L#e]àä€ó²ùɺñj[謠¥Ö9•¹¬¢-›dÃn"i8þÜW\Ù¯@/ëXÿ -êª#àÿéϵ+wè¯Ó× ²ÑßZ …{p]á†l=$6b1À‹†4¿VlV%šùíhs»Ž´,Ž”>]Rœ;ÛïíÏ|LÞšë¸ ³Hù.Ü6Cg}Ñ8£LaýÌ/ >p(c´E É*Î(-¿P`[ìÞ`¢ÆìÇÐÅW%ö0©Ü:Ð;—M¬„Onuèû»ó<¼h§xmœ_Ò¯”ÐЇg¯oŸaÔŸ&öÁ¬å ŽíH»½õ"¿˜ ÔùùìÛW³«d6c[ç{cûE:øcð£ÔÉ endstream -endobj -1426 0 obj<>/XObject<<>>>>>>endobj -1427 0 obj<>stream -x½WMSãF½ó+:>AÕZkË`C*›*›…Ä>²VŠCÈa$°@Ò„Wÿ>¯gFFf‹\ØÖL¾÷ºùç`L#|iæÓdJQ~0òFtr6ñŽéøt†×>~JI‰yàOfo,‚ƒÏ—Ç4SÀÖôtFAL°3Q.jTMkñ"ItP.¢uZHRUkIº YᥨÌÉMª×T) -¥yœ©Hd¸£+YRXªÆ_Ü+Ìá&ãT‹0“GÁãÁˆ†ã‰ç#€Ã•ÈCAI©rXŠTž$h¯µ°!-«ŠOp@‰Ê2µáwê¹JU¡)µ‘þõ©PdãtÄH%|¡çXç¡©"¡$Í$ýÌO?_ŽèÌ–g裄ˆÜW¬rû.Á/T¨ÖÞÈ;íÜ ýçžK™È²”ñl*M™|‘}¡‘ ôŒÆè7r81qúÞÌ£•+OýL nA úzs5_^Û«¯ú3oʱ»æ HÄ1ß²mA_d©¹Í‚îÒ"†M†ÆW[Œm{óZW¨HÅý!8;÷Ihmµ\ÛwËéðâÑ¢¡X&¢ÎªO»oË4eÓz>WEU¢ÿÀX¢JNÐFTˆ\R -w™V{zîNõPÊ ¬ù6üÜ’¢Ág¨„¦Mše@´O”&ýÔJù2äQ#@ÒÚï¥Úóv-«ÅòfE&ÔûCÛ™_Ç‹_îàªZÓÝòz…®Áªˆtéöë¹çÌúS ÌKDm9©IÁ¹ÉÁ@µ€vÀr/9²Nó`Ëp2†OܯÝn£]Ä?Ì5Öè•ŽÊ4”±GBÑž€Ÿcx»Ã‡V'Ö{î¹~‡Ñô?q¸‘º ¨Gö=$~ÿp‡ÅÓ6ØÕã¡ßeb+®VŽwKš¤k[=™93¸qz 48Áf.8ÕfioûÍu¨mFŽF_ô,J\c ç!¯xažhËMeñ†±EVõªØؤ*c†Ônã0œ²ìae—B(k ±•uÁöˆ±ž+|K€:s)" --­óVé—7ßΗ׿Ñj~µ˜SpC‹‹¶u.Ñà÷ ºš¯‚‹oL¤Ø'Vwvh³›‡—ˇíñál„å:>üè¦z<;öfpOpÉg[ÁÁÿê$Öendstream -endobj -1428 0 obj<>/XObject<<>>>>>>endobj -1429 0 obj<>stream -xWMoÛF½ûW t©HŒ$Ë’] mÒÂ*Œ¹¬È•Ä„Üe¹¤ýû¾™]ÊÔJ.Ú"‰cQÜùzoÞÌþu5¡1þLh1¥›9¥åÕ8Óì~’Ìhv·ÀïSü«5müód?\]}ü4£É„V˜šß-h•̌ǴJ¯Ÿ6t°-í•iÈ©r­¨±´±uªIÒ…N›ÜÂ_רºi«!5;Oºá_hPÕz£ëZgT*×èz@Û®UA¶’“9Þ-×Ijͦ?¬¾]i4¹I¦ãzpÐnг8ÞçEáïÔ+Ü“+òí®!•½":µÕd_uMnkªl£M“ÃwKëÚî®,(œAMŒmè]ä8:”ÐNãdî¨Rµ*5¡}Þì(…¥!)G¹/”„Öì-í¬k}½Þï´„q»ÏM†Pèþ–lMËUäϤÎ_?pQ¹„ø¨©°)rqíÚ °kä(–.”Ié•®s›å°P “ªÝä¦åÏ‘{ S*}2 ²u†Ìa~­S‹°8>ÚiÅ’`v:äE­ÄAfK˧ç!ò¼!Ô¼fg¥6X$ð1%Uá¬á-ÿ(orÀá†j jÕIÏdI“Y’Qt1¦»$ºßÙ$ kúõa‰rD._ðLða³i‰R]¬㛃#vo˜*KÑ HתA¢ë³BJA*ë\¾F0H;'߶ 4ÓÎg¢£ÀuKªitY¡O0{?Ñ®ã®W@z“׈Ð÷@0 µšÍ @™'ô€7|sž)GßÂŒ*Ú#ÚE»¤‘én©¡íB¤Ï­æãTÀ‚e¡ï™™¥ŠZ«ìÀaG~/;ãæñÝ¡ò‚]±"Ôö5ÏPÕ6àr“§ lÖšL™ô0$·³mÁahJ[!„ôÄvä7èmØ÷ñÓ=M ʬΣ›™ï§irŸÐgõ=7ÛÛ?³ÛWöÑtõG/®â7}‹¹ÊO*æ{j Ðͳa9k l‹&¯À?ORGhEiLy‘O¥˜6EÂqzºÙkž¢d@ëO´2¿\ªï]_ª}ÃBeDë7¼DÉÆOÄ“‚r¹ëFKBÊôF!pîÎ^ëCƒNêÖ¿“®%&‰OŽU' ¹ü²íyîFâEês!ímý}[[4‰”hR1ƒø¨8ðåŠ~aŒÃy‘é*nÁ½ó1Cùé©žsfQ~Ž,¼¡Œ±­I5ôUV©²¸üv‡Ñá[ ˜¿¡ß0§6µ-/*¸ 4žÇ[¦A 4>”§·ƒIwµ59ĺO¾¸ïÍ®À ªìÇÐâØn5Dìd‚ðÛë¨@‚Å€vX+H£*ø²é™ bw\‚öŸ7Ÿ·‘ªÜB0¹Å;^ŠðX¼»MÅù¾‘³›“@eƒÖ½ÎMZ´ÙQ€ŒÌú"dsAÔÖñ;Š^ž–Ïá8çYkŒ»ÔÍãÓ—ç([f*ÚÕú¬ò"e ¸á+?ÇD9Îl -ßQ'ƒÇV*³u¾E.~d·XeG]ûIŽ—VŒpŠó1*ÌBü¨Ÿ»ÍÏoi¡õ%d-¬e r ‹Wç FØ’»y8IˆOáÉ1T ~ -C;UUä`csÈX8»ØF{LŒ>³=wʈf ÃÐÏï4Õ! e¸QoEMá®{ü¤$ªÌñ€¬WDãõ‹êYvSŸÝhz‹™sïçÆÓfˆ ö,ð‚Š 1É¥>'.pÌÃþŸæ]5Å cáV -,“#H‚au­õ–UŽï’¡lcÄ -z‘ K=ת×CŸÞ%zæb?Õ9:GBøwŠ½õQRY #¾„ÊžJSð}¡£~b¸M˜7’¿ÌoñÿÓÊWªãQ¾ŒË÷€èIÇ?“Œ³ïÐ:Râ"lzøq±NX+7v#ãó$~*í#Ñ¢ :Up: p¾“U9Pý㧻p žÌpi¾»¡ùôÖßBŸ>?>Ðoµý†Û.ÆrÚò¬Ävdj2ÇMF‹ñ=/Xÿr9›-fÉb~‡µŽÏÜ°©_VW¿_ý :Ù>¤endstream -endobj -1430 0 obj<>/XObject<<>>>>>>endobj -1431 0 obj<>stream -xRÁnÛ0 ½ç+rizˆf%Ž[lvè°!zÉE¶éD-y’<¯?ªIš.†Ámäãã{ü1‘Hø‘ÈXf¨ºI"d2 ¤ëœÿ|¡y ¬RÉ׫ÀC1ùðù2GÑ0V¶–(j0N’ ¨f !¯6Ti‡€ÒYUWʨºvä=ùÛâ™1RH.óE.2F™}iðbCa´î€“¡0M¦(•§úo0lgu _ªë[‚n ÈÔÚpe²½EØ“‰°uÛ§p_¹äÁ¹oïlÙRçž´©íèAŸ˜ÂÎÙ¡÷¨-16Àu~è{ëx&$7þ=-S_zEXU¶/h•y¨pÕ—µ½6;(ŽÕZk±áhÍMà·;ˆ£ZÅçËT¤‘5K-‡6è×ÙM רêúnTW*žc<ó÷èTµ×†§uØ£;ƒÐo Gw°W?é’xIøSè«I ±{¬;ó0½ÔMaû ­‰Žù®•5ML_½x¹ Ø½Å·³;Mª)(Ýú“JëÓNÉŒ—y½„\åG‡7÷÷øæì3Um5td‚Š}#Óù¹`ž'w'mÿkÓ<y¶æ%Ž†¤ëS1ù>ù ïÿ;endstream -endobj -1432 0 obj<>/XObject<<>>>>>>endobj -1433 0 obj<>stream -x…WkoÛ6ýž_qá/MŠDKÒOÃí–¡È°ÆE: À@KTÌZ"U’²ç¿s/ÅØÑV MH¢îãœsþz2¥Kü›ÒõŒæWT¶'—.oæø\Ü\ãs†ÿ^S}òãòäÍû·4»¤eW®®ohYŽ_âNyúÓZuQ{šô{׸rΖ_äéuzãb¾(fxçt^L zX«H -–]:ý}:¾ ét8>».®øøÃZ[RT6FÛˆãÚ\Ö¦Ñd"•Ê"¾¯½0gi’ÌMÈùt¤Ñ*è‚–k?§ÑQ0mטz3+Ïðû©G,6jM‘³ŽÃ¹¤‹é<Åì¬&ÝMkp€°†­õMTV»>4û‚nHÓ¸]:7„ ¯ÖE -ÚVsO}W©¨9{°†3l9h¿Õþ|@\÷‰V}iì¶:îœß¤8TYꎀ¼jh¸~ÝÝ~"o®;¨œŸ·®Îg£TñÈrjP¿MRt–ä%Æe½¬6lé^µ+%õbíÔQÔMÃ(ÄTŽ#§®,{ÇçYGU™d20 VÞm´ -›ÙÈ‘¤XMÝ¯ç¦ d\p³Ø»mµ€1ržLCRK)H^µCŠ¨ûЮª„0…·FÑÝû{A¦_U.rß[Ëï'"pN¨L²VF¾‡(Ê‚RwñÖ j¬‰É=ßs•F@£/=ßa˜¹.8‚Ô&Ï Ø>€ ´ŒÝ*/ õ‚‹µèçwwþõðñvùŽ.FîÖgZ 0“1–ÚØqrCCÐíL\ÓÎÔëÐTÍóA˜ÍÜmSÿäŽ:Ô/Þc˜FÎqk$\ßT¨Iª[v hÂq®[ã³ÒÞõ…£žXƒm…Zb€Ë ×{‹µÇŸÁT`äf¤s×ÕÿŸ0Ì“uH=Ûp ýÖc&¡f¤î… Æ´hU/Ɔ´‚QÖjµw-x|0¶â‘Â~•˜{ÝÂÑë$lP«: ·R @P žÛ9ˆ@?&Ä<¡\*ÑGCŽKH—‘Åîn$4VÐ{½;6‹0p¶Ù˜ go¹D§·ðSkn€|ªô“©5hÛ-z•D4Fé bc"`Ju^•ÑÈôBü&ØW½"„¼£Êí2ó•»åäˆAª¯aœ1ÃI·“Õbô<Š¸ˆåÔÏ·hzI| - ÆaÂ×uБf ©Íc=gßY+yÀ8qÅI¤²Ù¡é=£•Ó?0ÚuàÇàHéP·ÛÑ@7ÅK ÂáEAA#äî–Ü‹ÔÊm1Îó«Åöê!ì' ©a8! ð(ΓMæF£FAÓ|Êk¹šË_,2~>¼Ž 9E×ÉC3V fY5t®ô -/ÿUs«=0õHœôù$OÞØÁËœ+ÇŒc¨!æ `AýHÇ!ßÌ•*-¾tm§#w†”0\XúÂ%éõ¨œLÛêÊîfÜ.DÂysÃ^ [E×ñIx~Ãi²Ž‚™ÏunÝaíÃœîQgh;Ø4Ñ,s “ÑݪÆ$œ%´uË\Y8žêÒÆfät$axX>wÆðÈ…H -í2hä èÅæ0Á¹¦o1Á>Z!Ô~ZneSx6 - a‡ h¸Ÿ+ïΡ¶r{ÞÀ¸µ£#¥ñÆî0x"M6­l’Žc7HCdí<Ê…?Ž!AY²õ¡—j®œæn0 -ŒÛ삼cã7c‘_³Á´[g²S_Y=)ÔëqfK2g…P ž¸c$Æ‘k.—,Ág€sq¡:ÒüGyÉBpÎ…–÷€¼3æúÁaq÷F\§mðÍû›Ã—¢éÛyÁ_¼¾ñ}kq½(®¯nðý Gfßq ï–'œü7x —endstream -endobj -1434 0 obj<>/XObject<<>>>>>>endobj -1435 0 obj<>stream +1419 0 obj<>/XObject<<>>>>>>endobj +1420 0 obj<>stream x¥WMoÛ8½çW zi -´Ší¸qºÀ6í°MÓµ‹6{ %ÚbC‘Z’Šë¿oHÊV” ÀbH$r>Þ¼y3úçdJüLi1£ó *›“I1¡·‹·Åœæ— ü>Ã'i_LÏ'ÅÅøÅÕêäìã;šMhµ­‹Å%­*‚ ž”§ïkÑéh^ЗN•÷ôÞYïiÙ­ tåìÎ+³¥³ôüÕêûÉ„ÞÌæ°qúͺû­³]{<¶íT%ùÐÙÇ9M§Éå›Ùe1ã «ZyªlÙ5ÒòµítEk‰DEÊPiÍ÷ΔAYC;ê£]a*jÄžq/ O¡FÞ -N îèš‚Í!NÏ“OÕ´Z²?Îbݧ#ʘ¥Yzbógdåç»>3Ow§x\ÙF(ãï^ôíúfIHƒ½¯%{·VÓƺ‘_'½Õ]LÅnèF†«ëÏK2¢‘¸kéú–DUIï¥?Ú¼ù¼ V?ȈG W’VpS#FÍ9È¥l­÷´û‘SxbìÖ‚jm‹kE*Ê;š.rQÎç Š2/¦}P¾ì¼ðéÜ°x p -ç>*çƒÞ¿&¡5}ZÒ7e*ƒ@†‹C,ká;ê·ütì–Ò=€\Ÿ‰ØJºÒ¶¼¿{•O -<åàøô(•ÃK¶z("lw‘PÜÍZøÔHšR´¾Ó"_²ÌêýíÙõmF.ûŒZg«® žJaPzà/wÊËâh;f9ȼC™]¢*™‘Ç๛,Q0æ^*æÈo# ÀaŽ‚ -5Èí:cÏž5ƒ°Á;àÝ}ýpûH~˜¼# ŽÛ=Û7Ä1J»3ŠŽì྾Hœ¸±®A™Qlkô¾?EGã]²ÎÔß W¡2@j1¥WhN66Ht—±hkù‚Zá@O–›'}ê›uþßP-u[eø>®·Â8Å÷Ùz®y¹M¯”F Š¨Fiá8tíü>È\¿7å0NtÔ!² c©ûbBµ43 œOÔ̘2Zc\—)VÔ.Ô|Èá{ÚÕBžéœô%‚ÏäSYÖÆj»Eïóifs µVk Cͺʚ:J¢ÉȪmçRoZ#Ñ›S4b#ÊZá¯,§QÜ’3.!˜Ö@mѤð{Ö•DÖ$YMGî¤yPΚÄçë n–uŸf_%nêALQìUxéÉî ±¥±Äº1`2ñÂ÷”@[Œ«¬ê‰ GµGØ,QQŸÀæ( l¬¯}O­q ß Y1JóÀåHƽíÜ‘)¥å¸ö@"Ö“ÁäÆA¡+Î.¥ˆ¿´†ñÌ£–ç È`dÉÊëöãÀWe7Sºk[ëÔòMŒÚÉVC3˜ï=E¤0ÌW˜•%Qo±$ƒ —ˆ)ìY‰ßtÐÍ"dŒ"Ÿ9Xé» ÇåB›[L>¯¯ÅƒŒ¨Ž<6 -ûÀSŠyÖ1,"Ug*aÊ=Ï}‘ClÑhiW@Ïð²‹ËÖsè'Lá ý±c%Ÿ 1É«OÛ^Ú0€XO#Ôq4úR«¨‰;¥õ(áh\E†¯ÐiÁçŠ1¬ˆŠù÷K~ío¦µ€[$ÞCYÀ(ÿ3jÞ_ä¥U‡—T&;áUn‰—\õÇö3¿À'P mÂttPÐÒ‚yóšÖ]ÀóQʬ; ':*2¦År@XÍz㱺¤Õw§Jþè¥ÚÄ•Fjä½Jû—äKi„S _¶ÞOÆ?0-ã .r@¹¹ú¼©ìÐq+‰ñÅsIwÆI­ 5Î>Z€J¬(_CwI8ö0JKŒÍ¡#„ŒDcq MßR£ oœ»,ÚÇŽ„r3-âÖLA¥Ýk+"Q¾F˜ƒÈ#'pƒ}äœwnB@‰ùÁÿņ,É×<Û3–- Ú~Ïæˆ&<³…Î -ú:P¾?ÓîðÛÓÝc{üy‘7ÔÕ³’~Ði.Ãa–çå%¶0ò@󗘢¼2zLÉ\Æ 6o-﨧ÁÓ§É#¨ophV?4®@‘â±cñ£o…§ÊpŒXù_R¶z×Kåµò¿ÑŽE¿’(°Iý%‹M±-ê¿©(2ð—Ço²ù´àÁÿøýG?ûæ›/æÅââ™°;»àÈ_|9ùÎÌåkendstream -endobj -1436 0 obj<>/XObject<<>>>>>>endobj -1437 0 obj<>stream -xWÛnÛF}÷W üRˆ6¢,Kr€>ØhRõ%E]+rEnLî*»¤ý}Ïì’²L)Ð8¶er9—3gÎ ¿%4ÄWBÓN(­Ž†bHã³±Ñx6Åç¾¢U¸1šž‰YÿÆåâèÝÇ1% -V°5™Mi‘ì ‡´HO¾Z÷õÍâÎ é<ŒÆbŒC'Ôþsª²µ"iŒmLªèW’b)R‘½»¿ûüÇïŸï¾|¢¿•X‰\O—þ!!D4ýä~0š°åm¡œzoNö±áftÜš‡ÇŒZ»Ï ŒAr -`K{Rº†Aº¾¹¤‡“k›Ê’n¤¯qùÒÙ­Wîá ]}"™eNyO6_:+³Ô×O×WÁL›²QõÖºÇÆðÀ¥z¿w÷²¦ä|$’ÉL$"¾íŒw¾RÛ”-åz£ Ip|tvF`þ*éI{Î÷À£ô¾©TFµe;£1-uí‘(Ý÷ðá ûˆ^Ñ*ej˜¥JfŠ­ð‘˜<@ê;ë0z RåvTX€¶Õe G©B^d·§{ó‚<⿱ÚïB5¹Njeê¹lL¦¼vrY"¬¦F˜;NÔÀ¶÷þôŠ¶Š2K·w z4v28,è³`Aƒ–{½‡œÙóö§´²ëZ["1Si8¢–jœ¬ÝbväÎ6ëXs0Á>‹£#]­hgj<Ð/úÙ?Y1²’¯™àÇLùVÕ—Wws`”Ú$<ãc-E,¥µÚäTêǾ+XadK‹Ûyïþ-œŽì.‡ÂA¿Ø²a(hí,*Tòpä‹Ž×rcu¦²ñsJ 1+ -ˆO†$téXœ -ú“mrÇŸ£¨Äæ¤ùΤǴ–¹ gŸ—}0šŠ  Ðö¸¥6苾&ÿüQvà+È“5+æÒm³W/d-.ˆE] Æ5/ú€-Î /ºþÅS‡|€¥Ô¡ê"e.«¥dƒ‚®"¢žîn¯ÿbâÂÅû!t.Àg`¸{IÇ‘{]5e-²/wÁ -«Ê‚i©E^åÜnFuÊH!ZþØCþsÜ´où?ÁðO³àeÉž”¾›œÕVÿ¬{¹ŸTÉÀ3J¬A‰Ÿ4«§Ø=ÛT±y÷±#&øtÚŽ8üÚÓòþêvþ2‹–x-uù d·M"5\ã9J7sº×&-évAóXl¾Ùƒ< -($ÓV(w }`5íßѬkp§rpM9h)³0°¯¶¹ -Þbö‘ ¿Ö»µ¢,lŒ‚‹ÏÁª %ã~|Ám4f¹î‹?ÓRn¤.Y‹©ü=úµ2Lj$ÄOPcôwø}8áj…@†?†§HœÃ M!Ko_5„yàr1¬bl°”¦’Fæh€·–µæIѶS—ËÃI×ì•|ÄÝBBº‚T­6À}f,~AzØÂóˆzÉuŠ°w1´Þže8Âжvºö»ÀdìêÈ ìiÐføMÎ(El255T*“×ÏË(¹]!X`•ˆ2Æ`°Ê£„ü‘M÷2àFã)u -(>I VÇÎ_[Ž ³ Ÿp–åbSX‡pøoÓÐC˜ƒÿÀ5¿–ÊíÑóœŒ{_‚4¥×‘8ŒÉc`!ЇmÒ²É:¼9·ˆ„6 s…t¬ÁŽÓC:´Og_c¯`T ‡æC¢€0ÉŽÐ7ûÒr^PZjÞŽ[‰Í…“+m©Å‡sTŸ^¶ì”·5>¢h½'1|1P& &D´²]©£×ƒ(×6‡°wLÞ§w¨ž_/7(À~{£ÚÉÕJ§é9—=©~¬U¦kœC"qró*lÍóÁö‰p0å9/LH¬ =Ç¡½dê,èN[‰epA£ÐøHú bas²1a}±áU6ZFÌ‚pò_¾F±¶—}9äI®óÆá©ã²âÅÓÓJ—LBf/On êa—‡#ã+ -½Œ»°\zÅ)#0®S»§ÌÚd‚7©Ù)M&çñb~qsyAŸœý}£ßlŠÕƒ”éÇ€ ºÓ!^™þÏn3žŽÅt2ÃûMÙê‡ÅÑŸGÿ…wendstream -endobj -1438 0 obj<>/XObject<<>>>>>>endobj -1439 0 obj<>stream -xW]oÛF|÷¯Øú%Ó’,KJ€>رÝ°%7VšMQœÈ£t1yÇVõï;»$%‹q€¢È‡Š·;;;»súû O=üêÓx@§#Šóƒ^Ô£áé$Ñp2Æ¿øã5¥òAÿl º\ÌN®‡ÔïÓ¦m 08‡¦Å•7¡[§¶O ÊÁ”Âmef%-xsò¤¡7v6x—eH‚~ïµÅX<Éë>3GQSÙ` ¹‘Ÿj™HKvlƥŔ -¯&¥«ß®>~¡83 iþþþäæž -ï‚‹]FePñ£Ð·ÐÚà¤fY5äTÈôF%¡HÖŸ@tçvÓ—&q+¬ ôãxµŠêµ˜c+a–“2ôNVLJbh’ªDï¬Ê5(]b*|ÍI¾\mhÊ•ÓRC8Ž­[“Z¸ -Ý@k ±Þ@ê1Ä'¨B'ïJ=i©§Î¥™õ}©2Y Œ’$^—%eÎ=V©t^„’GÖTßÆúãˆYÖIÌïh(@$s³‚nÉ©8æÐP±óeWs·k#=¨|¡Då{p¿ñŽB:\Y…ó~¦.[‰–ù"bAPÊ2þc™¹ÖÕŸ¬|Fñò‚†–¶—Hë¢à5èBEH%dã*O{H:<½Œëäz´]¼ÇíÄ\ÎxIÈ@pÝr>"fx¾üˆ¨ˆ{&o8ûm¡|0q•)éã¨x™ÉRì`vkK˜ÂF"BäÉõ[êà Ø)ŽO‡õˆ£³ëHP3Âœå‘[LˆÆªîc-oGv°ÛcMÂA¯Ô*|¿ldŒahX&çê1.ϧVw>¹À²eûƒ+ðþÆ4ÙŽnã5H9qSp'³¯êcõ´"NËÜHVûê4²÷Ú-Ǖ掾2A¡7mèúp%&æØ[yÙ¡ŠUUvëÀ^/¾ ÒÝFÌ‘¥[³r˜ºj¹‡U8$†„KL¡Ìœ'¸f¼mŸÕA|ÞX0˜ªXËöeü¼}™DÕAÕVÿöŸmQ[k‘!m\Œ‹º¹ÿ½•!ÅOä.ÐHG[¦&©aÉÑV™]&϶ҖóDšûâq4³öÓ\©¢Ð¶|C0[ó|PÆŸˆ%ct;õÊVÙGǯ[9Ãrf7ƒÖÐ&~s¤–Ü-©u‰ü3ÒV5ð²¿X˜:À‡8 €­â~!SÎwOÄDqu[ÕW>c0NµjåUAkîkp*ÓÊŠo4w.>ݪrïÞã -Ý8:jåÛmÓm!¯]dµÊÙp_’l©R ľBA¬/BSܳp @r=¦OW4›Þ~Á_Wtÿq6Ÿ½ŸÝþÄ°°G¸ò½ã£.]V‰ÏxÔGvWýíZ}ö"p´M㻋\w€ÿÇX”õŠË0$y(²U¾¨wMr Ÿ?“ ë»K ‡‚ž°™ö’þ6…Ƹì.–ÊëwŒ¾ Obü„!ð-êHcÁTç2a†¿IŒ¢ÞèŒ_º½û0{˜ã=è[î&q3^v&àýÒ¶hwð¢½Í½ã[Ò§K¸!f—³sÂe\Æ/aJÅÞáºãuÎ_J½äÛu}ï9¹ž4>ßE£³>ÆgQ$5<œß]œÓ½wß`ðѸâƒr…âšQ¾ÈMNéxÜ{Ëåü»m÷”l•áxG9b&œêj~ðëÁ¿ Ò§ endstream -endobj -1440 0 obj<>/XObject<<>>>>>>endobj -1441 0 obj<>stream -x¥TQOÛ0~ï¯8õ)H4MÒ¤=€6Þ`›ši/•ë8ÄàØíPòïwç´F‘&­mÒ(¾ûÎ÷}ßù×$…¿)”, -àÝ$‰ÈÓE\B¾,ñ9ÃË -h&WÕd~CšBÕ`J±,¡ªÓ*]*/¬f^> èÓLšu³Q½—FƒÔ\õµp'ÕÃ$óE³¬Œ—ø_ÕÑ\x>oóî¤çŸBËl Þ@ǤöxÓ5(Æ](p燭@èÆj³´ˆ“âŒ?ß®ƒ{cjà­‘\À¦÷ûtáœÐ^2õPLH³w¼az'½p°cÚÓ¦°9o%÷€¥@óØo]Øß!€=YÃÆVsæü;J¼eM#y U+`J„ºXÄ•@’jl-ì¶Ìb rM!Å÷V0­P[¼Y1⸙z¦e@e8Žä˜_'p>j;Ëò8'þ`ÿyÑñŸ`'QdÕÁ`š£gÚþk£Ì²‚ îŒ½—þ§Ì¸Ÿu$”ì$º •+“%¨úúäƒúDo-Ö+Ìý[Ço9֩¾å±ýPüƒŠ1ìH˜RÖ±a]„Dù3*¾5µƒÞ tÉ–hù np^td1Ùm•èЧañ^`‚ó›4YGc¿dú½]š^ó0kœ)En@›àOÛዸÑÞ¥ÆrEÆ©~™ÀÚ·}E§p,Z;·“ž·Ç2hÞæ¼Úh˜öÑÜÇrÃί—û'-ð0Z. [æñÙ‚ µº¼¹º„oÖ<?Ã{â £©&žcƬLÐÖu„y1†Áí׊؆Π6¾eŒ°ŽÒõ l­ñ†…¯àf?¥®ÍÎáÉÃ[©…#ܼÌã²Xâ ˆ˜Ù9½úRM¾O~«š»endstream -endobj -1442 0 obj<>/XObject<<>>>>>>endobj -1443 0 obj<>stream -x­WïoÛ6ýž¿âÐ/MDñ¯Ø΀ah»(°¤Ûì!Ö} )Êâ,‘*IÅõßw¤d7jlØ°$ŠïîÝ»wçOgcá¿1-&4“¬ÏFÙˆ®G“lB³åOð¿STÄóE¶>³>»º½¡ÉˆÖ®š/–´Î ׌ðDž¿-E”£ëŒ~æN&§û5ý,¼ß[—Ó;#Ý¡ ÚÒæÕú¯³]Nf¸ä|%êà' 0^$€Ëé Ááíu6Îè½ Îæ­äÏÓÉÇÝÉÉ"›óÉ{µG{mr»÷$+­LðäQ \åÔtñx²8J…/œº@P>(‘“-¨©„6Ôçp:žÑG |è¢OS„=Ò^WYSþ“Iqªh½¢`Ó±çÀ.¨5•òžÃÓ_lµî@Ú Ã^‰Ê³îñdžEF*N©Ja^Ú(’Ö ëßý™|8Tê9~2z£¤àHÁH(E ƒm)Ýã/Õ ž@©ãÅ8ã(Al„½œ9_PŠÇ”{°ÐÓ½Ô'½”Â#xò¶VûRሪ¼ÊèÖ:ªñÅR›ÂºZ°,.@gº0·²­Qûø˜ÄƶøÓ«ÛëN7ç‘ž|C!w,‘ïÓû^WüÞ‰ZAÔ‘Ý¡6#Ï×ÙÚ¬ëz {úë¸R²u:žÞÊšïÔŠ%¢˜™ÕÝ›c¹úbp§%K£?µÌˆR5y]ëJ8¨,Rç[W z֥Ɖô Ê•v¯Pì‹eI ;"n'££r…’bj¬÷·&&|aCÙ¢ÐNÁ\øk_o"•9ø‚E`ÛmÉõEd‰°s}c:âN5ŒH§B2)$Âw1‚ìÆ| ×d R1Ù øê0tà÷¹Š¥Úc¼ÄT+½c­ôRé¿/µ,1V4`ÙècÀÛ3¨oz´Á {õbú1´FÖûþ±ìÄ£€wpaAlœ¹üƇV¢}ÂróJ[7pN>ŸÚ÷«?`BÖž>ž?hs¿ËCñ°½ ¼º¹&äÇW‘“ vŒÑ8ÚÞr:»$CÍq6Žj¬ 3ì+èRKž[ˆhJ²f›ê–)D[Bn¬©Z'1‘hÚB&¯GûòÅJ"™y sùÔÕíü8¢ù¤‡§!€íl³+±.xSHþåmÕÆ] Ö“Ü‘;˜CYñ×qñÆt\C"É©HNåÐ:C}ÅÍqüã>§.•‰E|&« F_€õ‘/½_g{ ™+tT}³‚£ÍS2C1ˆ¸ÓÒYo ð€pˆ¥—D’qôOõ¹Ô›˜ÔÅ^ñ¨¥¬Ú\Åýèe¿©Ü­èÇ+ºïÆHçZS¨!òÂL`Ð-’CÍïÄÆQÁ—RÑdWÉËE¶ä}áÇÉ|AOK_í²g’=â=ƒÔ6XdT\ÿ/À%ýáÕŸÿ=ò ðrK¯óËÉ2ßœ -»ñ»§¿†sb}q,~§°¤-ð¤ØÁÕÛ÷·«Ó–Ý6¼ òQ‹¨fœgˆ¯~0 thð«_•o0vÕXv„Ѿ†2½tzƒæç0ÃoH>šÓi´~œÿqºjŸ¦×7cBltÅËQÜg1ëâ–=6=Xˆ†íqO=;ȦÛ—½Îzk[Üd7Ðôö/%fbf‹Y¶˜/“j§± ïÖg¿œ}< wendstream -endobj -1444 0 obj<>/XObject<<>>>>>>endobj -1445 0 obj<>stream -xWQoÛ6~ϯ¸‡uH¶lÇv†a@»µ@šu‹‡í!/´DÙl$Ò%©¸þ÷ûŽ”dÙÍ¢$&y÷ÝÝwß¿\e4ÁOFË)Í”×W“tB7«I:¥ùj‰¿§øµ’Êp0_M¿=x»¾¿¿¥lNë¶+üQìL&´ÎG7é4ÍRzS< íÅV:2%Ý|Kïtn{¯Œ~½þ sÊ26Ét £}%”&/¿zÚ çÆŽÐh?‘‰ÜçÈïð©ô¸ò˜Ò½©¥Ñ’§ô–Dw@N«²”–r¡ÙÂçÆyvL(Éf .­Ìáeànk؆7ÁÃvÒ>I›FÌy‹9Y¦«Œ:#ÓŒ΃ -çÉt‘rrFÿ(}·¦ÂH§_yªÔ£$/ªÇÖ“h}À¥ð¤Â -û—1m½ÏIJ<TU¡Reã`Ì°÷AXkü9²ñ“*ÏþC^+géÆ{K•|’®æUþHµ)äɉÒN9OFÓÞšäÁ2¿¼ð[Ž:¨üHŠ|G¹ÑZæ\ük:ì>QŽ×#qmŽ0™Ò6®Ž°€ÿMÃ¥CÞ¸Λ=Ÿ¸ —°ƒSΠ[ðólÅf·é‚ 2¨XÇädºJ³[J– eX<½d±6:y¦ç•ÿN:?Ê}Hi¡Üã³PÑLg8»v‰Ìꨇ¸9QËžTªJ’@Û¡F–­¾¨œo6È<Î*³Eé….¨ôûˆÿœÚßç+Äý ^lÄ•••¢8¶0ƒó‡QçÞË -ÍÛùxÝRÂIzN.Jn@œ@3¹&И¶¬¬‰9ÈTˆ]ÒFm©¢z6Õ]2ÏYI*¡L‘óe$ÎM:‹Duõ&¼ ßL]#“ç,@/NÛ'LëÓí<Þ¦Rçñ¥ BF³)mŽþ¬²‚²$ž™à£;ËÐ åvßö- 1Ê“Sµª’õŒÉqÞ´B6Š¼¹@?":{üþtï¸ñžÇ‰÷Öl­¨Ý5€:¨ZÅ~9Þì "?7ÎŽ+“‹j ºnÄx£ôøÒÖÃ(ú((fC²èžŸ¡Z@5 -åöÆ^·%íræ[Ùí³~éG›ñèÉ”WJjŸ´JÉâBJð‘@¸¼È},SÀÏÅ,8£ùNèmY–ÂW—Ê4A ¹UÉôfíÐ…R[›†O´,ùJÂÍYšª‚|ÿ`\l˜ù’‹½Ø¨Šåü„µƒuЄ©TÀa4ÅÐ=ŒXa£ -Ç!œÂAY¬üÒH \FóùŽ`0õɪš+ô»aŠ£;´·‹Ô FHw,äoÚ»1‹½’µ¥tmÈ6zÐMˆãYUd<ãÉ÷’~>'àÀÊOñó;Pó6Ý`Ú^ð¥ãnnô¬ú£*‚¾t¹luæ²lžÞ¶ H <‰ª‘H• ¹hjYé«ÛÉ ¶6„ë 0i õ«Jçï×ÿ ìN²Oíòô"2Ù…ÍÞw×IɽÄnò’ƒE–f]èV&!úÞG„ݱ$‹—û´BϘ¶§dñº6¿ZxL­ÀéÆZf[Ì&6‹µ(î@Çô¹æäòUVÔÞµã‚WÀhŠ7F3àsU×ü2ªm—ì¸fñÓ Z*4|sÀ' WúÉ<ˆ÷@À4â`D,"aW « ôÚÃÃÙ©3CÛx`º»Å3¹à-YxÁ\O`Š3 ',Ýèa·Müafîe®J^»NX4o‡‰›ÔE~:$ÙÓæ#¥;ƒ±–×  T°NˆúrÆ%2” µÊw2 ZÞŠÒ; õæê@+Cx°:lÝMOì>/XObject<<>>>>>>endobj -1447 0 obj<>stream -xmÁ’‚0Dï|EÙƒ1 {ÄZ½Yµ[ò1  –D)þ~ƒÊmkŽóº§{~ƒÜO„,Æ.…ìƒClO{DÊÚoÒ>/XObject<<>>>>>>endobj -1449 0 obj<>stream -x+ä2T0BCs#c3…ä\.§.}7K#…4 Œ™¹…BHŠ‚žP$YÃÓSO!¤² U!?M!3¯¸$1''±$3?O3$ ¨ÏBÁТO¢¯zs=s3  -!)ÆÆ #\C¸¹øà&äendstream -endobj -1450 0 obj<>/XObject<<>>>>/Annots 562 0 R>>endobj -1451 0 obj<>stream -xY]oÛF}÷¯ô¡H5#J¤(X,;ÙfÑ8ÞÄE^ -,h‰¶¹E…¢Öõ¿ßsîP3‡VZmƒœž¹s¿ïÌP_ÏR7Á?©+¦n6w«æl’LðÂÿy¶H¦._Γ‰kÜ,MظOg—Í’T8[N’\8K§cAÅ`gyRˆ¨b°Ð²TV0ØyžÌ•ܸé$‡OÞ3:£,v:úm¬`°Ëi’‰l>¥‹)¢µ“%Õ¢¨bš¼¤ÚÀzÑ9E¼(HCõd>‡²@:î‹ÅGvšÓàÈ -†l^0P‘ éEî"+˜¡È“™°Þ(‹2›1h“@l‹Ü!T vžŽYÁÌNƼYÅ`Q3p'²‚Áæ˱¬`°ËÙH¯bT8ôêΊÁNS*èU z¨À"Šè–º‰Ù›Íh”!Ëž`°……*²‚Á.æ4*²‚Œ -¬b#³‚Œ‚Ud½É) g†rŠ2“CtR°«lº`,"+˜F-Ù0‘ v‘YÁÌÁ‚ù ²Þä “Ê(['òQŽl¶`"+la&GV0Ø…uud39sXÅ`³Œ¡ -¬uP†)ȶ^r y`!ÝY"ñ‘T QK• v™"µQÖ+-˜ïÆ!¢ — RœÒÚH*kå-¬`°‹Éhc¯tÎ ‡xæ.3@¥!ˆ¾Ë„TL“8 ¢¨bš”QiØX1ØÜâYÁ`‹)#XopN/ìØ*\fÀR3AõxH“Š€H*¦I3”U ý;b£ZÐ*ETËnÌf…/pLÉ#2µ‚!:µðÛZ²ŠÁΟ±‚Á¢‘ö k}•¡ììñj ‰ÚÔV16¶‰ãw2£Ó(žL -F³§F*ì¬ì,cEEV0X¤EXŸÚ”Õ€Ì-ª†¼Cƒ-xúg‘ “1{`T`ƒµ$¬`°…Q” “1SQbUÌ`ðê ¬`°¨k•å½m¶\XçÙEÍ:+p¸·E…›9H>Ê D7Ï°u”ˆñ’"@‘ˆØ¦<7"©lÎkŒ°‚=›‘U̼ð®(¬`°(Õ«,.?#V0ØÙY0")­6+‹)›‰¬•álÁ‘wí®è‘•¡`°vWŒ¬-xoò¢°ØE=™sv £vf€œZ!ˆ²AŠ©,æ̬`°v…V0@¯"«˜ àüV0X q„8èUì VÙpšábj½Œ©‡r3dA “í€V0Xt 6Ž²‚¡vÂþ‰¬b:TÐÝ «˜¥cYÁ`‹9ݲ‚Q3Svzd½»$v“D!#Ž†¼»Ã!ÌÀ¹²‚é.‘ Ön -†Éh'ôú‚ÃaÅBFûC«+¸±í„ó2’ŠÁ¢‘ ª¬³Â -;ŸeÃà ;%Ê*‹W«¼;¸Ç±¹ ¸jÀ܉ÃmÉN n sN‚À ¤£¼ºÀà¶xu!·µ’¤b°8(`Bdƒ]ðµY;.¦“ã‡Þl=¢Öt1íåm,²f/ß'a¨{`a`M9èÈ@N 6…û…ŠÁB‡²^¥ è5>sxýž; Q„Äåh&¤bn›X¿-®¬L(ž¥4`Û"ðiæŸÂ6"< %p˜‘³‰q”³9PÇc)ra'λ£v*TL/ØdQÔ{acÛrÒù™l^DÈàðvIÅT×z¥S)Ë^dƒÅí1UV0Û“7Š(«,ŽkÞì§^ïf&ËËêŸsásÍvðîðáIÅ`‘;T_ULƒyò+˜ó’Yo^vîg€æÂ\ÐiàÒ\NÕH*‹—Š*kÃPdƒÅg˜Ô*†3>ëU ytZ`90[ñým†®Ç]åîÎ^ßœ½|‹):q7wø9`^,ÜÍÚ~ÀÿY½x·í»v}Xõu»ýéæ¿X‹Ì¤~í9.ñS¬~qóPïÝ®ìz·j·}Yo÷®ÞÞµ]SRÌáßþÞÞ»}ÙÜ– \é~quã2×vîÕå§ßrë¶\âÞݹ§öàëýƒë[׶ƒT¹w% ˜¸s›„Pëe\S5·UÇ­./þ§Êµë*Wîv]»ë겯Üê¡ÜõXÕýÑÖÄ»ƒwØ t§¼ÝT®½sð¦Úö{¿³é¸òhÁîÝò—ïßœ†<–„ïÈwÛ}ßù¦Þÿ쮪þ±í¾¸_Ûûv{êšü¯å?U½UÌaç>¶eÃÊømoF^£º„#Þ¿zwõŸ‹W7?üšôôîçà -†Ã¸\ݾŠ­:t/phÁW«ÞYÛ±9`ËxtœŸ<×hÒÍÓÐìpkÇõŸToñ]‰ûÄ_t%Â!Ï_ÑõÕÅ7 D•±4·>!–ÿ±¯ø@çý]·,-÷yÛ÷>©w(W£×~Ô¬Ž¾uÏ ‰æÀÜÏÕÖarSåõåÔVëjm‹GM€[ -UéçÈ-f«  oÅøTˆ Z·(ê}Õ;H•ÃN¯//¾á#~x‘®Ú¡‘8Äi澹ݕûýãÚ±Ÿ¼©øý: Q4ˆÌ_-Ç`øCâysXk°ÊÍæ8,mþvÕÚêKy0³Ç.«Ûº´PúÝ:ã»Ä?Vë_ÊþY?ã''.;¸âÍ>Y€À£»2Š{Yõ«—_ºÛ)ÎyÃx~«ÊpÙ,æ Ü¿@Î2Úúææìßgÿît£ˆendstream -endobj -1452 0 obj<>/XObject<<>>>>/Annots 571 0 R>>endobj -1453 0 obj<>stream -x¥WÛrÚH}ç+ºò²v•ƒûæK²qmâ81Ù샫¶i@“He$Aøû==#À›ªlR©`„4}9}útëkoHüÒ4 QHQÖˆ~Ù|ø£7Š€&áXÌ(£ád„¿þ*¥Ç^0Šáþn0 Žïv®3 §bÞ9 /4™Lð9žMñà¿U´êáPLh<˜âÇÂqWìrÎĘFó±áî8‹°¹â»Ýk܇xÊ?ëîv®q7œ#ÜÃÝëEïòÕœ‚-V@%œÎh;0ðKtv“È¢R–BA¯Í–*C7&_éu e¶”$K’t¿Ÿ/>÷ÔÆ8ö`u&íŽnM&uÎg*kÒTY~Šý §Þ_4Ò8Š¡ «¬úZëRWŠ>(ë|íOŒi8lNS$×jeÅÎÔÁ¾Îk(Ý‚Ï*Ñ%E>ü *R%KE™ü¢¨äà«DVî¬ÄEd2تä2U´ÕUÂ]’ðOKYê¨Én8òÑ®tªJ*•Ýè_à®Ì–‚O‘ÌcJKE!0Ú!tÖFòt6y:?Fï ä…\+e•(zyˆ¡ÁŠÌÊc÷úݧÅ;”e‹8Hám×ÎU; k}Y[Sç±.lâ  † Æ\ F®ÔWu•û[I÷¦R¿ŸF¸àºÅ&ª3•W„ï’˳ԹtH!º[¹Ñ1üå¹Éaå…ç!ÜÐÃí ¹°_p‚lŒlkÖ”Âjc¹W¬ò´ãØ}»F")E²KêJs­ ɨòôIç±Ùš¡Ç}t’С«èé ©? úÄìÝ"´E±‘SÒÄÎ`«óH!Ü•Ž4‚AºØOhœïúï—Õ.U'ncßÓ©YsÒ+k²“SŽ\­¡`mRb–Ìn.¨­t„N3u•êœÑEI¹B;•¬æÄo·'}†Nz¸ ;Ç”Ãi@šÈ 2'tÚîb‚;–[°-Î L4~„Àµ·+€ÅÌ“¨ÖžVN5œõÜ0hij¶`Ê!‰&/ןïïþþçîþqqõæHª,ýŽ8…¨Y'/–e¬ÕÜ_­E?¦;ZzýCa#¥X)]!¢GÖÆÄ _ +(´C Ü(”Ó(ÑÚ³ºÓ% €àsbHŽ’§21u;HÙ(XíºC´„˜Oår»áÑÊéÅ©^ª"!ÜûŒ½àðjÑÒ«]BtêFN‡+e¡"ËmaXØeÖ¸†©³¥“o‡!YÎÞ ü>ƒ• R…ß©pf«Ó,àŒ;ÝfƒÕ5&“s1ÆVøËœm¶ùYç½j"¦£ Oßé;YPO^ôÆÓ±˜†3_ðÑ„ƒ{¹è½ïý V2º°endstream -endobj -1454 0 obj<>/XObject<<>>>>/Annots 618 0 R>>endobj -1455 0 obj<>stream -x•W[sÚF~çWœ—N‰']°Íd:Îʼnj»1/8‹´€Ý"-&î¯ïwÎJH7â1èì¹ßWßG¹øó(ò))ÎG®ãR8_83šÍ#<ûø¯5­ÒÃק£`8çú3ä4sNÔB݆0°çã ±ØhæÌX1Âsq–“Ï?¡,Ö÷œÎƒ9 ÌiâÇ=Î@‘Sä:> pÀÍç8Ì)duèqó™ÈôÜ9ü™ Ô#£@„.~dÓ4Uþ¡ò*ÓdS©&©wvÚã.CcZÃ<(’D€Ÿýß:ÖE—Dž Ðòy“•+•}i•Ë4Â1áóŠÞ¨&©Ñ5ƒÃ"¦”Y5éˆ mVi‰ "•ŒÓëÖT”+ëßÞ|¸9¶ ãæJÙÔå®zžõúâÓõÕÅæ‰U/ß[÷ÈÛ¶Üe »Þ¦œ[Ì\mY#ð¹B­Ö´ªË=Üb©O]™~ÐRoìF8c®<ÖPVÕz­k.+ª3úQK`”­îÿ"Úu$ìY?£eÍã!t?ÎwhÂÂa‹}-ðý‹S;’Nóñó³ÚPÞõceàn¥š©JPPÜRè¹ï»´Ö¹.Œ-8.³Sm­€ž½SÛìY­Í®ªÊÚtéËÊMY¿\ßßwL€vŒ{Ö «;X4ýÚжÌ5%ˆZ ý˜G(KKÔVnjXØ †l®xlí -΂2ÿjgR§‡öû( ?d}a†¾0lÛû§ž4•ŽÓ5 ¦.t™`ÅÙÙeÓŸeâåqXÌaHÔ:ÊÀx<;{wswv&áå΃÷3&‰Hþ‚^F™±©Oûs¨·sDÎœ8Oøà(¯kEDŠ±má`„vÜ X½§ Ëaºkê©4ð´áå9ÍÒÕ´óY2±*‹ì±3ûtbìÑ×+£‘28¢…QIžÊJš^ºv´žøÛ{ÉEÎ;àI™Yõ¹«dYOcýÄSìWtä+gZ˜–éHÖ‰‡EyD!÷³j¾uQpC×=¢êä ad û«HçzÈsyi7½Œ¦ËÛ²\SU¦…‘{® -[l³¿±Rí’W+,}ÞârBM¶/ “n¿fúɬEGêB­2ØË€Ü*mTš5H2}Ï5pY§ÍK K, œtž¶×˜÷×o?ýu»¼º¹v¶&Ïä0½ŒÛý>‰œ¹GÝ•çÞ£v«Î[/ óE€ûßú„»‹?Þ\Ðm]~Å„ÁM.ÞñxßXóÄ ñâ3h¹ØËÉÿ¾òÛLÎq¥s²Ì÷ËÑŸ£aE³Âendstream -endobj -1456 0 obj<>/XObject<<>>>>/Annots 623 0 R>>endobj -1457 0 obj<>stream -xWÙnG|×W4”¦qyI$•7IŽ¾b1ÈCÃÝ¡¸öî =3+šùúTÏÁcMÙA`[Ö^}TWW÷|:P4ÒhLy}ÒÏú¸³ýñþç“‹á0Ò¸?ΦTÓÅå4ëÇ«Šîø}º¼ec<N²ËxÁö.kº¼Ì®öžùϦ#˜¼˜N`bˆFÒÂÛ\M¾|p3;齸 Á€f Žu<Ьð¡öi–wfKIVšGi¨n¬#Û¬VÚ8*t-JE•~ÐÊ’P :›}€1äíuþTÒùç…ÉK‡ìRnæñí.bcÔfEç~8žD[éÿ°;1¼ÐŽi.É!ÌR-¬C´s£×œ¤6~YhC”ªÀmÊ«R*GN#\¸ð}LS Ž­O[‡Ïo3zWIa%Ð\À>d”º±ôFºµ6é†}–ê¡äM •Z!„¼j -YкtK|XZ*JëL9oüsDÖrXH'ÊÊfÇ0Ž³‹'`ê§ÙàŠº—C@][ºõ\€CÄ$-)íH/8A¹®W•Dò%ÿ¿ W/èÁèfEµX­8›9Ò“RmÑ{3 /øº·"ÿ]•ŸÓÓûŽÏé)ªjCŸšî¼ß’a/HùyU1•ðW€L.»¹¼?;§nøVS‡À‡R·\‹¢†º­çY®Õ‚VˆI†ú— -Xס*H3G\Ž3<}è|Í&ì)Y·©$‰<×r© W4@o,@Òîè"Ô¥Èè6Yy-òe©$Í wÊuüÚ7ǯºTìèÖÏ"ïü°,1B¡æ‰ùp††ûj¢ Áóbx|E¬sºå–ÂñýÆŒEûÊyйòþÉÜ}Ç<­—‚‹€¯ÌýÙ.ÆÔwcàSh•Œ^îHˆFÃoÎÇáÿ£ÒkXäOoA·† ÉN‘Ð3˜_ kÑJHŠoR€‡ùŠÜÁ 0Äû^I -(Jé|‹ã×’’ÕℹcãíC¼×Þ·Z9£«JšŒfÜQo¨tZ€$l\]ùȘŠjSþˆS [?¤cY¸yùöŽ_,Œ®[„ýIÁ‰Dñb!}@70WPLi™*é!×¥ø m³ý¦ä‡} šP__þ–Ëè¢öœ D[KWŸ· -ÍŠ‘Ñ/RåòIº}‡±R…F%Õ²žãJ/ZžEÊb.sL¨ä!%i¥­å\Ÿ(9<#5·„Ô.Qx¥[ußÂ~T ©¼-Æ]oóy÷üM¯ â‘h²mApb‰âZ%ÞË–ñMF×±/`朖zÍ€œGƒ-¾a~ ’ ãP$º)1Q~d˜ÍÝ$ýÉ]dAôT¤ø<ùü`cîÇ^ õšÛHBÀ·@—Èú¾ƒ¶1àvµao»1¾×'UÿYÞHÕ¹?ã¾IÚƒ¢XSØf—Á’VŒ`;€£ƒ.ÉΓûÀŽ\#v»ÒªàÆñ3h‹Û¬ <~|=J‡)vzÒå½£©eæEãÛßH¿XˆIU ÊÇ2®l®»”’Avý|‘í½èioüM)mv"<ÜŽ¾Hšü£«0+P(¶,ÂfBk±ñ:ã9._° liD‡¤VÝh¿¾l ²> ¼w4ß qUq´Ìÿmç;}«º`NwQmN÷BÚÑîhR^ɇáγ9°Qe”°ËpïЕPlÜN“"ÇbªÊ÷ƒÐxv`­L£b7øø#yIÅ›V¥.PWn”–³¯`X‹ ¶¯mИ8{©ÀqíKTmŽ›Úc¯°Â`w\@Iâ¢È',Š¼Ç 2Š¿õ ¤CøõÑ&°3 €ò©Á/æ‹Òð1ÁÉËQ -0–Œ§ÚSÚêzø~¬ÁÍÝ0)ü…À¶G§[-NúŠ€ µ­áÕ=¸Lgz,WëÃl;8O:’úL^ÙÌ3¿o„!6/Å{&ÂÇkn+ä؉J®Ô -óüˆºÏRÆ›ˆÂŠ,xE÷û W¥j>Ó§‘â`ó | ܉Fk÷];³^cMÏÎK…_¤áLº4ÀöÐ-¨WÈÇžj sÝ\§22¿âŽx4“ ÜÔ­Ú¡~ÛÅ>…£‹·Š~¸¹{Nv×ÄþóQ¼<<Ë—ìüá WaWŒ%˜F¬c§#Oâ -wýúæšÞýAæûþÞ)‘S“þUêËÿy¾ðñíN“‹l2ž†öhÂÞ~šüvò/}š3endstream -endobj -1458 0 obj<>/XObject<<>>>>/Annots 628 0 R>>endobj -1459 0 obj<>stream -xWioÛFýî_1uRD),ê´¤¨'u›¢IÚXAP4E±"WÒÆä®Â%-«¿¾oö(96ŠÂ!r™yóæÍèóIºøëѸOƒ¥ÅI7éâÍîß»Ÿø Çã¤OFÉ(<ätå–úϺI†“1¶õñ)%-Nà ¾ö&“dŒSwÌ?ñ±æ3VqtöºÕÆsAÃÞ0yÖXeo&ÝäüØâÅì¤s “=š-Ñh2¦YæéÒ,m•ÆTžÎ>aÓyØÔ¢tµÖR[Щ_Ä¥B¤+¥åßZòèÔãé7Ó^·‡Ow:íâïƒ)¯m%*eôá-]j÷€m–µ¸oÚÉäMG×y>íعÒmr³T:¸4Ü…Ôî’!_6[Iò–b¼­Ž¬Ò³ÉüJ<Ö"©«rK•ç”+[Q…ÓÁâð°T­<>%±^KÉìŒ6F?©h%n$–ÜŦä×| ¿e+øqdWÿ…ÎHZ\ž©R¦•)· ]š’ä­(Ö9ßÙt!£'™Y¯·O`¶Î³`Vÿç Žøhsu-¨²ÓˆÓ3O‹vè1töOo§çÝs|zacŸÜÆ}¾Tz½ç@7¬6SÆ[ˆÜšDÜáRÄÉz>77ò,„ҿïƒûãa0Shš&½¥LÚ´TëJ!._ àÈILs…hÏH%29£ aeç¦Xו,y´Ø€è.÷vÅÜšÇó-5ÈØÔY]¼z{åí›Eà -í³Î[`€›Ç=¨¢ºk¦ì†åÖÚ”´„ž3ùå^/ê -ý´R)úq*î¡st,ø][¯ ¶^¯1+dß".¼ÞùÔjYCêBæ8l‘ežG~ê ƒÉyUa¶ça+Iø*Oœ˜áVhK{±ñmÛÅþ‰¶"¡ ß>€jéÇlåFŒ G M¹ û…d Z”p:˜ôNf?CxFÌUº¾%»E /‚\‡ù&Å?—¹™‹ü¯h¸›L˜¸Dôˆ¾K’¤”<ì°B€ûkQ¢î1~Y¬üp÷È1ºßS§¶¥Ÿû¹zy½Ñî'µ—„Ô¶ÔÙMšÔ~M_ס-NÂHÙáØd@£Þ$é Øëç¯/ 9¥ù„ œ^š´æùÐ%›Cñ'Úã.†Þ¬õÿëz8&ãÑ?»pÍ`·ÿ8;ùýä_nendstream -endobj -1460 0 obj<>/XObject<<>>>>>>endobj -1461 0 obj<>stream +´Š¸qºÀ6í°MÓµ‹6{ %ÚbC‘Z’²ë¿oHÊV” ÀbH$r>Þ¼y3úçdJüLi~N—T6'“bBoço‹Í®æøýÿ¤u|1½˜—ã×Ë“³ïè|BË5l]ίhYìLð¤<}_‹6HCô¥Så½wÖ{Zt+#];»óÊlè,=µü~2¡7ç3Ø8ýfÝÃÆÙ®=Ûtª’|èì㌦ÓäòÍùUqΖµòTÙ²k¤ äkÛéŠV ˆŠ”¡Òšï)ƒ²†v*ÔG»ÂTÔˆ=âAžB¼…œ@ÜÑ5›Cœ^$ŸªiµdœÅªOG”1K³ôÄæÏÈ:ÊÏw}fžîOñ¸²PÆß¿*èÛÍí‚{_Iön­¦µu#¿Nz«»˜Š]Ó­ ×7ŸdD#q×Ò͉ª’ÞK´yûy ¶VoeÄ#†+I+¸©£æäR¶V{Ú‰ýÈ)<±vëÁµ¶Åµ"åMç¹(3E9/¦}P¾ì¼ðéÜ°xsp +ç>*çƒÞ¿&¡5}ZÐ7e*ƒ@†‹C,+á;ê·øt ìÒmA®OˆDl$]k[>ܿʧžrp|z”Êá%[=¶»ÈÇ (nŠf%Žüj$M)Zßi‹¯Yfùþîìæ®@#—}F­³UWO¥0(=ð;åeq´³dÞ¡ŽÌ.Q•ÌÈcð\‰õZ–(s/sä·à0GA…äv1ŒgÏšAØàðˆî¾~¸{ +$?LÞÇ¿Šíˆžíâ%ˆÝÅGvp__&NÜZ× Ì(¶5zߟ¢£qŽ.Ygêï„«P 5€˜€ÒK´Ç '$ºËX´µ|A­p 'ËÍ“>õͪ@ÿ¯©–º-‚2|×[aœâûl=W¼Ü¤W[%†ƒ"ªQZ8N];¿2—ÇïM9ŒuˆìÀÂX꾘P-Í ç53¦ŒÖ×…DŠµ µrøžvµ„g:'}‰às#ùÔFA–µ±ÚnÐû|šÙÜB­ÕJÃP³ª²¦ŽR„h2²jÓ¹Ô›ÖHôæ؈²Vø+Ëi·äŒK¦5P[ô_ )üžu%‘5É_VÓ‘;i¶ÊY“ø|³ÆͲîÓì«ÄM=ˆ)Š½ +/=Ù¤#¶ô –X7L&>Bøžhƒq•U=1á¨ö›%*êØ„õµï©õ"‚á›!+Fi¸ɸ·;2e­´×HÄz2øƒÜ8(´sÅÙ¥ñvÃ0þo€yÔò|Œ,YyÝ~âøÊ¢ìÆbJwmk]€Z¾‰Q;Ùjh󽧈†ù*³Ò Ä!ê-ö‚dä1å‚=«#ñ›ºB„ŒQäó€#+}7 á£Ü@hs‹ÉçU@àµØʈêÈcÓé °<¥˜gÃ"Ru¦¦ÜóÜG9Ä–vô / ±X±l=‡~¾Ð;VòÙÉ0“¼Šð´í¥ ˆõ4Bç@¡/µŠš¸SZŽ€ÆU€`ø +VLqÞ¨óÇꀨ˜°äà×þfZ[¸Eâ=<€ò?£æýE.PZuxAe2±®QåöqxÉUl?ó |•Ð&LGm -˜7¯iÕ<¥Ìºr¢£"cZ,‡„Õ¬7Û©KZ}ªä/@^ªu\i¤FÞk¡´I¾”F8e±ðeëýdüÓ2è"”«‘«Ï›È±’_<tgœÔJ°Pãì£5¨ÄŠò5t—c£´”ÁØÜ +!d$‹ó¸hhú–e0xãÜeÑ>v$”›i·f +*í†X[‰ò5ÂD9 ì#ç¼sŠJÌÎø/6¤`I¾æÙœ±laÐö{ôx6G4ùkä™- _Ê÷gÚ~{º;pl?/ò†º|VÒ:Íe8Ìò¼¼ÄFhþS”WF)™ ¸Áæí£åõ#xú4yõ ÀꇂÆè R#vŒ ~ô­ðTŽ+ÿKÊvBïúo©¼¶Sþ7Ú±èW6©¢¢¿d±.6Eý7EþêøM6›ü!ø¿ÿègß|³ù¬˜_^á#v§—ùïË“/'ÿ”Ùåbendstream +endobj +1421 0 obj<>/XObject<<>>>>>>endobj +1422 0 obj<>stream +x•WÛnÛF}÷W ü¨hR–%'@l$)Œú’F +Œ¢.‚¹"7&w•]RŠþ¾gvI]h#@ãØ–Éå\Îœ93üq’PŒ¯„¦#:ŸPZÄQLãË8šàçŸGø¶’–þÆy<ŠFý×ó“³OcJš/akr9¥yF°Ç4OߌýövþgbzŽ GãhŒCjÿYY™Z’ÐÚ4:•ô;‰h¥QvöøðåÏ?¾<|ýLÿÈhåQ±¿ô/EQLïÝG¶¼)¤•ïÃÍÉ.6Ü Ž[óð˜Qk÷ØÀ&çH¶”#©j$ü Û»kzÜšT”t'\Ë×Ölœ´Ooéæ3‰,³Ò92áø‘¥®Þ__z3mÊZÖcŸ}ñKù~ç îEMÉ»Q”L.£$Jâß:ã¯Ô4eF I¹ZKMÂ]\GÄ¿J¸gRŽó=ð(œk*™QmØÎhL U;$ŠÇ£î;~zÑc D¯h•Ô5ÌR%2ÉVøHH õu½†ɵ´[* @Û¨²„£T"/2ÝQ„½¹ˆæ<â¿6Êm}5¹Nri¬d—ÃI§¬X”ˆ«©ç–3Õ0Cµ¤¤ÌÐýÃœžµÙø+z-xÐ’¯ã×ð4;âþ’WfU+£Á$&b*4GÔr³5MLÜšfŠ*˜£8:ÑÍ’¶¦¡Æþ§ýÞŠ |Í?¦=Ê÷²¾¾y˜£´P áŠ!(b)yV:§R=÷]Á +#[Üö<@È;÷¿Á‰'Éér¨>4Œ)†‚VÖ B8G®èˆ-ÖFe2kG DfIñóVLFÑyD_a²MîôKP•Ð4Ûêô”VÂ"4íqY€Ôh +ÍC·ÏÁÛÓ–Ûà/›Üñ£ìÀUÐ'£—L>¤áûf'_ÈZh¬W‹º +Œk^4[.¬Ñ +^TýÆQ‡¼‡¥T¾êÂe&ª…`ƒÝD=ÜßþÍÄ…/ +÷¡Ch\€ÏBÀp÷º/Ž#wªjÊZhiWn½–7”ÁÓR‹œÌ¹ß:‘êD”‘Bµø¹ƒü׸)×*òËIðòÁýxYª½Äwƒ‚³9é_u-÷‘,pF‡ÀKð^¬zRÝC¯ô“³O!Á£=Ç;:>ÞÜÏ^fÑ®¥,ŸÞ¶I„búk<@énFJg #ÝÏiŠÌ·1tG¡ò„Rš +¥âN¡,£½à;zumeŽI eöyÖÕ&—ž» =þâ·z»’´eƒU€ñƒ0pѹX®¡`|S/صÂW}Õg:ŠµP%kpD2ÏD~-„L!“ ñÔhõ~Ÿ\-Hü3>Gâ®oQ:óª!´Æ‹0—m´fõbƒ¥Ð•Ð"GÓ¼•¨Oˆ¶º\ž]“Wâw Éòµ²J{w™±èùæïa Ö!ê×)ÀÞÅÐz;Êp„i2lítmw…‘ØÕ‘@XРÉð›\PŠØDjª©”:¯ ”Aj»BZå!°Àä‹Á`uG ù#›îe0ÄÆQj%P|‚쌿¶Wzë?á,ËD¦0áðߺ ƒ {ÿžkn%0ŒÛå¡ç;¹w¾"RØ^Gâ0&‡A…@ŸJ§e“uxsn ¥Aç +é妇´o?žÊ®ÆBÁ¨@5ÍûD¡’-¡ov¥å¼¢´T¼y(6+ 'Wš‹æ >½lÙ)¯i|ÂGÑ2„{O`èb. LL håKRG-®)QnMAK=,O=¿N¬Q€ÝÚFµË¥J=Ós.;zRþ\ÉLÕ8‡DÂÄæ +ØF4Îk_ ÂÁtç¼0±ôûö©5Øœ;An%–Á|ã#郊ùÉhÄ„µ ‹ÃšWZ+0óÂɹƾ^öå'¸Ê‹§NËŠ7NwJKU2 ™½<±¨ƒ]ŠŒw¨(ô2,Ábá$§ŒÀ¸N¯2È«“/ ›E¤]0 Ï ž)“²]4|a÷;§%ë;Æ`~ƒ×ÿ +íöÑ„eŒúþbçüëKf* ð*À¼óû /]žo…,W!Z^ÀU@ kµÄšÌƒV"ºöpž}ºl߯’ ^/Ïñ8 +oY³«»ë+úlÍw¨9}0)Þ0°.p³qù‡ÝÃiŒ7Ãlðÿ7¸ñtM'—xíÄãÉ”­~œŸüuòLÇÆendstream +endobj +1423 0 obj<>/XObject<<>>>>>>endobj +1424 0 obj<>stream +xWaoÛ6ýž_qË—e@£ØŽc;ö!i’5@bgµº®X‡–([ Ez$/ÿ~ïHÉNT†¶j‰wïÞ½»ü}Чþôi< ÓeÕA/éÑptÆŸ“1>øg%áA2LFÝ—éÁÉÍú}J ÄMÆ”æ„8½¥ÙQ.‹R—¾4šüªt´)•¢±d´zÆñ­&A®ÔK%Ó¥5õ:¡©ñg„LJ¤ÜT/VÂyiiaÍÆáçJ8šÎÒ÷·Ó_~J¿ô踚 àÈ áiÃ1ÚÊBZ+sÂ3œšîçô©Ô9bÑ4¥«"¡é”à48$â1©3€Á9r2«méŸ;ù¤~*­Ñ•Ô K\…Q_Ý_ÆóŽó7Í2£½5J!IaÚû*j|S‰@s”4™£dÈ7ûè$™‚>ÝNç/ØÌ ®–yPx- ºþíúÃgÊTÉÒw'·´¶Æ›Ì(r^d¾…”š§(—uCN ÀÚ¹aHÒŸ¤=q ]èç6x(—BOß!Ç9³Pê:0ËIz'+*-ò U§…p¨•¥K0e#GŽ‰E…¾J<Ó”oNK ázÔfCbaj뺅Ö8b½A-2ˆO¢68ßÉ»O2Ü'æ’L ‹ +xAD¼F!J±BòÜJçHóX¯Ix/«µw´@e@ªmHcýqD¥:‰ù H€dN¸WP­ ‘e*6Öuu‘š]i.ª…*÷k "7¥väêõÚXO?Ó³t‡­D]µHXT°ŒÿX*³ÊýÉÊgÿ!/hhiÛGZEÐ@ˆ‰“<y6µ¥WH:<íÇur3ÚZÑqÛ1W36‰ÐdgWGÄ /P—ïqÍBåξA»Ö—Y­„E÷q ÔlfÛ®ƒÙl4¡ ‰"OnΩËdï<>Æ$g ì( f„Ë"ÕèI_Žú_~Úµ2œuçcMÂA/jþúÚÈ4ÃÉa&„vF?˜ªBœ¨8˜KðW¾ c¡dÅæéjÖT°((R)~á5´­¿ Xð×­Û6¸ºRº`¦Ò_ÞÎæm{’’˜däEû!GèÀ”Š% (ÝÁk¿qWÁuA ÁúgTÁb¼dË‚„=¼³*FáëÃ×¥-û>hƒ"—ø +¢Ÿ›C ȼ†Ù–y˜ +ìßè&qàè6^ƒ”7îd¶u<»qZ~0 \@eð½Öåø¦•A»ºôµiCÇÀ•—?àÙÊEÀ-VuWˆVzž¦,QÂ’ÝB¤ÈÒ½³rX˜z¹‡µ?$†dÈ­¥À0Ù ãmù´ôaΗ "“Á}?»/“(:t´·?ÿg{©íh MÚL1¾ÔíÃï­ Q(þ&ìt¤fjò+m•Ùe‚ñloÚrž‡âî=Žb:`÷š+±^KíÞ†-‡Ù”ñ“0’ѺûWyŽ_çM)Ê™§$°6ñ—¿mÉÝ’¯È˜‘ö–I3öÏá„ +´YX<*^àD ËÃ>âÃÅ궊+ 7Z‰vŠª ¯"ÚGr]½éܲ¨u˜ÍÎŧ[U6{\Ü{ÌZ6Í[bSí@^kdQå>/XObject<<>>>>>>endobj +1426 0 obj<>stream +xTËnÛ0¼û+>)@LK¶üH€´¹%ma½hŠŠ˜H¤KÒqü÷Ý•b´ij[†@rgvggùc!¥o†ÅÓ9T;HEŠt³ø”´!Õ©eµ+vA“Ýö7k^!ê–­dÚm£[òc·ùÀ!n܃uÒ×Éæ~µEµ³ª3’MÃ]';ÐÏ:ßÒÂÊÙè]ÓôtÇô#økÒ«ÞÖ•œãÔiÂÞDUŸŠ`ÿù-Ñnª{ŸŠíFm|³<Þsº9–SLfK‘MÙ@««Ûë+|ñîQó˜9µcHUg™“¦½-R²o™LÄLÐ1Ü}.Xm´Žzkiá¬Æ:ÉÖgØzr -áv…ïÆ–nè†Qµ±:0n¾ÈÅ‚.(º™Ê$»à¥OÅàëà'ªƒNendstream +endobj +1427 0 obj<>/XObject<>>>>>endobj +1428 0 obj<>stream +xWÛnÛF}÷W úiÝ,9E‘K HœR`MVäRÜŠÜ¥w—Vø÷=³KÊ£ E`DX.çræÌ™áÓÅ„Æø7¡å”f J«‹q2¦ùtœ,h~»Äï)þ¬¤üâ‰&Ëd¯óIr‹¾‚·®ï'7ôÁЗ‹wë‹ë»74Ó:ÇåÅò–ÖÁê'éåûBÔ^Zš%ôÕá¥sc+á•Ñ” /6ÂÉ×ë‚É2Ú¸šÍáo]Î’IB÷Ú[“5)¿oÎi2énN—7?—í•ÎÌÞQZ*©½#'uFu)”&/¿{ª…s{c3Gæ‘øBâ+Z‰j#(šÒB¦;~âäÑõMK©mk¯ô–ÓÕdÄÍŠܤ¦ª…Å~¹"o‚ùB¸‚œ7VfH<5Z}§†‘è³O:›ÓE2çTäOÏ&#uˆÖ^rùvéÌU*ʧ…®ô°&ö.ݷק鎉óRdƒTL~«„ÖÀI#&çÈîUY’Ñe1>Ç`eŽLŒA)®ÉŒ¨Ñ¥tŽ‘Rïo•ó¶%…“½;™ ÁBp'¥B_yÚHD£È À}Ýù¶”t&Ö„ÞÉTp¤ÀÀÂSk¦,…ø‹ÀУ²;ô„Í¢á“jŽúl Ï1w®¨ý¹ò3•ÜWdéä0¿&.2”©<Ç-íú™$FƈÒpvŠVÌæ¡ñHŠ´ˆô ‰XmüEÅ 4?ÒuD2Ù&„FÚnÊP®h´-•f‹Þέ©F!ëÒ¤±Ýc–…r×H—jkr…‚ „Ø!0ìÓ>ÿ¾ÁbkZé­’ÏHˆiÕåæaéDNÇý'èæS¶¡Hw€_zoª*ÐU< UŠ ÜvaÑ«ûñÃÛ?FÇÍÀqŽèS»úò1 •«ËÆ%tD+®î‘ª@öXî̤M…‚ÅìÅÆ4(eäÒõÝM§a—¡•³Í÷.<ú•Ï¯ïzÅãÛVTŠbå=VÍ Ð&¨fUÔ^{z0À½ îW2m¬òí©U0»×QnöPszõéÝAhzαn{™Z=50‹\+rªªŠ +ººæ +uá¥Qaö(¤ òb²cªJYGщ] I®€g[+¹¨8¬ñ&ëZzæ'qšù¸eb(#xFˆ‘Eœp×[œ§‹¾5$,2=ø>qý¢°½ç j­ío­“è¼0ºïw¯ò©Qp^¢1þŒBÇI«X°˜O¯ÜKé¹—ùšóÂ/ DÓ`äÖà–ö*¢‹àªHe ^ +ÏâhfAÛ²,‰4 jÏúŸ€¹K{¬[ŽÉ@ËB|¡q#ùÀÚi³ÇÔÛB·5$¿e¤ËùïY +lˆˆÖÒæ2e!­s +r‘pEpë‹…¶ƒ€ßÚ% +§„„8Už×<;0«M˜oE)3Q¨jÝS‰Ñ,˜R¦ÙÌäÉjÍ3 ~¤È‘ƒ%û²¡JР{l:ü"êàT f6ʲ“54^¦Ñ8žØ|ß.cÜYž—( +XƒŽ)Û^ûÕä>“¡Ô{lNªRí˜kýï;f_(Œ-ñeîgw±(h‚šöìdò•·Fßh@ªEå£ëEÑeœ,:¾Á·‡äÏÍö3Ï¥Ž§&DÆýîZlC•C¥•~X…é1ÜŽÞÜð|úö:`2&Óñ$Èæí,¬ª¬² œÁÝ°†b›cY^×*åuÍ°a +½í*œÉ\4¥ƒœ¬T$#‰Ñ¡­âÜ@áÜ0OTè0Ë®ï‡éÄ‹M¬c@›U™—à5~9S6a3Gƒö wEĉži1çg¶‘r,oØÍ®Ž°9,w°`å•Ô¡»Y Üô áWƒñÊF։ǢÄN&ÑCeÐQÌ–š,&3$ógdé“J­q&(F5ÈÒS"Ò8è¯ü^¨MH‚ç´æYÁ—ÒiÙd2ôÝ$™ƒ >/XObject<<>>>>>>endobj +1430 0 obj<>stream +x¥WMoÛ8½çWÌa¦@¬Xþöb±@Úm€ší6ö’ %Q6k‰TI*®ÿ}ß’ì¸Åv±‹"h’3oÞ¼ùð—«”Æø—ÒrBÓåõÕ8Ób¶HÖ4[-ñû?VRæS>þÁÁl2Mf—o6W·÷ JSÚ”4™$“qJ‹Õ<™/V´)¦ÆcÚä×ÆKúõõæ3®Ïºë×wUEyk­Ôþ+)œ$SÒ•[ãLééñÛ۷ïï)¯.9rmÓëI´~‡?¨\xe4=+Aøßgc¥Ód×ow¢ª¤ÞÊÛOÒ5FÃC-óÐÊÕTH—[•É‚vÒÊ„Þi‘UJoáN +K^~ýÎSa¤#m<»ù)”Ã[PˆLUÊ9±“7Ô ȪàBi’:·ÇÆÃýËp’HÓšÒ³:êhM'Éj¢BpIšÐ]ñ,´[@‚/‚Ipò’ê4™áåh² +ÿƒ—¦@"l„sc G"@lÀé£â4¸ƒ–Wö =šZ-©uÌ“ î€œVe)-åB³…Ï­ã”æ0{‘“·­a ¥Ë9iŸ¥ ÑjÉx1ç$þ­ôƘzýÊS¥öàYTûî¹èÂŽð¤Â9‘]÷V½¬P½Ù§×]rœ„Ÿ–˜AÒØûyïàüÃÊ AQü²HM,ÎQÔtôI™Ú¢q‰ê”®eè}ºæ§&1¢puäUÐ[S× àerÀîd™,¸ÐXB§Û­} ‚ÔpªV7ÇP·ÑÒ¼oèQÆö¯É„oïO÷ŽMDôÉ5ó¿µ¢v¡zj´(ŸØ‚Ѐ=,;úËj§T²BãÆÖ•T‘Q&ò=Híèê!pÐ Œ3=| †;^°&º>êÊŸë™ÆÌ å¹6½È1œØierNPg3ăf‡Wû+÷u®`!“W%g œï Z©­MË'Z–|eÄb.MU¡_ý‡˜Ø(ãÌEÓ©ΞHT’&4Ý>7†íèé:4Ðd"9 !ÍÔMC+¿´=Q@о ›úhU-жþ0œ]R{‹`P¶è°}Ú¸ +нð¦»{ÁàÓë¾7ô‰Ü²­>0bÅ„ƒH ¿ŽcÉ›aÁZ6—39üev'ëd:Çöô½Nú§£pcPÓŸUj¶ç²Ûyzsi:KÖÁ߃ϢjeXB_ý²²Ò·VwƒJ; m×à¨34,:½¿ß#üÝY`ò}ìæýO‘i<È.l¾{â?ÉFbôþÌÁ"MÒ>t+G!úÁG„ݯ†è÷áò@ëû8Odõ‹Õ£ÃMw«ddÏb‰‰èX7L._åf2¸v<"yk‰¦xà2š3=‡þÃ/O­…W¦¸EðÓ %Š=6š3Ú\ég³–ŒÇ5  Ãs I"Óa E…]ÕÀpvªLî¬ hØ4=Š:C/¹¬xä:€7ÕÀ æ†F‡@q&°F1l$F£B„ݶ5ªs¨‘¹*y«8aÑ(‡|ôÍ/¡^ýÃnºCƒ”¬¢!qG +iCÀùNæû¢Óýíýª+Ìt¯.«)-–ëd½Zs…>Þ}xs‡c>cWBÛÈC<á+†¨â“ÑrîÿË5z¶œ%K|Ÿ ]`’²©w›«¿®¾ý +7endstream +endobj +1431 0 obj<>/XObject<<>>>>/Annots 537 0 R>>endobj +1432 0 obj<>stream +xWMoÛF½ûW |‰X”H}Qzp¢$5Än¬ 9ø²"—ÒÆ$WÝ%­èß÷Í.)Sª´…aCô.çãÍ›7£¿.Bâ'¤YD£)%ÅÅ0Ò4ã>Gø5’2w0‰Â >w0Oƒé™†ÍŸ/.æ³`BÑ<ÆTPŽ‚yó”ÓýE8 ù9žÀwA£prxâÓñ¢I ÿÅŸà³ÎcAáˆSx>œŒ‚Âyä^ çDàŸœÏYÌ(œÍaœ#š£æ‰OÙP89“Yˆhb +‡1.Àc² ÷äŒvža4bãϧÝgœŽâãÓÎ3N§C÷`ùÍòbð~LaHË e›Æ3Z¦â!-“ÞVX»Ó&¥'‘×òŠªMmIä¹Þ©rMFëŠ*MVVÔÞ´”iCµ•ÆÒn£i#žPkmÖºªd R™çËÁë倈šúÑ¥\¦=[¬œÉÔßhC쑲”J«Ö¥LÙ7¢{$å “…¤Ø“(SZÁ­(T®„á{_?ß|ï„…9–c÷=Ø?\js|oH}0-â0÷ÛóQ&º(…u â~›Ö{€ShÐ?••P¹%]"*€yì¡G/æod&]FŸà1¯‘õF%Ú©¬"_V‚Rî@[!q÷†W…Twý}\\ßý +•i@|ÅÃÖB X¬úÐeÇÆQ0 €nÊÊè´N8Ð32o]´©NjDX±Ž$F­¤¥Þ±H°*\vF)HðÞ¥ÁP3n¾ŽÜ"It +’Ÿ VÑÂƬö$hµªåÚCoòðš˜ÉÈÖ ¯Ö">¨Û„á6Rp»‰œ?ì!©¸ƒâY•P   Ð-SŽNg'¸LP±Dn+¼„Zû—Y5ù…ç$A ´óÁGS2™t¬N¢,[mI:ä&Ù¨ +°Õ ²»Eƒ¢’öŠ¶¹än?R°L·ÓÄâM¯—Ø‚y»•¥Ë¢O›ªÚþ6ìv»@ã¿y*¶ËÀ×:i ? bÞAPí‡h:k½îð Þ +RWbxµQîéÞÃpp¦¶îF€[6[€ÝƒjÿÅs?ŠƒpþœØg]qï¢Ä·¯¾H÷žîêU®ì† ´5Ô‚ÖµJq]{nrcÝïm% ºN è»Õ@/n.ž¾È:¦ä %ŒôU€Z@d3’Â09k4­¹¢h8Œ\+¢ªíÌZî4uÀ· +¬k“ ÌÞe±»5cAböld¾ÍjL#ã†l·¤KPÚéß-Þö¹¸ý?n¿-o1ÍT‰©È“}µ§›u)¥é­®·RÔ@üŸ2³ÃÏK*ÔÚ«qÛsC¸Ar³xwýñ»/¢¥5áîÓ<]y¶r·{6¯ bámÃÖ@Yœ ësrd]hΡ³$å9ëX6ϧ]):¬mµ®åÎxü,xÑ¿¼®]¡V˜cm(̳Ëf–†›¥ßi/í%gézeOg%Æ*Ú tZó¼<öœ†]ùÉÞhã @]ñZw½ÄÞvE? P¤Ã‡7N4Ú4ÙˆÕ¨TÁÿfqi8ËÅΛæJJ§ýQ:Ö]üa[8¬N†ýa«>#q’‡"~-–ƒÈC>} ë ¦¸q*¶hbp{:5ÃBVmxMÚS.ÌÚuB'²².VL-t¡çØCÏ°¯™ÕFשZLnî´2ñg±pB‚K¹ÖõÖRQã}¸•áð8±˜î˜zØò}@°òÖìGL“ŸËà§ÂÆ&¡ ÕNŸ°5£XÅs½†@=ôtéÖ|HUÉ+_w–—Cf[‰‰ÀÛš;pÆ Ä žÌ£ÿ¸¿Ïô¾%¹E/Ä÷šx>¢éÔí÷ןÞ\ÓÑ?àŒ͈w+î‡S|÷ŒGÔŸ ç<ÎlºãÙ8˜Mc?;¢ˆ_{·¼øóâoJCxFendstream +endobj +1433 0 obj<>/XObject<<>>>>/Annots 544 0 R>>endobj +1434 0 obj<>stream +x•X]oÛ¸}ϯâ±üYÛÙ§ë›n°I×7v·¸€_(‰²ÙH¢–¤âøßß3¤ì8îÇ¢Û&XIäÌðÌ™3ÃþsÖ£.þôhܧÁˆ’â¬uñæðëñãY¿×4ö£ 4èN¢ëæ)§¯§Aï߆“1þ¿#);ëºØÖô¢o›Œø£âmÃîï÷_‡“ ¼~e£ý~ï[£¿/Ï:·Cêõh™qÀ£É˜–©·Kˤ•õ,IªŒ*4«Ë+re UÒdÚ¢L$ÅÚ¹\–2y"¼£\¹&«œ´}ÙÇ;J)S™ú½%©2•/2½\~=kw©ÝD}¸n‰ª2Z$²5~ 勇¼«¤T8 “¼ëhÓr#ÉÊD—)Õq. vâØ­H U*ëŒpÚXÚn4¥Ò*‹NÙ*W‰p§±E\ k·)e*—üµÐ@VJÒ¥< t!Š›¤y–†¶+s™9Þ†pI¾­Räxֹ݆mtnß7x·ÈØ]™¬Z½Õeø²ÏD‹Dé‘9^líæGKik4ÎÔÖéâ +Pµ7Qœ d£*ÀëÜ&Míq4éQ þU4¦·ÁøïíÁ5ø…S`œ)œ,ß1\¡ëÒ‘ÎàÖ³Á)]g…ô! ˆˆ±Föã+IJtfÄij/­ &ÎIÈ"MÛÂ9£â„Ú£‰œmt!)E6¸A@>Ú¤À¿RH9‡âT!¯˜ÃòY" +z”9>€Öw)¢P™ +$<¢Óªõx7[]z–ýPíþ$ê]Sû=W6CÅ5b¤­sÀ1R™ÉDÉ?ö +ß=ÇÀY¤Ž +)JËH2hª\3“ÌñÁ}!Ä;Æ1¥-Š#Å™r]Éô{1ß5y€SU8‘$Ò¢0+P,ß$Ì‹G–€!\cØÎIÁ~„ƒƒ>ž*ÏÉj*EØÁ oþ^3RZ`Ow%…ëGÐË+’¥ˆsÅÖU¥ó2#N܇Hc‘–;ž˜)6A[`o(Ó zM=tû “j¤oüƒh "ZqEô–…o,{~±«Ïcb‹aüõ "ÑP0Õ 6mÐb ¹;ô(0ú7 R€žý«’¥7“n3N±z%9º¤;9óìP<dL=ìÖbàÉ‘T$™Õ’ºÕæ)ˆÃ'él"*yaé•Àád>¤à‰³?_Ópâ7­½MÐôÉcŠC0_ÑÀ2rÖèô 9’ ó˜áÑ“×kð +¸ahB.µãÅ©û2õŠyâ¿ÑOvÈeÎô°ƒñ v°ÙÖpÏ›µÍ ü¾J¸~ø5`ŠE»yñÿiÃB›ÒWD·{}÷s‚ A-„ß)”ÆFU솳ùx{ƒ{Gw é´êeôåô Ýo€´7Ò¦ Ü! µÍÄ_~ÇÑÞRD vqÝò×—–|¨ni;L§N8f0ñ6€–?äѼÇ<öË›xIÇ_1Q&9:(w¶5¦Å’¸7xqíÜvéº)Ÿþ0”ÏñŽU‹z¨¥^ô?CüŒ{£÷bð‡>M>Ðű³ Z|ž¾ŠËÇÏ7ËÏÓû}ö»a$þoöaqC³&΋ï­{ø¼XBg¨V)“Áïp»àóÛ{˜þx]RbY^ÌùêÓó9•îè¡Ú¦÷º…t¼L¯u¹äùæü{®}œäWeYXFO*yÒ‡'X»å ®TkØ <>`ð=>/XObject<<>>>>/Annots 547 0 R>>endobj +1436 0 obj<>stream +xW]oÛF|ׯX –™ú°#Éouœºu‘º©¥}Py'ù’ÇÜ-ëßwöHÊ-!hì؈dÞîìììÜê{oL#|i6¡Ë)%YoðÎþ×ão½ñõu4¡é|(£Él]Õ¯RZðóô~<‹æt5ŸáÿüXEëÞ‡eoxwEã1-×H1Ïh)Cä-“¾+ãL{òOŠ2#õZ+I.yR™ µN G‚ +á“'ò†¾*kw¿8‘Å"2vs¾üÚÑÅd +(KÙÿ£tžp0—Å…pn+«0ÚQ¦DÎ1œ7¦óµ±™ðÚä´}ÒïÊ¢HU¦rÏ)K§ì™#Î0¼3~¨|2¬âVi +ëÎÙÝ€œ©A/Á@!sÀØo’Ä”¹'U‰ˆP: íS‡g¿<Üÿ¨´ÐFtC€&ˆC˜ ¤É¾X>~¹]~y¼ùÔÅ[aHRЄ$à'sÌAR?kYŠ4ÝáE&µncwýn¶êYÙ¿:~¿!R®Ré:4¬ú*ÚDTj¹:¯ 7x<mµGsѳÂ8ýÒ”ÕÆgJŸê<€¢Ç»ÛÉåhÑò •ã_¼#©œÞäQ²‘Ã}NÆJe_›ŽZNòJ«~à]ä’Ü,àì–=`š2W‰rN؇†R}§ÞƒqÌSÅ)‘Sb²XçAŽ-n!b z€Úyþmb/jL•>;I«Þj†žµ ;(ÂJº¥TÇ–+H@ŠCñ¡=å‹m.²Uu> å#i´:¯Éæ b5‹0¯Ü3hÀ¢«”…IL¡«'ñè¡Oo>ÓÃb±O¬s ISt•éY—yÂèó È°¬³2 Mf!:T³î$mÍeâsé™i§cxÇ~عï¾#Åô3¸Å¥¯‰Î@s šíä<âá~Áºæ´r®üÖØo,oÁšnj&8[ @`…ó¶L|iUPððîšÆð3vË‹Ëqem—Ñ4zÑ­É×zSZf©*( ‡b”áhm´6Ú~upÑ_…ÊCʤŽÄVj\¬å¥KXBž¤¥Ä\ÃŒõìDtÄÊÀ!ÜcŸcoµ 0 sNL™9>,QÛö¹uð >ÀKûÈ5W5· [cü»ª°÷qSRT®Ùd NnÀI*E1¬RO²ñ ^<†¿&„\=Údï‡q¯cFé×Pþæ×qu¬z°~„e<̪„¦¶‘÷VC²ªkµÕu&Š“T<7@lÛת«rœÁŽÏ^±Z¥Z7NÛ)1;çêD<Âoûz&µ+R±{™:çH„kfS(ëL~"%¯}@mðN¾ƒ;¬î”äZ·a¬ áj@;Åý¨{µ]׃9¹ªóÝ;êHé ­,Ëq4åIÄ“-…³åÂç>™z«¾—¸`eu£­E™úÕySÁ›oµéõ«“>ìNÃVè:B F®”Džç¶Ê~:UGLøÿ„{ªß?ªÛÉÃà–1ïx (ç­‚ôšv¦¤­àw«eŒíŽeY/èì AÕÀQhl·-G{’k×’r W„/ŽÙÞ“±Ôr¿ïþÛ0 æ®…ë—ñîï(g2V¼ÔXJÓ^W#®‹]!Ü8¯Ž1@åßøP¨rmÒÔlq§4…Õ««zVbìx`¥€hà&0ta¡1ìÓw§{kTa«Ä#«~½ùð}¼;\ð—Nº°!ýf ’`‰ßª4ÅæQñ2¢7sG÷uÅ×PѬՇƴgj;á³IçI°§^êµ¼Z‰‰Ô÷ú¡Öä4Waÿ‹U •ï·¥£a¯¯sJ…Un°ÚŒÛB}Á² ‹bk±*c ãÀûy}‘§øp5¿¤élV}¼XÜüùá†>[>Q|4IÉêÞßíÍ‹Ù6ûÀ‰«ÙU4›Î±àÈäŠ1üºìýÝû2þoÍendstream +endobj +1437 0 obj<>/XObject<<>>>>/Annots 562 0 R>>endobj +1438 0 obj<>stream +x¥WßsÛ6 ~÷_‹o‹sË–ÈöƒÜ¥i{×f]ã=Í{ $ÚVK‘*)Õõ?”d'õzëš\S €ÀþÜ aˆ¿!ÌF0Ž É;Ã`ÑpŒÏÉ|†ÏþY [àÖöñáUg¡l΃ ä0‹z¡à±s¶Ì!Zã3™×NƒQ«Ç‹“^-›O‚¦­Œõ& BTûó‹V¯‘ÍÉôIv¶Ìa1Gœ'™·9›óÖ&/N6kÙ|ŒaNZ™×‹¦°Á‹“^-›-‚&­ÌëMG§œMxqÒ«e³)ùkeaHùŒ(å9„³¬òŠ4©hcø´f/ÖÁý°Þb•£9~H¹†CX'½L§ò+Ø,…Óü|³þØBbhë´×íB¥“çR—Pmáh*H W›éÆe_WIb*Ü%tZ ‡˜Wo„w¼²¦*-ÙL:È4„4³2A;GR©o”=Ð*Kª<––Ѷ@O>ü¶ÝÛ–èSÐÿj-—äñÏ:G~Ûà~aèsÚq€ã +tüfô6ÛUœ”G‘Ç‚‚ÜOÎ",,æd¡oRæÀ Vä²”Öq^Å‘)+L¶—ÇA‚vÁhu„CVîÁ[ÕV{ý>½í«TNäO]öà€yÍt¢ªT¦¬Þ$xŒm‚H°ºE¦#HŒÃ ôb¤dœãº î“ÚiÌiz Í(šÕš@YØkÞ‚´_¤õàþ·‘昑Tÿ¤Wm·Ùן4²Íì'Æ–?b „‹SqFØ’Ô‹©t‰Íb¬qÝX o6½éær¡¡;Ü«Sp‰ hSB,qÀR”¨¹—VðÚ$–ê +% ΄¦œaÀ ‰-Tˆ‰‰NÞÞ­ÞŸ55Ε‚(ЃÅ÷±¶3©?šx’áœTΔI„ ÛX T_ „z¢üµS&êïg¯¹§L°Ë#, ˆÀך~zèÄ‹âÜÁØÔáÞ£dpg³·jYÆ™q ±?q×zõøzýòÕï—£¥O;qKxX}xx³ªw5Ô vÛÁJÅ)/Úο¼9•ÛLKž”wPŸë½ÔãÀ£®ÅwOç(åk¢yxhî4asíÊ}æMã“è@#Ýs¨I}ðA  Sõy2»WŽyä$þ;"B‚uúì(…þ¡X|õ°DV–ÅBnO¨Þ5…Âþ) Kî2ôboCþüð¶\P¦1á¾ÙrF®8ÑÍȸ‚/BUm‘Ÿ¥%Ù ½“î1m‚|—HLBãNÁyB>ÏÂ_H”«D/yžÂ;¡±ïì­©–…4ØN·i²d†ÓcwW—+®I¶=r,ÜU¾°×öÆ•LÈMù!*U:HÍC¢ÍÍ¥äMaÄ'ö"E€.#¸;qïññ-˜¢ÌŒ†‘$Çö%þ]òÝ…MïÚl·×·È‹RX¼K(‡ œ×F_£´Žcsó=ðN!òVÿ2賆¡áJy¡ñT³¥Î£sI땳á¡G±]ÆïÉ„Ç "0úê;(ÙëÆóÅe€çe‰ÈÏúÚá¤LöœÙóëÑ%X¾¤|˜å~”a;©¥ +o<@<“üxò ¨¡ðŒ£Ù`>]P³zBØô~Ýôðª¶ü¥ÂRöLüY’(œ³žòõ%‘ÊÌ´ÜÏë Eá÷ù"¼,ó½äqõîÅ +Þ[C&àÎ$]Bq ô…þlHÛž¿„}{ó'žÔ&³I0‹æþæ2šÒ«—ëΗ¡—*endstream +endobj +1439 0 obj<>/XObject<<>>>>/Annots 565 0 R>>endobj +1440 0 obj<>stream +x•WÛnÛ8}ÏW Ò‡u¶â[m§@Ü{‰“­  䅖蘩$ª$e׿gHÉVÔËvı-j82þY§dŒ´m&¢r 6ÒvrFJÒÓõ›ùå"“¶±|ÙÄEhmt®Ë«PÅn_©Pù£–ü^›‡ócô*ÍEç[î¤.R¿ìç·øŠGô0hmë|£JP‡4´X.=›îæ7ž &AMÓÝwJ[Š4=%”¹.¾HQD‚ê8¡Î•Êûçí~ÌiÉ´‚ŒR)¬¤QÔïú`þH î’=X'3R–ÖX˜¸Sh«¾U‡hµÅµLŠtÚ +WÎÄ—6ª¥…¸œ´á1nr:¢wÚP®÷>@й¦Åªçù’«2:é ˜<¤z £-TSãûP¨ +‡¦ž{£A`5 yÑRÆ¥Qîà¡o*Ãþ@ë-¨Fn¯Ie…6N€z…Vl ªdkih¿•9ÈiãÒZ”Ò£`ëí€Js7}µC‰[gJ” hsðe½x7©œnÙ«Uº`!=Mºƒ\8êÉ¢ivÙkƒšswüt”>íDZ" P„Ê\æ±94ðz‚ø,̤J#®ÒèM£{8¼â~8™RÈ¢NÒ_<ºÒÓ»õuÏ{Þ´*›–;%÷ÿ/÷ßJ­væÞp .O¢¸FQ£´_øbÇP!'¿9’_KœP0\‚Äjí­ þä)‹×¹puÖ¿·[]:x¯Q»Š ­k£Tê6¶‚yc± "Éà€ ÇF›,(MeM¤ +ÖF]ß\,Víü»`ü‘sÃòÖ®o¯?ýs·úx» x+PhSëÕÛEïÃíçÕmïµNS°®<šLͺUà{rð©l”Ó9®¬-ep™s¶+²6='›­ƒoÂÀžyËDnD™Öò¾,±š¨ÉWñ®•ü}'0íEÅÃN½ ]ÁµÂµºÔûç U-ÃjC¨Ö8>ðJòr…—:“Vr= +‡2EDŸYÔ!2¼-dÎÂh%ÆóJ¸;{ÜϪu +Jhf·G«þ¿t¸Õõ2H “y¾[ȪuW¶{;å—}ôGlt|‰¦4cØv˜ئÀ!íû;ú ,Ùó…OˆÝüX²_BºÙ|‡©—[ƒ íi®ÀÔô‰Ra´Ó±N‡D°2h#a§Ûˆœ¨j¼x7¢#ßqšZxó^u)0h¬0\¥)o¾S TlËÂWúñ¹ébDÃH¬áÆÞ™Q÷XgY™+$ÉcÓZº½DÉãT±â[³þC¡¿›šVÈ 1µ_QõöÒÇ ¾Øñàr´¾j^ƒcû¹6Fg´àžñÚÚö×[91GÞVݺò¨Dç¸f÷²Ö{þ4}ÍõåÅ`ìçÖŽME‘x­† G-½¬^Öóí84ÕgÏ(x9'4=ÉÏy¨Aûè†Lð ?w¬§$ÓÓDÖǘÎÓ«_Ìqw²W§æÕ=u®úäÕ=Ä?ë%ùÕyœ_…gÎcpÃZñóam à茭`rqüÅÖÁYò1‹ªÞXÈX ñ±Zb²5Û¼çϧŠ'ëš#Ëœ„ƒ°)„aêT¹ÓfÇ¢„ê5gƒxíB™Î7óʼn[ƒIo}€Ž¹ÿÕ“·À¹¸E¸#tcXÇÔ­ZцD]Œêñc‹Ç’ˆdhi¡ý°5×O+Á¡æ_êNó´ê' ;/ýÚ}êCTOÿ?520ýz¾™U2ŒfÑìrD“©ZZÎo^ÍéÎh~n£7:.ù‰ÐÃÄQ{ƒ žhg#êMûPO Ðo=PŽ§ãh:™…9k8á`oWgŸý _žÛKendstream +endobj +1441 0 obj<>/XObject<<>>>>/Annots 568 0 R>>endobj +1442 0 obj<>stream +xÅXïoÛ6ýž¿â``˜ +Äše»¶ Ò8i´ëÖxh‡ih‰¶ÙH¢+JuóßïIÉŽãnÉ~t-8Å»{w÷î‘ŸŽ"êáDã> F”äG½°‡oÚ_ï^ñ74ˆFárŠzÃpìÿÊèÆ>‹úQ8¡ádŒu}ü”’G/gG?\)Šh¶àG“1ÍR»qfI`ªRËðÙì#ÖÁ»®GÝhö±0XoÒ×ÂT7²rKš­‚Sš­$©¢’KYR¥rþƒŒLt‘2ªH$E'ãmV²  +kïÛ²ü'aÌF—éÞÎ$ŠtqQ^¼ã©¨ʼ®¤¡Dì܆?•-ñ±uÇá$¢&¼¸?ïٲϻ}Æñ‹$©.3±4{Nž’CŽô‚7NV¢I%K„^—¥®‹T¦4¿#ó©pfŽ§·²2ôÛïÈ˺”F€'ìÅ-;™:Y‘0ô ÅAmd?;¦÷qÈnM%*¥ þæCšÖK’_Öªl2”Ó8H•óL¦ñ³†F¦—º˜!×иö…ðYdµ¤ ÀìŽêžû ßOÊ/ ¾Š“ ¶¸X|S“·*¹ýÖ6Ñfç¢8_‰bùí°…Ñ7µ©¾±Õ•Îå´TŸÆiÖ2Q …fºHy e²BWQ¥Á# +퀹XÛ¿üxŽ²¯VÔ¼gÎn¯J™Tº¼³Õ¾ÓQLY÷öÍ?ÍåÎ 1¶¾ÐeN§æ/4ðRÎ-ïÚ~ë¤s*¤wra}åîèî˜å•Û;Îz~—"—™·gòyê\ÄÁóøB,°diÝ \þ*Ø#Û×[¸á«¯6Ôà$qÇ™¤Tk°iµzÐÃŒÎö1­K½–e»— ¹ŸYé{C.4÷ê1…ço¦ø}ñáâ˜tÉVv _žÍh¡2ÚùáI4A¼ÈBQg™ûÞâ¥Ì3ê3Š…¬¼1.öh·=ÄÎΞáÿqàÈ„| ­pµìãôÀúW€á¹Õa%,Z~ +“@‘‘˜a>ˆ¾Zq6°®i›Ãà1ðO/Ï=kÿ^±æó+Ðo¿U1^zÜkôÇ+¿@iC Üá¶jj[t{A*ÍëY³–šÈ «VvÓ¸Ë/ÇnykÓ¬t¦¤Ë[Üå §þrBªeÅS¿Í«nËR1þ!†Ï±á¶ˆã6ʃ•³(w¯£Ã5Á!?½&þ’²Fú*e=ïCÏ‚²8Cï·¢çA5´â«Ñd‡EÈAÞ|œ +)Õ¾H=µø7ò·•t– ›ìø&n9L¥,ú0àJºw×Ó¯¨±Ç¹´.U.Ê»WКëëéL¸:þÄpã¢ß…–¼Mó¥í·ãŸK¶æ0ÐíOÂè„ZÑ̃$u©0=\©¹y†P¤¤ –‡‡î„p#ò¹à! m…1>ÑOÓs~_PªsI¥± ÿ^Ûºx¥{õöýì­mðTVBeÆЉž"D <Óör¡kpêöäÑf ?84}¹0Þ™û(ƒòŽ”ëa[¬’BÝT.DUŽìÍ)Ljc[ -tÂUˈˎ;Ð4‚z;àŸ’áû{ؼgÇ–FŸâÅ:C]ý‡ð‡tù@ÁÈ/"_g#טevvs5»xõ–V(¥E6—8ð¶e–ò ÎU2ƪ•ð'éçþ@xùĈРb6ÿî5~j‡LÓcm„=„îˆ)ÔŠ*Peè …³¥{¡9ĤÜßÇ©¯÷|,Ü€%Т)uæ2¹½ë8w vârwl‹ØíÔowJŒýÞ7ág§Úw‡S€[Øœm°‹ck;$ XÛ-®Ê·©Å±V„èÕ²m 6ºF§Vé »Í±®_¬¥æ$¥É ÛyüA—ËÇÑ*)|`þ éJo$Æç±kIæ ¦£A<8ŽºrXŠ=Ãì°›8~*?¦Mê\i2¹ÎDuëj£0Ÿ-[n@¨Â°·uÐYvÉÚs¬Uä Ç`ÜˆÒ s€4¦±'«!HKÞ½á 8á2´™zóöå¯>KíØ:¡w$ Ü[u‘».„£ð$¤ ×#ôzz}I`;>Ô±à÷ˆÐÕT8¶éóåT0ƒ [Šåt«vÔnØ’*.™²Úङ\kmÔ—†eõü#N îòýÖ‰÷·?tþ¦Å)qÝ,kiª>ònå ªø¨m¡xt{N•l¯¤Ni2žL'½h8êΧgý“Ñx|6^\žEƒçƒËóñÞ«÷Þ§Ô†ãád0Úu?\N|ƒE#\åM¸³ó&oÎÞ¼<ðÒ†Uþ)ÜM[è6/tÇ=šOÏ Ç£ RŠ×ûÖŸ‹ÙÑÏGå9>/XObject<<>>>>>>endobj +1444 0 obj<>stream +x¥VÛnÛF}×WÌCÀâ]$%ÔºbÉ ESKr%­Mré½Àf‹þ{gIJ–h71P 6dîìì™3gÎòqà‚ƒ"üÒbàXxß + ˆ#ó…m³à†®¿µú¯ŸÏ7{íÀ6[<"ŒñK˜Þq`“+Á +"ê‚ëêj9×sÜ›û#×Ád›l˜·DÊ'.²)ŒÇÞÄñ߯–«Éj=›-ýyàçc7p‚Õª·µzÊ>©î¨ÂÌ~¢‰ë½ œïx¹a‚Ó[âÉ=MÕ"Çó§ I‘Yšr]ª^œfˆm§©T^oå¥|»mÓ{n±Q/Š¤©Zçd‡§üþõ~þè…¤?Í% wâ8ao7’± åbOÊÝ¡T{€ë¶y¡a{³Ç.ó<çO¬Ü“@Jø´¼Z-•¨qI€–f)áj +£OyÁè *.ÙsG´¦†B*§Ò‰F^€ +ÃS³r +Hâå.%BQq\_V”W9½ÈÒË*'¬¼çÍw.v½º~пŒIÜ[ßÓÜT<ƒEsB?ÇÿÐØÏ|&£Svz(ÎâNiíŽS.ZRñ2:§¢®Ô?óêÚ£÷ñ—‡¿PL½¼­ŒÛ¼^ºÑEBÅPZý9I±}?¤—ïXy·§y>;a¥¹ïð.qïXv€á¾Bñ¾Y{Ã<¿_Ðqˆú {^Ð%è +\ÔXŒùßVX¢;nwòíUöÆàØ®^k©sùŸQª—^ÆQ¼Œ7p±œy“0ŠfA€vèúc½hìÅ^OÀºÙö›)ó­È‚ëúîó'ƒ° ÀçÆ–G¾c5ãoB\ æšåNywj˜M‚Cb"šù¯rݽ¡Ë6|ÜyÊ +ò@Áô»Ê’?‹Z>æ–lD÷bƒ[ÁÍ‹ ,yªQઃptØ0Šó¢6<· |}±¢0FÃÀ%/6;V›ÁçÁ¿d\ò2endstream +endobj +1445 0 obj<>/XObject<>>>>>endobj +1446 0 obj<>stream +xXÛnÛH }ÏWpŸìµ|¿$Àb‘6l€¶hûP‹±.öÔ’F%õßïáHªåXr‚:1äá!yxHŽýãbHü i>¢ñŒüäâ çÞ¨xÊo†Þ‚&é7áû÷Ã)Ý*ú|ñvyÑ¿»¢á„–ÏxÐÀ ´ô»coî=z§ÒHnr-ÓÍåò;,&4½ÑÝåVÊâ|#SŠ…¿3dTÒF©€åçI˜Za¥JßÐ:·´ uH°p‡ÌViK2Ô5£¨7š!N Þ ²Û"Çê þÉ*~P„1-ÃèR&Œ Ö´†ë0 ŽƒìÒ£ÐR¬c¸Li¯rMÅæ²èšdíùÈñ™ §7 «*×I×±7ú“¾*Ĥ{æ[ÉÄu?V¾ËºoU? Öÿ%{ó#öŒº–‘‘ õsÛãÁˆþ`ä‹”Ö!‰tOÆr]8/Šå.|CÂP¬ðÿ¥û¡I;–|0z’vë(= R¹ ÊÀñ@sð>C<(Eñ±L©:‹CBt9ÿ& }í)Éc+3ð}8b!c-aŠ"tŽì¼qæ"Æ©4 ]ýj¾QòÜ„È(‚nRhåæ2Κd$ëLĤ2~c¨äj#ÙëÜ¥_Õœ"Yƒeöu«µˆ¿‘ }6öŠjœ*àÁµ«)m•±Ôôê¥"Ai‚0àÆ°Š;,Ž˜í:×4)¸>g¶ž”þÅKÛ9°¤›b Þ±g#’µxÑk ¬X ÿüõ[h7yÓëm<ÌÚé@@(Vë«GA3«™‹YF_[!Sn¦Ç­ØhäCLœ¹7;¡?HèÛÙW¬cøh÷ ¨´#™g—U: XÍììHN…œ1×ò8 Dì +¼ú±*Ų»œu(—ŸJã}9ç\Ìp ,éZv•óÈ[Ä€ä ÔÂqÖ,F´Ýc¢ùÓ­Ç<%"ùŒ*õÜ«%½(’fÚ\OsŒ˜y_.38q<®º÷G œ Tq‚ì>ƒ•…„FeÒ[ÑÔÆ®.[ÇhMç±Ú()Q½¼^äb±«îÕê²âí´!Bá›!^ƒ°“þ®â5¬¬?LÚ“P^ÀËߊtÝ¥ój„$G M¯A`ó¸jªa”`›Z¯º£étu‰y*:¡²U{…• ›Qq?.±½œMÕs™ÀQnOó~8U–Ùðb‡Ê =ò(ãF ïpšÜq "oÞò%)º™”ì/L5[±Q&춛OK¯¼ŽíŠx+5vžÒûÒˆÁiÕ 7×ÔùçºóRë¥d|-3wÏÀô¨uoÝS)˜·ÂúÛbñbb°šß%ïvžgô´ÅªFGã:¹ÁgíIfZ¹Ùé¢=™ ®?qZ¨KiØŽ,|—§Ðø/ÒW&õÀµ¼yxwO¥¨ˆ7h»lô®Så%Å Ýó´ý[7p-Á“¢ +Åžúøåý{·°DŸ«YžîRõ„ª·ÇgÔ5wlОU’cnáÒ/q{†Šì€ÿjÇÊå¯]Sc¦z{˜e€uá8¹¿°<—ýæw€7Zå°a|Û7dßL@¥–‡ûÛv* +çm° ´µ°9‡‹4„ÜÞzU±ÂÔ×ûÌ¢À5ÓóWSôt >²!òƒÒôéÌÅ7‹y§´9h@w6üYDu>t7ø©Uƒ˜ôW.žZ¾j¢q£8ŽË£íŠ(ú>| ä[ÕîÿÖ™ÃUã΂qÛ‚êT/¼=ƒRå5}åż*,üŒqšÖqD5¬þÝ¢ü6?œÍ½ÁbL³ùÌ[̦ü…êáæÃÛú¤Õw¬8üðQû=‚ùíU&½ù_õƒ–Ÿ=&ó‰7Ÿ-ð3 ŽŒ®ØòïåÅç‹ÿP?^endstream +endobj +1447 0 obj<>/XObject<<>>>>>>endobj +1448 0 obj<>stream +x¥VÛnÛ8}÷WÌ›À’oŠooI·YHzA\ì.  %ÊbC‘ +/qü÷;Cɵ-»E""‰äÌ™3ç óÒÁF0Ãd +iÙÆC˜&‹xÉ|†Ïcü5ò°,øzaa2ÅÉ¥…q29?q»ê î`•cöé|« 0óp«´÷þ•+ç™”»>ì´‡”)¨¼©–ZÁSoùt,wÜ€+8(VrÐ9p–´Å—ªÛBà›-´—ØŠ§"ß…Ýõp|•1ǯVß;CˆF“xŒ(zÛ‚«zE¨M8àØZòþk0iõ€J»‚ö­9þÉöñcDÏ*|À$ r£Ëð– Ž€¶BJÀíäkÞ€ÊbZÜ-`”Ô$EbNâYœÄðÕRÞJ2¡sP1k·Úd´®R³«Ï~|®Ã8ÆÄyïXg´ÚÈd¦Ú¶á§·Ó úPè-åæÐÚŒõ–˦žñ´Æú! ܆&HñŒ»vÜ|1¬åº"Ãæ dÉ,%S%µ+kÚÚ†,ïQuåûõŸ˜­ûñëý}5³ÅàBq/^;nID­p×iFŒq,2zn$”jåþF'­Ô* =E©µØ!>Îfû@|Pºãz/üe‘1¬ +aAØB +ñœyé~­¶ëþæÎQJ«¨©þTÖÁ$”àØØ{‘9L•¶V “H{EÛj´4Ú ¯¬B)Ù3å´íÝE²­cÊuÛ,Þ‘ÞßXYI~d[J¹—2Œ‰|—@±î®›9ÔƒwŸ>¾»Y=õîmïw¡Ûô&¼<]××èüz¡ÍøŒˆ@à{y^LKýiäG^Ûña÷øå2úý¢BŽ•—‡3eãɸ$ãSgEŸÓ&É~~ÌcøŒžÊÖðïÃ=ZÑo„ª›a<­ÇÍ<Åpë…Ì°ç@à ++u汿†¿xa¸)Öo¥SÑ8ØõOJ^¶#¬p™¢C•­¿á>¯Îšƒbà°jÐ슭>ÅÒà Á.&O6;¨7àõ.šžÅñ–òAëØ©óI;Ç4i‘ÚÓC„¾©'6­ÓýÓ b7h˜ W&6…ÃNm™ÉЉµZiã‚êû4 Ï*Å0<¢öÕTwj9ðÖ Ûeåšñ±Ì…ä$ÛS°=~§K¼Y'„í™FkÔ)ºhÃd [K¨Zô§ÝåïV uýf,Ro ª;BÚ%üCÐG„²¿ª/–ƒ%Îê«ø0¢hœEߊ, Õ`ÞÈd4Å{渞6æ~¼y¸½ÏFGYÁ_Ç$@Ñþ@4.þì‚NfI<›ÎÑ­tÏ)úûUçKçzEüÑendstream +endobj +1449 0 obj<>/XObject<<>>>>>>endobj +1450 0 obj<>stream +x+ä2T0BCs#c3…ä\.§.}7K#…4 Œ™¹…BHŠ‚žP$YÃÓSO!¤² U!?M!3¯¸$1''±$3?O3$ ¨ÏBÁТO¢¯zs=s3  -!)Ɔ #\C¸¹øÌ&âendstream +endobj +1451 0 obj<>/XObject<<>>>>/Annots 609 0 R>>endobj +1452 0 obj<>stream +xZ]oÛF}÷¯ôa‘>˜¿D©Àb‘8ÉÖEâxc/òR`AK´­$:×ÿ~ϹCÎYIQ,Ú¦=>sgî÷Ü¡ûõ$uü•º*sùÔ-6'“d‚Ÿ„?>ýód–d®œO“‰Û¸FN |‹yXƒ-9ÆDQÅðžu‰È*f\Jz ˜©,2[ÏU 3×+쌇ì,ÞE—VƒEk/DÖ§aÅáæÚ¬˜²4 ÖfÅÈzÑ’íÁ‹BcCõ$f5Ö«õÖÜ9D!âT } êFV0XŒSe3L·(«˜`ÿV0X4q¸8œ«Ø@µ²æ”£Òx™¥èzH7CæDÁ`í‚V0XT 6Ž²‚qì„Ý"²ŠiPEsƒ¬b”Ê +[Min”ŒœÉ¬ÒëÍŽ`“$~4äÍ¡"B‘Lsy+¬M +†Ê(/8#ììƒåS XÂEˆm'Ö/©,Òˆ¬`°vÍ ++ì”OCaCá ‹,²ŠÁzÓùŠÁNyyˆ¬`°pÌ\YÁ`çÏd3¶³5œkn¤‹Y01ù™#DS#t~!9ö ΄C¾ŒæÓÁ|ð+,^)²‚é~ºAdƒ…©°–ÄYÅ^ÉcY³ù$Ž˜Ç²W +,¾*Ê +‹WùÁ΂Áâþ/UV0s‚Ý ž«˜Qç.²Þ Ö„p­!<†Ì Á8^…#+lÎ6#¬`°¸Š¦Ê +‹»ã@V0XäTŽç +†AÖ#Ë‘!C>²ËØ—hŽÀáCNäìCÎ(‡AÚ&”ˆ fkŠœ@hŠ„€ëƒ bú€¾Èú¢Á½kc:o¬ÌÄ“v„LÙ‰"©˜ÛÌ• ª,vBzGV0œ‡‘IU Öž–‘õ +ãÙÂ*÷ˆ +Ü ` …#ë e½‚‘ì ð ›aÖ€±õ +ÃF{£òÍõ™µ%$Ñ¡’}hŠ¤œøÏC¨vdƒZ*‚“Œ¡ ¤b°ÈYdc`m[>œ˜œx¯föŠš™>¹-kد䙊ÁbÀ¨” ßsa­Âù°Y-çáÙÆ‚©/ÇÚÈz}íûíp;ú·æn衵îräpä±)Âmm;R0Xœ¡¬?²ðŸf|¦()‚˜2af s[Edý¶Öáy¶ißžm[Æ•:†¤¬cŒœµˆÈ >ýFÎ:Æ(gßz#'ЇÛá<Ž¡wbHÿéwÜ5ÅeçDV0ê9·ÖÛ—“ƒ?,6`öGH·r¤b°œTT1ÎÖ ²‚Áb€O•ÌÂf¢¬b°˜˜² ²™cßi‡:²ÿ6cXUã¿¿J ´Aâ”~!ÅRSÞ¾Q.BêÉçAàL< í½BÆþ›;VAEŽ'‰Gá`)àðÄ1àß™ÈEÍDÌ †7¨"¾ôT‘cóÃ=Œ¯8¨;ÜÎø§kÜíÉëë“—ïÐe'îú¿—šV3w½´_Gá'‹çÛ¾k—ûE¿j·?_ÿk‘©_{Š»:ÃêWõæ¦v‹zëÚ‡¦«ûÆ­¶î[Ý­ÚýÎ]}xí¶MÿØv_v‰»¾_íÜCÝõnÑnûzµÝaímÛmjžàð7~~»ºÛw«íÛÙÆ ÇݨÂÄZÛÇÁÍöÛªk·›fÛï¯Ê$¨ÇüŪëúfݸöÖáH.õ+QnãÊq¿"qÿÞ5«·Kwu_ÃA»fUú'·n¾5k÷û *ƒ%ßšnç¶mOKk·l70å÷ŸŸ©W&λ¦ÞaÑÅuá üyµÍ¾¸Ënµ©»'÷Æ$M³®]¯›Ž[à÷‚ÁD|ïN°ºéš¯ûÕnß~jê%œstV–¸×õâË]×î·Ë#6OxHðlß º}Wñq™À+g]ƒ!"êÅýjÛ¸ën¿ëݫŇõ°û­]m¹äl½¢“]ß:žâ÷?6 ¿H°Ýv_¯‡íÿÛœpd +&q?}ÜžâŒÓw맟þ¿Mà–Qo*ëu?Výô0$ìY»Ù@áË®Erm¼Þv]ÛYvøoŠ4xÚõÍÆ]¶ëÕbÕøÕ½]­›ãõUâ>ß×½k¡Qçî›õƒÕÖ¹»kú9b–l­×k÷¸êïÝû7¯.½~øŸ3BF9Jõæjtæ¦ÙÜ7ìŠá`1a[¦=•²æÝ5KÜ|‹/õÂÄ}Óܬj»UOŘ•ÿ¢ü§fùkÝ?k˜¬X™›Xïõ>Z€È¡<áå§vß¹—M¿xù¥»)$ÇíÑb¶:6ïÝ6Þ÷¼!}ççr ¦0+Žv·[ñÒmBG<È ®Ü ¦‚¿OûýÑp?WÒ•$xa7 W:­ð¢í}G=8„„ðà" +ãû±´69Þ>…‡bªø=ñK‡gJ[wDý½Süd(ðç¿æeí=ùÒCNÞ ÂÍý=N 3È߇ÉÃrôå; Ø6À˜©ø¤d³Øó­ÀäZMgí0 å5}{}ò¯“ÿG@jendstream +endobj +1453 0 obj<>/XObject<<>>>>>>endobj +1454 0 obj<>stream +x•XMoÛF½ûW t‰ ز-»¶[ ‡¦©’¢°Š €/+r%mLî2Ü¥ýû¾™]~håŠ$(’óñæÍ›Y~?¹¦+ü¹¦ûÝÜQQŸ|\ž\>þL‹+Z®qçîþ–%]ͯ®ðKqúûV5A·t;§¿=þW¶¤ç­j5y]t­ {ªô›®èåtíڳ巓+ºXÜÂÆ)Ó­'ëKŠJW+c_Îø©ËÇ[º¾Ž>/ó¿ñ=þÃü]UžÂVSQm©@>¨6t í¶¸˜F0#?žÚÎZc7sZn5ÂäPÃΑk‚qÖã-‰^‚ž¥x¯o¢NnÖqšñöœ¾nM±%·æ8|44‰¨Õ…6oÚ“Z¯ub´;µŸFÇ-…Öà©àHu|L¡‚Îœ›àuµžÓSPxša+ \„jŸd¶a÷´i5Ð?Œ½œ‰¿ÞﳪWªQ,õ8Á6½Z·ÃãÀÉø,Ze7úœV€ ´FD\¸ ÛIF—©>ªiZ§":(Œ[)ØÐîáÁn¸Æš`l)Ì)œ ­«*\®ö™û×sy–¯“«BYr00'&¡DÀ‹zS¦R« +åF w[—™«¤ +®:¢ªÊít9O^ws!éÓX,µ/Z³Ò4Ö~¤÷Ú´> $ä<¼©›J·’í{OY7˜ö)æª÷‰×àoλÂÕ5>)7÷ÛÆÁ®"«7Ž‘„¦62b0ÑOHMⶪŽé7ÊûkKé€ „ÞeeŠB7\K­þ²Á+˜Å©±ÁËÞ¼Õ+c“ÿ/. øAü6¡37üÓP³-³ŽL©•”)ó»0G ܱ¡C©Pêÿ'i%*wNæ ­·#ÜÍb—1úx‚º'þ9ÉqÚ_Ø=;¿z”$?tU‚ò•§×sâk\^ôúÀ/Õ ¼±){þ!©“¤fÖ¯[WXZDK‹ŸFÿO")}ubQ?Ž¢â4!!£+ý£‰jãœÚ©Úu,’‡ˆíËiç9ű@”û$f¡Õˆ:â +6Í Üâ]ïaج÷òõ¥I|JÑAlÙCmÍf‹¶®s0’Cæñ8£èÇ@ /œYÖG]*Ê®*0 qh$îtŒ0?¡ü¥Óê® + š¹¿wÚÏ’žÐLâÒjß8[r{ÓFÔeôÓÁ”3æ%râdYbFIçGHhï·QìÉdŽe'"w1õ‘gž3ëÜóP}Ñeé;Vý—Ó¯Æ~ú$*g1K-Ž®i*ž6×N&¿ç0Oë$…¾ž£cwýdHØ8èEóÞ»1åæ$^Ì°8Ó`¡Q-†Úš«¦yjˆ¡¾Î=71û¦ªÙ3âíÀdDòò‡AŒLºàåL8;ŒQ ¤Q3{‚F‚«k4"Nb;mò؇„ò{WÄa7†*ag-uƒÉÀkM\.DŒ’°×ZAÕ…@^†9k)\@Ô_‰ÛTÖŸ!è‰2`Z¬ {Ú) ’—ùÅ;‚ ÄÊòœY¦È°–²8§g‡‘ÂÃI·È«šlg„Šˆ¸¾,yÈFÍÆà‰dnû:úq @‚p9/n’=ßâ"Pˆî$ê¬ù‘wž/¶ºÎ;»@´6¯ÇŠQæ{cë’ûRšvÅaÎzºöó™Õ663ywÒ42jwhø÷RyØÃ{[ËL6ßTeÊ Ó¡ü¼­aÐö£jÂ,ŽØ-¸†_E•ñB»Ù ¥ý}?›ècL,s ‚ب!€'Ÿ$Œ³ˆ´*Ù³‹ÎÅK6”D÷˜=~}gÒ£™к«X-2ÿ[¦dÜ“/Õ^¼9q!8 /ÉMæ +ÿH¿ÎÈ׫9Äsû=°D8=bL I ü)^Ó»]k3ÏjÃË–´´ÿ}ì0Õ$= 5`t‰\FÓœ~R}Ü8 [œ™içÊöˆ•‹·!ÌG9ÅsI&É“[ÃvK±w†9׸VDAî¥hDeb{€ŒV–öaOÌ/MDöhÁå¤ú­º„à·8Âai^æAõ;:óÊîŸèFn ž¿¨}ºnbf•Û a×(mÂ@…Ñ›áÐ!mÊê1)'+˜Ì|µQ‡æh¨Â.+ÞEh*78î'¬Qã„f:÷š–•[H—¹h“ôOZ3noŒ)3ŠO7bñ°è@PÂk\…Çãuæ˜ js„XÎÇ\ár]ØyƒÝéA@þâ1]9®Îg2>ˆsýÿãx/CmÀ)ÒNˆ™…jìù 3Gß ´xÇwM亶E»—ƒ¿”·ÒúÚŸ1cî©!d0)ÂQŸ+2×3±öª÷É%R^‘4a3ê5®úB +RPèY='q«ÞŸoêÆ`[‹µfçìóòñaü:rs=ço2ÿóSLÂ9~GÙŸ~~¹½¿ßß=Ä“ÎÍ ûücyò×É¿[X,^endstream +endobj +1455 0 obj<>/XObject<<>>>>>>endobj +1456 0 obj<>stream +x…TAnÛ0¼ëŸ Q$[µÜCIÛ=¤ha½äBK”ÅT"’Š«ßw(Û-b¤( ¹»3;;ëç(EÂ_Š|å +e%q‚wy¯­s~/x¬DÝÑõ}†4EQ3eµÎQT`x’ (çR—vì½2R‹m++x7ô½±¾Qµ~°òBWÍ€F¼ÈÕ ¥=œì…^ÂuÛ^8·¯P«Vb¯|ƒÍÃÝEñ%¸J—ñ‚ðsçG>± 9¥[¹Ÿ=ˆ9‘2;+úF•¢mG¨®7Î)2 ÐÞ +íÚX[ÓaÐê^ 1î?ÐŒb[­oÌ°kØ­¤d‚Ç™Ž•…²vD&h'´ØÉNjW6üpØŽØ“Þ”¿7(ÍÐVØJü”½?k™2¹Q—ññz±Š³ ÄÌÉr°Ê¸¡ˆöEÚ:ÉæÈFxlD·d˜¯Ñ*R8¾ªI+;h­ôD˜ ¬ÎTr†íà!J?LêÉØÔõ-¾B ì\{ +=ùÀÊçAºœÐ&¨òªðfŒ"˜#+ËÒ‚6¨**ˆ–µ¢“>džf{|¨‚›Ù¡ÑÞÐKS‡ÄcUÖ8£õ–ºü;%™p'æ“‚ocû'?”®ÌÞáKqÃe°‚Å,4…y‘ôB)ú°#Ôñ óž¶fñõýú¸séŠû¸^"]äÜNŽ|sûpw‹¯Ö<ÉÒã£)‡àªIûÀóê”p•'ïCü‡FôEã{oXÃM3ÙôäV’ç5[:èäÀÉKT&,êãE(žåYœ¯Öü#`áe®>Ñ·è7Fo+endstream +endobj +1457 0 obj<>/XObject<>>>/Annots 618 0 R>>endobj +1458 0 obj<>stream +x¥WÙnÛF}×W\ä¥6`EŠÚúæ%n&Îb¥éƒb4I“fHZÑß÷ÜR› MDEÎ]Ï9÷òk/¢>þE4Ži0"•÷ú¢_¶ëM"Óp”ˆ å ø®2zèŃHDÛ»ñ$>¼»wÓ ‹éÞYx¡ápˆÏd2ÆgŒÿNÓ¢÷•ðd"ã/Œ&Ó¾!À‹»(¡Kzñ(CJúc|ÂúhÄ–üG6MDBƒi"¸›Ä‰µW|wÿw“ž +Ïú»{׸;š"€ÝÝ«YïâvJqŸf 9Oh–úšáur½’e­ =È|.IV$é~–uôÙñ½w&—ns:ûÒëÓyœàüÉÍ¥)èÚµ³Y¦ße?Ñ8ø9$¨žŠHÀ„vúkc*Skú¨ejŠe8‘Pµ'â1’Ɖ+½°¨ìÆ6¤`ßF¥ý‚Ïze*R!ì3*3-+M¹|ÒT58V¯díÏJ\(›ÃV-癦µ©Wlpa–ƒšËʨ6«h¢]˜LWTi÷l¾À]•ÏŸ"Y¤´²kª-éÂ[ä_dš›ÂT\ÂRVÕÚº·•Û”µ±ðe4[é +ëµ……Ò¨êÈs÷uJC–šB…x_¡“.’Ç“áãéaõNP€¢”Kí£¬Wš^ïbhkEvj÷û»Ï³whÚ¦8HlöÎwy(bAWR=-mŠ4<7jã‰c÷#b*úßê˦^Y÷KE÷¶Ö¿G8ã¾¥V5¹.jÂwÉí™›BúJ!ºùlRø+ +[ÀÊ«H¸¡÷7×äÃ~ÅV®_Ü‚ö¹ûˆæQy{ùáâ¶èwçÞ‡ª)µ«tŠÏ7¡¶Ð>ÿóm:c1 éü‰gQžŠ B)+§ì8¶•LQ}·D")YʹÉLm¸×–¤ª£@¥Ô®Qš%`~Ë©6⣤v¬¢Ç¤þx*@Ed³-ˆèŸÑÍFN%Z“zW([S(pFƒtK Ÿ@¦òžÿóªÞdúÈmª—Ù%'½p6?:åÁÕŠû^•4³btsC]m˜f›:3@5ÊŠ + :UPæÈï>'C†^ƒ¸ ;”Ýi”t%Ÿ‘9iOÌâp‚Ëìdrá0`íÈíÅbäItkO ¯Þza¹hYf×@Ê.‰6/ÏÏO÷wý}wÿ0»|óF¬ê<ûŽ9…¨9//–e¬•#¸QÖ9ð1ÛÐ<è«´f¥t‰ˆV8²´6ø*XA£½¢Â­By]`!€-ª÷˜2CBN\’ƒä©ZÙ&K}IÙ(PíÙ‹{0— ÊGàx¨‹BU`%õ×ñð@B˜“ÐO”'Õµ4ÖùF­Ï~xtrzv¬€g¤k%„ ß1öÁ×3¯¼º%ÄdÝ«PÇܪÔÊ`çò[Ø®,ì2o]ÃÔÆ[‚ÒÉõÞ"åBã½ ì3X ”.ÃN…3k“e@g¼‡N¿Ù`uMÉÜGŒ±þbEP¸¸ì½W Åx0äéûã/{/#HƉ&¡Ñƒ!ÿôzÖûÐûu<¼>endstream +endobj +1459 0 obj<>/XObject<<>>>>/Annots 665 0 R>>endobj +1460 0 obj<>stream +x•WÉrÛF½ë+ú’ +­2A,@ÆåJÉ‹l")/)ˇ!0ac30­|}^÷¸Ä©P%=½ïƒïg¹øó(ò))ÎÏ\Ç¥p6w¦4Exöñ_kZ1¤»¯O΂yà\PèOA’ÓÔ;Q et6„½oˆÀÀFSg6ÀŠž‹³œ|þ `±¾ç„tÌ``N³?èq~Šœ"×ñéB€n:¿ÀaN!«³@›ME¦çÎàÏT "tî1£=.ôÅP1f*@ \j +°ÃsV”“ç ±P /z…=.Ä‹ˆIv8αCd<üX ÇEóžÏ Ç¡åãˆúìpÞÜ:8eµèq3.6Úž=.òz}ž=ηÎ[™ô8/²|œAO€ç²­ž;’ˉŸ3·<3F\Aà%ÒЃˆ1À¨7‹³ÉÕœ¼ˆ+4Aˆ(Ïh‘H‘»´ˆGNàÐÛ²X¥›:-ɬ5Ý«|©è]™«´`¤©Ë,Óõ‹ÅWH›Â^+m,•·HF ð¬Òº1Ô]˜âZ+ÃâmËú?Y¡wïÞRÚ)iS$,ªHDg¥j•kƒ#*t¬›FÕÏ,©É—N ûº¦mšel„Kc”GFEiH£óÊ°ÐZõ*c»Ù‘еF‹+h^ëgRxÎK|™µ¢¿o”ÑÙ3ÅåèVÌürÊUq ¸RÚ¡«²Oñ¤‹T±~y¤U=iZj]P–ß x›šµ©ØlTÖkHt×ieÒ²pZU>×|üȦ#hª ýCåU¦É¦SMR1êì´Ç]†F´‚yP$‰?!ú¿u¬ó.‰< åócV.Uö¥U.ÓÇ„Ï+z£š4¦F×~ ‹l˜RfÕ¸#.´Y¦%2ˆT2vD¯[SQ®¬otwûáöЂŽ›+å±.7ÕiÖ›ËO7×—{Ìc«^¾w¶n‘·u¹Év½M9%¶˜¹Ú²2Fàs…Z­iY—[¸ÅR÷]™~ÒRoìF8e®<ÖPVÕz¥k.+ª3úYK`”­îÿ"Úu 줟ŽÑ²æy—zå4áá°Å¾øáű‹I§Œùøù¤6”wý\¸[©¦Aª·zîû&­u® c ŽËìX[+ gïÔ¶;©µÙTUY›.}YùX'ê®pæŒýLîVÆFcx HĪº\¥™n~?¶]Ãr³îŒ~Àç—›‡‡Ž Іq'½°Ú¸ƒEÓ¯ ­Ë\S‚¨ÅÐy„²´Dm妆… jȶá’ÇÖ¦à,(ó¯v&uú´k¿ÒðIÖ6`è ö½êISé8]Á`zÔ…®1¬8;»lú³L¼<ìëY# ‰ZgXççïnïÏÏ%¼<Ãyð~Æ$É_ÐË(36u¿?‡z;Gä̉ó„2ñj°VD¤ÛFø`Ç ‚ÕÛqlÁ°&›¦žHO^ž“,]N:˜u «1¡²Èž;³'Æ}­±2)ƒã)Z•ä©¬¤É•kGë‘¿½—\ä¼öÊüÀªÏ]%ËØõž§Ø¯èÈ VΤ0-Ó¬#‹ò€Bî(fÕ|ë¢à†®{@Õ7Èad û«HçzÈsya7½Œ¦ËÛ²\QU¦…‘{® +kl³¿±Rí’WK,}ÞârBM¶/ ãn¿?1ýdÖ¢#u¡–™Nìe@n‰6*Í$¾åšN¸¬Óæ%†%–N:OÛkÌû›·Ÿþº[\ßÞ8k“gr˜\Åí~GÎÌ£îÊóà‡Q»Ug-‡—…Ù<ÀýŽoýÂýåo.é®.¿bÂà&ox<‹o¬yì…xñ™4Ž\ìåä_ùm& +g¸R‚9YæûÅÙŸgÿV®³Àendstream +endobj +1461 0 obj<>/XObject<<>>>>/Annots 670 0 R>>endobj +1462 0 obj<>stream +xWÙnG|×W4”¦qyŠ¤ò&Éqı1ÈCÃÝ¡¸öî =3+šùúTÏÁcMÙA`[Ö^}TWW÷|8P4ÒhBy}ÖÏú¸³ûñÛ÷gãá0Ò¤?ÉfTÓøj–õãUE÷ü>]]² ž §ÙU¼àG—5]]e×Ïüg³LŽgS˜⟑´ôö×ÓOÜÎÏz¯Æ4Ð|ɱNfSš>Ô>ÍóÎ|%ÉJó$ Õud›õZG…®E©¨ÒZYª Aów0†¼½±ÎŸJ:ÿü¯ð yé] #ÃÍ<¾ÝElŒÚ¼è< 'Óh+}âv# †Ú1-$9„Cª…uˆvaô‚Ô¦À/KmèR¸MyUJåÈi$ ¾i +¤Ã±õiçðå]Fo+)¬šK؇ìñI˜R7–~‘n£Í{ºeŸ¥zD(ySÃp¥V!¯šB´)Ý +––ŠÒ:S.ÿ‘µÒ‰²²Ù)Œ†“lü LÝá,\S÷jˆB¨K÷¢^ð`ˆ˜¤%¥é%§ (×õº’H¾äÿ÷áê%=ݬ©ë5g³@zRªz¿Ìà ¾î­ÈWåÇôô¡ãsEºFŠªÚÒ‡¦„;ï·dØ R~\WL%ü`“Ë®E...i«¾ÕTÅ1ð¡Ô-×¢¨a#„nëE–kµ¤µ0¢F’¡þ¥Öu¨ +ÒÌ—ã Ï_:ß° {NÖm+I"Ïu£\*Ã5 ÐK´;‡\eãŒî’•×"_•JÒÜp§Üį}sü¤KÅŽî<ñ,òŽÁûÁÓ)jž˜ghø‰¯& +8ï †GÀWÄ:§[n%ßolÀX4°¯œ+èŸÌ=tŒÀsÐz%¸øÊ<\ìcL}Ç1>…VÉèÇ=)1°Óhøíeà8ü¿Wz‹àùèÖp!"0Ùy‚ zóka-Z©IñM +ð8_‘;†xß+I…B)oqüÚ@ò@²ºQœ0w`l¼CˆÚûN+gtUI“Ñœ»Ó#ê •nKK„M‚«k#ŸX8S£TmÊq +tçÇ‚t, ·?¾¹'ÅK£ëaßERp"Q¼XHÑ ÌSZ¦JzÈué~ÇBÛì°)ùãaƒ&Ô×—¿å2z„¨½$(ÑÎÒõÇB³bdôƒT¹¼DE’€îÞa¬@aAQIµ¬¸ÒË–g‘²XÈ\ *yˆDIZkk9×gJÏHÍ­ µ+^éVÝw°ŸÔè@*o‹q7»|Þ¾¼CÓkƒx$šlWÐ#œX¢¸V „ßä#Ëø6£›Ø0sI+½a@.£Á_0¿É„q( ]‚”˜(ß² Ìæn’þä.² z*R|ž|~°1÷a‡‰C? õšÛHBÀw@WÈú¡ƒ¶1àvµeoû1~Ð'UÿYÞHÕy¸à¾IÚƒ¢XSØf—Á’VŒ`;€“ƒ.ÉγûÀŽ\#v»ÖªàÆñ3h‡Û®!<~|=JÇ)vzÒ当©eæUãÛßH¿XˆIU ʧ2®l®{”’Avý|‘í½èyoüM)möp"<ÞŽ>Hšü£ë0+P(¶,ÂfB±õ:ã9-Ÿ° liD‡¤VÝj¿¾ì +²>¼w´Ø¢qUq²Ìÿmç;£º`NwYmÏBÚÓîdR^ɇáγ9pQe”°ËpЕPlÜN“"ÇbªÊ÷ƒÐxv`­L£b?øø#yIÅ›V•.PWn”–³Ï`X‹-¶¯]И8©ÀqíKTmO›Úã °Â`w\BIâ¢È',Š¼Ç 2Š¿ó ¤CøõÉ&°3 €ò©Á/æËÒð1ÁÉ5ËQ +0–Œ§ÚsÚêzü~¬Á'ÍÝ0)ü…ÀvGç[-NúŠ€ µ­áÕ=¸Jgz*×›ãl;8O:’úB^ÙÌ ¿o„!6/Å{&ÂÇkn+ä؉JnŽÔ +óüˆºÏRÆ›ˆÂŠ,xE÷û ŸKÕ|¤N#ÅÑ:æøH¸ŒÖî«vf½Æšž]” +¿HÙti€í¡[P¯O=Õ@çºyÄt” 9O†íê=¯6~ë½ÚcÖµÔc»KQÙxÌK_ôX4ó7›hÅöu¸Ned~Åñd&A¹©[µCý²‹C +Go}s{ÿ’ì$®1ˆý!æ¢xyx‘¯Øù ÂA®Â®K0‹X &8„ÏF4™Æþþæõí ½5úÌöýƒS"§ÜMt§ýëÔ—ÿó|áãÛŸ(ÆÓq6Ì {4eoßÍÏ~=ûl|3endstream +endobj +1463 0 obj<>/XObject<>>>/Annots 675 0 R>>endobj +1464 0 obj<>stream +xWkÚFý¾¿âv“*¤Z i+e“¦MÕ$M–(ªšªì&±gˆÇ^–þúž;0䡪B <û<÷Üëg)õñIi2 á˜²ò¬Ÿô±²ÿyý3¯Ðh2ITÒxœŒÃCA×g)åu'‚ÿ¤É”†“)þARïYzIO ½rÓq’Òh:´¾•¤åÙp4Åßt:J&>tÒýKo?cW'á¬Ûm=—4JGɃÖ.='—§¯æg½§P™Ò| »ÇÓ ÍsçoŸæY§2¦¾sþ‡.áeë°–º‚ÎýÖ0n•"[+-ÿÖ¢”'·îýßþlÖÇç­©>ØZÔÊèc)}ê¦C„lžw¾"oÖËåMO7E1ëÙ…Ò=m +³R:˜4Ú»ÔŒ“ ›¯%yMÑßNOÖYÙæ~'^ëÔuµ£­* +*”­©Æí`±{تׄÜ='±ÙHËü‚¶Fß«i-n$¶œ`Sñ2‹áUÖÒòO;@v-ñ+tNÚÐÚ@x®*™Õ¦Ú%ôÔT$oE¹)XfÛ„œîåf³Ù݃ڦȃZýŸlâ½-Ô G•Å8=ð°èF>†NßÝÙí첉oÈ<äKeè‡ÝvÊ8cKQØ“w˜4s²-̼® >¿ ?^2…¦¤w”K›UjS+¤Âåk‰8r³BÁÛ R‰L.èJXYâù±)7M-«Ä{5¶Bô)zÅš׋• ÀXÕ Y_={yíõ›eK=Õ†½7¨–œøxnJ¡tBsü¬N°G°Å[_Q¯E¹ÚÔ`™Ì¬´úǧ™„mAª®`ú‰R‘e¦Ñµ‹ŠË‡Á ³…ÅÂWEfªJÚѹÒ+z£Õ-…k@¤…›RSVIQs°ŸZÞÖdk¹!eÙ ¿é¶¼¹ñ:Rvb_÷ ¤Ìèáb¼ºE u?h³Õ„ÅZ‰b_+α½M±*9ÎÐ “-©±AšAd¼l¹ðtñ®3}wß;À 3eÉU ¯íš-YËJîk)rìž>K®{ ̯Ý2TÀW6ªo¥gËz¿X;{nŽ7;.ˆa€ø={„\È×ÏžP€°–ÛxtUDr%µ¬8Ë'9[V¦t)zsñeÌ„Œ± ’A?+òõ±T£¡ð­Ò¹Ù"ÖsúýÉãøèüZV7²"X)V²:Gˆ!¬šƒpUÚmÁr»VÙÚ%–#Û×\ä wõp0DEˆä{öq]([ ½’nùÄX<´3Mï@ÙMSpöhRHhX¡69¼` áöUÑŠ:wÓ]l”åNÛf¸„¹h)Í×5rèBËé)²²¤-w\÷µS2MM‚õ´£Wˆjÿ媒8±D&`¶Ò`ŸÒ'ì‘m`3›Ð¦ñÝÖ‘ÛVT`ñoXlï)†.LK 6 w8H¦C7Í\&£dÐùKÝ…oݧÅîœs’0±Þç~z¢91=òÔk½ØX«\å<¢¹iÆ‚ÍA7ï:L:Lí?Ï!ïîÓVìŽpùYZ³U-Ed­(¯ËÐ5\È>aà6_—LuZJè$ÎQ]BôgÛ[ÈrœÊ®•Î$I¸´~ÖRx‡zC›d¾Ì (_¥ÜíES££Ö*ãRjãd¹/XFÙQÏ‚Ýõì`›ÍÓBþ‚å½ ˆúR­]È yî‘ãç2˜=W¦Û8s¶ªTŸ°¨ã wBc:ÐoÜÎtP4 vxø•8 ~LWnÈ>/XObject<<>>>>>>endobj +1466 0 obj<>stream x­WÛnÛF}÷WLV ‹Ö]r -´°åP€¦)¬"( —¹’6&w•]ÒŠþ¾gv¹²ÄØE Ä7Èär.gÎœ~=ëRß]÷¨?¢´8ë$ê‡É„“1>÷ðk%­ÎnçgW÷×ÔÐ|…GF|ÈÇ;š§­Q2Hú }0J+½¦r#iš+©K*ÿïÎBé·ó/03 n7˜i÷Æ0ÓšãøÖšTf;3–¾Ô†¥'f2o†ž„UÒÑN•oýIZ§Œ&³¢ÏJgfç’àjT»Bví‚doõ ê!ö6R{Ó•“–d.ÓÒq.˜¿þ— Õeô͹[œçL„&‘¦¦Bg´ÎíŒÍØq‡ÚÝ~Òã˜Ê(I9<©žT.×2;q$tC¢X -Y ]iE©žäÁÁ¢¥™\’ˆÇjÇÞúF¸†SkLùìÑäÂH¨.ÞRQ¹’–’PLi×ñÍVrxl§òœVBå¤Vœ1TZØ=1z ¯ d»Fð:!_þY¹ÁÍxÎmL•g“žNÀ[­VˆF8Ü"ú¦3çLªD‰¸ùÎÕ=Øî¹×º’ezå÷µxfe‹3µûK‰“ieU¹Ggt U…‹dâØtž}rÏ |Æð•2 æ’À†«Ôî·C~š ƒ,˺‡É’­"Ý(-©´\¢¯ç‹·B™dŠl£Û¶½Ê‘­iÖ©Úfþ*ª`=Ç3Ùžä7Ð.vWZƒÙ'“.uûžÊ‹Þh\ƒ»ÏßnwÃ@öØ€ç¡&QŽq_ÉàÅ -¡+‘û }gê§V* Ôœ‚khE!u8üMjYÑ¢—´¬Jt4i4Gº‘é£/èÒ|£ó©Ç í5EWhº©;¬…;/OÉ9Í88¿ç¥‡‘«ür‚xsª‡“APkI¨)éø¯°Á*ìµúÿ ôXä~lõht·W]/?3dšii „Ü@‘^¬ï%qoª d®Únóý³Dž(iÃU” ƒ ê2[¼­gKƒýÝ ¦&¤üˆÿ˜—˜o+¨Å$é^C퇵ܒaÂ$* Ÿ¬Yæ²`9Èè½µÆz¾ºÝãg×8±ñ¥™™J§y•AúéâÍþÇHfqbì¬#Áº¡‹ãƒþÙE«ÜoÑ0h#~hÊÿ"” bÇa&‡¨Äv+u&³„î­”·wl™›¡s©™Ë!Bù`‹\N7¢Ã8zèImwáZ,P‹;SfðyŒÈ0EÃ2c ýa£w>´Û˜¼Ž;€­ ífâçê ù\oX| a3•V_+Iñ’3»£ŸBT§Ì¾î…½éˆØ‘šµ°w†‘k?¢1®Ïÿ†846‚—JÖ’†“­0Á×96Û/Y¡Ç½xrÚ^ÕEî{ã˜C¾Ÿ´ÖW¹JQ5Þ -y¶ò¨b1QÙïbÏ(¾øÜ/§ãó´.'¬—6žÓŽ×{§r i쬓´Â:èëo«ÒÉœ¥¬;?*ß`‹–LÖ jˆžÊ(Ú(Ñ%ð-ÈmjºhÀÙ§é\>Yä>ÝMÃN°2ynvœ{ -åa缶5\ZY°ŽB -HË’ 8;*ž{0Š -q„ÑôÝbñyöñã|±ø5z&=ÌyÒýLWëÈÀ}eÁm‹î;ÿ€[o½ƒ@ -Y,AYð]º¶¦Ú^ä°Fs8V#/IØøB T#_®"Ã_8­¥ÈHeRG¾éW[OkžçV=±–o¿Vx» ’÷¼¡&ÎãHËó¿áMžl$,ã…(yØ!îKì˜KläXßQf–Xã•éåaW©×{r8 ];g(¼®òèðNs³ö©&‹ÖS²Ó½¾ÅXÃW(ÚiÿãïdªMjëö1ñ®û4Õ®n~¿½áyö]Nw&­°t•~ c»í“>µÇk¶ù?^ãA2Mðæ‰çú×lîýüìϳ({ Øendstream -endobj -1462 0 obj<>/XObject<<>>>>>>endobj -1463 0 obj<>stream -xWkO9ýί¸ªZ5•ÂäÑlø²‚RvQU`!­©òÌ8‰ËÌ8µ=„üû=×öt(«RU„Éø>Ï9÷úÇÁ€úø7 É>Ž)+ú þì÷“!¦|â¿‘´88ôÎG4ÐlÁšå„÷û}še ú®U%sr+I¹.…ªÈÖY&­]ÔE±¥´v$Nª×K#rU-ÉiTÉ >Jc•®H/¼…[Q¦‚2Kº ¥tüðÃìûÁaŸÞ,ï”°-–²Kofði·ÖÉ’2QQ¥zI[]LÎ;Ÿdpt:ÿÐ¥ëB -+É™-|/9Lmਲuáø„‰–ØÛž3‘—ªRÖá´yC›•¬H8x\»˜ <ê*i‚Ž“9[)K:Ëjcá½úÜ^œ‘…9T aðÉÞ9ÊïKÜYõ(œìÝ_Ý|ùëæêî:Áëᦠ‚íl%ª¥Ì:GòI”ëBv[Ás!Œ,õ#òF©ª$ªï•xdœ HŒréÿº¢ ],žÑY[OÔ #½óáËΈ<'xƒdF­G¶Ó¼ -äV§# š¾S\bß¹® fsÂ8f›p¤­Dè×F›pµU°ÏЇlpÄjc º††óa¤Ðœn*vR)(ú(AµKØ“Õ—)â ø5 -H*EU{:ǸåB¸q)S3Ð<=…Š­÷¹¯½_Åø¢FŠ,0ÞçÀn ‘~Ô¯4ˆuª³Ön ¬KliU(Œt×Ñ"àKÖ@4ôò/sQ%(5s-àJÆÞïy«*”ÛvQŽ‡¶¿]fœPã¡¥ô‚g A.¥;½¸º%ÿÝt(ß¿}OPB¯S `­NI÷¤ áù7>ý–¢¦ -%ËBÊ"«‰:¥Æ{Òe½X.ïç&t«æZj ‚V}‹Œ\C•}ñœÏ>¨ -‹›­Ó -³¶öÁÂ}Ðivêj@´ŸEúrFQ½ÝÀÔ–GOŠHç„Z¨eLbž{10^|ªÑ6gG‰Ë"q'Ét@ƒ£)Ùùp<‰´‘\ÿõáp0ÛB”Á8³¹-ج…¼ƒ„üÎÂÚâ%^ÐålÔ»~ñ´³üÒU7.#âY,Eª±×”ÛVÚ bRɸ˕e -¼ß) -ó©!ñë²'èúä+†J=ÖKæLˆw˜ðèÄ„8ø/,(ô„·ð7ÀtFM+8»ÅÒ¢K3,V€Y]!à8HÈ®Ðì,*à PÊ2eQôÝ·lœ!•Ê,¬º(ôɶ|IcxZUq³Â‚‘ ìÇÄÎS ¹äOIvŒOßbÕæáx:ÿÀyÓÝå—Ë«ûKú|ssuã'ä9n¹yDzý.>ljz‚‰ªL ’Œ«Á'?/8>}B]Á]6Ð;ÿi!Š\;”´ó±ka§‹Z ú~›Ò‹jŽµ¨½€ùu‘E2(+ó::~VÖ&ê ^Hs.í¡~`9`¦ÃÉó` îw™9 µlÆGH mè#¯ƒ‚î±êé…TÒWå`0¡Au»òòŠS¼TMãàŒq³ž~¤ñ$^doO¾žžp¸ßù¾r¦³šóó¹sÀ‡ÍÃIÔÊ;¿UáÑd”LÆSð'F}6ôyvðÏÁÛm´endstream -endobj -1464 0 obj<>/XObject<<>>>>/Annots 635 0 R>>endobj -1465 0 obj<>stream -x¥XÛrÛ8}×Wô›”)›uW^¶r±g\;™H™d·ø‘„1 h Ò²þ~N$M1©¹Ô&eÙ$.Ý8}útCÿë…4ÂÿcšÌ)Îz£`„7ÍÇçŸ{óE°¤ùrŒ(£p2&ÕSJë^û£óÕåhë£ËE°j¯m=g4Ï‚Yk´ýŒÑɼñ‚í¶Ÿ1º ƒE{m룫U¶G[ÏMÂY0o†“`Lát -{MçKœÛ?¹óΖxŽf˜ƒÑɤyâQàF«Y0¥)Ž6¢1~rI»ÞÛMox;¥0¤ÍpÏ— Ú$åmâAqt:¨BÒQeNwÙ1•™Ô…Ò{ú”›J¥%¡údR+<(M_•NÌÉÒƦ0$ž„JÅ6…½Üdt¯âÜX³+‚W›ß{#ºÏá×&ü"á’À5þHU(£EJ‰,°ƒ}Íó‡·óÊ[°¢Yúõ -[SmãΧ3Ý`#“ÿ˯~9k³xc(Î¥À!MN“ÉOº–.b£wjMz¹Ë€Î¦¤¬´•VÃ…C¯eþ°.Ì_ù…³zOÂ^l+ϲ»'¤,¿¿@.îHé8-™ÐI‡–¡mYø-jh¤MÁ¾šüÑ‚qì hs`¼Âwé)WàÀì×õÆ–ªðQl@¢ëÇ{“ 0ÂAv|çÄm™´üŠDZL¹?8 k­f×b¡iëðº€GL¦ó\wÎ=ôѸ⃜Tš:hNÀ¥A‘ðÔÝÊXÔaÌå^Ù"?Ó£<Ã'ñÝñQeA[F~ð&øS"C@%Ð/æ$Aƒ+7ìÅñÿ’$Î¥¼ÔtÇ£JÏ$µƒƒàbÖ:(Ç$ ÿ€qZâ´̆¥-B]Ql²Ìè@$Yr—¬•'¥uñƒ¹ݹàƒýOR+¤=†Ž Ÿ¡8Þ§åßO¼ù£"è+ñë(r–¢Hé]×­šó¦%Ø*-‡PjÌ#í@4 dTjÈŽ…3)bŽ7ùIYYËI--Rk°êà>•ËbpfN÷*I¤î× kÚÀvÍ@äPYNVØç|á=/s‘Ýež©XÒ'?Ò„¢Ë"s!^9×_öìà‘ èæ¹ÈEì¡õ–¶I¨Ù°ÞÊF´€LŸ;H‚è ÜqûU¾½¬~(¦ö8˜ñüƒ¥ÎËÊǘ §l¢-DüecH+a­‰°Ác•1o¢c ³ÐÄw+Izh0YX:É4­ˆÙÑÅåh¬U\kÀT!ÁŠÉF;)ZdR}Üí¹ÕÂ%ÇI-@Ç3™]{¡g@Í–šfo ` v¯ §&v‚ËTqBͶÿ+sCo’LiV?þo(R«6ÂÚáÊám\ÕŽk´=!…«%Íh<_T™V«¿¾‡!:ÌxÍõ ¥‰i„¸S 9¸5ýï´“Swò}nÊc ÜÑKqRFŒ7|vj @ÌiÍ„Îô"ƇçÉKz÷IãÉZkVK;¢¨0&µQ”Kû¨Š(Ò(úŒWUÂÖá98P9ziÚ—/ï_œ:ÑÚž;LIL Š\c8~äNæÒ«ÛVƒïuŠ¶/vŽ*,Ò{®oÌ—­‘cŒÊªžÈJÔ×]uü#lY ÕqåÒù€¾hÀ[”¹bP¸öBìYì8£aDW–s…LÄ…×NáP¿¬FÇc?‡ÿª¡&â»NøØLå’«$ÌåNY²å~/-þ@Ž¸£[—ÈÑMTòÚ­¨ÈàÇeÇêx„¹6qõìD¦ò!E‚pêìs±Ý"s]ÍÊ"ºíœïßåBȽïŸen®Å4'΂;>õ¿@ëè^h±—yß´Ï"ÞzÉ·ûã&IÖЉ}&\:\Üf£* ë½nšßv°Ú€ý»Þ ±)è7%OÒѳŬ¿ðïz< VÐÞÆÁw¬&ä»——ÚãPäÈÐ'&3îK´+Ž¯‡C|YsB¿6\ãN”ªíð~ýáöîÃÍzøpóíË:¸ùvSÑ¡ÎW¿¾c]FúOèõCš»[WSŠ:仼´Ñ“|Ÿ—û(ëÏ¿m>~üÐœ¦…³¯fK¾Õ^fðŠBÜFw¨LË \áW¸òm,rW>_z2=‚ÔÚçu§´qš,pÆÞÀ­ºafBŸqÍ,óy‚*¡7yæùßà€·.z<Ä“p“I¹Z°BÙ+ú|û®ïノ‰K¾»õMÃÔ*n˜ç.qÆš¯o¬Vd[ñ’³œªèµqÙÕÐ3íIÐýàFz€Qçë^j™ãV¼¾‹DYa]Æ}QTݾp×Ö_Œ–øJdá€]¿¹û†ïì¿£¦÷m—9à×õôëÅhÅ`ý §‹i°˜/} -OCÞæfÓûµ÷«O\endstream -endobj -1466 0 obj<>/XObject<<>>>>/Annots 640 0 R>>endobj -1467 0 obj<>stream -x¥X]oÛF}÷¯¸/…œB¢>#Ù}Y8qÒ5'ÝJ»A½ŒÈ!519Ãr†VŒÝþ÷ž;CR4Ý<‹ ²ÅûyιwüÇÅœfø7§Í‚–kŠ‹‹Y4Õîã·Ÿ/›M´¢åÕŸ~.»o9m/–¯Ñk¼{-pwµ^Eëæß}³»˜¾_Ñ|N»~ÖWÚ%ÞüŒvñå¡2'«t½Ú}ÁƒëæAD2Y¬áf—\~> -G¢’dM!)Q"ÓÆ:[rÆä–î(šj+ñy¨3rG€Pº7Z9¼  ?ˆˆPôÂhàôYþ–Þg»·<Â@·ª³úöv„ŒØûÙ'&7˜‚”AŽßÞ¶ŒDG¶ø: -ãhPÄ^‡Bp0 á±GU²®¤ü¶×gFšÈU…·Õ„~"äìgJ 1±ÈYE'Úe¢ÌÛ"J®†/TEV©ˆy ò‚P(צ¶@}"1ßüí *Ù~™0ËÍ ?£¡>|Xó½àà÷Ö9ºÊš‹½¥‚„0ç&9O–ff93‘ÄÐã®õþ‘?[`9¢7½ïh¾œ-”Ãü—"ì-§JAš›²¹Ø$8€#Ùzöؾ‰®æ~á¼ -|éØóyAôL–×k¾ÿOLÓÄ`kÑ0úø#ž)P2ä÷ù<ýˆGb‡©ë¯œû·7¿»€4®g“Cg“ÛÚLThö5j Úu Ö³Ú8Y6ëQjxø³.¸ —ÅEh"ýg…]>/XObject<<>>>>/Annots 657 0 R>>endobj -1469 0 obj<>stream +´°åP€¦)¬"( —¹’6&w•]ÒŠþ¾gv¹²ÄØE Ä7Èär.gÎœ~=ëRß]÷¨?¢´8ë$ê‡É„“1>÷ðk%­ÎnçgW÷×ÔÐ|…GF|ÈÇ;š§­a2Hú }0J+½¦r#iš+©K*ÿïÎBé·ó/03 n7˜i÷Æ0ÓšãøÖšTf;3–¾Ô†¥'f2o†ž„UÒÑN•oýIZ§Œ&³¢ÏJgfç’àjT»BvíÞ(á [õ ê!ö6R{Ó•“–d.ÓÒq.˜¿þ— Õeô͹[œçL„&‘¦¦Bg´ÎíŒÍØq‡ÚÝ~Òã˜Ê(I9<©žT.×2;q$tC¢X +Y ]iE©žäÁÁ¢¥™\’ˆÇjÇÞúF¸†SkLùìÑäÂH¨.ÞRQ¹’–’PLi×ñÍVrxl§òœVBå¤Vœ1TZØ=1z ¯ d»Fð:!_þY¹ÁÍxÎmL•g“žNÀ[­VˆF8Ü"ú¦3çLªD‰¸ùÎÕ=Øî¹×º’ezå÷µxfe‹3µûK‰“ieU¹Ggt ê¹Ä¡;é<ùåž ø á+UL% O©Ýo=„ü4óI–u 5r9äZ;)DºQZRi¹B5\Ío…*ÇÉ0"F·l{•#YÓ,SµÍü!TÁzŽg²=Éo`]l®´Æ²=N&]êö=“½Ñ¸Æ:6Ÿ¿Ýî†ë±ÿ>ÎCI¢´p_ÉàÅ +¡+‘û {gʧV* Ìœ‚kHE!u(üKjUÑ¢—´¬J44iôFº‘é£/èÒ|£ó©Ç Ý5E{W躩¬Ö„;¯NÉ9Í8p8¿§¥‡‘«ür‚xs*‡“AOkE¨)éø¯°Á*ìµúÿ ôXã~lõ ht·W]/?2dšii „Ü@‘^,ïqoª d®Únóý³Bž)»bFUŽ´ãaD]f‹·õliп;ÁÔ„”5æ%æÛ +r1Iº×°;¬å~˜ fQíüdÍ2—ëAFï­5ÖëôÕ}l?»ÆɈÏ@)ÍÔT:Í« ÒOo.ð>D†0ëckuÖ ]ôÏ.Zå~‹ŽAAðCWþ¡l;39D%¶[©3™%to¥¼}¸k”rÑâ” *j wÉí] ~C ;£/бáüöÓþ/žR–¹e8ÛƒÊ#ÕhÔ»nPÔpmEqè®BceÁ: +% -Kn€àì¨xî]) +ÄHÓw‹ÅçÙÇóÅâ×pè™ô0çI÷3]5®#÷•·-ºïtþ{,½õ (d±e¡?ÂwéÚšj{”ÃÍýáXŒ¼"a[à P|¹Œ _|ßX´–"#•Iù¦ßl=­yžXõÄZB»ýZáí2HÞð†š8SHŒ -sÌÿ†K4yf°‘°Š¢ä5b‡¸/±b.±c{Gi˜Zb7¦—gM\¥^ïÉá$t휡ðºÊ“Ã;ÍÍÚ§š,ZSLÉN÷úS _¡h§ý÷»“¡6©u¬ÛÇÀ»îÓhT»z¸ùýö†ÇÙt9Ý™´ÂÒUú5Œí¶»#¼QNúÔw®ÙæÿxgŒÉx4Á‹'žë_³¹÷ó³?Ïþs ¨endstream +endobj +1467 0 obj<>/XObject<<>>>>>>endobj +1468 0 obj<>stream +xWkO9ýί¸ªZ5Haò M_VPJU<‚ÐJH•gÆI\fÆ©í!äßﹶ‡„«RU„Éø>Ï9÷ú÷Nºø×£QŸö‡”•;Ýv»IŸã>÷ñßHšîOv:§êõh2åw‡ãMrÂûÝ.M²ÖýÒª’9¹¹¤\—BUdë,“ÖNë¢XQZ;S' Õ‹™¹ªfä4 ªä¥±JW¤§ÞÂ(SA™Î%ÑL:~¸;ùµÓ¥½Þ>¢›ä­¦ÅL¶éÃ.íÊ:YR&*ª´£BÏh¥k‚ÅûÖWÄØíßï¶éªÂJrf×3ŽRø©l]8>a¢¥-g"/U¥¬3Âió–sY‘pð¸p1xÔUÂÇöd˜ 8ÈÉ\YÒYVm”çæì„,Ì¡hƒOvNQ}_áÖ¨GádçîòúÇ÷ëËÛ«¯‡wš.´¶³¹¨f2OèyÈ'Q. +ÙÞ +ž ad©‘7J5U…$QåÁÚ—Æ#Ù2ÏÖDíÐK§2Á=ÌŒDL64 µ• ]_gØ¥X,¸©ÈØMµqó­`Ré–Õ‹ · ±dÔ¦ÉÅw†#üûÛÑ ¥FTÙ<`à¾ÅM52Óe)«\æ÷» qÛu…°–b(mùÉ´Áû8´0:-€Ô 3ÒWÝ×B5S•(ÈrOPÈjE,g…’•£©ÑåXŒ/qÎF2<:§ÃXÜ ØrÔ¥Èæ PX[°"ËtͶáØ1^å¢f¦H…jĆšsä Èñá%þ'A…Ü¢¿¦q¼c¨žyÀ#wŽÍ'#~&E:65þQh[…ÿÿ@?$t7î3è`t5û+~Á—ve¢¶àGŠ£nW'_}ÞsñÈ8PåÒ»¢ MŸÑY[OÔ #ÓþëΈ<'xƒdF-G¶–¼ +äæú¦# š¾S\bß¹¥® fsÂ8f›p¤ÍEè×R›pu«`ß > 'ØàˆÕ&Æt çÃH¡9ÝTì¨R*PôQ‚ +j°'«/SÄðkTŠªötŽqË„6pãR¦f yz +«Æg#½çâtA#CÖoS`/PŠÈ¾€éwúòÑYk— –%è5Œl( 4ÝÐà+Ö 4´ê/sM%5SàBÆÖox«*”[µQïU»ÉogÔ¸¨D)½„àYC éŽÏ.oÈ·]ÊÏ?”Ðëø‡V'¤nžÿäÓ)j P²,¤,Ò±œ(Tªa¼#]Ö‰õb±áð^V0¡0Rcp7óòM2rYöåctV<ü +¬n¶N+ÌÚRØ ÿA¨ÙGè¸Õ~Vé‹ EUôvU·ZçYùœÐn`£˜GÇF ŒŸk´ÍiÇQã²ÈܽQ2îQï`Ìsö¾?ÅÚh®ÿz¯ßë…u!ê`ÚÜLlCÞAB~'amñ/èb2èÜõxÞY‚骗ñ¬–"ÕØkÊÕVÚ dRÉÈË•e‘ +Ä_KÊ«=áMÝtutŽ©R@P „õŒYâí'<;1¡þ =á-¼Áßõ0žQc³œ]akÑ%ÏV+ମpœ$dçè–– +ð(e™²*úî[6ΈRågv +]z‰d·|Icx\UqµÂ†‘ ì‡ÄÎS@¹äOIvˆO?cÕî[ýáø~—ó>¤Û‹—wôíúúòÚÈ[r¸åæëö§øðY1R• L’Qc5å§À‡¢OÈ+ÈË:§/6¢H¶=Ikë¶Ú¨ªïç±)½ªæØ‹ü¶É<¿0²NmefG϶6QŸñFš³ti=ðÛSNžÜm3s¦jÖÌ@3ÛZÑExÚì->ãŒ.hZFSøºÙ<7ô)ªM™äËûø¶°Ht¾ùÖ7…Wؾ#ð +2K0ÅŸÀü»V¼öÆîýBšR¹Äú5n]`XÙ&žâq–/„ +µÁŠÆÛ;ïšKaxXJN¥^Öù²ß.Ÿ¸Ó¯ì÷¢«Š7Q„p6J²Ðaßbï]æ髯‚‚î°é饅PÒå`0¡Ás;÷⊠S¼SãØê q¯ïÓpï±7GçÇGî/¾®œè¬æü|îð^s`oÔ±òÖUx0$£á,ĉA— }›ìü³ó™'Xendstream +endobj +1469 0 obj<>/XObject<<>>>>/Annots 682 0 R>>endobj +1470 0 obj<>stream +x¥XÛrÛF}çWô™”¼Ó/[¾H‰j-ÙkÒqv‹/C`HNÌ @ÿ~OÏk³IÅ.QæÒ=§OŸîáï½FøÒbL“9EioŒð¦ùøòSo¾–4_΃¥NÆÁ¤zJhÝk?ct¾ºm=ct¹Víµ­ç”ÆãY0k¶Ÿ1:™7^°Ýö3F—a°h¯m=ctµ +Âöhë9¥I8 æíÑpŒ)œNa/¥é|‰sû'wÞÙïÃÑ s0:™4O< +Üh5 ¦4ÅÑF4ÆO.iß{·é o§†´ÙîùrA›Ø¡<¢M4(Ž’NGUHÊD&sºK³D¦RJèsnö*‘–„Žé³IT¤ð 4}S:6'KšÂx*»ör“Ò½Šrc;~ØüÖÑõx¿6ñàg —~¬IñG«B-Šeìž?¼WÞ‚ÍÒoGQØ™²hw>é™ü~õËY›ÅCQ.ir’˜L~*Ðu° t½W‡ 3Éå.:›’ÒÒTZI ½–ùÀº0åÎê= {±­@>Ëîž@<:’²üø¸°¥£¤ŒeL'U[vveáw¨‘6OøfòG[†±c# Í‘áVˆÞ¥£d4^=l?lL@s°_Ç[ªÂÇ 9ø@‰®L*À¸ñ·eÈò+Iq4åáè¬é³šu<‹„¦Cëœ0–ÎqÝ9öÐÇâŠÏqRIâ9–DÄÁw'#Q1—e‹üLò Ÿ„;ýu˪£©,hÇÃÈÞJäˆdúÙœ$Hpå†}š8ö_RĹ”—šŽ"ËTr&© ²–II@ÿß´Äi=˜ G[tº¢È¤©ÑˆÓä.U;+OJë╹ݹ؃ûOR+$=†2p‚ÏPœ ïÓòïGÞƒüQôŽ•èÍvë,m·Jï»nÕŒ‡Ø0+ÙÀNi8„ci¢a ¥RCt,œIs¼ÉOÊÊZLêdy0Èg‘Xƒ5Ð÷«\F‚3SºTq,u¿^X«Ð¶k"…ªÈrªÂ>§ ïy™Šì.óLE’>‹è‘&´°(2òíÎõ—=;¸A"ºy.ryh=„¥mêE4¬·’ÁˆÉásI=;n¿Ê·—ÕÅÔfsϯ,u^V ÷8Æ\8™`mî_@òWt!a¬„µ&RÀUÆT¼Ù‹™… ¾;IÒCƒÉÂÒI&IEÌ®[.0™±Vq©UQƒtb+&[íähe‘Yõi¿GèV —dµ@eg2ûöBOš.5ÏÞBAAì^NL䗹ℚmÿGæ†ÞÆ©Ò,+~üŸ¤Vi„µÃ¯ÕÉámT•Žkt=!…«%×Ìíx¾¨R­V7|=C4˜ñ¢ îALcÓ(ñÿ.†wÚÉ©;ø!7eVãvDô”ãýž(ÐsZ3¡ó}ä„…ˆñÙyò’Þ@Òx²ÖšÕÒŽí¶0&±Ûm.í£*¶[’Ïpm·•°uxTŽ^šöÕËû%N´vg^Û2› ¹ÆpôÈ}Ì¥W·!¬ßëìZìSX¤\ߘ.%#G•V‘•(¯ûêølY ÕqåÒù€¾jÀ[”¹bP¹ôBìYì8b£aDW–s…TDG…×NáP¿¬FÇ#?‡ÿª¡Zðîöð±™>Ê%WI6˜Ë NY²åá -þ@Š¸£[f±Käí-TüÆ­¨ÈàÇeÇêx„¹&qõìD¦ò!A~pær±Û!q]ÍÊ"ºíœïߥBÈï%î®Á4'N‚;>õ¿Bëè^hqyß´Ï"ÞzÉ¿tÇ,5fk‰³_©m Ü£±7p«n˜©Ðg\3Ë>/XObject<<>>>>/Annots 687 0 R>>endobj +1472 0 obj<>stream +x¥XÛrÛF}×WôKŠrŠ¯"¥¼lÉ–UŲ³!w]©âË°€3­ÚÝßÓ= AɃkËeJÄ¥¯çœîÑSšàß”V3š/)..&ÑWN¿ý|1[­¢ͯgø,ðs~ú–Óúb~5‹®ðîM4ÃÝÅr-›o|÷íæbüaAÓ)mRøY^¯h“ˆù mâË]e.3ûèÍæ+\6"’Ñl 7›äòËAyR•&g MI¦öÆ:ŸÅŽ¼µ¹£{Š•¡Úi|§Dïê=ù´…Ê åvo ••µs¤LBǃ†1~çžÒÌ$ìyB£éñÃÞ-þ¢9‡} +æ³ÑdSq°ÓÎwÂi¢Im‚Ø#+ö»Ëuá(s´VÅNQæÎÓˆ~·õ9n„;JÈ–>³¦ÛÛY Wì‰ßð/HÕ•:ÎÒgäƒú Bâ¹~Òù€páxÈâ?VÕ&¢µFuà¥@Ö¥ÚkG( +[²»Q'}±ÎeÂÝ(¶&%Ž °(Yfðk¡8H~]<þsÏÀMm 6ñ¡ä‡(+ÂJ‘ð)ÀØqî/kß6I:Wwʳ¿.õ8¯ƒzÒfàÉ¡#Šiž?“;Ø +—˜÷YslÍŒYÛ!H;í–ÝnfÐ'éFWžf{½<ýsÉÁ ¨ jC©3Ë$C³A)£U𙩵‘ão™¸f}†3 ÇÀ8(NÊ \ÇFogW +÷[†6·O2ŽjŹ@kô‘Æãíw™ud‚„88]=éê¿ßçd4[D7ËÕyXÜZ?¼%md>!Xt¢Ž˜q™ÔEÉ0WO*Ëù ‚ïËŸÆããñÉCed«ý8¢÷'•s³DÒ8¶ö²VªøÐp&KSОYýO“}8~ÉÌ|F G7é™|¹U ‚ î8‡N¾*‡Ê}Qý»¾Rq€*>e`àzÈâÊ:›z‚;Xw”!}!+ô`Mæñ.þ¨"BÑ k€ÓUøS~ŸíÞñ ߪ“ÕwwdÄÞÏ>1Ò¸À´ zü$:²Æ×A˜G½"v:‚ƒY(;d% ;@Êo‹@»0ƒÐD®B(¼;QM™gBÎ2Tj¨‰CÎYHÑiZ™·EÔ\ )dEW©Šy¢ò†Pd.®mí€úDcÀÉ=dºý:aÖί+"Ö@0$~˜“fpô|ëmeÕÅæRAÄ‹Fšs«œç‹3ó«™Jb(ò©÷òH¯ ®ÞÁrDo!{GÞÒ¤ž-–àUØ\ŽUqnêèb—àR e'ìÐ}]Oe弄ëØóyE”Fó›%ßÿ;æib±Ðµp|z‰ÈOhòûržÄCñª›oœ{o÷ë +Ü}À´Iâd”Û U¨ö5Š âu Þ³Þx]6Rjyþ³®S¸‰—zÕEè"ýku<š/n†Í^ʾàõLœ×äÀk2N_=Ówó²*x-€°]0€êˆÀî”в +U¸ÏŒîEÓ,$¼ë„-³@¬J_C _E ­èl÷X²Û£LÛ>a\ÀpÖ?ém‡ýaQZ‡C‚HK‡Ül¥eG×—ÍÂÒ°\v$~¾c¿¦>|dÍæ+üÅC¶ÒÓºnZ>_G×7sZ,áëÛ‡··85Ù¯ÌÑ;×äEcÚt¹Š&×s­&7ló*ZE$9Ÿre¨Þó¡MfÕbµˆVËë°/flæýæâÿ¡Í¢­endstream +endobj +1473 0 obj<>/XObject<<>>>>/Annots 704 0 R>>endobj +1474 0 obj<>stream x­XÛrÛF}×WtR”S"xEJ~ÙÒ%vT»²“YWj¹C`HLÌ0˜hîÃ~{N÷”DÅÙdåR•$`fúrºût~=P?š )SVõ“>Þì}|{4’S:Œ’U4LÇÉ`÷TÒôh2Lú4–1/NFXŒO¼8èO’ ÒÓd(«ý$Ý=ñêpÐçÝC–PQÚó^y’³ãs¨õÏ’3^…ÚöIÎöOñœžŸŠÞô|IñIVÏÆИŽ†ñ츿ñIV‡c¸’öS±*=•UyâÕËÙQï͈š-–ñÙ„f¹@Ò§YvüÖGÓ ê@]šêŒ]yü{ål¨]I”Õ%žßé°qõlªïM¦yÓEž¿šýÙNAw0HúiŠÌòãùð´Oq½5`·Ü°±Ø2ե΅BS§Õpë¬ ®¦‹•¶¡CÊ攕&»#g©óþïäe*¯D b¬¹UüÄåj¹±^RÿÉØÜm<½›Ñ' èƒ šGHcñT–tuM›B[Z×®ZÿEåÝá(9Ohë;·¡Ì­·¢iJk ÑÑÛÂ\ßëÚéÛéÏÓÙ÷·ß¿Ÿ};ŸO·>è*ÎçV‡ÊÙùü»ä; Žï?Hÿ3‡vÐ>v˜éu µ®+ã=0ð¤AÑ?ÏEì+Xë„ÑÙ!!BËî£Ü€WYº ŸGJ‡M*t¹^6%ýôñðÉà€eM¥±wþ5 ÆÞåßÝ’¦ªZ(‰;!¬_÷zžß$®^%ôIS¡sE•©k$‰ÕJ2…¾ayÿ?-Á‹(`¼ãµcºÖ÷ºtë -‘ŽK-¥¾¬á÷mÒE›£I¦!!‰×¹ê%‘Ù‹RW Ý,É»2"òŠíÅ¥"äÑ]<äHHø_´,ûDÜÁTKdÃ4s!Э®k.0oª¦Dæq>^^_ÑBo Õ¡Å»àl6›Äß™õz› E{ˆmó¹ç«E²ƒKŠP•/·õ¢ …kV¡Ó¢Ç UVYV¨hxÊÕ–©Eч뫺†Í9]*k–ÇÖk©£(»8¦°FIã<$Ƥ[>¿× Ð@ðt¢ó&QMLFZ9Nvf)KÁ»Õ_!&·Æg±<¸H¯nÞLQ{õ{X½Ì,}ïe‰uí*…w~²æs Þ–@N²Å É\Õûoy—•=rüÿ2­ofb‰3„®ÌÁ -ÓÛKòkù×´”²Çï¤2Yí¼[ÂèÜDÝËëUÑùSVtÓa2™Lh0â)N¦tÎh[í“äl€v7á);~@]€"oh…îÅ,ö@õ -Çž9Îÿ-Ji‰áq‹Zç²Ud›j÷ÜVk®°œžˆJè-8ÙµØï9ïäa&aÂÓ^Šñ1 ïèIk÷‡¢§{R›6뵫ŸÚÿ>'¬ü»–?Åàø°Ù¾A„m`²´‘ÀøÁÕÈš³woQN\FauÝ`WLû=ºáB÷ #xVk‘ü„(Ÿ·½ÜÙff‡½jáš5vY#Ô'%LZU;s$®‡>€µ¡'ÊDëÑÞƒ-X†³Ò³X”¤u©•Ç»…‡èxhŽ«Æä¼Ñ‚ižõ¿‹r£¶îUZÒåKmàÞ• ]á„ŃödÖÁcÎÛr‹Æˆ9CóˆãVªŸeÓÑ’ò&ãü\ã*`2Ð>æ -­BÃIž¾¦Âva1_â¿ ¬¸³@di…øúk{œ“l +8Ü•«õú@Ûþ g¥ç±.wµ­uÃnòdÉå%E#‘bÓÏŠÙÙç0…b‚Á+/C¯´ ̈¯pj,)N}§Ì¬…Z”[‰²D‰¬ï&Ü,¦6 -Eó[Ù¥ i' %ç„´ôC„Ü:EþkUBEùogð—K¾%¡M‘ûrðn0ã湑¡d—þ;ì0Äw‹€‚@iÅÒ¼7Š®þ9Ý2œæ9çruáŠ(áØ¡SY¡³;È0š¯Ðg5rQ¬ÔÚ,_ -Ú²ËñøÇ‹‹Úèå Æf¾ ,ñ×®ÀœÎrµ0׶G¼PzŽàáíAØݵÑZÊ9h„GsúrO-<ض™Ë!}ÇžæÇ;$3 r>^u3WÂè] Å%îÛh‚ÿÁô£YÞüÕWˆrŒ$_~öä„I†¬Y†-un:­…+ F&ß·ÈÿQ®&:‰x{fØw`>ç·Ya ,ì„}”õ4¹§=O=ŸÉÿÂçÀ ûâÀŸ$˜Ë1veß78+……äÚÁÌÆÔ¿œd'å_àz©-8Ó$`2é>µÇ ¬H%]u¢œØtVX“©2¡[2\k‡ !À¥¸²-±øfá³Ú,˜k1b'2„#$V³©Õ¶œ zP `bÜàÞ/ƒ¶¬á1õz\¦X¸Ì¾,é¡k±*º\ðP£!8عÀ§ D0תÄ[¾wÂ!Å®ë‘ôûálÉyÏßíÀŨdœš÷×Ùn¤ø,vžâ³ãïB·—ô¡v¿0ñ]ï.XråçãIÒ?K©;éŸó~|kC20WÆK¥Li\u2´É`6ÂǼÉø,~š¥,æûÙÑG¿l‹oendstream -endobj -1470 0 obj<>/XObject<<>>>>/Annots 662 0 R>>endobj -1471 0 obj<>stream -x¥XïsÛ¸ýî¿b¿UéH´$Ëúq×iǾKRÏÔŽé&×HDL JÑß·¨Ðjg:›$vDÀîÛ÷Þ.õíjFSü™ÑjN7KJë«i2Å•óϯ–ÓdM· þYÓìööü©¢íÕüf‘ÜÐí|•,qw~»L¦ñßÅ>´X­“9-Ö+üŽFR~u¿»ºþ° ÙŒv9Ÿ½\¯h—ùs§´KG¹6Ga2RŽtCøD'Ý%ïv_¯&SšÌn°ã.ýKwT«¢t¤š´ê2É\XÆ}GÔ -㔨Âåþ¸Uº \UÒÒÑ(çdC‘ L*yYéÈi–ê.-ù÷|šÐs%…•”éæOŽ7Äbe“‘+%ÉÆ)äÈgì;‡º+JÞ«PéŸHuãäwd–‡Æ ¿ZZ+ -i}’×Ò˜Ãd6K¦77Ô§ü2¿ÒÛ|â“ù2Y0*/£gm­ÚW§—wô3rT -œ-(Õu[I'©‘®°ÎˆTÒˈr£kŒne£š¢­U-bÖƒ8_ÞñéÃ*ðþ©hYDàÏÉ/wÏ`Æí(«ê'‘w¥j^qš‘yWU'ÚKp™9'RÜ*¸Š:íjÁ—¯!Y U%ô‹n¬Ê¤%¬ã¹TF¢Ø¢¹,%³Æ‚R1ï½ÎN=±J í°ÜŠz/ˆ÷ç +e±ªV  •]”»z#QçVj?Fp—è!Ž‰ªBIdæKÔúÓ€ª![ï°%G0°21SÊ@±Ôisú[àÂ%]Î\øA—^“ù"Ù,W4¹Ù@³àËßõqÑà¼Î)ßdéÖ÷ûït –¶5cZë2ñŒÿ£qĈ %µ“YtŒe‚>–ú÷Ôè죸t®ýéúÚcžø:$ÚcJ+•¾²e„€$ˆb<ÂKL~6ç§v·g»Øvm«§ÃwÑÿX7ÔÂÖS¼¼1Öc8JèÈ(M)Z éH*¥ñþ5@wh7ÔjÎ$ºD¯I"{õŒÖCÿ8ª@¬¯žñwri Š¼{Š£ +² ˆYXB×À-XklNùCªc=Èh5 -w§$I‚! k•¬g´™G3šƒj!õ Í`ò9ȳNf¸8H´fâWB¿j Õ°NÑ•·ü/ªÉôÑÒæûõãû·ðÍçÉ|:ÃV¸£ï,È\W•>2êP [-¶. WU¨FTôë§Ç»‡§ÄÁ‹¹ OyPº³0–ØP2:*W’/ë%¹1Ä-kÔÛ Ó²´G‹È˜ƒGÆÎszà%ú5dÒËqDÛV¦¼ô}¦8æ1ýf9æÛ¬GcÚŸè³JKôF¾õ†z¸ØJää jใÄ=ÀLfAGm^ £»– ’ßEêôY’l³…7ijËI¢aðÚT7ƒf*§dý"qÏÁq •¡F¡Š=Î@ƒL…/O&p™;*V k5p`ÝxÌÙÉ9â±ç -Ú…® -’ˆÔÓÑm ,¡»ÊêñâƒFÂT¾„Ks»‚" -ó‚è¬4ð|o~'²<ô˜AÌH `:ùi!à‰>RcõAš‹Ó_FO»xÇ{ˆFîðô“u žiòã!ü@*;æÞ™iÌ( .0‚vO©ÑÇ—w=Ï^ lïÙÝØGXŽNŽÖÁ)ֿĶÈ^~ë\¨‚¯¦ƒÆBôÙĦÓ/´¥î*pÈ´—óLœV,?Õ =CøBO¢¼k¼JE¥œïy!DŽèŠªàoXãG¹»øIÜF6ê¼éþó§/Û‡§¬ë„ÅÈQðF£Üã@Ԟɞ¹Ú¡#ãJ®'ÔÌbiCQ.Ñ~°¶Cqz«žÊÒ¨ä$¬ì5Së % bH;Ëöà:"F•ÄâFpå™û„òÛ‚ýÆ1ÀÔ¨Ö1aó˜ý:Œ·<8?n©7Rþ8À•ŸÜÝümv€oà†¸¦]¢F.wŽ1Ë;“õœF ¸§äˆÙ6 %Ë·§ÔQÙž¡Æ´ªˆ,e¶ù C¬µè‹á™Ì'Wé†Ô  ŒlQMÌlJ’¾ê}@çªÁsp¦Â-Œ‚p0h,¶kVš, ¶Q6LÄ¡¥‹¬V¸„Sf{q"›($3Ï8 ‚vÍ38O×üàÕe]ת S92NÄq,¸ÿûh} ‡ÎÖ‚ÃàOðÝQÊK^÷T"Þ%Û:ÌÃëÌéGÙ£!AdbrʧŽ%µ•Õ݆qÁõTµÐmè}Áwu™y†É¬.1K^z€¥oBª}³@³å· F%­4Žån{Ð8=:´KÅ…¶ˆPÑ/r€‡~`ý”Ãn^‹W?Cšh–W¹ïi›ƒRJx„CIj?‡¥=ÑM~^Ôv/Èï'„#ÚvŒ²ïÉŠÂÈÒT 1?†“1SĉúdÒ¾:¦‹çÀÃ]Þk!º^5÷ᥦðÇ؈ã9ü. ŠXwì·P®=Þ‚!T¶0¨Ä«´æ¹íÃWåì~œŠ0]dŠy” ,ˆýÄ÷ñ½À9´ÔûËY©<-ÆøžîgÉ8"Ùn˜b˜ª -·„øþņ<.â«¥Ÿ¤¼æþáÓ–üÛF˜àþ2KÿÊmrx»'i‚QÄ€ÓRƒmÁ‚w€@-¸ë‡`¼hŸ_²gIY×ñÕ`¶À7ëZ.ñ=Çò–‡ÖíÝãý=ýÃô^:}a8øÉ ò’Éjºù¿†ÜÅj‘¬–k|+ƒS ÞìýîêŸWÿÆ\·Àendstream -endobj -1472 0 obj<>/XObject<<>>>>>>endobj -1473 0 obj<>stream -xXkoÛÊýî_1p[TdF’e= -…Ÿ÷¸vÜXin}Y‘Kkc’«Ë%£èß÷Ì,—–hA› €øšç9gfóÇÉø;¤éˆÎ'ç'ƒh@ãù0Óx6Åïþ•šRyp1¦ÝûW‹“wci‘²ÉlJ‹„`g0 EÜ3¾µù®]Ÿ¶k¯)¶E¥Lá¨ZkzÔÕÕý§g*T®É¦r/³/¶ §ËﺤÊRí4™B¥¶ÌUÅ/.ñçùöó¿n?GßNÎt6,Ÿ>ÌiUÆk„f!(Ã…MȤ,à"µ5.ùVŒ‚¯4ð¡’~'@¼óïê:®+Ðj'‰úþFt™V xéïݧĸ6Ò´´¹ŸG“cøoÛ×äö..PkmøMÈÀ‡cØUu ½±uÕÅÙÎÖC·Ñ±I=´ŽxâžKÇ„_ŒÝªÖÝáú‡Ê7™î‹"!wˆÖr™–:Y.£6Œû”ë½/R\붰¬ ñŽøÚ°Õ"¦“wõ›ü¼~Gð.µ¾Tm:Èc´îÆŸYûê)~ýéñîþ—èéÓož‚›™Ø0ÿ׈îYÔÁç@ý~£L{¯ G B9õ‰~¼›Ó2™B//èl<ö˜™D³hѵ-RóR—ª2óûÂUeóo÷7fêÖ–¯$ÄwœÄÛ¸‚‚xZÉÀÈ1’ iªKÍüZáCá¡èéæZâTì'vëhþëjÃtæÕ^H”§ ûÂ@lþI9‡P‚ùr·‘Xñ*ó’õ\I„`ÿÕ àã]Ü Û³i4ãùø—£ÉTÊ[nò°ˆo|¸mÉ›Xñ¾±xÎQ®âµ) eí*Rq ¡®Üÿäõl„†ÌßrÆ$.5ÆØ¡èYå+_Í­É2R™³ðOÌ®·JÛx¿hr¢Ñ€‡&Ò;—Yï0JSí(· ff®„U‰Né²Óraà$L.š¾ƒhL6E©Þ¢9N…\½Š¤¡c~ © ÔeCŽÕà‡êò0ˆHr¤5²X1^X[)Ñ+UaŸ0 öV¦½q®–eg»Ö¸. *Â0ðóѾ²œHé¦lR¤+(Þ«Òf¾f*‘c‹]²E¬{²«õ¾`{:äCO’ÁB”í­6‹›´F%ȵYÇëÂÄ*Š•ç˜èÞnëêù×ËÏ·_Ò0¾·WœJ }kàæÓÃåýc×w»ëI6Âî‹‚`œãC¨’ü&@§ïª4^; ØeR†¥*kë @dÁhֵ˸ªÙK ú–⇠:ÎØddŒsÓ$ -ó ëž9‡‚eH^õmö@µ(…R¹/¥0a¶ »Ñ,ƒ¼€2«n®#úº† 3¶r…ˆB·¼1õÍ -§:>ýPc‹ŽÁ½ì)Yº~ßÓÌ/¼ %>pÙ8ἂøò.†ˆâ -.ƒ¾V”ָýü#«ëúÅZ¬Ž‰V¡³ýÛ­m%hb®ó““wz.„ZêXêø”'¸)ØùÓpupÖ`¨‡ý¡Œ²™ò˜•²meò§hCfc¦·w‰ -7c!¼ÑèªÏû¥6nÝN|Ò)n3\ÄÖÕ_)RžN¡8P’mßõÞÄ?ób;>ú˜iœ´>Ú-­T,ÊŸ´ -,Iß,¡ØH戤p• :mYôwaÉ©Ì÷FÛ;™­- Šž b­fÝc®5à‚"ÈY«·ßUf.3/-l„Ïp<à›mÛ/üÝñË,¤”'‹CÛû F¸ -E³,{|uº Ú‡tŠóßkÁã^vcµÂúèc‘Jà“Ž_ßÎ:¢ùü/á4[™ãOZê£uQ/È­Ñóˆ¸SûUð„–IäÙÕqz m~ÿ:m5ákj‰ƒ5S! ζ"ÛœÿÞ™;`øq¢Zöä¸Þñ§2ÞÛv2ïŽ$ЧҼ¬«,?ðwL­ÁEXZ<ìcneÅj– FK¤…Á)Î~‰NMaÁw¯°× V G(\3§ý.Â[#"*ÛªÝF-£ÀƒF“AªVs}hÍj2kæéKél6¢ 4ƒ¹¬•Ï—W—ôTÚo@.ÝظæíB&Tg8Á±ÌÎél:˜ó:ò­³ãé8šNf~_°áÛÅÉ?Oþ>¿¿,endstream -endobj -1474 0 obj<>/XObject<<>>>>>>endobj -1475 0 obj<>stream -x¥WïÓFý~Å€tâ“_MrHýÀQh‘hJ!¨­B{}Ùží Þ5áþû¾™õ:¹„RD9!9ñîÎÌ›÷Þl>ž i€¿!ÍF4žRZž ’ý0&cšÌgxá­)—ãñìË/†Ãñé‹«åÙ£ç—4œÐ2Gé!À`@ËôbšÌ“QBOm•›ë¦VÞØŠ^TÎ×MÊÏî1½ÑޛꚚ-½¶ªäÇ·N×ôª¶¹)´{¸ü!¦4rˆÑ( †ÔÍ“Éx„X‹ß–Ïî…E“vÑEwÒ¶=„\³ÝÚÚ“q”™<×µ®<嶦?Luù'©*ã§Å2á“ú]”Y2Q®4kìuiã'¹±;ò–Ò¶4Mu›}ŒÙ##ñ§ó¦àµNkÙv“Ò ©t@}À,…™r[è’óôíЭ|Sk')bÝhš0Øá´ö Ä@)ŠÚ3Š?kÿ¢Ê-ºû±Ñ'Y> ‹êO€Ÿ®µOH²~à(æN…M¥Y ýbw‹{¼‘Á9ÈÉlÑCÀbµ£ÊzÚ¨O „-[…@[…®ëÓƒ)7ºÈzd«âVrj3ØØùmT­ZnЮR«Êa…òGÑCÝ]ÆØ2Á,“zqmkÍ}2ÕÉñ™©uêm}û(ËØŽ(ß<ùõ¥½u_¿z±ìÑncÒ À+ƒKU݆ªZ_¥E“qü¤dFæ¨nIœl~˜o,ÑLâ¸êÛè-‚51‹ $fQPê0advç@Ü‘-çüèy”Øÿ– v«.ìÝãÇ H)ï® »VÅ{*¢ç]¹NX:ø.0·Eaw Øê‚KÒŸóõðq< Ë`1ýÑ$d\HG¶ÊoèGZá_DAȽÿÈ\ê>ñòÕêüíjUBÏíþò å1,K´&Ó¹jŠ`ž)i·âcxâ°ç‹p`{X*Ujšß9U®UPÛjÅ çw]2ÜT-ëç|À¨?™ôXfˆ“Ö?X­oK3U"¬ƒrÞ±fÃ+»z‘Ó­mˆшWƒœˆ¬€î_æ\¬'Ë?”óŽ¨Yª-kE’ä¶:5 q{{Єu Úhµ.´ÈêÔCß7iA£©j®/§Ô§Üý‚MÕÂb¸>Î '”¾èÈÝ-UtfDqX U-§‚³eß!Ãà”×Úï´® ¶kH6àwƒ@˜)\tLÍ0†’%?KÄœIÞÖ`þ‰œösã2Î +ŒÀ(+ ›ï‘¶µ„fIšÈJzs?tip‰Õà˜×uBo¤éÅÞ¼Cí(<7ŸQ‰ã1 <ݯô±«âÌGá Þ³³õ#°ÓEÑ“1iéPÝ©—o›pKŒ€"7²•…é%³ãÄÜã<½j<í”ñ÷XuLF<.n„þL-œÓ©çÔ˜¾bg[½÷4&ÈØ–¤lëüeð$VHuÇiÙŠYÅ™Æ;KÔÄÎe7¸eÀ€“ÂÔ‘0 ¤ß¬;d؀堻€»ŠÎŽ4Ô¥cö›†çÜ Û4b”´1Y¦«ÕÃãAºÀ] ì -|Y#§à,ìz@’µ*ÀDæ–èTá-§¦âU‡3—†£)|+áhÆì¾盦é ?OƬ\Ê®žðÏ„¿1è'›6|Y–[+gØ;ú³®ñ†sÈïø-2™M’ÙtŽ;8s2åPÏ–g¿ŸýváWéendstream -endobj -1476 0 obj<>/XObject<<>>>>>>endobj -1477 0 obj<>stream -xXkÛFü¾¿¢!à 5 Ñ’Vû2`vœFâǵÈ"#Q#i¼ä 33\­€üø«î!)…kAl,öArº»ººº¨ßϦ4Áÿ)]ÏèâŠòòl’Mèj~›]Ðüæ?Ïðå5mÎ^/Ξÿ8¡[ZlðÄÕ ~XîžLh‘Ÿnë,U*îè%-ñï_?/—•wSè€ßîž-¾àù9M§|Àl–Í&SÏ®³ùÅ '¿¥zÐd]¤|§ó{½¦ýNEZ©šžï\©‡´v:B½_ຶ4H‘ùâ€L €ÛU µr:KAo› ã.êmv“¢^e7Ù,›gô‹±k·tû_ú˜²¦O:ÖÕŸÓž ã«lÎùþÂÁgæic|ˆ„DËÉOQÜ=  ·fo^-8ËÜkõz$©2¼®Xkhð)*é¶õ`ıqz‘ Bƒ7:ÜGW F4@Ž[¯Ê0 e×4x¯ãιõ £ÅN«µñ:Î`Å7 ã)w6jíMQÐJS©ý–q6è§Y¸\½¨HË8 `qnFù‹årŸð:í1CaU©€P¯‚þ½F4†ÅØÔ½±[‰S:À… ùòÆ»’´ÊwýÏÕ½à’¨Õ€³üu[¸•*>“«¢d6¨<Šö`O®PüK:èÀ …–_»˜P“»ƒ¶ÁDƒ‡_ö‚[B¡áø¥26â Q*UA…Ž‘›†?I¨¼¶øEÙ¹TÚL@Û_!ä ‰Ð­#-„$Ü#Ä@ÛÐ"®–Q®b£½¶¹½ÝÐÁÕè[@ßi»q>×`#“‘Ongi -Î2¾W!Ÿ-Œ”Ð bŸ½{õ¼kÖ…๒öÞDœŸ#zàˆqóCR„£‹V²îà°å;cõˆ¶xÎÑ÷(л‚>*« úßCØãDÔ  WŽ¸Crí,"¨Ze˜H¾Ú+‚Aòà(¿FKp* ðN•L·(2œÆùøiD«:BIè7ÈÍo µÛKÌÜ•Užr¢^¯œ‹Rà¢ÕNá4#Nùç5c\Qò=ªÿ¾02ÎÓ;“{Ü&Rs9Ði|"(àÈ‚„ v[9¤ M|㘦C;5B y‰¬¤ ÔGoJå„gðš88õˆ`’œ FþoAØJç,A8ž]Òør–Ý°œÞYž²#mFÇÖ+m¶…Sk´XãI-ÝPÈyr:Û+ï¤pz]qkqŠh'"·+LRÆÚ–{SÅNDû©a2}{â'V%ßN}K¡f|¿™) [¤M_M§•ð>("áíÌѸW´¢•ÁzܲÂ$B@orjþ42ikÈ$Qá«¢­¢í"Ô:a`1<¬ƒ#ËžR‡ e\¹GÙB¢p¿²üŒà’ŒÐdæîgHhˆZ­9§/uèÏ{ï±Ï ú¡Ò¬»Üõ Êë ãÙLG’(àòS&ÚŒ}{ééËðèGbR†•VöÀƒžœÔÈÉwP5Ž´Ñä¼ÔOðÅx4ð¸t\êSÆ .°–)M÷÷B7Ä“ª°[« -‹ «&.ŸdA¤9§Å뢵ߴè¶à$éï`”V>&Ô"훺(ô  -³Nî„m¹xÛIy*ÛðÖ)eIâÃn°>­Íh¥ñ$¬ç n9£áZ»Ó›AßtT¾ïš=@Cìùá7+<É;O* u‡ª+äßžurT#É;¼.Öì‹Ô -v zªy‰¤<:óV"¯^q­á:P¨tn6•6Œl *[ãèt¥Øj6¼l>õze ¿á[¿‘<µ´¸qœ}¸Ð4X¦Ö~¶ª’cg£0‚· ²N0&oPWB‘äÁÛ>% ì6Zž7ýd‘³ÃEZ÷1ÃS%¶¬ZE•x K/ÆËgâÍŽÊ"ÒP,UR{ÞøgL¸X±1{1–ñÏ”z¯iR­x`)¯õj]§OÆ´cLw1Ñ éÎq° -¹¦´¯yêÈKlõ^C’Û:x4Ž…M2;¼~ ß&•–uÂ0K1íAÏŦ…œ›fž -e³ï’§Ä"ÜÂFjï¼m·m÷·—=øcÇìHúÄIóO5ä Ê›¹¬ U¦#ÐiGñÝL¯KsÙ ŸÑk £¢nÿpe½Ø,ãM†^³‚­‰@„DÛý7J¯’æΚÇôVi_š^j8 è?\üÎTäÍv‡d„šŒz‘“ÞRaÔ>p -é_5 C`Êæ-]ªÈf´åFäÊ6ôítAÖrjáL©@ ª`‰­4|l¸5òž*~]‚à0KV?v¯«ÒûC·É" ÓØ€Ìð^h)v÷–õlá–|Ò/[¿|þãMó’=½Â§7tu=ÍfW—ìí>½z÷úû¹/ìí߸¼.±,¿¼1¸ãö‘ñõ„?T8O/åü¦°1ÛÚËô¦À×¹¼ñ½àwó(ÀUôŸÆéßñBF~-³7¿žg×W7ø°gί9Ô‹³Ÿý˜+Ñendstream -endobj -1478 0 obj<>/XObject<<>>>>>>endobj -1479 0 obj<>stream -x•W]oÛH|÷¯h8¬HŒ>lIö=yãd×XÛ›ÛèÎ8D1"GâD$G;CJÑ¿ßê™!EÑ·— Ž-“ÓÝUÕÕ=^Œhˆ¿#ši2¥8¿FCšL&øz5ŸáëÿŒ¤õÅÏ‹‹÷Ÿ®h4¢ÅšŸÎg´Hχ´ˆ/UaK)ÒkÊôf£Š ©‚ª"‘†ÊTÒ×ÊJÓ§°ö MÒ§DçBß(Q/à7FZKÒÆb'£w‹ïÄÂÑÉå("þ?F“hÌ™ªp§¹‘‰*#ùCâ½1"ï“(ä ·Hà–_Ò`<®ø½_ûøß×Çß?Ü=¾>Ý}øõáùãrù¢ŠDìrù¡2F失JËåg£×*“Ê–cŽº¢ƒÊ2Zã]Ä#¼fŽ}ZkCRÄ)ùbE8ã³(Óˆžu)]Ú±.J¼b­2U–¶òHËËLmev¤RÓJ:y]q|»\êLQ*g†œ9P!r¹|×ç“ Jd&C>´ßeÇTùg¥ŒL\–êB_?þPe-*7Gb„µùÖr3ö`Ž=/ï?Mƒ,CÃëhÊP¿Üýñüðü ×qÎ% P`’>Q– §t~‰üb=R†*´ÄϵËY^:è€^·ÿ6a·|vNŠÉf©ØKz$•ï´)EQ‚g M!írQ%Øm©wÖU$Ró…“ð„-…))—Eµ™ùûrÏ ÌÅ–´ñ¶Úq†œ—S š’“ê„@¶2‘Éò]—Ú+ÍÉÖUÈxÊõ8óFæz_Ó‘éXd¤AGtM¦*I .{¹‹¼|çõs·ì(ÓI&ÈôÄ&zH4þçø>P/ÙëS¯eªuÂßžÀ빞îá<îpÛƒ”3‹m$9»ñ¾09YE­R+…AGrkrDn˜Ÿ,EŸ_3ÄèY®­¥Öj¸³Ðð¡Çà;\pãSW§àµ -àl×é -È;Ÿ¡›kŠ3…ö?ûúíÛq*c§Í7ýQ#»ƒ¯€'+%õ ÊäOz¬ÌبÄ*VzïÜ]±eŒCÄÜé.kî7OwÏ6n}ú‚¬Ý¤©¦®}ê Œ¯i0¹ñ¦ðƒ}™YÈW¨Ìöw ™ág+ò•5‰\U"”É=žô~X$ô7qB ½É¿çÎãQ Pv¼•ð-#âftÔh+È€uï’*w] ±åºàéÑš\1w™4†—ì^i-›D!<¼UÄ1.Ø6&Áó‚€ìžgäVDcK|Tú×h‘³Î}ÖUãª@&Ž?ŒïtÍ9×–£=‰-Üé¬à>ã ðÙ~¾ð÷;H¹Šå¨{g€¡š&€/%tH…³þp‰‚K`2¢Jbq¯;÷ÀÙ‹ Röäyø]Âï?Ý„¡À ÍýÀ˜FóhAèaär/ÚlÑè%&.]EC}-À_LáÚ7` -¼¬kVàþ7':j´­=ŒU‡ÉÑ®éÎîä‹Aì -ƪdw2VkËÔèj“:W9k¾€Ia‡Äx‡X]Ƴh>qËË×lg4Šjs3Ã@TÀ„HÊÚ]cCQKüq1ðªZ.Sóà{òec´9§Òsˆ]u*ZÉXÆeƒà -8Ê ˜÷±ÿ¼5cF˜ Ì ò`º¿ºÐßȦN©B?%¢x-tù -SÓÖ­--±b±*˜£•ôýËpk#Htj œïém±ÿxlUzHQ¡WÊãŒø8Þ~:Ujimtþ6ó°È¼åBÀù8š»+PèñÄg̽ØÃ²Ä -ÅÁ8Öô9,d·µ 'FíeÅ…wmª«,a± Ú^zÛëäLG£,,üvèËæ]Äs{ˆù^ž™¦ y¨C3K½SµÔ+0ªôëj3х輺<¯ÍöŠÒK@³Ñ7 žOeÅ´ uóŠÃRaZà!â41;e2º™Õu÷yÆñý8–b^½}&·Oâ™ É„+fPCuz9…Uw'M®,¿ÇÐzîëë*Ë:áC¾@ÇÍMž‰¬#¿NœŒí<l:o[víZ'tXvN!ìf|B'vƒ¨ëL‰+‡Oqg:KªÊEQaLC­û„c[@N¼Añ€ß•‘ƒSTH[åPͪòðtÂ3‹¥äeš]Ñ=1D5‰‡.”º2¸I'öï 8'î ¥¸¹Æ®Â°ñ΀„ Ⱥà -ÀôØ /J,Ž;§þEgño]Ž¯ý˜8Œ§CÀ1klä¤öÏšçó}k·¦Æƒ¦5í }=>K9_GÂFÉÐXÑ"z(›zw»]¦Â,¸¥ðû¨ëUl0§¶SsïÞ_x™}>íµ_Ü¥à —‚°×Â=ü^{6Œ€·•Ùš1àëû°5Ê´×W°)níó Mg“h:½æ‹Ø—»§ŸïøæôWý{C%ðyV+ç;…W³á ?ï§4}ÐÅZm*ãeý€ë½©œéØ[ú&Vš?ÂJóovvi.%W³«h6û+üÕœC}\\üëâ/¢t_endstream -endobj -1480 0 obj<>/XObject<<>>>>>>endobj -1481 0 obj<>stream -x}WkoÛFüî_±P4lZ’eIy P«n¬ ªÂ8‘'‹yÇÜ#ëßwv¤eæÑ"imnwggf÷¾žŒhˆG4ÓÅ”Òòd˜ i2'—4™Ïðÿcüqš6òÁÅd”\ô?x½<9ÿcB£-7¸k:ŸÑ2#Ü3Ò2}¶°a››{RU¥•ó,­5ù`Î(7¶š’›··”åN§øõá””ÁGÁSU»ÊzM¹§´vN›P¨6;c÷&y¾ür2¤³ñ4™ à³Ï¶¦Tªqžï¼=ø KzcMp¶ etÁÁS[HQaSUPåì&/4áÅ/½*×ø[»oÚÑê™×šKúSN´‡ý äÖ]$cŽUáq¹ªÔšïÛÐ&w\v]I6©Eúi°!ÇeMå?Ìrcl½zžÐ•´)H¦¦¼.¸ÐnU@³Œ*9òb (\òöÕ’Ën~º~µ P;Vm=HEŠ/ºbüQ«tAƒñpˆgÉüBêü·Ø¥†ª¾¿šÑådlÈSF¡‘è'ëv>()1è¢ðT6æÛ˜¡s…U™0¢Ë`ãlIªW–/잊ÜìÚo5ZêW0Öi¨U.p£Såõ)²ÇSŒÅ1o<µf“ß×.æ”{_ã´òtÐÒÄ3P¨íbìÓXM©vÚ÷kºc2ïîâ ŽÎ JJ$ùºøS©BàŒ™í½Âœö¶ø¦³ÿúŽèŽ;tÕ†¯ˆ¤Ìò{íª|eM¦MÊe#·™6¶6YTŽBO-©Ü•:;í% Íj¨e)ƒ/°(¹1eìÆS1Ô¦ÐÞÓÀk1z)a"Õrq‡ê;<+åýÞºÌãôAûA#)†M¸ünñæÃç›åû¿Ix«çÜÄãQˆMŒö²Fž½’^R^%*ËŽO ¿úq‹ew˜²„Þå‚ ŠÿÂ*lµ³Ï‹fÎq~ 22o©Ü ÆrISƃ>1Ú3³ÿ‚Ê 'u.4Ø׶J{daë ßçöq€c&B’lB¢kHÌ•Âv§¿Ö0Ɍև^‚h?ú]À`Ï‚~¡~ƱËVÁ%|L)ÙD<Ì#Õ9¨IjÍé…–&/$WÖ›×Ýzç]¤º¿kéÜʉIŸïÊÚ‡;f<·ÀíGÖdÝ©$¯°Æš›OÛs0­XÇùWÍœ9ë¼éªõ¦i2OÆÉ4¡O¹ÍˆtoÅÊÝãÕÍŒ%d"zeÅpãÐYL¦ŠÝ—|¥Ó|s§2@¶¨6ÇùÅt.’g‰8ánúß[pÀE‰“+¾ØcRjë"k#ÅÛùÂÚÇA‰‰ñt<‰ã)äµ~{ýº†˜[aQ LNòÅg½°Qä몲mÿG¥™xó ÇAqž%t»U2ânâõhpØkmèÓÕ¥øBoL’aìÄeÓÄ®‡Ý|¹±I/lÁ°(禠 ›v8ðY¬þioECÓd8½ä©üõ³=wc_Ûû\ƒÝ[õMóü¢Lšå!E}ÈS–Iy•^=çtëRE_ñŪ žê÷¼0C0vVøç·þ|LXAÇ#1º &CYAüØœF=hm·üô:5àËÄaÎbÓV+fF¼æ¥i@ù昬(•éØe -üâ†ø|g±ìþˆ(t=¬Ob| H ÈX0Q'@Žõ TY€íWW«†áA¨!ÆÑ$þ N¿¨¥»R`ÃnÑFî†Ë•×d[ù1šrÛíñ}„ðÚ+#Íñ AÜ%Ñ,”A¹@×ÚÔtNoµß±Q°‘3ßEÜ?ÆepÔ—=”ÞÝ®ž=]º„Ì[4–äÌ©ýZ¥;ÞI2Á»Éo!ë”ç‹%laF‡D?èþ!â=l”ÅÜÕ&N¦QúbµÚçÆPvi¬€M“(ªîgFÚ®¿å¶ö²¢?®rì-ì_½ÚaÓW—gÖàüÖúðݤZ.›®ˆP¥n¯oÔx*° [6p}X`¥°éÅHV_~JžG€.>;¤­ {Éu… Q¾7ªfUëÆ(W˜/²tÊš!Ë^$Êñö‹Yq4^OÙó×x;I³þŠ/4 y©ÏÙ1£ 2Ì–>/XObject<<>>>>>>endobj -1483 0 obj<>stream -xWkoã6üž_±(p½à(¶“8òlÓ^M ´DE¼H¢Ž¤âS}gIÙQt)Z‡»³e’»;3;K}ݘÐ&´?¥%åÆ8Óìà0ڥ݃}|žâ¯‘”mœÄÛ‡4Ù§8ÖÙl/: 8%l)N6gÑaDg7WǗמÞ\Çw7Ÿ#÷ÍÑ=ª*ÕKK×1éR¨ŠNuåŒ.>Å_6Æ´5#\œnþH÷¢\~º}±G“ ‡šN£éx‚E‡ÑxgÊËnµµjQ´tÓ¸T8™Òþ5Jøó¶/v»8y2‹Æ³=ÞçÊ’¨kY¥ê-…%mÔ“ªDƒDãrmpТ¥_u^Ñ/KS[géŒ\.Cfx*JUJ8LUIѤؔKHÎ{‹ƒîD>ÏZ[N˵Q¨hÖåµµ.i?:%]ßÄçt–­ÒߤqqBI?¼…­æŸ²¶ô§I9|ˤ!|Ö•$[ËDe*¡RbmÊÅp­²r*NéŠCöRv¹p”ˆŠš*•†‘©èþê„ROè}Cò°T¥}¼Ë÷Ò¼ ‰hBKÇêÂcû"°¸±ƒ ‰.kQ) ~€ìBX`ª+>øu‘üæde‘«åª˜‹ÏÇ× ¼Oˆ1EŒÚh§]D}¥)VXÚ$2„»R‰ÑVgnkÎR´ÐCF©åjÑ8U=ùHEˆ·ˆ$'8Ɉî¥ìï… YQÖJÑÙ l®—ˆßZP j.ý€‰‘üåmû -…Í«ó!›ä²ä˜Ç«ð-£•/¥OÏñ•—$–Mg¡õú¿ò8Ë'gz„£[’Š# ºà.ÎT!=g ªr¬˜õùæãÍÝo?ßÝ<ÜÒR›gìg¥¡Æ"aýüWÃÅê/Â@Üjå!Hp»\H3¢[£JaÚÕº$ ú}Ü‘<7õ÷+çŸ"ßrV”¨j3ïkº¹ßžÒ£05çGtë,t+\îkô0xüɪRbX,4 -1:;" ÉZ[æ*É}¯õJ}§RQhˆq ä{êÒk*EÕR-5ÔÇ|ÃØ:¬HÖXèz„n¤Bº\`Ë-•R ƒÑXB™áÉ稷íE&ÛÂÕJð–ÛŽ<°™{.|âfj{í#Âú1 ASèSî}f} TÚíèë2ÊÁâÕ_AMªB»•á37£Ê‚R Κor5òk)€ñ~¨àûgB–0déEfšÊ# }aà z¯%dõ¢Œ®J$².C@óÝZ?RÂÄ):«î™[¢‘A=›"Ï0QÓ¶%vðX*´HÅ|ja`Jœ+p•<˨©uÑ%šQ$nÄ?ý ÆØPÚ°d¦]¬cz -ßJÑR%áÈø¹‚áô»4ˆ„¢Z3J)îçÆÞ±g¡1‚볊{È—"AF’³F½œœÞ%Ôž²ï—5'ŠÔÚ¿uuèùÛéÑ|þxy}Ïç?1⯷„M¸¾¡÷^ÖwZ»óyø²3ϹmÔSÇÑÊ,¹ž$ˆÇšç© -žðÎFõ‚ÕŽQÈÎu˜©Lrý&Ówò'êEúùâGZ ¦ëE/úV70‹w 4¨De\¡`ÞfX¢¼mE»ÿd“‰¦€Ä¹£nWâÆïÝÉʤYß~zT@«¢»PôQÑz0÷n¾Åpa 7Ž·³ÓÈ×CŸsæ÷ÇWƒôX#÷ç§w—ñ]ah\;wðêxÆ Â*Ë\QŒC ÷Ä¡/U.P¼¯†03’é{r·¤ O$fBó½‹ÊC0ÀF¥NeR´|?Y'Ûóe”ºvÁ²AGöî žÕÒÊâ·pMÿ¤õ Å1¥Âõó:Cwy4_3êî\Mªábß6°oQ| ñÒJõ{ ôÚûÉ®'<œi¯]Ò×/{/PãyÉ ÷ò úyÂOùÚöqèoë2}™âAžkÌz€Lœ6툞ŒÆÕ \*l®jÌk$óìtÍnÃ-!Qø.#¿}qÐÙÍd†¦ƒ¼íF{;üÒžãj¢¿à|\8’†GÈúâד°ck|ÈëÿÇ+õ^šv÷w£ýÙÞÎpÖÞ˜³;7~ßø4Z™Ëendstream -endobj -1484 0 obj<>/XObject<<>>>>>>endobj -1485 0 obj<>stream +‘ŽK-¥¾¬á÷mÒE›£I¦!!‰×¹ê%‘Ù‹RW Ý,É»2"òŠíÅ¥"äÑ]<äHHø_´,ûDÜÁTKdÃ4s!Э®k.0oª¦Dæq>^^_ÑBo Õ¡Å»àl6›Äß™õz› E{ˆmó¹ç«E²ƒKŠP•/·õ¢ …kV¡Ó¢Ç UVYV¨hxÊÕ–©Eч뫺†Í9]*k–ÇÖk©£(»8¦óxš†ˆŒY·0„~¯ÀèéDçM¢š˜´rœíLS¨–‚+v«¿BPnÏb}p•^ݼ™¢ø +ø° z™YúÞË2MêÚU +5.îüdÍç¼-  œd‹A’¹ª÷ßò.+{6äøÿeZßÌ>Äg]™ƒ¦·—ä×:ó¯i)ußIe²Úy·„ й«ˆº—׫£ó§¬è¦Ãd2™Ð`ÄcœŒ)hÑþ¶Ü'ÉÙýnÂc vü€ÂGÞÐ +í‹iìëŽ=“œÿ[”Ò2Ãã#¼Îu«È6ÕîÉ­Ö\b9=•Ð[²k±ß“ÞÉÃ,$TÂŒ§½TããôÝñ!³,HÖîEO÷¬6mÖkW?c´ÿ}Nhùw-ŠÁña·}ƒÿÚÀdéÿ"ñƒ«‘6gïÞ¢œ¹.”ÂêºÁ®˜÷{tÕîÁFð¬Ö" ø S>ï{¹³ LzÕÂ5!jì²F¨NK%´ªvæH\}mCO”‰Þ£½[° g¥i±(9HëR+w !ÑñÐWÉy£Ó˜ +sØ…Å€‰ÿv.°âΑ¥âë;¬íqN²-0¬àpW®Ö_hmGúƒ¦•žÇºÜaÔöÖ ·J¸É£%——DŠMk<+f#dŸÃŠ¯¼L½Ò70$Z¼:À©± ¤8vz4ž2g°jQn%ÊU$²¾˜˜p³˜Ú0@*Ýle—2¥0”œÒÓrëxIø¯U å¿!œÁ_.ùš„>E>VìËÁ»Á›çF¦’]úï°Ã@Ü- +¥KóÞ(ºúçt?Ëpšç<ŸËÝ…+¢„c‡Ne…Îî Ã`>j¾BSœÕÈqD±Rwh³|+hË,Çó/.j£—'˜›ù*°Ä_»s:ËÕÂ\ÛñBé9‚‡·a_ht#ÔF[Th9(ç vžÍétÊ=µðdCÚf.‡ô#xšïÌ0Éùx×Í\ £Q+.qãFüæXÍ篾B˜c(ùú³g'Œ2dÍ2l©sÓ©xl-\i04ùÜEø‡ré(PÑIÜ3À¾¬8ÁÍ +k a'ô£¬ß Ë=mj|êùTþÆÔˆ8^èwþ(ÁdŽ¹++øÆÁi)4$¦6æ~üåÄð`;©ÿLmAš&•I“8ŒI{nÒŠdÒ•a' +Š-Ig…5™*ºU ÃµvÈRàÜK,[o>«Í‚Ùö=fCìDŽpˆÄl¶•§ Z·U6ÅÖЩڦ³A×Ì"\ŒKÜûeÐöÐû —ñ—%=ô-VÅQ—;ªt#;ø„æZ•xËWO8¤˜Âu}"’~?ž-=ï¼¹ø• Tóá~ä:ÛÍ"ƒ_ÆÎS|ã/düièâöò‚>ÔëÝKnâÜ`‹_§F)‹ù~vôãÑod­õendstream +endobj +1475 0 obj<>/XObject<>>>/Annots 709 0 R>>endobj +1476 0 obj<>stream +x¥X]oÛÊ}ׯ˜·*…E‹²¬Û¢…}o’ +¨ßHEZÀ/+r%nLr™Ý¥ýûžÙ]Ê4Q (Š$Ž)rwgÎœsf¨£”¦ø“ÒrF7 ʪÑ4™â“˯ŸG‹i²¢Û9ÿ¬(½½½\•´ÍnæÉ ÝΖÉwg·‹d¯ø.ö¡ùr•Ìh¾Zâ÷þI‡ÑJ—øÔŸÍ¿¤Øtž®“9‡p½Içô›¦ßG÷»Ñõ§9¥)íâbµ¤]îÛÒ.´9 ““r¤kÂu›|Ø}M¦4Io°ó.ÿK·T©cáHÕYÙæ’¸þ´ˆûŽ©Æ)Q†»ãÆTê#T)-ŒrNÖ$ Êå¾=R)_eIV:rš„¥ªÍ +þ6Mè©”ÂJÊuýÇ›öb±²ÎÉ’dí à3ö­Ã¥nïuT¯Ò?‘éÚÉŸÈìƒü*i­8J듼þ”Å&išLon¨Kùyv;¥÷ùÄ'&³P*Ïã'm­Ú—çç´90rTœ-(ÓUSJ'©–®°ÎˆLÒó˜FW>ÝÈZÕÇ.¶F5ˆY÷â|þÀ§÷«Àûg¢d?&¿Þ=y€·“,Ëÿ?©ˆ¼+Tý‚ÓŒ<´ey¦½7™s"í#WQgm…"øòÕ$+¡Ê„~ÕµU¹4 „uü —ÊH[ÔÃR2k,(óÞëüÜá«”ÐË­¨ö‚xÞ°T«ŽÀ +´¡¢=å¶ÚãHÔ¹‘À_!¸mÆ™DY¢"2÷jüaÕ­ö Èr@,¯21QÊÁ°Ìisþk Â-*¼±¥Åd6OÖ‹%MnÖP6èò7}BX´¡#(¯“ï’Š‡túé»ýw:0ËG[‹Š!­ô+2ñ„ÿ¢«ã%5%sItŠU€>–ò÷ÌéÉì³Ç·p®ùåúÚCžø2$Ú¯(+UöÂŽ’à‰u°¯0èY_ž +ØÝ^ÜbÛ66ž oæ4¦ÿ²®/…­gh%0xb8¬ÃpœÐpQšB4Ê‘THãí«‡nßm¨ÑœI4‰N’ 4öâ ­¡†ÿ«¨±¾·xÆß9HcV¤µØ£P6Š<bŽÐÖ°G ÖÁ£3¾8€éX2ZÂÄ9I’à=ÃZ&«”Ö³èE3P-¤¾Fg`·ŸÌVIº†‰ƒD+& úN‚®´j–©3ºôŽÿMÕ¹>YZÿ¼~øø¾Ù,™MSlµ†9úVÀz<è²Ô'ÆÂB +4`§Å¶ÑÄ£ßj£Žª%ýöåánó˜8X1wä)_•n-|%ö“œNÊ|‘zྷ¬PoƒFCÊÒ"gž;Ïéž•è—I'Ç1m™ñҹ☯è–Sð§¼Ïz|Å×}¾íÏôUewÊ-~62´È <¨E€ç÷3™´y9Ý6…ü)2‡¤/’d—=zÓ‘¦²œ$ú¯¡½AEp3`®à”¬¡_$î¹"`å`¨Qh„b„E‹3Ð3áË“ |Ì «…µ8°nsoäñ•ç +Ú†¦ +’ˆÌÓÑûl ,¡»ÒjOÏ,ºø ‘°•/`ÒÜ­ ˆ£÷A´VX¾7¿3ÙÖ?ZL/f$pd:ùa!à‰6Rcõ«4ƒÔŸÇ»xÇ{ˆFîðô³u ^hòö þ •½âÖ™kŒ( O.0‚vŸ©Ö§ç3^¼ +Ø>ܳ»±"0°­ƒR¬m‘½ü Ö¹P_7 ='„賉M§[h Ý–ài† óBœV,?U£;Cø=¡Ç…èÐÖ^¥¢TÎ÷¼"Çt EUð7¬ñ“\¯Àü$n#›u ÞtÿõË·íæñ3ë:¡£9 +^k”û*µc²g®vhÁˆÁ¸‚ë 5³XÚP”!Úk[§³úè©,RNÂÊN3•Î1P²Ð †¬µl¾¡#òhTI,ndWž¹? ”ßÌè6ŽfF5Ž 0˜Çì×aºå¹ùaK‘òeW~¾wwýÏh³=|—0Ãpèí0r¹˜²¼30Y/iÄ€;J~ƒØ™m=Z²|;J”-€áj û¨ŠÈ3f»‘?0ÄÊQ‹®ž™Á|Êà1]ó|:ÊÈÕÄ Á¦$é»Þt^A5xÎT¸…IÐ…ÂvÍ*@“…£Öʆ8´t‘W +a^ÆÔ…™ÇNdS…dîDЮyçášß¼º¬k•c(GÆ™‘8®‡÷­/aßÁZpüɾ;I9äEp0@%2á=0Q²­Ãœ!0¼ÍœßÊ "Ë“S>u,©¬,_Ùm|ž©º ] +㮆™çø<€Áê³äÐ,ýhR}3c?2*Y©q,wÛWÓ£óG*.´E„Š~qxèÖO9ìæ•xñ3¤‰ögquð= csPÊ«áPÒ€ÚŸÂÒŽè¦?µÝ òû áÄ„ö‡£ì;A²¢0²Ô%HÌáḏE¢>¹´/N£éâ9ðÅð@W‡×ÚÞØwÞiJŒ8žÃïêØë஀½õʵÇK0„ʵ‚x¥Ö<¢}øª\\ÀS¦A¦˜GÙ°Á‚€Ø/|ß¼ÍûPSì/¥ò´ãÛ<õÜÍ’qD²í0Å0U n ÷ý3Š= y ⛥¤¼æ~óeKþm#LpN³¿p›ìß.ÅYš`1à¬Ð`[p„à Pîú!ïÙ—wì4‰#ë*¾¤s|¿±º¡Å߆,nyhÝÞ=ÜßÑ“Ñß¡1L¯áÓ†ƒŸ¤x”—L–Óõÿ4äΗód¹Xáœ2Ÿófw£ßGÿ‰•¿nendstream +endobj +1477 0 obj<>/XObject<>>>>>endobj +1478 0 obj<>stream +xXkoÛÈýî_qᶨØ´$Ëz( +?·ÖŽ7Vš- /#rhMLrEÿ¾çÞáЭ"ØM@âã>Ï9÷Ž¾ ¨¿š é|Lq~Ôú4š ¢¦|â_©)=úFƒI4ôó‡A4¥óÑ9þÇ[g÷ƒ º±ô›¼qMº¯_ÍÎîF4ÐÌ¿õétpŽðçIo³qftQñ+û+t\ÁŸÅ¼í-Ÿü8‚§E/±Ú‘*èùáÊiçtU¯_|À•ä ÝqxÿtýWr+…z.zµ3ÅKc«‚kØ‘OQ¢á0"6+§Ã1Zr h—çË««ÔgÄü«”¥ÔßjíªPÌRW¥Ñ¨®”g·Š¨ZùwÇIÚ¢°‹K³®Þ…uþó°ök)íóaùô¹`N«2^! ô +A.lB&%@_R[ã+_ŠQð¥2¸–8¾˜bö{C/GŸŸçHÒ™¤e( É11`~eËm[êö‹·RŸÏ¢ñ!ü·íkr{—@¨ƒµ6ü&dàÃ1쪺„Üغêâlkk¡[ëؤZ{$s.;c£ÁµH…T¹/¥2a¶ »Ö¬ƒ¼€2­n®#ú²‚3¸r…ˆB»¼1÷Í·÷ §:>ýPc‹ŽÑ½è)Yºþ‰ç™_xJ|à²qÂ=ˆõå] Å\­(­q…5zñ!L†V×õ‹µX­8Bg#ú/¶[Ù:KÐÄ\çKf'ïô\8(µÔ±Ô/ð)wpQ°ó—Árï¨ÁX7¢»DÙŽLyÌJÙ6ƒ4ùSÄ!³1óÛ»D…›¹žh„ÕçýR·jÇ ^áâîúlÆ‹{¸ò;…`Ê*TZ²¥ñËÞ›<ðkAlLJ3M \톖*máWZ +–¤…o–Pmä uDT¸Ì·4ú§ÐäX&|£îܬ,0’ž b½fåc²5è‚"Z«¸ßUf®3o-l„q<â›uÛoü ÝñË4¤”g‹?í±d{aÆÁW¡h¶ƒE¿¯Ãˆö!ãøZðÀ—åX-±?úX¤x¥ã×÷³Žh6û[8ÍV&Ç”–ú(B]T rk="îÔn<£eyzuœîi›ßÀŽ[Q8ÆžZâ`Í\ +ƒÃ­7ç¿sæ ~œ‡¨=9®³¿]¼ªŒW·­Œ¼œPi^VÕ¿š@çahñ°‹¹¥ý$«Yƒ1‘Ÿ8ü%:5…ðÐõwܽÂ^§8r…:BâšIí·^ûQÙFmw0*Àh4¢ Rµ¢ëCk–“i3QXK§Ó!ñÛI*ÛÉóåÃÕ%=•ö+‹ŸQâš÷ 5RÕÁ¿ÄLÏétÒ—…äO-´£É(šŒ§~]°áÛùÑoGÿÑMÇendstream +endobj +1479 0 obj<>/XObject<>>>>>endobj +1480 0 obj<>stream +x¥WkÛ6ü~¿bà `ë,ÙçG€~È¥I{@êæá -â  %ÊfO‘Šsÿ¾³¤(ûì4 ÒÈ6ÉÝ™¥>Å4À_L“„†cJ˳OO¢ÄËq4¥ñhøÇË›øŠ~Öôúl èj0‰†4šNðœà-)ÿêþáU]µûGûýÃáðt?f§?\/Î._Ì(Ñ"Gzã)2ÂòÁ€éÅU4’ˆžé*Wë¦VéŠn*cë&ågó„ÞJkUµ¦fKo´(ùñ‘5½ªu® +i/þFˆ1Å1‡H’(ÄÔO¦Ñh˜ ÖÅü÷Åó~Ѩ]tÑ´m!Ól·º¶¤ e*Ïe-+K¹®éUÍþ$Qeü4_D|R?Dçq³‹k‰Å{MÚÃInôŽ¬¦´-MRÝfböH¹x‘ySðZ#¥Ûv“ÒB!Wé€úñ FHUn Yržv# º(…mji\ŠX—ŒÑ~¬ó§µg J4—–QüEÚ›*× Á§Fœ¤ù0,ª?b|ZKwSµL­®ï¾å|ÚqåÛ§¿½ÔkP÷Í«gËí6*Ý0¬PH±կʠõUZ4Ç?Á•ÌÈUÂ- €“Îó å€Ñ1šIV}½`š˜E³È+5ŽX™Þ÷dË9_¾;àßÄnÕ…½{üWÊûu¡W¢ø@è¹DS®"–¾óÌuQ趼à’äÁü_>~âhæ-¦ŸŒ|Æ…ëÈVØ ýDKü (8rï?2—ºO¼|¹<·\–Ðs»ƒ¿üJy Ë­Éd.šÂÛ…eJê­ó19 ä@)—ÁJcTzu÷ÝŽ$˜%`¼»‰»u ÇaÊ-ÿÅQÅ섶W}±Ÿßÿ[ÓÖ[ã1^h¦C¼aÄÑ0ž² p+»~Êï cà&mø¶ì®­œb?léO¸;„+Î}$àed4E“ño;8s4æPÏg¯Ïþ •gÑendstream +endobj +1481 0 obj<>/XObject<>>>>>endobj +1482 0 obj<>stream +xXoÛÆüߟb! H´$K– xHêWÀh󣌾‡*(NäIº˜¼côÃwöŽ'©tRM`X6ÉÛÝÙÙÙ¡¿œi„ÿcšOèòŠòêì çÙ$þ–?Œ³kºšÍ²)_¼¸OéÖÐÏg£lDWÓYvIÓë9>Oðe%­ÏÞ,Î.~Ñ -Ö8äê +ÂÝ£-òóÒlŒ¦Zø-½¢%þ}÷ÓrY[³V¥tøéþÅâ3žŸÒxÌL&Ùd4¦ádžM/'8éüŽ¶âQ’6žò­ÌdA»­ðÔ×ÒSã$]lM%ûTé¡Þ-p]jêÅÈ|±GÊ‘Ãí‘X™G™Å 7mÐaŠzy™]OGq>Ë®³I6ÍèW¥ ³stó?ú³¦Ò7õ_Ó!ã+ †'åà‚3³´VÖyB"Ž”æ䎧 ÈoP·f·¯œen¥ð²„T^SÒ:ê}ôÂzz+uÓplD_¢[ˆØ»•îÁ›º7 rÜXQ¹ ]Pïô[cŠ^F‹­V…²2÷Æ*`Å7 e)7ÚKííTYÒJR%í†qVè§Yš\”¨HK `qnFùËårñ:í1C¡E%׬œüÒ â´âAéMˆSÀ… ùòÚšŠ¤È·ýß4à!Q-Ö›@Îò·MiV¢üD¦ö!³^mQ´{râ_Ñ^:Ém °üÚňZ¸ÛIí”WxøU'¸6 ÚiÑŽ_ ¥=¾¥V^”TJï¹iøU•7À?½'³•¶úyB"tëH‹@îb mhW˨öW±–Vê\ºŒîÖ´7 úæÐ7CR¯Í%ØÈäGä“›À94g)Û©ÏŒ ¡#Ä6{ûúx Ö…๊vVyœŸ#ºãˆ~ óC¡ èËa,Þëõaf€-ß*-´Ás†¾GÖ”ôAhYÒøîÜG¢:Y‚¸áˆ{$—fAÅ*ÃDòÕN ’×@ù-yÄ©€ÀQ1ÝN ÈpçÿþÇ­%¡ß!7¿3Ôfb榪ô”µreŒ!Zi +ÇqøÍ¿¯㊒Pý÷¥ +C`,½U¹5ά=µ—ýÁ‘†'€Ž,ˆhPÿ'³á‘CÊÐÄ[Ã4í!ÐPÃ5ÏJÊ@}°ªvOx ‰ýcÝ`ϱG£®à¯0óÿ䓈áp2£ál‚=u»×}5¤á]P‚†§¡£a§hA+…ý¸a‰‰Œ€àäÕüefâÚŠB#ÜvEª"ur1Иž5öÁ‘fÏ©ÃŒƒ4®ÌSXCAâ~cýÀ4D ÉLÞOÐPç¥(8§Ïë|ç±Oàú¾–,¼Üu'ª !ãÝŒGRÀå9Æ,ˆ3n´éÒÒÓ#Ÿ”óQVRXØ‚rR#'à€hp¤ö*ç­~‚/ƣ̀ÇåÀ¥.eâë0¦ñþNè–x¡*,׺Æfîñ˃°!bƒÓâ}Ñ‚ÚmÚ{t;àÒßÂ)­$ŒŒk‚¶¯›²ÜÓ£(Uí #š¸xsÐòX¶âµS…Mï/póáX(ëóØm`€VOÂËq¾à– g´\KKͱäð© £ôý§]ÔÇ¢ï³Â“¼ó(³w¢¦Fþ­ã)¢¥„ °Ä›²`c$VðkTùÄ[$æqpO`%òê—מ\-sµV¨´edëPÙ÷‚PwX`[Õš·m+Ô§fïï<á7Œ`2ÑT‡·–³ šÏ”ügR•K1#x½ ëc4M(MxêSôÀf½¦åyÛO9Ý÷P¤¢‹žª°fE14AVÁlhz9\¾f0Òì¨,aBZŠÅj`B‹c`Á[ ^lÈfŒe¼Å3¦ÞiZ¨6˜àP^2k‡NŸŒé1‡‹‘i¦–{UÈ5@ûš©N@žxb-w’œêàÑ8rtÉlñº-¼‹*Ö ÃŠI]ŸæNpn›y*”í¾‹¦‹p)­50·‡m»»™uàk³#ê'ÍŸÈ”…7 rUCª0LG ãŽâ»™8VVî²E?£7ÂAG!D‡ýÕub³Œ·ZÉj¶FMûoß%C˜{­žâ‹X-m¥\|«á$ ÿ°ñ[U“U›-’mj3êD>Nz¢Â =p +éß5 C`ªö5mjÍ6hËÈ…4ìèÓtAÖ#r­jáLi€TÁ[IÙ8™ð¢ {‚Ã4iùtx_ ½ß6™Ç !bÞ -ÅîÞ°žõ Ü!ŸøÊËÖ¯^üpݾe¯ðgƒëKºšÏ²Éì’½ÝÇ×oß¼f?÷™Íý­É› +ËRðÛƒ;L ç#þ«BûVί +kµil¸‘î` +l“‡W¾—ürîp5ýÒZý{^ÈÂï%ÁìMçÓl~u¿VàÌéœCýwqöóÙŸÎë¥Ñendstream +endobj +1483 0 obj<>/XObject<>>>>>endobj +1484 0 obj<>stream +x•W]oÛH|÷¯hX¬H´¾,ɾ'oœìgû²í‡(0FäHœˆä(3¤ýû­žR”¼ûp âØ29Ý]U]Ýóýb@}üÐtH£ ÅùE?êÓh4Â×ñlŠ¯Cü3’Vßi0†þqþfÍh8æ¯xëêa0¦{M¿_ü2¿¸ú8¦Á€æ+>r2›Ò2UáN5r-UFò‡ÄzmDÞ%Q$ÈAoÀ-¿Ø§Þpù½ßþýá¯ÿy÷øút÷þ·‡ç‹Å‹*½·‹ÅûÊY”ÿ•Æ*],ŸŒ^©L>*[žsÐíU–Ñ +ï"á5sèÒJ’"NÉ ,ŸD™Fô¬KéÒŽuQâËh•©²´‘Z\fj#³•š–Ò!€ÌëŠãÛÅb_gŠR93äÌ +‘ËÅ».Ÿ\P"3¢ð¡­ø.;¦ÂÈï•22qY:¨[}ùðC•5¶¨ÜˆÖækCÊÍЃ9ô¼\}œY8†ú×Ñ„¡~¹ûãùáùW®ã(œKê¡6À$}¢,NéüùÅz  9 Uh‰Ÿk—³¸tнsÜþ?Ø„ÝðÙ9)&˜¥b'AêT¾Õ¦E ž6Yd„\´ËE”`7¥ÞXWEHÍN¶¦¤\UÔfæŸË=-0FHÐRÄ›jËr^N5è]Nê,¬²…”‰Lï‡>Œà/ ¦pý0^Öu+pÿ‡5ÚˆÖ¨NȪÃl‰h[„œÎöä‹AìÖª÷d·2V+ËÔèj:[9é¾­€Ka ‡Äp ûX^†Óh6rëË—lg4è‹j}3ÅHTÀ„HÊÚ‚]gCQ üqÑóªZ,Róè{òecô9ÆWÐnæÒSŠz]»¡ŠX ÆCe +à 8Ë)˜W²ÿ¼9cL˜L a¾¿¸Ø_ÏP²©EªÐ^‰†F^ ]¾Âä4â`·*˜¤¥ô Ì po#Htì œÏtvðÛÚzl¾OQ°Êãüøp^‡jnietÞÎœ\®a—yK ”€q·W௣)ð“/vð,±Dg±I0Žu+} +;ÙmmĉQ;Ùauá]›ê*KXBl¨¶“ÞvΪ ®£Qv ~;4fó.â¹UÄ|« +ÏLÓ‹…Üס™¥Î±‚Ú@ê-UúµŠhC´^Ý€×f {Eé% áéè»ϧ2ƒƒbÞ„ºyËa©0ÀKgæY™ŒnfuC‘+@` ߆…a/æíÛ‡a:»0%žÊL¸U`UpTç¼{£°ín¥É•å÷Zß׎õU•egáC¾@ÇMNžŠ¬¿Pí4ì:o{våZ'ôW§Ö3>á,vƒ¨ëE‰[‡Oqm:IªÊEQaNC­+EËýŒxÄoËÈÁ‰1 +*¤­r¨fYyxÎÂ3‹¥ä}šmÑ;=1D5‰‡.”º4¸I'öo 8&'® ¥¿¿¹Æ®Â´ñ΀„ ȺàÀôp^”X·NýgÄ¿u9B +¼ùcä0žÇX¬±”Ú¿jžO?ö­Ý~šÖ´7työø<,å|# ;%CS`I‹è¡lèÜm·™ +Ãà^”Âo¤®W±Â·Ú³š;÷þŽÀëìóq³ýìîO¸„Íîá7Û“i¼­ÌVŒy¸{_߇­YÆí¬¾…Mp¿Ÿh2E“É5ßÅ>ß=ýrÇ—§o¼ìßë*Ïs»r¾½Ax¥7íßðó~LÓ{]¬Ôº2~>à†o*g:ö–>‡Q…æ°ÓüÉÎŽ ͽd<GÓÉÌßâÇ3õa~ñûÅ_?>/XObject<>>>>>endobj +1486 0 obj<>stream +x}WÛnÛF}÷W M‹–dÝ Nœ¢jÕ‰UAU+re±¢¸Ìî2²þ¾gfIŠa$p"‹Ë¹œ9sföëÙø;¤Ùˆ.§ïϾÒp·üaÍi:à^ÜÇtcèãÙ ÐørÍh<Ÿáó?VÓF\NÆѤûà%׃QtUžÃ/›³õÿ¹¿œF㮓w˳‹ßÆ4Òrƒ¦ó-B°ƒ-ãW ã·iþDª(´²Ž¼¡µ&çÕ ¥9ù­¦èþæ’Ôê_ÏIåxä¥-ŒÓ”:ŠKkuî³#•ù.7‡•6Ä”:Wâ´rtÔ¾¦Ò¹„ßEUí´ë¦ôÈ\Þ=†tÙ9G+…à\øm¯¼ç€…ìV;“}ÓÉ?u^5gœ£Nµá— “ôI;ðAW˜<ÑyÌyÂו6¦Ì“Ð* +E`x$U»×øZêQ±Ûu2C—àîB®º°†¿Íþ2Ï´sÔs—ú#½·=éÍb±ÇÂS¡œ;›8<>j׫šÑt| +w?,Þúr¿¼ýsùg¿zÍEk;W¹¨M×íø–Ò"RI4\„‹Ð!v±lÞ±]—@)‰èC*Р!ñ?¤Á¡Wi–¡g™qxÀuF'êB â˜à‡ßÉB阻\/8Ã>¨&)úG=¡ +6ÀµNÁÓa˜Ò‹9)šŽeF:Md÷Âg«¿–Á„ÖÇnH…¦qAí{ýܪÃ(6©;vÝQö,bëÌ$µæè€BÍ™7*÷‹£Pkåcà¶{Œäk®l'°Ç}éü# ›ÁzKŠŒ=u-ºý¤7•åóúD*äqñÛU5Wú]ÕZ4‰æÑ(šFô9Í!+Ò«"ÝN{$53b‰.‘å†á2¢?1‰ +V[r…ŽÓÍQ”)?¢x~‹!kü0Kw˜´ˆ›‘àÙ! +d¸˜î×0S|à$z/v‰M™%µ§`½ íi0bB|?ŽDáâ +­þp÷®j ³Ì ˆšÄ‹g·¡IÈ•Ea,ÊþEEšNxó`‡ÁpžEô°U2ÒîÃÐt(°?hÓ竉ÈBGÿÇÑ TbR±]ÃÑ”çæ½ñÜÂ}ólÊi^LM[øܬ¢eßÕv8“+6v‹ôYŽ›)_›§í·¹·ê›æqE‰Î4ûI}½ú”ÆÈ+‘ì +½zÍ!ŸØÖL>”/nT™ñâu€ ‚)³ÂŸ_øù+âjOÀ 2˜{h%¸[tPÙf×éªÇÆDnú¡f« ]óŽÔ£tÓæ*Re66Ñ€?±Ð’wËŽã¿à…î‚‚u9Œ×€d®÷Kh Çí ŸÕ¾ÈÛϯVU‡÷¡Š-éüN?É¥1)°@_·(#WCô»•·D[BÆ1ªtëÁ{`|9T.Åq AXQì^YOw:/é‚n´Û±N°Œ3Ý¥·_ƥתÇÛÊ?®n“O¾ß±„Ì[–÷áĪÃZÅ;^A+2AºÉmÑÕ1OCXºrí#ý¬Ï;ÎD¼—€²‡Û2³Ÿi¿Y­iž{PVgl| MYênó;#mÖßRS:ÙÈO€ëç[ ËWÇ=TújÒ79ÎoóÿT«á¤ªŠ4ªøs¼£aŠ±û·`ß@ô¡€…Âb6"ÙtùæК6<œ]¸eHY+&v‚k¢4:Õtµ¨5S€+ÌÙ1e« †U/¥½ìbT´¦ë9Œ5® +BÒD6úö.!<óé^_°$bF¡Ë0[Ò b²ú¡"²r³>Hê(I®ùâR•Ž†´Û{,˜Ü¹ø¸¬ jì0˜ Ë:®Jihz>nLmk–'ZT4A$€Û¨·ŠÍ: e:n±­ó,öô˜í°R[•» ¿¨hfê©þõV0¯Êp<ŽæóM§ƒh<œðx¸¾{wM÷ÖüË×­—¼éȸæúÃ)®ÎóKêÏ24Âtãkbë–p›;oËX6Å7ô ½ç­LüdÂÝJäN„_lw<G³é÷_Ä0¾â¯>,Ï>žý¡ï.endstream +endobj +1487 0 obj<>/XObject<>>>>>endobj +1488 0 obj<>stream +xWkoÛFüî_±ÆdZ[Vü¡€_iÝÆ–cÑ0 +(NäѼ˜ä1wGËì¯ïì‘’iÆE‹"€#ñq»;3;»ú¾3¢!þèhL“)EùÎwãæ*3šŽƒ¾¹9:¤sM_wNÃýÏŸð,… žÎFÆ4 †Ã!…Ñîað) óùÕÉåõŸgóëðvþ%pÏŽŽé^±^[ºqP.TAgºpFgÃo;CÚ*Œw¢…ÈW‚¯î>¤ÎOh<ÆÃíMFÁpŒÐñî¶V­²šæ•‹…“1]á¯QŸ·ÿù }sGfÁðð¿¦Ê’(KYÄê™ÖÂ’6êA"ÃI¢r©68iUÓo:-èW +¥)­3‚tB.•Mj¸*rEL8LQVÅx)•F¶¥Œ&ÀÑm¨Ô–ÓruÐT4Ýäµ)i|Ì&þñëyxAÇÍc›ôw)DXœÓ»×°eÒ¼óI i+ÉÈÌ£à4)‡o‰4„ϺdK©DE”K<s-\ª,œŠ„Sºè¥íRá(UE, SÐâê”bOè}Eò°T…Z¯ÃòBš'$1 F´6duæ¡}x¸²½ ‘ÎKQ( zìJX@ª >ø u‘|v²°ÈÕr¦âËÉ5(/ÄbŒ£4ÚéHgA7Å +‹«HƽpW*2ÚêÄímÑY‹rH(V`\­*§Š©²ñ1‚ä'ÐBÊVð^è̹|y™¡ô¦zÝjˆñ-…ªäÑx32’¿¼ m_ °©`qþC"d£Tæà˜^X0ZøRºôœ\yIrëM›ÖëÞmÈã,WœœuhŽnI*Ž@‚ÊŒ»8Q™ôœªÂ°bÖ—»÷óÛß¹ßÝÐZ›G¼ÏJC½Ôšç—¹z.6xvâNë)A§°ó•4º1*¦Þ<5…þ÷TDUùã“Ëo9+rÔ µ™J“:_ìé^˜Œs‰:‡sº.õ5z<þdU®2Ñ/…Ðd­­S¥¾×:¥¾Q©È4ĸòu÷é 5墨©”êc¾á lÖG$©,t=@7R&Ý.°æ–Š2)ÐÁh,¡Lÿä Ô[w"“­áj9xÍmKØL=—F>p3Õv a{™ ‚† )ô)÷>³ÞH,m„vôõå`ñê¯FMª3yó™9bTYP*ÂYË]®F~¯à 0Þwlÿ\ÈF‚,½ÈLUxd¡/¼Ð‹Þi Y<)£‹G5Ù–!2 ùf-€)aàd­Õ÷Ä­ÑÈ žMÈ'Œ½¨q]ˆoðTÊ´ˆÅ +|fje`-Jœ+p•<ʨ*uÐ%šQDnÀ·þc¼Ø Ú·aÉL»´±>Œè©ù–‹š + @Æl ÿ£ß¥AÄF˜MTëqæÏFúR +»¹±wlÅ™iL£ÆõYÅäs!#ÉsY£^NNïjÙ÷ó’Eju‰{íÅrãW‡Ž¿/—÷—××árù3#þ²%ìÂõ ½_xYßjíÞ/—Í—Éx¹ä¶Q-G³äB:’ kž§î)¸šÁ?ZÕ+V;JD!ÿ9×~¦2Jõ«LßÈ œ¨'éç‹i 5m/zÑ׺‚YÔXРý•@r™‚ x›a‰òkŠØý!›DT$Ö;èév#nÜo7$+£j»ýt¨€VE»PtQÐv0wÐl¾Å°06ÇëÙiäK‹¡Ï9óÅÉU/=ÖÈââìîö2ü£- ëñ`çàÞÏ4†°É2@ãÃ=rèK7 ¿WB˜ IÈô-¹¿YR O$fBų½ÊC°rˬIÑò~²M¶ã)~eꕺuÁ¼BGvvÏjneö„Î[I¸¦¿R{6Å1¹Âzy »<š/µ;Dk¸Ø† ìk¨¼´bý(ö¾C²Û 'FZàk7€tõËÞ Ôx^2èÝ[žA?Oø*¯múþ¶-£¡/Q<ÈSY‘Ó¦ЃÑX š¥Â¦ªÄ¼F2N—ì6ÜàÐ…ï2òûŸg­ÝŒ¦GÁp6¡éá$˜Œfü3B<=Án¢¿!6Ž¨â²Ý¼÷6¯ì ý”ÿñŠ:¿šŽ‚£é ?ÎûpÈé]„;_wþôœcendstream +endobj +1489 0 obj<>/XObject<<>>>>>>endobj +1490 0 obj<>stream xmUÛnÚ@|ç+ÎS›HÅ\B€ô\*Ej m\U•"UëõÛÚ^wwÊßwÎÚâTIL°÷\fÎœñŸÞˆ†øÑlLS’yo ir1¦4™ÏðÿVѺw÷Ÿ&4Q¼FÈt>£8%)–gw/Êîé».R³s´ŒÉíW9=ŸíŒýí¼ðÚ$íT–ñ§S!Ïç´Ó¸±/Š´wdvêm´óvæ{ çÝyü«7¤þè"£þ™ß O¥°^K] @@ -2922,12 +2964,12 @@ O oMSCP*¼H„SbýVíÉm0"Fš>/XObject<<>>>>/Annots 665 0 R>>endobj -1487 0 obj<>stream -xW]oÚJ}çWŒÔ—TR©ªòÑÜö¡InAÊ•’<,ö{c{ï:”Ïì®Á8éUUµª÷kfÎœ93¼tÔÇŸM†t2¦8ëô£>Vvÿüü«38™F#:L£>e4FÓð•ÒŒÏÓéx i4àÿCü-%-ÝÆàlßÛ˜ðHëÂżs|}FÃ>Í—ði<™Òº\‹ÂÊ’&}Ó²šÎcK  ?W]éL¨üãüßNŸzÃn]êÜ–:MqOå8yW•2ÝÒLd A»Í¤q•]L¼ ½“âÂ3“hÑ])KùR)£¬¤ŸR$*_±±ãë áÆp‚€qãB.5`ØêŠbø òJw‡=±ke(öu©H¥0’2ñ,ÉÀCl ëî -|Ä:Ã[V,RIe×üàR­ªöI„p'ÞSÙÝÕ%#“H—j!oRú¸{Øí}»½ŸßFÞýÀn“h9XW¥®òä·aÞ³£E÷˜–_è{ØÊD¼VyˆŠs$ÈŸÈ͉IõJç祒ÆZ–:£.ŸVé̵ܸ¼Wy¢7†næÁpD÷k™ËW¼'¨2þY¾Êv¨qü~ÿr8Òý#›ËNð­–IÏ®F€ð?Ê젅 +1491 0 obj<>/XObject<<>>>>/Annots 712 0 R>>endobj +1492 0 obj<>stream +xW]oÚJ}çWŒÔ—TR©ªòÑÜö¡InAÊ•’<,ö{c{ï:”Ïì®Á8éUUµª÷kfÎœ93¼tÔÇŸM†t2¦8ëô£>Vvÿüü«38™F#:L£>e4FÓð•ÒŒÏÓéx i4àÿCü-%-ÝÆàlßÛ˜ðHëÂżs|}FÃ>Í—ði<™Òº\‹ÂÊ’Æ}Ó²šÎcK  ?W]éL¨üãüßNŸzÃn]êÜ–:MqOå8yW•2ÝÒLd A»Í¤q•]L¼ ½“âÂ3ãhÑ])KùR)£¬¤ŸR$*_±±ãë áÆp‚€qãB.5`ØêŠbø òJw‡=±ke(öu©H¥0’2ñ,ÉÀCl ëî +|Ä:Ã[V,RIe×üàR­ªöI„p'ÞSÙÝÕ%#“H—j!oRú¸{Øí}»½ŸßFÞýÀnãh9XW¥®òä·aÞ³£E÷˜–_è{ØÊD¼VyˆŠs$ÈŸÈ͉IõJç祒ÆZ–:£.ŸVé̵ܸ¼Wy¢7†næÁpD÷k™ËW¼'¨2þY¾Êv¨qü~ÿr8Òý#›ËNð­–IÏ®F€ð?Ê젅 ¯%^+Ý“l?™t' a l$»²Û§„9 Ë#šÃ•×ݱ´FEª¤ñ,Î’^"FÐ#sXZ]Ù¥.a‡ä/‘anµHEŒá¨ÿfO ¥^*œP¦³± qâqòG—Uš’‹ –>^Žè«ŽÓMgž ¦²ÅÇ)`3ï6º ”¨c*·|vþÔ‹y BU$8ÎEa7šžAüM+v˜qõÀ†)ç}¢s”²ÊD¹}{±ÿãjåñ£Ë£ƒfÆe} 8 Jz<ºà>Ÿ\†\ýP%P `e°„źز߼Ԉ²|Çä°OkÔ2 ½ÈW­™T¤’uÍÁê÷™ŽHi`CÌ4sW뇒„Ó @@ -2937,476 +2979,407 @@ a l$ Qâ6Ê =?ý°JõB¤O=eäØC©˜lqïFgÆHû‰_=¾îÓY݃G^-XÙ¹ôÙûV›ïcø€š„BQ~¦­ÜQäð„ã¢Á+áÄaÇwý~Æ­G¤¤7ôfC©BCô°FœæÉ÷ zÈ¥u>‘Y3ÑDj4”aË@"|k4v×éñ‰Ñ/qFš Ôu ¡éCàÖM‘f{””L6N¢óÉ„Dn 8jÖb §ëéINtŒüæöÿæ‚®4ý—J¤jÉÝèÞ_WBå$|ñzgLú ¶¾5 ¼æ!iŽkµž•r¥œ°2D7Ò^|¿‘Ï<3³…–»úa{ˆùÊý÷› /á v °HG©EuA“õʘjô) 1íÞå¯vÁGË`•+Ì6;Ç\÷ N,Þu¿íÎñ¬@ ¯lhó\ö¥tÎ&5(-{‡¼F‡*&a–d; -HÀ4åBJt˜)ò­_Ô ‘ÅÌ‚9h¯º¨Å.-€ñCÅ¥6zi[Ö¯¼)ž9˜L~0q“3ünjG(¼à`(耵áñ©æ·?¤‰;;¾žî¸/ÿðçA£[óXò'? F“Q4Oñ›¢q:d¾Î;wþ™êB‘endstream -endobj -1488 0 obj<>/XObject<<>>>>>>endobj -1489 0 obj<>stream -xWËnÛH¼û+ØCÀ¢õ–œKàGŒø°NÖ"XÀ—9²“3 -gdEûõ[5CÊ4íd‹Àˆ$Îô£ºººùýh }üÈl(£©¤åQ?éËdÞO†2žÏðyˆ¿JË*<ŸN’ñkF“ñËç‹£“«SŒe±‚“é2ƒ~_éÛY2J‰|²;ɬv¢ä«­œW>·FV¹É$÷ÏJ•I­ñ•- -]}x·øÃc ¢áÞpÃoÏäf!»– Üòkݸ=ûýü ?(/;e`XIaSUÈÖéJ¼•¥µÅãóTyÉZ9þ"y2Dï}é FH^Ÿâ’•­$xIäÚÇœü:w²ÜãKnîáñFûóëÏ·bT©åûVWûp‹Öï+»ÝÄÁÈoƒ”v:î”sÛ`…<´J×bW!ËŸsƒ'¹—{ô–*}UeËð˜¾r>eÞ/ °Seð¿ÛÂÞ[Óñ\iØpÞ%²°b¬»ÑFœN·Uî÷²¶Ì/­_í:Ð83tºÐ)½{»ø|ùù}(=â³Ë I×Öis÷®ã÷•`[U’ˆLT‰œ­¹[£™ÉùV²\@:œFH‰æ5)Tn ¯¨ê¨µ’s°~G°Bðä/MuAá‚âWZ9ÄOûÏ"Ž÷¢zTy¡–yýT®:ÖL‰’á© ¢R¸,°xö{@´‹C´(9š Zñ˜§: -" -%PvM3ÂGÇ+;9ðlg~ųI3øNíNÕÁ•×D rë–€¡…™ûš,ˆ³îñ÷ sü€>Á¬åêöú²¥Çqá¨F§Ë€, •î`Þy Å”z¦®ò¢›ø¦Ê16O~?»øt}ó1¿Ú -2 ²f«2ûÅåðÆ* U’‰ ÜÈÑ@Ø«"‡ªwð½±;•©}‚Vj°ÿ2D0;…jWŠ‰Ï–‰Ü’Nû @M´žwü&( (y$‘±Õ¨|‡';»-20Þ P;„}'D?0Ùc -‚û&ëø±¨k•g:˜iåú#t$ÍÐ3­/7M¶°à¦Ç€‡t0ÀÖýgñs<Ù¹óÌœÖXô‡ºº-4Žq#Þw«ýÆ GªMv<{ÓðˆÜap'Wi½ŸõfÉ| §Ã(wÃéLâf Ï{ƒþ$2|øÿ4ù8æ2åÕR9Ì·¸Œ±;÷&]WÖäS}šçyyjæ• ÁBÐl&ØO´OOÂœÈá{\Å‚Gò7Jý¯¹CÕ½ØqT*'ÕA;âà†Œ¡ J•écR¿éEÒ9ªòVrs}‹3apR’¸ n y¤ãŽ\ÁQϪYÔµšÂÁr©áž§St›!ÉÞ(ú¢ÝÞ¯_²»ã¬>­–ès¦ÒT;.¢A@*9Ôk lýÎ^ùRÙo¨16ïdXOYnÞì5z³þi³ðÿï7ÝñlœÌ¦s¬©h†Éˆ>.Žþ8úÏæø endstream -endobj -1490 0 obj<>/XObject<<>>>>>>endobj -1491 0 obj<>stream -x•TËnÛH¼ë+ÈÁÞ`Ų,ɇ`açø¯ ØÃ"‡ÙÇ&g虡þ}ª‡”Ö–sYâkº«»ª“ŒRü2ZÎèlAy3I“”Î/2\ç«%®3üSæó4™\­'ï>§tAëP‹ -LšÒ:?ÝY÷°u¶ké=yÕlÔëûIJÓ,MV0<-l£´¡FùÀ6ÆþÞ ¶[k< zöbñîóœ²lˆ9- -0¡búw[ÛªL=çA[C¶Œß}³IrkÊýûÕÇ ­+íü}´Á7²¦îAy«cF‚hTÃtwùõêòM–ïÓ;ƒºÓ¡Š®ÿ\ßÜ‘g÷Än„²±Ô:»©¹!5DxE0QtÃáêúï;dŠ¡RAV&P8h2Ýð!A.hÓScQ#8¬aðÉ+mXÒ`j•Cú"îÉk­O¨´.FÞX w@?";j°¡]¥óJ()êŒ~ìø@"¦ÌG- - õ¹uºQ®§CÁ?Xœ­k¨5”ó‚²ùXγ,ÁcqºLΓ,¡/vG…¥k`¶µÎUªL¨g«¼ß!„®ù¯×M±Œï£ÏËFxæ(2{6^ýÉ®UR*K¹5wFU)‡¾[ÑÊÆøƒdoTÁ‘ƒtõX O°ï©ƒ'@–Ö#€ŒÀc¿¾äAÊÏ28P.öacÛÞwÄÞN›íoÄ¡˜Ž-‰n%÷(Æ>íÙbürèÑ£Œ043 -"µŒjàŸá?NüØé'U³ þOҚδ}ù k@°É]ßtª¥v;í^i&ͺaxïT/d=ù}VæGÌtél‘n1±cAdxÁo>vA×:`š}oòd¸Q®ÌQ[‹¹÷c?§Œo­ Iü¦ƒçº§QÌ !Tžsè­l‹·#rt-AQ–‚íê¸}M¤b®}ËG¨ƒ ã4¬Æå–-°„Wg4;Û2 Ý:{݆QÊ»+Ys‚8Ý›O—©¬áÿ?AóåŸ è§õäÛä^vôÜendstream -endobj -1492 0 obj<>/XObject<<>>>>>>endobj -1493 0 obj<>stream -x•U]oÛF|ׯX •’&©/º@Ë©¤qê¨) -(N䑼Š¼cŽ¤]ÿûÎIËr• …-È&÷vggf÷¾LB -ðÒ*¢Ù’’jøÍ/þ‚æñ -GøXI™{1‹c?:õ" -9îÕ‰7›ÉùÛ ŠÚd(²\Å´I 1†M:ݪ!ü -ú|}ÿÝßýöó åJ%µ†Ù¶JçÔÕÔ’’ÎZ©[ÚN?˜—¸‚p{Fµ•ž(ëBЃ´2šL6šùWÈ g}ÍGÕ´—¸ *wH­[•ˆ–ω¨›€~W:5 *ôn}åÓjk™vV6Tª¦•)Ì -|Jµ—åÃN -¡s>/XObject<<>>>>>>endobj -1495 0 obj<>stream -xV]o7|÷¯Xè¥v`>¬¯(P%VÐ µãJ -Š îÝ‘’gU(úß;KžlGrÚÆàó¹»³3³ûõ¤G]üôhܧ‹eåI7éÒ°?N4˜Œñ{ÿ­¤ûð¢ßëáñ…½~?¾x³<é¼P¯GË{MÆ´Ì º]Zf§ËµÔ”™²R…$¡sRÚyQ´e*H8ª]-Š„>›šÊÚy<ãCO…xðkdeŠÂl•^Ñ™Ê+£n!W¦IfôýåÙò RèÒë˜A»?@]Ëü”P’(Jú‘>ü4O>Ìæofó‹d>›þr͇ºÔîu“IüV䎜´ÒâÀÎÔ6ÙH›Jk\ÿ|tÂɬ¶ÊïðýôjqôZêÌî*O•pnk,®Ç½ÒÅlŸk÷GœÀÂ[•ùbG®’bƒbÏ9 Ê„&SªD,G‹2"¹Óôþ–Dž[é³¹§šz¯ñ'àš '÷¹^$ý;´b«ÐQ{ÓÎ¥—YédÒ|ÛEP¹M¹¡WÚøW¤¥ÌIp'B‘9Ý£Ëç$ -¿6õjMÈ{kôžO½£µ°e$Á}¨n-$-9YÝ0"¤‘¦(RÐǺgê¤"Ûðƒ6¶Å#Àh_Ó®ß9Z™JjïP>É?«X@`Z‰Ô º•_keQÆžYÿŸl-ôJ’3FÓ–3ÝJZIO©ô1DænÊqMæÝœ^®¬`¦ø:ï^S²`}´/vN’AB éë*°:ÒgM‡ÔÇ,Czà ôD¥ÒŠ gö«U#…¦?ž'åþEþýøäþØWû(zI0`ï_/|É7mòìÿj†èïãÒbargÝ5eQºmXõ‚Z¸ôi1›ßL¯g?·“Ê r5ì+ð;\±×`@{2Yy™ï“oH뙿)Ýg«úpõöê7—³KbÀ£ð‚;¥’ꪒ–etx€µ! -g¢IýMRAʬÜ“É]Ý,¨0f€XœÌ3 › ò¢).=_°ø - Uû5*Ý_Ü\ZŠÊ±LBÞR!€eã5Ò§Ê8 -^‚PÐÝ©’IxZçÃÛ-BièE)”>ˆ-¼ÙZæwgÉ¡EìW¿´ôð³—"FG‡èš&|Ñdà1ób+Ð-C ¤hqÐ_,Z­ÖžûŒ÷ð?à”Äù;ðÐ#€¨˜H߇‡*S8­Ÿ¡‰ž•Ccù? ›up´à^ü¤-L‘JkmEßàÄ9!¤úÔ ½X;b±Ññ÷[¡CyûiªW•±ø[Ñàø¦˜7ÀmTEÎ[ A0çeECtq Ëáß/0£Ñ¶ð#m¨Xjý¸yh×wœm˜Ð[Ôå#Ùxú×Ñ(3SkÏH?_ÚXD‚\±:¢Ö!n(—wždpì5?ט+a⢦Ɣ…M*¨{ÍsaÙHèÖ4g¿d8`έà´2æвµQ™¼;KXñ ñqø-BK‚öKå¼}'n2•U\ñÓ¸; « @¶ÆxHÄÖº1åa³/2Ç@Û°ð:Ò˜³#„Ée&NŽ^Á“d˜ôº5È‚Çb`X³WŒ1 Êó¢• -·¾¤` —¼ˆ•¼„azc^Ô:o}Û l‡9DÏO¢òlic‘Ù`ãÑFóÛk†`.óŸÑ ·ËJ‡éÏK^8Õ©íìùÓI•>Ç }Z -à G†Â­’ñh‚]ŸG|ËlyòëÉ?Äû¢Ïendstream -endobj -1496 0 obj<>/XObject<<>>>>>>endobj -1497 0 obj<>stream -xTMo›@½ûWÌ­Nþ|Š’8‘zHÚÊ®ªJ‘¬õ2˜ °Kw—¸þ÷]Lj;9Ô–³óñæ½™ù=ADß$c˜ÄÀëAFǺNÓ„®cúi„ÜÌ’it0ÏÃéG“y¦ç·«ÁÕÃF#Xå.mœ&°Ê€RG¬øpÉê ƒº56HÙ¹’¹Ø¶3xj¬Õ+B÷.äŒø|LfÞ°nDåÍjV’Q…L«*ÒXº;ËÜ¢[àÅêeDŒ&á˜ÒKÔÔÊ@%6Æ,e¨é™8À,t~WsèÂL¦T=…HÃ8„î½j5Ô¯”Ë m›Î«/šÒŽ¢’|¾@ø)d¦vÆŽ^ ”¬ÞwN³SCh¡5Ÿá™>]xºð4þ0„_ªS¨¶Ê‰•Ún‰!a'loµºªµÎûˆ -‰˜ ¹« ”jGfÌNé,„/9‘' äLTÆñ(A·òiY bÁ -^¢5ï°-Dæ‚-ÕÃV+/˵kX(4 ΡŒÄ'QQrÕaÜ7*‡Åý2¸»½ 3¸î2öQeÿJ:…\yž -So:ÂOQž*äåìÚò *©ãè!^‰SzðzùTÍ{¯Ö¸¼o)}—õZøÆ:á }diHù–U—°i-˜¹È A” +”‡Á ¥È¯ ¬u -‘ÌYœõî /iOÊâ™XG4¸†ò3É &·$BV I*kf©Ö¾A€Y ©#ñ•ädä§mq×ÏÏ¥ãŠkd=x-¶…=Ó#pyãn¨vã2êù‰êF¬Ï"¬ûZÃu›5žÑu•±&\[Þ¸†'„† sÖVÖÀâiÙMdlO£‘‹?~2œþGô;UÐ0^šCC¥‡IÅ´Ó L¢¨Ã¸¼y¼½oZ½ ·Ô¹¼­‰uϹ ôAÍÿcQLiÏ&qJ›™Ä,q!îWƒïƒ¿K »Vendstream -endobj -1498 0 obj<>/XObject<<>>>>/Annots 672 0 R>>endobj -1499 0 obj<>stream -x•VaoÛ6ýî_qÀ0@bÅ’Û)ºIÓ)dk¼}™÷’hK$z$Çÿ~ïHɱ•X‘")EòîÝ»wwüwÑ?ÍbO)­£p„/û_ß~D“i8£I4 cª(Žâð¢]•ô0ˆgópLÑhN°;>aׯx÷bF4…sìE“ ì¹o,±7wyïj18ûrAñˆ+À›Îæ´È*|IƒO¹ØX©é"¤Q%‚„!Aw‹ eªEM•¬©Oß™hæÍ Ç„°È‚‹0 -é«*ê¢^“¨q“®ýÅmaóÖfÆÞÀ„¢¨5ÏÂ)¸4¦©$íTC¹x’pîqÄá3©Ÿ€ÍY(i¯nî¨8¯VäM‚qg2xøüí¯èØMD -éûÂ6´T”¥ÌŽÍŒh}h×÷·=s§´Í‹4P&é÷ëOÿ,ápϘÃf·Š‘>6›ŽïTÕV+ÓÆ[oÃæÛà˜Ó§~®®?½IÂq”?ÙËJ@aë%žB‚HÎMMJgHUŽB²¹lžÒªÐÆ’±jC ²M[&d¥jÐâuS» ©ª*¬?c@0­”ýÉïFm:ÇçáìzS%aÌ6£áwpjþÃôÿô·P5^—Y)«…Uúgw øCø†ÞöÞ;’¹…îTò¥óDZð'ö¸R #¶K×2àU—;ªDšµôÛ,‘­., §©4 2Šƒ 8y¸¼¥LX‘#—'T˜6¾0îÑÇ?bÀ6ØA©Ö¨aW1ˆ¢‡ £Ç…ÚRÕÔö@äl¢–Œ_èmtñT”r‰,ë"æàœ7_W!ݬ°ü3 Õ”=ç\ðÛº1’)“h4ð²–ï«d¯ƒ®áȬËÄà„{ö¥Kñ¶>\!iRC¢„Ó:S[´»ÖïÞì2˜ƒ|(•6ÀáH©T‘I+ŠÒôk©Á&B”Ï·¿L>ÉRm* S•9š¸ñ W´‡;™j,w:¾ÚR-Dâèô£ÔU— åj¨G+1‘Т̑V– p8—ŽÒ\m$‡&èï èERJ2 -ÆGËRBi”hQ§9Úˆ«€²|¡³êŠ—Ö -m®U³Îàv@÷jJ üm´²*Uå)Ÿ®}1xQÖrKËÎÁÊò¤ZWE¯ÌúÊ"?ÚÙPÔ¬Eô"ćИGÃó!+´LÑvüÕwm$vŸkw¡çy«š2cÆÐÒ4Ô5¤Zé -­mGï‹ò¬1ú¬T%gð›ˆ3.d”m¿©Ç›z?àFá³#Çq5Z*õh¨,Y…iÝv¥ êzÎü<½A¯n€÷w1CêýQ¾: ÖW«SÛ"³Æ×O+é×ÉD¾P‚Š³ÃÕ)ŸEµA -E¢žä )´Ï‰ŸÕïç{€{¼v@Ûù1{šœr¸['*ÕrSŠÉoß‹ë+HuÁ­ãú¥G»kœ³¬ÏŒ‘¨ikB›%Ç„oÖ—W.ª×5¼V0lÔ¶†ÝdG<Ý­ñ_œÉ\)cOÔ;R릵€¦k»¦ÿ(wÇyXrgb4ó8 ¨K”k‘fg¬¬NCƒ>å«ÁvÀ€CÒ÷ð%ÈäÝÃSÖQÙñNmOÛVô†v­’ëÔk²{0ð<¨¸ñɬ°¾e÷Dâ ñ:Z-ƒsß5^ê+ðiä1$÷O˜ñQô¯”u=¹ã¡/cncËãÁ‘äAí+«»M¿øn¨b¼ oõïu©Qþƒa—Ú]ÏWOyç‹“Û -ü¼öÒ}qÔ÷þæ/'ñ¬q¶xÒOf“p6ûwÖùœM~^ þü†@Ý„endstream -endobj -1500 0 obj<>/XObject<<>>>>/Annots 681 0 R>>endobj -1501 0 obj<>stream -x­W]oÛ6}ϯ¸ËKÝ!Qý)ÛŠ!ëP`I»ÅE0,{ %Úf#‰*IÅñ¿ß¹¤äÈrVìahë”&y?Î=÷ðæÛÉ€úø3 éF1%ùI?êã›ýÇ¿žLÇÑâYõ)§Á¸¿_etwÒ^cw2ŠÆõY¿;FSŠûq4ã»óY4¯W~·µÎiw1îNâ)üán<&õÊßm­qw0ÙŸåÝö»Cö,ñ.²£Ñh„ÏñlŠÏ!þI+¿1NlgcØ!ŠÑaLÃÂûzYòÞüpo¿ÄÞt^î].NÞ}Ó`@‹JϦ´H=ò}Z$½[ùì(Ùˆb-Ém$½]|Åùa}¾G[m×FW%½[©eª¤ -í¯u¦—"û›¬LœÒøR#W‘þ.Möþχ1J·H{-ÃtýéæÐxŸöç„…e 9¾Bä’ôÊÿ?Õ¹€ÿ­$\¿jU¨b±¥Öý?uEye‰ÌjÚˆ§g) ,9iºË"1»ÒQ)¬EŒ©=Œ¬‡ g¾§=°½<:ˆÐpVÚÐNW†*+ ÒÐ$*äR8•'ëx\zà‚]ÎóvAŸ¯¯ºÉ|P…Ȳ݉4¥‡ìæ:U«ÝÃ[ÝDš°yBÿsýŽÌs2ÿ¸¼¾Ô?‡‡ðµ -³ØH*Çù–FåÂìH)-EòÂÕåMtáŒÎ2†îNäKA[•e$œ“9ê¼ø„Hs1þ}„}¢¶-Ç-;R$›šcˆ0ÀÖÖσ$@€ó¶,#¹dáS6ÇWÂu²D¦ZÚˆœRpNRᲡ¥A‰aá%‹ö»ÿx{G©pb)[S|.ÀJÔ¯°ÙéŽÏ²`Åâf]·à{ 0Ò:a\P–|*$hƒ`ào ™b–í¼ü$™‚ÞxíYÊ5‚«,´² -¢]åv?„ -Ìi€G‚_‹s¼E^­çÑ°é6~Œßa¯xàNGþ¸Ñ§QÌŠv#Š•R—™ ú+ì#JfäZ˜”£ðqBn:ŸÉä°TBbü Õ`¯*ùBÔÇî˜ €ðã‹ê‰%\Ëx#PÎ|‰:Öʯ›u±t) !Âm®ž5꺕W6^›Gmv Fð¥GÑM+àŒ–^J·•2<•‰2I•£vEÞ0óÅ·JᢠSïåÔç4‡IeÈ!{x2p^y¤o“êFClÁ^Èn•K6ˆÙž†@ƒ±ˆ.^3~ÄJ^è’BÊ”kÕ Ýá*ú2ϙ»|®oß[ÁpD—¬8+QeMù’ð</hºu¬ì¶*KmŽúQºËŸî<·‹ßnžžØ­–a QÊ ¼JvÔ0Þr%Pô†3óçÚaÌj8½ñSF÷)ö"Q×&÷íãÉÓX~RkséBu²´!ØÔó]ìµjH¾xLÍ›º <Ðì±ôÁé Åüò3!5…¥dŸpfSP4X>'²ô³JîiÈOï´€¦kiNietÎÓȽkA1pÐÈ2¬ºË]‡ÞÂ&@LY×`tâ4žÖ/]_鼬ðþØSº¹¹Âs££­^9 -fœ*¬Î$†š2« VÔw^•¥QD÷›]˜‘g:¤S »ƒªÑûºÑòÖL°-‰ºªŒg~Aëì/ƒ©µ¸â5(Þ8"¥ó<2(½„a -ÚB 2w–¾êùeÜ`PkN u óÓO3:jK~V …Ý??²î‹„†¬Cä›Ý1Ã×Ã"LSíÕXpüðb#Mž¨BÊ!†3Ž|dEð÷¡3¢›'ÃâU§+¤Í ™”•Ê¤Ý¡'ò:·#=ðº#«r• T2ŒÃ:ãAº‰ª®++ðq•yBàpÃá­®²Ôó¿Ç¬7J@gVïüòן(žú·îîâæò‚>ýüÅëµFéðè‚ï7Çϧý9¿oÿñmãÜi<ëŠ;“9›úeqòûÉ?.®¨endstream -endobj -1502 0 obj<>/XObject<<>>>>/Annots 688 0 R>>endobj -1503 0 obj<>stream -x}VMoã6½ûWÌÑù3þ(ÐC²Þšlºñ"=ôBK´ÅDjIÊNúëû†”mEÅ’P$gÞ¼y3ý1ð3¦Å„¦sJËÞ(áËù××ß{‹U2¦ùlžÌ¨¤ñd„¿qUÐs¯½Æîl‘\·v§óy2¢éd•Ìqw6™ÂR\ñ]x¡é8ÚðŸà­Ö÷¦É¢µ×Z–´'«Ö^k 4ãü^ŒÞnzû>Óf‡ çËm²ëˆ6i_Ô>—Ú«Txe4Yù£–Γ7$èEéÌ=nÈI{–”&''JIGñNµŽ­®ÉØó¥Õ²¹ôËæ{oDWãi2çþÑÔE–4'Ì>>R8 ï;8ovï[ JTø¸ƒi¥ñ»Œ@U{w^–lí 濫(–S{Mßïÿ¢Ze ;{þÇ›œVŒkX@€5bmnXSW.¡M®¥&“„¿â T!¶š2y…©J0H[+tšKGF3pˆ JÃ{ƒŽÓmí騊‚¶|â 3ÁÊHÂÙŽ3Fw‰ÚÀ¦ÈB{±—|+  ¯ -ÂÓÚ*ÿÎ8}Þ@èd˜QÿìNâIyî n¡¯OŸ(Í…Öð ›òM¤qGÀ tK@!ûp@Ê7¼–RhGÏ¢Ü"ŸAe®ãW›#D`‘\U y©ò¶†VA\ЄËUå~Šå,bÇîÿî«D&z75¥@(²,bèønÁj¨+©m* -ƒ®rq@&8/K©!BÝYSB­ÝËOëOAººãS¤©©!¨˜&±® -î`Å;€|Άw×M•÷/Bø­U„—6Ð'Èž7¬gB–@+*ÖyŽÂFÀ¯RVžd9 ýÁTÒÚEÝŠ^ï·¡la«0øÄ6Y”¿B8..¤ ³\}LdË߉3®* yP©5Îì|Çù9¹!#©@ Ca ÔÖˆ åfv­Ê½8€—ÿç/f!|j£ýåæÈà Þ¤%÷@^Cgsx‹Ä‡&ÁM­Åªðj@Ú ÎpŽ¾iõÖŒ±Ó”9ë*ȧã9"G÷iå&m|˜¡1ÀvàM—ÛŠô5ö9>À*;²BE“¡nKoåYf*Å+ËE|Ì2º;¯Š;ü(ðàQpMs”ú ¬ÑãÿHfÒ: þ#Jx§,ôTÕ[è*¿äûEnÜ^ü£´¤?”®ß^Œ-²“$ÃP+º ×&Ôx|¼B’!?¡B‡wËöx¾HFË)MWc<÷ð„z¾y¸½¡'k¾£UÓº#‡tuºpµ­øü*™$ ßÌîé4á%¼ã5$m¶˜%‹ù/GÜ™ØÔçMïÏÞ¿ù›ˆendstream -endobj -1504 0 obj<>/XObject<<>>>>>>endobj -1505 0 obj<>stream +HÀ4åBJt˜)ò­_Ô ‘ÅÌ‚9h¯º¨Å.-€ñCÅ¥6zi[Ö¯¼)ž9˜L~0q“3ünjG(¼à`(耵áñ©æ·?¤‰;;¾žî¸/ÿðçA£[óXò'? F“Q4Oñ›¢q:d¾Î;wþr­BŒendstream +endobj +1493 0 obj<>/XObject<<>>>>>>endobj +1494 0 obj<>stream +xWËnÛH¼û+ØCÀ¢õ²$çø‘ >¬“…µðeDŽ$ÆäŒÂYÖ~ýVÍ2MÛ»À"0"i†ý¨®®nþ:Hÿ2Êh"iyÔOúr:ë'CϦø<Ä_¥eÆg§ÉøµƒáÙøåó£“/g2Ë| '“>dý¾ÌÓ÷“d” ùjw’YíDÉ[Ý;¯|n,s“IîÎJ•I­ñ•- +]}ú0ÿ Ãc ¢áÞp +ÃïÏåf.»– <å׺1p{þûÅ9~P^vÊÀ°’¦ª­Ó•x+ -j‹ŒÏSåu&kåø{ˆäɽ÷¥7!ax}ŠK–¶’à%‘ksòëÜÉb/¹YÁãö×ßnŨR˯­®öá)Z_Uv»‰ÁÈoƒ”v:î”sÛ`…<´J×b—!ËŸsƒ“ÜËJ#½…JïeYÙ2ÓWÎSæýRQ;Uÿ»Ð(ìÊšŽçJÆó.‘¹c½Ø6âtº­r¿—µ-`~aý:øk×Æ™¡Ó…N ìÝûù·«oCéÏ®.%][§Í݇ŽßW‚mUI"0Q%r¾ô,%KL›í`9‹žXîwNÒJg,µ*âa™X“ŽoF¾ä°”Ý} h÷EDÇ¢Ü= L¨Í¦²ªHh«ÍÿÞh€æeHüa"?@5Öƒ&¿#£Qö»y[? = 9ŒˆÒµ2+-Ì  õ6ñµæ/xY£MU» +%<оù@7÷6zu¾ÁÞš® Âvˆà¿¦¤°=þbª¥r¬Rj7ûÚ5“avêÇ6S)h]§p©VnýVÅþYç6ó^ƒGƒ0!O•nP™z£qS™q"—èƒ[U.TP¹@¡1¯¢ ]dˆlÀÍ›yÅ°mÎ×j˜LXú9úUt”¸a2 $Të½—Þïol@£=¾¤ÜL^m‡†­Üfu¿ F³dv6’É$¬Áam”ï•ý sدR¼Ø`É£eÆÕLðþ9IoÚ?kÖæÿý¾8žŽ“éd†e¸ŸŽèàóü裃›¾Ïendstream +endobj +1495 0 obj<>/XObject<<>>>>>>endobj +1496 0 obj<>stream +x•V]oã6|÷¯X Éb¥8¶óp(ò‰hÓ´6PMQPeñN"’Šëûõ7KINâó(‚ Nø±³³3Ó{ô-×GT›½j^.·k¯nÏAJ›Re%·$¨Õê©•»&| ·2pŸÁÜøƒUµ°[ºî~e´·¦ªÀV7ÎsŠ!Þ Ó¸ÓÎ,:‹âˆ~2‘î^Ü.Ü9… +UÉ»[½³(8ŽïÿVÅÂA¦ÙIí”WÏ ìο²B°ÿÎç«C”pC #˜½¹ =¼Ê†¨`K-(8r˜üllÞÇ ÷z}Û ˜ï``½Î¨å¾"†`ƒCŽ)¼Ô\]KŒÜaì!8.:î!‚i<<ŠF*¶ª—ÿú—žäS«žE%µw'œuuë¤Îì¶áÌ5—ÌÝFÙo8c±¦§7‚ƒ‘ƒ…/`v=ÂÓßIoîGA|(ÓzU)7szFÝNã=Yóvçz={+´kŒõQø›òNVÅá=&”Y&Oï9-Þ÷7‡£EŸæ¦õ,رÃLXŒÎo¹‡@ìýo7$]ÁäwìÏïB¼{;~¾¾xøž˜Y§ê¦’P—ÛNþy³ŒhɉÌÍÓª\4”™{Û† p”*ôèwpq¥>èN‚Z7 + Dåö5YÀÞ°®• Äb=l¶’/ 4Uûª`é„ÇTK™‡r(£jmrUð“Ífòp*^¤ÂÁ­Ç÷ÆÖg„;ê!­Ð†tB®ç,àe‰š,k-žØâñ]Oü¢QãþOYœÒ4 }H>d˜ù„G–µ5ÄPñ(ÇÃöñ|‚0?þßÑ5O£ùl§§Ï¦|éÍjôÛè+Ô¾òJendstream +endobj +1497 0 obj<>/XObject<<>>>>>>endobj +1498 0 obj<>stream +x•U]OãF}ϯ¸R¤fˆ'•ö!¬Á–mH[­„Tã±==“õ)ÿ¾çŽm4¬Z +±ïÜsÎ=ómàÑ?…>Mf´-c1¦©ï‰ +æ!þ÷ñW*JÜ‹À ÄìÔ 2ÁÛ—›ÁùÇ òÇ´IPdÎi +Œñd;¼Êä¾V%…‚îeI’IZ,ï)¶…Ô† +UDª<Ûü…4y^›fäÏ…DÃM¦+¯¤Ò6iFi£cEµ¥JÕµ6)5û.ñ3tÑN•Èhq¦©3ej½•µ¶†dŠzUThÛCås7Ë+ÁÕÇ4òg5¿hµU=Ù†ŒR1E*±@‡¿G*ÕægŽ÷D0ñq&s|âÔsZ`¼•*UéRÛ›‰ñlÊq•ƒ»µ%e:ͺ¨WAhœ>_oŽ³ÄêQåv_`ÊuTÊR£Å‡¡ÂÄ€—“yNIi âÃ2²Š*Û”< +*5Ò^nw2Ug‚6ˆÊ”.b™ó<®ÉI ú±ÀA#©±5l¹ëq:ΕîöÊÜ._èd‹î Ä ™ÙQÛdÚà +OÐuÛ>óÉ)Kõ­Ñ%ïÚ­ÐREZš+%„Zëé"ŽÄA&=0œ6±yn\¤Ï{šIŒ¿+£éuÊ8Nì^ËN±ß›Ëÿs­UüIÖß›«4X„BIÓj³Êl“Ç”I-¡ +%«úô@®if"q«ð0d@wÚèúáìôŒõÅq¹6MÝv½îÈG|¤¶’¥ÆË"±4[[ì5¤­4[A¶Iz-Wv ãX»Ás†ŽM,Ëø•º”yÔ¥5¼ ½&ûÝýÅÖ°‡ xà4K=°~Ÿó°Ph'ŽŸ5\Ç…|jWÕSård“„®–þ%c]'A롘ºrƒªÖŒÞ%ó:á:€¾÷¨ãªq§ Ú5£çvsÛ¹Æ1XŒÖ.Ù”ChkM¢Ó§íž‘ëéìvy4bS±>,¯×oñZ$ìÎÌVÙ°Õç*äàsV¦6Û¼‰Õy 2Ò52ª”5ìOköVV +¾ægY¬NçÇtÑ»z‡Ø±JJŸ¿¯þ¼Y_NÉëÛ ¾@†¯"œ½¸ˆ×w„Û{@Šfb«*ó£cì屎ý¨æòâ…ƒBÞŽ<–ûãcA·ÖnàÜ™,µ@÷­vÛö˜=9%úotóä s×n‰NzWz¾›ª‘¹ ¯à¡hpG9·îvÚ±|ô®IÇ3®ECU nñ]¤ š‘yAèëÝokq³Z_®Öw÷b½ZÜ~ne:qëú"`£ŽÿϽ„gs\þ87rÒÕfðëà(•²endstream +endobj +1499 0 obj<>/XObject<<>>>>>>endobj +1500 0 obj<>stream +x…Vmo"7þž_1âK¹SØ°¼ßI•J.œ]óÒÀ©:5ý`v 8ìÚ{¶7Uýï}Æ»B¸–ˆhYÛ3ó<3󌿟ÅÔÆ_LÃu”ägí¨Mý~õ¨7⹃¯•´ n?O,ÄÃîé…Ñ(긜]|nÓš-à{0ÂCJðÛnÓ,i9™”Vù-ýLã«é»ÙÓY›Zq;a–¥Nì¶ðTç6Ʀû¶Òñ¾‹Ï=ŠãÊn«3àýךá$9‘ÏõOžjY“)=mMiIÀ†“öYZ*ÒËê­•"ËI‹\žãµ$¿’•~í£ypðµ÷&™Â+£Iéj`¹|%F/ŽN~ܨéiuzÈE~&#ðh-í\Zã¢*úצ@ZEÁ7SRjè½6þ=i)Sï¿dd(tJ&KÁ@’)©½£Ê2šK%€k¯áù¤#µ ÆAŠR“ ¥çìœóTÙ_™r¹"åic˜u„ ô–VÂæÁÈ2³q „¼ÁëgI™IDÆd[Gˆô1ë8É."º&ùW!—‚ÿ!¸¹yY9ðlå÷RYÄZå F’¬„^¢ ²² ÚHZJ„ÞµH¼B)&ÞØ-\{¹´‚³U¼~ xX—V·ÎÉ0êE4•¾,ª’¹>¹XÛyÿDf9Ã(Ôä ‘çJ«`¹¸ƒ'ZKûó¤Ü«áPîÏëûî úv÷õ!ú2y¸œ<ÜM£‡Éø×tÈß'v>ë4áþùA51­¦ÿ©˜xÓd3éêVªàÐ|‹¤q' j¬ÔÓ×éäáv|3ù%Ô ¬-Éq3†”rû¾|¤%‘ên|]\0ÏÙÿ]é«Æ—«O!GLñ ê–Û»Ùä#1ÑUç%"D5—E!- Âñn‘9Ca§Ô¯‚bÝõ kP ˆÁÕíÕjÖÈ< +Šƒ¹¾‡¤V:GfQ•ÇEc=;XJŽ€Ô… ¤;õÑ\ŽÛ¢ŠFÁåðÙ‘–~® æØ¿ƒ'zl*…_+ã|XÝà ©n #ßÂ{‘¬dúøŽPuHƒDÛJ«QŒÏ2Ûžô¸0Ü·h¯: ßc6gˆI +§¸.6Ù2í@)·;÷_1hµ\¡ËR‡j Äñ;ðèCQp‘0ÊÓÃø2…Ó‡,A9BFÀ Ñ‘{XÖA…‚âñ"Š¶R"i­±J/8pPžPÚ! “Øá ÒVY:ÀÛé4J½(Œ ®¤–-UpÜZä¼8s^ÔG7~î2aF#=¬åozòÌ¡nØõ¿¬/p ¦¡÷¥çJ§éé[?¢O@é«ÒKL^”•\&¦Ôžy=sk…£uƒŽ¤z…±±ÁH—„îË•s<ë¾™†Á\XõÌ^^ø±YºDnÉãQ¤¶Ôµ¾ `d9 aÎH Tã’/­.ßb09‡Q?Š#º7ð;ÏP˜œÕú¾0x̨{ÚlàʱOÏ ÆŒ™b"4^ãÅ…i?î*;•Á©eç›VæSµÔG wðp +xcmþ± 9ĦL†6ÌàÏyàç æeÂþ[¬Éµîó›©9‡Á•âx†¤Öä.Á£k bÚ£. b\¸Òæt|s9¦{kžx´^™¤ÌÑzañ÷@lo Û|Sÿ7ôzÃ^4ŒlïØÊdvöÛÙ¿î€:sendstream +endobj +1501 0 obj<>/XObject<<>>>>>>endobj +1502 0 obj<>stream +x}”_oÚ0Åßùçml¤OU[:ií6‘iš4 ™Ä!.ÁÎü§Œo¿ë: ÓˆPÅ÷ÞsÏïÚ¿ÆtEH'˜&(¶ƒ1#‰6Aœ¥ô<¡¿¨º³8¢×|ˆ§W,¾üp›>|¼B”"¯¨H’EÈKPñy1LY ë°×ÞÀ +ó,ÂÍùömþD¡1"Š¡£ -¦àágŽïR•zg1 ‰ŠF +åà̾š‚†PÂÁ[wøI¿>=ÝknÄyþ!Ãíakí›+F¯×¢„TØIWc#ÌJm»7í]ˆ&MÑ”L"MJˆRª5œÆFé l¹µ;mJ†O\--*.KBÁxu©tÓHrÁÉb#œ}¥m.ËàÖÔ?¬B¥MHwpís-,䥴š? p¡ +ÝkÜ·ºÂü~1º»½=Ìg¸î+þ5šÆ“:KYÚ +íuVØíª7ü\å9¡ç‚oWü•è{ÈWò”:†¾uêæu”·¡îKIj¤|aÁ‚€ßôÉJKä=oÞcål+ +Y‘òk´nÔŒ¢Öšâ^ørVt%NøÄ—ŒáQ;qëĆ0P[OT‹š«5A(·ReÃõzp‡FpZ¦UA‹*G;`~G“goH>yUÁèĹ®Ý9ÌNA¨›ôÈv“ Jšõ†úb{‘ayì•-}ÙvŽ.›’·léŠ6 < JQqß8‹ùã¢ß‘ |O[£’¿»qaÀ(©ƒ–{¨ì°£„ΑlŠÉ,cY«ÅÍÃí ¾ý$ +G“[ø-¹ÞyÒŽŽ£t|ÕáŠ8YšdtLPîYRÜ烯ƒ?wyAendstream +endobj +1503 0 obj<>/XObject<<>>>>/Annots 723 0 R>>endobj +1504 0 obj<>stream +x­WïoÛ6ýî¿â€a€;$ª%ÿÐiÓ Ðt«½ò´DÛj%Ñ%©¸þï÷Ž¤lYn·$¡IÞ½»{÷ŽùÔ‹i€¯˜¦ '”–½A4À'Çï~êÅñ<šÑx8‹FTRœƒ}Xòi},>zJEQȬkþö훎ñ+Úoót ØœÇ_n_}#PXÂáŽ1‡Ôî­Dú±Þ…JPª*«ðhÓë’ÒN‰ùâ—·¯¾˜ïü˜: Âɤ ) +.“ ÈRÝåÚØâpåŠUÖÆ’ÌrË+ÝõmÊUìëÇþøñY×î:/$YEV ­£"̘­ª‹Œ*µ§ÚÈ&F¦µÎí¡‹d®6’û(§È²ÇgmIÉæ6½èb(òJR^‘ÝJúsS¨•(þßR›«ŠÉå‚j¢`°ZŠìGoeÜbqHÍÉQ«‡žß5|ï£ÅÎïöÙ™‹Œ^ WÝöùLîd•qSO¾v8™b¹i:Vוkº`FßÜæè•>°Ÿ©µ4;멸Èáƒül)õ‰ä>/XObject<<>>>>/Annots 730 0 R>>endobj +1506 0 obj<>stream +xWÛn7}÷WLŸìöêjI.P¹¹HQ§®­6-àj—²˜ì’’kEß3Ã]Y^;EÄÐ^È9sæÌáì×£ ñoDó1Mf”WGÃlˆ;û?7¿¦³lN³ó‹lFæçû«’nù}šÎÎùïbŽ¿cü÷šÖò`2ŸaQïÁx8ÉÆ4^L³öO‡Ø/]ñ~‡×üô¢÷ôñOçÙä`-.G4ž0³i{Å^ãétž<}³<\‚ˆ-× d¶˜Ó²†´ÌO~uÆê‚ +W)céÝïWÙ«åg¬˜¶+NÈyJ·ºMº5Ç·ïoþStàE•_ýsóþõoWÇO·ÒÙxÄËâ!v®ñµ¯ŒU%m-Ü6£[­)n4YïNw¯¨R–ju¾¿r ¾ÐQ™2¾ƒ-—¨ö.×!Ðgdd£ ýƒF ÇWmv[7®‰´QÆÞó³ÀcŠ\©|*(ú&DRyîÉYÙíúÝ[Î aG\bd²Ò¦7Ê/Ê]… +ºwšñx×Üod§.L V!l/(Ç^H™D—»ò”߶´õ&ÊLÍ–îN…õjÀM/'ƒe·„ýAÒËV5€gÑ?P-Î,¯¿60ÎæQó—]+´Ù¶ü­jm©ÓëÅ9˵hõ +ª®»ãýºÔ*hD_³‚åèåVð´7ÚLLÓXJU +¬0D1PÛDØ §‘Ü2˜{K~üð75•ÇãÑõàtp‘c2ªVº²¤Õ¡­UÎŒ³Y<`˜Çû¼«+Ö÷ +'l¾ÌœeÃÁÃøÙi/è +³ÄÖ”%Ÿ~Œ UO"a¿OpÎö‰bQŃ²‘G0•´œœGAˆ'´zfÔâÈ/¬a­ QmõÁFxéæú­ŒV—lúÜ“ÍŒ-®“¼ˆS8[' ¤É‘‰Oú»“7Ï^ý¦°ræ=ñø¶ƒÓÈåu)šgý–=†€ü0™Lg§bf9ª¢H]ÓË9Ùï*+ÚcÞIc/«DÎ,Nû€n¥–Lü·TP÷ÓŘ Eº¶³›ðÚx­¯‚ØpÇ¢å1œòƒËóýèýÌÿÓ ÝLtBÐ-œ&±žÆžX÷cÞÇ þ¢u›¹³Ó'…#Òí£>0œˆ‰8i[ìU:Üâ=Ym¼RÌkÉä¹…ç &ò ^Çw\™Ü»àÖ±|_\éô\Áz¡0ê€F»ñ!¾ïÜÇðé¿ùKUèñwJ·eå€xQ9Ý°ÕÆjI#Tsð…“àû€t-xÆçˆBmXo”¦O >QÒ¸š˜1W3a=2³ct ÆH }8RyPaÍ=>ßK2} .­‚F3|¸.&4› ñIŠ!íöõÕ›×tíÝgN™7ìkÒvý¬[p6^ðûÿs œÎ§Ù|¶Àç%Öœ_ðVï—Gý MtöÐendstream +endobj +1507 0 obj<>/XObject<<>>>>/Annots 735 0 R>>endobj +1508 0 obj<>stream +x]RËnÛ0¼ë+æè1­W)¥7'NŠ›Ö|¦%Êf ’ŽMÚ¯ï®-B €Ð>fgvÈ· BH_„,F"QÚ !e®ÇïïA"¥!“DÄ°HãDDcÔ`Ãý1Ÿq&¾Ž—&!á‘Mj“Ð"Äí¤6 -¢(rR¼+‚ÅcJi5)—y†¢: Q”³¥«P§šæï TÙ·‡qè²V9§[¨Êa] ÓíŽêp½)Õ Ñ{(¼¬îaµr¡UÏ£j{øš§})^ƒóˆM)ªÙïZ}d~fÝ(»Sš½îyšÆ@¼0SÖ'RWûÖ’úï†òÀŒ×ÞÍÓê<¯1køÄO›ì[?'ˆn¼ÛSÂß@÷¥`ÄâQ^›ÇR¤¬}ý³xøv®^|ᙜWE¯?ƵM‡Ê—ƒ%Ýx'yµiIÍqØ‘ªƒ®.NoõŽŒÞ«Æiü0nøØú¶©. ‘‹¦l>[¸ò|W¼ðúi³ …NβóQv$3æ òœ•o–ÏwK¼´þU—=V£²“ƒ¼ÏüÒ=ÏÂ[îÏE,Æ QôN¶ÆUþ½CÒ“_y«Œë—f©ÈdN¯‹02äÔCü +þþ^è“endstream +endobj +1509 0 obj<>/XObject<<>>>>>>endobj +1510 0 obj<>stream x+ä2T0BCs#c3…ä\.§.}7K#…4 Œ™¹…BHŠ‚žP$YÃÓÓSOÁ¿ $3?/1G!9?/-3½´(Ä× ÉjµP04„hÕ…è%¤ÅÄÜDÏÜÌhWHŠ†™!È×®@.08)¡endstream endobj -1506 0 obj<>/XObject<<>>>>/Annots 733 0 R>>endobj -1507 0 obj<>stream -xZKsÛȼëWÌ!ç`šx$~¬³®²µÊJ§*•DB"b`вþ}º¿0 Š»ÙÚ*¹Zïý˜´ÿ½ŠÜÿEn»$s›ÃÕ|6ÇoÆ¿þí*Jf+·Xg³¹;¸Œÿx°w·Wn•ÌRá\g³…ŠÁfë‰ZÅ`×óÙRe\OÍ.VTµŠáôÁ­Sºd€îzÆ2p«Œœra2Éf±ŠÁ¦K3Š*»X0a v¹b0Œ`’ùl-¬b°‹õÄåh¾`¬ BÍшPϦ "l4GÔ CÂÂË­—ÔlHØ(³,2ňÈYŸÆy"i4@Χ±ç¢ÄGR1Œ¦Ù,q‹À -‹¡L‡×,A`3ØŒiYÅ`3-¬àƒK¢xjwNœ¢ç,Éq»Y¢Ógö¢°‚és„4 -+^Å1ò)¬·»\Zù"oÇØØeL¯+vWkäYX¯9K}éLjÈ4 †ì"¥Ïõ²‹¹5F³ÕSCÞ«€™ ËU`½l²´¾‰ÐlK—òv¦,›:°ÖriÌqÆäš^”A¸„r¤bª]1 vEׄŒÍ9¹UÌò±©„ vOYÁ`A¤²‚ÑóùÄgÅ`±`W1XÌ5cŒWñÁ~¯vùÜ€Áb¯¨f_‚(²~\.X,@¤1ZÑèH* µ0XÁ`1(_`#QXbªY1Ø$bùFYÅ`Ó;AXÁ,Á’ÁYÁH#Š©vƒÅa¡)‹©DËš³«‰W‘ÍH²æL"Ø ŠHäç+`° w °‚ÁâÔË”Ì<¯¯È -fž#øXÅ`1bê•b°¨Xª²‚™IÖ(hîã]qË0^p‰!oÀ`3‹>°‚Á.¹¡EV0¼ÂðÂî(«˜ñ®QaƒÅ)6‘ vÁcWdƒÅ ¹ -v#ègäydƒÅ5C½R ÷+õªÏ$.¼ÜD)/9‰!ˤ`°èØ ¬`°ð½XÁˆÈgrdƒ]¦ô9°‚á3.,ÈÆÈÚJIðÓŽÖÈHCæ2[’rsNðäö—¼ÀÁ[ôA/E)#5dJ#RTXÁ`—sXÁ̯˜Â -F0#ªY1Xtî„ w(tÔh×g)á ‚`¹”ŒG \µéIÅ`q{TQÅ`W+f8È -†K¸7Âá‘U £¦vûpT3Ã0[ÂR1jVÌà©ì*‹cgÐÄdøDáôá.±[Ab€œ@$ÑJ7r™DÞa‚ b°p=1Š*ëXÁLqÂÙ¬`°ðI ¬`$G³z¥¬]'‚¬O†«À·ˆÐ1=áåጤb¸„¶D~GÖÔÆð‹ãjj=ÕœWHÅP‹wÁ›‘z(ª˜FyïV°ÏÃBY;/ã%e¨9ÆÍ#¯9`°x*QÖËÚ;,XlÛ&“³g²‚awÎ=XŸ -¤ÝŽ­9…X„•ì‚âÀÂɃMTXÁt™»QXÁp -ë -ᎲÞ)Üì˜óßØÅ#˜fy +¬½à -+,Þ'àTÐ,˜bV1X8«vƒÅ] šcÜñÆ€Ú¬Íd§‡Ï„;°>¼À -à ¬wõáVðîÈöáö²1^¦ÖH }¤WŠ./p -F¸¸t¢OFYûã';‹i4@½1™œûÀ D¨v ¤b°xcCþGµŠÁ¢ùàn`3S—ƒµ7á «˜¡®'v}eñÞc'ß c Õ>þx—Puäw$ƒõ³4²¦6ÂñcC‹»×½Ld #ØÇš -ëE—ý'¾åG(iº<„`Ê$R1X;ƒ…Œ$Í#º4*F¦W¨‰ÿò€keÒxÀ·1TÜ?h\€0‰õ ©˜ñÝ"ˆ*kV0ÜE/ þѬb°1uJ1XÜnC‹Ídƒ…õÊ;‰©´%´ †(ê/¾Q2|Îà]Ä#c-‡6Jȇ'2@N ¦†Ó&œy0ï¿UØ 2d‚$힉áãXäAð· s5åí߀qBÎîܳß#ì½›9& kÂ& \€ÔÉ×ýÀˆœb‘$.c9óžü@'ö->þñúá}!84{$\€ô“±¹a³†ÏƒNô“;(p‚C£ã‹á ç+ŸöoÛÔÕƒW|9%¸È]–§å?!^–®Ú¹Üì.hx}–VØ·Ü™Ã>wè;tÏÖÊ<¾¬êw!‹Xá¾ã®‹îݧ_n½Þ÷h´‚OK¡d8Düß¿üüËíÝ­{(÷ƒÓ^Ÿ+B>\ߺÏuýít¼di1s_?Mž8OTü\?¹ûíÈæ|8U6¡­Ë«­ÛÂDm‹ã¾~vmg=O¿aCrFÑ“)›xê,<‘l¶ÅæԔݳ«ìÙ‰16NùÈþõËàCÞÅa_´œä~Žü9«(Ž¡™û­-ÔÔõCUs Å©ÛaNË ¦cÒM¿ÎÒŠð5ÿ6ØÏÝ¡8Ü gj$ -¨ÙÖ‡¼´½v7ʈ1 éÿ9tVf6{$¹b§UdÐןþénŠæP¶|Ƚ+;ŸÔaÓÀ×·› SÈ}ÕÔ{÷¹ì'|b J˜¹”Å›•Æ­ ÌÄq4ÁIᯑT7ID™ïëGóR3ï4´Ów¨·®éƒËy_ïv—7/æ·×àÆÕOVû®|Ñ÷ø~|þhã¶eSlººyvÁ‹I¦(ÂÿHý!™bÁy‰Ñuž={^ö~½-žmÀÌù?ðhš5ÔžgG“ÛTús‚)Ç,bþšmŸ´Mƒc²p‡¼ýÆSG¾ó•€«ÑŸSgλ®)ïO¦öx„ï/;Yz›±Ý¼ýâ8®[´–Ý:(pÌÎòý3¬òG,Øé0¾(„K~üÙƒÐ{Š?ÄÎÛÉx¿|ýC÷wýÀŽo÷ãY1-÷/Î"–»/妩Ûú¡CÙCpÖ)·ÏmW\×èÊêwNq;">Uõ7 «Ídòøšïºî -#_㪷ôôMƒíGonOÇcÝt/²fÍ‹n™\³´¬m'¸ ÃrÿžýD[ÿ:Òê_þÍ'‹’ºPþÛ¢³ç>4%ÖikåÿéRdý@Ù }HYd·ÙÝçÍcáªÓ°gÍèï"o·[ª¿Æ±¤Ðð÷2·]¤ ïæëyÐ2ÆQZË»ènPKû›x³‹Àþ¤„ëÞyZS¼,³î¹ ³˜v~º»úûÕÿái -endstream -endobj -1508 0 obj<>/XObject<<>>>>/Annots 785 0 R>>endobj -1509 0 obj<>stream -x…YÙrÛF}×WôÛÌT`ìËSJ–ÆMYŽ"Ñå¼B D!!¥øïsÎm}¹ŒR®’||p÷¥ðññ'0Yh¢ÔT› ßóñ/ó‡ÏIîù&ÍSüܘ,ó¢ ¬Íã`8sApHj¼1Az± ü²YèåЄùŒ¨Xc°QN³ò¬° -ƒÍ#èP¬Õœ^JÍqì&$² -ƒÍr<¥X…7& |/S¬Æ`“äPÖÚSÄ Íaà%&d#rlê° -ƒ-Fäd­æ(BŽfÍ‚”æ=›%¬—c†Ï~LŸgÖ7DÁ©ØOX"A¢ØšõS[¢”O¥‚›‘Msy…±HX…¡9g£(Va8ù‡²b7Éý)‘l ‹l¸CsšÀ;Å* 6c(VazŦV¬Â,>©XëUÊH ±ø‰ ñJa°q†U¬Â´{Ä*̱%¬ÆÌUˆ–T¬Â`áÏ]ësÛú¢²¨‘ ›I‡é3E± -ƒM²CY…QN¯œfk7ömçX»‚”Ý=kí8VahFÅà³cf8 ŠµvÃÌödÈfOY»SsÄx«0«Q³c­æ ¶=çøÍ -3{Ò±VÖ¦ñMØÏ‚¬WÓ+ZP,w[Œôr@±B“ PRÁÁ´Dš£D e²]ÑÊÐ"H…ÄÊá‚Ì™”X9á ⇚™Ô˜¾²«0ØÂ?P¬1ò+ ßÉj 6ád:6,H’7³„, Ã -9Ì$„Rë5†»iz Vc°9ÇNÉ*Ìf éîlVc°XoÚ®Æ URìd[²²¯cìî BÊ(ÀU5¤+pØ–\#±ZØH Ü0•|!ˆ¡Ù#’3K ÆщÚS<*¸ ÁF1Â"‘U,œO+±DH$Ëœç¡â’ƒt‰êH©–+Ó¥…¶˜³h‘¸¤0dqu€YyVX…Y8ݱ³pÜyŽR! Í(:XA6ƒ•SJ± -ƒEÑ -k#Š§«Râ#²HhV^á†xgVcë3r5³“ÏátU -yu‰‰f…áUÌ"+Va°¸ -šU˜I=f…ᶻ¯em¼Át‘BP#A6“Ó®CdmSùÓM)³‚DTaˆÚ9VaºÌ9Vœ -±Ôd¼ä2d‘h¶l¶¿*%p9¤Øtº*EÒ -Vaä#‘ŠU¬\+á†è¹râ4,ЗDTlIh— ‹%Y«/”aÇJåýÚr -N+Õq²R÷rÜ2T´8‹°Ä-ƒõ”Ê ;oØÚ²)p8&Òè©"¡[vw^ €Jqšî!€s#R¤ÆL^Fµ³¨Æ`¥xŠU]¥H¼c5‹¥YÉmÙ#wච谂0Šõ¤IépBµ³¨Æt˜)T¬Âp 9Ôš5f8j%+>ŠÛS½¹}qXêm!^ñ"¦{æ„C‡B‘6 ¸°Íõæ-R×;š.9å0Crž/Qâ 8äàÌ¢ùx×wœ‚̬83 jÌÜqy;Q‘±b5‹¸´¬Æ`eå8Ío°1íj Ñé€lñÞ%ç¹ø$€‰Q¸ã\ÀLáUU.wx#óI­ƒHz:Tœƒà†’k8†8X}xÓãß©Ñ!¡çðÖ¾§´ -ù.=‰QÿÁá`-ç òésãÍr -‚ÃMéTr‰×Õ½=‘gì ÅIprO°!$¼JÛ%É&m»ùÌ9.ec:ÎApoŽ³ØtÁ€—"< õq!2í8{ŠØO-Alh+7CÚãÁ6s>aسxÆ_Y2³XÊgß,ª"ÄÈ3‹—ÚÜn¶}ÓŽƒYtÝz¨Ç-~»€À%2„ˆ}2ðÌ÷—r4Í0?ÿ¼ô =sÝ×åØ´+sO½uonúæ¿îËê÷rU”;;öe¨{ˆœ{2ž¼n‡±\¯a¨kÍõº©[qüòÈs<}Ó”«¶±{B#°Ûvì»å®¢ªS‹hn訟v«c’\!˜mß=­ëÍ™`$±’¬éÙÁ,;sk^Ê×ú\ÎpÀyæ±%e»­µP•[S¶K ŒÍÆY[‰gþ×=á‰vü·i;ÓíÆíNRq˜b¼Ñé'‡±/ÛUýÎã™gÊ7sß ãcÕ7Ûq -}y.E¹g®–¯e[ÕK[u¤êÜs”ÖåÚ,÷ùäC—øÒèº =ÖÕ®oÆf]¿ÖëÓºá||¿jØž¹ëúÚTÝf»®Ç‰‚íÒ=#_'&[ÙúÖ6Ï úÒ­ºv0OõøV×­ùÞ´Ëîm0_R¡o_o5»½æ $c:è3\"Ÿ'æ¼²]ªkƒuü~4ØÓôMâîµADg,á¤ìWõh¾ ö‘ãÈÐoÿíÞöîšï]ÿû9Uøöƒ,6Uß ÝóˆÂm:$¶Qår{ù;éI\ÐÏ×rS£ŽýkSá÷[3V/ÇýÀ'Øý“Ub–ÌÕn|A7•ê;Ìäút[P  ¶^òÿ¹ï04·7æj½î¬è9Kh«‡zØ­G¸]½Líyœ;Tú¾†å“¹ûñø˳EþÙ{=‹W7Ï|Ü5ëå>Wºgq$ŠÉÌôÀ!Ê~“¡Ø®KžbÀì[×/Óõ¦n«þÇvÄxíÿù¸j¸ùxæó´Û®½¬ºõnÓše9–æ¹ï6íbF¶E£ÄBš¢üõîÿƘ¿#neŒ'Ö©zì±Ç±Ãñ¶2åæ©üÇ ùáNz ­\UÝ®ÅqÙ>wýÆösÓ¢_Í—›«{I}]AþÇI?té~×o»AÌê¤âºðþ¢À§7øµÛn»ž‰SœÁº?i“‚É}¬^êM)SôPÛ£txi¶fì$µŸ®ù¡*3p¦ùs -é¸JøðvÐ 6ÿ"œ‰P&æçmÝŠƒÕñ|†,³³ŸÁ9ßÔúáÞtäzÃÛhÎÿƒ’ûÊãÕÝÇ+®©ßcsÓU;ÎÜ<¾—>ˆóñËÌ/x¿9>þùM4KsüÈ4¢©ÿ,.~¹ø §-2Åendstream -endobj -1510 0 obj<>/XObject<<>>>>/Annots 818 0 R>>endobj -1511 0 obj<>stream -xmWÛrÓH|÷Wœ7v"4ºû1„ÀRE*,vÁ³'Ymy%;À~ývŸ‘5ãKQè´ºÏeΉgFbü1R&’Òlfqã7ÓÏïgyÅRT~nÄÄ&2#ZËbb°I¥!`°yqª ðF“Oqèì–IT!ì¼À_…r„­ajž 1Ø*Š€u¶ù¿ÜHU1]´LFÈZŠ( ȃ-Í)`-™ÒdbTŠPÍĺ”2†C¥sæ @+õpJi"Ç”F¥) ƒz6ÀL¸ˆò 0Θ’×˜ 'ìÓÄ)­Ò™Bj’¨36)pð—KVO -4¦‡b-BÒ c÷ÎrB^8rî&H&h„¶‡›é…¸ûyÁyÒ ±:;œ@.I%ÑCö•›íI†JpybHõ;‚“Ù[yš½YÎ^¿+ð¼,Ÿø¹VT¥,Wúµ˲ù·UÉmÓt‡í~z»’÷}wØ ²©·õ³ÝØíþÏå÷Y,7¸=h))#YØæзûß*êÍ·z4¹|ºŠäãÛÛO2ìlÓÖkDÙïûöÛaoyêz ÕÃ¥|Éý¯z³[[Ø|x'÷[¨Gi}"¾Ôbüä®Û° -u¾A ¦Bð1 =~]>²~; ²`2t‡¾±Òt++/m-w_4>SšH> ‘nuhöm·= ë‘¿,ŽÖûÎeuýó·$‚ߘÅó§ývͶÁsÍ‹+ ßâ¾,Xéâw»vûìŠ<7ƒ‘«wg{œŽE·Ãp°jyR®¦‡>î꾺­‹Œ.?Ø=îÖ]óãšZõ/¶iíÏËDTýѾØušÜœGHc½’WOõ+‹ö -ÿàȬ쮷M½·+†8=j|¢^¤g÷£àZY$Ÿm½’¡ýÏ^¦™GòPÿ’_›ö|%P?¶è#ìÑîK!×åŸû¸ÁLiÜÓʸ ݳ¬ÙK5æÿk‹Y\·['>ë g\³îë+½5˜†¯XT+#}®ÆÁ©½[µWg§‡æ=ØM×ÿ>ÎÔeš¸‘d±î~ÊݺÖí´N| »GPmë¦èìtÑÉeØ^í%^šòð)‡µÛé×ïªñ~3)þ PñµÍ/*\U‹Û‡7·ò©ï¾Ûf/o»æÀ› >.ì ¿:)¸)ã9Ÿ?ßh~œ”E…ÿî‚,2}¿œý=û:b*endstream -endobj -1512 0 obj<>/XObject<<>>>>>>endobj -1513 0 obj<>stream -x­VÁrÛ6½û+öèÌD”HÑ”ì›ê&ÓÌ4nÚ¨“‹/ ‰hH€%@Ûúû¼Hš’Òi;m<™Iàa÷½Ý·øó*¦þbZ%´Ì(¯¯Ñ‚ÒÅm´¦t½Âïÿ[I{ÿ!YÇ—~Ø^ÍßßR² íXÙjMÛ‚€³À›üú¾“-Å‹ˆ>h'­pJèãgú¢taž-iéžMûÕÒ³rå›íW š%)P®?‹z'ø Ÿ¯Â ³e%üqD›ƒÔE¿(¥8î%«(ãE[CªÚ©ý‘\)é«<Ò¾Ó¹SF‹Šj™—B+[[2ûïÅ¡:CR‹]%=@!›Êk@òŽ1BÄ/C\Â’°ÐS¾8È8BsӂΦùÛyÂŒ9Ä£MeÇh`"‹<_$ø©*’/¢VZÞñgh6KúÀ¶¦ê87RQ4Äû]«—ùÏJw/´½ÿ4ÿð é<©ÖhN‚af` bшøc2ç°H®³²ðZáˆK‘Ø fr‰ù“y¦] 附A ¦ *ñ |’É:O;ÀÖ™U·v`”`Lcyyä$N+ó®UîH¦a¢NÎÍÞ«“æQi½¬”u%­£}ù}’azyÜ}ƒZ‡C°²m8I]ÌDe´ÄYí“lú"Z®Ó ‹èO¯Fm6'ü?li½ÌStì˜baj•jYïØ^êÝeЀzU#ê'»"S'üp‘¦kMU Ø“ó€?[fQgt“À9Pa7áõk?Ï’šÁj†ŽF¹ø’ûío*ŽQLÔüý÷º¾ïôAÏ Ã^AGÊ (FƒW*Ëdy•DšjþŽèmdÚ^séòyi¬³áм_3[EëžÒÇ$[ùþyEðG½<†oѧˆ#ûHÍÿ£­…óæå?Æ‚Ã’öðžußÒl‹‚!'lÉ!¯¸_u}N݉^\\F(S¶M4ƒS9UÊz{…WmŠ”YÇ6 ár6"yðÄD߆Ÿ† ¨ÿc` -Eqÿ\™\TL¿"ÿ+ôÇ̾u:¢Ü"£ iö8;uØ™—P…l«ÃÊðžÐ@JØKÓTÃ8Ba”c%ÛBX5ÔÛ_2uM¨SôcÓš'L3ðÄvÂp¦Fä_¥CŒVAÛðD+ù©Ø”G«ÀÊ0Ìɵ˜iA·8b˜ª;%Núž”89—vŸE“9Š›B‰Áåyv”vmòœÝ¸÷ž!ò·«þ¸¹žqÛ8©D Ûotu¤eB;…d`•Ô‡ñÖ1NpTçèŽ '… j{A#àÞt-=^§o0–rUsÚ;ì =@Ø°;B¯*<^#ÄF¶Êo| “/-.±(îÅÆ9§òZú²´‡Éë¤Eܧ±â‚1—+*ÔA9*qw8 ø¬$¬œDã¢C³áNx·–w q'wËôî&; ÷ -á8ŠÏ“²Ý·"—Twè¸R`žð0™ê³±ÖäÊSÄ?4ùÌEjq¤:£Ñø±8)Ú`ÁIéÒÖoB¯<ü‚樼ëÛR5ÀpÏRb¾éÉŽ@ÝôÔ·èߊl—#kÕÁßzÃ_ŸÜ-ý0û·wÛ×ÛbºJ£U¶Ó=»a2ßm¯~½úeù}endstream -endobj -1514 0 obj<>/XObject<<>>>>>>endobj -1515 0 obj<>stream -xWÛnÛ8}ÏW Ú‡uX¾Ä°ÝîSÚlÛn¶u±/y¡%Êb#‘.IÅñßïR’eÅÅn/h*‘s;gÎŒ~^ÍhŠß3ZÍéfIiu5M¦´˜Í“9-Ö+ü<Ç_+)/æ«E²¼ôb6_¿|ñ~s5ù¸ ÙŒ69œ,×+ÚdÓ)mÒ‘€Ya·Ê {$c)S.µÒ+£ùÒ¤…¯­LèÖ“/$UÆyÚ -§R*å“,I”%iéÆ>RjªªÖ*|ß‘ÒѾ©¤Ú)½{³ùq5¥ñì‰m²ÑçÛ$²ÌJÇ/ú¦4NöžâvU³?I»ÒláêH°ÿ³–×$tF;©¥ O­¬„‚Ë\=ËŒr$"ôqàn/¬Wi] -‹¼¼´9âºI °Ó•ÔžLŽ›ôé¾ Œª„“Ú¡þÖT$ºt+¡ÅN†k{iÝ^¦^=Édàö³A‰}«F˾åYtŽ¨a£Ÿ|Bá|SŸ®ŒÁÞªŠÑ9EÉi(7p¬€N·‚§ƒ\p -ˆk«áó¡Û¯÷x¶/môóe²`Œþ)¤FʵCp\U87)£ƒÐLt ó¾@ý LZT.-Rˆ!oRS’ªöe(Y࡬`×0ò*_{ÕÚТ’¯8€W0þ â®)Ÿ9Ç ‰ „ ÁD€Ôq:5Ú[S–8¿=r\ƒŠm>ÜOPTËÕ®¶1Äæ¨UJ—ÐañÄw'Ѷ¡³FéÓ ’9µÜˆ3ò®N‹pób‰9ÛžLC~’Iç:ítâ,ÂCà’IиB³L,qŠŽÀ@:ùʸÂ?àã ÒU¯òP‰>óZïЄDáÚfÀœóh=tÀ¸ÍK_…:Dyo#бAáZ œn­Y*¢± -þX%}a£„H}¿»§‡ÑwæÜðbgEE­á‡7Œ5ú‘s¶ZSŒ>ˆÝEÊ¿€oiP›®}Ü…Þ ÒÊÍ6f¿¹~-úÒˆ[Ï8‹&ú€ãªBa™‡{ƒ¤pò¹¢]gw -uРumʺÆзm›çïÎÿD -†f¥½HPÔ%Íð \· -}ÏL†Jó½˜Ð8ÑåK] (Kôñ©´Cön+;ý_­¤ÈM­³@kàÑ€÷]«çÉŸJ×ÏÔô!Ý’pDbÄñðuUWQËšœisØA-øæ9ô–½ž`™A«éP(ÔV–’5Çb§ô¯<·òÇpqÆ,…,÷A3¹Ò0ÖÕžXÃäg“ÀD‹ÝÅ#C>«0Ñ€CýÂÌ£F{cK]0±•˜Òœë“P¥Ø–q^M>¾¥ŸW„ñÍ,jÿlš`IxgͨtQx–ʈþiÅÏyÅÒö²,ã,æSª­÷Ž`÷·s‡iN·JhxÀ3W:,Ú -C K£wî¦ WÉš÷*Dò0_®š$Ú(ÃËni=Œä¹YðÈqW˜ºÄÔ@_Ö/°H€™Gè°i 8ðœôöˆE†ƒlæšûg-J•+™ ˆÒͱ@P rp±¦ç¹´kÓ/ÓyY»¾ÉW :ÝÅz~a‚}“ö ûKÌ´Ǧ{ŒÊ†­L«"/FH«RÞ -íb§¢ÕÌc½¿Ç…ZÞ±¼ÎÞÒxÁË-@ 仹L>®]zí u#õºYÜ;Ô"æ1ÊÝmQ•DègMT=Æî¢GÁTì ]¬OžcÝ“YBŸÂj1s©U#ƒe‚e ¯Ír»ÃØ ¯“›a³°ç°}eÁôã¸gˆå¼­SÞÙ1øC[±2¿mZ{¾ˆ­Mͯè2¬-×[¥;’N“5ƒÐ«êÒ+ÌÔH˶”\ï€ʉUÊÓN-èË©cÚ]3¡ûR -¬ÑVæ¼”±èგ¶ÇFMlø_^[œÀ7‰ÄØ*]˜<¿ªÅe®hç Ôiq -_NRu†‡@y_ˆp\‹ú«`ô€W³¦÷1Ý·?Àâ(@ûU$†ÛnŽÔþ«×‘Œ/Bh–3¼^G ÖΖøˆ\ßÐrÕlõßn?¿¿å•*xgÒš7¡0hù渽0^MÁœ¦1 †ÝÀ‡ø]-×Qj—K~ôÇæêï«%¹@endstream -endobj -1516 0 obj<>/XObject<<>>>>>>endobj -1517 0 obj<>stream +1511 0 obj<>/XObject<<>>>>/Annots 780 0 R>>endobj +1512 0 obj<>stream +xZKÛȼϯèCÎÁ²ø%mï:kÀžõîŒãA´Ä1–H…¤<žŸª¯Åî¢f²0P*~ïG7iÿç*qsüIÜ2uYá6‡«ùlŽ_Â_¿ÿíj5KÝb]ÌæîàŠùlq{ws%ðà–ËÙZ8—¤ ä½ +*[dµŠÁ®Á“|pi25»H©j•ÎVpwµ¢K(é¹b=+ÈÍÉ '&³ùl)¤b°yÊ`‚¨b°‹ù,SV0ØeÆ`¢¬`“.f¹°ŠÁ.²‰Ëë5C]âbãñdNkœ/f‰[Š$‚dM“uBµ†"™–Á4Y1C$} +癤Ð9ŸÂ3—¤&HÅ°™Ï¡~YÁŒ%cú#+˜þæLd³¦0°Š™ÂœYŠ¬àƒËæÅÄ.š~åòõÜ'9˜Ÿ£MéÛÐ?k¬`°«YV0]^¢:‘õf1?,ÝÙŒ!1;²Å’NEV0Íf °^qÁôÌ8)¹!S,l¾¦Çõ¢heŽU’²ÅsC&*,:>Ö‹fKk™žºÜ¢X(Èb`­Ûò4·,M­J +„`²Fåü“¦V0Õr+,öÒ+æèp„"«˜¥c? +l^LYÁ`— ¤DdƒEW«ÏŠÑ©9§+Ê*»æ‚VðÁåiµ«ì"™hö%ÀP±±¶P̲@– £Ñ@*‹v€ÑÈ +f ,_d#Ø^ªY1Ø´`ù‚¬b°è¥\YÁ`Qz¤1Ê +F“©]Å`±05"Å`— Ë4+F’Ólâ•H¶^!L&²€b|/G 6ãø ++,f=QV0Øu†pEV°OóJX¦yÄ`1Qê•b&rΈš3‘,Qd}¸+68œB. jÈ Ëf#+,öÓDV0Êh6È*f@\+ +‹ãk"+lÎÃVdƒÅµC}VŒdÌw”U w õJ1»jê•O$Zš$Ïé²!K¤`°Ø—0YÁ`W\÷ +F@>‘AV1X¬¸YÁ`qA2kû$[¬ ³s# ™Ë<¯2$“Ë™À¥Ô9‡å“¥($b ¤b°ïšÂ +‹¬ÀÛ(+,öè蟹+‘âhSÍŠ™%·Q³b°¸`ªƒ]d'2‚¯²ZÈ`m´©ìbM‡#+,úŽ¬`¸„Û"¬b°Ë9›-²‚}8ª™á˜`©²Š9¼–FÍŠ9lŽÈúDáD³ë~B 0Q«‘D+]à2‰¶é©,EODV0Xxd3ŶÜ"+,¼@#+IÄÅ ¬b°$¤)°>XÙ\¾E ÄŽ9s<—N Ã%´)òXS›Â/Ž«©õ ¨9¯&’Š¡ÖiaÓèF…ìó°P탧—”¡æWè”b°ö”°^¶à´Í—ÈpjÈdÃ.u&¬OÒn§^æV„•3QÁÞ)(¶gG§F 6[PqdÓeîFaÃ)¬+„d½S™¥õë45äâïÓ,ov +‹Ø‘å(+,Î8YÁ¬û8²ŠÁÂYµ«,n((hVŒqÇ%K½òá¢yâéÁû^~®…;²>¼È +áFÖ‡;Êúð"+8„Øs¸gÙ4ãG‡è•b†Ë—va#\¼H¡O‚fŒ* þf§c± X\˜LÎ}ä"T»„FR1Ø"aþƒZÅ`Ñ|p7²‚™ˆ©KŠÁâ­=d3T¾±EÖWvî?Ià•œ†*.á΀üR1X?K5µ|ý¶¡Møzé‘͇`k.¬Å÷ûZÄXøñ¦°VÃ!ñ2¶R1X;s£¨b$iÎ/²â| fƒÛ«˜tW 8öºpÂ$Öw"¤b:ÄËEU Ö*,¬`¸‹^ý£KŠÁbÄÔ)Å`q»AÒ,6“ vÔ+ï$¦Ò–<š(³•ž'G€‚ËX×^„¬¬–C%ä‰ÃÃ~O ÄÔðWá̃ùùC…Ý C–|’vÏ„A¼¢$˜=;TpÛ0WíÖmÀ¸!g¯—‘3¹‚ŠGØ€!@p¸=¯…‹:¹·£\„È)I9àð½0‰\b¾àk˜Í ¶1¾Îx_„=4;?%Ž\„ô“o ‘‹ö0kø.7Ê ¤ŸÜA‘‹ G9ïg~~ãÉì÷3@ø9~¹Á­íc]à"¤ŸŒ!È ‡Fã炳Nà°ø¡aä"‡ãƒŸ +F.BìAØã7•3çãÃ˦phi¬:_€Œ/G¿E.Bp¸Èc¹Ÿ]>FîÍíÕ«w\§îöÿP,WîvkßÿñËæÅûfèÚíi3Ômó×ÛãYLpâŸ} )ž~qS¾–nWö®¯¾W]¹wwU9œºªwîÜc{r‡ú~7¸‡²\ÛQÓžZwê«™»ÝUn³+CÕõ®n ]÷îXvƒ«ÊÍÎmZh§s÷ÒNØn›ÊõÇjSßÕ›ÑìÌ{ºOyEÀÓ·å×}åÚ;÷¶m†ªzÿ$vÖÓ¨w=sˆ½ºïÊ¡nîÝÇ÷¥n¶íCïšjxh»o½{¨‡³Ø©ÿzœBçÍÜëûªÙ–îâÎ:s×å¡r¿W}»?1¯Œ´tGäË}nê¯>ÔÍ釃ýö©b\´fÎ{µf^¿xU ›W»¶ÿÃp°0ŸD™Úý÷Ù¦mî¼Þg³+Üóâ´ûçÂùóÂMß#‹›Ý3 +^N +ë–6óÖ§ ý†®ÙZ§%Báž&›Û7Úu5¼yÿëWûýUñai-ìæŒMùáã/¿ÞÜÞ¸»zoO½¼x ÞM¸àþO×7îCÛ~;Ÿ1³˜¹/ï'\„¿´îk‡d?Þ›ÉÞ•ÍÖí@a†¶Õqß>º~°.'_Ø„lú z2¡o'žÂIc_mN]=<ºöÈ>Øb»Ô÷ìY?ýw˜ê¾ªûªçèž'Ç/i%qìÌÜç¾RK×·Õ,1§a‡¹¬7;LF_uç‘Ÿfßàiùm´^ºCuøZumh‘ 9„±memkì"h” aÏŸ¹3©0›=r‹<±À“úáèsŸ¯ßÿÃ}ªºCÝó!÷¦|BǽO_o6L—S×î݇ú<Òj º¿¿×Õû€EÆÆlî ÌÄ1˜àxðgdÔMÒP—ûöÞ¼”<@/rÊ&C'}‡zkö˜<¸\žkÝïÊîrX Ž,ŽnqN\ûÐ`ïjkx­žE?OŸíܶîªÍÐvNB¸œ_Eüïh fó™`p:bè‚΋g/ËÃÆo·õÝ£ —yÿ]ƒêó¬èJI.0éD _·=§mÓáT¬Ü¡ì¿ñPÃ!Àsîb Àåÿ§Îr\CW=™ÚãÎ?í=dkln÷éõGÇaÝ¢¹¼èÖAÛ`ìptïá`SÞc¯NgñI%ö¡~v!ô^†‚ 1Kí¼žL÷ÓÇÑAtot×ï¬öþð5œÓÊYËövD—îc½éÚ¾½&F­Unû¡:¸¡«Ð—wûIDv¶¾o௿ðXm&³Ç'õu;TF¾Ä›§>®îS‡ÝÇ4ßœŽÇ¶žØ°ãÝ2¹UéÚ™3ÉÀ3:ÌÓ·ì'Úúç‘Vÿò¯Ë„RtS öØO]eÚ[õþ²X;Pô™6¤,â9‡Ñß—Ý}åšÓ¸fÍæÿÄt¿Þn©þ{ÄrBÃßëÒ–‘n¼O_žóã(å]tŸOËú«wxk³«åìrw™Õ¯Ëb…[-n~EJ;?ß^ývõ_ÿãJendstream +endobj +1513 0 obj<>/XObject<<>>>>/Annots 832 0 R>>endobj +1514 0 obj<>stream +x}YÛrÛÈ}×WÌcRaqù”’­ØQ²ºD¢ã¼‚$$aMZ”jÿ>çtƒ˜Iom•ä³gº§ïÓ¤~¿ˆ\ˆÿ"WÄ.ÉÝj{!þÏøãñëE6 B—Ïrüܺ¢âlÜÓ…[EEÒb°Y¤– cª*â`½Q<[ 6™Q³œÖ`°³: «š³ySsš‘ˉ¬Á`‹NÖà­‹£0( k1Ø,›Êê½i?¡9Ž‚Ìå‚Ô#Áæ k0ØyD¼¬jNÄhÔ,Èh>°EÆ|yÖ`ئ´yd5¹1NÅaÆ Åzm˜kŠržÊy6›'æ, æN‘°CóŒucXƒaTNeåÞldi(Rw=†æ<ƒu†5lÁ"0¬Á´ŠEmXƒ™|Ò°jUNO ›0ù™ ±Ê`°ékXƒyïk0SÄ’ô²3V1JÒ°ƒ…=“{Õæ,Õü"³È‘ ¤Ç´™bXƒÁfÅTÖ`z4£U^³Þ›†Z9z¯ sïÕ{sÆCU#T>ú!äIID ‚†( £Ä6ñ¤ÅŒR†B4¬$5EÛë8HÑxŠ¨8J<†, Dâä¬7)fè`_‚T€˜ä!M¢Ož´˜jù¤VMÂü'5e¦‚Ä$ƒ!‹G×zÖ`&N’>²3qìv#+÷&sNDh–{ù{Glè k04£P3ÃZ 6‘#«÷¢ åÁE±.$÷ «ä]0¬Á`QlÐìeUs>×äf!~'‚D³Á° +kÏÌ°k¬RÃFª9Óu*Š¹,$‚D³ÁŒ$#jXƒÁbùŠ,k0=bYƒaæ)²àïU«ÒaCö!+H#é1ïõˆ¬4_ÛV$× +Qƒ!ª)ñ¬Á4™«šDVŠ†}JÖDaÃa'B:a² ÏÆóa±I +„Y‘°Ó¡4¬Á`åqö¬¸ÃN„÷gîQ±’ù°))Ho…{1j‡Õ*-¤`,FŽ5så¤ ƒ¢unXƒÁ¢FàÌ(«Á_™RPs0§8eXƒÁʃïYU,#¤*dØ„ûNìYƒ©8D•Ö`°èIø3Ê굈ìð @RoÅ«p€ÄöRÙç2£Ä^EÞÞ‘ÅðNe&äNXƒ¡XÊc*ÃÎa3ˆYÄŠDÖ`ÅÉiXƒ©9²£g±yGFÖbvô|r¯Å`¡)·²ƒEŒ­ÍªB×Ì–HŒ=„ÁøÀ“FÒb°(L+j1CÑY/k0CÁÇѳj’üÄë/6ð& Ü`ÂHZ µ¨-¨õ¬Á`±3À`ÏL–Û—e=füùúxV”p¥–:½¼Á78’{V >Ȫž5x4Ø°bð Ë7ÈÝȪÁ‰îPó鎈ÁB-vbx:’ƒEo#ž5˜î°› k0 æÇ|ÃŒcc¶šÕàˆ‹8JB:V€ì! ––I‹Á♃ZÏ *ZóÃ$Œ”ÄÈbÔ¢)8lñ!zÐ$¡£jGÒb°H#ºÕ³3ÿ‘•KçºKFx3'€wHGçÈ›çøÁËë_Ž$úoJy$Ëi謪‚:|¨K=%ÙÀ#ì7pb…,äK0¾EàAá<„J™Î#'*eÅE~¹‰É¿)å„ð]?¨ÁQˆÉŽ]mXÜäã›ÏaÅ’/;>áÈ}Z\üòAÜâ™_…å³Â-ÖòMXè«¿p–nñZ¹›í[[ïúÎ-šfÓUý_¿]@à'bˆèÉ(pß_ËÞÕÝxþï•Ãð­y¯×ZÃG7áÛ”fÙ¾T½ûÖé‘i9J¦ÿÙ|Ìuß›öÇiYòTÝÖ«¶éšçÛ6}Å»Þ}[¹Ï¨|‘›´åP«^î +%ý^¡ÚjÕ7í¨²ö½^v %Q´wå¶:œqOu¿z=Î!O"A´C‰pWûþµW¯´oÑH›ó R–VR÷µmPé7×îj³iTôÜM¨ØǪÛozx¼zJê8¦Ð{c‡Ûæs³{®_ö­u¦*°*üyߧ=ÞþûÑÛÂÓî㎭ª“Î]оÎÝÍwTðä×z[÷bÐUh6ؼڠœuM½¤ÓÍ;šbÙ¢XôõÎuåvYžø'ÞÝc~¾×Õ‡kžG‘ã‹ŸúºýÛ[Óbƽv(ˆ»(BÎ=×V]³ÙŸ™øÎ=p£Ò’Eܹn¿ÜUÃIdx©`S¬›ªsöôh¶û@Ÿ8GÒŒ¥û~s÷4ŒËSg‘sx4þBðþñß_ï¿=œŠ!7?»¾¿½º¹;•Á<üÒ´+¦IräúcÌ¡Wܶìð(žŠ`4Þ–?Œή›m ó~&‚uÍÝq4”KÌ}Æ«\¯ Þ•ë5tBÓ$â w‹žªßоò@?—ÃL˜ÃÕóÍfŸÿ÷Ë“Ûú枤Ÿã¦Ý$=¾:îAkpŠ à×(éŸ+Æz¸r¿®ezk€Œ¶?V›Šáüå 7[î;øâ%œñOw²À<]Ý~ºâôü cÐ]7«=ûy —þÈÀã—E8çÂsü"ð{Ù"ŸáïŠ ó„WýcqñŸ‹ÿÉvendstream +endobj +1515 0 obj<>/XObject<<>>>>/Annots 862 0 R>>endobj +1516 0 obj<>stream +xmW]sÛ6|ׯ¸·¶‚Á/|tìÚÍL¤‘&î+EÁ.QTIJvúë»wèc2“Ìr±‹»=€TþD¤ñ'¢<¦ÄPÝN´Òxrüëëã$Ò±ŠÉFij)JµJ÷hE³IVà±ÉcU€ÌK•ïs„0*U!kØÁù°4Ä-źTYȺ’²R. ÿ¢$A¢uljðl‚nÈ6á’=µ$O`.€Ò ê•…Ì¡™äf"ÎäH†˜·L9ϘËÕª ك͹2¯uùÆÜo›qñ‚¸&Gj#áZ%d0@&‘ 1Ø8=‘†ØU„M½VâÍÊÄ…ÞJrˆ·åÞÚ,Bj`°%§°Î•»Á‰“ ÀùÀ:'ÏÎ&ç*<ËCÏðP†žñ®Ø7õ°%œò,àÓ¸@L^ˆLaš¥29:ˆ)¾é숤“ÉÖ2+CÍpÍøFñ-)È“q.Ù|+2Ì‹M±Æ“Î5â­Ðe¦Dè!„„GÒ 5O +B>c™zè„: E˜ü~Àeây8À²0B9žtÂïšæõ¯p€“¢µ«±Zýømþ}2Åï€)NYŒ•¼ô·‡µÝr»²U»ªYU‹•%»ìÛ?¶·¬ºEŠîṨû0ãúÌ5V´êj-{¢6¿g®è¶®í0Ьj ݶ¯-ÕÝÒÒ®©èl‰Ó­èãzìQf=6؆[âÕ¯Xy°;Ø]uýëE¼~û*ö{¾ÙÅy¼¶Áºz7\6T(zì»í†Új³iÖ¯ôÇççùçs³RíûÝØþ¥ëÛj¦›aØZ±÷Íhé*‹¨f«îîV]WŠæ”x¶o®5i#b·k„ÍœœiÜJºëm5ò$Ü\¾ôÝKƒÓÍkÃœ±9?7ëe÷6Ð/åûY;à‘óÿ4§ôŠƒ¥YƒÃ»¨zúÔnŸi·øÀé©Z/«±ëÒ&¨è|!æÖv;»l¯ì»Œî Ó{Äìgï¯õ‡CѱÖúæï/¼êæ¡Ø¿*¢$RºÀ+?Ð ¿f·On 1}·õH÷]½m1Dè.Ú”o±`šë’ןßDþFç¦À5@Ié÷ùä¯Éÿ )Ëÿendstream +endobj +1517 0 obj<>/XObject<<>>>>>>endobj +1518 0 obj<>stream +x­VÁŽÛ6½ïWÌÑbÙ’µ²½7w› šmÚ¸Èe/´D[l$RéÝõßç )ie;E[´Y°$òqæ½™7üó&¦9þbZ&´È(¯oæÑœÒù:ZQºZâw‚ÿ­¤½ÿ¬âë?lofï×”Ìi»V¶\Ѷ àÌñ&ŸÜ—¢q²¥uD´“‡V8¥ôñ3}Qº0Ï–´tϦýjéY¹òÍö›9M“ “Ï¢Þ ~ÃÄËpÀt‘F ]GqD›ƒÔE·&¥8îÖ$Ë(ã5[CªÚ©ý‰\)é«<Ñþ¨s§ŒÕ2/…V¶¶dö߉‰#u†¤»Jz€B6•9Õ€äC€9^„°„%`¡=¦|qq„.f¦™M%ò +¶³„ùrˆG›ÊNQODy*¾HÐSU$_D­´¼ãÏPlštßD-mMuäÜHiDÑ!ÝïZ½Ì~VúøBÛûO³ŸÎ“jæ$f +Ö U1üŒÇ!™KX$w´²ðRáˆk‘Øfrù“y¦] 噄^ ¦ *ñ |’É:O;ÀÖ™U¶=À ÁÆâúÈQœVæÇV¹™†‰:;77z¯LšG¥=ô²RÖ•´ŒvÕkôY†éõq÷JRôuBÂ^ɶá$u1•ÑgµO² èóh±Jƒ.¢;!¼´Ùœñÿ°¥Eô2KѯCŠ…©Tªe½ëa;©w×ANTèT¨ŸP슌ðcÀEš®5UÕcBÎþt‘EYœÑmß@…݆ׯíj,qÒ‡ô¤ÄÙ¹´;úI4š¢¸&”Ø<ž'÷GY`×&ÏÙ‹;çé#K0ê›ûþW³ÚAÄ0ýAW'Z$´SHPI}®ÃüF¥qŽîÔpRØÑ ±4büíͱ¥ÇIúøC)W5§}d=£§Hv'èU@…Ç Bld«LñøÆ×0ùÒâ‹âNœ~˜s*¯¥1q A{˜ °NZDÀ]q+®ãhq³¢B”£7‡‹€/JÂÊQÔ9n!:4îƒw+y7wqr·Hïn³‹pß¡Nƒø<'Û}+rIõW +L%c}6Öš\yŠøÖ’FŸ¹¨ @-N´C§`0?GåQ,8+]ÚúM蕇_Е7}[ªîYJL7=Ú¨Ÿúý[‘=æˆÆZuð÷£ÎïWg7K?Êþå½öõª˜.Óh™­ÂhÏn™ËwÛ›_o¾#†|Sendstream +endobj +1519 0 obj<>/XObject<<>>>>>>endobj +1520 0 obj<>stream +xWÛnÛ8}ÏW Ú‡uZ¾Ä°îSÚlÛn¶u±/y¡%Êb#‘.IÅñßïR’eÅÅn/h*‘s;gÎŒ~^ÍhŠß3ZÍézIiu5M¦´˜Í“9-Ö+ü<Ç_+)/æ«E²¼ôb6_¿|ñ~s5ù¸ ÙŒ69œ,×+ÚdÓ)mÒ‘€Ya·Ê {$c)S.µÒ+£ùÒ¤…¯­LèÖ“/$UÆyÚ +§R*å“,I”%iéÆ>RjªªÖ*|ß‘ÒѾ©¤Ú)½{³ùq5¥ñì‰m²ÑçÛ$²ÌJÇ/ú¦4NöžâvU³?I»ÒláêH°ÿ³–oIèŒvRKžZY —¹z–åHDèãÀÝ^X¯ÒºyyisÄõ6$%ÀNWR{29nÒ§û60ªBNj‡ú[S‘èÒ­„;®í¥u{™zõ$“ÛÏ%ö¬-û–S¯ãëYÔþ›HÒ ;kÞG¡‹º›°RFðOÆxÎÆ蔵—eGÑ0Rm­€ +¸wl«Ï¸;̪pºBÃó©ÒAÑRX½kd7môx¼JÖ¼V!’‡ùrÕ$ÑF^v{Hëìaä .ðÈuÌ‚GŽÀ¸ÂÔ%†Ú²öx=Ä€YPƒ“þÇšžçÒnM¿Lçeíú&C^-ætëù…ùõMÚ'¬/1ÓJCšî1 +–­Š`¼˜ ­Hy+´‹ŠN3õþ"Rhi7Æî:»¡ñ‚w[€ÆÜ»¾Ì=.]yíq#óºIÜ;Ô¦1ªÝíP•Däg-P=†î’GÁTëà\,OžcÙ“YBŸÂb1r©U"ƒU‚E ¯Íj›ÃØ ó®›a¯°ç°{eÁÔã¸gxå¼­SÞØ1öCW±.ß4=_ÄƦæWt––·[¥;ŽN“5cЫêÒ+LÔÈʶ”\ïʉEºÓÎ,¨Ë©aÚM3¡ûR +,ÑVæ¼’±äás‚¶ÇMlø_^[œÀ‰ÄÐ*]˜;¿”©Åeªhç Òiq ]NBu‡@yY(p܉ú{`ƒÔ€÷²¦ó1Ú·?@â¯ôûI$†«nŽuÔþª×‘‹/B³\¯#NëF gK|A®¯i¹jVúo·Ÿßßò>¼3iÍkP˜²|sÜ^¯¦ NlEŒa/ðÙ>EWËuÔÙå’ý±¹úûê_㈸ endstream +endobj +1521 0 obj<>/XObject<<>>>>>>endobj +1522 0 obj<>stream xWïS7ýÎ_±ã|(LÁ¿ 6ɤ4¤Lc ±3ùÂLG¾“m…³tH:Œÿû¾•N¶¹ÆmSûNÚ}ûv÷­ôxУ.~{4ìÓ進åA·Ý¥Ó^·Ý§³ó!>÷ñg%Í.'«.½¦É ;çøVw»4É©þyE7b)i,í“Êð¥|¶ Ì虚WVxe4ÍT!ÛG“¯]:§sÚ÷{íÁîóR8·Êß$7°¸,…ßg„. /­†»'IR{«¤£™±Ì›“¨ü/T! +ßì5öÒwô‚p¤•£"%­”ž*ï±á"7«ÿˆ~nMUn×¾ µÉËÂ8ïv3·V®Ý4¯öÒÃÖHs­t¦¨Bºþ‘›—þ£wxÄ€œiC*§|ZDZ¡k:-ýÊ؇MPLñÆnQ“‰dÚÍ ÞÞ= ”Öx“™"mÙøسޖÙÇÿnßÅòOæ_âé\Q¯Û褪üvv*ëä1I~13BDNÒRf tK‡Œã7מÜÂTENSIÚx™GÇ•FÁ Õy ¸¤ó%‹9 W¨!ìqh¯cš¼»ë\ߥÅØ05ª}UX4àÔ«ÑbËJ×½‰=ÎU°ŸVgª3äJ)”ž“ÑÅšVhg¸É…]7£{a=¯…-è ÅÂBÔo³º9±œ -ZG•®žÉUei¬z!Ÿ½Ô¼´›@z莚[rQÞ”žYá¼­2_YÙˆÉñ>d¬ƳB!vEÁ,‰i!Ù´™z¡ônÛ!Âј¾@TÌÊÑô—×·ãÐœ H½ÈsÔƒ“®MÓð:gk~Á½SéŒûX <Ö4Áj)ó`XÏ70rS¥=©Í«ÉKÅQçT] %W¯ÐëÝ¢XB+Ìt ?l‹$=çZ=&`ax3òÈ…˜ÞªoÜTŒ‹8Ì!Ž~µPФ©Aç°ìÄ~IVjZ¿ K²ßЊ«×ÔÖšwz%³ÿ´Ï »ãÆQåêršmÔ™ëwãîZ@ËKŽq¨èãáa»7 “ȼ[™³¼À˜š*Êièì ¿)6¬œã¡¹>ñ9,ÀÿmVšž„U¦r“ÔûC¦:ÑPòÕ½?ŠìKjq»U¡ÐœÖ1µ’3¶Îß·q‡õ£©2.k2R»…ÍAQ ¶1-–RÄL"[äµÖ>Π|Îdf;D†n­×ÉΰR] ØVûŽã¤¢m½`ò°‹Ü,YWìYØ - ÙŠëðsÁJt÷š¾ò˜KöÏ>ƒ†Ç¢dW‰@d“Âd<óÈÅKÕdòY𤻠4}\Ž»#iîkoà Ÿ›Å\>¨V xv‚)‰ï¡^Á‘ƒÐ@Ò1¸'1•ŸDQ1ûè:èx¨8—3<>ÉÏq.]ÖãH^Ãõnµ-†0çâB#ÒÍtHT0i ôX ûÌmZçŸ2Òóë2‚l8†0ž‹ $†¹Žã«·Í!;Á‚™) -M…ÜÀ+,#èbƒq…Í|7n#®x1pá¾sÉ8é×J‘ŽýŸµz¡‰‘˜‹›¾q“H{Fï~»¾ys1zÿ¶Ûý…~—(ý¸¾£pB+­3Î;Ë+Ê7 Ÿ²áRK«2ÕºÌø0'\Žþþè;¬öÜBÐŽ ¨SÒþ/ê/·Ÿ~ÿðéöóÝÛÞ”1ÿu„ó ¬_Z6¤­16Ùøf;¥ê¼ž½½îŠç§4žGu_Œ./èΚ¯¿p’…“D(s6~’6œ »|‘<üÎY°£çlîlxÖÎq/…©Á½Ÿüqð$»Sendstream -endobj -1518 0 obj<>/XObject<<>>>>>>endobj -1519 0 obj<>stream -x•X]sÛº}÷¯Øñ“Ó‰dÉveßÎmgìĹÕÔ_µ”Iò‘ˆ˜$”¬ß³ P’é™´7±e `wÏž=»ÐÏ£1ðL—gt>¡¬: Gtv~‰×‹+~=ïӴ”Îχýç7ó£Ó/#úæKœ4¹Â›œpÊhDóì„zÿ¾=>ÿëçǯO¿ÎÿA§?t­ÉèAUvVÆítN‹-©²¤JW í<Ù%ív~˜ÿ8Ñ`<^ÁÔ/,Œ3¶ðÙVÊÔôÉÖÁÙ²äÓNéA‡Ò®lM3íÖxôÿŸ™ó™w6S%Ý+v–nœÝø?u†æ3¦56×:ÄПµ·eçÉé— # ƒ³ G9 ä Û–@FSm -… -‚¹™>ΨRYajíw8b‰6Žì¦¦øzRžxŒÇ¤v­‡4/Œ'þ©ip:·gl5cÐ𘂥ù§§Óéú€Ì¨`líiS [„5¹áø`+§û- ©Hå•©‘R§‚u´1Èh®6žj6ÉŽœêÖdÙõì§%Ÿf”« Êk˜DØ)ØVÞÛÌ(dcBA üTyî´÷ÃtâÙÌED0¼l ;j¬©S++•3K“IP}œ?Š—| Ó<¦ådïtü Ë× -M §jN&vÜé̺ÜSn9oÔ8»6¹îÊ‹»4rl¶ #´´®Š^I¶ïgôÍÔ9øŸ®Y® k 2rT‚—›qš€ØÀ̵Éø™êg·R[a“ֹ·t]“~UUÿ±/$bÜ…j`EÒ]#8zçm;³wA!^®»^œ±èØ'í†R/N´Õ9Úa·Ï!»£$á.ÒŸ@m+8Í@™z…u¥µ/mCßOÖF‘êÙï0^8«ò Ìþþ°•tÝV,‡ÅKOWM‚|¡Öoô‰!Þ'ê/¿Ck€ ŒCTz6þÙjÔª »jÖ©S%C¼ÈéÐBò®@:ßð¤D-±{l´ҷ€óö,§²Ã>§p&9ÎxLIFŽ#Ú§”yW;ó.æãu/+gÛæ5KÇ1ÕÇ° !P)ˆÇ²õ|4^„å+@²-("òfUKéñ -»ìrHUâ áa„f­3-ÂAñ‚ÎX"­>ä&Ô•=e•C@vèÐót¸ ò®6ØÃÆ™J¹-ò|x~:”Yg늳)~—BÔFk7vÀQž!¨ŽºÙ·0–í^¨;º)„åj ¯fZdz›¤ã]èEcVÜ=sß‚݇ìOi* ƒÚ²Ôvxö£ úÑ@?QŽzy©¹Q EÌþyý|K÷Ÿow'~ÿ !Ti¤,´ü³â¾‰7¡Ó -¦÷Í55•Ma™ÜÛÅ/]ÂèЖl#•"œ©íΊO¡6ÖG¨«,ý:»}ÿ{ïñy›ƒT²Ú·\ƒ?[ã8Šžâ7.–<+”‚>n·+ê ì·š‘<@E¨ ¦œ®î²Ôlloœy$WT½”|;]¡õwÒÔ‹ Þ«h‹”¯ÈzÔw°†ûPô œˆw3‘`ºO{nÐ9^ÀÙý 1J0ó7&96Åj{–Ò²3öý¸ôèFyLwÓºi=¶ÿÌd6`Fuû’`è:So1[ìlÝÝ}‚WwvèWÌ©_º±NïŒX87¢‰PøØ QPm$[ {,ØÛ¯Szëõík€Lê¼íW&‚LoK•é~ªô–Õϵè$dhõpr7í1(ìÆ“Ê^0ûݾf…ªW8eï?*P’µØö ?à<ÐN~ƒHD@Lèí ¦A­ÃÃÓŸäfÞ3 &2Jó8 ñ[8%¾hîäßU6¢BÝd–õ -ív˜? KÒF‘ [¶Ò+͘_¡µÍ¤sl°ªõØ”}\ &ÒiLñË“£`0°¦ÎŽ”È¢,À¹J|?ýò1"ò%fp>ŽÓ"îçÃq¬¤.èÏ>a8*x;ª_òˆyÔþ.|¸-zVÍüÄÅÆ¢µ,ÚåÙzŒÊ…Pg2ÊWåô©—˜4梉uj¡ÁZ‡I¼S nøÐKyéô¥Ç‡ª­¹½vÀI:¥ññÈ? Æ% Umà!cÚŸá*BФ—˜œyåVcCǸQ¢g;´t¶’èxX-Á^ ÉÞ–ØH-­,`¼X¢ï‡G ³BÓÏÅžU7úOyŠì@…z.sÜÑ#yÝbœšg¶Â…¹›EEŠ¯dX¢_‡úùAÒ–eë ¸º‹\—R¨TÀ])v:ô€=MÒ,·š7Ù“ ‰ñíâfàÞ3L¥–=Ö¥Ú"yf¨‡C -}?âä $K½C2 Ò±·Y†kÂG–©´kA,>=ã|ɉó îr½Lµt@¸!LVÈîâ92¦âP(§2ƒ.úÔAø˜4»/2s8rPi’§B mŽ¯I|£1àÒ`ϧVU¢(úâq½¸à†ãXô3U-ú#kU2ãÅ?æÏÁþj;N²r•îŒã ¾N¹:§Éä"~q1»¾¿¹¦'g%‰Ÿm†+H Óp•!t—#þNåä‹ÑÅåÅðrrÃòÉŸr;?ú÷ÑJ,ÝWendstream -endobj -1520 0 obj<>/XObject<<>>>>>>endobj -1521 0 obj<>stream -xXkoÛÊýî_1¿8€­HŽáGpQ@¶åV€­¸oƒ (VäRÚkr—w—´¬þúžÙ%-Ùí&½M;"—ó8sÎÌPŒi„¿cº8¥/ç”U×ÉÁç»+ŸQRàÎù%þ“Óh8(ÉŽÆ£á—áé’µ¤û‡¿}[$ *T)?%¿ã¹3Ãs'§xî(Y+çï~·®e¹¥Òd¢‘9)M ú®tn6Žæ Gd,²/Ü 6·ytó5M¿Ïæó$M¿-’é×Ó4½}šýcú´HÓiró>†#:çK#:#f'3ºJ;jþì‘&yn¥s|Ò_ªD¶VZ’•ä*ÑdkDZ e]HúCP]3$TK[[!5Ù\Ͼ-¼Ù5†ã]•¨k¥WAI ˆ†ÝéÓó!—áhÖP³­UÖÁhž•êY~탺êÁ? ç©ûsH7¦ÞZµZ7”eé'_]]҃ʬq¦hpÛÖ½3”ø’½=܇üñ:H€ªâŸ 'ªï3årË­vç åvtSr~¥C&êÁ¼HKÉÍãçÙ#‚vÈž ˜ö¤¹ºŒ=»böåyG†yG¦Ø+ˆS 333UÝ6Ò21\Ôö[>ˆÕŸMA)B²vKnmÚHz–uCFƒw`Y®^Te ”ZF‹à·G•±ºYP³ºSÄ[¶•Tei6oeˆž Ô±€}ûÉÒ÷üìuÂ':4¢6w:Y ë6ˆ†J)¢Î\ÐYòXOƒÃekÏ`?jœ[I-­×çÊ”Kméé¢Xx(ÀL„Z®9nÊ× ð+£ã…\JÀ–~Š#Ø»~Ç(‰F-!ŒjÖ{r»ŸÌéAh±»O‡¯é¬ÖÆ5ñ°˜¶¡Y™¢6´±Pc®›|m¤vœ˜oÜ÷>J6¸ûáãÓô''n¿=|ý%7ºè_~rt6¿¹ÿõvJ¿pØ,‡Ÿ=p=ýëlþÏÉ}2}šO’ŸE2ßþ¯gÓtôª5Ú6ú¤¶J7žæ=Íȵuml“~Še»Nw^`lMèm'sÌ Ä¾îüéÓŽ ó”(KÊصΆÖz£mÔ¼¹;®ðm?©2ô9¤ë-4Pˆ¶lŽýcŠÉbãæ!—ÉcZ¶ Ç°³Ü¹Æ¨dHùnTœ¡Q ¹°~¨ªt^$û uùy}p>ƒÃ}† ÐV)áœÉº§E, õf-mFfªP¡öìå~ó JÊGk³ù¡å¥Å’,¸–f…ìñéEeÀx)×âÅï aR!§eæ¾Ã[ƒéQŽ†Í™³ôÂo©æ¡o0$§cR \-á× ÌÐ@”?òœDÔ>3Ž²?eü4é‘ð#¼Üˆ­ëR¢l0®Vköè© -¶D탛h÷M›µ ìßñ’­¿(‰)ô癲ð…Û²¾‡ÿÙO:a!ÀáÜžînÞ–- ãë$.iâ½gÃ|. ÏÞÀŽ)»®åKîEÁXl<…Eþ@Z¼â–ýÖÇ(ìF– _ç7'KÁ:c¤Ž7&Žï#Q3&·(Õ¿ðP7)ÂjPnɼÜâ.ožžÒF1'ì’ˆirÿ}ò6Ó}BÕÖ`#‘°Ñr1¾{û†+®Dƒeq@-h¶üh`^_ÁNy½ñªñѽÏÔ\YhR½ü`š!Å<÷]ˆsèåhu»,U6àÕ¯Ê×°–úqNÞ€ -7£‘ß Ñ¼ñ—Š7•‚ó¶,ÐÚÞ‚}9ïÄØI2:YØh»^£‚à¨X)‹ǻzº6cyp¹í°z–[®V«á/j8M;÷i궮‘Ušf-;ÝðªkMédƒ[]ÛJÓRèJèP©4å­’h÷.M5\»­G6¾’tH[¹Rá.Þ08ÐÞÊÑÕ߃Y$ÁÕ±ñêF3LPÔð&xU¾[°Vo7( š:« /ů%=ñ¢v±/.n×\heM[CIYIŽuHÌwÂÜ®>àRV¶y\»!ï éͲ oâÿéˆwJóÒ{Lÿ}•qØ(4' «¥ÌæЫƒjE ¼68Ð…ëÈ´ÿâʺù£5@Š7Ìc¾¯!Ûî(þ|wÙ½«Ï/†£Ë/øö_äG‹ÉÃõ„­ù²¦[“µŒµ7ÄÏôÇO.FxƒÍø%ÃÙÅÙðâü_Mààù??Mþ~ðoå+endstream -endobj -1522 0 obj<>/XObject<<>>>>>>endobj -1523 0 obj<>stream -x•WÛNãH}ç+J𰌉s™FÚ ™ÝHa‰gG#YZuìéÁîö¸í„üýžjÛ¹ ï2 PÒî®®:uêTùçI‡<üvhØ¥Þ€ÂäÄkyÔïy­.õ¯†øÜÅ_&iáôzÝ·t®û­Áñ‰[ÿ¤ýÙ£kò¸cp…Á¾ç‘žSõsFAà½jMÚä"WFSnȦ2T‹ ZÊWZ‰¸€ &Ãwmôeš)+ýLáRd"ÌeÖúàÿ8ñè²ãµ®pËÎxÓ:ùK¶Çf͆ä«HÒX’ŠãÂæ™È¥%Çd”/¥•ØKmáýÔd²i:^·õ±ßD×Ct¶TÚÔñÓÙãÓ˜ÎF_>i™¯MöÂѾÐsfŠô7K£»wÇ5lóT¤©‰$‡k§º½hïÙXÄ„Íde¶’Ù{nèöØFjÒ"Ùž¹2†ƒkŠ,”¿`»ã°‰M(b›­öl9|ö¾342’‘#²CJ‡qɦšÖéìvüÇdúÏͽ?~šÞøãæ“éÝý×шAía¤Å0}s‡5=Ìè›Ò‘Y[šúÔGWD;êr/C ”6ÑGÍó»OAðm2úA0û>óǽnŒž&ŸfA0öšï|8g¢×‘öÐ`áζ9A“Gº‰¢LZTâ®–XtœÐÃDäᎦBe¶E“ƒb ù¦Ì3wX1qÁ}öèF¥™@ï+¼àÄé½/(’) gÆ€dK³vý»Ç6|“z¥2£™ƒ \_¨g؈Z ª0)Ñh6G¯EéžüY(tz¶R¶]úªÕkû^éâõá¶ÌÃöVu÷¡l"C ¼¨èÐoÑh:£{W%eêÞ¦C(R1W±Ê7‡q18œ„*~+ó"eMõƒª‘o¡(çš…1ägи"$ô É0<8UÝË„úg!QwìL9ºà<ûÉ †-\ê€Þz© Ê–i ©Æb¥'S™ßN¾ÌŽ.žš!mRØÃT•HVɃt¢p[tC»}¸È£D -4 ˆ.UfižA¿Cp‰‚sHFF_GGwm·\4`mî„»–ZGl'€pc´Åü‡ 502“K•ãã,/ S 4ªÄÔžð¾£›C¤tpÖhwfN\T:ÁUvÿPjòŠ9S†/Ìg$ÙfÛ¡på:Ÿ†`¾+X|›—Êà-3¾”;‚jÌhææ1^2sîF°\Å:/EuçéEíæVì+ý€8m1®O)îoIå^u|l•^ügyÜ”{‚óZ'tÑ€fÊ©)#@x9öOþ:ùÁ5r¯endstream -endobj -1524 0 obj<>/XObject<<>>>>>>endobj -1525 0 obj<>stream -xX]OÛH}çW\õ‰JÁI MèJûKQ‘¶«dÕ^&ö$žbϤ›¿çÞ;ÆDª´ (Ê|ܯsνÓ_gSšà{J‹KºšSZžM’ ÍgÓdF³ëþ¾ÄO¥i# ù“Áç·«³ñý„>Òjƒ›æ×ø##Ü2™Ð*=§øµ7Ö“ov;WÕô'}uïW?Ï&t1$×80ا«g]aÛËËKÒûá3ãûM§ÁØÅåœÏîs Ãâe\<ïã+^='ã©Î5=|'•e•öžÜF>ùñðuI^H¡4]D{W3äáõ,¡ÏnOëÊí½±[Ú46­C”Êf”c©v”é]áäkµ.4/ðˆúçù¬k›ÉbwQ#×-U¹V¯æs‹D"¾A.kUëŒÔÚ=ë}YÒc3øB¥JscµGÕ¶Æ×È#5}Õõí÷%YUbññÜ$:ùCBŽ'd…6®"+¢§Ó«ä’=匘TS}Øi2–ÜNWŠã}|Oβ7¨k³Kè¦ðnDjè '[¿¨´¦R×¹Ëh} }nÒ ìTt8\;0_«'8½+\ÀöL#®QÆ{p%â„çÖÕR/ia´­Ç¡¤”óµÖ–¶æ¿õê=°1‚Ÿ¯îÿûËçoËÕ’ -çžš»£-—0±fCw@§±Ÿqç]ÑpÆ^Ðu*0ãâÎ(¬„*¯Ù4 ÍÑIÜÖõý%Uo3zÚk,á_ÉkpŸã’ÌY͹ÿ÷îû \Pe0Z'´â’ø ˆuµéÜ®¹š…KUJ¯­®GÔØ‚IÔæçê`ovžv< mÇTkŸ¢÷ `áMÝÀ< hW¹g“Á)𬇠Mžùy¢.Õ•æB¤f]ÑûS§L cc¾–ö‡òè œªÑiÜÒÞ ’ØÀC– WˆÓÚ±{oj&‘î#£µÛ²wÉÝ©ôIמRe91•kD@ VuÞøpˆb ‰tì—¼Õ7RiåPéx<¦Ä·[ß5«"û%Ú¢ €)cæuä3$:&wä6K+ Ø!ÿ`%â·Cu„^ŒàÌ10AvU`{6¬®~AúK²#cýø†VôĤC\ -ˆ=†šDæJÉ{íI`ÉUqg§å¬6ðzŒT 8ŒjA¼N‘¡ú€ÏäòÔÙºrãñª‡“–6EØ‚£¸@3vù2H-[•øOfòñ|ÀŠ€*ÿÄ{E -¡[›Ê•-“!ïǶÕÂI¿¤¹²[>Óg ›…Ô‚Ä" {P£™ EÇŠËâ@n]s~ü.w˜s$aQ ¢íº[+TŠ1Ê"ú$&§Ó‹éB‹È_C|Ëu!ÒÔµ‘ØŠú˜ØBØÊ·‡`\Õ »FˆÝ)*¬+£z?šˆ¬ÍÍ6× t³«M‰NŽüÃÐÀzé°Ãkk° -Õ.u!NÉ` $ií¡e±j`æï:€Æ“ˆ’÷/i™è"Æ·Ðuîe¹mY™$l¤•¥sDë†YéeøÁpÓÖG=+S¨µ)ô‚Ѫ‚ =!¡3ÚàY:‚phLljv$/‰óQæG2þ¬…q`V̹îገ" ZˆÖ1+ E ™¡P!—'ÀDÈÉø’³ãÎN¶èãδÍê33û(>!ñ–÷åùÃù8‡ôzvÿøð<ÇûY‚Ä9+Ò9¾?ýFüô§Ç®å;Hýà¡ØªU+üí1pŸ^ëRFlÈ“ÞIãûëèïtŽ×ùõÍ?Èqyóåö†¾WŽ]ºsiS"¢ ÎE»ýb1á'ûÿÓò+÷w¯ØÙb–,æ×øXZLÙO«³ÎþQü‡Âendstream -endobj -1526 0 obj<>/XObject<<>>>>/Annots 825 0 R>>endobj -1527 0 obj<>stream +ZG•®žÉUei¬z!Ÿ½Ô¼´›@z莚[rQÞ”žYá¼­2_YÙˆÉñ>d¬ƳB!vEÁ,‰i!Ù´™z¡ônÛ!Âј¾@TÌÊÑô—×·ãÐœ H½ÈsÔƒ“®MÓð:gk~Á½SéŒûX <Ö4Áj)ó`XÏ70rS¥=©Í«ÉKÅQçT] %W¯ÐëÝ¢XB+Ìt ?l‹$=çZ=&`ax3òÈ…˜ÞªoÜTŒ‹8Ì!Ž~µPФ©Aç°ìÄ~IVjZ¿ K²ßЊ«×ÔÖšwz%æuû´ »ÓÆQåêj˜m Ô‰ëwãæZ~ÀÊKŠq¦èãÙa»7ésÈ´[™³ºÀ˜š*ªihì ¾)4¬œã¡¹<ñ9,ÀÿmVšž„U¦rSÔûCf2ÍPêѽ?ŠäKjq·U¡Î›Ö1µ’3¶Îß·q‡õ£©2.k2R·…ÍAP ¶1,–RÄD"YФµ–>N |ÎdF;4†n­×¹Î°JYë×VúŽã ¢m¹`ð°‹Ü,Y€WlYØ +ýØŠëðcÁJ4÷š¾òüKöÏ>ƒ„ÇšdW‰@dƒÂd<óÈÅKÑdòYð¤κ ô|\Ž›iîkoà Ÿ›Å\>¨VÌwv‚!‰ï¡^Á‘ƒÎ@Ñ1¸%1”ŸDQ1ûh:Èx¨8—æ2<>ÉÏq,]ÖçâH^Ãõnµ-†0çâB#ÒÍpHT0i ôX ûÌmZÇ2Òóë2‚l8†œ/žk †¹ŽÓ«·Í;Á‚™) +I…ÚÀ+,#èbƒq…Í|5n#®x/pá¾sÇ8é×B‘NýŸµz¡‰‘˜‹›¾q‘H{Fï~»¾ys1zÿ¶Ûý…~wý¸¾¢pB+­3Ž;ËÊ7 Ÿ²áRK«2Õ²Ìø0&\Žþþè;¬öÜBÐŽ ¨SÒþ/ê/·Ÿ~ÿðéöóÝÛÞ”1ÿu„ã ¬_Zœ5¤­16OÙøb;¥ê¼½½®Šç§4žGu_Œ./èΚ¯˜¾p’…ƒD(s6~’6œ »|<ü¾Q°#çlílxÖÎq+…¥Á½ŸüqðÞendstream +endobj +1523 0 obj<>/XObject<<>>>>>>endobj +1524 0 obj<>stream +x•XÛrÛ8}÷WtùÉ™ŠdÉòÊÎÔìTÙ‰3«ZßÆR*ûˆEÄ$Á dýýžÆE’éªÌLbË* +@wŸ>}º¡Gcáÿ˜.Îh2¥¬> Gt6¹Àëù%¿žá×H*ü“Éð¼ÿüzqtúyDhQà¤é%Þä„SF#Zd'Ôû÷õáé¿<=|yüm4ùþMÈF•Ñ½¨%쬔uÒÈœ–[UEµ¬—ÒXÒív¾[|?Ñ`<^ÂÔO,Œ3¶ðI×B5ôQ7ÎèªâÓNé^ºJ¯tCsiÖxô÷ÏÌùÌ[‰Šî;K×Foì?:Cò³›éBèOÒê*yrúùœÆãèàlÊQÎÙRw‘Ôhˆ\)œ Á\ÏæT‹¬T´;±D*CzÓP|- K-<ÆcK½–CZ”Êÿ4´F8 ‡ÉðŒ­f “Ó´øøx:{ÄBëá”n,mJd‹°&Wülýév hjy­¤Ô§ m2šK„§’M²#§Òe§¥¶Y6=ûqɧû9剥°&v ¶…µ:S‚Ù(W’?Ežií0žx6sÑ aC­Vcje•0ªP™ªó{ï%Ã4i9Ù;>Hù:¡BUpªáôHbÇÌ´É-åšóF­Ñk•Ë^ ¼8¥‘c#·m¡B›:xå³}7§¯ªÉÁ7ø¬dÌrÙJX•‘£ +¼tØŒÓüˆ Ì\«ŒŸ‰~vk±õl’2—ù®’/¢ná?ö¹H w)ZXñén½ñƒ6‚Ù» /×]/ÎPtì“4C© „l%Gvû²;Â⹋ôGA[ÇJN3PªYa]¥õs×Ò·“µ$zöÆK£EžÙßÞ¶’lºZ‚¥à°·ÆÒ“ªÉ#_Šõ+}bˆ÷‰úå7h „qˆJϦ‘?:‰B•aWƒ@À: ÕcªÏ/2Òu†<Hò O*Ôû·ÇFÚ!}-8/iÏr  ì3²g¢àŒ%Àdä8¢}z@™7µ³H1o´y^ݵǨY:©>†/•‚xå£ñâ(Q¾H¶…EDV­_z¼B½@_•8Ãó0@³Î(‡a xNf,’VrêÊž²Ê¡ ;tèy<Ü#ò¦6ØÃÖ¨Z˜-ò|x~<”Y+£›š³éý/=Q[)ÍÀéÿEyr„ :êfßÂX¶{¡îè& +”«…¼ª%j‘é o¢Ž§Ðß{Yq÷ô˜ÛH²?•ª jKSØáÙ÷$èD ýF9êå¹áF1ÿÏÕÓ Ý=|ºÙøí¡†L#e®KòÏŠû*ÞˆN"Lï›kl*›R37¸¶‹ßw « C[Ò­¯Ï™FAÐø¼€ ÔVÛbõK¿Ìož¼ÿ=Œ÷ø¼ÎÆA*Yí;®Á2EOðJžJ@·Û%û­æ@$PñT…SNj…»,¥‚ í3äzU¯|¾¬Ñú“4õ¢Cƒ·bÚ"¥ð+°õít¤á>}'âÝÜK0ÝÅ=×èÏàÀüîŠ$‹ù‡“›B5ƒŒ=Ë÷qÙûv‚G\zt-,¦»YÓvŽ:Çæ~6`F¥}Q0d“‰Öv˜-v¶no?«[½‚ ô+æV5Ïi¬ƒÓ;ãÎ×D(|è†(¨®r>[ =ìÆÍ— ½öúæÅA&eÞ‹ö ÁOo…Èd?QYÍêg:tH2´ú89M{ +»ñ(²gÌ~7/Y)šNÙû +ôÉZn{†ïqè'¿B$‚ Fôvã –ð°ôϹ^ôLƒ‰ŒÒ" Cü–N_0÷òï*Q¡n2ÍŒzvÌÐ%ßF‘ ]u¾ÿÖ’1Q¶Fk›ûαÁ>¨bÐcUõq˜däfqôçÑÿe°Ýendstream +endobj +1525 0 obj<>/XObject<<>>>>>>endobj +1526 0 obj<>stream +xXkoÛÊýî_1¿8€­HŽáGpQ@¶åV€­¸oƒ (VäRÚkr—w—´¬þúžÙ%-Ùí&½M;"—ó8sÎÌPŒi„¿cº8¥/ç”U×ÉÁç»+ŸQRàÎù%þ“Óh8(ÉŽ®†_†§CJÖ’îþöm‘,¨P¥ü”üŽÇÎh<œ^à±£d­œ¿OøݺV”å–J“‰Fæ¤4=,è»Ò¹Ù8š't6‘±tÊ®p3ØDpÞæÑÍ×4ý>›Ï“4]ü¶H¦_NÓôöiöéÓ"M§ÉÍûŽHèœ/èdŒ˜9œÌèF(í¨Aø³Gšä¹•ÎñI©ÙZiIZT’#¨D“­i-”u!éAu|tÍP-mal…Ôds=û¶ðf?DÔŽCtqT¢®•^%5 v§Oχ\…£YCͶVY£yvTªgùµêªÿ,œ§îÏ!ݘzkÕjÝPz”¥Ÿh|uuI*³Æ™¢Ám[÷ÎÆ£á%;{{¸ùãuUÅ?ANT52ÞgÊ ä–[ìÎÊíè¦äüJ‡LÔƒy‘–’›ÇϳGí‘=0íIsu{2v=ÄìËóŽ òŽL±W ¦fffªºm¤eb¸¨í·|«?9$š‚R„dí–ÜÚ´% ‘ô,놌ïÀ²\½¨Ê@)µŒÁ+n*;cu)² &fu¦6ˆ·l+ ¨ÊÒlÞÊ <3:¨ bûö“ ¤ïùÙë„OthDmît²Ö+l •R D¹¡³ä± ž‡ÊÖ8žÁ~Ô68·’ZZ¯Ï3”)—Ú4ÒÓ D±ðP€™µ +\s2Ü”¯àWFÇ ¹”€-ý-F4°wýŽQZBÕ¬÷äv?™ÓƒÐbvŸ_;†SY­kâa1mC³2E!mhc¡Æ\7ùÚHí81߸ï}”l4p/öÃǧéONÜ~{øúKn*tÑ¿üäèl~sÿëí”~á°Y?{àzú×ÙüŸ“ûdú4Ÿ$?‹d:¿ý_ϦéèUk´môIm•n<Í{š‘këÚØ&ýË(vî¼ÀØšÐÛNæ˜Aˆ}ÝùÓ§ æ(Q–” °7j ­ôFÛ¨-x)r/v\áÛ~Reè1rH×[h mÙûÇ“ÅÆÍC.;“Ç´l>Žag¹sQ- +Èò-ܨ,8C£@saýP!Téþ¼HöAëòóúà|‡û  1¬RÂ9“)tN;ŠX@ëÍZ *ÚŒÌT¡BìÙËý†g””5ŽÖfóCËK‹%Xp ,Í +ÙãÓ‹Ê€ñR®Å‹ß¤BN/ÊÍ}‡·Ó£ ›3gé„ßRÍCß`HNǤ¸Z¯˜) (~ä9‰¨}fe?~ÊøiÒ#áGx¹[× +¤DÙ`\­ÖìÑSl‰Ú7Ñî7š6kØ¿ã%[QSèÏ3eá ·e} ÿ³Ÿt"ÂB€)¹=Ýݼ-[Æ×I\ÒÄ{φù\0ž½Sv]Ë—Ü‹‚±Øx +Šü´xÅ-‡{­QØ,A¿ÎoN–‚uÆHnLßG¢ gLnQªá¡nR„Õ  Ü’y¹Å]Þ,<=¥bNØ%Óäþûä7l¦û„ª­ÁF"a£ßGyåb|÷ö W\‰Ëâ€ZÐlùÑÀ¼¾‚òzãU ⣠zž©¹²Ð¤zùÁ64CŠyî»æÐËÑ<êvYªlÀ«;_•¯a-õ㜼nF#¿£yâ/o* æmY. 9´½ûrÞ‰±9’dt²°Ñv/¼6F Á;P±R„wõtmÆò.àrÛaõ,·\­VÃ_ÔpšvîÓÔm]#«4ÍZ,vºáUךÒÉ·º¶•¦¥Ð•Ð¡RiÊ;Z%Ñî]šj¸v![l|%é¶r¤,Â](¼ `p ½•£«¿³0H‚«cãÕf˜ ¨‡aMðª<|·`­ÞnP4uV +^6Š_KzâEíb_\Ü®¹*(ÐÊš¶†’³’ë&˜ï…¹]}À¥¬ló¸ vCÞÒ›eÞÄÿÓï”æ¥÷˜þû*ã°QhN@VK™‡M¡W1Õ6Š@xmp  ׇ hÿÅ•uóGk€o˜Ç|_C¶ÝQ6üùî²{WŸ_ G—_ðå¾3È“‡ë =Zó;dM·&kkoˆŸ;éŸ\Œð›ÿè;†³‹³áÅù%¾˜À¹ó+~|šüýàß„¢äÛendstream +endobj +1527 0 obj<>/XObject<<>>>>>>endobj +1528 0 obj<>stream +x•WmOã8þίÁ‡c%H_—ÂJ÷h÷®t9š½ÕJ‘NnâR/‰“þý=c'}½cA Ö±Ç3Ï<óÌäçQ‡ÚøíРK½ Š³£vЦ~¯t©9Àç.þ +Is÷ ×ë¾ý sÕ.öOÜ„G­Ïmº¢pŽ;..ñ!!Øo·)ŒO©þ9¡(j¿hMÚ”¢TFSiÈæ2VóW´/´iLïÚèó¼PºTú‰â…(D\Ê"øþ8jÓy§\â–ñCë.Øbšš’/"ËSI*M+[¢”–Dš’™S¹VbC)µ…wöÓ!“‡Ö©Óîû º¸ ‹…Ò¦‰ŸNGt2ürÿIËreŠgvˆNð…ž +Så¿YÞ¾Ã8®a›Ç"ϵÈ$9\;ýãõE[NÀ"%l&+‹¥,ÞsC·Ç6r“W©(¶Ìùv¬©ŠXþ‚íŽÃ&5±Hm±Ü²åðÙúÎÐÈD&ŽÈ)§U"phNnFŒ'ÿ\ß…£ÇÉu8:¼q<¹½û:Ñ(j<Œ¢¼š¥*ÆJ¶0¶´ï;îrÿ gG“áÿ{xðê1ª ‰™Y2‡ÉÏÜRC“ã:E] +¥Á{_}"=hu]v€žTi‰ùV›­ÉqLB'tÜ€µ¾…wâŠâ`¶(/djò{æL°ûÇ´¤l- +L°nP,4Í$UV&]‡¶¤¨î‚Nšœ +Š¥Fɧé+e€A€É:©4W, N¶Â9hß¾ÚRfì]¥ÅR¨TÌRùëê41¥DšDérµZ8á=±”‹Ö¬w*h² !X‚vJ/(5æ¹ÊÏ;ièYÊœÏ2¼ºÊf@Z7–“ Li•U­ Š¤²¼`å²€gBLJÃbq-$¶¹’±€´“H–Ê2Nßax‹dh΄AÀEþ A‚]Nœaq·>_Q§ïÛÍy¯Ãà*èá—þü2 §n#[l}îS¹-w¼/\Ô†\êlåèÀì-Ôt?¥oJ'feiRMݨ˭ %àm¢:›§·Ÿ¢èÛx2 £hú}Žî{Ý(>Žÿ=N£h:1ßøpÊìݵÞ}pÑ€´¥“íFh¯üÁŽÑV³2vÌÀÈDöÇÇY\æ¦BeÔ‰i<á}{7ÇGé2à¬Ï!ÐîÍœ8«e‚‹ìîÞKòŠ)SÆÏLg$ÙfýÚ péúž†\¾+H¼óš—|ð– ïÅŽ SšºiŒ—ÌŒ{,ױμ¤n<=kÜ\K}-Ц5ÆÍi Åñ-¡ÜÇÇÀ;ñŸÕqí÷D§"Ž5آ̄3ã@t:ÌüK¶DËñ„áÜ{¹„B¡Í°zºG(Îi!Ÿ:5TŠåQ4â¾O—T9Uóí§àÂbØšžÔÿa6•Lz£åN7âíç†sáñÍZ!šÈf‚“ŽÞ0꠺͋ʦ8yF¬þDÂó0>ófŽß»ênd³YÀšì—©;uÍнËl½£wûÞ·fÜÆËæ¬*ÏMQÒïô]º)w#¸.×?ß †uá]Ѹ‘ê¹¾.ãÆñmO/ë¨:x7½ìÑÅÅGß0§×÷7×ôP'CWÜœòràçÍóA›_Cßž úƒ~0¸¸„¬aÇ ÍGáÑ_Gÿ¹-rendstream +endobj +1529 0 obj<>/XObject<<>>>>>>endobj +1530 0 obj<>stream +xX]OÛH}çW\õ‰JÁI M`¥}€¥¨H[ÚUXõ…—‰=‰§Ø3©Ç&äßï¹wÆŽ1‘*-Š2÷ëœsïô×É”&øžÒâœ.æ”–'“dBóÙ4™Ñìr¿ÏñSiZËÂ2øüæñd|7¡+z\ã¦ù%þÈ·L&ô˜žRüÚëÉ7Û­«jú“ÜÇÇŸ':›N’KìÓÕ‹®°íõõ5éýð™ñÝŒ¦Ó`ìì|Îgw¹†‡añ<.žöŽñož’ñTçšî¿“ʲJ{On-Ÿü¸X’’p芦‹hïb†¼ÀâU2Kè‹ÛѪr;oì†ÖMk㤲åXªez[¸=ùZ­ +Í |!‚>Ÿ„k°®m&‹ÝE\·TåJ½õ™Ï- ø©¬U­3R+÷¢GôuI?ŒÍà •*ÍÕEÛ_#ˆÓTô ë›ûoK²ªÄâÓ©Itò‡DOÈ +­]EWDO§É9Ì 1©¦z¿Õd,¹­®Çûô‘œeoPÖf›Ðuá݈ÔÐAε~UiM¥®s—ÑjO»Ü¤9<@)Ø©èp¸v`¾VÏpz[(¸€í™F\%¢Œ÷àJÄ Ï­«%¤^>ÒÂh[CE)‡g+­-mÌ ~+ê•{`3âb?ßÜÿ÷×/ß–K*œ{n¶ìŽ¶\ÂlĘ5Ý@œÆ~ÆœwEÃ{sBש Œ‹; ¸·Bª¼fÓ@6G'q[×÷—TQ¼Ïèi§±„%¯ÁQ|ŽK2g5çþßÛïƒp@•ÁhÐ#—ÄÀ_@¬«Mç>pÍÕ,\ª +0zeu=¢ÆÌ¡678ßxT{ €°ó4°ã~h;¦Zû„½o oêFæI¸@Ûʽ˜ þ(@Hg=iòÌ—HÛu©ö¨4"5«b?ˆÖØŸ:eã",vR P±ÒÕºO-DºsÕ3ÈHÊiø·)k$@ ­ª€fôéã°´?¤o@ÇhàTŽã–v•Ä®²l¸BœÖŽÝ;S3‰t­Ý–½KÎèV¥Ïºö”*ˉ©\#µªóƇã@kH¤c¿ä­¾‘J+‡JÇã1%¾µØ‚ø¶©XÙ/ÑL#0¯ $Ÿ© Ñ1¹#·XZiÀù+/¸ª#ôbgŽ ²«Û³auõ+ª˜Ð7X‚”ˆëÇ7´¢' âR@ì!ÔÐ#2W*HÞ[OK¨Š;;-gµ—Ðc¤íÀ!`T êäuŠ Õ{|&—§ÎÖ•+ÿˆWE8µ<°)ÂÅš±Ë—AjÙªÄ4“O§kVTùgÞ+RÝZW®l™ y?´­Nú5Í•Ýð™>kØ,¤$Ù€m|?È\(:V,^{r«šó«àw¹-Àœ ‹bm×Ýê\¡úP4 ˆQ˜Ðg19žM?Z@þrà[® ‘¦®ÄVÔÇÄÀ.ÂV†¸ÙãªnØ•0AtèNQa]Õ#øÁDdmn6¹¥›mmJträ†ÖK‡^[ƒUШv©+qzpHŽc Ik-‹U#—x×ù4EÔ¼IËD1¾…n¬s/ÓÈhËÊ$a#­,#Z5ÌJ/Æ›¶>êE™B­LÁ ŒVD`èáa“hž[VŒ—þÀ6>txK+>×vÏX›M¦ ¤hYA*žß‹ð=F^;Ò¢#@»¼I9ÜF¡ì{´âÑ!U2œÂü‚Õÿ¹‚‹`úI€ä Û¹`è(ͦÍöÄ{ZäJóˆõNJCû‹£3·¿5’á(›Û ø½Msg—ÖÉyîgj7<z»¶·Å;øò^{ã1‹ãËUÂÙ¦µ)tä¾d©íÜ,êA‘dÿ15¤œîúoÛty¬ÆM•þÕ0_zq…¨«.ìèƒ^¯f 1«Êdúw›o–Ì !ã^sçraÂ6W‰¤!á8Û}Û÷ÀÁi{èSaŠ¢æ·ì]'ÐXf&î T2 ~î$½wŠßœùßÔ§›˜z¹¼2Gg¬öÁÐϚЄ›¨@û^:L´#yHü˜2?’ñ7`- ˆ³â`Îu'`DÕBÌ°ŽY-Â`È … +¹<ê&BîHÆ—œ¥wv´Ev¦mV_ Ð˜ÙGñ‰×°>/XObject<<>>>>/Annots 869 0 R>>endobj +1532 0 obj<>stream xXQsÛ6~ׯØé“2cÑ’,KòÍô!¾Ä×ÎÄIï¬NÚ¿@$d¡&–-ë~ý}» (…ñM;M$vû}ûí"Žf4Å3ZÍéjIy5šfS¬ô?þó¯Ñl:Ϧt=_eKªh¶Xf7ÝSI£óg¼½Yã«ø-¿…!š/¯eçzÖ?ô¯®ÙFWüÅ\Ò«Å*[Ðb½â=ø¿Ñ´ÝnF—w šÍh³CÔËõŠ6…;¥M>¾ ¯Æîà)/¶ÁS¥ŽÔzMÚæͱº ZypMáIy<4ÜŽå{U–Úê'}Ùh_;‹Mª {X1¹ -ÆYª\¡Ëw›?FSšÌ®²9|Ç*{ÎTFŸ7Ÿî_fïÈ5¤Jgõÿ–—Z5ôk cŸ<í°ìMU—º…¶Ê#²oÝeô36í][´Õ8¿*Íu1ðö*ÐÁ„=!Tz¸¿¥ºqÁå®”…tX2|VÏ^Ü‹FDøØê€<<“Æn,Ku©ðS¢E}Ê.hÛ². |oÜòóªú._þ³ÕÁgݶù€"e_‘Ó“ñ> À+$¢_„mœo¤¶ZvÝàƒíQœâcÄíÏŒq4Guôÿ`· ô$ù}oéþÂírŽú×Ï?ÿóˇé±ÏVÄ*£ÍÖñçÙºƒe¾ð¦Ï±!Ǻ¼Ë;6NVÙšk‰91_®ˆ½Ÿ¸*/{Òl`¥÷󹳅ɵuSå`Ä)‹%NW­Š‚±rM :ÆOg d"hߣæxyÏ,³–mY®ãF>øç_?}bö7*Gr|úº4ƒY+Éèõ’¶Xúðñžõ\Ê:©§*õdòh->èE•­æ™Ã¾-ª€f0Ç‘K5 Zú¤ì½²ÿ?± Ä7r;™¯³Ù M®ç¤ÿwצºiôŽÉî·_ºÂ§Q ¸¤qnˆ‚?0Ö?}ùºù< ¹ÔS¥›k”§ž€¶/&gäÏ4» ³/@.PÁ#6OWÙ« Ñ-Ð2øÝö+ZUI/–5‹ÃÜóm¨2ïËòäž#Å·C2Ü Eìc³Ž rOßåÀƒ¾šz&%É3jøˆ4î80Ô„3§I¹÷êŠF0ïWѸºfî$ݪ@iQÔN#𹈄) ­ŒÛlJ•±-Ó O1Üä8é·ˆ*Z¢BÐU¶Áuˆãò vƒ²)¨TÛ1ã[e’ètq![â@÷‰öAmK㑼YØô™µÖóÑІT¾‡·ÜÕÇ¡*¥Ð¯$ô{“7λ]`*Ñ‹”åè̉ pñ]BŠ3Å^Ù?ÒÌqÀ ì§Ò -4•DX¥xo£Ÿ „èß z‚.ç$+I‘” 3O]'Ù‡è› £  O@†ë,ö$ñªú#uŒ s 2$6¥Vh‡B&ÚèÊáÕ·E185—+4¢p º`Ÿ¹¾AöyNJ|–8…®€öÆš Ë£XPôä\A¦ÐŠÄD‘” Ÿpè=ôÎÑé|›ïÓ 3$ÇPÄÊe\{,€TãØ-ÝF&Õ¸6vÄê[Ñ‹4Hݼv.N‰-r¹Xà;¤5w„"ü€\¨¢4©LåGÐQ¢"ó¸Ò%WŒEp63} ‹œñònJ7qü›Ìq¢`‡2ÓQ©_âˆ6¦»<Ÿ îD³Ïm̦±k¤ým§1÷Û^ÝèAU[ÉíìÚ¹”Gï¦ËMGUN)’R:÷ÜÖý‡i¸{ˆ\-¥ËÕPîýÑC·Hå9pÄÀE·:WðÄóÍo'¨Xo^xžu³.ôÅâÖÐØ,ìöqöÃ@T3&ååݼ›sÆé®ö™? =ãï¸Ìwp„,4\c’ö'Ä€J»81ÝVÎOßì®Ôs¯•ye½äìôq¿U†= ,wÉ…Ä]õׇëJ'Ó ê íXû„}3©:þNþªÖ®V¯ec}­Ô«©ÚŠl[m9êÝ©.5¸‹ÖÐaoò}„m™`Ã)p“ˆ‹‰ºcŠªÊèœfnÜeXYÖ1â3¡;ü—¦V\B‰&KfÄ4² <¹w=ŽßI68É1ˆžP)!§Ê;§,¬c%Åé‘k‚ц†ûšõM:”žç{îqU-£³®kž5˜gS¶üõ„‡` q<ùÇ’æËÃÀ³¤ª1fHr0¼Wm #Ó5®¥É³›Ðe¬G‹-ÄU‘#þ ŋΤ€q€²#Û\ì<ë?Ž™µßy¹«¶Æv¾¸«=¾–Ôxm1…«ežeø­ã÷Øvú¦ÂÅñFW¡píâÊmº<`7ÒXÈX7¨ìaVö–ggžÚ&ÞŸkç½Ù\- rÊ¾Ò ‚<½áVnp—wëŽÂ³%þ-`}EËëN²Þßß¾§_÷F2úàò¶‚º‰/Žf’6LVStŒb ©_d‘¡mƒ#`ÍݵVæüxíÙóœëЬëÒqa—)…Á -.OòØoµ/´`o‹Õ"[-×ñ¸šóÒÇÍèߣÿäU°oendstream -endobj -1528 0 obj<>/XObject<<>>>>/Annots 830 0 R>>endobj -1529 0 obj<>stream -xÅWMoÛF½ûW |rƒŠ%YR -ä`ÇIk ¶ÒJFP €±"—’«ì.%ëß÷ÍîRiŠE“8ÌÝùxóæÍðûYL}üi2 á˜’ò¬õituh4àó?ZRÆpôðߟ¿ž†1ŽÅƒ1Ž”4š ¢qøVÐÜŠãA4ågC>è¾õ‡ì©íãfqvùù=Å#Zdk<ŇÔ9íÓ"¹ˆûÑUGôh$ÝÏék^¥jgèaA¨HÔv-+›'Âæª"#õVêŸÏ0Êî½ÑÞ`£‹un¨”v­RÊ«­*¶Ò®“HÓœ¯R™ûE¦ŠBíòjE¡®HmpÅ=3å2JT•Q–òïªOïO#¤ _þÈ*Ñû…cvJ§†>Ð_Òðµ>õÝôô´‘I­s»Ç¡c&oœk¬…S8~þ íÍÝlþT!Ü'•=}¹ýxþ‡±ÇA¢¼?v§h'ö.ïZ -Ã|™‹r)h—žÁ7®t2î–JÐR­jÓF´ùåá0ç‘{.jY*+›Jg"/™Bƒ>KšÃÚ§ãùu©:ÿ -ºBž[yÈ>”¿i$àáŠz§}+@29Br°7!wœ*ùFªFE2øÂDj+ÐBU].™Yè¤Âuow°°V–Ëè£Y-M]Xî?xÔĦaÙt«û‰pý{RÓŽñT•Z~¯s&¿ËP.]Fx Òc•¿HUW¾èLvÌŒƒéð¨“oXagÉÁ!)XÝh¹EG!Ü3e¹'OV©:•²¤ÈqÌgsª„='µè'ƒˆîÅ7' c ŒmkÆISUqôߊ¡BȨƒäoËàÿ ‚ÇÞPAèé·•Võ†õÏ©âþ’S¿7n5„m:ê½{ Q£“\øówçÍU]rUQàóŽ¥sÏÖDðㄧ@^aù¸Xg¬² 2( õû™D%˜5P à›8âÉþ¥ -òºËÁÅÝ~¸Cu -/¬\ŽºaöÁ(Cç,{óÆ*)1 ðøYÁ8;nܳ"ZpCä‡iDÞE9÷ô1nFbÓè52<{ËökpjÃrÏQÌÝTGTb…|ÀRÀVŠ uÛ­Úò4?Ðåç$ì½I4)Aÿ=O¨M÷üõƒ|±?šƒ#ú=¯ê2{±"ù‚±`›]à*˜¿ l -Ž")õ4a?=\ߢÞ3ÝÎî¯ïÜWﱟôâxzƒi¿?âø_ ÓÓ3Ȫ¬Øfò“·æ¹_%žàM)Ö(þRò¬9j;DÈØ…Ö¬r·šÛ^J;\X½[PÉ©“5ïFZËÜ‚tbt»‹YKÌpÏz_¬ÈÍúØpäRÚäÒ—ÔŸiVÌ ‚&è}·¯Û£åqcßw·®ÕxÂ`cL=gƒÂ‡ÖDŸa `Ç°24'®.±wšaÞærGÉZlxöºÓ¸ÿÛìëbõò$¼í†v8îÞí‰3Œèc؈cçWî°`°wõT–¹<è±]ɘ ¡Áx -_¶ºl‰ñ pÜx6v_;_thǵDQßcº --ôy'ƒAßÉm -ºMƒáΚÁm©ªÂ -‹x;¸‡MçsÁm/È µMçùý ùyÚÇZLçâ1ÞæC¼ 9-˜_ßß\Ó­ÜÊw«7ƒÜjÆAôšã½Iï!acø‘—¦ÑdMÆS¼‡ÁÊdÈÆ?-Îþ8û¤:ƒùendstream -endobj -1530 0 obj<>/XObject<<>>>>>>endobj -1531 0 obj<>stream -xV[SÛF~çWœ>ЙH²%Ç—´é $}6-Êd:¡ÓYKk¤DÚu´+ÿû~{‘± î%0€iÏí»œývÒ§¾û4Š)RVŸô &I8¦Áx„Ï1~N û Œž'ƒ0~îÄhòôÀ›ô$z7 ~ŸÒ’Ç#JsBâ^Òì<-JE5×…Ì©+Y­¸"–ç¥.¥ ¹ ] YUr]Š{Z²†ámÞ(ÒÒ>Sõ<̤XТ¬ø«Ó/H×£‰Ëăp€|çgg´¬8Sí-xÓ¾eõœÑÍå[úuö)QV°%‚SÅÌïR‰×£ ßCc.Œ6g(ˆg¶Ä…l¨–ZÎ5++upâó}%ç¬úóàß俸ȚÍR£/¥Ö²É½¦?øaîmų¶)õ/µŠ7Gbæ²f(½’÷Rüs¼Ÿˆ šÝRÅW¼2ÃNêÚA— Ïd]s‘óüH*©üÙ×8ê߉ûáÐÌêóô*ý0{?›ë}ÉtN"%k¾.XãRDÅHm”æõ‘œ g9IQ™)lܨv Ä6;€qDƒÅÌ“ ´Á ¿£¢| —ŠX–ÉVhœ¼3ç”!“æ¹ÀYVØ™¿ ¦hÍ«Êü5±Í“®Ò²@ç×·ô©¹\+š¦Ql˜^ã­RðÒ=:+Ý´™nÁ;îomÙð<4á¢w“­f‚xìX ¾ “°ÒGÀoYrк{ï–ºmJL£‚ -¹*sŽÞ ÌœrdË´l6¤ -ÙVùNÓ‡…~(E»–aù–¥¾m Hz³,3f¹d„‹„ÏMfTv FÅ`¸ïõ©`;ÊŸÙV`(Šæ`Èœ©‚‚œ"ÓCtj„Pæ§ÔÔ}îàð¢} eU–ÿÛ{DWÂÈÿÆkòý¼\ÿâƒvì~ -òqöý¡ð64òhÇ!튮—èÂqö8 À5ž¥áŽZN7ë‚ rÖÚa€¹!3#opS݃kBúý‰[pËÀ¹%0íFí)°k„ßí‚U(Ø`›óU$Z¨ìÔ+ç/ß?½»û¡Ëx ÜàÿœÙÃÎ0h/›IeqÁÊ2»+Hì..ÃÞJ‘U­Â–z€‘³@7c¯:3áEÅÊyűñ¼>#—¼Ë€0´Ãb†…u:¾ÕZÀ*)8è+Ð2 ©$µäY 1·„£q.)!;cx¢; ÛsÒNPÓb`œÐåP MgéÖ0×Ö4íN±…”W/lFÐÞa¬Ç¡-ã7 •ó]_¶‹Ø¡çÓ¡y¨~äžK0o5–/vœ¾f_¹ f-ß_váN¬‹1TÒØZÇ’í2Í(ÍÌ\}ž­™7ÝWŸ>%‡ã]<Ù«À£ÛÚçÁËØÝ .ÄF“ð!à2µÝØ^[5¯çЕcÖ~2\‡òó£™:€‰Up'âW˜°4fºÓÙ4¥.÷¥»€¨œÿKÚ±Ÿ@?‡ãIBþ_>·×o.覑_°4èRf-®n†&nÐâ9N(õpûÚÚ—Ê¢¼7;ÀÉÁX šhÐXöå@0q£A8Ž!7Ä Ì¿®Ò“ßNþ›%8endstream -endobj -1532 0 obj<>/XObject<<>>>>/Annots 833 0 R>>endobj -1533 0 obj<>stream -x•WMoÛ8½çW rrǵ×N÷–I7@‘v·ÝC.´DGÜR¤JRñúßïR’e%)°(Ø5Ÿï½þ:™Ñÿf´šÓù’²òd:™â—îÏ×'óåjòžïg“%•4¿XMVÍ7M÷'ýï%Ï“Yïiÿ;ž.—%~nh±¼€Ý¬NiŽÿNÒ6>8ŸÎøññƒë“·7ïi>¥õq/W´Îc¸ø%]¢ -ÒÑl6¡ow·ÓéJå½²†>¨àI˜œ~(“Û§»õ›õ?'S:›/`dt™eÒ{º²&8«é“òÁóö7[%gç‹ÉœÃ\|Wr§Ìc´šÂ<ò—è·êüzª=ÿ -Ùó8DŸ^fµSaO¹Ú>6þˆ¿ñ7_¡8ðw'w¤L4r/ÊàRÁ„“Z -/IùøHl”fk[ëzYR¦•4H>XÄ"ù¤rdDPO’º¼ qÆP“ÙyJ4Fû/¿þ„„c¶¥ÍÕvÖ&—Nï_J}Òx™Ò½³Ý‹€?¹ 3áä¶Öd,žYÊlY9‹ÎÅhAÚmtK\X(\m ‡`Í8èƒÒºqßæb7r¯ZG#[¥%ú Zrh슼T8p" ¢™0ˆ$ “º5ÍéÔF˜ØX”–;žË­¨u '¡kIMø•p¢”ŒÓ„¯yÓïøÎ4ùºª¬ éi‹†ÂÓFJCk2§-j”Â-dÚl·B{94Ú¿0 -®ž“·T -£ªZ%à?TÊG¸ÕÎ <Û½)ËX™!]"ÎA—ù„þ´»D±úø`¦­¹/…ã°™¢ n1ú &ÑêxÑz-Ïð5ûI;ŠX|§‹@¥eÐoê882 ÷-Í•“z»grµàdÎ1ô‰à˜.,Aßðê·»+ªD(&ô£@K¸Ù¥45U¶ògu5æØ âQÊgÙõù‹³¨gPrÀø¨ˆ&2A[]¶°aó-øÚ&¯™GÇÄ¥ºŠQëJ¡SŠ Qã§Q&ò˜‹‘ªÔ×’HÉXœ!SA\bÂؤ_ƒŠ[%îg*ÕÛ›Cz÷¬·q4¡«CMw4ºìmpàØKfÃßÔ.?~V¸ƒ®Œ?;zYçŠmxŽåahöóÎHç U ?/÷³V¾â¦\Ì+ A \;@¯t*1nÄ£¤KÈø¯Zz`Ž*  Øį¨‹a!uÎc|%´ƒBeš¢ª¤p¤’8Â>§·ù-P岯ccF¯hñ°+TVðqÌCÉsf($TE G/Æ'ù¢)sLtJÓ¨ ‚ƒ¨0å“n@Ì^ -oBÓÍ܉y˜³mm2"1”ôÈõ–¸Q:wð^P¥Ä,H^¬Ñ{~Œ>±Ö°‡7ƒÈ{/Aq±&&›ÝðL††Ù2˜2|¸ý|-·‘%ñC›ž¤­q8¯ØŠ‘ÆTûëHüuW ¹ÙÕûšV“AÜG9¿â2—>sªJ[`¹'•…ØÁø3gØÔ/©?йÅË›‘­öôâãõJ±U,-ý*áýκœriÆ^ùðæH²ŸÑåJÛç+FC bö 4!ñ¹ÕÓ¶û·I²^]ˆ~¿Á,ö1æX*[»^^}Ú1}`X‡U_ O­V@0Ýoµ¡W¾Ókfot4Ì4IµFF´?%}~™Ý£–šÖ$…a*"Ç´ôÅ^Gîñ¸JíCbN8„³ÎK½¥‡QÜ?…Pq—ìå]äÊWZ@ÈÚaÀÀ«·X{#®šE$‚‹ãÀnÖSÀNÌá9²lÝÎ(ìÊ,–›X€žßˆJ†j|ýˆo+qùˆ\…Çî*Å6rmg -¶ø舱ä¤Ek_â2Ðs+ž„ÒbÃK‚nêÍakqÖ>[¹9ñ ]â‚›KSÍló8Úù.ÉF–òJ7¾¦;Àq.¶ãT›Ñ’¨ÜÔcyXÛâÆ%a›•7éYìW㯙9‡ËÁ9_¶qŸ¼úezír¼X-&«å®â0ºzÇÉ]¯Oþ:ùü -£endstream -endobj -1534 0 obj<>/XObject<<>>>>>>endobj -1535 0 obj<>stream -xXßSÛ8~ç¯ØÉ éL ¤ ½— pÃMK¹’kïÅ–‰Šmù$™ûëï[Évl‡þ˜¶Œ]É«Ýo¿ývÅ¿SšàÏ”'t:§(;˜Œ'4?ç4;[àùÿŒ¤Ä/Ì&§x}eaúöÝø¬¿p±<8¾žÑtJˇÌÏ´Œ L&´Œ†Ëµ„aeIät»¤h­79E:ËD“[ G•¦´Ñæ OnM÷"[ ìŽI¤©Þ ÒJÖÎãLåÊ:#œ6Tõ¬Rù(ß,¿Lèhz:>ÁÙÃH繌œ„}σAD8ž,=Ø°d´v¼­Eþ(á‰$x&]«‚tB ,[Ò9­4œ”êH¤ˆàú>,m­“iÓ;ÛÈL;I™.svÀÁ‡Ë1-×€ƒy*«T²?…0ŽÏ…#lòøz^A:¤{¥jþ·zÈ`Z•F¹-aÙ³¥ Þœ„ÏÛž[" Ù–ÎÓTYÄΩ¼ZJ‘ZÎ$FgL¨¼Ú“¸‚¬rr¼xGSd™Ó}t:¬}:ÏÆôEÉÊ=D‡be × -i2e­Ò¹íF' 6À¬LL«Ò9ø <Þ6x îv¶]cÃêË1]¦*zbW`6-­ Þ,•’+‘êG¤ök  +±ƒ3]×¢SËsOKì ¿ooþ |©±d¾t"æ?¼éÅÜúè«/¶`ó¤Æ+êã ¥[é.n>Ý{Ëu(¬¡TFÔ³Æî|Ç–÷”]¬ y”Bõ®5ÔBÅæ“ë©ú¡Þ{'ubþΑ±´‘Q…C]dó­b™;•lù™q®ðË7e ÜKœ’Ðóé«K@‘(™Æ -a-*¦X8±9ð…ÐBþÆW.W1âw˜^0¹#¥dË¢Ðƽ•^ŽÂ -´ÚËé0©­ô`Wùˆª¢ç«VÑ@ðú -=áÐ!»tµ8V åà -b¸Õ¹ì1jØð¼Í}¯Óí#`~p]B¼/uîŒN}P–ð¡m! Û)†X% ´)w>3&h«?¾–%투¦›Cœò '8¼@6‚Ö½Œ -ôž]å%ÊX·“0èV0HW#aÓ1]³Í»Æt³ÅIççÕÊ:W€ Õ.‹cÐ$# –wßê$Úž1Ò:™œ#E<Ñ€U[òƒ| ãñ‹è,E=Ym+‘V¹ïwnm¤$™Ê °2Î/?„öÉ šÃnðƒ½:|9¤•r¶¶åM`[Æ®ã0ÙB<èœ?ÝZk»Y›¦ÇT¯|+%U@÷vÖäìÂ?¡‚y0‘sHèi¾uv®¶@eCn¼o-_}³÷4^´Ô©cªÃ!”–Ÿdºn[…¶+T…IÄñêa¢hNß QCò2UÐÕSõj¬KÂAÑ0íIznÖ -ª€È¤È};Ï=Þx§Œäö‰dþ…Pƒ´uƒé…h×â¹n—{nÚó ¢È´¯†õ ,àæb FçH—Æ¢iTÃî6—ý„”ãEÐÒèÕîó[Ï› ÇôQ³ºH‡›€¿m0Mcpe¤c­|ë@ˬ»ï#ô€WŸt²“1½oÆﻟ¶³z/ú-ÏÌáºÖÜwȆ pDä ¢W;¨`éĵD¾Ýò2ƒÖZÅ8܃„£f6ø½a¶©ÛÿøZ™&#ð0ào]Ñ»¾^OÔÜÞ›óÐ!sص§Z#à^ò?íe¿ÕPÑÖmÓúÒöƒˆ(B;ç+_«“|O6ŸåÁ˜G_è<ŒþÂð2j&\‡W(¿Ð¶;#T]m¿¯:œ \1tÔÐì m'¥ª;D‘6ì­LûÖÑÞÔ†U‰>¤_IéÒ*Çý³NÜ|Øa‡¿‘qòºXÃÊ¿ðîøØë[åF—³*»U=œUÃótŽßlœÒ|á/—÷ç/ÎéÎèohªô^G%ÏG¡ÐØÑ£zûÑbò®™ýB;[ÌÆ‹ù®Ä s6yµ<øëàUendstream -endobj -1536 0 obj<>/XObject<<>>>>>>endobj -1537 0 obj<>stream -xWÁrÛ6½û+vt’glY’eÉéÍ©ëi&ÝÖê´_ “¦õ÷y B Ú—NÆFvßî¾}»úq2£)þÍh5§Ë%%åÉt2¥åòŸ‹ë>çø³’2ÿb~9›,âŸ×'w šÍhÁÖòzEë”`g:¥u2~åFÛé:—N9éˆ$)K«j™R%m©œSF;ÊŒ¥û5mvpZ7V+½%áHhþöæ×?ø2ýsÿå¿Þ-*M*O×ßO¦t>»œÌá~\ç¢&AZ¶”©BRb¥`_0Ü2¦”#— „ך¦Há2‘êENØÖÅÝ'š!éür°au6›\Mè›IU¶cdÞ4§ -Wkcw=T®³rLÌù|5Y²•è¾Ðéûð»Se…ð”äBoÙ/'!U®*Ä.ÊŸâ°ø¥(Ì–6æõ,J {K -•<;Ê«P¾1=|}‹{L›¦®žÐ秊/Òž±¤ŒÓV¨RÕ¢ö• oœ´H»LQgCœkù¤ÉÎPÄ”DáL„HéZZ‘tVZUç>W㸰i(ב#T -÷ÌŒHñTU†Éèöá‘D][´žb(?£`ìH"·µx–,äIb]ûº£ÚóeWí/™GR +J ŒÔef¾Ï•Ã’‚\SUÆÖqÚ˜[²fÿÝt™ïq<̱kÆìH#¦!ËÊßãëN& ºä ±¨UEA™PE’OžÐ¿cIG7I"£[©•LG1ÐïĶc}/ú5h”)ë%÷\1¤M¾åFvxè(šïèÓa†Ð×èÍBÁ6JÇŒq(D¨4髺»³EG"3Q¨ÒZô]€+( ßÊ’WÖ$2mÀÂD„ÄL T¥ÉW¤¹–qjžN'´f‘(¥€6ù°w¦MF»S)´ªš:ÃÉ!ÎJp„ã»ØZÓT­±™#—OÀ Ú68F[4À¼ƒ@YþGÁ¤Vqå!p Uå^cç ï#Þ çÁf.Ü;”½k„†bíyKô%:€c9#Ì¡> §S&'û¡dÖ”¾¾ýpCœÐòN¡¢ ²^ñ]M-àiPׇ¯q•‚@1†Ê‚ËœÎÀ–Ÿª*Àz–Ï‘6½ØÜIò@}VœJå„Ðò(p„ÊzQ%xê[ ±!¢mTãÀw* Haß¿_c„”b Át”J—@Ôda${O’¢0­cà^íÒ· ÛˆäÙÿδ2:‘þ^.Ðdû -eÙ•QD^SVF#˜>7®›ÍA]GCŽzdGg4jG¾íF¯#Ú¨¯3ü¿7Ù¡Çœ÷KÀAûzÂîš$G^"\£[Y@¡YÈA8A8|•ðȇ9_çP pBmµ±xãI¶'H CXW¤Å¨‹Ãû—-A•kÖÃ>­qW€Ñû%€x…a G”ýöŽwÑ€ö;’t]Cmb}Ie&šC'PÚ6 ì7Lc™F°æOh¿æ 9XèZ~ÍDi”‰Ê*Üè$—L“wîo‰5#‰§g? D/_!æœf@goͽ׹Cÿc,cãƒV†d؃v‹Òµ,âwXL 1f~ñ&é^•ÄP‹Tîhâ3"vä.WÛ¼ÀßaÚõ6ÌãMž$>€òǺ8HI7½ˆú5”9ZD^À}[z6U2ÁJ7HÏKLÔ ­Æ<ÍU5py¬ý¸>vÝtq×[wAÉC2dêkðц¼ëŽ+'&'†¢®ÛÈý6"˜óàÇ~|X¸>^¡ïy®{®û§kZÞ®ØÅ -™†WÑ–Ž™!èËښѽå“Õt?Bé2½_õzkÑA”x Ý #¨ ==ž8þ,Ù¯”‡ÎìúÈÎ{gƒÅ‹»ë°MΖø‘v}IË«Åäš“÷xóíó ýiÍw¨Ýš¤)!+~Gg´çû ç«é§ÿõ“f±ZLVËkü,‚·ÕŠþ¶>ùëä'GCˆÒendstream -endobj -1538 0 obj<>/XObject<<>>>>/Annots 846 0 R>>endobj -1539 0 obj<>stream -xµXÛnÛF}÷W òb°iQR)ÐMŠ HÓ6zÌËŠ\Y›\†»²­~}Ïìò¦µ#% -6–{›93ç̬¿^Ä4ÅOLéŒæ eåÅ4šâKÿëŸß/³8šR’΢•´HçøëG}äõ”,_E æfI´h<5[-¢˜–«)¾–4ŸÍ£´ñìxŒÙer<»œEsZÎRwð|µìGnïh “ ÞëÖòìx̧G³ÞªÅbå­ŠSØèGîäÑV%sÜ;š1û*9še(â4Žfðh%í€}½¾¸y» 8¦õx'«”Ö¹ƒyJëlò¡Ê$ ÚÙPV¨ì‹y¹þŒËvÇ„^|øã…ÿÖ2!«IÔuq »“T˦TÆ(]ú(Ê RÔÆMÝ©{Y-Pïu÷ÝÜ5z_ß<è¦Èù‚)]Çs¸°Î'ÍÍÃÍ#ÙFÕ…$#í‰*ç+zPEAÙNf_Ü ÙNTw2?ºc«\±UØ+ŒuK7Ê>ŒTåÆÞ©Y稑پQö˜R -ó%t¿(¥•MD·ÕÜÁv',=ÈFÂ8o’û"ð¡ÒÖÝ Ï/ãK½2ÔŸB¼¨[K¢Ð•ììccFPGí”Ë|@öÆYY%ŠâpEÿÊF{³NûŠH=õŽ¿a~I„@ - x…¢ŒÞvîJŸ4ªMäœK± »«ôŽ±:pÈcåÃË®;(»Ó†÷·›îŒáwÛiùX#—•uz5ìBÁg„‘îE±G¦øŒõ–÷I‘9ÿŸ…i«}¯ò0\™.kaÕFÈ+d®Ýµ™E¬L;N»c{µÎÑVdí6XÖ4:ßg2h þ0kŸ`Zê\m¼¨ÇoLµÑ]†tÕ2åÊÃâlé²›Qš¦± Õþ”¶uÄÑ#×¥ýàŠ¡Ÿc"vA”:>üqÀŽe¬WŠ> -穘馑¦Ö¬$-;ÚTø6+)~½¢Š#Ö˜³nMF’pžªˆ ªFùè«ênpäžP;ftñ =ÀöK]]†þ¬òHtÜzÞ1O²»e}'·ÆåéG© ‹¤ù)jyâWš}(i™u•Ò¥ÞSºM§aÖЩ@•j<#ß\)ƒõ?’yH ˆWwåÛiˆç6øº‡¾@ §ò£¢­›±­+Ko]-ÎU#3«›C+®ˆC(`X9±ÆÈ%÷ÈÎ\š¬Q.>}/ÇZ"3Y[ÔNs¤t¨^Bh°ã$„Ü2H‘s± <µÍW±`ƒ‡¾¿7°t8î$ ¾mÏwD6ŒÈ3ùÔ›7hÆsÁ€ëæ€ðlž@.ôÂÚr¶ öWHœ¾¯íþÂhàŽ¬? çIë»N5áõO Õ±’u]ÂwkW`ËPYÏ)Y»±#á;nx(È}K@Y9ã}å{$Q¾E‡—ªRÐ. -S&*N[ßï›4ƒ«‘*L¨ -ÆrÃî:f+?4pk/¥œ4£û] åFÉõ­è¨G…‰ŒÊtÐ{8U¹~ŽmÚ×ܦ²5p»Ýµ¦½t»ç—ƒæVª` *åsFÀ=|V{G@ªðÒe²’n–r-MuiY§øI…wøbU¶/DÓöÌè:\á -íŸï¡äû·š›:†¨§÷}¼ˆ£yó/¼ö ×7?¦ÜDphûi²üôÒ¯ÞhîýÓÁè11µÌÔVeLÖYúÅoêÚ]ˆy—2ƒ2ñkàW×Yå‚s¼0XÕÁt±óÌ‘Ïm~ÔvöÞŽ -Æãæ3Ó7ÚŒïÕÖëU hœ¤Ñt5§$Yáÿ xJ}¼}ÿú–þjôgÀD¿él_âiå*;wÝm¸N§¯x}Gˈ޻¶›èS?† w¯¥EŠ$+<DZ;]ñ¡oÖ_üâàIendstream -endobj -1540 0 obj<>/XObject<<>>>>>>endobj -1541 0 obj<>stream -x•OÚ0Åï|ŠÑžXi PÂû©ªÚmµTía/Æ1w›ÚÎ"¾}Ÿí$ i{h…¶gÞüæóc’QŠOFù‚–kâõ$MRz‘§ÉšV›¿øA‡°°\Ü&›ñ«Ýd¾]P–Ñî€XëMN»‚'MiǧÜæÕÌ>]ï¾ORš-ÖÉ -[¦m¸ n]b´^H#¸Óæü÷Ã-íùùvÕKé3Jh¬(H*ë+HÈ•‚ŽÌ°Z8a,ÒòÆú=%v'^Ë|{KªñeÍ–«¨:Ë’<¡w -‡wR+:IW†hÖ1U0SÐ=«÷Œ²Äœ3r߸¾¸4†©Ùñ(ÕcL3”œ=àÄØeÉêZt‚ßÜÝÿ -I{é,=LmÃKb–®€¥©ê|õpR²¾||÷ŽÂÔÒZèµ>VT—Ю”¶Åž-“…Ï\ †= fœ)Ú£âZ*ÉžÜIéõ1£+=KYÞéÎàÊ*ýH ó§3£Ü>Âþ6^Òƒ¯Ð—‡î” ó'¤ jm©OÔ ²+“JÀQšˆÀˆq.¬%80äÒ'% I‡VVu!.‰‚çH¬7PßòK¹àÇö{x)VŸÐ…\®Q…ªUÛ‚Ð>Dë˜ó¸ƒWãR‹r”^"$D¬öÍòÇt¾úX=ßXÏ%dŸ6VÎK¦EÌ64 - Ī -@±µ¶¢zÆž!¿ÆÂÂ~q$Í^6ÿ†8¼óŒ6ß¾hçsJWwï¯üÉ_3;%¤|ô&`üÉÿö{Æý,A)Û·lo:k©È‚©õF²cGn|REw­ Æ« Âé$z 3?t˜DX&ÒµtŠì7&ÙÁ¯èÛïØbþ‡ë8–Ô "zȸnÓá<ð¡ -?Wn™ü3ßÖÖ“gÝŒÐ`&šª€0l–JÐ]ôò5S\T¿õÓ0Ô駌…ñ¹8òçö e\=#„êÜÉð/¼NúY#‹B¨à÷ùvÓ:*[ãµYâM¶‰—ìý˯^Ò'£¿ãEBo4ojÁò·¶¯oÖ˜åé­¿úþ÷nïn't•¯’|½Á+ó[ÿ×ÛÝäóä'ú.S¿endstream -endobj -1542 0 obj<>/XObject<<>>>>>>endobj -1543 0 obj<>stream -x•W]oÛ6}ϯ¸@6ÌZù#i’ØCÛµO+Ð!Þ[€Œ–h›«DºüˆãþúKŠ–¬¨[¦ICñ~œÃs量Íi†sº^ÐÅ•ÍÙûåÙôÓZÌh¹Æ›«ëZV4+f3¬”“[±óÒÒ|QУ×j¬Òúòî3­¥J9oÕ*xY~¾Xþ}6£W‹K8™”R{+êú@Ðbƒ"ø-U)¼2š7sìùuŠýêâ²X°!‚Í ºÍJÐK{/i>o÷.®‹+ÞûŽthVÈЬéO­Éœ—£»‰Ü¼¥Û éÖÔÂ*w÷â% G{Y×ü™Ð#ž÷·¿ÑZ4 -ir¬ß•/I›=¯jõ]òÎ×ü"%ø¥›XÕ’Þ ¢Ï¦ -µäàÈùî—ðáä í¬yP•$02 yÁ±ê{ä%æa¥3Á–ÃÈ¥§¦&'íƒ*¥+è‹U8øg@ŠßV¡dz™dçTÉR9^¶à‚F8Vx˜Œs´Îí­˜+áÅJÀøn’2Š‡1™J_N£U´™~ÊÇ4{ꊬü”T&b6H°—†‹‚bvÀÔÆ -œ¡ß -äÍÉÚó‡A^·¡Ül¹5`¦ ¬ôƒ©1’?àƒ -÷6|Rm6ª•ëÛËá¦QžìBvûQW(›,/ðY´(WE¬%®·V@Yn…V®I¡ -! -KuCÊdu°ÖÖðnIAWÒÖTñ€ÉÓꜞjR鵨uh+X Ù!!åacO@qKïPâÖš°Ù’Ñ’Ö -%’xª¥)Ø4½Ëœö(¸›ôªú^HVÊsëQºR(¤ êè¿U‰€ºjƒÆ‚L”þaСB‡³"G¢ÜYObW8¦°ûoÛ$<ÔQûpÞPõSËç¤Üž9èÓ³©^hCêei‚öm¸H›S^öÂ{ÕÈ‘ð'vã {réqí ^|ù;ªqËsˆ¡o;FVŽˆszšðùqŠ¦ÀcaK‹’­k§èíá׋ay?#ùëÝ ‹xQ↲3{¯˜½VîjQÆ&Ò¤{ 7(Ã÷ƒ¨ ¾u‚\êíý@鲕l‡äÓBü‰¦+¥§(ð)ÐMó$z‚­¹‡¸·?ßÚ³j3Ü´V«Fù¼)öõÞñ²‘.w÷¬ÏhÉ ¼;]ÃäêByéŸFÌeƒ1Öφ=׸íÆF“AÔ•m‹ÈãÍ×{ñÜDK#^*©»÷l¡œ \™^k µ]ñ²“̵VlÑoIlsIõöc/Ç^’-:Í'£˜Ë×­i0ŸmŒ6–Kêå…Ûâ~<Õ”KÀõ½9âEê‡î=Ç­+Ñ?¢ˆ¨1¾êvx±¢R!‡Ž¼4+®´£¯q.¬ÏÄ߈—ýVJn”Rg‘uØ!ºO÷Blñ‚˸S.³»Vg¯y-æÒ6£ÖÍH}ó”ën.ùŽÁßh<àŽÓœ/Ömåã;…_ñºÿ—3äÙÚ^ìV¯9vA'”í· -Wgxˆ®’ùM÷‘vq•>ÒþçW$=çËñòú²¸¾ºÁ7+†üMœú—gœý5õ“Vendstream -endobj -1544 0 obj<>/XObject<<>>>>/Annots 849 0 R>>endobj -1545 0 obj<>stream +ÆYª\¡Ëw›?FSšÌ®²9|Ç*{ÎTFŸ7Ÿî_fïÈ5¤Jgõÿ–—Z5ôk cŸ<í°ìMU—º…¶Ê#²oÝeô36í][´Õ8¿*Íu1ðö*ÐÁ„=!Tz¸¿¥ºqÁå®”…tX2|VÏ^Ü‹FDøØê€<<“Æn,Ku©ðS¢E}Ê.hÛ². |oÜòóªú._þ³ÕÁgݶù€"e_‘Ó“ñ> À+$¢_„mœo¤¶ZvÝàƒíQœâcÄíÏŒq4Guôÿ`· ô$ù}oéþÂírŽú×Ï?ÿóˇé±ÏVÄ*£ÍÖñçÙºƒe¾ð¦Ï±!Ǻ¼Ë;6NVÙšk‰91_®ˆ½Ÿ¸*/{Òl`¥÷󹳅ɵuSå`Ä)‹%NW­Š‚±rM :ÆOg d"hߣæxyÏ,³–mY®ãF>øç_?}bö7*Gr|úº4ƒY+Éèõ’¶Xúðñžõ\Ê:)ö49«‰*õdòh-NèE•­æ™Ä¾-Ê€f°Ç¡K9 \ú¤ì½²ÿ?³ Å7’;™¯³Ù M®çÐäÿwצÂiôŽÙî¸_ºÊ§Q ¸¦qp¨‚°?0Ø?}ùºù@ ¹=—kåÀÌBeJOØÄñku3È1—×x·œB>“¥›kÔ§ž€·/&gäÏ4» ³/À.pÁ#6OWÙ«ÀÑ-Ð:øÝö+ ZeI$/Ö5«ãÜn(3ïËòäž#Õ·C2Ü Iìc³Ž rOßåÀƒ¿¢z¦%É3Šøˆ4î80…3§Iº÷ê’F0ñWѸºfî$áªÀi‘ÔN$𹨄) ­ŒÛlJ•±-Ó O1Üä8 ¸¨*b¢BÐU¾Á…ˆãò vƒº)(UÛ1ã[i’ètq![â@÷‰öAmK㑼YØô™µÖóÑЇT¾‡·ÜÕÇ¡,¥Ð¯$ô{“7λ]`*Œ”åè̉ pñ]BŠ3Å^Ù?ÒÌqÀ ì§Ò +4•DX¦xo£Ÿ ”èß š‚$.ç$+I‘” 3Om'Ù‡ê» £  O@†ë,6%ñªú#uŒ s 246¥Vh‡B&ÚèÊáÕ·E185—+4¢p Ú`Ÿ¹¾CöyNR|–8…®€öÆš Ë£XPôä\A¦ÐŠÄD‘” Ÿpè=ôÎÑê|›ïÓ¤3$ÇPÄÊe\{,€TóØ-íFFÕ¸6¶Äê[Ñ‹4Iݼv.N‰-r¹Xà;¤5·„"ü€\¨¢4©LåGÐR¢"ó¼Ò%WŒEp64} ‹œñònJ7qþ›Ìq¤`‡2ÔQ©_âŒ6¦»<Ÿ ˜îD³Ïm̦±k¤ým§9#÷Û^ÝèAU[Éíìú¹”Gï¦ËMGUN)’R:÷ÜÖý‡iº{ψ\-¥ËÕPîýÑC·Hå9pÄÄE·:WðÄÎo'¨Xo^x uÃ.ôÅâÖÐØ,ìöqöÓ@T3&ååݼtÆé®ö™?M=ãï¸ xp„,4\c’ö'Ä€J»81ÝVÎOßì®Ôs¯•ye½äìôq¿U†= ,w2²œM,|$n쪿?œXT:™f€TmÇÚ¿ ì›ùKÕñwòWµ>pµz-ãëk¥^MÕVdÛjËQïNu©Á]4°†{“ï#lËN«D\LÔSTUFç4tã2ÒȲ>ˆŸqÝá¿<0µâJ¼0‘X2$¦‘áÉÅëqüøN²ÁIŽAô„J 9UÞ9…`a+)N\Œö04\جGhÒÉ \ñ<_v«zlíÄžp_ó¬Á<›²õ8(à¯'<ãÑ?–4ßž… U1C’ƒé½jƒÜ™®q-MžÝˆ.s=Z¤h!îŠ<ñ_(^t&Œ”Ùæbçaÿq̬ýnÌË]µ5¶óÅ]íñÝ°¤6Àk‹)„\-ó,s¸Àïl¿Ç¶Ó7.Ž7º…{WnÓ廑ÆBÆz¼Ae³²o´ 8;óÔ6ñ];ïÍÖànaSö•fäé ·r…»¼[wž-ñë+Z^w’ýðþþö=ýÒ¸?0’Ñ—·ÔM|q4“´a²š¢cã›l‘4†¶ þ€%w×ZóãµgÏc®C¯®KwÄ…]†Æ ++¸<Éc¿5–¾°‚-V‹lµ\ÇàjÎK7£þéB°tendstream +endobj +1533 0 obj<>/XObject<<>>>>/Annots 874 0 R>>endobj +1534 0 obj<>stream +xÅWÛnÛF}÷W üä­›%¹@|IZ±•V2‚Œ¹”h“\ew)Yß3»KI¤ýP(šÄdîÎåÌ™3Ã'=êâoÆ}Œ(.NºQ—†ц“1>÷ñ£%¥üG÷ÿýùÛÉpÐñ^„# Çýh¾å4s†z½~4ág>è¾ìuì©éãz~rþå’zCš§k4Á‡Ä9íÒ<>»Œ.¢^DFÒýŒ¾ge¢¶†æ$ ‰’DeW²´Y,l¦J2Ro¤þeþ ›ìÝÛìôÇ°y6_e† +iW*¡¬Ü¨|# á:‰$Éøº!•º_¤*ÏÕ6+—´ZàŠÔWÜ3S,¢X•)¥Y.õ®ºtY{"kø¢ðG–±Þ­-ì³U:1ô‰þ’†¯u©Ó몣ÓFÆ•Î쇙¼s®¶Náø郴×wÓÙS‰pŸTúôíöæô-#ƒDu~ìVÑVì\ÞYÂ8¦;Îz»JR“ÒT*K‚*„Öy²Ï2û†6"Ï’p:¢i)ù‚öNtõÙµ–ë|$S¥ _±µV¸N¸žÛÖ%h¶Æˆ¥«ˆV1¾|tÅP.Lçì¹2ˆáI­w¬ï`«+ʵ}ÊŽGü…‹š-+íã¦F*b‹ÂBÜ¡>Z +Ã|™‰b!h›å9žÁ7®´2n—JÐB-+ÓD´þåþ0ç‘y.jY(+ëJ§"Ë™B>KšÃÚ§åùm©:ÿrºDž¹Ï>”¿n$àኺ'}+@2Br°×!·œç*~!U¡")|áF,µh¡²*Ì,ôRáº7;XX+‹µeôQ‡¬–¦Ê-÷ч·Õ2Éu¯Ñ8ýp +Í\Võ=mY:õdß1Np +|hæ‹eÆj &ƒÑ±kqI”‚I‘€¾‰#ž{ _¢ ®Û Tl°èaÞn‡;ÔQ'ðÂÂå˜FŒ2tβ×/?k¨”ó ŸŒ³ãæÄm1+¢9÷C¶fAã]„PsOãF$öŒN­ÂÓ÷l¿§2¬öÅÌ u4@)–È,l…ˆ:·Ù©-(ós‰ÃZÐG“õBÐ÷GcjÁ=ßGý _íGBspD_³²z%³3Ð*’¯˜ +¶^.‚ù3¢à(’PGÆñÓÃÕýgê<ÓíôþêîÁ}õ›!aíIÎÞ‰§ÓŸD½ËŽÿµÞ1==ƒ¬jÁŠe&[2y+ûeì ^—b…â/$šƒ´C¡€Œ]˜gõ&w{xTßöJÚrøóºêÝ‚J†L¯xÍ0ÒZæ¤k []ÌJb„{Öûš`A®·Çš#çÒÆ群þL½až4AïÚxÕœ´h,û~¼»u­VÃÀkcê9>´&ú ó+†¡9quu¸…Ôûï&“[ŠWbÍ£×ÆýߧßçS¨”'æe7´Ãaón œAD7aÚOŸ\¸ÃzuDÞÔY`àò˜Çn^` c~†þâ|Þh²†'°qÃÙØ]~h|ÑÖŸ-—eFy-è +¤Ðs¦ }#7èö F;­7·£ª ,âmÁö|œß·» '”6qžg÷×ä§ýqgJ1 ”ëð6àUÈIÁìêþúŠ¾iå¾[»ä3¢Sx ñûÂϼ1 ÇÃh<šà Fƶýy~òÇÉ?›>ƒYendstream +endobj +1535 0 obj<>/XObject<<>>>>>>endobj +1536 0 obj<>stream +xVÛnÛF|÷WØ}H”HE—´)àÄNûKnÌ (â¢X‘+“ ¹«p—’õ÷½P–d+icö`rÏeÎÌœýzÒ§¾û4Š)RVŸô &I8¦Áx„Ï1~N û Œž~'ƒ0~êÄhòøÀëô$z; ~ŸÒ’Ç#JsBâ^ÒìYZ”Šj® ™S)V²ZqE,ÏK]JArAº@=²ªäºw´d ÃÛ¼Q¤¥}¦êy˜I± EYñ—?§Ÿ‘®G—-ˆáùžÑ²âLq´·àMwø†ÕsF×oèÙÇtFYÁ–N3¿KA&^‚~¹0Úœ¡ žÙ²¡Z´œkVVêàħ»JÎYõ÷Á¿Éq‘5›¥F_J­e“+zEñà ÝÛŠgmSê ^joŽÄÌeÍPz%ï¤øv¼_ˆ šÝPÅW¼2`' uí Ë†g²®¹Èy~$•Tþì+õïÄýph°ú4½LßÍ~ŸMõ¾dº@'‘’5_¬áQ)"3ÅHm”æõ‘œ g9IQ6ª]‚±Í'†hæcgæIÚè/Äèƒ(ïÉ¥"–e²šç˜Þ™sÊIóÜFà,+,æω)Zóª2Mló¤«4,ÐùÕ },E.׊¦i¦×x«<¤tÎJ7m¦[°ÇÂýµ-ž‡&\ôv²ÕL‹'á‹0 û!}Àô-I:w¯ÛJ·=é‚i°¡e#WeÎÑzÈ)G²LËfCªm•ïô|Xç»R´[¬ )˜È·$õ]c€¤7Ë2c–JF·H˜ñÜ´g²xƒtoßêc½vŒ?³­À(PÍA9S9E¦‡èÔè ÌO)¨©ûÜMÃkö!”Yþ½÷ˆ.…Qÿµ—äKúu¹þÍíÈýþããìÇCŒÛ°È ;iNtå˜D玱ÇY¦ÁîÌTîˆåT³.¸ g| ðË •yÛ€—êÆØ[ÒûG^À+ç•i‡´gÀ® þÀd¬BÁf´9_E¢…ÆN½nþpýÓÛÛŸºŒÇfüŸ3{£3ÚËfRÙ±`a™Í$v“LÂaHo¤ÈªVaE=ÿÈùŸƒØkμ¨ø}9¯8Öƒ1Ãdä’7°à†0leøW§â ™¬’‚h¾)šJRKž•PsS4¶…9JˆÎ¸†èοö¼@…´´ÓÏ¥P MgéÖ-×Ö0í>±u”WÏmFÍÞ^¬¿¡+c6 •ó\_µ‹hÒf™ú|hª¨ç2Ì[Í‹›¯Ùn£Y¿÷·=¸뢄;†JóAëÀá ¹C¦¥™ÙÞ‘+Г5óŽàÞÓ§“6:¼‡#{xðZûBcSØ”› 3 ÂÑp ±!Äh`þu™žüyò/b¥$˜endstream +endobj +1537 0 obj<>/XObject<<>>>>>>endobj +1538 0 obj<>stream +x•WMoÛ8½çW rrǵ7Îî- ’ÝEÚmÜv¹Ðq+‘*)Çë¿o†”-ËNEÀ±¨ù|óæñçÙ„Æø™Ð|J—W”UgãјޯGSš]ÏñyŠ_¯i%.gãÑUÿÁûÅÙÛûßh:¦Å +¶®æ×´È vÆø&ܪn´§ÉxD_>üMŸµ¯LÆYzoš@ÊæôÝØÜm=,Þ,þ9ÓÅt#ƒ›,Ó!Э³w%}4¡ |€ýMæÑßÅå Áâ0LFôÍè±Ïb5+”}æÄo½óhøë¦Ðã‘ø :[{Ól)7ªtÏÉߌ&“äo:G àïAoÈX1ò¨ª¥âRÁ„×¥VA“ òH-MÉÖVÎw²¤¬4Ú"ùÆ!Í''«ó¢iAÐMƒ8%ÔdrÑÒý˯¿ aɶr¹YmÅéÚæÚ—ÛS©Ú_Åt\ÃîUƒ?¹ 3åõj]’uxæ(sUí:'Ñîƒt+q)%.\h(üÚZÁÙ¡S–É}›‹[ê-¼–¥Y™RÓ¾O°Pj.#¢SÉ®Ê+c¯T4S‘4’TÒM€b:¢?ÝfW*ñ±+1@ØZŽè:Ñí{äŽ,€ša$bÿ†Ä8*õþÍ~ÐÆ4…äáÍsÑP帵ËuÓÀ ;²€gˆÀsãu† ¶ ¡6¼`÷J”{E ,`Šðêׇ[ªUSŒè{¡#þ*m×T»:\¬ë!dž`ਊù\%ôè³w¨oct×àA;]Qê-›oqÓ6nÁhYz†'­kÉÚ:_©2¦¨$?iŽ®C.F¬Rwbx`ƒ +…LY ºQKÀÂÅ)íU¤q5UÊÿˆ¥z{¿Oï1 ïa#ºÝ×q‹qÐÎÖ­ͨöøÛ†G…Û³GÏøÑÑ›unxnûçxúf?m¬ö¡0uïðq¹ZùŠ›p’W¦‚¸v€^í=TTÕ³¦ÕϵÀÕ@°‰oQùB—9-#ŸD´c„8Ê©ºÖÊ“‰WøߎÔJ7Ýi2zU‹‡Ma²‚`|•ó„‚0ªôàEy’÷çB¥2K' 4ªŠìE.†žÃÈ̘ä/#L'v•<ìÅjm³«Jõ‰Kf½\¡Ž8;x¯1•ãE/Ζ[¦xfÒˆ­á~.ßíæò&¦÷ö¾¥žÁA¹!XK)Â\ª•àAÌh¯)Üøv´äU¢í/Éñr¿1#5Æ#oä´öd’"­ŸJä|‡èó¤Û„ö¤±Ã‚¬2]–lVf²pä66Vðôg¥¥Ü!°'‡ØËÙªJÇIFÒ‰µ°q+ú=ÑšóH‹ïüñîË·»/OOÛ§ÁGæ¶óô¦yç%0.ÄP´9m› õ³e °¾ÐÍûŸÅrY$?´éEûa߇óŠ-‰TRí.]ùvSôgsW?îk\À½¸r~Åe®CæMuIÃtO& +¡4ø3g˜êÙè\a‹åI±Õ_üqw‹R¬ SK7…Z…°q>§\š¡žžÞPv⾶‹й éË£òA›DKœç–OÛU+ŽóbíÕÆBqdØ ëºv¾9Q¨ž±ø +ZÔá`¥Êã¸P¤¸¦÷¶Ãj(Ч–+ÀHûî·ÉvÊw~ÀlÕ=€úÙaLb`­‘-ÔMŸNO÷1×D†áQDŽ"££ê“ÙãuÛŒKN8„³>èrEOщ!ŒÔ®“ƒ¬¥Ü„ºT ²v0°À,Äà* ÇmÖaÀ™Ã³LÙ")2V„L–K)@ǯ ’a…Ú*`°&ŒÈ¬ÂãîÂÀ6rmw +´ê~UÄ9í°ÇXÄ@Ç­zQ¦TK}¼b¸±7{Õâ;‚'>¢ÈpV.©šl”²ÚùÆÄFÄaUGΗžÝRìµYÛ8N5­–8Ê©¶XËýÚŠ{i —›$oä3éXZ'‰þáaTЙ  ¯øò'ú^Ì™ÄÓvÙ dëlí}7zùeÎZHì¤+Òí!^Ñ"óòÔqåq.R`ÍA\ õ¥Ë p÷Ìbx´…v‚Lî¯#æ\«’žçµX'ÑóIlpEvA<à#ÞèŒé>H mK³Œßî9íßÝeðØ+hø ®¯Toñôub'4ú.Þúþ祜^»ˆÏæ³Ñüê×~\ˆçïØßÝâ쯳ÿ(ë!Ýendstream +endobj +1539 0 obj<>/XObject<<>>>>>>endobj +1540 0 obj<>stream +x•XMsÛ6½ûWìè"eFV,Y•ì^:¶cwÜɇ«I¾@$d¢& M«¿¾oR")'i'ãŒd€ûñöíÛ¥ÿ>šÒ þMi9£ÓEÙÑÉä„ËÅdFó³%>Ïðc$müÁ|>›,^;˜žŸOæýƒËÕÑÛ›9M§´ÚÀÉâlI«˜ààä„VÑè7id¶¥‹4UVç¤7äI÷"[ ZI‘I< •Šu +÷Fgþ8*¯ïl\AV99y³ú ŽÎi +ûìèøtŽ`Vñhz2™Oè‹’•Êi£`HŠ•‘‘ÓfK…4™²VéÜû`gKd ++ÄäebZ—Î!Ne9pÿ§:¹ îö¶]c£úÉ ]¥*zâP`6-­ ¾Y* K¤ú‘Öúg‘Mt…Ú%?d6=EaU+ryÌ7è·’®ri,2ž§îÀ}¬l‘Š­Œ  ²‰6ýÜÍ ^g‹€çàþúó—ëÏ¥…“‡Ñ{\r‘ɇ7½œ[}MPg +6g ^ÁP§-}”îòöÓ½·Ü¤h·ÏÒŒûÖ8œoØò‘rˆ!’ÿm•h~¨…*€ñÅõTýl/îNÎßpKU8õ,É:®0©XæNm¶ü™q®ñË·HÓ-p/á+¡Ó¯×W€b£dwR(„µ•-cáÄZXÔÀ7B ùÛÐQ…0Èß¡b½drG"JÉ–E¡{%+9]?•ð<ÚˆÔÖüoúeÄYÕò]æYX©4¥5@“sÚ+Ÿ}ðÖôO«ƒkTx«sÙcÔhÇó6÷\Àü঄ß+;£ÓAn€¶…€l§bµÙ€³¹ó•1ž Ö»o¤CI;&«évO¡ÞÈ“+[ T“!hùèUT ö·Qƺ½„A·‚„M[6Ð Û¼ÛkL·Z\tW¯VÖ¸ÌØQýí£Ñeñt‰ÀȶՈ´1Ò:™œ#E<Ó 2PVþ _dTâãw +ËDQ@OÖÛZ¤U @c¤$™Ê °Štqõž*´†f8¦a…ÿ8ªáËÖÊÙÆ–7l{0v‡ÉâAç|þ!éÖY;ÌÆ4=¦z-RÌCõMv6äìÂ?£ƒÓTW!sæfšã~í8®¯@eCm|l­Xƒ03»(ZÑ1ÕáZKä¾ö¨ÕhûFU†»xõ‰TG€aç}?¾Gädª`xBÚ|o¼šs¯N°[0J;†úˆ¼Û~¿^0òm¸º·EÐ& 0óÚ žE:˪Ȋo¡lQÝéÃHÞ/áÁ­(ùã¡ ézÔ4Ú…Ù¿àô²Ê^~z^‚N–¶ô²ÏìS²hˆ ˜…‘õ²'ëüa÷¨vºˆ"ií\Ö#`Ôbã9Ù‡÷²tTñº‘pãbü©04¼†% V®;!"nOsæ° Œ§¢25¡ý\óeäE+´ŠuAÛ÷ú…n±ô™s‰%‚íÒ ëmÀ'<@$† s6ÓÐf`€\³jÌ‹T‹¸/u\‰§¾v|âùdU Æº$ ۞ĊS% +ªÈ¤Èý8Ï=Þø Œäñ‰dþ…Tƒ´u“é¥hñÜ,‡½;øtD‘iÏ‚yUÁB”h  3‘.ÅÒè†'I¸™jý„’ã‹ ¤ÑcjÂço½hZ,œÐÍê"–oVUþ)^”QŽD¡~}møú=à”ð“l6¡w»õûî‡ã¬¹‹yËxÉB{ßðB„f·ÖÉŒqDæ•ÑëÁÔ¡+¿Agý¸åã¾8+ß`-¹åæd6ø»a·iÆÿøZ™nÆ£éèý\o6jï;˜9ìZ¤SŸ‡ð€³Ÿ¿öªß + mÝ6•5¾“Eç®;ŽI¾ˆˆ7ÎÏòbÌ+‹ot^FÿÃò2Þm<"k´_۪ή±ßWû–Ðȸfm‹ŠMß!‹tÇÞÚ´í»AmX%ИS@ú•’ ­r¼Ÿ`׉{€:²çßÈx yÞ5°òãÃñ¹7o••.±fÕvû™×ï1[OÅDð|h®£VíœXeQnlSFºÒxñA©B09¹ˆ=$X$ûz§\VÝvkšËw´Mx‰  ‰Æ®;ú¬^ÿ§ üUàì”ÿFÀ çýÅ‡Ë º3ú/¬ôNG%oxÂA*êãæúñòäœïÿÏWòùr>Y.ÎðRg— 6y½:úýè_ó?úendstream +endobj +1541 0 obj<>/XObject<<>>>>/Annots 879 0 R>>endobj +1542 0 obj<>stream +x•WÁrÛ6½û+vt‰2cÓ’,KNoNÝ´™4v«Ó|HPBL @šÖß÷-Šé:idX¼Ý}ûvñãlN3üÍi½ «ÅùÙ,šÑêæC´¤åÍ¿øI©{±¸^G7o¼€h¾¾ýz¶\̱kɦrZ®¯xÿ“Ñ£7³Â“œ+œ‚¯÷âãæìòÓš¯i“Òju›ÄYžÑ&žÎgÑuD_u¢Òƒ*v”ªL’6”(#ãJ›•ÒäÊZ¥ û~óæ–4Ÿ{s‹u´‚¹é`¿(’· ²$,Y•—8¿â½(v|nµ—ØbËLdÒ?“T^ŠLïh«_ÏÆŒ.æWÑ‚çÓâLÅÏÁŽGyPNéáË)î)mëªÒED¿éF¾HsÎ ŸLåª{‹§¢"Aµ•† +)<Ѵź†Wêôœøh‘Y=@¤ŠJ{+ªöÎ[a¹0 =Š|+z>R.ì3c¹(KvC§t÷ðH¢ªŒZÀ0 +ÁgÉàØJ<Ëñâq¬ë¢ŠÂ +G +„êsꔈ\#ùÈ,ÚXð7ÎÈÖe©Må_¶éžrò¬¬ø|ÿwD˜¦ÀãÀtä˜òA|:°2/Ý>Þne\U‹•e” +•Àmn]ðDáÏëR:¹ci-ÝÉBÉd2šãØÉ¡÷p,UÆÊÞqES¡+É~¹Tñø dlÞÓÇc†TrUø +òÀ6RÇŒ±L\ŸiT;jòiª*¿g§^@"çTÆÒÔ]€+#( ßÈœ—FÇ2©ÁÂX„ÀL D%ìÉW„¹’ÃÐ<½h³‡Ã¹-ú†™‚t‘øЦ\ª¬3#BâŒGØ¿ËÑuyÙh“Ö+`FeFYÔÀ| ìéÔ +Æ™ 3qÀ‘ÖW%ÎðzErö×ýçÀÙ`s/ì0é üI­¡ X{ž¦u‰ +`_ÎÉ9sÎÂçzzϤà`¿À•ÔèÜùßæ·'‰­Ÿ÷„žjAÖ+Þ[PÃ_ø5Êë×a–‚@1†Ò€ËÎÀ–Ÿ²ÌÀz–ÏI¡û!™ H¨‹ŠU‰Œþ#ÁTЋ’[ÝwGìDÈÜÈ62và*¤0Œ–è~3öiäRš‰ÓR"m Q“É“Ø"Ø-I²L7–;µKN¶ñ³{þF·ÒE,ݾ½@‘µÊܧQ N tˆu^êéskÉÓK¢õ4d¯'frN“fâÊnò:¡­ªðt+ºýùwô8%†µ¯'춎÷ˆË×äNfPhr‡ Ö-Å\[Î.¾B6À µ+´ÁG²– ^„@s´º¡{3B¨rÅzØçöŠ^Ça ^CaXÃáe1¤Íón°  ì´Òú‚Úõ%‘©¨34@i×ÚÐ0„X0e΢ ÇGh<‡¼Z't ¿f¢4ÊÄ?ò*\ñ^2MÞ(¸ocF<ìž}‡à½|…ŽqT˜u÷¨þÑ–S¤â8‘ŒKcTîäø’…ÿƒƒ$FÏÏN‚îTÉO''Z|¤²§‰‹ˆ8P»½Úí3|¸#ÐíäNâFªvÕå§^óýætq߈º1”é,Â'à®,›JC0GáÙ`ˆÔÂCS ŸîU9:²Ë½}5`~í%Á‰ËAT¾¸Z¢icf„¼뺑ΓCƒ‰.6’;%OsÁƒ7~Ø8\ÿ=Bßs_w\w3O79\óQ +@ªkEê 2CP—•Ñr]tHYMÛú“t;ê¡É·CáQ”úÀùà 2ô´[¡“69íîceöVõpbç­µÁb79ö=°˜‡ÜÑ1„¯ÇÅ7š'‹ôäàRÔ1Ći #¶o[<†'%åGçÑx3 £¹l._)40Ý_$ôxcÂão7På>D.¹k–ëµn•¾ypÙ%=ÍÖ´ÍÀJ›±.zÓŽÝbúv]ÉóŠYä.\®…ðÝxXtåªéÝü?žçŽãe2Åê ²ÅÇxŒ7á0_áf{s…{îÜßËo¿~¼¥?ŒþŽ®Ew:®s´w·â톋õìC(´ÿw]®—Ñzuƒ{-˜º^³Ñ_6gžý ߧà²endstream +endobj +1543 0 obj<>/XObject<<>>>>/Annots 888 0 R>>endobj +1544 0 obj<>stream +xµWKoÛ8¾ûWÌ-.*²lKî{H±Í¢‡.v7>öBSTÌVU’Šãýõ;CêA+^')°0`€"9of¾þ˜- Æß²–)ðjG1~þþþ}–lVÑÒ?BËdeݪ„ûY¸ÆÝuzº»N¢%¬Ó,Jèîf=¬ÜÝ`]ÁjµÂ»þ,í†kÜͲ“]oÕj³ñV-2´Ñ¯œä`zÓ%ê vƒ5î~HOvÉÏdG´8K¢´[ØÛÙÍÝ + Ø[ºÉ`›;´bØòy#t%‘ª6Ñ»í·Y ï“4Zá™ù'cDm%+Ëã5ü#´‚´d v/€ßÜ%๼ÕÒ¡bæ»ßë•ÎÝ7ü;ÂN€Õ‚Y‘3ÀÀ ªðrIhk„iüý´— µ²S‘h•: «h­^,1^h5ß³úA\«sPµð²™FÅ{eèУ ð·¦|.Hµ³R<5¥äÒ–G! 4L³JXg®;`•“mð+<²²äá ¸óÿ,L£LÖhõ(s1õNU ³r'KÂú íîYµcD1Fí°ÎS2plçŒw×Ð2Y[­ò–‹<‚­òP`@\žaZ©\G:4àwó UÛÜ”.ó@—AÌQL!K Ew:gX[}ªý!žlçß þÝ#çƒr*¾Pº“ìÉÚŠ.ʤï|vâ-.О>G•6,Œ!†(Dp[cÊRÎÛ=³p l{›Ü®´¦Q˜jè˜;é|Vpµ¸ò¦œ¤ +¥¡3ÅŸ'‹ìŠ“ªDþ¤[ó O_®?f¯)ƒêIÎùèËúa0òPP{ªèòÀŽÆp¥ê«©‡ÿGUù÷µõ,¼!ϲ»«4௫-¤û[Kk‚,&ÍO•–/üZfŸÕ’[¢oú)7Q¹Åñ4Û7Ò7Q)YÐý‹ ŽiyÏ$PGØ®`}¡?ZôÁ× +s,p¹Ò¹ÐSëïäR n•>v´qHNÈyhXå8"Vøé’ÐÁìÌ…áZî¨ùìÔ£+ÅžKÄEú£4Ç”žjà„)0Ú1²Ë™HD%v¤b*áÒ5ßÅÎB?èX:Š»XÿmÏ+";È™|Ì9ãÜ`0âº;bx +Ö–˜ ·¼ØPU$.룜&ñ—Á ¬¿çEë'v]<øƒGÄ.ÇFÔõœ·r×Ä–× Ýža¦!…tß ¨ñ¾srO(ÊuM†B^ÉZ"w1,aàø…ú¦ë*~œ1{ä êF²4SV0–jÝ oT­4² ÖJ)ª~×BiPr-Ûx`Ð4‘±3U‹NÕ8U(gSÛ E8kÐa¼íÔšNiÑ¢!\Ñ(U…òœè~–ÚMGHHu>‰Fw)Ü.äJ˜úÊú‘Ï©›[ÉÛ’én.qM–°£F{Mò=”¤¿P4#DC™õÓ;)¾¹ÃGT÷*†Sí"t¨ø:_}çOc@ãÍlîYsûåã-ü©Õ7~S¼­ðqæzÁó¾?þ>‹?Ð3ƒë¾¸ÁRÀÅkmDb¬÷ÞZeø”M7øDÄÛÙ†„~ÚÎþšý ®Äêendstream +endobj +1545 0 obj<>/XObject<<>>>>>>endobj +1546 0 obj<>stream +x•AoÛ8…ïþƒœ V$Ûµœc»ÝÅb›UÑr¡):b#‘^’Šáß7¤äÚN/]lk8óæ›7Ô“‚rüTÎi±"ÙMò,§Õ|‘-i¹.ñyŽ§h,Öóluùà]5¹½ŸSQPµE®Õº¤ª&äÉsªä´ÖNÉ`Ý:៯«“œfó +TõtkTtbkÅ!·÷ËcÂcð^AHïUMÚø DMvK¡Q´Nt*(ç‘ÊËÞsLƒè,庣šXÜl±L…‹<+3ú`pHÈ ­¡½MÌæƒ0µp5}ÝFÐV·ŠDNoúűþ<¥éÄn§ÍÓkÉ%8¡¿”Qž¼íÔ(øý×_)i£ƒ§Ç©ïeCÂÓ•‹­™öpõxVƒ²¾~üðvÊuÚ{èõœ+©Ë¨j´È‹lΕ;%:`&…¡ š iͶÕ2à[Ø+e½cΤī@/Z$JöN‡¸ŠÖ>ÈüîÌEmΰ9ÄÀsz°@äçrbƒ£h/ø„öQ­oìžúá«Û¤pŒ¥"2R*ï &ŠµìÞ(G:`”mKcŠs¢ày!– tù¹\ð› ¼”ºÏè«A­ÐT;¨À@hL’E7¡q¯¦GÊ‹ò)! +d-‹+^ÒùƹŽhx°Ì%V.›:—0O*U;5 + $Ú@ÚyÕ¾ æ”_ïaa~x!ÍŸÿ†$¼óv{ÿfØÏ)]=üsÅ'íì”Pò‰M ä3fGÆÇ]‚R±ØÞŒÖ2P[Ë.d§‰ÜpQC«Á PÃ*â€OáŒÈÌbé°‰°L¢ëiŸØŸÜØäý¿bn¯±¥ú×i-i\DÌPlqݶ#0ðS¼W‘îñ2ùc¾'XOl;Ñ·5Ü€eóÔèˆîl– #UûjžN OÞ2×çìÈïǯŒïqõDŽâht§À¯ð:Ù圮ke¢ßoï׃£ŠÞ;ë-Š7Ã%úößwo铳?ð"¡÷VöÂbñ­ÍýÍƳ2¿ã«ïÿÞíãíÄI—å2+Wk¼2°¼ãŸþ®&Ÿ'?¼‰B™endstream +endobj +1547 0 obj<>/XObject<<>>>>>>endobj +1548 0 obj<>stream +x•WÛnÜ6}÷W à݉öbÇvô!I“§Háí›—+qwÙP䆯7_ß3¤´ÒÊJë*€Sœ™3‡gf¨ogsšáßœ®tqEe}ö~y6ýô†3Z®ñæêú†–ÍŠÙ +åäÃVì‚t4ŸôÁšµÚD§Ì†¾¼ûLkë¨R>8µŠAV„Ÿ/–ŸÍèÕâN&¥4Á ­T #6Ø!bØbQ•"(kx3Çž_çد..‹"ÂÝŠz%H˜Šƒå½—ÀÑì]\W¼÷™X¯€Ð®éO£É|µ§»‰Ü¼¥ÛhèÖjᔿ{ñ’„§½Ôš =âyû­E­“cý®L||IÆî)¥ÕwÉ;›¼æà7±Ò’ÞdDŸmµäàÀ|÷ŽKø +–vÎ>¨J\pcúžxI8œô6ºr¹´àÔjòÒ=¨Rú‚¾8…s€NHñÛ*–L/3pN•,•ç%l‹ PàX â= Álœ™£ð~o]5ȹA¬Œï&ù0 £t“© å4Y%›é§ö˜&``o£®ÈÉoQ¹Deæ!¡À ŸÅ쀩8ðáÈ›—%´\·±Ü"ÙrkÁLX™«‘b"4(’÷lx *üÛœàë6AÒv£¹s{9Ü4ÊÀ“]@·u…²iå>‹&ËÅU‘j‰ë­GŽµ,·Â(_gŠP…†‘eHºÆ!µdui­åÝ’¢©¤ÓTñ€ÉÓꜞjR™µ¨uh+: Ùò„°©' ¸¥‚w(qëlÜlÉIk…É< ÕRlšßµœö(¸›ôªú^HV*pëQ¦R(¤(tòߨD@]Ú¢±‰2? :Tèç%Z[­í>…׆䣨wÿ’H5ÓÇ‘š\ÓLEAË-8kým:"änw\®žVR&eôhˆ¦´u–ÉYy>ÌÚÎí) SB+S|åWÏöÀ™ªìM:µœœ”Ž¦á×Qc'Õ4ŠX&)'ŽÈ}ôž;wjç º¤G+É£€a0„„š9„¯šl H»”»$XÂÎÍžJ£—÷NÔ÷»}µ*|³§•È$Øôӌ޴ƒà2WÈùÏä«y1ks™<Ê&ç ]&¹¶Zí$uNö¯”í/m[ºüÍ•A½§énU»ÄèSÊM +œ\ƒè9æÆ&DOÏÓ¬h#QÛYObW8¦¸ûoÛ,<ÔQó0îZ(ýÔò9›ó"]czÖÕëm€^–6šÐ„K´yd/|Pµ b7žtO.=®=Ä˃¯}ÆŽjÜòbèÛŽ‘¥ÑqNOŸ§h<¶t(Y­Xã8Åà¿^ k'ñ3ÀXïf0¸X¤‹7l”ÝûtÀìur§E™šHï-Ü ,ß ‚ôÔ ò¹ÿ5÷eJ+٠ɧ…øMWÊLQàSd7m'Ñ“Üê{È{ òÇÃâ[Vm›n^ÓªV¡Ý”úzïxÙÈ”»{Ög²ä‡‚?]ÃäêByéŸF²Áë£aÏ·ÝÔÈÈ‘Œº²m2rÖûµKŠ½n¢Ç¥/•4Ý{¶PÞG.‹–^k +µYñ²“Ì5VlÑoIl–°äzû±—c/i-:Íg£„åëÖÖ˜Ï.EÃ’{ygá·¸†O5c‰¸¾wIŽx‘æ¡{Ïqu%úG”2ªm¨º]#^œ¨TlC'^êWÚш× ë3ó7âe¿•’eJ©³huØetŸï…Ø:â—q—¦\Ëî^8Ózm×–¦5nFꛧ\wsiïüÆî8ÍùbÝT>¾Sø ð!ÏÖæbÏiõšctB¹aÐ~«pu†‡ä*›ßtiWù#í~EÒs¾/¯/‹ë«|³bÈߤ©ÿqyöÇÙ?­“Sendstream +endobj +1549 0 obj<>/XObject<<>>>>/Annots 891 0 R>>endobj +1550 0 obj<>stream xÕXÛnÛF}×W PQ‹ºX¾$@¸)ÔAZ»oÚ¹7!¹ÌîR²úõ=³KŠejŠm‚¶¸œË™9gôe4§þÎéjAç—£Y„_篢%-¯¯ðóÿŒ¤”àèþ¿_-/£9],q  ùÅ,:¿ät?zó0š¾]Â=¤°y}E‰{FñØUÂÚ­6 %‰•°’>Ž_>|«ì¿:žJOý¹$G|AïöLØLÚˆ2e;»øÙ:mðš*I"iŽ²T[3Íu,ò©e§¦•Qáä´‰e{”çg3àkŒ<û2iþÚUõoFÉóS"+Y&ª\“.»42¡Š*—…D*±îtmè·R=NVeýHnœ,9ôäëU  ¤µ2z£$vµ£PÌ4¼YD 4|È‘SÑ;G±(i%)ÖE¥ò`ÁV2VéŽ#CBr.ZÈÓdÂœô\ 'öÐ']q¬(“%™º,Ù’wë… gÛêApKÕº6Í}5U¹ˆÞÂíèAÁÅ"ä³Éü¡Õ>ø‡¾…œ‘•Ò×,ÑqÝ•XØGü„•‹%~ß[Có‰22Æw¤Ó^¤DYgÔªæôD­Ï¯Âš,–˜jèÜï¾ÿps7™G3>À šE×þs ÃY#rJ!ež×ÁÏy#]¦âAi9\(ßÚ@¢ ÌZ(ãV±ó dfG j <”Z¡Ì")ç¼d£ˆZ ‰£mb  -¹Jy&3”ÎCØßæ÷ )…øÌ+—Á,Ÿè4µÐ¡š÷LÚmT“ð»ßÂ(­  a(“y•Öð£“ÃÍÈ|Es,´¼ÙNÎQ9gåO·­þÄؽ9`‚Pý>G]E{$¬«ì'Ú*äÀH‘«?!”Œ.àr›K†.Š•*•žþ­Åæ,xÓ­`°•í~LB‡g{`쮌ãcƒgáŸ9W½žNý‰ÈÓd¤Ízê×kDµç2’èýU®lÆã'T‹Õ|‡š•vÖÉú#À¬Mø~àà{8^¼Z¢Å9¿»1®¸µ?Žåúuh\8%¶kOC¼è50¯¨ª¼!ñfÍæH{Ñ c˜^½ß|S&6Lá­B…ûA‰dÜ!ëw@Ü^gŒsYl`ÚtÛÿMì ݶkNÈïu³Î/ñÌõ9¾P™…]æþæîÍ }0ú¶"ºíïZüæ¤}ar5ÔŒOéòj]]^ÝxázÎv~|ý2ú ¬¶«endstream +¹Jy&3”ÎCØßæ÷ )…øÌ+—Á,Ÿè4µÐ¡š÷LÚmT“ð»ßÂ(­  a(“y•Öð£“ÃÍÈ|Es,´¼ÙNÎQ9ŸCùÓm«?1vo˜ T¿ÏQWÑ^ ëj'ûÉ@†¶ +90RäêO%£ ¸Üæ’¡‹…b¥ÊF¥§k±9 Þt+$l%G»“ÐáÙ^#»+ãøÆØàYøgÎU¯§S"ò4i³žúõQí¹Œ$z•+›qçø Õb5ß¡f¥u²þp k¾8øÁŽ¯–hqÎïnŒ+níc¹~N‰­ÀÚÓ/z Ì+ª*oH¼Y³9Ò^ô¦Wï7ß”‰ Sx«Pá~…AP"ÙwÄú7×ã\D˜6Ýö;C·íšò{Ý,‡óK|'s}Ž/Tfa—¹¿¹{sCŒþ„­ˆnû»¿9i_˜\Í°%ãS`º¼ZFW—×@7^¸ž³F¿Œþ¨ã¶©endstream endobj -1546 0 obj<>/XObject<<>>>>/Annots 854 0 R>>endobj -1547 0 obj<>stream +1551 0 obj<>/XObject<<>>>>/Annots 896 0 R>>endobj +1552 0 obj<>stream x•TMs›0¼ûW¼[™š&@ÚéÁiÚžÒIkfrÉEa” É•D\ÿû®'Øé¥ã±Çâ}ì¾}+~Ï" -ñ‰(‹i™RÙΠ¤4Kƒ˜’<Ãÿ_éö¤¾üüü6‹ÒeP'Hi)Bz:ž$­gÓsKqx,'ÑéÑ4 ®§Ñ4 2ºJ’ Gçeg8ùÎÓ3¢Wð'ÑÉQt>‰NΈfÙIgŸ›äñÛáoŠÙåׄ¢ˆŠz¥yFEÕ«RQÎ×Ü<‹’Óã|u»~¼ ¡Èjª™!f¡^Õ•NhEº¦½¨81Ã)îöÚü"Ö¹†+'JÖç8ÃêZ”ÁEñÈkŠ€ä!ËT‹jÅÁ2 ûÕ}ÖªÛÎ …³Ý%µ¯t±_ j‹†c—™]7)£’IÉ+Ò~ kÁÜ:#zî6 S­¥Ô{¡¶¾ImtK OZ-¤Pœ.wH1x(¬'ÚÑjúný°*>ŽÑ8†z€´fí†Áp±oîçðÃqrš¸bÉû¡m·Ûiã µx@èpp¿™ùb±®Y€ü©óÇ‹÷=+ÌeXË7X…”Æ-ÏÈ a¥ÝHÌ6º“£:ÿT,KÝ)5+²ÜZ¿ã–)¶å-6J•0â=óQ¼Š×¬“Ž6¼aÏB›3P Q;;Ìée,%‡…ÿˆS—h%=,*ÄViÈÄžŒ„Pû–O@ßµƒœ sgȃðLîÙÁŽíl/¶'q† ¿ø•— <ág®JsØ9Èj-ì\YúD‡ãÀ°¹…$~°· ÞÁ­®:ɱl¦¼ÎÇÝö7£ÚòK¸p§àΘ´¼l˜¶ÅUâ|;RÛ¡´<½ó9ïn^ˆ™cgý]ƒUf¼öôÁW_~½:zëß÷ó*=dæcf”âÅ™/)ŽúK·^ÝݬèÞè'¸nuÙywô—Ö×-Žé‹,¼þ ždI¥9^ ¸]yì[})f?fPœ¹ýendstream +ñ‰(‹i™RÙΠ¤4Kƒ˜’<Ãÿ_éö¤¾üüü6‹ÒeP'Hi)Bz:ž$­gÓsKqx,'ÑéÑ4 ®§Ñ4 2ºJ’ Gçeg8ùÎÓ3¢Wð'ÑÉQt>‰NΈfÙIgŸ›äñÛáoŠÙåׄ¢ˆŠz¥yFEÕ«RQÎ×Ü<‹’Óã|u»~¼ ¡Èjª™!f¡^Õ•NhEº¦½¨81Ã)îöÚü"Ö¹†+'JÖç8ÃêZ”ÁEñÈkŠ€ä!ËT‹jEÁ2 ûÕ}ÖªÛÎ …³Ý%µ¯t±_ j‹†c—™]7)£’IÉ+Ò~ kÁÜ:#zî6 S­¥Ô{¡¶¾ImtK OZ-¤Pœ.wH1x(¬'ÚÑjúný°*>ŽÑ8†z€´fí†Áp±oîçðÃqrš¸bÉû¡m·Ûiã µx@èpp¿™ùb±®Y€ü©óÇ‹÷=+ÌeXË7X…”Æ-ÏÈ a¥ÝHÌ6º“£:ÿT,KÝ)5+²ÜZ¿ã–)¶å-6J•0â=óQ¼Š×¬“Ž6¼aÏB›3P Q;;Ìée,%‡…ÿˆS—h%=,*ÄViÈÄžŒ„Pû–O@ßµƒœ sgȃðLîÙÁŽíl/¶'q† ¿ø•— <ág®JsØ9Èj-ì\YúD‡ãÀ°¹…$~°· ÞÁ­®:ɱl¦¼ÎÇÝö7£ÚòK¸p§àΘ´¼l˜¶ÅUâ|;RÛ¡´<½ó9ïn^ˆ™cgý]ƒUf¼öôÁW_~½:zëß÷ó*=dæcf”âÅ™/)ŽúK·^ÝݬèÞè'¸nuÙywô—Ö×-Žé‹,¼þ ždI¥9^ ¸]yì[})f?fL?¹ûendstream endobj -1548 0 obj<>/XObject<<>>>>/Annots 861 0 R>>endobj -1549 0 obj<>stream -x­V]oÛ6}÷¯¸@æ¶bù;: içµE±ÅC1Ì{ $Úf+‘žHÙõ¿ß¹¤$;j‚!À ÅËû}νÿôbá7¦Å˜&sJ‹Þ(áKûç÷_ù Ífq4§‚¦“hZrzè] Šã8š]]Ž“(¦ébŒ'MFóöÄO¯Ï¸Î¢E-n—Ñ’¦³ÛhÌo§Kè'{uÆí2~t{¿îݬni<¢õ±ÍKZg>$|IûïöâàdIñ$¢Æ:¥w$è“JKcÍÖÑ{e]©’ÊÉŒV*—¯×_{#Ž§ÐÒ8[' r¥”d4=ˆ",ÀãE08œLá5„a!Žè£†¾*uÊhD§HU-:^ ­]ï冩6¶é›’Þoíæ5JsT™´p¸B[2[²ò JáÃpÐ’›JENG%O|½E×eª”©3¥’ÞĽ£n/UV–Ú$mKƒ¡K¤®‚ªÃþl½Îܤ0„8X1¬¤RZS•)L üFKw2å7ÄíHä¹9YÚÂÿ½ÚíeYç²±+ŽBå"Q¹rçÙÂh(ÉÂI±“$¿#ì •È(¹Ð)×Kº4¢Ô¦”¤4,Þ3‰©PíÀµ-”9Ó1z©tfÒªÚù—Q-6ž£™|E”¥F‚]É…Bà{s‚Jü³í´½ è­¾S!Ò½Ò’6}Cqp2ÍLAÜPR"+å¬,‚é¸ç[êg I-’\Òçûa",zóýêÁgÖ?PjôVí*N‡£“r{_ V~³× ×ùfXØlÛéÅ>™—6¢Ï:•”T*wDØvøU» QŽÈl*4%g蟊ú"9£\Û‘»Ü r”“£g©ãRHå“q_’±ªBo…§ +Ÿ¾-’ˆÃŸ¯PÕô÷~DšŠ€µÓ±§vÏõ "®_‰® •ð ·¹<Êç]öÞú‡M÷©u9¢»V; ]¥¯Áá¹eŸëås¥¿Ù&^nkñs‘˜\¥n=\FiÇÝTcÆ×ÄTÈï¢8äõ똶׊êJ´éüZiÏRß}|ojÆ›ÏIܵ.JHØ%(R‹FgJC~µMO7Åù²—š:ø{𑉼5J|¬ûL\ÅRÃÀRÁ&òh¸ +1553 0 obj<>/XObject<<>>>>/Annots 903 0 R>>endobj +1554 0 obj<>stream +x­V]oÛ6}÷¯¸@æ¶bù;: içµE±ÅC1Ì{ $Úf+‘žHÙõ¿ß¹¤$;j‚!À ÅËû}νÿôbá7¦Å˜&sJ‹Þ(áKûç÷_ù Ífq4§‚¦“hZrzè] Šã8š]]Ž“(¦ébŒ'MFóöÄO¯Ï¸Î¢E-n—Ñ’¦³ÛhÌo§Kè'{uÆí2~t{¿îݬni<¢õ±ÍKZg>$|IûïöâàdIñ8¢Æ:¥w$è“JKcÍÖÑ{e]©’ÊÉŒV*—¯×_{#Ž§ÐÒ8[' r¥”d4=ˆ",ÀãE08œLá5„a!Žè£†¾*uÊhD§HU-:^ ­]ï冩6¶é›’Þoíæ5JsT™´p¸B[2[²ò JáÃpÐ’›JENG%O|½E×eª”©3¥’ÞÄO‚£n/UV–Ú$mKƒ¡K¤®‚ªÃþl½Îܤ0„8X1¬¤RZS•)L üFKw2å7ÄíHä¹9YÚÂÿ½ÚíeYç²±+ŽBå"Q¹rçÙÂh(ÉÂI±“$¿#ì •È(¹Ð)×Kº4¢Ô¦”¤4,Þ3‰©PíÀµ-”9Ó1z©tfÒªÚù—Q-6ž£™|E”¥F‚]É…Bà{s‚Jü³í´½ è­¾S!Ò½Ò’6}Cqp2ÍLAÜPR"+å¬,‚é¸ç[êg I-’\Òçûa",zóýêÁgÖ?PjôVí*N‡£“r{_ V~³× ×ùfXØlÛéÅ>™—6¢Ï:•”T*wDØvøU» QŽÈl*4%g蟊ú"9£\Û‘»Ü r”“£g©ãRHå“q_’±ªBo…§ +Ÿ¾-’ˆÃŸ¯PÕô÷~DšŠ€µÓ±§vÏõ "®_‰® •ð ·¹<Êç]öÞú‡M÷©u9¢»V; ]¥¯Áá¹eŸëås¥¿Ù&^nkñs‘˜\¥n=\FiÇÝTcÆ×ÄTÈï¢8äõ똶׊êJ´éüZiÏRß}|ojÆ›ÏIܵ.JHØ%(R‹FgJC~µMO7Åù²—š:ø{𑉼5J|¬ûL\ÅRÃÀRÁ&òh¸ @ôŽª.é¥@Ñ€6øéºyÝøÚÇÁœïYÎC‚˜äÎÀrOÄQ ½cªòdúE錙ðvÆnŽG£Q×ÂYÊŸ˜§A5¾xÚŠªCÝ«ÍÜ©q ˜1½®›Õˆn›©2 öŠÖœ‘&~¼i:b„ù -šû+ óïÎgªÀæ‰2–4€HoéáîÓýÝ3¢ž2¢çvÊŒyu`SÙÖ>gç @XoéCx´¸+ß·¾Ôlµ¼€g2ap¼t/oÖã†ÛMeº˜F‹ù2@n9á`Y÷~ëý fô3endstream -endobj -1550 0 obj<>/XObject<<>>>>>>endobj -1551 0 obj<>stream -xu”AsÚ0…ïüŠ½•ÌÄ6;Ǥ)·vÚ ™^¸i‰•`É•d<þ÷}²MÚÒ†¥Ý}ûí[~Î2Zà›Q‘ÓrM²ž-Ò­óeº¢UYà9ÇÏ1†ƒYžæ—÷ÛÙÍfEYFÛr­Ë‚¶Šg± ­œo´ÇcOžµ …ŠÉ÷õÞµ¤£6¯ž‚¥ÆjâC<6:ë^ÉW±§Þ¶Ô ®IE>èQÔ{‘^m_f Jò5ÔnÕüɳód =|":“>/XObject<<>>>>/Annots 868 0 R>>endobj -1553 0 obj<>stream -x•WÛrÚH}÷Wôƒ«W™a›KÞ'Þõ®í8T–< Ò`&‘4D#Á:_¿§çBd‚÷RI¨ ÍôåôéÓÍ·£„úø“Ðh@gCJ‹£¾èãÉîãïG£DŒè¢?C*hЋ³ð-§éQr>Äóóñ™ðÛáD$á¿…LÆâœßáÌ$|Û½ÝíŸÃ¿JÑÒ]Júgèً׳£Þ5Lôi¶DÐÃјf™‹OÒÎÕJ®kUQr.è¡Òe­ËGš6뵩ê“Ùw7ù»Ý³s<Ë:8œº)ëÊdMZkSú£ç”$áè`„qôµzÔeÉF·º^Q½RˆÙG+iÕ)Me±d½KëN”²ÖEŸt™™­¥û­ch…JW²Ô¶°¤‹u® -UÖ*c÷}ê& (œn´¤»i÷ÃÃÍ;Z(á¬NÞ½»N©”…Êh­×j~ÂI«6¥ª,2±d–!&SæO10ܸ•å,w¡ìùLež[†¨™!]™eš!’9-›Ò¡%s]?ÁÙè †O>kµ¥c€ƒt™æM¦ì+6 ®u£åP"ZšŠR™™1Ê(Ô3«€`EK+`jvXN.z“qï~ÖôAÙ4×ÀÏR³6%eªeæRè]§¡”Ý‘3Ý‘Ì|0ÇÑ»Ž…v/w°\Ç(áó@/jÂÕoõ2Ë<çè'ý]VÊuùði~BÈŠßÎ g`r²ÊQ²Uèy§RKÜF‚«º^¿êõ@ -¦ŠÖ4UªÏ£¥ªQjúóÄ"c^ÌíÞY h`™óÉð;€3銤¥i-«úI8$UÒÛ²)~7 ;ïÌONIÕ©9O•âtybLwÓ7÷¨mÚ0ÇÑ(‘¬cž…ÍJQè´2Ö,k‘š¢ç¸PÈ.‘wá¯àV€ýlðw/næ'‡à‰Ù¿Ï ¸Ñ¦#Úõ2M•µteX"rºÕ$Cm¯n¹¶¡‡P7³ø¢ÒÚrýß(Ç1ôPlîW XÿÖ¨FH­×MîѨW•i½5Vq¯£¥]u¸A3YËTÉ:,í¬ûI\¾˜EàC±Ç -€­;‹dBÝÜl¥P°ȲPª$k -.Ѥ¦\6¬I$¦©i»Bý!3(¨¶T( ±BÇâ¹B‰fE¥©Iã/^`.|ktå’ÓÙcWÉ …Óˆ»¶5<Pötpe,L–°Ÿù^‹`ïh¿¬L±ëì *‚.9 - ‰Ûs wºŸ€ÍQs5>cDð(Ë'ÚJÈ£AQãT(ŠW6AÀï‰$ ljëïÍ‚¬¡Ü^V÷|ÇàÂãHp˜Fyn¶ÜÅwSúã5¬Ö:Íi€ ¸âʳRùšô’žLãÒð§cÉñgÚXAþ‹ªŽ??¼Ë¢>ýá_ù‡™\)H‘ç&z°ƒb+&€ë?07ÐüÁåW4˜c*xÆî[ƒ$tÃ1fLµÑ©¢´R‹“(â=ùk7/Ñqܱ‡Ø¼ "íÓñ5ÛÄr±çRæ`¶EëcÓÙ™úÀv¥1DÂŽ`ÑÌ2뺅DzmåyZ¢-¤µ[4æ¡þd‡Ø°ÅxÂn׆Ÿ¶ÐS!àS78¢í¶­0‰¸W€ë-¢—`æ=ÒWÁw ¿ç87i‹9q—hUíŽ~ƒ"Zð/2Ä5Å{»V©^úÅ)ÚãEiŸï>ÀǤÚÕ2l Ñ[ Ú]B‰XIÿW>>Ù˜F'Ö,.^£V¦–låøöàp ýI€…”q®|ÇëVØaИèÆ%º,tÛÙ@Œ}·¹År~Åüe‡±ýžGÉJ­>ëÜuö×¼¼Ëyé=uúW4 K]ᓧ‹³™×ÎmyüÙ%Ъô ®\þ®t(­/3þƒžÎ`“ûšç~$ü‚Ÿ¥“=.î2Žƒ¯Oü‹?[$P›wÈÇ< 9ÐÖ BË»cX«Ãã wæo錽FÚí˜ã@|Fy,úèû¡u>:£áدÚã ŽôíìèýÑß™ ‰ºendstream -endobj -1554 0 obj<>/XObject<<>>>>/Annots 879 0 R>>endobj -1555 0 obj<>stream -xWoÛ6ý?Ÿâ6 ˆ ÔŠ,Û²½`ÀÒ4ݬ™{؆eh‰±ÔJ¢JJu ìÃïIÙjês‹ØuÇûñîÝñýÙˆBüÑ,¢qLIy!žþÜÿt6Z šŒã`B%M£Ã¢ ÕYoYÒ|úÉÞhAdƒ‚£xÄ~Å’ý5va0îïöÖ%E£q0ïíÎYÕxã!DGS|»•UÜ[cw£þnoÍ» ×“í­±;ç°æI´€‘Ñ<†›%MàûܯìnoÝxÌz»Q„ƒ¢ÙyzÝÂJ—ð”å싼×[–4›! Ç½ÞƆ=n¾XŸ]¼š :´~D†ãùŒÖ©MlHëdð§jÉdª-R*Uš?î©É$©?H}nÈ”› QÕ#=æ…¤F‘HSûƶPQP-´(e#µ!QaGQ¢¥hð*´<ª¢P»¼ÚZégë·g! ‘ L&´¤‡z¤DµÚÈçdT) k–=(¦¢h¥Án›d$ ×¢ÉΉ¥…Þäzo÷nl$iY"‘)íò&{r®¨k­j³‘N5ìÔ´‡ dòF><ûž%.^…´p!F„&ÿåœþ»Ó"ïxLø\R)Ë ‡ÁÛ_5"-óŠ¶Zµua˜&6…<)ïc›ê‘wÑ4²!XZ!¼øVµÔM.ÍIi­TC¹¡¼¬‹<É›!A¤¼°5åü„à'/Ðô£7Û¿€Ovܾ÷Ý)Ç9¼h¾(T"Š #ʸðšOY»E:Rï ¶?éÎF«‘©/¾¥¤*¸ù%%—Èf•06ü`,çÛV€ÒAËsÆ\E;I•”é‰@]r8wø "7Íy@tÉäÃ9׆ٛF–„$•¹1¹ª WC)ÞN· Î6‘ÿUC‰¨`^½·Åb…m%r™à´[.‹üT8/9ï€ -`Æ¢JUC ¯Øû–7 -EaÉpã´£ßÿ€Î1HA‡›ç|0kíSÎ0² Z£ªÝVäÙhpÔñ©Ì€]j ’Ä1‰€wPM0Y‹B…ü ~E“wÓF,ØsZñXDEJ§x šÚ:EÕwN{bbCÕV6“'­¤#°ŽýÓ‡gÈeZÚ2¯i%ò—WøYÂ"ˆã®ŽñìLàOŒ¸s¢š8Z¾os-K‰ÄC‡sÚÅ…>/‘c@”ÊZV)"TãÐ Á9Ç­³B¦£†cd@„EA Ÿm ¡ØÐ>‰„ |ìéc²âzÆ1¦ñH²…ƒÔöVZ/^up“ G4ŒfÁ|lÙþªm2Å åN¹ ýáža<íböZÙ›& ¶GFsó÷¼JAt·ö®q#øÄ-öSà<Ä6Oð”6®«YOØéa¿ÙV‡FÔõA©*pãÝ÷B×Þ9.eàQ0ƒìq ÈÍ$g|Ž{iÕ< òµª¾Dö¡Y¨-‡[Yö\D2*Д|ì0:l{Êb¤£ ôë¡™>9g Ú)ýÎõ#Y}ȵª,üv™D!zÛ‚—w€â{ÿ´\n{©jñ‚ÒzÏ^ kÿä´CIòL`dÒ‚8÷Þƒ<g ªïY@KΑqt½ úÀþ`Æ>ëµÊ’‰ŸöÓêÔý@/Ð'~C 8©nÁ¸‚ïZ:[iËYÝÉ¢è5˜3‡M[CLÃþ쑶Ž3JªŽÌóÊF¢®%0Ê¡ùÿí6 h8|+@kïçurÛÑsŒ \Ü`ÆI1m]+Íz%»« -%R> -ó‡›!|ö˶hò=*)rÝ+¡“ }-ià+Æ,˜Z2ügÚM -¢J¥1{Xt¡óC-v—å˜ÐÀC0“%o)ðÈDOŽõö£\œUæzv€ƒ-í¸’i\€¤ßeÈëëXõN~<mcâ­FékÐùFrán˜ñCÚZÙ?ß–Ã.7Y/ÒžãNŒ…>Cþt^öfCžÿþ>Žþ˜ÇüÛ.éÛ^z?Îão¿,{{7 ;9þîÉ.¦‹ùWDÇÑÕ/ËŸ¯Ò=QPÙUQg⟫?–_Õðúv¹:(è ÷“0 ¿*½\^…ŸH/ÕNê嵕?u¯.&¾¬×7wëÛ_ᄀû›7¿ÝÞß¼¤åÍýëÛÕ -W¹cG±>/XObject<<>>>>/Annots 884 0 R>>endobj -1557 0 obj<>stream -x¥XÛnÛF}÷W „Q‹–(Y’ûR8·"@츱‚¢hú°"WÒÖ$—á’VÔ¯ï™Ù¥L1iÑ¢0,›ÜåÎíÌ™C}>›Ð?ZÄ4S’Ÿ£1î?>üt6]\ESš/gÑœršÅ—Ñe¸Êèþ¬{Õùe4é¬â º¼œá‰ÙrÿcüVš6l†&Ó«hÑ_˜Ì'°3Ÿa%§x2bÁ¶:—X»\²)Þ(kO—9MÇ v¹]{±:»x3£É„V¾xÌ>"Žù’V©D;¦U2\í4©$±MQSãtJµ¥Ä…Njþ·Æò½Ê׊vÖÕ”7øXã Êu¾ÖÙly¾úæâ`nXV¦¨±ªÒÜ~­ueH™quäo&áÑ"ZrUVéðS<_Ðé#£Q_Ñ(žG3Þò~›Êés±¼…ëm⥫M–QiÓÎñÿAD*Mic2-žkÖ©©¯­ î®u¡U½cÆ4’bÀæoÒw¿GôA‡ÐëªIÁŸFn§*<rZR÷¬Ò*%[d‡g´>Pª7ªÉ|ä£8–‚Œb>%¨"Ñt° íÔ£¦ÏÖ\ øWéÏ üK©õªGƒíª@ÌÎÙÄÈæÓ@ÎÉ™¼Ì”Ù-¼èÖ²‡b5Î[T¶²¶¦OC[…2ü«ª~z~Ìþ¦²9ŽùÅ©Ý;º]Ñ,_Ä”dFuDïK]ÐàV×{[=ô|¹Õf»[£º;kÓÁ‰ÁÍÂ^ºËÊ8À×NG[aË)Haà$—™MŽ¹ô¡ž÷ŒêÑl±§üàÎã×EQ4€…,ÕUD¿¢8ng›,E8ùd -S• ¢9wh†€|€‹Ñ‘«:Ù1ÒPƶ'Ô`E>ÚPSñˆ!j¶]m{a#/yD«qm{ø¥ÛïÞ‘«Q†­ôl–Ù½xŠj9‡ëšÑ5Ú9 Èý©*Iâíê"ƒÔ=äœ$±ÓÍ×u­óR„¾x4ÚÞú]V¶ÔUÍlÀðRÇ€ö;“ì+WôÉgêÇ) Ý‘]ö»·®*œ›ƒ‘ÔVÿàk3\ȵ D÷JK›ƒOØUG‰* -ô&ø75®ÌÔA§œ=\úD·½àJ˜AÆÛˆà,?i -Wƒ±tz.¼D®´6ÓUÏ»NøÉ©½WVhj¯00¼p¤'¸QØý>¦–ô;1½ÌLò€î·ƒòÉHÑH *¦4fÁÖp‰4‚4ÊÞÔ;±ÒÆtâ&sÏÅ^¾š‡ *\ä9ÐM®5Î÷©€(8–à#ð†ûLWûÐaB -릮Ѭ(*°¥uÎÛAš%¹oþݤ“1xœ9÷:ã)|tZˆ•)mÙ”Â:Ü Ç¢†à\Do=1ü§Ø„Ð |:8¾°¯’—¨ÜÑ ®â˜©ip¬cZĺÇÒÍýèÃÝË0e‘ʈæNHw{m!uØw³@qÐ=S$K¯¡‡¶ÐÚë,=`0´­lSJm/Þüªš»MYÚŠÙ7SÕ7íûNGÜþ†¤z_0\ÃhDj9q`) 1J¯gà5Ú^g¶ä¾¥[DÔx@CÓy0q²ÑÆ_Âð¨+2«Ò~âxüOÆcH´Ž裰'¤“Íë»_ØŠ³¹ÞË{Ìþ]ä­ñÅnyO#}n¥µ@ÕÈå·pØr·µÜ…7 •·¢DÚwÖeÛpT•‰Ç|…º q1‘ýæV: ¹#˜mÑ>Þ=~»âÅexÿéy&zöÇ£‡!D=$%YÐ_Þ”¤;Ñ™¸‡6ÐçW]¼cÕ¸NƒTÓUÐâñÌkñï„S†Ç¸À¹[K£ò2õ=ø¸‚×£„8òž»t²2™ãË‚%é0Ž–óKVç÷×7/®ÁµöÖ¯l‚Ž-j R+1j-Æp(þç7‚Ù_à yó^.ء׫³ŸÏþ­û~¥endstream -endobj -1558 0 obj<>/XObject<<>>>>/Annots 895 0 R>>endobj -1559 0 obj<>stream -xµWaoÚHýž_1—öT*Á†‰”“¨’´œR’ ´= úac/Á­½ËÙ&ûõ÷f×K I¤êîJ`™Ý7ofÞ®ÿ:ð©…?Ÿzµ»¦-¯EŽÏïýÞüg’ælÀÔíÛÍûƒv¶vÐõ:”R7À‡$4>¨ Sê÷½~ÅV¦äÃW·b¬Ža†êÒê8¥ Å8VÇ°½Hí¾ïS»Å¦ÔÁÚ^9bÀÕ1¬Gï¨bå5A¿ ,°u½ ðBßïymõñ+uáÄŽŒµ2fÀÇpúh­ŽaiG«ôA(ìÖïôŽ™+cKEP±2n +ö@–ÍN¼öÝä yÑ¢cšÌ‘ýn_"“ÛMÂÚ™NE¬N§£ÁÍh8øJWãÓé'o¾ÒXf÷2;ŽEz+P(Ž†H– Ñþúvòí E€³9‰jÓ/±Šô:§Ñ„6ý®3û-Äóu«Bft–Å؆j®É?)÷p“ˆ_匑Hå M?\Ó¥Èeö»,A$Å2§ë±óàüÿg{èŒã&þ?þùL¯‰ù¨eË0Lb© -Zê;MO”i]üšË0 ¥Z¥KKh~¸ÇáÉåN扸ËO¦­M´·ZŽî9Š“4áu}õþj6[,׳“#™‡Y¼,b­N¦vþþºúèŠÎn†ŸÏohðy0¼¼»<§‹«š|Žéúf8šœßÔŸÝ=Ôi -ÎN¦Îêêâ‡XÍöhüÍæÂÐË"²eëâ£ÙìðåÊ„ñgde¼ -C™çóU’<0ÑM¡©ø2(l^@ª:VmŸÓï ©; ¢(Vw4’k*;)§ûXP±TiíÁõ»” ëYMA7z÷@‘œ‹URÔÉÊ…žÏe–“H*«•ò…Èн˜+Q¬ Í,Mv·ZžÞz¡Vó]'5žÉH6Ïói®“HfÀžäšä&Î !V.—m("‹8/ç¾íGE.bú·È <šÀÂ¥uŒn%°ë5iòcÇgÃœ…pÁs±HÉ°@X+{·‰$$'¯fNnd¸*$ EWK©Ê€Î7³÷VBgoáµXˆÒX!¬LM«¾ý2.z'ò„Îj±'=#¤³’T&E5ǾÙnÙÙÛ²2Ârv°OÎÇ,èöö¶3öm䆓µåð”d¾ç 0™ü²L^ðŒ)ªUܺBkàpô)*DŠô3ÁÈŽãÜ› sæö©g˜b VQVªe½nZÌ[î*¡±¥B?+ŽPÑ~Œé*GkŠ{@ÚÖù½HVHWÉ2Ów™Hi¡õw2swªƒÝ1GŽM€äaþ2-Ól=º–© jÊ"lš•¡XîãBYˆ%¼Ã.P~sTNŽ:C?܃sBC‚Dö`Š†{Ÿ/ƒHØ—…T¨{î?ÆËìÏ3‚{–ÕÑ4ÆÂGÆc±= H£„•.l×-r\Œlõ4á ˦)]+±G»¨š6þ¥BŽcô…´1™\ŠŒëÇ’n·t<¿(M\G²³,xa¢C¦—!)h©ójõhhI°aǦ?*¡_&¢È:«„Ì2äNÏép`:“*–Ñ!+ n«Œ•´„lÉöh¤ HÏrãp=áȧ Ü5Ä7GfŒjAÛ”é9ì -½+ä¦`dìdWþê& W.1DSXua¨WªØ¯ŸÉB⡃5¥ËDòaŽ:ÛÏk$‰Ð­/$sÂ2™ê{®Gld®Œ¦鳇HÉ„«gàá##Ñks¤±ŒlRE!ûsš`/>HIìTmF±Ð»5W©Þö¸Ê’ý4ÍjáB¨;.>N¼¦5>è*QFe¯ÛŠažÁœ¼7gZÉ7˜‡ ÎOFEÃ’w0wë…ÖãCgßËdû|Ñ:V^ýÒ¼U3_8vˇ…W46WAÞ VP_ð²Ó.LÎY»I5ôì1ff¥|¬xå º1½öëÛê`­©ói Ù·¤oï g¶>]Ôí%Řw»¢ã…L]ÆjµyºE4BzÞA§î.kÎÞ¼è—ZçwñÞoS·wlŸªÆƒï¸žèo¸YЙW¦/øÍ~nA£×âGºy›ëô:^¯ÛÇ][ôû¼óùäàƒe¯¬nendstream -endobj -1560 0 obj<>/XObject<<>>>>/Annots 900 0 R>>endobj -1561 0 obj<>stream -x­VëOãFÿž¿bœŠªÁ¯„<‚î ‡ -4KÕIýpï†ìÝ>|Þ5©|g×q@æzУ¿ÊÞͳˆÙ<ò‚9)B¯×}?ÏNgŸ(± ~é}ìÉ=è}è]ön>µ/3Q´î]ŸÞdóëlÖ5¬ô1ÅŒKJÛÝÊî<‡ß+€@®‹‡N^@Ðp~üŽ\Ktæ”>ÍXý¨ÒfùZC· ÿõu|üdþ$Gáëõà/‚:‹îH™Bka4£ ý®™×€ÊûY|$~˜õwÁš0½T³¨2eäk*2D.‰gî‹- -âTGÁùdSVWùº/¢uA"+‹º  ¥a@züSÒÊ:&}£ ¸Xü  Kù…òž%ç™i©)Œñ4{Y²!ù’䞯â qî¿"J-F[íôMÚƒ7iߤ}ø&íÑiÛ“íÇ´÷àJÛúLçn^pø¯£Œ¶ÒSÿ³Ú|¹ s­V-½ö5|Ô•w'aÉlU*çV:²UÁ5¶Vaª’Þ…–Û¹–›©6дÏ>lÖ› ' -–ß\15=ì=¬ÜT1ÈXhú¶Ä£À§ì–)†Ù÷æ–•JSÐO+¬¶æ¶o׬É÷ÉFñ¸îž›ùåÉÛ[f¹…÷:¯\õø5Úi4 -ãحܯ9†ãa8MpMGùÉÔÁœf?:ÿ‡±‹gendstream -endobj -1562 0 obj<>/XObject<<>>>>/Annots 903 0 R>>endobj -1563 0 obj<>stream -x¥WÛrÓH}ÏWô£S‹ßâ /[ÜR»@D±yKc{@šºÄköç÷ô\YqŠª -S¶f¦{Î9}ºõýlL#üÓbBÓ9%ùÙ(á—öããõÙdr-i>]Eʱê2šùo}âõ4Mñ9[.ð9Á¿RÒÆ>˜-–ÑüÔƒéjŠ3O올8XïÁËøìâjEãÅd;_Ž)Nm’#Š“ÁxM#Šw’nò¢Tº®(6&«d}Åαw' 䧃£Å5VSQš{•ÊŠ}~ó7ÉﺙÔ5™ ÕðEéÔì+zÓ‹4¥[Ž&KüüC”iDW¦¤ÄäE&kɱq<lˆ¨ôÆ”¹¨•ÑÏ D%Ó›kcnsßË5Uª–$jÚÕuñüâBù{E•iÊD⤭Œ´¬/HT´—YÆÿ#¿^ÌÔ$MŽìmTR:ÉšT¦´WõΆ Ç’;–RUÕ¥Z7œ$ª*À’ð7ìA£³C ­K%7½À£4iã6ù›m¤¨›°ÄpËÈQRgžšéºP–ÍqD_v¸?2;~w;ŽÈäõá9¯@?Ë|ÊLË€UMQ˜²Vzko¾5ŒÍºNæ.ø­U¯ÂQ@®X* ø0å¶$âç-8ç¥QÒêòbµLNi©îAr!’ob++w‰Ä+r¸ˆ eˆ8ÜMæ :¾¢}Ø -è!5¢»™–‰¬*ÌøŽI  Ã [XžHÄðk™ HªZd™“X’).–ýN%;/™u-”&Æůì!4°Ì ÿIäkÁk‡Nítž¹íÐe X«“·%×4èl8YFã g3çVl“ˆ^èBE¿v´ÝÑöH{l#0 &ÅÝðæ,ѵ<€ÁV‰)¤s<ÅJwƒÖ‰QýOMP¬é󸤄ÝB¶ÒÈ <¹£Þ»óˆn4U;ÔÄ3 ÞVëÕÕö‡* -Ùg¥åÌ£äà0Jáù6*“Õ30 iÀsnÞ_‘ÿ‰µÀ…ÊN‘ÙIKÉÆ´>8[z,©ŸØEßþ:Ž«Éº?W“€õ:âkBìMP*j±f{v§ %Q. Ž¾7¦—Ò½Ýë@oãø–r™ì„VU^EôF$»SAì)ì#ö¢m¤ì$ˆª2‰²x}þø§%Žu"’º¡ñèÌk9ìm¬='O1|ëEfi©­â"= ¯lµOÿZ7·×¾TÇíš -Ï`Ú¨,µa.pq¢Ž8Ñ¥„9 £ûÇ -¸ä¥î¢-ÜáÆP›»chîÝp@ÚôZö´ ¡¢‰±>lBµoKM©ê%;™|ãÜ!y±Îdú¥Ìü Ð•Ø+ëZO¨å]¯rPð}¾{{³S>È@Ý •qb -W˜H‚Y…ƒ†.›áÛ_âQá! -Î3põò¸îU˜||+Êðbý-þYÊšiÛ äÌGt{$”Y‰íÄp1gJKº•%†¨¤TEý MNÐuüÇoÄå—Ò¶: ¤o[éF$Ü÷¬äŽBÿ3th]pNÑx‡áÖC“äîœ=? Š¹Úš?[Ã!˜``ó‘™pŸž”@=¦ÂdÇ;3Ì_ ì7RoûdnR™‘LLgÜ° D‚3µYV§óâN‹íEnnw†±VuÔ`Ù:ý€Ä;*'Æš ¬6˜Ra²`WKÉò“àì{Š^B¢4kôW—­TùÚÍœèÃä>àsÜOkË"9¹Ö;ÀˆVa蟹áØK83¬Ÿm€¾ÆĈÕ® -6í¡»;ˆðZ‚æñoï;ñL«Ôfóœ®QŒ>.Z  C§¦`ë†KÁÏì(yê> ÓïõÑC#ãqÈçÀËðžEÔ¢õœ>»óHwÝÖa¶ôøŽçxC[Nñ5w·ùôâÝËx‹1_‘½î¾.ðÎaØ0\Œ¦ŸÍŸ|Óš-fÑb¾tóìjÄ'¼‰Ïþ:û/d†’endstream -endobj -1564 0 obj<>/XObject<<>>>>>>endobj -1565 0 obj<>stream -x…WÛnã6}÷W ò”bù¯í,PÙl‚ ºé¦‹-°î-Ñ6JTHÊŽúï=CJŽ­MÛ\lK"gÎœ93?wÔÇï€&C:SšwúIŸFƒ¿N'xâßJZv>Î:½›>]Ðl‰ã)>d„Õý>ÍÒSâŸó„È–iª•,üºu®’ŽDA—YvoUá¥ýdÕFÚùéüÝ=t¿¿z7{ìô©;è'S<ý»¾’1_Þ0ylñúåÀyC"õ•ÐzײÌS+…—äגʈ‡õnF4ĸºÃàök!É,ë…f¡eîH©©8™Ñv- Ry‰U«°ô6VPMNzÚ -\À[!rI®©$YYH¿•²h@ž'Cw#¬2•#W•¥±ž"™$lºV^"4+]B7Æ’| àŒ¾©"3[G¿ÎH©®2&²ÀtðœÑÉe‰¥-g_„“ö›…YK··Øþ'mÞ’é ÎöV/ÞS -:)ï¹sÊ‘å'Ñ<ýhð¤v9'#Žo˜„‚Z›-gì©Àûv-|mÄŽçb#iš¨*µøX"rÑd/¡K„ê|…¤"µÙ*­[qZ$)_à™gœŽÆj]Ò½5¥´^»L mVd -½{%4&½h£VO?§XZ~Ÿ+•>‘6æ fÚ~G¨+·s^æ@¾RÎÛ Ï¸Êä‰ûüË—»ùü!l˜Ï¯*k¡»+Sxkôƒô¸?Ïç! ùüºØ(k -–g4z¤ñh”¹‚÷:rsÀ‹Ð[±sT9”A\ŠJh¶Fþð‡à ñ7Z‰ð¡Õ`¸E ² %ÒÖæäH]? g% " „>›-`Û3zùZ7pT¸-‡5&©€Þ nª9E±S´ª©8è7b&µ šE¸ìJhVÜ.ÊSÎäÌ~®= -DrÁ8…Âô²,c»@8ZåÊ Ï…+B3pšö¥%8t’'±BÐuÁÓÂø5cn~‹`õQvPÙï{Ó–„¹MgÑïk¦j-•u>aû½› Lê~y>ŠZà=¡OJ¬ -ã”Û¯CÙóyÑ=ïdžÖ 2k²*åèãâCÂ:7 À½Ì­Ñ ô¥V•/ðY7L.ªUŒ†‰-mÝ®· -ŒyÔbÛ ípg‹°ãíu¶º´&Ž‡»M‹âƒ¦VºhÐ"«‚K©àF„¬ ‹#‹íšŸp­YˆËÉ °–ﺡ»ÞÞm† -J½±»À;Xldõõ錜 bÝ -ˆhÂ&þp +B‡ª-Ý_ÅÇL)Ær/$ú*6*ÐyËͲ°UlÍA‹òƒzv¯9ÀI!õò '=V(s,ä6 d¹Ê2œ™¨³úücŒ¬¡•ó­–ç? -õòjßU‹Ø:“:`Ib®ˆj©4æNSÓx+¨®ieaA J¾Ä^@'½–ÓÔä@š$ôŽHp}3Ç}LU%³Ôí,Íà»6€ÈbNcŸF«@›á ˜ h®4rù"ÁóeLSn@•Zn8ÃͲùév­Òuð²¨tN˜t@ªœÆ&1é%z&/aåÞp0Ïu‡uó˜Dô}¥ÍB迳õtR‹ -¾Û…¦‘:qq¸¬BWb -’ûL¶Lèò™.£Ù.­01…]ô\É -e‚æX…Vr0!6tióc ]°•L ‚ÍâMèßC¡òL küD= b½¥§Ë¬çø”‰Œv©0*r’—Fk³ål‚Z*Æ^òõˆnEŸL -ßE<Ød·ÙÐôù[ÃégÅh2J&ã)N -<¿ð¶ëYç·Î?¯O -Mendstream -endobj -1566 0 obj<>/XObject<<>>>>>>endobj -1567 0 obj<>stream -x¥WmOãFþί˜rGïNº8/„hAâtwêUªŽ–TU|XÛ›xÁöšÝ5¹¨êï3»¶ >hO*!Šï¼?óÌängL#¼Æ4ŸÐþŒ’bghz0Šf4=œãz‚·‘´Üy·Ø~Ñ-–˜â"%œh‘¼¦æ¯2ªt”è¢eJ'4¬­ƪæ•¡þÏ÷*Ú³o7;#ŒGÑ!ÔtÒyu×ÉÒcé;6ð_Ò¦xl»è¤ož±}WËZV¢¶²ÓѨ°Áÿ$˜·NWÿ[…0Žu ?Ni<LfœŠ QÄ‚l¦ë<%+’/¬.EœKJåRÔ¹³´Ô†\&áj*+Y¦ª\‘.i£kCvc,Èm*ù–âڑ¿-_¡*¹Pæ^oDé"úÄßR©½\ŠýhÂöë’‹e.Ž5R&î%9Mn-Åmc–Èu"rä -æÒ¥h‘u¹³m"_‹ J–užoÚÜ5öl%µT2¥J¸¬…´oIX¶C¶Hc*ĆÝlÜðŒ‘‰£ó³ÅOt/òZÚ¨Q:™ESâLúl @¡ s!·¸ˆ%y Êô-§g­òvn%Ž"w•6ÂlYµ!½ôùãt ÙŠ k<{ðZ•½€øàeÐnì5Ó!Y…ZeŽ– -Žæré np—KKŠã\º D>œžño .m–úœn·<*“J¸[¨"È].\Y±4»…U+ΑÓ=³÷yX Þxa[iKÓÇ'wï4—†~$nÛ-Db´Ý… ¿BÏ¥±©Œ‘U.˜]+—‘¨*£aJ8Ù`Ö 6x»ñÊ80_Áž{–5[Ôe[ɘgœñµ÷Ù'=8’•€ÊÀ9çS Ð×Õ³Í2 "¸önžSð(ãëL%³!l/©@ (­T63üxDc4…Áþ8ôßxM£IDïe\¯VÌNy|j0YáÀcö›sã~FáÁܬ)Ë>`µdÖÂSë@¡\éO6綸ÛWËfm£ª¶wÐÁÚø4ö’$̪.d‰smšAmÎÑ' Œ;"¢3²ª¨ÀÉò‹ðŸþ |»åö 7åÊRè©X‡\uós0AŠ8âfn†@·'+ª¡õ«ÛSs2ÆtnD_|ç§kw° jk°¾ µ ìfk Ýƒß0ò¹žÆw=`kžíÆ·JiPÑé½Â;ò^=!à™:ðe»pBÙCoOƒáHY±’O-/ÚñÇ[¾žì¯D¶»GÑÖà{§.ˆny9¦—šœž~ÿu@Qé½hÇI¨… êa‚Yà™–¨@Ýb`òÄò,Ú‘uó•R¦ iÞ%*P ø Ý2²¥lchF$GdzW€~÷)ç= ¯lzLM'ÓÉ$Ó”©¦ˆ™j­4P '÷ù¤-â$W€> ‡~ÊgÚºa¾žöDDšzçÁ¤KP$©ê¿¦'ºövrp@e!ìí ®¢ö=ê©;cê=x¯ ¡Ê“˳‹ÅÙo‹kú|qrù{©¾\Ó…4˜R'—'±«Fóëž0‚9¦««Ó¦Ã|Á¿ -l渄ÜÜÔá-$Sƒñü`JW¯y1¾‡öê nføòþÛ|ùœU_¸ÞÃñhzäû~¿í~þlmõwþ'¢LdN,Ü;òÁ·Txžs<½‘c0J -7{ß óçVE£V¦Ïéx*Â΀ü¢žÛtÑUô*¸÷ -À›¹®i8ˆ5jÐl2ë%³ñRA½‚b,X…²Ø¥Ú•˜×–vhW\îQDE:é5¬ÔÒL˜lí(ýE®õ-a3à>|ÌͤöM‹= 9c¤õ[:¶‘‡Í–?žá'Õá>ÍæMk_œýòîŒÎ¾áö½Nü¼óqº­À`>âß[¯¿m°NçÓh>;ÄD†ÈÑ„5}Xìüºó©UÁendstream -endobj -1568 0 obj<>/XObject<<>>>>>>endobj -1569 0 obj<>stream -xVmoÛ6þž_qß”±üZÛ P )¶¬V4[<  ´LÛL$R%©$úã÷)ɲ“¬Û’Å{yî¹çîëÉx i6¢ñ”²âdh:ã}2Ÿá}„+i~˜ÌGéèµÞOÓéñý‹“þÕ„†CZ¬ác:ŸÑbE°?Ð";ýÛT” M_+•=ä;Z+½"SyRkò[I¥5Ë\¤=)¿¥©,n*í•ÞÛ9/‹”¾¬½ÔTJSæ’¶â±=WŸ‚%eß-îOÔŽübuÚ—>ëK™(á' LK[(ç”ÑŽŒ¦Ga•©\ôˆ e%]ʆúWç4œÄœzãaŠ¯«Óá$¤ã”þÚ -Hëheè:õS<¸£7b0Z *'CΉ—ΗV»„ÓßXQ7”meöÀ_œ”{t„´¤E!(Råfef6Zý+W´ÜÑ­(–"ÄÞá -)ËgQ·³`€k8.b¨:¯S!5Ž•ðׄפHP¾LrʃûPêDu})c¯ôÚØBx€Nkk -m9ꈔºx» P­Mž›'η•æ:)FÛd"Ÿä³·"ó€¤ãõDz퉷†¿Ñä?F¨s&ùÖ_*ÝÏj ó$buÀ$6x4IéVú@󪌞,þ¬ì#øõï–T…Ø‘–È5€ã vœSÖ;8±¥byb?ñãà@J×(”#ç­Ñô&ó©(¤^±E¦8wvCáµÈT®¼’\fó¨ø8;œ%W“ƒ¹ûÈbsíó;bFÃÜÑ41l%„Ë„8À\]">ËͼÌÐjSï–?¥Åy6¨tBß:Žú(ÍÈ©ÿ¡ 7ä7‘+á†ñc”¦é…)™ãE^É ÜxYºÀ +„.òÂ8<ƵW;w¶‡ %ì*¡¢ÂÓKI¨PiÐ6éE^n…® -iUƘT(Ÿu™P$ÿvz%ÛŠÐÖ|Ì”H+Îp0扶»r+¡Žw§I/¹{GèIæyJ—O cæ TDäP&®†}b®µöŒK}„k8Æ&‚Ö °Dd; ½`«`׊ý J"}BbÉÓ¢c—«¹§83ÒBzd°c+lâ?òÏfÀoÆ-WžP ¾Õz`návQå^ñ¸ ³ó“¾,Æ¡ßj…ÅDYïYÆÇ -aäöZ—–î¹”Œ(/#ÇAö0@10¡ )ñ5.ÛIVÚȱƒC¡‘B=Ž^=þyG7ÚêÞï!n”C¬Bkï+Ò™ôŽc -Y”Âya10 ‡ë0" ñ€>CSm@pó€¡O5§Òé0Ò¡W±ðÁv€½`Bpã*p(hm륕Nn³'æXmXê büvóG»!Eγ‰$/3¹•bõ¢ù!î<]@›3¯Ù™:äkûJ˜AÛëe錰f¥xV,g0Ö3„‰ªïW®7"?Â0äÖ!äÒ[',zß‹¼Ãû&rÞ%4ÍmM•¯0Nœ Ûë_?ýyCNm´È öæŠ%?Àó–o… IÇ7 D¡mܺQúWózN°UÏÇ4Ô›Ãíåç—hDsÏ°ül2¨¶öa/Š 2Å*Ž½ÙkÙ­›“Ù$MçQ;ÎÇlç—ÅÉï'ÿëÄÊlendstream -endobj -1570 0 obj<>/XObject<<>>>>>>endobj -1571 0 obj<>stream -x…WkOÛJýί© RbHÃã-EêUK¹@Õ[ ]ic¯ñÛkvפ‘øñ÷̬M\«ííCrœÝyœ9sfò¸3§þÎé耗”V;³d†§7É‚ÇGx>À§)ßy{»³qBóÝ渲<ÆCF8>›Ñmº7_$‹äMBÙy]‡ Õ–lš6¼¾ýŽ« šÏãÕéÁ®îÝÆþ…BSe} Üµ>8L}OrlN35¿Hè›m©R*Ô“rñ»]MèI;“á -ýkZ+O¹ukå2M8ˆMç‡É;÷:PÛ¢µSM£)gÛš-hJmU)~¶ì'¾ËM©'´jÅ<ð`ã/ "r[ÉU W»¤óv°Žðvaœ"i¡Ó6[©äÐÂÎO_¿?ûøñcr¯ƒÀ€³‘3÷EˆXÐc«[Їœ6@DÁFë1EooÎɺQ¢¯®N†‘|cm©ÝDn¦ª¦ «Æ:åL¹!l³Í-~À륦žø¼¦,iű¯*pí1ÙÐßœ×6ðéˆJ–ЯOùÈþÅŒNz2€8ŒQÙ¤4½ê ”xâÙ!s–|ôÒ®»uL ’Ô¬Ð5Ñ´[6[k»±˜šL.9òqf ¼ÑÄXøK~x`”›çëµÀÉÙGn¢f¹m@~ZÚZ[i)TšêÐ19£kæwg½gÌ¥þÂp…™ók…êÁî ¼{²ÃNÞ£\œ §æ´*QR4¡¯&ò…òÞø êT÷Gýƃ£¼TV™шˆ#àÊ?½+/•n ÓRÃIßœB <=wcDÏqT…éÚáÊá\³³µmËŒôF§1edÒWY­J(‘d]rd\lÎûËå‡h—ãÙ¥60uÃd:h‡Œx¡‘ãA•†V€3þ4%J3ÚRn_úi¿l²ýž´D¯b—Qf2°nó¢bXïx–GÒƒöž~ûçU¤×TþÅu~OY~6›Í«Må3?Ë­4 —È‚îH~{GDè oHB`YFtÀ|¾ÆGPLNFÖÐÏ<) ‡¦½Ê•W}œÚîÆC¨(z‘mI䶆xGÍ–DP1Õ{…0;‹›*HÕ£÷ié—á<šΣŽÈ Zs¹¾ëÿ4>s_0e¾ô$ÞОÉä†GžzmÛHG¯¸×*@»Çlk“êr3nì[PU¦O[㬫+´¼ƒž©{í™41ÜSZ©ºFaâ{TbUªú¡ûØ;L©±ŸÁ|è‡ÉÐP?ŒX3GtàÜ%ƒT5d›`e¯Tˆ£{ƒxQ¼ÜÜcŠe£rƒ5<£?¨C‹ Û 6lO"Å`ˆ=žú‚îö˜}N{O…V;sÃôï^wÞc÷G6|¿”/·ei×RQèŠwÔùÕŠykwJI’pH¿é¥aBÒ'(Œ&K\œ“¿ÆÉâ²V8æ,“"ÊÛë8ŽC£äî5˜$˜©d‚0gU,F€IY½†àŒkÛS Ûª8ŒÌxÖÕ8Ž^j¿ÝaúIÖµÖGtú±…Àùn÷\ÃÊ°Xy›l^h:Æݦ:O¼¨KÉ›Ú -âÜó uƾÕæ,¿n븅Ø@~Ð$Û阔Š¸ae-F‚í[ËCj0E»DHe€L82³]¢¶ÐŽ0¿‚¤Þ¤Î4A|™KÑø<žªlih±Þ×-sªFxÍ9~2©³7ÀƒR¤^‡„.àZÿPUÃ;%¶Nœýjê“7#ϸÜ3%òëCéŠ+ªîèRUúùnïZ6Çw¥Iî^_AN¡¶Fã²ò’ÕóYöÄüËžCvá%ˆe×^Ȧ…µ»€OÑ»àÊ鹋4’‘ÁóWBýš¯xMß y¡æ¶äál'„Á!z(ÃïG ÄiÃ5ä=`ÈsL tý{ΖhÞÕK¢‹«¯)/\pµ­&G)nË`P6ƒMkä>/XObject<<>>>>>>endobj -1573 0 obj<>stream -x…TÑn›@|÷W¬*UI¥˜‚M0~t”FêC«´¡}<`m“Àå–¤ôë;wà¸r“V¶%ÃÞÍÌÎìÝYD!>­´L¨hfaR’®ƒ˜ât…ÿ ü:¦íXã y©p&/âå%N ®²Ùû›5E1e[°'I¤”•î0¤¬8â V}UOtk¬Ü]Õ -µ]¥…ËwÙ=öÇEãþùb…ÝçÙ¾²„¯Â:“×Ü앸7½íU]T¨ÞrIù@\Éž;,à”lkL]éÙÁ -¶¶½ˆ{¬ôÖt’Êh˜Û`EuBfëd„4–ÁÂѱîM>R7êí‘ÄVúÁ¿q‹¼XáŸBÛªæ 2 ¦ï¦>;²UÓBvi€¢íÛÖtrB|4( ï¦§F ¤}Š!Ö -NÐÙ¦ãº(èÆ·C×,\¸®ÎýÉŒöã™/#L:ô©¤mÊG¥ ܺ<àÒ+|6£À‡ù5óœE(ÝA‘ìa]*½u–{1•«éÑ÷'„å={〠-Ó4J—oÈ´®ƒ;PIìžëš¬еqà#‚* -Ó{é.Vvpô­²^€Kòí· Ý¹è& -ˆÉ#ŸÐŽ‚³í…[àrv™=Ï\¯ÜÁñ`¡]¯íÅá`I§ -Ôºc>±0›J‚á·#›²ê0§¦¦¾ÒéÔG .§tI‹d:~w›OWL¤¹Çz„]ô kñähæ‡ óU¸~æ^1ñ -wP’â‚Âì¯/ʇlöeö?õžµendstream -endobj -1574 0 obj<>/XObject<<>>>>/Annots 910 0 R>>endobj -1575 0 obj<>stream -x…W]oÛ6}ϯ¸ðK QbÇIÜ}h—v+†4[c õ0Ðe«‘D•¤êèß¹—”¬(†¢A‘÷ãðœs©¯GSºÀ¿)ÝÌèòšÒêè"¹À_úã¿ÐÕ‚V4¿Lfñ¡¤‡£Ë«¿¼š‡—‹Y2Oüvz5å·³›ä[gó«dŸø-œ_.ðn¾¸Áï3ü·šò£7Ë£ów/ivA˵]ß,h™IIøKzüëV5^[š^%ô ÓÖ~O¥þ¦Kw²ü"[§7aëÙåå.³c¬&ô¾öÖdmê S‡¥sšNãR©KTµVäÚ¦1Ö;ò[”dÊÒìŠzC¦á½ø«‘›Ò¬UI®Z'©©sj”U•Fq!ú½ì‚Ï“9×ñ9ìø;¼Ÿõ燎ï]ìçÉþczEŸÝVYý£uÚ®Ž3«¶ô«“xü¦íÌTª¨¨ÌÅÈþ®9ðŸ¥VNßÈÅêû²+U£ô 7j©uü[Qã÷Jq·¤ê¬Û’™´­tíéöþîõûÿܽ½{óöc²õUÉ%_ÐÙ” ‚„*o-à³´VéãÆšq2íUQ:BØP4U&ÓÔõÐx*êÌì*þ¡íZ[ãºõÝRÙ8κêf€cuBvj—Úb­3´%çöúöáì÷ûOË{©<‰¥Ï®Ã!Ýç²H­Í7}J“>á+”ÉpO¨ÒŠI°Už]¬Žl1”–Šo Ïùm[×ÌdŸð JéZ·~šJ}«ÊrÓpN¥<'<“jcí‹4ˆÕ_[í8‡ÁáÁx8”ÉXrr,.,‚áU–|¤jŒ[O\špê±Yl–^MB£)¤­À|«ÁûQY‡´Àå¿PªD}²¬ußG”ŸMà¿îIña+;•S*{A ``{,oÔºÔ@ŽtÚ=œ"4¹¥ÚQãrül8C×µÂ5f ݸRjª¦„²#—Ä8IOŽ¡ ÕÇÞ9¼¦‡»7¤^—Ž-’…€—óÊú¶¡“êÀ9 ;¡'<‘ &ùéMi"¬p2ê•5("&ôi[¤[nuÀ8Р"«S DÁš<×iôÁÚ×`9äd ¬b"8ªGÉ ït™Ã=DŒÕ ,eàdêqb!­Ž…Ì{Ú€9žôwÂC¾\S—÷ 7$R?bÓcmvXÊ2ürÞªz1CrŒeŽŠX»Âo“jkT@ÇƃCŽ3Æî‘¥Ìû¡%°/ƒ„ÿc¸”%×ûQÿ\Oe-?ÇTLoSæÄ ”ÀdQßà—Bi>ÂÝVc³-ËãBàf§³±½ˆõÁÖ±MÎþÀÙ¼°Î£$ô<\Á·ÒíÏVºní4 -RÌUçxL8 þŽyÝ`ºÀ÷ÇÍzåXÀ؛ԔTëa$$zƒ‰†Ö¤îCU€ë¼I0€p„·Æ±2HiªÏ&bõ YÁ,nžwÁXÛë‚„ó0¹,ÄZa”‰ÈÇ3Û°ÚP‘i%Ç4ÊT8F Ü©£¹{‹ãÆ 0u-U™SrçÙë^xLK–#ÒMBç¡ú ÏLUGþÓGõ/œW·³n|ñÖgMò¢3ÜupƒÂm(!~Æc?®ySÊuì~P?(ˆ˜õ¹5Õ“H°Gyž]ò¿ã3‚zn÷¬*n3Lä05!û&¸Óg'R®ž{§€íê¸u\ŽâÜ™O¼ÕlÕ‚+Nsÿ`‰¨Þ!p‘ïe[?Ä’úœÌ™¶àÃà,6[ÈB¸ÎHze|ÞQÈSî#}¸8;ùÎb/E -ÜΉe*ן¾è aZ¬1÷¸ „kè(/ö2è£æ9ÍÝ a/?Ø"> F -'mÑ>GûÛa‹CD]¸iör\Š£´Ý9â#£›p`#\‡÷tò†‹H@@• ºc¢IÖÅ÷±ò\ºÕ•(÷üÝâðÉz‰o×ìÿ¾‡ç7óäæzœÿå5×ÿvyô×Ñ¿˜NM¸endstream -endobj -1576 0 obj<>/XObject<<>>>>>>endobj -1577 0 obj<>stream -x…VMoã8 ½çW>Í­›¤Ý$=ìa:³æP` °X`.Š-ÇšÚ’W’›ñ¿ßGú#[`Q¤H,Š||$ýïbEKü­h»¦Û eõb™.éöþÿïv[ü_ãã5‹‡ýâæñŽV+Ú¸²ÙmiŸÌ—KÚgŸN¥†™‰d)jƒöVÕú¦Q!œœÏ)–ª?kc©m4™Š:¿"ë"Ì“P*6NÒÏûŸ‹%]¯7éP>=)ÛQV\ ´ÍåŽÁ8‹ß±mÒ¯Ú’)¤ñÈ¿jÏ¡œ³oªp^á k½‰]JûRw@÷µªªnôùª*“Ø«ÛtÍØc*th#.ИQJϪ>(“!¿\ÀMÆÀUT™É”4¡*=‡$¥¿ÁƒDÛ'6ƒe–(wšÙL¢×š2g­Î"RN˜gUG*gd׃ §ÏÌ3®P!Ùã[GÑããF?üõgW´ÎÏðK¹AvÑy£ÃϤ˜w‚“ ’œÎ™`†Iø!ýžP¨)"-pnµÐ<1Æõ€­¥¬ÔÙËp·õv†¬ŽÊXÓÇr÷½-µŠYÉN ×"4qͱô|ŠߊÃC…ê\aÆŠ’A:"d3éå; MTu©$†¥ Jνnœ‡N¥,S4½þ¥@‡0KûÒmÏ܉d6j!\ÊIå:dÞ@¨VMâûËAEõ)ÁÑ •ù QßÐÈírícÔuÓgV¹#Wž•Ç5»¼§ ¡CßRÆIÿRYD‹½ÇF€çŽ˜OŠHGŒ†Â»Z z&RBá…Éë¾ÃE{—üõg™–xߥ=Œ¨PX)Ÿ:[O³æÜsÌ)Ð w"/‹&P>/XObject<<>>>>>>endobj -1579 0 obj<>stream +šû+ óïÎgªÀæ‰2–4€HoéáîÓýÝ3¢ž2¢çvÊŒyu`SÙÖ>gç @XoéCx´¸+ß·¾Ôlµ¼€g2ap¼t/oÖã†ÛMeº˜F‹ù2@n9á`Y÷~ëý wô0endstream +endobj +1555 0 obj<>/XObject<<>>>>>>endobj +1556 0 obj<>stream +xu”AsÚ0…ïüŠ½•ÌÄ6;Ǥ)·vÚ ™^¸i‰•`É•d<þ÷}²MÚÒ†¥Ý}ûí[~Î2Zà›Q‘ÓrM²ž-Ò­óeº¢UYà9ÇÏ1†ƒYžæ—÷ÛÙÍfEYFÛr­Ë‚¶Šg± ­œo´ÇcOžµ …ŠÉ÷õÞµ¤£6¯ž‚¥ÆjâC<6:ë^ÉW±§Þ¶Ô ®IE>èQÔ{‘^m_f Jò5ÔnÕüɳód =|":“iÛz­mkâ{cMR£JÒžj¡Wã;‡ÐHç¤%ÇÚ „Ñ·à‹"!€}'úªð„³ª•1‹ánÊ]Pƒi8ƒ;çŸZ—““"-3:Ùåë‚þîz83ϧÖ9X%‚¯Øñšp_pZ=‡'j?4Ø×qÜdD±ùʶGEðx¤t´;)<¿« ¡æÿ•rÖº(ϲu:ôÔ´®±žýõØë䢞dÁ‹pVd0ò= ÏgcOÊ*q‚É;Ì•nâ]X§aWkXÛtƒ-õq Ñ­5 ¡Øëg÷©É q•j«ôa u¹Ëz\¦³Ûûw1œýƒD9M-[–iy»¤¬ÈÓ2Òz¼ûrGßœ}ÁúЃ•m1‰8“ÁHÙÿRå’’bqïÿcóU±J‹u‰UÀi¹ŠAŸ·³ï³_®‹endstream +endobj +1557 0 obj<>/XObject<>>>/Annots 910 0 R>>endobj +1558 0 obj<>stream +x•WÛRÛH}÷WôUkª°l°å¼vÙBb§ò°ÎÃXáI$ÑHö’¯ßÓs1Æ1{)À…¥Q_NŸ>ÝzìÄ4ÀOLã!Ž(-;ƒh€+ÛO¿vÆq4¦óÁ$QIÃAúoM;ñÙ×Ï’ÓhÈwG“(ößø.ìÐp’Dg|g&þÛö^’اÇ|µ¤¼óHñÖl\üO%4Nð‰ðú×ñ9½ÓôÑÚ†iv÷âñ·³Nÿ +Ž4Ëad4Nh–ÙŒp%í^.Ū‘5ŧÝתjTõ@ÓvµÒus<ûfŸÇîÙÞéüϲ.Ç]WM­³6m”®ÜÑ3Šct8F&8úV>¨ªb£Õ,©YJdær+¤0ò„¦¢\2Î¥±'*Ѩµ¤/ªÊôÆÐÝŒV!´R¦KQ)SR媥¬™±ûõ—o­ÝN{Ÿî/iÞU‘Œ¬Õéý‡7Ó)U¢”­ÔJÎ9i¹Vº5´–µA&†tîcÒUñÃ7¢ºÕ6”=Ÿ©( +ù‹ÃjŒìgHWd™bˆDAy[Y´D¡š'Òk•ÁðâÉe-7bôpªÒ¢Í¤yÆÁÈ^°ìKD¹® U…£lB=³Ö”«BS½ÅrrÞŸ$ý»Y8±ÓB?CíJW”ÉRT™M¡•úRöÆQÂMdæÃј8ŽþU(´½¹…ýó*D_xQ®þNQ/²Ìq~Q?D¡\÷_æÇ„¬øðuiÍpº #-%w +=ïÖ2ÇÓHpÙ4«7ý>HÁT1‘ÑmJÀó £J6(µ ýeb1¯ævoŽÌSÔ³Ìúdø- À™tIÂдuóN§÷’¬Oè}Õ–¿ë…™wçÇ'$›4Š"ä<•’Óõä 1ÝNßÝ¡¶iËGG D¢ y–&«¢R¥µ6:o¢T—}Ë…RC4T…¼K÷žò°Ÿ_ãîÅýõüøCDð(ª'ÚÈ£FQµå”/ŠS¶ˆ€ß @Ø6ªP?8šYC¹¬îùÁùËà0ŒŠBo¸‹o§ôÇ[XmTZ ÒpÅ–g)‹©œžtk=gz\·]yµâÝ¿yIíÒozƒ”ö"ÛQCã†å¦ÏˆcÐÊZØÉÁeØuÁ6žåÊòrè+µ§þjÿû¢ï“4ýq2éÇýÁyt1½wf'Ø<ž'¿hÌìˆû:Wmm{Ê=÷É 1Ý1øGƒ¡•†?-KŽ¾ÒÚDä¾ÈúèëËÈ{,êI48Ÿ°šüÃL®%¤‚Ès½ØA±%ÀõgÌ ô_‡@pñ f™ +ž±ûAâ»á3¦^«TRZKÅ‚Iðžüµ—è8nÐClÞ‘E»§Ãm¶‰åbÏ¥(ÀlƒÖǦ³5õÀf©0DüŽ`ÐÌ"ëÙ…D8måyZ¡-„14æ¡þd‡X¿…xünÖ†Ÿ¶ÐS"à;8‚m·-?‰¸W€ë-¢5`æ=ÒUÁ»ª]»{Ž î0'ì;Õ@»£ß ^†V0ìŠ qFMq߬dªr·8{Ü¡(íËÝøèTÙZú "ê +ëZÐë  éÿJÇå²è†’e€ÅI4¢ÊdAVo KПÔù(§ÊÏ8Ùò+ ú͘£ÙC³ £Ócû»ù%Ó—†î{% Z;ë^Puö×¾¾Ê9å=±òW¶˜ ¹ªñÉÊ5ÉÌ[ç®<úºø ®lþ¶r¨¬«2þAKg°Émɳï¿`åg%Ä ÆA‡‹}ÇA×'~!À[‹jsG¹#„œŽïjBâi NñB•Xàþí=èl|G‰Û„“s¶ô~ÖùØùò£o endstream +endobj +1559 0 obj<>/XObject<>>>/Annots 921 0 R>>endobj +1560 0 obj<>stream +xWkoÛÆý®_1- +Ø"ŠÔ“ºF:ŽÓhÅRÑuQ¬ÈµÈ„ä2»¤ýñ÷Ì.I1ºJp• árwfgÎœyðÓ ZŒi2§(øž7Ý??‚¥·¤i€w”ÓlÜ-2ZzËœÂÙ{A0ö¦4Yν‚Á<ôæÍŠ%ûkì.}oÒßí­sèpšX6´ª>ÔC4˜ñ¦]YŽ5v'¾ôw{kÞ]zpü(Û[cw6g“»ÝO,pÜÆß;žâ ¸î‚)½Vô~0/áËÂ3˜7Da³bóúkìΧޢ·;CÛx:ÞÄõna%KÄaÆrö ïõ–9-æ¸×[Â' <Ž›g} +a¹siæ\zµŒÞL5mžàÿ<\Ð&¶,ñi]ÖFÆ´=Ðïi«½¡û •:-*2R?Km¨Rx¡žÓX’©ËR銞”v‡¤¦X§8F-2%âÇދ͇OÃñžlâË?UM&QuS®âôé@UUVû…!“o½HOô”f’/qlOì2µ•B‹\Vl‰(°£(ÒRT8 +-O*ËÔ>-vVº¹„óÅ&ZÒã¥z¢HÕÚÈ—dT. k–íÓ³Èji°[G C¥¨’ bi¡·i¥…>ØË7¶’´,3¹}Z%'÷ŠxC6Ò©¶€`™´’/þã7>-]L† ¢Åê/çôß­Fôƒ'„ßå2ß2 ýE%â<-h§U]¶Ã4±ÍäYù[0‡¦‘UH6Zê*•æ¬´Vª¢ÔPš—Y¥UH€Sá·¦\œüâýH?5f7GÇÒþeÏýpÎqGµÑ£LE"‘oŨÑ|ÎÚÂY‘ú±ÃYw¶T—ŒÔW€d1©n~MÉ¢YDLDÀâȆærº«5¸*uZ^2ç +ÚK*¤ŒÏuÅpî5øAYjª è&‘ÑGÇsÎ s0•Ì AÊScRUØÜÌÅÇóá6°ÁÙ&"ð‰æ•›,VØf"§ n»ã´HÏÁyÅqU@3æªZ:4ŠßRÔ —ç"3Šäg¸qÞQïÿ Î „ åÍK¾˜µökj “hƒ¬v[¨ï¶Ü]u|)sÉ.ÙÒÇqq†ÉZT¨h”Ég™ñÛágKöœV¼– QÒ1ŽAS]ÆÈúÖé¦qaCÖ6’–'­¥+`mõ{¼œ=¾ *ÅŽëšF±DüÒ9,‚8þ¶äj+ž£9-¹ „–ŸêTË\"ðÐáÜŸµ¸Ðÿ¦ÈÐKŠe)‹•¸48]ñbÜZ+dì1k#ƒB˜e„ò³«Q°QÀÿJ aÁƒ-!L֜ϸÆT “lFá"G5½–ÖÅÑ›Öîµ~€&³ôBüëºJ”FC¹W.G†èFAèù3”[Çf°UËîT‰@e{b8?{­ÐùÆà ¿ØQ n!ⶃr2YWN¼v­¨í/Ý2à«èM/tí :Ð-íÔ‘q9à>4“”ùÕÝöÚª9¹îF•F_#ûÔÌÔŽáV–…=L£24¥{GŒ–ÛÉ^¡d1ÓÑ=z×5Ó“kq— ½Ò]?’ÅsªUaé·O$…èCº¼=ئWñ£­å¶—ª”Ö¦¸ØòÒ€Y¾ÍƱIª.'y(02ªQ9 ?g3ªïšG˜K.q´½-Á¡3 ó_väÚ%ò’+߉ÃNÛô +}â7ÄØ µƒ +ŒKø¶¥³‘6Õ½Ì2Þ¢rcæh © ÔS±;{&¤Í㌫c#k ØJäµW*_ð¿Þ% ‡$´ˆuy²ð‰ŠîÚrÅ5F|mìã ´Óóºïø*ÌÍÐç*†Ç¼Îª´DŠ²9q‚”ÐQ‚¾UðcLÍ™ÍgêmŒBUJcö°$h¡k†› ):í>I1¡E ‡4¨Lv”¯ÜHtrmc?ÒÅY…a®gj°-;n„ä*€R€E¿P£¯dïåçÎh‹Ic5Zr¾•ÜEx£fš¡€¶Vöï·é°OMÒCº©qgƈ!ÿZ/{³!χÿŸŒÿçüÜü®èû^¢çß]öî~ê·rüOv9-ÃoˆNÆ׿®~¹î¤{¢(e×Y™ˆ®ÿX}SÃÛ»ÕºSп¦¾ïSzµº9 +ŸH¯Ô^êÕ•?æt—KoÚôÍæö~s÷îþ;z¸}ÿÛÝÃíkZÝ>¼½[¯ñrÍÈÞ„Mÿ ¦S/ Ç4ŸÏ½ÉÔŽîëë·¯®i¥ÕP_^Q͵Ïvn–ó…ç‡.|Û†nQò䌯HaŠæÔZ»,˜.ðu9ñņžÎùÕífð~ð_ ~ºGendstream +endobj +1561 0 obj<>/XObject<<>>>>/Annots 926 0 R>>endobj +1562 0 obj<>stream +xWïoâFýÎ_1B•Ž“‚„é—*¹\ª“.¹ôàTUM?{½Ø»Ôk‡£}ßÌ®Cr•zŠH‚מoÞ¼ÿÝÒ?CšŽèlBIÞD\i~}þµs6½ˆÎh2>”Óxt‡oÍ;ç³hD“³a4ÃáÅ°ùÂg0Cçƒa4¥ñlŠÿGøŠVr0›DÇׯÓ›1 ‡´XÑhCšÌàp2£E*a h‘ô>²Eª +*-%UQ(Sf{ŠÓ”b2jGi¡ŸüéÞV4óeLëʲF‘]Q¹ÃƒÖ¤ºÔÖ8Ê+Wâ†,¥²¨ÔÏo_;@£?šDcøí-6Šâ$±•)©r +wÉÓF%%ÿ[âøÙG0?áªtÊîôÐÓ‘Šp¥°¶¬=¼eO§7Iȸ?f\¸|M¦äOk<ä°?<Ä?Ó’#ÊU¾4ŒÂöFÁo[hSª‚¯¨q§¹6‡±ô(Ó®ŒüÅÃðë_É ?šEà êŸ]DÎáÓ +E¨ +§N$„!¾5ØRWê,£­uN9ÇGü°s¹W:Sò…“qÕ2Õ,ØB+w”ÄR—úSrü鯈>«€E¹‰Qø`kä6q›øENI}ß*FM¶CË=¥jW™O¾/$*¨Î™æ“I1í6LÏrF_¡þ®_ÚÄÅ“Æí±AÎÎÙDË͇‰œÓùüÎìQ´ w”#›Cm+§Íº¦ÚCÏß)3|Y؇· ú«Âæ0ó»6©Ý9º[Ð8œŽ)É4:.¢O[e¨{§ÐMÅãQ,wJ¯7KTwcmÚE»R÷vOá^ºÏb”±+‰/ X‡*à–ÃN‚ƒ,3›4XúTOŽœšøI¯qOÝ•Ý{OhEQ2hFD 8nc+´»S >i!ˆ3!5c‡î­r1;ò¸L6Ì4”1œ¢Erhƒ[Ã(Zºšå‚†Ð–„>DSä…;?4WeÉÞ¯E½œ òþúŒ/Ö™°¿g„•Ñ´–ƒÿÊB›#p߸Æd†vÜgÂZcAVàQ§ôÕkή´Gi—<¢ÅF»º=|‹ÒÝ—É•(ÃZz6ËìN"ŽÖ"ÄuÍèí’åþ‰ ñnq:`"yÊ9±%M—e©ò­„¾xÒÐþv‰¶…ݪ¢„˜q“Ðn£“ råŠ>Ç\Ï&OAj€vGØôQÞª(@ÛŠ¯ýÜ8½™5åÚ„r­¤Í¡'ª£$6c‚œj·Íâ½J=|õƒ«î·U‰^i ^WÁò“Ú¸Š¥Ržh·µ6{!Ü­ô%“C×Vdjcª¼`Rð a»ûå%ßBNï2<¢ûm7@CŒ¡bIc¬o#D©ì4dø;UÚ‰Öx,vñþ%Ñ|i J!Džmpð]Á¾‡¢=ÿ€oìrµ &¢°¬ÊÍÚÀ¯5àÞ`–©øc³z®2^š EX»­¶¢:Ü MQCr.¢^˜Paá)ÝQ&þþÕü½ ¢ž¿5-?¬B‰ +òÌ€ÃÔ}ëøþ#n§XÚÍíZÏ‘e°T´Ûšßf“îÉ3ŒRéQëÀ!k€ÔdŽ™‹ÆèR/kU¨£h‘ØS«Ö€:‹Kç*̱µxóC·Y$„k‡KW+ª8s–›0^bîç6Õ«}Èçç®J6G)@>.ß}Ä®®§G-WßKûíEè´“ÌÊÄNlž£E<àò¤m° žFË;Ù4Ç +ÂÌe W¶ ¿õ + +!'üBßù®%ž ý}Í aäå‡eFv!H“ßnS åËyüÈ…cá”é$AFt%»‘L!Ž™Í‹8Õ¡Æ{öÖa-Þ±cþ”ØÖU8–M¬B`64²'¼¿È CÏåËKäÊ_®÷æÞ Ô‘“Vv]åÇ«Ó©¤¬gù-2‡áC©•ôkÚÎo¯鑘NjBh¶?JØWɯ¨ÜÑ.³o,pMC`-×üÖºÛyÿóý»0ež_yo¬0€|ÐðüšSîŽÐÁ~æ!WÅ{t\HOX|×°ÁBˆª*·X¢Ä·¬¨<¼q=2Œ*¿!×X ðu亣Xš[)qÞµ)ZãEc‡0 »m{ ‘½ÇZ»Ç«[—v*ËúL†Ö…­¶RÛÓ›Y Àp‚÷ÌÞV‡xœóf4¿¼½ºÏíWÖàk›-SBĬԧ_?ÒŸ.øþÿ½§ãhŠTQÝÙ”Ax¿èüÖùâáñ%endstream +endobj +1563 0 obj<>/XObject<<>>>>/Annots 939 0 R>>endobj +1564 0 obj<>stream +xµXïOÛHýÎ_1Bwj*%ÆNBb8)ôšS8’–“’~Xì qk{}^‡Àýõ÷f×›˜t=©¥‚²Ù3óæí›Yþ>ÈÇ¿€†]ê (Ê|ÏÇ'Û׿ƒÀР{‚Ÿuƒž×­G)Mšċ^ÐœmŒ3êùC¯×˜…êõú8¯ñ{ߥ¤åAoÀ£ÀZt½~=`ƒaFaè…¹Æ0£ Ï~ÛSxcsŒYXlnmŽ‡l=0Q6ƘíŸ¸Ô ï„‚F&£>ÖëïmŽ1{Ü÷Ž³ŒAòOÌ p€‡†k؇-ø{<€ 30s»!{{‹Û¹ÆsÀëx7tC€Ò½ÿ÷íÀœ¹Z8/XÈs H=ÄbðwsofGoŸfKiâ—ØpȧYÔbÂx=¦ë¢PeE‚RQÞIÊ×Ù­,I-©(“¼’¥~=û‚“úö¤Nwˆ“Z—¹¤D뵤j%*Z M¢L´Ì)^cç>–Ë{™ª"“yE–H>x*²[Zu±ß¬Ê¥Œ©R¤k_â2¹‡±Ú䩱ñÀ§Žá8,/UIï¿ÒM/=ú¨Õ›$Ç^M“®nØŠV™Ü°›bóu#JkM<ëi¢+ÆKÊhŽ`rR¹ä¨6k0¢¤õÖb4Þ¶ù, ˆd jQYDQš xøªeUÇ©,yü×E0|˧×`ÈʸWoZ«(•4ûžm’jEØšäºiŠÍv‡G3$`©ÒTm  DV¤&+µÁéø,Rë4f»"‚_ÀXÉøÔúæÓ‰K9ÓÐÿB<ÓÚÆE…ºSÔùH¥RÕ¯ZF%¼îDt(Á#ë‡>ä-ì°«3ÎU&’ül>]OÆ£Ït9=›Ì“‡Ï4•%ò~6ßÄó;"ozŸë3º,8cÞHñC8pÓÎÄ•¥.["ó¥¢ÀÕðƒø«^1A"OiþîŠÞƒ¤åˆ¢ïCráQ"5]MçÀ°Ð‰®…þ49Â÷‡¿ž‰à¥ÒiÁÌ¥K–ÉÃ2wútî?„€Ý÷ÜOÖ䜤ù_W—¿_.«¢cüzvq,uT&E•¨ütn×ïïkO.éüzüéâšFŸFã÷£7ï/èíå5ÍÞ§tu=žÌ.®ÛÏžÎW×útîf/¾ ÕÅbïJüf¯•¹9;pñÑbqø231ù3²2]G‘Ôz¹NÓGÖ.Úz¡¶7›^vÊã›å§Óƒ$ƶêô=Å1kÒDn¨¾Išîa¯qµ¡Þö oªÏ›GÔ–¥X§U»®'j¹D±"H «\¤WkÍ “º˜ä棷¨íV uvëE*_>5Òâ•\½ožç²”Ʋ„ï©VRT #«¹Ë%÷Ѩª]ëê[3¢8vÓMò—¢X±æbµIäX³B«à'Æ=ôîÀª0 ;6å2B9à‚Q²%q i7U´‘9ù £uuÏé²yÐÅâÅ÷;!¸‹×°ÊE$Î’a•¢Býå°::ƒ«vŸ¤ò€.Z‰'=£ù„ZlÑCdAÅBîìq{È.^×̈êÕô{¹Ê¾è†{Ç™ùmä ‘ÅðŒå^£Ò‚›œÄš&/XF/·fÑ:èÈ‚“äc4%ÒÏs±¬±ö†)œ¹}èÙM±u³¢fªEÝ4 {Á¶¡íÑê…¦![kî½îáÒ–ç÷"]#=Ì’¢Tw¥Èh¥ÔW2kuó^³9ÆÈ¡ 'y¨u%³:Í6ƒîÊ4q$«èÈìŒD±—g¦…(`óèYh æhð mÏwßÁ%à Q>ÒÀ´»7+´™»6ŒÑ_–*¶ÝjãÒ˜H¸dìÈbôm%(œ«ÊÞá¶õ|׳A¾iÍÌ¥tW‰²›¶”ŽüI‡è icJYˆ’ùcA·G:œ[/Ió¨Bv +t‡ŠR1¼ìR-uVM ¦§5éd„Bì¹ý‚Ô0µ@¶Y%dY"wèÒGFFè\扌YaÐÜ­KVÒÚe ¶Ge|@{ý<6ί=jrÚÀÝŃør£jT Ú–›;‡ð w•|¨Ø36òTþÚ& G—¢)¬:qS»Î«}þÌVÒ Â„á¦Wr1ÏöóËT"4ë Éä÷H)3uÏõ™–Ñð‘=}¶ˆÔH8>ߧ:'¢nÖ-¹Û³,ÝOӢᩄ£yþæ}õ¨Ö`¢Œë»nƒÚD)J0'ïÕ9W¯°8‰Vœj^ FCk ¬ C0ÀßBü]bX×ÕéèÛj§ú‚²Gç*Z›¤qƒÇ;;nCgèãÕR·ßýÀíã>„x(ckò‰³ƒ?þ–º Yendstream +endobj +1565 0 obj<>/XObject<<>>>>>>endobj +1566 0 obj<>stream +x­VkOã8ýÞ_q·¤#VÛ&Mú©He Z`»i5Ò~7v©g;c;¤ýñ{í$¥Ãc‡-6ö½Çç>ê{¾·BèãO“cH²VßÇÇÑÈÂp:ÁÏþ)«ÖqÜ +Ά†¯Ðe<@LÍû}ˆ“}³f°YË”A®d´#a#Õ7ÿ×ø+zöá tìECéþÞ/Á’‹@¯­AzQèÝ:Ü$ŠçÆp¡™2@@° sa˜&ŒzÀ-ÜwK ÉýT&$­€Â¾?u@ÍgðÂîEŒu¡ÐŒA²HŸ2íæw ìî®{Ô½&˜Ž]皜ݕTpÁEq¿ 1@CúñÃ.P…ç«göG]°‘.EÅÝU’¿ã žÌ±rå–*J»Æ]Øpqp¿ÅªL¶Øq¹$ßè#ß0›3‡_3ÁbàšÑOø†›ÚÅï*²Í6e+Ý@]\Ÿ_Åç‹YÀL¼XÉ“y|:ûB‰að[çs'ëÐ^çSç²só¥y±˜¥ycíúô&ž_dz6¶’ËQšSlimˆ2íÊv9üÎXŽý–Èü¡“äàÕœ?ùž%×0݃9¥Ok`{yëÜ0fÉZB» ÿõutô +¤ýã…‡ãëíூj: îˆ +t.e`6/zñ˜·€f÷³þa–â?½~¬NÓ[@Ó|Z®M²%qÌ]³ÞÈÏ•8|LÎ ëÆ0²HÖÐ~­ ˜,/šPê{DGÂFÕ±èÞÅâÿ­Yfß(W°Sœ£3Ia‚÷öë–5É×,÷\{¡ ÿ Yj0ª¼£wyÞå=|—÷è]ÞãŸóöª›íç¼÷àJšòNçv^p ø+£Œ6ÊS6ÿNï§|èlé'R¬{Ígø, noBÅL¡Þ²w$-p/ ç@25£(Ü@ƈÐNA @xn®—艬¾ÎkKv}Ë%8;€e‡•.½jºüÈùpc¯ ‚¢ ÐnZ=<½È +žý¿¸ r£á*"+}ÜUv´0¥QIh™p;§H9æ7ܬ¼;œ!S>Äk†TH•‘4}cG«à8É3;º/qxØ­ˆ$í±ÿ¸ÄE8;¿8Å7˜¾_3Ï + +)Õ‹™;maÑ°( C…€ví 5ŠÃI!Á2\ŽPû¬H‘š.H‘n_u6&¶¶uX]'N(´ËÌ=ÍZ¹ÝsÇI[_ý  Ëj¢T¢4°%VÌE^¥ˆ Š¢ä1²´#ØE0 eÛ” ÷÷‚+–¡ ´ÑÕIRŽ+Ûf‰Æ¥ÊÄ&·éÅv*ÙnI<“¬öc82åâ¶m…&SÂ1f˜¸²„å·e³f6ÌTÞò'ò³J[•^GZk~+Pibóg˜fž[\•êÒ§’PX’”ˆÆ´ÀŠð$öV%£§•Ç(Χ”áý2Λùåñ;X~e‰™6AN)Ú¬öj‡Þ¤BüMÝ?œ ýÉxŠß´ŸX˜Ó¸õgë_ín†Qendstream +endobj +1567 0 obj<>/XObject<<>>>>/Annots 946 0 R>>endobj +1568 0 obj<>stream +x¥WÛrÛ6}÷Wì£à%³±B¡ˆKXÙC,h`Yþ“(7‚×ötÜxæ·C—5`m¼Et©¤p §³ád•Œ×4œÍ¼8ë˜$ô2B+ú•§íêm‘g$ÑF`L‹ûDÀ#˜³D7òhsØd¦’ÞYð"+]N¾ILìKP¬és¿¤=„ÝBvÒ( úGG½×ç ]jjö¨‰gìÍ1ÝÕ«/ªÝOUU²ÏŠõÌ£äà0JÇÒ +lU!›g`Ò€ç\¾Cák •¢pIKÉÆ´9z[º/©'ì¢oÿ^FÚ5[¿’¯ °7A¹°bÃöÞù¶+ŽÜÔ¾·¦—ÓB[²¸ ,€þLÓ+*e¶Z5e“Ðk‘í{LEE°§°¸‹ž"íaß A4É”ÃëóÇ¿q¬‘Ù>„Æ£ #œå°·áMp1þêEfi©â"=¢¯ìxTàôßêöêm(Õ^ËFe©-s!Nѱ'ú”p gat¿ñ8×¼Ô_ôV][¨ÍÝ3´ˆãiÓkÙÐÂÆԬ— m©­•=R¶—Ù77©Fl +™?¡”Yº{é\ëµ¼ëUŠ¾Ïw?Ýì!d n„*8±…g²N㌠}6Ã??|I?$U€(:ÏÀ×ËýºWqò ­<*#ˆ!ö·ô©”65Óv0,@È™èöH(³ÛŸ©ÀøIW²Æ•Õª²¿Ðä Ëô¯ßˆË/'̈&JHßµÒ­ÀˆFŠ;¡«ÿ:6ƒ.8Ñx=ƒ¡Ér}g 8J)´3¶†c4ÁÈæ=3á>-)±Oa*Ìö¼“Ç_ö›F©ŸúdirYLLgÜ‹¡yÄÎp§Í²:½wZl/ò©ávggUw,÷»0 ±€ÀŽÊÀI§ñÇ&Å«-ÆIØ£¬0ÌÞñ“áìŠ^B¢6mü‚˜Ÿ ß(~†àDo?|Žt»¶®²×Ñ:L–“ðì%œ ¶ñÓ KÐ[LŒPá +Úa`Óºësu2/ðÝ·šâKmî¿„>=÷â9¾ÌWœA¯º7ïÆ Ãåé<õ­2[Î’åbå'ÂõˆOxžýsö9¼Úendstream +endobj +1569 0 obj<>/XObject<<>>>>>>endobj +1570 0 obj<>stream +x…W]oÛ6}÷¯¸ÈS +Äògc§À0¤i³kÖlqÑõh‰¶™P¢BRvŒaÿ}ç’Rb«–¦ˆmñ~{îáõSg@}üÐdH£sJóN?éãÕ$™Òx:Áë!þ[IËÎûY§wݧ š-aq>Å‹Œpºß§Yzú÷›ÙC§OÝA–³ì”øgÙ2Mµ’…G¿HO~-I”¥5¥UÂKªJmDF™²2õÆîè˜öeŠ`ken`æ¤ÝH{ìì1]¾hb~þ9lflh©´tÇ,G‡ÙÞ8WIG¢ Ë,»³ªðÒ~.æ§ó7t{ßýãîªåçŸúýpœ3 +ã#.=~|ÞóFÞH}%´Þµ<3©• ×ô8>Ô»Ó`»Ò†°_ +IfY4 -sG²HMÅ62£íZ¤òÐU¬ÂÑ›ýúùv>¿óùUe-xwe +o¾—Å×óy(h>ÿXl”5Ó3:=àxtÊX!úF +±ÙÃEè­Ø9ªaÈ@®züc±³5ú‡_Žÿhh%ÊWƒã0è‚–h[“vý2‚•pˆ‚úd¶H۞ѽÈàºA ÂøH¤Û +X'Ã` à{Á‘èh%zŠ!b*¦ª©¸è#5“Z΢\%43né© +çáRf?ב÷  y`œÂ`zY–Q.PŽV¹òÂó@á¡Î3`†š^¥E8(É£X¡èzàiaüšsn~ƒbõAw0Ùo{Ó…Y¦³÷µÓHê¥0¨¾u>aÿ½ë Lj½#—£ZýA‰Uaœ +×C8‡±çÛ®;êGAçp­!3k²*åê£Ó}‚Â;‹'ÀZæÖC|©UeÀ xÖâ‘ÉEµŠÕ0°¸£\o ôà>ÃM4_´}Ë`‡æuöº´&G÷·ï‰â‹¦f_¼JÏ+xTÐ +"t]XÜY”k~³fA.'ÁZ±kAw½—°/—zÀ(6´úòxFβnHl‚¿8L+¦V[º» +ŒD¯¹0¦{!¡«0DªÈÎ3‹e+ÁÖ°5-ÆìÙ½ö7…ÔË3ÜôPaÌqe™å*ËpgbÎêûàÌX98ÔŠüµPϯþ]µˆÒ™ÔÀê#±šD¥âõ$VÍÃ5þT +×HY8€’ÏQ è$ × +šš™f' }ã‹#\€cRUÉè!ëv—fˆ¿]¤ÀdN£NC* 3ÜÍ“Æ[W‚çËئÜ:+µÜp‡›cóÓíZ¥ëcQé,Ü0­Ô‘R}å4>‰A/¡ؼ„•ïØ`oíë9æ5‰èûJ›…Ð5n÷wR<>„‚ ºà4Z'ÂrYèJlAÇWLèò‰,Ù»Xac +VôTÉ +cq¬Žnš8®K›zè­Ü`cô`GSÿ2Ëÿ³2Õø‰zXÄz!•ž.³žã[&"¶¯RaUä&/ÖfËÝ´T(¬y`DXkÄÂTþЦXo)˜P¯ SoJTS'MX>"òž˜Ï´ÞøÆÑŸŽðµ¢^%ï/oß_òZó€­‘>˜´âë/Ü6lÙm º“>9="àãÉ8™œO!ßx~1`³³Îï‘!åendstream +endobj +1571 0 obj<>/XObject<<>>>>>>endobj +1572 0 obj<>stream +x¥WmOÜFþί˜’Ð)ç{ ´ %QS© +-WUðam¯Ï ¶×쮹œªþ÷>³k‡mÔr/Ø·;óÌË33ë»1ðÓ|BÓJÊQ4¢ÙhMhv8Çõ#)Ûy»Ø~Ñ-2Hâ"%ìh‘ìSûw×ÈFi›RR¢ËRT)Ñ€¬Æ‘ Ú¨ÊICÚ„Kòû_-n {FãqP>˜@ùþûÏ¢¬ y–7ЃÉ,šñz‡é•nÐNhØX3ŒU5,jC¼Ï÷jÚ³¬fDƒñ(:Ü–.ê»,Ñ#é;Fø7iS>ˆ?’ÆB'}ó ¶÷¾}V«Âû“o®ÿ· +d Dò‹@_ˆ2dsÝ)Yépau%âBR*3ÑÎR†œ¹\ÂÔTÖ²JUµ$]ÑZ7†ìÚ:Y’[×ò5Å#…·­¾s”B™{½•‹è#ÿJ•övp*¦ ÙTL(s¹p¬‘rq/Éir+)n[X6 Ð‰(oÀ;¥+Ñ"ßÄÎv.ˆb%Ö6(Éš¢Xw±kñl-•)™R-\^‰RÚ×$,ã-Ó˜J±f3[3<‚12qt~¶ø‘îEÑHµJ'¿çÒGçÝè˜=±ÅE,[ö§¯9<+UÀ¹•ØŠØÕÚ³†gõštæãÇá@°k¬=X­ªžC¼ñ²­-{ ŽND\}Àj3ËH£tªÄ`…‚ ä†ãØÖ‹®Y$=-2ï³Â;{ðÞjh7²Ô÷P(2®qoXò=}Ì67” UøH‡`•j™;Ê -dæ npWHKŠý]6@Š¼;=ð¯q.$e–ú˜n—<2“J˜[ª +ÂÉ]N\Õ”±4» …UKŽ‘Ó=XÏûÐyX ^{a[k]HÓçwï´@?@?Ý-Eb´Ý…(¿DÍ¥k±ÍŒ‘u!À®”ËIԵрN¶Ü£“ Ö®½2vÌg°gãžeÍyÙVÇN2ç™g|ímöAÆ„`%èià˜ó.´ÐÖÕÃf™–‘\{7Ï)xñU®’œ;*°3£ÑT ˆ–Ö *à ?Ñ#€Ñ`:õ‡f2‹&½“q³\rwjáñ_£“•~<3sî>Ÿxô .Ö”e¸Ú r×ÂjbÈtˆ'CÀ¸­Þí³es‰Ê¶‰QuW;¨`m|{Af‰AYa_f´6çh“ÆÑYÅ‘dŒ!°í–ËÇ À&K¡¦âÿ08]Y-Zo@Ýžš“qäg2OÄßøéºÙØ9µ5X_ÐJ†îf°Ý“¿0ó9ŸÆW=hkžÝŒo•Ò ¦Ó![…Oä­zBÀƒ™&ôËîÐÁe =ž4Ô²b)Ÿ:¼èjÄoïtø|²½Ù®BE[ƒï ›6NlÎ /ÇôrB“ÓÓo¿tè1+} Ý8 ¹¡@=M0 |§e*´î?00ybù.ºiÖAΟ0¨’2õF“æ³DÖ‚þ +R¢Ý2³¥ì|hG${dÁzׂ†þîC„ž÷ì¹,ŸÓŸ³É_´G2É5åªMb®:”–*aç”wÚ2N +êÓpè§|®­«YOD¤©74C‹$UŸàDǯʼn°®»¼yCU)ìí ®¢î3ê©;G‡_!ÇÔ[x§K¡ª“˳‹ÅÙ¯‹kútqrù[¥>_Ó…4˜R'—¡Oâ|ͯ{Âp昮®NC+!Ÿð/œG7sœB.în ŸBr5ÏßLgtµÏ‡ñÛxh¯^ád6 /Ÿ¹ÛŸCõ‰ë-ŽG³#.^šúïö«ÃêmÞØŸˆ*‘±poË{_Ra½`7x +zctïfö¾BçOŠV­LŸÓñ”‡ùYµ'ÝÃö‘b|€G™Ã)žZÚG‡‹³ŸßžÑ¹Ñ7|ª{§߆Ÿ{rÐ æ#~ÎÙÿºá2›Ï¢ùÁ!¦DŽ&¬éýbç—¿Nj#3endstream +endobj +1573 0 obj<>/XObject<<>>>>>>endobj +1574 0 obj<>stream +xWkoÛFüî_±ßèõ´äŠ­› ê6*ŠŠy”Î&yÌiYE~|g÷Hêa»MÛ$ÅÛÛ›™]}=ÓÿÇ´˜ÐtNIq6ŠG4ŸÎã9Í®¸žàÇiÊäƒÙåe|õÒÓQ<9}þay6¼™ÑxLË {̯´L ñG#Z&ç˦(±©¦QD¦LM¢jí©Þ¨¿4ÝÛm•Çæ…}ÔiL¼ ±E¡ËšV;yÇ«$7üÀxR´25ÆçZ¥¦\“-ñ’ññ›åýÙˆã)r\¦çÙ†U’]yíµ⸪LÉ6uÕÔÄ—È¡”‹ÜÚj“ÖEÅ?qå vÍLŽõ–¼Ö´íwÚ7y|œ~më¯IòÖ‡=Éd’Fåì*×W³5õ†v¶q$[q=~çk]ÄôkV#µJÛ +»oJh×µ«¹q'Eu %R¢ª·Eh퀗7¶ôŒÖ£rÆ6>ìH_Ýè€Þðæ-gáÓqŒËôxÎâiLráZ;O©¥O’ÔœÁ!&@ãôN½®\é#.cíTÁˆ&!„x½"_©Dã<àìJy?ÅmRÚ^Dj…u7´Åþ0;ù ô¨`ÇQ8ÄÝZØÉþœø͸å¦äÞkaè-Òüö ÁãÍp»‘OÙùQ_6cÑ[ë°è(Ù>[œ +aÌt´®ÝóQJþ­³s’ Ðcbâ{Üöí»rcG‹DHæÑòÉ‹Ë?ïè–Ûw'vc‘h‡{ úQ@´»çù\ûÍ5ð…F+‹$Å;iLe¹ÁÜJpÆ÷bÄÿ ÷R¬Ëk0¹ÜCÜ9‡JEÚû9pÌ.(2ãp¾V v˜I‹,ÔtQ­Ap³çô‰c‰NK.å@aܤE«˜ +xaßÀž1A¶ñ 8Ô€B +ˆ"X'¡¶Ì±ÐÚ0<´Iürû;€n]8ÏûEy•ÀÈÂgâo'>[’kçDf^7(¯#ì iJ‚í°tA³bü~2lg’Œgœ +<Tß\¯d~‚¡Ô!ãjd‘ÌÀ2 ¾žùï»Ìy–(ah~c›>/XObject<<>>>>>>endobj +1576 0 obj<>stream +x…W]OÛJ}çWŒÔ¨L!|¼ÑR¤^µ” T½•Ð•6öo±½fwM‰ÏÌÚĵh/Ð*qvçãÌ™3“Ç­Mñ;££}:XPZmM“)^&sšáõ>þ9MùÖ»Û­½‹šÍé6Ç•Å1^d„ãÓ)ݦ;³ƒdž&ô—]’×u˜Pmɶ¡iÃÛÛ¸:§Ù,^ÝÝ?ÂÕÛÂxÂ_(4UÖÊ]ëƒSÁÔ÷Ô(ÈæÔ8S󃄾ۖ*µ¦B=iñ Øå„ž´3¹Ñž¨Ð?¦•ò”[·R.ÓÙ„ƒ˜Ò.ÂÜgç^jR´rªi´#ål[³M©­*ů-û‰ÏrSê -[1<ØøK‚ˆÜVrUÂÕ.é¼í/€#¼]çHZèôÍVê9´°óKÄ×Î>}úΘÜë 0à,GäÌ}"ôØêV'ô1§5Q°ÑzFLÑ»›s²n”觫k†“a$ßX[j7‘›©ª)誱N9S®ÉÛlr`‹€ðz©©'>ïƒ)KZrìËÊ„\{LÖ´Âg#çµ |:¢’%ôÕëS>²w1¥“ž óˆQÙ¤´{ÕA(ñijCæ,ÎK»ê"@Ö15JR³B×DÓvÙŽ€+ÿdôJ¬¼T^¸LK '}s +5ðôÜ=ÇQ¦k‡+‡?rÍÎV¶-3Ò?Æ”‘I_eµ,¡D’mtÉ‘q±9ﯗÿ¡mŽg›Ú`ÀÔ5Gé 2à„FŽ;UZÎø?Д(ÍhïI¹=駽²ÉözÒ½‰]F™qÈÀºõ‹Š `½ãirÌL&ü”žÿýçM¤×T~å:?§,?›NgÕº€Žò™_åVš†Kä Aw$?€½#"tз $!°,£:`¾\ã-(&'#kèWžÐCSƒ^e‰Ê«>ÎNm·c‡!T½È¶¤aR[C¼£fK"¨˜ê½B˜ÅM¤êÑ{‡´ôËpíÌ¢ŽÈ Z s¹¾ëÿ4¾p_0e¾ô$ÞОÉä†Gžze[KG/¹×*¿A»Çlk“êr=nì[PU¦O[㬫+´¼ƒž©{í™41ÜSZªºFaâsTbYªú¡{Û;L©±ŸÁ|è‡ÉÐP?ŒX3GtàÜ%ƒT5d›`e¯Tˆ£{‚xQ¼ÜÜcŠe£rƒ5<£?¨C‹ Û 6lO"Å`ˆ=žú‚îv˜}N{O…V;sÃôïÞvÞc÷G6|¿”/·eiWRQèŠwÔymżµ;¥$I8¤ßôÒ0!é“F“%.ÎÉ×qG²8¬Ž9 Ƥ…ˆò¦Ã:ŽãÐ(¹{ &Ä f*™ ÌYÕ‹`RV¯!8ãÚöè¶*#3žu5Ž£—Úov˜~c’u­õQ ~l!p¾Û=×°2,VÞ曚Žq·©ÎÀ/êRò¦¶„8÷'¤*[D¬÷uËœªsŽŸMêì ð ©×!¡ ¸Ö?UÕðN‰­g¿™úäpä—{¦D~ýa(]qEµóÏÝ ºT•~¾Û¹–Íñ}iÒ‡»·WS¨­Ñ8†¬¼dõ|–=1ÿ²çß]x bÙ•²ia-Æ.àSô>¸r÷\EÉÈàÇy+¡~ÍW¼¦¯ÑμPs[òp¶Âà=”aŠç#â´áò0ä9&ºþ=gK 4ïêƒ%ÑÅÕ‹W€”.¸ÚT“#ƒ·e0¨›Á¦5rž*Þ.À:¸ÂFakUŠðn¨×‰Éq÷åf¶Àw¦ãZ-‿9ûüîŒü&̹MÛ +@«Úš}íöv¦Xˆ³ÿû5?š'G‹c|ÿÂÙ“9›øp»õ÷Öy!‚Hendstream +endobj +1577 0 obj<>/XObject<<>>>>>>endobj +1578 0 obj<>stream +x…TÑn›@|÷W¬*UI¥˜‚M0~t”FêC«´¡}<`m“Àå–¤ôë;wà¸r“V¶%ÃÞÍÌÎìÝYD!>­´L¨hfaR’®ƒ˜ât…ÿ ü:¦íXã y©p&/âå%N ®²Ùû›5E1e[°'I¤”•î0¤¬8–A¬úªžèÖX¹+ºªj»J —ï²{ì)ŠÆýóÅ +»Ï³}e _…u&¯¹!Ù+qozÛ«º¨P½å’ò¸’=wXÀ#(ÙÖ˜ºÒ;²ƒlm{÷Xé­é%•Ñ0·ÁŠê„ÌÖÉi­ Gĺ7ùHݨ¶GOXéÿÆ-òb… +m«š/Èt4˜¾›úìÈVM Ù¥Š6B¶o[ÓÉ ñÑ €¾›ž5fô)†X+8Ag›^Œë¢ ß]³páº:#tö'k0Ú{Œg¾Œ0 èЧ’´)•.@pëò€K¯òÙFæktBÖ4Îs tE²„u©ôÖYîÅT®¦Gߟ–÷ì*LÓ(]¾!ÓºNì@e$±{®k²~tl@×ƪ(L糧 XÙÁÑ·Êz.É·ß&t碛(tz &|B;òŒ ¼.‰Y£ÅçÁaÌ&éTzû}A†–1MdzÁБ“_‰Eö¿Ø?Xöo¼Ž¿zm1êЦ`´—ÈÝâ[ãP±ª! ïwpøµì>n½8•›G“T­E‚úLζnkpÈÙeö]m0‘æëvÑ7¬Å£™6ÌWáúy˜ÿyÅÄ+ÜAIŠ +³¿¾t(²Ù—Ùo6Óž±endstream +endobj +1579 0 obj<>/XObject<<>>>>>>endobj +1580 0 obj<>stream x¥WMoÛF½ûW zrP[±dErzK‚0Ð8n­ =ä²"—âÖä.Ã%Ũ¿¾ïí’M-ÚÂ6l“»óñæÍ›Ñ׳¹\ák.ë…\¯$)Ï®fWòjþj¶”åÍ/ðSkÉ‹ÅÕb¶š¾x»9{ùþµ,®d“ÁÖj}#›T`ç -O’ów¹ª]Ë|5“OÖdF§ò‹Û9ëe«›Nk+ŸM]çånóbóÇÙ•\.–0q®l*Ÿîn—Ö»ã©-òýÍ×Ñßåõr¶àq8˜ÏäÍÖ7µJšxl)óyl±Fè8vk½«Ucœ—EôôÁ$µó.kFáH“×®Ý墤íC/ºäŠÑ#ôy˜T×HJɹ+ã¦ø¡Ïd~ƒ3¸£ƒÛi«]ëq±¬Ú†yi»7µ³¥¶—ÌÕ0T8éÇÅåzvÃY&Y¬Öߢ^õk,ĨëÄ›ÿï†ïû:J’+»#gçÿ±¹¸™Í_Ÿ0ºM5å‘C8ú @@ -3414,2657 +3387,2685 @@ T5 Y[àK]n"²SØY%®3ùh±˜4Üðb;•F;FyÔ·- >Õ2jXé0Z1.H܉ßÑ–rº ®sbÄúOL‚‘rÈ•-×%R‰kTœqøßÝ>üȈyrâÅ]ú½tSl¼«NdÒÈÛ*g0,óä%G²=]Ü59ùËX 1I@x>{Š‡ úŽ})Èï±ã ñÃJ¿A"ˆtºV0ÚÙLÞêD!¸#esDV¶¸G?K -ÈsÑï0´öº/ç{£Bìwa[ˆa‡e|’0¶.®Æ,+#x'…ÙÖª>|yÿ;†#dXþˆÏœh1ÊG٬ٵ…ŽX_aÂÚ¦ï͛ӧ§å«?Öý»Osà=i zߤÌf¹^ÎÖ«›8‘^ßðÑÏ›³_ÏþìÑÍendstream -endobj -1580 0 obj<>/XObject<<>>>>>>endobj -1581 0 obj<>stream -x…WÁrÓH½ç+º8…ªÄ±ã8GC–Z Yb -¹´¤±4Dš13’µÞ¯ß×3’ì(ÙÚÈšéî×ï½nÿ>™Ñ¿ft}IW J«“édJ®fø9_^ãç%þ8E›ðÁÕr:¹|ëƒËŇÉü­–Ë×>®O.>Ïi6£õÁËkZg„ÀÓ)­ÓÓï^9OÖP](ú~ÿå'UœÚ(J9<4ÔxE÷kùË›Œrg›-®”'örpO­mÊ,¼ùÎp­wê]¼,¼5y¿þu2¥óÙÒ[g§k9!ק…m mt‰›¼ÅM\Çë à#•Q²—Ø™­X‡L$YGj§ •6dzZÎR—,]cFa9¦ôóü‡6™mÉ+ï5*G |¡O÷r”cº¨Ü“MvÚ6žp\§¨2 †”q_‚g¤=%J›\pÿ ½‰[ÍÏ*ä½±®åyûõnõåþéi8Ø?ÀOh] ~•¢v{©@×Äei[?d`2U+WI3C&NeÚ©4&n‰Gq;SkjgËÝF–Mb&@Ú²«uÚ”ì¾} é¶ÐiAµk¼¼ÙÝ2`áÔF9eR•q]e™–\÷þlH{ëìNgB-t¦Ak BF°AÀN»b -$ ­èúÿP6yÎI©hõâШÆ;›5¶§Ó‡ÕÝÓ{ò{$] ‰º¸ã˜;Í(ü@A¼ÉfO8MÊH¼Œx»-»}ìÎ(hÊ[Nt©ë=X^î^‹€8^‘Ý “Îý°gËÞ·Öe¦ºU`zÌÑÀQú|ôŽHÅ×½¯zŠ90)máÓi'õWÍ~zúsñù†f ½xÅ9œ)(`¶˜\Mf¨]®júåH‰Ç¾r~)¾rz$…:¼,øÔlΨ.´QªÇ£‚w(Åú[ûZÊÆ ‹pz™cZ¥uƒC§;ªÁ?F·Úƒ‚èbƒôÄÅ೯»€ ¯pN7xÖjÀ$#Ý€ÅrõlK»×£_Þ꺰‹‚¤ $!^U‹_1ÂB3\£Ò4µ©QÆqU˜s§¸†Áx]J2 -Ê” ¬pü•,Ê)gŸ˜©D]{À-08¢{\æ+E , {hÞ©Ø––÷B¬ˆ|«Ð¯-,d€å&j0¼`¥)$ëX8êÐùMÌ)RaØ÷¡û™°…O"=z9Êp.³uÈ*´YºÓ©³ÞnêŽ7j‘ÆPh-² -v€a¤GùŽ`íyÅœ!XŠÊd(Ù‹T‡´# åQ$éA2`”Ì|Ì|BbÌô’ø!¹Ið‘l&‹~È´ÝéL  -Ô¹ŒAÆÌ…Õ2¥¥¼‘ÎxŒY]£PÈ„VÐ98€ÉgÀ…êC7ùOJ˜RÙËN)cU¡ÔÔR&$x4ªñA76;Uz›>ÃZ†u#–̧~7 Kè ;r -­ERÃ'bR¹2J¤fº@xÿø: /õ$)# ›”1‡c^â`ȼèés<£Ca¬làzž IDQªÂ±¾~`†î)Ÿ:àPS’u c|ú†ÎŬûÜ ìI0‹ú„ÌÞê°ô÷+ä¸TÂÓD¥½bçÏHm€!À ~˜ˆÛ£Ñʉì°ûìØ…•ã‘«„i ŽR¥ªDv6—©Ôfªi"{*Ö¥ÈáÿÉñîñÛça&vÖtàb@Tú]YTЉmÓ©2tØn¥ÕPÐa†AXº¼Ø|·aŠÔҲɄG.bY±á<´ëL:ˆãÅ0BŒ"v¶°µ¶Ä=Ð@)nœ¸ ªuÙc >°’²²aŠkð,2(þÁéJ¶ªÛ¸t~ö¡Qhì·‚צ1a§â0áA¨Ð¬3YÉ -1Ä«í^«2ݘ›a“ÜPè\tUY…{€£ o·µ˜´cª÷~||ßz -½ÃN JqÊ4U[?L̨§°DÆâE›„A%䀪ŨZNdÈÉê‹õ¬½Ç+‘n¼qB_§{‘Éqaù¡™áEg)‡Üj; -šlò0^Üaå™ÐÇ=ÅMÝ…'¸½PˆÅiÅЖ`Lrqðø£·¯ílpƒŠ·cÏ Þ´>žØý1| @aÆŽî>|Ϲø¼ì,w¶ÀWºå-fSq€ÇÕÝÇ•¸Å/™Ÿ·6E‹°&ˆJ¤êóþõóëé¼ÿK×üz>¹^,±žá›9úÇú䯓ʸǥendstream -endobj -1582 0 obj<>/XObject<<>>>>>>endobj -1583 0 obj<>stream -x•XMoÛF½ûW |r›–lGvrsœÈÁ®[)hoÅŠ\JŒ—\fwiUýõ}3»”(ÊAPFdjw>ß¼yô÷“)MðoJ·Wt=£¼>™dºš]g7tswËŸñã4•''—ŸßÓô†%®Ìîð¡ ŸLh‘ŸMgÙMv•Ñ“ª5͵{­rü¿©B¾þeñ Woh:W/®nqõl±Öo>'ëèi>?§Ê“¢R«Ð!€°VŸ´N{ÝàcCµj¶ôõéË_d[íT¨šù­ºö} ¤Œ±ÏÞ't1½Î®Øk<€ë¥u5î؆|—¯IyZ[„ïÏaº2¸_)¯DSPçµ;¸,-5*ã­yÕ•ÎÖTTe©¢û´Ë5‚úŒÔô?ªn>Gn>À´2¶Ñ1u/x&AÕjÛ[OI¸° ]…mI¥Qc·eeðÖ!@äPpcseH¾‘JetOì‡Æ”•ó¨c@IÛ@H9åûFD£”%¾3¤‹*"‚†rÛøÎÀ,=}™S¡‚Z¢Ì„~WÏ}zšs¢¯èêÛ4ò8èh–¾º&wH›ÏIµ­©òXßÖÙ•SuÍ ©š ]©ØÚTͲâxíoÁkS2LPué'W=¢éǑІ3ŽUcO‚VÆ’àLj²r¶k?“O|ëQ(@}V,Þ Á‘C» ªjz*6Uùô´èëÖyöþ8ÿãùœš}­ -$ lI©<·FL7]-se›¾¢ý}{¿®ˆi™jé”ÛFû˜b :WÍÎ -°–ljŠy3.U¼_«|,ÈuMƒhG9ö-ay-:6RªTX pC­éØ×–‚ë@ EÿM kÛ­ÖÒ–6˜Ù4Üš1c°ÇÔ¤7pÕºª–¬mœ£%0…1_ñ•ËÏ X!¿³KòËÆ{!Æ £PÆ=;ž ™T“!bkõÂd4}ï4Æ2ØQ‰ -‹oµ/]+µ~ ¾%üñô¿£‘L`”û²YWàIpf¾„jÓ|ضlxÜ´ª.ÎÅP¢> î´U¨BqzhC @D\n/)>¥‰‘VY&«®ÍhÁsÂU¬Æx‘}«sæÇzż[ƒž…„5e«0·p˜0Óz«2¨Ù†7u…vØ*¥cOŽ¥:£VTþCìë»ÁÖKl/ˆ$ܯƒC`_õÜ%”É“³ïæ¦2Œ3¦fcâ¤Úáq3qG[{È—øêþâϼ g¿’ÏÐÞ•¸»Ä°ÀY4xhh°DÙ\o25õØ(wç(ìb‹>‚ƒÙÆà5¦ž™^±¢_*¶>ƳLJ9’ÿ´†°º&çu‰Wà̸ãz# ¸>¬-N-a2£ß†îþ OënŸóó]żslÌ!"x—±+ü6מ1û> -R…vË&ñ/Ï4vÛ–´ò #ì}Þrý:€å5¦——Aô1Ö:Øà€ƒ¹Ñº`fÅ @ÌÆÈ6Ú.Œ’À‘(ö¸“o1# âcG]\´¬(è4™:aÇs{@þŒ¡8F)¤â: ºUAƒÙ±­ß˜ÄÀV°—-Â(;>”"*Û‹ëi” "i¯3z6Ýj¥–°ûŽÍ‡^C<ÊØɾØÏ®èÛŸ]ÃV7ÞÒKc7¨š§çûǤy“Fe¨¥NãXßêÐ;òU‰XWýNÐùº±Æ®À€,/D.;éÙ¢ŠzÚz_qn€†Ðe¹ÝëرËZà †ÈF®wÒ·—†ƒQˆÃi»µzåDàÊéÜÖ-*ƒƒ?<ŽŠ#J Uꃞ•øîÈåŽÎ¥6Ô*‡ÆtF9j-d^£ƒ’ pÑÀ€,d`Å…†VƆÛB•€Ÿ"»åÉâÕ"j.+(@d.£j§³Eé+TÕ!\OKT`o8©—ã$E?ÔÄ#ß(Üò0ZÖÂ<IºÉ¦'Dij¼9©•¬BaØ]˜ƒçÒ‚UÁ5«Q(æ GQÁW/6c!„©’~‰HN{Zêé‡ê4^Øç…O#1Èú»dÃkz­Ç¯)x‘«ð2î<'Qö)êÀ‡¨Í oð…À-:fy*ËתY + ‡… šÆÒq:³Xll¬0[UgÅ?3¡ öm/½"GŒËkùŒ W§¨Û!õ¢•©Þ) #¸¸ƒ.†+'š[|¦äa„%,y…ˆzUd,—z?sG¡ñº†‰eI -i6X÷"‡øDZLJ1B·æ/x¸ç«±rwI¢Mgø{ÇÝ5Ínïø¥q~ÿøñH²ß¸·ŸlŽ—¡$ùÞEüâvòžÏÿä 7³»löî -9᳓ ÛøuqòûÉÏ'endstream -endobj -1584 0 obj<>/XObject<<>>>>/Annots 913 0 R>>endobj -1585 0 obj<>stream -xWMsÛ6½ûWìÍÎŒE‹’-˧։ëÄmóÑX÷™DB"`P²þ}ߤDÓî´£IFÝ}»oß.ÿ>JiŒOJ—šÎ(«ŽÆɘfÓY2£óù%¾OðÏJZ…çWÉùk¦“4™¿òÆ“qûß×÷Géä"¹¢Éì -æ+šLçIÚþUÒ}ðÎÇ/]¿]ÝžSšÒb…hgóKZäÁò˜Ù‰±¹´ - -åHi/íJd’*ñC:y®ôši¹%ÑøBj¯2á•Ñä¤Ý(œ\KJ/•Îi#펤p»SeI¾WeîÈZÊ7‹Ç£1Òi2A'¹Ñ’à5ƒmâçg·Hhõ¤Õ_Ûh9q&>ìpœPeò¦ ÷3S+™³‹³R-Ϝ̫üîlh@ `öúåú#eF{kJZ©°‰÷Bµ²”¡}‡©AY›:>z\ó"E%¨@÷RîÝå&k*ä2f’3Xû"=Ò Uº$Æ}Eéy,àhš‚FÈ_:KÎñ¡o(1š÷Ö45ÝÝÐ5¢‰ezˆ&\ý“Temø&¼¯ÃE”"³2 j4HÁeÍÍÖѧ—Iy.*ÛdP,ÈP‚à%€lP‹œù±R¸úýäëÝÍ÷7‘Wƒd–+ÕºðåŽrµZI‹k\¾oŸîþ¤m¡²‚ -“z-ɬØÙRÚ–*!õ.æ½u¹ Ph×Õ‰JÆëCçºõûË¿KèÎ3жdÇŽÍ’ã;ÀlO€˜âTù>*vz§œHˆ³;pÛÚdó°¶RëÆRŠÖȦZÀ 2%ƒƒPxq57$û/µ•ëN©~C6Áy0¬_Q6Ãìý -z58Ô×™rƒp™¨ÞJY‡‚©JžF°šði-Ÿ|D0+kª`#”–é!)Ôª¶&“Õu©böcébüŒGÏŸ]‚· -ÂS°±‚)f*þ€êÃÞó®Mwïø»Û½ÆÃñ"Mé],êÇŽ‚L"Á!Í9ÕÈ­r¼ÇZMs[v¡b)œ¤B– w¢Ï—Ôýü/m#µiÚTäFhQvÝà Á²6ڊ݈ÈEB_(z'²X8¹ý¡ÑÊÆ5BÍB«»ÐU”ØZji! -@Qš@áÊ=³Hs/–ÆühjôØ yJGrø­±?Ð`Td¿ -a{µëKnuT ¾C¨ä²BÂ'4' &6{MwòïFjø‰âA® ÔÊi¹cEËM%^´K;J”¯ÕÕƒ:jпŠŠm¥o¬†;˜ôåæ]èkÄê¸(Jƒé¹U¾À©A8úŠÒq^f G^fwJC¬yˆDŸ=Šo!?’ûD訋{‰8U=HÌc5Æ$…²p~a0ÔYåS­PºÓáŽÈrÂA‹^—sj@„ßÌTP;œk”€¥„U`P®V -ûQ„À^9ëPLÒàÊ“!¾@ƒ¡Ûh€:W.Ø ´ó­Äc >üºYȸ±÷bÆ…bgg·Ó°¼g¦Îí˜FÝ'¤(ò‡=½kÇ@ø%^î–›0¦±ÈAo>r ± éaòüj -M ‹f‘%=beá/?;-j^Ç°Ç!µA¦!§–7ÎׇÏ‹Ï­| -V"^áBÈÏ´ ÏâÑ\ºÌª%ú¬ÀZƒŒ¬¥ß÷»Âæç8YŒÄ6Z³þáXÛ?P‰(æxÚ[±1ñД-»3¥ß•nžhižp*˜Cà]'í]Æí(ùú -þök6Z»=©†>Rè-ÇWîM),' –¨ž=¯±îXÓÜ™Çø -_ÚË#t/»£©Ä?ùçÅ;éâèÖÜÛ]ÍSc£²~˜Ý$˜Qègck”4lÄ=þÈõÊx‘¤L/ªÊu}O S]¯”—ÙFof êé~¹UF¹ªÆEþËý%^Aâ(¢n³…±K¬êèè-_g¿Xtâm£Sµ› Ö‘>h¬«khª†ŽÉîL~ ¢ÌŽ­\7¨ú1Xi{ŠI€ ‚†ÞÑà5vYH–¯±=bù“¨_ŒÌê.uðäÚ'“¥q)±Ámñš‘eAÐqÌÑ(cUÙqX -@<žŸˆë犉ß$ã4¬€nC’pcÙp1OùF%X±â ã‚h³D°`áZ¤(¾oùý gVØ3ùØj}Äó·{˘µï^x›Ý¯<ÅŽ\a¬*wlÍãMñ§È±¬=>ºLæü. Áú>™]¶}4oŸ¦xS_Mi6›GEŒ©ýbÍ#²A7ý—!¶;JgxwžOit9¾jô½èœÃÁìbIÇ)ûeqôÇÑ?}”endstream -endobj -1586 0 obj<>/XObject<<>>>>/Annots 916 0 R>>endobj -1587 0 obj<>stream -x¥XMoÛF½ûWLÑC@¢DI–dôP8iÜc7Q‘‹/+r%nMrÕ]Òªþ}ßÌ’4Í|EĶÌý˜yïÍ›¡ÿ¾ˆi†1­ç´XQR\Ì¢]®gÑŠ–›5~žã¿Ó´çXÚ}ùøÛÅú*Ši9[Ds*(Æ÷«æSNŸ.úŸñty­ûO{ŸñtµŠ6ý§½Ïxz5‹½§ábãë—â¨E´>x½½˜Þ,)Ži»ç4W›5mSIfFÛd´ÍŒ'•çöä©Ê4}º¾}}M*-Li|åTeU0äg²¥,Q5–•ITeð«B'™Ââ· >l§ŸM9ÿjû×ÅŒ&1£´MG÷¿¾¡=‡kgØ=¥¶P†O+vÚùˆÚC¨öøL¥¥Ü–í¨Ô:å2õ¤Éë£Bš¯šôîRIbë²êB -iá¤'í"^<½Y5 ôv}Î,ùÌÖyJ;œUjÊâD©MêYÿ6·ˆòó`G~åïwŸ·wÄ´7‡¡rÊþì+]¼„9¾ÛÓÙÖ¤ 2SsÍð!Z`«horI®eÈ‚T™ÒÉøŒ±xí•q H+oòóÃ+2e¥Œ é@$Ÿ:@tïlÁ×;bbl‰cÀÌ€³>nã€D—!'†ým3U‘W&Ó;RsõaKxz}‹ëÚUcòVr-Ô9!t5¸i§« -ìb瀟NX‰˜˜I`#‰fÚkª”ô ‡IÃádmbZ­˜†‡ùjM¥+ë~2ßDñM®Ö©x]Fóˆ>ê¿kãvÿ’W¦• eÔP$bSH²Ø)Jl¹7‡è²þ™! Z.“Ú90 :jà£h ¸½¾~óžÞméÏû^Þ;j4ñ,™œex€…šðŒî8ìn¥<¢J©>2“ ó¢ÑTWÉô¨Š(nJA‚B?sf"÷߈Jj®ü©‚aHTT¨µL;k+Jü"žÛë÷o±ß}xKî>®èÕÑ­ö Ä]AÜHAsO‰‚_¨GOWP¬”‘ÅîSÂŽq@!ðO¬óB%™)uÐëOžNÙV&ð¤ÊŠwÀTsŒ¤'È¢ªÂY¸Wãã9XÜÇ>E…e@ o§=ÕrqÃz¸ðL´fèÀ… ëÌÁ”*'_qQãWg:i6Ž’L°‘ƒ®hïjqmøNŸ2?Àè±á`Y“ôóäáUsÕ³iÊqº¯6éYÜ0æ`£öW tcÝ#øÜÉv—‡WcÔý á$y ïcëªË„+OL¹CÕ§”*]ØR -¢gi÷9Šžw ›Œ¥„ËOz…1ˆ£8k˜ -ÓJInQUhaœcÇ5@‰Ê”¤–@¸ ÐMí©Ìmëóè'80ÑP[ªÛ;tàEÜ'é×ЩB_bnÔÎä¦jÝ -êmBñð›„3n'çüýh¹Ò ŽDcÅ)ÝÉ$Zœ¨‡ÍÑÙ'“‚ÐÝ9ä0i8“}óúpÁZ+Yãn´„Ò`Y{]Á!p,Œ™//åØ0]±¼ƒ\ha'n§[FYñ|¾pÑ6Ïà–1«(¦¦„s³sÊ Têìëw‡nÑ èƒ3ñÂ:ý›ŒôQ~·Žâqǯ*Í.´*ý°ä`!“Y´^NæsNôy$…kv, „UçRŸ˜! ™Îû:guªÍŒuò$»T?éܹ}C§É#¤ê¹0ÃU]Ýs²ô[¡„õmׂq¯a-à\“Ë £—ó]]½Ì†]TÚÖk íƒêJ9ÞÐ¤Ä¤ï ’3dÀÄXz4HÁî÷,mI%ˆ ã| ­VV—RÆ _"U Rô¾ÙÎQô$‹ÃB\—­å‘/vMßéÜ®iÏkʯ¬áêžÕšÉËÜGœʇ[cãBìϲGKÛdÅCÁȹµ{é#¾f¼w¯M³”i™*—Já5l󱕢ÔN™I2òõƒ‹„ÓvãN ÃnÜ¡‚>Úvã`\ˆIêáL–…ÐÖVS…bðHRÌ‚å¦Nlù­³` -ƒRº·Ô®áK°(>* údíÝ“ï莓ve/¶)ï)”m¯Ìµ!µÏ8áöˆðŠÀ-vµÉÙ—ÄÕQ4AèiMn¡dÚºaü¾ò\€:mº}Ï9¼%¦ëG|Z†Q -N&f,ï -EÐÚÚ3`Š‰ ï7ÓÙ‡¤Üa3c*Î Ï‘43~†øv0ô!–|ø×HÐ Ï«¿gôñþ–-F<¨`zç ƒm`óÂ9âˆÞ4Sk˜OÚœí—üòî{aÚe¥„½aúíŒGÏ(§Ì!«À4Ô—¢ðýÞ8iNsé£ÇuÆÄÀÌ€,aùÞ+Œ£©>êRÞÁê#¬ç”i°(ï¼±«JÜûdlíÙ×DLÌõ'Õ¡0i9¢‘éÍŒ®ø}€3\|F×Cþqx¸˜ãÉŒgtRËÙ·ÜÈÞ‰<ŸÄ3¼¶cÍ÷ö‹§$h‚M14·ÿ‡\;øF æMªKâ?M[5M&<â‹TßÿIíÿìm¥ÎØ4ºËhµYàqø“Að‚{gÿ -¯ð.Êã“x…¿Ó`Ãd=9éè[/vËÕ&Z]έñLf€·Û‹?.þ{{vkendstream -endobj -1588 0 obj<>/XObject<<>>>>/Annots 933 0 R>>endobj -1589 0 obj<>stream -xWmoÛ6þî_q@QÔEcÉ’cÇ)¶ÙºýÐv[¼OË0Pe±‘DO”âØßs”(ËoëºMLóx÷ÜÛsä_£€¦øÐMH³ÅÅhêMi±˜á÷õò¿Cü¯$¥v#œßžÝ€oÚýúõ§Q8»öfN§Þ’ - -oïº[åt? -Ym0k7ƒ` ¡vµßœÞz!N.8ØE¿P ·e?÷;‹ô„×8lýÖ|nõá-ÛE¿5›Y}A0ƒ-»è·ÂÐâ¦!Dì‚·¾_ü·€Ð*EèËZ%Öÿ)­âñ*S†¶*ϯ(ÚQ"SÑäõ©ÒÔ"Çù»÷ßßaE/WŸ °zÆ~c*?×±È}#ŠH´ÛÎÌØ£{)©Î$‡[-‰Ž›B–µ¨•.I¥´Ó Ÿ›ÒÞ„€5ÞŠ²¦Z™7ºÛL"­27Ò£wµEL"7š¢Få‰5µUe¤Ê$!ùYÆM-¢\’(ÊUT‰JIãµ(oû`LÂ%¢»Á›{ÀàѺLÕº­V8p—ÆlUg^ ‰CEck†½í ìM¶‚..ð4äŤ{`TJ™Hx¡©jJv¦=7wÆâäPߘ! ³Î*ݬ3r ­BVIŠõFµº¡WU´©ôFV¬hxN%§Å\‘Ñ­—ëèJëúÙ1´xCž×VotSÅÒw0|xˆÏvañ.þêЉþwmJSÝ mª†±4FT;v¥mI¥:Ï5T®ÉìŠHç*F$ËÇ×_;/ib,œ (O¿ö‹ÈïÊ„›ÆÖa,Œ$Ò=RitŽÒ3ÿ›í1¡¶ýÎmyÁafÁTwƒÎGÑÍŸ š8Ù¾/›Ù#8Ìï±ùð:ð–ÓðKæ÷êN*Æ"sjN‘™¿œ¡z{EÂÇ€™§o™ Òƒ6öe÷U<èx×Èc.Hð£ÞRcdeûÜø©¦ë½'eÓPZéâ´­ý縫ű7Óö·Gïw_1U°œkýˆö°­¦i ¸ì2ú§¯ÊÛv6L0Š,9Q÷³ ½äµ]±6ž–c&£ç¡ˆºrò&‰Þå/ÚXµrt¢x8®À—Ùójȹò,cÚM­ pFT¾ã´`~€TJ$î ¿æ ÓºZÇ?1ˆšÍ”òsí¼é¦U­ -É¥TˆL- \<"T84jjæ/<Ø©èaÌ“ˆË.Ñå f¶Žî퉇—Ý8Ä.Ÿ+DÙ0ì>Anz÷ããl'ûóÏw®Ðä‰þ¦u%7ì× # e~5ÇUvØŽÇÑOBåvÎ"ª®„m3È8Ó†"?’ „!ÿ¿8ƒgÃlŠèL÷ &ƽ|’•Èi#*QHD%ŽÙÝÍÓŽ[jŒ¹®+Û¼F2OJW`ìÖ½/ÝÀöÄ`Rº‹Œ3y±U&1b"M\©ÈÖ$Ú~S#œnŠ¸p>Œ—(T|\ãòsÊ—lÙþß -ÃTSèD¥Ý@•qÞ$ÇcÕqX¾ß×¹ŽDþó¡¯ÊcÚp‚Îà¾ñ<ï»sÏ –³W#$hXØäNaV-‘QTUÑ‹W/®Z{óñýÝ»¯Ü6+ oöDÔÍ©Ôöš3¦oéKN†¢–³ž±!jT‚FeŠ¦øá -ÁcR”EŠ-ÚHu8sPÀúÙÕ0±ÇÿÍäú?˜´$yÑ&4|…ÍvVÉp„šï߸ ôðÙ·ý »h’ÛÌX öv'íÇÁ(p:­ìÞƒð¹,¬ÕÓþòlC Ú¨$Ûd|þ0Ö%XܵuÊ»#4.JW楬IÄ|U|xÉ1¦´¼É¹¸2<"Õ„ÏkhËÚþÆþøÑŸ³\¤}&ØH˜Œ¿ðßâ%hŸCÁ5Þ“ËWüpÃ@l|r,ð¨ÄÉÍMÔ¿?h% f«¬\úØØ‘s½Xz‹yw‰ -¦3VñãjôËèµ[°endstream -endobj -1590 0 obj<>/XObject<<>>>>>>endobj -1591 0 obj<>stream -x­VÛnã6|ÏWœnâb-Y’/qòRd“l‘»I-}¤$Úf"‰*IÙ5Ðï”rQœ‹qÃÏefÎýuS„¿˜Nš.(¯Ž¢0¢Åò4œÑly‚ï þ§•;˜Ï’0|J&ŸO)Ž)]!Öâ$—”„HQDi>Šá<œ†³~—¢&³átwþåÓ9i®¶\‘‘î·ÛË *dÅDýKz³ÇA²@=i1ºª}V²,åNÔkÊeU±º°Q*öÀ_‡¿ï“>%ÓnÃÑ•O”t‰F—7_ί¿¾Ì>"¡]ÌšUÜEÄS €räŠö²Uô]Ô…Üé®z²Õ "Ÿ•¨…6Š©$`ýݘ 8I¦‰=Ý[N[Qò5×äa”ãÁ }xÚòˆž’ÒüìOç}Ë4iµš”2gåD³*c“LÔ“šRMNºàŽ,rÁ7z§  Ò“”‚žFÉ(®Ykâ)î¹ÒÙ–eüŒ>XMpЇ[¾!vYùðƒ Zžpù¸dyí0{q,½â:íÎCº3LjW)”œŠ‚ -Æ+Y;Ê ×†„ùÉ#|H½[^›–•å~luC;Q–´cµqÚ•…Xí½žt•‘¶éMçJ4î ÖL‡ ªÜC[Ù©}PÌ M(ÝϜĊ„Õåv#hÓŒ)kméVêÔZd¥§Ìv$qtßâ‹e¨K…§”è{%”6!¥Ò× x†Ù=PnÔEÎõ˜€Á›3 Í[‘žyÿ“„{PÞdãú¸"VîØ=3Åj) -Gc),¬™è.á¤éy@Š;üU[×°Ÿ0üÁyk4ŒÓ?´V¼éñ,Þ¬2Ý å`l0\E›sËLr|ÁxnLb5,ÖWÙ‘ÒOè4Jæô+EÑ™û¼¨âÙ •;´«õ–k'+ò1µ·­aZVbÄCV›v2«‹™õ2H­ö¢†‡ü´bìV’‚ö}Ä:ƒá9œ4cù1ÀdżTõ½³îWµ†ô}ó¿YÕ”|L×®YÛÕãæé@í—Aïuâ=õû0HfÞJ.®n>¾rP»M"·/Gö@RwnçØQüÎù…¬0ïµQx5:üИ·m†QÀ*p™&Ÿ—Ý«@¼ÀëÞrŠ—¿8\XHü‚¸Uòžç†.eÞVðn7ä¶Å ¿œD³è_ó(…P-Y°®z­é¦u*œ-–ábžx´ãhfC\¥Gý V£!;endstream -endobj -1592 0 obj<>/XObject<<>>>>>>endobj -1593 0 obj<>stream -x½VkoÛ6ýî_q‘‹Å’_qœÅçV¬y¬6 Ë>Ð"±‘H‡¤âëþûî%¥Äq¬¶ë)RDâ%yî=ç\Ý»Vzø¯{Ž!-Z½¨£ýI4†Ñdÿà¯0k&­ø´ûÌpÇx‚pÀè^’´strñíUš‰‚Á/¤²/“÷­tû½h‚~ýD9aæFZÑó½Ñå.u.Ó%Áœ6p±PÂøãÓôûBw0¦““ Ñ•*uR+ؾN(· )S ô¦J+88 ¸¥’3‰¹´Î‚žÁT» r²˜âpy|DñÆú§c#HÌ\&ꔆр.žé<× ©n ÕE»_QÕha4¢P£µû&¬îV«ƒPaά]ð°ø$¹°õW]‚Ít™sŸóÐ s[ßZ|¾°Ô¥§×wbáÒxÓépFÀŘúì€ë‚IU¥¿XÌYPbA'™Uæ¥ävnüÿ™.piDŠLI -ÇÅŒ•¹Cà"ÏmTmŒCJĘe¸Íe¾zHÒĵB"‘íPu¨ÔÕ}š¢©ûTqýYaçþ --“¤?Žv£a4ŽàT~ lA*é"Ö1ãP‡65rî*åí×ÚïFkûû¼•ªünzÂb%Ñ°òH>êf*_㽜‰u¬„à–Dë‘Ba34a\?ÉÓg§ ×ÃÔ†°pR†7¥RÈŠ]KQÑsôI@>X¹bß1{»CŠó( d¡¹œ­UŽ,æµi—Ö‰OÏÄÒßGžs(>Ôq€ZÛ&è6craµ®i)¢7+j|'øx -Ù÷S'±bÊžŸÇb*™Š*ª)Æy­9OT÷-F•¨éA›ZæFÏ…YƒcÅ])T*"8[® )xûºý]Ã:ÁkX -©ÿï©‘° ÷~QjƒÛ/¡ë5Õÿ?¢nÕ~UZ¿A;l‡®¸Ã±¨Ëêƒgo†Õ›ßáÅ ì3ešA|ϼõnc[N±E’ÊàãG¸¾nš X¿!ÂWT[ ú“žf(t°ž¯8cøaÀFhŒ°s­8 ç…𳔕¿Ø‹ÐkgùLS TcÉg¼®çÿšÕ·ºÇô¥~¿•yŽ=<…ºý6ªã«Äñwüüyüñ餚`úcÌ'CœÁÇa¸¾:8;<€K£ßãÇ:- dŠÑDL„wë ݽMíjîDX_´„æ0 ¥£ðѧÿݪ™B{»ôî$iýÔú ÊódZendstream -endobj -1594 0 obj<>/XObject<<>>>>>>endobj -1595 0 obj<>stream -x•VkoÛ6ýî_qjSDO;ŠÛ"8Š­í6Û‡¸Ce‰ŠÙH¢"Rñ‚mÿ}—”äú1u© ?HÞǹs©‡ž—ÞÎ}ŒDYϵ]œ»v€ñäœþûô)’ÞÕ¼çܸxyBÁ„þÄ i×Å<¢yÝó4-J!Ï–ñÉüKÏ…å¹ö„„72¿^Ï»üÉ¿8ú¡C€E+Ñqôã»Ó‹þï<_ò<îwi}X9Žú³U¥Ïï‹5­µ6$+yÄätéo‚X×~¾Ȩ;[ÕÁÂb”5+l7üƒQ³ó /_¢Ì`%pÃÒIEtïÈj)Ÿ¤#³å·BîwT2U• fÏÄ?zíܼnKkù®–ØgöÈlßÆL¤aÉe-8†çÕMÐH~Ì!kS<‰ -9c1”@&bž3ÉÊÌҮG“r1drq²g·U,x|ñ¹È)$ñwÈì]É -XkyÏT‰¬Kçà•ã7+Øzñ¹Ãé-úG²è÷aˆmâÔ»{:†„TĶfÌtï;R‰¢Í“4‰*^šD”M¯~eΖzJFÞ½~ÓÀ[Gdž4Çi=h2\Ç\éš©”çä8-+Ú#’—-GBÅEŽÅ°ÕJžb-Êû»RTÅ)VBªÿõbFµ Usaöþjº—ªÜMBªÉ–Äbq¨óµà4?7 %%›(˜4òm²wA|x>}Ééw€¨‡úF~Ù³6·¦!Ë„9TÞ­KöÀ*1ÞiGÞaªÞ¾ÝKuˆ(„RÚ2¸ãvßëâ:Ú–Wu97“æîðz*™Œè¤™Ž³Ë÷W—ø¹_X¤0Q•1²º-5«U°Î]ýÈÒÞk˜3iž æz -K|¬Ìü;8óé®Ö¢n M\Ï{¿ôþCy‡endstream -endobj -1596 0 obj<>/XObject<<>>>>>>endobj -1597 0 obj<>stream -x¥WÛnÛF}÷W Ò°HI¶%9AP$MH´QQ0P¬È•´ÉUvI+BÛH$­¦MÇ wçræ̜ᗋ1ðwL³ ]O)+/FɈ¦·3ü¼™óÏ þI+÷âönœÜœ{q};Næý¯éýˆîh±‚é¿äû£-²Él£éÙ¯V¬åsJe¥ªRu’§V”K‘Xi¥¡?ÉÖÂÔôþ×;úûÙåâóň†ã\.r6ôâEï™´"ãGéý]ô?œLùôxšÜ&×Éÿèé,«jíÏÞÐxìƒ ‡ß®è äï#¨7Ò¼ dËeÞ½<¸êŸ©Îœ!Q…{'[{U-U•÷íQ.d©+K¢¦z£,í´ªê+™Ýè¦Èi)I, Iµ¦LW•ÌpRã° —¡ºN&œ¼Ã•®)×¥P•²\êÏ­ Ï•Ï{/QyA…ÎDA ®%>µ»Nsâë,¡tµRë7óùpªôñÕû.Lˆj2õwÊñ(©¹$] ãÓÜVzt@ÄÈõé¸Úk³E‘õZ"m“P0º•ÃѳÿÁµ3úQÁ¯hp·ªU&j¥+ZiCš­9ÄT&ím¥Ü"‡·„I;Q2è.çpOÒR%eÎÆ—}Ç¢¨kN€Ý•ÓÖr—ÐÃàÊÛB5p¹[IK‘m›%íª‚˜ŒZ« -%ñˆ¢}k®ƒNò„A+Žè{ƤÒ`N®q œ<\†‡±2¿ƒü{U>ár-uÞxªÓS=öªÞ0ã𬋣҆kÎèšér‡  -¡­b&­*%Ijuc2™VÖÂG¶ñIÇVP® ø®Í–`ú¨=Pø(mÖ²³3Z×ßys§&tˆG_)Ðü#%±ºëºÅà•Ñ%'߯È1úîÍVОCþu qð-¯âbÒ©ñ3½Sži÷ª#ï‘,xjØ~ T¦¬•YcT}…± }À8`&æ?¡Ïì´,¯&«°Ï#ØA²‡“ŸFÈ,Êò¥A»åü;ÿé`âƒPf[´J™/=‘†l­3 ƒn‹,Ó ¦óÿ7šÞÇqÐA¯;‡@=ðú-S uð#ŠÂ ‹duãùEµ±êëë&T€œ,2‘+mJQÄ´‚ÆÙ |Â`5Úõa-„Á_ºÉm¥µ˜‡Kt„,*Y£qq Âb¹ªw?” ÆL‚ÈÊ˼³!ëö Æ5ÀK)˜jeÈSÀ‰3 -$9Ó]¼ƒ}Uˆ'*".‡È¶äøó¬þm,Æàá’w,7Ofɘ1¶=°ŠrOÑ'V<Ód5¶‡«£>fµá¤Î¤RÀ÷&’zˆ{Á1ÒÝlZºN‹A¥ûfˆ’ôïóÐú  -õé^;´/Žûñ±ÙŽw®3ì¾›Z$ÁtÖnâMf'Mqðk“[Q #t* *¹U «¦ÂÚÓ`‘ˆʬେË6CÍô«& -Þ€ð¹G²3!%66h±m£K;Š4TeWˆÚíª‚Ö²’¦X˂ûgðZeqÁ8É%2t(6 Œ/UÐ/5ævÀ§ƒ[zr†Ÿ´.ôÞ¹!¾N§Eà('€ø»u8¡qÕô#rñÔkk\Ÿ£ËxÈ!Ìg.£Iqq‘1'1-¸úÛ=öQU**ŸçR9ýêAÅ[BBïO”[ -Œ¯¬ Šå¾Q¡õ– -…E”×Õ ó°tŽ§øHœ_Ótv—¸ï«O¯Þ¿~EþÌ_!otÖ”€×í$á0^ÎFü=¿Çho,®–ÅjméCãÔ›é<™ÞNðùÈGG36ñãââ狵Ÿyeendstream -endobj -1598 0 obj<>/XObject<<>>>>>>endobj -1599 0 obj<>stream -xµWÛnã6}÷W 6}p€XÇqìêmÀA·¿Ðes#‘^’ŠWýúÎèfYNêl. bÄ9×sÎŒ¾÷Bð7„Ë!œ§½À `ÞF“KüˆF@Üû¼èù×Laãñÿ‰O,xŸen åß3iDT|ó¹ô­à™‘.÷7,½O¤u±L„g5H'Ò«Ì -V(+®"¡r ‡W¾pÜ݆ZÐJse3Î…ˆNßz ÂÀ›`mÏ6‹cÉ¥P}zÞJµ”*BÇÏ›8¼uŒ?PäÖ£äâÊæsPú¯7ºIbŸ‹s¹À«3Û™x¿Ì¬°VjEý}£QÿzaX"j0S;kTIÂZù¨_`¡ãE~¢WR•ë›ý0À™‚¥¾fj…ØS‚™$‡Ö,KlYîÁÜÒ[H´~°ÈÏ¥ýµvWA{0y£²ŽåIÎåO4qGŒW7ñÅ&2%:‘5÷±4ÖÝo˜µ¯æG ]颉OTj‡ÕWWjgâXÇ^ž•p« éÙû}?µ¤°eToR”%DÒ'¤keu¡ÁûdBc% çªàÒÊŠ3˜‹"dÒ©<Qs -áoõë˜ìî(ßG -*aY$n¬ úYfX‚~ÆåzŽ£ u¢iÍ”bÀ´ø×v–úQà¤9§!’–% j€ÑÚ¡ šàtyÄDJ¡„ÃF? P´£`Ý”wÙÖ̪b:ÌýyB¶C¤:‹]F×ÝþØ:¸‡Y­„##Ð10¥t.Õ -"-“¢[­¢mŒN7ÎVjX[¯t8­G;" Ô¿pì]xçÞ¥7ôàV'ÌH;°Á%Y@År•F8+-ÔŠÜ€ˆ´¼oº€‘¥F줚ª]«6Éq)爷fÒþÐ)“Š4 7’ylNŸ¥Æ#Ñû™#†:­ØâH%d9‘`W=Š$ÖÔyª Ã…†ú]ºÅCäi)‹„÷Î -'<³N§òßò$MŸ"ZNÈî{•ëÌtÜV¨Lq±g„fÌÓâh Ö¸µ¶;ŸKÁ¦˜…‚¸³®`B¶£OCà’(·Œj¨u\Êt£qc³‹º"®«†6»Z3ÐNê«Õêt"qáÂ]éÓowý“»Ó&I€Ð G¤Ó©Lýp ·7óOÝÛÝïð»ÞäF®ÖîúüîÂét<ÀéÜf -n$7ºLÅ¢¦(^Jð¬ãæý•,Xø*hÇÑÁ¡·_f7‡pl›=¸1ÉŠ™K^ ¯ØJPÓº';ß ÁÀ²¢×( -lfÍ!ù÷‰Û -èåf~™ßΊ­¹/gòÖl/v¥·™Ž$Kî)#ÉGíw!dª\ÆÀÏUäåfšŠ¤“³»À;­Ú³ø¿­j,>WãŽån "WÖà%Ø3ó¡[¾ªGqSš#ÅF)F=¬x±?Ë‹=3Z‚˜U«â>÷ýëIµÙ„c|ûœã‹nõ6p;»ù<ƒ/FÜáPâ F3þõ…Áe@¯ÆýjzÂBXGCg±ÆO e…ÈŒÆo|1Ä7i:Lc.z÷þ7Xêoendstream -endobj -1600 0 obj<>/XObject<<>>>>>>endobj -1601 0 obj<>stream -xµWÛnÛ8}÷W Å"jÙ²ãÛ¾¥í¶ ²kïå!@@K´ÄFU’Šë¿ïJr%M²€›‹ˆäÌ™33‡£¯½†øi6¢ñ”¢¼7 †4šÎðy2çÏ~¤_˜,‚y÷ù‡Uop6¤­6°4㟘`e8¤Ut|ônõ¥7¤~8ÄÉU|œéDD$¢HW…#[m6*Rÿú¯AeÍ Së•Qe”Û J‘ßlU±VEXýŠ9#¿VÊ*'kkôÔÜ/çËSoÓèLZX Bz‹Q#ãÆæKF«B}{Öf—‡ØÕLˆ‡®¹ƒðð¬Ñó ]* ˆ=]sááY£æሖÒZ¥ ÊE!™£#:eÙ-¡–múXëJX»Õ&~;®£XÙí4ùÓ¦|±ÇŸ˜ëúÔܾÇØŽ±kY•K!p ¦î-¶^I 2Y•¥6Ž6ÚÐÒ¬¥Ñ–þ™»BZU$'úú¸*"s¦Éiª¬Üï¾~÷šÓÈ£×%ÛÚèü·f=©¥É™ÝÍFën8C]OB{^k¹Õ“FG‚‡¦T~‚å.öæúÚôâ»L·hh«­êCàÚ·ïÿ2FO«kpvBaXÏýєǀs™Õ$âM':g(S…$±q¸Ð1tû×+h–D:2*&½!Qz§Š„b]­3I¥Ñyé,w_Kø8±Ó6 4 £ip —z °N iwº2´ùZЯŒ‹"]2rìÁ¥FWIZïe™µ­ìRáOòæJ*–Œ9 ÒðSïsp¶ pÖ01>©½‡Ó`Ðg•+ç…ÁwäcÎfgíßz ¢TXVT9¤…)Èîϲ[…è1<#3),àÜIã¯u+)Õ¥dÙÑX€ -I>¸© wXk,Øßø9fDd°ÆÝ¢Q{oÙŽtq'T&8,ÌÂgUTß TÒ D0iwÖÉü=ªÀ¥žRLëñ`;‚jwvÀÔç=FÒH'û+5®N¸ è þl¥xÔØ[àå÷„¸©÷¨>‚¹µH2Hd˜¨TVÇçKƒšQÚFâùÐ¥{KiîT„¿[åà^1]eU’xN ÿ…Ž+Ìž7Mh­R0ŠŸµD^˜¬\s´¸)pi ó—Ëemÿô‚°#°!¡¿/ÏÿC¶‹X›ºÐgQÓ~ýY0i¼¨«éc¾}ïkͯ÷'£zV_!¸e –BÂc½€ýuþÉgË;S±Ç[h‡í1:7K4F÷4G{d\ #–% ÁŒïŠNè/sD²MÈ« -öŠšÅ•hpÄP‚¾+ë¬[) Zïö¢@çìu¶(Vü.Qeþ:5`¥Íiíx{kÒÙ„ÑFKª.‡B £y¹ÌêþçÌ(꼾¹ôµ1Ué€8cˆˆÑ;7Ýþ˜ø¶q~H|›™uó‚:®¯Fþè -ùÎ}é@ê¤%æÛ‰[î\„ÐÐm/†¶[Hš58¸×™|•wù`å3 - -§ 䔕¬ásÍT[(-wñƒäû´<aØ(íƒçMí…ãy0_Œi:šÔj¼<½øpJWFºÒ'U< y¼œ°~È/¡ó1õgC~¥<~V&O¦ó`:áÅ“w |ò÷UïÏÞwÓŠ·endstream -endobj -1602 0 obj<>/XObject<<>>>>>>endobj -1603 0 obj<>stream -xmQ]o›0}çWœÇVJ(ÈcÚmÒe+ÓöêÚ7àìÌaû÷»NZMª&„mÁ9>÷WV¢à§DSaUCNY‘¨‹¯ë¶áµâ׎ÙC—Ý}Ú lЙR·%:†:ySÖy“ãÑ9F¯­¹í^¿FÉ°„_VM^3㦳6ÏÚ(ø?>д@œýÀ;!z‚=^Ž{1žÈµä}ÖA ÆØ÷ây$l#ãMÐRÄΪ8’_@•ÔY³\åUÒ§“³'§E ì´tÖÛcÀ×Ã#¤GAœ |²3)6€`Á„³VObâ[=´ Ô»«ûûwÍwNbg}÷NUÙIh“96(ðmÿùÇkè©G>ŽÚóÏÞ‘üEEyÉÃÔÔ‡P“6Ú‡$Í.¥õ!õã¢1ÚôÌ›ôozø"Ä=°) -³u?óëDÚ׉”5O·]as­èi»{Øâàì É€VƉ»½ÄMÄå~Ù›Téÿæ½®Û¼¾¯xÚ P‰ø±Ë¾dÈ„¼»endstream -endobj -1604 0 obj<>/XObject<<>>>>>>endobj -1605 0 obj<>stream -xWûkãFþ=Å -v –Iœ”rÉ]¨! ¹ÆG 磬Þ[KZÝî*9ÿ÷ýf%ÇHI8…`!Í|;óÍ7³«ïcáoLg:žRŒ¼NO½s:9?Ãýÿ:¢øàj~0¼¹ Éˆæ1\¦gç4 æ#< úש(m¤i|æѽ0&ôéÏÕÃç[*³*‘Åáü?ç>>«ÝÇ'Þ}Ø=ºªdÊ"©ÍNh„! Ç}¬²L=qz 5­YßÔ±¬%äciÐQ¿]Ë¢OBKágXÒ©©6Ø”2÷½Yîù¹p†7#ºX«ë¤.Úîjô}UˆIjíšo —Ãuù†Ví(ìR† Dư练SŠ4t¼åˆ‚üÈI„µ^X ™\FG$ dƒ'ø…B™¢g!1È#ŒèIÚÔQºA3,U—A8ìK¦~ídV‘óØè•f±[ß”Q ãåUfe ¾7&F2Ö®(Bo—ÁÞ‘s¬Š(rõCæk¹¢ä•‰ÐFq ÝÐÊ3{ææk«Ÿ É #2R%ßj¸JäcĬ+—¾ijN±¬…Á“âk’)_dßÈ ‡×ÝÚ¦€M—njPªŒ¥¶kP¿*DŽÒ„Q,Àa÷XûõšÆ#ŒQÌ„àÌÖ“ÒϼtÙ%Ý vWvmÿ檡°Â ~ÿú)´’›¼íÚE;>M»é@@(Vç5 ;ÐÌjæbÖÆèk+dÁ-Âô˜ŽþbG§jöD¯T9”ã?Æ”CZôg½G´\FacAvUÂË¢ˆ'Œ³ -O*`Kmìâ°slU:S Ƽ•ˆ¿^~'Ëb±‹þÅâ°›Fˆ‘z;Ä{–2XvC¼•Š ½`"û"”w#pË©(Tq'w#äbhƒx …¶­„fÂ~h½èONO‡xPò‡“{uW(T9¤ØŽÚŠ{7Çüv>®µyh#åv*ž/'Æã+á·ÄŽ5ÖÝ‘ÇU–u0ÒykræhEïNù˜€3S;)-Ø_˜jöb§RØ´›-B±ß -¾íŠøñùäV;18-úQrI½?.{oµ^A&вt;-¦ÇVûn¯ÔæJØ ­·l8˜š?È$ïnSžRlVèhœ…¼ëN²ÔÊí`.Ú“£eé{N ui»‘Eàø™àMúš¤¸–®g3jDE¼‡t¯€=m‰sk³M»¡û:mo;¸–àIÑŒN…b)Mw_no)Æ Îïլ*–…zBÕêóÓu-Äí:tg•W˜[8öJœAöP‘] ðïÝX•|Þk¶˜Yßnf`]c8NfÁ<_Ë>ùàD«ª6œ_ÃvA@Å-Ù·°VËÃìc7õâ]°-´µö©Q‡7ç[߉õIþŸ¡'Ósoz:Á7,~ŽÇá§ùÁçƒÿÛœ„Ÿendstream -endobj -1606 0 obj<>/XObject<<>>>>>>endobj -1607 0 obj<>stream -xVÛnÚ@}ç+æÍDÂÆnÉK•¤¥ª”ÞúP ©ÚØkìf½K½kþ¾3‹iŒ¹D*a³»gÎœ93øO/ßLCˆ&=ßóa]{#ͦxâ§äÚ…h6ÆÛ á(òfÝ…»Eo8÷á)ƘÌð"Ä÷}XÄý<áÒäiÎËÁdÁ$¬™Ö+QZ/6¬Œ3V.ûáx¼¼¸ŒËíÚðZGkU&W‹ß=ÜÀG6‹¤CšsøêbŒæh}}-X. 9äúáËÔYÔEšR‰c}\ÀÈËþµ©Vš—0ÃÎkQÉg©j Ñ1šÕ¢Øl=%ÔJIHòÍ©Ò¡®-¬wçQ2U•—o3º€²Ïkü6Ê›yí±°)ŽI~iåÕÂÎG;ûá„<øaƒ>¯˜ÛlU19½2À¥[öo°t,5X6“q¬à Rà,Κب³ï4Ê$ÐkçéÖînÈÕ‹Î÷G^HÁë %µ+¹\Ù†= îÁφ Zý”Êd´ï‰ãW²ÇGŽ.]Kû9 ÒRöÛ Õ¹€‡;ÁŸxC*ñhe8¿†`Úhp Á`êEüÐö¸'4¨²Õì4 ö­r¨ôÔ³ZM"Wb‹ŽÔ1šŠ­¸%Š]A¢ž1€LÕ|ÃË×òÐfL¸¸i -';²ŸR[ÁÚVAäϸ uÇÍ'a57à\œr0”¹½çpJ9A1šóåÇæ©sƒn06¹?•2\“‹:p‡¼79ĺí4ºn|DS'Yc–NøC4*„¶…ÅÛQˆ4yÑû²é&®ó!l›äÅd=Xd¹îP̵…OxÊ*a.ÚnäÁGn ¥*•tím›…Bœv›Œ·VZçØS¤jÆ6ØÀ -›ÂBå¯]óÄPªPÁž)ªVØè*® “ÆéJ9'ë¿°b-ø«3»žJ+!ìÀØÑ·¥µ®ÎÇÍ êÃý×/÷·‹ež—Úü¢íœÁcUÚ›åÕq†á¿bStCbÝŸ‘±É‘x»XGaÉ©g‘ù®/?o¿?@¢âªÀ1iQ!ÅÌ …ø羪¨ƒ­He›á†óY“\0Ág”Y£q3Oo?ßÝ·Rýæø§ù¾K\ÜýwêÓãÈÿÏŸÑdæMÆ!>ØJú‡Eï{ï/ràwendstream -endobj -1608 0 obj<>/XObject<<>>>>>>endobj -1609 0 obj<>stream -xSËnÛ0¼û+æ¨1õ°,)>¦hO-Ð*ÚC€‚)‹­^áIþ¾KInl·@A„ Ý™]>nbDôÄÈì2Ôý&böùi‘әЫ%š9f)K®÷å&üp‡$BÙP­,/P -PˆþÔÁ»–OVjÄÃgnŒ¨ðýÓGL;ªá¦ü9'Çù’¼Ýù¥3Ü;Õ 5XŠ8^aIÎ2+[eÐÂu’X>:¥¥A§ªç¾K`GTj0–wÌW‰°M2–ιöõ1‰ê%ÜB»á°´Ú¯­ôü—D¥†pE13^² ¨l+!¨ymGý‚@¶Ît3:]Ëð*m¦ã;×>#í ÃWÃò2Ç“ÿ#\ÂyÆæ$äŤ¥µ/0Vsulm3ê'®C9B>O£¶Üò[Ê•I%…R(‹íÜ–šÅ»eˬ¡3:$sCÃûŠŸrhT'Þ_Ñ ð<µÒoÏ÷ ½Uë‰ûo󣚜]l$~déÃ×~9.Õ¿UZ÷ë œI.j§µì–¸t<À7/`¥ròãŸrH‚–\¼jhô؃â¼úI(¹¬†uŠ×µNó½ßÌÿ^™4+X¶Oè¶ù«ï<¿÷åæËæ7ˆCÂendstream -endobj -1610 0 obj<>/XObject<<>>>>/Annots 946 0 R>>endobj -1611 0 obj<>stream -xW]sÚF}çWÜñKñ $ÀàÎôÁ›Ö3IãÆ´é/‹´‚­%­º+™ðï{î®d’vÚN&¤ý¸_çžsõç ¦)þÅ´LhvCi9˜FS¼9ýùøãàv-h‘,¢„JJâYtÛ=ô4ˆ1?ÇI4Åê,^œžxu>nh¾ZàoI«)nð¼Ö{,)žÁdoq1‹bšÇ·î`|»€þÉÙ\ÆÑ’æÓ›hîÄÆã¥7>žÍ=.€µ8¢ÇÖÔÚº«'oçÇÝ®d‰ø°k½W–2¶¥„±LÚÔ¨­´´×j4µVžLfÁ$Á#²ý@xŸ!ñ¥Ë]H€”ó©1"SŠ(Š£»BfU³—dËm-¬=d›ábsM¹*dDH€%¼†¶‰Æí5Rdl°àGÚ ì¡­°*¥¶ÂŠmD•qšu~áK^ª«TÖ UYwø Í38‰ˆ^z6T…K‹Bf½Eø¥âúµAyøî s ² *Õ$•Í…Â)iGTR ÃFæ°„tsr]úÀ¾Xœ´߈Æ'Ü ¨Ø‡ZV.Š1훦þv29‘ÆÛ"u¤ÍnÂG&oÓ®Úãe´bÀÙMr³$¿°àÇ¡@걕lN^éɧádLÕnG„]6µŒR]NNYû/–ÇÉ*ŠoÏý¬éKüá›R1BÛm¡,zcÇ05BªíZ•a»öíÀˆ|:ÚF–t—•ªRPBqh¯Ò}Wdv½’;‰> 1é« Ø×9IaœmYJ3BSOWîÌ®ëƒ&‘$û^F­nMŠ2{“¥8Rmô‹sr+i/‹:o Æuc¿¤k”ÝÂøñþ͘‹;þéçõ*…ªüö·GzØU"UšÞ趖¢u^ý¿2³ÁŸ×Tª²ÄÌÂmÏ ‘]ÒÃýwï~÷¥€·´CF¸û4ü©ÄNºn÷hÞøÂl[dYpfǽÔú Zï5ß«ÆáÀ;º0W»Ö{ðÕ`B…z° DÀ3ïx l—€.øò¬M9¦×0çêÊë“ÐÕ’ÕÉFÚ•¬Rs¬rt¤Mfé;:J{ÅqÞö·CW¡A^h„ʱ͙g‡ŽÅF¯Øñ|} -ñ9´n{%J9¢wï'(SðƒQ¼w´Á< Ç(Ý‹ -õhTɯ™^ç…ØÅà·•Ò%£W&ï3ó~Kˆ_§ÑG`08¬KŠÄiEö"×ZÀq3w€ºyÉ`>£ƒjö„3G*„ÙÑ ¥®Úr þæ>dM±´:<{ÛìukªÝ\;Ð\6R®@ÿLN-@ÙThýÜÖ–Ê èÄZÖT\iåŸ-tO±Eô£z‚Ètñ¹>+(°+4}QÀp9.…Ž:Œz‡–Ú uÅl™¢Š%¼€9k¹Û€” -šàÏõ sL—0ÆÄ KæùÂVfà!áÆ3&ŠÍõî"TÎtK@Ûh«›¦0òì<@¦eÐúÄ*Š•”§•;ÐÎägOý>Õ/`»Q'ÚàKÍí$ê’ˆf<^ý“ä,Ìjna!%Ó嶅È/Þ%•kžP0†822².Tʤ-ÎÃë8GU,и¥"”óØËu1¬:…?0” ™c´ðüŒÜbDÁ³.lGmÖ7Â"t<{¬ÒÍ0Þ\û• ¨CîÃËÍÖîÿn+ _ -pêr„BŒà—}ÑôWi2ÈR&ƒ3^ÝC-îã\¹á‹ƒÄ•nÆD³õyÈëŠp¦ ¤ñ4Ÿ:†»W‚\€"MFC4tºG2=…Mƒ±²åö@1Kyž·0 V“ŸkÕé3Ûˆ–aÕÿ( šà!ã¾ÍÕj¾~|¸ï¨á“ÿ¨ '•wÜQô¶h˜‹,Ìiæ´TAÜð&üÌ2¯”RTŽ¶Â`ìGâsà®m âÈcFL¬b*0·e®¨½Ä±:ß=>tsŒb€;)f Ǭþf?l»ÞÇVê -ôäÉ®=`KlE™mQ^@:`†Í°6òEb…ûvèÙuTž¥nÐuǹ(8w¼¾8T`6#«‰5ê4¾¿ùí‰#%Ó2t¸Š¨òlÄ r<Ò¶u­Mãiñ/ÞÓ­HŸ%pºÊhuÃjºnœªüÛOjú/ŸÑóܾHü§RÏÙúëÁ/ƒ¿ Uýendstream -endobj -1612 0 obj<>/XObject<<>>>>/Annots 955 0 R>>endobj -1613 0 obj<>stream -x•Wßsâ8~Ï_ÑSR dŸŽ “ÙÜ%Ù\ µwU¼[MlËgÉaøïïkÉÃfçê&‰-©ûë__·þs1 >~4 i8¦(»è}¼9|½~»a0¤›ñ$)£aÜÖO)-x?ÝŒFXM'ø;ħ””\„ã>ŽnÂ`ÄǦc,ø'>6ê‚ñau4ÓÖ* BÞq*tp{ MaŸµdN¦îŸ,C'éôԯˋÞýˆZ&°v<Ð2vFöiubU™Ì­°JçÁÕòûEŸºá¢—qg¹•0Gð‡¹£B«Ü²šŒ-¥1$Öº²´Û -Kv+‰÷îÃZY§ÛÝ)»í¦±(ŒÈübƒ¤C±–†rm©(õ‡Še@PGóÙ ™ª(tik4ƒ!ÌšR&²,eÌúUîÚ­2Ô2á(VåQZÅò–‚ðŒšQ&EnH'ˆ•-•üPù†*#KQ¤«ÜBz¢Ë̹„’Rg$rúCå±Þx92‹¬ú4W¥Œ¬.÷„Ó²tþëÝGµº“`Ê9ì«p<©ÝÓxÀ-vãNP©ˆTOÚ¨Wcvñÿ%ºNƒÁíÑdv¬‘‘ÎcRVfÁž5‚ -s³"Uf §®÷ð+ux^,`tL/³'Êt\¥Òôøíå‘`¦Aª8ÿ!æFžE)UëRÀ«¦Ñ¢×V¨œ'_fóGZèÄî8­V­µÅ/½Þn· -§õVWý¦wª®]˜c ©S #µ©J =SìÀP!¢w±v¿–{¶+d"]HŽùIÊÔ^½¥ª‚Ë£;ùÔÜÀ>Þyeá¢lXq»¦ºáÕêë¥N`‘ÅkŠt,9SÀId+ Éœb–M첡vW£Þ!­ÝEzý¤¥ E’ ˆ8'nTŽé{÷}º­k9¬k¹}bÕ¡*{Üà3Âg2ß >ñCϳ§¯tÙVvI‹·IJ Åòõínùö:{l°õѵQóÄÿæ_wtéVã¼ülßÓÛb Ò£JÅô…J|¯®>Ý7û7ñ¾(Ƕ4{á ‘Ç_(·­‡b? -cÒò6½Ñù¾¦/Ÿ‰t8ÉíJ¿ÞUô®Ov'ò»­È7Ax|ªŒ=<£[ØûTlÌOåÇÊ {ퟙˆ¾ÉÖ¿i÷׿æ%7M¼JUÀPÔ”šÓ×?ýx,ý1ôœâvýÍøÁ˜ He¨‰o¥®Š‡9^Ä:CㇽOkìÀ×í* WH‡|öC³óymy¶ýýa -åF£wÜàÐB9ç},¥à¹!nLª‡4SE[ÎÜTnDÊDÂB;ÈQEµöí˜)˜äl‰Y¼âË©.;>ˆO 拆ÏÔšj)?¤«´E€%j7Ÿ|˜å]'e6Fãâ¾Å‰ËñÉT›?]r5az>»-ö3¿‚՜߹ù»BN¨c\³¯ÙMPyìs ¼ë,ì®z›±Ì¿2j0¬Uîï:ÇIÌ…Ô˜bðí'V‡Éçç™RoÀ'w…%Ü)°RóÜqG~@Û#ê)Ø:<i‹].²UguuMÒPßú`6Wg³¿Téöäç"ª”¹JL‘W[fe'ºÉ‘§÷F±Ê&MA잤ÊquÑ9k‘Æm*²é¾2'"öèΔ¶«8ïìK\Û´1ªž-}±sÜ=>ôŠ?]¤à~w™ÏÖŽf~æ˱GÏtþ…ˆç‡ç5´°6—Öµðš#JÌÞ6$ ®¬9‡À€²¬"‹É°žé¦5Ý p»ïO‡4×óÂböôëŒ^J̓ÍÛ×KÙmt'}ŒqçÝFãi0¾ ýMp0¸a!_—ÿ¼ø/kå"Õendstream -endobj -1614 0 obj<>/XObject<<>>>>/Annots 958 0 R>>endobj -1615 0 obj<>stream -xV]oÚH}çW\)!R0ˆÇ¤ÝT‘vÓnþ!Uc{Óµ=ŽÇ.áß﹞±1Nж% -²™;÷ãÜs?^>MðçÓbJ³€¢t0ñðêϽ€æËž§ø/$mù¢í××OƒYÀç7§”næÞÊ>'ô48¾¥¬¼Ùñän=߯È_Ðz ÃÁÒ§u\«Ð:ú+ïÆ£:ÛªçªPÙ3=‰4´WåŽþüxûåjýÝ*˜[£Ù®®c{Ó÷ès.3¤È)¥Ò™½6GdîÚÄõ&•EIK2Užë¢¤­.¨ÜáíÞF‘®²’tø]F%dIdG ±*ð«.ddñC×´U…)a9?°6:¡‘?ó¦l¬Öè™h'SÉDR©É$"/Í©·Ôjö¬ãœ’ÆqÆÚ -­Ë {zãN‡åÖïÆÊX–ÑX‘$ùØš¿Å©|”¯åu ƒpjý$‚S-Cê_áø<ÎEï‚Gë3(C¸*3Tî5‰²,TX•ÒðýšûŠvKS•ëŒ4<.¨ƒ¯±6.+_‘2¸¶U™Œ9¡=#mpâð빌äÇïäõ2V&OÄáQ¤ò¼wà„!°ç9—…ÑÙ“Ìîé-7’Ò -$ e“©¸‡L(Áaë×óײmÕmnÉvqA=*¤i™ú¶ !ÙÍm†œiøè ùR¡nb -œQ%å檉`â-™ÛMMÒñÓ3_Ѹ£Úi踑Ià ×s·–ÛTLÅ_t÷\¾CU·—¼ ½Ê"¦«Üò†Imé +Ú þ}ǵ;fÉ×ûÓÙd\=>V‘4„j¯ßmIPªQ•‘Û*IŽ…n®ù¿|©®…­N½ÇHismY¾Š4OäuJÒ › ¡‹3” -Ì6÷vD‰0"›!÷…\£ÂäÀêµ8陫?F„¡½L’ÍÕùº£1RÖ@Ñ(tìCbº5ÕÎ? îž$Г¯n–ÕΣ¼ä‹êTNÃ<üö,KDžï3‘n†ïÔ)+D{=Ö)å…4×­Ö¦D¸-8Æåq£6ù¾PñYÅ8ë(nuv<í;£#¹@û3h­¼?œKǽNFP2…BJeÚ1ܤªèÅ……>/XObject<<>>>>/Annots 971 0 R>>endobj -1617 0 obj<>stream -x¥WßsÚH ~ç¯Ð„¹ƒÌ€Á@ ÜLèäÒö¦Éå -oÇ=,ö;±½¾Ýu)ÿýIZ›_C;×i˜ë]IŸ¤OÒòoˇ!¾|˜Ž`@˜·†ÞŸÞ>¿ooÁŒÞs¸›xóz‘Á²u²Ìa6ñ‚“='7y³ƒ/ŽrõÞìÎApØ;Yæ0Ÿ‘½ÃžÓy7GC ^uÖ{³±7à°çä&>läxq”«÷¦sχà°çäÆcØÈñâ(WïMïÈÞaÏ÷9NÀ÷§>iåIbxa„'F0™Mé;þk qëݪ5xœ€ïÃ*¦|³)¬"NÇVa7‹D Fê/Rß®^ñlXŸíO½¥ru×£` -n·ÑÄ›}Ÿ¼À¬DDyZ@Tü¤SÅqúõ'•ÄifÚ¡Riû#8ú£™çÏ¡?"N`TV‰4¦!’&ÔéFF€²‰“o¼Pñº{·¾…\PŠ-ž-"0 -vi–A¡,l$&±”¢d"µôàƒÚILU‘—™$€C8d¢Q L¿ÒP!†]jTŸ/¥Z†Vé=„ªÊ"%ZÐ Œóus¢ -êMœí6 *£™ -E6@³1ÈÒÍ ±Õ@"3Ñí¿·™ÚˆìŸ‹Ç@F†•Níî 3ŽÀ×’|D¡Þ—bÌNéÈàÙ½dp„ÉÇ:E#|´v“*…È%žZ-–V¿¿ÿóšaÔô¶Õª*ñÜóâóóÇE}êLa˜ÉZfòRhÔŒDºj½iÓBrBžÁ*ëD°I‹(-¶ôŒÒ} ¹«´Fß™ãm@ÂÜæÜÙ$5€ªñè`0kŽCMè=€Ï-hH™ª—ÁlC^æ‘‘ø±G„«ƒòßú»º²G.ï]L‘–¶ÜQ|5ºr…í“C×"Üfèe¢®¡9ë2ž6LH„û1æˆÜœµŒø"²êä‹°„‰(¶ÒôPÑ𢮉Ah\)è£w Ú™-$ÀMXÜ/‰Æð$ -¬;ÝSÕ})–S/ -ï™áôEéíÍuš€)e˜Æ{ö…«Ê%¶c QÆ2!×]䇨2k m­o¿‰Ð©@|"Qxá:‚‡#÷–ËO J›ªvD>l,Vø5þ]³Ý†u·£â¸ÓC^X¡-ØÌà{GGÜ­ýXß~¼ÉùAþ:è“‚¡æJq¡öT³¥Ž£1äÉÁ*G/ÀÉE¾]ÇïÈd*n¾ƒ’­ÞÃx6¿ð4­"òE]ì”a‘=-ëk°˜tn˜å~”a[YH-²ÌQ¬Î€kO¶&ê ê퀺™ÕǺûëº[¥Ñý/¦²«6¯È’0Ã>ë(¿q ÈÐõ-Ó~ð8o < Æ<Ò|¼&yP4<¯ÞSW54ð’rYÔ#³¹(PÏžºž½0ÜôQÌÂ/8 q¢+.'&~mN@ö`¯*0 ­\ET~ôD~M ‘½‰A}'áëîhÁ•a•Ê˜J‘™ˆg†„µ8¡++MÓBš1þ$(ãò°y´R?Óvû•Zp–¾É ÷O¦yj±sTå… Xä ~Ôßb9‚…#p¸Ä1Þ -,'-%¨˜…¸˜¨™R„ò·ÓØaÉ]"vº½,ž˜ š(Ò)k**„^Ó'Ò†*/¾BQ»c=.ÏtïYß^æðcKnø8Ú%ÕõÈycš(Ò9uÂ_0{ceN…E- ìF¥2é×Ú}ç4îå’nk6¶V‹·Ë¸V†nu˜²Ã:8ʧ¬öàm¡v ƒª Ï«>3†#Þ :ÖFÅݲ(dqåkZµŽÄàqVßêýÌÆøû‡ïjËÅÓ»¼hE­TXQs$Ik¿9ÞŸñVuÿoýO‚™ÜÜÏߟ’²ßW­¿Zÿûm€endstream -endobj -1618 0 obj<>/XObject<<>>>>/Annots 974 0 R>>endobj -1619 0 obj<>stream -x½X]sÛ8|÷¯˜ò¾(W#Z¶$§Ê^gs»UŽ“‹´•\î"A ((EÿþzRÌf+[{•$v,Â4fº§þ|‘ÒSš\ÑhLYu1L†4žÞ&×t=àç+|YI?ÀÒ÷wÿ KoFi2¦ŠÆ·É„â‹’f'/+J‡×Éôä!‡ yóNˆŸçÏ_ÝR:¡yTãñ >7ÏCÔ!ͳ^Š( ÍdV[å÷$tNNTKqŸe¦ÖþÙü#6¸¦4 ®&7Ï{óµÄ¾üΪ6Æz¡=mŒÒÞ‘78b%«¥´´[KM¹rYíœÒ+òkI® hŠ³x$µ·J:Rš×qø! ÒQrÅAseeæÝ'׸Á…<®ÆH0Ö<É­´ç°{À»n±Ëê­pnglNÆ’ö‡WÂcÕ²ö’¶¢¬Â`+¤„j-uf÷/sz|yÿðq£Yc0I¦\} X\'t2<<åaŠ²4;ÒFD^!µ“6är«äî¯aÿ.hm]WÓ$½=æÅu’6m–ÖÂáP쬔’—_<ÉϵBžP0<m2$j)sÎå%ÞhtrÖù,´S~mjO¹´jÛp¡SccÕJiQÒI(‡ºè•Kè -VNéÂØJxðäÒ U¢h=¾~þ4ïâïƒ0–w¢þòôðîßo翽y¢l-PhËûð¶3VÃà×7ïço¦,AÀ¶ò`f˺yä{¾Ÿ)”uþÈqå\-ûáÉe™‹ 9W^’«–IftœVT’Cæ²uÙÊùe‰ih¢%_ûøE/2í¦áa¯ BwHN|Ö–º·x†R´2lBµÖóÇPR+€y“6r=‡²EBïYÔq# |³‘š…ÑÆ.~ OÊ“rá,KPÂ0#BNÚÿg^X?œE‰bRçà’b¡cO M)2ÊŒˆ³„~ Gt"S[±Š8héE»ð¶uÇëhB?ýD±—3ˆ¨ùØÑs}I"Ë`}‚Ó€zO\Ê=C’¥;4¦a0ê^\Ì9bwrwGóê«=yóâ?K0]ß]fú.t0ºgGé›ún#ͦ”ý<»ƒ”þhÂÏÆ®.i‡   Ýì\œððt Œ‚ébŠ˜&5nd¦úðÁMQ=pítªôùÖXq¶’Ìò#:nV‹X7 %Zw…Ø¥;†;T%–ït88f¯[ɨÓû§×÷OGr¥ãÁr!³BG0žœNÆaÑ!ËBvànãE‰¶Íв–_ ¼LUð´hdA"Ï_ íŒs29´Œ“Ck5çe?f±÷"œ¡k|Ôâ»ñÓ âÎYþø7»üQ8?“áø¹W`|”+$Ö«Š_4½}Kitýôv2ŒÅÊŠElÓÔûfuÃ|ÒYü­4žøÈ‘R´ãi$dW÷¯~P´UŠUG8~Ì.SÌ=PŒ[¶µÆÙ ¡j÷¹æ±Í=û$1+üç¿GrÃþ<¹SÑÆ89‘«³53øwZô¸±.žõéý¢‡Yø“‹ æw>,z=¹ÿ䗊̹տ\`¶™/žý½l”feôµŽå9¶VØz$B˜Å ÷ •Á¿k äy\~.¡îäÝã|òæˆEñCC~RÙ§2{úa-ôêÇåA_×Îÿà¨kSÉ—¸P|}NÇfTð}2L¼†Jé¹qÃQwk9à‡ -39/øýé´÷èõÍç‚àÂög7ÏEqËÊO÷­p~¾·hÆV¾°Ð凰ÙpwþÀ~ÆQ@£ÅÍ"¨„Þ5W¦ûà$,î2h'F¿îöÑÄkï‹Þ fþ -Sú3oðâîê%Üú͉!M›‰(M“éíˆÆ7i¼˜Ïî_ÿ|Oo­a³¦—&««ÖòtŒßMLG4˜ 1*åßó[‡ëñ4ß\ÅëtšNyŸ_æÿºø¾ÛPendstream -endobj -1620 0 obj<>/XObject<<>>>>/Annots 977 0 R>>endobj -1621 0 obj<>stream -xµXmOÛHþί!U—JĵçUâCHBA*G¯¤jO—û°±7‰Áñæ¼vÿþžÙµ“`h ÷"{wfö™gžóבG.¾=êúÔêP¸>rwvŸÞó -z=|®És§[þ•Ðyæ÷[N€{]¬ðñ“IZMÞðGÓ[îôº4Œa—¦aC‡Y¼É?Š|õvz‹¥A¹´1 éJÒþ1m2µ‘Yþ@z#ÃxKM9Vl°•ÔÂ\Zf¿hJÔR¥åÖrFWc|N¾NNHeìÅ¥¦×r|ÄÑpΆSZĉt¬»<‹Ó%…"¥¹¤´H{ß8‰5Ž”ˆ<þ&)WÆa*óÒÙJd°ñI.dV=<>Œã¸æx#2±–9VÇ©1¥×s'TébÖhÏÞÒlĪŒÖ -PÆ).×ð®RÇB–P5»NÏ#¿ðq¢™ßé’]PÁnž7[}§Ã €#øYÈ÷Ð - lyÎØr+c0¾‰¤V EÚxBIEBb®URäòÉéógë>ÿ:2®ž?Æó×UóöŸA‡]¨µ9̦®ð`g2ÌUöð²òŠv;8ÑÌg†Ú®v‹l·¥æ傌ی)‰Œh™“H£ƒ -™‡‰ÌÁµ»|çS¯T‘DLu“öØ<(ÿ€ÿëBçv-h¿UÙÝ.wUý1Ci†/œá›Ìð›Ëb6ÛòYæÔÊG+yô<'øȯçÄO ¨ªïPÛwz\@œ¡/8¾ÎM5røØâÐ"äÒ.sVJ‘e2Í“*R˜ˆž­bhâJ¸R­,ŽžxeîÄi.—ð›ÉM&5œ™«ì”E¼Ó°8 -ÒŒfO—ãÙÛÒ&‹×"{xŸ©bs9~6º8®B,­Ð’ÍT7MEX‹%¯VÕ;š~ÏñúÔ¬$‘ÉZܪ,F÷°­Bsã(EEHJ*åÌ /´]É”nÄz.¸¦In Wôq<âý(*µÐíY#;|ñ zŒ…&¶4/®¿L¯’G2q¢á •¸åFÁ’/ `=Z?L[7#•æ™JTÔÛç¤agjËQ.TMÍ!ÂsˆîÁÁ4T‰£Y2S4o†ªHs Y±í¡†¬vgªÒf$¢Hr+özÀgDßAûH_–Û**ïük2ü؆é³û~öOÂØÉèk¢x†gàÕÿ¿CçO&y/Ö›D¢åj] £L‡7ÓÉûkZJ)H6— óŽfÑžÉÜ)ò•Èí‘ÛÕàUŽO¦=5óa6{SØeU5h+4ß:`<¸§`*#ÎumiTNÝŽ¾¾pÑ Óý(ÅdÑñ\†wÇ6ÌzvⲕwbHl-ùUàvÜâ¸ë.JŽëËû @€/ç¶Ua7›ß¡Ášj±}ŸZ’÷±ÆËÙÍP Œã"ŽN™Uœn¤â$Eá©©<¾PÙò˜Ï±›¤paú]¨­Dû<±%ÉTU4„U*Ô,``HkŽ9`ÛqÊ©øÅ0í‘uÏHa™ÉM"BL·V¡¶1ú³QË-£0üí´žm²jí¦€JpìowÀ£FædLÁ&OC‚Ùz¥A³†t–ŽÉÔÕõÙïe–vm«OÞ-xi¶; {}§ïÐÄ–}_žÓbÇïFäCê qz« Àž -^׎%)Þ¢´F`Ñ€zÝÞ¸çzAÇíŒÆC¿ßév‡A09z­vë|Ô­mÝl£+ w#¾”ò½ ôZàɺGM~@žïz5SÉzE»í÷]ßmyg“ñ¤ïÃqë,hµÏÚ^à“Im+¢ø t~#sXvñÝí{~P[dŠ|¯¦[{dñ|Ÿ$–eª -øÈ\³p‡wj±°æ¿‹‚Ãü<K= ?>¥êëÏš1Žô§¶0Éá°}×íÔvŒ‘H«Œ˜£î‡Læ¦y—{ÊÌÔRÒ¶tæ8øžÎQR¦–5~îߣ¨|IC‘™·ŠŸ±ôÝy¯i¯ƒÿôZø7€Ï“îÍðêlH3Å•q'D+§VÆ£Y-ov]TJÔxu=žÓiûÐÞíõÙêdzôÛÑ߃í!endstream -endobj -1622 0 obj<>/XObject<<>>>>/Annots 980 0 R>>endobj -1623 0 obj<>stream -x…TÛŽ›@ }ÏWøqû2·pÉS $ÛJÝK7T­ÔöaB: JÓªÿ^“MºM» ÈÇ>ö±=ßFÞ<Ü…´‡€p™ã‚ð=üfø›Þ€Ð?¯‡ëãÄñ@P⨀“ÀñO%¬Ž8†Ã@ód4Y Ù µëãGv L I¯Jë:)*5ò*ÙŒ‘ÀGÌUV´M)·²7^+#Ë "i¬2`YÝ˶Ýk“Í`:ea„Óù"^‹eÆ|.øt>¥‚ˆÅbàÚ˜¢’æpmt×¼g@¡ˆ^ïTj£)fÐè¶ø¦©îjû?\+«µ¼Œ“ij—¥Ì1ÚçŸà|}„ëZežËú™šCcÍ›¦vþÃã”mèP`ùyzI ®Èn»j­Ì B†:§õ ò꼨W[U–3˜¬‹z²–ív@Þ·q³yê#£Â>w…7åÏiп²x,ÒÇ—C4ûìlíJYìÁÛ p,<¦W‚^¨t«+Û©Í‹éÿ'«±*דËÚ!c$ëh+ëüÂŒ¢õ¦kíÙüÏÒkûÜKßócŸPá7ŠC¸ž -£Jù”/££j“eÔ{Z™1ý:ÐÀÁÍ€HW•ªmÛ×>/XObject<<>>>>/Annots 987 0 R>>endobj -1625 0 obj<>stream -xV]oÛ6}÷¯¸ÈKS –mÙq>ž¶uK[ h·Æm0 /4EY¬%Q#)«þ÷;—”W °!pl‰äý8çÜ{ùÏdAsü-è:¥åšd5™'s¼9ýûôf’ޤɒ®–7ÉŠ*Z¥7ÉuÿTÒï§+¼[Óêæ¿S|¬¢<,¬Vó$/¬—É--aîæÒÅ;âÓ`n™ÞÂÈÈÜrq izÿÅÇâûm3™ÝßR:§MŽ|Ö×7´ÉBx#/_¢ñÊb=¡·7éW)•sô ª­ gZ+I“©—›o“9MÓÎ_´ ×_ø[_\GëÓå -αs‹„ÞÕÞš¬•^›:n]ÑbÑo ñbkt¤eê JÓ¨ŒtM¢&ü¬IÕmM]©Ú'ô{¿Ã:jâèëåkSËÖZl /Ê:¸ÒõŽŽÎ«êëKò¦|±Œ¡]ÈBɽ®/pV”Îо6:º¦ª´¿À©Zuç¹'ŽŽÂjÓºà{kE cŽ$¢Ý*9ÄtFNEmêc5l‡è …L· À ]Æü}Dd$'éÙþ†×2#[F…ð[Pe2kv! “ÿl?7m‘ðTxßÜÍfŽ)NŒÝÅ_3ypIá«2Rõ#«Á1XM“z/oèd$žz†à ò¬„,t­žv“mk¼i·¥–å±OoËÈ«UqÚ{¤ÜØ~d†¬ÎTɉ:ÈŠ6:ðܹ;å^dY¶C‚}EÖk ‰eôM{¨ÛîB˜¨Nï †;qtì ;pƲsÊÂ'™ñh7"»0ÎÎBi9.¼érÙ ¢8zûJêÔö¹”þ6mX â§üùüUJ¹8àK{E´µ¦Cœ ¤,ñÈûÂ3KÒÔ"â,GIè:Óµ¢¤¢t\”¬Ø3bÀPA°Y³giÅ-ÍuHp䱶°o ›4>°wÊš+T¸}TAå9•0Ëdl•ïz„¨³^û°?u°>TÐgtŽôó§÷t÷s9ÈžnuÍqâåð,“(ˆ3&qâ¿h ÅË!œk™¹T[u˜"YêÐø‰;} ÌaÕÊ%©2Ö”dX¼„V4"23Ôi_0o¼2ƒ{¥¶RQ‹oC™€Ö8䧀G®™sœt½ -!Dθ±*WhØUÊ&{ª0ÒyH‚‹PœæªÞkãé[ë<¤p,ËAâ½ÓÛ "CC/È‚»aâÃy†õ+jŒF÷fv°4è÷Ut]—È#ˆ Ò™%!~ÜCf£|9»oMÇèìTðùj­÷±i"ÿh"ŒÜwœ#Ú1hãSo>|¦7¾ç‘„Jë§ï×— }0Ù±²|žïw;+šBKà **ÇK ­4Ö –Ô§]È^Ù\`º#ZŽÁð¡+°]!0n 8|DÆ­.u838 Ü0Ì÷óÜšj(²á×%¸Ûqãí;T¨‡Óädyìs¬¹áŽZºW v!Á­˜ÔwQ5pªãdtS’…¹>:ÒÇÓYšæÈ* (Œï=ƒmEëö\DOÍP~ W(V×nÑ«|Här…î¥ɦŸTT‹*ܲpÝœj~‡ º7˜ÃA÷C¬@+œ•UØsÄ­…/­AÙ¢çëP*³ûáz0å›doå±@]èò±½…Op®3ÜBœÝ/ú.a:F5¼<%u•âúÌWЧ¼Ök~ñLV'–qóìþ¦÷0M¯0²ç¸Rãäÿ¿$‡~ˆ²áàVkÜý¯ÒåtÁïþØLþšü áËåæendstream -endobj -1626 0 obj<>/XObject<<>>>>>>endobj -1627 0 obj<>stream -xTMOã0¼÷WŒ8•CB’¦iéi eÅe«FË ¹ŽÓ%v±Vüû}vR(e«ªR>žç½™7“·QŒˆ~1f &x;ŠÂÓ( 3¤ó]'ô×åè&]ýœ"Ž‘—®6›Ï ú(BÎÇ|oXìŒÐ{¡tÿðvÃB¥·‹+ºÕJYpÿô2%¼tÀ "I¦„8ΫÚàP7 ¸Ì -0µÜ*ýΚF=aIËjYË-l%ÐP±±Ã;£:Í•Ïã:¡¯¹¿[®\kêOÂÄõ³l»%H7ÿF3É«çË~Þi-¤m¨­¢+³S²0°Ê#MH˜BìE£v-Áj!B}ÊåöÏzŠ†Ôp ‰€Ú¸ù©ùæ9òè¥IiÆþªÕLÔºì™3HÖÃ%ššPåÐô;S_hŽýKÕ”’žÐÅê“ÍvlKó•þ_bS[߆«¶¥cZ¼uNrZ˜UgÍznþü°˜„ôÖ¢Ìô{9ª¬º†(”_•(UÓ¨ƒÓÅ5$Ú^àOž¸æÿíh¬—¿n–/ÉKò//žXã©’DÑxWÌmY¡š¤©{ÑjÞf¼brK{óã·éQjÕ’µmÕŸ>S¬—ùÃë‹~íÇÈqív…Ë%.xì ?²D\S€ÉÛiˆþå|pSœR çÄSŸ5/µz¥|a¥xç¼Ìl­¤;Ä}¨<˜E×ï¶b;Kz$Qˆû‡§üKÎ…1X»¤ã4tûšìï`ÒlfÓ„>4'‰{v—~þz”_Üendstream -endobj -1628 0 obj<>/XObject<<>>>>>>endobj -1629 0 obj<>stream -x•WÛnÛF}÷WLó"h™¾Æ/EÇmÑÔiA¿¬È•¸6Éew—–õ÷=³—ˆ"Ü4…aÃ"wvfÎ9sÑßG§´ÀÏ)]åtvIEs´Èðq±Èr:¿¾Âÿ9~¤õÑË£“»·”/h¹†ÉåÕ5-KÂñžÓw•èœ4”Ÿfô“Ñ}Gè:Õnè矗—0?§ÓÓ`>ϯábYN?9aÛ*WÑ'ѬÁ§¨»JP>#A­ÜÒæàÊußNé–”%ñ,T-VµÌhYI*zcd먑®Ò%=Lkõ$ë9Í!,h~z•h7òáoj+6’ì½#ë/öŽ ÝàmI…¨kY†4.bS²ÍÊÈR¹Ã§Yô—_fçœ(·VÆ:RMƒóÂI+,²@½¸ÿÞ úýöÝŒãq•pâ8†R7Bá`Ùà¯f éuxfü $º?Sö×jÀ®[+>v€ -Š·Âr¼%ǽQÏ!ðZY‡Gxn,ÕpňŒÚTΧYIe"*ÉÿV›'ë“i3úÅùË­n$0ب‚¬ë×ëºUM"ÙŽV½£R•íÄ‘…3IÏÒ६kZkC ­«å YéúÎŽ¹ø Y $_ºš¡«©‚kŽ…½_ž|Îq~•ðù!ÿÏZ”’ÄVì2ú\I°EôuÍVl/FIr0=ÃA4Ñ€Jtà¤%Ÿw@%¤˜Ñ½vÐ7$ ãÉL3°6Âic'᪄σ ;r¼nü]ÁAgÔ³ªå¹6üµb¥jå¸J(Ô…Z²Fùf§€PÅë'„E»ãà i-*Œá®5 Xë‡ãQ¦o[F'ð•Ñˆ¢RAYã”&^B¡þÙ¬“fŒÏ¦îª~œùDµ•4ÊM¾bŒ$ßÅ6yÔrB ¦ô¬$hÎ ªQ¶‡ô|a'ÜZ¡nä‹(\äÒ¢ž(–^lÇšõrIeAÆéQJ_Œ‚B/˜QÙÝS>jeÞ›ÛÐ+^QÄy”º'£,ƒg"ñ4(éŒÞû² ¡¶"“¯‡1ò${Hcj&_Sm¹0k½Ù t7 *úIù/Ý“Àˆã~·Õm Ñ:î {#P!¾.ûN÷†ÀFÃ*õõÜF¹Œÿ³J¸‰å PC˜;O8†ð<ÔÅõ­z …ŽjëmïMзØÉÉ]êêÓ銓×ÀÃñŒjÉîxŠq«c” ÛÏ10ÀË)æ6ÆÇ/#R”^V®‚ÊÌ~HÛK«é1ÎV’ÓËè-JçLÊㆾŽ¡Œâš=ê -M¥f7áäÆøF+ÿùaw@ZµÖO¾£Ý$\Þ¦]ã<ŒàõÍËÍÅ"¿I±Ì8Ž`‘Æcrv•]2,ù–‹E¸æ7Ñ¡²€I¸/AÃö«ÃÙw¨ý4†«¥&ÉðÆ…#&‘V ,.IÃæµ}Có~@ïÞ'•®8 IÍó š_äorS”ÁU€9ó<áÏ€(_!œ/hr#ˆ¾‹¦Ë?¤¡r;h6Q@3®!¨°û#¬†ÿs¯r˜ûe€(#ç­DmCMŽtçö©&óg~@ÇF™zyê¦SD–æ¸Aå…bÇNƒ66r™8Ûªv¥Ú’kŒsÛê¾.ã`ë‘(ü ä¤¨Æ1†¥2²À÷#w0÷·N†ý/¡1NámÐPtµˆ?ÁH9ÄöJûVu…Þî›»¸þ¦2h2ñÃ[ Ÿ·ÏÂ(ÝGÖ±NûíI÷_ °Xˆ¦RZ@T,ÿTûs(ÔëÁ" YC½ßðõãüò:»¼Èc·ËÏøª÷Ë£?Žþ¦)[endstream -endobj -1630 0 obj<>/XObject<<>>>>>>endobj -1631 0 obj<>stream -xWÑnÛ6}ÏWÜ—¡)«¶ã&é€=¬ÅRØÒ1—¼\I”Í…"U’²æ¿ß¹¤Ûê0 E×"/Ï=çÜCåûÅ‚æø³ Û%]ßPÕ^Ì‹9­–óâ†Vw·ø¼Ä_¯¨I‹Ûb5}ðq}ñîþ-ç´nPëæöŽÖ5¡ÎßT—Ÿ¶ÜEåi¹,è‘Û’©S¾q¾e[)Ò!ô*¼]ÿ•j,nsÙõªX¢Ê%6- -úäÚŽ½ÎŽ+W´XŒ+—·€Š•ë­Ëåw8¯*ÐúÓ7ŠŽ"›—ô‹*£•­·} ÝÐÞõÄè0ú½¶Yp5¤ãi A“V†­ëM-xç4[\g”^±1{ªLìR¥ónã¹ · >( -Ü*y]匀PÔºA1×5xÇÚpiÒ¢¼\Q£ñMôlC£üäô×úÒ¬tÒÄŽ°‡­Ã‰>qPrP5=þñÍ ;ÅXcy=ÁÞ—ÌÃÀ6a -xÃÚâgp­Š[áÆèELk)ÿÔ& ÎNÐ+@âŸQ©=‚¤¯òlÐàNTjyŸ…(ø@Œc -x«uf ì+¹ô|újKèAÅRõúù-8™j—EKÞJ€4Bý]OYú¬¬òé8“­il5>sw  [Hé\ˆ&°çáUF -RuA_@qrÕÁnô½×DO˜*᫆ƒÌ$·ôpÿxEl"ön¶øJ‚²{j¥ëZuÊÖ\Ҍ6ô¨°ƒ v –„«…ljqPÐ7·éÁí0W‚ 9AÛ‡5ú°É*TÁk!¯žt0>œ(r—0ÙiKɦ2'Šçfó …ìT0£,Ô›²á*ÂèSDÊpvàþÌ5Æ.“Ù°qrú–}=È|H µ×h=È\ÖB’œ³CÆ8„Bæ*ôkÐTÖìŒûóÉ£f•òs•ËéB¢Š:¢Š´™ä¦~?C’(’ §é—¦é‡ÐüÚW½3$gg×Ò9#SJ~EC;­iûÝýYDʲ±LÎ:¡Ó”¢CR!‡b J¡×"–5Xi¼k1dc¢ÂÆ@’£Ž+”H©ä *G¬aˆ‘Ãê ùˆ2¨'8 í`:]×9{«CÔ•T~Á€B‡,FF$b7yŒ³W”N˜1 -x"¢9¡^,ËU¥€Z"|„6 ²c_Š(ÞxY #¶½Ô¹ '‘(»*cûŽ–²#*I"ŒŽ=Ý ì»Ê¸0µÁ)Ak™Ò -,lÄÊâÇÞˆ%B¦Ñ1Û2":¡ ^…#׌3°(>‹;D#æbÀèzÉAc¡O ƒñ)Ñ*!{oó”HQÕpoâÕ¿0' ‘‹‡åM#S±1jFå~–>.E© b<ˆËמ×ÏÙœïOîïñʶô ݳÉž›x\÷$`²ZÄ[ö‚d1Ÿ‡@¶uƒd|÷`7˜­¶-{¼ - Np©‹Î¸>Ê÷¬Z±™(3í¿Ãý·n9Š_˜®ç?‘nñÝN¬x6ÜШ9GŠ…(ÉÙ öVB/®=›Éy§µKl–Èw¾–Ì‚ð-o¬Ž}­F,4š_(Çyƒ¼sœÖ«Z‹+r|Ö˦wÁ7¯v)þÀAN¸ÑW(ƒÐ@$Ó›†ñ -0òüdðÇNó“Ð_@Õ$j ¨x‘™4Zrõ‚HÆ=•.œ¨KmtÜËÛ¼ì¥ ×ñMŠéœûƒô‰NÐ3®Î_åæô¸?ûº"šcçÎÔ¨Šck=½ógŒN‚÷5Rùu(/¢÷wxÈ,Ïø‡`Mƒ™ÃËrñ4Y…9äŽÇvfà"z¾”÷<döȺƒ]10ã¨bŸ/O®t¡Z–ÞF®ÜO–fbß$xhË¢rV,b©ÏÉûc­pI™ðüZaàG—Œ¨8ÉÇ‘>Ÿh ýáìÿœð»ã„¯®3©ÿ÷ÕÍ]qó~‰+·Öb¹’–[_üyñ ['Nendstream -endobj -1632 0 obj<>/XObject<<>>>>>>endobj -1633 0 obj<>stream -x•WMoÛF½ûW t‰H´¾,+‡ìÄ)‚ÖuZëŠ%¹7"¹ìîÒŠúëûfHÉ­ŠÀˆ@jgÞ¼yófõ÷Å„Æø7¡›)Í””ãhL‹é,šÓ|yƒÏSü9M™¼˜/¯£å¹Óé™w«‹«Ï×4™Ð*C’Åò†V)!ÁxL«ä²Ð/º˜’­ ›l<ýDÁ5úýê;͇FÓ ¬ÒKŸÛ¦HÉ×Z§”Ø*iœÓU •$Ú{ -–2Sh|Èqe¾W–¶*v´u&]ákCòM’“ò¤êº0‰ -ÆVäµ{1Õš|Ž£žAŒi4™ESNý|itÔ½jã#P¦êâStÿí¾K?z O&qÖÛ,Ðc–™D·!žßsrEa·ž’ ® —Öi•ŽTÎÿQ¢’\#]mP¢Í€B{4…+ŽZÊ>Ð<1Ï£Ù¤¥l:¦Ñ,¢Gðö.S½çú>HÙ#Juí4HÐé[æ¹]—OªŒòWÀëAòQ˜!Å;Z;U¦NuÑi›ë -­uxÒÖ†zÑßÌ:²ˆ\åõ£pèlQ Ÿç(ªG/ã_ËöxÇé}Éhgt/ÐÉ+ˆi§ý€#Vò DÐEÑ¥Ù± ¥Úõ2«5tà ºëÈG,!œR”Tƒ˜®Ú€ø½Vï+Kª>ëLbqBcE–­ÜÌtŸ—´©ì–¶†3°~cÝ deΖÌdWD8„EÁ”Zê–^ã4ÅfMµvhC©*ˆÑ”µ³/ºä!ÂàᎫq2þÀ­æZ@7­S Ï˹9AãAsÙÁÔ8²6È}Å¿o@;¬ÂÏ&îyäø,»5š+”'Ö¹Ftû*yH´•üü yþ †‚S-\™æSK¹‰,í•àei(ªš2†d1Zþä0@™àØ€V¨,ÓI ö˜NœT´úø•båÑ$6Ä+̦¯i(©àH1€r6q;}ÇÔ3N=H;brîSÆ&§ª¹ ‰­Á ~:zìê²¼àUxØ“Êaº¸ç N¹ "¾Ñ: £ -ªÕZÃQ|âL Ä9$ _æéDrø£\c¦ú B ºB›aÆoÆégT½×Í)"rf·í)Ù˜Z•§-Âr€È‘Ó䎅×j«j³Äv°°4¹GPªán)F%°Ó}oYTG#ÑK)Òê9uAK!tHÿ¨ Uµ›ø åê…•çfðb<Â@ç¯[H®¾|%T²a’<ö)”ÞËëÑQORÓíÇ_Žöåó˜Gôï[oþ‘iù/ßØ[á@Šæo:cèzªf?I߈åû+q:ßÎhד7bºÜOUÚ†m§±lzÅZÊÁÞõ¹ƒÙ`º=o\¬›Ì§‡»½/xz¾ì.Kp/¼Ãço2–xÎ¥ÄNmqA1ý -”[ÃΠ 6pý¢Š†åÈw*îì.ÖkS¡@8º`ıîX£•2G93£!€TNns åÕh!lBVâõ*î¸:r2 +üÅáÊœöXI²'»ÃÁK˜Q 6F³Ú¸þ^bÁà |;°àÛ“›\s©<ÕjæûOK -ßUåº&`÷Ûén­âé¦4 wȺçH⮫ EË®é:Ï$°3îcXS¯­I¨Ô½ÅÏF)ìꮕ8?YÌ–óÖO@üÀPãB+¯˜ÿ°”óîØÝ-‚!iɈ‰åÍ[B¢’a?óGEBގФø úZeÉÅåEÁJ¥ ¹…-·Éï|`ÿƒomÕ.¢Û®î-®¯ñ3¡kk*0èûBæä;QتrGz¾Šó%˜J]Zälª -õ^9Sì„»«ÏËî7ÉdŸEË-n>´×ˆ§Û‡»[úêìwÞŸlÒ¸âÊGû£›ñ¾vüÿkù|±Œ×SÜíq|2½æ°÷«‹ß/þW,€iendstream -endobj -1634 0 obj<>/XObject<<>>>>>>endobj -1635 0 obj<>stream -xuWÑnÛ8|ÏW,ürNQ«¶+Î}h®-Pàšë!wð -QJTIÊŽûõ7KJ±£¸H$–¸;;;;Ëü¸˜Ñ_3º™ÓUJYu1M¦”.o“kº^Þà÷9~¬¤"r!L¦Àiaõ„ÖôðõŽQLi2»BÈ™ªB&—п¦¥LÔÈéÃñ>OãKáéATA{…@GD­Sõ6`d¡PzO#2W¦&Uºj“d¦.º7((ö¥r„o®þEZ d4ôG+Ãz‰Bd™lü[Ú´žjóö0+sÑå’ô&Rü&Ö£$´:r߃°2“j'à Ðqc¼é˜Øâ“~†©KS›ÖrqÚ“toÌSÈ=øâ)—…h57ÎPºX@Û›ƒ—ŽÖãNÖ—±TåKcœSÝ•åLÕ+ÇÃ5ÒÆV´‘ÞCB{åKh®‚(ð°—µµò ¸§;¡Á:+HKÇø!ŽùôzÉɵz”ÐÐf¢u HB§’k€¨r¯*¬©2h`&"rI]Á}×7ÜÞ(™pöt®&Wב'ŒSšÐŸ&{<.åì4ÝžƒGÁæ9YªjŽ[è¼U™'Ct*†ÇJ‘¿Û[]f<.ë±Ð¾4í¶$pž«rFr§Lë\¢~Á»õeB_ -:`šd-¸?ƒdëq™Ñàó÷tn´¾dzêpžÛX(Ø@.GtmQ _¢ã{¡k¹¨3I%£¬ wpþLSXïÃ#a¸¹‹@~€vh NX?ˆuÿù]lk/sÀ‚&bبÉÌ´:ç?Z¦¯Tà š¨qp€¤ 2Ýc”ɯZ}“ÐC) ªÊä2°}¶Ý,üF´ö„,ÓÈš5p²ÈО9mö<çøߦðÀ·‘QÁ9ëräŽ9G”!5¼Næ(Ù›A!E«ÁÑQTAÖ&qŒ€Þ£cGoEÕAÁ Bð^ 'gÞC¬£fèÇV¼rQƒ€~!jPÜË#Ó&r,œ1„¨$†7Èh=Ɖè<ŒQo{I{Sÿæ ¾±È`Ô9a¾í t%·ìœ>pÇ9à MLÍÌDF e1Û¥ç<âx—ÇlÆ,¡ÏÆ®j¬§¦Ñ*¼4‚×`Þ GUÐÞþŒ†Øð}äùfØ•`§‹rD ±HäÄa ³ýüƒa2{÷2W.)§RŠjý…•ï ™3c±<0ëÈ øÛÁX-¼ªXуŽšÀ 7±žgEË{>¾×"¨™z4tÐB ÚA#ct&w#³WÖ5rúYr›à‚b¥–h7Z«1:8®‹kßûOÅä#(úÚ½ôw²†9~ûƒÂ/•ˆ xc4¬.T^›=àÞ²ëKÀºìÏ32ÜUt¸›¼š­¾S÷«!÷­>ýN_bua©ð’†§÷Ì +fG]°4Úï®#kXWÊ0¬ÊTE·XÀ¡Â_¹à’ÞJÙIÍR<ëݾéonº?˜3ôˆþÔ‘Œr¹i»h¼jئyÿ‡ÕÎX‹çyÕ C[ìkkš×—¹“õqôÕÞQ¹ôî[èÖ•Ýægt ÿµqñÂlýþËQ Hpmù„u¸†uD-»ô,Å…yEi—}øðõî}³æ;&“>š¬åeâ2u“þÀäfzË÷®××óëÿ0,æ¸Ìãñlžò±O«‹¿/þjñóendstream -endobj -1636 0 obj<>/XObject<<>>>>>>endobj -1637 0 obj<>stream -x½VÁnã6½ç+¾4 8ªe»vrÈ!A[`Ù¶‰E\h‰¶¸¦D…¤¬ª_ß7¤œh•lö°@$ !çÍ›7oøt–Ò ?)­ç´XQVžÍ’­ÒU2§ååÿÏñk%í‡åò2Y½õa1Ÿ½ý!Í^_u»9ûù÷+J×´Ù!ûê2¥MNÈ<›Ñ&;ŸÏ“«„>«\’V•t6_¿¤a1_#Ù&?ß’&mwp2µW¦"å¨2-ÉJlµÌiÛQ.w¢Ñ~JÛÆ“ÚQgÊ•ãï¤<=žïŒ¥­ô^Zr2k¬òÝãò…¬Bl):FÜéõ ·kv; ª¥ÅáRT™¤w© -|9£ªÚÓNi (¥KˆÁcµqŽ‘j霬³‡Uˆ#ªÚKß攉 §®G©;é&Sj •§RôTcéz¡÷b±L– ¼¦³„î¥ÈÉŠö}ZmŤJ+N¼æÒ©=£õ|‘¨ç¥r2Ÿ’6í…^VY*Hõ|>¡k í5ŸYaŒ“|me<¹¦®™hYaZ‰3 ’åô Ê­ÀñƒtÏAÜ»É/ƒ)†<€r/^ä0â³G ŽÕµŠt}¬È™R¢ É2­dåå¦úÉS,Î +vÔJ­L‘ùFhÝúÈ´ äaïÇ€€Ìã"VÙX]|,qg3S‘ž›ÐˆðÒy.:CÁèsãÁÖûjMaEù}¹¶§°Òk¼åÿìWˆßUìˆç;{Ý{ȵ„g°kòŒa -13“A*ÅtW±mi -_§ì[ÑRXï'Óù‚‡2ƒP÷ÐR¡‚Œ0zîû}œ÷®S[™«Œ‹ý¦ùÄg•ä&jýåË3Œ¤ÙñÐÐÃÝ-f£„÷æ0Ø{6›Ap)J}ïlp ÌôˆQù·‚rágà›µp>Z†4X ¸ÁÀ·B³åp\…£CL•°Ve.aa#Ô­('jTvÀ4´÷|gÈiåSƒ±éo|5ê4ƒ@¿È†‹.¡¿±á8}t½à‚]o)Ñ L]¯”±š> ^ /€Ä#§á™nàúÌo¹ži˜ì^‚/áŽo¾uʦÑè°^ewR×iæ½à;ÆÉ„±~±ü„£Égü 5Uý´ÁÒŽ*†z´_›Ý¨ÙÁ¨„¯Àày"”0†¥Ø"sØI¡Q0vncÔËÉÀI”¦©°¸j™©âu»Évê_€ìG…MUèVt."Œ)@kz ­6þâê\X…gDœ›o,÷EBwØ:Ì~]Ãmcô/§XZ¿e# 6çØȣ†ýêÖeÉFŽFðJ|ööƒ ³=$Çz—Øb•c·™Qaƒ¥0eÙÜj¡`¬˜°Ïyñ犟UxAà6f [œ×>¢CâÛ¶¼AÄàž˜Ëþ‘˜®ðv½\ÐjÝ?×nînoèOk¾ðŽúÕdM‰ž5Œòâtàb=»êßJ¯Þ Ë^¿¿ÌñÅc*¯ùào›³¿ÎþÛ˜Ðendstream -endobj -1638 0 obj<>/XObject<<>>>>>>endobj -1639 0 obj<>stream -x…VïoÚHýž¿bÄ—¦Rq0BNêš -)$\ Šz—Ói±×Øíõí®1Ü_oÖv~Ц§@dÖ»3³oÞ¼™Ž|êáϧ³> FdG=¯G#¿çõi8>Ãs_-)r/†ãþ;/z¼÷àÄ—ÕÑÉÕ|ŸVœŒÆg´ - z=ZÇ+E2ëTÒ^•î‹­$«à/PY‘àÍRdkAUbc²±¤îåýrú÷|>Y*l¢r‡_\]O¾.)MrI*â•«ïG=êúÄ» -çâIF0è5ëý‘7äõeá1–2™)½§LE’o(10î©42d'|K…Ìñ[KÁ‹éþ‰<ä½¹²õÖõÞÅÓq[´¨:À‚¹G«¸4îÚ™ØÃ> ýb’$£H66I䄉q¸½xsŽúy>øÍUÇÝýäêœ|äÒ kú}Ïz´LUEi"skøøëäuûgÞˆ»ĸƒ&±0€¢PÚ¢‘Örœ’B+«•rB/n曆ëû%áî±Ô¼9§ëÉÍ|rÓ§ g]P¨Ed‚ƒÀM!a=É`n+3„FÇ‘Vù½§ÃÆýS~züx˜Û™§[Ç#M‹‹çã‘Ùù#Z d÷ñ#U( óÄ¡GJ“C=VÔ"ä=ªLC -bYyôbYI²$ú§Q×gÖH…f´ð¼J˜Óq$êdbG»,±ô™ú½á¸ó‰’ÜXÇ´~E¾9D¶½pKòk…‹´›j&ùWv(K6±%‘E±L‹_á´!µ‚Ã÷yàÈ’º=$¾4S†Tbo(,]!;c*¥vƒØ&™ôèÞ1–w€vG -Àò@¤Ô)Ú3©ÜÊô°†ª$M[F C¸±Re=ú%©Qw·mô…tî¯.(ÐûÂvZíHjíx£ ïÖÇÈkJƒl™ÃåûY™#žš¸ -.£„,îÈÅ¢·¤ÀÕ+AûÌäåNdä猪*ãHù ôÓF«²ÕÙÜã”sË.J–(¶²F5¢ØV ®X¬d"~À¥t¬›h(TAí0”V$©Ýs*„FjJýØït:–IÕe¦J:d å;=D›`GžW"Œ@f7—·ËÙSGz¬,§_çÓ›•[bœmdSè ô.+À Öß_\`¼†7BnTÆ -¥?g,R%´õ>]ÊH”©½ ¶5Â(5üŸó%Bú … -&ÂëO{ÉòÛr5{³›™ë -ë@ÙÝyôÐJ7kæä:A'y‘.VŽPå,=åÚ*Þ·%Üö£ùžT•#ÿ¸/t8T¡õýnøŒ6­« â6Ù¯pªÛf åV¤¨ÉÇc4¹£k¼5D”n‘EýÀ·/ò½«9‚ëúºÌ¹Jaq¬3Lº‡Åç–qàÅ¿t¶dB­ -F^P„äƒÇxô€6ƒ`÷×Ô€|ìŸ÷ÿÚ+ŒZ£qî)”häa£L/L lÑa-«»:“Ùî 7P âw´V»—)¥a»r`ÁVCAž“º×èB±@‚»&H ÉÕBùX²C­h(¡+b^åé£~ׂ©Pó›@åAŠ¦¯ró[ƒjË¡Ú†€Bºjì£ç”…'wáx rÀUUåeI •jxpÀ„öˆ*°,Ðú°ȳ ¸3*x"ÅŽ¨´IšØDÖw' bÃ÷_Uì…Ê£dS¢k4ÎOY¥f a“‹9¬i•®Ás5½áw­c(&Lg  ÒºÁðQLSpl¾º_.¦ÓKA!ª㚊ܠH¹DßXó0…ïVè¼¥:³ÏW­ó €%"-%h$¶HžÄœÇm³¯}º;ðm×®Õ½Èq=p8ß.‘˜Â»m&çb‡ðé£éÖM´]ÌÒ˜Ãcß#v‡ŸÏ#î´õg[Q¼õäjÜLâþ3ýx€y¼Ž—“ù— -´úÎÃÒ¥ -Jž³Ü”Ê'»þÃ=tÏzçìüqq8{£Ó~`Ìg§«£ßþ§ñ¥endstream -endobj -1640 0 obj<>/XObject<<>>>>>>endobj -1641 0 obj<>stream -x…VÛrÛ6}÷WlŸìL-šÝì7_M£DÔI:u ”‘€–Õ¯ïYr&3M&˜^»çœ=‹¯'…øÑ$¦dLiy!%£Ë`HÃéëÿŒ¤üäfurñ0¤(¢Uαãé„V!> i•žÍW^7Nß)›ê'i ±.ä›Õ—“6!&;KâŸñã J‚˜?aÛM!ÒÝ[]È;édê~ºsøãΕ*%­4½SO’î+¾,ûî¶ÑÿìÐÛ‹%%ñw»Æ?îz7£[‘n%-Õ¿’Âïâ'mü Ñ 75#g”ÌèI׈¢8þ#“ÃÊÉÒR)+§t… UùÏ™NþH¢Êü]a"h¿Ué–J‘I”©<—FV©$§q -ç~ƒs/¬ßluº“ŽtÍ—Ø€fŽ\cø:Ý8šÇ­¥s Jç9í•Ûò/Duø…ÿt§¾Ôƒ¥AÖ(Éåjl-ù4ÔdDe‘Ó9¸—²¢'a”n,N­.G” -eY_— »Ïñ`<¦8œß•†•Â—“è’Q×z³¾R]ÖÂ)PìÑEF³»{Ê sÿxö»Dik5HÂÇ7­€ó1/2ÂDl¤°Ú …rm( -i-¬\½jfŸç÷þˆ\m#‘º‘W´>¿ÓE„üÛ¢(¹Õ%¥ÂdW4ŒÃÁpîn.,Âp0ŠÛõ"âü=¯Â{Õ&—ص†XºõÝçá`r„°㊒I8H¦mt’`=òë^3_×’ÒBà±c‹Ü^S® -®Ž†Át8ùìü§Žªèø‘ÃZLFS0—¦:u8?3•U™4ªÚôjb­oÍèÑR”kA -4U…X¤Â¢<åÛ™jÈ;ݪJþD|ÌeSg ±×5‘Ï3¦µÑÍfëä¥ÿR!ón)7 èKÃÕ³ØÀ†§]g5 ¤Sg_×TÉý‘6¤-h‘$ W[Á¢|k |Äis&œ%à³Ù6럨¯ËÂmqÒÝK­³«^Ãxï²QµoÇŒÆaø«Ïß6Òõ}§õŽñŽ¬ƒup"«ð¨à”óoà Z+ÄI mŽX458Ê,7ÎŒlSך³åD‘p©}Â?Œ„:ﲞÝÚh§S]À»Êát¬A¯"oÏŽöù~„q´iJª¥Éu)ØÒö>|-ék›äŠ6¯-_öÅÃ%E˜:9¦É ¶^ÇAžèc+N†õÛ¤Bd< ÆìÊKæ»–º†‹ìœj¥d[(¨jʵ4–+‚ɽ¸P;FBÙs¨…<"ÀvnÐ3Èöƒö™Ží3«ÃwyÖ£à?åŸ6”˜}Þï¸;ø§5¹´¾P5ךî¼QoaU³ôÊäx*À4×ì¸F”¯—óÛÞ•÷ÀDcš-¯Á…%ÉdV uÚêÓOŸ“k|CÎNQKÆóœ{d0‰e.ÐïÓ§OªÊô¾ã»wÝßóåêvñ°LyÚp†ö`1åU)>*'S pPÔ9¾o( –='< Ž½SUóì+à ^•Ü»•„âé¥Ü¶º¿tƒ:ÑÞ ¶|¹ 7? -V>‹2°˜ÓÙF^@õëL  †®Ô½û2e e£Ä~μÂaÜ;x€¢2ß”4clŸ-é©®¨¯F½7Êq(ëm„—G´î\³­燜›ËXyΡFz+-´kû¬ñHØ–ÂìøEøF|½]Pÿr/OÏØ!ôQÏœ`õ~uî—¹nŽhí‚ò¸¬5Ï¢öýÐJÝÛGÛ=­:sS­ëQÐMQÐÃÇ3â¥||ʵåºûõQMàATš±¡‚…Ek qÍÅö2;Å"ãáÈ^wk¾Áy,dâ@AЙδ{ôFc<ˆ§ ð<öo×åõüæšFñÏÖÎ4ðNÑgŽl7 &á%ÐO­j8žãQÜ>£ø’wÞ¯Nþ8ùÏ•êendstream -endobj -1642 0 obj<>/XObject<<>>>>/Annots 1030 0 R>>endobj -1643 0 obj<>stream -x}˜[oÛF…ßý+æ­ PÓ¼_žŠÄiZmãÆJ݇¼Ðe³‘H•¤âäß÷Ì ÉÊBQ èñdz;—åîRÿ^äã¿€²¢”Öû ßóñ—ùŸ¿\‘—S%^J{Jc/ÅŽî.’Üó) C/+|/…c~ÞòÀK(ÁÌÈ=~âeÊ I‘bhSŒ­b4ÉC„„ cf"˜‰ATh Õ yŽxœUrLÒBrŒeJ<¬‘ÈŸCÕ™‰p‚3ÆvF«Aã¥sT+p€~Æ™ˆâ9­f+wÄQµÆ‘T=+8"ì4’‡-¼ÈÀÀ—‚Eè=O&(q"J&5Z'EåE“Mü¥×hÐBJè¼Fï) }nÌL­3NÈQ£AóŒ«è¨Ñ w×P£÷….Î×jÐ$Xx­fZ,òµ4 ¹ÎsTVƒæþrd£÷£õ¶ Vƒ†Ñ\uŽÙjÐtóØß ÅˆsE™þNTûé¨ÑsÕþN^í§£FÏýéØßÑ;ö×QíïD“Ä+(qÔhŒœÉkë¨Ñ¨³n3µóøfd«AÓ”_1ç5š;òštÔhPdî;j4z¼bgj5÷7]Œl5÷7^Tcì¯a=q}¦¢´¿NƒbOCFŽ ª#;j4(¶y¬IGF‚b1¯Õ ±ì*³×jî ¼ Ž Z„Ë‘F#Ù|g¯Õ q°ˆÙjPä‡:¯Ñ ™l¿Ž š'¼_9j4÷7_ÖYöØ“]öTUîœiT`dCæò»`¨ÑÜÁëÊP£¹ƒ æ7ÔhÔQY¯ÕÜ£9¯Õ¨FÀ§‡£VƒbäÔR£A±‹Ø¨¬æ:gxÜÈrÌÅÒ -$äók¤J -i4(^¯ÌR£A3¾ÞX/ƒüré1(…¥-rÞ8ç‘5KQ9j4 -‰R!Ý™Z EÜ^Gæ&ÈÒ˜©¾ú±lØÏ"*Q³Ñ Ø4•£FƒbÓDöŽ Š#s1²Ñˆ -‡Ú;{­Ö˜#ë«ñµ#ã¯(‰ÙhŽJ2rT{6zC¼dˆj¦VcÞ”/ŽŽµ’ã#‡¼ñÇ¢´¿Nƒ¦9wÁQ£AqT##GƼaÁý©.Xì÷|¬(™VìDÑ0c¦b -¾jOVUÎ:SÙR 5šó 0†¡Fs>|13ÔhЂW¤¡üÚDyŒq+æ«à˜ŒÄ>AÊŽi2ØE¤íŸ‘(6*Ä¿ò9Á7•H3|LÑÈ;ì ±ruå;$!Fþ,QÉƌӘ¡£Pj‹)ªˆqÆIˆÃ86PXzr›Âþˆbg`4ÏÉU2Ôh8âøœ×hPÔMqÔhЂ—«£>§¸¸ØÕSŠDHLÜ0>D¹¶)ß+U03RÊg™ï“O¿¢œÑj„“„(ƒ£oV²æ¥×ªxN…¸JɪF?c¼«¬Äp\Ýœ¯¹¡IDvŽÇ¡^t" ª„¢|“FD¸¤–ªWz ªÏŠ2Þ‰ª×QõâSQÒQ¯(ã¨zU¯?}\IŒ¢Œw¢êuT¼>„õâÎ^UÎ;Sñª^ì—®V¼›¦ReÍ_õT+CÕ‹§—™W”™w¢:¯£êŵÚÕ*e¼U¯£ê¦Xæe¼U¯£òÁÄ—_­¿žªÔë4òCÔÁPõâ_­•<+Êx'ªÞ™Êb–ßö”ñO òÿìs -3Ê–>##Áp/l®8pññ‰÷§®¢íÅÛÕÅÕû‚BŸV[üp“f9­6ò{ þ²~uó—Go‡ªÙÔߪþõêì*j·tÝ6CÕ ã“¨Æô¤¬\<‰UN·m7”õ®¾óˆøèÒàÀ£_o?ýÍäÒ_У»ëô©©¿1]BŒûî±-AìÑÇjók9Ðousü±èÊf3\ÞÜÈ$‹ùñô]¹( OP;¿jÚašêóëu*\3~¤Æ½o'óØ‚ó4èÅDÎÕ«PÈïc!ë¾?V==?UŽúùïU××móù5Õ=ûjc3:ŸºÄylZTê±èСþhÕ¦«1þþÜìÚrCÏm÷¥n%\©ãØFõ¤ˆú¾nàíåù{x»öxÅüâYtëS_Ñ®ª~ ÕõíÕÍ-õC¹þBÛ®ÝÓïõºkûv;¼\ -Øð±X«]5Täžw´­w¨K¹åeß#ì ­ŸÊæ±:çF X -ãò¸ßÞ;,›f×IóqæÁV"äé!~_§Ù$ÇË“$a˜ -òC‘\ýPä/£IÜ3¡_zïªîk½®è– J‹QñüÇê€ €Ûòöøø²¸øœð覺vs\X/’Á­Ì£_ª¦êÊÕͶ= ?‘pŽ´«¾V;ÍήR|°Ê$U×`ŒªëÚNZ>ƒ`ß hé;´xͺcÓ°8tíºêÏXRloå°~ÒÍrYQ°wuùØ´=ñ½=vÔË^Ó£hUÇY,j•ž«„×KDˆ·jàB½L3åB¬°@ Žk¢B -N È> ÍNmârVœ #ŒÎ9QZqÆç j*09Q!é9˜0;ó¾X¢œJ1ÂâœßÍ:iàŸÅs‘¤J§E®wC½Ûá­ú*«;ÎÂ^v˜«÷¸-È (6ùYgàËC5Ƈ`š„8€ƒHùyuñçÅä\‘¨endstream -endobj -1644 0 obj<>/XObject<<>>>>>>endobj -1645 0 obj<>stream -x}VïoÛ6ýž¿â€}ˆ 8ŠÅv¶O]Ò.ÚÆC,è<´DÙ\$R%©¸þï÷Ž”âDíÚ"€%‘wïÞ½{äד! ðH³§”–'ƒd@ÓÑE2§É|†ß#üYIyø0ž]âñFÓI2ê~ø}urþþ’FZåH2Íi• ð&í]íD奥Ñ8¡¥±^lT¡üáÍê_l›Ðp·æ½Êzw¢ÜÚûèÈhÂO•I²Bo%™œªBøÜØÒѦöäw’”Fø\¤’DQ„7Ç5•5O¼]9ÒÆcÁ^§ÐÙp¦¦¬„W›B&´ÚaeÚ NöBi÷œóÌU2U¹J‘“1`#Ü á((LoIèŒjÇ¿—’ÄJ/i8k*O’ W -F† Ý,ï¾'c–LyÉÍòÔ‘*«B–`B>àêª}e´µ¦®°ÌõIÚ> -ÕgÎ…°­{J»ƒG*š,œÑný†‹•h¹ÀŸß›)!&媈z.}zßpqá±0[”È™ œ;NQR)€ä~qíÈÒu¹‘Ö5lp¯˜5ƈÞu*­|,dÝ[¿a˜b` ú ì }4ÎS“Ed%÷e¿3ô¨Í>¬³¦’ J4áñ%dé î¤^÷vLUØ—éô©úc´-_(Çóu¥2®lkXv†˜A¦²ƒ~¯ DVDýÊ!ä ^®'Ùp0õ)úÀ‹u-í—*<)–™v4HEö ºÇ;žDX‹ë>–©tG¥`ªä¥‘ŸNοI‚N}ùøöáÞÉbhžy^Ö½¶‚KtcŠYPZ[ žË›åÙýC30••iQg ÿlä?½¸Oúœ¹“³v54xªÍÆd‡SúB óqMãT,r$ujjžl´Zö!°G ý³h™f߶VÀÂÖs.â(‚£Ng@™­1³,Jf®Ðˆý7êâÓûG‡ìëO‹ÿ?œøc0'ÑŽg”-kù6jæçm|j„`qnx¥ÑžVæ­ü®UXÓœhÓölZ…Ì='K…›p]ÁÏ7Vàxä¸bo¬¼;PïÃà€íx26jÙ(“¹¨ ´Zæ*‡.Ej }ºýònqÝNuHçš.‚ÒÑ “]cá.Óј%ŽÙX‡]*v ÜSBÑìùÀ– 5CE?ÖÃî¼Å‘çù´Ù›çc˪íÎwË\èáÛ«„H\I ;g¿m§ Î#K–CË _epC ¼ÖAªèZ„®Ibf`a" ¥”ÇNméØ pŽYì*Q0fòh/f¦ -cˆºãä{EïÀ-6Ü{ª’p;zJï×vÝe{±l®[ÔüK¶Î¢/M„ñ—a\¹Ú×!Tó¾Ý^š'ù¿LfýlÐÙüb2`Ñp0è‹Ÿ¬Š¡†ýlaÏ_\ˆ§ñø“ ôd:O¦#ܺ|81Þ­Nþ<ù&gÂ8endstream -endobj -1646 0 obj<>/XObject<<>>>>>>endobj -1647 0 obj<>stream -xÝVMoÛ8½ûW ’\ V$Ù•=$›k é~ć.P  )*fB‘.IÕë¿”ä:Nì¹lKÔðÍÇ{3Ò·QF)ŽŒæ9M âõ(MpyµH -š-æ8Ïñµ‚ªxc:Mf§ë7«Ñ凔®hU©Xà¤$ ¤)­ø˜ºOm¾«p:û2vÛ/¯/Xözõ8Ji’¥É;†Þ²m0<¿0Xsî‚AöjÀ౎ąµÆže¯Þž¬¬ðáÊÆËtÀÀzî\~˜Q–µÙNò"ľm<ùt$5þQ,©µ¶(f´;áE#ËäcÃ9*à$Ÿ¡ÆGI”Y#²¯ÂItýòPZ(¼ø†ôÎgó‹ÁÔzvγ4½`C8@¥å}=Ò/É3«¼°Ä­`^ê‡H5[£¾‘pG{Ó„5MÌ9Q¯¡\ÕÔ8·jxs¬œ–fæè™4ÐyñìÖÃKÕù óä6¦Q%m­)Ýv! ˆÐ´ë½ÇÄtù3Á×'¶Ï\#×´¢$oˆ•øÛ‡L¬ÎÇåÍý)©Eß·Ÿ–Ÿ‘0÷Òh2U´ºgõšÑ{¡qúÇ4–~lí?MòÐ;©TئIóDÎÔ½:”| -©K7ØR-æ»Xð˜Ú¡ô†&J?/JL48D8}£[+B#ÄÈCfƒÞÎKäƒÌ?ýñõýòv¼²¦ŽP§…iíãCj®šR¸dÓÞ¸¢lÞÍ i70r ç„þåïPÄG©›qQ¯-¸õ“åòes yäw³'DÊåûÍÇÛ¨ll¨®ÔÎ3¥ |¢4CB{»d_ -Ï/7Æy,;ªŒRf7ÌCœ·øÉr>/XObject<<>>>>/Annots 1041 0 R>>endobj -1649 0 obj<>stream +ÈsÑï0´öº/ç{£Bìwa[ˆa‡e|’0¶.®Æ,+#x'…ÙÖª>|yÿ;†#dXþˆÏœh1ÊG٬ٵ…ŽX_aÂÚ¦ï͛ӧ§å«?Öý»Osà=i zߤÌf¹^ÎÖ«›8‘^¯øèçÍÙ¯g–ËÍ endstream +endobj +1581 0 obj<>/XObject<<>>>>>>endobj +1582 0 obj<>stream +x…WÁrÓH½ç+º8…ªÄ±㘣!K-‡„,q +¹´¤±4Dš13’µÞ¯ß×3’ì(ÙÚÈšéî×ï½nÿ>™Ñ¿ft}IW J«“édJ®fø9_^ãç%þ8E›ðÁÕr:¹|ëƒËŇÉü­–Ë×>­O.¾Ìi6£õÁËkZg„ÀÓ)­ÓÓG¯œ'k¨.=Þ}ýI§…6ŠR 5^ÑÝZþrÄ&£ÜÙfK†+剽ÜSk›2 o¾3\ëz/ oMÞ¯Lé|v…ôÖÙéZNÈõia[C]â&oq×ñ:øHe”ì%vf+Ö!IÖ‘Ú)C¥Íñ¬–s£Ô%KטQXŽ)ý<ÿ¡Mf[òÊ{ÊQGèÓ½\å˜.*÷d“¶'×)ª ¨!eÜ—àiO‰Ò&ÂÿBAoâVó³ +yo¬«FyÞ|»]}½{zöðZ„ßF¥¨€Ý^*Ð5qYÚÖÙ˜LÕÊUÒ̉S™v*‰[âQÜäÔšÚÙ²D·¤eS£¤ ¶ìj6%;€oŸÁAº-tZPí/ov· X8µQN™Tec\WY¦%ä½?ÒÞ:»Ó™P iÐZƒlp§Ó®˜ H+ºþß—MžsR*Z½84ªñÖf°íéô~uûôžüIWB¢.î8æN3 +?Po²ÙN“2/#ÞnË.E»3 +šò–]êz–—;„Æ" ŽWd7Ȥ…³Fÿ#ìÙ²÷­u™°©n˜³„F4p”>½#RñµEoÆ«žâDLJÛAøtÚIýU³ŸÞ‡þ\|ùH3Ð^¼âÎ0›O®&3ÔÆ.W5=B9RⱯœ_Š¯œI¡/ >5$›3ª m”êñ¨àJ1¤þÖ¾–²qÂ"œžAfã؃ViÝ ÆÐéŽjðÄ­ö  ºØ =q1øìë. È+ÜÓMžµ0ÉH7`q£E=ÛÒîÃuãhÇ—·º.,¢ )IˆWÕâWŒ°Ð ר4Mmcj”q\U'æÜ)®a0^W ÒFG†Œ‚r%+\%‹r +Å™ð'f*Ñ_×p Žè—ùJ‘Æ èšw*¶¥å½+"ß*ôk `D¹‰ /Xi +É:Ž:t~sŠÁƒT$ö}è~&¬DDá“H^Ž2‚Ël² +m„€C–nuꬷ›ºãZ¤1Z‹¬‚àEéQ¾#Xû@^qg–¢rJAö"Õ!íÈByIz Ø%3$3ŸÐŸ3½$~Hn|$›É¢2m7G:S‚…Âu.c1saµLi©ïE¤3cV×è2¡t`òp!†úÐMþS ¦Tö2…SÊXU(µµ” j|ÐÍN•Þ¦Ï°€–a݈%sÁ©ß ÈzÂÎœBk‘Ôð‰˜T®Œ)„™.Þ=<„ÎÂKG=‰EÊÈÄ&eÌᘗ8˜2/zúÏhàP+[øžgBQ”ªp¬¯˜¡{ʧN'xÔÆ”d]‚ÆŸ‡†¾ásñÀë¾7(û^ÌÄ¢>#³·:,ýý¹.•ð4Ú¨–öŠ?#µ†/øa"nF+'²Ãî³cVŽ®¦58J•ªÙÙP\¦R›©þ¥ˆìE¨X—"‡ÿ'oLÄÛ‡ï÷Ÿ‡™ØYÓ‹QéweQA'¶QL§ÊÐa»•VCA‡`éòbó݆)RKË&¹ˆeņóЮ3é vŽÃ\1ŠØÙÂÖÚ÷@¥¸q^àn0T¨ÔeúÀZHÊÊ:„)®Á°p È ø{§+ÙªnâÒùy؇F¡±CÜ^›Æ„ŠÃ„¡B³Îd%+ÄK¬¶{­Ê tcJl†MrC¡sÑUeîMTŽ&¼mÜÖbÒŽ©Þû ðñ}ë)ô;5(Å)ÓTAlý00£žÂÿ‰mU”@¨£j9‘!'«/Ö³ö¯DºñÆ }œîE&Ç… ä‡f†o¥r«í(hZ°ÉÃxq‡•gBŸö7YtžàöB!§ C[‚1ÉÅÁCâ7ŒÞ¾¶³Á *ÞŽ=/xÓúxb÷Çð5e„;ºûð=çâ˲³ÜÙ_é–W´˜MÅV·ŸVâ¿d~ÞØ-š *‘ªÏû×ϯ§åýÿXºæ×óÉõb‰õ ï|¼–£¬Oþ:ù9ǃendstream +endobj +1583 0 obj<>/XObject<<>>>>>>endobj +1584 0 obj<>stream +x•XMoÛF½ûW r‰ Ø´d+²“›7@ÐÚu+í­X‘Kkã%—Ù]ZU}ßÌ’2E9HŠÀ€MrçãÍ›7³ùz4¥ þMéòœ.æ”WG“lBóÉ<›Óìê¿ŸãÇk*åÅtþ&›_¼_}|KÓ-KØš_á—‚`g2¡e~BS5VWpà\¥º=Sàôb +šC©ýEFwcWeZ *ùúµ^"£¾>!çén±8!ÃY–ZÅq¢‘Ÿ4^N˜Võ–>ß}ú‹\Ãr‘Ã6D]…Œ>ERÖ‚#äÓ8^:_IN @ºv!ÖUD-Ît*—f︷Òh—àìhYzWQaŸGtcŸ®õà|F‘ +Ê2SBæʺZ§46Î?ⶽõ.©=÷â´7ˆÐ•T¢iFnKcñ. ï L2…¬Ë•%y#HetMµŽì(À1Ò&r»uù¾ÑØ7ã1p–¨‰jÊ]Z ³t÷iA…Šj˜ õØKÏÝÜ-¤óPþ¨/ÓÈã ¢ÂRô÷ùÅÞ9tF¥0á]‚úÍ`ÃéÔ(~—D¸Ç$}ݳ` ]"™Ü9ÏÕÜË÷J?`yîåa|ŒwLpÐAˆ\k]°²â¡ VcMÇ éÈÑ­|‡•„óña@âGOÚc†%+ +zÕ™z•ÂNßý¸bã¥Ðëä–7åÆb,¾H0‰)3D°_[DQvzž$å;+í,£{Û><¨ìºeó±ß!n¥í¾u—ùÞ1Lu‹Eý±v èþú¶Ûy»•i V!òý†—µïyŒPâœ7ÿ¦ 'ê|];ë €¼^à~¤ØI¯&íÓ.ù"—åöy»¬4€bˆläz·úö«á Rs:ðn­ž8¸Â}ÐU T& ø9G”`«àƒš•-ôîÀåNÎj”GaZ«<5k^j£=HpÙAY¬†Æ®,›·«¡O ‘ÛŒòäåÕ!j† ³j·gw”V_‘zŒÑzZgÃÝö²SœnwîÄ#߀ n¹ôB§[Ý;_uÃf:Çuþê‚æo.Ówq}ûþšî½û‚Ûݸ7ÎîFÇ>Nû§—“·»ËÜ_äg—³ìr~…ÿÀEðí›üyyôûÑ>Ai÷endstream +endobj +1585 0 obj<>/XObject<<>>>>/Annots 949 0 R>>endobj +1586 0 obj<>stream +xWßS7~ç¯Ø·’™p`ÞJ Ié4 ÎЇÌtä;ÙÜIŽt‡ñßoW:ûÉ´ÃÄŸ´?¾ýöÛ½ï{#:ÂψÎÆt<¡²Ù;*Žèôx„Ï“ó3|ŽñÏkšËƒãÓãâüGÆ£I1þÁ/ŽÒÇ—{£ñiqA£É Œ64>>/F鯚îÄÃÙékÏï¦{‡ïOh4¢éÁNÎÏhZ‰á#š–û÷ÆÎŒ­¨ :P»Ô¤:|ÚÖ”ª5ÎR£¬Zèß±• +aí|5üþöò#Ûj?W¥¦ÖÉ ¯Zýfú°wD£c¤7­ØWåÖ>MÙ|Б¢¯Ÿnþ¦° ­n +š.M U×|ðÕ¯Ý÷ØMºØ¨ri,Gx³Üå ]‘Z(c2¡Ð™VÍjM·Þ4ÊoèÚ5xFWζÞÕµö‰:EZ*‹ ‚£r©ìY.µñ[4°­²d—ê‰!™þŠzÔ¤çs]¶Tÿê aýçQ$«ãIq +Ö0éìÜ,:œfZy÷d*cü=‡OsS£œ ŒGgI²±Ã÷`¬aÿP·åáJ5EuŸô4Ù§¹ó¤,¹¹Ø@¹žL)Qm–©×ß;ä“1§ {ðÀdߣ¾wE2ª4'À‡V«ºçœ R•SW™ÓÚÌ<×­vî1P·JPògŠT´l˜ë¥j©qUÇÀT%'œä7à ³¾\êòQ÷|5óŽˆ A;ê7¨0¨PI)Y½ÎsO0 +¼}ç=i¤¡UؼeÚ#jµ®$ÌW„®’W9Æ@ÅÊmkŠrþ³Ž=]îÊàû¥[°HdìaÐeçM»yÅ n²]y†dc2¼®õ“‚plÉ£À’nUAijtyÑ“QÔ'@wZZ˜ö•+;Ö¡¨KLÐÆù¼ßQpeêPĤ –è–½ˆ²4Ðè¤8)N úŠ ¤À¼{n®éšEï%j¸)³[BJÂd‰ÓTÛ¨Ø)K +áTPQ-2·Éf¤ëVð)ÀX; †‡$Qâ€ç +B¤°âYÄ>ÔëC©rý)cs¿}®¡Æc‹Ín³ŸÃÃýËÁÆñy\ý¼™¨Ü1sã!z­iô[f… ™ÓMø´ÕÏm,-’™{׈ )­ &’ZAø¡É(:‹'¤‡} bécü ˆ£çÌgðÚ@xd`50ÅLÅßCyÚ[Þ%¸eþõ QÅîã¶ICkŠ„€GW·! ø°#žXÌK»ˆ`°Xæ8tSmÙ„j¨™Â@^꺒ÇÔV3ê¿þIÛh0%SÙaʲïf(ûcΦh­6ÿ!"“‚¾HRt%È‚Á®ZI6.a¹”V+ñ.±ÐV󆧵 + ”[f‘å^äáÖ­ÐcS«Ž×+!G‹ìá‚Q‘ý!Âtµ—Rnu‡2†JЪ_Bî ²‡³…Ÿ(Ø“„Z²f`m«dKÊX”–ìLˆô+7àN-(ÙDÅöºí¼…;øt{}%}xâW=Uí@‹µi—8•…“9–…lh–Áá( ùevg,Äš‡Hô9 øËŠæ>Q6êâ6‰Ì©¤Ä>/XObject<<>>>>/Annots 952 0 R>>endobj +1588 0 obj<>stream +x…XMsÛ6½ûWlOVf$Z¢dIž:N›4?šª“‹/ Š¨I@H«ú÷} Å$íd}Àî¾}ûv¡¯3šâߌV1Í—”VÓhJ‹x­i±^á}Œ?+)çXzüïóï«›hFñõ"ZPE³é<ºi?•ôçEÿ3ž.®£Uÿiï3ž.—°Nò{{ŸñôfÍ{OÙÃÙuÅCßo.®>ÞÀmrµ\ãMæ]žÒ&ÍÑu4‹èN×ÖdMZ+£ßmþÆžÍfaÏ$^aÏhS(GŸž¾lž(“.µ*‘ŽêBÒΚTfÅÇÆÉŒjC[YÓ^éD錚 ¼ØFk¥·d4Uú,³O¢¦ÀrWË*b«SšÌæˆÖ¾´»a3;‘”’LΦÞTÆLj4•Îù“E/t­RÁÞSj8–’rc §dfïè7S ¥Ù=Ë>[Ól ì¥ÇÍÀlØßÓóo¿ú.­Ü6¥°—„½o +FÇäš»q,5„ðòz7æïö² ¦ÿ¼}x{ÜÔ…/AŒs0 ìJ¤Ô´·ª®ñš[SáÐË€Ñ$ElV¥—´ƒó;‰½Iø`Håt0 0±qm€„¥L9ìH†c<wTâ@…x“œ©Êd*?ø<*mçWr_ EX“+¼ Ñ{ìÃþs´7öÕùø®>.[Ò l&]¨_Š¹Â4eFw|Z ýò-ÇúÀˆ²ä¬±Í£È*¥9*Q#C8ÄÊòÀTâ%ƒüW2-W®[ð¸¹âû]Š¿s¨–ÊT²J€{ª„CZiC¥Ñ[ ­eà¼GÔÉ€“’MMzt]M£ë£K'vHÛb—¶ØMVÑzF¨å5å%^®( ÕëŸO–K_&…éÀM$P¾8b6¸ó?X‡ŠæõÒ©­F,\8¡(é w€pw¢œªv¥äó™y!äC€,¥¾ÐB:T™pÇ9OrÈa/ÅPOâu4»¡ÉÍ*È…—é8‚l~m”õ°»@ŠodºM‘g£@U"Xsµm€. $gÈŽå#m¬E&‘/$Q4(罿ýõžî6ô×óOçvG-'N”)™…‡XP^Çèz9:éĈ‘¾r‹à" 'ÇmŒ®d^íDeáAÇÿÎB=x±‡çî^y™Ó—Ðèà¤/ƒ`PbLÍ2ùú?·÷¾?=~ Ç§/àw§pèDÌ×½ªAn§¿ƒ9w24?ñ* ‚ª¥`þ£Œ vswJ³E!ð;æy%ÒBiøz‰ÞR aåî…ö*ú÷m›}xYTU8 výa|<; {Ü Yÿ±û³t@T€c¤ð#À7™èHÒ7€ cÕViQ’«¹¨ñÕÍà@Û¹xJÈmãeºs„Ï"ߢ¿cÃÖàmD?O^Þµ¦:à7°SâtWÆ1¹¡ÜA^FÝWsÌFè±xâu‘Û,|y7FÝïáNZ6Ð>–®FûO»é%£LÈÊè®wãÉs‰¢gÁÍa±1‚ñ½L@‚-£0Fs÷BqN+¥¥A9Ô­£•²–W%V¨³6¦±ž–bœÑ¥éd^¢O76E#Gt EÜH‡ÓóD•ªîÔŠç¨V6 à†* Œ:ÝDƒ×ÁpR+‰Î‹tÂåv" iHhÒŽ áð–€c/²/£]Ùl·ž°Ãþ9¶Ñ*PèÁN …À±f6®=Œ«Çb¹ lÒÂJÔÓK;Q‚ñ|¾ÏE×;ƒZÖÄY ³—p©+¬"@Eeˆþ¶Û–>"}P&^ظá‰C¿Ã¨;>æWèT2½ +WRh׊߱ä`2V‹Is §y|y3¾kv«)k„=Q¾!ô˜RÈr—7¥oI%‹ï<_œ™|“¥ÙqûOÓWPÕqaSgNø¥?r%¬ïºŒÏg½†5‡rÁM.'\¸œŸšú<VQ»x/Á}¤º–7´!qÒäpb ½*„`òœ©íC äÂ<èª ;Ý6|É…$¢ûv;{Ñà +‡¿®;É#W%mß9ª]Û,NkôwÖ°˜Ïj©7>/XObject<<>>>>/Annots 955 0 R>>endobj +1590 0 obj<>stream +xWMs"7½ó+º*‡ÌV™0†½í&ÙÔ6_æ§Rš h­‘ˆ¤1KU~|ºõØIÖv’º_·^¿îùkTÀ ¸+a¶€ºMó),–«|óå¾/ñÏphýÂít–/Ÿ[X­žýmçÓøòÛ£r6Ïg0/òtP® +rB$ÜÞ¯G“+( +X·ˆhqW Åuã La]gÅ<¿Így‘ÃwZµbÓ#*¦¨u·’Ãý»Oïß½YF3ó£™q¹@'ë&[o9î ç˜Z ΆϺ &@XØîܬ3Ll¶®ÕfÏL“Yi…±ÜÖpŽøÎBÇ ´ƒŠ“û)Œ‹Y^’SÅkn-3høŽ«F¨ ô;ô½ßr·å´ñº‡-{âä÷IèÞÊT½äc]Å ŠÁmBœÂ*$j\ÎC„Fk÷MX,Ââ¬ÄÌ]“±ÞiŠþììد‹©Otöoç;öˆé“œ©×Z0]L^³zë5ùƒø + ù$]â«MP,¯ÂçA(똔ÁF¢ZŒ¡\²!‡öBʨèî[ÖKwñ`¢™‚#>›ôÖL¤®™œXºósY÷H9bDÇ„ŠV]÷W.pX´€\¢sî™B"é ÷VwiˆEÄ¥å9|t10iµ'_ã]í…Bæ5 ð/¼î«°Ò¨ê¤¨Ì§Ê—Ë@ÈX°å°`CHE¬ÏLY»®Þæ'r&C™wCÑF'—çyÁH‡E~Šó†cL¯(˜pî69O†›s{4ŒwX¤Xâºßl!ôÉ\ER²Á6Ú Wï¸!CƒÄÓU’ÔØ°:8A©w=¨»´zyX0±º75Ÿ$ŒßÿÓ’ãuÑWçA ’ò1\i«{¼6á0Š$JŠ'4%¹ÕRj4¹{è*-EùVo¿¶T0¶Î (¯¿ÎË‘¿S çaÍ,’h¼J«%RϾ›¯1Q]P~Ï-åÅyfÅ-¶µ» ­ÏÞŸO§½Ç¦ð²›‚óû½t_bÓ\NËÿr2wÅ,™¹FváþåúIïo€Y òK„7È´ó¤eîê#‹Ÿ$4£ÚBaÕ{è-6G’™ –àPߨõÅÚ{V µFw×e=¨¿¤]ÇÉM¨ï>¾bK£†ÔúË{¢Û¢Ò³Ö!\ +ëçÈÊËþ ñgÇPôš·þY£Ná5–`úØÓ~»eÞ÷¿°Ñç*ìÃ!åÂðÅP”F¢+µÄ~5ÔÜ(…ÔËHöhŽèPÓ°EሂׂýEEáÅ=£¯² Íú2ÿ~ðnÿâR4qfr¢ãD%ƒB„ãU‡Ãg…ìB ­zGú… o®xȈ"D»F«oIÙ¢Üûo ´C\¥sS=Á>^ÐÿSâ‰Åþ7I¡Àø þFVòÝðÖ.’Úßš¨Aúj/Yv^Ž—ÙaOLHßg1«‰Â¾x½Õ*V?¢ð?nÁøãL˜Z'‰ÿyž {°íªgªoÐ1îù7LÂŽÖqÌ4Rç„ØO£ '+žj„ïÚ-ý½VÇYÓ­Ž#穳¥ˆ. +ƒN™Æéäòâ(MåØbÃmmDå9 öß8Lgê"ÉùC¶Dz #0Æ ?×Jð’/_ÿ{f Ã@j:݈6NBÕ²o¤vj«IÃbú~ßH]1ùX^ÓŒY¹ŒóA±Àg¯å ƒVø|„¼º_ŒþŒûáûáÔGPÆéÀønŠÂÓ¤§%XsKª„9ÂW ?÷¾Þæ‹e¾¸¤˜úööÃzôëè%) endstream +endobj +1591 0 obj<>/XObject<<>>>>/Annots 970 0 R>>endobj +1592 0 obj<>stream +x¥V[oÛ6~÷¯8kQ4ElI–/qŠ]6I‘mºÅEÖ=Ðm+•D¤âØßwHÑvܤX0'NDò\¿óþÕéS‚Ÿ>¤4Ó¼ì$Q‚7Û?¿¿ë¤'QBãÑ(SIýþ$š´«‚nZá`ˆ-%MÆÑÆn±“õS¼ 2·ØÊF§ ”Ai:ŒRò«p/œð–GnµŽ&Nk¿?Àÿ‘[í„Ãïk’òI·b!ë &05œpL)¾ZÒ §},o¦ø2¡Sš.¥ñ™KNBÓùÑËBÍDñç«ém'¡^Ÿƒ™fGÄŸ£(úù!Ás2²ZXI™*E^‘¨2jŒÔ•(%­s»¢—Ç/»Tä_%_¿?»úpĬ0=Ù™ZçÕ,ÇñV¥Ò¼áˆ~¢c~èíou^=gCÔ䙡…VH|‚YE©{X(œb‹æ1sP 9 =wü{&—ÿÁäR«¦~Ô&4<Á¦( +µ&Y5¥DªsU‘Z ·>[.6—öï›äã®2Î)NëFºÇ½bnïNÝÞ懪°Ìï¸Ô÷ÜEAf%‹‚¾©ªØP%e&3ÊdWrC+SV•´$æsiÌ—W‡%²²¬ ×J•2Ë·€ˆyÃdeãçñ‹O|p/Ží9ç@Èt tÅ3aVü"¾+|É8"Ñmƒ®Pk +»´cËE®hª¼¿HÏ¡õíäÑw9¨¨ ²}¼wèkŸÂÿß”G«qõ²$Q¬Å1cÎV*Ï\Ý< Db0„ƒ¦¯3Äô‹ü릪@=ßOs¶6Ô’þ¡¥–uȧY;:ØÃÌt“mƒæÊš¹äÊÔ(Žwûºí dg½—mQ…’tD¿P’¼v¿÷¼Ø³ýA­hÖÓ­›;è’ÕÆìa0/Flblr+Ì1œ3??ñÊ$˜÷i™z•Ö˜4 E½æѺºŒµ#ç`Ñ™˜%41˜^}niû_#ºDÜòo9)»tå‚娶S§Mjë¶àmoƒ=\Z•¼½¸>þ†A‘îpdù¬Ñ{PÝÞYò®Aæxk{ÂÁç@ÓW=³Kw ¾œ´Lßã:;à‚šx—<|ÔêVÎ-«9îA•uudS½p w’ð•6°!Má Ï]äºZºnœ¡áxG)nÀ¼5IYÅÅ´ó[ç_‘Eˆáendstream +endobj +1593 0 obj<>/XObject<<>>>>>>endobj +1594 0 obj<>stream +x½Vko"7ýί¸JÑÂjà ¯²ÒªJBØFÝ„t3mU5ý`f<àÍŒMlOXÔýñ½×ž!„@Tµjƒ‚˜±ïóœsí‡ZÚøéÀqzˆóZ;hC¯?ºÐãï.þkií,ª…ã6œ@”¢Å`ˆ?ÀÝí6Dqóübò.2—Òr-¹ýÙpý6ú‚}èt¼E«;@‹ædú(Ta²Õ!\Âœ=r,ç ä+HT΄„új“î÷Ò-½4—BN®¾`šYµ¥ Â@ã]# ³6`È OASÄLb°s#‚QÚ‚Jñ…3° +fÜÂL«bB¦JçÌ +%!Õ*wF7£ó÷>›uZݾ÷¯•²ßùÅŽïP¯‹+Ø™¤F‡™ŠYbÜ) ±€p‰_©‚Öì™Ç–³juÚÁ,©§#ß“Ó$Ò”UíX§†¿²ü±àƾ²~®òEнºEZ­²l÷¦sŽÍ¼)¦™0óÝ;nã9Ïì-䂨³ÐÂðý{>:tnT&âœkN€ÉR–w°-B´ÓBÆÊ"Ì¥m8*Hµ„)‡Â ÷Jð )RX„5D©²spÐ9:"h¿6îÉQÅéñ£Â¦‡ÊAìRl•B¶Î VyŽd^sgC/ÈsTñœÈˆ©Â‚³L|3ä6wyoz>lÆÔUWiÓ—¿Ø¬Yh|¹Uy!s3÷=W(´Dh#R‚ûÆ%Ÿyòz¡Óä5O4˜_ú‚Ÿ +&ƒjª†%IÅ9 +%F¨àÁ# µ ­þÜHÇð‡‚˘pµÚ"’4§OäU·÷ì@ðªÞÞ·ZëcÎ<õ{Çéå·l¹jv¥t<Ê法ÃøÆÓ$.[ä´9ª¨ëIY^5ÖŠr^îšwoáOJÚZž”Pþýxy=úpp{uv°gçxêJ¨Ü’Ši>×É/úQÄܼ‡}¦¥øvç$3¨cÜÑä&ºœ\ßî ÿù"úåôÓ‡ú÷{Ö)½=K¾´ëÿ½4"Ô1îß*­û/jûÕßíöõÿ?‚nS;åëý£²~‡º7‡ÀË`‹U/º/ÞôÊ7À›78gŠxá#sÇûÐS‘4ïàÛ7¸»#Š„ãa9;¼§{x%/Õp{zuv +7Z}ÁsF*.r¼K¸ë,Y¶*ƒÖq›.ñÍò¤‚/‰¤ˆˆnÄ&…¥íýÁ0uýe¶ÓîÑ»‹¨öSí/ÂDyÂendstream +endobj +1595 0 obj<>/XObject<<>>>>>>endobj +1596 0 obj<>stream +x½VkoÛ6ýî_qjµ3DO»Ž[À$Š®í6Û‡¸Ce‰ŠÙȤCRñ‚mÿ}—”å8Nµðq,ò>ν—çP·­!ýF8‰1!]µB?Ä0ŠýÃñ }éO1ä­³Y+¸ ñ³œÓ󣃸µãšg“ÏuEÁZðgƒ­óÙÙ^+¶†·A7úFM(zO¿ßAoûß>|nHz…v—@¶ñb‚vŽØ®N»zàã®Ab=³¦öìöFª»A·™b·%W„&—j{V˜³çž&šQö¨½=À{[t©RàÞ“¶>9d¸È¸±3¡P”ÝÞ²%­ÉUÍ‘ÄÝÌóþ:1K}ŒT7×J–ëc,¥6ÏfqºåJµ\ ‹õü 14¹¯ÍJ!ÍäžÆ|þÔçaट;†’“OÌ­}p9ÞÊQ4¢×žñ£z±ÉúÓÓ÷g§øQÉ/,58—i¹¢— W§õójsï$´oDý­PbÆ´»ïg–ÖKGˆáhì^Å$þÖ4Ú³ÖO­¿Y‰ endstream +endobj +1597 0 obj<>/XObject<<>>>>>>endobj +1598 0 obj<>stream +x¥WkoGýî_q•~®Ì.`Œq¢ªŠëZ‰Ô4iMUUBª†Ù&ÞÝ!3»&¨íï¹3;<ꪪ-cÄÎ}{î=Ãç³>õðÛ§ë]ŽHg½¤GÛ+~_ãu€?«h n’á©ýñM2n?¸œ¥÷=º¡É1Fc¼Éþ{=šÈŽ’KC•°•.ôãûÛ»óɧ³uû=¸šd"JkgÓÜH‘§N3‘Ît™–Å,£îusšNm`vÂðI°£uݱSWÌiÊyãkÐOFÿ0Á_u‰àÝ U˜ò8ìÉT×Á(;>þúu+ÚKW™ÕËéùñÑGç+k$qáÏw.Úg"ÈûgH”Ùô~çkν³”y~8UKíhetY]øÌÜÒÔyF3Eb–+ª u¥’8ipاËü¿LÌ?ÏxjpðH™)„.©PÅ Pª]Eø\‡º× +c*ÈO Õ0K"¦;œÆ˜^xn`½Nè;Ð^/jXF~£Túøæý ŒƒmƒòR<)*D¦H7…Î… e>–fr@Ĉñ£PŽ@¨µ±<ó•Y(”mjœ®Eé±@ö‹Æ…QxÒˆ+jØ–•–¢Ò¦¤¹±dØ›GLKå.èQ©ø 2DKh²T´ƒîknìt®•Jeì|Ö,ò +¸fØ};]¥V M;w:kØÖtÆ…xT4ò±^92¾+ÈÉê….ENQìZÏÚŽŸ ¤“4ÌÚ2’æœÑ·ŒIiÀœÌâ@8ÙÎè`:óÈ¿Æ®Å_ka²:P ˜îú±ÖÕ’‡Ï1c”@ÚÆÌ{]¥)VHªA¡«XÉ^—’$u¦¶R¥¥sˆ!—‡4êP¦-ønì†f`údÐÄ(¶c¶ç;Vg©¾ +îvCè±R ù{C”Ä™ÃÐÈ2zš[SpñíŽl³?´ÜK:p(<Ž)vž‹ÚñͤÝàK³ÒiœÏª'ï–,øÔ²ÿ=P™²NÉÚêjÓ4Æ%ôk`ƒ˜½Åœ¹ hY\†®±NT—æz–F?ÏTÇ&Vc~Ø Â·ŠNb2¼qy 1"-h‚&þsÜfCE(÷zt²ÛrEÜ#hñ¬Õ{:Qí¾¶´Ö`?¡tYIï­R·w]·RRϵäMx¸/‘óóFÓi7à!åCˆ™áåcª½Dr)Ê…Ê°ÊÏÕ<®X !/|lVá^E°›ûUw0 eñbä;UŸkŒ[Æïùç„R>bTâÊü&©ËØ;³°¹Œ )MíüÿîÄò½Ã=ê×ï˜bèC˜‘ç^X«ï×( +¬e[X7¡äe‘‰\[ˆ<–Õh,®„ -äƒO@œÁ¶œv %‚°ø ¿¹r3=ÇD¨¼TfÖµyµŠø¡epf3ˆä@•AæýšmÒqþ¾Á¸6 ð¥ì 52(à“‚ÄY ’œ˜.¾ƒ}ÑÈ';_CdȾä„ó¬áéVw¦ç|Çòûä:é3Æ®–GQ­)ÆÄÏÖ²Âíáb«R 7\Ô‰RrÄþ×BÒq+¹Ý loYD ý¤Å¤ÒuÝEKÚö¼ôÃgãFû#|½_Òèz¾o<¼yû†>Zó‰¯dwFÖÀ÷ š-»Ñ {Ýão2ñE\8ù:å,Ž>Ô^­‡£q2ºà‹í]±‹ï'g?ý ðY endstream +endobj +1599 0 obj<>/XObject<<>>>>>>endobj +1600 0 obj<>stream +xÍWMoÛF½ëW â‹ HÔ§e©€€:m ø`4u)`ÀX’Kic’«p—QØ_ß7»¤ÄHr\$>TF +Üy3ófæñsgDCüŒèzL“EYg i<™SšÎ¯ùoü+$%÷«ÎàvH Z%¸1›ã˜pz8¤UÔ•¹SIKÊõåêNNi4òGûãŽvmý`o¢?žÂ žìïVÒ¼pùV”Ø-Y|Q‘4d5ítñLÛBoe‘V=ªtI;•¦$R£)—2æCRÙ,h#¾HRy¬¾¨¸)Ū‘Õ…‚©¶qˆb •S Æú£I0f„"-¤ˆ+x“Fæ–tîn0Yô¢È×ÒýïFg0V;¨ÈÊl› +‹gš­e.‹€Ê¹€íÝsü-ÇL@« üR$r +%IaTZ!XU¾vN}ÞPI—ô®É Òyòm:»´Nu¨ü³«æÊ(üGwþh㙯0‘?²÷:6lEÄëè>% +©cðérBìz‡Êå!êãŠ,"TØ \ÈW&r$ŒŒÊT*P'í/²PÔxš±ù€î«µ¦. C”jýL©zær*óKdÍü=mEi7ä?…ü\¢à±û6HU802* e+NÇSªŒuð@L>,¹¬(`nä2–98ìK—=äÍÕ“E±4%r!ã&Ôa0wt&Ö©‰WÀ+¢ghzoi*ƒúþ˸^3º‘ijÎÀŠ"]ºXè‡#;˜x ÄÌ€ +]ÏO=3¿ßI©^«Üs°™©Ý³½”KAØô‡¤¨º³˜È;bJ›7å´#¸´¶:SÄ7¥ç+<(sõ•Ù‰®yJTaìÓV˜ýüþ°=×®ˆg2uàê+a¾ÜÈ?ÉÌÖtàb½ò<{;£o×C-¤-£zkÑ¢Ønü9…X‡FcEøQx¦ ïx©+ladîHÄ1kˆôÍwX”nð·êuêëÛj|uÑ‚9$öM(¡;à',­W,/¸ãXk²/ï”ãþk;¡f¹c{¼/ceüŠ-´¶˜&†ðÜ‹ž\ZÖQmn·n!¢mF~é4ö—² ‘ó@"±Æq†¿Ÿ?Žj õS¨˜tBPºbëô b¶µ^å5´6NË nšÝ‹šÑ4¸ +&Áu0èACq(Ó7[),YbA¥Öe!˜gr3‘Q%¯ry–ïe_pJÔéUH·Zöp¶÷ +ˆ)礆˜ÝKYE¿·¤¨“L(¶O¨¡8R¡ž8té+•™eeŠªŒ$Ñ,®87T®Ýâ{ºƒ¼Šeð7”3벨4Vgê’uœ Àƒ]èlÙNž²2ƒ1=f3â4%Ü¡4v£Y·:mÌ”Æ4 ;†Þëº TõÒ=•¬ÓÙ y•ìñR;ŠTe[}Ì/ B^×=}·¸h®Ö›àBApA+½ûõ±{ñx¹’hŒ¦<9‹Áp1ÍèáþîÝñíãïô›ÞV…Zo,=v£ÇK-³>~-zôPæt¯¢BûP fJ9 ­ùuA7¨ÚG¶`è#T>Þ(â“C'n?ÜÜŸÒ±möäÆ –2"W‘c/ëj±–\´ã“ü}p;¯_ F3¼Î'4»ž{Ùÿpsÿþ†>ú^ @Ô¨d#û–è7ú×C~CìÖE+i,qµÁoC–Îñt6fWc¼PòÑáŒÿ±êüÕùz’Šþendstream +endobj +1601 0 obj<>/XObject<<>>>>>>endobj +1602 0 obj<>stream +xµWÛn›@}ç+Fr’sñ»ŽÚHQÕ6•Qž"YkX̦À’½(õßwNˆã˲ÞÙ³gÏÎÌÎŽð+(ÄÖU`9×8AŒü9>D€Æ® Ax‘ò Ë€h• ý£f‚Føîh)œ”­IC-˜Ú:ÉVO,_³<²%¿ ,†žkÏï˜/7ËE‰¥söl”Ø®b&¤ZDJøÛÅ‹iŽˆÍUBEøq/xsV °C®ÑQ3’“ ÍÐgsûÕÄgÛ,Õüh¨àÊíJ¦h v(¥ìƒ§TŹÍñ™†opl@÷ÎßÂ|ÓÝûÑ¡qû>u8ºKÕ½éÐ8k?:´ázñ‡ƒ =ë0€%•’ñ¼{(Õ´d5ñn:€[¼Ÿ¸ˆºóÔÄÌÍZNmù‰1þ +®µÑ×pÇÃ1Rµj/‹.XG"OR +b.àk*¸„»iYï`†d!Qæ ï/tòÌ$MP´¤õýå±Eª«¾dÏ ƒGR Êwøÿëé¡Ú¤½ÒóR¤_ä:ŸT¹ù Ü+W9r›{•®ºßVºfÛ#VíÕ}ðjÂ÷$°Vemöì\OÀóv½Àpä›ÚýH*9(ÂÊŸ´æ@Êr +$VX aIû`7‚Á²¡ +‹€Ç@òœoY¾ˆëuJ¡<+”4ÑW >Æ­7$íj`äÛ3ð‹?a"Á Ýr-`I²5AäÈ0ƒç9 •YC%‚ëM²³"E‘ÖÁ¬RÎ5Æ1Ûhs=`“cècc›ËUëy¥…çcË4ƒï––‹ŸW ¸ü—‚o<Ô&1”™Â°ÖæÙkº© obOí± ò6Ì‚%üÖe6ñç¶?aóeLÝ™øX¬ÿÑ_endstream +endobj +1603 0 obj<>/XObject<<>>>>>>endobj +1604 0 obj<>stream +xuUKsâF¾ó+ú¸©- 87/Ž«\»ˆQ*9ä2Ì bv¥í<`ýïóµ„b¢2Šyt÷÷Ò÷ÑŒ¦ø›Ñ*§ù’d=šfSZ¬YŽ÷¾çø÷šíÂ|gËá—bôùéžf+*¸k¹žQ¡÷L§TÈO³E¶ÌèWS›(¢q6üT|ÅÍ°Lò.-Ô§?ŒÝ«è( ²©ÞkOî@ÕÇY2–L $“÷ÚFtVi´¢“ö—S<ŠHgMG×hŠŽ¤«5<¤˜¼æò(:›cD½Ü~æßÁ$_f‹ënÌ?Õªwroâ$L%öPq5¦³éǘv®û†x~{þ“ЄÇж¤ð¢®Ã˜D.•Gjœ-WÍpøS’ Rû( ·Ð¸ :Èè -„$/÷ñÈ{ôPxyÌPxý=œæF7ƒé+³÷Âc®C»…/uüOu¾5¤†;n·½ +ºÓþd$>Ï&¢<ϼ­RY20ƒ* µm4²½8•*zL2*Ž ¯½UŒVíxZW×`bxÝíºû^¨}3ƒ2ÛKúýÀŸ´U·Œw|~’­MVÄy—gk&ø¯|¹¢nC/Æv}²lÕX®Z4 ú ŒÔ©ÜÍôöü“¶”QmïÖElW—Λx¬1nÅj0J7h×°@‡è8¯À8¦: €L–«BÒ)@ÓzKïRU“ µ¥ý;;«dôÌUß™se#SŠ8—¬üÕ®GòF]ÑOK¦ÃÁ@áÒY–“[–,4_w<²3œ÷©‰è}*¢wïZÝ„½÷ÕÿÂ>¿ïb`Óyбb/“ÒÜ×­pH9ˆ‡ñŽâó +)]Bô¾ ³óßB8-•+|SÑ÷Ü´‘m2¡ Òã‚çž¡p›üŠü––ñ Poal¶†’;Þ>nø«f¤¤¾‰E>WXô:É×Ùìž&‹K(">Wmœ•Uâ„û·`¯Ò“õÚƒÕ¥ 7 é k¸-ôÝÛü†Çæ¥ÛvEtY5t\Óx×x#¢¦#½ îém»!Ö~@’ŸØ•;·zfXpàd`“ E`£.9%ÁlöqÍ惪ÊÕ !:#vCsšpævg1ì£Áª×*µ,³Ó¡5ä£4º”. øä“mÕ.¨6?ôpàÖñìh¤€Õ‘Uv!x}ɘÙOÍõœæ³»Nλ‡—/´õî«–‘L5²°—çšô&«é=ÇÒÍçåb¹Î–w9ž–¼cºæ“¿£ßFõ#z4endstream +endobj +1605 0 obj<>/XObject<<>>>>>>endobj +1606 0 obj<>stream +xWMSãF½ó+º¸UF؆vo°›­â³)œÊ!¤R#idMVšQf$¼þ÷yÝ# #ï&) +0h¦?^¿~ÝúûhAs|-èfI—×”ÕGódNW·×É5~Þàóß^S!ó›ävúà~}tñù=-ç´.`ëúæ–Ö9ÁÎÿÉN?–ªiµ§Å»„êÆ»SêÝ6»!c)¨:Ugë¿ÄÊâ&Z9¿¼J–°sŠk‹„_´1zK®ïÆ+W´XôW–7ˆWž~¾'«Û­ó_Ù»4¹¤¨ÖY©¬ 5¥;Ú–&+)«Œ¶m LYRY¦Ÿ«LhÙU­²ÒX\E˜j°9#‰vNç‹Ëcp癪*äu,‰i1pœÐº4!Ëœm•±áÕd[ª– õZå;jÀ©0•&eó 纱-Αə¶Ôž3ßs?F¹5-Â%bå:„ßRî`Àº©dU—ë×@"ˆÄž´”uÚjG*Eˆ*w"kUø’‰ó5œí%MH¸ÔêÅÀB¸Ò°TUÄ5é¡N裳…Ùt^µÆYÆ™ŸŽ”(U TkË…C 5NeT¸iÖÁÕšž˜;ìȇüÚ !3æ¹Ëºy Ñ.¯“+¦ÆýÀ»­AP«Ç51KÈdÌy\ÕIT…w5­t{ÿðø$þ‡/¤òÇÐ!-:›ñ¥ 4™–°Lè× 9OE¿=¬ž<*³)Ž¹ñæ +ƒ_Àu/\‚yf‚?Ÿí5q<†˜D(Ú æj×jxß04C9„U)“sôÀXüÙî ²x®ê$„å6aØR=ñÙwY,¸Ý‘c¢¢á8à'ðJ]X5öû]*„~_&4Ö)tMã<³v_'¾×ôÂë¶Tt í/‚J}ɹzªŠð„áH$©­ÓœÛŽ ¬ªàˆ;Ö;éjpØ5Œ Á$o®S¨ÓNjػϧA¿þïùôÝóÙóÙ”ˆ‘¸Qt ":"2ôR­‹&Ði˜£ïºFd*5•iwò\ô“«8`•»š«Y¹ "ž„ˆ̛’‡L/õ¢LÅÝžÐÿôøóÝÃ*i¿µb½v¨}€ oüKf £ÊúôúK}bR•Ã{ÉŒ´ÂAº¤W3”B½,͸;'™U‡ðq¹¸`‚…5|hA¶†±òyMŒl¿;¤ _XY «h (A©w÷µB5 ó‡;вé+/>¿éoÖýí -%ݹΡfo…bŠðŠ»XÀÁ= +¥ëª\š2è¶WDdÆ€ßÂ>å“XaÁ³J£2§D_­é“ë“ñÖqDuÇÓÓ¢ 5Æ6• +Ø9«ÚLÐàÈHðÙU¯7ÊçOeˆÈ¶ÔˆÓ÷ ®Ö³>[n’QrD·pømâ‘K¡_X¤Hýh"üû+Ä¢ ܧÀ“{œçC:vOÌg”v(µT›§¬Õ¼J(/ƒ=4:3…áA¦âPùÀpMçڞфVë»'YM¼ eÞœ‹±á˜oˆµâÌ•ô»H£¶/Æ;ËÒ?åÄ`â¹ãÁœázü»\bæ(SfttÞŒ¶L5Q¢ŒÒ_+ÇtIòØúdqJr‘ÿˆ²ÜàiI׎6ha°^Êèçl¬Žs×wv4Ø…NU±ª¢?Ù!ó㑳Çýp8œ ã\€³~œ€ÃhÿñnOà”ç?tEQ£0ì\1>Ž ™KÜ­²ò`Î žc[ÇC}áá2 ºÂhB“ŒÉsÅÁRî¥Ð¥Ø•Q#¦î„²%=G!ËšT€äbý¤³Ú 5o6¤ðb–#ͬÃyf$Ó²¬=ÜÎøâÄ©þ¦êfFÇýÎ2Ø9Žòú:^±ÆbQT-ˆýh£¸LèK\&÷v*ö{ñù;«ÄCA¼\"YÈ/y¼ Y»¥Ò5:îœ +¦lÆÑ/L)uÕˆ¶^e_a`Wò~ňƒ*(ÊuÚm&¹WLµ %] +¬lòþ"Å€à€öØuZÌñ8œtœì5C9mKyùèßeâ Lr·è‹Ï·¯¯Z—óøæóÿ_î®®o“ëwK¼ òKÝü=gþÓúè—£à6Ðåendstream +endobj +1607 0 obj<>/XObject<<>>>>>>endobj +1608 0 obj<>stream +x­WÛnÛF}÷W ŒU‰eù–—· ~ˆëÚjó" X‘Kic’Ëp—øã{fHÊ7EQÆxÙÝ™9sæÌèëAHcü élBǧeã`L'ãipJÓó3ÜOð¿Ô”ȇÉô;®fG§†4KpÖéùÍbÂ9ã1Í¢Á½õšüJy2 O±Õ.ÿÙÓƖϔؒ¶¶bÎùŽÜÊViLΛ4¥…&µH±Ý’ß|Œ&§Ëµ.)W>:šãzº}üóö‘Lþnöå`L£ð8˜À‡AbR©\-±^ ¬`_ç*©û¹1W¤j+†Rã<Ù„ÔZ™TÜp+Uj4V&§Á”­µ`\¦Îâp…ŽLbt?‹ãW’„CÃešp®Û!—-$ÁówŒÃÑÇ +¡6,;£ãi]ŽáI0 読A•Ö9rÕN¹z׫X&gP:ñçÖp©S ¤8;O*[( +ƒ‹ <›TZ¬T(0«…]ëù»fÁ +*´`.UE¬¼‰,DFrƒW…-®^öJ]¤&RB?áàüsÁî9N C¬JùE6F‘òš¼®.Xqp×N¨he´Ù‰V«R®‘‰X»¨4 Ðc²Ç¬?\A‰V¾%«‚y›$Ñ Žç\Ì»cÛòŸñ^½ˆPe—Óìúá|hr´œEŠ4Wm(m% ›kÑ,ò¸#[I_ª$1’ÂMD$Œƒ€ß¬€È(äÚñùîþ †¸ƒ°Fì½â ;þ諸5Ýku÷Û“4÷Mɧ©Ý°¢uW1zÊíܥu‚ñýL”Æ–·*`ÊN_+]n™t¨©¾—FhÛékHŒ³6jw`ûãæâ=#nè¦P.<>cz‡BfAà3%ÐÁzŽWuM£^û sѳï:QUê¡óèÑÿ2úÖglßåü*m&ÞIüŒHëZÏ´ð5Ó@ËáE³L:'¶æmxj`©ïLPB›6ý–§QÞî~… ,wõ=ìHà"zG¯.ƒš¥-ùÛ~<,¥˜eÏžq:D£wÚ^ÃØ:4d×áΖ>c–À A'ÃÝýý¬ÏBd­Ö©šÕ®æþnÀèpäÚÏïÒ¬¹ +=2Î+ˆÿë5êSêcÈê—h¼•J{¨p“5Ë +åÊcÆ|Àä¿'¢I¸ƒ£ˆI翺Í6ÕÿPÚB—J6$hpƒ‘VTPÄ|ž„Õ³Û;²m2ÊI“–€±¬n a§%„ý +uãñ“º©ÅŠ%Nü»ó,Z7ˆëNyÝ‚èO'µŒ£c•GzÈ3˜W&B£R φ™]ó3DÎCÄïxÆ™Õ3rðÉ°G6ñ½pä»Ä|¸Õ +Ã2…!JÊEä_ +¡y. 8Óªžèj^¤jÉý õs&O«èÿ +>60DÙøUÏ4KFÝú Ò‡ ÑØŒ*¤¿Ro@Éã|KÀ²#{ظÆ$d˜ªm _­ÛPËëèC“1]4‰4½ž~|Í7Ÿ®êqtœs6÷ö݇]Ö/pwÕ~ÂýusÛ›ÎëÛªïF/íJêÞvï;+èåͳFÿízó¼=w¹ _}Ý»{Û«÷ðêýÞÚ7dé›î¼<†ÀäQÚ<~~s5_&øðò8ùœþ7öúÆŸÞ‹·’c|ÙûÎÕ¼=~}%Ç}>/XObject<<>>>>>>endobj +1610 0 obj<>stream +x}X]OãF}çWÜ7@"Þ8aYZU•X*Ô(°Ú¤ÕÄžYë“RõÇ÷Üùpœ!¬‘œÄž¹ŸçÞ{†{9 ñ—Ó§O¨XíMï÷>\ éº_àÅÉ)¾”4̆Ã!ÝDƒw/ò×»ï{/ï¿ï i³Sˆ‡ÔÿÜÞþ=< +Bñá_ö¿lñÓTælômB„ûÔÝÏ°?Îñ¯Ù˜WàÂ, +ßx¡»ðôœR©ñeïóáàëåìîá—~¸8¦<÷±ŒNع3]e¬ªI/hL¦×Òz8ÈhtDã‡C*t]ËÂÊ’æ¯dךÝZÙð¢[¬ºaÍ€ìRI¥¦Z[zÆмѢ,„±&£;'—òhñ8±ú¥0ô‘V¢XªZÒ5){Œ ñëãîu÷bœ¼ÈhbL»’´Ð ÛA+½’µÅWaIT•·-QÝ)dê±mà£Õ4—¤j'ÈH]ëæé>?ÃaÖ`Ôê¹R…² +&ñ$3ºò>Ð,ÿvÆ~ø@»Ê$Š{ºàÞ¹^ (»B˜dCÓF¯ >”Ì Z+˜_èªV:‹T¬  +I3¿…[–O‰jeúžB;cƒ ð:E]Æ`‘F›.ðô6D|„Xƒ…ª¡™´ÓËë;ª/£í2Õl³ðdt’sê'&jƒ;[ɘkÍ`kŸHVžF«+$àÏÇ"ô\‰BrØ%ÒÀHfØe#ebGÀw‡‘ Ýçn­ ­—À#_¥Éc”ÇËUaòjLƒD)ŒI}|ªõº&d Ò…¨à¿ fçY2"û,«Š¶À«¡Ì›É¥! ¡|µŒØD+̪¹®±£±KQßO^À"FZŸïgšÈëQ'4¥9Ú¤ÖWã›bÓ‹`d–¢ac‹ªpðßAàJn¼&N22ÞìãEdtÿ·PB‘:5²êÅ’Õiæ(—ô$%’èÆÝ”m Q„ŽÃÑŽB8;óDôŽ-à ®aÞíå ú>QsŽ¥zD¸¥]è&1Á²´X 8úØïyÑ +øð^Øc¸vÕØÕ¡ ú +Ýñf$ÊÙþ 0Ñ×`À‘Ûþöœ±a%»ÖhT)¹ ï‹Ö.u£¬°Èʾ«ÿÐÊC—Q6±'dÐЋî]CÈ¡c. Ñ"Ã"FY‘µmïÁ…彑˜(_µHæ&`npDÏ~VŒ.»l]öíÛrd¹ïP·¶¬JÌ+ ‘F·M!cÄó0B¯zÃÓ·íX{ë‹fgíR4è sLsZ/?gB%¡÷ôÀg0r_ÒfÊ“~ÎÁ+bo«WÊÈ"®ø;Îj­ëÁvf£?Ý\à*Bžžµr#<‚/Œ¼Jë'nM ÌDLBLJ_õ¬¤Wx†^u‹ÉÝV%ÅóšØ—’äÕR=.çºYj]’Z¸½¬c#º"Ê@ô[qÌlƒ}ŒgÁË2{ät0:öƒîÎSŸ '›úF>Ñ_¨£hPàœžn¶l[<çɯ'ßlrTdó“çÆÓ,ÿ6u÷3w?w÷ÏAÖ(Ï-ô²F›Íž©nýfYà¯îβ6tc[ʸ·‹IkïbŽ‹ ¸îÎR°Âò UxH;Tw‰]Á7sßëŒÄÜe:Bnº:ÇWê¢h4詨_c— [S(Îôšä?bnù܈™Í€0žð$FSåtÜÙë!Æ“§1"ÎU?õcC=û¢±Òd^ëbÙèZý ƒîõêÑq¬Œ.-7¦¥«°ó­l^Co‘»‡Îˆz`ty“èe‰ƒ°£ …Ø•N‡óiÖ£wôõúöÏ?n¯¿ÜüžO }•y­ˆÈ ýY ÕSˆD×6ÝA 3TaG§p‹—nâ0²OÓl]× €§L®ü,NFøL¢R­¬*G\ËP¸•ìÌ$â—8ãÁƒÓ +âod]røE ô“ºÖ-ìrÇ‘gQ>/XObject<<>>>>>>endobj +1612 0 obj<>stream +xíWKoÛ0 ¾çW𘠱ëGêf»åÑž¶bÃìR P¥ÖšH›$'è~ýHÉŽR#ÃÖî2`u™VLò£D}¤¿÷RHð—ÂUyå®7]ô.nx ‹ þQŒQXC'I‹²ÿ¹^In!\S­†Ãf,×8ý^;X|í%¥IŒ¶E‚!ñˆ/]z|h?]^ÿjÀÝæËyxB¨¹ƒš»%Í—ßèÌõžka+`àÛÐæÛŠï€iRɈնRZXfÅgØŽ›˜L]ÜŒ M}rE™[ÉEUaà›ÒBmÈüV©!ïAH2+4`Ö”~À»¸¯VJWJ­AI0.! f°Ò!¬í çÀðŽš({¼øêJÙjØ®|g´ÞÛÑäKv”Ü>:cC‘:´Þ]`˜ðYÈè‚übĨû½æ²ä 6À÷\Zƒ˜˜U–µækØ f—0Rü¤qsäo«J¶…?W+wÊtòN w}Ú¬»A _*.AX0²¬´’â7à ÀOg³wäc­v W¸ãMQº ÈÈ=Ç÷iáN³ãÃÒ]„EL‡Àä52C˜Îb˜¸Dq‰W1s +qí3 +=Ïœò^”,¢Lcä¹ãòI4”*ØoòëÈ]Q6òûñß“Ö1ëF>=õge¢‚–d‚xäJ6"Ìfgþ;>l‹ÛÙå;tg©)-LÝÏß°°™Ï[6>ÏçHñ^0µ\!a ›"rB=Bë¡”{eCXÕk™…¼Kð7B¢óÇ¡#ųDMÌîíaQBB¥¦bЀ@^vOÄëŠèoˆxvQU}ìçÿj³ÁXövŽd ïhoN:ÉW6ƾÏi›µ¯l>N)ó¬ü—%é¥}ï+Ï·}û¸éÛÓâ*NÆ9Åeó 4ù0ÀG­¾òÒÂ\•õé%)Ó£V!ºJèc²Ÿ^Æ£¦ÔÒc±R+ƒ½ oäIcTŒãâ2ÃÏOz;ÍhîzÑûÔû ù¿ºendstream +endobj +1613 0 obj<>/XObject<<>>>>>>endobj +1614 0 obj<>stream +xW]OãF}ϯ¸âe©„MH€ª‹Ë"ñ°YZ¢VUÕ‡‰=Žg×ö¤3cØô×÷ÜñL⪮*”„Øžûqî=çÞü5šÐº˜ÒÙœ²z4NÇ4;›àýüòïS¼Œ¤bt»ÞŸÓdBËGæ—´Ì Ç´ÌŽŸ¶MVݨ¿…Sº±´’îEʆ\))×µP ÕÂ:iheô‹Å§hrªt&ªÁ K/ªª(ÓSM+ÉiÒYÖšZµî‡å—ј’ÉY:…ÿcW*K¶Ôm•Ã# ‚‘oñ!œ$«\ëÃIñé<=çcI…È ÝrL¿LHã}J…P•õAºªô‹jÖ]8>„Ù€J¢¡…¨¥%] ÚzÖð¥!)²ÎsÉwÕˆ,“ÖªU%©2Ú|¥Âˆu-òEøŒ’ÃKæT aÙVÑË¥ª“ö¦½‡h´‘j]®tkJ­¯²Îúä.‚6I‰ ãÊ.çd½A(À72sü/b·ƒè÷‰ú*1^¾0]£ÑŽ+bd­Ÿ9£kvšoÆ÷Ä=}7 +©›Ì{DÑYëá=ûà~{X<ïY¢•” emª­ï® 2îêóÅTîu¸im»èÈ}K­å6é.$Êê +͇~4ZäzžÒÝ>|~¢ð<Ð2IRZ¢7dQmK4³ªV•0dPyW +Î|ñ®B”/Ýí²Ú:vçYØéýM@×õžQ2§—L‚É,¥ô$h¶¦v[=ˆ8€>á“éE:çc;âzõJ g³ËôÁyÕä 7-–°Ë@ïn×ÂÃl¥óžnßÐÀÜ᪷:È>ú@¾žä½0i«[ª[€,òÜ—yÏ[½a”C“­W)Z ¡Pj¾ð­¬>Š]x†÷z4Ðëu¥W¢²âDæ­Fw’ï°šíÄqG+Èä©Ýl´qôž¶Ò·Ò!¬A’~…vxáD•;d7F>+ÝzNNÒ«%,çˆæÞƒ^båÊe!ÚʳæS#’RÀ¶ó8pÊì´ ô`auPô5bÛõZBZso»Ý¬€¸¡!..þ +K-hºÆ=i³w„ êȃ' 4X ²a²hXÎßQ™0­4ëÏçÅG8áVñ¤IéNÓâó2âö’ ½Dk a~4¬”ƒ »â¯á^Ä90²Ó…W¼fú öÑH …b†Ü¸ vTU™¤wd×h‹å ”\g-OC?¯=’¹Ä,¬ÐÒ Yî°§/Þp'2Ðzdgä¦R}Dà'°FzÔ¶›ãŒÄÀkÄ…Ï@ZBà ½ð½’ß‚¬“lžØÀ!¦tcé“ÊŒ¶ºpp\´èWXˆ9„ŽÖ·£Î46®ˆŸç%–ûèpéLm8N‚à¡g‰î)ºÑa«BU´®íê Exõ¾’ëΥǯg‘bL ž—j o"~Ãx)6Ì2вßN‡3`à.‹[Y@õUË`ë¥ì™Àüߔ‘-^θŸŽ^ÜK@O²÷ºÇCÞ,š‰ï%b[ñ¶ÊB­`§t~°ÈÆî!…NDaê‰h˜(Ø üv‡qþ +í¨(<´°ø ÒëúŽ.ÒD)7{!R¨ò`òžð@«âèÁ8Ž³íáqç/tËÑ£Qµ€N÷Øt{ëtX]>`7ºØ|¬’k¨g›\?ÆŽN®—“냹•^[Ž12øjÆ£"~[,ýà$y³kÁL¿Npázi„{¨½±ð„fvòÙ0Ç÷cŸØà›óþÚ$ß<Â5¿N8d,áî·D?ÙXYøÄšÚóëÛþôþ2¬$“9~Ë]žÑ|~Þí~O7ŸnoEû›þ]_{9â$H.ÆWß·+žÏ/ÓùlŠŸ†¼ZNÎØÌÇåèçÑ? +¤ïendstream +endobj +1615 0 obj<>/XObject<<>>>>>>endobj +1616 0 obj<>stream +xÍWËnÛFÝë+.¼©ÈŒ$[²\4â棈“Æ ²hº‘C‰ 9£ÌQõ÷=w”ÄH)²jmøÉ™û<çÜË/ƒ1ð9¦ë ]Î(«£dDÓùe2§«ù5~ŸàËH*·éàÉË+)-pe6¿¦4'(ÍÎïu#©Y‰ßJKU©$½~ÿÒý›”n_ÐË”J…‡’l½H2­ +*ÊJ’.Ü?D½d¥ù* ‰¬)Õ’„u>ÜÝ?„'ÒOƒ]Œ/“ ¼Ÿ—•U‘Ð]A[ÝâLC ݬܭ3>ûäå4D|¾)•%Û®×Ú4ô”¶Òú1¥ó3Òë¦ÔŠ„Ê¿cÁGø”~U¢–¿œ²<©z‘÷"Þ”UE…(+j4ÙF˜& '&³äŠsJWõøj6šÖÚÚr2ÙL*aJm©Ð†3uj×”Ab ÅÙ½±(]B0ƒúÛP.øÑãwzF Ä… ØÜhó™Ð.QÜ”¥Êá„n¦CòMãzÅÿÞ§T‹l…îsï€NDé†-å²52G[{>×(ã@ì›y®kxô‰X‰ëù¿eÒeϱ‡ÈC!þž_ë½Xׄ'/oh T3¼/.¯|;ÆÓd–Ðîv·¡ÄŒfüæÝï¯Þ½yÿ–MïóãbrÌ\?ÑgtæT§NÖ¹+#üà2à²=ŸCWY¡N¥åH¡$JÎ`óAhðò€kÞ0óÒׂ^ Û€ƒ.OüüxŽöíSì~ R?îye ”`Ö +zkÊZ˜m´ùðctUI3$Q5+Ý.W.E]眅:­+±µžÑ¸,íÇG=ÇüÈ£'$Pû’‘âEŽ¼ —‡ô8‘Ð(Û€NF×TéLT@®Ë<\´®5 «ËÌñ«\‡ð•øŠ¤#ì‰Á\fåZ8‚Éc-n× ÎéïhDLô€°•;ì‡xzéÆ´$hi¿Ñm•3>„BºšÍ©ó9¤V Ö‡>´ž}Žøª‰Ryž60ÓóËUXi¥²¡ÜQ†¢ÏúZ|†•¦¤±‰]˜}!¼c%ÞŒ¤úZ­j©xÆÈÃ"uîë’Ç•8@9PçEjäNhUm{ â÷äxVkT§+(±ôŠ©yµ3ìùdRr.Щ1¡–qÜü¹¬ôBT½‰µ0-GèÏlu7ê ^q˜qdêíMOÖÔ°À—¨,’‘…4xÚr™9øcäqS +ã™ôFí`…øMŽJ6ºW4r»Ã©¢Ø¸@üPUFt$}$Âljâð~1ÂþƒYOdØUñÈÁP°/hÉ÷c–WHºÂ62›úÆeĵ%l'Y‹®¢ùíÒ4¤ÒïGF~iK#ûD»—7C¿@ùFƒâÔhæ·“™ˆ:/‚q` +æÎfà+V7ÿƒšEÑå{guÄJè´h·CP@ó9X®H@hKn™Š›ÇÍ4c1³º!ûЫFªþ&1\‚}F.4榑².prHÀyÙüdÝxµ-tVÐRëœÊ\ +VÑ–M²a7‘4î+®ìW —u¬ÇuÕðƒôçÚ•;ô×é‡k Ùèo-½8„®pC¶±Æ˜ àÅCšß+6«Íüv´¹Ý +ÇZGJŸ.)Îí÷öŒg>&oM‚u܆Ù¤|—n›¡³¾hœQ&€°þæ· 8”1Ú"†dg”–ß(°-v¯0Qcöcèb„«{˜Tnè‹Ë¦Ö@BŒ'·:ôýÆåyÞ´Æ3¼7Î/i†wJhèó׷ϰêOû`ÖòÇv¤ÝÞz_\ Ôùù,ÜW³y2›N°¯óÅñþ"ü1ø¥É¡endstream +endobj +1617 0 obj<>/XObject<<>>>>>>endobj +1618 0 obj<>stream +x½WËRãFÝó7^AÕXã~ʤÊf ñCÆJ±Y´¤HjG-áñßçÜî–‘…™"›@¶Õ}Ÿçœ{ùç¤O=|÷i2 á˜Âì¤çõht1ôÎé|:Áë~ +I±y0NÞ>˜û'Ÿ¯Ï©ß'?†­ñtB~D°Óë‘ž.bÚ©ŠÖâE’ÈiéS&Âu’KR9•kIº +rYâ¥(ÍÉm¢×T* +¤yœªP¤¸£KYPP¨­Æ_ÜËÍá&£D‹ •gþÓIºý¡7@§+‘‚âBe°ª,ÉIÐQkÁŽ´,K>ÁÅ*MÕ–ß©M™¨\Sb#ýë1UHÿÆéŠùB˱Î/TyLq’Jú™Ÿ~¾îÑ…-OwpŽ">r_‘Ê컿P®j{=oÚ,iœ<®mõdêÎàÆ 6Ðà›¹àd›µ½î7×½£ö9BéÐF¸Æ"ÎC_ñÂ<Ñ–›Êâ c‹,ëe°±IUD8 ­ÝÇa8eÙÃÒ.?„*P ÖvÄZTT9Ø#Æz¦ðI$êÔ¥ˆ(´´Îk©ï\ß~»\,£Õìf>#ÿ–æWuë\¢þïWt3[ùWß:9H±M¬æ(lÐæ0-/“YÀ̷󅜤¡ú‚á¨iå„‹Å7t…_&=.K+0‘nÅNó@uyóÉ7óÓaÁLÌR¾ÇjŒ²C“.FŸ(@yyåZú³•G3ó·Ö ‘[L„·¢êªÔaøPñL|O²*{å>¹i5u4îñ?ÇtHã±Y}­ÖÞê ã;PXeËïÞì³[ïNzX¯£Óïªçã©7 °åò­¾‰âÊ?ùãä_´{% endstream +endobj +1619 0 obj<>/XObject<<>>>>>>endobj +1620 0 obj<>stream +xWMoÛF½ûW t©HŒ$˲] mÓÂ*Œ¹¬È•´ ¹ËrI ú÷}3»”IJ.Ú"‰cQÜùzoÞÌþu1£)þÌèfNWKJ‹‹i2¥ÅÝ,YÐâö¿Ïñ¯Ò´ _,“åðùÃêâã§Íf´ÚÀÔòö†VÁÌtJ«ôòqC×Ð^Ùš¼*ÖŠjGW¥š”%ë´6ÎþúZUuSŽ©Þi|Ò5ÿB£²Ò]U:£BùZW#Úæn­rr¥œ4x·X'©³˜þ°úv1¥Éì*™#ŒËÑAûQBÏâxoò<ß©W¸'Ÿ›í®&•½":µÕä^uEn+*]­mmà'¸¥uåö^WΠ&ÖÕtŒnàxp(¡?¼ÆIã©T•*4¡½©w”ÂÒ˜”' +%¡Õ{G;çkO_/÷;-áÇAÜîÍ +Ý]“«èi5ðŒgR篸¨\B|Ô”»¹øfmQØ5r” +KgJ Œ¤tŒRWÆerÄ`3Bµkcþ

)¤¤tÞ›5‚AjÜ9fÛ€ÐL»ˆŽVשºÖE‰fìaö~¢mZÇm+®€ôÆTˆ0@0 <5%šÍ @™g't7Bsöƒ”£oa*Ú!ÚY»¤‘鮩¡kíB¤‡Ï­âTÀ‚e¡ë™™¥òJ«ìÀaüžwÆͺC™œ]±"TîÕd(ƒjjp¹6)›56S6=ŒÉï\“sšÒB!íÙø:EvÀß}ütG3ˆ2«óäjúivÜ%ôY}7v“b'†»Ò>™ß@þÑŒ«á›¡Ç|él`>u9xÈæÙpˆŠrâ†(š¼6%Xê ½()/ò©ãÁ¥Èx˜Ÿ®÷š„Hàú½Ì/ê{Û˜*Eã°R2¢õ;^¢èÆOÄ£‚Œ¸kgKBÊôF!pnÏNïC„zuk™ßj×FIHŽe'Âùôe%âóÜÎijÜçB*Ú»êû¶rè)Ñ.¦.bñ4[²±_V¿_ü ? endstream +endobj +1621 0 obj<>/XObject<<>>>>>>endobj +1622 0 obj<>stream +xRËnÛ0¼û+¾Ä9˜mYrŽ Ò=¤ha¹øBI+›±Dª$U5ßeÇ© … ¸;;ý1‘Hø’ÈXf¨ºI"d2 ¤ëœ¿|;Bóz°J%ÿ^Ü“›Ï·9Š†±²µDQƒq’E5“+!¯6Ti‡€ÒYUWʨºvä=ùëâ™ARHî óE.2†™}iðbCa´î€‹¡0M¦(•§úo0lgu _ªë[‚n ÈÔÚpg²½FØ“‰°uÛ§ð\¹då<·w¶l©óOÚÔvôˆ OLaçìÐ{Ô–‰à‰: ?ô½u¬ É•ÿHËÔçYV•í Fe*\ÌeoF¯ÍŠÏê­µ‡8p´æ*ðÓÄÑ­³åóe*ÒÈ:z-‡6èWñ&kTõƒ7ª+ O<:Uíµay£{t'°SúTàöê' Ï:}!ÕÇÇÆq¤±Ós߶ښ™ïJQYÓÄÒøÖ»÷‘: Ñûùv¶âhcJ5¥[ÿfÓúm©dÆë¼^B®òcÄ›»Çû;|sö™ª€[ ™ âÜÈt~j˜çÉíÉÜÿZä4[‹lµà5Ž‘È<¢}*&ß'¿˜ßendstream +endobj +1623 0 obj<>/XObject<<>>>>>>endobj +1624 0 obj<>stream +xV]oÛ6}ϯ¸)K–ì8n>t[]äa¶x]‹u(hŠŠÙH¢JRqüïw.I%Š‹!KD/ïǹçžëïgÍñ]ÐUI‹ÉölžÍiqy™­i¹¾Âs‰«¨Åz•-N~Úžå›×TÎi[Ã×êjMÛŠàgŽ7òüç½è½²T¬2ºñBÞ‰]£èãæ†ZS r¯¶ß‚ƒâ*:˜-–Y ç¸QdtÝy CéµéHtIÓÕúv°‚ßÄËK*Št¹¼ÊV|ùFwR‘íNÐ"›_¤G7ô½±Þ‘›¦òåü£¶~ m4’»9:¯Ú/¯Æ ‘xðÓ ç”#%ä˜|”óä §0§Y±ˆY )•sä÷Š†N?PÍ]ðˆ—v'•ª¦(d´ÝkG2¡%ͽ²ŽDÓûž…­¢ƒöû“È2ìÌ`Q=£eU­¬HÉã«êýèPlòš%?å*[2tŸÍ@­8Ò^Ü+ê­A¿Úp{®œo_š{aQO£wVXXø—ódó*äÑèJ×!%’þA¡Çç 5ÇШ#ÉÁ¢ߤÄvJuäÑp+t‡f|øíφ‡òúëO§µm È¡šPð‚¤U±X 9ÝêFX†ŒMM§h§s©n™C¢óÔ +ZÅôFï`É%å›ËDÇsº¯QÒî›’¡Ø|3!êÈ—'‡½±Ú…ôFÃ{Š®„äP~ß!™:äô òcŠ¬6ƢâíuÁshyy‚9ΙŸè¨ÂÀF%š¼ÓÝ›XÎœ^õŒ ¡øõ·*íÿ}Î! O:|ü´è½¥wlŽvå•ð}F(oìñ…û\8.‡K/˜>ÁÍøbîM²Ìœyz“jÄ»,‚õ–ŽQªxÔÿ£Ò5wbþ¬çe&°yž0'À= F`š­@&<Ñë•ÔµVÕ)7ƒ…‘¥ÊÈÑ bÈÓÃëîvÊnªA‰¨`Rt 2^ è7f‘CÆ“_Ô=Þ³è|t¥B@Öõ©,y€,—,˲XÃNU6¼f‹yâ`]`¸Ÿ#ѯÎßñÀ°ÉÓ6˜Gñ5Î"¤”)] ©íq"kÓ`:¹n.!€5¦·ª +D.²å¢¤Ä5Lg4ãž®²ùê’_c¿t f^i—G’<š“2Á˜Îg^ˆñÝ(dá¯=ä20MtGl&ŽM’÷ËAãHÅQØXÖQ±£0pEÕ¨D“ð“÷„‹°Kä™ÛQ©òø}oâ†gÓówIjV“Ež¶fúkŠû•5ɪÞ8=êÆ™ðñåqo®?ýú>‚4zœMÏO}Þ)”mU’ï×é‰ÇuÊ1x\,²b‰ÏÕÿûœ³\­³Õe‰ùÀ¢XsŽï·g¿Ÿý »é;endstream +endobj +1625 0 obj<>/XObject<<>>>>/Annots 975 0 R>>endobj +1626 0 obj<>stream +x­VMoÛ8½ûW zÙ°iKŽ?’›»mŶE·ñ{(PÐe±‘H•¤ì¨‡ýíû†’[×èe ˆ‹äÌ›÷Þ õu”Ð ? ­Rš/)«G31£Å<Áçõz…Ï¿NQ®g3qó«…t½É/\̆ŒÒv¥ó•XPMéz-–÷ŠîGI*Ö”& ¶Ô4Ÿ#Qÿ…×ξÖÀ*VgkŒx"äàÛÑônIIBÛ5.×+ÚæÏŒ¶ÙÕ¡ðŸÊº¬RŸwÚÜ”óÚÿ|û箇s e’ÌEŠ£Ww¯ÿyûª_>…œ¯_F ¶Íʧ WËG¯¿©§ ¨³ªÍŸ>àç\»§CiìÿR憒k<*ãK~•,E*æ‚Œ +2Èêágt3š¤ì«Í÷ TÛ¼­Ô˜B)uU‘’^Qf'êQû L¦Èäe½“$Mþãd¡+E¾”N›=yå:S^pFγìmòƒ4Aî•GȺ‘Nå,²!ju¬‡q˧QÊÞݲx’©+Ée©Ê«c©Ü…£¦/ài[j!²€îÛ8"DdQ¨e[0ÜO‰¢þ¥<(Ú)e¨±Ð>§ˆÎmd¾uN™Pu’u:ŸFØ`Mï£M~ÿxOÁ©(“#Ò“ pPŸúÓ•{Át3V;–-†¨A7S|`5"⺰ÊíÑÂ_dçdŸž_zï%6Pµ + !š†1âÙNW:t³hMäKÆÒtó°„maPè¨ë¦Òà"o#ÒÖ€ƒØ¬GL;½;õ#9ëƹH½D/îÐUw÷™µcåþþðæ–ÊšÛéôx<ŠÌ{dWY× +•·ÓþÕµrÓ|Uø©6¹zMÙ dœZîEG¯œÎèMä’•×=§±}ØŸg. c©³2 Ò ³F…Ô¢sóV*D)ó‰5xÄýï;ؤô: œ„x­p w‰6–úÎÖyªdLð= ·”ìù—.Κ½‚ PÊQvL=ZÈ)×EÚ œ9áyqwiÉÖ£¼OW`a¯ wåpîÞà){ͺ½4ú7ÆÛ÷sO-ètŽ«2à &†Ç­ÆŸm\@sûñ3zvo±ÿOÕ­Ëù +™¨ÿÂѶ^óð”MlXK€ýp¼ãC¡ ×q'誃•i §žÀt8äÚ,´<¤€ ø8`ßr§`SU‘E6}?_©–(̇÷mÝ°*ç­qŠu–o§:‹©Ï1`bÌ!ÔáÔ×>/XObject<<>>>>/Annots 978 0 R>>endobj +1628 0 obj<>stream +xeQÁr›0½óïèÌË8·dÚô’N[›vzÈE–EQj•„iþ¾+ìv:í Á²zûžÞî„#§‡cS P}’³œ2^»wI±fb-XŽ\pú^þNØG8ÖÛ’U¨ê Åm§Ñ&M’=nÁ+4-)ˆš‚ãBœ£Q+.XÉ +†³Wr¸i^\ó 8-6^}Þ=Ý¡ a¼Ë²yž™õ ‡`ÎÆMžY÷-‹…9ÒB>xÙdºPÂxHŒÎÚ6¥¥ì ôÐÛãt¢ëY‡}ßbîŒê0yí:/{<¯H!Lò„ÖØ¿ú ûç´Z†ÉжWaN¢ðÂEÞ ö3+©ò4vò+ÇÊ÷íE $‹ƒ¦t?ù³ Ý¢ê§q´.0üíâšôÿè¥3Ä‹¥ˆ-´#ÃÃ1úî¥mb?¼b#‡'3|g—F××FsA«Kð¼bõbãþýÃ=>:û¢UÀ«¦^S0vQú» ÝäÛˆÿoˆ•¨™X4ïxZäQïm“|J~Ú ±iendstream +endobj +1629 0 obj<>/XObject<<>>>>/Annots 985 0 R>>endobj +1630 0 obj<>stream +x­V]oÛ6}ϯ¸ÈKS –#ù+ÉÓ¶né +ÅÖ¸ ô…¦(‹µ$j$eÍÿ~璒㺆CàÄŠÈûqι^¤tŸ”VÍ–$ë‹ëäÿ9þúøî"»É’-–Y2§šæÙM²ž*zäó´XdÉ’æ7+|Ï𱊊ðb¾œ'Ùù‹å,¹…³,¹¹,Mq">æf‹Œœ™›¥·ð‘-Rüæ(–¸ŸøÚOë‹éý-e×´.ÏruCë<¤ÿÈ«·¥h½²”®úQJå=Šz#È™ÎJEÒäŠöZÐÛϯ×_ƒ­tmMfœÃ:¿Âå4¡÷·&ï¤×¦‰G甦ÃÑl…èp4׎rµW•iUNº!Ѿ6¤š½¶¦©Uãúy8auNqôåê­idg-Ðge\éfKçUýå5yÞ¯i’Îbh—²Tr§›KÜ•3´kL‡Ž.¥©kí/q«Qýi¾I„à•£½°Út.øÞXÑÀ˜#‰h7ŠD@ ñ3§¢1Í¡/vŽCô¥B¦ÎÛà…®bþ¾"2R‘ ÆÀãœ[ó»ÜÈŽQ!|T›\š]GÈßÛ/L×ä$<•Þ·wÓ©cZc·ñÛTî]RúºŠTÝBϬÇ`5KBêƒ0¼¡£‘xë‚×ȳ²Ôz>M¶k8ð¶ÛTZV‡<½©"¯VµÆioì +c‡· 3duªD$ê +BØ'<·BîÄV¹7YV]·`ßu‡FBb9}ÕZßtÛ„&jQàã{ƒ€!Â^#‰9cÙ9eá“Lƒx´;#»4ÎθÌR Çe6™¥‘½"Šc€p¨¤^m^ÙþÃtA`1ˆïòçûT&b?Ú+zzz¢5=‚ä´X U…G>ÇžX’¦ñgy–„nr½×y'** JÇEÉŠ=!† ›•1;–V<²×\‡×A>k ç¶Òsó£ÆÇ*=fÍ*Ü.ª€ ò‚*˜e26Ê÷ +=B4‡ÀÙ }Ø?u´>VÐ'tŽôÓǺû¾äVO6ºá‚8òòOL¢ N˜Ä£1$û*‡pªeæRPcl ÔaŠd¥Cã $nõ40‡u'K”<¤ÊüYS‘a5ò+´¢3"sC½öåËäÊ"ôEÓyêKƒ*óVÁ+3¸Sªe+5uøk(Їüð™kæ7Ý B‘3n­*vNµò¥ÉŸ+Œt’à"Çy€ê‡÷ÆxúÚ9R8–å(ñÁéÈí‘¡¡WFäÁ]…0qá<Áú µF£{3;Zõû*ú¾OäDÈéL“ ?î ³³|9»W¿šžÑÙªàóÔÚìbÓDþÐD…ï9G´cÐÆ·Þ}øDï~{à‘„J&î—× }0Ù—±²|^îw[+ÚRKà **ÇK ­´Ö –ÔçSÈ^ÙB`¢#ZŽÁð¡k°]#0n 9|@"ç­.^u¸3: Üï1Ì÷óšz,²oá<¯Kp·åÆ;t¨PÇÉÉ òØçX Ã-´t¯ZìC‚[1©¿DÝ©Ž“Ñ9LIäúèH?ŸÎÒ´‡qb†qª”Ѷ"ÏöôÕs3Ô@`äÂêÅêº z•ï‰\®Ð½ôg²&5¢Vü +ËådTó{,èÞ`yܱ t¼á¬¬Â™¶^x¬Ž§«çFBhjÂê,bØ÷°ª%ÄNñx\‘>v±õ˯§÷‹“ÕmXDØò$§»6ŽÃ;<ÿpÜî¸}Zƒ²EÏסT¦÷ãz0Á@S|*ÑÃAº|loaàS+œëw‡V…§÷éÃLǨFƒWǤ°_óB{…Æ<æµ ‹æÿœ•vŸoã`XÇÄf1‚éýÍö$[Ðd1{ïݳçË›d¹ÈÒ²”ýþ²¾øýâoõù2endstream +endobj +1631 0 obj<>/XObject<<>>>>>>endobj +1632 0 obj<>stream +xu”Ánâ@ †ïy +«'zHHÊiéR´—•º"Ú½Tª†‰CR%c:3ñö뙄.´Z!"’xlÿŸó$ó'y +“ dÄQ ³IÂ×ébÎ×”¿¡ ó`¼™B’@^ºØl1‡¼ŽcÈå(¯j§ºi@jA@Qk”–ô¤h,Àˆv'@’²¢VµÚƒ­6vxg¨Ó9¤@xÕF>æÇÓj}Ÿ¿1„É$J¹ðÈŠýžSÊ£JV/÷ø&d§5*ÛpYâ_æ@ª0`Égš°žØÐ¡å °1r©CÎfÑÔåþþ{;$EÄMjp° ;Ú¹þ¹øî ¹èpIÆ›t 4 +uÿà‚lB\ºì• ` DË +WÐÔL€Ê¡èW¥>Ð\ê—Ôq*R^ÐÝúŸš;8ˆ=÷Wú7=íîÀÔÖ—‘Ô¶|Lã{çóÀ,}*Ökóç‡Á¤Ì[cƒÂôs¹P¦®a)¼%QRÓÐÉqqY¶<ÞÌ6W¤Ýø–ƒúˆzÉ÷ß|ßéýrÌ·šÈr5lW?W¯ékÚ›å–ï•5þT¨Š†3upnÊ-jFS÷ÐiÞf²jÏsîXŸóã—î¡ÔÔ²µmÕŸþD¬ÇüáõeßÖ´v‡ÂíKŸoûy³&Qæü7 ¹ˆ%SÞÃÅ’tÞGxð¬é7 Ö$;çfakRîd˜d¼¼| œÇÞÑ•8X&’ÌÙnR¢1°õËx½pÇZ[ß%˜f‹(›¥üßÀí$iêž=åÁ¯à/G×endstream +endobj +1633 0 obj<>/XObject<<>>>>>>endobj +1634 0 obj<>stream +x•WÛnÛF}÷WLó"h‰¾Æ/E›K[4uZDEPÀ/+r%®MrÙÝ¥eý}Ïì%¢7MaØ°È™sÎ\ô÷É’øYÒuNçWT4'‹ ‹,§‹›küŸã×HÚœü¸:9{ÿšò­60¹º¾¡UI8¾À“bú¦“†–7ýdtßQ#ºNµ[úùãçÕÇÓÕÌ/h¹ æóü.Våô“Æñ±r}ÍZÐ9|Šº«å3ÔÊm®Üômá”nIYOBÕb]ËŒV•¤¢7F¶Žé*]Òý´V²Þ“Ó‚æËóศD»•÷§xƒP[±•ä`ïY±w\èoK*D]Ë2¤qÓ˜’mÖÞ@–ʧ8Í¢¿ü*»àD9¸2Ö‘jœNXa‘"èíÀýèðNÐïoßÌ8W Ç!Žc(u#– þúhF‘Þ„'`6ÁŸP@Y¡Ûx ñ3e­ìºõ¸âc'Œ¨ x',Ç[rÜ[õ¯•ux„çÆR­WŒÈ¨må,qš•T&¢’üï´y´N0™6£_œ¿ÜêFƒ­*Ⱥ~³ ©[Õt ’-àhÝ;*UÙNY8“ô$ ^ʺ¦6ÚºZ>“•®ï옋’Bò¹«º +™*¸æX8лÕÙçü×çW ŸòñlD)IìÄ>£Ï•„[D_×,à`Åöb”$Ó9ÜDÙ½¨T@NZòyYrAŠÝi}CÂ0žüÀ4k#œ6v¡Jø<¸°#×HÁëÆßtF=©ZnákÃ_+ÖªVŽ«„B]ø§%k”ov +hU¼~T@X´{¾Ö¢ÂîZ³€µ¾?`ú¶etÿQ(*”5Niâ%ꯑÍ0iÀøÜqê®êÇ™OT[I£Üä+ÆH"añmPl“-!bJÁZ‚FÀá ¢e{LÏv­êF>‹ÂE.-ê‰byàÕÈv¬Y/7‘Tdœ4 ôÅ((ô‚•½aÐ=õè£Vé½zzÅ‹"Š82B÷ñd”eðñïL$ž%Ñ;_–2ÔVdòå0FžƒdiLÍäkŠ f­·Ûî†AE?©1ÿ¥{qÜïvº-!@Ç=ro*Ä×%bßëÞXÈbXB¥¾œÛ(—1àßcV 7±<jÈs`ï Çž§À‚ú ¸¾UÏ¡ÐQm½í½ ú;9{ŸºúôLºâì¥p:£Z²;žbÜêX'eÃösŒ ðrºÌü}øøeDŠÒËÊUPY`ƒÙi{i5=ÆÙZÒqz½GK€Ò¹“ò¸¡¯c(£¸fºB‡DSi„ÙÏF8y„1¾ÑÊÿG~ØV­õ£ïh· —×¼kÌ1óó‹0ƒCÚ·Ï·—‹ü63ã@‚Iš ÊùuvŸä\.ášßD‡Ò(ᾄ ·Ú¯Ngߢ[Ð4®÷”º$ã7Ž˜EÚ58‹¸I —štTÕöÍû¿wœTºâ<$5Ï/i~™g¼ÊMQ”&æÌ…?¦|‰p¾àÒÌ ú.’˜.ÿ¦ÊÛA·‰ +šqA†-èïüf­0ÍÀøŸ™£òxÆÜ­D!8o%jŠr$>=°O0™9ó:vÊÔÌS;½Ÿ"²4È J/T;–ô±‘ËÄÙNµkÕ–\dœÛN÷u'kÜDá'%'E…4Ž1,•‘F¸Ÿ¹ƒÁ¿«p +4¦Ìx›•ˆy +oƒv„ª«ElùáfÊ1tPÚ·ª+4ŸpßÜÅý7•É@“‰^ýÀ}Fé>²Ž}Ú¯LºÿN€ÍB¬1–Ò¢biü§ÚŸB¡Þ 6YÈêý†ïW7ÙÕeÛ]~ÎW½[üqòŽL)”endstream +endobj +1635 0 obj<>/XObject<<>>>>>>endobj +1636 0 obj<>stream +xV]oÛ6}ϯ¸ÈS +¤Ší¸Nú°‡6k‚`kÒ-ºJ¢$6é’”=ï×ïÜKÙu”ìAÃÉsÏ9÷\~;šÒ?Sº˜Ñù‚Šîh’Mh>›d š_^àó ¿^S%¦‹¼_]¿¥Ù„–öZ\\Ò²$ì3Á7ÅÉU£VQ{š¾ÍèAu¹¢•ö•ó²…&B¯Ã«åWÙcz‘öx}>ÏfØ勦]¹n¥¼ ÎoÎi:Þœ]*Þ\6zØ>h¿Æy}ЖWŸ(:Šª}”ÿx©h¶1£eÓ2m]O +F¿5¶æ·‚®ŠLÜ! ´Ñm+o†ÆõmÉx'ôzzžPz­ÚvK…ÀÄÚÈ»¬¼«½êÅFEFƒš‚ê4?Š®p-ƒÐÔ¹A±* öPkeZ•·òRZ®¨2ø&zeC¥ýèôýþ\,WRÅa²'zá WA—ôðñ=Šcv²aÙ"›3{·‰‡²‚=j@Rµ2ÿƒëtl˜›ÖÑ´q> 7o)ô`§€ùES×lÈJæ@,R‚³ÏðgÚc¨R̆…£ÓåË ÷—PzƒÒ÷eÉ$ñ9kdŒC($®BF7xE%Áΰ>c¿Îï¹)T­ÑG¡ðV¥Æ¡uy8ˆ)IŒ²†¶2“žL®ݧD°1”T-ƒæ9IÞÔM’§S’´pþ>Ù0,q<‚Çïr‚詘½þ¾gGïy$U©1OJOù–¾öñAÒ"Í¡ÂyÏ^`Y0ˆ—$QR˜p¸îâ¤u²HçÇ>“ŸôÇÝý~~÷;·/³Í)#nÄ´å!龨™íú#©´‹vÀ£Ç娲:ö£²Û]šy½ržÅ‚åUY2ç# ЇȎ©t=&oÂÇùèÑ‘Ò ÉÏ%‰BŽ4Ò®ZeE|™d*j´^RZ(®õ£)¼ ®’éxvû‰BTÅ#“ZÎŒE 𕸧XÑ»«Ÿþ=<Î3ú•Ëæ/éÛ³ë¸8¥l¡c)šß>‚aÐ +.h.ÏôG¹¬„³Ç”ÂÕˆmPàÉÄxj,Õ¹ž½ƒÕ*>›jZÊ®6iÌQ9Ì¥¡3ùÞ2äBÀX/zÕrzá 8ÝúMÚßs)9Æ-†¾w(¦r½›¢inª¶ï¥A0Ä]®k\€ÐOˆp˜‡åâôð¡ôQƒBÏh¤@ši›ÆñÕ "&*ï:^5²ÎÀÕA’ÉÈd~pc2òEä)ÜdbGö€ƒ¯W{lŒ(g·qý£ƒ ( {v}ùýýf‘nÑÿ÷²>_\f‹73\÷ù’>›óI–G¿ý ç0 Nendstream +endobj +1637 0 obj<>/XObject<<>>>>>>endobj +1638 0 obj<>stream +xµVMoã6½çW |i²°µþ”C ÚèvÛÆ@Q J¢,n$R+RqÔ_ß7¤ìudoz(Š$@ ‰3oÞ¼yœ¯W3šâgFë9-bJ««i4¥x6æ´Ü¬ñÿ¤Ü¿XÎo£å¥‹Õòò‰Ù&ŽâK'V›óç÷Û«÷–4›Ñ6ªx³¦mF@4Ò6½ÞÊ’y–M)êZéíMód)‘ÖѾš\!ÉÖRfø,§LÙ':#-I"M¥µ$PŽU•*E3¦B‡7ZðTmZЮ‘ÂÉD@a¥‰úó¤!Æð2™‹¶tô,ÊÖŸŸÅ‹ÍrLI‹g§ ^jÙ¨Jj'œ28¹PÔ˜qÞN:rÁ´RxÀ•›Ú©J”!ôx€ŸyPŽ—êI–CE óô8{UòqPá ÂW ¨ã¬¶³NVàNw{ÑEt×ÀÝ xµ‚vº6JƒAk/$÷±SÑZ 7-£eiRÐF•¬ r¶ZKnhTÙyîÞ¸¥4Àb˜,–Å$Ñ'ñB/•òm:ÕÌd¾†®@ö#ëDãÚÚW™– +\z9XÙ0j-wÆ)Î/hT‰Uµ¹Fh‹°#(äo9†¬Ú[B-Îú8ü˜»¯¥hÀj ‡O÷ƒzSSU ÜFôJM¡ Ë Ù‡<>ŒoÁƒ¨AžoˆZË¢äŒÌJ?ÒÈ·bPzÐVI”Gô«AA}oÑüž¥z@ÆPmyr†(xJj©Í+ØìÌÅQGïÅïB-!JD[ÔÐs¨½A—Õ3Ï Ž åÆ@‰„¥y<òõÏ© £MÛpqàÛ3¶î0køÊôM:'-=^ŸpòxJ ÃQkUðeYS`ÐEG˜ÉÜ4û^¹‚ĚŠ–ì½” kå@DÓy£á¹÷öÄsÂi4ͧËÍédH†çÄJèTRÝ ªìY…š*ƒ¦Â""—t0—¾ë~²ÙŒ~sœVýbvT"]ÉÅ\œ§¹ŸÛƒËð)JkèI›½&¸Ô(“IÛG=ÞP¡vð¾R†©} ¦Ó¶°Úó+Þ~cêsm÷œ J–jÃo"E\u?ÏyÙÚ¢'‚Ñå +m9÷I + ±A 磊©æ¹Ldp] »Õª|“¨8¢?¤È¨ûïò´¢®ÿOlŸ•QgÒª– ™‘ß{¶²2Siö“v¤Ó.`÷AŽçÙsûJAÝ@sia ƒ°<±¶­kÓÀì1Å…Ù³Š"ï|aÂ*ñšAϯñ²\D ’XܘŠD²n¥aFÉ0u¯¹ â ÓãÅýƒÃ]¦3ôæ„% ìh/a¦<ð"u-f·\´ ƒ'" `Ž@æ‡ +Bâcß¾ø ‡ñUÁôИ#§g#õ`‚6!YdÆEÉ”:`;b… k3êï‰û·huêÁFÀ§ùfñûFDð *„â"ÆÐ ZM ]tPø¥#œ?)6¢Ïš/k5w%‹˜¶Þë:¢?…Ûà_Õº?|öŸä¢¹ý_õú +ñ›‚ÐŒÛå;‚}`¯¯`X§‚Ùç +Z¤²A‹^v×v-ÿv Óê7ö⣽í•-X@){ã»jç•9oúÅwcïÞ,(^܆UæáîÓýýÖ˜/ØKé'“¶Ç½ãM&ëé-¯>çÒ2ƶ½šcâ×óûy{õûÕ?ÂÛÂendstream +endobj +1639 0 obj<>/XObject<<>>>>>>endobj +1640 0 obj<>stream +x…V]sÚF}÷¯¸ÃKœ™XA€1îLLZfŒM<ž´éÃ"­`cI«î®ô×÷Ü•äÄÄMÆÒÞ¯sϹwÿ9 ©Ÿ.4SœŸôƒ>_Œƒ1&ø<ÀŸ‘”6/úa0:~ñ!:yÿñ’ ŠRøOBŠ‚Ÿ~Ÿ¢ø4¼ &­2]Ó4S²pömô# +q-Î%§w…¤R« Ú +‹°¥6N&ä¶Â‘•Î©bƒ/8d´Ó±ÎÈišÞÝÏ–7+2¯ .èæêvqu; ØI”‘ §bŽŒxá0p<[JxW9ÜídŽÔèóijtNaÿé½eçá9úü6h-cÔË9Ù +Ö±krÛ*KËé ûádl÷á˜ÖÂÊäó[ª%Ðö‰SOµ¡\ã{"œhEÊŠu•%oeÐWÏ‚¬ÊU&Ì«Y76k ¤Zžáé‰FÔô+ºG¢H¨—‹=ísåðlÐMzïHÖñA"®(6ÇÈvwPÝhÒjbXõ¯ìQ®6[G"³š¶2+½Ý·t8ŽÈÀƒË–7ñþŸž+™?C‚ÑËrm9F-–’Jrg< „µµ6ºØ#ìT.z°]¦`„iiDŒö‹Œzeg“ÉÌzGØÖ*Ë:B ÜXÐ'Ó. Oºjå‹•…XgÈlì=|œRl¥ë‘.}Uáß,Ä“LU&ˆJØZe« +„äœ^×Gêd|Þ‚µÈ §|jd­4ÐÄ^jEȯùÌÜÿä^ä%TE¢kë9ù¨ÍÓÆèªÓÙÝ(Ú‡åUìe 1BkÑtÉ‚Å“\qS&ë¹UÉJJ:èÊt$:n&Ò •Y°½ R´¦Ïßü[ìV +4ÕT9l!CV?ãü˜>nZ€=y¾Q2yœß^ß=®æÎ<çñd5ûm1»ü#ÉûF7…ÙHn28AèÕ +¸bZÚqŸy霔fü¼³TW׋ñt-SQeî>Þ5wTøk±BJC§`"¢Bx¨ééÕ§U4[óÛ91mÞ²¯}ö1¥7j'™“kµéˆÊ“‹G¢‹7Žž +LÚz{èÜ5cq ]è?êÅŽ%ÕnKߧÛ>§t”Wñ¶kö78Q­`ÛA¹4ùù4'££ŠÀ·Á ¥;Tl^ørÄ‹âà5GǦ)×BÁœ‘W"‹ +°Ì°ÙŸ7ÆQ\ˆ»øº@:É$F—Œ¼ ÍGnø<ì-Áj^~x¨ù$¼üÚ9O½Æ@8P"KY$íÔ`zylAè³ìç&“ÙJÉá¡ø=­õžÏµ mØ®=XðÕR…2U<7u ®ÑTÇ[#€/M@6Du˜|<‘C;¬J¼ˆù)ï…˜ùÜŒTg€šßĺˆ³Ê‚¤ö—ÕŽCsl É<°‘«2{ܘ¬¸º®ƒ\ÅF[Lxa;â +¬Jl>œòìᬎŸNñŸ3ªœÊ”SòXßõVˆí¦þ‘b§ºHÕ¦ÂÖh\žó”š/A†²Î>/XObject<<>>>>>>endobj +1642 0 obj<>stream +xmUMSÛH½ûWôžBjc1ú°lrƒ[®]¶¼…9ä2–F–@šQfF8üû}=’XÖ‰)(ªi=½÷úuó}“ÀWLë„ÒœŠn!"AYGÊ6küžàÛ*ª7ûÅå}FqLû +ä›5íKB»´/.¶äm£Jzi¬dÛ¾~©È׊¯:GÒ¾1MåÒIê2ŒÆsè SÝ5u²T$©lªJY¥ EÞåãþi!h§Q +'éÂÃÎÏÊ“éù%.¢­'?X~”¦Äs‘ÛÆQÁà¡åˆXýÁ¿ÄÀµkJe}œÅL çªáä ¡GÙ$5í 5zA…³þßÎ ÂÖu£Õ/2ÍÃúÙ8[Æ8ðLè`Íp¬=šÂF½)ä89ª,&ú4°zÎp,F±ÌÎtj}ˆÖs^¤kÒê4Ï´%íÒ4eµZ>\ ‰"Ð8œ˜À¦¿õÄÂ×@:á(Ðјòó™_Ù +±˜ØaP}Øò’r!~Dí¨ü9Ñ¿Œyf?¥'ç±rLä~¿ƒÁ |úÏ|I‡}­ lãìÅÐcF¥ã}Ü’úÞp`j& + „0M'Ñ…éöÖxS˜÷Ü› +† 8à¦c€šã4õÊV¦“|)O¡ý èû€ëËŠŽÇ­iõ7Ó%s\ùMJÉz:|×7×´³æ ã¡ÛéDãÍ6/ç–kãQ^ÄWÑ&¢G8A_ƳÇmY¾‰òU‚Ü’¬¹v·_ü³øôpðˆendstream +endobj +1643 0 obj<>/XObject<>>>>>endobj +1644 0 obj<>stream +x¥WÁnÛ8½ç+½8 Är$»¶Ó[7I·AÛ$m\‹ÍhŠ¶¸‘DU¤šúï÷ IÅŽŠÅ.ŠÂŠEμ™yófüõ(¥SüKi‘ÑtN²::MNi6&Kš-xÎð¿U´9úJé"ÉÂq~˜.p&›Ÿ%3¾6¹Jgtaè£7NÓd:4À–aø‡ï_MÞœQvJ« ÌÏKZå„Ó§øFŸ¢qªÅû„Î[%œ®·ôGkº†n[³Ñ¥²¿­þñ&ÒE01žÎp•ãNšÐ]çæÑÒèì{89£4'³E2ç“šŽj¥rr…â gËÞ‡)µÜÑe®iɲÊõ¯¢{”®ÎñÀSBWŽ¤¨iä¼&S³qFpJãtÞ´z«kQÒ¦+KjZ“wÒEº¶N”%"ÆÕó‹è#„€šùŽ1¥´Ê>h7©•y¥ëIcJÄÏÃ=NˆÃŒf@\¡-u–“Ë)xç“Oª2ßgyÛŠÊÒFH]j·#hp¨&‰Ü<ÄÀhôVàô…¶#rbDÙ A†?[å-ÇÒ Ó*¹´Š:'œ ‹ó‘m”Ô­¬¿^b6€‹œ#gžŒjÂ%úAŽ>ìÁ^ÙUªv‘9=ŽI9™uÝfr壴žŠÏü³H" zŒ%o.ÏM½ÑÛäöæ}x±wácbª!ÃìhJ!a@×HkŒ#DÊÏ]_®Þßüqsý7ÙB´ + ÛÐÎtžvà+ê'½×®e*͵Áß¾ÕZ C+¡ëÒŽuY<ŠÎá½ÓÒ]/¸Ì0ëãä¢wMÎEb{¡GZµÕÖµ»c%d¡ëX8ÜЛa éðt÷á”GþM1läuoý“²O*z¼y¬™¯þÐZÈÎP„á<ôG±;a‹5)8Ø‘5ðêðgÀÏI Y(°˜ÝêÚ©mË9Š£÷‡Ñi‚ak7²{rlZSy{k!ÆPišM¢7e¹1Å&ôVÕRp‰ƒk„¦åÐ3¢d>ÊBÔ>Óì’‹Ïá˜^\zÚú´±Ø*¥ïN(e¶WÊëÍžó’ÕKåçzcZ×Õ`B’KÏ +¥ñžKŠ Óõj6ÉÞRoYÄb+ËaùÞ¢ö|EÐ׎eÛé\½bJã^Anê@wD&´™k °=![@r{I}ØáuÕt£È«JyåÜ@¡¨kå›wqjÍЗQLšŒŠ;ÆÜK©×ïûl¾ˆ½ß·¸ÿú.¸ÏÄ*ÔTÔ€b¨ÒW–>Pì ½vÞm–%Ùiês¿œú‘vE¢:ÐiWÑ‹hâúÍ"Æ]/ž>žyÕ ’ìîIh·Ï]-¨RÕŠÞŒ{|0G]ÛYÉ +ÓÒºAϸbO˜Û‹óa!§Ø10Eç‹drûÓb.±Í_ò;÷ôâGçÜÔ+3¢uç\¸É›ç4Á“ÿÔlŸ•« zkóý€’Þ|$!ê6"‘ç!œZ=R#\qBjûj8xä«û{§ªæþ~cÌZxVÿ7T!Tt-Gb<„Ç‚DÁ~q "jçÂäÁ`~Ag˜qß¿–“gÞ=Ué€}Ü+€Õo 7ïZñ¤’h€¸(ŒdgÏ[”èa¹6±3ሙ÷« gË$=Û+ØHlqBÅšw+(iL‡Ô7Elëèª ©æyŒõz¯ÚØpï —„bÓµqý:ÜË‘Wî~ŵ…éJ¬¢k‡5À㸻ºà†ò]ÇÂzn/(%ÙjÝkýVáÊÍ@ôý~ ¨‚Î4b«>/XObject<>>>>>endobj +1646 0 obj<>stream +x¥W]oÚJ}ϯõ…T¤o4IoQC’&îí­d©Zì\l/õ®›òïï™]›¯Þܪ­¢ïîÌœ9gföë‰O]üø4 ¨7 8?éz]ôzøì†ø ð[JšÛçßëÿ׋ÞÅðÇ_Éz3À½¡7"ÔÅ# Mü>])zr¼ÎDz¡ï ¾*¸8>ëuxröæ‚pt8‡åÁ !¨n—Âø4€qüÐT‰0ªÜкTó4“úeø;ûäûng'bçi¸”$fꛤ\š¥J(Í$UZ&dÅ¥/8D¦•G!–¨â›, Z”ªZ7)-°_춲]êø=Ä˵c¤Ó|m(S12ðç6ü eé]Cb×qý:VëN5ûàWˆ »Zo›Žo=ì¦Nó +£ŸžG9"Fˆ¥'¿ËÿAæcðÎÚ“Z§ª jU•±¤l.…>8èðXŠ—¢XHm}×2®ÊÔlHÍI¼Tù*ª°Ø—(à(ò2ÕÀ;SOî4Ǫ* %* r`mµ±%9SØ 9<²ðlßÿ—¾GIC“«g ù¤*Ë4‘…IçkËi¶¹´Xð~üϨg|L‹„=¿ éQ–  +õ¡¹‡Éw©±~ÁÀeio/Õ r#³$Ûâ—sUæ 7 IJ¹Hµï«"%b®9ön%7¯Žð~ûîúÓç›»ËñÍçéøòíäö:ŠïÞ„Çxš¦q©´š›(ÚùE—U 晿eÉ´ˆ¢{§±X®o"ù°õbo ûÑf×PwžÒ,c½éj†oµMX‚oͲW3gš„jzZ*zÍÔb9 tä×€!G‘Å*_W†é† +J‚^ø˜†|ûàÆ­ ¶ ùx ]Æ"^î©n +< pFYDm{ð‘i6ô8<¶‰i#•I3¨Â‹^ҤРU«XÃÍu™rI`"·tP›¬Œš–(] G‰Ô9ðMd•¬±¬Ÿäb!ï…YîD€È5´Óëo‹JC“è%õìŸ{>ù¨nz.%,†¼Ò”ølªà>ÄVÂA¹ÅÀ‰F¹M.8‰Àlú¸µþ¤Ê•6ŽÚâ8µŽÑÚr]m«›µ`> ,ñi–ÕtpP’§˃[CC\w„š7KDƒ!Æm_nK÷CºX"â,W–0Öšnè²f\‹&@£e26ÔBÖh©Ô-wêïؼ<°Æ ‚êÌê1ûý“›û‰sÓÐ஽E§Û€QûUËèåï=gVƒ¼µ.ÕzƒŽú(M‘^ÜË2Oq=zA3õ½}”²KÛ4ZäÌÿ‚iÝ(µB9~A³˜( e #eŽr’¢Çqcj£ÔÈ +ÚAk+"ÀµEœ)ã„`;{ƒƒ£×|ÄäÑñ]G|Z¦±«¡È¬XQjÑ=¹ŸÏ2iC00u}ˆïÙÉ„•m](¤¥–yžrïƳ³Lì †‡]/^¡~YÑø“^8uî¹=\]·QT*eÚ´ZCœÉ+Ê7Íóqzì0°÷½À¹ö¬4#o48gõ¢Öçbå&©&ôX¬âåê:“Ü A‰„»¶(6>/XObject<<>>>>>>endobj +1648 0 obj<>stream +x­VËnë6Ýû+ÞÔbFòCvî¦p.‚6½©­¢-  CÑo$R©¨þûÎÐâ¾EÉ"Éyœ93gþî…àO³Œ#Eï&î]-'†o`:g£ „h>eÓhq + ‚b1ˆ3e9X)êJ¹ˆLŠвgà¥SÓXøó ’© à»g Fç»Ã#+«W%$”_†Éƒwë0 Çl„‚kÀ—©²ü9—)¼*ŽN·•©K(M®Ä”†…pêUª¤p¦Ú1ˆ34ÛžÛ/­ÑQÄ&d´kŠ²v²‚[£7j[WÜ)£“d‘J+ëè´ˢ̹“6IÖ;ëd‘$¿cÌðT™Êéóm\›û­ñü(ÓhYÙL•`6°2]l;°4yŠ§}z3ļ»c\§ ØÌÔyJ XéÛþ½öXôÜiÁaªû+ÚÁ,È‹åÅ3‡Œcˆß1:GñqÍs³­åð€/Í%Ô°35Uü’7rìý¿áê2¬Â6ÃëʲãøÑYÀò>ôò f +£Æªù(?ì.7‚çÈÌPr‘%Qà'¥%2hï¸áڃ媰u“×Æä¹i¨ÉàWvƒ¯ 5ú/Ú4@u´u…9gÕ•ç]Š5S½P„?¦"¡A¸8õDj +Žï’ O«¥h›k8cóÂÉtÏódÍ€<¼µŸ¿0 ± =i¿î=aG‘cë‰æ,šŽpUÅ«á8 o÷qï·Þ¿?ø¢endstream +endobj +1649 0 obj<>/XObject<<>>>>/Annots 1028 0 R>>endobj +1650 0 obj<>stream +x}˜ÛnÛF†ïýsרižWEâ4­¶qc¥îEnh‰²ÙH¤JRqòöýg†äe¡(ô÷Ç9/w—ú÷" ÿ”…¥´Þ_øž¿Ìÿ|üå"ˆ¼œÒ(ñRÚS{á(vtw‘äžOiz1Xá{Á(ó ì)¼„RÌŒÜSà'^f 8MŠ®a˜Â·ŠÙi’‡H cf"˜ §H*4ÐjÐÎTjLÒBjŒ%¤vk$êçTõAfF"`ÁŒDÀ ƒogh5h\ uŽjÎÐϸQÓj6å‰8ª¦q$]Ï +ÎH[Én /20ð¥afÏAÃ-NDIP£5(:ï(’˜4hâ/m-¤…ÎÖè=…¡Ïƒ™©Õ qÆ9j4hžq5´àéjôž¢ÐUÀõZ š [«™‹z­ÍBîóœ•Õ ¹¿ôlôžbŒÞNÁjÐ0š»Î9[ š.sç¤ð8ÏW”™ïDužŽ=Ï×Qïd«ótÔèy¾3ç;ÚŽóuTç;Ñ$ñ +J5ž3ym5}Öí`¦Vƒ"Žo<[ š¦üŠ9[£y‚!¯IGEõ˜¾£FcFAÀ+v¦Vó|Ó…g«y¾ñ¢ã|ýë‰çë3¥óu{*rÔhPõì¨Ñ Øæ±&5SŠE\«AcÙUf[«y‚ò.8j4h.=>G²ùζVƒÆÁ"g«AQ&èlÍdûuÔhÐ<áýÊQ£y¾ù²Ï²ÇÆè˜l첧ªrïàL£ž 5š'Èï‚¡FóC¬+Cæ &ˆo¨Ñè3²²¶VóŒTäl­F7>=µžSKÅ.b³²šûœá=ržå˜‹e(Èç×H•4ÒhP¼^™¥Fƒf|½±¶| ò˥Ǡ4R”ŽÈiØÆ9{vÔhP,då¨Ñh$Z…rgj5hñx5š‡ Kc¦úêDz #.žEV¢$g£A±i"+GŦ‰ê5Gæ³ÑÈ +‡Æ;ÛZ­9/<ë«ñµžq‚­(ÉÙhÎJfä¨ÑðŒ— YÍÔjД/ŽŽ½’ãžCÞøcQ:_§AÓœ§à¨Ñ 8ªQ‘£F#nXð|gª û=߆Ç+JÂê‚(†fÌTL£‚¯Ú“©*g:SÙR 5šë àÃP£¹¾˜j4hÁ+ÒPI”Çø·bî± +ÎÉH\à”옃]DÆðy‰bC…øW>'ø¦‰`†ïI"y‡TCìÜ]ù‰Dˆ!–¨dÌ˘¡F¡ô!ªˆ1â$aˆÃ86P ±ôä6…ý Å–Ñ“»d¨Ñì8âüœ­Ñ è%†â¨Ñ /WG5)|Nqs±«§‰œx`|ˆroS¾Wª`f¤´/3LŽ÷ÉN¿¢œ¡ÕH' ÑG%Þ¬dÍˬUqL…¸JɪƮ$GQÆv¢jë¨ØøÖ‹;Ûªr¶3[CÕû¥ë囹tYëW=õÊPµÅ‚ÓËŠÄeâNTã:ª¶¸V»^¢ŒíDÕÖQµ¦XâŠ2¶U[G僉/¿Ú+~=U©­Ó¨7ÑCÕÿj¯äYQÆv¢j;SYÌòûÞ2þiAþŸíœBDÙÒgd$ÎacÆ ›+Ž\||âý©«h{ñvuqõ¾ Ð§Õ?ܤYN«ü^ƒ¿¬_Ýüåћáj6õ·ª½úOgˆ«O_†|]m^­Ê‡]Eí–®Ûf¨ša|ݘž”•‹'ÃÀ£Û¶ʇzWßÙ#~'º4üzûéo&—þ‚„Ý] OMýéF½ûãFÌ– öècµùµè·º9~ƒØ?te³.on$È">Ç(÷%á j‡§ª£ë›÷w´ÞÕS]'Ï#ßßËuÝ mÿ4=öÓi~¸zôá.¤kñÃøÄ î(¼}¦uÙÐ ­Ûf[?1£wW!Ý—Ý›ÛTëÚÎü1¦²§r L[0É_2XôS@ÿ"¢Ï¯šv˜B}~ý£†Â5ãG +°QÀè};‰cÎA0‹7Èœ»W¡‘ßÇFÖ}¬zz~ªõúùïU××móù5Õ=ûjc+:_fÊulZtê±èСÿÕ¦«á nvm¹¡ç¶ûR7’®ôq£z=™²¾¯Øöòü=l»öxÅüâYLëS_Ñ®ª~ ÕõíÕÍ-õC¹þBÛ®ÝÓïõºkûv;È[v;>Vkµ«†Š¼ÃóŽ¶õ)·\áì{佡õSÙ¶ƒg2ÂePé®Àèœ%ÊŸƒh©ÀäDó¦ç`6ÂìÌGøbr)Å‹s–ølÖ c-JNtét ¨õn¨w;¼S_e‘`ÃÀQØËsõ—9ÅL~ÁøòLñ˜&!Î_`\19‘ŸW^ü+‘(endstream +endobj +1651 0 obj<>/XObject<<>>>>>>endobj +1652 0 obj<>stream +x}VaoÛ6ýž_qÀ>ÄÅ–ÛÙ>uI·Xq° óPÐes‘H•¤âúßï)%©ÚµEK"ïÞ½{÷ÈÏ'cáÿ˜æ)Mf”U'£dD³ô"YÐt1ÇïVR>Læ—xü·t6MÒþ‡_×'ç¿]R:¢u$³ù‚Ö9!Áo²ÁÕ^Ô^ZJÇ ­Œõb«JåoÖÿbÛ”Æã¸í,] ô:܉j+è`ì£#£ ?U.É +½“d +ªKá c+GÛÆ“ßKRá ‘IeÞ¼¬©­yâíÊ‘6 âè8õˆÎÆ“˜03U-¼Ú–2¡õ+³qf´J»çœg®–™*T†œŒ»áÖ GAazGBçÔ8þ帔$VzIãy[édšL¹R0NnV÷ß’1Of¼äfuêHUu)+ 0!HpMݽ²GÚYÓÔXæ†$í…ê3çBØœ6¥ýÑ#•‰MÎh·yÃÅJ´\àÏL”“ +UJD=—>;o¸¸ðXšJä̿Χ¨¨@r¿¼vä é¦ÚJëZ6¸WÌcDïz •V>²lÞ0Ì1°ýö„Þç©Í"òŠûrØzÔæÖYSK‡šðø2€ô÷Ro{¦*ìËtúÔý1ÚŽ/”cÈù¦V9W¶3,;CÌ SÙCPP"+¢„~Hr/׋ìA8šæ}àź–ö‚KžËL;¤"ûÝãO¢¬åõËT¶§J +°UòÒHO/çߣ$A§>½ûðïd1´ÏÀüŠN9È<ºR¿€à!€œ›¬á©Å:Äd 7+À×Ì@-v`«Ñè$9ù,ü\ó„Õ¹C¾L¡­^GÏ-Sÿ8ªŒê ]–´Úæx ‰´~ă³FæÂJùü*òyB¨/ô²óHÞÝ£$(Y ¸LhöÒhx’‚_ÿÐäÒ„î®né^«/øk×o®ízè&Sæô„ö°½ÂîºÝ\ Ž•‹#i fy%&£ªùhÂõÕê|¹ƒ>Û£>áx¢`%*ß”MgÐtB¡ÕìäÌbØ>|Nõ"ÆÌXÛÔžráyœJ®xq¸¿¥g¦?„ Ñhˆãþöz²¸ +£5Òs×VqÉt÷Ç]BK”äHùóä?èÂ/endstream +endobj +1653 0 obj<>/XObject<<>>>>>>endobj +1654 0 obj<>stream +xÝVMoÛ8½ûW ’\ V$Y•=$›k é~ć.P  %*bB‘.IÕë¿”ä:Nì¹lKÔðÍÇ{3Ò·IB1Ž„)Ís*šIáòjå”-8Oñ5œªpc>²Óõ›õäòCLW´®€”/qRPâ˜ÖÅ”úO£¿Kš}™Úí—×,y½~œÄ4Kâh‰CgØÖž_lŠÂzƒäÕˆÁc¨àÆhsb”¼z{²â±ü§&DXÆ#ÆYçòCFIÒe;Ksû¶uäjaI(ü£XBrêlQÌ`;µÜñV”Ñ Æ4„sTÀYš¡ÆG‰¤Þ ²¯=ÂItÃòXZ(<ÿ†ôγÅÅhj;çI_°± â‹rŒ¾é—ä™UŽ* gN¨‡@5Û ¾pK{Ýú5EÌZÞl \5ÔZwjxs¬œŽffé™4ÐiþìÖÃKÕ¹š9²µneI[£Ë¶nûFD¨»õAÈSbªü™`½ëÛg®‘«OZq^’ÓÄJüÕÜ"ªóqusGR(>´Æí§Õg$\8¡é*XݳfÃèŽ=qß8ý£[C?¶‚ŸG©ï‹ÒoS$µ~"«ŽÞR<ùÔ…m©ó](xHíPzM3©ž%$ê"œ¡ÀÁ­á¾Bä>³Qoç%òAæŸþøú~u;^ݨÓÂtö‡ñ!T!Û’Û¨în\Q²ègмieýÍËß¡ˆBµÿâ¢Ùpëf«ÕËòÈïfOˆ”µÒ ›·QÙ_]¡¬cRBù D[h†¸rfïɾ䮸¬µuX¶Ti)õnœ‡0oñ“¤xÂàH<•Û +žè̃(Öð³è¬Ô *\¼ >„¾öC·`­å–:!EL«^‡x¡ÐÁ+ ²5µáÖ§ ÐFDÅ„Ä‚¦B7M«DÁ÷þ!ˆ¤×`¡†åžvÂÕ¿6è@ßG‰á•6Ô°=y°kØ¡øƒv˜´«uçšÃÔúѲ1(‡’­£ZËK@¶ÍD½á0?~ë¢ëuh¸·tË%žC!àŽ»n¤!dBåú'Yh]oÂÀ;ðÕѱì§Y’ƒÆåœò<ëžå÷×w7×ô§Ñ(Ýê¢mà-HÇïœ f‹Ø¿-Lÿ‡r³¯$oR¼aÀ>™Ï=Îûõä¯ÉkIlýendstream +endobj +1655 0 obj<>/XObject<<>>>>/Annots 1039 0 R>>endobj +1656 0 obj<>stream x¥WÛn7}÷W ôbVÖź䥰]»_)q (¸+JbÌ%7K®½ôÛ{†\I¶ -C‚–KrfÎœ93þzÔ¡3üuhØ¥Þ€²üè,9£AoŒïþhˆï.>¥¤¿ÀÖÝׇߎ:ãdLç£A2¢œÎÇI¯~Ð4 ×ô#Ω7Ä«øÀ¯ÎGÉ°~ÌiÔÅéý;¶Þïw’Žups§~Ú]Ùëðþ·žuÏ{8ÐëñU9õ‡Ýä¼~ÚƒsßÅs9;jߌ©{F³  G4›‡±’\­DáeIÝ~BS‘§‚„™“õ+¬]Mn¦”i%w§³/¸§ON¼§Õ%]Üt2[)GY}KfÊ`!œj¹Bfj¡2RfaË\xeM¯SgX_Õë'}¾ +C‚–KrfÎœ93þzÔ¡3üuhØ¥Þ€²üè,9£AoŒïþhˆï.>¥¤¿ÀÖÝׇߎ:ãdLç£A2¢œÎÇI¯~Ð4 ×ô#Ω7Ä«øÀ¯ÎGÉ°~ÌiÔÅéý;¶Þïw’Žups§~Ú]Ùëðþ·žuÏ{8ÐëñU9õ‡Ýä¼~ÚƒsßÅs9;jߌ©{F³  G4›‡±’\­DáeIÝnBS‘§‚„™“õ+¬]Mn¦”i%w§³/¸§ON¼§Õ%]Üt2[)GY}KfÊ`!œj¹Bfj¡2RfaË\xeM¯SgX_Õë'}¾ >tº™2ÞºÕÖô/ßÛøKº„f«ªt醌]ÓJ¼HÑñ«àµi*ËD“ ­åœ~½øtM-rRòµgÔê¢õÙJnÈKçIyKÃÓ£2s»v4>oî~ßÍF. …°(³yÐR¥•ßr®b¿.<Eò*—d´.•WfÙ¬­vz¾àÎZ8žà¥@ÔIÎ8~ž‘·qªb.¼„ /Bi‘j„‹Z”R<5ÚŠ9žlŒo±YËôÀ®S¸çé„=D’€ \\ XÊJ:`é(•Òв”Âë I³&“óf'Q/Ÿ´Z¶êŽ(“éj.çO§!ɯÀ½Ð ™H/ØÖâÐêÃ~m£ó*/´ÌAµ@Çþ\Xš ýLŒ²“ÀGhz†—áõÇ»ÉgÊE¶2ÒŸC¬ä¶£\–™ÂûºNRQÚy•y@¨5ø³±ƒ]V`[ê¨ .sQ%x¹_ŠÑo ï\áø¶V~~’˜ÏAkà„«ŠÂ–šóµR%ãoBÆvgcþwð€boàðVï$ X1=W =®ÀªXÕv±€+t;ÝѸö ydDö,–4ìc àPºð?.`øx`óíáf´x¯Lõ ÛË ç«• -‡`ÝÆy™»§ÓWu¸­ˆ•÷Å»v{½^'àK¹¶æËþF®ÿ^+“¬|®ÙÖµ‰H7¡ûi—¢ì6BbX[½³(P›.—ÙïÈ{& MÀ³PË +‡`ÝÆy™»§ÓWu¸­ˆ•÷Å»v{½^'àK¹¶æËþF®ÿ^+“¬|®ÙÖµ‰¤ì~Ú¥(»ÀVï,ŠÔ&èÍïÈ{& MÀ³PË l¹Ÿ¶»ô(Ê‚®¬12óö‹ýPt[,¸1@Œ¢äªÈ$[¼ï"Ê¢¡%ŠP·FÕrÏRúâÁ >¥èH¶bA6Tã’‰Òê0¸¤z‰Ñí´”Õºô¨½†Ó Ã ¼N±nšå†kÞ¯X6ØÔDþ‡„þøZé† ³øø_ËêÓÉñäò–¤,ŸN#ÈYÝZÃdÄ Á>uCŠo·½#¼lm³=»zhOÀ“ã‰a‰¨°XÿïZèZq9¹Ÿ’eù†4/¡A%ÄÊåõÇÉOÚáÆ×ï!š MVH{¨ß…*Ñ6¸l½]JÉXýøEÌ}²TŒ;A]œZA©æy»Èo…FBŽTÔ&ã–puëÈ…©„Nh²ˆTeÁb=ßDáæš^ícÚAöµ€Œnõëà6p_ÛÒ ·"üM‚@𻫩Ô(€HuèòÀº¾ A6ýÂ%S{Þ˜†bGöUÑÀf&sÈÎ (cঠÐëi.]VªtOÄ"ÐôK…¤ÐGHsí‚5ÈÏa s›U»~ƒáÇ ÈñíÃlš\¾nòð‘=srîÿxõЀÔñþâaÚw[\,˜Ý]Ïï?]ؾ?”ÖÛÌjwÌràØOnïÀÝ@'^¸H-_Ue‰e5 ÖCÄ™˜ ì†ÎóÑÃébïæ<³”dª<•etÝdA’1¡4 âHn£­"{‡9ï˜Õ±¿p§”åÓ kz$`‡~Z’¶ÐÐ*É¢ø°ÜÚ"vBd m‘ Fäu§ÅB) íˆm¸ÃÜEk€‰E“+=}¯œo4Yªã܉›éqr7 =;ÖüVÂàò1“„óÆ÷áæ -#`™+cµ]nösÌV®¸¾é <1äÓgÐS»ŸÁb=­ñð²Kö9…’.v@ÄþCº%iŒ+šËJ‡s(5ïÅ(W SSm)x’Ó¾íôÁ8ö¥Ÿ™ðù?”Áy7jw§×c_ÏŽþ<ú¦5endstream -endobj -1650 0 obj<>/XObject<<>>>>/Annots 1050 0 R>>endobj -1651 0 obj<>stream -x­WQoÛ6~ϯ8äe)àP–ìØI`HÚdMѸYì5–a %ÚV+‘š(ÅõË~û¾#©ØqQtkZÕÉ»ï¾ûîxùû ¦>~b'4QZôEož÷¿ð%#Ç#„4ËŽñ•¦¦©,çòg^Œ®‡ÇÅq2æM¿›Ö9m­¢f…èk¥è6OkcÍ¢¡º•Z.U ~’”Þ¹Ò³ë°-jSv~à &Mõ:ŠðegG¤¦Œ.[;ÝØÈ[°Lß^LÄÇi šÂëªqSY›B¬smEû$….¢ -¥ÚuTH]J-VMY°ÿ=¯¥]¹ÆB)›ÜhÂßm ÞÚFI‘3·”º@Ýh’¤ÛÆ®TQôHeyã‰È E€÷éê&ÜËÚ˜fÏo–×H‡©7dn£eŽTɺÉö,³Ì­¹VöµOGŸÎºl «âˆöþ$ýs«š¶ê«ê<÷}~÷v¶jÕ¬¿ Xa7ö?í~ʲnï q ‚†æ -„*Ú@%‹¬’Ž¼‹ÂšeFÿÔf9iÑf*£ÉUÒG-guþõÌU*™|Ð öçír¹4mlÏoíAº“é® ÖmÕ•føî”UµóÈØ$âðMý%ÒYn#XÉLxª·õw<ˆ=×®ð‚.!Pà)5ÒÈѶÊÒz¥´¯³Ç#^D$âz|ÅA ¤Õ’ì€Ò<;ß«¸6É„fÊ›\ÍèÓÍÕÊ÷™ÁÃkÖkæ®ÎQl¾bè^YÓÖ©¢ËÚ¬­ª{¤¯nÂW†F–%µtˆ•³+½eŽ -Ï¿ö|ç•lÒJ´þ¨ø,7‘g]ý!sÈš?¾ÎQZ°Ûå}Ï5*GR!pÈãBq= Åׄ„&ðˆÆ×V|ªÚÌ UÚÙHÁuU+Ž5×K*  P¥eRµçÛÌ?£6a©Íj¹\"p-kîJ© - >§\úÜ(øµCøüt†¾g#7´T¨wÎâ ŠÏÌZFfÄšdÀÜŒ]wð±ßSÈu^Û¦Gi­@X±+ E þ?îîo&³·÷Ÿþ\éŠ ö‹ì»3 ¶®ˆjà - ÞfÊz šXæó{Œ1âêâ/Ç«¥²µ Ù&dØ*t4@B6ŒS°K½V@òºÄÔù2ײxnÎqÏé™/°”ÑAŠ¡Ÿ¨lB—U‰mŽ0´³F•ª1 ¸^yú:ƒžÌ:ÚÌžãÚñ’â«‚»°C_“-çhzá*¡†ˆ¼¡‘t¦JYÑ9Ë®“íÅw÷\žßÐݬG‡«pgpød+•æ‹ÜÞK‹G„÷ìôˆÝsl¬ïîvÙÆéÞÑ2I|œoÿ€.Ðèv¡n¦(Ð5½s²¦#}f÷ȹãápçÕ¡8ÌÔSŽza›‡ß Ub)^Ó»;ú Q¡ïQ'èÄôêþýÕL¼\ h;ïݲ’O -ª+šœû€÷ʪuŽP42&ì-,œ".6l³8ùìD±Õ!3»PÏQíÅ#¨­Â`ФC»íî*Û#ÚL›õ¹y¹?(Þú‘b§öÉj¸ïðU°5Î÷ -W‰|’yáËù£Ÿ=¬‚V÷‹% íñµêLr¯aÂŒcŠ{½ÍË -иåg7¢½Ð»ÖÇ4c-¸­W9zî®á½È1a±¥œm[&ÆKžva²Ám‹»ö!× ”õX»¼¬Ñòݬ²;"ú£y†åC± ß09ð%‚Êž½¹‹nîЕdúÅwóçqõ¥&áÛϸ|˜~×ÀóœJ¹—÷²]¤ÌªGâ; ð›Ãé€Føßž^Ü^^àÞ6|óÐ[“¶%æe7‘2: çþÀñ¸ÑÏøÿ ÿÏ÷Çý!ÿrt’ p† àjvðëÁ¿Ð? -endstream -endobj -1652 0 obj<>/XObject<<>>>>/Annots 1053 0 R>>endobj -1653 0 obj<>stream -xW]OÛH}çW\õ¥¬DòI¨´4 *„lâ6] i5±ÇÎÛãõŒIòï÷ܱ¨Åj¥UU°=s¿Ï=÷ò÷Y.ñ¯GW}Œ)HÏ.½K]_áçpÂ?ûø_HŠÜÁp8öúï †“w Ü»¬¬¾œõ EýÉØRJýËpo ­…þx€³–éÏþY÷vH½ù¼O®ÈæKòƒs'IŠ"9’?]vï–d¬ž íDH‰¶†tDÛ26ÞoþϳKêôÙ¼ž?¨ ÐFG7 ‚L¤02$‘‘Ê‚B¦2³"¡2 J²šìNª¢12èw>+Kß3 - õ" ã{’+mÔQu[Y[î %XŽt™…¤³Zcds2ÊJ–ðì¥c^ Ó Ä@g¯¨›ËBçæhº{•…zoºy¹MTеA®òî>ÚÛAß“é|AÝ”i™†;eBŸg°¦D¶“¸iw°Jj+ ¤¼ÐÛD¦ü‚³=ߊÔA†-äÞÉNUR"=›»ÅúqúÕ›Ýß_´LúóûÅÜ÷æ?æ´q—“ñ}_|ö=÷´Y£pÕ£¿º™ÎWõeH­ý›úEdaK/ä›cWÚîí5õPYÆHgЫŠÜzHºG3”öò}R{."+ Ê…1{]„ìD»B½ÅZ§ÏX;ßD›˜B¼”£4Gú©·´WvwR€òßA3êê²¥"¼V:)=žnqÑ%Ä`™3\fê@[} ]½/§­ù’#ÊîT3 C²º‡*&¾ó&.À„¿Ô¡P2°º8Vð\Nq’$då‰À]±Õ¥¥LÛ–eÅ„.†‰¹@,l4ˆ¥% Ü“²$’DÃbLG]²kè:Ä Pi’ÜîÀ»ÈÝuöØãC`¬!Ç7¹tÙç†L·h34hH¥©1ª“ð¤þ‚ä‹D÷VZ-¡CÁ…Vp:“m_‡Œœ)£Õè~pŠŠ3 à‹“ç`ŒŽgåœ@¤X$:æ:þMu©¸„F˜zÕ ð… òÇ~¾ƒ?ßµ(’7 - BJA,(„S4`sË×|XBežééÜýš<ýÆÈ ØÜnhàHÝ‘ š20&´!{ÌÛd5ÿ±¼YÌèæÓÓÓÍìán1½ý‚^þ‹¦ø€®Ÿ=nÖ¿œÌ™‘–°¢ÒP‰o(QÂyña‰DڪɃÈD,‹ôìòdV2dt²Y@ Šm¡Ú齋˥¨hÀ††T’ ±–­eÓõS¸¶’6p^W®­«:Œê™sNFe¡ì‘~gèÕñ¿ÑÍeÆ(ÁX©ŠÊÙ?yU‰¾N³†a*>wNltñºÌ ¸Œ@YÍÈß[‰œ‚dÕ¤\97Ÿð¥@Ozô™ådôý1Äz;PÙÃp¶;]Æ;ø¾“Á³+”I·AYôt>†T›©° -ÕY;C-JЄɯQž³w&—ŠŽ´çaf,DŽhÏ'#Ò­ Wн¶8²ä) ²ö½òÚlàèŠô‡'ÒG 6uJ?^º¯'¿ºÄ{À•7väÎJKÃìÕˆ\èqþ@ëUßå!Ò ½U³}ˆäƒWuŠ-!Äl†cø²vα[ÉÚ€”°¡™fô/Ý–A‹GÕÈ·%8ù¯§…cE`mG5: ÜŒ ë;ë[ ·ëÖ}µÓ,7c°›)¥‘„Éj<€ ñŠƒjÂvߣ?A½Ud‘, -|®Aõº)mä¶ZU¸¥ÑœT¤²‰MR@'hS¼•p罚ÖNQã@Ä;“ÃRô&ï._XEO[ÚWYd2¡oniùD_W‹ûoËol».Þ÷<âw¼žœYr nÕá-ï_ÞÂ^ÐZa@6¶ð¼òß“·åêÕ³ý~·|O¨l ®d3¡Ov¿¯f«÷¤G•t§?zMÏMbô¼ -Àkz,í½ÖÏn:ÞèTáê€Z6DϘ{¼Ÿ×60i5ÓâÉÍ^cu^U+uÙæϨÐ)Ó[Ì)vPÀZsÀå^c)íZ‚?‚[p§qŠgw3à\çÅCßhy Z)ìË–!"Ã2çT½—k~Ò¸^ͤÅâöŒé®âÝV; £LÐWíúÝÛIMà½1þ–™ ð§C¯êùõÍÃçÂúÉm6ÓAéÖ}î¶Úi:W—× ¯ÿ±FÇo<ê×ðŒXïÜ?ûãì@¯+Zendstream -endobj -1654 0 obj<>/XObject<<>>>>/Annots 1056 0 R>>endobj -1655 0 obj<>stream -xVMSãF½ûWtqYSedYزÙ*/ UÙ…]»*‡8‡±4F³Œf!¿>o>d@–à²%u÷ô{¯ßÌ_ƒ ÅxMhžÐiJY9ˆ£˜ÒÅY4¥ébŽÿ¼kN{{>¾ý2˜&“(¥Ùt-¨¤é|ŽoÿKÒÚ%JN<ÑKt±Œ¯Îh2§ÍµÓt†¸MîrǴɆÉ4šEô»P¹~4”Ĩ»æõƒÈ8ݲ잒ãÍw¤˜ÒdâSœ$s”ÙäÃMÁ±V†·á¼f’˜Rú‰©ŒzMÑËz›Dt£8é=="+H+ùD¬ª8«PpE­êŽ­Y¹c¶pL'“Ó(±å VÅkj4Ú4x?ªZï…D9\}ÝÂmB™\5†„BÆîn®K&TD›BbÆ´¥.Xãk’½Ú+\òr‡ZXvSpò F´k÷KØI^¢a)IŠ{Žžt–µ5‰=‰Æ&Tº‰BÎ$×hæZ‘®sßNhìЋi3 hö­DªŸ5¶:Оt ÛÕåöxôŸ0–-À+Ø÷¼Î¯CR ±L’i«J× cÙþ‘Žú!±<ç¹]’ÂO¦°ü{: N,˜œjÍJ»˜®§ˆ®-zÀÂÃõpF rÑW^Œ&=Ä™.+ -‰í4(°Íï¸k4ص1‡žKÊÓv¸ôW\ žo{•™Ê)«9k8•­lD…L™®ºë Q+Ê…¹G¢ÕÍçåõ—ȪÓ9Ñë Ɉx“EQ´=Ž0GXÐ0å.Ê´Úo‡³J—LQÅ©Ô3ç •-€KWÐPìRmÛµ9!W$þ9ƒ}ò*V³’7ÐÜ#3¶\ɬÀÝI½c²ÉóÓ€ºæ’3ËmU , »…]ÙWˆì¤½±ÚÐRêGË -`-TëäàUóÑ/0¦³ÎW¦~6(üýèû³[Zì¬kØÝï¾+«9§1ÿÛ -w¢Þ êèf`õœâ4Žß ÈEͳF×OT†˜ù»1oŒ”5µ7zsï‹?ÎÂ’ÎxA 3PˆUSÉ®uXwÒ°~—ÜÓúyx‚ž9ìI4OšÉjQ¡«ˆ(r#ÝA†4•q¯ï] ­¯W#øîÒñ>i¯[³Å<97ÆX•V° Üt…×ËÏËíÖY:rôÊ¢U)þAˆwÓ\ì÷Øx€í¡Y˜‰õrq§¼=ù™ô #ú•cG²óò4NGÁ*rç -G½²Ø ³/ï À& ÛI«n$µQã«·lÔß}vÐÃXsöžf8€³ ô¬¨Ök*­Œ³µPêņøµåõÓ:p¹z¦²©™2Øþ0ÞÁ™3vpæ#l8 Ø3X-/ëk l’á‰:öy¡2ÙBC¯!p2õ“ü’:ºÂ†F—ÐP­¥{|•¾8U„ñËÍæ}ôû³u®Á¼Ûâܦúâ˜ÙáØbí(L3øÔ­ÝòwòàRî¸`eåö~wr0ŽÖñÕ",`’âøµ8¥)ÎGnÆœ$é¶Öß1õˆÌpP€ú­ÛvOº€“y ÿÊÿß1jš.¢t–à†ˆÉij3}Ú ¾þRO†endstream -endobj -1656 0 obj<>/XObject<<>>>>/Annots 1065 0 R>>endobj -1657 0 obj<>stream -x}WÛŽÛ6}߯(º6òý²‚¶iš´@ÚÄ@ /´4²˜¥D•¤Öë¿ïRòz•m¬­ 9,QU©sÏÈéd;òݾÖÔEFýb¼½¡6ó̤K JyÊ+Õ¸@ˆpdŽ´] ò¿! =2Õê„‘i’E0=R'Oj$¥íkR¼¸Àœ=Ÿ—.*¬¯»¼’oÉ!W|;Ϧ”l+6-§ò; >6ê}’’HmPÏ&àO9!ù‚ ¸Uáàl×’-©e :èXYº·¦kCpÈFãxoÈßic<©¦ .Ánðý#‚ÈYßCûÊQ-œ'%ím„р܅'d0Z¹µÞ뽸ÆÙas­¢©”~¥`9 JKÃ#…b?HébÈ:¤ß³±-»Ñ’¥ÓdN/.J$†Ì19Æ HƇq…ÞYj,tä}'5”YýÊÈDM…Guä2·u›µÎ›[ã3_ï©á£ïéŽÌF¦D!FÇù¢Ž`y;j[´sŸiç[Î#·!Ê‚°š³–ÂGŒ1¿=* ¤)õ¡sJ<à<)&@çâ-҄ ÔÌŽHBIYRÜrl¼BÍþ¾\ KB>_^Òj -?¶2Ô²ó‰ísÂ}ûDktbŽ¹ÿŒ¡±=Œ–Þ·d¬½C<ÛªH¹(± OYU.¯ Naké'#÷Ü@ AÄ—çp<èòŠ}4J=¥}ä=µêÛCŽUíëÉäì{éj1‹‹_zqô,xñ<£Ü°S†tSF~'ïŸñâ·É·’gE—¿ô-4£åÅ úºF«ö̉Ø9ëГ --:ù8:DCLn÷÷ÚBå5R–lF¹ÆÚ6&öS¼ÃR?¢kíÁPÄÄ`µP®˜ëÀûÐ*WKYäú)D1dÙRrëP#˜à Öô0®ñïÒ÷X/¬àK}] ­õÚÿD;1xü¿gw"]Ëo:µoÝä¦+…s!zÇ™ 4Y¨ÆG¯ 5â徃HˆjÐK°Li‰8T.š9Jï RØ8,¬ð’¤D¹•‰f¤ƒ’Fÿ¼ $¯°ëv$¿«£EFïX0±¸~ûFG @âÊHÙÓTsJCZØ]b6IÙ{†ß -d°•Ê#M!.ŠŽÍhëØoŽËÎË8D€³Â†£®ÐåBÛˆYúQyâhÑxÐåq³ŒÕƒ#”‘t­¸ mð2CÄ<¥zývL‹(ºÙ”p~8bÚ3Ksiñ u¥ÄÆOýž’Äâ¶U0¶KsÊÄBNâXÈÕ¦}¨ÐþŽ|«òoöíØfªoñX™-À&ïWýyëú"›7éÕP¶ës·¦ç8ÓÆ#Ú56LÚn4<£Ï—vXêäÚ‰P©ÏHJÓ”g˜žiɯšÕ6²kÃ(ñ-ò¼cn}#êG”äŒ!øŒ8”O\Xùõýv8\ÊÙçµ3zC³édŠ£vÿ2×ÞФónb,Î~½½Çý!û¡MÚúæ ¤õŸºl<ïŠ`)ǦŠä’Ši@ßÿ,˜sàžª4籈Ǹ¾èß¾›’>hN Ð/®‡DúpïÑH´ÇFEBrlÇp¸F䦕m¼9Ñ°>l´®Q¦t2<Âÿn¢»Âjœà¬gd÷êR{Œ@%¡¼â´q»UÆØcZ ùÇ*œakÑE -]–0-ÜzÎ;§€ž|à[.Ú.z³"¹8ã ¹„tûøƒd±IšùþÏåz›­WsüL‚‚f‹„ùmwõ÷ÕUÝåendstream -endobj -1658 0 obj<>/XObject<<>>>>>>endobj -1659 0 obj<>stream -x•WMo7½ûWLu© IJ¾,;zpP0Ф©£à w—»bÄ%U’kYÿ¾ofw-wmŠ @Â%93oÞ›Gýs2£)þÌèrN‹åõÉt2¥‹«Å䊖W—ø÷ƒ¦R>̳Éò­³ùÇ·O,ß8ði}r~»¤ÙŒÖ%‚¯®.i]O§´ÎǵÊ7ÆéÉéúÇÉ”Îæ+„\ãõF/ß"_9:Žu6ɽ+ÛåþÆ1i—¡]¼è÷’õYý¨-ý:Üo"ŃóîPû&ÒÞ¤ %D{óšBgMõÎ=i£mT¤LkGMÔGÞ:pH3[Læ\Ì£ÑxÉ—ôMÕ™"å°™OWð¤AA¥”©|»W¡ˆ”ûz§’ÉŒ5éÀG{¨4VÇ!bבËø8<*Ûhθ¹[TVû˜^ìö;do”°µ:ó‰œFˆ«Sâ;7¦Úè€Ê”£Å„¾h‡BŠh 0Âr¦) Æç©öýEÈt6ý€S‰ì‚Þ©ÐA®èï›ûïdU¨4=zÛÔšáf -*)©åüö#ÍÀ\¦ðÙbÙ’t~1YNèÎ%œ²¤Cð!þ—nLéËÉŠYpWJ¡•F’4ºû²¾¹ÿrý;ÝÜßÿq?¢ZǨB‚D—>“Iø¨À!\ËŸ -H¡ôÆé§Î -áF);(~¿S(4ÎKdš¸Ý»à3•1Š@¹ªÁ{i•ª±|+`´Ò«\&&v¶ñcÎ ¶9<ŒJûq7êC„ï;@!¡¡i€îbÒ5E_&^z8íÎõªD,Å‹\¡eð8QgrŒ†0ô¹ -tSå¢g€CÆuõ þ|Ρ +ò@“c$ûíó§çà½6í5sBë(¤ô òF -óõ^6–Ñò1W ¿Çÿ?çf¥NÚYVÖ "g›½F?ºv3²à¤©—NÉwh2n|c¹/ÑwÕÐÆï)y>|ÑäÐÀ1ð2%í|ŒiLè«ä@µÚò.”Áj÷N8Ðb£‹·¢²$%di@ -aŸÂTb`Z©ÝjV¨„æBØÅ&+  L@AIœÚqaAk‘ÂVë°}€O”Éúk']Û Šìù6ágׂ何Ñùº@ôÜ,›Ç[áƒ_8äùmo/œ§*²–n\P»«÷š»TQpËAð»`TB×UÚ ;ßžf Vh_É“ªÃQ×b; -ï~f\xJc>hTdO#&Ÿvlد˜t )›S…éÈåñTPsÜ‘@<â\*°™…ž0 …©2ÚÚ𑞪>Ï›€fò8r -oz²ÖÓ0]A[Ç"P̉Q×l ¹~R9Þë„@ÀL^ CïnÖû­°!I"ô‚ä¾€oQ9òo È-gœŽI˜ -œé°æ‘Ó6ú8]é쯂tä=Ÿº˜Ðu ÀŠ+U½+0rLñ×Lïlë/võÔ8P€D‘Ü8ó¤#·Äõ!™¼y¶ßx‚ºDָ扶0Fm#@Æl–b~5õás¸0“Š[~N K„óWhUc -lº¸Aá‘‚ ä‡S¹È¡Ï¡Mi3Á:Óaìs£]³•àÁ`pøÎ$Ñ;p 0Æmô<¾Þý6êÈÁ÷²§céÙ« ·ÔÄV¿¢ÎQ.jÄó<Ç«‹UÚ¥‘+3Ë @V\Ö¬¸rïQý9ä*Áëx×ÑÈÑ2+¤kyŒø¬ó¶ßo?jVð ¾M¿ÏŠ5âdºå#GÅ(!f1ŒÎê":^š§Ÿú¹5Àë3“Ãt6ÉPµyõsy ß(K:kÚå~yÞã¥Ùiê÷67_ŽÇfÇΊّ>Dao02ß–/á&ô™ÍÂã -­‹°©!9Uá‘$Ài­<øµßÍ6¾éŨˆxÛÁ¬¹ÿ¤˜dç Šê~.HãcëÍç·Wݛ٠-¿Ô®´ºXáW–ß®?º¦¯Áÿ€åÒo>Ƕ{Ôqô³þÀÙåô#ï÷Ùº\]MVs>/XObject<<>>>>>>endobj -1661 0 obj<>stream +#`™+cµ]nösÌV®¸¾é <1äÓgÐS»ŸÁb=­ñð²Kö9…’.v@ÄþCº%iŒ+šËJ½Ï©ÕHå +tjbê¢M€ "OBrÚ7£ý€>Ǿô3>ÿ‡28ïFíîôúÌãëÙÑŸGÿY¡,endstream +endobj +1657 0 obj<>/XObject<<>>>>/Annots 1048 0 R>>endobj +1658 0 obj<>stream +x­WßoÛ6~÷_qÈËRÀ¡,ùG’Á´Éš¢I³Øk0,Ã@K´­V"5QŠë—ýíûŽ¤bÇEÑ=¬iU[$ï¾ûî»ãåï^LüÄtœÐpBiÙˆÞI¡‹èŸB©vR—R‹USìÏki@W®±PÊ&7šðwFƒ·¶‘EARgäãÌ-¥.Aך$鶱+U}RYÞx"òBÑã#à}º¼‡ ÷²6¦Ùó›å5Òaê ™…Ûãh™c#U²nr‡…=Ë,sëE®•}íÓ1 Ó.#Áª8¤½?Éà̪¦­„úª:ÏŸß½„­Z5ë/VØýO»Ÿ²¬ÛûBࡹ¡Š6PIÇ"«¤#ï¼°¦O™Ñ?5YÎAZ´™Êèö2 –³:‚zæ*•L>èûóv¹Üš6¶ç·vˆƒŽ ÝÛé® ÖmÕ•føî”UµóÈØ$âðMý%ÒYn#XÉLxª·õw4Œ=×®ð†‚Î!Pà)5ÒÈѶÊÒz¥´¯³ÇC^D$âz|ÅA ¤Õ’ì€Ò<;ß«¸6É„fÊ»½œÑ§ëË”ï3ƒW¬=ÖÌ]£Ø|Åн²¦­SEµY[UôI_Ý„¯ ,Kjé*g+V)¨®hrîÞ;d(« +Ô9BÑȘ°o´°pŠ4ºØ²ýÍâä³ÅV‡ÌìN@}Gµl ¶ +s€A“E춻«lhW2mZÔçæåþ üyëGŠÚ'wªá¾ÃWÁÖ8ß+\%òIæ…/ç~ö° +ZÝ/–€´Ïת3ɽ†3Ž)îõ6/+@ã–Ÿe܈öBïZÓŒeP´à6¶^åè¹»†÷"Ç„Å–^p¶m™/yÚ=†É·-îÚ‡\ƒRÖcí:ð²FËw³Êîˆ|4`Œæ–Å‚~ÃäÀ—*{öæ.º¾CW’éßÍŸÇÕ—š„o?ãòaú]Ïs*å^FÜËv‘2«iˆï$P<Áo'Cšàxz~sqŽ{ÛðÍCoMÚ–˜—ÝDÊè0œûGÇŒ~.ÀÿgøÇx¾?îø—£q‚$ÀQ<3€ËYï×Þ¿‘Wÿendstream +endobj +1659 0 obj<>/XObject<<>>>>/Annots 1051 0 R>>endobj +1660 0 obj<>stream +xW]OÛH}çW\õ¥¬DòA•ö’P¡BÈ&.éJH«‰=v¦Ø¯gL’¿çŽí@-V+­ª‚í™û}î¹—¿OztŽ=ºìÓ`DAzrîÓÅÕ%~Çü³ÿ…¤È ‡#¯ÿÑÁ`8þðʽóúÇòëIò—Ô¼!¥Ô?ï{Wõ[B+g¡?à¬eúÆ?éÞ©×#?‚·£ñ%ù¡Ó|N~pêo%IQ$ò'‹îÝ‚ŒÁ‹¡­)ÑÖŽhSÆÆûÍÿyrN>›÷ÃÓÚèÈâ¦A‰F†$2RYPÈTfV$Tæq!BIV“ÝJU4Fýβô´ŸRX¨WYØ“DXil£Ž¨ÛÈÚro€,Ár¤Ë,$Õ#›“QV’°„g/móž!†:CxEÝ\:7ÓÝ©,Ô;ÓÍËM¢‚® r•wwÑÎúžÜKç ê¦LË4Ü)óú<»‡5• ²­ÄM»…õPš Piø#å…Þ$2åœíøV¤ö2ôh.wNÖpª’éYßÍW“oÞôþþ¬eÒŸÝÏg¾7û1;£µ»4Îèi~ã{îi½BáªGy=™-ëËZù×õ‹È–^È7Ç®´ÝÛ+ꡲŒ‘ΠW¹ß÷t¦(/2ì廤ö\DV” cvº)ØŠ,v…zµNŸ±vºŽÖ1…y(GiôSoh§ìö¨å¿ƒfÔÕeKEx­tRz8Þâ¢KˆÁ2g¸ÌÔž6zOºz_LZ1ò%#"F”ݪ,f†euUL|ç]\€ ©B¡*d`uq¨à¹˜à$IÈÊ»b£KK™¶-ËŠ3] s†& +XØh„KK¸'eÏH$‰†Å˜ºd×Ð;uˆ Ò$¹Ýw‘»êì3°Ç †ÀXC*ïré²Ï ™nÐfhÐJScT'áQýÉW‰î­´Z>B‡ +‚ ­àt&Û¾<9S.F«ÑýàgÀG+ÎÁÏÊ9H±HtÌuü<šè,Rq 0õ¦à äýü¾kQ$n„”‚XP¦hÀ(æ–¯ù°„ʼÐó©û5~þ)A±¾]ÓÀ‘º#-@4e`LhC<ö·Éjöcq=ŸÒõ—ççëéÃÝ|rû½üMð]?}\¯~9™1 "-aE¥ ÞPþª„óâÓ1ˆ´U“‘‰XŸèØå=ȬdÈ"è&d² + €ÛB'´Õ;—K!PÑ€ ©$*@b-[‹¦ë'"pm%m༮\[Wu¸¨gÎ)”…²ú¡WTÇÿF7C”£c¥**gÿèU%ú6͆©øÜ9±ÖÅK\è27àj0~e5#7~o$r +jU“råÜ|—=éÑwf–£ÑÇëí@fÃÙnuoáûV/®P&Ý`eÑóé0¤2ØL…U¨¨ÎÚjlQ‚&L~ò”½3¹ Tt 0c!pD{>‘n¸‚îµÅ%I€,°è•·fGW¤?<’>j°®Súùê¢ûùjü«K¼\z#G4Ì^ÈÕ=Îhµì»ã‘WøaE¥½×úÅM'Ã*\Pˆès÷³Ú&í¾fZ<¹Ùk¬Î«j¥Ž Ûü:ez‹9Å +Xkö Ü `,¥]KðGp î4Nñìn¼€ë¼x(à-A«"…}Ù2DdX未wàrÍ/‚@׫™´XÜ^0ÝU¼Ýèb«a”éúª]¿{;® ¼7Âß2ãþtèU=¿º~¸¹&Ì¡ŸÜfS”nÝçn`«F sy~Åðúkäp4öFýžƒëù'œüm +Yendstream +endobj +1661 0 obj<>/XObject<<>>>>/Annots 1054 0 R>>endobj +1662 0 obj<>stream +xVMSãF½ûWtqYSedYزÙ*/ UÙ…]»*‡8‡±4F³Œf!¿>o>d@–à²%u÷ô{¯ßÌ_ƒ ÅxMhžÐiJY9ˆ£˜ÒÅY4¥ébŽÿ¼kN{{>¾ý2˜&“(¥Ùt-¨¤é|ŽoÿKÒÚ%JN<ÑKt±Œ¯Îh2§ÍµÓt†¸MîrǴɆIÍ"ú]¨\?JbÔ]óúAdœnYvOÉñæ;RLi2ñ)N’9Êlòá¦àX+ÃÛð^3IL)ýÄTÆ =Š¦èe½M"ºQœôž ‘¤•|"VUœÕ(¸¢ÖuGŒÖ¬Ü1[8¦“Éi”Ør«â55š +m<ŠU­÷B¢®¾ná6¡L +®CB!cw7×%*¢M! 1cÚÒF¬ñ5É^í.y¹C-,»)8ù#Úµû%ì$/Ñ°”$Å=GO:ËښĞDc*ÝD!g’‚k4s­H×¹o'4vèÅ´4ûV"ÕÏÛhHOº Ðíêr{<úOËàì{^g×!©†X&É´U¥ë†Î±lÿHGýXžóÜ.Éa'SXþ=…'LNµf¥]L×SD×=`áኊz8#P¹èŽ+/Æ“âL—•…ÄvØæwÜ5ìÚ˜CÏ% +åi;\ú‹+®ϷǽÊLå”Õœ5œÊV6¢B¦LWÝ€u¨åÂÜ#ÑêæóòúKdՇ霌èõ…dD¼É¢(ÚG˜#,h˜reZí·ÃÙ¥K¦¨bw€S×Tj€™ó† ‰Ê À¥«Fh(v)¶íÚœ+ÿœÁ>y«YÉhî‘[®dV`Œî¤Þ1Ùƒäùi@]sə嶪– ݀®ì+DvÒÞXmh)õ£e 0‚ªurðªùèÓYç+S?þþôýÙ--vÖ5ìîw߃՜Әÿm…;Qïut3°zNqÇïä¢æY£ë'*CÌüݘ7FÊšÚ½@„¹÷ÅçaIg¼ „(ĪƩd×:¬;iX¿Kîiý<;èa¬‚9{O3ÀÙzÖT ë5•VÆÙZ(õbCüÚòúi¸\=SÙÔLlïàÌ;8sÈ6† ì,–—¿õ56ÉðDû¼P™l¡¡×8™úI~É]aC£Kh¨ÖÒ=¾J_œ*ÂÎøåfó‰>úýÙŠ:×`ÞmqnS}qL€¿ìpl±v¦|êÖnùÎ;yp)w\°ƒ²r{¿;9Gëøj0IqüZœÒç#7cN’t[ëï˜zDf8(@ýÖŠm»']ÀÉ<†åÿï5MQ:KpCÄätn3}Ú ¾þ>׃endstream +endobj +1663 0 obj<>/XObject<<>>>>/Annots 1063 0 R>>endobj +1664 0 obj<>stream +x}W]Û6|÷¯X(z.ò·Ï h›¦I ô¡M òBK+‹9JTIê|þ÷%%ŸO¹ÉÙú —³³³CúßÉœfø7§›-7”דY6ÓóÇÇ“Åò6ÛÒf¾ÎTÓr±É–ý¡O“õ*[Ñf¶Èfx9ßndh¼“—ÛÛlM«Ù*½¼Ýbfº“—X„–·+D]mop-!S9™Ï—ò +QVs}ƒién˜¶XˈѴ·»Éôý--f´+‘ÓæfK»"¦‚'ùÕ¯•j;Z,3úÈ­uA7zÛüËÝ×8s~“f¾Z +¨]q…¡óŒþh‚³E—m›4tEóy?tq“mdè®bâZiCª({O¥u´ïHIÖJ÷>¨½a<2¬<{Òž¼ª÷êçø™YwÈÑ“9Ê´•:O3z†"B_ÙÎt°l +õ*p^5:Wæ"h? ¥[ Ø¿âòÔSð k|X,¢ +<ªRæž‘ÓÉvä»}­©‹Œ2úÅx{Mm +æ™I—„A•ò”Wª9páÈi»@=äMzdªÕ #Ó$)Š`z¤NžÔHJ5Úפy+p9{>/\TX ^wy%ß’C®ùvžM)ÙVlZ +Nåw|l†U3ú$%‘Ú žMÀŸ$rBò 6p1ªÂÁÙ®%[RËtб²toM׆àÆ'ð^“¿ÓÆxRMA\‚Ýà3úG‘³¾‡ö•£Z8OJÚÛ.£¹ OÈ`´rk½×{p?²Ã6æZ)DS)ýJ*Às”–†G +Å~ÒÅ:3uH/ +¾gc[v£%K§1Èœ^\”H2 ™crŒŒã +½³ÔXèÈûNj(³ú•‘‰$š +êÈenë6k 6·Æg¾ÞSÃGßÓ™L‰BŒŽóDÁòvÔ¶hç>ÓηœGnC”a!4g-…c~{T@HSêCç”xÀy 6RL€ÎÅ[¤ …A©™„’²¤¸äØx…š+ü}¹A–„|¾¼¤õ ~le¨eç Ûç„ûö‰Ö2èÅsÿ= Cc{-½oÉX{‡x¶;T‘rQbž²ª\^AþÂÖÒO +Fˆ/ÏáxÐ!äûh”zJûÈ{jÕ¶‡«Ú×ÓéÙ÷ÒÕ4b¿ôâèYðâEF¸a§ 馌üNß?ãÅo“o%ÏŠ.é[hFË‹ôuVí!™±sÖ¡'ÿZtò ptˆ†˜<Üîïµ…Êk¤,ÙŒrµ lLì§x‡¥~D;ÖÚ:‚¡ˆ‰Áj¡\1×7ö¡U®–²ÈõSˆbȲ¥äÖ¡F0Á¬éa\ãߥï±^ +XÁ—úºZëµÿ‰vbðøÏîDº–ÝI5ßtjß&ºÉMW0 +çBôŽ3h²P%Œ^-jÄË}‘ Õ —`™Òq?¨\4s”Þ¤°-qXXá%I‰r#*ÍH%þyH^a×í H~WG8¼cÁlÄâúíÿ‰+#eOSÍ) iaw‰Ù$eï~+ÁV*4…¸(:4£­c¿9.;/ãÎ +ŽºB— m#déG剣EãA—ÇÍ2VŽPvFÒA´â‚´ÁËT ó”êõÛ1-£èæ3ÂùáˆiÏ,=D̥ŃÖi”?õ{J +|sˆÛVÁØ.Í5( 9‰c!W›ö¡Bû;ò­Ê¿Ù·wb›©¾Åcad¶›¾_÷ç­«‹lÞ¤WCÙ®ÎÝšžãLhWØ42i»ÑðŒ>_Úa©“k'B¥> )ALS\œaz¤%¿vhVÛÈ® £Ä·ÈóŽ¹Eô¨Q’{0† ã2BâPR>/XObject<<>>>>>>endobj +1666 0 obj<>stream +x•WMo7½ûWLu©IJ¾,ÛzpP0Ф©£à w—»b´Kª$ײþ}ß w-wmŠ @Â%93oÞ›Gýs2£)þÌèbN‹åÍÉt2¥óËÅä’–—ø÷½¦R>̳Éò­³ùÕÛ'–oø´>9»]ÒlFëÁW—´.§SZçãFåcõäÃúÇÉ”Nç+„\ãõF/Ý"_9:M6É-Ór㘴þÏû½T»Šjý¨kúu¸ß +ëì¡qm ½‰Šˆöæ5…ÎÚê{âFEÚ¨@™Ö–Ú  2–\]hÏ!QÌl1™s1Úãl WÒ7ÕdŠ”Åf>ilÀ£•ÎS¦òí^ù"P&3µ‰>Ú@¥©u"v¸Œÿãª[ÍY›{­8ÿƒkH]#¥Üù‚SYSš\ÙXúœtY D/‹¤ìlŸ\À-*k\ˆ/v»ö²7HØFȺHV#ÄÕ1òSm´GeÊÒbB_´òÈC!E4a9Ó=Pãs‘Ôûþ"d:›~Ä©Èv^ï”ï Wô÷Íýwª•¯4=ººm4ÃÍ*TTRËÙíÍÀ\¦ðéb™H:_L–º³Q{«jÒÞ;þK7¦ôÅdÅ,¸+¥ÐJ#IÝ}Yßܹþnîïÿ¸Q£CPˆ +¡ ^¢KŸÉD|T`.ñ§R(½µúi§óˆB¸Qª¿ß€)ä[k%2Üîw™ÊE \5ུJÕÖ|+`¬¥W¹öLLìLñcÎ ¦Æ­¥}ƒ¸õˆ!Â÷ _€Ð€ÔCw!ꆂ+#/=|èÎõªD,Å‹\¡¥w8Ñd²Œ†0ô¹ +tSå¢k€CÆuõ þ|ΡŒZä&‡8HöÛçOÏÀ{mÓ5sBë(¤t òF +óõ^¶5£!äc®nÿ!έ–:iW³²!¸º-Ðkô£k7# N:{éô˜|‡&ÃƵ5÷%¸®Ú¸=EÇg¼+Ú8þH¦¤ Á }•¨Q[Þ…2XíÎ +6ºx+*KRB–¤ö)L%ö¦•Úí F`…@hþ „Qh³ÂÊè”Ä©ö´)lµÞ Ûø™‘¬¿4éR$(²çÛ„Ÿ] ¢sµŒÎתè ãf1Ø<Þ +'üÂ!Ïn{Ãxá‡AW:ûKBŽ¼çS纎 ¸Sq¥ªwf@Ž)þšémýÅ®[ Šà0’[kžtà–X°ÞG“·0Ïô'¨TÛ>Ñƨë1„¥˜_m³Cøã.ÌĨ–ŸSÃáüZÕšÓ@7(RüðAD.rèßshS@ÚL°Îtû\Æh×l%x0¾3ÉAô(Œq=φ¯w¿:rð½ìéXzö*È-¶!éWÔ9ÊEx¾‚çxu±J»4r`a9!HÀJÁe­6Wî=ª¿3‡\Exï:9ZV é1Ÿužúýö£fÏàÛôû¬X#N¦ñ ëQ>rTŒbÃè¬. ã¥yú©Ÿ{A¼¾139Lg“ UÊ«ŸËcøFYÒi›–ûA<æy—f§©wÞÛÜ|9Ú;+fGüHù½ÁÈ|7Z¾„›Ðg6O[ŒË'aSCrªÂ# H€Ó0Zyðk¿›m|Ó‹Qð¶ƒYsÿkb’Ipœ7(ªû¹ CŽÉ›Ïn/»7³~©].hu¾Â¯0<,¿]þtM_½ûË¥ß\Žl÷¨ãè§ýÓ‹éï÷Ùº\]NVçs>/XObject<<>>>>>>endobj +1668 0 obj<>stream x•VÛnÜ6}÷W ö¥.h¯õ ÈÃÚ^' Ø»®%7 Š>p%Êb-‰ -Iy³ß3¤”:ªûPlq8—3gÎðëÑ”&ø™ÒéŒæ'”VG“hB‹óóèŒg§ø{†_#)÷ÓÓI4{ë`~ ¿_&Gã›sšM(ÉãäôŒ’Œà‚/éñU!' ÍN"ºVâ©ÖVÕOtЭ!+ª +Í‹4?'y?ÓÓàçý|’짭kgtÖ¦Né:˜.h:íLg§H ¦I¡,媔”êÚ U[T*ëHçä¤u–ãR*jj¤Éµ©Èiz¥Ê„“!§øUNëH”VãrY†ËûB8r…„ßgY8— ½ŸÎC²©h­ôÑ`ѽ+eEHJå¤åBÁ‹¨¤ëÞ -æÖÉÆ"–·i„µFeÉQpòÆß5»€/v+våöÚ<ËA -¹ªeÔ}v æ ª¶…nËŒ2MËÛ[_÷üŽTíÿÓ&C›`µ¯#ú,©/n”̤T™·%¢¦…ÖœVÊ€L äL—¤®ÿÑŠFìT©œBahµÊÙiV -SªÞÃ0o@ ³²Î^AÖñ¦šL%n0£J’¿àðÀ_G+ÓÒÖ?9Ô™÷æ «5Ú¡ËRï¹>ðf€"cÃH§2k1~ŸJ@‘¯ïйÖ4FY¸À™éàvƒæFf¾Ž×¤ö Acf-­m«†)íÃoÞàôºö\`ƒR  J[…СY‚^“°—%Ž/×ãÕÃo«€ û«þdyu»^mÚiW ÊGs˜]OF· %«8ùø°}¼¶' $ï0BÝVUªÈ‚Snë¡AÓ‘}Š.×Î]¬=¥ýŒ½®ç¹Ö{_p-*?)h¯xA{A|À^€L º­væ=ÇÑ^an‚#ßÕÞÔv5ʹªEô¥‘e ÿ±»ÈCN»á„IÅ-¬ñÿiêc_°ãñÍ„Î{IZ„Éûþì£N ·˜F¨SU ú€~V6¼lYZ6Â0ÃËðÈHÁC‰ü@ù‚$~ZÅ+ßÁ˜–qüx·"P!^o74x lèv™€ÛJ>­(^Þ].)~\'«ˆâ-쯶wwËÍuÜ'ÐI]üiûyC×ëkÚlZý¾ŽZohµ|«ú(ý­^‰îK) ¦ÎŸõ…‘•Æ€7•´V<4÷Dë{òÔ3Òê²õYÂiª 2r¸o¥£¶‰H>]ÐI aƒ bŽ¥KÇÞË‹giØOV.ÜG +°+e…PËo¶áÄ,± ÚAaÄRä%ízw»”DšE?†Ã*šÐ€Wå2ô(ǯp…‘TÑó {äšó#­hÌ~Rž:)Wš)î ÆıÆ*-ð©{ô9ùZß‘iÃEZ^!o$ßïîž`ê?Ï[î/¶x j'ZüRÉÕSk„瘼¦\àðõíä«ötßߨ5ÖQ©Slc^­^IXÂ#éØÓп·~„瘶æMûÖš1û+ÇþÖ¸T»póìŸw×â<ˆÜÿyã-Nð†üe†ö¡'Óù9;]%G¿ý ú)VÜendstream -endobj -1662 0 obj<>/XObject<<>>>>>>endobj -1663 0 obj<>stream -x½W[OÛH~çWùeA"! 4ÐJ}JWH,Ë–h¥J¼Œí1™bϤ36‰ÿý~çŒ ‰a·o[{nç»ÉϽ)Mð5¥ÓÏ)«ö&ã }˜Lñóäì?gøöšŠ½‹ÅÞÑ×4=¡E)ó3ü’†O&´Èögóññx6¦…5Í?0ú„¦Ó8z4;Åèýo¥z©)sU¥lNÉÊØGº¸þýþêÛßWß*¼«dÄÝ%½8¿¼¹¾º]l½n¬ÙPê6cº.¨u åÎþVÓ£®yç ¦8 ï¨èY•&G aålм¸åž—wG×w\Q¯J4¬«q6ïuV—-jU–:w‹¢F.zÿÖÕ¼ªeëµ)K²ZçT; _“¢$wV¨fU'´66wkr±x”†Ppõõ»zP V©têQSP-•,ÀåC®±yBÎS0•)•ßªëËíýkQq¤ëìˆg*LÙ×9Àéµê ëf\kdåB0)&u'ªJê©—®©‰wÒ¶öFciìÄÔퟵò²Òàí!¥zM*„¦ÒYƒÝ—ê™E!À¿YÑëJ@,ê -Þ‚I„ȹs³Ä(¯UÔëe+Se—@L™’+2¢O%þ–±-Œ×k°ýݘ¾CW;äz]ª ap|ß”@•`ÍD–×Î?A µÁQðègƒ#ã÷CZi¿T«@iKØÎA¤² LGõ«®ŒÐ¤Ë=ìccޘϛCùšžôͪX«¼bå=zUxô¶oGÇÓ(b1ìqgØã8ì׆ Ui¥ÑͶq;m¿ú’Á PI™³+¡åÒ@»`P=ƒ Åš -KØnXNª²§!³;žÐÞCj½32gk¨ƒAõAŒl” •Ó -Š ° Þˆç–[·$‚Ó±Huâ`+† ‘§ä0ú/P®m+ÞKb¶4Ð|HP ˆÕ.ÀiŒ³‡ìQyòÈ -`¦a]ñûXÓåRgOƒ½×]¾xz3³ R$»`¥|•ˆÛj]­œWÞ Ø=8‹EÄ`>Ã]®A Wdµ“¾·F„pƒæ¾ø¤5‚Ñ)BœÒAB|Š@zƒ¼Ù|ûPd›*M.v°ØS×K“-¥Jb§Dn9Tr FâÂ]] ÒqÖŠ¯ -LäìŠA(Œ(W"&¸p¤:#¶XÀÔ·¦»ˆe×í?ñzG_'ô±¿ÞĦBÝ¿xÝà ¤Ït~sÓï?Ÿñjw˜dÆm6›ñÖ÷QÛþ˴לj*' -@æ}¦ï±™ìÞ;ç¼ßuìÉ*E*"mb¢+›it´bþP©×\àÀ©9€¢e Èe@5µ«Ð×3»¥Ú+Jv3Ú?`íOÜ]?KçVÜÑHåjÅàÿqh:Ãå_S°…[£ð ý}ŚϖÊâæ™b¢Ù8ÿîr¼Èñö•@°üâèöÏÂKGÉ{d$h¾ßqcƒÀ•¢ßµ K†ªŸÓ·ê®êˆ Ù”¦n%1:¿½\C¤}t—ïîÓqF Ü fJ-²‡Û+iMxÄã@~ÞølHÝkr†12äwþO’¿¬8ׅɘYÛÔ÷Htü(ö­Å)œ(Y=²0ôµàœ}849úzÖ}̚Ρ©³cšŸ~Œ~îÏÿ¸8§;ï~ ®è‹ËpGô1 ñ¨Ÿ0:ÀÈù;ŸáNægãù‡>ïáõôdÂÓ®{íýw]¢Îendstream -endobj -1664 0 obj<>/XObject<<>>>>>>endobj -1665 0 obj<>stream +Iy³ß3¤”:ªûPlq8—3gÎðëÑ”&ø™ÒéŒæ'”VG“hB‹óóèŒg§ø{†_#)÷ÓÓI4{ë`~ ¿_&Gã›sšM(ÉãäôŒ’Œà‚/éñU!' Í]+ñTk«ê':èÖÕN•æEšŸ“¿¼Ÿéiðó~¾@IvŒ‹ÓˆÖµ3:kS§tL4v¦³S¤Ó¤P–rUJJu턪- *•u¤srÒ:Ëq)55ÒäÚTä4½ˆReÂÉSü*'„u$J«q¹,Ãå}!¹BÂï³,œË„ÞOç!ÙT´Vúh°hŒÞ•²"$¥rRŽr¡àEÔÒuosëdcËÛ4ÂZ £²ä(8 yãïš]À»»ò@{mžå …\Õ2ê¾ÍN¢óUÛB·eF™¦åí­¯À{~Gªöÿi“¡M°Ú×}–Tˆ7Jf R*ŒÌÛQÓBkN«@e@¦r¦KR×ÿ„áHE#vªTN¡0´Zåì´ +…)Uïa˜7 á†YYg¯ ëxSM¦7˜Q%É_pxà¯#€•ii럜j‹Ì{ó…ÕíÐe©÷\x3@‘±a¤S™µ˜ ¿O% È×wè\k£,\àÌt p»As#3_ÇkRû†€Ô³ˆ–Ö¶UÔöáÇ7opz]{.0A©@†À¥­BèÐ,A¯É ØËÇ—ëñêá·Õƒ@ÐýU²¼º]¯6 í´+å£9Ì®'£Û†’Uœ||Ø>ÞÛ“’w¡n«*U +d Á)·õРéÈ>E—kg‡.ÖžÒ~Æ^×ó\ë½/¸•Ÿ´W¼ ½ >`/ÀF&GÝV»óžc‚h¯07Á‘ïjoj»šeŽ\ÕŒ"úÒ‰‚È2†ÿØ]ä!§Ýp¤âÖøÿ4õ±/ØñøfBç½$-ÂäýöQ'[L#Ô©ª}@?«Fa^¶, -á +˜áexd¤à¡ÀD~ ƒ|ƒ@A?­â•ï`LË8~¼[¨¯·šG¼¶t»LÀŽí %ŸV/ï.—?®“UDñöWÛ»»åæ:îè¤.þ´ý¼¡ëõ5m¶ ­~_Ç ­7´Z>€U}”þV¯D÷¥„FSçÈÏúÂÈJcÀ›JZ+ž@7#S©^¤GÖÍLp +ð0ûŽ59pÁïVÉD‹)·u=«3`ÆÎ;EÌ•Á¬§…LŸ¿{¢õ=yêiuÙú,á4Õ9Ü·ÒQÛD$Ÿ.èN€$‚°A1ÇÒ¥cïåų4ì§F+ Ø‚ƲÎB¨å7HÛpb–ØGí Œ0b)ò’v½‰»]J"M¢ÃaMhÀ«rz”ã€W¸ÂHªèy²G9m‰ô1£ K:ùiXk Sw;VÏ=zÌ›£–eÑb@AèËX#°~{¿#Ž÷_J9‡S^Þßm ¡üÔx?Ÿ„½5ó#­hÌ~Rž:)Wš)î ÆıÆ*-ð©{ô9ùZß‘iÃEZ^!o$ßïîž`ê?Ï[î/¶x j'ZüRÉÕSk„瘼¦\àðõíä«ötßߨ5ÖQ©Slc^­^IXÂ#éØÓп·~„瘶æMûÖš1û+ÇþÖ¸T»póìŸw×â<ˆÜÿyã-Nð†üe†ö¡'ÓÅ„®’£_þ»ØVÈendstream +endobj +1669 0 obj<>/XObject<<>>>>>>endobj +1670 0 obj<>stream +x½W[OÛH~çWùeA"& h¥>¥+$–eK´R%^Æö˜L±gÒ›Äÿ~¿sƆ`ØíÛAÁžÛùngòsgFS|ÍèdN‡Ç”×;ÓtJ¦3ü<:=ÁÏ9¾½¦rç|±sðõ#ÍŽhQbÊñ)~)çSZä»ó£ô0§´Ð¡¡ùÞâFÑlGOæ'½û­µÔ,5å®®•-(Yû@çW¿ß]~ûûò[B¥wµŒ¸½ —g×W—7‹­×­5ÊÜ&¥«’:×Ráìo =è†wžÒd†ÃðŽŠžTe +”VÎÍ‹[žáiqq{puKÁ•ÍZ¡DȺgó^çMÕ‘±¡QU¥‹´_t~œrÑ»7®á…T#[¯MU‘Õº Æfø†%… ´B5«&¡µ±…[“‹Å£4 ô€‚«¯Ý׃J°J­CPš‚ê¨dé.²t­-rž‚©M¥üV]_nî^ŠÂˆÝä<3Piª¡ÎN/UÝ´+àÚ0 +‚É0©?qPu¦PO³tmC¼“¶7Kc'¦6hÿ¤½—Wo÷)ÃÐ+R!´µîÉí¾TO, +þÍŠ^× +bQWòL"DÆȘ%Fy­ ^/;˜jó°bÊT\‘½x(ñ7x°Œmi¼^ƒígèRú]½"×ëJmø£ãû¶€¨k&²¼vþbh Ž‚G?[¿ïÓJû¥ZÊ:ÂvÚx •ç`:ª_õe„6³Xî~ \ÛòÆ|þ0ÚÊ×ôd” oVåZ5+ïÁ«:½ßãÑÛ¾΢ˆÅ°‡½aã°_6ÔY¤•&×ÛÆíµýâK/@%UÁ®„–+í‚Aõ&k*,a»q9™ÊÇ̾ò„öRœ‘;Û@ ¢¨bd£œ«‚VPX€MðF<Ï°dغ#œ†ŒEª ¨ß[1\ˆ<%ûÑ +m;ñ^³¥…æC‚A¨–pN)ÎVî³GåÉ+€™†uÅ[ìcY ¥‹¥ÎG{¯û|ñôff¤HvÁJù:·5º^9¯¼Ay°Œƒ£”í†3‹ÔF%  Ù´q_Îû¦Â7¶{EN‚š-Ò“Uïu‰¥ÿëìšê¬’¢VDZ¦/>‡ús“a_Î ¸›B@~‡`]˜†™AŒ©7P\uﯯÀ3 +ȉ-åLJ\· µŽýu/c¹>œ,3.LB@È;46®Åú×Ww‹Ëîè =ÌÓD%ÿ)ü$ #"°’&iŒ¯È[`ÙÛÏϪR5 +A/ ”ÀžèqüVAœiZkKD¼-*¨^ö2h%ÏVÊt®À³»ØjÍÐäÅЩªu£H—ÿâ 5ô¯ÑÆ¥Bç•=*]K¿‘j`ôÆà…tÙvÅq£)UÁõ„‰ÙØz†C1s¿;˜ñ~OÚTè’ ²øh÷dä,ƒùw¹€^‘7NúÞ šûâ£ÖvF§ru\p* ñ)é pLðBfóíC‘më,6¹ØÁbO]/M¾”*‰¹åP)4‚‰_ë‘Ž³Ö|U` + gWŽ +D1` D¹ +1Á „#Õá±Å¦¡5 ØE,ûnÿ‰×;ø:¥Ãõî(6êÿÅë%}¦³ëëaÿizʨ×Ã$›0n³Ù¤[ß]÷/Ó2\pz¨©Thœ(™÷™¾ÇfòúÞyÌû]Åž¬2¤â>Ò&&º²¹F'@+Öèµ*pÍœš#H!ZÖ€\TÛ¸}=DZ;j¼²¡b7£ýÖáÄýõ³rnÅT¡VP þ/‡fs\®ñ5[¸5 +ÒßÙW¬ù|©,n~‘)&šóá.Ç‹o_ Ë/Žnþ\ ¼äp”¼GF‚æÛû÷06\)ú]›°d¨†éÑ8C«î«’MešN£÷Ûó5DÚGùî¯Q0gÂÍ€`¦Ô"{¸ ¹ª•Ö„Gü8äç­ÏÇÔ½$gH‘!7¸ó’øeÅ….MŽÀÌ»¾x¤n¼G¢ãG±o-þKáDÁÈè‘¥Ù ¯çìýž¤ÉÁ×ÓþcÖìš:=¤ã“ñÃÏÝÙçgtëÝÄ}q9.àˆ>†€!ž &'S¹xç3ÜÑñizüaŽÏ{x=;šñ´ËÅÎ_;ÿF½¢Éendstream +endobj +1671 0 obj<>/XObject<<>>>>>>endobj +1672 0 obj<>stream x…V]OãF}çWÜò[“/ô-°l…Ôݦ`Uª„„Æö8™eìIgƤüûž;3 Y/»hµû~œ{ι÷߃ ñoDçcšÌ¨l†ÙÎ.ÏñszÁ?Çøo%Õá‹ét–ßúb2eo}1;˦ýϯòƒÓOS(¯‘|vqNyEH<R^Ï[ãWÒRišÆ´TŠÎI25áCüâ7†¤µÆ:RŽVâYµKr¦‘~Å¿ m¥¨^ÈvmË#ÀÚXO£Éå ¹®\‘pt/šB|È¿ i0š £¼:~8Vò7rMQqÜíëµ5 ©Vújùá»—P«'IÕRy¡-„_mŒ}r]¯dùD/¦³1BVš¶¦ZiÙK]ÈÚbo_¸boÈy’C-¨VP%$8!åFKâÙ(ÔCÚxÆ¥¶óVxeÚ_Räñ ¨£©y[Ñ‹ô$¤kãœ*´L "-ÕBéÙ(¿¹ÏiÂíoV²e¼Xæ©î A*:åæ kDU -‡¸Ue¥s½~œô rÄUmi¬•¥Ïh¡¥ÀË€‹_ R >†½´µ(%Ý.h#ßÕ.Ùëg÷±ªÏ¨êg©SâPxHæÎ8p+Ô¤_ÈÈ*qKŦµYfmS„QeœàôÓ%(³u0Elñ$›f”K1½’z0fRßu1$s™ñ;D\mÌS·¦Á]Ýþ~s÷÷Í=>ÞÏ?_Í3úÇtäV¦Ó-=ˆ$¨yNL©^ß±3'í3„Sˆò)Ôj·L¸ ¯QeÚ£²%T¨¾ÀP-¨§µ¬~Ä^Ã@LÆ Öª½ópŸP)­0Øcí7¬þ„õâ3ãìÖC{§Ç@¤ølpAY…O8ÕvÇ9Z 2íBà5í²OT·m¶22¤†Qý,éY úøåžCµÄ«…c~+°½N’%ˆÂàU©¿3®Y×ì{€ß2„ŸŒ«¢ñO•3A½ro ÇÁ渑µ•ÏÊtøƒªèàÚ¯CÄŒ‡ØótÈ‘_«d-:¶þÛ›Xò£ŒæÔvMÛ3}‘¾PÆæ× º2Îï䶵ùäl˜ÆÚ´®Ð^·\Å¥ ±K†~=ïj­{i‘„«‹¯; ‰F5#,Vf€=EsÁÞc³“’™CVã”Wh Ò¿´8BANRƒ&–²¿Õ‚b„Á -[{ƒtÁ5¶Œ[r -AN5J ËЄï·cAOÁ‘“V£v¢à=À5ïLøبø¢ó¦%–èª\‰V¹^Ç>/XObject<<>>>>>>endobj -1667 0 obj<>stream -x}WïoÛ6ýž¿â `˜ Ôvì$Ž[tš®¬mÖd -ä -Q6‰TIÉŽÿû½;Q¶ì4KÀ±Èûñîݻӓ âwB—S:›QZžœŽNéì|:šÑùüŸ§øóšò“«»“ñÇW49§»Wfs|ÈÇOOé.Lg£³Ñåˆît¨éòÅÝwœ>§É¤==œ^âôàkc©^iJ]Y*›µ§.â©…r‘FÛšÆã«ë?n?|ýçÃ×ñݧ›Csƒ}s …•kŠŒíYZhª¼+«Zg”;OŠ*ÂÆùLÎòýSNÎFS#Þl‚–hº£ärù_¥©kÄNr/Ür »ÆÖNž7Ö<ÒÂ=ÒÆÔ«]çrr£p…O0ü„”uÎ9ï¬KÜ*“hø7½¬*õrUmÀj=j›uÁEè¨0VH/_? â‘ßñxa–Aûµö㺬àò»[ÙÌéÖ@¿V³×vðÙÕú5]×dU.³(˜£PéÔäÛCìTáì²Í›+ l=gB*  Eá6áùHQîƒØŽ"ßEúKЩ×õ³±©–Z€BÚÆÇÅŒu_j -1&àÛÛ$gWÇÌÙ_å¹EáÝ©ö°ö¼*uj à¯ó£ MMAm%Æ®Ua2²ºÿˆQHØ_K}®€A˜ j0² úÁ{ÖÅ–‚®› -Tã4<7Ä(u6Egh2© (·ó·PÙŽì=?…yа—*T"0~ôø°3ˆ¬ÔZ•¹Aú ÓàP<áïÎ:…m¨uyÿ‚MM™É(ð±2àBMU9_K"ßßqÜÃ~ç• éú!„¡ëÆɈø¾é‡æ)iqd&…~ln–WÒÀÍ؈šøÀmÈP6˜îuöwy**Í#9Uhü]ÓC‡„3 '¤­ÏÛ¶Lv§ -½ÖEÒµ%8¡he–«X—Ε¶®Y®HwauÏÎö‘uV -Rñ[" -(Æš37v9ŽèýJ§\u‘™Jù²s"¹Ÿï=tN9÷.¡].Ú¦~ÛêK¿^«ºÄÛOW¸%‡Äî^Ž:8¼h§ûÒI¢X|Æe ¶4š‘eé”7ŠY`«ãûAOÜ¥UsÔìÒuŠ!³­¢líï¬tQÑÛhñMk±µs’¿êQÑØPû&e:…ƒ¢EßTÁÝ# ×«¨ª”¹€1‘{­Ñáb¨ÐÍHqc¹b‘“´á~çäë'¡öb@žGJ§÷çìðlÒö¼ Øy°óÃk0ÙØ/­Èܼ¿¢r‘öÂ.È­ÞÐ=~vÃöÐl´S3î GO$$šcÜ -ÑøŠ’ÌaFÈNØF/ÇÁ٠̥](ÐYõ˜–T­•)„P#ÅâánÖOô±e;ðÝWZ‘ÓeÊЬP1S¬§V½E„qza­L'xrEÓI -K1k¶±KàÌY¡f/›&4-3XW3Zlò¯YîÈBßpՑØòÐÅvÀF]à9 Ym÷Œv.—Óq”‹8˜®œƒhí/C…Ÿzn1;5ᄱŠ`²9Ö\щžàv:Ñí!×7„@ÈiG‹nIPÌk’È -„œÙ¡ÊÖ -à I«±©â‹5¼y/õÛùÿ‰F·>1WžÖfmýþù–>ð†}@jí;?ȸ§½ýŒòC<åÊ…ìæ‘öLøQfT/?_@Ǥ?¬[RöFvà} Eäy]Uàv'¤»åQÛ Õ#^ð -WæáŸ0Å»§Z€|ØP,”Û×&mÐ/©Tè¦ë¬$š´y‚nÓÍž½zÝô¡Æš3Kî_D×ÝðzW÷’Í]Ãt—mI´2W)/MPM‘A¶Ãm:Jµ¼þÑ PIŽç:ŠÞ² *’¬xEq”¶ª±‡Tðáºû)ÜHìJ[¦äfeÒ•¨p\á¯ð’ÿ¿‘i¥JW²ICvÇXyä$%Ò­ðúê%R%6oû·cš1Ð ‡·Ýˆ±pt3õ„-i×lƒ¦‚`b£…"1ÚصYs¾”bÉaI‚šn±°*tìn‚qÕ£•£Q‡qŠs»¡—¤ØU1Ûíà1/L+_-ßX+ØãÆƃ¹Ø×^âå -”cdAÁX(j¿̾ÇçñÅo2ËæüŒf—s^ánß}ºzG7Þ}/èw—6%îöd,^ž¾’•ïÉ›çùl>š]L£ÚOÙ݇»“¿Nþð¾3endstream -endobj -1668 0 obj<>/XObject<<>>>>/Annots 1070 0 R>>endobj -1669 0 obj<>stream +‡¸Ue¥s½~œô rÄUmi¬•¥Ïh¡¥ÀË€‹_ R >†½´µ(%Ý.h#ßÕ.Ùëg÷±ªÏ¨êg©SâPxHæÎ8p+Ô¤_ÈÈ*qKŦµYfmS„QeœàôÓ%(³u0ElÇÓl’M3Ê%€˜ÆÇ^I=3©ïº’¹Ìø"®6æ©[ÓàŠ®n¿¿¹ûûæŽï矯æ‡ýc:r+Ó銖ÀžÇDÔ<'¦T¯ïØ™“öÂ)DùêFµ[&܆ר2íQÙ* Tß `¨ÔÓZV?b¯Ša &cPkUž0/¶#íÕÙ»¯*FB+çe(ßUë­LÏû•ÿÙ‚2Ñ +ÖÖ€¼¤‹¹)×ÌêTÍßÈÖ`À"4* ÎðÔZX° Xcº‰F€Œnë^Õ°“à0áQ¦-~Á]¼„öL+ü&¹Òª5C +:Cà^ÃߪåÊÓ^^îš ¾Ë; ;K ;ûÃbÄ];ñ©³d®Ç<åW¾Í¯ÿ¸½ù’ÓѯGßGK–ñû×nŸ^Œy¸O¨€”V˜ì±öVÂzq™ñ@v롽Óc R|6¸ ¬Â'œj »ã-™ö!ðÆšvÙ' ªÛ6[RèŒ~–ô¬}ürÏ¡ZâÕÂ1¿Ø^'ÉDaðª‡Ôß×,kö=ÀoÂOÆUÑø§ƒÊ™ ^‹ ¹·?ÐŽcˆ`sÜÈÚÊge:üÁFUtpíׇ!bÆCìy:äȯU²Æ [ÿíM,ùQFsj»¦€íÀ™¾H_(ãNóë]çwrÛÚ|r6LcmZ Wh¯[®âR†Xƒ%C¿žwµÖ½´HÂÕÅׄD£š+3Àž¢¹`ï±ÙII‡Ì!«qÊ+ 4PéßNZ ¡ '©ÁFKÙßjA±NÂ`…Ž­½Aºà[Æ-9… §¥…å hÂ÷Û± §àÈI«Q;Qðà‰w&|lT|ÑyÓÀKtU®D«\¯cÈ@¬pDœf"ÿ[K BAÀ[];$³æˆ÷f‚C%Þ6h fÛaj/ì…µZòeíÚ=¼R*lfƒÏ‹7À /Bálœiµºl#ÉVÍÓ‰d›Ø(­©•¼Ô±X’¾±lSõø÷I Ñ»@F%¿N¼c+Œ ûõF9²ÄB¼ªDø¾¢¸6q6öΩ]»õÎÚÄIøÒÑôp|'k¨ u§ûŒ/–>9ƒ?=|E~ºHö?šá‚¿˜Ðl2ÆuŽs$´°æ+2úhÊn·2y¦ƒí ƒóá%?ÿý3]d³³1!|=šŽùµ›ü௃ÿŽïendstream +endobj +1673 0 obj<>/XObject<<>>>>>>endobj +1674 0 obj<>stream +x}WmoÛ6þž_q0Ìj;~‰ã]¦k‡k›5Ù†ùBK”ÍF"UR²ã¿çHJ–f 8y/Ï=÷ÜéÇÙ„Îñ;¡Ë)Í”–gç£sšÍ§£Í——ø<ÅŸ•”Ÿ]Ý?¾¢Éœîr\Y,ñ!#??§»t0f£ËÝIWÓå‹»ï8=§É$œN/qzðµÑTo$¥¦,…Ω‹xj@®\¥…’º¦ñøêúÛ_ÿùðu|÷éæØÜ`DßLCncš"c{šV’*kʪ–åÆ’ J8·36ógùþ9 '³Ñ”È7'}4íQ2¹ÿ_¤©iÄNr/Ìz »J×Æ?o´z¤•y¤ª7#ºÎýÉÀ>ÁðÚ 8{â¼µîã™O€†ÓÛø@‹R¾!SÕʬàQê¬ .BG…ÒrDrýúYOüŽÇ+µvÒn¥×e—ßÍFgFýZ-F\ÛÁgSË×t]“rTçÔª`†\%S•ï±…Ñë7WØZ΄„CAŠÂìÜó‘¢ÜG±DÞEú‹“©•õ³Ñ©ôµ…¤=Ž‹ë¾–(bLÀ··I$NWÇÌè_ýs›á°´¼*¥sb à¯ó“ UMNì%JoE¡2Ò²ÿˆQHØ_ >W@!Ì5HYý`­LëbONÖMªq–b”¢³i¬ (×ù[‰¬#{ÏO¡$쥕pLc?z|ØaD6b+‹ÈÌÎAÃ8º SgP<ÏßÎ:¹½«eyÿ‚VMM™Ê(ð±RàBvMU[ûD¾%¾; ùø¦BÚfœŒˆOá›~d–’#É%p£sµn¬ðmØ”Ž ñe¶ÊÓƒ±Ö~—¦ R=¢S¾ïz2ä)ÃHp>R Ð?xhrîmB].R§vä¥_G+EôðöÓnùC¢»—£ÌG/‚ÃáôâP:ß‚(–q™ˆ]‰fdY@ZáZæØêøãadÊ7iÕœôú€dbÆ쫨Z‡;YTô6Z|,¶š6`JòW½ ´«m“2ÜÑ<‘^ÞDÁÍãA¯7QDéǦDn¥D¸h¡@3#ÅæŠENÒŽÛ“¯Ÿ„Ú‹yžê½?f‡³Ic?_—q¾.¯Ád˜¯_‚Æܼ÷~½ÈEDÂ…\P'Ú*¹£{üt³öØlœ³;UP3î C$$šcÚz.¢ï%™Áˆð8a½w +3fw„0—v%@gÖcXP±ªðô€YÏ>Ht˜W?‘?Æ–íÀw_h½šæ(S†f…ˆ©f-ñöŒÓ+…hýp‚'S4­¤°³d+½Îœ¥òÔìeÓ¸&0ƒe5£Õ oðšÕŽ4ô W LY Y k +¬*Ïh¨jX3ÂX„3.§c4(q>1ÝÑ:\†?Ñó\=bt0jÂq5bõ‚Éæ:ì n«ír}CøTP€œ:Z´kH‚bºX“Äo@È™Šl+0{Á´«*N±XÛ÷¾~ÿŸhtÐ(ð‰¹ò´6[%è÷Ï·Œð‘7¬¾vоó£Œ{ÚÛÏø(?TÀRQnŒ«ÁnžhÏ„eöHõâ + ùó tLú³:²7±¯K("몰:!Ý=OÚv¦žð‚7˜¸1ÿ„)^=Å +䢡ܶViƒxI¥x@75Øf}¢IÈü0»vöÔë~à o 5¶t˜YKwÿ"ºn‡×»Â™—Ìh_–¼Væ"å ªéeíp[Ž¾ZVþh¨OŽç:ŠÞ® V"’, ¼¢8I[ÔXC*ø0í}Œn$våÛOÉÝF¥¯Âqƒ7¼ÁûüÿL+Eºñ‹ô74`«qŒÕ‰GœO €´¼|„zy©ò6oû‡1ÍÈG†Ã7,ÄX8Ú™ú?–„-[¡© $˜„Xh¡HŒ6VE©¶œo å‘ØArX’ ¦{ì«ÛM0®z´r’ êP#N/ÁÜnè%_¬ªaûxÌ 䫵e­=ö¸±³`.öµ—x÷åØ"YPðŠÚîc³ïñÇe|ï›,𞹜ÑârÉ+Üí»OWïèÆšïàýnÒ¦ÄÝžŒÅãÃËóW~å{òâ9_,G‹‹iØ'ó»ûpwö×Ù¦-¾endstream +endobj +1675 0 obj<>/XObject<<>>>>/Annots 1068 0 R>>endobj +1676 0 obj<>stream xWÛnÛF}÷WLõˆiQ’%9€Ñ:møÁ®k3 ŠºVäRbBî²\ÒŠþ¾gf©í^D¡HîÜΙ3£¿ŽBàoHÓ!&Gƒ`@“é$Òx6Åõÿ*M©<ÏNƒÙkFãÙë'†á ˜¼r^ƒAûñp}t6Äñp|ŠÏ‚Âé ^ü·œÂIˆ ‡RÐp2 ¦í7~ú!::¹SR”"•ÉlJQ"ÖÅý¥uµ TžÛ¥YŽLlEkÛTç™65=õqÃ5s£ëw¤ë8xzû6ú -›gÁÛ<….“þpŒ‚³€"íj:ó¯í\Ùuÿ¡1T/5Ŷ(”Iü[§m€}‚jœ¦ïïé >Ü\?^>üvùðôÝÞšìô»mÈ-m“'4×TV¶(kHŠJåÜÊV »3œTû*[Ðq8B9ÐõÚx8®2×lÅ5q¬K›<_÷¨À¥Zè€nR2¶Þ­èþgr6­W -DÈe&¶U¥ã:_ãÚÕ(.ŒÙªãVŠìŠy[“œ ¨Pß4ÜÞ¼Õ”HPêŠF)"œÌ”gF³[ÚZãHÚ ‚Ö-°Œnê7–œ¥Ò:—Íy½T’9]=³YeÞÔ„Ê}#Ûà‚’ŠŒ*ð¶e¿ùII•ÞG‘{ -S\ÇÅa4`½è¤­ÁC‚¦ž˜=§OÀøîâö²ÇÖùìuQþ £qYC6Ý¥¶Bâšz»­7¶ÄñuÜI\iM’™ÅÆú–̉z]êDPåoi†êJiöUÅ¥Y8É´Pk°Pr€w€ª,ñJÇ­-9𗵧"[,A7®?Ë–b¶ ‚uÛvÖ€=N›Ä‘6qµZo ’Ã]ªgÉøäj×Aíû[ú;:ïDg,ßØÉBŸÉãoAHD)ú.uÞØMe(«i®bð½lQ´ï’ê?‹dΫB884ˆ>ü²PÌsk¿5%ßRtù]?üò©« *“cûxÃDá-HÄåfZ/* C\sfO -GUÌÕ¦¸ÐŸÁ »rèsÐr+D:Ж©{¸¹'¼‚\0qùN¡\ö™W°‚ÿ!±¿ÿ6²´IëÄr[ž×O·Ý>c™¥ -6V@Hm¦©¥eÛþÄ]ôË×ú<×ÜŽ…ßÛ¬Ö¤*3Ò Y·4®Îò\ìƒ})§³‘ CŒ µ"I²eß¾u˜¦¨(œïD* Û}•{•Êe¥S -•)±‡S[ÐsZkwȧ>óQÑN PÚV -©/5FB…,WuSþmà mÃC7[Ú^aäøÁ‰a†ñ€² ŽˆÁƒ-ð{YÂ`”]­*.³¥=™g Næ6Vy‡4[¾øÍG­‘‰A®Ôq–fЪ½‚?½=à,äG‰ú[JlÃWž¶¥aj¯g:~}:"A~tn"uKÌŒ HÖ¦v®fæYåY²•£QìèU?”‘|̓‹ç"[wÜV1Ì+tã]$Þ=™A‘Æñƒ]Ñ·Ý+ à¾0LŠ®ŒBzK5Ïò¬óÑç ÊÅÊÞqëgó4j*~·° ¯ŒŽˆ~ë å¸ZÚf_·§Î[IaÛûÒ{q÷ÑßÚ)øFçÛ/ô»¤/wÑ—[cBµ3`³k‰ž o6*.}‡%eÔ_VÃÑÅUtù ûj‚‚2wš²´UW xG|ÍÀS_ú•‘`6róN âù ±2bä5ôx4Þ®Œã€E\ ‚#Ôtt?VJZË26¶ˆ[  -¨ŸðÄ~¢WN´]2ò–fh´Ê©Æá9“¥^›Û-}Îý“¦YœáUߥ­}ŽcO|Äv$à°/Ñf¬(ÜØ?Ég`« ò`­x‡*,ˆ­æ|éM3ß–,½ˆ¥™»¸Êxðuû7·KÍ- -3œ¿7µÒs4×ökZÖuùþäd…¿jج€¼}ìk¶ß&K°åGQ©#†ð@à7‡¬á?|f#š †ÃÇ‹Ût_Ù¯¼~´qSà—ƒâ ˆOoOg¯ÿLOfÁätbÝp<âc—ÑѯG;endstream -endobj -1670 0 obj<>endobj -1671 0 obj<>endobj -1672 0 obj<>endobj -1673 0 obj<>endobj -1674 0 obj<>endobj -1675 0 obj<>endobj -1676 0 obj<>endobj -1677 0 obj<>endobj -1678 0 obj<>endobj -1679 0 obj<>endobj -1680 0 obj<>endobj -1681 0 obj<>endobj -1682 0 obj<>endobj -1683 0 obj<>endobj -1684 0 obj<>endobj -1685 0 obj<>endobj -1686 0 obj<>endobj -1687 0 obj<>endobj -1688 0 obj<>endobj -1689 0 obj<>endobj -1690 0 obj<>endobj -1691 0 obj<>endobj -1692 0 obj<>endobj -1693 0 obj<>endobj -1694 0 obj<>endobj -1695 0 obj<>endobj -1696 0 obj<>endobj -1697 0 obj<>endobj -1698 0 obj<>endobj -1699 0 obj<>endobj -1700 0 obj<>endobj -1701 0 obj<>endobj -1702 0 obj<>endobj -1703 0 obj<>endobj -1704 0 obj<>endobj -1705 0 obj<>endobj -1706 0 obj<>endobj -1707 0 obj<>endobj -1708 0 obj<>endobj -1709 0 obj<>endobj -1710 0 obj<>endobj -1711 0 obj<>endobj -1712 0 obj<>endobj -1713 0 obj<>endobj -1714 0 obj<>endobj -1715 0 obj<>endobj -1716 0 obj<>endobj -1717 0 obj<>endobj -1718 0 obj<>endobj -1719 0 obj<>endobj -1720 0 obj<>endobj -1721 0 obj<>endobj -1722 0 obj<>endobj -1723 0 obj<>endobj -1724 0 obj<>endobj -1725 0 obj<>endobj -1726 0 obj<>endobj -1727 0 obj<>endobj -1728 0 obj<>endobj -1729 0 obj<>endobj -1730 0 obj<>endobj -1731 0 obj<>endobj -1732 0 obj<>endobj -1733 0 obj<>endobj -1734 0 obj<>endobj -1735 0 obj<>endobj -1736 0 obj<>endobj -1737 0 obj<>endobj -1738 0 obj<>endobj -1739 0 obj<>endobj -1740 0 obj<>endobj -1741 0 obj<>endobj -1742 0 obj<>endobj -1743 0 obj<>endobj -1744 0 obj<>endobj -1745 0 obj<>endobj -1746 0 obj<>endobj -1747 0 obj<>endobj -1748 0 obj<>endobj -1749 0 obj<>endobj -1750 0 obj<>endobj -1751 0 obj<>endobj -1752 0 obj<>endobj -1753 0 obj<>endobj -1754 0 obj<>endobj -1755 0 obj<>endobj -1756 0 obj<>endobj -1757 0 obj<>endobj -1758 0 obj<>endobj -1759 0 obj<>endobj -1760 0 obj<>endobj -1761 0 obj<>endobj -1762 0 obj<>endobj -1763 0 obj<>endobj -1764 0 obj<>endobj -1765 0 obj<>endobj -1766 0 obj<>endobj -1767 0 obj<>endobj -1768 0 obj<>endobj -1769 0 obj<>endobj -1770 0 obj<>endobj -1771 0 obj<>endobj -1772 0 obj<>endobj -1773 0 obj<>endobj -1774 0 obj<>endobj -1775 0 obj<>endobj -1776 0 obj<>endobj -1777 0 obj<>endobj -1778 0 obj<>endobj -1779 0 obj<>endobj -1780 0 obj<>endobj -1781 0 obj<>endobj -1782 0 obj<>endobj -1783 0 obj<>endobj -1784 0 obj<>endobj -1785 0 obj<>endobj -1786 0 obj<>endobj -1787 0 obj<>endobj -1788 0 obj<>endobj -1789 0 obj<>endobj -1790 0 obj<>endobj -1791 0 obj<>endobj -1792 0 obj<>endobj -1793 0 obj<>endobj -1794 0 obj<>endobj -1795 0 obj<>endobj -1796 0 obj<>endobj -1797 0 obj<>endobj -1798 0 obj<>endobj -1799 0 obj<>endobj -1800 0 obj<>endobj -1801 0 obj<>endobj -1802 0 obj<>endobj -1803 0 obj<>endobj -1804 0 obj<>endobj -1805 0 obj<>endobj -1806 0 obj<>endobj -1807 0 obj<>endobj -1808 0 obj<>endobj -1809 0 obj<>endobj -1810 0 obj<>endobj -1811 0 obj<>endobj -1812 0 obj<>endobj -1813 0 obj<>endobj -1814 0 obj<>endobj -1815 0 obj<>endobj -1816 0 obj<>endobj -1817 0 obj<>endobj -1818 0 obj<>endobj -1819 0 obj<>endobj -1820 0 obj<>endobj -1821 0 obj<>endobj -1822 0 obj<>endobj -1823 0 obj<>endobj -1824 0 obj<>endobj -1825 0 obj<>endobj -1826 0 obj<>endobj -1827 0 obj<>endobj -1828 0 obj<>endobj -1829 0 obj<>endobj -1830 0 obj<>endobj -1831 0 obj<>endobj -1832 0 obj<>endobj -1833 0 obj<>endobj -1834 0 obj<>endobj -1835 0 obj<>endobj -1836 0 obj<>endobj -1837 0 obj<>endobj -1838 0 obj<>endobj -1839 0 obj<>endobj -1840 0 obj<>endobj -1841 0 obj<>endobj -1842 0 obj<>endobj -1843 0 obj<>endobj -1844 0 obj<>endobj -1845 0 obj<>endobj -1846 0 obj<>endobj -1847 0 obj<>endobj -1848 0 obj<>endobj -1849 0 obj<>endobj -1850 0 obj<>endobj -1851 0 obj<>endobj -1852 0 obj<>endobj -1853 0 obj<>endobj -1854 0 obj<>endobj -1855 0 obj<>endobj -1856 0 obj<>endobj -1857 0 obj<>endobj -1858 0 obj<>endobj -1859 0 obj<>endobj -1860 0 obj<>endobj -1861 0 obj<>endobj -1862 0 obj<>endobj -1863 0 obj<>endobj -1864 0 obj<>endobj -1865 0 obj<>endobj -1866 0 obj<>endobj -1867 0 obj<>endobj -1868 0 obj<>endobj -1869 0 obj<>endobj -1870 0 obj<>endobj -1871 0 obj<>endobj -1872 0 obj<>endobj -1873 0 obj<>endobj -1874 0 obj<>endobj -1875 0 obj<>endobj -1876 0 obj<>endobj -1877 0 obj<>endobj -1878 0 obj<>endobj -1879 0 obj<>endobj -1880 0 obj<>endobj -1881 0 obj<>endobj -1882 0 obj<>endobj -1883 0 obj<>endobj -1884 0 obj<>endobj -1885 0 obj<>endobj -1886 0 obj<>endobj -1887 0 obj<>endobj -1888 0 obj<>endobj -1889 0 obj<>endobj -1890 0 obj<>endobj -1891 0 obj<>endobj -1892 0 obj<>endobj -1893 0 obj<>endobj -1894 0 obj<>endobj -1895 0 obj<>endobj -1896 0 obj<>endobj -1897 0 obj<>endobj -1898 0 obj<>endobj -1899 0 obj<>endobj -1900 0 obj<>endobj -1901 0 obj<>endobj -1902 0 obj<>endobj -1903 0 obj<>endobj -1904 0 obj<>endobj -1905 0 obj<>endobj -1906 0 obj<>endobj -1907 0 obj<>endobj -1908 0 obj<>endobj -1909 0 obj<>endobj -1910 0 obj<>endobj -1911 0 obj<>endobj -1912 0 obj<>endobj -1913 0 obj<>endobj -1914 0 obj<>endobj -1915 0 obj<>endobj -1916 0 obj<>endobj -1917 0 obj<>endobj -1918 0 obj<>endobj -1919 0 obj<>endobj -1920 0 obj<>endobj -1921 0 obj<>endobj -1922 0 obj<>endobj -1923 0 obj<>endobj -1924 0 obj<>endobj -1925 0 obj<>endobj -1926 0 obj<>endobj -1927 0 obj<>endobj -1928 0 obj<>endobj -1929 0 obj<>endobj -1930 0 obj<>endobj -1931 0 obj<>endobj -1932 0 obj<>endobj -1933 0 obj<>endobj -1934 0 obj<>endobj -1935 0 obj<>endobj -1936 0 obj<>1<>8<>9<>13<>14<>16<>23<>32<>33<>37<>40<>41<>42<>59<>62<>65<>68<>69<>72<>82<>87<>90<>92<>103<>105<>118<>120<>121<>128<>130<>131<>137<>138<>140<>144<>146<>]>>>>endobj +›gÁÛ<….“þpŒ‚³€"íj:ó¯í\Ùuÿ¡1T/5Ŷ(”Iü[§m€}‚jœ¦ïïé >Ü\?^>üvùðôÝÞšìô»mÈ-m“'4×TV¶(kHŠJåÜÊV »3œTû*[Ðq8B9ÐõÚx8®2×lÅ5q¬K›<_÷¨À¥Zè€nR2¶Þ­èþgr6­W +DÈe&¶U¥ã:_ãÚÕ(.ŒÙªãVŠìŠy[“œ ¨Pß4ÜÞ¼Õ”HPêŠF)"œÌ”gF³[ÚZãHÚ ‚Öípâ1º©ß8Xr–Jë\6äõRI:ätõÌf•yS*÷lƒ ~ H*2ªÀÛ–ýä'%Ux[Eî)Lq‡Ñ€õ¢“¶J šzböœ>㻋ÛË[ç³ÔEù'ŒÆuf Ùt—Ú +‰kêíN´ÞØÇ×q'Up¥5Ifë[b0'êu©A•¿¥ª+Y¤ÙwT—fá$ÓB­ÁN@Énܪ²Ä+·¶äÀ_ÖžŠl±ݸþ ,[ŠØ.ÖmÛYö8mGÚÄÕZh½‰"Jw©ž%ã“«]µïoéïè¼±|c' }&¿!¥èo¸Ôy`7•¡¬¦¹ŠÁô²EѾKªÿ, +9¯ +áàÐ úðÿÉB1Ï­ýÖ”t|KÑåctýð˧®€ªLŽíã …· —›i½¨, qÍ9˜=)U1W›^àB'ìÊ¡Ï@Ë­é@{XB¤ìáæž@ò +rÁÄå;…r5Úg^Á +þ‡Ävü +üÛÈ^Ð&¬Ëm {^?uÞvúŒe +\p”*h8ØüY!¶™¦––mûwÑ/_èó\sG8~o³Z“Z¨ÌH/dÝÒ¸:Ës±ö¥œÎF6 12Ôjˆ$É–} øÖaš¢¢p¾©€n÷UîU*—•N5´T¦ÄNmAÏi­Ý!ŸúÌGmD;%@eh[)¤¾Ô²\ÕMù_´ 7´ Ýli{…‘ã'†ÆÊ‚:"¶ÀïeUƒQºÏ®vtAB´ª¸8Ì–ödž$H8™ÛXåÒlùâg4µF&¹RÇYšA«ö +þôö€³%êo)± _AzÚ–†©½žéøõéˆùѹ‰Ô-1w00 Y›Ú¹š™g•gÉVŽzD±S WýPNDòý5.žˆlÝq[5Æ0¯Ðw‘x÷dEÇvEßv¯0€ûÂ0)º2 +é-Õ<˳ÌGŸƒ(+{Çu®ŸuÎÓ¨©øÝÂ&¼0Z8"ú­3”àji›}5Þž:o%…mïKïÅÝGk§àoO¼ÐïV¾ÜE_nUŒ Õ΀ͮ%z.¼Ù¨¸Pô–”APY GWÑåƒì?¨ +ÊÜiÊÒV]-àñ5O}éWF‚ÙÈýÍ;%ˆç3Äʈ×ÐãÑx»2ŽzqJŽPgÐÑýxX)i9,ËØØ"n18( v|Âû‰^9ÑvÉ@Ê[š¡Ñ*§^?„çL–zmn·ô9÷Ošfq†W}—¶ö9Ž=ñoØ‘x€Ãn¼D›±¢pcÿ$Ÿ­0ȃ´âª° ¶šó¥7Í|[²ô"–fîâ*ãuÀ×íßÜ.5·(ÌpþÞÔJÏÑ\ دiY×åû““mþªM`³^ðö±¯Ù~›Ll, À–E¥JŒxþÁß²„üð™h2z /n?\Ð}e¿òRøÑÆM_Š7 >y¼9p<œ½þ3a<™“Ó!ˆtÃñ˜]FG¿ý ßä:ýendstream +endobj +1677 0 obj<>endobj +1678 0 obj<>endobj +1679 0 obj<>endobj +1680 0 obj<>endobj +1681 0 obj<>endobj +1682 0 obj<>endobj +1683 0 obj<>endobj +1684 0 obj<>endobj +1685 0 obj<>endobj +1686 0 obj<>endobj +1687 0 obj<>endobj +1688 0 obj<>endobj +1689 0 obj<>endobj +1690 0 obj<>endobj +1691 0 obj<>endobj +1692 0 obj<>endobj +1693 0 obj<>endobj +1694 0 obj<>endobj +1695 0 obj<>endobj +1696 0 obj<>endobj +1697 0 obj<>endobj +1698 0 obj<>endobj +1699 0 obj<>endobj +1700 0 obj<>endobj +1701 0 obj<>endobj +1702 0 obj<>endobj +1703 0 obj<>endobj +1704 0 obj<>endobj +1705 0 obj<>endobj +1706 0 obj<>endobj +1707 0 obj<>endobj +1708 0 obj<>endobj +1709 0 obj<>endobj +1710 0 obj<>endobj +1711 0 obj<>endobj +1712 0 obj<>endobj +1713 0 obj<>endobj +1714 0 obj<>endobj +1715 0 obj<>endobj +1716 0 obj<>endobj +1717 0 obj<>endobj +1718 0 obj<>endobj +1719 0 obj<>endobj +1720 0 obj<>endobj +1721 0 obj<>endobj +1722 0 obj<>endobj +1723 0 obj<>endobj +1724 0 obj<>endobj +1725 0 obj<>endobj +1726 0 obj<>endobj +1727 0 obj<>endobj +1728 0 obj<>endobj +1729 0 obj<>endobj +1730 0 obj<>endobj +1731 0 obj<>endobj +1732 0 obj<>endobj +1733 0 obj<>endobj +1734 0 obj<>endobj +1735 0 obj<>endobj +1736 0 obj<>endobj +1737 0 obj<>endobj +1738 0 obj<>endobj +1739 0 obj<>endobj +1740 0 obj<>endobj +1741 0 obj<>endobj +1742 0 obj<>endobj +1743 0 obj<>endobj +1744 0 obj<>endobj +1745 0 obj<>endobj +1746 0 obj<>endobj +1747 0 obj<>endobj +1748 0 obj<>endobj +1749 0 obj<>endobj +1750 0 obj<>endobj +1751 0 obj<>endobj +1752 0 obj<>endobj +1753 0 obj<>endobj +1754 0 obj<>endobj +1755 0 obj<>endobj +1756 0 obj<>endobj +1757 0 obj<>endobj +1758 0 obj<>endobj +1759 0 obj<>endobj +1760 0 obj<>endobj +1761 0 obj<>endobj +1762 0 obj<>endobj +1763 0 obj<>endobj +1764 0 obj<>endobj +1765 0 obj<>endobj +1766 0 obj<>endobj +1767 0 obj<>endobj +1768 0 obj<>endobj +1769 0 obj<>endobj +1770 0 obj<>endobj +1771 0 obj<>endobj +1772 0 obj<>endobj +1773 0 obj<>endobj +1774 0 obj<>endobj +1775 0 obj<>endobj +1776 0 obj<>endobj +1777 0 obj<>endobj +1778 0 obj<>endobj +1779 0 obj<>endobj +1780 0 obj<>endobj +1781 0 obj<>endobj +1782 0 obj<>endobj +1783 0 obj<>endobj +1784 0 obj<>endobj +1785 0 obj<>endobj +1786 0 obj<>endobj +1787 0 obj<>endobj +1788 0 obj<>endobj +1789 0 obj<>endobj +1790 0 obj<>endobj +1791 0 obj<>endobj +1792 0 obj<>endobj +1793 0 obj<>endobj +1794 0 obj<>endobj +1795 0 obj<>endobj +1796 0 obj<>endobj +1797 0 obj<>endobj +1798 0 obj<>endobj +1799 0 obj<>endobj +1800 0 obj<>endobj +1801 0 obj<>endobj +1802 0 obj<>endobj +1803 0 obj<>endobj +1804 0 obj<>endobj +1805 0 obj<>endobj +1806 0 obj<>endobj +1807 0 obj<>endobj +1808 0 obj<>endobj +1809 0 obj<>endobj +1810 0 obj<>endobj +1811 0 obj<>endobj +1812 0 obj<>endobj +1813 0 obj<>endobj +1814 0 obj<>endobj +1815 0 obj<>endobj +1816 0 obj<>endobj +1817 0 obj<>endobj +1818 0 obj<>endobj +1819 0 obj<>endobj +1820 0 obj<>endobj +1821 0 obj<>endobj +1822 0 obj<>endobj +1823 0 obj<>endobj +1824 0 obj<>endobj +1825 0 obj<>endobj +1826 0 obj<>endobj +1827 0 obj<>endobj +1828 0 obj<>endobj +1829 0 obj<>endobj +1830 0 obj<>endobj +1831 0 obj<>endobj +1832 0 obj<>endobj +1833 0 obj<>endobj +1834 0 obj<>endobj +1835 0 obj<>endobj +1836 0 obj<>endobj +1837 0 obj<>endobj +1838 0 obj<>endobj +1839 0 obj<>endobj +1840 0 obj<>endobj +1841 0 obj<>endobj +1842 0 obj<>endobj +1843 0 obj<>endobj +1844 0 obj<>endobj +1845 0 obj<>endobj +1846 0 obj<>endobj +1847 0 obj<>endobj +1848 0 obj<>endobj +1849 0 obj<>endobj +1850 0 obj<>endobj +1851 0 obj<>endobj +1852 0 obj<>endobj +1853 0 obj<>endobj +1854 0 obj<>endobj +1855 0 obj<>endobj +1856 0 obj<>endobj +1857 0 obj<>endobj +1858 0 obj<>endobj +1859 0 obj<>endobj +1860 0 obj<>endobj +1861 0 obj<>endobj +1862 0 obj<>endobj +1863 0 obj<>endobj +1864 0 obj<>endobj +1865 0 obj<>endobj +1866 0 obj<>endobj +1867 0 obj<>endobj +1868 0 obj<>endobj +1869 0 obj<>endobj +1870 0 obj<>endobj +1871 0 obj<>endobj +1872 0 obj<>endobj +1873 0 obj<>endobj +1874 0 obj<>endobj +1875 0 obj<>endobj +1876 0 obj<>endobj +1877 0 obj<>endobj +1878 0 obj<>endobj +1879 0 obj<>endobj +1880 0 obj<>endobj +1881 0 obj<>endobj +1882 0 obj<>endobj +1883 0 obj<>endobj +1884 0 obj<>endobj +1885 0 obj<>endobj +1886 0 obj<>endobj +1887 0 obj<>endobj +1888 0 obj<>endobj +1889 0 obj<>endobj +1890 0 obj<>endobj +1891 0 obj<>endobj +1892 0 obj<>endobj +1893 0 obj<>endobj +1894 0 obj<>endobj +1895 0 obj<>endobj +1896 0 obj<>endobj +1897 0 obj<>endobj +1898 0 obj<>endobj +1899 0 obj<>endobj +1900 0 obj<>endobj +1901 0 obj<>endobj +1902 0 obj<>endobj +1903 0 obj<>endobj +1904 0 obj<>endobj +1905 0 obj<>endobj +1906 0 obj<>endobj +1907 0 obj<>endobj +1908 0 obj<>endobj +1909 0 obj<>endobj +1910 0 obj<>endobj +1911 0 obj<>endobj +1912 0 obj<>endobj +1913 0 obj<>endobj +1914 0 obj<>endobj +1915 0 obj<>endobj +1916 0 obj<>endobj +1917 0 obj<>endobj +1918 0 obj<>endobj +1919 0 obj<>endobj +1920 0 obj<>endobj +1921 0 obj<>endobj +1922 0 obj<>endobj +1923 0 obj<>endobj +1924 0 obj<>endobj +1925 0 obj<>endobj +1926 0 obj<>endobj +1927 0 obj<>endobj +1928 0 obj<>endobj +1929 0 obj<>endobj +1930 0 obj<>endobj +1931 0 obj<>endobj +1932 0 obj<>endobj +1933 0 obj<>endobj +1934 0 obj<>endobj +1935 0 obj<>endobj +1936 0 obj<>endobj +1937 0 obj<>endobj +1938 0 obj<>endobj +1939 0 obj<>endobj +1940 0 obj<>endobj +1941 0 obj<>endobj +1942 0 obj<>endobj +1943 0 obj<>endobj +1944 0 obj<>endobj +1945 0 obj<>endobj +1946 0 obj<>endobj +1947 0 obj<>endobj +1948 0 obj<>1<>8<>9<>13<>14<>16<>23<>27<>38<>39<>40<>42<>59<>62<>65<>68<>69<>72<>82<>87<>90<>92<>103<>116<>125<>128<>130<>131<>135<>138<>139<>141<>145<>147<>]>>>>endobj xref -0 1937 +0 1949 0000000000 65535 f 0000000015 00000 n -0000000248 00000 n -0000001814 00000 n -0000001888 00000 n -0000001967 00000 n -0000002049 00000 n -0000002135 00000 n -0000002213 00000 n -0000002290 00000 n -0000002369 00000 n -0000002453 00000 n -0000002530 00000 n -0000002612 00000 n -0000002671 00000 n -0000002773 00000 n -0000002876 00000 n -0000002978 00000 n -0000003080 00000 n -0000003182 00000 n -0000003284 00000 n -0000003387 00000 n -0000003490 00000 n -0000003593 00000 n -0000003696 00000 n -0000003799 00000 n -0000003902 00000 n -0000004005 00000 n -0000004108 00000 n -0000004211 00000 n -0000004314 00000 n -0000004417 00000 n -0000004520 00000 n -0000004623 00000 n -0000004726 00000 n -0000004829 00000 n -0000004932 00000 n -0000005035 00000 n -0000005138 00000 n -0000005240 00000 n -0000005343 00000 n -0000005446 00000 n -0000005549 00000 n -0000005652 00000 n -0000005755 00000 n -0000005858 00000 n -0000005961 00000 n -0000006064 00000 n -0000006167 00000 n -0000006270 00000 n -0000006373 00000 n -0000006476 00000 n -0000006578 00000 n -0000006681 00000 n -0000006970 00000 n -0000007072 00000 n -0000007175 00000 n -0000007278 00000 n -0000007381 00000 n -0000007484 00000 n -0000007587 00000 n -0000007690 00000 n -0000007792 00000 n -0000007895 00000 n -0000007998 00000 n -0000008101 00000 n -0000008204 00000 n -0000008307 00000 n -0000008409 00000 n -0000008511 00000 n -0000008613 00000 n -0000008716 00000 n -0000008819 00000 n -0000008922 00000 n -0000009025 00000 n -0000009128 00000 n -0000009231 00000 n -0000009334 00000 n -0000009437 00000 n -0000009540 00000 n -0000009643 00000 n -0000009746 00000 n -0000009849 00000 n -0000009952 00000 n -0000010055 00000 n -0000010157 00000 n -0000010260 00000 n -0000010363 00000 n -0000010466 00000 n -0000010569 00000 n -0000010672 00000 n -0000010775 00000 n -0000010878 00000 n -0000010981 00000 n -0000011082 00000 n -0000011183 00000 n -0000011284 00000 n -0000011594 00000 n -0000011696 00000 n -0000011799 00000 n -0000011902 00000 n -0000012006 00000 n -0000012110 00000 n -0000012214 00000 n -0000012318 00000 n -0000012422 00000 n -0000012525 00000 n -0000012629 00000 n -0000012733 00000 n -0000012837 00000 n -0000012940 00000 n -0000013043 00000 n -0000013146 00000 n -0000013250 00000 n -0000013354 00000 n -0000013458 00000 n -0000013562 00000 n -0000013666 00000 n -0000013770 00000 n -0000013874 00000 n -0000013978 00000 n -0000014082 00000 n -0000014186 00000 n -0000014290 00000 n -0000014394 00000 n -0000014498 00000 n -0000014602 00000 n -0000014706 00000 n -0000014810 00000 n -0000014914 00000 n -0000015018 00000 n -0000015121 00000 n -0000015225 00000 n -0000015329 00000 n -0000015433 00000 n -0000015537 00000 n -0000015641 00000 n -0000015745 00000 n -0000015848 00000 n -0000015950 00000 n -0000016052 00000 n -0000016410 00000 n -0000016513 00000 n -0000016617 00000 n -0000016721 00000 n -0000016825 00000 n -0000016928 00000 n -0000017032 00000 n -0000017136 00000 n -0000017239 00000 n -0000017343 00000 n -0000017447 00000 n -0000017551 00000 n -0000017655 00000 n -0000017759 00000 n -0000017863 00000 n -0000017967 00000 n -0000018071 00000 n -0000018175 00000 n -0000018279 00000 n -0000018383 00000 n -0000018487 00000 n -0000018591 00000 n -0000018695 00000 n -0000018799 00000 n -0000018903 00000 n -0000019007 00000 n -0000019111 00000 n -0000019215 00000 n -0000019319 00000 n -0000019423 00000 n -0000019527 00000 n -0000019630 00000 n -0000019734 00000 n -0000019838 00000 n -0000019941 00000 n -0000020045 00000 n -0000020149 00000 n -0000020253 00000 n -0000020357 00000 n -0000020461 00000 n -0000020565 00000 n -0000020669 00000 n -0000020772 00000 n -0000020874 00000 n -0000020976 00000 n -0000021345 00000 n -0000021448 00000 n -0000021552 00000 n -0000021656 00000 n -0000021760 00000 n -0000021864 00000 n -0000021968 00000 n -0000022072 00000 n -0000022175 00000 n -0000022279 00000 n -0000022383 00000 n -0000022487 00000 n -0000022591 00000 n -0000022694 00000 n -0000022798 00000 n -0000022902 00000 n -0000023005 00000 n -0000023109 00000 n -0000023213 00000 n -0000023317 00000 n -0000023421 00000 n -0000023525 00000 n -0000023629 00000 n -0000023733 00000 n -0000023837 00000 n -0000023941 00000 n -0000024045 00000 n -0000024149 00000 n -0000024253 00000 n -0000024356 00000 n -0000024460 00000 n -0000024564 00000 n -0000024668 00000 n -0000024772 00000 n -0000024875 00000 n -0000024978 00000 n -0000025082 00000 n -0000025186 00000 n -0000025290 00000 n -0000025394 00000 n -0000025497 00000 n -0000025599 00000 n -0000025701 00000 n -0000026054 00000 n -0000026157 00000 n -0000026261 00000 n -0000026365 00000 n -0000026469 00000 n -0000026573 00000 n -0000026677 00000 n -0000026781 00000 n -0000026885 00000 n -0000026989 00000 n -0000027093 00000 n -0000027197 00000 n -0000027301 00000 n -0000027405 00000 n -0000027509 00000 n -0000027612 00000 n -0000027715 00000 n -0000027819 00000 n -0000027923 00000 n -0000028027 00000 n -0000028131 00000 n -0000028234 00000 n -0000028338 00000 n -0000028442 00000 n -0000028546 00000 n -0000028650 00000 n -0000028754 00000 n -0000028858 00000 n -0000028962 00000 n -0000029066 00000 n -0000029170 00000 n -0000029274 00000 n -0000029378 00000 n -0000029482 00000 n -0000029586 00000 n -0000029689 00000 n -0000029793 00000 n -0000029897 00000 n -0000030001 00000 n -0000030105 00000 n -0000030209 00000 n -0000030313 00000 n -0000030658 00000 n -0000030761 00000 n -0000030865 00000 n -0000030969 00000 n -0000031073 00000 n -0000031177 00000 n -0000031281 00000 n -0000031385 00000 n -0000031489 00000 n -0000031593 00000 n -0000031697 00000 n -0000031801 00000 n -0000031905 00000 n -0000032009 00000 n -0000032113 00000 n -0000032217 00000 n -0000032321 00000 n -0000032466 00000 n -0000032519 00000 n -0000032606 00000 n -0000032660 00000 n -0000032746 00000 n -0000032813 00000 n -0000032899 00000 n -0000033002 00000 n -0000033106 00000 n -0000033210 00000 n -0000033314 00000 n -0000033418 00000 n -0000033522 00000 n -0000033626 00000 n -0000033730 00000 n -0000033834 00000 n -0000033938 00000 n -0000034042 00000 n -0000034146 00000 n -0000034250 00000 n -0000034354 00000 n -0000034458 00000 n -0000034562 00000 n -0000034666 00000 n -0000034770 00000 n -0000034874 00000 n -0000034978 00000 n -0000035082 00000 n -0000035186 00000 n -0000035290 00000 n -0000035394 00000 n -0000035498 00000 n -0000035602 00000 n -0000035706 00000 n -0000035810 00000 n -0000035914 00000 n -0000036018 00000 n -0000036122 00000 n -0000036225 00000 n -0000036327 00000 n -0000036429 00000 n -0000036742 00000 n -0000036846 00000 n -0000036950 00000 n -0000037054 00000 n -0000037157 00000 n -0000037261 00000 n -0000037365 00000 n -0000037469 00000 n -0000037573 00000 n -0000037677 00000 n -0000037781 00000 n -0000037885 00000 n -0000037989 00000 n -0000038093 00000 n -0000038197 00000 n -0000038301 00000 n -0000038405 00000 n -0000038509 00000 n -0000038613 00000 n -0000038717 00000 n -0000038821 00000 n -0000038925 00000 n -0000039029 00000 n -0000039133 00000 n -0000039237 00000 n -0000039341 00000 n -0000039445 00000 n -0000039549 00000 n -0000039653 00000 n -0000039757 00000 n -0000039861 00000 n -0000039965 00000 n -0000040069 00000 n -0000040173 00000 n -0000040276 00000 n -0000040380 00000 n -0000040484 00000 n -0000040588 00000 n -0000040692 00000 n -0000040796 00000 n -0000040900 00000 n -0000041004 00000 n -0000041108 00000 n -0000041212 00000 n -0000041316 00000 n -0000041420 00000 n -0000041524 00000 n -0000041628 00000 n -0000041732 00000 n -0000041835 00000 n -0000041937 00000 n -0000042039 00000 n -0000042464 00000 n -0000042568 00000 n -0000042672 00000 n -0000042776 00000 n -0000042880 00000 n -0000042984 00000 n -0000043088 00000 n -0000043192 00000 n -0000043296 00000 n -0000043400 00000 n -0000043504 00000 n -0000043608 00000 n -0000043712 00000 n -0000043816 00000 n -0000043920 00000 n -0000044024 00000 n -0000044128 00000 n -0000044232 00000 n -0000044336 00000 n -0000044440 00000 n -0000044544 00000 n -0000044648 00000 n -0000044752 00000 n -0000044856 00000 n -0000044960 00000 n -0000045064 00000 n -0000045168 00000 n -0000045272 00000 n -0000045376 00000 n -0000045480 00000 n -0000045584 00000 n -0000045688 00000 n -0000045792 00000 n -0000045896 00000 n -0000046000 00000 n -0000046104 00000 n -0000046208 00000 n -0000046312 00000 n -0000046416 00000 n -0000046520 00000 n -0000046624 00000 n -0000046728 00000 n -0000046832 00000 n -0000046936 00000 n -0000047040 00000 n -0000047144 00000 n -0000047248 00000 n -0000047352 00000 n -0000047456 00000 n -0000047559 00000 n -0000047661 00000 n -0000047763 00000 n -0000048188 00000 n -0000048292 00000 n -0000048396 00000 n -0000048500 00000 n -0000048604 00000 n -0000048708 00000 n -0000048812 00000 n -0000048916 00000 n -0000049020 00000 n -0000049124 00000 n -0000049228 00000 n -0000049332 00000 n -0000049435 00000 n -0000049539 00000 n -0000049643 00000 n -0000049747 00000 n -0000049851 00000 n -0000049955 00000 n -0000050059 00000 n -0000050163 00000 n -0000050267 00000 n -0000050371 00000 n -0000050475 00000 n -0000050579 00000 n -0000050683 00000 n -0000050787 00000 n -0000050891 00000 n -0000050995 00000 n -0000051099 00000 n -0000051203 00000 n -0000051307 00000 n -0000051411 00000 n -0000051515 00000 n -0000051619 00000 n -0000051723 00000 n -0000051827 00000 n -0000052124 00000 n -0000052227 00000 n -0000052331 00000 n -0000052435 00000 n -0000052539 00000 n -0000052643 00000 n -0000052747 00000 n -0000052851 00000 n -0000052955 00000 n -0000053059 00000 n -0000053163 00000 n -0000053267 00000 n -0000053371 00000 n -0000053475 00000 n -0000053579 00000 n -0000053683 00000 n -0000053787 00000 n -0000053891 00000 n -0000053995 00000 n -0000054099 00000 n -0000054202 00000 n -0000054306 00000 n -0000054410 00000 n -0000054514 00000 n -0000054618 00000 n -0000054722 00000 n -0000054826 00000 n -0000054930 00000 n -0000055034 00000 n -0000055138 00000 n -0000055242 00000 n -0000055346 00000 n -0000055450 00000 n -0000055553 00000 n -0000055657 00000 n -0000055760 00000 n -0000055864 00000 n -0000055968 00000 n -0000056072 00000 n -0000056176 00000 n -0000056280 00000 n -0000056384 00000 n -0000056486 00000 n -0000056588 00000 n -0000056690 00000 n -0000057059 00000 n -0000057163 00000 n -0000057267 00000 n -0000057371 00000 n -0000057412 00000 n +0000000249 00000 n +0000001815 00000 n +0000001889 00000 n +0000001968 00000 n +0000002050 00000 n +0000002136 00000 n +0000002214 00000 n +0000002291 00000 n +0000002370 00000 n +0000002454 00000 n +0000002531 00000 n +0000002613 00000 n +0000002672 00000 n +0000003099 00000 n +0000003837 00000 n +0000003939 00000 n +0000004042 00000 n +0000004144 00000 n +0000004246 00000 n +0000004348 00000 n +0000004450 00000 n +0000004553 00000 n +0000004656 00000 n +0000004759 00000 n +0000004862 00000 n +0000004965 00000 n +0000005068 00000 n +0000005171 00000 n +0000005274 00000 n +0000005377 00000 n +0000005480 00000 n +0000005583 00000 n +0000005686 00000 n +0000005789 00000 n +0000005892 00000 n +0000005995 00000 n +0000006098 00000 n +0000006201 00000 n +0000006304 00000 n +0000006406 00000 n +0000006509 00000 n +0000006612 00000 n +0000006715 00000 n +0000006818 00000 n +0000006921 00000 n +0000007024 00000 n +0000007126 00000 n +0000007229 00000 n +0000007332 00000 n +0000007435 00000 n +0000007538 00000 n +0000007641 00000 n +0000007744 00000 n +0000007847 00000 n +0000007949 00000 n +0000008050 00000 n +0000008151 00000 n +0000008461 00000 n +0000008563 00000 n +0000008666 00000 n +0000008769 00000 n +0000008872 00000 n +0000008975 00000 n +0000009078 00000 n +0000009181 00000 n +0000009284 00000 n +0000009387 00000 n +0000009490 00000 n +0000009593 00000 n +0000009696 00000 n +0000009799 00000 n +0000009902 00000 n +0000010005 00000 n +0000010108 00000 n +0000010211 00000 n +0000010313 00000 n +0000010415 00000 n +0000010517 00000 n +0000010619 00000 n +0000010722 00000 n +0000010825 00000 n +0000010928 00000 n +0000011031 00000 n +0000011134 00000 n +0000011237 00000 n +0000011340 00000 n +0000011443 00000 n +0000011546 00000 n +0000011649 00000 n +0000011752 00000 n +0000011855 00000 n +0000011958 00000 n +0000012061 00000 n +0000012163 00000 n +0000012266 00000 n +0000012369 00000 n +0000012472 00000 n +0000012575 00000 n +0000012677 00000 n +0000012779 00000 n +0000012881 00000 n +0000013201 00000 n +0000013304 00000 n +0000013408 00000 n +0000013512 00000 n +0000013615 00000 n +0000013719 00000 n +0000013823 00000 n +0000013927 00000 n +0000014031 00000 n +0000014135 00000 n +0000014239 00000 n +0000014343 00000 n +0000014447 00000 n +0000014551 00000 n +0000014654 00000 n +0000014758 00000 n +0000014862 00000 n +0000014966 00000 n +0000015069 00000 n +0000015172 00000 n +0000015275 00000 n +0000015379 00000 n +0000015483 00000 n +0000015587 00000 n +0000015691 00000 n +0000015795 00000 n +0000015899 00000 n +0000016003 00000 n +0000016107 00000 n +0000016211 00000 n +0000016315 00000 n +0000016419 00000 n +0000016523 00000 n +0000016627 00000 n +0000016731 00000 n +0000016835 00000 n +0000016939 00000 n +0000017043 00000 n +0000017147 00000 n +0000017250 00000 n +0000017353 00000 n +0000017455 00000 n +0000017557 00000 n +0000017910 00000 n +0000018013 00000 n +0000018117 00000 n +0000018221 00000 n +0000018325 00000 n +0000018429 00000 n +0000018533 00000 n +0000018637 00000 n +0000018740 00000 n +0000018844 00000 n +0000018948 00000 n +0000019052 00000 n +0000019155 00000 n +0000019259 00000 n +0000019363 00000 n +0000019466 00000 n +0000019570 00000 n +0000019674 00000 n +0000019778 00000 n +0000019882 00000 n +0000019986 00000 n +0000020090 00000 n +0000020194 00000 n +0000020298 00000 n +0000020402 00000 n +0000020506 00000 n +0000020610 00000 n +0000020714 00000 n +0000020818 00000 n +0000020922 00000 n +0000021026 00000 n +0000021130 00000 n +0000021234 00000 n +0000021338 00000 n +0000021442 00000 n +0000021546 00000 n +0000021650 00000 n +0000021754 00000 n +0000021857 00000 n +0000021961 00000 n +0000022065 00000 n +0000022169 00000 n +0000022272 00000 n +0000022374 00000 n +0000022476 00000 n +0000022845 00000 n +0000022948 00000 n +0000023052 00000 n +0000023156 00000 n +0000023260 00000 n +0000023364 00000 n +0000023468 00000 n +0000023572 00000 n +0000023676 00000 n +0000023780 00000 n +0000023884 00000 n +0000023988 00000 n +0000024092 00000 n +0000024195 00000 n +0000024299 00000 n +0000024403 00000 n +0000024507 00000 n +0000024611 00000 n +0000024715 00000 n +0000024819 00000 n +0000024923 00000 n +0000025027 00000 n +0000025131 00000 n +0000025235 00000 n +0000025339 00000 n +0000025443 00000 n +0000025546 00000 n +0000025650 00000 n +0000025754 00000 n +0000025858 00000 n +0000025962 00000 n +0000026066 00000 n +0000026170 00000 n +0000026274 00000 n +0000026378 00000 n +0000026481 00000 n +0000026585 00000 n +0000026689 00000 n +0000026793 00000 n +0000026897 00000 n +0000027000 00000 n +0000027102 00000 n +0000027204 00000 n +0000027306 00000 n +0000027667 00000 n +0000027770 00000 n +0000027874 00000 n +0000027978 00000 n +0000028082 00000 n +0000028186 00000 n +0000028290 00000 n +0000028394 00000 n +0000028498 00000 n +0000028602 00000 n +0000028705 00000 n +0000028809 00000 n +0000028913 00000 n +0000029017 00000 n +0000029121 00000 n +0000029225 00000 n +0000029329 00000 n +0000029433 00000 n +0000029536 00000 n +0000029639 00000 n +0000029743 00000 n +0000029847 00000 n +0000029951 00000 n +0000030055 00000 n +0000030158 00000 n +0000030262 00000 n +0000030366 00000 n +0000030470 00000 n +0000030574 00000 n +0000030678 00000 n +0000030782 00000 n +0000030886 00000 n +0000030990 00000 n +0000031094 00000 n +0000031198 00000 n +0000031302 00000 n +0000031406 00000 n +0000031510 00000 n +0000031613 00000 n +0000031717 00000 n +0000031821 00000 n +0000031924 00000 n +0000032026 00000 n +0000032128 00000 n +0000032489 00000 n +0000032592 00000 n +0000032696 00000 n +0000032799 00000 n +0000032903 00000 n +0000033007 00000 n +0000033111 00000 n +0000033215 00000 n +0000033319 00000 n +0000033423 00000 n +0000033527 00000 n +0000033631 00000 n +0000033735 00000 n +0000033839 00000 n +0000033943 00000 n +0000034047 00000 n +0000034151 00000 n +0000034255 00000 n +0000034359 00000 n +0000034520 00000 n +0000034573 00000 n +0000034660 00000 n +0000034714 00000 n +0000034800 00000 n +0000034855 00000 n +0000034942 00000 n +0000035009 00000 n +0000035095 00000 n +0000035198 00000 n +0000035302 00000 n +0000035406 00000 n +0000035510 00000 n +0000035614 00000 n +0000035718 00000 n +0000035822 00000 n +0000035926 00000 n +0000036030 00000 n +0000036134 00000 n +0000036238 00000 n +0000036342 00000 n +0000036446 00000 n +0000036550 00000 n +0000036654 00000 n +0000036758 00000 n +0000036862 00000 n +0000036966 00000 n +0000037070 00000 n +0000037174 00000 n +0000037278 00000 n +0000037382 00000 n +0000037486 00000 n +0000037590 00000 n +0000037694 00000 n +0000037798 00000 n +0000037902 00000 n +0000038006 00000 n +0000038109 00000 n +0000038213 00000 n +0000038317 00000 n +0000038420 00000 n +0000038522 00000 n +0000038624 00000 n +0000038945 00000 n +0000039049 00000 n +0000039153 00000 n +0000039257 00000 n +0000039361 00000 n +0000039465 00000 n +0000039569 00000 n +0000039673 00000 n +0000039777 00000 n +0000039881 00000 n +0000039985 00000 n +0000040089 00000 n +0000040193 00000 n +0000040297 00000 n +0000040401 00000 n +0000040505 00000 n +0000040609 00000 n +0000040713 00000 n +0000040817 00000 n +0000040921 00000 n +0000041025 00000 n +0000041129 00000 n +0000041233 00000 n +0000041337 00000 n +0000041441 00000 n +0000041545 00000 n +0000041648 00000 n +0000041752 00000 n +0000041856 00000 n +0000041960 00000 n +0000042064 00000 n +0000042168 00000 n +0000042272 00000 n +0000042376 00000 n +0000042480 00000 n +0000042584 00000 n +0000042688 00000 n +0000042792 00000 n +0000042896 00000 n +0000043000 00000 n +0000043104 00000 n +0000043208 00000 n +0000043312 00000 n +0000043416 00000 n +0000043520 00000 n +0000043624 00000 n +0000043728 00000 n +0000043832 00000 n +0000043936 00000 n +0000044039 00000 n +0000044141 00000 n +0000044243 00000 n +0000044668 00000 n +0000044772 00000 n +0000044876 00000 n +0000044980 00000 n +0000045084 00000 n +0000045188 00000 n +0000045292 00000 n +0000045396 00000 n +0000045500 00000 n +0000045604 00000 n +0000045708 00000 n +0000045812 00000 n +0000045916 00000 n +0000046020 00000 n +0000046124 00000 n +0000046228 00000 n +0000046332 00000 n +0000046436 00000 n +0000046540 00000 n +0000046644 00000 n +0000046748 00000 n +0000046852 00000 n +0000046956 00000 n +0000047060 00000 n +0000047164 00000 n +0000047268 00000 n +0000047372 00000 n +0000047476 00000 n +0000047580 00000 n +0000047684 00000 n +0000047788 00000 n +0000047892 00000 n +0000047996 00000 n +0000048100 00000 n +0000048204 00000 n +0000048308 00000 n +0000048412 00000 n +0000048516 00000 n +0000048620 00000 n +0000048724 00000 n +0000048828 00000 n +0000048932 00000 n +0000049036 00000 n +0000049140 00000 n +0000049244 00000 n +0000049348 00000 n +0000049451 00000 n +0000049555 00000 n +0000049659 00000 n +0000049762 00000 n +0000049864 00000 n +0000049966 00000 n +0000050391 00000 n +0000050495 00000 n +0000050599 00000 n +0000050703 00000 n +0000050807 00000 n +0000050911 00000 n +0000051015 00000 n +0000051119 00000 n +0000051223 00000 n +0000051327 00000 n +0000051431 00000 n +0000051535 00000 n +0000051639 00000 n +0000051743 00000 n +0000051847 00000 n +0000051951 00000 n +0000052055 00000 n +0000052159 00000 n +0000052263 00000 n +0000052424 00000 n +0000052527 00000 n +0000052631 00000 n +0000052735 00000 n +0000052839 00000 n +0000052943 00000 n +0000053047 00000 n +0000053151 00000 n +0000053255 00000 n +0000053359 00000 n +0000053463 00000 n +0000053567 00000 n +0000053671 00000 n +0000053775 00000 n +0000053879 00000 n +0000053983 00000 n +0000054087 00000 n +0000054191 00000 n +0000054295 00000 n +0000054399 00000 n +0000054502 00000 n +0000054606 00000 n +0000054710 00000 n +0000054814 00000 n +0000054918 00000 n +0000055022 00000 n +0000055126 00000 n +0000055229 00000 n +0000055333 00000 n +0000055437 00000 n +0000055541 00000 n +0000055645 00000 n +0000055749 00000 n +0000055853 00000 n +0000055957 00000 n +0000056061 00000 n +0000056165 00000 n +0000056269 00000 n +0000056373 00000 n +0000056477 00000 n +0000056581 00000 n +0000056685 00000 n +0000056788 00000 n +0000056890 00000 n +0000056992 00000 n +0000057361 00000 n 0000057465 00000 n -0000057552 00000 n -0000057577 00000 n -0000057624 00000 n -0000057711 00000 n -0000057736 00000 n -0000057839 00000 n -0000057943 00000 n -0000058047 00000 n -0000058151 00000 n -0000058255 00000 n -0000058359 00000 n -0000058463 00000 n -0000058567 00000 n -0000058671 00000 n -0000058775 00000 n -0000058879 00000 n -0000058983 00000 n -0000059087 00000 n -0000059191 00000 n -0000059295 00000 n -0000059398 00000 n -0000059502 00000 n -0000059606 00000 n -0000059710 00000 n -0000059814 00000 n -0000059918 00000 n -0000060022 00000 n -0000060126 00000 n -0000060230 00000 n -0000060333 00000 n -0000060437 00000 n +0000057569 00000 n +0000057673 00000 n +0000057777 00000 n +0000057881 00000 n +0000057985 00000 n +0000058089 00000 n +0000058193 00000 n +0000058297 00000 n +0000058386 00000 n +0000058439 00000 n +0000058526 00000 n +0000058551 00000 n +0000058598 00000 n +0000058685 00000 n +0000058710 00000 n +0000058766 00000 n +0000058853 00000 n +0000058922 00000 n +0000059009 00000 n +0000059060 00000 n +0000059147 00000 n +0000059232 00000 n +0000059319 00000 n +0000059375 00000 n +0000059462 00000 n +0000059512 00000 n +0000059599 00000 n +0000059664 00000 n +0000059716 00000 n +0000059803 00000 n +0000059859 00000 n +0000059946 00000 n +0000059994 00000 n +0000060081 00000 n +0000060122 00000 n +0000060170 00000 n +0000060257 00000 n +0000060282 00000 n +0000060323 00000 n +0000060410 00000 n +0000060454 00000 n 0000060541 00000 n -0000060645 00000 n -0000060749 00000 n -0000060853 00000 n -0000060957 00000 n -0000061061 00000 n -0000061165 00000 n -0000061269 00000 n -0000061372 00000 n -0000061476 00000 n -0000061580 00000 n -0000061684 00000 n -0000062005 00000 n -0000062053 00000 n -0000062140 00000 n -0000062188 00000 n -0000062275 00000 n -0000062325 00000 n -0000062412 00000 n -0000062460 00000 n -0000062547 00000 n -0000062596 00000 n -0000062644 00000 n -0000062731 00000 n -0000062779 00000 n -0000062864 00000 n -0000062909 00000 n -0000062995 00000 n -0000063038 00000 n -0000063124 00000 n -0000063165 00000 n -0000063251 00000 n -0000063300 00000 n -0000063386 00000 n -0000063432 00000 n -0000063518 00000 n -0000063563 00000 n -0000063649 00000 n -0000063701 00000 n -0000063787 00000 n -0000063837 00000 n -0000063923 00000 n -0000063969 00000 n -0000064055 00000 n -0000064098 00000 n -0000064184 00000 n -0000064228 00000 n -0000064314 00000 n -0000064357 00000 n -0000064443 00000 n -0000064488 00000 n -0000064574 00000 n -0000064612 00000 n -0000064698 00000 n -0000064740 00000 n -0000064826 00000 n -0000064869 00000 n -0000064955 00000 n -0000064993 00000 n -0000065079 00000 n -0000065121 00000 n -0000065207 00000 n -0000065251 00000 n -0000065337 00000 n -0000065384 00000 n -0000065470 00000 n -0000065518 00000 n -0000065603 00000 n -0000065804 00000 n -0000065854 00000 n -0000065941 00000 n -0000065991 00000 n -0000066077 00000 n -0000066110 00000 n -0000066159 00000 n -0000066245 00000 n -0000066292 00000 n -0000066379 00000 n -0000066412 00000 n -0000066527 00000 n -0000066614 00000 n -0000066696 00000 n -0000066783 00000 n -0000066868 00000 n -0000066955 00000 n -0000066996 00000 n -0000067051 00000 n -0000067138 00000 n -0000067194 00000 n -0000067281 00000 n -0000067314 00000 n -0000067362 00000 n -0000067449 00000 n -0000067523 00000 n -0000067610 00000 n -0000067678 00000 n -0000067765 00000 n -0000067819 00000 n -0000067906 00000 n -0000067974 00000 n -0000068061 00000 n -0000068135 00000 n -0000068222 00000 n -0000068270 00000 n -0000068357 00000 n -0000068414 00000 n -0000068501 00000 n -0000068582 00000 n -0000068637 00000 n -0000068724 00000 n -0000068805 00000 n -0000068892 00000 n -0000068925 00000 n -0000068978 00000 n -0000069065 00000 n -0000069090 00000 n -0000069139 00000 n -0000069226 00000 n -0000069274 00000 n -0000069361 00000 n -0000069403 00000 n -0000069489 00000 n -0000069530 00000 n -0000069573 00000 n -0000069660 00000 n -0000069710 00000 n -0000069797 00000 n -0000069845 00000 n -0000069932 00000 n -0000069986 00000 n -0000070071 00000 n -0000070120 00000 n -0000070165 00000 n -0000070252 00000 n -0000070309 00000 n -0000070396 00000 n -0000070492 00000 n -0000070578 00000 n -0000070619 00000 n -0000070722 00000 n -0000070826 00000 n -0000070930 00000 n -0000071034 00000 n -0000071138 00000 n -0000071242 00000 n -0000071346 00000 n -0000071450 00000 n -0000071554 00000 n -0000071658 00000 n -0000071762 00000 n -0000071866 00000 n -0000071970 00000 n -0000072074 00000 n -0000072178 00000 n -0000072282 00000 n -0000072386 00000 n -0000072490 00000 n -0000072594 00000 n -0000072697 00000 n -0000072801 00000 n -0000072905 00000 n -0000073009 00000 n -0000073113 00000 n -0000073217 00000 n -0000073321 00000 n -0000073425 00000 n -0000073529 00000 n -0000073633 00000 n -0000073736 00000 n -0000073840 00000 n -0000073944 00000 n -0000074048 00000 n -0000074151 00000 n -0000074255 00000 n -0000074359 00000 n -0000074462 00000 n -0000074566 00000 n -0000074670 00000 n -0000074774 00000 n -0000074878 00000 n -0000074981 00000 n -0000075083 00000 n -0000075185 00000 n -0000075554 00000 n -0000075658 00000 n -0000075762 00000 n -0000075866 00000 n -0000075970 00000 n -0000076074 00000 n -0000076178 00000 n -0000076282 00000 n -0000076386 00000 n -0000076490 00000 n -0000076594 00000 n -0000076698 00000 n -0000076802 00000 n -0000076906 00000 n -0000077010 00000 n -0000077114 00000 n -0000077217 00000 n -0000077321 00000 n -0000077425 00000 n -0000077528 00000 n -0000077632 00000 n -0000077736 00000 n -0000077840 00000 n -0000077944 00000 n -0000078048 00000 n -0000078152 00000 n -0000078256 00000 n -0000078360 00000 n -0000078464 00000 n -0000078568 00000 n -0000078672 00000 n -0000078776 00000 n -0000078880 00000 n -0000078984 00000 n -0000079088 00000 n -0000079192 00000 n -0000079295 00000 n -0000079399 00000 n -0000079503 00000 n -0000079607 00000 n -0000079711 00000 n -0000079814 00000 n -0000079918 00000 n -0000080022 00000 n -0000080125 00000 n -0000080229 00000 n -0000080333 00000 n -0000080437 00000 n -0000080541 00000 n -0000080644 00000 n -0000080746 00000 n -0000080848 00000 n -0000081273 00000 n -0000081377 00000 n -0000081481 00000 n -0000081585 00000 n -0000081689 00000 n -0000081793 00000 n -0000081896 00000 n -0000082000 00000 n -0000082104 00000 n -0000082208 00000 n -0000082312 00000 n -0000082415 00000 n -0000082518 00000 n -0000082622 00000 n -0000082726 00000 n -0000082830 00000 n -0000082934 00000 n -0000083038 00000 n -0000083142 00000 n -0000083246 00000 n -0000083350 00000 n -0000083454 00000 n -0000083558 00000 n -0000083662 00000 n -0000083766 00000 n -0000083870 00000 n -0000083974 00000 n -0000084078 00000 n -0000084182 00000 n -0000084286 00000 n -0000084390 00000 n -0000084494 00000 n -0000084598 00000 n -0000084871 00000 n -0000084919 00000 n -0000085006 00000 n -0000085053 00000 n -0000085139 00000 n -0000085186 00000 n -0000085272 00000 n -0000085313 00000 n -0000085358 00000 n -0000085445 00000 n -0000085490 00000 n -0000085576 00000 n -0000085609 00000 n -0000085655 00000 n -0000085742 00000 n -0000085767 00000 n -0000085813 00000 n -0000085900 00000 n -0000085946 00000 n -0000086031 00000 n -0000086075 00000 n -0000086162 00000 n -0000086213 00000 n -0000086300 00000 n -0000086349 00000 n -0000086436 00000 n -0000086484 00000 n -0000086570 00000 n -0000086635 00000 n -0000086690 00000 n -0000086776 00000 n -0000086801 00000 n -0000086854 00000 n -0000086941 00000 n -0000086991 00000 n -0000087078 00000 n -0000087111 00000 n -0000087230 00000 n -0000087316 00000 n -0000087359 00000 n -0000087446 00000 n -0000087489 00000 n -0000087576 00000 n -0000087617 00000 n -0000087680 00000 n -0000087767 00000 n -0000087825 00000 n -0000087912 00000 n -0000088006 00000 n -0000088092 00000 n -0000088133 00000 n -0000088176 00000 n +0000060586 00000 n +0000060673 00000 n +0000060717 00000 n +0000060804 00000 n +0000060848 00000 n +0000060935 00000 n +0000060977 00000 n +0000061064 00000 n +0000061112 00000 n +0000061199 00000 n +0000061272 00000 n +0000061320 00000 n +0000061406 00000 n +0000061431 00000 n +0000061484 00000 n +0000061570 00000 n +0000061595 00000 n +0000061698 00000 n +0000061801 00000 n +0000061905 00000 n +0000062009 00000 n +0000062113 00000 n +0000062217 00000 n +0000062321 00000 n +0000062425 00000 n +0000062529 00000 n +0000062633 00000 n +0000062737 00000 n +0000062841 00000 n +0000062945 00000 n +0000063049 00000 n +0000063153 00000 n +0000063257 00000 n +0000063360 00000 n +0000063464 00000 n +0000063568 00000 n +0000063672 00000 n +0000063776 00000 n +0000063880 00000 n +0000063984 00000 n +0000064088 00000 n +0000064192 00000 n +0000064296 00000 n +0000064399 00000 n +0000064503 00000 n +0000064607 00000 n +0000064711 00000 n +0000064815 00000 n +0000064919 00000 n +0000065023 00000 n +0000065127 00000 n +0000065231 00000 n +0000065335 00000 n +0000065438 00000 n +0000065542 00000 n +0000065646 00000 n +0000065750 00000 n +0000066087 00000 n +0000066135 00000 n +0000066222 00000 n +0000066270 00000 n +0000066357 00000 n +0000066407 00000 n +0000066494 00000 n +0000066542 00000 n +0000066629 00000 n +0000066678 00000 n +0000066726 00000 n +0000066813 00000 n +0000066861 00000 n +0000066946 00000 n +0000066991 00000 n +0000067077 00000 n +0000067120 00000 n +0000067206 00000 n +0000067247 00000 n +0000067333 00000 n +0000067382 00000 n +0000067468 00000 n +0000067514 00000 n +0000067600 00000 n +0000067645 00000 n +0000067731 00000 n +0000067783 00000 n +0000067869 00000 n +0000067919 00000 n +0000068005 00000 n +0000068051 00000 n +0000068137 00000 n +0000068180 00000 n +0000068266 00000 n +0000068310 00000 n +0000068396 00000 n +0000068439 00000 n +0000068525 00000 n +0000068570 00000 n +0000068656 00000 n +0000068694 00000 n +0000068780 00000 n +0000068822 00000 n +0000068908 00000 n +0000068951 00000 n +0000069037 00000 n +0000069075 00000 n +0000069161 00000 n +0000069203 00000 n +0000069289 00000 n +0000069333 00000 n +0000069419 00000 n +0000069466 00000 n +0000069552 00000 n +0000069600 00000 n +0000069685 00000 n +0000069886 00000 n +0000069936 00000 n +0000070023 00000 n +0000070073 00000 n +0000070159 00000 n +0000070192 00000 n +0000070241 00000 n +0000070327 00000 n +0000070374 00000 n +0000070461 00000 n +0000070494 00000 n +0000070609 00000 n +0000070696 00000 n +0000070778 00000 n +0000070865 00000 n +0000070950 00000 n +0000071037 00000 n +0000071078 00000 n +0000071133 00000 n +0000071220 00000 n +0000071276 00000 n +0000071363 00000 n +0000071396 00000 n +0000071444 00000 n +0000071531 00000 n +0000071605 00000 n +0000071692 00000 n +0000071760 00000 n +0000071847 00000 n +0000071901 00000 n +0000071988 00000 n +0000072056 00000 n +0000072143 00000 n +0000072217 00000 n +0000072304 00000 n +0000072352 00000 n +0000072439 00000 n +0000072496 00000 n +0000072583 00000 n +0000072664 00000 n +0000072719 00000 n +0000072806 00000 n +0000072887 00000 n +0000072974 00000 n +0000073007 00000 n +0000073060 00000 n +0000073147 00000 n +0000073172 00000 n +0000073220 00000 n +0000073307 00000 n +0000073349 00000 n +0000073436 00000 n +0000073479 00000 n +0000073566 00000 n +0000073616 00000 n +0000073703 00000 n +0000073751 00000 n +0000073838 00000 n +0000073895 00000 n +0000073938 00000 n +0000074025 00000 n +0000074079 00000 n +0000074166 00000 n +0000074211 00000 n +0000074298 00000 n +0000074339 00000 n +0000074396 00000 n +0000074483 00000 n +0000074579 00000 n +0000074665 00000 n +0000074698 00000 n +0000074801 00000 n +0000074905 00000 n +0000075009 00000 n +0000075113 00000 n +0000075217 00000 n +0000075321 00000 n +0000075425 00000 n +0000075529 00000 n +0000075633 00000 n +0000075737 00000 n +0000075841 00000 n +0000075945 00000 n +0000076049 00000 n +0000076153 00000 n +0000076257 00000 n +0000076361 00000 n +0000076465 00000 n +0000076569 00000 n +0000076673 00000 n +0000076776 00000 n +0000076880 00000 n +0000076984 00000 n +0000077088 00000 n +0000077192 00000 n +0000077296 00000 n +0000077400 00000 n +0000077504 00000 n +0000077608 00000 n +0000077712 00000 n +0000077815 00000 n +0000077919 00000 n +0000078023 00000 n +0000078127 00000 n +0000078230 00000 n +0000078334 00000 n +0000078438 00000 n +0000078541 00000 n +0000078645 00000 n +0000078749 00000 n +0000078853 00000 n +0000078957 00000 n +0000079060 00000 n +0000079162 00000 n +0000079264 00000 n +0000079633 00000 n +0000079737 00000 n +0000079841 00000 n +0000079945 00000 n +0000080049 00000 n +0000080153 00000 n +0000080257 00000 n +0000080361 00000 n +0000080465 00000 n +0000080569 00000 n +0000080673 00000 n +0000080777 00000 n +0000080881 00000 n +0000080985 00000 n +0000081089 00000 n +0000081193 00000 n +0000081296 00000 n +0000081400 00000 n +0000081504 00000 n +0000081608 00000 n +0000081712 00000 n +0000081816 00000 n +0000081920 00000 n +0000082024 00000 n +0000082128 00000 n +0000082232 00000 n +0000082336 00000 n +0000082440 00000 n +0000082544 00000 n +0000082648 00000 n +0000082752 00000 n +0000082856 00000 n +0000082960 00000 n +0000083064 00000 n +0000083167 00000 n +0000083271 00000 n +0000083375 00000 n +0000083479 00000 n +0000083583 00000 n +0000083687 00000 n +0000083791 00000 n +0000083895 00000 n +0000083999 00000 n +0000084103 00000 n +0000084207 00000 n +0000084311 00000 n +0000084415 00000 n +0000084518 00000 n +0000084622 00000 n +0000084725 00000 n +0000084827 00000 n +0000084929 00000 n +0000085354 00000 n +0000085458 00000 n +0000085562 00000 n +0000085666 00000 n +0000085770 00000 n +0000085873 00000 n +0000085977 00000 n +0000086081 00000 n +0000086185 00000 n +0000086289 00000 n +0000086392 00000 n +0000086495 00000 n +0000086599 00000 n +0000086703 00000 n +0000086807 00000 n +0000086911 00000 n +0000087015 00000 n +0000087119 00000 n +0000087223 00000 n +0000087327 00000 n +0000087431 00000 n +0000087535 00000 n +0000087638 00000 n +0000087742 00000 n +0000087846 00000 n +0000087950 00000 n +0000088054 00000 n +0000088158 00000 n 0000088262 00000 n -0000088310 00000 n -0000088397 00000 n -0000088438 00000 n -0000088525 00000 n -0000088569 00000 n -0000088656 00000 n -0000088700 00000 n -0000088786 00000 n -0000088843 00000 n -0000088889 00000 n -0000088976 00000 n -0000089025 00000 n -0000089111 00000 n -0000089144 00000 n -0000089198 00000 n -0000089285 00000 n -0000089336 00000 n -0000089423 00000 n -0000089474 00000 n -0000089560 00000 n -0000089614 00000 n -0000089701 00000 n -0000089751 00000 n -0000089838 00000 n -0000089895 00000 n -0000089945 00000 n -0000090032 00000 n -0000090082 00000 n -0000090168 00000 n -0000090201 00000 n -0000090265 00000 n -0000090352 00000 n -0000090377 00000 n -0000090419 00000 n -0000090505 00000 n -0000090556 00000 n -0000090643 00000 n -0000090690 00000 n -0000090777 00000 n -0000090818 00000 n -0000090880 00000 n -0000090967 00000 n -0000090992 00000 n -0000091041 00000 n -0000091128 00000 n -0000091153 00000 n -0000091201 00000 n -0000091288 00000 n -0000091338 00000 n +0000088366 00000 n +0000088615 00000 n +0000088663 00000 n +0000088750 00000 n +0000088797 00000 n +0000088883 00000 n +0000088930 00000 n +0000089016 00000 n +0000089057 00000 n +0000089102 00000 n +0000089189 00000 n +0000089234 00000 n +0000089320 00000 n +0000089353 00000 n +0000089399 00000 n +0000089484 00000 n +0000089530 00000 n +0000089613 00000 n +0000089646 00000 n +0000089690 00000 n +0000089777 00000 n +0000089828 00000 n +0000089915 00000 n +0000089964 00000 n +0000090051 00000 n +0000090099 00000 n +0000090185 00000 n +0000090234 00000 n +0000090289 00000 n +0000090375 00000 n +0000090400 00000 n +0000090453 00000 n +0000090540 00000 n +0000090590 00000 n +0000090677 00000 n +0000090710 00000 n +0000090829 00000 n +0000090915 00000 n +0000090958 00000 n +0000091045 00000 n +0000091088 00000 n +0000091175 00000 n +0000091216 00000 n +0000091279 00000 n +0000091366 00000 n 0000091424 00000 n -0000091468 00000 n -0000091554 00000 n -0000091598 00000 n -0000091684 00000 n -0000091734 00000 n -0000091820 00000 n -0000091870 00000 n -0000091955 00000 n -0000092004 00000 n -0000092088 00000 n -0000092135 00000 n -0000092219 00000 n -0000092300 00000 n -0000092356 00000 n -0000092443 00000 n -0000092512 00000 n -0000092599 00000 n -0000092650 00000 n -0000092737 00000 n -0000092824 00000 n -0000092911 00000 n -0000092967 00000 n -0000093054 00000 n -0000093104 00000 n -0000093191 00000 n -0000093256 00000 n -0000093308 00000 n -0000093395 00000 n -0000093451 00000 n -0000093538 00000 n -0000093586 00000 n -0000093673 00000 n -0000093721 00000 n -0000093808 00000 n -0000093857 00000 n -0000093898 00000 n -0000093983 00000 n -0000094008 00000 n -0000094052 00000 n -0000094139 00000 n -0000094184 00000 n -0000094271 00000 n -0000094315 00000 n -0000094402 00000 n -0000094446 00000 n -0000094533 00000 n -0000094575 00000 n -0000094662 00000 n -0000094710 00000 n -0000094797 00000 n -0000094862 00000 n -0000094910 00000 n -0000094996 00000 n -0000095021 00000 n -0000095074 00000 n -0000095160 00000 n -0000095185 00000 n -0000095239 00000 n -0000095326 00000 n -0000095351 00000 n -0000095414 00000 n -0000095501 00000 n -0000095564 00000 n -0000095651 00000 n -0000095705 00000 n -0000095792 00000 n -0000095833 00000 n -0000095936 00000 n -0000096040 00000 n -0000096144 00000 n -0000096248 00000 n -0000096352 00000 n -0000096455 00000 n -0000096559 00000 n -0000096663 00000 n -0000096767 00000 n -0000096871 00000 n -0000096975 00000 n -0000097079 00000 n -0000097184 00000 n -0000097289 00000 n -0000097394 00000 n -0000097499 00000 n -0000097604 00000 n -0000097709 00000 n -0000097814 00000 n -0000097918 00000 n -0000098023 00000 n -0000098128 00000 n -0000098233 00000 n -0000098338 00000 n -0000098443 00000 n -0000098548 00000 n -0000098652 00000 n -0000098757 00000 n -0000098862 00000 n -0000098967 00000 n -0000099072 00000 n -0000099177 00000 n -0000099282 00000 n -0000099387 00000 n -0000099492 00000 n -0000099597 00000 n -0000099702 00000 n -0000099807 00000 n -0000099912 00000 n -0000100017 00000 n -0000100122 00000 n -0000100227 00000 n -0000100611 00000 n -0000100667 00000 n -0000100755 00000 n -0000100824 00000 n -0000100912 00000 n -0000100988 00000 n -0000101077 00000 n -0000101148 00000 n -0000101236 00000 n -0000101316 00000 n -0000101405 00000 n -0000101468 00000 n -0000101551 00000 n -0000101639 00000 n -0000101715 00000 n -0000101804 00000 n -0000101878 00000 n -0000101967 00000 n -0000102046 00000 n -0000102135 00000 n -0000102189 00000 n -0000102238 00000 n -0000102327 00000 n -0000102354 00000 n -0000102403 00000 n -0000102492 00000 n -0000102519 00000 n -0000102568 00000 n -0000102657 00000 n -0000102722 00000 n -0000102811 00000 n -0000102867 00000 n -0000102956 00000 n -0000103004 00000 n -0000103093 00000 n -0000103147 00000 n -0000103202 00000 n -0000103291 00000 n -0000103346 00000 n -0000103435 00000 n -0000103471 00000 n -0000103507 00000 n -0000103543 00000 n -0000108581 00000 n -0000108626 00000 n -0000108671 00000 n -0000108716 00000 n -0000108761 00000 n -0000108806 00000 n -0000108851 00000 n -0000108896 00000 n -0000108941 00000 n -0000108986 00000 n -0000109031 00000 n -0000109076 00000 n -0000109121 00000 n -0000109166 00000 n -0000109211 00000 n -0000109256 00000 n -0000109301 00000 n -0000109346 00000 n -0000109391 00000 n -0000109436 00000 n -0000109481 00000 n -0000109526 00000 n -0000109571 00000 n -0000109616 00000 n -0000109661 00000 n -0000109706 00000 n -0000109751 00000 n -0000109796 00000 n -0000109841 00000 n -0000109886 00000 n -0000109931 00000 n -0000109976 00000 n -0000110021 00000 n -0000110066 00000 n -0000110111 00000 n -0000110156 00000 n -0000110201 00000 n -0000110246 00000 n -0000110291 00000 n -0000110336 00000 n -0000110381 00000 n -0000110426 00000 n -0000110471 00000 n -0000110516 00000 n -0000110561 00000 n -0000110606 00000 n -0000110651 00000 n -0000110696 00000 n -0000110741 00000 n -0000110786 00000 n -0000110831 00000 n -0000110876 00000 n -0000110921 00000 n -0000110966 00000 n -0000111011 00000 n -0000111056 00000 n -0000111101 00000 n -0000111146 00000 n -0000111191 00000 n -0000111236 00000 n -0000111281 00000 n -0000111326 00000 n -0000111371 00000 n -0000111416 00000 n -0000111461 00000 n -0000111506 00000 n -0000111551 00000 n -0000111596 00000 n -0000111641 00000 n -0000111686 00000 n -0000111731 00000 n -0000111776 00000 n -0000111821 00000 n -0000111866 00000 n -0000111911 00000 n -0000111956 00000 n -0000112001 00000 n -0000112046 00000 n -0000112091 00000 n -0000112136 00000 n -0000112181 00000 n -0000112226 00000 n -0000112271 00000 n -0000112316 00000 n -0000112361 00000 n -0000112406 00000 n -0000112451 00000 n -0000112496 00000 n -0000112541 00000 n -0000112586 00000 n -0000112631 00000 n -0000112676 00000 n -0000112721 00000 n -0000112766 00000 n -0000112811 00000 n -0000112856 00000 n -0000112901 00000 n -0000112946 00000 n -0000112991 00000 n -0000113036 00000 n -0000113081 00000 n -0000113126 00000 n -0000113171 00000 n -0000113216 00000 n -0000113261 00000 n -0000113306 00000 n -0000113351 00000 n -0000113396 00000 n -0000113441 00000 n -0000113486 00000 n -0000113531 00000 n -0000113576 00000 n -0000113621 00000 n -0000113666 00000 n -0000113711 00000 n -0000113756 00000 n -0000113801 00000 n -0000113846 00000 n -0000113891 00000 n -0000113936 00000 n -0000113981 00000 n -0000114026 00000 n -0000114071 00000 n -0000114116 00000 n -0000114161 00000 n -0000114206 00000 n -0000114251 00000 n -0000114296 00000 n -0000114341 00000 n -0000114386 00000 n -0000114431 00000 n -0000114476 00000 n -0000114521 00000 n -0000114566 00000 n -0000114611 00000 n -0000114656 00000 n -0000114701 00000 n -0000114746 00000 n -0000114791 00000 n -0000114836 00000 n -0000114881 00000 n -0000114926 00000 n -0000114971 00000 n -0000115016 00000 n -0000115061 00000 n -0000115106 00000 n -0000115151 00000 n -0000115196 00000 n -0000115241 00000 n -0000115286 00000 n -0000115331 00000 n -0000115376 00000 n -0000115421 00000 n -0000115466 00000 n -0000115511 00000 n -0000115556 00000 n -0000115601 00000 n -0000115646 00000 n -0000115691 00000 n -0000115736 00000 n -0000115781 00000 n -0000115826 00000 n -0000115871 00000 n -0000115916 00000 n -0000115961 00000 n -0000116006 00000 n -0000116051 00000 n -0000116096 00000 n -0000116141 00000 n -0000116186 00000 n -0000116231 00000 n -0000116276 00000 n -0000116321 00000 n -0000116366 00000 n -0000116411 00000 n -0000116456 00000 n -0000116501 00000 n -0000116546 00000 n -0000116591 00000 n -0000116636 00000 n -0000116681 00000 n -0000116726 00000 n -0000116771 00000 n -0000116816 00000 n -0000116861 00000 n -0000116906 00000 n -0000116951 00000 n -0000116996 00000 n -0000117041 00000 n -0000117086 00000 n -0000117131 00000 n -0000117176 00000 n -0000117221 00000 n -0000117266 00000 n -0000117311 00000 n -0000117356 00000 n -0000117401 00000 n -0000117446 00000 n -0000117491 00000 n -0000117536 00000 n -0000117581 00000 n -0000117626 00000 n -0000117671 00000 n -0000117716 00000 n -0000117761 00000 n -0000117806 00000 n -0000117851 00000 n -0000117896 00000 n -0000117941 00000 n -0000117986 00000 n -0000118031 00000 n -0000118076 00000 n -0000118121 00000 n -0000118166 00000 n -0000118211 00000 n -0000118256 00000 n -0000118301 00000 n -0000118346 00000 n -0000118391 00000 n -0000118436 00000 n -0000118481 00000 n -0000118526 00000 n -0000118571 00000 n -0000118616 00000 n -0000118661 00000 n -0000118706 00000 n -0000118751 00000 n -0000118796 00000 n -0000118841 00000 n -0000118886 00000 n -0000118931 00000 n -0000118976 00000 n -0000119021 00000 n -0000119066 00000 n -0000119111 00000 n -0000119156 00000 n -0000119201 00000 n -0000119246 00000 n -0000119291 00000 n -0000119336 00000 n -0000119381 00000 n -0000119426 00000 n -0000119471 00000 n -0000119516 00000 n -0000119561 00000 n -0000119606 00000 n -0000119651 00000 n -0000119696 00000 n -0000119741 00000 n -0000119786 00000 n -0000119831 00000 n -0000119876 00000 n -0000119921 00000 n -0000119966 00000 n -0000120011 00000 n -0000120056 00000 n -0000120101 00000 n -0000120146 00000 n -0000120191 00000 n -0000120236 00000 n -0000120281 00000 n -0000120326 00000 n -0000120371 00000 n -0000120416 00000 n -0000120461 00000 n -0000120506 00000 n -0000120551 00000 n -0000120596 00000 n -0000120641 00000 n -0000120686 00000 n -0000120731 00000 n -0000120776 00000 n -0000120821 00000 n -0000120866 00000 n -0000120911 00000 n -0000120956 00000 n -0000121001 00000 n -0000121046 00000 n -0000121091 00000 n -0000121136 00000 n -0000121181 00000 n -0000121226 00000 n -0000121271 00000 n -0000121316 00000 n -0000121361 00000 n -0000121406 00000 n -0000121451 00000 n -0000121496 00000 n -0000121541 00000 n -0000121586 00000 n -0000121631 00000 n -0000121676 00000 n -0000121721 00000 n -0000121766 00000 n -0000123174 00000 n -0000123335 00000 n -0000123504 00000 n -0000123697 00000 n -0000127450 00000 n -0000127643 00000 n -0000132340 00000 n -0000132534 00000 n -0000136913 00000 n -0000137107 00000 n -0000140959 00000 n -0000141153 00000 n -0000144725 00000 n -0000144919 00000 n -0000148558 00000 n -0000148752 00000 n -0000149730 00000 n -0000149891 00000 n -0000150125 00000 n -0000150329 00000 n -0000153103 00000 n -0000153278 00000 n -0000156898 00000 n -0000157073 00000 n -0000159486 00000 n -0000159661 00000 n -0000161080 00000 n -0000161241 00000 n -0000161429 00000 n -0000161633 00000 n -0000164580 00000 n -0000164755 00000 n -0000165173 00000 n -0000165385 00000 n -0000166546 00000 n -0000166734 00000 n -0000168196 00000 n -0000168393 00000 n -0000169763 00000 n -0000169978 00000 n -0000171214 00000 n -0000171408 00000 n -0000172987 00000 n -0000173157 00000 n -0000174973 00000 n -0000175124 00000 n -0000175365 00000 n -0000175535 00000 n -0000177210 00000 n -0000177389 00000 n -0000179202 00000 n -0000179371 00000 n -0000181209 00000 n -0000181378 00000 n -0000182365 00000 n -0000182544 00000 n -0000184190 00000 n -0000184378 00000 n -0000185867 00000 n -0000186055 00000 n -0000187476 00000 n -0000187646 00000 n -0000189312 00000 n -0000189482 00000 n -0000190038 00000 n -0000190208 00000 n -0000191940 00000 n -0000192119 00000 n -0000193825 00000 n -0000194013 00000 n -0000195668 00000 n -0000195856 00000 n -0000197573 00000 n -0000197742 00000 n -0000198490 00000 n -0000198697 00000 n -0000200340 00000 n -0000200547 00000 n -0000202154 00000 n -0000202323 00000 n -0000202655 00000 n -0000202816 00000 n -0000203006 00000 n -0000203210 00000 n -0000206041 00000 n -0000206254 00000 n -0000208022 00000 n -0000208235 00000 n -0000209737 00000 n -0000209959 00000 n -0000211786 00000 n -0000212007 00000 n -0000213663 00000 n -0000213870 00000 n -0000215562 00000 n -0000215778 00000 n -0000217711 00000 n -0000217933 00000 n -0000219945 00000 n -0000220157 00000 n -0000222240 00000 n -0000222443 00000 n -0000224709 00000 n -0000224931 00000 n -0000227140 00000 n -0000227338 00000 n -0000229347 00000 n -0000229535 00000 n -0000231059 00000 n -0000231238 00000 n -0000233230 00000 n -0000233418 00000 n -0000235438 00000 n -0000235626 00000 n -0000237518 00000 n -0000237715 00000 n -0000239427 00000 n -0000239587 00000 n -0000240580 00000 n -0000240774 00000 n -0000242353 00000 n -0000242533 00000 n -0000244296 00000 n -0000244475 00000 n -0000245334 00000 n -0000245513 00000 n -0000246598 00000 n -0000246795 00000 n -0000248294 00000 n -0000248473 00000 n -0000249289 00000 n -0000249519 00000 n -0000251018 00000 n -0000251230 00000 n -0000252983 00000 n -0000253176 00000 n -0000254533 00000 n -0000254694 00000 n -0000254885 00000 n -0000255098 00000 n -0000258048 00000 n -0000258223 00000 n -0000260654 00000 n -0000260829 00000 n -0000262285 00000 n -0000262483 00000 n -0000263845 00000 n -0000264043 00000 n -0000265732 00000 n -0000265920 00000 n -0000267601 00000 n -0000267780 00000 n -0000269882 00000 n -0000270061 00000 n -0000271834 00000 n -0000272013 00000 n -0000273695 00000 n -0000273883 00000 n -0000275737 00000 n -0000275949 00000 n -0000277979 00000 n -0000278192 00000 n -0000279744 00000 n -0000279933 00000 n -0000281207 00000 n -0000281428 00000 n -0000283204 00000 n -0000283410 00000 n -0000285295 00000 n -0000285492 00000 n -0000287077 00000 n -0000287288 00000 n -0000288808 00000 n -0000288996 00000 n -0000289898 00000 n -0000290086 00000 n -0000291612 00000 n -0000291815 00000 n -0000293523 00000 n -0000293726 00000 n -0000294543 00000 n -0000294755 00000 n -0000296233 00000 n -0000296413 00000 n -0000297172 00000 n -0000297403 00000 n -0000299126 00000 n -0000299338 00000 n -0000301264 00000 n -0000301495 00000 n -0000303505 00000 n -0000303727 00000 n -0000305447 00000 n -0000305650 00000 n -0000306909 00000 n -0000307131 00000 n -0000308724 00000 n -0000308903 00000 n -0000310451 00000 n -0000310630 00000 n -0000312247 00000 n -0000312426 00000 n -0000313824 00000 n -0000314003 00000 n -0000315669 00000 n -0000315839 00000 n -0000316585 00000 n -0000316788 00000 n -0000318657 00000 n -0000318817 00000 n -0000319941 00000 n -0000320130 00000 n -0000321823 00000 n -0000322002 00000 n -0000323747 00000 n -0000323935 00000 n -0000325838 00000 n -0000326051 00000 n -0000327916 00000 n -0000328156 00000 n -0000330231 00000 n -0000330443 00000 n -0000332011 00000 n -0000332217 00000 n -0000333381 00000 n -0000333569 00000 n -0000334765 00000 n -0000334944 00000 n -0000335949 00000 n -0000336137 00000 n -0000337764 00000 n -0000337952 00000 n -0000339220 00000 n -0000339409 00000 n -0000340717 00000 n -0000340887 00000 n -0000341360 00000 n -0000341548 00000 n -0000342939 00000 n -0000343127 00000 n -0000344098 00000 n -0000344286 00000 n -0000344835 00000 n -0000345057 00000 n -0000347130 00000 n -0000347343 00000 n -0000349364 00000 n -0000349586 00000 n -0000350797 00000 n -0000351010 00000 n -0000352572 00000 n -0000352794 00000 n -0000354603 00000 n -0000354825 00000 n -0000356545 00000 n -0000356739 00000 n -0000357449 00000 n -0000357652 00000 n -0000359191 00000 n -0000359369 00000 n -0000360054 00000 n -0000360242 00000 n -0000361727 00000 n -0000361906 00000 n -0000363512 00000 n -0000363691 00000 n -0000365361 00000 n -0000365531 00000 n -0000367080 00000 n -0000367250 00000 n -0000368551 00000 n -0000368721 00000 n -0000370347 00000 n -0000370517 00000 n -0000372097 00000 n -0000372293 00000 n -0000374483 00000 n -0000374662 00000 n -0000376189 00000 n -0000376377 00000 n -0000377345 00000 n -0000377541 00000 n -0000379272 00000 n -0000379485 00000 n -0000381167 00000 n -0000381362 00000 n -0000383112 00000 n -0000383325 00000 n -0000384590 00000 n -0000384794 00000 n -0000386531 00000 n -0000386719 00000 n -0000388462 00000 n -0000388641 00000 n -0000390039 00000 n -0000390218 00000 n -0000391915 00000 n -0000392094 00000 n -0000393575 00000 n -0000393754 00000 n -0000395546 00000 n -0000395750 00000 n -0000397401 00000 n -0000397460 00000 n -0000397563 00000 n -0000397728 00000 n -0000397810 00000 n -0000397918 00000 n -0000398041 00000 n -0000398153 00000 n -0000398332 00000 n -0000398441 00000 n -0000398567 00000 n -0000398694 00000 n -0000398833 00000 n -0000398973 00000 n -0000399142 00000 n -0000399259 00000 n -0000399388 00000 n -0000399540 00000 n -0000399680 00000 n -0000399858 00000 n -0000400014 00000 n -0000400127 00000 n -0000400244 00000 n -0000400379 00000 n -0000400520 00000 n -0000400635 00000 n -0000400746 00000 n -0000400922 00000 n -0000401033 00000 n -0000401163 00000 n -0000401286 00000 n -0000401452 00000 n -0000401568 00000 n -0000401697 00000 n -0000401836 00000 n -0000401972 00000 n -0000402107 00000 n -0000402242 00000 n -0000402378 00000 n -0000402489 00000 n -0000402645 00000 n -0000402739 00000 n -0000402948 00000 n -0000403049 00000 n -0000403192 00000 n -0000403338 00000 n -0000403454 00000 n -0000403621 00000 n -0000403733 00000 n -0000403924 00000 n -0000404027 00000 n -0000404200 00000 n -0000404321 00000 n -0000404451 00000 n -0000404563 00000 n -0000404687 00000 n -0000404799 00000 n -0000405005 00000 n -0000405116 00000 n -0000405231 00000 n -0000405375 00000 n -0000405583 00000 n -0000405717 00000 n -0000405871 00000 n -0000405996 00000 n -0000406127 00000 n -0000406260 00000 n -0000406391 00000 n -0000406566 00000 n -0000406701 00000 n -0000406854 00000 n -0000406999 00000 n -0000407224 00000 n -0000407335 00000 n -0000407450 00000 n +0000091511 00000 n +0000091605 00000 n +0000091691 00000 n +0000091732 00000 n +0000091775 00000 n +0000091861 00000 n +0000091909 00000 n +0000091996 00000 n +0000092037 00000 n +0000092124 00000 n +0000092168 00000 n +0000092255 00000 n +0000092299 00000 n +0000092385 00000 n +0000092442 00000 n +0000092488 00000 n +0000092575 00000 n +0000092621 00000 n +0000092708 00000 n +0000092741 00000 n +0000092790 00000 n +0000092877 00000 n +0000092931 00000 n +0000093018 00000 n +0000093069 00000 n +0000093156 00000 n +0000093207 00000 n +0000093293 00000 n +0000093347 00000 n +0000093434 00000 n +0000093484 00000 n +0000093569 00000 n +0000093634 00000 n +0000093684 00000 n +0000093771 00000 n +0000093821 00000 n +0000093907 00000 n +0000093971 00000 n +0000094058 00000 n +0000094099 00000 n +0000094161 00000 n +0000094248 00000 n +0000094273 00000 n +0000094322 00000 n +0000094409 00000 n +0000094434 00000 n +0000094482 00000 n +0000094567 00000 n +0000094592 00000 n +0000094642 00000 n +0000094728 00000 n +0000094772 00000 n +0000094858 00000 n +0000094902 00000 n +0000094988 00000 n +0000095038 00000 n +0000095124 00000 n +0000095174 00000 n +0000095260 00000 n +0000095309 00000 n +0000095395 00000 n +0000095442 00000 n +0000095528 00000 n +0000095601 00000 n +0000095690 00000 n +0000095776 00000 n +0000095839 00000 n +0000095925 00000 n +0000095958 00000 n +0000096019 00000 n +0000096105 00000 n +0000096130 00000 n +0000096193 00000 n +0000096280 00000 n +0000096343 00000 n +0000096430 00000 n +0000096484 00000 n +0000096571 00000 n +0000096612 00000 n +0000096715 00000 n +0000096819 00000 n +0000096923 00000 n +0000097027 00000 n +0000097131 00000 n +0000097234 00000 n +0000097338 00000 n +0000097442 00000 n +0000097546 00000 n +0000097650 00000 n +0000097754 00000 n +0000097858 00000 n +0000097962 00000 n +0000098066 00000 n +0000098171 00000 n +0000098276 00000 n +0000098381 00000 n +0000098486 00000 n +0000098591 00000 n +0000098695 00000 n +0000098800 00000 n +0000098905 00000 n +0000099010 00000 n +0000099115 00000 n +0000099220 00000 n +0000099325 00000 n +0000099429 00000 n +0000099534 00000 n +0000099639 00000 n +0000099744 00000 n +0000099849 00000 n +0000099954 00000 n +0000100059 00000 n +0000100164 00000 n +0000100269 00000 n +0000100374 00000 n +0000100479 00000 n +0000100584 00000 n +0000100689 00000 n +0000100794 00000 n +0000100899 00000 n +0000101004 00000 n +0000101386 00000 n +0000101442 00000 n +0000101530 00000 n +0000101599 00000 n +0000101687 00000 n +0000101763 00000 n +0000101852 00000 n +0000101923 00000 n +0000102011 00000 n +0000102091 00000 n +0000102180 00000 n +0000102243 00000 n +0000102326 00000 n +0000102414 00000 n +0000102490 00000 n +0000102579 00000 n +0000102653 00000 n +0000102742 00000 n +0000102821 00000 n +0000102910 00000 n +0000102964 00000 n +0000103013 00000 n +0000103102 00000 n +0000103129 00000 n +0000103178 00000 n +0000103267 00000 n +0000103294 00000 n +0000103343 00000 n +0000103432 00000 n +0000103497 00000 n +0000103586 00000 n +0000103642 00000 n +0000103731 00000 n +0000103779 00000 n +0000103868 00000 n +0000103922 00000 n +0000103977 00000 n +0000104066 00000 n +0000104121 00000 n +0000104210 00000 n +0000104246 00000 n +0000104282 00000 n +0000104318 00000 n +0000109465 00000 n +0000109510 00000 n +0000109555 00000 n +0000109600 00000 n +0000109645 00000 n +0000109690 00000 n +0000109735 00000 n +0000109780 00000 n +0000109825 00000 n +0000109870 00000 n +0000109915 00000 n +0000109960 00000 n +0000110005 00000 n +0000110050 00000 n +0000110095 00000 n +0000110140 00000 n +0000110185 00000 n +0000110230 00000 n +0000110275 00000 n +0000110320 00000 n +0000110365 00000 n +0000110410 00000 n +0000110455 00000 n +0000110500 00000 n +0000110545 00000 n +0000110590 00000 n +0000110635 00000 n +0000110680 00000 n +0000110725 00000 n +0000110770 00000 n +0000110815 00000 n +0000110860 00000 n +0000110905 00000 n +0000110950 00000 n +0000110995 00000 n +0000111040 00000 n +0000111085 00000 n +0000111130 00000 n +0000111175 00000 n +0000111220 00000 n +0000111265 00000 n +0000111310 00000 n +0000111355 00000 n +0000111400 00000 n +0000111445 00000 n +0000111490 00000 n +0000111535 00000 n +0000111580 00000 n +0000111625 00000 n +0000111670 00000 n +0000111715 00000 n +0000111760 00000 n +0000111805 00000 n +0000111850 00000 n +0000111895 00000 n +0000111940 00000 n +0000111985 00000 n +0000112030 00000 n +0000112075 00000 n +0000112120 00000 n +0000112165 00000 n +0000112210 00000 n +0000112255 00000 n +0000112300 00000 n +0000112345 00000 n +0000112390 00000 n +0000112435 00000 n +0000112480 00000 n +0000112525 00000 n +0000112570 00000 n +0000112615 00000 n +0000112660 00000 n +0000112705 00000 n +0000112750 00000 n +0000112795 00000 n +0000112840 00000 n +0000112885 00000 n +0000112930 00000 n +0000112975 00000 n +0000113020 00000 n +0000113065 00000 n +0000113110 00000 n +0000113155 00000 n +0000113200 00000 n +0000113245 00000 n +0000113290 00000 n +0000113335 00000 n +0000113380 00000 n +0000113425 00000 n +0000113470 00000 n +0000113515 00000 n +0000113560 00000 n +0000113605 00000 n +0000113650 00000 n +0000113695 00000 n +0000113740 00000 n +0000113785 00000 n +0000113830 00000 n +0000113875 00000 n +0000113920 00000 n +0000113965 00000 n +0000114010 00000 n +0000114055 00000 n +0000114100 00000 n +0000114145 00000 n +0000114190 00000 n +0000114235 00000 n +0000114280 00000 n +0000114325 00000 n +0000114370 00000 n +0000114415 00000 n +0000114460 00000 n +0000114505 00000 n +0000114550 00000 n +0000114595 00000 n +0000114640 00000 n +0000114685 00000 n +0000114730 00000 n +0000114775 00000 n +0000114820 00000 n +0000114865 00000 n +0000114910 00000 n +0000114955 00000 n +0000115000 00000 n +0000115045 00000 n +0000115090 00000 n +0000115135 00000 n +0000115180 00000 n +0000115225 00000 n +0000115270 00000 n +0000115315 00000 n +0000115360 00000 n +0000115405 00000 n +0000115450 00000 n +0000115495 00000 n +0000115540 00000 n +0000115585 00000 n +0000115630 00000 n +0000115675 00000 n +0000115720 00000 n +0000115765 00000 n +0000115810 00000 n +0000115855 00000 n +0000115900 00000 n +0000115945 00000 n +0000115990 00000 n +0000116035 00000 n +0000116080 00000 n +0000116125 00000 n +0000116170 00000 n +0000116215 00000 n +0000116260 00000 n +0000116305 00000 n +0000116350 00000 n +0000116395 00000 n +0000116440 00000 n +0000116485 00000 n +0000116530 00000 n +0000116575 00000 n +0000116620 00000 n +0000116665 00000 n +0000116710 00000 n +0000116755 00000 n +0000116800 00000 n +0000116845 00000 n +0000116890 00000 n +0000116935 00000 n +0000116980 00000 n +0000117025 00000 n +0000117070 00000 n +0000117115 00000 n +0000117160 00000 n +0000117205 00000 n +0000117250 00000 n +0000117295 00000 n +0000117340 00000 n +0000117385 00000 n +0000117430 00000 n +0000117475 00000 n +0000117520 00000 n +0000117565 00000 n +0000117610 00000 n +0000117655 00000 n +0000117700 00000 n +0000117745 00000 n +0000117790 00000 n +0000117835 00000 n +0000117880 00000 n +0000117925 00000 n +0000117970 00000 n +0000118015 00000 n +0000118060 00000 n +0000118105 00000 n +0000118150 00000 n +0000118195 00000 n +0000118240 00000 n +0000118285 00000 n +0000118330 00000 n +0000118375 00000 n +0000118420 00000 n +0000118465 00000 n +0000118510 00000 n +0000118555 00000 n +0000118600 00000 n +0000118645 00000 n +0000118690 00000 n +0000118735 00000 n +0000118780 00000 n +0000118825 00000 n +0000118870 00000 n +0000118915 00000 n +0000118960 00000 n +0000119005 00000 n +0000119050 00000 n +0000119095 00000 n +0000119140 00000 n +0000119185 00000 n +0000119230 00000 n +0000119275 00000 n +0000119320 00000 n +0000119365 00000 n +0000119410 00000 n +0000119455 00000 n +0000119500 00000 n +0000119545 00000 n +0000119590 00000 n +0000119635 00000 n +0000119680 00000 n +0000119725 00000 n +0000119770 00000 n +0000119815 00000 n +0000119860 00000 n +0000119905 00000 n +0000119950 00000 n +0000119995 00000 n +0000120040 00000 n +0000120085 00000 n +0000120130 00000 n +0000120175 00000 n +0000120220 00000 n +0000120265 00000 n +0000120310 00000 n +0000120355 00000 n +0000120400 00000 n +0000120445 00000 n +0000120490 00000 n +0000120535 00000 n +0000120580 00000 n +0000120625 00000 n +0000120670 00000 n +0000120715 00000 n +0000120760 00000 n +0000120805 00000 n +0000120850 00000 n +0000120895 00000 n +0000120940 00000 n +0000120985 00000 n +0000121030 00000 n +0000121075 00000 n +0000121120 00000 n +0000121165 00000 n +0000121210 00000 n +0000121255 00000 n +0000121300 00000 n +0000121345 00000 n +0000121390 00000 n +0000121435 00000 n +0000121480 00000 n +0000121525 00000 n +0000121570 00000 n +0000121615 00000 n +0000121660 00000 n +0000121705 00000 n +0000121750 00000 n +0000121795 00000 n +0000121840 00000 n +0000121885 00000 n +0000121930 00000 n +0000121975 00000 n +0000122020 00000 n +0000122065 00000 n +0000122110 00000 n +0000122155 00000 n +0000122200 00000 n +0000122245 00000 n +0000122290 00000 n +0000122335 00000 n +0000122380 00000 n +0000122425 00000 n +0000122470 00000 n +0000122515 00000 n +0000122560 00000 n +0000122605 00000 n +0000122650 00000 n +0000122695 00000 n +0000122740 00000 n +0000122785 00000 n +0000122830 00000 n +0000122875 00000 n +0000122920 00000 n +0000122965 00000 n +0000124382 00000 n +0000124543 00000 n +0000124712 00000 n +0000124905 00000 n +0000128845 00000 n +0000129039 00000 n +0000133591 00000 n +0000133785 00000 n +0000138337 00000 n +0000138531 00000 n +0000142593 00000 n +0000142787 00000 n +0000146401 00000 n +0000146595 00000 n +0000150431 00000 n +0000150625 00000 n +0000151714 00000 n +0000151875 00000 n +0000152109 00000 n +0000152313 00000 n +0000155026 00000 n +0000155201 00000 n +0000158846 00000 n +0000159021 00000 n +0000161306 00000 n +0000161481 00000 n +0000162406 00000 n +0000162567 00000 n +0000162755 00000 n +0000162959 00000 n +0000165774 00000 n +0000165949 00000 n +0000166560 00000 n +0000166772 00000 n +0000167933 00000 n +0000168121 00000 n +0000169583 00000 n +0000169780 00000 n +0000171150 00000 n +0000171365 00000 n +0000172601 00000 n +0000172795 00000 n +0000174374 00000 n +0000174544 00000 n +0000176360 00000 n +0000176511 00000 n +0000176752 00000 n +0000176931 00000 n +0000178637 00000 n +0000178825 00000 n +0000180580 00000 n +0000180768 00000 n +0000182419 00000 n +0000182588 00000 n +0000183308 00000 n +0000183537 00000 n +0000185315 00000 n +0000185521 00000 n +0000187106 00000 n +0000187319 00000 n +0000189112 00000 n +0000189334 00000 n +0000191497 00000 n +0000191700 00000 n +0000193251 00000 n +0000193464 00000 n +0000194891 00000 n +0000195113 00000 n +0000196884 00000 n +0000197106 00000 n +0000198986 00000 n +0000199192 00000 n +0000200390 00000 n +0000200610 00000 n +0000202128 00000 n +0000202316 00000 n +0000203434 00000 n +0000203595 00000 n +0000203785 00000 n +0000203989 00000 n +0000207035 00000 n +0000207205 00000 n +0000209164 00000 n +0000209324 00000 n +0000210004 00000 n +0000210249 00000 n +0000212043 00000 n +0000212256 00000 n +0000213758 00000 n +0000213980 00000 n +0000215808 00000 n +0000216061 00000 n +0000217745 00000 n +0000217952 00000 n +0000219645 00000 n +0000219861 00000 n +0000221794 00000 n +0000222016 00000 n +0000224029 00000 n +0000224241 00000 n +0000226327 00000 n +0000226530 00000 n +0000228794 00000 n +0000229048 00000 n +0000231276 00000 n +0000231506 00000 n +0000233547 00000 n +0000233778 00000 n +0000235351 00000 n +0000235562 00000 n +0000237584 00000 n +0000237804 00000 n +0000239854 00000 n +0000240096 00000 n +0000242032 00000 n +0000242261 00000 n +0000243981 00000 n +0000244141 00000 n +0000245133 00000 n +0000245327 00000 n +0000246906 00000 n +0000247086 00000 n +0000248827 00000 n +0000249016 00000 n +0000250217 00000 n +0000250396 00000 n +0000251485 00000 n +0000251682 00000 n +0000253053 00000 n +0000253232 00000 n +0000253957 00000 n +0000254187 00000 n +0000255664 00000 n +0000255867 00000 n +0000257676 00000 n +0000257860 00000 n +0000258395 00000 n +0000258556 00000 n +0000258747 00000 n +0000258960 00000 n +0000261909 00000 n +0000262084 00000 n +0000264566 00000 n +0000264741 00000 n +0000266021 00000 n +0000266219 00000 n +0000267581 00000 n +0000267779 00000 n +0000269465 00000 n +0000269653 00000 n +0000271334 00000 n +0000271513 00000 n +0000273615 00000 n +0000273794 00000 n +0000275567 00000 n +0000275746 00000 n +0000277427 00000 n +0000277615 00000 n +0000279468 00000 n +0000279680 00000 n +0000281715 00000 n +0000281928 00000 n +0000283479 00000 n +0000283668 00000 n +0000284942 00000 n +0000285148 00000 n +0000286922 00000 n +0000287119 00000 n +0000288881 00000 n +0000289093 00000 n +0000290796 00000 n +0000290998 00000 n +0000292377 00000 n +0000292565 00000 n +0000293456 00000 n +0000293644 00000 n +0000295169 00000 n +0000295372 00000 n +0000297081 00000 n +0000297284 00000 n +0000298101 00000 n +0000298313 00000 n +0000299791 00000 n +0000299971 00000 n +0000300733 00000 n +0000300996 00000 n +0000302719 00000 n +0000302964 00000 n +0000304855 00000 n +0000305077 00000 n +0000306871 00000 n +0000307093 00000 n +0000308972 00000 n +0000309151 00000 n +0000310374 00000 n +0000310605 00000 n +0000312271 00000 n +0000312450 00000 n +0000314031 00000 n +0000314210 00000 n +0000315757 00000 n +0000315936 00000 n +0000317439 00000 n +0000317618 00000 n +0000319284 00000 n +0000319454 00000 n +0000320199 00000 n +0000320388 00000 n +0000322081 00000 n +0000322260 00000 n +0000324005 00000 n +0000324193 00000 n +0000326028 00000 n +0000326222 00000 n +0000328079 00000 n +0000328310 00000 n +0000330425 00000 n +0000330637 00000 n +0000332073 00000 n +0000332285 00000 n +0000333649 00000 n +0000333855 00000 n +0000335128 00000 n +0000335307 00000 n +0000336327 00000 n +0000336515 00000 n +0000337983 00000 n +0000338171 00000 n +0000339570 00000 n +0000339739 00000 n +0000340573 00000 n +0000340753 00000 n +0000341814 00000 n +0000341984 00000 n +0000343662 00000 n +0000343841 00000 n +0000345654 00000 n +0000345823 00000 n +0000347662 00000 n +0000347831 00000 n +0000348819 00000 n +0000348998 00000 n +0000350645 00000 n +0000350833 00000 n +0000352324 00000 n +0000352512 00000 n +0000353934 00000 n +0000354104 00000 n +0000355770 00000 n +0000355940 00000 n +0000356497 00000 n +0000356694 00000 n +0000357906 00000 n +0000358109 00000 n +0000359454 00000 n +0000359639 00000 n +0000360115 00000 n +0000360318 00000 n +0000361851 00000 n +0000362029 00000 n +0000362697 00000 n +0000362885 00000 n +0000364373 00000 n +0000364543 00000 n +0000366050 00000 n +0000366220 00000 n +0000367617 00000 n +0000367787 00000 n +0000369337 00000 n +0000369506 00000 n +0000370469 00000 n +0000370690 00000 n +0000372308 00000 n +0000372551 00000 n +0000374120 00000 n +0000374290 00000 n +0000375365 00000 n +0000375561 00000 n +0000377747 00000 n +0000377926 00000 n +0000379453 00000 n +0000379641 00000 n +0000380609 00000 n +0000380805 00000 n +0000382535 00000 n +0000382748 00000 n +0000384429 00000 n +0000384624 00000 n +0000386375 00000 n +0000386588 00000 n +0000387853 00000 n +0000388057 00000 n +0000389795 00000 n +0000389983 00000 n +0000391726 00000 n +0000391905 00000 n +0000393304 00000 n +0000393483 00000 n +0000395181 00000 n +0000395360 00000 n +0000396842 00000 n +0000397021 00000 n +0000398807 00000 n +0000399011 00000 n +0000400662 00000 n +0000400721 00000 n +0000400824 00000 n +0000400989 00000 n +0000401071 00000 n +0000401179 00000 n +0000401302 00000 n +0000401414 00000 n +0000401593 00000 n +0000401702 00000 n +0000401828 00000 n +0000401955 00000 n +0000402094 00000 n +0000402234 00000 n +0000402403 00000 n +0000402520 00000 n +0000402649 00000 n +0000402801 00000 n +0000402941 00000 n +0000403119 00000 n +0000403275 00000 n +0000403388 00000 n +0000403505 00000 n +0000403640 00000 n +0000403781 00000 n +0000403896 00000 n +0000404007 00000 n +0000404216 00000 n +0000404317 00000 n +0000404460 00000 n +0000404606 00000 n +0000404722 00000 n +0000404889 00000 n +0000405001 00000 n +0000405175 00000 n +0000405278 00000 n +0000405451 00000 n +0000405572 00000 n +0000405702 00000 n +0000405828 00000 n +0000405943 00000 n +0000406051 00000 n +0000406198 00000 n +0000406303 00000 n +0000406422 00000 n +0000406551 00000 n +0000406710 00000 n +0000406844 00000 n +0000406981 00000 n +0000407113 00000 n +0000407262 00000 n +0000407394 00000 n +0000407542 00000 n 0000407643 00000 n -0000407786 00000 n -0000407902 00000 n -0000408047 00000 n -0000408204 00000 n -0000408321 00000 n -0000408498 00000 n -0000408632 00000 n -0000408780 00000 n -0000408898 00000 n -0000409028 00000 n -0000409198 00000 n -0000409292 00000 n -0000409419 00000 n -0000409546 00000 n -0000409642 00000 n -0000409819 00000 n -0000409945 00000 n -0000410080 00000 n -0000410213 00000 n -0000410340 00000 n -0000410452 00000 n -0000410644 00000 n -0000410742 00000 n -0000410928 00000 n -0000411032 00000 n -0000411156 00000 n -0000411278 00000 n -0000411390 00000 n -0000411586 00000 n -0000411702 00000 n -0000411826 00000 n -0000411944 00000 n -0000412062 00000 n -0000412167 00000 n -0000412356 00000 n -0000412579 00000 n -0000412718 00000 n -0000412881 00000 n -0000413018 00000 n -0000413121 00000 n -0000413327 00000 n -0000413486 00000 n -0000413634 00000 n -0000413762 00000 n -0000413943 00000 n -0000414053 00000 n -0000414168 00000 n -0000414313 00000 n -0000414477 00000 n -0000414627 00000 n -0000414845 00000 n -0000414950 00000 n -0000415082 00000 n -0000415203 00000 n -0000415410 00000 n -0000415538 00000 n -0000415623 00000 n -0000415789 00000 n -0000415893 00000 n -0000416050 00000 n -0000416161 00000 n -0000416306 00000 n -0000416448 00000 n -0000416598 00000 n -0000416715 00000 n -0000416879 00000 n -0000416990 00000 n -0000417130 00000 n -0000417257 00000 n -0000417374 00000 n -0000417513 00000 n -0000417619 00000 n -0000417753 00000 n -0000417885 00000 n -0000418030 00000 n -0000418157 00000 n -0000418289 00000 n -0000418419 00000 n -0000418544 00000 n -0000418652 00000 n -0000418817 00000 n -0000418921 00000 n -0000419057 00000 n -0000419263 00000 n -0000419363 00000 n -0000419481 00000 n -0000419646 00000 n -0000419737 00000 n -0000419898 00000 n -0000420024 00000 n +0000407771 00000 n +0000407889 00000 n +0000408043 00000 n +0000408174 00000 n +0000408320 00000 n +0000408421 00000 n +0000408519 00000 n +0000408643 00000 n +0000408755 00000 n +0000408927 00000 n +0000409125 00000 n +0000409236 00000 n +0000409351 00000 n +0000409495 00000 n +0000409703 00000 n +0000409837 00000 n +0000409991 00000 n +0000410116 00000 n +0000410247 00000 n +0000410380 00000 n +0000410511 00000 n +0000410686 00000 n +0000410821 00000 n +0000410974 00000 n +0000411119 00000 n +0000411344 00000 n +0000411455 00000 n +0000411570 00000 n +0000411763 00000 n +0000411906 00000 n +0000412022 00000 n +0000412180 00000 n +0000412337 00000 n +0000412468 00000 n +0000412589 00000 n +0000412766 00000 n +0000412900 00000 n +0000413048 00000 n +0000413166 00000 n +0000413296 00000 n +0000413466 00000 n +0000413560 00000 n +0000413687 00000 n +0000413814 00000 n +0000413910 00000 n +0000414096 00000 n +0000414222 00000 n +0000414357 00000 n +0000414490 00000 n +0000414617 00000 n +0000414729 00000 n +0000414920 00000 n +0000415017 00000 n +0000415202 00000 n +0000415305 00000 n +0000415428 00000 n +0000415549 00000 n +0000415660 00000 n +0000415855 00000 n +0000415970 00000 n +0000416093 00000 n +0000416210 00000 n +0000416327 00000 n +0000416431 00000 n +0000416619 00000 n +0000416841 00000 n +0000416979 00000 n +0000417141 00000 n +0000417277 00000 n +0000417379 00000 n +0000417585 00000 n +0000417744 00000 n +0000417892 00000 n +0000418020 00000 n +0000418201 00000 n +0000418311 00000 n +0000418426 00000 n +0000418571 00000 n +0000418735 00000 n +0000418885 00000 n +0000419103 00000 n +0000419208 00000 n +0000419340 00000 n +0000419461 00000 n +0000419668 00000 n +0000419796 00000 n +0000419881 00000 n +0000420047 00000 n 0000420151 00000 n -0000420291 00000 n -0000420427 00000 n -0000420535 00000 n -0000420709 00000 n -0000420815 00000 n -0000420935 00000 n -0000421047 00000 n -0000421164 00000 n -0000421266 00000 n -0000421435 00000 n -0000421535 00000 n -0000421652 00000 n -0000421805 00000 n -0000421935 00000 n -0000422102 00000 n -0000422202 00000 n -0000422299 00000 n -0000422519 00000 n -0000422618 00000 n -0000422736 00000 n -0000422864 00000 n -0000423022 00000 n -0000423193 00000 n -0000423309 00000 n -0000423420 00000 n -0000423556 00000 n -0000423687 00000 n -0000423835 00000 n -0000423980 00000 n -0000424081 00000 n -0000424269 00000 n -0000424373 00000 n -0000424526 00000 n -0000424637 00000 n -0000424745 00000 n -0000424876 00000 n -0000425051 00000 n -0000425154 00000 n -0000425305 00000 n -0000425407 00000 n -0000425529 00000 n -0000425661 00000 n -0000425781 00000 n -0000425896 00000 n -0000426010 00000 n -0000426123 00000 n -0000426240 00000 n -0000426355 00000 n -0000426471 00000 n -0000426586 00000 n -0000426702 00000 n -0000426824 00000 n -0000426945 00000 n -0000427064 00000 n -0000427182 00000 n -0000427302 00000 n -0000427405 00000 n -0000427519 00000 n -0000427680 00000 n -0000427776 00000 n -0000427890 00000 n -0000428000 00000 n -0000428117 00000 n -0000428295 00000 n -0000428405 00000 n -0000428559 00000 n -0000428728 00000 n -0000428916 00000 n -0000429097 00000 n -0000429253 00000 n -0000429419 00000 n -0000429551 00000 n -0000429698 00000 n -0000429837 00000 n -0000429957 00000 n -0000430078 00000 n -0000430197 00000 n -0000430361 00000 n -0000430465 00000 n -0000430583 00000 n -0000430701 00000 n -0000430822 00000 n -0000430958 00000 n -0000431057 00000 n -0000431221 00000 n -0000431325 00000 n -0000431442 00000 n -0000431592 00000 n -0000431692 00000 n -0000431806 00000 n -0000431920 00000 n -0000432034 00000 n -0000432148 00000 n -0000432262 00000 n -0000432376 00000 n -0000432490 00000 n -0000432604 00000 n -0000432720 00000 n -0000432822 00000 n -0000432936 00000 n +0000420308 00000 n +0000420419 00000 n +0000420564 00000 n +0000420706 00000 n +0000420856 00000 n +0000420973 00000 n +0000421137 00000 n +0000421248 00000 n +0000421388 00000 n +0000421515 00000 n +0000421632 00000 n +0000421771 00000 n +0000421877 00000 n +0000422011 00000 n +0000422143 00000 n +0000422288 00000 n +0000422415 00000 n +0000422547 00000 n +0000422677 00000 n +0000422802 00000 n +0000422910 00000 n +0000423116 00000 n +0000423216 00000 n +0000423334 00000 n +0000423499 00000 n +0000423590 00000 n +0000423751 00000 n +0000423877 00000 n +0000424020 00000 n +0000424147 00000 n +0000424287 00000 n +0000424423 00000 n +0000424531 00000 n +0000424705 00000 n +0000424811 00000 n +0000424931 00000 n +0000425043 00000 n +0000425160 00000 n +0000425262 00000 n +0000425439 00000 n +0000425551 00000 n +0000425682 00000 n +0000425806 00000 n +0000425973 00000 n +0000426090 00000 n +0000426220 00000 n +0000426360 00000 n +0000426497 00000 n +0000426633 00000 n +0000426769 00000 n +0000426906 00000 n +0000427018 00000 n +0000427189 00000 n +0000427311 00000 n +0000427471 00000 n +0000427570 00000 n +0000427685 00000 n +0000427787 00000 n +0000427948 00000 n +0000428052 00000 n +0000428151 00000 n +0000428333 00000 n +0000428437 00000 n +0000428590 00000 n +0000428701 00000 n +0000428809 00000 n +0000428940 00000 n +0000429115 00000 n +0000429218 00000 n +0000429338 00000 n +0000429453 00000 n +0000429567 00000 n +0000429682 00000 n +0000429796 00000 n +0000429911 00000 n +0000430029 00000 n +0000430146 00000 n +0000430252 00000 n +0000430425 00000 n +0000430528 00000 n +0000430684 00000 n +0000430792 00000 n +0000430918 00000 n +0000431038 00000 n +0000431139 00000 n +0000431246 00000 n +0000431360 00000 n +0000431521 00000 n +0000431617 00000 n +0000431731 00000 n +0000431841 00000 n +0000431958 00000 n +0000432136 00000 n +0000432246 00000 n +0000432400 00000 n +0000432569 00000 n +0000432757 00000 n +0000432938 00000 n +0000433094 00000 n +0000433260 00000 n +0000433392 00000 n +0000433539 00000 n +0000433678 00000 n +0000433798 00000 n +0000433919 00000 n +0000434038 00000 n +0000434202 00000 n +0000434306 00000 n +0000434424 00000 n +0000434542 00000 n +0000434663 00000 n +0000434799 00000 n +0000434898 00000 n +0000435062 00000 n +0000435166 00000 n +0000435283 00000 n +0000435433 00000 n +0000435533 00000 n +0000435647 00000 n +0000435761 00000 n +0000435875 00000 n +0000435989 00000 n +0000436103 00000 n +0000436217 00000 n +0000436331 00000 n +0000436445 00000 n +0000436561 00000 n +0000436663 00000 n +0000436777 00000 n trailer -<]>> +<<116c97ced400123fda9c473dd7e06727>]>> startxref -433845 +437645 %%EOF diff --git a/docs/announce b/docs/announce index f5716556ba..7310bdd737 100644 --- a/docs/announce +++ b/docs/announce @@ -1,3 +1,6 @@ +This document is out of date + + Announcing Samba version 2.2 ============================ diff --git a/docs/faq/samba-faq.html b/docs/faq/samba-faq.html index f6a9d83128..50037e1e1e 100644 --- a/docs/faq/samba-faq.html +++ b/docs/faq/samba-faq.html @@ -5,10 +5,10 @@ >Samba FAQ

1. General Information
1.1. Where can I get it?
1.2. What do the version numbers mean?
1.3. What platforms are supported?
1.4. How do I subscribe to the Samba Mailing Lists?
1.5. Pizza supply details
2. Compiling and installing Samba on a Unix host
2.1. I can't see the Samba server in any browse lists!
2.2. Some files that I KNOW are on the server doesn't show up when I view the files from my client!Some files that I KNOW are on the server don't show up when I view the files from my client!
2.3. Some files on the server show up with really wierd filenames when I view the files from my client!
2.4. My client reports "cannot locate specified computer" or similar
2.5. My client reports "cannot locate specified share name" or similar
2.6. Printing doesn't work
2.7. My client reports "This server is not configured to list shared resources"
2.8. Log message "you appear to have a trapdoor uid system"
2.9. Why are my file's timestamps off by an hour, or by a few hours?
2.10. How do I set the printer driver name correctly?
3. Configuration problems
3.1. I have set 'force user' and samba still makes 'root' the owner of all the files I touch!
4. Specific client application problems
4.1. MS Office Setup reports "Cannot change properties of '\MSOFFICE\SETUP.INI'"MS Office Setup reports "Cannot change properties of '\\MSOFFICE\\SETUP.INI'"
4.2. How to use a Samba share as an administrative share for MS Office, etc.
4.3. Microsoft Access database opening errors
5. Common errors
5.1. Not listening for calling name
5.2. System Error 1240
5.3. smbclient ignores -N !
5.4. The data on the CD-Drive I've shared seems to be corrupted!
5.5. Why can users access home directories of other users?
5.6. Until a few minutes after samba has started, clients get the error "Domain Controller Unavailable"
5.7. I'm getting "open_oplock_ipc: Failed to get local UDP socket for address 100007f. Error was Cannot assign requested" in the logs
6. Features
6.1. How can I prevent my samba server from being used to distribute the Nimda worm?
6.2. How can I use samba as a fax server?
6.2.1. Tools for printing faxes
6.2.2. Making the fax-server
6.2.3. Installing the client drivers
6.2.4. Example smb.conf
6.3. Samba doesn't work well together with DHCP!
6.4. How can I assign NetBIOS names to clients with DHCP?
6.5. How do I convert between unix and dos text formats?
6.6. Does samba have wins replication support?
NextSAMBA Developers Guide
10.4. ChangeID & Client Caching of Printer InformationChangeID and Client Caching of Printer Information
10.5. The smbpasswd file>The smbpasswd file
14. RPC Pluggable Modules
14.1. About
14.2. General Overview

This is a short document that describes some of the issues that confront a SMB implementation on unix, and how Samba copes with -them. They may help people who are looking at unix<->PC +them. They may help people who are looking at unix<->PC interoperability.

It was written to help out a person who was writing a paper on unix to @@ -2881,14 +2900,14 @@ example, if I'm using a csh style shell:

strace -f -p 3872 >& strace.outstrace -f -p 3872 >& strace.out

or with a sh style shell:

strace -f -p 3872 > strace.out 2>&1strace -f -p 3872 > strace.out 2>&1

Note the "-f" option. This is only available on some systems, and @@ -6985,7 +7004,7 @@ CLASS="emphasis" >Note: mailslots will contain a response mailslot, to which the response - should be sent. the target NetBIOS name is REQUEST_NAME<20>, where + should be sent. the target NetBIOS name is REQUEST_NAME<20>, where REQUEST_NAME is the name of the machine that sent the request.

9.7.2. Protocol

C->S ReqChal,Cc S->C Cs

C->S ReqChal,Cc S->C Cs

C & S compute session key Ks = E(PW[9..15],E(PW[0..6],Add(Cc,Cs)))

C & S compute session key Ks = E(PW[9..15],E(PW[0..6],Add(Cc,Cs)))

C: Rc = Cred(Ks,Cc) C->S Authenticate,Rc S: Rs = Cred(Ks,Cs), -assert(Rc == Cred(Ks,Cc)) S->C Rs C: assert(Rs == Cred(Ks,Cs))

On joining the domain the client will optionally attempt to change its password and the domain controller may refuse to update it depending on registry settings. This will also occur weekly afterwards.

C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S ServerPasswordSet,Rc',Tc, +>C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S ServerPasswordSet,Rc',Tc, arc4(Ks[0..7,16],lmowf(randompassword()) C: Rc = Cred(Ks,Rc+Tc+1) S: assert(Rc' == Cred(Ks,Rc+Tc)), Ts = Time() S: Rs' = Cred(Ks,Rs+Tc+1) S->C Rs',Ts C: assert(Rs' == Cred(Ks,Rs+Tc+1)) S: Rs = Rs'

User: U with password P wishes to login to the domain (incidental data such as workstation and domain omitted)

C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S NetLogonSamLogon,Rc',Tc,U, +>C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S NetLogonSamLogon,Rc',Tc,U, arc4(Ks[0..7,16],16,ntowf(P),16), arc4(Ks[0..7,16],16,lmowf(P),16) S: assert(Rc' == Cred(Ks,Rc+Tc)) assert(passwords match those in SAM) S: Ts = Time()

10.4. ChangeID & Client Caching of Printer Information10.4. ChangeID and Client Caching of Printer Information

[To be filled in later]

For example, when you call

<
-NTSTATUS sam_get_account_by_name(const SAM_CONTEXT *context, const
+>NTSTATUS sam_get_account_by_name(const SAM_CONTEXT *context, const
 NT_USER_TOKEN *access_token, uint32 access_desired, const char *domain,
 const char *name, SAM_ACCOUNT_HANDLE **account)

13.3. The smbpasswd file>The smbpasswd file

In order for Samba to participate in the above protocol it must be able to look up the 16 byte hashed values given a user name. @@ -9131,7 +9149,7 @@ CLASS="FILENAME" CLASS="FILENAME" >/etc/passwd file use the following command :

file use the following command:

file.


Chapter 14. RPC Pluggable Modules

14.1. About

This document describes how to make use the new RPC Pluggable Modules features +of Samba 3.0. This architecture was added to increase the maintainability of +Samba allowing RPC Pipes to be worked on separately from the main CVS branch. +The RPM architecture will also allow third-party vendors to add functionality +to Samba through plug-ins.


14.2. General Overview

When an RPC call is sent to smbd, smbd tries to load a shared library by the +name librpc_<pipename>.so to handle the call if +it doesn't know how to handle the call internally. For instance, LSA calls +are handled by librpc_lsass.so.. +These shared libraries should be located in the <sambaroot>/lib/rpc. smbd then attempts to call the rpc_pipe_init function within +the shared library.

In the rpc_pipe_init function, the library should call +rpc_pipe_register_commands(). This function takes the following arguments:

int rpc_pipe_register_commands(const char *clnt, const char *srv,
+                               const struct api_struct *cmds, int size);

clnt

the Client name of the named pipe

srv

the Server name of the named pipe

cmds

a list of api_structs that map RPC ordinal numbers to function calls

size

the number of api_structs contained in cmds

See rpc_server/srv_reg.c and rpc_server/srv_reg_nt.c for a small example of +how to use this library.

SAMBA Project DocumentationLast Update : Thu Aug 15 12:48:45 CDT 2002

: Wed Jan 15

This book is a collection of HOWTOs added to Samba documentation over the years. I try to ensure that all are current, but sometimes the is a larger job @@ -59,6 +59,11 @@ on the "Documentation" page. Please send updates to jerry@samba.org or +jelmer@samba.org.

This documentation is distributed under the GNU General Public License (GPL) @@ -79,7 +84,7 @@ CLASS="TOC" >

I. General installation
1.1. Read the man pages
1.2. Building the Binaries
1.3. The all important step
1.4. Create the smb configuration file.
1.5. Test your config file with
1.6. Starting the smbd and nmbd
1.7. Try listing the shares available on your server
1.8. Try connecting with the unix client
1.9. Try connecting from a DOS, WfWg, Win9x, WinNT, Win2k, OS/2, etc... client
1.10. What If Things Don't Work?
2. Improved browsing in sambaQuick Cross Subnet Browsing / Cross Workgroup Browsing guide
2.1. Overview of browsingDiscussion
2.2. Browsing support in sambaUse of the "Remote Announce" parameter
2.3. Problem resolutionUse of the "Remote Browse Sync" parameter
2.4. Browsing across subnetsUse of WINS
2.5. Setting up a WINS serverDo NOT use more than one (1) protocol on MS Windows machines
2.6. Setting up Browsing in a WORKGROUP
2.7. Setting up Browsing in a DOMAIN
2.8. Forcing samba to be the master
2.9. Making samba the domain master
2.10. Note about broadcast addresses
2.11. Multiple interfacesName Resolution Order
3. OplocksUser information database
3.1. What are oplocks?
4. Quick Cross Subnet Browsing / Cross Workgroup Browsing guide
4.1. Discussion
4.2. Use of the "Remote Announce" parameter
4.3. Use of the "Remote Browse Sync" parameterIntroduction
4.4. Use of WINS3.2. Important Notes About Security
4.5. Do NOT use more than one (1) protocol on MS Windows machines3.3. The smbpasswd Command
4.6. Name Resolution Order3.4. Plain text
5. LanMan and NT Password Encryption in Samba3.5. TDB
5.1. Introduction3.6. LDAP
5.2. Important Notes About Security3.7. MySQL
5.3. The smbpasswd Command3.8. Passdb XML plugin
II. Type of installation
6. 4. User and Share security level (for servers not in a domain)
5. How to Configure Samba as a NT4 Primary Domain ControllerSamba as a NT4 or Win2k Primary Domain Controller
6.1. 5.1. Prerequisite Reading
6.2. 5.2. Background
6.3. 5.3. Configuring the Samba Domain Controller
6.4. 5.4. Creating Machine Trust Accounts and Joining Clients to the Domain
6.5. 5.5. Common Problems and Errors
6.6. 5.6. System Policies and Profiles
6.7. 5.7. What other help can I get?
6.8. 5.8. Domain Control for Windows 9x/ME
6.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba5.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba
7. 6. How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain
7.1. 6.1. Prerequisite Reading
7.2. 6.2. Background
7.3. 6.3. What qualifies a Domain Controller on the network?
7.4. Can Samba be a Backup Domain Controller?6.4. Can Samba be a Backup Domain Controller to an NT PDC?
7.5. 6.5. How do I set up a Samba BDC?
8. 7. Samba as a ADS domain member
8.1. 7.1. Installing the required packages for Debian
8.2. 7.2. Installing the required packages for RedHat
8.3. 7.3. Compile Samba
8.4. 7.4. Setup your /etc/krb5.conf
8.5. 7.5. Create the computer account
8.6. 7.6. Test your server setup
8.7. 7.7. Testing with smbclient
8.8. 7.8. Notes
9. 8. Samba as a NT4 domain memberSamba as a NT4 or Win2k domain member
9.1. Joining an NT Domain with Samba 2.28.1. Joining an NT Domain with Samba 3.0
9.2. 8.2. Samba and Windows 2000 Domains
9.3. 8.3. Why is this better than security = server?
III. Optional configuration
10. 9. Integrating MS Windows networks with Samba
10.1. 9.1. Agenda
10.2. 9.2. Name Resolution in a pure Unix/Linux world
10.3. 9.3. Name resolution as used within MS Windows networking
10.4. 9.4. How browsing functions and how to deploy stable and dependable browsing using Samba
10.5. 9.5. MS Windows security options and how to configure Samba for seemless integration
10.6. 9.6. Conclusions
11. 10. UNIX Permission Bits and Windows NT Access Control Lists
11.1. 10.1. Viewing and changing UNIX permissions using the NT security dialogs
11.2. 10.2. How to view file security on a Samba share
11.3. 10.3. Viewing file ownership
11.4. 10.4. Viewing file or directory permissions
11.5. 10.5. Modifying file or directory permissions
11.6. 10.6. Interaction with the standard Samba create mask parameters
11.7. 10.7. Interaction with the standard Samba file attribute mapping
12. 11. Configuring PAM for distributed but centrally managed authentication
12.1. 11.1. Samba and PAM
12.2. 11.2. Distributed Authentication
12.3. 11.3. PAM Configuration in smb.conf
13. 12. Hosting a Microsoft Distributed File System tree on Samba
13.1. 12.1. Instructions
14. 13. Printing Support
14.1. 13.1. Introduction
14.2. 13.2. Configuration
14.3. 13.3. The Imprints Toolset
14.4. 13.4. Diagnosis
15. Security levels
15.1. Introduction
15.2. More complete description of security levels
16. 14. Unified Logons between Windows NT and UNIX using Winbind
16.1. 14.1. Abstract
16.2. 14.2. Introduction
16.3. 14.3. What Winbind Provides
16.4. 14.4. How Winbind Works
16.5. 14.5. Installation and Configuration
16.6. 14.6. Limitations
16.7. 14.7. Conclusion
17. Passdb MySQL plugin15. Improved browsing in samba
17.1. Building
17.2. Configuring
17.3. Using plaintext passwords or encrypted password
17.4. Getting non-column data from the table15.1. Overview of browsing
18. Passdb XML plugin15.2. Browsing support in samba
18.1. Building15.3. Problem resolution
18.2. Usage15.4. Browsing across subnets
19. Storing Samba's User/Machine Account information in an LDAP Directory15.5. Setting up a WINS server
19.1. Purpose15.6. Setting up Browsing in a WORKGROUP
19.2. Introduction15.7. Setting up Browsing in a DOMAIN
19.3. Supported LDAP Servers15.8. Forcing samba to be the master
19.4. Schema and Relationship to the RFC 2307 posixAccount15.9. Making samba the domain master
19.5. Configuring Samba with LDAP15.10. Note about broadcast addresses
19.6. Accounts and Groups management15.11. Multiple interfaces
19.7. Security and sambaAccount16. Stackable VFS modules
19.8. LDAP specials attributes for sambaAccounts16.1. Introduction and configuration
19.9. Example LDIF Entries for a sambaAccount16.2. Included modules
19.10. Comments16.3. VFS modules available elsewhere
20. 17. HOWTO Access Samba source code via CVSAccess Samba source code via CVS
20.1. 17.1. Introduction
20.2. 17.2. CVS Access to samba.org
21. 18. Group mapping HOWTO
22. 19. Samba performance issues
22.1. 19.1. Comparisons
22.2. Oplocks
22.3. 19.2. Socket options
22.4. 19.3. Read size
22.5. 19.4. Max xmit
22.6. Locking
22.7. Share modes
22.8. 19.5. Log level
22.9. Wide lines
22.10. 19.6. Read raw
22.11. 19.7. Write raw
22.12. Read prediction19.8. Slow Clients
22.13. Memory mapping19.9. Slow Logins
22.14. Slow Clients19.10. Client tuning
22.15. Slow Logins20. Creating Group Profiles
22.16. Client tuning20.1. Windows '9x
20.2. Windows NT 4
22.17. My Results20.3. Windows 2000/XP
IV. Appendixes
23. 21. Portability
23.1. 21.1. HPUX
23.2. 21.2. SCO Unix
23.3. 21.3. DNIX
23.4. 21.4. RedHat Linux Rembrandt-II
24. 22. Samba and other CIFS clients
24.1. 22.1. Macintosh clients?
24.2. 22.2. OS2 Client
24.3. 22.3. Windows for Workgroups
24.4. 22.4. Windows '95/'98
24.5. 22.5. Windows 2000 Service Pack 2
25. 23. Reporting Bugs
25.1. 23.1. Introduction
25.2. 23.2. General info
25.3. 23.3. Debug levels
25.4. 23.4. Internal errors
25.5. 23.5. Attaching to a running process
25.6. 23.6. Patches
26. 24. Diagnosing your samba server
26.1. 24.1. Introduction
26.2. 24.2. Assumptions
26.3. 24.3. Tests
26.4. 24.4. Still having troubles?

Introduction

1.1. Read the man pages
1.2. Building the Binaries
1.3. The all important step
1.4. Create the smb configuration file.
1.5. Test your config file with
1.6. Starting the smbd and nmbd
1.6.1. Starting from inetd.conf
1.6.2. Alternative: starting it as a daemon
1.7. Try listing the shares available on your server
1.8. Try connecting with the unix client
1.9. Try connecting from a DOS, WfWg, Win9x, WinNT, Win2k, OS/2, etc... client
1.10. What If Things Don't Work?
1.10.1. Diagnosing Problems
1.10.2. Scope IDs
1.10.3. Choosing the Protocol Level
1.10.4. Printing from UNIX to a Client PC
1.10.5. Locking
1.10.6. Mapping Usernames
2. Improved browsing in sambaQuick Cross Subnet Browsing / Cross Workgroup Browsing guide
2.1. Overview of browsingDiscussion
2.2. Browsing support in sambaUse of the "Remote Announce" parameter
2.3. Problem resolutionUse of the "Remote Browse Sync" parameter
2.4. Browsing across subnets
2.4.1. How does cross subnet browsing work ?Use of WINS
2.5. Setting up a WINS serverDo NOT use more than one (1) protocol on MS Windows machines
2.6. Setting up Browsing in a WORKGROUPName Resolution Order
2.7. Setting up Browsing in a DOMAIN3. User information database
2.8. Forcing samba to be the master3.1. Introduction
2.9. Making samba the domain master3.2. Important Notes About Security
2.10. Note about broadcast addresses3.2.1. Advantages of SMB Encryption
2.11. Multiple interfaces3.2.2. Advantages of non-encrypted passwords
3. Oplocks3.3. The smbpasswd Command
3.1. What are oplocks?3.4. Plain text
4. Quick Cross Subnet Browsing / Cross Workgroup Browsing guide3.5. TDB
3.6. LDAP
4.1. Discussion3.6.1. Introduction
4.2. Use of the "Remote Announce" parameter3.6.2. Introduction
4.3. Use of the "Remote Browse Sync" parameter3.6.3. Supported LDAP Servers
4.4. Use of WINS3.6.4. Schema and Relationship to the RFC 2307 posixAccount
4.5. Do NOT use more than one (1) protocol on MS Windows machines3.6.5. Configuring Samba with LDAP
4.6. Name Resolution Order3.6.6. Accounts and Groups management
3.6.7. Security and sambaAccount
3.6.8. LDAP specials attributes for sambaAccounts
3.6.9. Example LDIF Entries for a sambaAccount
5. LanMan and NT Password Encryption in Samba3.7. MySQL
5.1. Introduction3.7.1. Building
5.2. Important Notes About Security3.7.2. Creating the database
5.2.1. Advantages of SMB Encryption3.7.3. Configuring
5.2.2. Advantages of non-encrypted passwords3.7.4. Using plaintext passwords or encrypted password
3.7.5. Getting non-column data from the table
5.3. The smbpasswd Command3.8. Passdb XML plugin
3.8.1. Building
3.8.2. Usage

1.1. Read the man pages


1.2. Building the Binaries


1.3. The all important step


1.4. Create the smb configuration file.


1.5. Test your config file with

1.6. Starting the smbd and nmbd


1.6.1. Starting from inetd.conf


1.6.2. Alternative: starting it as a daemon


1.7. Try listing the shares available on your server


1.8. Try connecting with the unix client


1.9. Try connecting from a DOS, WfWg, Win9x, WinNT, Win2k, OS/2, etc... client


1.10. What If Things Don't Work?


1.10.1. Diagnosing Problems


1.10.2. Scope IDs


1.10.3. Choosing the Protocol Level


1.10.4. Printing from UNIX to a Client PC


1.10.5. Locking


1.10.6. Mapping Usernames


Chapter 2. Improved browsing in samba

Chapter 2. Quick Cross Subnet Browsing / Cross Workgroup Browsing guide

This document should be read in conjunction with Browsing and may +be taken as the fast track guide to implementing browsing across subnets +and / or across workgroups (or domains). WINS is the best tool for resolution +of NetBIOS names to IP addesses. WINS is NOT involved in browse list handling +except by way of name to address mapping.


2.1. Overview of browsing

2.1. Discussion

SMB networking provides a mechanism by which clients can access a list -of machines in a network, a so-called "browse list". This list -contains machines that are ready to offer file and/or print services -to other machines within the network. Thus it does not include -machines which aren't currently able to do server tasks. The browse -list is heavily used by all SMB clients. Configuration of SMB -browsing has been problematic for some Samba users, hence this -document.

Firstly, all MS Windows networking is based on SMB (Server Message +Block) based messaging. SMB messaging is implemented using NetBIOS. Samba +implements NetBIOS by encapsulating it over TCP/IP. MS Windows products can +do likewise. NetBIOS based networking uses broadcast messaging to affect +browse list management. When running NetBIOS over TCP/IP this uses UDP +based messaging. UDP messages can be broadcast or unicast.

Browsing will NOT work if name resolution from NetBIOS names to IP -addresses does not function correctly. Use of a WINS server is highly -recommended to aid the resolution of NetBIOS (SMB) names to IP addresses. -WINS allows remote segment clients to obtain NetBIOS name_type information -that can NOT be provided by any other means of name resolution.

Normally, only unicast UDP messaging can be forwarded by routers. The +"remote announce" parameter to smb.conf helps to project browse announcements +to remote network segments via unicast UDP. Similarly, the "remote browse sync" +parameter of smb.conf implements browse list collation using unicast UDP.

Secondly, in those networks where Samba is the only SMB server technology +wherever possible nmbd should be configured on one (1) machine as the WINS +server. This makes it easy to manage the browsing environment. If each network +segment is configured with it's own Samba WINS server, then the only way to +get cross segment browsing to work is by using the "remote announce" and +the "remote browse sync" parameters to your smb.conf file.

If only one WINS server is used then the use of the "remote announce" and the +"remote browse sync" parameters should NOT be necessary.

Samba WINS does not support MS-WINS replication. This means that when setting up +Samba as a WINS server there must only be one nmbd configured as a WINS server +on the network. Some sites have used multiple Samba WINS servers for redundancy +(one server per subnet) and then used "remote browse sync" and "remote announce" +to affect browse list collation across all segments. Note that this means +clients will only resolve local names, and must be configured to use DNS to +resolve names on other subnets in order to resolve the IP addresses of the +servers they can see on other subnets. This setup is not recommended, but is +mentioned as a practical consideration (ie: an 'if all else fails' scenario).

Lastly, take note that browse lists are a collection of unreliable broadcast +messages that are repeated at intervals of not more than 15 minutes. This means +that it will take time to establish a browse list and it can take up to 45 +minutes to stabilise, particularly across network segments.


2.2. Browsing support in samba

Samba now fully supports browsing. The browsing is supported by nmbd -and is also controlled by options in the smb.conf file (see smb.conf(5)).

Samba can act as a local browse master for a workgroup and the ability -for samba to support domain logons and scripts is now available. See -DOMAIN.txt for more information on domain logons.

Samba can also act as a domain master browser for a workgroup. This -means that it will collate lists from local browse masters into a -wide area network server list. In order for browse clients to -resolve the names they may find in this list, it is recommended that -both samba and your clients use a WINS server.

Note that you should NOT set Samba to be the domain master for a -workgroup that has the same name as an NT Domain: on each wide area -network, you must only ever have one domain master browser per workgroup, -regardless of whether it is NT, Samba or any other type of domain master -that is providing this service.

2.2. Use of the "Remote Announce" parameter

[Note that nmbd can be configured as a WINS server, but it is not -necessary to specifically use samba as your WINS server. NTAS can -be configured as your WINS server. In a mixed NT server and -samba environment on a Wide Area Network, it is recommended that -you use the NT server's WINS server capabilities. In a samba-only -environment, it is recommended that you use one and only one nmbd -as your WINS server].

The "remote announce" parameter of smb.conf can be used to forcibly ensure +that all the NetBIOS names on a network get announced to a remote network. +The syntax of the "remote announce" parameter is: +
	remote announce = a.b.c.d [e.f.g.h] ...
+_or_ +
	remote announce = a.b.c.d/WORKGROUP [e.f.g.h/WORKGROUP] ...
+ +where: +

a.b.c.d and e.f.g.h

To get browsing to work you need to run nmbd as usual, but will need -to use the "workgroup" option in smb.conf to control what workgroup -Samba becomes a part of.

is either the LMB (Local Master Browser) IP address +or the broadcst address of the remote network. +ie: the LMB is at 192.168.1.10, or the address +could be given as 192.168.1.255 where the netmask +is assumed to be 24 bits (255.255.255.0). +When the remote announcement is made to the broadcast +address of the remote network every host will receive +our announcements. This is noisy and therefore +undesirable but may be necessary if we do NOT know +the IP address of the remote LMB.

WORKGROUP

Samba also has a useful option for a Samba server to offer itself for -browsing on another subnet. It is recommended that this option is only -used for 'unusual' purposes: announcements over the internet, for -example. See "remote announce" in the smb.conf man page.

is optional and can be either our own workgroup +or that of the remote network. If you use the +workgroup name of the remote network then our +NetBIOS machine names will end up looking like +they belong to that workgroup, this may cause +name resolution problems and should be avoided.


2.3. Problem resolution

2.3. Use of the "Remote Browse Sync" parameter

If something doesn't work then hopefully the log.nmb file will help -you track down the problem. Try a debug level of 2 or 3 for finding -problems. Also note that the current browse list usually gets stored -in text form in a file called browse.dat.

The "remote browse sync" parameter of smb.conf is used to announce to +another LMB that it must synchronise it's NetBIOS name list with our +Samba LMB. It works ONLY if the Samba server that has this option is +simultaneously the LMB on it's network segment.

Note that if it doesn't work for you, then you should still be able to -type the server name as \\SERVER in filemanager then hit enter and -filemanager should display the list of available shares.

The syntax of the "remote browse sync" parameter is: + +
remote browse sync = a.b.c.d
+ +where a.b.c.d is either the IP address of the remote LMB or else is the network broadcast address of the remote segment.


2.4. Use of WINS

Some people find browsing fails because they don't have the global -"guest account" set to a valid account. Remember that the IPC$ -connection that lists the shares is done as guest, and thus you must -have a valid guest account.

Use of WINS (either Samba WINS _or_ MS Windows NT Server WINS) is highly +recommended. Every NetBIOS machine registers it's name together with a +name_type value for each of of several types of service it has available. +eg: It registers it's name directly as a unique (the type 0x03) name. +It also registers it's name if it is running the lanmanager compatible +server service (used to make shares and printers available to other users) +by registering the server (the type 0x20) name.

Also, a lot of people are getting bitten by the problem of too many -parameters on the command line of nmbd in inetd.conf. This trick is to -not use spaces between the option and the parameter (eg: -d2 instead -of -d 2), and to not use the -B and -N options. New versions of nmbd -are now far more likely to correctly find your broadcast and network -address, so in most cases these aren't needed.

All NetBIOS names are up to 15 characters in length. The name_type variable +is added to the end of the name - thus creating a 16 character name. Any +name that is shorter than 15 characters is padded with spaces to the 15th +character. ie: All NetBIOS names are 16 characters long (including the +name_type information).

The other big problem people have is that their broadcast address, -netmask or IP address is wrong (specified with the "interfaces" option -in smb.conf)

WINS can store these 16 character names as they get registered. A client +that wants to log onto the network can ask the WINS server for a list +of all names that have registered the NetLogon service name_type. This saves +broadcast traffic and greatly expedites logon processing. Since broadcast +name resolution can not be used across network segments this type of +information can only be provided via WINS _or_ via statically configured +"lmhosts" files that must reside on all clients in the absence of WINS.

WINS also serves the purpose of forcing browse list synchronisation by all +LMB's. LMB's must synchronise their browse list with the DMB (domain master +browser) and WINS helps the LMB to identify it's DMB. By definition this +will work only within a single workgroup. Note that the domain master browser +has NOTHING to do with what is referred to as an MS Windows NT Domain. The +later is a reference to a security environment while the DMB refers to the +master controller for browse list information only.

Use of WINS will work correctly only if EVERY client TCP/IP protocol stack +has been configured to use the WINS server/s. Any client that has not been +configured to use the WINS server will continue to use only broadcast based +name registration so that WINS may NEVER get to know about it. In any case, +machines that have not registered with a WINS server will fail name to address +lookup attempts by other clients and will therefore cause workstation access +errors.

To configure Samba as a WINS server just add "wins support = yes" to the +smb.conf file [globals] section.

To configure Samba to register with a WINS server just add +"wins server = a.b.c.d" to your smb.conf file [globals] section.

DO NOT EVER use both "wins support = yes" together with "wins server = a.b.c.d" +particularly not using it's own IP address.


2.4. Browsing across subnets

2.5. Do NOT use more than one (1) protocol on MS Windows machines

With the release of Samba 1.9.17(alpha1 and above) Samba has been -updated to enable it to support the replication of browse lists -across subnet boundaries. New code and options have been added to -achieve this. This section describes how to set this feature up -in different settings.

A very common cause of browsing problems results from installing more than +one protocol on an MS Windows machine.

To see browse lists that span TCP/IP subnets (ie. networks separated -by routers that don't pass broadcast traffic) you must set up at least -one WINS server. The WINS server acts as a DNS for NetBIOS names, allowing -NetBIOS name to IP address translation to be done by doing a direct -query of the WINS server. This is done via a directed UDP packet on -port 137 to the WINS server machine. The reason for a WINS server is -that by default, all NetBIOS name to IP address translation is done -by broadcasts from the querying machine. This means that machines -on one subnet will not be able to resolve the names of machines on -another subnet without using a WINS server.

Every NetBIOS machine take part in a process of electing the LMB (and DMB) +every 15 minutes. A set of election criteria is used to determine the order +of precidence for winning this election process. A machine running Samba or +Windows NT will be biased so that the most suitable machine will predictably +win and thus retain it's role.

Remember, for browsing across subnets to work correctly, all machines, -be they Windows 95, Windows NT, or Samba servers must have the IP address -of a WINS server given to them by a DHCP server, or by manual configuration -(for Win95 and WinNT, this is in the TCP/IP Properties, under Network -settings) for Samba this is in the smb.conf file.

The election process is "fought out" so to speak over every NetBIOS network +interface. In the case of a Windows 9x machine that has both TCP/IP and IPX +installed and has NetBIOS enabled over both protocols the election will be +decided over both protocols. As often happens, if the Windows 9x machine is +the only one with both protocols then the LMB may be won on the NetBIOS +interface over the IPX protocol. Samba will then lose the LMB role as Windows +9x will insist it knows who the LMB is. Samba will then cease to function +as an LMB and thus browse list operation on all TCP/IP only machines will +fail.

The safest rule of all to follow it this - USE ONLY ONE PROTOCOL!



2.4.1. How does cross subnet browsing work ?

Cross subnet browsing is a complicated dance, containing multiple -moving parts. It has taken Microsoft several years to get the code -that achieves this correct, and Samba lags behind in some areas. -However, with the 1.9.17 release, Samba is capable of cross subnet -browsing when configured correctly.

2.6. Name Resolution Order

Consider a network set up as follows :

Resolution of NetBIOS names to IP addresses can take place using a number +of methods. The only ones that can provide NetBIOS name_type information +are:

                                   (DMB)
-             N1_A      N1_B        N1_C       N1_D        N1_E
-              |          |           |          |           |
-          -------------------------------------------------------
-            |          subnet 1                       |
-          +---+                                      +---+
-          |R1 | Router 1                  Router 2   |R2 |
-          +---+                                      +---+
-            |                                          |
-            |  subnet 2              subnet 3          |
-  --------------------------       ------------------------------------
-  |     |     |      |               |        |         |           |
- N2_A  N2_B  N2_C   N2_D           N3_A     N3_B      N3_C        N3_D 
-                    (WINS)

WINS: the best tool!
LMHOSTS: is static and hard to maintain.
Broadcast: uses UDP and can not resolve names across remote segments.

Consisting of 3 subnets (1, 2, 3) connected by two routers -(R1, R2) - these do not pass broadcasts. Subnet 1 has 5 machines -on it, subnet 2 has 4 machines, subnet 3 has 4 machines. Assume -for the moment that all these machines are configured to be in the -same workgroup (for simplicities sake). Machine N1_C on subnet 1 -is configured as Domain Master Browser (ie. it will collate the -browse lists for the workgroup). Machine N2_D is configured as -WINS server and all the other machines are configured to register -their NetBIOS names with it.

As all these machines are booted up, elections for master browsers -will take place on each of the three subnets. Assume that machine -N1_C wins on subnet 1, N2_B wins on subnet 2, and N3_D wins on -subnet 3 - these machines are known as local master browsers for -their particular subnet. N1_C has an advantage in winning as the -local master browser on subnet 1 as it is set up as Domain Master -Browser.

Alternative means of name resolution includes:

On each of the three networks, machines that are configured to -offer sharing services will broadcast that they are offering -these services. The local master browser on each subnet will -receive these broadcasts and keep a record of the fact that -the machine is offering a service. This list of records is -the basis of the browse list. For this case, assume that -all the machines are configured to offer services so all machines -will be on the browse list.

For each network, the local master browser on that network is -considered 'authoritative' for all the names it receives via -local broadcast. This is because a machine seen by the local -master browser via a local broadcast must be on the same -network as the local master browser and thus is a 'trusted' -and 'verifiable' resource. Machines on other networks that -the local master browsers learn about when collating their -browse lists have not been directly seen - these records are -called 'non-authoritative'.

At this point the browse lists look as follows (these are -the machines you would see in your network neighborhood if -you looked in it on a particular network right now).

Subnet           Browse Master   List
-------           -------------   ----
-Subnet1          N1_C            N1_A, N1_B, N1_C, N1_D, N1_E
-
-Subnet2          N2_B            N2_A, N2_B, N2_C, N2_D
-
-Subnet3          N3_D            N3_A, N3_B, N3_C, N3_D

/etc/hosts: is static, hard to maintain, and lacks name_type info
DNS: is a good choice but lacks essential name_type info.

Note that at this point all the subnets are separate, no -machine is seen across any of the subnets.

Now examine subnet 2. As soon as N2_B has become the local -master browser it looks for a Domain master browser to synchronize -its browse list with. It does this by querying the WINS server -(N2_D) for the IP address associated with the NetBIOS name -WORKGROUP>1B<. This name was registerd by the Domain master -browser (N1_C) with the WINS server as soon as it was booted.

Once N2_B knows the address of the Domain master browser it -tells it that is the local master browser for subnet 2 by -sending a MasterAnnouncement packet as a UDP port 138 packet. -It then synchronizes with it by doing a NetServerEnum2 call. This -tells the Domain Master Browser to send it all the server -names it knows about. Once the domain master browser receives -the MasterAnnouncement packet it schedules a synchronization -request to the sender of that packet. After both synchronizations -are done the browse lists look like :

Subnet           Browse Master   List
-------           -------------   ----
-Subnet1          N1_C            N1_A, N1_B, N1_C, N1_D, N1_E, 
-                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*)
-
-Subnet2          N2_B            N2_A, N2_B, N2_C, N2_D
-                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
-
-Subnet3          N3_D            N3_A, N3_B, N3_C, N3_D
-
-Servers with a (*) after them are non-authoritative names.

At this point users looking in their network neighborhood on -subnets 1 or 2 will see all the servers on both, users on -subnet 3 will still only see the servers on their own subnet.

The same sequence of events that occured for N2_B now occurs -for the local master browser on subnet 3 (N3_D). When it -synchronizes browse lists with the domain master browser (N1_A) -it gets both the server entries on subnet 1, and those on -subnet 2. After N3_D has synchronized with N1_C and vica-versa -the browse lists look like.

Many sites want to restrict DNS lookups and want to avoid broadcast name
+resolution traffic. The "name resolve order" parameter is of great help here.
+The syntax of the "name resolve order" parameter is:
+
Subnet           Browse Master   List
-------           -------------   ----
-Subnet1          N1_C            N1_A, N1_B, N1_C, N1_D, N1_E, 
-                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*),
-                                 N3_A(*), N3_B(*), N3_C(*), N3_D(*)
-
-Subnet2          N2_B            N2_A, N2_B, N2_C, N2_D
-                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
-
-Subnet3          N3_D            N3_A, N3_B, N3_C, N3_D
-                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*),
-                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*)
-
-Servers with a (*) after them are non-authoritative names.

At this point users looking in their network neighborhood on -subnets 1 or 3 will see all the servers on all sunbets, users on -subnet 2 will still only see the servers on subnets 1 and 2, but not 3.

Finally, the local master browser for subnet 2 (N2_B) will sync again -with the domain master browser (N1_C) and will recieve the missing -server entries. Finally - and as a steady state (if no machines -are removed or shut off) the browse lists will look like :

name resolve order = wins lmhosts bcast host
+_or_ +
Subnet           Browse Master   List
-------           -------------   ----
-Subnet1          N1_C            N1_A, N1_B, N1_C, N1_D, N1_E, 
-                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*),
-                                 N3_A(*), N3_B(*), N3_C(*), N3_D(*)
-
-Subnet2          N2_B            N2_A, N2_B, N2_C, N2_D
-                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
-                                 N3_A(*), N3_B(*), N3_C(*), N3_D(*)
-
-Subnet3          N3_D            N3_A, N3_B, N3_C, N3_D
-                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*),
-                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*)
-	
-Servers with a (*) after them are non-authoritative names.

Synchronizations between the domain master browser and local -master browsers will continue to occur, but this should be a -steady state situation.

If either router R1 or R2 fails the following will occur:

  1. name resolve order = wins lmhosts (eliminates bcast and host)
+The default is: +
name  resolve order = host lmhost wins bcast
. +where "host" refers the the native methods used by the Unix system +to implement the gethostbyname() function call. This is normally +controlled by /etc/host.conf, /etc/nsswitch.conf and /etc/resolv.conf.


Chapter 3. User information database

3.1. Introduction

Names of computers on each side of the inaccessible network fragments - will be maintained for as long as 36 minutes, in the network neighbourhood - lists. +>Old windows clients send plain text passwords over the wire. + Samba can check these passwords by crypting them and comparing them + to the hash stored in the unix user database.

  • Attempts to connect to these inaccessible computers will fail, but the - names will not be removed from the network neighbourhood lists. +> Newer windows clients send encrypted passwords (so-called + Lanman and NT hashes) over + the wire, instead of plain text passwords. The newest clients + will only send encrypted passwords and refuse to send plain text + passwords, unless their registry is tweaked.

  • If one of the fragments is cut off from the WINS server, it will only - be able to access servers on its local subnet, by using subnet-isolated - broadcast NetBIOS name resolution. The effects are similar to that of - losing access to a DNS server. +>These passwords can't be converted to unix style encrypted + passwords. Because of that you can't use the standard unix + user database, and you have to store the Lanman and NT hashes + somewhere else.

    Next to a differently encrypted passwords, + windows also stores certain data for each user + that is not stored in a unix user database, e.g. + workstations the user may logon from, the location where his/her + profile is stored, etc. + Samba retrieves and stores this information using a "passdb backend". + Commonly + available backends are LDAP, plain text file, MySQL and nisplus. + For more information, see the documentation about the + passdb backend = parameter.


  • 2.5. Setting up a WINS server

    Either a Samba machine or a Windows NT Server machine may be set up -as a WINS server. To set a Samba machine to be a WINS server you must -add the following option to the smb.conf file on the selected machine : -in the [globals] section add the line

    3.2. Important Notes About Security

    wins support = yes

    The unix and SMB password encryption techniques seem similar + on the surface. This similarity is, however, only skin deep. The unix + scheme typically sends clear text passwords over the network when + logging in. This is bad. The SMB encryption scheme never sends the + cleartext password over the network but it does store the 16 byte + hashed values on disk. This is also bad. Why? Because the 16 byte hashed + values are a "password equivalent". You cannot derive the user's + password from them, but they could potentially be used in a modified + client to gain access to a server. This would require considerable + technical knowledge on behalf of the attacker but is perfectly possible. + You should thus treat the data stored in whatever + passdb backend you use (smbpasswd file, ldap, mysql) as though it contained the + cleartext passwords of all your users. Its contents must be kept + secret, and the file should be protected accordingly.

    Versions of Samba previous to 1.9.17 had this parameter default to -yes. If you have any older versions of Samba on your network it is -strongly suggested you upgrade to 1.9.17 or above, or at the very -least set the parameter to 'no' on all these machines.

    Ideally we would like a password scheme which neither requires + plain text passwords on the net or on disk. Unfortunately this + is not available as Samba is stuck with being compatible with + other SMB systems (WinNT, WfWg, Win95 etc).

    Machines with "wins support = yes" will keep a list of -all NetBIOS names registered with them, acting as a DNS for NetBIOS names.

    You should set up only ONE wins server. Do NOT set the -"wins support = yes" option on more than one Samba -server.

    To set up a Windows NT Server as a WINS server you need to set up -the WINS service - see your NT documentation for details. Note that -Windows NT WINS Servers can replicate to each other, allowing more -than one to be set up in a complex subnet environment. As Microsoft -refuse to document these replication protocols Samba cannot currently -participate in these replications. It is possible in the future that -a Samba->Samba WINS replication protocol may be defined, in which -case more than one Samba machine could be set up as a WINS server -but currently only one Samba server should have the "wins support = yes" -parameter set.

    Note that Windows NT 4.0 Service pack 3 changed the + default for permissible authentication so that plaintext + passwords are never sent over the wire. + The solution to this is either to switch to encrypted passwords + with Samba or edit the Windows NT registry to re-enable plaintext + passwords. See the document WinNT.txt for details on how to do + this.

    After the WINS server has been configured you must ensure that all -machines participating on the network are configured with the address -of this WINS server. If your WINS server is a Samba machine, fill in -the Samba machine IP address in the "Primary WINS Server" field of -the "Control Panel->Network->Protocols->TCP->WINS Server" dialogs -in Windows 95 or Windows NT. To tell a Samba server the IP address -of the WINS server add the following line to the [global] section of -all smb.conf files :

    Other Microsoft operating systems which also exhibit + this behavior includes

    wins server = >name or IP address<

    MS DOS Network client 3.0 with + the basic network redirector installed
    Windows 95 with the network redirector + update installed
    Windows 98 [se]
    Windows 2000

    where >name or IP address< is either the DNS name of the WINS server -machine or its IP address.

    Note that this line MUST NOT BE SET in the smb.conf file of the Samba -server acting as the WINS server itself. If you set both the -"wins support = yes" option and the -"wins server = >name<" option then -nmbd will fail to start.

    There are two possible scenarios for setting up cross subnet browsing. -The first details setting up cross subnet browsing on a network containing -Windows 95, Samba and Windows NT machines that are not configured as -part of a Windows NT Domain. The second details setting up cross subnet -browsing on networks that contain NT Domains.

    Note :All current release of + Microsoft SMB/CIFS clients support authentication via the + SMB Challenge/Response mechanism described here. Enabling + clear text authentication does not disable the ability + of the client to participate in encrypted authentication.



    2.6. Setting up Browsing in a WORKGROUP

    To set up cross subnet browsing on a network containing machines -in up to be in a WORKGROUP, not an NT Domain you need to set up one -Samba server to be the Domain Master Browser (note that this is *NOT* -the same as a Primary Domain Controller, although in an NT Domain the -same machine plays both roles). The role of a Domain master browser is -to collate the browse lists from local master browsers on all the -subnets that have a machine participating in the workgroup. Without -one machine configured as a domain master browser each subnet would -be an isolated workgroup, unable to see any machines on any other -subnet. It is the presense of a domain master browser that makes -cross subnet browsing possible for a workgroup.

    In an WORKGROUP environment the domain master browser must be a -Samba server, and there must only be one domain master browser per -workgroup name. To set up a Samba server as a domain master browser, -set the following option in the [global] section of the smb.conf file :

    domain master = yes

    The domain master browser should also preferrably be the local master -browser for its own subnet. In order to achieve this set the following -options in the [global] section of the smb.conf file :

            domain master = yes
    -        local master = yes
    -        preferred master = yes
    -        os level = 65

    The domain master browser may be the same machine as the WINS -server, if you require.

    Next, you should ensure that each of the subnets contains a -machine that can act as a local master browser for the -workgroup. Any NT machine should be able to do this, as will -Windows 95 machines (although these tend to get rebooted more -often, so it's not such a good idea to use these). To make a -Samba server a local master browser set the following -options in the [global] section of the smb.conf file :

    3.2.1. Advantages of SMB Encryption

            domain master = no
    -        local master = yes
    -        preferred master = yes
    -        os level = 65

    plain text passwords are not passed across + the network. Someone using a network sniffer cannot just + record passwords going to the SMB server.
    WinNT doesn't like talking to a server + that isn't using SMB encrypted passwords. It will refuse + to browse the server if the server is also in user level + security mode. It will insist on prompting the user for the + password on each connection, which is very annoying. The + only things you can do to stop this is to use SMB encryption. +

    Do not do this for more than one Samba server on each subnet, -or they will war with each other over which is to be the local -master browser.

    The "local master" parameter allows Samba to act as a local master -browser. The "preferred master" causes nmbd to force a browser -election on startup and the "os level" parameter sets Samba high -enough so that it should win any browser elections.

    If you have an NT machine on the subnet that you wish to -be the local master browser then you can disable Samba from -becoming a local master browser by setting the following -options in the [global] section of the smb.conf file :

            domain master = no
    -        local master = no
    -        preferred master = no
    -        os level = 0



    2.7. Setting up Browsing in a DOMAIN

    If you are adding Samba servers to a Windows NT Domain then -you must not set up a Samba server as a domain master browser. -By default, a Windows NT Primary Domain Controller for a Domain -name is also the Domain master browser for that name, and many -things will break if a Samba server registers the Domain master -browser NetBIOS name (DOMAIN>1B<) with WINS instead of the PDC.

    For subnets other than the one containing the Windows NT PDC -you may set up Samba servers as local master browsers as -described. To make a Samba server a local master browser set -the following options in the [global] section of the smb.conf -file :

    3.2.2. Advantages of non-encrypted passwords

            domain master = no
    -        local master = yes
    -        preferred master = yes
    -        os level = 65

    plain text passwords are not kept + on disk.
    uses same password file as other unix + services such as login and ftp
    you are probably already using other + services (such as telnet and ftp) which send plain text + passwords over the net, so sending them for SMB isn't + such a big deal.

    If you wish to have a Samba server fight the election with machines -on the same subnet you may set the "os level" parameter to lower -levels. By doing this you can tune the order of machines that -will become local master browsers if they are running. For -more details on this see the section "FORCING SAMBA TO BE THE MASTER" -below.

    If you have Windows NT machines that are members of the domain -on all subnets, and you are sure they will always be running then -you can disable Samba from taking part in browser elections and -ever becoming a local master browser by setting following options -in the [global] section of the smb.conf file :

    domain master = no - local master = no - preferred master = no - os level = 0


    2.8. Forcing samba to be the master

    3.3. The smbpasswd Command

    Who becomes the "master browser" is determined by an election process -using broadcasts. Each election packet contains a number of parameters -which determine what precedence (bias) a host should have in the -election. By default Samba uses a very low precedence and thus loses -elections to just about anyone else.

    If you want Samba to win elections then just set the "os level" global -option in smb.conf to a higher number. It defaults to 0. Using 34 -would make it win all elections over every other system (except other -samba systems!)

    A "os level" of 2 would make it beat WfWg and Win95, but not NTAS. A -NTAS domain controller uses level 32.

    The maximum os level is 255

    If you want samba to force an election on startup, then set the -"preferred master" global option in smb.conf to "yes". Samba will -then have a slight advantage over other potential master browsers -that are not preferred master browsers. Use this parameter with -care, as if you have two hosts (whether they are windows 95 or NT or -samba) on the same local subnet both set with "preferred master" to -"yes", then periodically and continually they will force an election -in order to become the local master browser.

    If you want samba to be a "domain master browser", then it is -recommended that you also set "preferred master" to "yes", because -samba will not become a domain master browser for the whole of your -LAN or WAN if it is not also a local master browser on its own -broadcast isolated subnet.

    It is possible to configure two samba servers to attempt to become -the domain master browser for a domain. The first server that comes -up will be the domain master browser. All other samba servers will -attempt to become the domain master browser every 5 minutes. They -will find that another samba server is already the domain master -browser and will fail. This provides automatic redundancy, should -the current domain master browser fail.


    2.9. Making samba the domain master

    The smbpasswd utility is a utility similar to the + passwd or yppasswd programs. + It maintains the two 32 byte password fields + in the passdb backend.

    The domain master is responsible for collating the browse lists of -multiple subnets so that browsing can occur between subnets. You can -make samba act as the domain master by setting "domain master = yes" -in smb.conf. By default it will not be a domain master.

    smbpasswd works in a client-server mode + where it contacts the local smbd to change the user's password on its + behalf. This has enormous benefits - as follows.

    Note that you should NOT set Samba to be the domain master for a -workgroup that has the same name as an NT Domain.

    smbpasswd has the capability + to change passwords on Windows NT servers (this only works when + the request is sent to the NT Primary Domain Controller if you + are changing an NT Domain user's password).

    When samba is the domain master and the master browser it will listen -for master announcements (made roughly every twelve minutes) from local -master browsers on other subnets and then contact them to synchronise -browse lists.

    To run smbpasswd as a normal user just type :

    If you want samba to be the domain master then I suggest you also set -the "os level" high enough to make sure it wins elections, and set -"preferred master" to "yes", to get samba to force an election on -startup.

    $ smbpasswd

    Note that all your servers (including samba) and clients should be -using a WINS server to resolve NetBIOS names. If your clients are only -using broadcasting to resolve NetBIOS names, then two things will occur:

    Old SMB password: <type old value here - + or hit return if there was no old password>

    New SMB Password: <type new value> +

    1. your local master browsers will be unable to find a domain master - browser, as it will only be looking on the local subnet. -

    2. Repeat New SMB Password: <re-type new value +

      if a client happens to get hold of a domain-wide browse list, and - a user attempts to access a host in that list, it will be unable to - resolve the NetBIOS name of that host. -

    If the old value does not match the current value stored for + that user, or the two new values do not match each other, then the + password will not be changed.

    If, however, both samba and your clients are using a WINS server, then:

    If invoked by an ordinary user it will only allow the user + to change his or her own Samba password.

    1. If run by the root user smbpasswd may take an optional + argument, specifying the user name whose SMB password you wish to + change. Note that when run as root smbpasswd does not prompt for + or check the old password value, thus allowing root to set passwords + for users who have forgotten their passwords.

      your local master browsers will contact the WINS server and, as long as - samba has registered that it is a domain master browser with the WINS - server, your local master browser will receive samba's ip address - as its domain master browser. -

    2. smbpasswd is designed to work in the same way + and be familiar to UNIX users who use the passwd or + yppasswd commands.

      when a client receives a domain-wide browse list, and a user attempts - to access a host in that list, it will contact the WINS server to - resolve the NetBIOS name of that host. as long as that host has - registered its NetBIOS name with the same WINS server, the user will - be able to see that host. -

    For more details on using smbpasswd refer + to the man page which will always be the definitive reference.


    2.10. Note about broadcast addresses

    3.4. Plain text

    If your network uses a "0" based broadcast address (for example if it -ends in a 0) then you will strike problems. Windows for Workgroups -does not seem to support a 0's broadcast and you will probably find -that browsing and name lookups won't work.

    Older versions of samba retrieved user information from the unix user database +and eventually some other fields from the file /etc/samba/smbpasswd +or /etc/smbpasswd. When password encryption is disabled, no +data is stored at all.


    2.11. Multiple interfaces

    3.5. TDB

    Samba now supports machines with multiple network interfaces. If you -have multiple interfaces then you will need to use the "interfaces" -option in smb.conf to configure them. See smb.conf(5) for details.

    Samba can also store the user data in a "TDB" (Trivial Database). Using this backend +doesn't require any additional configuration. This backend is recommended for new installations who +don't require LDAP.


    Chapter 3. Oplocks


    3.1. What are oplocks?

    When a client opens a file it can request an "oplock" or file -lease. This is (to simplify a bit) a guarentee that no one else -has the file open simultaneously. It allows the client to not -send any updates on the file to the server, thus reducing a -network file access to local access (once the file is in -client cache). An "oplock break" is when the server sends -a request to the client to flush all its changes back to -the server, so the file is in a consistent state for other -opens to succeed. If a client fails to respond to this -asynchronous request then the file can be corrupted. Hence -the "turn off oplocks" answer if people are having multi-user -file access problems.

    Unless the kernel is "oplock aware" (SGI IRIX and Linux are -the only two UNIXes that are at the moment) then if a local -UNIX process accesses the file simultaneously then Samba -has no way of telling this is occuring, so the guarentee -to the client is broken. This can corrupt the file. Short -answer - it you have UNIX clients accessing the same file -as smbd locally or via NFS and you're not running Linux or -IRIX then turn off oplocks for that file or share.

    "Share modes". These are modes of opening a file, that -guarentee an invarient - such as DENY_WRITE - which means -that if any other opens are requested with write access after -this current open has succeeded then they should be denied -with a "sharing violation" error message. Samba handles these -internally inside smbd. UNIX clients accessing the same file -ignore these invarients. Just proving that if you need simultaneous -file access from a Windows and UNIX client you *must* have an -application that is written to lock records correctly on both -sides. Few applications are written like this, and even fewer -are cross platform (UNIX and Windows) so in practice this isn't -much of a problem.

    "Locking". This really means "byte range locking" - such as -lock 10 bytes at file offset 24 for write access. This is the -area in which well written UNIX and Windows apps will cooperate. -Windows locks (at least from NT or above) are 64-bit unsigned -offsets. UNIX locks are either 31 bit or 63 bit and are signed -(the top bit is used for the sign). Samba handles these by -first ensuring that all the Windows locks don't conflict (ie. -if other Windows clients have competing locks then just reject -immediately) - this allows us to support 64-bit Windows locks -on 32-bit filesystems. Secondly any locks that are valid are -then mapped onto UNIX fcntl byte range locks. These are the -locks that will be seen by UNIX processes. If there is a conflict -here the lock is rejected.

    Note that if a client has an oplock then it "knows" that no -other client can have the file open so usually doesn't bother -to send to lock request to the server - this means once again -if you need to share files between UNIX and Windows processes -either use IRIX or Linux, or turn off oplocks for these -files/shares.


    Chapter 4. Quick Cross Subnet Browsing / Cross Workgroup Browsing guide

    This document should be read in conjunction with Browsing and may -be taken as the fast track guide to implementing browsing across subnets -and / or across workgroups (or domains). WINS is the best tool for resolution -of NetBIOS names to IP addesses. WINS is NOT involved in browse list handling -except by way of name to address mapping.

    3.6. LDAP

    4.1. Discussion

    3.6.1. Introduction

    Firstly, all MS Windows networking is based on SMB (Server Message -Block) based messaging. SMB messaging is implemented using NetBIOS. Samba -implements NetBIOS by encapsulating it over TCP/IP. MS Windows products can -do likewise. NetBIOS based networking uses broadcast messaging to affect -browse list management. When running NetBIOS over TCP/IP this uses UDP -based messaging. UDP messages can be broadcast or unicast.

    This document describes how to use an LDAP directory for storing Samba user +account information traditionally stored in the smbpasswd(5) file. It is +assumed that the reader already has a basic understanding of LDAP concepts +and has a working directory server already installed. For more information +on LDAP architectures and Directories, please refer to the following sites.

    Normally, only unicast UDP messaging can be forwarded by routers. The -"remote announce" parameter to smb.conf helps to project browse announcements -to remote network segments via unicast UDP. Similarly, the "remote browse sync" -parameter of smb.conf implements browse list collation using unicast UDP.

    • Secondly, in those networks where Samba is the only SMB server technology -wherever possible nmbd should be configured on one (1) machine as the WINS -server. This makes it easy to manage the browsing environment. If each network -segment is configured with it's own Samba WINS server, then the only way to -get cross segment browsing to work is by using the "remote announce" and -the "remote browse sync" parameters to your smb.conf file.

      OpenLDAP - http://www.openldap.org/

    • If only one WINS server is used then the use of the "remote announce" and the -"remote browse sync" parameters should NOT be necessary.

      iPlanet Directory Server - http://iplanet.netscape.com/directory

    Samba WINS does not support MS-WINS replication. This means that when setting up -Samba as a WINS server there must only be one nmbd configured as a WINS server -on the network. Some sites have used multiple Samba WINS servers for redundancy -(one server per subnet) and then used "remote browse sync" and "remote announce" -to affect browse list collation across all segments. Note that this means -clients will only resolve local names, and must be configured to use DNS to -resolve names on other subnets in order to resolve the IP addresses of the -servers they can see on other subnets. This setup is not recommended, but is -mentioned as a practical consideration (ie: an 'if all else fails' scenario).

    Note that O'Reilly Publishing is working on +a guide to LDAP for System Administrators which has a planned release date of +early summer, 2002.

    Lastly, take note that browse lists are a collection of unreliable broadcast -messages that are repeated at intervals of not more than 15 minutes. This means -that it will take time to establish a browse list and it can take up to 45 -minutes to stabilise, particularly across network segments.

    Two additional Samba resources which may prove to be helpful are

    • The Samba-PDC-LDAP-HOWTO + maintained by Ignacio Coupeau.

    • The NT migration scripts from IDEALX that are + geared to manage users and group in such a Samba-LDAP Domain Controller configuration. +



    4.2. Use of the "Remote Announce" parameter

    3.6.2. Introduction

    The "remote announce" parameter of smb.conf can be used to forcibly ensure -that all the NetBIOS names on a network get announced to a remote network. -The syntax of the "remote announce" parameter is: -

    	remote announce = a.b.c.d [e.f.g.h] ...
    Traditionally, when configuring "encrypt +passwords = yes" in Samba's smb.conf file, user account +information such as username, LM/NT password hashes, password change times, and account +flags have been stored in the smbpasswd(5) file. There are several +disadvantages to this approach for sites with very large numbers of users (counted +in the thousands).

    • The first is that all lookups must be performed sequentially. Given that +there are approximately two lookups per domain logon (one for a normal +session connection such as when mapping a network drive or printer), this +is a performance bottleneck for lareg sites. What is needed is an indexed approach +such as is used in databases.

    • The second problem is that administrators who desired to replicate a +smbpasswd file to more than one Samba server were left to use external +tools such as rsync(1) and ssh(1) -_or_ -

      	remote announce = a.b.c.d/WORKGROUP [e.f.g.h/WORKGROUP] ...
    • And finally, the amount of information which is stored in an +smbpasswd entry leaves no room for additional attributes such as +a home directory, password expiration time, or even a Relative +Identified (RID).

    As a result of these defeciencies, a more robust means of storing user attributes +used by smbd was developed. The API which defines access to user accounts +is commonly referred to as the samdb interface (previously this was called the passdb +API, and is still so named in the CVS trees). In Samba 2.2.3, enabling support +for a samdb backend (e.g. --with-ldapsam or +--with-tdbsam) requires compile time support.

    When compiling Samba to include the --with-ldapsam autoconf +option, smbd (and associated tools) will store and lookup user accounts in +an LDAP directory. In reality, this is very easy to understand. If you are +comfortable with using an smbpasswd file, simply replace "smbpasswd" with +"LDAP directory" in all the documentation.

    There are a few points to stress about what the --with-ldapsam - -where: -

    a.b.c.d and e.f.g.h
    • is either the LMB (Local Master Browser) IP address -or the broadcst address of the remote network. -ie: the LMB is at 192.168.1.10, or the address -could be given as 192.168.1.255 where the netmask -is assumed to be 24 bits (255.255.255.0). -When the remote announcement is made to the broadcast -address of the remote network every host will receive -our announcements. This is noisy and therefore -undesirable but may be necessary if we do NOT know -the IP address of the remote LMB.

    WORKGROUP
    A means of retrieving user account information from + an Windows 2000 Active Directory server.

  • is optional and can be either our own workgroup -or that of the remote network. If you use the -workgroup name of the remote network then our -NetBIOS machine names will end up looking like -they belong to that workgroup, this may cause -name resolution problems and should be avoided.

  • A means of replacing /etc/passwd.

    The second item can be accomplished by using LDAP NSS and PAM modules. LGPL +versions of these libraries can be obtained from PADL Software +(http://www.padl.com/). However, +the details of configuring these packages are beyond the scope of this document.



    4.3. Use of the "Remote Browse Sync" parameter

    The "remote browse sync" parameter of smb.conf is used to announce to -another LMB that it must synchronise it's NetBIOS name list with our -Samba LMB. It works ONLY if the Samba server that has this option is -simultaneously the LMB on it's network segment.

    3.6.3. Supported LDAP Servers

    The syntax of the "remote browse sync" parameter is: -

    	remote browse sync = a.b.c.d
    - -where a.b.c.d is either the IP address of the remote LMB or else is the network broadcast address of the remote segment.

    The LDAP samdb code in 2.2.3 has been developed and tested using the OpenLDAP +2.0 server and client libraries. The same code should be able to work with +Netscape's Directory Server and client SDK. However, due to lack of testing +so far, there are bound to be compile errors and bugs. These should not be +hard to fix. If you are so inclined, please be sure to forward all patches to +samba-patches@samba.org and +jerry@samba.org.



    4.4. Use of WINS

    3.6.4. Schema and Relationship to the RFC 2307 posixAccount

    Use of WINS (either Samba WINS _or_ MS Windows NT Server WINS) is highly -recommended. Every NetBIOS machine registers it's name together with a -name_type value for each of of several types of service it has available. -eg: It registers it's name directly as a unique (the type 0x03) name. -It also registers it's name if it is running the lanmanager compatible -server service (used to make shares and printers available to other users) -by registering the server (the type 0x20) name.

    Samba 3.0 includes the necessary schema file for OpenLDAP 2.0 in +examples/LDAP/samba.schema. The sambaAccount objectclass is given here:

    All NetBIOS names are up to 15 characters in length. The name_type variable -is added to the end of the name - thus creating a 16 character name. Any -name that is shorter than 15 characters is padded with spaces to the 15th -character. ie: All NetBIOS names are 16 characters long (including the -name_type information).

    objectclass ( 1.3.1.5.1.4.1.7165.2.2.2 NAME 'sambaAccount' SUP top STRUCTURAL
    +     DESC 'Samba Account'
    +     MUST ( uid $ rid )
    +     MAY  ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $
    +            logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $
    +            displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $
    +            description $ userWorkstations $ primaryGroupID $ domain ))

    WINS can store these 16 character names as they get registered. A client -that wants to log onto the network can ask the WINS server for a list -of all names that have registered the NetLogon service name_type. This saves -broadcast traffic and greatly expedites logon processing. Since broadcast -name resolution can not be used across network segments this type of -information can only be provided via WINS _or_ via statically configured -"lmhosts" files that must reside on all clients in the absence of WINS.

    WINS also serves the purpose of forcing browse list synchronisation by all -LMB's. LMB's must synchronise their browse list with the DMB (domain master -browser) and WINS helps the LMB to identify it's DMB. By definition this -will work only within a single workgroup. Note that the domain master browser -has NOTHING to do with what is referred to as an MS Windows NT Domain. The -later is a reference to a security environment while the DMB refers to the -master controller for browse list information only.

    Use of WINS will work correctly only if EVERY client TCP/IP protocol stack -has been configured to use the WINS server/s. Any client that has not been -configured to use the WINS server will continue to use only broadcast based -name registration so that WINS may NEVER get to know about it. In any case, -machines that have not registered with a WINS server will fail name to address -lookup attempts by other clients and will therefore cause workstation access -errors.

    To configure Samba as a WINS server just add "wins support = yes" to the -smb.conf file [globals] section.

    The samba.schema file has been formatted for OpenLDAP 2.0. The OID's are +owned by the Samba Team and as such is legal to be openly published. +If you translate the schema to be used with Netscape DS, please +submit the modified schema file as a patch to jerry@samba.org

    To configure Samba to register with a WINS server just add -"wins server = a.b.c.d" to your smb.conf file [globals] section.

    Just as the smbpasswd file is mean to store information which supplements a +user's /etc/passwd entry, so is the sambaAccount object +meant to supplement the UNIX user account information. A sambaAccount is a +STRUCTURAL objectclass so it can be stored individually +in the directory. However, there are several fields (e.g. uid) which overlap +with the posixAccount objectclass outlined in RFC2307. This is by design.

    DO NOT EVER use both "wins support = yes" together with "wins server = a.b.c.d" -particularly not using it's own IP address.

    In order to store all user account information (UNIX and Samba) in the directory, +it is necessary to use the sambaAccount and posixAccount objectclasses in +combination. However, smbd will still obtain the user's UNIX account +information via the standard C library calls (e.g. getpwnam(), et. al.). +This means that the Samba server must also have the LDAP NSS library installed +and functioning correctly. This division of information makes it possible to +store all Samba account information in LDAP, but still maintain UNIX account +information in NIS while the network is transitioning to a full LDAP infrastructure.



    3.6.5. Configuring Samba with LDAP

    4.5. Do NOT use more than one (1) protocol on MS Windows machines

    3.6.5.1. OpenLDAP configuration

    A very common cause of browsing problems results from installing more than -one protocol on an MS Windows machine.

    To include support for the sambaAccount object in an OpenLDAP directory +server, first copy the samba.schema file to slapd's configuration directory.

    Every NetBIOS machine take part in a process of electing the LMB (and DMB) -every 15 minutes. A set of election criteria is used to determine the order -of precidence for winning this election process. A machine running Samba or -Windows NT will be biased so that the most suitable machine will predictably -win and thus retain it's role.

    root# cp samba.schema /etc/openldap/schema/

    The election process is "fought out" so to speak over every NetBIOS network -interface. In the case of a Windows 9x machine that has both TCP/IP and IPX -installed and has NetBIOS enabled over both protocols the election will be -decided over both protocols. As often happens, if the Windows 9x machine is -the only one with both protocols then the LMB may be won on the NetBIOS -interface over the IPX protocol. Samba will then lose the LMB role as Windows -9x will insist it knows who the LMB is. Samba will then cease to function -as an LMB and thus browse list operation on all TCP/IP only machines will -fail.

    Next, include the samba.schema file in slapd.conf. +The sambaAccount object contains two attributes which depend upon other schema +files. The 'uid' attribute is defined in cosine.schema and +the 'displayName' attribute is defined in the inetorgperson.schema +file. Both of these must be included before the samba.schema file.

    The safest rule of all to follow it this - USE ONLY ONE PROTOCOL!

    ## /etc/openldap/slapd.conf
    +
    +## schema files (core.schema is required by default)
    +include	           /etc/openldap/schema/core.schema
    +
    +## needed for sambaAccount
    +include            /etc/openldap/schema/cosine.schema
    +include            /etc/openldap/schema/inetorgperson.schema
    +include            /etc/openldap/schema/samba.schema
    +
    +## uncomment this line if you want to support the RFC2307 (NIS) schema
    +## include         /etc/openldap/schema/nis.schema
    +
    +....

    It is recommended that you maintain some indices on some of the most usefull attributes, +like in the following example, to speed up searches made on sambaAccount objectclasses +(and possibly posixAccount and posixGroup as well).

    # Indices to maintain
    +## required by OpenLDAP 2.0
    +index objectclass   eq
    +
    +## support pb_getsampwnam()
    +index uid           pres,eq
    +## support pdb_getsambapwrid()
    +index rid           eq
    +
    +## uncomment these if you are storing posixAccount and
    +## posixGroup entries in the directory as well
    +##index uidNumber     eq
    +##index gidNumber     eq
    +##index cn            eq
    +##index memberUid     eq



    4.6. Name Resolution Order

    3.6.5.2. Configuring Samba

    The following parameters are available in smb.conf only with --with-ldapsam +was included with compiling Samba.

    Resolution of NetBIOS names to IP addresses can take place using a number -of methods. The only ones that can provide NetBIOS name_type information -are: -

    WINS: the best tool!
    LMHOSTS: is static and hard to maintain.
    Broadcast: uses UDP and can not resolve names across remote segments.

    These are described in the smb.conf(5) man +page and so will not be repeated here. However, a sample smb.conf file for +use with an LDAP directory could appear as

    ## /usr/local/samba/lib/smb.conf
    +[global]
    +     security = user
    +     encrypt passwords = yes
    +
    +     netbios name = TASHTEGO
    +     workgroup = NARNIA
    +
    +     # ldap related parameters
    +
    +     # define the DN to use when binding to the directory servers
    +     # The password for this DN is not stored in smb.conf.  Rather it
    +     # must be set by using 'smbpasswd -w secretpw' to store the
    +     # passphrase in the secrets.tdb file.  If the "ldap admin dn" values
    +     # changes, this password will need to be reset.
    +     ldap admin dn = "cn=Samba Manager,ou=people,dc=samba,dc=org"
    +
    +     #  specify the LDAP server's hostname (defaults to locahost)
    +     ldap server = ahab.samba.org
    +
    +     # Define the SSL option when connecting to the directory
    +     # ('off', 'start tls', or 'on' (default))
    +     ldap ssl = start tls
    +
    +     # define the port to use in the LDAP session (defaults to 636 when
    +     # "ldap ssl = on")
    +     ldap port = 389
    +
    +     # specify the base DN to use when searching the directory
    +     ldap suffix = "ou=people,dc=samba,dc=org"
    +
    +     # generally the default ldap search filter is ok
    +     # ldap filter = "(&(uid=%u)(objectclass=sambaAccount))"


    3.6.6. Accounts and Groups management

    As users accounts are managed thru the sambaAccount objectclass, you should +modify you existing administration tools to deal with sambaAccount attributes.

    Machines accounts are managed with the sambaAccount objectclass, just +like users accounts. However, it's up to you to stored thoses accounts +in a different tree of you LDAP namespace: you should use +"ou=Groups,dc=plainjoe,dc=org" to store groups and +"ou=People,dc=plainjoe,dc=org" to store users. Just configure your +NSS and PAM accordingly (usually, in the /etc/ldap.conf configuration +file).

    In Samba release 3.0, the group management system is based on posix +groups. This means that Samba make usage of the posixGroup objectclass. +For now, there is no NT-like group system management (global and local +groups).


    3.6.7. Security and sambaAccount

    There are two important points to remember when discussing the security +of sambaAccount entries in the directory.

    • Never retrieve the lmPassword or + ntPassword attribute values over an unencrypted LDAP session.

    • Never allow non-admin users to + view the lmPassword or ntPassword attribute values.

    These password hashes are clear text equivalents and can be used to impersonate +the user without deriving the original clear text strings. For more information +on the details of LM/NT password hashes, refer to the ENCRYPTION chapter of the Samba-HOWTO-Collection.

    To remedy the first security issue, the "ldap ssl" smb.conf parameter defaults +to require an encrypted session (ldap ssl = on) using +the default port of 636 +when contacting the directory server. When using an OpenLDAP 2.0 server, it +is possible to use the use the StartTLS LDAP extended operation in the place of +LDAPS. In either case, you are strongly discouraged to disable this security +(ldap ssl = off).

    Note that the LDAPS protocol is deprecated in favor of the LDAPv3 StartTLS +extended operation. However, the OpenLDAP library still provides support for +the older method of securing communication between clients and servers.

    The second security precaution is to prevent non-administrative users from +harvesting password hashes from the directory. This can be done using the +following ACL in slapd.conf:

    ## allow the "ldap admin dn" access, but deny everyone else
    +access to attrs=lmPassword,ntPassword
    +     by dn="cn=Samba Admin,ou=people,dc=plainjoe,dc=org" write
    +     by * none


    3.6.8. LDAP specials attributes for sambaAccounts

    The sambaAccount objectclass is composed of the following attributes:

    • lmPassword: the LANMAN password 16-byte hash stored as a character + representation of a hexidecimal string.

    • ntPassword: the NT password hash 16-byte stored as a character + representation of a hexidecimal string.

    • pwdLastSet: The integer time in seconds since 1970 when the + lmPassword and ntPassword attributes were last set. +

    • acctFlags: string of 11 characters surrounded by square brackets [] + representing account flags such as U (user), W(workstation), X(no password expiration), and + D(disabled).

    • logonTime: Integer value currently unused

    • logoffTime: Integer value currently unused

    • kickoffTime: Integer value currently unused

    • pwdCanChange: Integer value currently unused

    • pwdMustChange: Integer value currently unused

    • homeDrive: specifies the drive letter to which to map the + UNC path specified by homeDirectory. The drive letter must be specified in the form "X:" + where X is the letter of the drive to map. Refer to the "logon drive" parameter in the + smb.conf(5) man page for more information.

    • scriptPath: The scriptPath property specifies the path of + the user's logon script, .CMD, .EXE, or .BAT file. The string can be null. The path + is relative to the netlogon share. Refer to the "logon script" parameter in the + smb.conf(5) man page for more information.

    • profilePath: specifies a path to the user's profile. + This value can be a null string, a local absolute path, or a UNC path. Refer to the + "logon path" parameter in the smb.conf(5) man page for more information.

    • smbHome: The homeDirectory property specifies the path of + the home directory for the user. The string can be null. If homeDrive is set and specifies + a drive letter, homeDirectory should be a UNC path. The path must be a network + UNC path of the form \\server\share\directory. This value can be a null string. + Refer to the "logon home" parameter in the smb.conf(5) man page for more information. +

    • userWorkstation: character string value currently unused. +

    • rid: the integer representation of the user's relative identifier + (RID).

    • primaryGroupID: the relative identifier (RID) of the primary group + of the user.

    The majority of these parameters are only used when Samba is acting as a PDC of +a domain (refer to the Samba-PDC-HOWTO for details on +how to configure Samba as a Primary Domain Controller). The following four attributes +are only stored with the sambaAccount entry if the values are non-default values:

    • smbHome

    • scriptPath

    • logonPath

    • homeDrive

    These attributes are only stored with the sambaAccount entry if +the values are non-default values. For example, assume TASHTEGO has now been +configured as a PDC and that logon home = \\%L\%u was defined in +its smb.conf file. When a user named "becky" logons to the domain, +the logon home string is expanded to \\TASHTEGO\becky. +If the smbHome attribute exists in the entry "uid=becky,ou=people,dc=samba,dc=org", +this value is used. However, if this attribute does not exist, then the value +of the logon home parameter is used in its place. Samba +will only write the attribute value to the directory entry is the value is +something other than the default (e.g. \\MOBY\becky).


    3.6.9. Example LDIF Entries for a sambaAccount

    The following is a working LDIF with the inclusion of the posixAccount objectclass:

    Alternative means of name resolution includes: -

    dn: uid=guest2, ou=people,dc=plainjoe,dc=org
    +ntPassword: 878D8014606CDA29677A44EFA1353FC7
    +pwdMustChange: 2147483647
    +primaryGroupID: 1201
    +lmPassword: 552902031BEDE9EFAAD3B435B51404EE
    +pwdLastSet: 1010179124
    +logonTime: 0
    +objectClass: sambaAccount
    +uid: guest2
    +kickoffTime: 2147483647
    +acctFlags: [UX         ]
    +logoffTime: 2147483647
    +rid: 19006
    +pwdCanChange: 0

    /etc/hosts: is static, hard to maintain, and lacks name_type info
    DNS: is a good choice but lacks essential name_type info.

    The following is an LDIF entry for using both the sambaAccount and +posixAccount objectclasses:

    Many sites want to restrict DNS lookups and want to avoid broadcast name -resolution traffic. The "name resolve order" parameter is of great help here. -The syntax of the "name resolve order" parameter is: -

    	name resolve order = wins lmhosts bcast host
    -_or_ -
    	name resolve order = wins lmhosts  	(eliminates bcast and host)
    -The default is: -
    	name  resolve order = host lmhost wins bcast
    . -where "host" refers the the native methods used by the Unix system -to implement the gethostbyname() function call. This is normally -controlled by /etc/host.conf, /etc/nsswitch.conf and /etc/resolv.conf.

    dn: uid=gcarter, ou=people,dc=plainjoe,dc=org +logonTime: 0 +displayName: Gerald Carter +lmPassword: 552902031BEDE9EFAAD3B435B51404EE +primaryGroupID: 1201 +objectClass: posixAccount +objectClass: sambaAccount +acctFlags: [UX ] +userPassword: {crypt}BpM2ej8Rkzogo +uid: gcarter +uidNumber: 9000 +cn: Gerald Carter +loginShell: /bin/bash +logoffTime: 2147483647 +gidNumber: 100 +kickoffTime: 2147483647 +pwdLastSet: 1010179230 +rid: 19000 +homeDirectory: /home/tashtego/gcarter +pwdCanChange: 0 +pwdMustChange: 2147483647 +ntPassword: 878D8014606CDA29677A44EFA1353FC7



    Chapter 5. LanMan and NT Password Encryption in Samba

    3.7. MySQL

    5.1. Introduction

    3.7.1. Building

    Newer windows clients send encrypted passwords over - the wire, instead of plain text passwords. The newest clients - will only send encrypted passwords and refuse to send plain text - passwords, unless their registry is tweaked.

    To build the plugin, run make bin/pdb_mysql.so +in the source/ directory of samba distribution.

    These passwords can't be converted to unix style encrypted - passwords. Because of that you can't use the standard unix - user database, and you have to store the Lanman and NT hashes - somewhere else. For more information, see the documentation - about the Next, copy pdb_mysql.so to any location you want. I +strongly recommend installing it in $PREFIX/lib or /usr/lib/samba/


    3.7.2. Creating the database

    You either can set up your own table and specify the field names to pdb_mysql (see below +for the column names) or use the default table. The file examples/pdb/mysql/mysql.dump +contains the correct queries to create the required tables. Use the command : + +passdb backend = parameter. -

    mysql -uusername -hhostname -ppassword databasename < /path/to/samba/examples/pdb/mysql/mysql.dump



    5.2. Important Notes About Security

    3.7.3. Configuring

    The unix and SMB password encryption techniques seem similar - on the surface. This similarity is, however, only skin deep. The unix - scheme typically sends clear text passwords over the network when - logging in. This is bad. The SMB encryption scheme never sends the - cleartext password over the network but it does store the 16 byte - hashed values on disk. This is also bad. Why? Because the 16 byte hashed - values are a "password equivalent". You cannot derive the user's - password from them, but they could potentially be used in a modified - client to gain access to a server. This would require considerable - technical knowledge on behalf of the attacker but is perfectly possible. - You should thus treat the smbpasswd file as though it contained the - cleartext passwords of all your users. Its contents must be kept - secret, and the file should be protected accordingly.

    This plugin lacks some good documentation, but here is some short info:

    Ideally we would like a password scheme which neither requires - plain text passwords on the net or on disk. Unfortunately this - is not available as Samba is stuck with being compatible with - other SMB systems (WinNT, WfWg, Win95 etc).

    Add a the following to the passdb backend variable in your smb.conf: +
    passdb backend = [other-plugins] plugin:/location/to/pdb_mysql.so:identifier [other-plugins]

    The identifier can be any string you like, as long as it doesn't collide with +the identifiers of other plugins or other instances of pdb_mysql. If you +specify multiple pdb_mysql.so entries in 'passdb backend', you also need to +use different identifiers!

    Additional options can be given thru the smb.conf file in the [global] section.

    identifier:mysql host                     - host name, defaults to 'localhost'
    +identifier:mysql password
    +identifier:mysql user                     - defaults to 'samba'
    +identifier:mysql database                 - defaults to 'samba'
    +identifier:mysql port                     - defaults to 3306
    +identifier:table                          - Name of the table containing users

    Warning

    Note that Windows NT 4.0 Service pack 3 changed the - default for permissible authentication so that plaintext - passwords are never sent over the wire. - The solution to this is either to switch to encrypted passwords - with Samba or edit the Windows NT registry to re-enable plaintext - passwords. See the document WinNT.txt for details on how to do - this.

    Other Microsoft operating systems which also exhibit - this behavior includes

    • MS DOS Network client 3.0 with - the basic network redirector installed

    • Windows 95 with the network redirector - update installed

    • Since the password for the mysql user is stored in the +smb.conf file, you should make the the smb.conf file +readable only to the user that runs samba. This is considered a security +bug and will be fixed soon.

    Windows 98 [se]

  • Names of the columns in this table(I've added column types those columns should have first):

    Windows 2000

  • identifier:logon time column             - int(9)
    +identifier:logoff time column            - int(9)
    +identifier:kickoff time column           - int(9)
    +identifier:pass last set time column     - int(9)
    +identifier:pass can change time column   - int(9)
    +identifier:pass must change time column  - int(9)
    +identifier:username column               - varchar(255) - unix username
    +identifier:domain column                 - varchar(255) - NT domain user is part of
    +identifier:nt username column            - varchar(255) - NT username
    +identifier:fullname column            - varchar(255) - Full name of user
    +identifier:home dir column               - varchar(255) - Unix homedir path
    +identifier:dir drive column              - varchar(2) - Directory drive path (eg: 'H:')
    +identifier:logon script column           - varchar(255) - Batch file to run on client side when logging on
    +identifier:profile path column           - varchar(255) - Path of profile
    +identifier:acct desc column              - varchar(255) - Some ASCII NT user data
    +identifier:workstations column           - varchar(255) - Workstations user can logon to (or NULL for all)
    +identifier:unknown string column         - varchar(255) - unknown string
    +identifier:munged dial column            - varchar(255) - ?
    +identifier:uid column                    - int(9) - Unix user ID (uid)
    +identifier:gid column                    - int(9) - Unix user group (gid)
    +identifier:user sid column               - varchar(255) - NT user SID
    +identifier:group sid column              - varchar(255) - NT group ID
    +identifier:lanman pass column            - varchar(255) - encrypted lanman password
    +identifier:nt pass column                - varchar(255) - encrypted nt passwd
    +identifier:plain pass column             - varchar(255) - plaintext password
    +identifier:acct control column           - int(9) - nt user data
    +identifier:unknown 3 column              - int(9) - unknown
    +identifier:logon divs column             - int(9) - ?
    +identifier:hours len column              - int(9) - ?
    +identifier:unknown 5 column              - int(9) - unknown
    +identifier:unknown 6 column              - int(9) - unknown

    Note :All current release of - Microsoft SMB/CIFS clients support authentication via the - SMB Challenge/Response mechanism described here. Enabling - clear text authentication does not disable the ability - of the client to participate in encrypted authentication.

    Eventually, you can put a colon (:) after the name of each column, which +should specify the column to update when updating the table. You can also +specify nothing behind the colon - then the data from the field will not be +updated.


    5.2.1. Advantages of SMB Encryption

    3.7.4. Using plaintext passwords or encrypted password

    • I strongly discourage the use of plaintext passwords, however, you can use them:

      plain text passwords are not passed across - the network. Someone using a network sniffer cannot just - record passwords going to the SMB server.

    • If you would like to use plaintext passwords, set 'identifier:lanman pass column' and 'identifier:nt pass column' to 'NULL' (without the quotes) and 'identifier:plain pass column' to the name of the column containing the plaintext passwords.

      WinNT doesn't like talking to a server - that isn't using SMB encrypted passwords. It will refuse - to browse the server if the server is also in user level - security mode. It will insist on prompting the user for the - password on each connection, which is very annoying. The - only things you can do to stop this is to use SMB encryption. -

    If you use encrypted passwords, set the 'identifier:plain pass column' to 'NULL' (without the quotes). This is the default.


    5.2.2. Advantages of non-encrypted passwords

    3.7.5. Getting non-column data from the table

    • It is possible to have not all data in the database and making some 'constant'.

      plain text passwords are not kept - on disk.

    • For example, you can set 'identifier:fullname column' to : +CONCAT(First_name,' ',Sur_name)

      uses same password file as other unix - services such as login and ftp

    • Or, set 'identifier:workstations column' to : +NULL

      you are probably already using other - services (such as telnet and ftp) which send plain text - passwords over the net, so sending them for SMB isn't - such a big deal.

    See the MySQL documentation for more language constructs.


    5.3. The smbpasswd Command

    The smbpasswd command maintains the two 32 byte password fields - in the smbpasswd file. If you wish to make it similar to the unix - passwd or yppasswd programs, - install it in /usr/local/samba/bin/ (or your - main Samba binary directory).

    3.8. Passdb XML plugin

    3.8.1. Building

    smbpasswd now works in a client-server mode - where it contacts the local smbd to change the user's password on its - behalf. This has enormous benefits - as follows.

    This module requires libxml2 to be installed.

    To build pdb_xml, run: smbpasswd now has the capability - to change passwords on Windows NT servers (this only works when - the request is sent to the NT Primary Domain Controller if you - are changing an NT Domain user's password).

    To run smbpasswd as a normal user just type :

    $ smbpasswd

    Old SMB password: <type old value here - - or hit return if there was no old password>

    New SMB Password: <type new value> -

    Repeat New SMB Password: <re-type new value -

    If the old value does not match the current value stored for - that user, or the two new values do not match each other, then the - password will not be changed.

    If invoked by an ordinary user it will only allow the user - to change his or her own Samba password.

    If run by the root user smbpasswd may take an optional - argument, specifying the user name whose SMB password you wish to - change. Note that when run as root smbpasswd does not prompt for - or check the old password value, thus allowing root to set passwords - for users who have forgotten their passwords.

    make bin/pdb_xml.so in +the directory source/.


    3.8.2. Usage

    smbpasswd is designed to work in the same way - and be familiar to UNIX users who use the passwd or - The usage of pdb_xml is pretty straightforward. To export data, use: + +yppasswd commands.

    pdbedit -e plugin:/usr/lib/samba/pdb_xml.so:filename + +(where filename is the name of the file to put the data in)

    For more details on using To import data, use: +smbpasswd refer - to the man page which will always be the definitive reference.

    pdbedit -i plugin:/usr/lib/samba/pdb_xml.so:filename -e current-pdb + +Where filename is the name to read the data from and current-pdb to put it in.

    Introduction

    This part contains information on using samba in a (NT 4 or ADS) domain. -If you wish to run samba as a domain member or DC, read the appropriate chapter in -this part.

    Samba can operate in various SMB networks. This part contains information on configuring samba +for various environments.

    Table of Contents
    6. 4. User and Share security level (for servers not in a domain)
    5. How to Configure Samba as a NT4 Primary Domain ControllerSamba as a NT4 or Win2k Primary Domain Controller
    6.1. 5.1. Prerequisite Reading
    6.2. 5.2. Background
    6.3. 5.3. Configuring the Samba Domain Controller
    6.4. 5.4. Creating Machine Trust Accounts and Joining Clients to the Domain
    6.4.1. 5.4.1. Manual Creation of Machine Trust Accounts
    6.4.2. 5.4.2. "On-the-Fly" Creation of Machine Trust Accounts
    6.4.3. 5.4.3. Joining the Client to the Domain
    6.5. 5.5. Common Problems and Errors
    6.6. 5.6. System Policies and Profiles
    6.7. 5.7. What other help can I get?
    6.8. 5.8. Domain Control for Windows 9x/ME
    6.8.1. 5.8.1. Configuration Instructions: Network Logons
    6.8.2. 5.8.2. Configuration Instructions: Setting up Roaming User Profiles
    6.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba5.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba
    7. 6. How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain
    7.1. 6.1. Prerequisite Reading
    7.2. 6.2. Background
    7.3. 6.3. What qualifies a Domain Controller on the network?
    7.3.1. 6.3.1. How does a Workstation find its domain controller?
    7.3.2. 6.3.2. When is the PDC needed?
    7.4. Can Samba be a Backup Domain Controller?6.4. Can Samba be a Backup Domain Controller to an NT PDC?
    7.5. 6.5. How do I set up a Samba BDC?
    7.5.1. 6.5.1. How do I replicate the smbpasswd file?
    6.5.2. Can I do this all with LDAP?
    8. 7. Samba as a ADS domain member
    8.1. 7.1. Installing the required packages for Debian
    8.2. 7.2. Installing the required packages for RedHat
    8.3. 7.3. Compile Samba
    8.4. 7.4. Setup your /etc/krb5.conf
    8.5. 7.5. Create the computer account
    8.5.1. 7.5.1. Possible errors
    8.6. 7.6. Test your server setup
    8.7. 7.7. Testing with smbclient
    8.8. 7.8. Notes
    9. 8. Samba as a NT4 domain memberSamba as a NT4 or Win2k domain member
    9.1. Joining an NT Domain with Samba 2.28.1. Joining an NT Domain with Samba 3.0
    9.2. 8.2. Samba and Windows 2000 Domains
    9.3. 8.3. Why is this better than security = server?

    Chapter 4. User and Share security level (for servers not in a domain)

    A SMB server tells the client at startup what "security level" it is +running. There are two options "share level" and "user level". Which +of these two the client receives affects the way the client then tries +to authenticate itself. It does not directly affect (to any great +extent) the way the Samba server does security. I know this is +strange, but it fits in with the client/server approach of SMB. In SMB +everything is initiated and controlled by the client, and the server +can only tell the client what is available and whether an action is +allowed.

    I'll describe user level security first, as its simpler. In user level +security the client will send a "session setup" command directly after +the protocol negotiation. This contains a username and password. The +server can either accept or reject that username/password +combination. Note that at this stage the server has no idea what +share the client will eventually try to connect to, so it can't base +the "accept/reject" on anything other than:

    1. the username/password

    2. the machine that the client is coming from

    If the server accepts the username/password then the client expects to +be able to mount any share (using a "tree connection") without +specifying a password. It expects that all access rights will be as +the username/password specified in the "session setup".

    It is also possible for a client to send multiple "session setup" +requests. When the server responds it gives the client a "uid" to use +as an authentication tag for that username/password. The client can +maintain multiple authentication contexts in this way (WinDD is an +example of an application that does this)

    Ok, now for share level security. In share level security the client +authenticates itself separately for each share. It will send a +password along with each "tree connection" (share mount). It does not +explicitly send a username with this operation. The client is +expecting a password to be associated with each share, independent of +the user. This means that samba has to work out what username the +client probably wants to use. It is never explicitly sent the +username. Some commercial SMB servers such as NT actually associate +passwords directly with shares in share level security, but samba +always uses the unix authentication scheme where it is a +username/password that is authenticated, not a "share/password".

    Many clients send a "session setup" even if the server is in share +level security. They normally send a valid username but no +password. Samba records this username in a list of "possible +usernames". When the client then does a "tree connection" it also adds +to this list the name of the share they try to connect to (useful for +home directories) and any users listed in the "user =" smb.conf +line. The password is then checked in turn against these "possible +usernames". If a match is found then the client is authenticated as +that user.

    Finally "server level" security. In server level security the samba +server reports to the client that it is in user level security. The +client then does a "session setup" as described earlier. The samba +server takes the username/password that the client sends and attempts +to login to the "password server" by sending exactly the same +username/password that it got from the client. If that server is in +user level security and accepts the password then samba accepts the +clients connection. This allows the samba server to use another SMB +server as the "password server".

    You should also note that at the very start of all this, where the +server tells the client what security level it is in, it also tells +the client if it supports encryption. If it does then it supplies the +client with a random "cryptkey". The client will then send all +passwords in encrypted form. You have to compile samba with encryption +enabled to support this feature, and you have to maintain a separate +smbpasswd file with SMB style encrypted passwords. It is +cryptographically impossible to translate from unix style encryption +to SMB style encryption, although there are some fairly simple management +schemes by which the two could be kept in sync.

    "security = server" means that Samba reports to clients that +it is running in "user mode" but actually passes off all authentication +requests to another "user mode" server. This requires an additional +parameter "password server =" that points to the real authentication server. +That real authentication server can be another Samba server or can be a +Windows NT server, the later natively capable of encrypted password support.


    Chapter 6. How to Configure Samba as a NT4 Primary Domain Controller

    Chapter 5. Samba as a NT4 or Win2k Primary Domain Controller

    6.1. Prerequisite Reading

    5.1. Prerequisite Reading

    Before you continue reading in this chapter, please make sure that you are comfortable with configuring basic files services @@ -3885,9 +4339,9 @@ CLASS="SECT1" >


    6.2. Background

    5.2. Background

    Note


    6.3. Configuring the Samba Domain Controller

    5.3. Configuring the Samba Domain Controller

    The first step in creating a working Samba PDC is to understand the parameters necessary in smb.conf. I will not @@ -4249,9 +4703,9 @@ CLASS="SECT1" >


    6.4. Creating Machine Trust Accounts and Joining Clients to the +>5.4. Creating Machine Trust Accounts and Joining Clients to the Domain

    A machine trust account is a Samba account that is used to @@ -4323,9 +4777,9 @@ CLASS="SECT2" >


    6.4.1. Manual Creation of Machine Trust Accounts

    5.4.1. Manual Creation of Machine Trust Accounts

    The first step in manually creating a machine trust account is to manually create the corresponding Unix account in @@ -4477,7 +4931,7 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" >Warning


    6.4.2. "On-the-Fly" Creation of Machine Trust Accounts

    5.4.2. "On-the-Fly" Creation of Machine Trust Accounts

    The second (and recommended) way of creating machine trust accounts is simply to allow the Samba server to create them as needed when the client @@ -4541,7 +4995,7 @@ be created manually.

    [global]
    -   # <...remainder of parameters...>
    +   # <...remainder of parameters...>
        add user script = /usr/sbin/useradd -d /dev/null -g 100 -s /bin/false -M %u 


    6.4.3. Joining the Client to the Domain

    5.4.3. Joining the Client to the Domain

    The procedure for joining a client to the domain varies with the version of Windows.


    6.5. Common Problems and Errors

    5.5. Common Problems and Errors


    6.6. System Policies and Profiles

    5.6. System Policies and Profiles

    Much of the information necessary to implement System Policies and Roving User Profiles in a Samba domain is the same as that for @@ -5005,9 +5459,9 @@ CLASS="SECT1" >


    6.7. What other help can I get?

    5.7. What other help can I get?

    There are many sources of information available in the form of mailing lists, RFC's and documentation. The docs that come @@ -5425,9 +5879,9 @@ CLASS="SECT1" >


    6.8. Domain Control for Windows 9x/ME

    5.8. Domain Control for Windows 9x/ME

    Note

  • The client broadcasts (to the IP broadcast address of the subnet it is in) - a NetLogon request. This is sent to the NetBIOS name DOMAIN<1c> at the + a NetLogon request. This is sent to the NetBIOS name DOMAIN<1c> at the NetBIOS layer. The client chooses the first response it receives, which contains the NetBIOS name of the logon server to use in the format of \\SERVER. @@ -5559,9 +6013,9 @@ CLASS="SECT2" >


    6.8.1. Configuration Instructions: Network Logons

    5.8.1. Configuration Instructions: Network Logons

    The main difference between a PDC and a Windows 9x logon server configuration is that

    Warning

    6.8.2. Configuration Instructions: Setting up Roaming User Profiles

    5.8.2. Configuration Instructions: Setting up Roaming User Profiles

    Warning


    6.8.2.1. Windows NT Configuration

    5.8.2.1. Windows NT Configuration

    To support WinNT clients, in the [global] section of smb.conf set the following (for example):

    Note

    6.8.2.2. Windows 9X Configuration

    5.8.2.2. Windows 9X Configuration

    To support Win9X clients, you must use the "logon home" parameter. Samba has now been fixed so that "net use/home" now works as well, and it, too, relies @@ -5800,9 +6254,9 @@ CLASS="SECT3" >


    6.8.2.3. Win9X and WinNT Configuration

    5.8.2.3. Win9X and WinNT Configuration

    You can support profiles for both Win9X and WinNT clients by setting both the "logon home" and "logon path" parameters. For example:

    Note

    6.8.2.4. Windows 9X Profile Setup

    5.8.2.4. Windows 9X Profile Setup

    When a user first logs in on Windows 9X, the file user.DAT is created, as are folders "Start Menu", "Desktop", "Programs" and "Nethood". @@ -6005,9 +6459,9 @@ CLASS="SECT3" >


    6.8.2.5. Windows NT Workstation 4.0

    5.8.2.5. Windows NT Workstation 4.0

    When a user first logs in to a Windows NT Workstation, the profile NTuser.DAT is created. The profile location can be now specified @@ -6026,7 +6480,7 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" >NoteNote


    6.8.2.6. Windows NT Server

    5.8.2.6. Windows NT Server

    There is nothing to stop you specifying any path that you like for the location of users' profiles. Therefore, you could specify that the @@ -6133,9 +6587,9 @@ CLASS="SECT3" >


    6.8.2.7. Sharing Profiles between W95 and NT Workstation 4.0

    5.8.2.7. Sharing Profiles between W95 and NT Workstation 4.0

    WarningNote


    6.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba

    5.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba

    WarningChapter 7. How to Act as a Backup Domain Controller in a Purely Samba Controlled DomainChapter 6. How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain

    7.1. Prerequisite Reading

    6.1. Prerequisite Reading

    Before you continue reading in this chapter, please make sure that you are comfortable with configuring a Samba PDC @@ -6388,9 +6842,9 @@ CLASS="SECT1" >


    7.2. Background

    6.2. Background

    What is a Domain Controller? It is a machine that is able to answer logon requests from workstations in a Windows NT Domain. Whenever a @@ -6433,9 +6887,9 @@ CLASS="SECT1" >


    7.3. What qualifies a Domain Controller on the network?

    6.3. What qualifies a Domain Controller on the network?

    Every machine that is a Domain Controller for the domain SAMBA has to register the NetBIOS group name SAMBA#1c with the WINS server and/or @@ -6450,9 +6904,9 @@ CLASS="SECT2" >


    7.3.1. How does a Workstation find its domain controller?

    6.3.1. How does a Workstation find its domain controller?

    A NT workstation in the domain SAMBA that wants a local user to be authenticated has to find the domain controller for SAMBA. It does @@ -6469,9 +6923,9 @@ CLASS="SECT2" >


    7.3.2. When is the PDC needed?

    6.3.2. When is the PDC needed?

    Whenever a user wants to change his password, this has to be done on the PDC. To find the PDC, the workstation does a NetBIOS name query @@ -6485,15 +6939,19 @@ CLASS="SECT1" >


    7.4. Can Samba be a Backup Domain Controller?

    6.4. Can Samba be a Backup Domain Controller to an NT PDC?

    With version 2.2, no. The native NT SAM replication protocols have not yet been fully implemented. The Samba Team is working on understanding and implementing the protocols, but this work has not been finished for version 2.2.

    With version 3.0, the work on both the replication protocols and a +suitable storage mechanism has progressed, and some form of NT4 BDC +support is expected soon.

    Can I get the benefits of a BDC with Samba? Yes. The main reason for implementing a BDC is availability. If the PDC is a Samba machine, a second Samba machine can be set up to @@ -6504,9 +6962,9 @@ CLASS="SECT1" >


    7.5. How do I set up a Samba BDC?

    6.5. How do I set up a Samba BDC?

    Several things have to be done:


    7.5.1. How do I replicate the smbpasswd file?

    6.5.1. How do I replicate the smbpasswd file?

    Replication of the smbpasswd file is sensitive. It has to be done whenever changes to the SAM are made. Every user's password change is @@ -6587,6 +7045,21 @@ rsync. rsync can use ssh as a transport. ssh itself can be set up to accept *only* rsync transfer without requiring the user to type a password.


    6.5.2. Can I do this all with LDAP?

    The simple answer is YES. Samba's pdb_ldap code supports +binding to a replica LDAP server, and will also follow referrals and +rebind to the master if it ever needs to make a modification to the +database. (Normally BDCs are read only, so this will not occur +often).

    Chapter 8. Samba as a ADS domain memberChapter 7. Samba as a ADS domain member

    This is a rough guide to setting up Samba 3.0 with kerberos authentication against a +Windows2000 KDC.

    Pieces you need before you begin:

    This is a VERY ROUGH guide to setting up the current (November 2001) -pre-alpha version of Samba 3.0 with kerberos authentication against a -Windows2000 KDC. The procedures listed here are likely to change as -the code develops.

    Pieces you need before you begin: -


    8.1. Installing the required packages for Debian

    7.1. Installing the required packages for Debian

    On Debian you need to install the following packages:

    On Debian you need to install the following packages: -


    8.2. Installing the required packages for RedHat

    7.2. Installing the required packages for RedHat

    On RedHat this means you should have at least:

    On RedHat this means you should have at least: -


    8.3. Compile Samba

    7.3. Compile Samba

    If your kerberos libraries are in a non-standard location then remember to add the configure option --with-krb5=DIR.

    After you run configure make sure that include/config.h contains +>After you run configure make sure that include/config.h it + generates contains lines like this:

      realm = YOUR.KERBEROS.REALM
    -  ads server = your.kerberos.server
       security = ADS
       encrypt passwords = yes

    Strictly speaking, you can omit the realm name and you can use an IP - address for the ads server. In that case Samba will auto-detect these.

    In case samba can't figure out your ads server using your realm name, use the +ads server option in smb.conf: +
      ads server = your.kerberos.server

    You do *not* need a smbpasswd file, although it won't do any harm - and if you have one then Samba will be able to fall back to normal - password security for older clients. I expect that the above +>You do *not* need a smbpasswd file, and older clients will + be authenticated as if "security = domain", although it won't do any harm + and allows you to have local users not in the domain. + I expect that the above required options will change soon when we get better active directory integration.


    8.4. Setup your /etc/krb5.conf

    7.4. Setup your /etc/krb5.conf

    The minimal configuration for krb5.conf is:

    	[realms]
    +>[realms]
         YOUR.KERBEROS.REALM = {
     	kdc = your.kerberos.server
         }

    If all you want is kerberos support in smbclient then you can skip straight to step 5 now. Step 3 is only needed if you want kerberos -support in smbd.


    8.5. Create the computer account

    7.5. Create the computer account

    Do a "kinit" as a user that has authority to change arbitrary -passwords on the KDC ("Administrator" is a good choice). Then as a -user that has write permission on the Samba private directory +>As a user that has write permission on the Samba private directory (usually root) run:


    8.5.1. Possible errors

    7.5.1. Possible errors

    "bash: kinit: command not found"

    kinit is in the krb5-workstation RPM on RedHat systems, and is in /usr/kerberos/bin, so it won't be in the path until you log in again (or open a new terminal)

    "ADS support not compiled in"


    8.6. Test your server setup

    7.6. Test your server setup

    On a Windows 2000 client try


    8.7. Testing with smbclient

    7.7. Testing with smbclient

    On your Samba server try to login to a Win2000 server or your Samba server using smbclient and kerberos. Use smbclient as usual, but @@ -6866,9 +7343,9 @@ CLASS="SECT1" >


    8.8. Notes

    7.8. Notes

    You must change administrator password at least once after DC install, to create the right encoding types

    Chapter 9. Samba as a NT4 domain memberChapter 8. Samba as a NT4 or Win2k domain member

    9.1. Joining an NT Domain with Samba 2.2

    8.1. Joining an NT Domain with Samba 3.0

    Assume you have a Samba 2.x server with a NetBIOS name of +>Assume you have a Samba 3.0 server with a NetBIOS name of SERV1 and are joining an NT domain called +> and are joining an or Win2k NT domain called DOM.

    In order to join the domain, first stop all Samba daemons - and run the command:

    root# smbpasswd -j DOM -r DOMPDC - -UAdministrator%password

    as we are joining the domain DOM and the PDC for that domain - (the only machine that has write access to the domain SAM database) - is DOMPDC. The Administrator%password is - the login name and password for an account which has the necessary - privilege to add machines to the domain. If this is successful - you will see the message:

    smbpasswd: Joined domain DOM. -

    in your terminal window. See the smbpasswd(8) man page for more details.

    There is existing development code to join a domain - without having to create the machine trust account on the PDC - beforehand. This code will hopefully be available soon - in release branches as well.

    This command goes through the machine account password - change protocol, then writes the new (random) machine account - password for this Samba server into a file in the same directory - in which an smbpasswd file would be stored - normally :

    /usr/local/samba/private

    In Samba 2.0.x, the filename looks like this:

    <NT DOMAIN NAME>.<Samba - Server Name>.mac

    The .mac suffix stands for machine account - password file. So in our example above, the file would be called:

    DOM.SERV1.mac

    In Samba 2.2, this file has been replaced with a TDB - (Trivial Database) file named secrets.tdb. -

    This file is created and owned by root and is not - readable by any other user. It is the key to the domain-level - security for your system, and should be treated as carefully - as a shadow password file.

    Now, before restarting the Samba daemons you must - edit your Firstly, you must edit your security = domain

    or + security = ads depending on if the PDC is + NT4 or running Active Directory respectivly.

    Next change the line in the [global] section to read:

    password server = DOMPDC DOMBDC1 DOMBDC2

    password server = DOMPDC DOMBDC1 DOMBDC2

    These are the primary and backup domain controllers Samba + will attempt to contact in order to authenticate users. Samba will + try to contact each of these servers in order, so you may want to + rearrange this list in order to spread out the authentication load + among domain controllers.

    Alternatively, if you want smbd to automatically determine + the list of Domain controllers to use for authentication, you may + set this line to be :

    password server = *

    This method, allows Samba to use exactly the same + mechanism that NT does. This + method either broadcasts or uses a WINS database in order to + find domain controllers to authenticate against.

    In order to actually join the domain, you must run this + command:

    root# net join -S DOMPDC + -UAdministrator%password

    as we are joining the domain DOM and the PDC for that domain + (the only machine that has write access to the domain SAM database) + is DOMPDC. The Administrator%password is + the login name and password for an account which has the necessary + privilege to add machines to the domain. If this is successful + you will see the message:

    Joined domain DOM. + or Joined 'SERV1' to realm 'MYREALM' +

    in your terminal window. See the net(8) man page for more details.

    These are the primary and backup domain controllers Samba - will attempt to contact in order to authenticate users. Samba will - try to contact each of these servers in order, so you may want to - rearrange this list in order to spread out the authentication load - among domain controllers.

    This process joins the server to thedomain + without having to create the machine trust account on the PDC + beforehand.

    Alternatively, if you want smbd to automatically determine - the list of Domain controllers to use for authentication, you may - set this line to be :

    This command goes through the machine account password + change protocol, then writes the new (random) machine account + password for this Samba server into a file in the same directory + in which an smbpasswd file would be stored - normally :

    password server = */usr/local/samba/private/secrets.tdb

    This method, which was introduced in Samba 2.0.6, - allows Samba to use exactly the same mechanism that NT does. This - method either broadcasts or uses a WINS database in order to - find domain controllers to authenticate against.

    This file is created and owned by root and is not + readable by any other user. It is the key to the domain-level + security for your system, and should be treated as carefully + as a shadow password file.

    Finally, restart your Samba daemons and get ready for clients to begin using domain security!


    9.2. Samba and Windows 2000 Domains

    8.2. Samba and Windows 2000 Domains

    Many people have asked regarding the state of Samba's ability to participate in a Windows 2000 Domain. Samba 3.0 is able to act as a member server of a Windows -2000 domain operating in mixed or native mode.

    There is much confusion between the circumstances that require a "mixed" mode -Win2k DC and a when this host can be switched to "native" mode. A "mixed" mode -Win2k domain controller is only needed if Windows NT BDCs must exist in the same -domain. By default, a Win2k DC in "native" mode will still support -NetBIOS and NTLMv1 for authentication of legacy clients such as Windows 9x and -NT 4.0. Samba has the same requirements as a Windows NT 4.0 member server.

    The steps for adding a Samba 2.2 host to a Win2k domain are the same as those -for adding a Samba server to a Windows NT 4.0 domain. The only exception is that -the "Server Manager" from NT 4 has been replaced by the "Active Directory Users and -Computers" MMC (Microsoft Management Console) plugin.


    9.3. Why is this better than security = server?

    8.3. Why is this better than security = server?

    Currently, domain security in Samba doesn't free you from having to create local Unix users to represent the users attaching @@ -7203,13 +7640,7 @@ CLASS="COMMAND" >And finally, acting in the same manner as an NT server authenticating to a PDC means that as part of the authentication reply, the Samba server gets the user identification information such - as the user SID, the list of NT groups the user belongs to, etc. All - this information will allow Samba to be extended in the future into - a mode the developers currently call appliance mode. In this mode, - no local Unix users will be necessary, and Samba will generate Unix - uids and gids from the information passed back from the PDC when a - user is authenticated, making a Samba server truly plug and play - in an NT domain environment. Watch for this code soon.

    Introduction

    Table of Contents
    10. 9. Integrating MS Windows networks with Samba
    10.1. 9.1. Agenda
    10.2. 9.2. Name Resolution in a pure Unix/Linux world
    10.2.1. 9.2.1. /etc/hosts
    10.2.2. 9.2.2. /etc/resolv.conf
    10.2.3. 9.2.3. /etc/host.conf
    10.2.4. 9.2.4. /etc/nsswitch.conf
    10.3. 9.3. Name resolution as used within MS Windows networking
    10.3.1. 9.3.1. The NetBIOS Name Cache
    10.3.2. 9.3.2. The LMHOSTS file
    10.3.3. 9.3.3. HOSTS file
    10.3.4. 9.3.4. DNS Lookup
    10.3.5. 9.3.5. WINS Lookup
    10.4. 9.4. How browsing functions and how to deploy stable and dependable browsing using Samba
    10.5. 9.5. MS Windows security options and how to configure Samba for seemless integration
    10.5.1. 9.5.1. Use MS Windows NT as an authentication server
    10.5.2. 9.5.2. Make Samba a member of an MS Windows NT security domain
    10.5.3. 9.5.3. Configure Samba as an authentication server
    10.6. 9.6. Conclusions
    11. 10. UNIX Permission Bits and Windows NT Access Control Lists
    11.1. 10.1. Viewing and changing UNIX permissions using the NT security dialogs
    11.2. 10.2. How to view file security on a Samba share
    11.3. 10.3. Viewing file ownership
    11.4. 10.4. Viewing file or directory permissions
    11.4.1. 10.4.1. File Permissions
    11.4.2. 10.4.2. Directory Permissions
    11.5. 10.5. Modifying file or directory permissions
    11.6. 10.6. Interaction with the standard Samba create mask parameters
    11.7. 10.7. Interaction with the standard Samba file attribute mapping
    12. 11. Configuring PAM for distributed but centrally managed authentication
    12.1. 11.1. Samba and PAM
    12.2. 11.2. Distributed Authentication
    12.3. 11.3. PAM Configuration in smb.conf
    13. 12. Hosting a Microsoft Distributed File System tree on Samba
    13.1. 12.1. Instructions
    13.1.1. 12.1.1. Notes
    14. 13. Printing Support
    14.1. 13.1. Introduction
    14.2. 13.2. Configuration
    14.2.1. 13.2.1. Creating [print$]
    14.2.2. 13.2.2. Setting Drivers for Existing Printers
    14.2.3. 13.2.3. Support a large number of printers
    14.2.4. 13.2.4. Adding New Printers via the Windows NT APW
    14.2.5. 13.2.5. Samba and Printer Ports
    14.3. 13.3. The Imprints Toolset
    14.3.1. 13.3.1. What is Imprints?
    14.3.2. 13.3.2. Creating Printer Driver Packages
    14.3.3. 13.3.3. The Imprints server
    14.3.4. 13.3.4. The Installation Client
    14.4. 13.4. Diagnosis
    14.4.1. 13.4.1. Introduction
    14.4.2. 13.4.2. Debugging printer problems
    14.4.3. 13.4.3. What printers do I have?
    14.4.4. 13.4.4. Setting up printcap and print servers
    14.4.5. 13.4.5. Job sent, no output
    14.4.6. 13.4.6. Job sent, strange output
    14.4.7. 13.4.7. Raw PostScript printed
    14.4.8. 13.4.8. Advanced Printing
    14.4.9. 13.4.9. Real debugging
    15. Security levels
    15.1. Introduction
    15.2. More complete description of security levels
    16. 14. Unified Logons between Windows NT and UNIX using Winbind
    16.1. 14.1. Abstract
    16.2. 14.2. Introduction
    16.3. 14.3. What Winbind Provides
    16.3.1. 14.3.1. Target Uses
    16.4. 14.4. How Winbind Works
    16.4.1. 14.4.1. Microsoft Remote Procedure Calls
    16.4.2. 14.4.2. Microsoft Active Directory Services
    14.4.3. Name Service Switch
    16.4.3. 14.4.4. Pluggable Authentication Modules
    16.4.4. 14.4.5. User and Group ID Allocation
    16.4.5. 14.4.6. Result Caching
    16.5. 14.5. Installation and Configuration
    16.5.1. 14.5.1. Introduction
    16.5.2. 14.5.2. Requirements
    16.5.3. 14.5.3. Testing Things Out
    16.6. 14.6. Limitations
    16.7. 14.7. Conclusion
    17. Passdb MySQL plugin15. Improved browsing in samba
    17.1. Building
    17.2. Configuring15.1. Overview of browsing
    17.3. Using plaintext passwords or encrypted password15.2. Browsing support in samba
    17.4. Getting non-column data from the table15.3. Problem resolution
    18. Passdb XML plugin15.4. Browsing across subnets
    18.1. Building
    18.2. Usage15.4.1. How does cross subnet browsing work ?
    19. Storing Samba's User/Machine Account information in an LDAP Directory15.5. Setting up a WINS server
    19.1. Purpose15.6. Setting up Browsing in a WORKGROUP
    19.2. Introduction15.7. Setting up Browsing in a DOMAIN
    19.3. Supported LDAP Servers15.8. Forcing samba to be the master
    19.4. Schema and Relationship to the RFC 2307 posixAccount15.9. Making samba the domain master
    19.5. Configuring Samba with LDAP15.10. Note about broadcast addresses
    15.11. Multiple interfaces
    16. Stackable VFS modules
    19.5.1. OpenLDAP configuration16.1. Introduction and configuration
    19.5.2. Configuring Samba16.2. Included modules
    19.6. Accounts and Groups management16.2.1. audit
    19.7. Security and sambaAccount16.2.2. recycle
    19.8. LDAP specials attributes for sambaAccounts16.2.3. netatalk
    19.9. Example LDIF Entries for a sambaAccount16.3. VFS modules available elsewhere
    19.10. Comments16.3.1. DatabaseFS
    16.3.2. vscan
    20. 17. HOWTO Access Samba source code via CVSAccess Samba source code via CVS
    20.1. 17.1. Introduction
    20.2. 17.2. CVS Access to samba.org
    20.2.1. 17.2.1. Access via CVSweb
    20.2.2. 17.2.2. Access via cvs
    21. 18. Group mapping HOWTO
    22. 19. Samba performance issues
    22.1. 19.1. Comparisons
    22.2. Oplocks
    22.2.1. Overview
    22.2.2. Level2 Oplocks19.2. Socket options
    22.2.3. Old 'fake oplocks' option - deprecated19.3. Read size
    22.3. Socket options19.4. Max xmit
    22.4. Read size19.5. Log level
    22.5. Max xmit19.6. Read raw
    22.6. Locking19.7. Write raw
    22.7. Share modes19.8. Slow Clients
    22.8. Log level19.9. Slow Logins
    22.9. Wide lines19.10. Client tuning
    22.10. Read raw20. Creating Group Profiles
    22.11. Write raw20.1. Windows '9x
    22.12. Read prediction20.2. Windows NT 4
    22.13. Memory mapping20.2.1. Side bar Notes
    22.14. Slow Clients20.2.2. Mandatory profiles
    22.15. Slow Logins20.2.3. moveuser.exe
    22.16. Client tuning20.2.4. Get SID
    22.17. My Results20.3. Windows 2000/XP
    Chapter 10. Integrating MS Windows networks with SambaChapter 9. Integrating MS Windows networks with Samba

    10.1. Agenda

    9.1. Agenda

    To identify the key functional mechanisms of MS Windows networking to enable the deployment of Samba as a means of extending and/or @@ -8099,9 +8519,9 @@ CLASS="SECT1" >


    10.2. Name Resolution in a pure Unix/Linux world

    9.2. Name Resolution in a pure Unix/Linux world

    The key configuration files covered in this section are:


    10.2.1. 9.2.1. /etc/hosts


    10.2.2. 9.2.2. /etc/resolv.conf


    10.2.3. 9.2.3. /etc/host.conf


    10.2.4. 9.2.4. /etc/nsswitch.conf


    10.3. Name resolution as used within MS Windows networking

    9.3. Name resolution as used within MS Windows networking

    MS Windows networking is predicated about the name each machine is given. This name is known variously (and inconsistently) as @@ -8380,16 +8800,16 @@ the client/server.

    	Unique NetBIOS Names:
    -		MACHINENAME<00>	= Server Service is running on MACHINENAME
    -		MACHINENAME<03> = Generic Machine Name (NetBIOS name)
    -		MACHINENAME<20> = LanMan Server service is running on MACHINENAME
    -		WORKGROUP<1b> = Domain Master Browser
    +		MACHINENAME<00>	= Server Service is running on MACHINENAME
    +		MACHINENAME<03> = Generic Machine Name (NetBIOS name)
    +		MACHINENAME<20> = LanMan Server service is running on MACHINENAME
    +		WORKGROUP<1b> = Domain Master Browser
     
     	Group Names:
    -		WORKGROUP<03> = Generic Name registered by all members of WORKGROUP
    -		WORKGROUP<1c> = Domain Controllers / Netlogon Servers
    -		WORKGROUP<1d> = Local Master Browsers
    -		WORKGROUP<1e> = Internet Name Resolvers

    It should be noted that all NetBIOS machines register their own @@ -8408,7 +8828,7 @@ be needed. An example of this is what happens when an MS Windows client wants to locate a domain logon server. It find this service and the IP address of a server that provides it by performing a lookup (via a NetBIOS broadcast) for enumeration of all machines that have -registered the name type *<1c>. A logon request is then sent to each +registered the name type *<1c>. A logon request is then sent to each IP address that is returned in the enumerated list of IP addresses. Which ever machine first replies then ends up providing the logon services.


    10.3.1. The NetBIOS Name Cache

    9.3.1. The NetBIOS Name Cache

    All MS Windows machines employ an in memory buffer in which is stored the NetBIOS names and IP addresses for all external @@ -8470,9 +8890,9 @@ CLASS="SECT2" >


    10.3.2. The LMHOSTS file

    9.3.2. The LMHOSTS file

    This file is usually located in MS Windows NT 4.0 or 2000 in


    10.3.3. HOSTS file

    9.3.3. HOSTS file

    This file is usually located in MS Windows NT 4.0 or 2000 in


    10.3.4. DNS Lookup

    9.3.4. DNS Lookup

    This capability is configured in the TCP/IP setup area in the network configuration facility. If enabled an elaborate name resolution sequence @@ -8615,9 +9035,9 @@ CLASS="SECT2" >


    10.3.5. WINS Lookup

    9.3.5. WINS Lookup

    A WINS (Windows Internet Name Server) service is the equivaent of the rfc1001/1002 specified NBNS (NetBIOS Name Server). A WINS server stores @@ -8658,9 +9078,9 @@ CLASS="SECT1" >


    10.4. How browsing functions and how to deploy stable and +>9.4. How browsing functions and how to deploy stable and dependable browsing using Samba

    As stated above, MS Windows machines register their NetBIOS names @@ -8725,9 +9145,9 @@ CLASS="SECT1" >


    10.5. MS Windows security options and how to configure +>9.5. MS Windows security options and how to configure Samba for seemless integration

    MS Windows clients may use encrypted passwords as part of a @@ -8862,9 +9282,9 @@ CLASS="SECT2" >


    10.5.1. Use MS Windows NT as an authentication server

    9.5.1. Use MS Windows NT as an authentication server

    This method involves the additions of the following parameters in the smb.conf file:


    10.5.2. Make Samba a member of an MS Windows NT security domain

    9.5.2. Make Samba a member of an MS Windows NT security domain

    This method involves additon of the following paramters in the smb.conf file:


    10.5.3. Configure Samba as an authentication server

    9.5.3. Configure Samba as an authentication server

    This mode of authentication demands that there be on the Unix/Linux system both a Unix style account as well as an @@ -8998,9 +9418,9 @@ CLASS="SECT3" >


    10.5.3.1. Users

    9.5.3.1. Users

    A user account that may provide a home directory should be created. The following Linux system commands are typical of @@ -9021,9 +9441,9 @@ CLASS="SECT3" >


    10.5.3.2. MS Windows NT Machine Accounts

    9.5.3.2. MS Windows NT Machine Accounts

    These are required only when Samba is used as a domain controller. Refer to the Samba-PDC-HOWTO for more details.


    10.6. Conclusions

    9.6. Conclusions

    Samba provides a flexible means to operate as...

    Chapter 11. UNIX Permission Bits and Windows NT Access Control ListsChapter 10. UNIX Permission Bits and Windows NT Access Control Lists

    11.1. Viewing and changing UNIX permissions using the NT +>10.1. Viewing and changing UNIX permissions using the NT security dialogs

    New in the Samba 2.0.4 release is the ability for Windows @@ -9099,35 +9519,15 @@ NAME="AEN1593" the security of the UNIX host Samba is running on, and still obeys all the file permission rules that a Samba administrator can set.

    In Samba 2.0.4 and above the default value of the - parameter nt acl support has been changed from - false to true, so - manipulation of permissions is turned on by default.


    11.2. How to view file security on a Samba share

    10.2. How to view file security on a Samba share

    From an NT 4.0 client, single-click with the right mouse button on any file or directory in a Samba mounted @@ -9195,9 +9595,9 @@ CLASS="SECT1" >


    11.3. Viewing file ownership

    10.3. Viewing file ownership

    Clicking on the


    11.4. Viewing file or directory permissions

    10.4. Viewing file or directory permissions

    The third button is the


    11.4.1. File Permissions

    10.4.1. File Permissions

    The standard UNIX user/group/world triple and the corresponding "read", "write", "execute" permissions @@ -9413,9 +9813,9 @@ CLASS="SECT2" >


    11.4.2. Directory Permissions

    10.4.2. Directory Permissions

    Directories on an NT NTFS file system have two different sets of permissions. The first set of permissions @@ -9445,9 +9845,9 @@ CLASS="SECT1" >


    11.5. Modifying file or directory permissions

    10.5. Modifying file or directory permissions

    Modifying file and directory permissions is as simple as changing the displayed permissions in the dialog box, and @@ -9543,9 +9943,9 @@ CLASS="SECT1" >


    11.6. Interaction with the standard Samba create mask +>10.6. Interaction with the standard Samba create mask parameters

    Note that with Samba 2.0.5 there are four new parameters @@ -9820,9 +10220,9 @@ CLASS="SECT1" >


    11.7. Interaction with the standard Samba file attribute +>10.7. Interaction with the standard Samba file attribute mapping

    Samba maps some of the DOS attribute bits (such as "read @@ -9869,16 +10269,16 @@ CLASS="CHAPTER" >Chapter 12. Configuring PAM for distributed but centrally +>Chapter 11. Configuring PAM for distributed but centrally managed authentication

    12.1. Samba and PAM

    11.1. Samba and PAM

    A number of Unix systems (eg: Sun Solaris), as well as the xxxxBSD family and Linux, now utilize the Pluggable Authentication @@ -10090,9 +10490,9 @@ CLASS="SECT1" >


    12.2. Distributed Authentication

    11.2. Distributed Authentication

    The astute administrator will realize from this that the combination of


    12.3. PAM Configuration in smb.conf

    11.3. PAM Configuration in smb.conf

    There is an option in smb.conf called Chapter 13. Hosting a Microsoft Distributed File System tree on SambaChapter 12. Hosting a Microsoft Distributed File System tree on Samba

    13.1. Instructions

    12.1. Instructions

    The Distributed File System (or Dfs) provides a means of separating the logical view of files and directories that users @@ -10319,9 +10719,9 @@ CLASS="SECT2" >


    13.1.1. Notes

    12.1.1. Notes

      Chapter 14. Printing SupportChapter 13. Printing Support

      14.1. Introduction

      13.1. Introduction

      Beginning with the 2.2.0 release, Samba supports the native Windows NT printing mechanisms implemented via @@ -10443,9 +10843,9 @@ CLASS="SECT1" >


      14.2. Configuration

      13.2. Configuration

      Warning

    Next

    Chapter 3. Quick Cross Subnet Browsing / Cross Workgroup Browsing guide

    Chapter 2. Quick Cross Subnet Browsing / Cross Workgroup Browsing guide

    This document should be read in conjunction with Browsing and may be taken as the fast track guide to implementing browsing across subnets @@ -85,7 +86,9 @@ CLASS="SECT1" >

    3.1. Discussion

    2.1. Discussion

    Firstly, all MS Windows networking is based on SMB (Server Message Block) based messaging. SMB messaging is implemented using NetBIOS. Samba @@ -129,7 +132,9 @@ CLASS="SECT1" >

    3.2. Use of the "Remote Announce" parameter

    2.2. Use of the "Remote Announce" parameter

    The "remote announce" parameter of smb.conf can be used to forcibly ensure that all the NetBIOS names on a network get announced to a remote network. @@ -185,7 +190,9 @@ CLASS="SECT1" >

    3.3. Use of the "Remote Browse Sync" parameter

    2.3. Use of the "Remote Browse Sync" parameter

    The "remote browse sync" parameter of smb.conf is used to announce to another LMB that it must synchronise it's NetBIOS name list with our @@ -193,9 +200,10 @@ Samba LMB. It works ONLY if the Samba server that has this option is simultaneously the LMB on it's network segment.

    The syntax of the "remote browse sync" parameter is: +

    	remote browse sync = a.b.c.d
    remote browse sync = a.b.c.d where a.b.c.d is either the IP address of the remote LMB or else is the network broadcast address of the remote segment.

    3.4. Use of WINS

    2.4. Use of WINS

    Use of WINS (either Samba WINS _or_ MS Windows NT Server WINS) is highly recommended. Every NetBIOS machine registers it's name together with a @@ -265,7 +275,9 @@ CLASS="SECT1" >

    3.5. Do NOT use more than one (1) protocol on MS Windows machines

    2.5. Do NOT use more than one (1) protocol on MS Windows machines

    A very common cause of browsing problems results from installing more than one protocol on an MS Windows machine.

    3.6. Name Resolution Order

    2.6. Name Resolution Order

    Resolution of NetBIOS names to IP addresses can take place using a number of methods. The only ones that can provide NetBIOS name_type information -are: -


    14.2.1. Creating [print$]

    13.2.1. Creating [print$]

    In order to support the uploading of printer driver files, you must first configure a file share named [print$]. @@ -10590,7 +10990,7 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" >Note

    Warning

    14.2.2. Setting Drivers for Existing Printers

    13.2.2. Setting Drivers for Existing Printers

    The initial listing of printers in the Samba host's Printers folder will have no real printer driver assigned @@ -10804,9 +11204,9 @@ CLASS="SECT2" >


    14.2.3. Support a large number of printers

    13.2.3. Support a large number of printers

    One issue that has arisen during the development phase of Samba 2.2 is the need to support driver downloads for @@ -10870,9 +11270,9 @@ CLASS="SECT2" >


    14.2.4. Adding New Printers via the Windows NT APW

    13.2.4. Adding New Printers via the Windows NT APW

    By default, Samba offers all printer shares defined in


    14.2.5. Samba and Printer Ports

    13.2.5. Samba and Printer Ports

    Windows NT/2000 print servers associate a port with each printer. These normally take the form of LPT1:, COM1:, FILE:, etc... Samba must also support the @@ -11076,9 +11476,9 @@ CLASS="SECT1" >


    14.3. The Imprints Toolset

    13.3. The Imprints Toolset

    The Imprints tool set provides a UNIX equivalent of the Windows NT Add Printer Wizard. For complete information, please @@ -11094,9 +11494,9 @@ CLASS="SECT2" >


    14.3.1. What is Imprints?

    13.3.1. What is Imprints?

    Imprints is a collection of tools for supporting the goals of


    14.3.2. Creating Printer Driver Packages

    13.3.2. Creating Printer Driver Packages

    The process of creating printer driver packages is beyond the scope of this document (refer to Imprints.txt also included @@ -11142,9 +11542,9 @@ CLASS="SECT2" >


    14.3.3. The Imprints server

    13.3.3. The Imprints server

    The Imprints server is really a database server that may be queried via standard HTTP mechanisms. Each printer @@ -11166,9 +11566,9 @@ CLASS="SECT2" >


    14.3.4. The Installation Client

    13.3.4. The Installation Client

    More information regarding the Imprints installation client is available in the


    14.4. Diagnosis

    13.4. Diagnosis

    14.4.1. Introduction

    13.4.1. Introduction

    This is a short description of how to debug printing problems with Samba. This describes how to debug problems with printing from a SMB @@ -11343,9 +11743,9 @@ CLASS="SECT2" >


    14.4.2. Debugging printer problems

    13.4.2. Debugging printer problems

    One way to debug printing problems is to start by replacing these command with shell scripts that record the arguments and the contents @@ -11361,7 +11761,7 @@ CLASS="PROGRAMLISTING" /usr/bin/id -p >/tmp/tmp.print # we run the command and save the error messages # replace the command with the one appropriate for your system - /usr/bin/lpr -r -P$1 $2 2>>&/tmp/tmp.print

    Then you print a file and try removing it. You may find that the @@ -11400,9 +11800,9 @@ CLASS="SECT2" >


    14.4.3. What printers do I have?

    13.4.3. What printers do I have?

    You can use the 'testprns' program to check to see if the printer name you are using is recognized by Samba. For example, you can @@ -11429,9 +11829,9 @@ CLASS="SECT2" >


    14.4.4. Setting up printcap and print servers

    13.4.4. Setting up printcap and print servers

    You may need to set up some printcaps for your Samba system to use. It is strongly recommended that you use the facilities provided by @@ -11513,9 +11913,9 @@ CLASS="SECT2" >


    14.4.5. Job sent, no output

    13.4.5. Job sent, no output

    This is the most frustrating part of printing. You may have sent the job, verified that the job was forwarded, set up a wrapper around @@ -11558,9 +11958,9 @@ CLASS="SECT2" >


    14.4.6. Job sent, strange output

    13.4.6. Job sent, strange output

    Once you have the job printing, you can then start worrying about making it print nicely.


    14.4.7. Raw PostScript printed

    13.4.7. Raw PostScript printed

    This is a problem that is usually caused by either the print spooling system putting information at the start of the print job that makes @@ -11619,9 +12019,9 @@ CLASS="SECT2" >


    14.4.8. Advanced Printing

    13.4.8. Advanced Printing

    Note that you can do some pretty magic things by using your imagination with the "print command" option and some shell scripts. @@ -11635,9 +12035,9 @@ CLASS="SECT2" >


    14.4.9. Real debugging

    13.4.9. Real debugging

    If the above debug tips don't help, then maybe you need to bring in the bug guns, system tracing. See Tracing.txt in this directory.


    Chapter 15. Security levels

    15.1. Introduction

    Samba supports the following options to the global smb.conf parameter

    [global]
    -security = [share|user(default)|server|domain|ads]

    Please refer to the smb.conf man page for usage information and to the document -DOMAIN_MEMBER.html for further background details -on domain mode security. The Windows 2000 Kerberos domain security model -(security = ads) is described in the ADS-HOWTO.html.

    Of the above, "security = server" means that Samba reports to clients that -it is running in "user mode" but actually passes off all authentication -requests to another "user mode" server. This requires an additional -parameter "password server =" that points to the real authentication server. -That real authentication server can be another Samba server or can be a -Windows NT server, the later natively capable of encrypted password support.


    15.2. More complete description of security levels

    A SMB server tells the client at startup what "security level" it is -running. There are two options "share level" and "user level". Which -of these two the client receives affects the way the client then tries -to authenticate itself. It does not directly affect (to any great -extent) the way the Samba server does security. I know this is -strange, but it fits in with the client/server approach of SMB. In SMB -everything is initiated and controlled by the client, and the server -can only tell the client what is available and whether an action is -allowed.

    I'll describe user level security first, as its simpler. In user level -security the client will send a "session setup" command directly after -the protocol negotiation. This contains a username and password. The -server can either accept or reject that username/password -combination. Note that at this stage the server has no idea what -share the client will eventually try to connect to, so it can't base -the "accept/reject" on anything other than:

    1. the username/password

    2. the machine that the client is coming from

    If the server accepts the username/password then the client expects to -be able to mount any share (using a "tree connection") without -specifying a password. It expects that all access rights will be as -the username/password specified in the "session setup".

    It is also possible for a client to send multiple "session setup" -requests. When the server responds it gives the client a "uid" to use -as an authentication tag for that username/password. The client can -maintain multiple authentication contexts in this way (WinDD is an -example of an application that does this)

    Ok, now for share level security. In share level security the client -authenticates itself separately for each share. It will send a -password along with each "tree connection" (share mount). It does not -explicitly send a username with this operation. The client is -expecting a password to be associated with each share, independent of -the user. This means that samba has to work out what username the -client probably wants to use. It is never explicitly sent the -username. Some commercial SMB servers such as NT actually associate -passwords directly with shares in share level security, but samba -always uses the unix authentication scheme where it is a -username/password that is authenticated, not a "share/password".

    Many clients send a "session setup" even if the server is in share -level security. They normally send a valid username but no -password. Samba records this username in a list of "possible -usernames". When the client then does a "tree connection" it also adds -to this list the name of the share they try to connect to (useful for -home directories) and any users listed in the "user =" smb.conf -line. The password is then checked in turn against these "possible -usernames". If a match is found then the client is authenticated as -that user.

    Finally "server level" security. In server level security the samba -server reports to the client that it is in user level security. The -client then does a "session setup" as described earlier. The samba -server takes the username/password that the client sends and attempts -to login to the "password server" by sending exactly the same -username/password that it got from the client. If that server is in -user level security and accepts the password then samba accepts the -clients connection. This allows the samba server to use another SMB -server as the "password server".

    You should also note that at the very start of all this, where the -server tells the client what security level it is in, it also tells -the client if it supports encryption. If it does then it supplies the -client with a random "cryptkey". The client will then send all -passwords in encrypted form. You have to compile samba with encryption -enabled to support this feature, and you have to maintain a separate -smbpasswd file with SMB style encrypted passwords. It is -cryptographically impossible to translate from unix style encryption -to SMB style encryption, although there are some fairly simple management -schemes by which the two could be kept in sync.


    Chapter 16. Unified Logons between Windows NT and UNIX using Winbind

    Chapter 14. Unified Logons between Windows NT and UNIX using Winbind

    16.1. Abstract

    14.1. Abstract

    Integration of UNIX and Microsoft Windows NT through a unified logon has been considered a "holy grail" in heterogeneous @@ -11831,9 +12083,9 @@ CLASS="SECT1" >


    16.2. Introduction

    14.2. Introduction

    It is well known that UNIX and Microsoft Windows NT have different models for representing user and group information and @@ -11885,9 +12137,9 @@ CLASS="SECT1" >


    16.3. What Winbind Provides

    14.3. What Winbind Provides

    Winbind unifies UNIX and Windows NT account management by allowing a UNIX box to become a full member of a NT domain. Once @@ -11927,9 +12179,9 @@ CLASS="SECT2" >


    16.3.1. Target Uses

    14.3.1. Target Uses

    Winbind is targeted at organizations that have an existing NT based domain infrastructure into which they wish @@ -11951,9 +12203,9 @@ CLASS="SECT1" >


    16.4. How Winbind Works

    14.4. How Winbind Works

    The winbind system is designed around a client/server architecture. A long running


    16.4.1. Microsoft Remote Procedure Calls

    14.4.1. Microsoft Remote Procedure Calls

    Over the last two years, efforts have been underway +>Over the last few years, efforts have been underway by various Samba Team members to decode various aspects of the Microsoft Remote Procedure Call (MSRPC) system. This system is used for most network related operations between @@ -11997,9 +12249,28 @@ CLASS="SECT2" >


    14.4.2. Microsoft Active Directory Services

    Since late 2001, Samba has gained the ability to + interact with Microsoft Windows 2000 using its 'Native + Mode' protocols, rather than the NT4 RPC services. + Using LDAP and Kerberos, a domain member running + winbind can enumerate users and groups in exactly the + same way as a Win2k client would, and in so doing + provide a much more efficient and + effective winbind implementation. +


    16.4.2. Name Service Switch

    14.4.3. Name Service Switch

    The Name Service Switch, or NSS, is a feature that is present in many UNIX operating systems. It allows system @@ -12077,9 +12348,9 @@ CLASS="SECT2" >


    16.4.3. Pluggable Authentication Modules

    14.4.4. Pluggable Authentication Modules

    Pluggable Authentication Modules, also known as PAM, is a system for abstracting authentication and authorization @@ -12126,9 +12397,9 @@ CLASS="SECT2" >


    16.4.4. User and Group ID Allocation

    14.4.5. User and Group ID Allocation

    When a user or group is created under Windows NT is it allocated a numerical relative identifier (RID). This is @@ -12152,9 +12423,9 @@ CLASS="SECT2" >


    16.4.5. Result Caching

    14.4.6. Result Caching

    An active system can generate a lot of user and group name lookups. To reduce the network cost of these lookups winbind @@ -12175,9 +12446,9 @@ CLASS="SECT1" >


    16.5. Installation and Configuration

    14.5. Installation and Configuration

    Many thanks to John Trostel


    16.5.1. Introduction

    14.5.1. Introduction

    This HOWTO describes the procedures used to get winbind up and running on my RedHat 7.1 system. Winbind is capable of providing access @@ -12261,9 +12532,9 @@ CLASS="SECT2" >


    16.5.2. Requirements

    14.5.2. Requirements

    If you have a samba configuration file that you are currently using...


    16.5.3. Testing Things Out

    14.5.3. Testing Things Out

    Before starting, it is probably best to kill off all the SAMBA related daemons running on your server. Kill off all


    16.5.3.1. Configure and compile SAMBA

    14.5.3.1. Configure and compile SAMBA

    The configuration and compilation of SAMBA is pretty straightforward. The first three steps may not be necessary depending upon @@ -12412,7 +12683,7 @@ CLASS="PROMPT" >root# ./configure --with-winbind./configure


    16.5.3.2. Configure 14.5.3.2. Configure nsswitch.conf and the @@ -12547,9 +12818,9 @@ CLASS="SECT3" >

    16.5.3.3. Configure smb.conf

    14.5.3.3. Configure smb.conf

    Several parameters are needed in the smb.conf file to control the behavior of

    [global]
    -     <...>
    +     <...>
          # separate domain and username with '+', like DOMAIN+username
          

    16.5.3.4. Join the SAMBA server to the PDC domain

    14.5.3.4. Join the SAMBA server to the PDC domain

    Enter the following command to make the SAMBA server join the PDC domain, where root# /usr/local/samba/bin/net rpc join -S PDC -U Administrator/usr/local/samba/bin/net join -S PDC -U Administrator

    The proper response to the command should be: "Joined the domain @@ -12668,9 +12939,9 @@ CLASS="SECT3" >


    16.5.3.5. Start up the winbindd daemon and test it!

    14.5.3.5. Start up the winbindd daemon and test it!

    Eventually, you will want to modify your smb startup script to automatically invoke the winbindd daemon when the other parts of @@ -12791,17 +13062,17 @@ CLASS="SECT3" >


    16.5.3.6. Fix the init.d startup scripts

    14.5.3.6. Fix the init.d startup scripts
    16.5.3.6.1. Linux
    14.5.3.6.1. Linux

    The


    16.5.3.6.2. Solaris
    14.5.3.6.2. Solaris

    On solaris, you need to modify the


    16.5.3.6.3. Restarting
    14.5.3.6.3. Restarting

    If you restart the


    16.5.3.7. Configure Winbind and PAM

    14.5.3.7. Configure Winbind and PAM

    If you have made it this far, you know that winbindd and samba are working together. If you want to use winbind to provide authentication for other @@ -13048,9 +13319,9 @@ CLASS="SECT4" >


    16.5.3.7.1. Linux/FreeBSD-specific PAM configuration
    14.5.3.7.1. Linux/FreeBSD-specific PAM configuration

    The


    16.5.3.7.2. Solaris-specific configuration
    14.5.3.7.2. Solaris-specific configuration

    The /etc/pam.conf needs to be changed. I changed this file so that my Domain users can logon both locally as well as telnet.The following are the changes @@ -13253,7 +13524,7 @@ dtsession auth required /usr/lib/security/$ISA/pam_unix.so.1 >I also added a try_first_pass line after the winbind.so line to get rid of annoying double prompts for passwords.

    Now restart your Samba & try connecting through your application that you +>Now restart your Samba and try connecting through your application that you configured in the pam.conf.


    16.6. Limitations

    14.6. Limitations

    Winbind has a number of limitations in its current released version that we hope to overcome in future @@ -13277,7 +13548,7 @@ NAME="AEN2566" >

  • Winbind is currently only available for - the Linux operating system, although ports to other operating + the Linux, Solaris and IRIX operating systems, although ports to other operating systems are certainly possible. For such ports to be feasible, we require the C library of the target operating system to support the Name Service Switch and Pluggable Authentication @@ -13286,1116 +13557,1027 @@ NAME="AEN2566" >

  • The mappings of Windows NT RIDs to UNIX ids - is not made algorithmically and depends on the order in which - unmapped users or groups are seen by winbind. It may be difficult - to recover the mappings of rid to UNIX id mapping if the file - containing this information is corrupted or destroyed.

  • The mappings of Windows NT RIDs to UNIX ids + is not made algorithmically and depends on the order in which + unmapped users or groups are seen by winbind. It may be difficult + to recover the mappings of rid to UNIX id mapping if the file + containing this information is corrupted or destroyed.

  • Currently the winbind PAM module does not take + into account possible workstation and logon time restrictions + that may be been set for Windows NT users, this is + instead up to the PDC to enforce.


  • 14.7. Conclusion

    The winbind system, through the use of the Name Service + Switch, Pluggable Authentication Modules, and appropriate + Microsoft RPC calls have allowed us to provide seamless + integration of Microsoft Windows NT domain users on a + UNIX system. The result is a great reduction in the administrative + cost of running a mixed UNIX and NT network.


    Chapter 15. Improved browsing in samba

    15.1. Overview of browsing

    SMB networking provides a mechanism by which clients can access a list +of machines in a network, a so-called "browse list". This list +contains machines that are ready to offer file and/or print services +to other machines within the network. Thus it does not include +machines which aren't currently able to do server tasks. The browse +list is heavily used by all SMB clients. Configuration of SMB +browsing has been problematic for some Samba users, hence this +document.

    Browsing will NOT work if name resolution from NetBIOS names to IP +addresses does not function correctly. Use of a WINS server is highly +recommended to aid the resolution of NetBIOS (SMB) names to IP addresses. +WINS allows remote segment clients to obtain NetBIOS name_type information +that can NOT be provided by any other means of name resolution.


    15.2. Browsing support in samba

    Samba now fully supports browsing. The browsing is supported by nmbd +and is also controlled by options in the smb.conf file (see smb.conf(5)).

    Samba can act as a local browse master for a workgroup and the ability +for samba to support domain logons and scripts is now available. See +DOMAIN.txt for more information on domain logons.

    Samba can also act as a domain master browser for a workgroup. This +means that it will collate lists from local browse masters into a +wide area network server list. In order for browse clients to +resolve the names they may find in this list, it is recommended that +both samba and your clients use a WINS server.

    Note that you should NOT set Samba to be the domain master for a +workgroup that has the same name as an NT Domain: on each wide area +network, you must only ever have one domain master browser per workgroup, +regardless of whether it is NT, Samba or any other type of domain master +that is providing this service.

    [Note that nmbd can be configured as a WINS server, but it is not +necessary to specifically use samba as your WINS server. NTAS can +be configured as your WINS server. In a mixed NT server and +samba environment on a Wide Area Network, it is recommended that +you use the NT server's WINS server capabilities. In a samba-only +environment, it is recommended that you use one and only one nmbd +as your WINS server].

    To get browsing to work you need to run nmbd as usual, but will need +to use the "workgroup" option in smb.conf to control what workgroup +Samba becomes a part of.

    Currently the winbind PAM module does not take - into account possible workstation and logon time restrictions - that may be been set for Windows NT users.

    Samba also has a useful option for a Samba server to offer itself for +browsing on another subnet. It is recommended that this option is only +used for 'unusual' purposes: announcements over the internet, for +example. See "remote announce" in the smb.conf man page.


    16.7. Conclusion

    15.3. Problem resolution

    The winbind system, through the use of the Name Service - Switch, Pluggable Authentication Modules, and appropriate - Microsoft RPC calls have allowed us to provide seamless - integration of Microsoft Windows NT domain users on a - UNIX system. The result is a great reduction in the administrative - cost of running a mixed UNIX and NT network.

    If something doesn't work then hopefully the log.nmb file will help +you track down the problem. Try a debug level of 2 or 3 for finding +problems. Also note that the current browse list usually gets stored +in text form in a file called browse.dat.

    Note that if it doesn't work for you, then you should still be able to +type the server name as \\SERVER in filemanager then hit enter and +filemanager should display the list of available shares.

    Some people find browsing fails because they don't have the global +"guest account" set to a valid account. Remember that the IPC$ +connection that lists the shares is done as guest, and thus you must +have a valid guest account.

    Also, a lot of people are getting bitten by the problem of too many +parameters on the command line of nmbd in inetd.conf. This trick is to +not use spaces between the option and the parameter (eg: -d2 instead +of -d 2), and to not use the -B and -N options. New versions of nmbd +are now far more likely to correctly find your broadcast and network +address, so in most cases these aren't needed.

    The other big problem people have is that their broadcast address, +netmask or IP address is wrong (specified with the "interfaces" option +in smb.conf)


    Chapter 17. Passdb MySQL plugin


    17.1. Building

    15.4. Browsing across subnets

    To build the plugin, run make bin/pdb_mysql.so -in the source/ directory of samba distribution.

    With the release of Samba 1.9.17(alpha1 and above) Samba has been +updated to enable it to support the replication of browse lists +across subnet boundaries. New code and options have been added to +achieve this. This section describes how to set this feature up +in different settings.

    Next, copy pdb_mysql.so to any location you want. I -strongly recommend installing it in $PREFIX/lib or /usr/lib/samba/

    To see browse lists that span TCP/IP subnets (ie. networks separated +by routers that don't pass broadcast traffic) you must set up at least +one WINS server. The WINS server acts as a DNS for NetBIOS names, allowing +NetBIOS name to IP address translation to be done by doing a direct +query of the WINS server. This is done via a directed UDP packet on +port 137 to the WINS server machine. The reason for a WINS server is +that by default, all NetBIOS name to IP address translation is done +by broadcasts from the querying machine. This means that machines +on one subnet will not be able to resolve the names of machines on +another subnet without using a WINS server.

    Remember, for browsing across subnets to work correctly, all machines, +be they Windows 95, Windows NT, or Samba servers must have the IP address +of a WINS server given to them by a DHCP server, or by manual configuration +(for Win95 and WinNT, this is in the TCP/IP Properties, under Network +settings) for Samba this is in the smb.conf file.



    17.2. Configuring

    15.4.1. How does cross subnet browsing work ?

    This plugin lacks some good documentation, but here is some short info:

    Cross subnet browsing is a complicated dance, containing multiple +moving parts. It has taken Microsoft several years to get the code +that achieves this correct, and Samba lags behind in some areas. +However, with the 1.9.17 release, Samba is capable of cross subnet +browsing when configured correctly.

    Add a the following to the passdb backend variable in your smb.conf: -

    Consider a network set up as follows :

    passdb backend = [other-plugins] plugin:/location/to/pdb_mysql.so:identifier [other-plugins]
    (DMB) + N1_A N1_B N1_C N1_D N1_E + | | | | | + ------------------------------------------------------- + | subnet 1 | + +---+ +---+ + |R1 | Router 1 Router 2 |R2 | + +---+ +---+ + | | + | subnet 2 subnet 3 | + -------------------------- ------------------------------------ + | | | | | | | | + N2_A N2_B N2_C N2_D N3_A N3_B N3_C N3_D + (WINS)

    The identifier can be any string you like, as long as it doesn't collide with -the identifiers of other plugins or other instances of pdb_mysql. If you -specify multiple pdb_mysql.so entries in 'passdb backend', you also need to -use different identifiers!

    Consisting of 3 subnets (1, 2, 3) connected by two routers +(R1, R2) - these do not pass broadcasts. Subnet 1 has 5 machines +on it, subnet 2 has 4 machines, subnet 3 has 4 machines. Assume +for the moment that all these machines are configured to be in the +same workgroup (for simplicities sake). Machine N1_C on subnet 1 +is configured as Domain Master Browser (ie. it will collate the +browse lists for the workgroup). Machine N2_D is configured as +WINS server and all the other machines are configured to register +their NetBIOS names with it.

    As all these machines are booted up, elections for master browsers +will take place on each of the three subnets. Assume that machine +N1_C wins on subnet 1, N2_B wins on subnet 2, and N3_D wins on +subnet 3 - these machines are known as local master browsers for +their particular subnet. N1_C has an advantage in winning as the +local master browser on subnet 1 as it is set up as Domain Master +Browser.

    On each of the three networks, machines that are configured to +offer sharing services will broadcast that they are offering +these services. The local master browser on each subnet will +receive these broadcasts and keep a record of the fact that +the machine is offering a service. This list of records is +the basis of the browse list. For this case, assume that +all the machines are configured to offer services so all machines +will be on the browse list.

    For each network, the local master browser on that network is +considered 'authoritative' for all the names it receives via +local broadcast. This is because a machine seen by the local +master browser via a local broadcast must be on the same +network as the local master browser and thus is a 'trusted' +and 'verifiable' resource. Machines on other networks that +the local master browsers learn about when collating their +browse lists have not been directly seen - these records are +called 'non-authoritative'.

    At this point the browse lists look as follows (these are +the machines you would see in your network neighborhood if +you looked in it on a particular network right now).

    Subnet           Browse Master   List
    +------           -------------   ----
    +Subnet1          N1_C            N1_A, N1_B, N1_C, N1_D, N1_E
    +
    +Subnet2          N2_B            N2_A, N2_B, N2_C, N2_D
    +
    +Subnet3          N3_D            N3_A, N3_B, N3_C, N3_D

    Note that at this point all the subnets are separate, no +machine is seen across any of the subnets.

    Now examine subnet 2. As soon as N2_B has become the local +master browser it looks for a Domain master browser to synchronize +its browse list with. It does this by querying the WINS server +(N2_D) for the IP address associated with the NetBIOS name +WORKGROUP>1B<. This name was registerd by the Domain master +browser (N1_C) with the WINS server as soon as it was booted.

    Once N2_B knows the address of the Domain master browser it +tells it that is the local master browser for subnet 2 by +sending a MasterAnnouncement packet as a UDP port 138 packet. +It then synchronizes with it by doing a NetServerEnum2 call. This +tells the Domain Master Browser to send it all the server +names it knows about. Once the domain master browser receives +the MasterAnnouncement packet it schedules a synchronization +request to the sender of that packet. After both synchronizations +are done the browse lists look like :

    Subnet           Browse Master   List
    +------           -------------   ----
    +Subnet1          N1_C            N1_A, N1_B, N1_C, N1_D, N1_E, 
    +                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*)
    +
    +Subnet2          N2_B            N2_A, N2_B, N2_C, N2_D
    +                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
    +
    +Subnet3          N3_D            N3_A, N3_B, N3_C, N3_D
    +
    +Servers with a (*) after them are non-authoritative names.

    At this point users looking in their network neighborhood on +subnets 1 or 2 will see all the servers on both, users on +subnet 3 will still only see the servers on their own subnet.

    The same sequence of events that occured for N2_B now occurs +for the local master browser on subnet 3 (N3_D). When it +synchronizes browse lists with the domain master browser (N1_A) +it gets both the server entries on subnet 1, and those on +subnet 2. After N3_D has synchronized with N1_C and vica-versa +the browse lists look like.

    Subnet           Browse Master   List
    +------           -------------   ----
    +Subnet1          N1_C            N1_A, N1_B, N1_C, N1_D, N1_E, 
    +                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*),
    +                                 N3_A(*), N3_B(*), N3_C(*), N3_D(*)
    +
    +Subnet2          N2_B            N2_A, N2_B, N2_C, N2_D
    +                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
    +
    +Subnet3          N3_D            N3_A, N3_B, N3_C, N3_D
    +                                 N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*),
    +                                 N2_A(*), N2_B(*), N2_C(*), N2_D(*)
    +
    +Servers with a (*) after them are non-authoritative names.

    At this point users looking in their network neighborhood on +subnets 1 or 3 will see all the servers on all sunbets, users on +subnet 2 will still only see the servers on subnets 1 and 2, but not 3.

    Additional options can be given thru the smb.conf file in the [global] section.

    Finally, the local master browser for subnet 2 (N2_B) will sync again +with the domain master browser (N1_C) and will recieve the missing +server entries. Finally - and as a steady state (if no machines +are removed or shut off) the browse lists will look like :

    identifier:mysql host                     - host name, defaults to 'localhost'
    -identifier:mysql password
    -identifier:mysql user                     - defaults to 'samba'
    -identifier:mysql database                 - defaults to 'samba'
    -identifier:mysql port                     - defaults to 3306
    -identifier:table                          - Name of the table containing users
    Subnet Browse Master List +------ ------------- ---- +Subnet1 N1_C N1_A, N1_B, N1_C, N1_D, N1_E, + N2_A(*), N2_B(*), N2_C(*), N2_D(*), + N3_A(*), N3_B(*), N3_C(*), N3_D(*) + +Subnet2 N2_B N2_A, N2_B, N2_C, N2_D + N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*) + N3_A(*), N3_B(*), N3_C(*), N3_D(*) + +Subnet3 N3_D N3_A, N3_B, N3_C, N3_D + N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*), + N2_A(*), N2_B(*), N2_C(*), N2_D(*) + +Servers with a (*) after them are non-authoritative names.

    Names of the columns in this table(I've added column types those columns should have first):

    Synchronizations between the domain master browser and local +master browsers will continue to occur, but this should be a +steady state situation.

    identifier:logon time column             - int(9)
    -identifier:logoff time column            - int(9)
    -identifier:kickoff time column           - int(9)
    -identifier:pass last set time column     - int(9)
    -identifier:pass can change time column   - int(9)
    -identifier:pass must change time column  - int(9)
    -identifier:username column               - varchar(255) - unix username
    -identifier:domain column                 - varchar(255) - NT domain user is part of
    -identifier:nt username column            - varchar(255) - NT username
    -identifier:fullname column            - varchar(255) - Full name of user
    -identifier:home dir column               - varchar(255) - Unix homedir path
    -identifier:dir drive column              - varchar(2) - Directory drive path (eg: 'H:')
    -identifier:logon script column           - varchar(255) - Batch file to run on client side when logging on
    -identifier:profile path column           - varchar(255) - Path of profile
    -identifier:acct desc column              - varchar(255) - Some ASCII NT user data
    -identifier:workstations column           - varchar(255) - Workstations user can logon to (or NULL for all)
    -identifier:unknown string column         - varchar(255) - unknown string
    -identifier:munged dial column            - varchar(255) - ?
    -identifier:uid column                    - int(9) - Unix user ID (uid)
    -identifier:gid column                    - int(9) - Unix user group (gid)
    -identifier:user sid column               - varchar(255) - NT user SID
    -identifier:group sid column              - varchar(255) - NT group ID
    -identifier:lanman pass column            - varchar(255) - encrypted lanman password
    -identifier:nt pass column                - varchar(255) - encrypted nt passwd
    -identifier:plaintext pass column         - varchar(255) - plaintext password
    -identifier:acct control column           - int(9) - nt user data
    -identifier:unknown 3 column              - int(9) - unknown
    -identifier:logon divs column             - int(9) - ?
    -identifier:hours len column              - int(9) - ?
    -identifier:unknown 5 column              - int(9) - unknown
    -identifier:unknown 6 column              - int(9) - unknown

    If either router R1 or R2 fails the following will occur:

    Eventually, you can put a colon (:) after the name of each column, which -should specify the column to update when updating the table. You can also -specify nothing behind the colon - then the data from the field will not be -updated.


    17.3. Using plaintext passwords or encrypted password

    1. I strongly discourage the use of plaintext passwords, however, you can use them:

      Names of computers on each side of the inaccessible network fragments + will be maintained for as long as 36 minutes, in the network neighbourhood + lists. +

    2. If you would like to use plaintext passwords, set 'identifier:lanman pass column' and 'identifier:nt pass column' to 'NULL' (without the quotes) and 'identifier:plaintext pass column' to the name of the column containing the plaintext passwords.

      Attempts to connect to these inaccessible computers will fail, but the + names will not be removed from the network neighbourhood lists. +

    3. If you use encrypted passwords, set the 'identifier:plaintext pass column' to 'NULL' (without the quotes). This is the default.

      If one of the fragments is cut off from the WINS server, it will only + be able to access servers on its local subnet, by using subnet-isolated + broadcast NetBIOS name resolution. The effects are similar to that of + losing access to a DNS server. +


    17.4. Getting non-column data from the table

    It is possible to have not all data in the database and making some 'constant'.

    15.5. Setting up a WINS server

    For example, you can set 'identifier:fullname column' to : -CONCAT(First_name,' ',Sur_name)

    Either a Samba machine or a Windows NT Server machine may be set up +as a WINS server. To set a Samba machine to be a WINS server you must +add the following option to the smb.conf file on the selected machine : +in the [globals] section add the line

    Or, set 'identifier:workstations column' to : -NULL wins support = yes

    See the MySQL documentation for more language constructs.


    Chapter 18. Passdb XML plugin

    18.1. Building

    This module requires libxml2 to be installed.

    To build pdb_xml, run: make bin/pdb_xml.so in -the directory source/.


    18.2. Usage

    Versions of Samba previous to 1.9.17 had this parameter default to +yes. If you have any older versions of Samba on your network it is +strongly suggested you upgrade to 1.9.17 or above, or at the very +least set the parameter to 'no' on all these machines.

    The usage of pdb_xml is pretty straightforward. To export data, use: - -Machines with "pdbedit -e plugin:/usr/lib/samba/pdb_xml.so:filename - -(where filename is the name of the file to put the data in)

    wins support = yes" will keep a list of +all NetBIOS names registered with them, acting as a DNS for NetBIOS names.

    To import data, use: -You should set up only ONE wins server. Do NOT set the +"pdbedit -i plugin:/usr/lib/samba/pdb_xml.so:filename -e current-pdb - -Where filename is the name to read the data from and current-pdb to put it in.


    Chapter 19. Storing Samba's User/Machine Account information in an LDAP Directory

    19.1. Purpose

    This document describes how to use an LDAP directory for storing Samba user -account information traditionally stored in the smbpasswd(5) file. It is -assumed that the reader already has a basic understanding of LDAP concepts -and has a working directory server already installed. For more information -on LDAP architectures and Directories, please refer to the following sites.

    wins support = yes" option on more than one Samba +server.

    • To set up a Windows NT Server as a WINS server you need to set up +the WINS service - see your NT documentation for details. Note that +Windows NT WINS Servers can replicate to each other, allowing more +than one to be set up in a complex subnet environment. As Microsoft +refuse to document these replication protocols Samba cannot currently +participate in these replications. It is possible in the future that +a Samba->Samba WINS replication protocol may be defined, in which +case more than one Samba machine could be set up as a WINS server +but currently only one Samba server should have the "wins support = yes" +parameter set.

      OpenLDAP - http://www.openldap.org/

    • After the WINS server has been configured you must ensure that all +machines participating on the network are configured with the address +of this WINS server. If your WINS server is a Samba machine, fill in +the Samba machine IP address in the "Primary WINS Server" field of +the "Control Panel->Network->Protocols->TCP->WINS Server" dialogs +in Windows 95 or Windows NT. To tell a Samba server the IP address +of the WINS server add the following line to the [global] section of +all smb.conf files :

      iPlanet Directory Server - http://iplanet.netscape.com/directorywins server = >name or IP address<

    Note that O'Reilly Publishing is working on -a guide to LDAP for System Administrators which has a planned release date of -early summer, 2002.

    Two additional Samba resources which may prove to be helpful are

    • where >name or IP address< is either the DNS name of the WINS server +machine or its IP address.

      The Samba-PDC-LDAP-HOWTO - maintained by Ignacio Coupeau.

    • Note that this line MUST NOT BE SET in the smb.conf file of the Samba +server acting as the WINS server itself. If you set both the +"wins support = yes" option and the +"wins server = >name<" option then +nmbd will fail to start.

      The NT migration scripts from IDEALX that are - geared to manage users and group in such a Samba-LDAP Domain Controller configuration. -

    There are two possible scenarios for setting up cross subnet browsing. +The first details setting up cross subnet browsing on a network containing +Windows 95, Samba and Windows NT machines that are not configured as +part of a Windows NT Domain. The second details setting up cross subnet +browsing on networks that contain NT Domains.


    19.2. Introduction

    Traditionally, when configuring "encrypt -passwords = yes" in Samba's smb.conf file, user account -information such as username, LM/NT password hashes, password change times, and account -flags have been stored in the smbpasswd(5) file. There are several -disadvantages to this approach for sites with very large numbers of users (counted -in the thousands).

    15.6. Setting up Browsing in a WORKGROUP

    • To set up cross subnet browsing on a network containing machines +in up to be in a WORKGROUP, not an NT Domain you need to set up one +Samba server to be the Domain Master Browser (note that this is *NOT* +the same as a Primary Domain Controller, although in an NT Domain the +same machine plays both roles). The role of a Domain master browser is +to collate the browse lists from local master browsers on all the +subnets that have a machine participating in the workgroup. Without +one machine configured as a domain master browser each subnet would +be an isolated workgroup, unable to see any machines on any other +subnet. It is the presense of a domain master browser that makes +cross subnet browsing possible for a workgroup.

      The first is that all lookups must be performed sequentially. Given that -there are approximately two lookups per domain logon (one for a normal -session connection such as when mapping a network drive or printer), this -is a performance bottleneck for lareg sites. What is needed is an indexed approach -such as is used in databases.

    • In an WORKGROUP environment the domain master browser must be a +Samba server, and there must only be one domain master browser per +workgroup name. To set up a Samba server as a domain master browser, +set the following option in the [global] section of the smb.conf file :

      The second problem is that administrators who desired to replicate a -smbpasswd file to more than one Samba server were left to use external -tools such as rsync(1) and ssh(1) -and wrote custom, in-house scripts.

    • domain master = yes

      And finally, the amount of information which is stored in an -smbpasswd entry leaves no room for additional attributes such as -a home directory, password expiration time, or even a Relative -Identified (RID).

    The domain master browser should also preferrably be the local master +browser for its own subnet. In order to achieve this set the following +options in the [global] section of the smb.conf file :

    As a result of these defeciencies, a more robust means of storing user attributes -used by smbd was developed. The API which defines access to user accounts -is commonly referred to as the samdb interface (previously this was called the passdb -API, and is still so named in the CVS trees). In Samba 2.2.3, enabling support -for a samdb backend (e.g. --with-ldapsam or ---with-tdbsam) requires compile time support.

            domain master = yes
    +        local master = yes
    +        preferred master = yes
    +        os level = 65

    When compiling Samba to include the --with-ldapsam autoconf -option, smbd (and associated tools) will store and lookup user accounts in -an LDAP directory. In reality, this is very easy to understand. If you are -comfortable with using an smbpasswd file, simply replace "smbpasswd" with -"LDAP directory" in all the documentation.

    The domain master browser may be the same machine as the WINS +server, if you require.

    There are a few points to stress about what the --with-ldapsam -does not provide. The LDAP support referred to in the this documentation does not -include:

    Next, you should ensure that each of the subnets contains a +machine that can act as a local master browser for the +workgroup. Any NT machine should be able to do this, as will +Windows 95 machines (although these tend to get rebooted more +often, so it's not such a good idea to use these). To make a +Samba server a local master browser set the following +options in the [global] section of the smb.conf file :

            domain master = no
    +        local master = yes
    +        preferred master = yes
    +        os level = 65

    • A means of retrieving user account information from - an Windows 2000 Active Directory server.

    • Do not do this for more than one Samba server on each subnet, +or they will war with each other over which is to be the local +master browser.

      A means of replacing /etc/passwd.

    The "local master" parameter allows Samba to act as a local master +browser. The "preferred master" causes nmbd to force a browser +election on startup and the "os level" parameter sets Samba high +enough so that it should win any browser elections.

    The second item can be accomplished by using LDAP NSS and PAM modules. LGPL -versions of these libraries can be obtained from PADL Software -(http://www.padl.com/). However, -the details of configuring these packages are beyond the scope of this document.


    19.3. Supported LDAP Servers

    If you have an NT machine on the subnet that you wish to +be the local master browser then you can disable Samba from +becoming a local master browser by setting the following +options in the [global] section of the smb.conf file :

    The LDAP samdb code in 2.2.3 has been developed and tested using the OpenLDAP -2.0 server and client libraries. The same code should be able to work with -Netscape's Directory Server and client SDK. However, due to lack of testing -so far, there are bound to be compile errors and bugs. These should not be -hard to fix. If you are so inclined, please be sure to forward all patches to -samba-patches@samba.org and -jerry@samba.org.

            domain master = no
    +        local master = no
    +        preferred master = no
    +        os level = 0


    19.4. Schema and Relationship to the RFC 2307 posixAccount

    15.7. Setting up Browsing in a DOMAIN

    Samba 2.2.3 includes the necessary schema file for OpenLDAP 2.0 in -examples/LDAP/samba.schema. (Note that this schema -file has been modified since the experimental support initially included -in 2.2.2). The sambaAccount objectclass is given here:

    If you are adding Samba servers to a Windows NT Domain then +you must not set up a Samba server as a domain master browser. +By default, a Windows NT Primary Domain Controller for a Domain +name is also the Domain master browser for that name, and many +things will break if a Samba server registers the Domain master +browser NetBIOS name (DOMAIN>1B<) with WINS instead of the PDC.

    For subnets other than the one containing the Windows NT PDC +you may set up Samba servers as local master browsers as +described. To make a Samba server a local master browser set +the following options in the [global] section of the smb.conf +file :

    objectclass ( 1.3.1.5.1.4.1.7165.2.2.2 NAME 'sambaAccount' SUP top STRUCTURAL
    -     DESC 'Samba Account'
    -     MUST ( uid $ rid )
    -     MAY  ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $
    -            logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $
    -            displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $
    -            description $ userWorkstations $ primaryGroupID $ domain ))
    domain master = no + local master = yes + preferred master = yes + os level = 65

    The samba.schema file has been formatted for OpenLDAP 2.0. The OID's are -owned by the Samba Team and as such is legal to be openly published. -If you translate the schema to be used with Netscape DS, please -submit the modified schema file as a patch to jerry@samba.org

    If you wish to have a Samba server fight the election with machines +on the same subnet you may set the "os level" parameter to lower +levels. By doing this you can tune the order of machines that +will become local master browsers if they are running. For +more details on this see the section "FORCING SAMBA TO BE THE MASTER" +below.

    Just as the smbpasswd file is mean to store information which supplements a -user's /etc/passwd entry, so is the sambaAccount object -meant to supplement the UNIX user account information. A sambaAccount is a -STRUCTURAL objectclass so it can be stored individually -in the directory. However, there are several fields (e.g. uid) which overlap -with the posixAccount objectclass outlined in RFC2307. This is by design.

    If you have Windows NT machines that are members of the domain +on all subnets, and you are sure they will always be running then +you can disable Samba from taking part in browser elections and +ever becoming a local master browser by setting following options +in the [global] section of the smb.conf file :

    In order to store all user account information (UNIX and Samba) in the directory, -it is necessary to use the sambaAccount and posixAccount objectclasses in -combination. However, smbd will still obtain the user's UNIX account -information via the standard C library calls (e.g. getpwnam(), et. al.). -This means that the Samba server must also have the LDAP NSS library installed -and functioning correctly. This division of information makes it possible to -store all Samba account information in LDAP, but still maintain UNIX account -information in NIS while the network is transitioning to a full LDAP infrastructure.

    domain master = no + local master = no + preferred master = no + os level = 0


    19.5. Configuring Samba with LDAP

    19.5.1. OpenLDAP configuration

    15.8. Forcing samba to be the master

    To include support for the sambaAccount object in an OpenLDAP directory -server, first copy the samba.schema file to slapd's configuration directory.

    Who becomes the "master browser" is determined by an election process +using broadcasts. Each election packet contains a number of parameters +which determine what precedence (bias) a host should have in the +election. By default Samba uses a very low precedence and thus loses +elections to just about anyone else.

    root# cp samba.schema /etc/openldap/schema/

    If you want Samba to win elections then just set the "os level" global +option in smb.conf to a higher number. It defaults to 0. Using 34 +would make it win all elections over every other system (except other +samba systems!)

    Next, include the samba.schema file in slapd.conf. -The sambaAccount object contains two attributes which depend upon other schema -files. The 'uid' attribute is defined in cosine.schema and -the 'displayName' attribute is defined in the inetorgperson.schema -file. Both of these must be included before the samba.schema file.

    A "os level" of 2 would make it beat WfWg and Win95, but not NTAS. A +NTAS domain controller uses level 32.

    ## /etc/openldap/slapd.conf
    -
    -## schema files (core.schema is required by default)
    -include	           /etc/openldap/schema/core.schema
    -
    -## needed for sambaAccount
    -include            /etc/openldap/schema/cosine.schema
    -include            /etc/openldap/schema/inetorgperson.schema
    -include            /etc/openldap/schema/samba.schema
    -
    -## uncomment this line if you want to support the RFC2307 (NIS) schema
    -## include         /etc/openldap/schema/nis.schema
    -
    -....

    The maximum os level is 255

    It is recommended that you maintain some indices on some of the most usefull attributes, -like in the following example, to speed up searches made on sambaAccount objectclasses -(and possibly posixAccount and posixGroup as well).

    If you want samba to force an election on startup, then set the +"preferred master" global option in smb.conf to "yes". Samba will +then have a slight advantage over other potential master browsers +that are not preferred master browsers. Use this parameter with +care, as if you have two hosts (whether they are windows 95 or NT or +samba) on the same local subnet both set with "preferred master" to +"yes", then periodically and continually they will force an election +in order to become the local master browser.

    # Indices to maintain
    -## required by OpenLDAP 2.0
    -index objectclass   eq
    -
    -## support pb_getsampwnam()
    -index uid           pres,eq
    -## support pdb_getsambapwrid()
    -index rid           eq
    -
    -## uncomment these if you are storing posixAccount and
    -## posixGroup entries in the directory as well
    -##index uidNumber     eq
    -##index gidNumber     eq
    -##index cn            eq
    -##index memberUid     eq

    If you want samba to be a "domain master browser", then it is +recommended that you also set "preferred master" to "yes", because +samba will not become a domain master browser for the whole of your +LAN or WAN if it is not also a local master browser on its own +broadcast isolated subnet.

    It is possible to configure two samba servers to attempt to become +the domain master browser for a domain. The first server that comes +up will be the domain master browser. All other samba servers will +attempt to become the domain master browser every 5 minutes. They +will find that another samba server is already the domain master +browser and will fail. This provides automatic redundancy, should +the current domain master browser fail.



    19.5.2. Configuring Samba

    15.9. Making samba the domain master

    The following parameters are available in smb.conf only with --with-ldapsam -was included with compiling Samba.

    The domain master is responsible for collating the browse lists of +multiple subnets so that browsing can occur between subnets. You can +make samba act as the domain master by setting "domain master = yes" +in smb.conf. By default it will not be a domain master.

    • Note that you should NOT set Samba to be the domain master for a +workgroup that has the same name as an NT Domain.

      ldap ssl

    • When samba is the domain master and the master browser it will listen +for master announcements (made roughly every twelve minutes) from local +master browsers on other subnets and then contact them to synchronise +browse lists.

      ldap server

    • If you want samba to be the domain master then I suggest you also set +the "os level" high enough to make sure it wins elections, and set +"preferred master" to "yes", to get samba to force an election on +startup.

      ldap admin dn

    • Note that all your servers (including samba) and clients should be +using a WINS server to resolve NetBIOS names. If your clients are only +using broadcasting to resolve NetBIOS names, then two things will occur:

      ldap suffix

      1. ldap filter

        your local master browsers will be unable to find a domain master + browser, as it will only be looking on the local subnet. +

      2. ldap port

        if a client happens to get hold of a domain-wide browse list, and + a user attempts to access a host in that list, it will be unable to + resolve the NetBIOS name of that host. +

    These are described in the smb.conf(5) man -page and so will not be repeated here. However, a sample smb.conf file for -use with an LDAP directory could appear as

    If, however, both samba and your clients are using a WINS server, then:

    ## /usr/local/samba/lib/smb.conf
    -[global]
    -     security = user
    -     encrypt passwords = yes
    -
    -     netbios name = TASHTEGO
    -     workgroup = NARNIA
    -
    -     # ldap related parameters
    -
    -     # define the DN to use when binding to the directory servers
    -     # The password for this DN is not stored in smb.conf.  Rather it
    -     # must be set by using 'smbpasswd -w secretpw' to store the
    -     # passphrase in the secrets.tdb file.  If the "ldap admin dn" values
    -     # changes, this password will need to be reset.
    -     ldap admin dn = "cn=Samba Manager,ou=people,dc=samba,dc=org"
    -
    -     #  specify the LDAP server's hostname (defaults to locahost)
    -     ldap server = ahab.samba.org
    -
    -     # Define the SSL option when connecting to the directory
    -     # ('off', 'start tls', or 'on' (default))
    -     ldap ssl = start tls
    -
    -     # define the port to use in the LDAP session (defaults to 636 when
    -     # "ldap ssl = on")
    -     ldap port = 389
    -
    -     # specify the base DN to use when searching the directory
    -     ldap suffix = "ou=people,dc=samba,dc=org"
    -
    -     # generally the default ldap search filter is ok
    -     # ldap filter = "(&(uid=%u)(objectclass=sambaAccount))"

    1. your local master browsers will contact the WINS server and, as long as + samba has registered that it is a domain master browser with the WINS + server, your local master browser will receive samba's ip address + as its domain master browser. +

    2. when a client receives a domain-wide browse list, and a user attempts + to access a host in that list, it will contact the WINS server to + resolve the NetBIOS name of that host. as long as that host has + registered its NetBIOS name with the same WINS server, the user will + be able to see that host. +


    19.6. Accounts and Groups management

    As users accounts are managed thru the sambaAccount objectclass, you should -modify you existing administration tools to deal with sambaAccount attributes.

    Machines accounts are managed with the sambaAccount objectclass, just -like users accounts. However, it's up to you to stored thoses accounts -in a different tree of you LDAP namespace: you should use -"ou=Groups,dc=plainjoe,dc=org" to store groups and -"ou=People,dc=plainjoe,dc=org" to store users. Just configure your -NSS and PAM accordingly (usually, in the /etc/ldap.conf configuration -file).

    15.10. Note about broadcast addresses

    In Samba release 2.2.3, the group management system is based on posix -groups. This meand that Samba make usage of the posixGroup objectclass. -For now, there is no NT-like group system management (global and local -groups).

    If your network uses a "0" based broadcast address (for example if it +ends in a 0) then you will strike problems. Windows for Workgroups +does not seem to support a 0's broadcast and you will probably find +that browsing and name lookups won't work.


    19.7. Security and sambaAccount

    There are two important points to remember when discussing the security -of sambaAccount entries in the directory.

    • 15.11. Multiple interfaces

      Never retrieve the lmPassword or - ntPassword attribute values over an unencrypted LDAP session.

    • Samba now supports machines with multiple network interfaces. If you +have multiple interfaces then you will need to use the "interfaces" +option in smb.conf to configure them. See smb.conf(5) for details.


    Chapter 16. Stackable VFS modules

    16.1. Introduction and configuration

    Never allow non-admin users to - view the lmPassword or ntPassword attribute values.

    Since samba 3.0, samba supports stackable VFS(Virtual File System) modules. +Samba passes each request to access the unix file system thru the loaded VFS modules. +This chapter covers all the modules that come with the samba source and references to +some external modules.

    These password hashes are clear text equivalents and can be used to impersonate -the user without deriving the original clear text strings. For more information -on the details of LM/NT password hashes, refer to the ENCRYPTION chapter of the Samba-HOWTO-Collection.

    You may have problems to compile these modules, as shared libraries are +compiled and linked in different ways on different systems. +They currently have been tested against GNU/linux and IRIX.

    To remedy the first security issue, the "ldap ssl" smb.conf parameter defaults -to require an encrypted session (ldap ssl = on) using -the default port of 636 -when contacting the directory server. When using an OpenLDAP 2.0 server, it -is possible to use the use the StartTLS LDAP extended operation in the place of -LDAPS. In either case, you are strongly discouraged to disable this security -(To use the VFS modules, create a share similar to the one below. The +important parameter is the ldap ssl = off).

    Note that the LDAPS protocol is deprecated in favor of the LDAPv3 StartTLS -extended operation. However, the OpenLDAP library still provides support for -the older method of securing communication between clients and servers.

    The second security precaution is to prevent non-administrative users from -harvesting password hashes from the directory. This can be done using the -following ACL in slapd.conf:

    vfs object parameter which must point to
    +the exact pathname of the shared library objects. For example, to log all access 
    +to files and use a recycle bin:
    +
    +
    ## allow the "ldap admin dn" access, but deny everyone else
    -access to attrs=lmPassword,ntPassword
    -     by dn="cn=Samba Admin,ou=people,dc=plainjoe,dc=org" write
    -     by * none
    [audit] + comment = Audited /data directory + path = /data + vfs object = /path/to/audit.so /path/to/recycle.so + writeable = yes + browseable = yes

    The modules are used in the order they are specified.

    Further documentation on writing VFS modules for Samba can be found in +the Samba Developers Guide.


    19.8. LDAP specials attributes for sambaAccounts

    The sambaAccount objectclass is composed of the following attributes:

    16.2. Included modules

    16.2.1. audit

    A simple module to audit file access to the syslog +facility. The following operations are logged: +

    • lmPassword: the LANMAN password 16-byte hash stored as a character - representation of a hexidecimal string.

    • ntPassword: the NT password hash 16-byte stored as a character - representation of a hexidecimal string.

    • pwdLastSet: The integer time in seconds since 1970 when the - lmPassword and ntPassword attributes were last set. -

    • acctFlags: string of 11 characters surrounded by square brackets [] - representing account flags such as U (user), W(workstation), X(no password expiration), and - D(disabled).

    • logonTime: Integer value currently unused

    • logoffTime: Integer value currently unused

    • kickoffTime: Integer value currently unused

    • pwdCanChange: Integer value currently unused

    • pwdMustChange: Integer value currently unused

    • share
      connect/disconnect
      directory opens/create/remove
      file open/close/rename/unlink/chmod

      homeDrive: specifies the drive letter to which to map the - UNC path specified by homeDirectory. The drive letter must be specified in the form "X:" - where X is the letter of the drive to map. Refer to the "logon drive" parameter in the - smb.conf(5) man page for more information.


    16.2.2. recycle

    scriptPath: The scriptPath property specifies the path of - the user's logon script, .CMD, .EXE, or .BAT file. The string can be null. The path - is relative to the netlogon share. Refer to the "logon script" parameter in the - smb.conf(5) man page for more information.

  • A recycle-bin like modules. When used any unlink call +will be intercepted and files moved to the recycle +directory instead of beeing deleted.

    profilePath: specifies a path to the user's profile. - This value can be a null string, a local absolute path, or a UNC path. Refer to the - "logon path" parameter in the smb.conf(5) man page for more information.

  • Supported options: +

    vfs_recycle_bin:repository

    smbHome: The homeDirectory property specifies the path of - the home directory for the user. The string can be null. If homeDrive is set and specifies - a drive letter, homeDirectory should be a UNC path. The path must be a network - UNC path of the form \\server\share\directory. This value can be a null string. - Refer to the "logon home" parameter in the smb.conf(5) man page for more information. -

  • FIXME

    vfs_recycle_bin:keeptree

    userWorkstation: character string value currently unused. -

  • FIXME

    vfs_recycle_bin:versions

    rid: the integer representation of the user's relative identifier - (RID).

  • FIXME

    vfs_recycle_bin:touch

    primaryGroupID: the relative identifier (RID) of the primary group - of the user.

  • FIXME

    vfs_recycle_bin:maxsize

    The majority of these parameters are only used when Samba is acting as a PDC of -a domain (refer to the Samba-PDC-HOWTO for details on -how to configure Samba as a Primary Domain Controller). The following four attributes -are only stored with the sambaAccount entry if the values are non-default values:

    FIXME

    vfs_recycle_bin:exclude

    • FIXME

    vfs_recycle_bin:exclude_dir

    smbHome

  • FIXME

  • vfs_recycle_bin:noversions

    scriptPath

  • FIXME


  • 16.2.3. netatalk

    logonPath

  • A netatalk module, that will ease co-existence of samba and +netatalk file sharing services.

    homeDrive

  • Advantages compared to the old netatalk module: +

    it doesn't care about creating of .AppleDouble forks, just keeps ones in sync
    if share in smb.conf doesn't contain .AppleDouble item in hide or veto list, it will be added automatically

    These attributes are only stored with the sambaAccount entry if -the values are non-default values. For example, assume TASHTEGO has now been -configured as a PDC and that logon home = \\%L\%u was defined in -its smb.conf file. When a user named "becky" logons to the domain, -the logon home string is expanded to \\TASHTEGO\becky. -If the smbHome attribute exists in the entry "uid=becky,ou=people,dc=samba,dc=org", -this value is used. However, if this attribute does not exist, then the value -of the logon home parameter is used in its place. Samba -will only write the attribute value to the directory entry is the value is -something other than the default (e.g. \\MOBY\becky).


    19.9. Example LDIF Entries for a sambaAccount

    16.3. VFS modules available elsewhere

    The following is a working LDIF with the inclusion of the posixAccount objectclass:

    This section contains a listing of various other VFS modules that +have been posted but don't currently reside in the Samba CVS +tree for one reason ot another (e.g. it is easy for the maintainer +to have his or her own CVS tree).

    dn: uid=guest2, ou=people,dc=plainjoe,dc=org
    -ntPassword: 878D8014606CDA29677A44EFA1353FC7
    -pwdMustChange: 2147483647
    -primaryGroupID: 1201
    -lmPassword: 552902031BEDE9EFAAD3B435B51404EE
    -pwdLastSet: 1010179124
    -logonTime: 0
    -objectClass: sambaAccount
    -uid: guest2
    -kickoffTime: 2147483647
    -acctFlags: [UX         ]
    -logoffTime: 2147483647
    -rid: 19006
    -pwdCanChange: 0
    No statemets about the stability or functionality any module +should be implied due to its presence here.


    16.3.1. DatabaseFS

    URL: http://www.css.tayloru.edu/~elorimer/databasefs/index.php

    The following is an LDIF entry for using both the sambaAccount and -posixAccount objectclasses:

    By Eric Lorimer.

    dn: uid=gcarter, ou=people,dc=plainjoe,dc=org
    -logonTime: 0
    -displayName: Gerald Carter
    -lmPassword: 552902031BEDE9EFAAD3B435B51404EE
    -primaryGroupID: 1201
    -objectClass: posixAccount
    -objectClass: sambaAccount
    -acctFlags: [UX         ]
    -userPassword: {crypt}BpM2ej8Rkzogo
    -uid: gcarter
    -uidNumber: 9000
    -cn: Gerald Carter
    -loginShell: /bin/bash
    -logoffTime: 2147483647
    -gidNumber: 100
    -kickoffTime: 2147483647
    -pwdLastSet: 1010179230
    -rid: 19000
    -homeDirectory: /home/tashtego/gcarter
    -pwdCanChange: 0
    -pwdMustChange: 2147483647
    -ntPassword: 878D8014606CDA29677A44EFA1353FC7

    I have created a VFS module which implements a fairly complete read-only +filesystem. It presents information from a database as a filesystem in +a modular and generic way to allow different databases to be used +(originally designed for organizing MP3s under directories such as +"Artists," "Song Keywords," etc... I have since applied it to a student +roster database very easily). The directory structure is stored in the +database itself and the module makes no assumptions about the database +structure beyond the table it requires to run.

    Any feedback would be appreciated: comments, suggestions, patches, +etc... If nothing else, hopefully it might prove useful for someone +else who wishes to create a virtual filesystem.



    19.10. Comments

    16.3.2. vscan

    Please mail all comments regarding this HOWTO to URL: jerry@samba.org. This documents was -last updated to reflect the Samba 2.2.3 release.

    http://www.openantivirus.org/

    samba-vscan is a proof-of-concept module for Samba, which +uses the VFS (virtual file system) features of Samba 2.2.x/3.0 +alphaX. Of couse, Samba has to be compiled with VFS support. +samba-vscan supports various virus scanners and is maintained +by Rainer Link.

    Chapter 20. HOWTO Access Samba source code via CVSChapter 17. Access Samba source code via CVS

    20.1. Introduction

    17.1. Introduction

    Samba is developed in an open environment. Developers use CVS (Concurrent Versioning System) to "checkin" (also known as @@ -14432,9 +14614,9 @@ CLASS="SECT1" >


    20.2. CVS Access to samba.org

    17.2. CVS Access to samba.org

    The machine samba.org runs a publicly accessible CVS repository for access to the source code of several packages, @@ -14445,9 +14627,9 @@ CLASS="SECT2" >


    20.2.1. Access via CVSweb

    17.2.1. Access via CVSweb

    You can access the source code via your favourite WWW browser. This allows you to access the contents of @@ -14466,9 +14648,9 @@ CLASS="SECT2" >


    20.2.2. Access via cvs

    17.2.2. Access via cvs

    You can also access the source code via a normal cvs client. This gives you much more control over you can @@ -14576,7 +14758,7 @@ CLASS="CHAPTER" >Chapter 21. Group mapping HOWTOChapter 18. Group mapping HOWTO

    Starting with Samba 3.0 alpha 2, a new group mapping function is available. The @@ -14677,135 +14859,46 @@ CLASS="CHAPTER" >Chapter 22. Samba performance issuesChapter 19. Samba performance issues

    22.1. Comparisons

    19.1. Comparisons

    The Samba server uses TCP to talk to the client. Thus if you are trying to see if it performs well you should really compare it to programs that use the same protocol. The most readily available programs for file transfer that use TCP are ftp or another TCP based -SMB server.

    If you want to test against something like a NT or WfWg server then -you will have to disable all but TCP on either the client or -server. Otherwise you may well be using a totally different protocol -(such as Netbeui) and comparisons may not be valid.

    Generally you should find that Samba performs similarly to ftp at raw -transfer speed. It should perform quite a bit faster than NFS, -although this very much depends on your system.

    Several people have done comparisons between Samba and Novell, NFS or -WinNT. In some cases Samba performed the best, in others the worst. I -suspect the biggest factor is not Samba vs some other system but the -hardware and drivers used on the various systems. Given similar -hardware Samba should certainly be competitive in speed with other -systems.


    22.2. Oplocks

    22.2.1. Overview

    Oplocks are the way that SMB clients get permission from a server to -locally cache file operations. If a server grants an oplock -(opportunistic lock) then the client is free to assume that it is the -only one accessing the file and it will agressively cache file -data. With some oplock types the client may even cache file open/close -operations. This can give enormous performance benefits.

    With the release of Samba 1.9.18 we now correctly support opportunistic -locks. This is turned on by default, and can be turned off on a share- -by-share basis by setting the parameter :

    oplocks = False

    We recommend that you leave oplocks on however, as current benchmark -tests with NetBench seem to give approximately a 30% improvement in -speed with them on. This is on average however, and the actual -improvement seen can be orders of magnitude greater, depending on -what the client redirector is doing.

    Previous to Samba 1.9.18 there was a 'fake oplocks' option. This -option has been left in the code for backwards compatibility reasons -but it's use is now deprecated. A short summary of what the old -code did follows.


    22.2.2. Level2 Oplocks

    With Samba 2.0.5 a new capability - level2 (read only) oplocks is -supported (although the option is off by default - see the smb.conf -man page for details). Turning on level2 oplocks (on a share-by-share basis) -by setting the parameter :

    level2 oplocks = true

    should speed concurrent access to files that are not commonly written -to, such as application serving shares (ie. shares that contain common -.EXE files - such as a Microsoft Office share) as it allows clients to -read-ahread cache copies of these files.


    22.2.3. Old 'fake oplocks' option - deprecated

    Samba can also fake oplocks, by granting a oplock whenever a client -asks for one. This is controlled using the smb.conf option "fake -oplocks". If you set "fake oplocks = yes" then you are telling the -client that it may agressively cache the file data for all opens.

    If you want to test against something like a NT or WfWg server then +you will have to disable all but TCP on either the client or +server. Otherwise you may well be using a totally different protocol +(such as Netbeui) and comparisons may not be valid.

    Enabling 'fake oplocks' on all read-only shares or shares that you know -will only be accessed from one client at a time you will see a big -performance improvement on many operations. If you enable this option -on shares where multiple clients may be accessing the files read-write -at the same time you can get data corruption.

    Generally you should find that Samba performs similarly to ftp at raw +transfer speed. It should perform quite a bit faster than NFS, +although this very much depends on your system.

    Several people have done comparisons between Samba and Novell, NFS or +WinNT. In some cases Samba performed the best, in others the worst. I +suspect the biggest factor is not Samba vs some other system but the +hardware and drivers used on the various systems. Given similar +hardware Samba should certainly be competitive in speed with other +systems.


    22.3. Socket options

    19.2. Socket options

    There are a number of socket options that can greatly affect the performance of a TCP based server like Samba.


    22.4. Read size

    19.3. Read size

    The option "read size" affects the overlap of disk reads/writes with network reads/writes. If the amount of data being transferred in @@ -14857,9 +14950,9 @@ CLASS="SECT1" >


    22.5. Max xmit

    19.4. Max xmit

    At startup the client and server negotiate a "maximum transmit" size, which limits the size of nearly all SMB commands. You can set the @@ -14880,331 +14973,626 @@ CLASS="SECT1" >


    22.6. Locking

    By default Samba does not implement strict locking on each read/write -call (although it did in previous versions). If you enable strict -locking (using "strict locking = yes") then you may find that you -suffer a severe performance hit on some systems.

    19.5. Log level

    The performance hit will probably be greater on NFS mounted -filesystems, but could be quite high even on local disks.

    If you set the log level (also known as "debug level") higher than 2 +then you may suffer a large drop in performance. This is because the +server flushes the log file after each operation, which can be very +expensive.


    22.7. Share modes

    19.6. Read raw

    Some people find that opening files is very slow. This is often -because of the "share modes" code needed to fully implement the dos -share modes stuff. You can disable this code using "share modes = -no". This will gain you a lot in opening and closing files but will -mean that (in some cases) the system won't force a second user of a -file to open the file read-only if the first has it open -read-write. For many applications that do their own locking this -doesn't matter, but for some it may. Most Windows applications -depend heavily on "share modes" working correctly and it is -recommended that the Samba share mode support be left at the -default of "on".

    The "read raw" operation is designed to be an optimised, low-latency +file read operation. A server may choose to not support it, +however. and Samba makes support for "read raw" optional, with it +being enabled by default.

    The share mode code in Samba has been re-written in the 1.9.17 -release following tests with the Ziff-Davis NetBench PC Benchmarking -tool. It is now believed that Samba 1.9.17 implements share modes -similarly to Windows NT.

    In some cases clients don't handle "read raw" very well and actually +get lower performance using it than they get using the conventional +read operations.

    NOTE: In the most recent versions of Samba there is an option to use -shared memory via mmap() to implement the share modes. This makes -things much faster. See the Makefile for how to enable this.

    So you might like to try "read raw = no" and see what happens on your +network. It might lower, raise or not affect your performance. Only +testing can really tell.


    22.8. Log level

    19.7. Write raw

    If you set the log level (also known as "debug level") higher than 2 -then you may suffer a large drop in performance. This is because the -server flushes the log file after each operation, which can be very -expensive.

    The "write raw" operation is designed to be an optimised, low-latency +file write operation. A server may choose to not support it, +however. and Samba makes support for "write raw" optional, with it +being enabled by default.

    Some machines may find "write raw" slower than normal write, in which +case you may wish to change this option.


    22.9. Wide lines

    19.8. Slow Clients

    The "wide links" option is now enabled by default, but if you disable -it (for better security) then you may suffer a performance hit in -resolving filenames. The performance loss is lessened if you have -"getwd cache = yes", which is now the default.

    One person has reported that setting the protocol to COREPLUS rather +than LANMAN2 gave a dramatic speed improvement (from 10k/s to 150k/s).

    I suspect that his PC's (386sx16 based) were asking for more data than +they could chew. I suspect a similar speed could be had by setting +"read raw = no" and "max xmit = 2048", instead of changing the +protocol. Lowering the "read size" might also help.


    22.10. Read raw

    The "read raw" operation is designed to be an optimised, low-latency -file read operation. A server may choose to not support it, -however. and Samba makes support for "read raw" optional, with it -being enabled by default.

    19.9. Slow Logins

    In some cases clients don't handle "read raw" very well and actually -get lower performance using it than they get using the conventional -read operations.

    So you might like to try "read raw = no" and see what happens on your -network. It might lower, raise or not affect your performance. Only -testing can really tell.

    Slow logins are almost always due to the password checking time. Using +the lowest practical "password level" will improve things a lot. You +could also enable the "UFC crypt" option in the Makefile.


    22.11. Write raw

    19.10. Client tuning

    The "write raw" operation is designed to be an optimised, low-latency -file write operation. A server may choose to not support it, -however. and Samba makes support for "write raw" optional, with it -being enabled by default.

    Often a speed problem can be traced to the client. The client (for +example Windows for Workgroups) can often be tuned for better TCP +performance.

    Some machines may find "write raw" slower than normal write, in which -case you may wish to change this option.

    See your client docs for details. In particular, I have heard rumours +that the WfWg options TCPWINDOWSIZE and TCPSEGMENTSIZE can have a +large impact on performance.

    Also note that some people have found that setting DefaultRcvWindow in +the [MSTCP] section of the SYSTEM.INI file under WfWg to 3072 gives a +big improvement. I don't know why.

    My own experience wth DefaultRcvWindow is that I get much better +performance with a large value (16384 or larger). Other people have +reported that anything over 3072 slows things down enourmously. One +person even reported a speed drop of a factor of 30 when he went from +3072 to 8192. I don't know why.

    It probably depends a lot on your hardware, and the type of unix box +you have at the other end of the link.

    Paul Cochrane has done some testing on client side tuning and come +to the following conclusions:

    Install the W2setup.exe file from www.microsoft.com. This is an +update for the winsock stack and utilities which improve performance.

    Configure the win95 TCPIP registry settings to give better +perfomance. I use a program called MTUSPEED.exe which I got off the +net. There are various other utilities of this type freely available. +The setting which give the best performance for me are:

    1. MaxMTU Remove

    2. RWIN Remove

    3. MTUAutoDiscover Disable

    4. MTUBlackHoleDetect Disable

    5. Time To Live Enabled

    6. Time To Live - HOPS 32

    7. NDI Cache Size 0

    I tried virtually all of the items mentioned in the document and +the only one which made a difference to me was the socket options. It +turned out I was better off without any!!!!!

    In terms of overall speed of transfer, between various win95 clients +and a DX2-66 20MB server with a crappy NE2000 compatible and old IDE +drive (Kernel 2.0.30). The transfer rate was reasonable for 10 baseT.

    The figures are:          Put              Get 
    +P166 client 3Com card:    420-440kB/s      500-520kB/s
    +P100 client 3Com card:    390-410kB/s      490-510kB/s
    +DX4-75 client NE2000:     370-380kB/s      330-350kB/s

    I based these test on transfer two files a 4.5MB text file and a 15MB +textfile. The results arn't bad considering the hardware Samba is +running on. It's a crap machine!!!!

    The updates mentioned in 1 and 2 brought up the transfer rates from +just over 100kB/s in some clients.

    A new client is a P333 connected via a 100MB/s card and hub. The +transfer rates from this were good: 450-500kB/s on put and 600+kB/s +on get.

    Looking at standard FTP throughput, Samba is a bit slower (100kB/s +upwards). I suppose there is more going on in the samba protocol, but +if it could get up to the rate of FTP the perfomance would be quite +staggering.


    Chapter 20. Creating Group Profiles


    22.12. Read prediction

    Samba can do read prediction on some of the SMB commands. Read -prediction means that Samba reads some extra data on the last file it -read while waiting for the next SMB command to arrive. It can then -respond more quickly when the next read request arrives.

    20.1. Windows '9x

    This is disabled by default. You can enable it by using "read -prediction = yes".

    You need the Win98 Group Policy Editor to +set Group Profiles up under Windows '9x. It can be found on the Original +full product Win98 installation CD under +tools/reskit/netadmin/poledit. You install this +using the Add/Remove Programs facility and then click on the 'Have Disk' +tab.

    Note that read prediction is only used on files that were opened read -only.

    Use the Group Policy Editor to create a policy file that specifies the +location of user profiles and/or the My Documents etc. +stuff. You then save these settings in a file called +Config.POL that needs to be placed in +the root of the [NETLOGON] share. If your Win98 is configured to log onto +the Samba Domain, it will automatically read this file and update the +Win98 registry of the machine that is logging on.

    Read prediction should particularly help for those silly clients (such -as "Write" under NT) which do lots of very small reads on a file.

    All of this is covered in the Win98 Resource Kit documentation.

    Samba will not read ahead more data than the amount specified in the -"read size" option. It always reads ahead on 1k block boundaries.

    If you do not do it this way, then every so often Win98 will check the +integrity of the registry and will restore it's settings from the back-up +copy of the registry it stores on each Win98 machine. Hence, you will notice +things changing back to the original settings.


    20.2. Windows NT 4

    Unfortunately, the Resource Kit info is Win NT4/2K version specific.

    Here is a quick guide:

    • On your NT4 Domain Controller, right click on 'My Computer', then +select the tab labelled 'User Profiles'.

    • Select a user profile you want to migrate and click on it.

      I am using the term "migrate" lossely. You can copy a profile to +create a group profile. You can give the user 'Everyone' rights to the +profile you copy this to. That is what you need to do, since your samba +domain is not a member of a trust relationship with your NT4 PDC.

    • Click the 'Copy To' button.

    • In the box labelled 'Copy Profile to' add your new path, eg: +c:\temp\foobar

    • Click on the button labelled 'Change' in the "Permitted to use" box.

    • Click on the group 'Everyone' and then click OK. This closes the +'chose user' box.

    • Now click OK.

    Follow the above for every profile you need to migrate.


    20.2.1. Side bar Notes

    You should obtain the SID of your NT4 domain. You can use smbpasswd to do +this. Read the man page.

    With Samba-3.0.0 alpha code you can import all you NT4 domain accounts +using the net samsync method. This way you can retain your profile +settings as well as all your users.


    20.2.2. Mandatory profiles

    The above method can be used to create mandatory profiles also. To convert +a group profile into a mandatory profile simply locate the NTUser.DAT file +in the copied profile and rename it to NTUser.MAN.


    22.13. Memory mapping

    Samba supports reading files via memory mapping them. One some -machines this can give a large boost to performance, on others it -makes not difference at all, and on some it may reduce performance.

    20.2.3. moveuser.exe

    To enable you you have to recompile Samba with the -DUSE_MMAP option -on the FLAGS line of the Makefile.

    Note that memory mapping is only used on files opened read only, and -is not used by the "read raw" operation. Thus you may find memory -mapping is more effective if you disable "read raw" using "read raw = -no".

    The W2K professional resource kit has moveuser.exe. moveuser.exe changes +the security of a profile from one user to another. This allows the account +domain to change, and/or the user name to change.



    22.14. Slow Clients

    20.2.4. Get SID

    One person has reported that setting the protocol to COREPLUS rather -than LANMAN2 gave a dramatic speed improvement (from 10k/s to 150k/s).

    You can identify the SID by using GetSID.exe from the Windows NT Server 4.0 +Resource Kit.

    I suspect that his PC's (386sx16 based) were asking for more data than -they could chew. I suspect a similar speed could be had by setting -"read raw = no" and "max xmit = 2048", instead of changing the -protocol. Lowering the "read size" might also help.

    Windows NT 4.0 stores the local profile information in the registry under +the following key: +HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

    Under the ProfileList key, there will be subkeys named with the SIDs of the +users who have logged on to this computer. (To find the profile information +for the user whose locally cached profile you want to move, find the SID for +the user with the GetSID.exe utility.) Inside of the appropriate user's +subkey, you will see a string value named ProfileImagePath.


    22.15. Slow Logins

    20.3. Windows 2000/XP

    Slow logins are almost always due to the password checking time. Using -the lowest practical "password level" will improve things a lot. You -could also enable the "UFC crypt" option in the Makefile.

    You must first convert the profile from a local profile to a domain +profile on the MS Windows workstation as follows:

    • Log on as the LOCAL workstation administrator.

    • Right click on the 'My Computer' Icon, select 'Properties'

    • Click on the 'User Profiles' tab

    • Select the profile you wish to convert (click on it once)

    • Click on the button 'Copy To'

    • In the "Permitted to use" box, click on the 'Change' button.

    • Click on the 'Look in" area that lists the machine name, when you click +here it will open up a selection box. Click on the domain to which the +profile must be accessible.


      22.16. Client tuning

      Often a speed problem can be traced to the client. The client (for -example Windows for Workgroups) can often be tuned for better TCP -performance.

      See your client docs for details. In particular, I have heard rumours -that the WfWg options TCPWINDOWSIZE and TCPSEGMENTSIZE can have a -large impact on performance.

      You will need to log on if a logon box opens up. Eg: In the connect +as: MIDEARTH\root, password: mypassword.

    • Also note that some people have found that setting DefaultRcvWindow in -the [MSTCP] section of the SYSTEM.INI file under WfWg to 3072 gives a -big improvement. I don't know why.

      To make the profile capable of being used by anyone select 'Everyone'

    • My own experience wth DefaultRcvWindow is that I get much better -performance with a large value (16384 or larger). Other people have -reported that anything over 3072 slows things down enourmously. One -person even reported a speed drop of a factor of 30 when he went from -3072 to 8192. I don't know why.

      Click OK. The Selection box will close.

    • It probably depends a lot on your hardware, and the type of unix box -you have at the other end of the link.

      Now click on the 'Ok' button to create the profile in the path you +nominated.

    Paul Cochrane has done some testing on client side tuning and come -to the following conclusions:

    Done. You now have a profile that can be editted using the samba-3.0.0 +profiles tool.

    Install the W2setup.exe file from www.microsoft.com. This is an -update for the winsock stack and utilities which improve performance.

    Configure the win95 TCPIP registry settings to give better -perfomance. I use a program called MTUSPEED.exe which I got off the -net. There are various other utilities of this type freely available. -The setting which give the best performance for me are:

    Under NT/2K the use of mandotory profiles forces the use of MS Exchange +storage of mail data. That keeps desktop profiles usable.

      • MaxMTU Remove

        This is a security check new to Windows XP (or maybe only +Windows XP service pack 1). It can be disabled via a group policy in +Active Directory. The policy is:

        "Computer Configuration\Administrative Templates\System\User +Profiles\Do not check for user ownership of Roaming Profile Folders"

        ...and it should be set to "Enabled". +Does the new version of samba have an Active Directory analogue? If so, +then you may be able to set the policy through this.

        If you cannot set group policies in samba, then you may be able to set +the policy locally on each machine. If you want to try this, then do +the following (N.B. I don't know for sure that this will work in the +same way as a domain group policy):

      • RWIN Remove

        On the XP workstation log in with an Administrator account.

      • MTUAutoDiscover Disable

        Click: "Start", "Run"

      • MTUBlackHoleDetect Disable

        Type: "mmc"

      • Time To Live Enabled

        Click: "OK"

      • Time To Live - HOPS 32

        A Microsoft Management Console should appear.

      • NDI Cache Size 0

        Click: File, "Add/Remove Snap-in...", "Add"

      • I tried virtually all of the items mentioned in the document and -the only one which made a difference to me was the socket options. It -turned out I was better off without any!!!!!

        Double-Click: "Group Policy"

      • In terms of overall speed of transfer, between various win95 clients -and a DX2-66 20MB server with a crappy NE2000 compatible and old IDE -drive (Kernel 2.0.30). The transfer rate was reasonable for 10 baseT.

        Click: "Finish", "Close"

      • FIXME -The figures are: Put Get -P166 client 3Com card: 420-440kB/s 500-520kB/s -P100 client 3Com card: 390-410kB/s 490-510kB/s -DX4-75 client NE2000: 370-380kB/s 330-350kB/s

        Click: "OK"

      • I based these test on transfer two files a 4.5MB text file and a 15MB -textfile. The results arn't bad considering the hardware Samba is -running on. It's a crap machine!!!!

        In the "Console Root" window:

      • The updates mentioned in 1 and 2 brought up the transfer rates from -just over 100kB/s in some clients.

        Expand: "Local Computer Policy", "Computer Configuration",

      • A new client is a P333 connected via a 100MB/s card and hub. The -transfer rates from this were good: 450-500kB/s on put and 600+kB/s -on get.

        "Administrative Templates", "System", "User Profiles"

      • Looking at standard FTP throughput, Samba is a bit slower (100kB/s -upwards). I suppose there is more going on in the samba protocol, but -if it could get up to the rate of FTP the perfomance would be quite -staggering.


        22.17. My Results

        Double-Click: "Do not check for user ownership of Roaming Profile

      • Folders"

      • Some people want to see real numbers in a document like this, so here -they are. I have a 486sx33 client running WfWg 3.11 with the 3.11b -tcp/ip stack. It has a slow IDE drive and 20Mb of ram. It has a SMC -Elite-16 ISA bus ethernet card. The only WfWg tuning I've done is to -set DefaultRcvWindow in the [MSTCP] section of system.ini to 16384. My -server is a 486dx3-66 running Linux. It also has 20Mb of ram and a SMC -Elite-16 card. You can see my server config in the examples/tridge/ -subdirectory of the distribution.

        Select: "Enabled"

      • I get 490k/s on reading a 8Mb file with copy. -I get 441k/s writing the same file to the samba server.

        Click: OK"

      • Of course, there's a lot more to benchmarks than 2 raw throughput -figures, but it gives you a ballpark figure.

        Close the whole console. You do not need to save the settings (this +refers to the console settings rather than the policies you have +changed).

      • I've also tested Win95 and WinNT, and found WinNT gave me the best -speed as a samba client. The fastest client of all (for me) is -smbclient running on another linux box. Maybe I'll add those results -here someday ...

        Reboot

    Table of Contents
    23. 21. Portability
    23.1. 21.1. HPUX
    23.2. 21.2. SCO Unix
    23.3. 21.3. DNIX
    23.4. 21.4. RedHat Linux Rembrandt-II
    24. 22. Samba and other CIFS clients
    24.1. 22.1. Macintosh clients?
    24.2. 22.2. OS2 Client
    24.2.1. 22.2.1. How can I configure OS/2 Warp Connect or OS/2 Warp 4 as a client for Samba?
    24.2.2. 22.2.2. How can I configure OS/2 Warp 3 (not Connect), OS/2 1.2, 1.3 or 2.x for Samba?
    24.2.3. 22.2.3. Are there any other issues when OS/2 (any version) is used as a client?
    24.2.4. 22.2.4. How do I get printer driver download working for OS/2 clients?
    24.3. 22.3. Windows for Workgroups
    24.3.1. 22.3.1. Use latest TCP/IP stack from Microsoft
    24.3.2. 22.3.2. Delete .pwl files after password change
    24.3.3. 22.3.3. Configure WfW password handling
    24.3.4. 22.3.4. Case handling of passwords
    24.4. 22.4. Windows '95/'98
    24.5. 22.5. Windows 2000 Service Pack 2
    25. 23. Reporting Bugs
    25.1. 23.1. Introduction
    25.2. 23.2. General info
    25.3. 23.3. Debug levels
    25.4. 23.4. Internal errors
    25.5. 23.5. Attaching to a running process
    25.6. 23.6. Patches
    26. 24. Diagnosing your samba server
    26.1. 24.1. Introduction
    26.2. 24.2. Assumptions
    26.3. 24.3. Tests
    26.3.1. 24.3.1. Test 1
    26.3.2. 24.3.2. Test 2
    26.3.3. 24.3.3. Test 3
    26.3.4. 24.3.4. Test 4
    26.3.5. 24.3.5. Test 5
    26.3.6. 24.3.6. Test 6
    26.3.7. 24.3.7. Test 7
    26.3.8. 24.3.8. Test 8
    26.3.9. 24.3.9. Test 9
    26.3.10. 24.3.10. Test 10
    26.3.11. 24.3.11. Test 11
    26.4. 24.4. Still having troubles?
    Chapter 23. PortabilityChapter 21. Portability

    Samba works on a wide range of platforms but the interface all the platforms provide is not always compatible. This chapter contains @@ -15479,9 +15867,9 @@ CLASS="SECT1" >


    23.1. HPUX

    21.1. HPUX

    HP's implementation of supplementary groups is, er, non-standard (for hysterical reasons). There are two group files, /etc/group and @@ -15509,9 +15897,9 @@ CLASS="SECT1" >


    23.2. SCO Unix

    21.2. SCO Unix

    If you run an old version of SCO Unix then you may need to get important @@ -15526,9 +15914,9 @@ CLASS="SECT1" >


    23.3. DNIX

    21.3. DNIX

    DNIX has a problem with seteuid() and setegid(). These routines are needed for Samba to work correctly, but they were left out of the DNIX @@ -15633,9 +16021,9 @@ CLASS="SECT1" >


    23.4. RedHat Linux Rembrandt-II

    21.4. RedHat Linux Rembrandt-II

    By default RedHat Rembrandt-II during installation adds an entry to /etc/hosts as follows: @@ -15659,7 +16047,7 @@ CLASS="CHAPTER" >Chapter 24. Samba and other CIFS clientsChapter 22. Samba and other CIFS clients

    This chapter contains client-specific information.


    24.1. Macintosh clients?

    22.1. Macintosh clients?

    Yes.


    24.2. OS2 Client

    22.2. OS2 Client

    24.2.1. How can I configure OS/2 Warp Connect or +>22.2.1. How can I configure OS/2 Warp Connect or OS/2 Warp 4 as a client for Samba?

    A more complete answer to this question can be @@ -15780,9 +16168,9 @@ CLASS="SECT2" >


    24.2.2. How can I configure OS/2 Warp 3 (not Connect), +>22.2.2. How can I configure OS/2 Warp 3 (not Connect), OS/2 1.2, 1.3 or 2.x for Samba?

    You can use the free Microsoft LAN Manager 2.2c Client @@ -15824,9 +16212,9 @@ CLASS="SECT2" >


    24.2.3. Are there any other issues when OS/2 (any version) +>22.2.3. Are there any other issues when OS/2 (any version) is used as a client?

    When you do a NET VIEW or use the "File and Print @@ -15846,9 +16234,9 @@ CLASS="SECT2" >


    24.2.4. How do I get printer driver download working +>22.2.4. How do I get printer driver download working for OS/2 clients?

    First, create a share called [PRINTDRV] that is @@ -15897,17 +16285,17 @@ CLASS="SECT1" >


    24.3. Windows for Workgroups

    22.3. Windows for Workgroups

    24.3.1. Use latest TCP/IP stack from Microsoft

    22.3.1. Use latest TCP/IP stack from Microsoft

    Use the latest TCP/IP stack from microsoft if you use Windows for workgroups.


    24.3.2. Delete .pwl files after password change

    22.3.2. Delete .pwl files after password change

    WfWg does a lousy job with passwords. I find that if I change my password on either the unix box or the PC the safest thing to do is to @@ -15947,9 +16335,9 @@ CLASS="SECT2" >


    24.3.3. Configure WfW password handling

    22.3.3. Configure WfW password handling

    There is a program call admincfg.exe on the last disk (disk 8) of the WFW 3.11 disk set. To install it @@ -15966,9 +16354,9 @@ CLASS="SECT2" >


    24.3.4. Case handling of passwords

    22.3.4. Case handling of passwords

    Windows for Workgroups uppercases the password before sending it to the server. Unix passwords can be case-sensitive though. Check the


    24.4. Windows '95/'98

    22.4. Windows '95/'98

    When using Windows 95 OEM SR2 the following updates are recommended where Samba is being used. Please NOTE that the above change will affect you once these @@ -16033,9 +16421,9 @@ CLASS="SECT1" >


    24.5. Windows 2000 Service Pack 2

    22.5. Windows 2000 Service Pack 2

    There are several annoyances with Windows 2000 SP2. One of which @@ -16117,15 +16505,15 @@ CLASS="CHAPTER" >Chapter 25. Reporting BugsChapter 23. Reporting Bugs

    25.1. Introduction

    23.1. Introduction

    The email address for bug reports for stable releases is


    25.2. General info

    23.2. General info

    Before submitting a bug report check your config for silly errors. Look in your log files for obvious messages that tell you that @@ -16193,9 +16581,9 @@ CLASS="SECT1" >


    25.3. Debug levels

    23.3. Debug levels

    If the bug has anything to do with Samba behaving incorrectly as a server (like refusing to open a file) then the log files will probably @@ -16263,9 +16651,9 @@ CLASS="SECT1" >


    25.4. Internal errors

    23.4. Internal errors

    If you get a "INTERNAL ERROR" message in your log files it means that Samba got an unexpected signal while running. It is probably a @@ -16307,9 +16695,9 @@ CLASS="SECT1" >


    25.5. Attaching to a running process

    23.5. Attaching to a running process

    Unfortunately some unixes (in particular some recent linux kernels) refuse to dump a core file if the task has changed uid (which smbd @@ -16324,9 +16712,9 @@ CLASS="SECT1" >


    25.6. Patches

    23.6. Patches

    The best sort of bug report is one that includes a fix! If you send us patches please use Chapter 26. Diagnosing your samba serverChapter 24. Diagnosing your samba server

    26.1. Introduction

    24.1. Introduction

    This file contains a list of tests you can perform to validate your Samba server. It also tells you what the likely cause of the problem @@ -16375,9 +16763,9 @@ CLASS="SECT1" >


    26.2. Assumptions

    24.2. Assumptions

    In all of the tests it is assumed you have a Samba server called BIGSERVER and a PC called ACLIENT both in workgroup TESTGROUP.


    26.3. Tests

    24.3. Tests

    26.3.1. Test 1

    24.3.1. Test 1

    In the directory in which you store your smb.conf file, run the command "testparm smb.conf". If it reports any errors then your smb.conf @@ -16443,9 +16831,9 @@ CLASS="SECT2" >


    26.3.2. Test 2

    24.3.2. Test 2

    Run the command "ping BIGSERVER" from the PC and "ping ACLIENT" from the unix box. If you don't get a valid response then your TCP/IP @@ -16469,9 +16857,9 @@ CLASS="SECT2" >


    26.3.3. Test 3

    24.3.3. Test 3

    Run the command "smbclient -L BIGSERVER" on the unix box. You should get a list of available shares back.


    26.3.4. Test 4

    24.3.4. Test 4

    Run the command "nmblookup -B BIGSERVER __SAMBA__". You should get the IP address of your Samba server back.


    26.3.5. Test 5

    24.3.5. Test 5

    run the command


    26.3.6. Test 6

    24.3.6. Test 6

    Run the command


    26.3.7. Test 7

    24.3.7. Test 7

    Run the command


    26.3.8. Test 8

    24.3.8. Test 8

    On the PC type the command


    26.3.9. Test 9

    24.3.9. Test 9

    Run the command


    26.3.10. Test 10

    24.3.10. Test 10

    Run the command


    26.3.11. Test 11

    24.3.11. Test 11

    From file manager try to browse the server. Your samba server should appear in the browse list of your local workgroup (or the one you @@ -16853,9 +17241,9 @@ CLASS="SECT1" >


    26.4. Still having troubles?

    24.4. Still having troubles?

    Try the mailing list or newsgroup, or use the ethereal utility to sniff the problem. The official samba mailing list can be reached at diff --git a/docs/htmldocs/ads.html b/docs/htmldocs/ads.html index 26ec1d04a7..2c556b61f3 100644 --- a/docs/htmldocs/ads.html +++ b/docs/htmldocs/ads.html @@ -5,8 +5,7 @@ >Samba as a ADS domain member

    Chapter 8. Samba as a ADS domain member

    Chapter 7. Samba as a ADS domain member

    This is a rough guide to setting up Samba 3.0 with kerberos authentication against a Windows2000 KDC.

    Pieces you need before you begin: -

    Pieces you need before you begin:

    8.1. Installing the required packages for Debian

    7.1. Installing the required packages for Debian

    On Debian you need to install the following packages:

    On Debian you need to install the following packages: -

    8.2. Installing the required packages for RedHat

    7.2. Installing the required packages for RedHat

    On RedHat this means you should have at least:

    On RedHat this means you should have at least: -

    8.3. Compile Samba

    7.3. Compile Samba

    If your kerberos libraries are in a non-standard location then remember to add the configure option --with-krb5=DIR.

    After you run configure make sure that include/config.h contains +>After you run configure make sure that include/config.h it + generates contains lines like this:

      ads server = your.kerberos.server

    You do *not* need a smbpasswd file, although it won't do any harm - and if you have one then Samba will be able to fall back to normal - password security for older clients. I expect that the above +>You do *not* need a smbpasswd file, and older clients will + be authenticated as if "security = domain", although it won't do any harm + and allows you to have local users not in the domain. + I expect that the above required options will change soon when we get better active directory integration.

    8.4. Setup your /etc/krb5.conf

    7.4. Setup your /etc/krb5.conf

    The minimal configuration for krb5.conf is:

    	[realms]
    +>[realms]
         YOUR.KERBEROS.REALM = {
     	kdc = your.kerberos.server
         }

    If all you want is kerberos support in smbclient then you can skip straight to step 5 now. Step 3 is only needed if you want kerberos -support in smbd.

    8.5. Create the computer account

    7.5. Create the computer account

    Do a "kinit" as a user that has authority to change arbitrary -passwords on the KDC ("Administrator" is a good choice). Then as a -user that has write permission on the Samba private directory +>As a user that has write permission on the Samba private directory (usually root) run:

    8.5.1. Possible errors

    7.5.1. Possible errors

    8.5.1. Possible errors
    "bash: kinit: command not found"

    kinit is in the krb5-workstation RPM on RedHat systems, and is in /usr/kerberos/bin, so it won't be in the path until you log in again (or open a new terminal)

    "ADS support not compiled in"

    8.6. Test your server setup

    7.6. Test your server setup

    On a Windows 2000 client try

    8.7. Testing with smbclient

    7.7. Testing with smbclient

    On your Samba server try to login to a Win2000 server or your Samba server using smbclient and kerberos. Use smbclient as usual, but @@ -335,7 +349,9 @@ CLASS="SECT1" >

    8.8. Notes

    7.8. Notes

    You must change administrator password at least once after DC install, to create the right encoding types

    Samba as a NT4 domain memberSamba as a NT4 or Win2k domain member
    AppendixesPrev
    Quick Cross Subnet Browsing / Cross Workgroup Browsing guidePrev

    Alternative means of name resolution includes: -

    Alternative means of name resolution includes:

    Many sites want to restrict DNS lookups and want to avoid broadcast name resolution traffic. The "name resolve order" parameter is of great help here. The syntax of the "name resolve order" parameter is:

    	name resolve order = wins lmhosts bcast host
    name resolve order = wins lmhosts bcast host _or_
    	name resolve order = wins lmhosts  	(eliminates bcast and host)
    name resolve order = wins lmhosts (eliminates bcast and host) The default is:
    	name  resolve order = host lmhost wins bcast
    name resolve order = host lmhost wins bcast. where "host" refers the the native methods used by the Unix system to implement the gethostbyname() function call. This is normally @@ -388,7 +400,7 @@ WIDTH="33%" ALIGN="left" VALIGN="top" >PrevNextImproved browsing in sambaHow to Install and Test SAMBALanMan and NT Password Encryption in SambaUser information database
    Reporting Bugs

    Chapter 25. Reporting Bugs

    Chapter 23. Reporting Bugs

    25.1. Introduction

    23.1. Introduction

    The email address for bug reports for stable releases is

    25.2. General info

    23.2. General info

    Before submitting a bug report check your config for silly errors. Look in your log files for obvious messages that tell you that @@ -145,7 +150,9 @@ CLASS="SECT1" >

    25.3. Debug levels

    23.3. Debug levels

    If the bug has anything to do with Samba behaving incorrectly as a server (like refusing to open a file) then the log files will probably @@ -213,7 +220,9 @@ CLASS="SECT1" >

    25.4. Internal errors

    23.4. Internal errors

    If you get a "INTERNAL ERROR" message in your log files it means that Samba got an unexpected signal while running. It is probably a @@ -255,7 +264,9 @@ CLASS="SECT1" >

    25.5. Attaching to a running process

    23.5. Attaching to a running process

    Unfortunately some unixes (in particular some recent linux kernels) refuse to dump a core file if the task has changed uid (which smbd @@ -270,7 +281,9 @@ CLASS="SECT1" >

    25.6. Patches

    23.6. Patches

    The best sort of bug report is one that includes a fix! If you send us patches please use HOWTO Access Samba source code via CVSAccess Samba source code via CVSPrev

    Chapter 20. HOWTO Access Samba source code via CVS

    Chapter 17. Access Samba source code via CVS

    20.1. Introduction

    17.1. Introduction

    Samba is developed in an open environment. Developers use CVS (Concurrent Versioning System) to "checkin" (also known as @@ -99,7 +102,9 @@ CLASS="SECT1" >

    20.2. CVS Access to samba.org

    17.2. CVS Access to samba.org

    The machine samba.org runs a publicly accessible CVS repository for access to the source code of several packages, @@ -110,7 +115,9 @@ CLASS="SECT2" >

    20.2.1. Access via CVSweb

    17.2.1. Access via CVSweb

    You can access the source code via your favourite WWW browser. This allows you to access the contents of @@ -129,7 +136,9 @@ CLASS="SECT2" >

    20.2.2. Access via cvs

    17.2.2. Access via cvs

    You can also access the source code via a normal cvs client. This gives you much more control over you can @@ -247,7 +256,7 @@ WIDTH="33%" ALIGN="left" VALIGN="top" >PrevStoring Samba's User/Machine Account information in an LDAP DirectoryStackable VFS modulesDiagnosing your samba server

    Chapter 26. Diagnosing your samba server

    Chapter 24. Diagnosing your samba server

    26.1. Introduction

    24.1. Introduction

    This file contains a list of tests you can perform to validate your Samba server. It also tells you what the likely cause of the problem @@ -92,7 +95,9 @@ CLASS="SECT1" >

    26.2. Assumptions

    24.2. Assumptions

    In all of the tests it is assumed you have a Samba server called BIGSERVER and a PC called ACLIENT both in workgroup TESTGROUP.

    26.3. Tests

    24.3. Tests

    26.3.1. Test 1

    24.3.1. Test 1

    In the directory in which you store your smb.conf file, run the command "testparm smb.conf". If it reports any errors then your smb.conf @@ -154,7 +163,9 @@ CLASS="SECT2" >

    26.3.2. Test 2

    24.3.2. Test 2

    Run the command "ping BIGSERVER" from the PC and "ping ACLIENT" from the unix box. If you don't get a valid response then your TCP/IP @@ -178,7 +189,9 @@ CLASS="SECT2" >

    26.3.3. Test 3

    24.3.3. Test 3

    Run the command "smbclient -L BIGSERVER" on the unix box. You should get a list of available shares back.

    26.3.4. Test 4

    24.3.4. Test 4

    Run the command "nmblookup -B BIGSERVER __SAMBA__". You should get the IP address of your Samba server back.

    26.3.5. Test 5

    24.3.5. Test 5

    run the command

    26.3.6. Test 6

    24.3.6. Test 6

    Run the command

    26.3.7. Test 7

    24.3.7. Test 7

    Run the command

    26.3.8. Test 8

    24.3.8. Test 8

    On the PC type the command

    26.3.9. Test 9

    24.3.9. Test 9

    Run the command

    26.3.10. Test 10

    24.3.10. Test 10

    Run the command

    26.3.11. Test 11

    24.3.11. Test 11

    From file manager try to browse the server. Your samba server should appear in the browse list of your local workgroup (or the one you @@ -544,7 +573,9 @@ CLASS="SECT1" >

    26.4. Still having troubles?

    24.4. Still having troubles?

    Try the mailing list or newsgroup, or use the ethereal utility to sniff the problem. The official samba mailing list can be reached at diff --git a/docs/htmldocs/domain-security.html b/docs/htmldocs/domain-security.html index 670d96ba5f..fcb40641e4 100644 --- a/docs/htmldocs/domain-security.html +++ b/docs/htmldocs/domain-security.html @@ -2,11 +2,10 @@ Samba as a NT4 domain memberSamba as a NT4 or Win2k domain member

    Chapter 9. Samba as a NT4 domain member

    Chapter 8. Samba as a NT4 or Win2k domain member

    9.1. Joining an NT Domain with Samba 2.2

    8.1. Joining an NT Domain with Samba 3.0

    Assume you have a Samba 2.x server with a NetBIOS name of +>Assume you have a Samba 3.0 server with a NetBIOS name of SERV1 and are joining an NT domain called +> and are joining an or Win2k NT domain called DOM.

    In order to join the domain, first stop all Samba daemons - and run the command:

    root# smbpasswd -j DOM -r DOMPDC - -UAdministrator%password

    as we are joining the domain DOM and the PDC for that domain - (the only machine that has write access to the domain SAM database) - is DOMPDC. The Administrator%password is - the login name and password for an account which has the necessary - privilege to add machines to the domain. If this is successful - you will see the message:

    smbpasswd: Joined domain DOM. -

    in your terminal window. See the smbpasswd(8) man page for more details.

    There is existing development code to join a domain - without having to create the machine trust account on the PDC - beforehand. This code will hopefully be available soon - in release branches as well.

    This command goes through the machine account password - change protocol, then writes the new (random) machine account - password for this Samba server into a file in the same directory - in which an smbpasswd file would be stored - normally :

    /usr/local/samba/private

    In Samba 2.0.x, the filename looks like this:

    <NT DOMAIN NAME>.<Samba - Server Name>.mac

    The .mac suffix stands for machine account - password file. So in our example above, the file would be called:

    DOM.SERV1.mac

    In Samba 2.2, this file has been replaced with a TDB - (Trivial Database) file named secrets.tdb. -

    This file is created and owned by root and is not - readable by any other user. It is the key to the domain-level - security for your system, and should be treated as carefully - as a shadow password file.

    Now, before restarting the Samba daemons you must - edit your Firstly, you must edit your security = domain

    or + security = ads depending on if the PDC is + NT4 or running Active Directory respectivly.

    Next change the password server = *

    This method, which was introduced in Samba 2.0.6, - allows Samba to use exactly the same mechanism that NT does. This +>This method, allows Samba to use exactly the same + mechanism that NT does. This method either broadcasts or uses a WINS database in order to find domain controllers to authenticate against.

    In order to actually join the domain, you must run this + command:

    root# net join -S DOMPDC + -UAdministrator%password

    as we are joining the domain DOM and the PDC for that domain + (the only machine that has write access to the domain SAM database) + is DOMPDC. The Administrator%password is + the login name and password for an account which has the necessary + privilege to add machines to the domain. If this is successful + you will see the message:

    Joined domain DOM. + or Joined 'SERV1' to realm 'MYREALM' +

    in your terminal window. See the net(8) man page for more details.

    This process joins the server to thedomain + without having to create the machine trust account on the PDC + beforehand.

    This command goes through the machine account password + change protocol, then writes the new (random) machine account + password for this Samba server into a file in the same directory + in which an smbpasswd file would be stored - normally :

    /usr/local/samba/private/secrets.tdb

    This file is created and owned by root and is not + readable by any other user. It is the key to the domain-level + security for your system, and should be treated as carefully + as a shadow password file.

    Finally, restart your Samba daemons and get ready for clients to begin using domain security!

    9.2. Samba and Windows 2000 Domains

    8.2. Samba and Windows 2000 Domains

    Many people have asked regarding the state of Samba's ability to participate in a Windows 2000 Domain. Samba 3.0 is able to act as a member server of a Windows -2000 domain operating in mixed or native mode.

    There is much confusion between the circumstances that require a "mixed" mode -Win2k DC and a when this host can be switched to "native" mode. A "mixed" mode -Win2k domain controller is only needed if Windows NT BDCs must exist in the same -domain. By default, a Win2k DC in "native" mode will still support -NetBIOS and NTLMv1 for authentication of legacy clients such as Windows 9x and -NT 4.0. Samba has the same requirements as a Windows NT 4.0 member server.

    The steps for adding a Samba 2.2 host to a Win2k domain are the same as those -for adding a Samba server to a Windows NT 4.0 domain. The only exception is that -the "Server Manager" from NT 4 has been replaced by the "Active Directory Users and -Computers" MMC (Microsoft Management Console) plugin.

    9.3. Why is this better than security = server?

    8.3. Why is this better than security = server?

    Currently, domain security in Samba doesn't free you from having to create local Unix users to represent the users attaching @@ -387,13 +354,7 @@ CLASS="COMMAND" >And finally, acting in the same manner as an NT server authenticating to a PDC means that as part of the authentication reply, the Samba server gets the user identification information such - as the user SID, the list of NT groups the user belongs to, etc. All - this information will allow Samba to be extended in the future into - a mode the developers currently call appliance mode. In this mode, - no local Unix users will be necessary, and Samba will generate Unix - uids and gids from the information passed back from the PDC when a - user is authenticated, making a Samba server truly plug and play - in an NT domain environment. Watch for this code soon.

    + findsmb

    findsmb

    findsmb

    Synopsis

    findsmb [subnet broadcast address]

    [subnet broadcast address]

    DESCRIPTION

    This perl script is part of the Samba suite.

    This perl script is part of the Samba(7) + suite.

    is a perl script that prints out several pieces of information about machines on a subnet that respond to SMB name query requests. - It uses nmblookup(1) and smbclient(1) to obtain this information. + It uses nmblookup(1) + and smbclient(1) + to obtain this information.

    OPTIONS

    nmblookupnmblookup(1) will be called with findsmb
    will probe the subnet of the machine where - findsmb is run. This value is passed - to nmblookup as part of the - findsmb(1) + is run. This value is passed to + nmblookup(1) + as part of the -B option.

    EXAMPLES

    -r
    option - must be run on a system without nmbd running. + must be run on a system without nmbd(8) running. + If nmbdFor example, running findsmb without - + without -r option set would yield output similar to the following

    IP ADDR         NETBIOS NAME   WORKGROUP/OS/VERSION 
     --------------------------------------------------------------------- 
     192.168.35.10   MINESET-TEST1  [DMVENGR]
    @@ -219,17 +223,12 @@ CLASS="COMPUTEROUTPUT"
     192.168.35.78   HERBDHCP1     +[HERB]
     192.168.35.88   SCNT2         +[MVENGR] [Windows NT 4.0] [NT LAN Manager 4.0]
     192.168.35.93   FROGSTAR-PC    [MVENGR] [Windows 5.0] [Windows 2000 LAN Manager]
    -192.168.35.97   HERBNT1       *[HERB-NT] [Windows NT 4.0] [NT LAN Manager 4.0]
    -	

    VERSION

    SEE ALSO

    nmbd(8), - smbclient(1) - , and nmblookup(1)nmbd(8), + smbclient(1), and nmblookup(1)

    AUTHOR

    The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 - release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

    ftp://ftp.icce.rug.nl/pub/unix/) + and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for + Samba 2.2 was done by Gerald Carter. The conversion to DocBook + XML 4.2 for Samba 3.0 was done by Alexander Bokovoy.

    Group mapping HOWTO

    Chapter 21. Group mapping HOWTO

    Chapter 18. Group mapping HOWTO

    Starting with Samba 3.0 alpha 2, a new group mapping function is available. The @@ -212,7 +213,7 @@ ACCESSKEY="N" WIDTH="33%" ALIGN="left" VALIGN="top" ->HOWTO Access Samba source code via CVSAccess Samba source code via CVS +Creating Group Profiles

    SAMBA Project Documentation
    PrevNext

    Chapter 20. Creating Group Profiles

    20.1. Windows '9x

    You need the Win98 Group Policy Editor to +set Group Profiles up under Windows '9x. It can be found on the Original +full product Win98 installation CD under +tools/reskit/netadmin/poledit. You install this +using the Add/Remove Programs facility and then click on the 'Have Disk' +tab.

    Use the Group Policy Editor to create a policy file that specifies the +location of user profiles and/or the My Documents etc. +stuff. You then save these settings in a file called +Config.POL that needs to be placed in +the root of the [NETLOGON] share. If your Win98 is configured to log onto +the Samba Domain, it will automatically read this file and update the +Win98 registry of the machine that is logging on.

    All of this is covered in the Win98 Resource Kit documentation.

    If you do not do it this way, then every so often Win98 will check the +integrity of the registry and will restore it's settings from the back-up +copy of the registry it stores on each Win98 machine. Hence, you will notice +things changing back to the original settings.

    20.2. Windows NT 4

    Unfortunately, the Resource Kit info is Win NT4/2K version specific.

    Here is a quick guide:

    • On your NT4 Domain Controller, right click on 'My Computer', then +select the tab labelled 'User Profiles'.

    • Select a user profile you want to migrate and click on it.

      I am using the term "migrate" lossely. You can copy a profile to +create a group profile. You can give the user 'Everyone' rights to the +profile you copy this to. That is what you need to do, since your samba +domain is not a member of a trust relationship with your NT4 PDC.

    • Click the 'Copy To' button.

    • In the box labelled 'Copy Profile to' add your new path, eg: +c:\temp\foobar

    • Click on the button labelled 'Change' in the "Permitted to use" box.

    • Click on the group 'Everyone' and then click OK. This closes the +'chose user' box.

    • Now click OK.

    Follow the above for every profile you need to migrate.

    20.2.1. Side bar Notes

    You should obtain the SID of your NT4 domain. You can use smbpasswd to do +this. Read the man page.

    With Samba-3.0.0 alpha code you can import all you NT4 domain accounts +using the net samsync method. This way you can retain your profile +settings as well as all your users.

    20.2.2. Mandatory profiles

    The above method can be used to create mandatory profiles also. To convert +a group profile into a mandatory profile simply locate the NTUser.DAT file +in the copied profile and rename it to NTUser.MAN.

    20.2.3. moveuser.exe

    The W2K professional resource kit has moveuser.exe. moveuser.exe changes +the security of a profile from one user to another. This allows the account +domain to change, and/or the user name to change.

    20.2.4. Get SID

    You can identify the SID by using GetSID.exe from the Windows NT Server 4.0 +Resource Kit.

    Windows NT 4.0 stores the local profile information in the registry under +the following key: +HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

    Under the ProfileList key, there will be subkeys named with the SIDs of the +users who have logged on to this computer. (To find the profile information +for the user whose locally cached profile you want to move, find the SID for +the user with the GetSID.exe utility.) Inside of the appropriate user's +subkey, you will see a string value named ProfileImagePath.

    20.3. Windows 2000/XP

    You must first convert the profile from a local profile to a domain +profile on the MS Windows workstation as follows:

    • Log on as the LOCAL workstation administrator.

    • Right click on the 'My Computer' Icon, select 'Properties'

    • Click on the 'User Profiles' tab

    • Select the profile you wish to convert (click on it once)

    • Click on the button 'Copy To'

    • In the "Permitted to use" box, click on the 'Change' button.

    • Click on the 'Look in" area that lists the machine name, when you click +here it will open up a selection box. Click on the domain to which the +profile must be accessible.

      You will need to log on if a logon box opens up. Eg: In the connect +as: MIDEARTH\root, password: mypassword.

    • To make the profile capable of being used by anyone select 'Everyone'

    • Click OK. The Selection box will close.

    • Now click on the 'Ok' button to create the profile in the path you +nominated.

    Done. You now have a profile that can be editted using the samba-3.0.0 +profiles tool.

    Under NT/2K the use of mandotory profiles forces the use of MS Exchange +storage of mail data. That keeps desktop profiles usable.

    • This is a security check new to Windows XP (or maybe only +Windows XP service pack 1). It can be disabled via a group policy in +Active Directory. The policy is:

      "Computer Configuration\Administrative Templates\System\User +Profiles\Do not check for user ownership of Roaming Profile Folders"

      ...and it should be set to "Enabled". +Does the new version of samba have an Active Directory analogue? If so, +then you may be able to set the policy through this.

      If you cannot set group policies in samba, then you may be able to set +the policy locally on each machine. If you want to try this, then do +the following (N.B. I don't know for sure that this will work in the +same way as a domain group policy):

    • On the XP workstation log in with an Administrator account.

    • Click: "Start", "Run"

    • Type: "mmc"

    • Click: "OK"

    • A Microsoft Management Console should appear.

    • Click: File, "Add/Remove Snap-in...", "Add"

    • Double-Click: "Group Policy"

    • Click: "Finish", "Close"

    • Click: "OK"

    • In the "Console Root" window:

    • Expand: "Local Computer Policy", "Computer Configuration",

    • "Administrative Templates", "System", "User Profiles"

    • Double-Click: "Do not check for user ownership of Roaming Profile

    • Folders"

    • Select: "Enabled"

    • Click: OK"

    • Close the whole console. You do not need to save the settings (this +refers to the console settings rather than the policies you have +changed).

    • Reboot


    PrevHomeNext
    Samba performance issuesUpAppendixes
    \ No newline at end of file diff --git a/docs/htmldocs/improved-browsing.html b/docs/htmldocs/improved-browsing.html index 4e9d7f639e..b912cb57e5 100644 --- a/docs/htmldocs/improved-browsing.html +++ b/docs/htmldocs/improved-browsing.html @@ -5,20 +5,19 @@ >Improved browsing in sambaPrevNext

    Chapter 2. Improved browsing in samba

    Chapter 15. Improved browsing in samba

    2.1. Overview of browsing

    15.1. Overview of browsing

    SMB networking provides a mechanism by which clients can access a list of machines in a network, a so-called "browse list". This list @@ -101,7 +104,9 @@ CLASS="SECT1" >

    2.2. Browsing support in samba

    15.2. Browsing support in samba

    Samba now fully supports browsing. The browsing is supported by nmbd and is also controlled by options in the smb.conf file (see smb.conf(5)).

    2.3. Problem resolution

    15.3. Problem resolution

    If something doesn't work then hopefully the log.nmb file will help you track down the problem. Try a debug level of 2 or 3 for finding @@ -176,7 +183,9 @@ CLASS="SECT1" >

    2.4. Browsing across subnets

    15.4. Browsing across subnets

    With the release of Samba 1.9.17(alpha1 and above) Samba has been updated to enable it to support the replication of browse lists @@ -205,7 +214,9 @@ CLASS="SECT2" >

    2.4.1. How does cross subnet browsing work ?

    15.4.1. How does cross subnet browsing work ?

    Cross subnet browsing is a complicated dance, containing multiple moving parts. It has taken Microsoft several years to get the code @@ -415,7 +426,9 @@ CLASS="SECT1" >

    2.5. Setting up a WINS server

    15.5. Setting up a WINS server

    Either a Samba machine or a Windows NT Server machine may be set up as a WINS server. To set a Samba machine to be a WINS server you must @@ -496,7 +509,9 @@ CLASS="SECT1" >

    2.6. Setting up Browsing in a WORKGROUP

    15.6. Setting up Browsing in a WORKGROUP

    To set up cross subnet browsing on a network containing machines in up to be in a WORKGROUP, not an NT Domain you need to set up one @@ -578,7 +593,9 @@ CLASS="SECT1" >

    2.7. Setting up Browsing in a DOMAIN

    15.7. Setting up Browsing in a DOMAIN

    If you are adding Samba servers to a Windows NT Domain then you must not set up a Samba server as a domain master browser. @@ -627,7 +644,9 @@ CLASS="SECT1" >

    2.8. Forcing samba to be the master

    15.8. Forcing samba to be the master

    Who becomes the "master browser" is determined by an election process using broadcasts. Each election packet contains a number of parameters @@ -673,7 +692,9 @@ CLASS="SECT1" >

    2.9. Making samba the domain master

    15.9. Making samba the domain master

    The domain master is responsible for collating the browse lists of multiple subnets so that browsing can occur between subnets. You can @@ -744,7 +765,9 @@ CLASS="SECT1" >

    2.10. Note about broadcast addresses

    15.10. Note about broadcast addresses

    If your network uses a "0" based broadcast address (for example if it ends in a 0) then you will strike problems. Windows for Workgroups @@ -756,7 +779,9 @@ CLASS="SECT1" >

    2.11. Multiple interfaces

    15.11. Multiple interfaces

    Samba now supports machines with multiple network interfaces. If you have multiple interfaces then you will need to use the "interfaces" @@ -779,7 +804,7 @@ WIDTH="33%" ALIGN="left" VALIGN="top" >PrevNextHow to Install and Test SAMBAUnified Logons between Windows NT and UNIX using WinbindUpQuick Cross Subnet Browsing / Cross Workgroup Browsing guideStackable VFS modules

    How to Install and Test SAMBANext

    Chapter 1. How to Install and Test SAMBA

    Chapter 1. How to Install and Test SAMBA

    1.1. Read the man pages

    1.1. Read the man pages

    The man pages distributed with SAMBA contain lots of useful info that will help to get you started. @@ -119,7 +122,9 @@ CLASS="SECT1" >

    1.2. Building the Binaries

    1.2. Building the Binaries

    To do this, first run the program

    1.3. The all important step

    1.3. The all important step

    At this stage you must fetch yourself a coffee or other drink you find stimulating. Getting the rest @@ -231,7 +238,9 @@ CLASS="SECT1" >

    1.4. Create the smb configuration file.

    1.4. Create the smb configuration file.

    There are sample configuration files in the examples subdirectory in the distribution. I suggest you read them @@ -285,7 +294,9 @@ CLASS="SECT1" >

    1.5. Test your config file with +NAME="AEN82" +>1.5. Test your config file with testparm

    1.6. Starting the smbd and nmbd

    1.6. Starting the smbd and nmbd

    You must choose to start smbd and nmbd either as daemons or from

    1.6.1. Starting from inetd.conf

    1.6.1. Starting from inetd.conf

    NOTE; The following will be different if you use NIS or NIS+ to distributed services maps.

    1.6.2. Alternative: starting it as a daemon

    1.6.2. Alternative: starting it as a daemon

    To start the server as a daemon you should create a script something like this one, perhaps calling @@ -508,7 +525,9 @@ CLASS="SECT1" >

    1.7. Try listing the shares available on your +NAME="AEN145" +>1.7. Try listing the shares available on your server

    1.8. Try connecting with the unix client

    1.8. Try connecting with the unix client

    1.9. Try connecting from a DOS, WfWg, Win9x, WinNT, +NAME="AEN170" +>1.9. Try connecting from a DOS, WfWg, Win9x, WinNT, Win2k, OS/2, etc... client

    Try mounting disks. eg:

    1.10. What If Things Don't Work?

    1.10. What If Things Don't Work?

    If nothing works and you start to think "who wrote this pile of trash" then I suggest you do step 2 again (and @@ -676,7 +701,9 @@ CLASS="SECT2" >

    1.10.1. Diagnosing Problems

    1.10.1. Diagnosing Problems

    If you have installation problems then go to the

    1.10.2. Scope IDs

    1.10.2. Scope IDs

    By default Samba uses a blank scope ID. This means all your windows boxes must also have a blank scope ID. @@ -705,7 +734,9 @@ CLASS="SECT2" >

    1.10.3. Choosing the Protocol Level

    1.10.3. Choosing the Protocol Level

    The SMB protocol has many dialects. Currently Samba supports 5, called CORE, COREPLUS, LANMAN1, @@ -744,7 +775,9 @@ CLASS="SECT2" >

    1.10.4. Printing from UNIX to a Client PC

    1.10.4. Printing from UNIX to a Client PC

    To use a printer that is available via a smb-based server from a unix host with LPR you will need to compile the @@ -763,7 +796,9 @@ CLASS="SECT2" >

    1.10.5. Locking

    1.10.5. Locking

    One area which sometimes causes trouble is locking.

    1.10.6. Mapping Usernames

    1.10.6. Mapping Usernames

    If you have different usernames on the PCs and the unix server then take a look at the "username map" option. @@ -863,7 +900,7 @@ WIDTH="33%" ALIGN="right" VALIGN="top" >NextImproved browsing in sambaQuick Cross Subnet Browsing / Cross Workgroup Browsing guide

    Integrating MS Windows networks with Samba

    Chapter 10. Integrating MS Windows networks with Samba

    Chapter 9. Integrating MS Windows networks with Samba

    10.1. Agenda

    9.1. Agenda

    To identify the key functional mechanisms of MS Windows networking to enable the deployment of Samba as a means of extending and/or @@ -144,7 +147,9 @@ CLASS="SECT1" >

    10.2. Name Resolution in a pure Unix/Linux world

    9.2. Name Resolution in a pure Unix/Linux world

    The key configuration files covered in this section are:

    10.2.1. 9.2.1. /etc/hosts

    10.2.2. 9.2.2. /etc/resolv.conf

    10.2.3. 9.2.3. /etc/host.conf

    10.2.4. 9.2.4. /etc/nsswitch.conf

    10.3. Name resolution as used within MS Windows networking

    9.3. Name resolution as used within MS Windows networking

    MS Windows networking is predicated about the name each machine is given. This name is known variously (and inconsistently) as @@ -413,16 +428,16 @@ the client/server.

    	Unique NetBIOS Names:
    -		MACHINENAME<00>	= Server Service is running on MACHINENAME
    -		MACHINENAME<03> = Generic Machine Name (NetBIOS name)
    -		MACHINENAME<20> = LanMan Server service is running on MACHINENAME
    -		WORKGROUP<1b> = Domain Master Browser
    +		MACHINENAME<00>	= Server Service is running on MACHINENAME
    +		MACHINENAME<03> = Generic Machine Name (NetBIOS name)
    +		MACHINENAME<20> = LanMan Server service is running on MACHINENAME
    +		WORKGROUP<1b> = Domain Master Browser
     
     	Group Names:
    -		WORKGROUP<03> = Generic Name registered by all members of WORKGROUP
    -		WORKGROUP<1c> = Domain Controllers / Netlogon Servers
    -		WORKGROUP<1d> = Local Master Browsers
    -		WORKGROUP<1e> = Internet Name Resolvers

    It should be noted that all NetBIOS machines register their own @@ -441,7 +456,7 @@ be needed. An example of this is what happens when an MS Windows client wants to locate a domain logon server. It find this service and the IP address of a server that provides it by performing a lookup (via a NetBIOS broadcast) for enumeration of all machines that have -registered the name type *<1c>. A logon request is then sent to each +registered the name type *<1c>. A logon request is then sent to each IP address that is returned in the enumerated list of IP addresses. Which ever machine first replies then ends up providing the logon services.

    10.3.1. The NetBIOS Name Cache

    9.3.1. The NetBIOS Name Cache

    All MS Windows machines employ an in memory buffer in which is stored the NetBIOS names and IP addresses for all external @@ -501,7 +518,9 @@ CLASS="SECT2" >

    10.3.2. The LMHOSTS file

    9.3.2. The LMHOSTS file

    This file is usually located in MS Windows NT 4.0 or 2000 in

    10.3.3. HOSTS file

    9.3.3. HOSTS file

    This file is usually located in MS Windows NT 4.0 or 2000 in

    10.3.4. DNS Lookup

    9.3.4. DNS Lookup

    This capability is configured in the TCP/IP setup area in the network configuration facility. If enabled an elaborate name resolution sequence @@ -640,7 +663,9 @@ CLASS="SECT2" >

    10.3.5. WINS Lookup

    9.3.5. WINS Lookup

    A WINS (Windows Internet Name Server) service is the equivaent of the rfc1001/1002 specified NBNS (NetBIOS Name Server). A WINS server stores @@ -681,7 +706,9 @@ CLASS="SECT1" >

    10.4. How browsing functions and how to deploy stable and +NAME="AEN1643" +>9.4. How browsing functions and how to deploy stable and dependable browsing using Samba

    As stated above, MS Windows machines register their NetBIOS names @@ -746,7 +773,9 @@ CLASS="SECT1" >

    10.5. MS Windows security options and how to configure +NAME="AEN1653" +>9.5. MS Windows security options and how to configure Samba for seemless integration

    MS Windows clients may use encrypted passwords as part of a @@ -881,7 +910,9 @@ CLASS="SECT2" >

    10.5.1. Use MS Windows NT as an authentication server

    9.5.1. Use MS Windows NT as an authentication server

    This method involves the additions of the following parameters in the smb.conf file:

    10.5.2. Make Samba a member of an MS Windows NT security domain

    9.5.2. Make Samba a member of an MS Windows NT security domain

    This method involves additon of the following paramters in the smb.conf file:

    10.5.3. Configure Samba as an authentication server

    9.5.3. Configure Samba as an authentication server

    This mode of authentication demands that there be on the Unix/Linux system both a Unix style account as well as an @@ -1011,7 +1046,9 @@ CLASS="SECT3" >

    10.5.3.1. Users

    9.5.3.1. Users

    A user account that may provide a home directory should be created. The following Linux system commands are typical of @@ -1032,7 +1069,9 @@ CLASS="SECT3" >

    10.5.3.2. MS Windows NT Machine Accounts

    9.5.3.2. MS Windows NT Machine Accounts

    These are required only when Samba is used as a domain controller. Refer to the Samba-PDC-HOWTO for more details.

    10.6. Conclusions

    9.6. Conclusions

    Samba provides a flexible means to operate as...

    General installation

    Introduction

    This part contains general info on how to install samba @@ -206,155 +209,199 @@ HREF="install.html#AEN219" >

  • 2. Improved browsing in sambaQuick Cross Subnet Browsing / Cross Workgroup Browsing guide
    2.1. Overview of browsingDiscussion
    2.2. Browsing support in sambaUse of the "Remote Announce" parameter
    2.3. Problem resolutionUse of the "Remote Browse Sync" parameter
    2.4. Browsing across subnets
    2.4.1. How does cross subnet browsing work ?Use of WINS
    2.5. Setting up a WINS serverDo NOT use more than one (1) protocol on MS Windows machines
    2.6. Setting up Browsing in a WORKGROUPName Resolution Order
    2.7. Setting up Browsing in a DOMAIN3. User information database
    2.8. Forcing samba to be the master3.1. Introduction
    2.9. Making samba the domain master3.2. Important Notes About Security
    2.10. Note about broadcast addresses3.2.1. Advantages of SMB Encryption
    2.11. Multiple interfaces3.2.2. Advantages of non-encrypted passwords
    3. Quick Cross Subnet Browsing / Cross Workgroup Browsing guide3.3. The smbpasswd Command
    3.4. Plain text
    3.5. TDB
    3.6. LDAP
    3.1. Discussion3.6.1. Introduction
    3.2. Use of the "Remote Announce" parameter3.6.2. Introduction
    3.3. Use of the "Remote Browse Sync" parameter3.6.3. Supported LDAP Servers
    3.4. Use of WINS3.6.4. Schema and Relationship to the RFC 2307 posixAccount
    3.5. Do NOT use more than one (1) protocol on MS Windows machines3.6.5. Configuring Samba with LDAP
    3.6. Name Resolution Order3.6.6. Accounts and Groups management
    3.6.7. Security and sambaAccount
    3.6.8. LDAP specials attributes for sambaAccounts
    3.6.9. Example LDIF Entries for a sambaAccount
    4. LanMan and NT Password Encryption in Samba3.7. MySQL
    4.1. Introduction3.7.1. Building
    4.2. Important Notes About Security3.7.2. Creating the database
    4.2.1. Advantages of SMB Encryption3.7.3. Configuring
    4.2.2. Advantages of non-encrypted passwords3.7.4. Using plaintext passwords or encrypted password
    3.7.5. Getting non-column data from the table
    4.3. The smbpasswd Command3.8. Passdb XML plugin
    3.8.1. Building
    3.8.2. Usage
    lmhosts

    lmhosts

    lmhosts is the Samba is the Samba(7) NetBIOS name to IP address mapping file.

    DESCRIPTION

    This file is part of the SambaThis file is part of the Samba(7) suite.

    FILE FORMAT

    It is an ASCII file containing one line for NetBIOS name. The two fields on each line are separated from each other by white space. Any entry beginning with '#' is ignored. Each line - in the lmhosts file contains the following information :

      An example follows :

      An example follows:

      #
      @@ -118,7 +121,6 @@ CLASS="PROGRAMLISTING"
       192.9.200.20	NTSERVER#20
       192.9.200.21	SAMBASERVER
       	

      Contains three IP to NetBIOS name mappings. The first and third will be returned for any queries for the names "TESTPC" @@ -133,58 +135,57 @@ CLASS="PROGRAMLISTING" CLASS="FILENAME" >lmhosts file - is in the same directory as the - smb.conf(5)>smb.conf(5) file.

      VERSION

      This man page is correct for version 2.2 of - the Samba suite.

      This man page is correct for version 3.0 of the Samba suite.

      SEE ALSO

      smbclient(1) - , smb.conf(5), and smbpasswd(8)smbclient(1), smb.conf(5), and smbpasswd(8)

      AUTHOR

      ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      Hosting a Microsoft Distributed File System tree on Samba

      Chapter 13. Hosting a Microsoft Distributed File System tree on Samba

      Chapter 12. Hosting a Microsoft Distributed File System tree on Samba

      13.1. Instructions

      12.1. Instructions

      The Distributed File System (or Dfs) provides a means of separating the logical view of files and directories that users @@ -226,7 +229,9 @@ CLASS="SECT2" >

      13.1.1. Notes

      12.1.1. Notes

        net

        net

        DESCRIPTION

        This tool is part of the SambaThis tool is part of the Samba(7) suite.

        The samba net utility is meant to work just like the net utility @@ -60,7 +62,7 @@ TARGET="_top" >

        OPTIONS

        -w target-workgroup

        Sets target workgroup or domain. You have to specify either this option or the IP address or the name of a server. +> Sets target workgroup or domain. You have to specify + either this option or the IP address or the name of a server.

        -I ip-address

        IP address of target server to use. You have to specify either this option or a target workgroup or a target server. +> IP address of target server to use. You have to + specify either this option or a target workgroup or a target server.

        -S server

        Name of target server. You should specify either this option or a target workgroup or a target IP address. +> Name of target server. You should specify either + this option or a target workgroup or a target IP address.

        TIME

        SYSTEM

        Displays the time on the remote server in a format ready for /bin/date +> Displays the time on the remote server in a format ready for /bin/date

        Tries to set the date and time of the local server to that on - the remote server using /bin/date. + the remote server using /bin/date.

        RPC

      USER ADD <name> [password] [-F user flags] [misc. options
      USER ADD <name> [password] [-F user flags] [misc. options]

      Add specified user @@ -373,7 +384,7 @@ CLASS="VARIABLELIST" >

      VERSION

      AUTHOR

      + nmbd

      nmbd

      nmbd

      Synopsis

      nmbd [-D] [-F] [-S] [-a] [-i] [-o] [-h] [-V] [-d <debug level>] [-H <lmhosts file>] [-l <log directory>] [-n <primary netbios name>] [-p <port number>] [-s <configuration file>]

      [-D] [-F] [-S] [-a] [-i] [-o] [-h] [-V] [-d <debug level>] [-H <lmhosts file>] [-l <log directory>] [-n <primary netbios name>] [-p <port number>] [-s <configuration file>]

      DESCRIPTION

      This program is part of the Samba suite.

      This program is part of the Samba(7) suite.

      -n option (see OPTIONS below). Thus nmbd to respond on can be set - via parameters in the smb.conf(5)smb.conf(5) configuration file.

      OPTIONS

      nmbd
      also logs to standard - output, as if the -S-S
      parameter had been given.

      .

      -H <filename>
      -H <filename>

      NetBIOS lmhosts file. The lmhosts @@ -242,28 +253,39 @@ CLASS="COMMAND" resolution mechanism name resolve order described in smb.conf(5)name resolve + order - to resolve any NetBIOS name queries needed by the server. Note - that the contents of this file are described in smb.conf(5) to resolve any + NetBIOS name queries needed by the server. Note + that the contents of this file are NOT used by nmbd to answer any name queries. Adding a line to this file affects name NetBIOS resolution - from this host ONLY.

      The default path to this file is compiled into @@ -278,17 +300,14 @@ CLASS="FILENAME" > or /etc/lmhosts. See the - lmhosts(5) - man page for details on the contents of this file.

      /etc/samba/lmhosts
      . See the lmhosts(5) man page for details on the contents of this file.

      -V
      .

      -d <debug level>
      -d <debug level>

      debuglevel is an integer @@ -325,19 +344,23 @@ CLASS="COMMAND" the log level - parameter in the smb.conf(5)log level + parameter in the smb.conf(5) file.

      -l <log directory>
      -l <log directory>

      The -l parameter specifies a directory @@ -357,9 +380,12 @@ CLASS="FILENAME" /var/log/log.nmb. . Beware: If the directory specified does not exist,

      -n <primary NetBIOS name>
      -n <primary NetBIOS name>

      This option allows you to override @@ -377,24 +403,31 @@ CLASS="COMMAND" to setting the NetBIOS name parameter in the - smb.confNetBIOS + name parameter in the smb.conf(5) file. However, a command line setting will take precedence over settings in - smb.confsmb.conf(5).

      -p <UDP port number>
      -p <UDP port number>

      UDP port number is a positive integer value. @@ -407,7 +440,7 @@ CLASS="COMMAND" won't need help!

      -s <configuration file>
      -s <configuration file>

      The default configuration file name @@ -418,13 +451,12 @@ CLASS="FILENAME" this may be changed when Samba is autoconfigured.

      The file specified contains the configuration details - required by the server. See smb.conf(5)smb.conf(5) for more information.

      FILES

      meta-daemon, this file must contain suitable startup information for the meta-daemon. See the UNIX_INSTALL.htmlinstall document for details.

      If running the server as a daemon at startup, this file will need to contain an appropriate startup sequence for the server. See the UNIX_INSTALL.html"How to Install and Test SAMBA" document for details.

      UNIX_INSTALL.html"How to Install and Test SAMBA" document for details.

      This is the default location of the - smb.conf - server configuration file. Other common places that systems +>This is the default location of + the smb.conf(5) server + configuration file. Other common places that systems install this file are /usr/samba/lib/smb.conf and /etc/smb.conf/etc/samba/smb.conf.

      When run as a WINS server (see the wins supportwins support - parameter in the smb.conf(5)smb.conf(5) man page), If nmbd is acting as a is acting as a browse master (see the local masterlocal master - parameter in the smb.conf(5) man page, - smb.conf(5) man page, nmbd @@ -590,7 +635,7 @@ CLASS="FILENAME" >

      SIGNALS

      nmbd
      process it is recommended - that SIGKILL (-9) NOT be used, except as a last resort, as this may leave the name database in an inconsistent state. The correct way to terminate log.nmb
      file.

      The debug log level of nmbd may be raised or lowered using - smbcontrol(1) - (SIGUSR[1|2] signals are no longer used in Samba 2.2). This is - to allow transient problems to be diagnosed, whilst still running +>The debug log level of nmbd may be raised or lowered + using smbcontrol(1) (SIGUSR[1|2] signals + are no longer used since Samba 2.2). This is to allow + transient problems to be diagnosed, whilst still running at a normally low log level.

      VERSION

      SEE ALSO

      inetd(8), smbd(8), - smb.conf(5) - , smbclient(1) - , testparm(1), testprns(1), and the Internet RFC's - inetd(8), smbd(8), smb.conf(5), smbclient(1), testparm(1), testprns(1), and the Internet + RFC's rfc1001.txt,

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      nmblookup

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      OPTIONS

      nmbd(8) - daemon is running on this machine it also binds to this port. + in addition, if the nmbd(8) daemon is running on this machine it also binds to this port.

      parameter of the smb.conf (5) parameter of the smb.conf(5) file.

      EXAMPLES

      nslookup
      is - used to query DNS servers). To query a WINS server, - nmblookup must be called like this:

      + must be called like this:

      VERSION

      SEE ALSO

      nmbd(8), - samba(7), and smb.conf(5) -

      nmbd(8), samba(7), and smb.conf(5).

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      Optional configuration

      Introduction

      Samba has several features that you might want or might not want to use. The chapters in this @@ -91,51 +94,51 @@ CLASS="TOC" >Table of Contents

      10. 9. Integrating MS Windows networks with Samba
      10.1. 9.1. Agenda
      10.2. 9.2. Name Resolution in a pure Unix/Linux world
      10.2.1. 9.2.1. /etc/hosts
      10.2.2. 9.2.2. /etc/resolv.conf
      10.2.3. 9.2.3. /etc/host.conf
      10.2.4. 9.2.4. /etc/nsswitch.conf
      10.3. 9.3. Name resolution as used within MS Windows networking
      10.3.1. 9.3.1. The NetBIOS Name Cache
      10.3.2. 9.3.2. The LMHOSTS file
      10.3.3. 9.3.3. HOSTS file
      10.3.4. 9.3.4. DNS Lookup
      10.3.5. 9.3.5. WINS Lookup
      10.4. 9.4. How browsing functions and how to deploy stable and dependable browsing using Samba
      10.5. 9.5. MS Windows security options and how to configure Samba for seemless integration
      10.5.1. 9.5.1. Use MS Windows NT as an authentication server
      10.5.2. 9.5.2. Make Samba a member of an MS Windows NT security domain
      10.5.3. 9.5.3. Configure Samba as an authentication server
      10.6. 9.6. Conclusions
      11. 10. UNIX Permission Bits and Windows NT Access Control Lists
      11.1. 10.1. Viewing and changing UNIX permissions using the NT security dialogs
      11.2. 10.2. How to view file security on a Samba share
      11.3. 10.3. Viewing file ownership
      11.4. 10.4. Viewing file or directory permissions
      11.4.1. 10.4.1. File Permissions
      11.4.2. 10.4.2. Directory Permissions
      11.5. 10.5. Modifying file or directory permissions
      11.6. 10.6. Interaction with the standard Samba create mask parameters
      11.7. 10.7. Interaction with the standard Samba file attribute mapping
      12. 11. Configuring PAM for distributed but centrally managed authentication
      12.1. 11.1. Samba and PAM
      12.2. 11.2. Distributed Authentication
      12.3. 11.3. PAM Configuration in smb.conf
      13. 12. Hosting a Microsoft Distributed File System tree on Samba
      13.1. 12.1. Instructions
      13.1.1. 12.1.1. Notes
      14. 13. Printing Support
      14.1. 13.1. Introduction
      14.2. 13.2. Configuration
      14.2.1. 13.2.1. Creating [print$]
      14.2.2. 13.2.2. Setting Drivers for Existing Printers
      14.2.3. 13.2.3. Support a large number of printers
      14.2.4. 13.2.4. Adding New Printers via the Windows NT APW
      14.2.5. 13.2.5. Samba and Printer Ports
      14.3. 13.3. The Imprints Toolset
      14.3.1. 13.3.1. What is Imprints?
      14.3.2. 13.3.2. Creating Printer Driver Packages
      14.3.3. 13.3.3. The Imprints server
      14.3.4. 13.3.4. The Installation Client
      14.4. 13.4. Diagnosis
      14.4.1. 13.4.1. Introduction
      14.4.2. 13.4.2. Debugging printer problems
      14.4.3. 13.4.3. What printers do I have?
      14.4.4. 13.4.4. Setting up printcap and print servers
      14.4.5. 13.4.5. Job sent, no output
      14.4.6. 13.4.6. Job sent, strange output
      14.4.7. 13.4.7. Raw PostScript printed
      14.4.8. 13.4.8. Advanced Printing
      14.4.9. 13.4.9. Real debugging
      15. 14. Unified Logons between Windows NT and UNIX using Winbind
      15.1. 14.1. Abstract
      15.2. 14.2. Introduction
      15.3. 14.3. What Winbind Provides
      15.3.1. 14.3.1. Target Uses
      15.4. 14.4. How Winbind Works
      15.4.1. 14.4.1. Microsoft Remote Procedure Calls
      15.4.2. 14.4.2. Microsoft Active Directory Services
      14.4.3. Name Service Switch
      15.4.3. 14.4.4. Pluggable Authentication Modules
      15.4.4. 14.4.5. User and Group ID Allocation
      15.4.5. 14.4.6. Result Caching
      15.5. 14.5. Installation and Configuration
      15.5.1. 14.5.1. Introduction
      15.5.2. 14.5.2. Requirements
      15.5.3. 14.5.3. Testing Things Out
      15.6. 14.6. Limitations
      15.7. 14.7. Conclusion
      16. Passdb MySQL plugin15. Improved browsing in samba
      16.1. Building15.1. Overview of browsing
      16.2. Configuring15.2. Browsing support in samba
      16.3. Using plaintext passwords or encrypted password15.3. Problem resolution
      16.4. Getting non-column data from the table15.4. Browsing across subnets
      15.4.1. How does cross subnet browsing work ?
      17. Passdb XML plugin15.5. Setting up a WINS server
      17.1. Building15.6. Setting up Browsing in a WORKGROUP
      17.2. Usage15.7. Setting up Browsing in a DOMAIN
      15.8. Forcing samba to be the master
      15.9. Making samba the domain master
      15.10. Note about broadcast addresses
      15.11. Multiple interfaces
      18. 16. Stackable VFS modules
      18.1. 16.1. Introduction and configuration
      18.2. 16.2. Included modules
      18.2.1. 16.2.1. audit
      18.2.2. 16.2.2. recycle
      18.2.3. 16.2.3. netatalk
      18.3. 16.3. VFS modules available elsewhere
      18.3.1. 16.3.1. DatabaseFS
      18.3.2. 16.3.2. vscan
      19. Storing Samba's User/Machine Account information in an LDAP Directory
      19.1. Purpose
      19.2. Introduction
      19.3. Supported LDAP Servers
      19.4. Schema and Relationship to the RFC 2307 posixAccount
      19.5. Configuring Samba with LDAP
      19.5.1. OpenLDAP configuration
      19.5.2. Configuring Samba
      19.6. Accounts and Groups management
      19.7. Security and sambaAccount
      19.8. LDAP specials attributes for sambaAccounts
      19.9. Example LDIF Entries for a sambaAccount
      19.10. Comments
      20. 17. HOWTO Access Samba source code via CVSAccess Samba source code via CVS
      20.1. 17.1. Introduction
      20.2. 17.2. CVS Access to samba.org
      20.2.1. 17.2.1. Access via CVSweb
      20.2.2. 17.2.2. Access via cvs
      21. 18. Group mapping HOWTO
      22. 19. Samba performance issues
      22.1. 19.1. Comparisons
      22.2. 19.2. Socket options
      22.3. 19.3. Read size
      22.4. 19.4. Max xmit
      22.5. 19.5. Log level
      22.6. 19.6. Read raw
      22.7. 19.7. Write raw
      22.8. 19.8. Slow Clients
      22.9. 19.9. Slow Logins
      22.10. 19.10. Client tuning
      20. Creating Group Profiles
      20.1. Windows '9x
      20.2. Windows NT 4
      20.2.1. Side bar Notes
      20.2.2. Mandatory profiles
      20.2.3. moveuser.exe
      20.2.4. Get SID
      20.3. Windows 2000/XP
      Samba as a NT4 domain memberSamba as a NT4 or Win2k domain memberSamba and other CIFS clients

      Chapter 24. Samba and other CIFS clients

      Chapter 22. Samba and other CIFS clients

      This chapter contains client-specific information.

      24.1. Macintosh clients?

      22.1. Macintosh clients?

      Yes.

      24.2. OS2 Client

      22.2. OS2 Client

      24.2.1. How can I configure OS/2 Warp Connect or +NAME="AEN3322" +>22.2.1. How can I configure OS/2 Warp Connect or OS/2 Warp 4 as a client for Samba?

      A more complete answer to this question can be @@ -188,7 +195,9 @@ CLASS="SECT2" >

      24.2.2. How can I configure OS/2 Warp 3 (not Connect), +NAME="AEN3337" +>22.2.2. How can I configure OS/2 Warp 3 (not Connect), OS/2 1.2, 1.3 or 2.x for Samba?

      You can use the free Microsoft LAN Manager 2.2c Client @@ -230,7 +239,9 @@ CLASS="SECT2" >

      24.2.3. Are there any other issues when OS/2 (any version) +NAME="AEN3346" +>22.2.3. Are there any other issues when OS/2 (any version) is used as a client?

      When you do a NET VIEW or use the "File and Print @@ -250,7 +261,9 @@ CLASS="SECT2" >

      24.2.4. How do I get printer driver download working +NAME="AEN3350" +>22.2.4. How do I get printer driver download working for OS/2 clients?

      First, create a share called [PRINTDRV] that is @@ -299,13 +312,17 @@ CLASS="SECT1" >

      24.3. Windows for Workgroups

      22.3. Windows for Workgroups

      24.3.1. Use latest TCP/IP stack from Microsoft

      22.3.1. Use latest TCP/IP stack from Microsoft

      Use the latest TCP/IP stack from microsoft if you use Windows for workgroups.

      24.3.2. Delete .pwl files after password change

      22.3.2. Delete .pwl files after password change

      WfWg does a lousy job with passwords. I find that if I change my password on either the unix box or the PC the safest thing to do is to @@ -343,7 +362,9 @@ CLASS="SECT2" >

      24.3.3. Configure WfW password handling

      22.3.3. Configure WfW password handling

      There is a program call admincfg.exe on the last disk (disk 8) of the WFW 3.11 disk set. To install it @@ -360,7 +381,9 @@ CLASS="SECT2" >

      24.3.4. Case handling of passwords

      22.3.4. Case handling of passwords

      Windows for Workgroups uppercases the password before sending it to the server. Unix passwords can be case-sensitive though. Check the

      24.4. Windows '95/'98

      22.4. Windows '95/'98

      When using Windows 95 OEM SR2 the following updates are recommended where Samba is being used. Please NOTE that the above change will affect you once these @@ -423,7 +448,9 @@ CLASS="SECT1" >

      24.5. Windows 2000 Service Pack 2

      22.5. Windows 2000 Service Pack 2

      There are several annoyances with Windows 2000 SP2. One of which diff --git a/docs/htmldocs/pam.html b/docs/htmldocs/pam.html index ba2bf6c922..a64de2a1b4 100644 --- a/docs/htmldocs/pam.html +++ b/docs/htmldocs/pam.html @@ -6,8 +6,7 @@ managed authentication

      Chapter 12. Configuring PAM for distributed but centrally +NAME="PAM" +>Chapter 11. Configuring PAM for distributed but centrally managed authentication

      12.1. Samba and PAM

      11.1. Samba and PAM

      A number of Unix systems (eg: Sun Solaris), as well as the xxxxBSD family and Linux, now utilize the Pluggable Authentication @@ -293,7 +296,9 @@ CLASS="SECT1" >

      12.2. Distributed Authentication

      11.2. Distributed Authentication

      The astute administrator will realize from this that the combination of

      12.3. PAM Configuration in smb.conf

      11.3. PAM Configuration in smb.conf

      There is an option in smb.conf called +User information database

      SAMBA Project Documentation
      PrevNext

      Chapter 3. User information database

      3.1. Introduction

      Old windows clients send plain text passwords over the wire. + Samba can check these passwords by crypting them and comparing them + to the hash stored in the unix user database. +

      Newer windows clients send encrypted passwords (so-called + Lanman and NT hashes) over + the wire, instead of plain text passwords. The newest clients + will only send encrypted passwords and refuse to send plain text + passwords, unless their registry is tweaked. +

      These passwords can't be converted to unix style encrypted + passwords. Because of that you can't use the standard unix + user database, and you have to store the Lanman and NT hashes + somewhere else.

      Next to a differently encrypted passwords, + windows also stores certain data for each user + that is not stored in a unix user database, e.g. + workstations the user may logon from, the location where his/her + profile is stored, etc. + Samba retrieves and stores this information using a "passdb backend". + Commonly + available backends are LDAP, plain text file, MySQL and nisplus. + For more information, see the documentation about the + passdb backend = parameter. +

      3.2. Important Notes About Security

      The unix and SMB password encryption techniques seem similar + on the surface. This similarity is, however, only skin deep. The unix + scheme typically sends clear text passwords over the network when + logging in. This is bad. The SMB encryption scheme never sends the + cleartext password over the network but it does store the 16 byte + hashed values on disk. This is also bad. Why? Because the 16 byte hashed + values are a "password equivalent". You cannot derive the user's + password from them, but they could potentially be used in a modified + client to gain access to a server. This would require considerable + technical knowledge on behalf of the attacker but is perfectly possible. + You should thus treat the data stored in whatever + passdb backend you use (smbpasswd file, ldap, mysql) as though it contained the + cleartext passwords of all your users. Its contents must be kept + secret, and the file should be protected accordingly.

      Ideally we would like a password scheme which neither requires + plain text passwords on the net or on disk. Unfortunately this + is not available as Samba is stuck with being compatible with + other SMB systems (WinNT, WfWg, Win95 etc).

      Note that Windows NT 4.0 Service pack 3 changed the + default for permissible authentication so that plaintext + passwords are never sent over the wire. + The solution to this is either to switch to encrypted passwords + with Samba or edit the Windows NT registry to re-enable plaintext + passwords. See the document WinNT.txt for details on how to do + this.

      Other Microsoft operating systems which also exhibit + this behavior includes

      MS DOS Network client 3.0 with + the basic network redirector installed
      Windows 95 with the network redirector + update installed
      Windows 98 [se]
      Windows 2000

      Note :All current release of + Microsoft SMB/CIFS clients support authentication via the + SMB Challenge/Response mechanism described here. Enabling + clear text authentication does not disable the ability + of the client to participate in encrypted authentication.

      3.2.1. Advantages of SMB Encryption

      plain text passwords are not passed across + the network. Someone using a network sniffer cannot just + record passwords going to the SMB server.
      WinNT doesn't like talking to a server + that isn't using SMB encrypted passwords. It will refuse + to browse the server if the server is also in user level + security mode. It will insist on prompting the user for the + password on each connection, which is very annoying. The + only things you can do to stop this is to use SMB encryption. +

      3.2.2. Advantages of non-encrypted passwords

      plain text passwords are not kept + on disk.
      uses same password file as other unix + services such as login and ftp
      you are probably already using other + services (such as telnet and ftp) which send plain text + passwords over the net, so sending them for SMB isn't + such a big deal.

      3.3. The smbpasswd Command

      The smbpasswd utility is a utility similar to the + passwd or yppasswd programs. + It maintains the two 32 byte password fields + in the passdb backend.

      smbpasswd works in a client-server mode + where it contacts the local smbd to change the user's password on its + behalf. This has enormous benefits - as follows.

      smbpasswd has the capability + to change passwords on Windows NT servers (this only works when + the request is sent to the NT Primary Domain Controller if you + are changing an NT Domain user's password).

      To run smbpasswd as a normal user just type :

      $ smbpasswd

      Old SMB password: <type old value here - + or hit return if there was no old password>

      New SMB Password: <type new value> +

      Repeat New SMB Password: <re-type new value +

      If the old value does not match the current value stored for + that user, or the two new values do not match each other, then the + password will not be changed.

      If invoked by an ordinary user it will only allow the user + to change his or her own Samba password.

      If run by the root user smbpasswd may take an optional + argument, specifying the user name whose SMB password you wish to + change. Note that when run as root smbpasswd does not prompt for + or check the old password value, thus allowing root to set passwords + for users who have forgotten their passwords.

      smbpasswd is designed to work in the same way + and be familiar to UNIX users who use the passwd or + yppasswd commands.

      For more details on using smbpasswd refer + to the man page which will always be the definitive reference.

      3.4. Plain text

      Older versions of samba retrieved user information from the unix user database +and eventually some other fields from the file /etc/samba/smbpasswd +or /etc/smbpasswd. When password encryption is disabled, no +data is stored at all.

      3.5. TDB

      Samba can also store the user data in a "TDB" (Trivial Database). Using this backend +doesn't require any additional configuration. This backend is recommended for new installations who +don't require LDAP.

      3.6. LDAP

      3.6.1. Introduction

      This document describes how to use an LDAP directory for storing Samba user +account information traditionally stored in the smbpasswd(5) file. It is +assumed that the reader already has a basic understanding of LDAP concepts +and has a working directory server already installed. For more information +on LDAP architectures and Directories, please refer to the following sites.

      Note that O'Reilly Publishing is working on +a guide to LDAP for System Administrators which has a planned release date of +early summer, 2002.

      Two additional Samba resources which may prove to be helpful are

      • The Samba-PDC-LDAP-HOWTO + maintained by Ignacio Coupeau.

      • The NT migration scripts from IDEALX that are + geared to manage users and group in such a Samba-LDAP Domain Controller configuration. +

      3.6.2. Introduction

      Traditionally, when configuring "encrypt +passwords = yes" in Samba's smb.conf file, user account +information such as username, LM/NT password hashes, password change times, and account +flags have been stored in the smbpasswd(5) file. There are several +disadvantages to this approach for sites with very large numbers of users (counted +in the thousands).

      • The first is that all lookups must be performed sequentially. Given that +there are approximately two lookups per domain logon (one for a normal +session connection such as when mapping a network drive or printer), this +is a performance bottleneck for lareg sites. What is needed is an indexed approach +such as is used in databases.

      • The second problem is that administrators who desired to replicate a +smbpasswd file to more than one Samba server were left to use external +tools such as rsync(1) and ssh(1) +and wrote custom, in-house scripts.

      • And finally, the amount of information which is stored in an +smbpasswd entry leaves no room for additional attributes such as +a home directory, password expiration time, or even a Relative +Identified (RID).

      As a result of these defeciencies, a more robust means of storing user attributes +used by smbd was developed. The API which defines access to user accounts +is commonly referred to as the samdb interface (previously this was called the passdb +API, and is still so named in the CVS trees). In Samba 2.2.3, enabling support +for a samdb backend (e.g. --with-ldapsam or +--with-tdbsam) requires compile time support.

      When compiling Samba to include the --with-ldapsam autoconf +option, smbd (and associated tools) will store and lookup user accounts in +an LDAP directory. In reality, this is very easy to understand. If you are +comfortable with using an smbpasswd file, simply replace "smbpasswd" with +"LDAP directory" in all the documentation.

      There are a few points to stress about what the --with-ldapsam +does not provide. The LDAP support referred to in the this documentation does not +include:

      • A means of retrieving user account information from + an Windows 2000 Active Directory server.

      • A means of replacing /etc/passwd.

      The second item can be accomplished by using LDAP NSS and PAM modules. LGPL +versions of these libraries can be obtained from PADL Software +(http://www.padl.com/). However, +the details of configuring these packages are beyond the scope of this document.

      3.6.3. Supported LDAP Servers

      The LDAP samdb code in 2.2.3 has been developed and tested using the OpenLDAP +2.0 server and client libraries. The same code should be able to work with +Netscape's Directory Server and client SDK. However, due to lack of testing +so far, there are bound to be compile errors and bugs. These should not be +hard to fix. If you are so inclined, please be sure to forward all patches to +samba-patches@samba.org and +jerry@samba.org.

      3.6.4. Schema and Relationship to the RFC 2307 posixAccount

      Samba 3.0 includes the necessary schema file for OpenLDAP 2.0 in +examples/LDAP/samba.schema. The sambaAccount objectclass is given here:

      objectclass ( 1.3.1.5.1.4.1.7165.2.2.2 NAME 'sambaAccount' SUP top STRUCTURAL
      +     DESC 'Samba Account'
      +     MUST ( uid $ rid )
      +     MAY  ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $
      +            logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $
      +            displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $
      +            description $ userWorkstations $ primaryGroupID $ domain ))

      The samba.schema file has been formatted for OpenLDAP 2.0. The OID's are +owned by the Samba Team and as such is legal to be openly published. +If you translate the schema to be used with Netscape DS, please +submit the modified schema file as a patch to jerry@samba.org

      Just as the smbpasswd file is mean to store information which supplements a +user's /etc/passwd entry, so is the sambaAccount object +meant to supplement the UNIX user account information. A sambaAccount is a +STRUCTURAL objectclass so it can be stored individually +in the directory. However, there are several fields (e.g. uid) which overlap +with the posixAccount objectclass outlined in RFC2307. This is by design.

      In order to store all user account information (UNIX and Samba) in the directory, +it is necessary to use the sambaAccount and posixAccount objectclasses in +combination. However, smbd will still obtain the user's UNIX account +information via the standard C library calls (e.g. getpwnam(), et. al.). +This means that the Samba server must also have the LDAP NSS library installed +and functioning correctly. This division of information makes it possible to +store all Samba account information in LDAP, but still maintain UNIX account +information in NIS while the network is transitioning to a full LDAP infrastructure.

      3.6.5. Configuring Samba with LDAP

      3.6.5.1. OpenLDAP configuration

      To include support for the sambaAccount object in an OpenLDAP directory +server, first copy the samba.schema file to slapd's configuration directory.

      root# cp samba.schema /etc/openldap/schema/

      Next, include the samba.schema file in slapd.conf. +The sambaAccount object contains two attributes which depend upon other schema +files. The 'uid' attribute is defined in cosine.schema and +the 'displayName' attribute is defined in the inetorgperson.schema +file. Both of these must be included before the samba.schema file.

      ## /etc/openldap/slapd.conf
      +
      +## schema files (core.schema is required by default)
      +include	           /etc/openldap/schema/core.schema
      +
      +## needed for sambaAccount
      +include            /etc/openldap/schema/cosine.schema
      +include            /etc/openldap/schema/inetorgperson.schema
      +include            /etc/openldap/schema/samba.schema
      +
      +## uncomment this line if you want to support the RFC2307 (NIS) schema
      +## include         /etc/openldap/schema/nis.schema
      +
      +....

      It is recommended that you maintain some indices on some of the most usefull attributes, +like in the following example, to speed up searches made on sambaAccount objectclasses +(and possibly posixAccount and posixGroup as well).

      # Indices to maintain
      +## required by OpenLDAP 2.0
      +index objectclass   eq
      +
      +## support pb_getsampwnam()
      +index uid           pres,eq
      +## support pdb_getsambapwrid()
      +index rid           eq
      +
      +## uncomment these if you are storing posixAccount and
      +## posixGroup entries in the directory as well
      +##index uidNumber     eq
      +##index gidNumber     eq
      +##index cn            eq
      +##index memberUid     eq

      3.6.5.2. Configuring Samba

      The following parameters are available in smb.conf only with --with-ldapsam +was included with compiling Samba.

      These are described in the smb.conf(5) man +page and so will not be repeated here. However, a sample smb.conf file for +use with an LDAP directory could appear as

      ## /usr/local/samba/lib/smb.conf
      +[global]
      +     security = user
      +     encrypt passwords = yes
      +
      +     netbios name = TASHTEGO
      +     workgroup = NARNIA
      +
      +     # ldap related parameters
      +
      +     # define the DN to use when binding to the directory servers
      +     # The password for this DN is not stored in smb.conf.  Rather it
      +     # must be set by using 'smbpasswd -w secretpw' to store the
      +     # passphrase in the secrets.tdb file.  If the "ldap admin dn" values
      +     # changes, this password will need to be reset.
      +     ldap admin dn = "cn=Samba Manager,ou=people,dc=samba,dc=org"
      +
      +     #  specify the LDAP server's hostname (defaults to locahost)
      +     ldap server = ahab.samba.org
      +
      +     # Define the SSL option when connecting to the directory
      +     # ('off', 'start tls', or 'on' (default))
      +     ldap ssl = start tls
      +
      +     # define the port to use in the LDAP session (defaults to 636 when
      +     # "ldap ssl = on")
      +     ldap port = 389
      +
      +     # specify the base DN to use when searching the directory
      +     ldap suffix = "ou=people,dc=samba,dc=org"
      +
      +     # generally the default ldap search filter is ok
      +     # ldap filter = "(&(uid=%u)(objectclass=sambaAccount))"

      3.6.6. Accounts and Groups management

      As users accounts are managed thru the sambaAccount objectclass, you should +modify you existing administration tools to deal with sambaAccount attributes.

      Machines accounts are managed with the sambaAccount objectclass, just +like users accounts. However, it's up to you to stored thoses accounts +in a different tree of you LDAP namespace: you should use +"ou=Groups,dc=plainjoe,dc=org" to store groups and +"ou=People,dc=plainjoe,dc=org" to store users. Just configure your +NSS and PAM accordingly (usually, in the /etc/ldap.conf configuration +file).

      In Samba release 3.0, the group management system is based on posix +groups. This means that Samba make usage of the posixGroup objectclass. +For now, there is no NT-like group system management (global and local +groups).

      3.6.7. Security and sambaAccount

      There are two important points to remember when discussing the security +of sambaAccount entries in the directory.

      • Never retrieve the lmPassword or + ntPassword attribute values over an unencrypted LDAP session.

      • Never allow non-admin users to + view the lmPassword or ntPassword attribute values.

      These password hashes are clear text equivalents and can be used to impersonate +the user without deriving the original clear text strings. For more information +on the details of LM/NT password hashes, refer to the ENCRYPTION chapter of the Samba-HOWTO-Collection.

      To remedy the first security issue, the "ldap ssl" smb.conf parameter defaults +to require an encrypted session (ldap ssl = on) using +the default port of 636 +when contacting the directory server. When using an OpenLDAP 2.0 server, it +is possible to use the use the StartTLS LDAP extended operation in the place of +LDAPS. In either case, you are strongly discouraged to disable this security +(ldap ssl = off).

      Note that the LDAPS protocol is deprecated in favor of the LDAPv3 StartTLS +extended operation. However, the OpenLDAP library still provides support for +the older method of securing communication between clients and servers.

      The second security precaution is to prevent non-administrative users from +harvesting password hashes from the directory. This can be done using the +following ACL in slapd.conf:

      ## allow the "ldap admin dn" access, but deny everyone else
      +access to attrs=lmPassword,ntPassword
      +     by dn="cn=Samba Admin,ou=people,dc=plainjoe,dc=org" write
      +     by * none

      3.6.8. LDAP specials attributes for sambaAccounts

      The sambaAccount objectclass is composed of the following attributes:

      • lmPassword: the LANMAN password 16-byte hash stored as a character + representation of a hexidecimal string.

      • ntPassword: the NT password hash 16-byte stored as a character + representation of a hexidecimal string.

      • pwdLastSet: The integer time in seconds since 1970 when the + lmPassword and ntPassword attributes were last set. +

      • acctFlags: string of 11 characters surrounded by square brackets [] + representing account flags such as U (user), W(workstation), X(no password expiration), and + D(disabled).

      • logonTime: Integer value currently unused

      • logoffTime: Integer value currently unused

      • kickoffTime: Integer value currently unused

      • pwdCanChange: Integer value currently unused

      • pwdMustChange: Integer value currently unused

      • homeDrive: specifies the drive letter to which to map the + UNC path specified by homeDirectory. The drive letter must be specified in the form "X:" + where X is the letter of the drive to map. Refer to the "logon drive" parameter in the + smb.conf(5) man page for more information.

      • scriptPath: The scriptPath property specifies the path of + the user's logon script, .CMD, .EXE, or .BAT file. The string can be null. The path + is relative to the netlogon share. Refer to the "logon script" parameter in the + smb.conf(5) man page for more information.

      • profilePath: specifies a path to the user's profile. + This value can be a null string, a local absolute path, or a UNC path. Refer to the + "logon path" parameter in the smb.conf(5) man page for more information.

      • smbHome: The homeDirectory property specifies the path of + the home directory for the user. The string can be null. If homeDrive is set and specifies + a drive letter, homeDirectory should be a UNC path. The path must be a network + UNC path of the form \\server\share\directory. This value can be a null string. + Refer to the "logon home" parameter in the smb.conf(5) man page for more information. +

      • userWorkstation: character string value currently unused. +

      • rid: the integer representation of the user's relative identifier + (RID).

      • primaryGroupID: the relative identifier (RID) of the primary group + of the user.

      The majority of these parameters are only used when Samba is acting as a PDC of +a domain (refer to the Samba-PDC-HOWTO for details on +how to configure Samba as a Primary Domain Controller). The following four attributes +are only stored with the sambaAccount entry if the values are non-default values:

      • smbHome

      • scriptPath

      • logonPath

      • homeDrive

      These attributes are only stored with the sambaAccount entry if +the values are non-default values. For example, assume TASHTEGO has now been +configured as a PDC and that logon home = \\%L\%u was defined in +its smb.conf file. When a user named "becky" logons to the domain, +the logon home string is expanded to \\TASHTEGO\becky. +If the smbHome attribute exists in the entry "uid=becky,ou=people,dc=samba,dc=org", +this value is used. However, if this attribute does not exist, then the value +of the logon home parameter is used in its place. Samba +will only write the attribute value to the directory entry is the value is +something other than the default (e.g. \\MOBY\becky).

      3.6.9. Example LDIF Entries for a sambaAccount

      The following is a working LDIF with the inclusion of the posixAccount objectclass:

      dn: uid=guest2, ou=people,dc=plainjoe,dc=org
      +ntPassword: 878D8014606CDA29677A44EFA1353FC7
      +pwdMustChange: 2147483647
      +primaryGroupID: 1201
      +lmPassword: 552902031BEDE9EFAAD3B435B51404EE
      +pwdLastSet: 1010179124
      +logonTime: 0
      +objectClass: sambaAccount
      +uid: guest2
      +kickoffTime: 2147483647
      +acctFlags: [UX         ]
      +logoffTime: 2147483647
      +rid: 19006
      +pwdCanChange: 0

      The following is an LDIF entry for using both the sambaAccount and +posixAccount objectclasses:

      dn: uid=gcarter, ou=people,dc=plainjoe,dc=org
      +logonTime: 0
      +displayName: Gerald Carter
      +lmPassword: 552902031BEDE9EFAAD3B435B51404EE
      +primaryGroupID: 1201
      +objectClass: posixAccount
      +objectClass: sambaAccount
      +acctFlags: [UX         ]
      +userPassword: {crypt}BpM2ej8Rkzogo
      +uid: gcarter
      +uidNumber: 9000
      +cn: Gerald Carter
      +loginShell: /bin/bash
      +logoffTime: 2147483647
      +gidNumber: 100
      +kickoffTime: 2147483647
      +pwdLastSet: 1010179230
      +rid: 19000
      +homeDirectory: /home/tashtego/gcarter
      +pwdCanChange: 0
      +pwdMustChange: 2147483647
      +ntPassword: 878D8014606CDA29677A44EFA1353FC7

      3.7. MySQL

      3.7.1. Building

      To build the plugin, run make bin/pdb_mysql.so +in the source/ directory of samba distribution.

      Next, copy pdb_mysql.so to any location you want. I +strongly recommend installing it in $PREFIX/lib or /usr/lib/samba/

      3.7.2. Creating the database

      You either can set up your own table and specify the field names to pdb_mysql (see below +for the column names) or use the default table. The file examples/pdb/mysql/mysql.dump +contains the correct queries to create the required tables. Use the command : + +mysql -uusername -hhostname -ppassword databasename < /path/to/samba/examples/pdb/mysql/mysql.dump

      3.7.3. Configuring

      This plugin lacks some good documentation, but here is some short info:

      Add a the following to the passdb backend variable in your smb.conf: +

      passdb backend = [other-plugins] plugin:/location/to/pdb_mysql.so:identifier [other-plugins]

      The identifier can be any string you like, as long as it doesn't collide with +the identifiers of other plugins or other instances of pdb_mysql. If you +specify multiple pdb_mysql.so entries in 'passdb backend', you also need to +use different identifiers!

      Additional options can be given thru the smb.conf file in the [global] section.

      identifier:mysql host                     - host name, defaults to 'localhost'
      +identifier:mysql password
      +identifier:mysql user                     - defaults to 'samba'
      +identifier:mysql database                 - defaults to 'samba'
      +identifier:mysql port                     - defaults to 3306
      +identifier:table                          - Name of the table containing users

      Since the password for the mysql user is stored in the +smb.conf file, you should make the the smb.conf file +readable only to the user that runs samba. This is considered a security +bug and will be fixed soon.

      Names of the columns in this table(I've added column types those columns should have first):

      identifier:logon time column             - int(9)
      +identifier:logoff time column            - int(9)
      +identifier:kickoff time column           - int(9)
      +identifier:pass last set time column     - int(9)
      +identifier:pass can change time column   - int(9)
      +identifier:pass must change time column  - int(9)
      +identifier:username column               - varchar(255) - unix username
      +identifier:domain column                 - varchar(255) - NT domain user is part of
      +identifier:nt username column            - varchar(255) - NT username
      +identifier:fullname column            - varchar(255) - Full name of user
      +identifier:home dir column               - varchar(255) - Unix homedir path
      +identifier:dir drive column              - varchar(2) - Directory drive path (eg: 'H:')
      +identifier:logon script column           - varchar(255) - Batch file to run on client side when logging on
      +identifier:profile path column           - varchar(255) - Path of profile
      +identifier:acct desc column              - varchar(255) - Some ASCII NT user data
      +identifier:workstations column           - varchar(255) - Workstations user can logon to (or NULL for all)
      +identifier:unknown string column         - varchar(255) - unknown string
      +identifier:munged dial column            - varchar(255) - ?
      +identifier:uid column                    - int(9) - Unix user ID (uid)
      +identifier:gid column                    - int(9) - Unix user group (gid)
      +identifier:user sid column               - varchar(255) - NT user SID
      +identifier:group sid column              - varchar(255) - NT group ID
      +identifier:lanman pass column            - varchar(255) - encrypted lanman password
      +identifier:nt pass column                - varchar(255) - encrypted nt passwd
      +identifier:plain pass column             - varchar(255) - plaintext password
      +identifier:acct control column           - int(9) - nt user data
      +identifier:unknown 3 column              - int(9) - unknown
      +identifier:logon divs column             - int(9) - ?
      +identifier:hours len column              - int(9) - ?
      +identifier:unknown 5 column              - int(9) - unknown
      +identifier:unknown 6 column              - int(9) - unknown

      Eventually, you can put a colon (:) after the name of each column, which +should specify the column to update when updating the table. You can also +specify nothing behind the colon - then the data from the field will not be +updated.

      3.7.4. Using plaintext passwords or encrypted password

      I strongly discourage the use of plaintext passwords, however, you can use them:

      If you would like to use plaintext passwords, set 'identifier:lanman pass column' and 'identifier:nt pass column' to 'NULL' (without the quotes) and 'identifier:plain pass column' to the name of the column containing the plaintext passwords.

      If you use encrypted passwords, set the 'identifier:plain pass column' to 'NULL' (without the quotes). This is the default.

      3.7.5. Getting non-column data from the table

      It is possible to have not all data in the database and making some 'constant'.

      For example, you can set 'identifier:fullname column' to : +CONCAT(First_name,' ',Sur_name)

      Or, set 'identifier:workstations column' to : +NULL

      See the MySQL documentation for more language constructs.

      3.8. Passdb XML plugin

      3.8.1. Building

      This module requires libxml2 to be installed.

      To build pdb_xml, run: make bin/pdb_xml.so in +the directory source/.

      3.8.2. Usage

      The usage of pdb_xml is pretty straightforward. To export data, use: + +pdbedit -e plugin:/usr/lib/samba/pdb_xml.so:filename + +(where filename is the name of the file to put the data in)

      To import data, use: +pdbedit -i plugin:/usr/lib/samba/pdb_xml.so:filename -e current-pdb + +Where filename is the name to read the data from and current-pdb to put it in.


      PrevHomeNext
      Quick Cross Subnet Browsing / Cross Workgroup Browsing guideUpType of installation
      \ No newline at end of file diff --git a/docs/htmldocs/pdb-mysql.html b/docs/htmldocs/pdb-mysql.html index abca946f6f..e98d0c30d0 100644 --- a/docs/htmldocs/pdb-mysql.html +++ b/docs/htmldocs/pdb-mysql.html @@ -5,8 +5,7 @@ >Passdb MySQL plugin

      Chapter 16. Passdb MySQL plugin

      Chapter 16. Passdb MySQL plugin

      16.1. Building

      16.1. Building

      To build the plugin, run

      16.2. Configuring

      16.2. Creating the database

      You either can set up your own table and specify the field names to pdb_mysql (see below +for the column names) or use the default table. The file examples/pdb/mysql/mysql.dump +contains the correct queries to create the required tables. Use the command : + +mysql -uusername -hhostname -ppassword databasename < /path/to/samba/examples/pdb/mysql/mysql.dump

      16.3. Configuring

      This plugin lacks some good documentation, but here is some short info:

      16.3. Using plaintext passwords or encrypted password

      16.4. Using plaintext passwords or encrypted password

      I strongly discourage the use of plaintext passwords, however, you can use them:

      16.4. Getting non-column data from the table

      16.5. Getting non-column data from the table

      It is possible to have not all data in the database and making some 'constant'.

      Passdb XML plugin

      Chapter 17. Passdb XML plugin

      Chapter 17. Passdb XML plugin

      17.1. Building

      17.1. Building

      This module requires libxml2 to be installed.

      17.2. Usage

      17.2. Usage

      The usage of pdb_xml is pretty straightforward. To export data, use: diff --git a/docs/htmldocs/pdbedit.8.html b/docs/htmldocs/pdbedit.8.html index e3cf1e4fba..14497f522c 100644 --- a/docs/htmldocs/pdbedit.8.html +++ b/docs/htmldocs/pdbedit.8.html @@ -1,12 +1,11 @@ - + pdbedit

      pdbedit

      pdbedit

      Synopsis

      pdbedit [-l] [-v] [-w] [-u username] [-f fullname] [-h homedir] [-D drive] [-S script] [-p profile] [-a] [-m] [-x] [-i passdb-backend] [-e passdb-backend] [-b passdb-backend] [-d debuglevel] [-s configfile] [-P account-policy] [-V value]

      [-l] [-v] [-w] [-u username] [-f fullname] [-h homedir] [-D drive] [-S script] [-p profile] [-a] [-m] [-x] [-i passdb-backend] [-e passdb-backend] [-b passdb-backend] [-d debuglevel] [-s configfile] [-P account-policy] [-V value]

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      The pdbedit program is used to manage the users accounts @@ -65,7 +70,7 @@ TARGET="_top" >

      OPTIONS

      pdbedit -l

      		sorce:500:Simo Sorce
      -		samba:45:Test User
      -		
      sorce:500:Simo Sorce +samba:45:Test User

      pdbedit -l -v

      		---------------
      -		username:       sorce
      -		user ID/Group:  500/500
      -		user RID/GRID:  2000/2001
      -		Full Name:      Simo Sorce
      -		Home Directory: \\BERSERKER\sorce
      -		HomeDir Drive:  H:
      -		Logon Script:   \\BERSERKER\netlogon\sorce.bat
      -		Profile Path:   \\BERSERKER\profile
      -		---------------
      -		username:       samba
      -		user ID/Group:  45/45
      -		user RID/GRID:  1090/1091
      -		Full Name:      Test User
      -		Home Directory: \\BERSERKER\samba
      -		HomeDir Drive:  
      -		Logon Script:   
      -		Profile Path:   \\BERSERKER\profile
      -		
      --------------- +username: sorce +user ID/Group: 500/500 +user RID/GRID: 2000/2001 +Full Name: Simo Sorce +Home Directory: \\BERSERKER\sorce +HomeDir Drive: H: +Logon Script: \\BERSERKER\netlogon\sorce.bat +Profile Path: \\BERSERKER\profile +--------------- +username: samba +user ID/Group: 45/45 +user RID/GRID: 1090/1091 +Full Name: Test User +Home Directory: \\BERSERKER\samba +HomeDir Drive: +Logon Script: +Profile Path: \\BERSERKER\profile

      smbpasswd file format. (see the smbpasswd(5) file format. (see the + smbpasswd(5) for details)

      Example: pdbedit -l -w

      		sorce:500:508818B733CE64BEAAD3B435B51404EE:D2A2418EFC466A8A0F6B1DBB5C3DB80C:[UX         ]:LCT-00000000:
      -		samba:45:0F2B255F7B67A7A9AAD3B435B51404EE:BC281CE3F53B6A5146629CD4751D3490:[UX         ]:LCT-3BFA1E8D:
      -		

      sorce:500:508818B733CE64BEAAD3B435B51404EE:D2A2418EFC466A8A0F6B1DBB5C3DB80C:[UX ]:LCT-00000000: +samba:45:0F2B255F7B67A7A9AAD3B435B51404EE:BC281CE3F53B6A5146629CD4751D3490:[UX ]:LCT-3BFA1E8D:
      -u username

      This option specifies the username to be used for the operation requested (listing, adding, removing). - It is required in add, remove and modify - operations and optional in list operations.

      pdbedit -a -u sorce
      -
      new password:
      -		retype new password
      -

      -m
      pdbedit -P "bad lockout attempt"

      		account policy value for bad lockout attempt is 0
      -		
      account policy value for bad lockout attempt is 0

      pdbedit -P "bad lockout attempt" -V 3

      		account policy value for bad lockout attempt was 0
      -		account policy value for bad lockout attempt is now 3
      -		
      account policy value for bad lockout attempt was 0 +account policy value for bad lockout attempt is now 3

      Print a summary of command line options.

      -s <configuration file>
      -s <configuration file>

      The file specified contains the @@ -517,7 +466,7 @@ compile time.

      NOTES

      VERSION

      SEE ALSO

      smbpasswd(8), - samba(7) -

      smbpasswd(5), samba(7)

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      Portability

      Chapter 23. Portability

      Chapter 21. Portability

      Samba works on a wide range of platforms but the interface all the platforms provide is not always compatible. This chapter contains @@ -83,7 +84,9 @@ CLASS="SECT1" >

      23.1. HPUX

      21.1. HPUX

      HP's implementation of supplementary groups is, er, non-standard (for hysterical reasons). There are two group files, /etc/group and @@ -111,7 +114,9 @@ CLASS="SECT1" >

      23.2. SCO Unix

      21.2. SCO Unix

      If you run an old version of SCO Unix then you may need to get important @@ -126,7 +131,9 @@ CLASS="SECT1" >

      23.3. DNIX

      21.3. DNIX

      DNIX has a problem with seteuid() and setegid(). These routines are needed for Samba to work correctly, but they were left out of the DNIX @@ -231,7 +238,9 @@ CLASS="SECT1" >

      23.4. RedHat Linux Rembrandt-II

      21.4. RedHat Linux Rembrandt-II

      By default RedHat Rembrandt-II during installation adds an entry to /etc/hosts as follows: diff --git a/docs/htmldocs/printing.html b/docs/htmldocs/printing.html index 46ebbcdf84..92eb52c7cc 100644 --- a/docs/htmldocs/printing.html +++ b/docs/htmldocs/printing.html @@ -5,8 +5,7 @@ >Printing Support

      Chapter 14. Printing Support

      Chapter 13. Printing Support

      14.1. Introduction

      13.1. Introduction

      Beginning with the 2.2.0 release, Samba supports the native Windows NT printing mechanisms implemented via @@ -160,7 +163,9 @@ CLASS="SECT1" >

      14.2. Configuration

      13.2. Configuration

      Warning

      14.2.1. Creating [print$]

      13.2.1. Creating [print$]

      In order to support the uploading of printer driver files, you must first configure a file share named [print$]. @@ -303,7 +310,7 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" >NoteWarning

      14.2.2. Setting Drivers for Existing Printers

      13.2.2. Setting Drivers for Existing Printers

      The initial listing of printers in the Samba host's Printers folder will have no real printer driver assigned @@ -515,7 +524,9 @@ CLASS="SECT2" >

      14.2.3. Support a large number of printers

      13.2.3. Support a large number of printers

      One issue that has arisen during the development phase of Samba 2.2 is the need to support driver downloads for @@ -579,7 +590,9 @@ CLASS="SECT2" >

      14.2.4. Adding New Printers via the Windows NT APW

      13.2.4. Adding New Printers via the Windows NT APW

      By default, Samba offers all printer shares defined in

      14.2.5. Samba and Printer Ports

      13.2.5. Samba and Printer Ports

      Windows NT/2000 print servers associate a port with each printer. These normally take the form of LPT1:, COM1:, FILE:, etc... Samba must also support the @@ -781,7 +796,9 @@ CLASS="SECT1" >

      14.3. The Imprints Toolset

      13.3. The Imprints Toolset

      The Imprints tool set provides a UNIX equivalent of the Windows NT Add Printer Wizard. For complete information, please @@ -797,7 +814,9 @@ CLASS="SECT2" >

      14.3.1. What is Imprints?

      13.3.1. What is Imprints?

      Imprints is a collection of tools for supporting the goals of

      14.3.2. Creating Printer Driver Packages

      13.3.2. Creating Printer Driver Packages

      The process of creating printer driver packages is beyond the scope of this document (refer to Imprints.txt also included @@ -841,7 +862,9 @@ CLASS="SECT2" >

      14.3.3. The Imprints server

      13.3.3. The Imprints server

      The Imprints server is really a database server that may be queried via standard HTTP mechanisms. Each printer @@ -863,7 +886,9 @@ CLASS="SECT2" >

      14.3.4. The Installation Client

      13.3.4. The Installation Client

      More information regarding the Imprints installation client is available in the

      14.4. Diagnosis

      13.4. Diagnosis

      14.4.1. Introduction

      13.4.1. Introduction

      This is a short description of how to debug printing problems with Samba. This describes how to debug problems with printing from a SMB @@ -1034,7 +1063,9 @@ CLASS="SECT2" >

      14.4.2. Debugging printer problems

      13.4.2. Debugging printer problems

      One way to debug printing problems is to start by replacing these command with shell scripts that record the arguments and the contents @@ -1050,7 +1081,7 @@ CLASS="PROGRAMLISTING" /usr/bin/id -p >/tmp/tmp.print # we run the command and save the error messages # replace the command with the one appropriate for your system - /usr/bin/lpr -r -P$1 $2 2>>&/tmp/tmp.print

      Then you print a file and try removing it. You may find that the @@ -1089,7 +1120,9 @@ CLASS="SECT2" >

      14.4.3. What printers do I have?

      13.4.3. What printers do I have?

      You can use the 'testprns' program to check to see if the printer name you are using is recognized by Samba. For example, you can @@ -1116,7 +1149,9 @@ CLASS="SECT2" >

      14.4.4. Setting up printcap and print servers

      13.4.4. Setting up printcap and print servers

      You may need to set up some printcaps for your Samba system to use. It is strongly recommended that you use the facilities provided by @@ -1198,7 +1233,9 @@ CLASS="SECT2" >

      14.4.5. Job sent, no output

      13.4.5. Job sent, no output

      This is the most frustrating part of printing. You may have sent the job, verified that the job was forwarded, set up a wrapper around @@ -1241,7 +1278,9 @@ CLASS="SECT2" >

      14.4.6. Job sent, strange output

      13.4.6. Job sent, strange output

      Once you have the job printing, you can then start worrying about making it print nicely.

      14.4.7. Raw PostScript printed

      13.4.7. Raw PostScript printed

      This is a problem that is usually caused by either the print spooling system putting information at the start of the print job that makes @@ -1298,7 +1339,9 @@ CLASS="SECT2" >

      14.4.8. Advanced Printing

      13.4.8. Advanced Printing

      Note that you can do some pretty magic things by using your imagination with the "print command" option and some shell scripts. @@ -1312,7 +1355,9 @@ CLASS="SECT2" >

      14.4.9. Real debugging

      13.4.9. Real debugging

      If the above debug tips don't help, then maybe you need to bring in the bug guns, system tracing. See Tracing.txt in this directory.

      LanMan and NT Password Encryption in SambaNext

      Chapter 4. LanMan and NT Password Encryption in Samba

      Chapter 4. LanMan and NT Password Encryption in Samba

      4.1. Introduction

      4.1. Introduction

      Newer windows clients send encrypted passwords over the wire, instead of plain text passwords. The newest clients @@ -101,7 +104,9 @@ CLASS="SECT1" >

      4.2. Important Notes About Security

      4.2. Important Notes About Security

      The unix and SMB password encryption techniques seem similar on the surface. This similarity is, however, only skin deep. The unix @@ -135,7 +140,7 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" >Warning

      4.2.1. Advantages of SMB Encryption

      4.2.1. Advantages of SMB Encryption

        4.2.2. Advantages of non-encrypted passwords

        4.2.2. Advantages of non-encrypted passwords

          4.3. The smbpasswd Command

          4.3. The smbpasswd Command

          The smbpasswd command maintains the two 32 byte password fields in the smbpasswd file. If you wish to make it similar to the unix @@ -401,7 +412,7 @@ WIDTH="33%" ALIGN="right" VALIGN="top" >NextType of installationUser information database

      rpcclient

      rpcclient

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      OPTIONS

      name resolve order
      line from - smb.conf(5) line from smb.conf(5).

      		username = <value> 
      -		password = <value>
      -		domain   = <value>
      -		
      username = <value> +password = <value> +domain = <value>

      Make certain that the permissions on the file restrict @@ -124,6 +127,12 @@ CLASS="PROGRAMLISTING" below))

      -h|--help

      Print a summary of command line options.

      -d|--debug=debuglevel

      file.

      -h|--help

      Print a summary of command line options.

      -I IP-address

      COMMANDS

      		Long Printer Name:\
      -		Driver File Name:\
      -		Data File Name:\
      -		Config File Name:\
      -		Help File Name:\
      -		Language Monitor Name:\
      -		Default Data Type:\
      -		Comma Separated list of Files
      -		
      Long Printer Name:\ +Driver File Name:\ +Data File Name:\ +Config File Name:\ +Help File Name:\ +Language Monitor Name:\ +Default Data Type:\ +Comma Separated list of Files

      Any empty fields should be enter as the string "NULL".

      BUGS

      "WARNING!WARNING!
      The MSRPC over SMB code has been developed from examining Network traces. No documentation is @@ -734,23 +736,28 @@ CLASS="EMPHASIS" to be... a bit flaky in places.

      The development of Samba's implementation is also a bit rough, - and as more of the services are understood, it can even result in - versions of smbd(8) and rpcclient(1) - that are incompatible for some commands or services. Additionally, + and as more of the services are understood, it can even result in + versions of smbd(8) and rpcclient(1) that are incompatible for some commands or services. Additionally, the developers are sending reports to Microsoft, and problems found or reported to Microsoft are fixed in Service Packs, which may - result in incompatibilities."

      VERSION

      AUTHOR

      The original rpcclient man page was written by Matthew Geddes, Luke Kenneth Casson Leighton, and rewritten by Gerald Carter. The conversion to DocBook for Samba 2.2 was done by Gerald - Carter.

      How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain

      Chapter 7. How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain

      Chapter 6. How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain

      7.1. Prerequisite Reading

      6.1. Prerequisite Reading

      Before you continue reading in this chapter, please make sure that you are comfortable with configuring a Samba PDC @@ -94,7 +97,9 @@ CLASS="SECT1" >

      7.2. Background

      6.2. Background

      What is a Domain Controller? It is a machine that is able to answer logon requests from workstations in a Windows NT Domain. Whenever a @@ -137,7 +142,9 @@ CLASS="SECT1" >

      7.3. What qualifies a Domain Controller on the network?

      6.3. What qualifies a Domain Controller on the network?

      Every machine that is a Domain Controller for the domain SAMBA has to register the NetBIOS group name SAMBA#1c with the WINS server and/or @@ -152,7 +159,9 @@ CLASS="SECT2" >

      7.3.1. How does a Workstation find its domain controller?

      6.3.1. How does a Workstation find its domain controller?

      A NT workstation in the domain SAMBA that wants a local user to be authenticated has to find the domain controller for SAMBA. It does @@ -169,7 +178,9 @@ CLASS="SECT2" >

      7.3.2. When is the PDC needed?

      6.3.2. When is the PDC needed?

      Whenever a user wants to change his password, this has to be done on the PDC. To find the PDC, the workstation does a NetBIOS name query @@ -183,13 +194,19 @@ CLASS="SECT1" >

      7.4. Can Samba be a Backup Domain Controller?

      6.4. Can Samba be a Backup Domain Controller to an NT PDC?

      With version 2.2, no. The native NT SAM replication protocols have not yet been fully implemented. The Samba Team is working on understanding and implementing the protocols, but this work has not been finished for version 2.2.

      With version 3.0, the work on both the replication protocols and a +suitable storage mechanism has progressed, and some form of NT4 BDC +support is expected soon.

      Can I get the benefits of a BDC with Samba? Yes. The main reason for implementing a BDC is availability. If the PDC is a Samba machine, a second Samba machine can be set up to @@ -200,7 +217,9 @@ CLASS="SECT1" >

      7.5. How do I set up a Samba BDC?

      6.5. How do I set up a Samba BDC?

      Several things have to be done:

      7.5.1. How do I replicate the smbpasswd file?

      6.5.1. How do I replicate the smbpasswd file?

      Replication of the smbpasswd file is sensitive. It has to be done whenever changes to the SAM are made. Every user's password change is @@ -279,6 +300,21 @@ rsync. rsync can use ssh as a transport. ssh itself can be set up to accept *only* rsync transfer without requiring the user to type a password.

      6.5.2. Can I do this all with LDAP?

      The simple answer is YES. Samba's pdb_ldap code supports +binding to a replica LDAP server, and will also follow referrals and +rebind to the master if it ever needs to make a modification to the +database. (Normally BDCs are read only, so this will not occur +often).

      How to Configure Samba as a NT4 Primary Domain ControllerSamba as a NT4 or Win2k Primary Domain ControllerSAMBA Project Documentation

      SAMBA Project Documentation

      SAMBA Project Documentation

      SAMBA Team

      SAMBA Team

      Abstract

      Abstract

      2. Improved browsing in sambaQuick Cross Subnet Browsing / Cross Workgroup Browsing guide
      2.1. Overview of browsingDiscussion
      2.2. Browsing support in sambaUse of the "Remote Announce" parameter
      2.3. Problem resolutionUse of the "Remote Browse Sync" parameter
      2.4. Browsing across subnetsUse of WINS
      2.5. Setting up a WINS serverDo NOT use more than one (1) protocol on MS Windows machines
      2.6. Setting up Browsing in a WORKGROUP
      2.7. Setting up Browsing in a DOMAIN
      2.8. Forcing samba to be the master
      2.9. Making samba the domain master
      2.10. Note about broadcast addresses
      2.11. Multiple interfacesName Resolution Order
      3. Quick Cross Subnet Browsing / Cross Workgroup Browsing guideUser information database
      3.1. DiscussionIntroduction
      3.2. Use of the "Remote Announce" parameterImportant Notes About Security
      3.3. Use of the "Remote Browse Sync" parameterThe smbpasswd Command
      3.4. Use of WINSPlain text
      3.5. Do NOT use more than one (1) protocol on MS Windows machinesTDB
      3.6. Name Resolution OrderLDAP
      4. LanMan and NT Password Encryption in Samba3.7. MySQL
      4.1. Introduction
      4.2. Important Notes About Security
      4.3. The smbpasswd Command3.8. Passdb XML plugin
      5. 4. User and Share security level (for servers not in a domain)
      6. 5. How to Configure Samba as a NT4 Primary Domain ControllerSamba as a NT4 or Win2k Primary Domain Controller
      6.1. 5.1. Prerequisite Reading
      6.2. 5.2. Background
      6.3. 5.3. Configuring the Samba Domain Controller
      6.4. 5.4. Creating Machine Trust Accounts and Joining Clients to the Domain
      6.5. 5.5. Common Problems and Errors
      6.6. 5.6. System Policies and Profiles
      6.7. 5.7. What other help can I get?
      6.8. 5.8. Domain Control for Windows 9x/ME
      6.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba5.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba
      7. 6. How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain
      7.1. 6.1. Prerequisite Reading
      7.2. 6.2. Background
      7.3. 6.3. What qualifies a Domain Controller on the network?
      7.4. Can Samba be a Backup Domain Controller?6.4. Can Samba be a Backup Domain Controller to an NT PDC?
      7.5. 6.5. How do I set up a Samba BDC?
      8. 7. Samba as a ADS domain member
      8.1. 7.1. Installing the required packages for Debian
      8.2. 7.2. Installing the required packages for RedHat
      8.3. 7.3. Compile Samba
      8.4. 7.4. Setup your /etc/krb5.conf
      8.5. 7.5. Create the computer account
      8.6. 7.6. Test your server setup
      8.7. 7.7. Testing with smbclient
      8.8. 7.8. Notes
      9. 8. Samba as a NT4 domain memberSamba as a NT4 or Win2k domain member
      9.1. Joining an NT Domain with Samba 2.28.1. Joining an NT Domain with Samba 3.0
      9.2. 8.2. Samba and Windows 2000 Domains
      9.3. 8.3. Why is this better than security = server?
      10. 9. Integrating MS Windows networks with Samba
      10.1. 9.1. Agenda
      10.2. 9.2. Name Resolution in a pure Unix/Linux world
      10.3. 9.3. Name resolution as used within MS Windows networking
      10.4. 9.4. How browsing functions and how to deploy stable and dependable browsing using Samba
      10.5. 9.5. MS Windows security options and how to configure Samba for seemless integration
      10.6. 9.6. Conclusions
      11. 10. UNIX Permission Bits and Windows NT Access Control Lists
      11.1. 10.1. Viewing and changing UNIX permissions using the NT security dialogs
      11.2. 10.2. How to view file security on a Samba share
      11.3. 10.3. Viewing file ownership
      11.4. 10.4. Viewing file or directory permissions
      11.5. 10.5. Modifying file or directory permissions
      11.6. 10.6. Interaction with the standard Samba create mask parameters
      11.7. 10.7. Interaction with the standard Samba file attribute mapping
      12. 11. Configuring PAM for distributed but centrally managed authentication
      12.1. 11.1. Samba and PAM
      12.2. 11.2. Distributed Authentication
      12.3. 11.3. PAM Configuration in smb.conf
      13. 12. Hosting a Microsoft Distributed File System tree on Samba
      13.1. 12.1. Instructions
      14. 13. Printing Support
      14.1. 13.1. Introduction
      14.2. 13.2. Configuration
      14.3. 13.3. The Imprints Toolset
      14.4. 13.4. Diagnosis
      15. 14. Unified Logons between Windows NT and UNIX using Winbind
      15.1. 14.1. Abstract
      15.2. 14.2. Introduction
      15.3. 14.3. What Winbind Provides
      15.4. 14.4. How Winbind Works
      15.5. 14.5. Installation and Configuration
      15.6. 14.6. Limitations
      15.7. 14.7. Conclusion
      16. Passdb MySQL plugin15. Improved browsing in samba
      16.1. Building15.1. Overview of browsing
      16.2. Configuring15.2. Browsing support in samba
      16.3. Using plaintext passwords or encrypted password15.3. Problem resolution
      16.4. Getting non-column data from the table15.4. Browsing across subnets
      17. Passdb XML plugin15.5. Setting up a WINS server
      17.1. Building15.6. Setting up Browsing in a WORKGROUP
      17.2. Usage15.7. Setting up Browsing in a DOMAIN
      18. Stackable VFS modules15.8. Forcing samba to be the master
      18.1. Introduction and configuration15.9. Making samba the domain master
      18.2. Included modules15.10. Note about broadcast addresses
      18.3. VFS modules available elsewhere15.11. Multiple interfaces
      19. Storing Samba's User/Machine Account information in an LDAP Directory16. Stackable VFS modules
      19.1. Purpose
      19.2. Introduction
      19.3. Supported LDAP Servers
      19.4. Schema and Relationship to the RFC 2307 posixAccount
      19.5. Configuring Samba with LDAP
      19.6. Accounts and Groups management
      19.7. Security and sambaAccount
      19.8. LDAP specials attributes for sambaAccounts16.1. Introduction and configuration
      19.9. Example LDIF Entries for a sambaAccount16.2. Included modules
      19.10. Comments16.3. VFS modules available elsewhere
      20. 17. HOWTO Access Samba source code via CVSAccess Samba source code via CVS
      20.1. 17.1. Introduction
      20.2. 17.2. CVS Access to samba.org
      21. 18. Group mapping HOWTO
      22. 19. Samba performance issues
      22.1. 19.1. Comparisons
      22.2. 19.2. Socket options
      22.3. 19.3. Read size
      22.4. 19.4. Max xmit
      22.5. 19.5. Log level
      22.6. 19.6. Read raw
      22.7. 19.7. Write raw
      22.8. 19.8. Slow Clients
      22.9. 19.9. Slow Logins
      22.10. 19.10. Client tuning
      20. Creating Group Profiles
      20.1. Windows '9x
      20.2. Windows NT 4
      20.3. Windows 2000/XP
      23. 21. Portability
      23.1. 21.1. HPUX
      23.2. 21.2. SCO Unix
      23.3. 21.3. DNIX
      23.4. 21.4. RedHat Linux Rembrandt-II
      24. 22. Samba and other CIFS clients
      24.1. 22.1. Macintosh clients?
      24.2. 22.2. OS2 Client
      24.3. 22.3. Windows for Workgroups
      24.4. 22.4. Windows '95/'98
      24.5. 22.5. Windows 2000 Service Pack 2
      25. 23. Reporting Bugs
      25.1. 23.1. Introduction
      25.2. 23.2. General info
      25.3. 23.3. Debug levels
      25.4. 23.4. Internal errors
      25.5. 23.5. Attaching to a running process
      25.6. 23.6. Patches
      26. 24. Diagnosing your samba server
      26.1. 24.1. Introduction
      26.2. 24.2. Assumptions
      26.3. 24.3. Tests
      26.4. 24.4. Still having troubles?
      Storing Samba's User/Machine Account information in an LDAP Directory

      Chapter 19. Storing Samba's User/Machine Account information in an LDAP Directory

      Chapter 17. Storing Samba's User/Machine Account information in an LDAP Directory

      19.1. Purpose

      17.1. Purpose

      This document describes how to use an LDAP directory for storing Samba user account information traditionally stored in the smbpasswd(5) file. It is @@ -145,7 +148,9 @@ CLASS="SECT1" >

      19.2. Introduction

      17.2. Introduction

      Traditionally, when configuring

      19.3. Supported LDAP Servers

      17.3. Supported LDAP Servers

      The LDAP samdb code in 2.2.3 has been developed and tested using the OpenLDAP 2.0 server and client libraries. The same code should be able to work with @@ -283,7 +290,9 @@ CLASS="SECT1" >

      19.4. Schema and Relationship to the RFC 2307 posixAccount

      17.4. Schema and Relationship to the RFC 2307 posixAccount

      Samba 2.2.3 includes the necessary schema file for OpenLDAP 2.0 in

      19.5. Configuring Samba with LDAP

      17.5. Configuring Samba with LDAP

      19.5.1. OpenLDAP configuration

      17.5.1. OpenLDAP configuration

      To include support for the sambaAccount object in an OpenLDAP directory server, first copy the samba.schema file to slapd's configuration directory.

      19.5.2. Configuring Samba

      17.5.2. Configuring Samba

      The following parameters are available in smb.conf only with

      19.6. Accounts and Groups management

      17.6. Accounts and Groups management

      As users accounts are managed thru the sambaAccount objectclass, you should modify you existing administration tools to deal with sambaAccount attributes.

      19.7. Security and sambaAccount

      17.7. Security and sambaAccount

      There are two important points to remember when discussing the security of sambaAccount entries in the directory.

      19.8. LDAP specials attributes for sambaAccounts

      17.8. LDAP specials attributes for sambaAccounts

      The sambaAccount objectclass is composed of the following attributes:

      19.9. Example LDIF Entries for a sambaAccount

      17.9. Example LDIF Entries for a sambaAccount

      The following is a working LDIF with the inclusion of the posixAccount objectclass:

      19.10. Comments

      17.10. Comments

      Please mail all comments regarding this HOWTO to How to Configure Samba as a NT4 Primary Domain ControllerSamba as a NT4 or Win2k Primary Domain Controller

      Chapter 6. How to Configure Samba as a NT4 Primary Domain Controller

      Chapter 5. Samba as a NT4 or Win2k Primary Domain Controller

      6.1. Prerequisite Reading

      5.1. Prerequisite Reading

      Before you continue reading in this chapter, please make sure that you are comfortable with configuring basic files services @@ -105,7 +108,9 @@ CLASS="SECT1" >

      6.2. Background

      5.2. Background

      Note

      6.3. Configuring the Samba Domain Controller

      5.3. Configuring the Samba Domain Controller

      The first step in creating a working Samba PDC is to understand the parameters necessary in smb.conf. I will not @@ -465,7 +472,9 @@ CLASS="SECT1" >

      6.4. Creating Machine Trust Accounts and Joining Clients to the +NAME="AEN810" +>5.4. Creating Machine Trust Accounts and Joining Clients to the Domain

      A machine trust account is a Samba account that is used to @@ -537,7 +546,9 @@ CLASS="SECT2" >

      6.4.1. Manual Creation of Machine Trust Accounts

      5.4.1. Manual Creation of Machine Trust Accounts

      The first step in manually creating a machine trust account is to manually create the corresponding Unix account in @@ -689,7 +700,7 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" >Warning

      6.4.2. "On-the-Fly" Creation of Machine Trust Accounts

      5.4.2. "On-the-Fly" Creation of Machine Trust Accounts

      The second (and recommended) way of creating machine trust accounts is simply to allow the Samba server to create them as needed when the client @@ -751,7 +764,7 @@ be created manually.

      [global]
      -   # <...remainder of parameters...>
      +   # <...remainder of parameters...>
          add user script = /usr/sbin/useradd -d /dev/null -g 100 -s /bin/false -M %u 

      6.4.3. Joining the Client to the Domain

      5.4.3. Joining the Client to the Domain

      The procedure for joining a client to the domain varies with the version of Windows.

      6.5. Common Problems and Errors

      5.5. Common Problems and Errors

      6.6. System Policies and Profiles

      5.6. System Policies and Profiles

      Much of the information necessary to implement System Policies and Roving User Profiles in a Samba domain is the same as that for @@ -1209,7 +1228,9 @@ CLASS="SECT1" >

      6.7. What other help can I get?

      5.7. What other help can I get?

      There are many sources of information available in the form of mailing lists, RFC's and documentation. The docs that come @@ -1627,7 +1648,9 @@ CLASS="SECT1" >

      6.8. Domain Control for Windows 9x/ME

      5.8. Domain Control for Windows 9x/ME

      Note

    • The client broadcasts (to the IP broadcast address of the subnet it is in) - a NetLogon request. This is sent to the NetBIOS name DOMAIN<1c> at the + a NetLogon request. This is sent to the NetBIOS name DOMAIN<1c> at the NetBIOS layer. The client chooses the first response it receives, which contains the NetBIOS name of the logon server to use in the format of \\SERVER. @@ -1759,7 +1782,9 @@ CLASS="SECT2" >

      6.8.1. Configuration Instructions: Network Logons

      5.8.1. Configuration Instructions: Network Logons

      The main difference between a PDC and a Windows 9x logon server configuration is that

      Warning

      6.8.2. Configuration Instructions: Setting up Roaming User Profiles

      5.8.2. Configuration Instructions: Setting up Roaming User Profiles

      Warning

      6.8.2.1. Windows NT Configuration

      5.8.2.1. Windows NT Configuration

      To support WinNT clients, in the [global] section of smb.conf set the following (for example):

      Note

      6.8.2.2. Windows 9X Configuration

      5.8.2.2. Windows 9X Configuration

      To support Win9X clients, you must use the "logon home" parameter. Samba has now been fixed so that "net use/home" now works as well, and it, too, relies @@ -1992,7 +2023,9 @@ CLASS="SECT3" >

      6.8.2.3. Win9X and WinNT Configuration

      5.8.2.3. Win9X and WinNT Configuration

      You can support profiles for both Win9X and WinNT clients by setting both the "logon home" and "logon path" parameters. For example:

      Note

      6.8.2.4. Windows 9X Profile Setup

      5.8.2.4. Windows 9X Profile Setup

      When a user first logs in on Windows 9X, the file user.DAT is created, as are folders "Start Menu", "Desktop", "Programs" and "Nethood". @@ -2193,7 +2228,9 @@ CLASS="SECT3" >

      6.8.2.5. Windows NT Workstation 4.0

      5.8.2.5. Windows NT Workstation 4.0

      When a user first logs in to a Windows NT Workstation, the profile NTuser.DAT is created. The profile location can be now specified @@ -2212,7 +2249,7 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" >NoteNote

      6.8.2.6. Windows NT Server

      5.8.2.6. Windows NT Server

      There is nothing to stop you specifying any path that you like for the location of users' profiles. Therefore, you could specify that the @@ -2317,7 +2356,9 @@ CLASS="SECT3" >

      6.8.2.7. Sharing Profiles between W95 and NT Workstation 4.0

      5.8.2.7. Sharing Profiles between W95 and NT Workstation 4.0

      WarningNote

      6.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba

      5.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba

      Warningsamba

      samba

      Name

      SAMBA -- A Windows SMB/CIFS fileserver for UNIX
      Samba -- A Windows SMB/CIFS fileserver for UNIX
      smbdsmbd(8)

      The smbd - daemon provides the file and print services to +>smbd daemon provides the file and print services to SMB clients, such as Windows 95/98, Windows NT, Windows for Workgroups or LanManager. The configuration file - for this daemon is described in smb.confsmb.conf(5)

      nmbdnmbd(8)

      daemon provides NetBIOS nameservice and browsing support. The configuration file for this daemon - is described in smb.confsmb.conf(5)

      smbclientsmbclient(1)

      testparmtestparm(1)

      testparm - utility is a simple syntax checker for Samba's - smb.confconfiguration file.

      smb.conf(5) configuration file.

      testprnstestprns(1)

      smbstatussmbstatus(1)

      .

      nmblookupnmblookup(1)

      make_smbcodepagesmbgroupedit(8)

      The make_smbcodepagesmbgroupedit - utility provides a means of creating SMB code page - definition files for your smbd server.

      smbpasswdsmbpasswd(8)

      COMPONENTS

      AVAILABILITY

      If you have access to a WWW viewer (such as Netscape - or Mosaic) then you will also find lots of useful information, +>If you have access to a WWW viewer (such as Mozilla + or Konqueror) then you will also find lots of useful information, including back issues of the Samba mailing list, at

      VERSION

      This man page is correct for version 2.2 of the +>This man page is correct for version 3.0 of the Samba suite.

      CONTRIBUTIONS

      http://devel.samba.org/ - for information on how to do it properly. We prefer patches in - diff -u format.

      CONTRIBUTORS

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      User and Share security level (for servers not in a domain)

      Chapter 5. User and Share security level (for servers not in a domain)

      Chapter 4. User and Share security level (for servers not in a domain)

      A SMB server tells the client at startup what "security level" it is running. There are two options "share level" and "user level". Which @@ -225,7 +226,7 @@ ACCESSKEY="U" WIDTH="33%" ALIGN="right" VALIGN="top" ->How to Configure Samba as a NT4 Primary Domain ControllerSamba as a NT4 or Win2k Primary Domain Controller

      + smb.conf

      smb.conf

      smb.conf
      The smb.conf file is a configuration +> file is a configuration file for the Samba suite. smb.conf contains - runtime configuration information for the Samba programs. The - contains + runtime configuration information for the Samba programs. The smb.conf file is designed to be configured and - administered by the swat(8) - program. The complete description of the file format and - possible parameters held within are here for reference purposes.

      file + is designed to be configured and administered by the swat(8) program. The complete + description of the file format and possible parameters held within + are here for reference purposes.

      FILE FORMAT

      SECTION DESCRIPTIONS

      There are three special sections, [global], [homes] and [printers], which are - described under special sections. The following notes apply to ordinary section descriptions.

      Sections may be designated Sections may be designated guest services, in which case no password is required to access them. A specified - UNIX guest account is used to define access privileges in this case.

      /home/bar. The share is accessed via the share name "foo":

      	 	[foo]
      - 		path = /home/bar
      - 		read only = no
      -	
      -	
      [foo] + path = /home/bar + read only = no

      The following sample section defines a printable share. The share is readonly, but printable. That is, the only write access permitted is via calls to open, write to and close a - spool file. The guest ok parameter means access will be permitted as the default guest user (specified elsewhere):

      	 	[aprinter]
      - 		path = /usr/spool/public
      - 		read only = yes
      - 		printable = yes
      - 		guest ok = yes
      -	
      -	
      [aprinter] + path = /usr/spool/public + read only = yes + printable = yes + guest ok = yes

      SPECIAL SECTIONS

      The [global] section

      The [homes] section

    • If you decide to use a If you decide to use a path = line in your [homes] section then you may find it useful to use the %S macro. For example :

      			 	[homes]
      - 			read only = no
      -		
      -		
      [homes] + read only = no

      An important point is that if guest access is specified in the [homes] section, all home directories will be - visible to all clients without a password. In the very unlikely event that this is actually desirable, it - would be wise to also specify read only access.

      Note that the Note that the browseable flag for auto home directories will be inherited from the global browseable flag, not the [homes] browseable flag. This is useful as - it means setting browseable = no in the [homes] section will hide the [homes] share but make any auto home directories visible.

      The [printers] section

      	 	[printers]
      - 			path = /usr/spool/public
      - 			guest ok = yes
      - 			printable = yes 
      -		[printers]
      +	path = /usr/spool/public
      +	guest ok = yes
      +	printable = yes 

      All aliases given for a printer in the printcap file are legitimate printer names as far as the server is concerned. If your printing subsystem doesn't work like that, you will have to set up a pseudo-printcap. This is a file consisting of one or more lines like this:

      			        alias|alias|alias|alias...    
      -		
      -		
      alias|alias|alias|alias...

      Each alias should be an acceptable printer name for your printing subsystem. In the [global] section, specify @@ -471,7 +443,7 @@ CLASS="COMPUTEROUTPUT" >

      PARAMETERS

      parameters define the specific attributes of sections.

      Some parameters are specific to the [global] section - (e.g., security). Some parameters are usable - in all sections (e.g., create mode). All others are permissible only in normal sections. For the purposes of the following descriptions the [homes] and [printers] - sections will be considered normal. The letter G in parentheses indicates that a parameter is specific to the - [global] section. The letter S indicates that a parameter can be specified in a service specific - section. Note that all S parameters can also be specified in the [global] section - in which case they will define the default behavior for all services.

      VARIABLE SUBSTITUTIONS

      the name of your NIS home directory server. This is obtained from your NIS auto.map entry. If you have - not compiled Samba with the --with-automount option then this value will be the same as %L.

      NAME MANGLING

      controls if names that have characters that aren't of the "default" case are mangled. For example, if this is yes then a name like "Mail" would be mangled. - Default no.

      controls whether filenames are case sensitive. If they aren't then Samba must do a filename search and match on passed - names. Default no.

      controls what the default case is for new - filenames. Default lower.

      controls if new files are created with the case that the client passes, or if they are forced to be the - "default" case. Default yes.

      yes.

      NOTE ABOUT USERNAME/PASSWORD VALIDATION

      COMPLETE LIST OF GLOBAL PARAMETERS

      COMPLETE LIST OF SERVICE PARAMETERS

      EXPLANATION OF EACH PARAMETER

      abort shutdown script (G)
      >abort shutdown script (G)

      This parameter only exists in the HEAD cvs branch - This a full path name to a script called by - smbd(8) that + This a full path name to a script called by smbd(8) that should stop a shutdown procedure issued by the

      This command will be run as user.

      Default: Default: None.

      Example: addprinter command (G)>addprinter command (G)

      With the introduction of MS-RPC based printing @@ -4771,14 +4780,12 @@ CLASS="PARAMETER" CLASS="FILENAME" >smb.conf file in order that it can be - shared by smbd(8) - smbd(8).

      The is automatically invoked with the following parameter (in - order:

        Default: Default: none

        Example: add share command (G)>add share command (G)

        Samba 2.2.0 introduced the ability to dynamically @@ -5043,9 +5053,12 @@ CLASS="PARAMETER" >.

        Default: Default: none

        Example: add machine script (G)>add machine script (G)

        This is the full pathname to a script that will - be run by smbd(8) when a machine is added + be run by smbd(8) when a machine is added to it's domain using the administrator username and password method.

        This option is only required when using sam back-ends tied to the @@ -5074,7 +5089,7 @@ TARGET="_top" >

        Default: add machine script = <empty string> +>add machine script = <empty string>

        ads server (G)>ads server (G)

        If this option is specified, samba does @@ -5110,18 +5125,22 @@ CLASS="COMMAND" >add user script (G)>add user script (G)

        This is the full pathname to a script that will - be run AS ROOT by smbd(8) - by smbd(8) under special circumstances described below.

        Normally, a Samba server requires that UNIX users are @@ -5133,19 +5152,26 @@ HREF="smbd.8.html" TARGET="_top" >smbd to create the required UNIX users - ON DEMAND when a user accesses the Samba server.

        In order to use this option, smbd - must In order to use this option, smbd(8) must NOT be set to

        When the Windows user attempts to access the Samba server, - at login (session setup in the SMB protocol) time, smbdsmbd(8) contacts the smbd will - call the specified script AS ROOT, expanding any

        Default: add user script = <empty string> +>add user script = <empty string>

        add group script (G)>add group script (G)

        This is the full pathname to a script that will - be run AS ROOT by smbd(8) by smbd(8) when a new group is requested. It will expand any admin users (S)>admin users (S)

        This is a list of users who will be granted @@ -5299,9 +5335,12 @@ NAME="ADMINUSERS" this list will be able to do anything they like on the share, irrespective of file permissions.

        Default: Default: no admin users

        Example: add user to group script (G)>add user to group script (G)

        Full path to the script that will be called when a user is added to a group using the Windows NT domain administration - tools. It will be run by smbd(8) - smbd(8) AS ROOT. Any . + Any %g will be - replaced with the group name and any will be replaced with the group name and + any %u will - be replaced with the user name. +> will be replaced with the user name.

        Default: allow hosts (S)>allow hosts (S)

        Synonym for algorithmic rid base (G)>algorithmic rid base (G)

        This determines how Samba will use its @@ -5404,7 +5447,7 @@ CLASS="COMMAND" >allow trusted domains (G)>allow trusted domains (G)

        This option only takes effect when the announce as (G)>announce as (G)

        This specifies what type of server - nmbd - will announce itself as, to a network neighborhood browse +>This specifies what type of server nmbd(8) will announce itself as, to a network neighborhood browse list. By default this is set to Windows NT. The valid options are : "NT Server" (which can also be written as "NT"), "NT Workstation", "Win95" or "WfW" meaning Windows NT Server, @@ -5486,7 +5526,7 @@ CLASS="COMMAND" >announce version (G)>announce version (G)

        This specifies the major and minor version numbers @@ -5508,7 +5548,7 @@ CLASS="COMMAND" >auto services (G)>auto services (G)

        This is a synonym for the auth methods (G)>auth methods (G)

        This option allows the administrator to chose what @@ -5550,7 +5590,7 @@ CLASS="PARAMETER" >

        Default: auth methods = <empty string>auth methods = <empty string>

        Example: available (S)>available (S)

        This parameter lets you "turn off" a service. If @@ -5571,9 +5611,12 @@ CLASS="PARAMETER" >available = no, then , then ALL attempts to connect to the service will fail. Such failures are logged.

        bind interfaces only (G)>bind interfaces only (G)

        This global parameter allows the Samba admin to limit what interfaces on a machine will serve SMB requests. It - affects file service smbd(8) and - name service nmbd(8) in slightly - different ways.

        smbd(8) and name service nmbd(8) in a slightly different ways.

        For name service it causes nmbd.

        For file service it causes smbd(8) - to bind only to the interface list given in the For file service it causes smbd(8) to bind only to the interface list + given in the interfaces parameter. This restricts the networks that @@ -5680,40 +5727,42 @@ CLASS="PARAMETER" >bind interfaces only is set then - unless the network address 127.0.0.1 is added to the interfaces parameter list smbpasswd(8) - and swat(8) may - not work as expected due to the reasons covered below.

        parameter list smbpasswd(8) and swat(8) may not work as expected due to the reasons covered below.

        To change a users SMB password, the smbpasswd - by default connects to the localhost - 127.0.0.1 address as an SMB client to issue the password change request. If bind interfaces only is set then unless the - network address 127.0.0.1 is added to the smbpasswd can be forced to use the primary IP interface - of the local host by using its smbpasswd(8) -r - parameter, with remote machinenmbd at the address - 127.0.0.1 to determine if they are running. - Not adding 127.0.0.1 will cause smbdblocking locks (S)>blocking locks (S)

        This parameter controls the behavior of smbd(8)This parameter controls the behavior + of smbd(8) when given a request by a client to obtain a byte range lock on a region of an open file, and the request has a time limit associated with it.

        block size (S)>block size (S)

        This parameter controls the behavior of - smbd(8)This parameter controls the behavior of smbd(8) when reporting disk free sizes. By default, this reports a disk block size of 1024 bytes.

        Changing this option does not change the disk free reporting size, just the block size unit reported to the client.

        Default: block size = 1024

        Example: block size = 65536

        browsable (S)
        >browsable (S)

        See the browse list (G)>browse list (G)

        This controls whether smbd(8)This controls whether smbd(8) will serve a browse list to a client doing a browseable (S)>browseable (S)

        This controls whether this share is seen in @@ -5940,11 +5993,11 @@ CLASS="COMMAND" >case sensitive (S)>case sensitive (S)

        See the discussion in the section NAME MANGLING.

        casesignames (S)>casesignames (S)

        Synonym for change notify timeout (G)>change notify timeout (G)

        This SMB allows a client to tell a server to "watch" a particular directory for any changes and only reply to the SMB request when a change has occurred. Such constant scanning of - a directory is expensive under UNIX, hence an smbd(8)smbd(8) daemon only performs such a scan on each requested directory once every change share command (G)>change share command (G)

        Samba 2.2.0 introduced the ability to dynamically @@ -6125,9 +6177,12 @@ CLASS="PARAMETER" >.

        Default: Default: none

        Example: comment (S)>comment (S)

        This is a text field that is seen next to a share @@ -6161,9 +6216,12 @@ CLASS="PARAMETER" > parameter.

        Default: Default: No comment string

        Example: config file (G)>config file (G)

        This allows you to override the config file @@ -6207,7 +6265,7 @@ CLASS="COMMAND" >copy (S)>copy (S)

        This parameter allows you to "clone" service @@ -6220,9 +6278,12 @@ NAME="COPY" copied must occur earlier in the configuration file than the service doing the copying.

        Default: Default: no value

        Example: create mask (S)>create mask (S)

        A synonym for this parameter is @@ -6253,9 +6314,12 @@ CLASS="PARAMETER" calculated according to the mapping from DOS modes to UNIX permissions, and the resulting UNIX mode is then bit-wise 'AND'ed with this parameter. This parameter may be thought of as a bit-wise - MASK for the UNIX modes of a file. Any bit not set here will be removed from the modes set on a file when it is created.

        create mode (S)>create mode (S)

        This is a synonym for csc policy (S)>csc policy (S)

        This stands for This stands for client-side caching policy, and specifies how clients capable of offline caching will cache the files in the share. The valid values are: manual, documents, programs, disable.

        deadtime (G)>deadtime (G)

        The value of the parameter (a decimal integer) @@ -6429,7 +6496,7 @@ CLASS="COMMAND" >debug hires timestamp (G)>debug hires timestamp (G)

        Sometimes the timestamps in the log messages @@ -6457,7 +6524,7 @@ CLASS="COMMAND" >debug pid (G)>debug pid (G)

        When using only one log file for more then one @@ -6489,7 +6556,7 @@ CLASS="COMMAND" >debug timestamp (G)>debug timestamp (G)

        Samba debug log messages are timestamped @@ -6514,7 +6581,7 @@ CLASS="COMMAND" >debug uid (G)>debug uid (G)

        Samba is sometimes run as root and sometime @@ -6542,7 +6609,7 @@ CLASS="COMMAND" >debuglevel (G)>debuglevel (G)

        Synonym for default (G)>default (G)

        A synonym for default case (S)>default case (S)

        See the section on NAME MANGLING. Also note the default devmode (S)>default devmode (S)

        This parameter is only applicable to default service (G)>default service (G)

        This parameter specifies the name of a service which will be connected to if the service actually requested cannot - be found. Note that the square brackets are NOT given in the parameter value (see example below).

        Example:

        [global]
         	default service = pub
                 
         [pub]
        -	path = /%S
        -		

        delete group script (G)
        >delete group script (G)

        This is the full pathname to a script that will - be run AS ROOT by smbd(8) when a group is requested to be deleted. It will expand any smbd(8) when a group is requested to be deleted. + It will expand any %g to the group name passed. This script is only useful for installations using the Windows NT domain administration tools. +> to the group name passed. + This script is only useful for installations using the Windows NT domain administration tools.

        deleteprinter command (G)
        >deleteprinter command (G)

        With the introduction of MS-RPC based printer @@ -6829,9 +6896,12 @@ CLASS="PARAMETER" >

        Default: Default: none

        Example: delete readonly (S)>delete readonly (S)

        This parameter allows readonly files to be deleted. @@ -6863,7 +6933,7 @@ CLASS="COMMAND" >delete share command (G)>delete share command (G)

        Samba 2.2.0 introduced the ability to dynamically @@ -6967,9 +7037,12 @@ CLASS="PARAMETER" >.

        Default: Default: none

        Example: delete user script (G)>delete user script (G)

        This is the full pathname to a script that will - be run by smbd(8) - when managing user's with remote RPC (NT) tools. + be run by smbd(8) when managing users + with remote RPC (NT) tools.

        This script is called when a remote client removes a user @@ -7009,7 +7081,7 @@ CLASS="COMMAND" >

        Default: delete user script = <empty string> +>delete user script = <empty string>

        delete user from group script (G)>delete user from group script (G)

        Full path to the script that will be called when a user is removed from a group using the Windows NT domain administration - tools. It will be run by smbd(8) - smbd(8) AS ROOT. Any . + Any %g will be - replaced with the group name and any will be replaced with the group name and + any %u will - be replaced with the user name. +> will be replaced with the user name.

        Default: delete veto files (S)>delete veto files (S)

        This option is used when Samba is attempting to @@ -7126,7 +7202,7 @@ CLASS="COMMAND" >deny hosts (S)>deny hosts (S)

        Synonym for dfree command (G)>dfree command (G)

        The

        Note: Your script should Note: Your script should NOT be setuid or setgid and should be owned by (and writeable only by) root!

        Default: Default: By default internal routines for determining the disk capacity and remaining space will be used.

        Example:

        Where the script dfree (which must be made executable) could be:

         
        -		#!/bin/sh
        -		df $1 | tail -1 | awk '{print $2" "$4}'
        -		

        or perhaps (on Sys V based systems):

         
        -		#!/bin/sh
        -		/usr/bin/df -k $1 | tail -1 | awk '{print $3" "$5}'
        -		

        Note that you may have to replace the command names @@ -7239,7 +7301,7 @@ CLASS="PROGRAMLISTING" >directory (S)>directory (S)

        Synonym for directory mask (S)>directory mask (S)

        This parameter is the octal modes which are @@ -7268,9 +7330,12 @@ NAME="DIRECTORYMASK" calculated according to the mapping from DOS modes to UNIX permissions, and the resulting UNIX mode is then bit-wise 'AND'ed with this parameter. This parameter may be thought of as a bit-wise MASK for - the UNIX modes of a directory. Any bit not set here will be removed from the modes set on a directory when it is created.

        directory mode (S)>directory mode (S)

        Synonym for directory security mask (S)>directory security mask (S)

        This parameter controls what UNIX permission bits @@ -7396,9 +7461,12 @@ NAME="DIRECTORYSECURITYMASK" meaning a user is allowed to modify all the user/group/world permissions on a directory.

        Note that users who can access the Samba server through other means can easily bypass this restriction, so it is primarily useful for standalone "appliance" systems. @@ -7450,7 +7518,7 @@ CLASS="COMMAND" >disable netbios (G)>disable netbios (G)

        Enabling this parameter will disable netbios support @@ -7475,7 +7543,7 @@ CLASS="COMMAND" >disable spoolss (G)>disable spoolss (G)

        Enabling this parameter will disable Samba's support @@ -7487,9 +7555,12 @@ NAME="DISABLESPOOLSS" Wizard or by using the NT printer properties dialog window. It will also disable the capability of Windows NT/2000 clients to download print drivers from the Samba host upon demand. - Be very careful about enabling this parameter.

        display charset (G)>display charset (G)

        Specifies the charset that samba will use @@ -7533,18 +7604,19 @@ CLASS="COMMAND" >dns proxy (G)>dns proxy (G)

        Specifies that nmbd(8) - when acting as a WINS server and finding that a NetBIOS name has not - been registered, should treat the NetBIOS name word-for-word as a DNS - name and do a lookup with the DNS server for that name on behalf of - the name-querying client.

        Specifies that nmbd(8) when acting as a WINS server and + finding that a NetBIOS name has not been registered, should treat the + NetBIOS name word-for-word as a DNS name and do a lookup with the DNS server + for that name on behalf of the name-querying client.

        Note that the maximum length for a NetBIOS name is 15 characters, so the DNS name (or DNS alias) can likewise only be @@ -7576,7 +7648,7 @@ CLASS="COMMAND" >domain logons (G)>domain logons (G)

        If set to domain master (G)>domain master (G)

        Tell nmbd(8)Tell smbd(8) to enable WAN-wide browse list collation. Setting this option causes nmbd their local browse lists, - and then ask smbd(8) - for a complete copy of the browse list for the whole wide area - network. Browser clients will then contact their local master browser, - and will receive the domain-wide browse list, instead of just the list - for their broadcast-isolated subnet.

        smbd(8) for a complete copy of the browse + list for the whole wide area network. Browser clients will then contact + their local master browser, and will receive the domain-wide browse list, + instead of just the list for their broadcast-isolated subnet.

        Note that Windows NT Primary Domain Controllers expect to be able to claim this dont descend (S)>dont descend (S)

        There are certain directories on some systems @@ -7743,10 +7812,13 @@ CLASS="FILENAME" >. Experimentation is the best policy :-)

        Default: Default: none (i.e., all directories are OK to descend)

        Example: dos charset (G)>dos charset (G)

        DOS SMB clients assume the server has @@ -7768,11 +7840,12 @@ NAME="DOSCHARSET" >

        The default depends on which charsets you have instaled. Samba tries to use charset 850 but falls back to ASCII in - case it is not available. Run testparm(1) - testparm(1) to check the default on your system.

        dos filemode (S)>dos filemode (S)

        The default behavior in Samba is to provide @@ -7803,21 +7876,19 @@ CLASS="COMMAND" >dos filetime resolution (S)>dos filetime resolution (S)

        Under the DOS and Windows FAT filesystem, the finest granularity on time resolution is two seconds. Setting this parameter for a share causes Samba to round the reported time down to the nearest two second boundary when a query call that requires one second - resolution is made to smbd(8) - smbd(8).

        This option is mainly used as a compatibility option for Visual @@ -7840,7 +7911,7 @@ CLASS="COMMAND" >dos filetimes (S)>dos filetimes (S)

        Under DOS and Windows, if a user can write to a @@ -7854,10 +7925,12 @@ CLASS="COMMAND" on behalf of is not the file owner. Setting this option to yes allows DOS semantics and smbd allows DOS semantics and smbd(8) will change the file timestamp as DOS requires.

        encrypt passwords (G)>encrypt passwords (G)

        This boolean controls whether encrypted passwords @@ -7884,29 +7957,25 @@ CLASS="FILENAME" > shipped with the source code.

        In order for encrypted passwords to work correctly - smbd(8)smbd(8) must either - have access to a local smbpasswd(5) - file (see the smbpasswd(8)smbpasswd(5) file (see the smbpasswd(8) program for information on how to set up and maintain this file), or set the enhanced browsing (G)>enhanced browsing (G)

        This option enables a couple of enhancements to @@ -7958,7 +8027,7 @@ CLASS="COMMAND" >enumports command (G)>enumports command (G)

        The concept of a "port" is fairly foreign @@ -7990,9 +8059,12 @@ CLASS="PARAMETER" to standard output. This listing will then be used in response to the level 1 and 2 EnumPorts() RPC.

        Default: Default: no enumports command

        Example: exec (S)>exec (S)

        This is a synonym for fake directory create times (S)>fake directory create times (S)

        NTFS and Windows VFAT file systems keep a create @@ -8060,7 +8132,7 @@ CLASS="COMMAND" >fake oplocks (S)>fake oplocks (S)

        Oplocks are the way that SMB clients get permission @@ -8113,19 +8185,18 @@ CLASS="COMMAND" >follow symlinks (S)>follow symlinks (S)

        This parameter allows the Samba administrator - to stop smbd(8) - from following symbolic links in a particular share. Setting this + to stop smbd(8) from following symbolic + links in a particular share. Setting this parameter to noforce create mode (S)>force create mode (S)

        This parameter specifies a set of UNIX mode bit - permissions that will always be set on a file created by Samba. This is done by bitwise 'OR'ing these bits onto the mode bits of a file that is being created or having its @@ -8214,13 +8288,16 @@ CLASS="COMMAND" >force directory mode (S)>force directory mode (S)

        This parameter specifies a set of UNIX mode bit - permissions that will always be set on a directory created by Samba. This is done by bitwise 'OR'ing these bits onto the mode bits of a directory that is being created. The default for this @@ -8273,7 +8350,7 @@ CLASS="COMMAND" >force directory security mode (S)>force directory security mode (S)

        This parameter controls what UNIX permission bits @@ -8290,9 +8367,12 @@ NAME="FORCEDIRECTORYSECURITYMODE" allows a user to modify all the user/group/world permissions on a directory without restrictions.

        Note that users who can access the Samba server through other means can easily bypass this restriction, so it is primarily useful for standalone "appliance" systems. @@ -8341,7 +8421,7 @@ CLASS="COMMAND" >force group (S)>force group (S)

        This specifies a UNIX group name that will be @@ -8402,9 +8482,12 @@ CLASS="PARAMETER" >.

        Default: Default: no forced group

        Example: force security mode (S)>force security mode (S)

        This parameter controls what UNIX permission @@ -8434,9 +8517,12 @@ NAME="FORCESECURITYMODE" and allows a user to modify all the user/group/world permissions on a file, with no restrictions.

        Note that users who can access the Samba server through other means can easily bypass this restriction, so it is primarily useful for standalone "appliance" systems. @@ -8485,7 +8571,7 @@ CLASS="COMMAND" >force user (S)>force user (S)

        This specifies a UNIX user name that will be @@ -8515,9 +8601,12 @@ CLASS="PARAMETER" >

        Default: Default: no forced user

        Example: fstype (S)>fstype (S)

        This parameter allows the administrator to configure the string that specifies the type of filesystem a share - is using that is reported by smbd(8) - smbd(8) when a client queries the filesystem type for a share. The default type is getwd cache (G)>getwd cache (G)

        This is a tuning option. When this is enabled a @@ -8600,7 +8687,7 @@ CLASS="COMMAND" >group (S)>group (S)

        Synonym for guest account (S)>guest account (S)

        This is a username which will be used for access @@ -8656,10 +8743,13 @@ CLASS="COMMAND" many parts of the system require this value to be constant for correct operation.

        Default: Default: specified at compile time, usually "nobody"

        Example: guest ok (S)>guest ok (S)

        If this parameter is .

        See the section below on This paramater nullifies the benifits of setting + restrict + anonymous = 2

        See the section below on guest only (S)>guest only (S)

        If this parameter is hide dot files (S)>hide dot files (S)

        This is a boolean parameter that controls whether @@ -8762,7 +8864,7 @@ CLASS="COMMAND" >hide files(S)>hide files(S)

        This is a list of files or directories that are not @@ -8811,9 +8913,12 @@ CLASS="PARAMETER" >.

        Default: Default: no file are hidden

        Example: hide local users(G)>hide local users(G)

        This parameter toggles the hiding of local UNIX @@ -8850,7 +8955,7 @@ CLASS="COMMAND" >hide unreadable (G)>hide unreadable (G)

        This parameter prevents clients from seeing the @@ -8865,7 +8970,7 @@ CLASS="COMMAND" >hide unwriteable files (G)>hide unwriteable files (G)

        This parameter prevents clients from seeing @@ -8882,7 +8987,7 @@ CLASS="COMMAND" >hide special files (G)>hide special files (G)

        This parameter prevents clients from seeing @@ -8899,7 +9004,7 @@ CLASS="COMMAND" >homedir map (G)>homedir map (G)

        If is yes, and smbd(8), and smbd(8) is also acting as a Win95/98

        NOTE :A working NIS client is required on the system for this option to work.

        Default: homedir map = <empty string>homedir map = <empty string>

        Example: host msdfs (G)>host msdfs (G)

        This boolean parameter is only available @@ -9022,7 +9129,7 @@ CLASS="COMMAND" >hostname lookups (G)>hostname lookups (G)

        Specifies whether samba should use (expensive) @@ -9051,7 +9158,7 @@ CLASS="COMMAND" >hosts allow (S)>hosts allow (S)

        A synonym for this parameter is

        You can also specify hosts by network/netmask pairs and by netgroup names if your system supports netgroups. The - EXCEPT keyword can also be used to limit a wildcard list. The following examples may provide some help:

        Note that access still requires suitable user-level passwords.

        See testparm(1) - for a way of testing your host access to see if it does - what you expect.

        See testparm(1) for a way of testing your host access + to see if it does what you expect.

        Default: Default: none (i.e., all hosts permitted access)

        Example: hosts deny (S)>hosts deny (S)

        The opposite of hosts allow - - hosts listed here are NOT permitted access to services unless the specific services have their own lists to override this one. Where the lists conflict, the list takes precedence.

        Default: Default: none (i.e., no hosts specifically excluded)

        Example: hosts equiv (G)>hosts equiv (G)

        If this global parameter is a non-null string, @@ -9228,9 +9345,12 @@ CLASS="PARAMETER" > may be useful for NT clients which will not supply passwords to Samba.

        NOTE : The use of option be only used if you really know what you are doing, or perhaps on a home network where you trust - your spouse and kids. And only if you really trust them :-).

        Default: Default: no host equivalences

        Example: include (G)>include (G)

        This allows you to include one config file @@ -9293,9 +9419,12 @@ CLASS="PARAMETER" >.

        Default: Default: no file included

        Example: inherit acls (S)>inherit acls (S)

        This parameter can be used to ensure @@ -9330,7 +9459,7 @@ CLASS="COMMAND" >inherit permissions (S)>inherit permissions (S)

        The permissions on new files and directories @@ -9405,9 +9534,12 @@ CLASS="PARAMETER" as usual.

        Note that the setuid bit is Note that the setuid bit is never set via inheritance (the code explicitly prohibits this).

        interfaces (G)>interfaces (G)

        This option allows you to override the default @@ -9527,23 +9659,29 @@ CLASS="PARAMETER" >.

        Default: Default: all active interfaces except 127.0.0.1 that are broadcast capable

        invalid users (S)
        >invalid users (S)

        This is a list of users that should not be allowed - to login to this service. This is really a paranoid check to absolutely ensure an improper setting does not breach your security.

        A name starting with '+' is interpreted only by looking in the UNIX group database. A name starting with - '&' is interpreted only by looking in the NIS netgroup database + '&' is interpreted only by looking in the NIS netgroup database (this requires NIS to be working on your system). The characters - '+' and '&' may be used at the start of the name in either order + '+' and '&' may be used at the start of the name in either order so the value +&group+&group means check the UNIX group database, followed by the NIS netgroup database, and the value &+group&+group means check the NIS netgroup database, followed by the UNIX group database (the @@ -9592,9 +9730,12 @@ CLASS="PARAMETER" >.

        Default: Default: no invalid users

        Example: keepalive (G)>keepalive (G)

        The value of the parameter (an integer) represents @@ -9647,7 +9788,7 @@ CLASS="COMMAND" >kernel oplocks (G)>kernel oplocks (G)

        For UNIXes that support kernel based to be broken whenever a local UNIX process or NFS operation - accesses a file that smbd(8) - has oplocked. This allows complete data consistency between - SMB/CIFS, NFS and local file access (and is a smbd(8) has oplocked. This allows complete + data consistency between SMB/CIFS, NFS and local file access (and is + a very - cool feature :-).

        cool feature :-).

        This parameter defaults to lanman auth (G)>lanman auth (G)

        This parameter determines whether or not smbd will - attempt to authenticate users using the LANMAN password hash. - If disabled, only clients which support NT password hashes (e.g. Windows - NT/2000 clients, smbclient, etc... but not Windows 95/98 or the MS DOS - network client) will be able to connect to the Samba host.

        This parameter determines whether or not smbd(8) will attempt to authenticate users + using the LANMAN password hash. If disabled, only clients which support NT + password hashes (e.g. Windows NT/2000 clients, smbclient, etc... but not + Windows 95/98 or the MS DOS network client) will be able to connect to the Samba host.

        Default : large readwrite (G)>large readwrite (G)

        This parameter determines whether or not smbd - supports the new 64k streaming read and write varient SMB requests introduced +>This parameter determines whether or not smbd(8) supports the new 64k streaming + read and write varient SMB requests introduced with Windows 2000. Note that due to Windows 2000 client redirector bugs this requires Samba to be running on a 64-bit capable operating system such as IRIX, Solaris or a Linux 2.4 kernel. Can improve performance by 10% with @@ -9767,7 +9912,7 @@ CLASS="COMMAND" >ldap admin dn (G)>ldap admin dn (G)

        The private/secrets.tdb file. See the - smbpasswd(8) man - page for more information on how to accmplish this. + smbpasswd(8) man page for more information on how + to accmplish this.

        Default : Default : none

        ldap filter (G)
        >ldap filter (G)

        This parameter specifies the RFC 2254 compliant LDAP search filter. @@ -9825,14 +9972,14 @@ CLASS="CONSTANT" >

        Default : ldap filter = (&(uid=%u)(objectclass=sambaAccount))ldap filter = (&(uid=%u)(objectclass=sambaAccount))

        ldap port (G)
        >ldap port (G)

        This parameter is only available if Samba has been @@ -9876,7 +10023,7 @@ CLASS="COMMAND" >ldap server (G)>ldap server (G)

        This parameter is only available if Samba has been @@ -9900,14 +10047,17 @@ CLASS="COMMAND" >ldap ssl (G)>ldap ssl (G)

        This option is used to define whether or not Samba should use SSL when connecting to the ldap server - This is NOT related to Samba's previous SSL support which was enabled by specifying the ldap suffix (G)>ldap suffix (G)

        Specifies where user and machine accounts are added to the tree. Can be overriden by ldap machine suffix. It also used as the base dn for all ldap searches.

        Default : Default : none

        ldap user suffix (G)
        >ldap user suffix (G)

        It specifies where users are added to the tree.

        Default : Default : none

        ldap machine suffix (G)
        >ldap machine suffix (G)

        It specifies where machines should be added to the ldap tree.

        Default : Default : none

        ldap passwd sync (G)
        >ldap passwd sync (G)

        This option is used to define whether @@ -10098,7 +10257,7 @@ CLASS="COMMAND" >ldap trust ids (G)>ldap trust ids (G)

        Normally, Samba validates each entry @@ -10127,7 +10286,7 @@ CLASS="COMMAND" >level2 oplocks (S)>level2 oplocks (S)

        This parameter controls whether Samba supports @@ -10211,16 +10370,15 @@ CLASS="COMMAND" >lm announce (G)>lm announce (G)

        This parameter determines if nmbd(8)This parameter determines if nmbd(8) will produce Lanman announce broadcasts that are needed by OS/2 clients in order for them to see the Samba server in their browse list. This parameter can have three @@ -10291,7 +10449,7 @@ CLASS="COMMAND" >lm interval (G)>lm interval (G)

        If Samba is set to produce Lanman announce @@ -10339,13 +10497,13 @@ CLASS="COMMAND" >load printers (G)>load printers (G)

        A boolean variable that controls whether all printers in the printcap will be loaded for browsing by default. See the printers section for more details.

        local master (G)>local master (G)

        This option allows nmbd(8)This option allows nmbd(8) to try and become a local master browser on a subnet. If set to yes doesn't - mean that Samba will become the local master browser on a subnet, just that nmbd will will participate in elections for local master browser.

        Setting this value to nmbd - never to become a local master browser.

        Default: lock dir (G)>lock dir (G)

        Synonym for lock directory (G)>lock directory (G)

        This option specifies the directory where lock @@ -10466,7 +10632,7 @@ CLASS="COMMAND" >lock spin count (G)>lock spin count (G)

        This parameter controls the number of times @@ -10489,7 +10655,7 @@ CLASS="COMMAND" >lock spin time (G)>lock spin time (G)

        The time in microseconds that smbd should @@ -10516,7 +10682,7 @@ CLASS="COMMAND" >locking (S)>locking (S)

        This controls whether or not locking will be @@ -10536,13 +10702,19 @@ CLASS="COMMAND" >, real locking will be performed by the server.

        This option This option may be useful for read-only - filesystems which may not need locking (such as CDROM drives), although setting this parameter of log file (G)>log file (G)

        This option allows you to override the name @@ -10582,7 +10754,7 @@ CLASS="COMMAND" >log level (G)>log level (G)

        The value of the parameter (a astring) allows @@ -10608,7 +10780,7 @@ CLASS="COMMAND" >logon drive (G)>logon drive (G)

        This parameter specifies the local path to @@ -10640,7 +10812,7 @@ CLASS="COMMAND" >logon home (G)>logon home (G)

        This parameter specifies the home directory @@ -10721,7 +10893,7 @@ CLASS="COMMAND" >logon path (G)>logon path (G)

        This parameter specifies the home directory @@ -10767,9 +10939,12 @@ CLASS="FILENAME" >Thereafter, the directories and any of the contents can, if required, be made read-only. It is not advisable that the NTuser.dat file be made read-only - rename it to NTuser.man to - achieve the desired effect (a MANdatory profile).

        logon script (G)>logon script (G)

        This parameter specifies the batch file (.bat) or @@ -10859,9 +11034,12 @@ CLASS="COMMAND" >This option is only useful if Samba is set up as a logon server.

        Default: Default: no logon script defined

        Example: lppause command (S)>lppause command (S)

        This parameter specifies the command to be @@ -10971,7 +11149,7 @@ CLASS="COMMAND" >lpq cache time (G)>lpq cache time (G)

        This controls how long lpq info will be cached @@ -11036,7 +11214,7 @@ CLASS="COMMAND" >lpq command (S)>lpq command (S)

        This parameter specifies the command to be @@ -11106,7 +11284,9 @@ CLASS="PARAMETER" > parameter.

        Default: Default: depends on the setting of printing

        Example: lpresume command (S)>lpresume command (S)

        This parameter specifies the command to be @@ -11222,7 +11403,7 @@ CLASS="COMMAND" >lprm command (S)>lprm command (S)

        This parameter specifies the command to be @@ -11265,7 +11446,9 @@ CLASS="PARAMETER" > parameter.

        Default: Default: depends on the setting of

        Example 1: machine password timeout (G)>machine password timeout (G)

        If a Samba server is a member of a Windows @@ -11313,14 +11497,12 @@ CLASS="FILENAME" will be changed, in seconds. The default is one week (expressed in seconds), the same as a Windows NT Domain member server.

        See also smbpasswd(8) - See also smbpasswd(8), and the security = domainmagic output (S)>magic output (S)

        This parameter specifies the name of a file @@ -11362,7 +11544,7 @@ CLASS="PARAMETER" >

        Default: magic output = <magic script name>.out +>magic output = <magic script name>.out

        magic script (S)>magic script (S)

        This parameter specifies the name of a file which, @@ -11401,24 +11583,36 @@ CLASS="PARAMETER" >Note that some shells are unable to interpret scripts containing CR/LF instead of CR as the end-of-line marker. Magic scripts must be executable - as is on the host, which for some hosts and some shells will require filtering at the DOS end.

        Magic scripts are Magic scripts are EXPERIMENTAL and - should NOT be relied upon.

        Default: Default: None. Magic scripts disabled.

        Example: mangle case (S)>mangle case (S)

        See the section on NAME MANGLING

        mangled map (S)>mangled map (S)

        This is for those who want to directly map UNIX @@ -11485,9 +11679,12 @@ CLASS="FILENAME" > off the ends of filenames on some CDROMs (only visible under some UNIXes). To do this use a map of (*;1 *;).

        Default: Default: no mangled map

        Example: mangled names (S)>mangled names (S)

        This controls whether non-DOS names under UNIX @@ -11507,7 +11704,7 @@ NAME="MANGLEDNAMES" or whether non-DOS names should simply be ignored.

        See the section on NAME MANGLING for details on how to control the mangling process.

        mangling method (G)>mangling method (G)

        controls the algorithm used for the generating @@ -11610,7 +11807,7 @@ CLASS="COMMAND" >mangle prefix (G)>mangle prefix (G)

        controls the number of prefix @@ -11633,14 +11830,16 @@ CLASS="COMMAND" >mangled stack (G)>mangled stack (G)

        This parameter controls the number of mangled names - that should be cached in the Samba server smbd(8)smbd(8).

        This stack is a list of recently mangled base names @@ -11670,15 +11869,18 @@ CLASS="COMMAND" >mangling char (S)>mangling char (S)

        This controls what character is used as - the magic character in name mangling. The default is a '~' but this may interfere with some software. Use this option to set @@ -11698,7 +11900,7 @@ CLASS="COMMAND" >map archive (S)>map archive (S)

        This controls whether the DOS archive attribute @@ -11734,7 +11936,7 @@ CLASS="COMMAND" >map hidden (S)>map hidden (S)

        This controls whether DOS style hidden files @@ -11766,7 +11968,7 @@ CLASS="COMMAND" >map system (S)>map system (S)

        This controls whether DOS style system files @@ -11798,7 +12000,7 @@ CLASS="COMMAND" >map to guest (G)>map to guest (G)

        This parameter is only useful in .

        This parameter can take three different values, which tell - smbd(8)smbd(8) what to do with user login requests that don't match a valid UNIX user in some way.

        hate you if you set the modes other than share. This is because in these modes the name of the resource being - requested is not sent to the server until after the server has successfully authenticated the client so the server cannot make authentication decisions at the correct time (connection @@ -11926,7 +12136,7 @@ CLASS="COMMAND" >max connections (S)>max connections (S)

        This option allows the number of simultaneous @@ -11966,7 +12176,7 @@ CLASS="COMMAND" >max disk size (G)>max disk size (G)

        This option allows you to put an upper limit @@ -12011,7 +12221,7 @@ CLASS="COMMAND" >max log size (G)>max log size (G)

        This option (an integer in kilobytes) specifies @@ -12038,7 +12248,7 @@ CLASS="COMMAND" >max mux (G)>max mux (G)

        This option controls the maximum number of @@ -12054,14 +12264,16 @@ CLASS="COMMAND" >max open files (G)>max open files (G)

        This parameter limits the maximum number of - open files that one smbd(8)smbd(8) file serving process may have open for a client at any one time. The default for this parameter is set very high (10,000) as Samba uses @@ -12080,18 +12292,17 @@ CLASS="COMMAND" >max print jobs (S)>max print jobs (S)

        This parameter limits the maximum number of jobs allowable in a Samba printer queue at any given moment. - If this number is exceeded, smbd(8)smbd(8) will remote "Out of Space" to the client. See all max protocol (G)>max protocol (G)

        The value of the parameter (a string) is the highest @@ -12150,9 +12361,12 @@ CLASS="CONSTANT" >LANMAN1: First : First modern version of the protocol. Long filename support.

        max smbd processes (G)>max smbd processes (G)

        This parameter limits the maximum number of @@ -12219,10 +12433,12 @@ CLASS="COMMAND" as a stopgap to prevent degrading service to clients in the event that the server has insufficient resources to handle more than this number of connections. Remember that under normal operating - conditions, each user will have an smbdsmbd(8) associated with him or her to handle connections to all shares from a given host.

        max ttl (G)>max ttl (G)

        This option tells nmbd(8)This option tells nmbd(8) what the default 'time to live' of NetBIOS names should be (in seconds) when max wins ttl (G)>max wins ttl (G)

        This option tells nmbd(8) - This option tells smbd(8) when acting as a WINS server ( max xmit (G)>max xmit (G)

        This option controls the maximum packet size @@ -12333,7 +12552,7 @@ CLASS="COMMAND" >message command (G)>message command (G)

        This specifies what command to run when the @@ -12347,7 +12566,7 @@ NAME="MESSAGECOMMAND" >

        message command = csh -c 'xedit %s;rm %s' &message command = csh -c 'xedit %s;rm %s' &

        xedit, then - removes it afterwards. NOTE THAT IT IS VERY IMPORTANT THAT THIS COMMAND RETURN IMMEDIATELY. That's why I - have the '&' on the end. If it doesn't return immediately then + have the '&' on the end. If it doesn't return immediately then your PCs may freeze when sending messages (they should recover after 30 seconds, hopefully).

        message command = /bin/mail -s 'message from %f on - %m' root < %s; rm %s

        If you don't have a message command then the message @@ -12440,22 +12662,25 @@ CLASS="COMMAND" >message command = rm %s

        Default: Default: no message command

        Example: message command = csh -c 'xedit %s; - rm %s' &

        min passwd length (G)
        >min passwd length (G)

        Synonym for min password length (G)>min password length (G)

        This option sets the minimum length in characters @@ -12519,7 +12744,7 @@ CLASS="COMMAND" >min print space (S)>min print space (S)

        This sets the minimum amount of free disk @@ -12552,7 +12777,7 @@ CLASS="COMMAND" >min protocol (G)>min protocol (G)

        The value of the parameter (a string) is the @@ -12602,13 +12827,15 @@ CLASS="COMMAND" >min wins ttl (G)>min wins ttl (G)

        This option tells nmbd(8)This option tells nmbd(8) when acting as a WINS server (msdfs proxy (S)>msdfs proxy (S)

        This boolean parameter is only available if @@ -12691,15 +12918,15 @@ CLASS="CONSTANT" Dfs links are specified in the share directory by symbolic links of the form msdfs:serverA\shareA,serverB\shareBmsdfs:serverA\\shareA,serverB\\shareB and so on. For more information on setting up a Dfs tree on Samba, refer to msdfs_setup.html - .

        "Hosting a Microsoft + Distributed File System tree on Samba" document.

        See also name cache timeout (G)>name cache timeout (G)

        Specifies the number of seconds it takes before @@ -12743,7 +12970,7 @@ CLASS="COMMAND" >name resolve order (G)>name resolve order (G)

        This option is used by the programs in the Samba @@ -12848,7 +13075,7 @@ CLASS="COMMAND" >netbios aliases (G)>netbios aliases (G)

        This is a list of NetBIOS names that .

        Default: Default: empty string (no additional names)

        Example: netbios name (G)>netbios name (G)

        This sets the NetBIOS name by which a Samba @@ -12909,9 +13139,12 @@ CLASS="PARAMETER" >.

        Default: Default: machine DNS name

        Example: netbios scope (G)>netbios scope (G)

        This sets the NetBIOS scope that Samba will @@ -12934,7 +13167,7 @@ NAME="NETBIOSSCOPE" >nis homedir (G)>nis homedir (G)

        Get the home share server from a NIS map. For @@ -12978,7 +13211,7 @@ CLASS="COMMAND" >non unix account range (G)>non unix account range (G)

        The non unix account range parameter specifies @@ -12996,7 +13229,7 @@ NAME="NONUNIXACCOUNTRANGE" >

        Default: non unix account range = <empty string> +>non unix account range = <empty string>

        nt acl support (S)>nt acl support (S)

        This boolean parameter controls whether @@ -13031,14 +13264,16 @@ CLASS="COMMAND" >nt pipe support (G)>nt pipe support (G)

        This boolean parameter controls whether - smbd(8)smbd(8) will allow Windows NT clients to connect to the NT SMB specific nt status support (G)>nt status support (G)

        This boolean parameter controls whether null passwords (G)>null passwords (G)

        Allow or disallow client access to accounts that have null passwords.

        See also smbpasswd (5)See also smbpasswd(5).

        Default: obey pam restrictions (G)>obey pam restrictions (G)

        When Samba 2.2 is configured to enable PAM support @@ -13135,7 +13372,7 @@ CLASS="COMMAND" >only user (S)>only user (S)

        This is a boolean option that controls whether @@ -13195,7 +13432,7 @@ CLASS="COMMAND" >only guest (S)>only guest (S)

        A synonym for oplock break wait time (G)>oplock break wait time (G)

        This is a tuning parameter added due to bugs in @@ -13223,10 +13460,13 @@ NAME="OPLOCKBREAKWAITTIME" is the amount of time Samba will wait before sending an oplock break request to such (broken) clients.

        DO NOT CHANGE THIS PARAMETER UNLESS YOU HAVE READ AND UNDERSTOOD THE SAMBA OPLOCK CODE.

        Default: oplock contention limit (S)>oplock contention limit (S)

        This is a This is a very advanced

        In brief it specifies a number, which causes smbd not to - grant an oplock even when requested if the approximate number of - clients contending for an oplock on the same file goes over this +>In brief it specifies a number, which causes smbd(8)not to grant an oplock even when requested + if the approximate number of clients contending for an oplock on the same file goes over this limit. This causes smbd to behave in a similar way to Windows NT.

        DO NOT CHANGE THIS PARAMETER UNLESS YOU HAVE READ AND UNDERSTOOD THE SAMBA OPLOCK CODE.

        Default: oplocks (S)>oplocks (S)

        This boolean option tells ntlm auth (G)>ntlm auth (G)

        This parameter determines whether or not smbdThis parameter determines + whether or not smbd(8) will attempt to authenticate users using the NTLM password hash. If disabled, only the lanman password hashes will be used. @@ -13366,7 +13616,8 @@ TARGET="_top" >Please note that at least this option or lanman auth should be enabled in order to be able to log in. +> should + be enabled in order to be able to log in.

        Default : os level (G)>os level (G)

        This integer value controls what level Samba advertises itself as for browse elections. The value of this - parameter determines whether nmbd(8)nmbd(8) has a chance of becoming a local master browser for the in the local broadcast area.

        Note :By default, Samba will win a local master browsing election over all Microsoft operating systems except a Windows NT 4.0/2000 Domain Controller. This @@ -13426,15 +13682,15 @@ CLASS="COMMAND" >os2 driver map (G)>os2 driver map (G)

        The parameter is used to define the absolute path to a file containing a mapping of Windows NT printer driver names to OS/2 printer driver names. The format is:

        <nt driver name> = <os2 driver - name>.<device name>

        <nt driver name> = <os2 driver + name>.<device name>

        For example, a valid entry using the HP LaserJet 5 printer driver would appear as

        The need for the file is due to the printer driver namespace problem described in the Samba Printing HOWTO. For more details on OS/2 clients, please - refer to the OS2-Client-HOWTO - containing in the Samba documentation.

        Default: os2 driver map = <empty string> +>os2 driver map = <empty string>

        pam password change (G)>pam password change (G)

        With the addition of better PAM support in Samba 2.2, @@ -13505,25 +13756,28 @@ CLASS="COMMAND" >panic action (G)>panic action (G)

        This is a Samba developer option that allows a - system command to be called when either smbd(8) or nmbd(8) - crashes. This is usually used to draw attention to the fact that - a problem occurred.

        smbd(8) or smbd(8) crashes. This is usually used to + draw attention to the fact that a problem occurred.

        Default: panic action = <empty string>panic action = <empty string>

        Example: paranoid server security (G)>paranoid server security (G)

        Some version of NT 4.x allow non-guest users with a bad passowrd. When this option is enabled, samba will not use a broken NT 4.x server as password server, but instead complain - to the logs and exit. + to the logs and exit.

        Disabling this option prevents Samba from making + this check, which involves deliberatly attempting a + bad logon to the remote server.

        Default: paranoid server security = yespassdb backend (G)>passdb backend (G)

        This option allows the administrator to chose which backends to retrieve and store passwords with. This allows (for example) both @@ -13765,23 +14023,30 @@ CLASS="COMMAND" >passwd chat (G)>passwd chat (G)

        This parameter indicates that the share is a @@ -12668,14 +12895,14 @@ CLASS="PARAMETER" >

        Example: msdfs proxy = \otherserver\somesharemsdfs proxy = \\\\otherserver\\someshare

        msdfs root (S)
        >msdfs root (S)

        This string controls the This string controls the "chat" - conversation that takes places between smbdsmbd(8) and the local password changing program to change the user's password. The string describes a - sequence of response-receive pairs that smbd(8)smbd(8) uses to determine what to send to the yes. This - sequence is then called AS ROOT when the SMB password in the smbpasswd file is being changed, without access to the old password cleartext. This means that root must be able to reset the user's password @@ -13835,16 +14103,16 @@ CLASS="PARAMETER" for the new password. The chat sequence can also contain the standard macros \n\\n, \r\\r, \t \\t and \s\\s to give line-feed, carriage-return, tab and space. The chat sequence string can also contain a '*' which matches any sequence of characters. @@ -13909,14 +14177,14 @@ CLASS="PARAMETER" >

        Default: passwd chat = *new*password* %n\n - *new*password* %n\n *changed*passwd chat = *new*password* %n\\n + *new*password* %n\\n *changed*

        Example: passwd chat = "*Enter OLD password*" %o\n - "*Enter NEW password*" %n\n "*Reenter NEW password*" %n\n "*Password +>passwd chat = "*Enter OLD password*" %o\\n + "*Enter NEW password*" %n\\n "*Reenter NEW password*" %n\\n "*Password changed*"

        passwd chat debug (G)>passwd chat debug (G)

        This boolean specifies if the passwd chat script - parameter is run in debug mode. In this mode the strings passed to and received from the passwd chat are printed - in the smbd(8)smbd(8) log with a passwd program (G)>passwd program (G)

        By specifying the name of another SMB server (such @@ -14216,15 +14504,21 @@ CLASS="PARAMETER" the "LM1.2X002" or the "NT LM 0.12" protocol, and it must be in user level security mode.

        NOTE: Using a password server means your UNIX box (running Samba) is only as secure as your - password server. DO NOT CHOOSE A PASSWORD SERVER THAT YOU DON'T COMPLETELY TRUST.

        Never point a Samba server at itself for password @@ -14281,7 +14575,7 @@ CLASS="PARAMETER" Primary or Backup Domain controllers to authenticate against by doing a query for the name WORKGROUP<1C>WORKGROUP<1C> and then contacting each server returned in the list of IP addresses from the name resolution source.

        Default: password server = <empty string>password server = <empty string>

        path (S)>path (S)

        This parameter specifies a directory to which @@ -14419,9 +14713,12 @@ CLASS="PARAMETER" > if one was specified.

        Default: Default: none

        Example: pid directory (G)>pid directory (G)

        This option specifies the directory where pid @@ -14454,16 +14751,15 @@ CLASS="COMMAND" >posix locking (S)>posix locking (S)

        The smbd(8)The smbd(8) daemon maintains an database of file locks obtained by SMB clients. The default behavior is to map this internal database to POSIX @@ -14481,7 +14777,7 @@ CLASS="COMMAND" >postexec (S)>postexec (S)

        This option specifies a command to be run @@ -14508,23 +14804,26 @@ CLASS="PARAMETER" .

        Default: Default: none (no command executed)

        Example: postexec = echo \"%u disconnected from %S - from %m (%I)\" >> /tmp/log

        postscript (S)
        >postscript (S)

        This parameter forces a printer to interpret @@ -14547,7 +14846,7 @@ CLASS="COMMAND" >preexec (S)>preexec (S)

        This option specifies a command to be run whenever @@ -14560,7 +14859,7 @@ NAME="PREEXEC" >preexec = csh -c 'echo \"Welcome to %S!\" | - /usr/local/samba/bin/smbclient -M %m -I %I' &

        Of course, this could get annoying after a while :-)

        .

        Default: Default: none (no command executed)

        Example: preexec = echo \"%u connected to %S from %m - (%I)\" >> /tmp/log

        preexec close (S)
        >preexec close (S)

        This boolean option controls whether a non-zero @@ -14624,7 +14926,7 @@ CLASS="COMMAND" >preferred master (G)>preferred master (G)

        This boolean parameter controls if prefered master (G)>prefered master (G)

        Synonym for preload (G)>preload (G)

        This is a list of services that you want to be @@ -14722,9 +15024,12 @@ CLASS="PARAMETER" > option is easier.

        Default: Default: no preloaded services

        Example: preserve case (S)>preserve case (S)

        This controls if new filenames are created @@ -14758,7 +15063,7 @@ CLASS="COMMAND" >

        See the section on NAME MANGLING for a fuller discussion.

        print command (S)>print command (S)

        After a print job has finished spooling to @@ -14800,9 +15105,12 @@ CLASS="COMMAND" >%z - the size of the spooled print job (in bytes)

        The print command The print command MUST contain at least one occurrence of

        print command = echo Printing %s >> +>print command = echo Printing %s >> /tmp/print.log; lpr -P %p %s; rm %s

        print ok (S)>print ok (S)

        Synonym for printable (S)>printable (S)

        If this parameter is printcap (G)>printcap (G)

        Synonym for printcap name (G)>printcap name (G)

        This parameter may be used to override the @@ -15011,7 +15319,7 @@ NAME="PRINTCAPNAME" CLASS="FILENAME" > /etc/printcap). See the discussion of the [printers] section above for reasons why you might want to do this.

        A minimal printcap file would look something like this:

        		print1|My Printer 1
        -		print2|My Printer 2
        -		print3|My Printer 3
        -		print4|My Printer 4
        -		print5|My Printer 5
        -		
        print1|My Printer 1 +print2|My Printer 2 +print3|My Printer 3 +print4|My Printer 4 +print5|My Printer 5

        where the '|' separates aliases of a printer. The fact that the second alias has a space in it gives a hint to Samba that it's a comment.

        NOTE: Under AIX the default printcap name is printer admin (S)>printer admin (S)

        This is a list of users that can do anything to @@ -15124,7 +15425,7 @@ NAME="PRINTERADMIN" >

        Default: printer admin = <empty string>printer admin = <empty string>

        printer driver (S)>printer driver (S)

        Note :This is a deprecated parameter and will be removed in the next major release following version 2.2. Please see the instructions in the Samba 2.2. Printing HOWTOprinter driver file (G)>printer driver file (G)

        Note :This is a deprecated parameter and will be removed in the next major release following version 2.2. Please see the instructions in the Samba 2.2. Printing HOWTO.

        Default: Default: None (set in compile).

        Example: printer driver location (S)>printer driver location (S)

        Note :This is a deprecated parameter and will be removed in the next major release following version 2.2. Please see the instructions in the Samba 2.2. Printing HOWTOprinter name (S)>printer name (S)

        This parameter specifies the name of the printer @@ -15343,13 +15656,16 @@ NAME="PRINTERNAME" name given will be used for any printable service that does not have its own printer name specified.

        Default: Default: none (but may be lp on many systems)

        Example: printer (S)>printer (S)

        Synonym for printing (S)>printing (S)

        This parameters controls how printer status @@ -15458,7 +15774,7 @@ TARGET="_top" >This option can be set on a per printer basis

        See also the discussion in the [printers] section.

        private dir (G)>private dir (G)

        This parameters defines the directory @@ -15489,7 +15805,7 @@ CLASS="COMMAND" >protocol (G)>protocol (G)

        Synonym for public (S)>public (S)

        Synonym for queuepause command (S)>queuepause command (S)

        This parameter specifies the command to be @@ -15551,7 +15867,9 @@ CLASS="PARAMETER" path in the command as the PATH may not be available to the server.

        Default: Default: depends on the setting of

        Example: queueresume command (S)>queueresume command (S)

        This parameter specifies the command to be @@ -15608,7 +15927,9 @@ CLASS="PARAMETER" path in the command as the PATH may not be available to the server.

        Default: Default: depends on the setting of

        read bmpx (G)>read bmpx (G)

        This boolean parameter controls whether read list (S)>read list (S)

        This is a list of users that are given read-only @@ -15702,7 +16024,7 @@ CLASS="PARAMETER" >

        Default: read list = <empty string>read list = <empty string>

        Example: read only (S)>read only (S)

        An inverted synonym is printable = yes) - will ALWAYS allow writing to the directory (user privileges permitting), but only via spooling operations.

        read raw (G)>read raw (G)

        This parameter controls whether or not the server @@ -15788,7 +16113,7 @@ CLASS="COMMAND" >read size (G)>read size (G)

        The option realm (G)>realm (G)

        This option specifies the kerberos realm to use. The realm is @@ -15854,7 +16179,7 @@ CLASS="COMMAND" >remote announce (G)>remote announce (G)

        This option allows you to setup

        See the documentation file BROWSING.txtSee the documentation file BROWSING in the

        Default: remote announce = <empty string> +>remote announce = <empty string>

        remote browse sync (G)>remote browse sync (G)

        This option allows you to setup

        Default: remote browse sync = <empty string> +>remote browse sync = <empty string>

        restrict anonymous (G)>restrict anonymous (G)

        This is a integer parameter, and @@ -15987,7 +16313,7 @@ CLASS="COMMAND" >root (G)>root (G)

        Synonym for root dir (G)>root dir (G)

        Synonym for root directory (G)>root directory (G)

        The server will root directory - option, including some files needed for complete operation of the server. To maintain full operability of the server you will need to mirror some system files @@ -16092,7 +16421,7 @@ CLASS="COMMAND" >root postexec (S)>root postexec (S)

        This is the same as the

        Default: root postexec = <empty string> +>root postexec = <empty string>

        root preexec (S)>root preexec (S)

        This is the same as the

        Default: root preexec = <empty string> +>root preexec = <empty string>

        root preexec close (S)>root preexec close (S)

        This is the same as the security (G)>security (G)

        This option affects how clients respond to @@ -16214,11 +16543,12 @@ CLASS="FILENAME" > file.

        The option sets the "security mode bit" in replies to - protocol negotiations with smbd(8) - smbd(8) to turn share level security on or off. Clients decide based on this bit whether (and how) to transfer user and password information to the server.

        It is possible to use smbd in a in a hybrid mode where it is offers both user and share level security under different >SECURITY = SHARE

        When clients connect to a share level security server they @@ -16333,9 +16669,12 @@ CLASS="COMMAND" >Note that smbd ALWAYS uses a valid UNIX user to act on behalf of the client, even in

      • If the client did a previous If the client did a previous logon request (the SessionSetup SMB call) then the username sent in this SMB will be added as a potential username.

        , then this guest user will be used, otherwise access is denied.

        Note that it can be Note that it can be very confusing in share-level security as to which UNIX username will eventually be used in granting access.

        See also the section NOTE ABOUT USERNAME/PASSWORD VALIDATION.

        >SECURITY = USER

        This is the default security setting in Samba 2.2. +>This is the default security setting in Samba 3.0. With user-level security a client must first "log-on" with a valid username and password (which can be mapped using the

        Note that the name of the resource being - requested is not sent to the server until after the server has successfully authenticated the client. This is why guest shares don't work in user level security without allowing @@ -16545,62 +16899,87 @@ CLASS="PARAMETER" > parameter for details on doing this.

        See also the section NOTE ABOUT USERNAME/PASSWORD VALIDATION.

        >SECURITY = SERVER +>SECURITY = DOMAIN +

        In this mode Samba will try to validate the username/password - by passing it to another SMB server, such as an NT box. If this - fails it will revert to security = user, but note - that if encrypted passwords have been negotiated then Samba cannot - revert back to checking the UNIX password file, it must have a valid - smbpasswd file to check users against. See the - documentation file in the docs/ directory - ENCRYPTION.txt for details on how to set this - up.

        This mode will only work correctly if net(8) has been used to add this + machine into a Windows NT Domain. It expects the encrypted passwords + parameter to be set to yes. In this + mode Samba will try to validate the username/password by passing + it to a Windows NT Primary or Backup Domain Controller, in exactly + the same way that a Windows NT Server would do.

        Note that from the client's point of - view that a valid UNIX user must still + exist as well as the account on the Domain Controller to allow + Samba to have a valid UNIX account to map file access to.

        Note that from the client's point + of view security = serversecurity = domain is the same as security = user. It only affects how the server deals - with the authentication, it does not in any way affect what the - client sees.

        security = user +
        . It only affects how the server deals with the authentication, + it does not in any way affect what the client sees.

        Note that the name of the resource being - requested is not sent to the server until after the server has successfully authenticated the client. This is why guest shares don't work in user level security without allowing @@ -16625,7 +17004,7 @@ CLASS="PARAMETER" > parameter for details on doing this.

        See also the section NOTE ABOUT USERNAME/PASSWORD VALIDATION.

        parameter.

        >SECURITY = DOMAIN +>SECURITY = SERVER

        This mode will only work correctly if smbpasswd(8) has been used to add this - machine into a Windows NT Domain. It expects the In this mode Samba will try to validate the username/password + by passing it to another SMB server, such as an NT box. If this + fails it will revert to security = + user. It expects the parameter to be set to parameter to be set to + yes. In this - mode Samba will try to validate the username/password by passing - it to a Windows NT Primary or Backup Domain Controller, in exactly - the same way that a Windows NT Server would do.

        , unless the remote server + does not support them. However note + that if encrypted passwords have been negotiated then Samba cannot + revert back to checking the UNIX password file, it must have a valid + smbpasswd file to check users against. See the + documentation file in the docs/ directory + ENCRYPTION.txt for details on how to set this + up.

        Note that a valid UNIX user must still - exist as well as the account on the Domain Controller to allow - Samba to have a valid UNIX account to map file access to.

        this mode of operation + has significant pitfalls, due to the fact that is + activly initiates a man-in-the-middle attack on the + remote SMB server. In particular, this mode of + operation can cause significant resource consuption on + the PDC, as it must maintain an active connection for + the duration of the user's session. Furthermore, if + this connection is lost, there is no way to + reestablish it, and futher authenticaions to the Samba + server may fail. (From a single client, till it + disconnects).

        Note that from the client's point - of view that from the client's point of + view security = domainsecurity = server is the same as security = user - . It only affects how the server deals with the authentication, - it does not in any way affect what the client sees.

        security = user
        . It only affects how the server deals + with the authentication, it does not in any way affect what the + client sees.

        Note that the name of the resource being - requested is not sent to the server until after the server has successfully authenticated the client. This is why guest shares don't work in user level security without allowing @@ -16731,22 +17148,8 @@ CLASS="PARAMETER" parameter for details on doing this.

        BUG: There is currently a bug in the - implementation of security = domain with respect - to multi-byte character set usernames. The communication with a - Domain Controller must be done in UNICODE and Samba currently - does not widen multi-byte user names to UNICODE correctly, thus - a multi-byte username will not be recognized correctly at the - Domain Controller. This issue will be addressed in a future release.

        See also the section NOTE ABOUT USERNAME/PASSWORD VALIDATION.

        security mask (S)>security mask (S)

        This parameter controls what UNIX permission @@ -16802,9 +17205,12 @@ NAME="SECURITYMASK" a user to modify all the user/group/world permissions on a file.

        Note that users who can access the Samba server through other means can easily bypass this restriction, so it is primarily useful for standalone @@ -16856,7 +17262,7 @@ CLASS="COMMAND" >server string (G)>server string (G)

        This controls what string will show up in the @@ -16901,7 +17307,7 @@ CLASS="COMMAND" >set directory (S)>set directory (S)

        If share modes (S)>share modes (S)

        This enables or disables the honoring of @@ -16971,9 +17377,12 @@ CLASS="CONSTANT" >This option gives full share compatibility and enabled by default.

        You should You should NEVER turn this parameter off as many Windows applications will break if you do so.

        short preserve case (S)>short preserve case (S)

        This boolean parameter controls if new files @@ -17012,7 +17421,7 @@ CLASS="COMMAND" names are lowered.

        See the section on NAME MANGLING.

        show add printer wizard (G)>show add printer wizard (G)

        With the introduction of MS-RPC based printing support @@ -17056,9 +17465,12 @@ CLASS="PARAMETER" > parameter will always cause the OpenPrinterEx() on the server - to fail. Thus the APW icon will never be displayed. Note :This does not prevent the same user from having administrative privilege on an individual printer.

        shutdown script (G)>shutdown script (G)

        This parameter only exists in the HEAD cvs branch This a full path name to a script called by %r will be substituted with the - switch -r. It means reboot after shutdown for NT.

        %f
        will be substituted with the - switch -f. It means force the shutdown even if applications do not respond for NT.

        Default: Default: None.

        Example:

        Shutdown script example: -
        		#!/bin/bash
        +>#!/bin/bash
         		
        -		$time=0
        -		let "time/60"
        -		let "time++"
        +$time=0
        +let "time/60"
        +let "time++"
         
        -		/sbin/shutdown $3 $4 +$time $1 &
        -		
        Shutdown does not return so we need to launch it in background.

        smb passwd file (G)>smb passwd file (G)

        This option sets the path to the encrypted @@ -17234,7 +17648,7 @@ CLASS="COMMAND" >smb ports (G)>smb ports (G)

        Specifies which ports the server should listen on @@ -17250,7 +17664,7 @@ CLASS="COMMAND" >socket address (G)>socket address (G)

        This option allows you to control what @@ -17271,7 +17685,7 @@ CLASS="COMMAND" >socket options (G)>socket options (G)

        This option allows you to set socket options @@ -17352,9 +17766,12 @@ TARGET="_top" >

      • The name of a program that can be used to set @@ -14027,18 +14300,24 @@ CLASS="PARAMETER" will be replaced with the user name. The user name is checked for existence before calling the password changing program.

        Also note that many passwd programs insist in Also note that many passwd programs insist in reasonable passwords, such as a minimum length, or the inclusion of mixed case chars and digits. This can pose a problem as some clients (such as Windows for Workgroups) uppercase the password before sending it.

        Note that if the yes then this program is called then this program is called AS ROOT before the SMB password in the unix password sync parameter - is set this parameter MUST USE ABSOLUTE PATHS - for ALL programs called, and must be examined for security implications. Note that by default password level (G)>password level (G)

        Some client/server combinations have difficulty @@ -14176,7 +14464,7 @@ CLASS="COMMAND" >password server (G)>password server (G)

      Those marked with a Those marked with a '*' take an integer argument. The others can optionally take a 1 or 0 argument to enable or disable the option, by default they will be enabled if you @@ -17402,7 +17819,7 @@ CLASS="COMMAND" >source environment (G)>source environment (G)

      This parameter causes Samba to set environment @@ -17426,9 +17843,12 @@ CLASS="COMMAND" >SAMBA_NETBIOS_NAME = myhostname

      Default: Default: No default value

      Examples: use spnego (G)>use spnego (G)

      This variable controls controls whether samba will try to use Simple and Protected NEGOciation (as specified by rfc2478) with WindowsXP and Windows2000sp2 clients to agree upon an authentication mechanism. As of samba 3.0alpha it must be set to "no" for these clients to join a samba domain controller. It can be set to "yes" to allow samba to participate in an AD domain controlled by a Windows2000 domain controller.

      This variable controls controls whether samba will try + to use Simple and Protected NEGOciation (as specified by rfc2478) with + WindowsXP and Windows2000sp2 clients to agree upon an authentication mechanism. + Unless further issues are discovered with our SPNEGO + implementation, there is no reason this should ever be + disabled.

      Default: Default: use spnego = yes

      stat cache (G)
      >stat cache (G)

      This parameter determines if smbd(8)This parameter determines if smbd(8) will use a cache in order to speed up case insensitive name mappings. You should never need to change this parameter.

      stat cache size (G)>stat cache size (G)

      This parameter determines the number of @@ -17502,7 +17932,7 @@ CLASS="COMMAND" >strict allocate (S)>strict allocate (S)

      This is a boolean that controls the handling of @@ -17539,7 +17969,7 @@ CLASS="COMMAND" >strict locking (S)>strict locking (S)

      This is a boolean that controls the handling of @@ -17572,7 +18002,7 @@ CLASS="COMMAND" >strict sync (S)>strict sync (S)

      Many Windows applications (including the Windows @@ -17585,10 +18015,12 @@ NAME="STRICTSYNC" CLASS="CONSTANT" >no (the - default) means that smbdsmbd(8) ignores the Windows applications requests for a sync call. There is only a possibility of losing data if the operating system itself that Samba is running on crashes, so there is @@ -17616,7 +18048,7 @@ CLASS="COMMAND" >strip dot (G)>strip dot (G)

      This is a boolean that controls whether to @@ -17632,7 +18064,7 @@ CLASS="COMMAND" >sync always (S)>sync always (S)

      This is a boolean parameter that controls @@ -17683,7 +18115,7 @@ CLASS="COMMAND" >syslog (G)>syslog (G)

      This parameter maps how Samba debug messages @@ -17718,7 +18150,7 @@ CLASS="COMMAND" >syslog only (G)>syslog only (G)

      If this parameter is set then Samba debug @@ -17734,7 +18166,7 @@ CLASS="COMMAND" >template homedir (G)>template homedir (G)

      When filling out the user information for a Windows NT @@ -17768,14 +18200,16 @@ CLASS="COMMAND" >template shell (G)>template shell (G)

      When filling out the user information for a Windows NT - user, the winbindd(8)winbindd(8) daemon uses this parameter to fill in the login shell for that user.

      time offset (G)>time offset (G)

      This parameter is a setting in minutes to add @@ -17810,14 +18244,15 @@ CLASS="COMMAND" >time server (G)>time server (G)

      This parameter determines if - nmbd(8)This parameter determines if nmbd(8) advertises itself as a time server to Windows clients.

      timestamp logs (G)>timestamp logs (G)

      Synonym for total print jobs (G)>total print jobs (G)

      This parameter accepts an integer value which defines a limit on the maximum number of print jobs that will be accepted system wide at any given time. If a print job is submitted - by a client which will exceed this number, then smbdsmbd(8) will return an error indicating that no space is available on the server. The default value of 0 means that no such limit exists. This parameter @@ -17887,7 +18324,7 @@ CLASS="COMMAND" >unicode (G)>unicode (G)

      Specifies whether Samba should try @@ -17904,7 +18341,7 @@ CLASS="COMMAND" >unix charset (G)>unix charset (G)

      Specifies the charset the unix machine @@ -17914,19 +18351,19 @@ NAME="UNIXCHARSET" >

      Default: unix charset = ASCIIunix charset = UTF8

      Example: unix charset = UTF8unix charset = ASCII

      unix extensions(G)
      >unix extensions(G)

      This boolean parameter controls whether Samba @@ -17945,7 +18382,7 @@ CLASS="COMMAND" >unix password sync (G)>unix password sync (G)

      This boolean parameter controls whether Samba @@ -17960,9 +18397,12 @@ CLASS="PARAMETER" >passwd programparameter is called parameter is called AS ROOT - to allow the new UNIX password to be set without access to the old UNIX password (as the SMB password change code has no @@ -17996,7 +18436,7 @@ CLASS="COMMAND" >update encrypted (G)>update encrypted (G)

      This boolean parameter allows a user logging @@ -18051,7 +18491,7 @@ CLASS="COMMAND" >use client driver (S)>use client driver (S)

      This parameter applies only to Windows NT/2000 @@ -18080,11 +18520,14 @@ CLASS="COMMAND" >If this parameter is enabled for a printer, then any attempt to open the printer with the PRINTER_ACCESS_ADMINISTER right is mapped to PRINTER_ACCESS_USE instead. Thus allowing the OpenPrinterEx() - call to succeed. This parameter MUST not be able enabled on a print share which has valid print driver installed on the Samba server.

      See also use mmap (G)>use mmap (G)

      This global parameter determines if the tdb internals of Samba can @@ -18126,7 +18569,7 @@ CLASS="COMMAND" >use rhosts (G)>use rhosts (G)

      If this global parameter is

      NOTE: The use of user (S)>user (S)

      Synonym for users (S)>users (S)

      Synonym for username (S)>username (S)

      Multiple users may be specified in a comma-delimited @@ -18268,7 +18714,7 @@ CLASS="PARAMETER" will be looked up only in the UNIX groups database and will expand to a list of all users in the group of that name.

      If any of the usernames begin with a '&'then the name +>If any of the usernames begin with a '&' then the name will be looked up only in the NIS netgroups database (if Samba is compiled with netgroup support) and will expand to a list of all users in the netgroup group of that name.

      See the section NOTE ABOUT USERNAME/PASSWORD VALIDATION for more information on how @@ -18287,7 +18733,7 @@ HREF="#AEN238" >Default: The guest account if a guest service, - else <empty string>.

      Examples:username level (G)>username level (G)

      This option helps Samba to try and 'guess' at @@ -18334,7 +18780,7 @@ CLASS="COMMAND" >username map (G)>username map (G)

      This option allows you to specify a file containing @@ -18424,20 +18870,10 @@ CLASS="COMMAND" '!' to tell Samba to stop processing if it gets a match on that line.

      		!sys = mary fred
      -		guest = *
      -		
      !sys = mary fred +guest = *

      Note that the remapping is applied to all occurrences @@ -18474,9 +18910,12 @@ CLASS="PARAMETER" trouble deleting print jobs as PrintManager under WfWg will think they don't own the print job.

      Default: Default: no username map

      Example: use sendfile (S)>use sendfile (S)

      If this parameter is utmp (G)>utmp (G)

      This boolean parameter is only available if @@ -18553,7 +18992,7 @@ CLASS="COMMAND" >utmp directory(G)>utmp directory(G)

      This parameter is only available if Samba has @@ -18578,9 +19017,12 @@ CLASS="FILENAME" >/var/run/utmp on Linux).

      Default: Default: no utmp directory

      Example: wtmp directory(G)>wtmp directory(G)

      This parameter is only available if Samba has @@ -18621,9 +19063,12 @@ CLASS="FILENAME" >/var/run/wtmp on Linux).

      Default: Default: no wtmp directory

      Example: valid users (S)>valid users (S)

      This is a list of users that should be allowed - to login to this service. Names starting with '@', '+' and '&' + to login to this service. Names starting with '@', '+' and '&' are interpreted using the same rules as described in the

      Default: Default: No valid users list (anyone can login)

      Example: veto files(S)>veto files(S)

      This is a list of files and directories that @@ -18701,9 +19149,12 @@ NAME="VETOFILES" or directories as in DOS wildcards.

      Each entry must be a unix path, not a DOS path and - must not include the unix directory separator '/'.

      fail unless you also set the .

      Default: Default: No files or directories are vetoed.

      Examples:
      Examples:
      ; Veto any files containing the word Security, 
       ; any ending in .tmp, and any directory containing the
      @@ -18781,16 +19232,13 @@ veto files = /*Security*/*.tmp/*root*/
       ; Veto the Apple specific files that a NetAtalk server
       ; creates.
       veto files = /.AppleDouble/.bin/.AppleDesktop/Network Trash Folder/

      veto oplock files (S)
      >veto oplock files (S)

      This parameter is only valid when the parameter.

      Default: Default: No files are vetoed for oplock grants

      You might want to do this on files that you know will @@ -18843,7 +19294,7 @@ CLASS="COMMAND" >vfs path (S)>vfs path (S)

      This parameter specifies the directory @@ -18868,7 +19319,7 @@ CLASS="COMMAND" >vfs object (S)>vfs object (S)

      This parameter specifies a shared object files that @@ -18876,16 +19327,19 @@ NAME="VFSOBJECT" disk I/O operations are used but these can be overloaded with one or more VFS objects.

      Default : Default : no value

      vfs options (S)
      >vfs options (S)

      This parameter allows parameters to be passed @@ -18900,32 +19354,38 @@ CLASS="PARAMETER" >.

      Default : Default : no value

      volume (S)
      >volume (S)

      This allows you to override the volume label returned for a share. Useful for CDROMs with installation programs that insist on a particular volume label.

      Default: Default: the name of the share

      wide links (S)
      >wide links (S)

      This parameter controls whether or not links @@ -18947,14 +19407,16 @@ CLASS="COMMAND" >winbind cache time (G)>winbind cache time (G)

      This parameter specifies the number of seconds the - winbindd(8)This parameter specifies the number of + seconds the winbindd(8) daemon will cache user and group information before querying a Windows NT server again.

      winbind enum users (G)>winbind enum users (G)

      On large installations using - winbindd(8)On large installations using winbindd(8) it may be - necessary to suppress the enumeration of users through the - setpwent()setpwent(), system call will not return any data.

      Warning: Turning off user enumeration may cause some programs to behave oddly. For example, the finger program relies on having access to the @@ -19023,19 +19488,19 @@ CLASS="COMMAND" >winbind enum groups (G)>winbind enum groups (G)

      On large installations using - winbindd(8) it may be - necessary to suppress the enumeration of groups through the - On large installations using winbindd(8) it may be necessary to suppress + the enumeration of groups through the setgrent()setgrent(), system call will not return any data.

      Warning: Turning off group enumeration may cause some programs to behave oddly.

      winbind gid (G)>winbind gid (G)

      The winbind gid parameter specifies the range of group - ids that are allocated by the winbindd(8)winbindd(8) daemon. This range of group ids should have no existing local or NIS groups within it as strange conflicts can occur otherwise.

      Default: winbind gid = <empty string> +>winbind gid = <empty string>

      winbind separator (G)>winbind separator (G)

      This parameter allows an admin to define the character @@ -19148,21 +19618,23 @@ CLASS="COMMAND" >winbind uid (G)>winbind uid (G)

      The winbind gid parameter specifies the range of group - ids that are allocated by the winbindd(8)winbindd(8) daemon. This range of ids should have no existing local or NIS users within it as strange conflicts can occur otherwise.

      Default: winbind uid = <empty string> +>winbind uid = <empty string>

      winbind use default domain, winbind use default domain (G)
      >winbind use default domain (G)

      This parameter specifies whether the winbindd(8) - daemon should operate on users without domain component in their username. +>This parameter specifies whether the winbindd(8) daemon should operate on users + without domain component in their username. Users without a domain component are treated as is part of the winbindd server's own domain. While this does not benifit Windows users, it makes SSH, FTP and e-mail function in a way much closer to the way they would in a native unix system.

      Default: winbind use default domain = <no> +>winbind use default domain = <no>

      wins hook (G)>wins hook (G)

      When Samba is running as a WINS server this @@ -19268,7 +19742,7 @@ CLASS="COMMAND" >wins proxy (G)>wins proxy (G)

      This is a boolean that controls if wins server (G)>wins server (G)

      This specifies the IP address (or DNS name: IP - address for preference) of the WINS server that nmbd(8)nmbd(8) should register with. If you have a WINS server on your network then you should set this to the WINS server's IP.

      You should point this at your WINS server if you have a multi-subnetted network.

      NOTE. You need to set up Samba to point to a WINS server if you have multiple subnets and wish cross-subnet browsing to work correctly.

      See the documentation file BROWSING.txtSee the documentation file BROWSING in the docs/ directory of your Samba source distribution.

      Default: Default: not enabled

      Example: wins support (G)>wins support (G)

      This boolean controls if the - nmbd(8)This boolean controls if the nmbd(8) process in Samba will act as a WINS server. You should not set this to nmbd to be your WINS server. - Note that you should NEVER set this to yesworkgroup (G)>workgroup (G)

      This controls what workgroup your server will @@ -19381,9 +19868,12 @@ CLASS="COMMAND" > setting.

      Default: Default: set at compile time to WORKGROUP

      Example: writable (S)>writable (S)

      Synonym for write cache size (S)>write cache size (S)

      If this integer parameter is set to non-zero value, Samba will create an in-memory cache for each oplocked file - (it does not do this for non-oplocked files). All writes that the client does not request to be flushed directly to disk will be stored in this cache if possible. @@ -19453,7 +19946,7 @@ CLASS="COMMAND" >write list (S)>write list (S)

      This is a list of users that are given read-write @@ -19486,7 +19979,7 @@ CLASS="PARAMETER" >

      Default: write list = <empty string> +>write list = <empty string>

      wins partners (G)>wins partners (G)

      A space separated list of partners' IP addresses for @@ -19524,7 +20017,7 @@ CLASS="COMMAND" >write ok (S)>write ok (S)

      Inverted synonym for write raw (G)>write raw (G)

      This parameter controls whether or not the server @@ -19557,7 +20050,7 @@ CLASS="COMMAND" >writeable (S)>writeable (S)

      Inverted synonym for

      WARNINGS

      On a similar note, many clients - especially DOS clients - - limit service names to eight characters. smbd(8) - smbd(8) has no such limitation, but attempts to connect from such clients will fail if they truncate the service names. For this reason you should probably keep your service names down to eight characters @@ -19606,97 +20100,81 @@ TARGET="_top" >

      VERSION

      This man page is correct for version 3.0 of - the Samba suite.

      This man page is correct for version 3.0 of the Samba suite.

      SEE ALSO

      samba(7), - smbpasswd(8), - swat(8), - smbd(8), - nmbd(8), - smbclient(1), - nmblookup(1), - testparm(1), - testprns(1) -

      samba(7), smbpasswd(8), swat(8), smbd(8), nmbd(8), smbclient(1), nmblookup(1), testparm(1), testprns(1).

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      smbcacls

      smbcacls

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      The

      OPTIONS

      Specifies a username used to connect to the specified service. The username may be of the form "username" in which case the user is prompted to enter in a password and the - workgroup specified in the smb.confsmb.conf(5) file is used, or "username%password" or "DOMAIN\username%password" and the password and workgroup names are used as provided.

      ACL FORMAT

      The revision of the ACL specifies the internal Windows @@ -211,34 +215,45 @@ ACL:<sid or name>:<type>/<flags>/<mask> the file or directory resides.

      ACLs specify permissions granted to the SID. This SID again - can be specified in CWS-1-x-y-z format or as a name in which case - it is resolved against the server on which the file or directory - resides. The type, flags and mask values determine the type of - access granted to the SID.

      The type can be either 0 or 1 corresponding to ALLOWED or - DENIED access to the SID. The flags values are generally - zero for file ACLs and either 9 or 2 for directory ACLs. Some - common flags are:

      • #define SEC_ACE_FLAG_OBJECT_INHERIT 0x1

        #define SEC_ACE_FLAG_OBJECT_INHERIT 0x1

      • #define SEC_ACE_FLAG_CONTAINER_INHERIT 0x2

        #define SEC_ACE_FLAG_CONTAINER_INHERIT 0x2

      • #define SEC_ACE_FLAG_NO_PROPAGATE_INHERIT 0x4 -

        #define SEC_ACE_FLAG_NO_PROPAGATE_INHERIT 0x4

      • #define SEC_ACE_FLAG_INHERIT_ONLY 0x8

        #define SEC_ACE_FLAG_INHERIT_ONLY 0x8

      EXIT STATUS

      VERSION

      This man page is correct for version 2.2 of - the Samba suite.

      This man page is correct for version 2.2 of the Samba suite.

      AUTHOR

      The conversion to DocBook for Samba 2.2 was done - by Gerald Carter

      smbclient

      smbclient

      smbclient {servicename} [password] [-b <buffer size>] [-d debuglevel] [-D Directory] [-U username] [-W workgroup] [-M <netbios name>] [-m maxprotocol] [-A authfile] [-N] [-l logfile] [-L <netbios name>] [-I destinationIP] [-E] [-c <command string>] [-i scope] [-O <socket options>] [-p port] [-R <name resolve order>] [-s <smb config file>] [-T<c|x>IXFqgbNan]

      {servicename} [password] [-b <buffer size>] [-d debuglevel] [-D Directory] [-U username] [-W workgroup] [-M <netbios name>] [-m maxprotocol] [-A authfile] [-N] [-l logfile] [-L <netbios name>] [-I destinationIP] [-E] [-c <command string>] [-i scope] [-O <socket options>] [-p port] [-R <name resolve order>] [-s <smb config file>] [-T<c|x>IXFqgbNan] [-k]

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      smbclient is a client that can 'talk' to an SMB/CIFS server. It offers an interface - similar to that of the ftp program (see ftp(1)ftp(1)). Operations include things like getting files from the server to the local machine, putting files from the local machine to @@ -71,7 +76,7 @@ CLASS="COMMAND" >

      OPTIONS

      smbclient
      or - using the name resolve order parameter in the smb.confsmb.conf(5) file, allowing an administrator to change the order and methods by which server names are looked up.

      -s smb.conf

      Specifies the location of the all important - smb.confSpecifies the location of the all + important smb.conf(5) file.

      TCP socket options to set on the client - socket. See the socket options parameter in the smb.conf (5) manpage for the list of valid + socket. See the socket options parameter in + the smb.conf(5) manual page for the list of valid options.

      The options are :"lmhosts", "host", "wins" and "bcast". They - cause names to be resolved as follows :

        lmhosts : Lookup an IP +>: Lookup an IP address in the Samba lmhosts file. If the line in lmhosts has - no name type attached to the NetBIOS name (see the lmhosts(5)lmhosts(5) for details) then any name type matches for lookup.

        host : Do a standard host +>: Do a standard host name to IP address resolution, using the system /etc/hosts @@ -248,7 +267,7 @@ CLASS="FILENAME" >wins : Query a name with +>: Query a name with the IP address listed in the bcast : Do a broadcast on +>: Do a broadcast on each of the known local interfaces listed in the

      If this parameter is not set then the name resolve order - defined in the smb.confsmb.conf(5) file parameter (name resolve order) will be used.

      name resolve order parameter of the smb.conf parameter of the smb.conf(5) file the name resolution methods will be attempted in this order.

      options useful, as they allow you to control the FROM and TO parts of the message.

      See the message command parameter in the smb.conf(5)See the message command parameter in the smb.conf(5) for a description of how to handle incoming WinPopup messages in Samba.

      username = <value> password = <value> -domain = <value> -

      If the domain parameter is missing the current workgroup name @@ -690,12 +722,14 @@ CLASS="COMMAND" >

      Override the default workgroup (domain) specified - in the workgroup parameter of the smb.conf - file for this connection. This may be needed to connect to some - servers.

      smb.conf(5) file for this connection. This may be + needed to connect to some servers.

      -T tar options

      All file names can be given as DOS path names (with '\' +>All file names can be given as DOS path names (with '\\' as the component separator) or as UNIX path names (with '/' as the component separator).

      -c 'print -'.

      -k

      Try to authenticate with kerberos. Only useful in + an Active Directory environment. +

      OPERATIONS

      smb:\>

      The backslash ("\") indicates the current working directory +>The backslash ("\\") indicates the current working directory on the server, and will change if the current working directory is changed.

      NOTES

      ENVIRONMENT VARIABLES

      INSTALLATION

      To test the client, you will need to know the name of a - running SMB/CIFS server. It is possible to run smbd(8) - smbd(8) as an ordinary user - running that server as a daemon on a user-accessible port (typically any port number over 1024) would provide a suitable test server.

      DIAGNOSTICS

      VERSION

      This man page is correct for version 2.2 of - the Samba suite.

      This man page is correct for version 2.2 of the Samba suite.

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      smbcontrol

      smbcontrol

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      smbcontrol is a very small program, which - sends messages to an smbd(8), - an nmbd(8) - or a winbindd(8) - daemon running on the system.

      smbd(8), a nmbd(8), or a winbindd(8) daemon running on the system.

      OPTIONS

      nmbd
      - , smbd

      VERSION

      SEE ALSO

      nmbd(8), - and smbd(8). -

      nmbd(8) and smbd(8).

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      + smbd

      smbd

      smbd

      Synopsis

      smbd [-D] [-F] [-S] [-i] [-h] [-V] [-b] [-d <debug level>] [-l <log directory>] [-p <port number>] [-O <socket option>] [-s <configuration file>]

      [-D] [-F] [-S] [-i] [-h] [-V] [-b] [-d <debug level>] [-l <log directory>] [-p <port number>] [-O <socket option>] [-s <configuration file>]

      DESCRIPTION

      This program is part of the Samba suite.

      This program is part of the Samba(7) suite.

      An extensive description of the services that the server can provide is given in the man page for the configuration file controlling the attributes of those - services (see smb.conf(5) - smb.conf(5). This man page will not describe the services, but will concentrate on the administrative aspects of running the server.

      Please note that there are significant security - implications to running this server, and the smb.conf(5) - manpage should be regarded as mandatory reading before + implications to running this server, and the smb.conf(5) manual page should be regarded as mandatory reading before proceeding with installation.

      A session is created whenever a client requests one. @@ -104,7 +109,7 @@ CLASS="COMMAND" >

      OPTIONS

      -d <debug level>
      -d <debug level>

      log - level parameter in the smb.conf(5) parameter in the smb.conf(5) file.

      -l <log directory>
      -l <log directory>

      If specified, @@ -280,18 +289,25 @@ CLASS="REPLACEABLE" its size may be controlled by the max log size - option in the smb.conf(5)max log size file. + option in the smb.conf(5) file. Beware: If the directory specified does not exist,

      -O <socket options>
      -O <socket options>

      See the socket options - parameter in the smb.conf(5) - socket options + parameter in the smb.conf(5) file for details.

      -p <port number>
      -p <port number>

      -s <configuration file>
      -s <configuration file>

      The file specified contains the @@ -362,13 +381,12 @@ CLASS="REPLACEABLE" information in this file includes server-specific information such as what printcap file to use, as well as descriptions of all the services that the server is - to provide. See smb.conf(5)smb.conf(5) for more information. The default configuration file name is determined at compile time.

      FILES

      meta-daemon, this file must contain suitable startup information for the meta-daemon. See the UNIX_INSTALL.html"How to Install and Test SAMBA" document for details.

      If running the server as a daemon at startup, this file will need to contain an appropriate startup sequence for the server. See the UNIX_INSTALL.html"How to Install and Test SAMBA" document for details.

      UNIX_INSTALL.html"How to Install and Test SAMBA" document for details.

      This is the default location of the - smb.conf - server configuration file. Other common places that systems +>This is the default location of the smb.conf(5) server configuration file. Other common places that systems install this file are /usr/samba/lib/smb.conf and /etc/smb.conf/etc/samba/smb.conf.

      This file describes all the services the server - is to make available to clients. See smb.conf(5) for more information.

      smb.conf(5) for more information.

      LIMITATIONS

      ENVIRONMENT VARIABLES

      PAM INTERACTION

      Samba uses PAM for authentication (when presented with a plaintext password), for account checking (is this account disabled?) and for session management. The degree too which samba supports PAM is restricted - by the limitations of the SMB protocol and the - obey pam restricions - smb.conf paramater. When this is set, the following restrictions apply: +>obey + pam restricions smb.conf(5) paramater. When this is set, the following restrictions apply:

      • Account Validation: All accesses to a samba server are checked against PAM to see if the account is vaild, not disabled and is permitted to @@ -573,9 +600,12 @@ CLASS="EMPHASIS" >

      • Session Management: When not using share level secuirty, users must pass PAM's session checks before access is granted. Note however, that this is bypassed in share level secuirty. @@ -588,7 +618,7 @@ CLASS="EMPHASIS" >

        VERSION

        DIAGNOSTICS

        SIGNALS

        SIGKILL (-9)
        NOT be used, except as a last resort, as this may leave the shared memory area in an inconsistent state. The safe way to terminate @@ -660,16 +693,14 @@ CLASS="COMMAND" CLASS="COMMAND" >smbd may be raised - or lowered using smbcontrol(1) - program (SIGUSR[1|2] signals are no longer used in - Samba 2.2). This is to allow transient problems to be diagnosed, + or lowered using smbcontrol(1) program (SIGUSR[1|2] signals are no longer + used since Samba 2.2). This is to allow transient problems to be diagnosed, whilst still running at a normally low log level.

        Note that as the signal handlers send a debug write, @@ -688,55 +719,55 @@ CLASS="COMMAND" >

        SEE ALSO

        hosts_access(5), inetd(8), - nmbd(8), - smb.conf(5) - , smbclient(1) - , testparm(1), testprns(1), and the Internet RFC's - hosts_access(5), inetd(8), nmbd(8), smb.conf(5), smbclient(1), testparm(1), testprns(1), and the + Internet RFC's rfc1001.txt,

        AUTHOR

        The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

        + smbgroupedit

        smbgroupedit

        smbgroupedit

        Synopsis

        smbroupedit [-v [l|s]] [-a UNIX-groupname [-d NT-groupname|-p privilege|]]

        [-v [l|s]] [-a UNIX-groupname [-d NT-groupname|-p privilege|]]

        DESCRIPTION

        This program is part of the Samba -suite.

        This program is part of the Samba(7) suite.

        The smbgroupedit command allows for mapping unix groups to NT Builtin, Domain, or Local groups. Also @@ -59,7 +63,7 @@ etc.

        OPTIONS

        give a long listing, of the format:

        "NT Group Name"
        @@ -100,20 +98,10 @@ CLASS="PROGRAMLISTING"
             Group type     :
             Comment        :
             Privilege      :

        For examples,

        For example:
        +
        Users
             SID       : S-1-5-32-545
        @@ -121,9 +109,6 @@ CLASS="PROGRAMLISTING"
             Group type: Local group
             Comment   :
             Privilege : No privilege

        display a short listing of the format:

        NTGroupName(SID) -> UnixGroupName

        For example,

        For example:
        +
        Users (S-1-5-32-545) -> -1

      • map this domadm group to the 'domain admins' group: -

        map this domadm group to the 'domain admins' group:

        1. Get the SID for the Windows NT "Domain Admins" - group:

          Get the SID for the Windows NT "Domain Admins" group:

          smbgroupedit -vs | grep "Domain Admins"
           Domain Admins (S-1-5-21-1108995562-3116817432-1375597819-512) -> -1

        2. map the unix domadm group to the Windows NT "Domain Admins" group, by running the command: -

          warning: don't copy and paste this sample, the Domain Admins SID (the S-1-5-21-...-512) is different for every PDC.

        To verify that your mapping has taken effect:

        To verify that your mapping has taken effect:
        +
        smbgroupedit -vs|grep "Domain Admins"
         Domain Admins (S-1-5-21-1108995562-3116817432-1375597819-512) -> domadm

        To give access to a certain directory on a domain member machine (an NT/W2K or a samba server running winbind) to some users who are member -of a group on your samba PDC, flag that group as a domain group:

        smbgroupedit -a unixgroup -td

      VERSION

      SEE ALSO

      smb.conf(5)smb.conf(5)

      AUTHOR

      smbgroupedit
      was written by Jean Francois Micouleau. The current set of manpages and documentation is maintained -by the Samba Team in the same fashion as the Samba source code.

      smbmnt

      smbmnt

      smbmnt program is normally invoked - by smbmount(8) - smbmount(8). It should not be invoked directly by users.

      smbmount searches the normal PATH for smbmnt. You must ensure @@ -81,7 +79,7 @@ CLASS="COMMAND" >

      OPTIONS

      AUTHOR

      The conversion of this manpage for Samba 2.2 was performed - by Gerald Carter

      smbmount

      smbmount

      mount.smbfs by - the mount(8)mount(8) command when using the "-t smbfs" option. This command only works in Linux, and the kernel must support the smbfs filesystem.

      log.smbmount
      . The - . The smbmount smbmount process may also be called mount.smbfs.

      smbmount - calls smbmnt(8)smbmnt(8) to do the actual mount. You must make sure that

      OPTIONS

      credentials=<filename>

      specifies a file that contains a username - and/or password. The format of the file is:

      specifies a file that contains a username and/or password. 
      +The format of the file is:
      +
      		username = <value>
      -		password = <value>
      -		
      -

      username = <value> +password = <value>

      This is preferred over having passwords in plaintext in a shared file, such as sets the TCP socket options. See the smb.conf - smb.conf(5)

      ENVIRONMENT VARIABLES

      BUGS

      SEE ALSO

      FreeBSD also has a smbfs, but it is not related to smbmount

      For Solaris, HP-UX and others you may want to look at - smbsh(1) or at other - solutions, such as sharity or perhaps replacing the SMB server with - a NFS server.

      For Solaris, HP-UX and others you may want to look at smbsh(1) or at other solutions, such as + Sharity or perhaps replacing the SMB server with a NFS server.

      AUTHOR

      The conversion of this manpage for Samba 2.2 was performed - by Gerald Carter

      smbpasswd

      smbpasswd

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      smbpasswd is the Samba encrypted password file. It contains @@ -62,7 +64,7 @@ TARGET="_top" >

      FILE FORMAT

      parameter is set in the smb.conf(5) - smb.conf(5) config file.

      D - This means the account - is disabled and no SMB/CIFS logins will be allowed for - this user.

    • VERSION

      SEE ALSO

      smbpasswd(8), - samba(7)smbpasswd(8), Samba(7), and the Internet RFC1321 for details on the MD4 algorithm.

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      + smbpasswd

      smbpasswd

      smbpasswd

      Synopsis

      smbpasswd [-a] [-x] [-d] [-e] [-D debuglevel] [-n] [-r <remote machine>] [-R <name resolve order>] [-m] [-U username[%password]] [-h] [-s] [-w pass] [-i] [-L] [username]

      [-a] [-x] [-d] [-e] [-D debuglevel] [-n] [-r <remote machine>] [-R <name resolve order>] [-m] [-U username[%password]] [-h] [-s] [-w pass] [-i] [-L] [username]

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      The smbpasswd program has several different - functions, depending on whether it is run by the root - user or not. When run as a normal user it allows the user to change +> user + or not. When run as a normal user it allows the user to change the password used for their SMB sessions on any machines that store SMB passwords.

      passwd(1) program works. - program works. smbpasswd smbpasswd differs from how the passwd program works - however in that it is not setuid root but works in - a client-server mode and communicates with a locally running - smbd(8)smbd(8). As a consequence in order for this to succeed the smbd daemon must be running on the local machine. On a UNIX machine the encrypted SMB passwords are usually stored in - the smbpasswd(5)smbpasswd(5) file.

      When run by an ordinary user with no options, smbpasswd @@ -91,18 +107,28 @@ CLASS="FILENAME" was typed correctly. No passwords will be echoed on the screen whilst being typed. If you have a blank SMB password (specified by the string "NO PASSWORD" in the smbpasswd file) then just press - the <Enter> key when asked for your old password.

      smbpasswd can also be used by a normal user to change their SMB password on remote machines, such as Windows NT Primary Domain - Controllers. See the (-r) and -U options below.

      -r) and -U options + below.

      When run by root, smbpasswd allows new users to be added and deleted in the smbpasswd file, as well as allows changes to - the attributes of the user in this file to be made. When run by root, - smbpasswd smbpasswd accesses the local smbpasswd file directly, thus enabling changes to be made even if smbd is not running.

      OPTIONS

      This option specifies that the username following should be added to the local smbpasswd file, with the - new password typed (type <Enter> for the old password). This + new password typed (type <Enter> for the old password). This option is ignored if the username following already exists in the smbpasswd file and it is treated like a regular change password command. Note that the default passdb backends require @@ -169,10 +195,12 @@ CLASS="CONSTANT" >

      If the smbpasswd file is in the 'old' format (pre-Samba 2.0 format) there is no space in the user's password entry to write - this information and the command will FAIL. See smbpasswd(5) - smbpasswd(5) for details on the 'old' and new password file formats.

      smbpasswd will FAIL to enable the account. - See smbpasswd (5)smbpasswd(5) for details on the 'old' and new password file formats.

      Note that Windows 95/98 do not have a real password database so it is not possible to change passwords specifying a Win95/98 machine as remote machine target.

      The options are :"lmhosts", "host", "wins" and "bcast". They - cause names to be resolved as follows :

        lmhosts : Lookup an IP +>: Lookup an IP address in the Samba lmhosts file. If the line in lmhosts has - no name type attached to the NetBIOS name (see the lmhosts(5)lmhosts(5) for details) then any name type matches for lookup.

        host : Do a standard host +>: Do a standard host name to IP address resolution, using the system /etc/hosts @@ -353,7 +389,7 @@ CLASS="FILENAME" >wins : Query a name with +>: Query a name with the IP address listed in the bcast : Do a broadcast on +>: Do a broadcast on each of the known local interfaces listed in the lmhosts, host, wins, bcast - and without this parameter or any entry in the - smb.confsmb.conf(5) file the name resolution methods will be attempted in this order.

    • . Note that the password is stored in the private/secrets.tdbsecrets.tdb and is keyed off of the admin's DN. This means that if the value of

      This specifies the username for all of the - root only options to operate on. Only root can specify this parameter as only root has the permission needed to modify attributes directly in the local smbpasswd file. @@ -523,7 +564,7 @@ CLASS="EMPHASIS" >

      NOTES

      smbd
      running on the local machine by specifying a - running on the local machine by specifying either allow hostsallow + hosts or deny hosts - entry in the smb.conf entry in + the smb.conf(5) file and neglecting to allow "localhost" access to the smbd.

      In addition, the smbpasswd command is only useful if Samba - has been set up to use encrypted passwords. See the file - ENCRYPTION.txt "LanMan and NT Password Encryption in Samba" in the docs directory for details on how to do this.

      VERSION

      This man page is correct for version 3.0 of - the Samba suite.

      This man page is correct for version 3.0 of the Samba suite.

      SEE ALSO

      smbpasswd(5), - samba(7) -

      smbpasswd(5), Samba(7).

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      + smbsh

      smbsh

      smbsh

      Synopsis

      smbsh [-W workgroup] [-U username] [-P prefix] [-R <name resolve order>] [-d <debug level>] [-l logfile] [-L libdir]

      [-W workgroup] [-U username] [-P prefix] [-R <name resolve order>] [-d <debug level>] [-l logfile] [-L libdir]

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      OPTIONS

      Override the default workgroup specified in the - workgroup parameter of the smb.confsmb.conf(5) file for this session. This may be needed to connect to some servers.

      This option allows the user to set the directory prefix for SMB access. The default value if this option is not specified is - smb.

      -R <name resolve order>
      -R <name resolve order>

      This option is used to determine what naming @@ -127,7 +138,7 @@ CLASS="EMPHASIS" host names to IP addresses. The option takes a space-separated string of different name resolution options.

      The options are :"lmhosts", "host", "wins" and "bcast". +>The options are: "lmhosts", "host", "wins" and "bcast". They cause names to be resolved as follows :

      lmhosts : +>: Lookup an IP address in the Samba lmhosts file. If the line in lmhosts has no name type attached to the NetBIOS name - (see the lmhosts(5) - for details) then any name type matches for lookup. + (see the lmhosts(5) for details) + then any name type matches for lookup.

    • host : +>: Do a standard host name to IP address resolution, using the system wins : +>: Query a name with the IP address listed in the bcast : +>: Do a broadcast on each of the known local interfaces listed in the

      If this parameter is not set then the name resolve order - defined in the smb.confsmb.conf(5) file parameter - (name resolve order) will be used.

      name resolve order
      ) will be used.

      The default order is lmhosts, host, wins, bcast. Without this parameter or any entry in the name resolve order parameter of the smb.conf - file, the name resolution methods will be attempted in this - order.

      parameter of the smb.conf(5) file, the name resolution methods + will be attempted in this order.

    • -d <debug level>
      -d <debug level>

      debug level is an integer from 0 to 10.

      The higher this value, the more detail will be logged - about the activities of nmblookupnmblookup(1). At level 0, only critical errors and serious warnings will be logged.

      EXAMPLES

      smbsh
      from the prompt and enter the username and password that authenticates you to the machine running the Windows NT - operating system.

      	system% smbsh
      -	Username: user
      -	Password: XXXXXXX
      -	

      Any dynamically linked command you execute from @@ -357,7 +372,7 @@ CLASS="COMMAND" the workgroup MYGROUP. The command ls /smb/MYGROUP/<machine-name>ls /smb/MYGROUP/<machine-name> will show the share names for that machine. You could then, for example, use the

      VERSION

      This man page is correct for version 3.0 of - the Samba suite.

      This man page is correct for version 3.0 of the Samba suite.

      BUGS

      SEE ALSO

      smbd(8), - smb.conf(5) -

      smbd(8), smb.conf(5)

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      smbspool

      smbspool

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      smbspool is a very small print spooling program that @@ -87,8 +89,7 @@ CLASS="EMPHASIS" >

    • smb://username:password@workgroup/server/printer -

      smb://username:password@workgroup/server/printer

    • OPTIONS

      VERSION

      This man page is correct for version 2.2 of - the Samba suite.

      This man page is correct for version 2.2 of the Samba suite.

      SEE ALSO

      smbd(8), - and samba(7). -

      smbd(8) and Samba(7).

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      smbstatus

      smbstatus

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      OPTIONS

      -p|--processes

      print a list of smbd(8)print a list of smbd(8) processes and exit. Useful for scripting.

      The default configuration file name is determined at compile time. The file specified contains the - configuration details required by the server. See smb.conf(5) - smb.conf(5) for more information.

      VERSION

      SEE ALSO

      smbd(8) and - smb.conf(5)smbd(8) and smb.conf(5).

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      smbtar

      smbtar

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      smbtar is a very small shell script on top - of smbclient(1) - which dumps SMB shares directly to tape.

      smbclient(1) which dumps SMB shares directly to tape.

      OPTIONS

      -d
      flag of smbclient(1) - .

      flag of smbclient(1).

      ENVIRONMENT VARIABLES

      BUGS

      CAVEATS

      DIAGNOSTICS

      DIAGNOSTICS
      section for the - smbclient(1) - section for the smbclient(1) command.

      VERSION

      SEE ALSO

      smbd(8), - smbclient(1), - smb.conf(5), -

      smbd(8), smbclient(1), smb.conf(5).

      AUTHOR

      . Many thanks to everyone who suggested extensions, improvements, bug fixes, etc. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter.

      smbumount

      smbumount

      SEE ALSO

      smbmount(8) - smbmount(8)

      AUTHOR

      The conversion of this manpage for Samba 2.2 was performed - by Gerald Carter

      Samba performance issuesNext

      Chapter 22. Samba performance issues

      Chapter 19. Samba performance issues

      22.1. Comparisons

      19.1. Comparisons

      The Samba server uses TCP to talk to the client. Thus if you are trying to see if it performs well you should really compare it to @@ -108,7 +111,9 @@ CLASS="SECT1" >

      22.2. Socket options

      19.2. Socket options

      There are a number of socket options that can greatly affect the performance of a TCP based server like Samba.

      22.3. Read size

      19.3. Read size

      The option "read size" affects the overlap of disk reads/writes with network reads/writes. If the amount of data being transferred in @@ -158,7 +165,9 @@ CLASS="SECT1" >

      22.4. Max xmit

      19.4. Max xmit

      At startup the client and server negotiate a "maximum transmit" size, which limits the size of nearly all SMB commands. You can set the @@ -179,7 +188,9 @@ CLASS="SECT1" >

      22.5. Log level

      19.5. Log level

      If you set the log level (also known as "debug level") higher than 2 then you may suffer a large drop in performance. This is because the @@ -191,7 +202,9 @@ CLASS="SECT1" >

      22.6. Read raw

      19.6. Read raw

      The "read raw" operation is designed to be an optimised, low-latency file read operation. A server may choose to not support it, @@ -211,7 +224,9 @@ CLASS="SECT1" >

      22.7. Write raw

      19.7. Write raw

      The "write raw" operation is designed to be an optimised, low-latency file write operation. A server may choose to not support it, @@ -226,7 +241,9 @@ CLASS="SECT1" >

      22.8. Slow Clients

      19.8. Slow Clients

      One person has reported that setting the protocol to COREPLUS rather than LANMAN2 gave a dramatic speed improvement (from 10k/s to 150k/s).

      22.9. Slow Logins

      19.9. Slow Logins

      Slow logins are almost always due to the password checking time. Using the lowest practical "password level" will improve things a lot. You @@ -252,7 +271,9 @@ CLASS="SECT1" >

      22.10. Client tuning

      19.10. Client tuning

      Often a speed problem can be traced to the client. The client (for example Windows for Workgroups) can often be tuned for better TCP @@ -386,7 +407,7 @@ WIDTH="33%" ALIGN="right" VALIGN="top" >NextAppendixesCreating Group Profiles

      swat

      swat

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      swat allows a Samba administrator to - configure the complex smb.conf(5)smb.conf(5) file via a Web browser. In addition, a

      OPTIONS

      The default configuration file path is determined at compile time. The file specified contains - the configuration details required by the smbd - server. This is the file that smbd(8) server. This is the file + that swat will modify. @@ -147,7 +151,7 @@ CLASS="EMPHASIS" >

      INSTALLATION

      Inetd Installation

      Launching

      FILES

      This is the default location of the smb.conf(5) - This is the default location of the smb.conf(5) server configuration file that swat edits. Other common places that systems install this file are

      WARNINGS

      swat will rewrite your smb.conf - will rewrite your smb.conf(5) file. It will rearrange the entries and delete all comments,

      VERSION

      This man page is correct for version 2.2 of - the Samba suite.

      This man page is correct for version 2.2 of the Samba suite.

      SEE ALSO

      inetd(5), - smbd(8), - smb.conf(5) -

      , smbd(8), smb.conf(5)

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      + testparm

      testparm

      testparm

      Synopsis

      testparm [-s] [-h] [-v] [-L <servername>] [-t <encoding>] {config filename} [hostname hostIP]

      [-s] [-h] [-v] [-L <servername>] [-t <encoding>] {config filename} [hostname hostIP]

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      testparm is a very simple test program - to check an smbdsmbd(8) configuration file for internal correctness. If this program reports no problems, you can use the configuration file with confidence that will successfully load the configuration file.

      Note that this is Note that this is NOT a guarantee that the services specified in the configuration file will be available or will operate as expected.

      OPTIONS

      If this option is specified, testparm - will also output all options that were not used in - smb.conf and are thus set to - their defaults.

      smb.conf(5) and are thus set to their defaults.

      -t encoding

      This is the name of the configuration file to check. If this parameter is not present then the - default smb.confsmb.conf(5) file will be checked.

      hosts deny - parameters in the smb.confsmb.conf(5) file to determine if the hostname with this IP address would be allowed access to the

      FILES

      smb.confsmb.conf(5)

      This is usually the name of the configuration - file used by smbdsmbd(8).

      DIAGNOSTICS

      VERSION

      SEE ALSO

      smb.conf(5), - smbd(8) -

      smb.conf(5), smbd(8)

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      testprns

      testprns

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      testprns is a very simple test program to determine whether a given printer name is valid for use in - a service to be provided by smbd(8).

      smbd(8).

      "Valid" in this context means "can be found in the printcap specified". This program is very stupid - so stupid in @@ -75,7 +76,7 @@ CLASS="COMMAND" >

      OPTIONS

      testprns
      finds the printer then - smbd finds the printer then smbd(8) should do so as well.

      FILES

      DIAGNOSTICS

      VERSION

      SEE ALSO

      printcap(5), - smbd(8), - smbclient(1) -

      smbd(8), smbclient(1)

      AUTHOR

      The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another - excellent piece of Open Source software, available at - ftp://ftp.icce.rug.nl/pub/unix/) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for - Samba 2.2 was done by Gerald Carter

      Type of installationPrev

      Introduction

      Samba can operate in various SMB networks. This part contains information on configuring samba @@ -91,233 +94,238 @@ CLASS="TOC" >Table of Contents

      5. 4. User and Share security level (for servers not in a domain)
      6. 5. How to Configure Samba as a NT4 Primary Domain ControllerSamba as a NT4 or Win2k Primary Domain Controller
      6.1. 5.1. Prerequisite Reading
      6.2. 5.2. Background
      6.3. 5.3. Configuring the Samba Domain Controller
      6.4. 5.4. Creating Machine Trust Accounts and Joining Clients to the Domain
      6.4.1. 5.4.1. Manual Creation of Machine Trust Accounts
      6.4.2. 5.4.2. "On-the-Fly" Creation of Machine Trust Accounts
      6.4.3. 5.4.3. Joining the Client to the Domain
      6.5. 5.5. Common Problems and Errors
      6.6. 5.6. System Policies and Profiles
      6.7. 5.7. What other help can I get?
      6.8. 5.8. Domain Control for Windows 9x/ME
      6.8.1. 5.8.1. Configuration Instructions: Network Logons
      6.8.2. 5.8.2. Configuration Instructions: Setting up Roaming User Profiles
      6.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba5.9. DOMAIN_CONTROL.txt : Windows NT Domain Control & Samba
      7. 6. How to Act as a Backup Domain Controller in a Purely Samba Controlled Domain
      7.1. 6.1. Prerequisite Reading
      7.2. 6.2. Background
      7.3. 6.3. What qualifies a Domain Controller on the network?
      7.3.1. 6.3.1. How does a Workstation find its domain controller?
      7.3.2. 6.3.2. When is the PDC needed?
      7.4. Can Samba be a Backup Domain Controller?6.4. Can Samba be a Backup Domain Controller to an NT PDC?
      7.5. 6.5. How do I set up a Samba BDC?
      7.5.1. 6.5.1. How do I replicate the smbpasswd file?
      6.5.2. Can I do this all with LDAP?
      8. 7. Samba as a ADS domain member
      8.1. 7.1. Installing the required packages for Debian
      8.2. 7.2. Installing the required packages for RedHat
      8.3. 7.3. Compile Samba
      8.4. 7.4. Setup your /etc/krb5.conf
      8.5. 7.5. Create the computer account
      8.5.1. 7.5.1. Possible errors
      8.6. 7.6. Test your server setup
      8.7. 7.7. Testing with smbclient
      8.8. 7.8. Notes
      9. 8. Samba as a NT4 domain memberSamba as a NT4 or Win2k domain member
      9.1. Joining an NT Domain with Samba 2.28.1. Joining an NT Domain with Samba 3.0
      9.2. 8.2. Samba and Windows 2000 Domains
      9.3. 8.3. Why is this better than security = server?
      PrevLanMan and NT Password Encryption in SambaUser information databaseUNIX Permission Bits and Windows NT Access Control Lists

      Chapter 11. UNIX Permission Bits and Windows NT Access Control Lists

      Chapter 10. UNIX Permission Bits and Windows NT Access Control Lists

      11.1. Viewing and changing UNIX permissions using the NT +NAME="AEN1744" +>10.1. Viewing and changing UNIX permissions using the NT security dialogs

      New in the Samba 2.0.4 release is the ability for Windows @@ -91,33 +94,15 @@ NAME="AEN1605">11.1. Viewing and changing UNIX permissions using the NT the security of the UNIX host Samba is running on, and still obeys all the file permission rules that a Samba administrator can set.

      In Samba 2.0.4 and above the default value of the - parameter nt acl support has been changed from - false to true, so - manipulation of permissions is turned on by default.

      11.2. How to view file security on a Samba share

      10.2. How to view file security on a Samba share

      From an NT 4.0 client, single-click with the right mouse button on any file or directory in a Samba mounted @@ -185,7 +170,9 @@ CLASS="SECT1" >

      11.3. Viewing file ownership

      10.3. Viewing file ownership

      Clicking on the

      11.4. Viewing file or directory permissions

      10.4. Viewing file or directory permissions

      The third button is the

      11.4.1. File Permissions

      10.4.1. File Permissions

      The standard UNIX user/group/world triple and the corresponding "read", "write", "execute" permissions @@ -397,7 +388,9 @@ CLASS="SECT2" >

      11.4.2. Directory Permissions

      10.4.2. Directory Permissions

      Directories on an NT NTFS file system have two different sets of permissions. The first set of permissions @@ -427,7 +420,9 @@ CLASS="SECT1" >

      11.5. Modifying file or directory permissions

      10.5. Modifying file or directory permissions

      Modifying file and directory permissions is as simple as changing the displayed permissions in the dialog box, and @@ -523,7 +518,9 @@ CLASS="SECT1" >

      11.6. Interaction with the standard Samba create mask +NAME="AEN1837" +>10.6. Interaction with the standard Samba create mask parameters

      Note that with Samba 2.0.5 there are four new parameters @@ -798,7 +795,9 @@ CLASS="SECT1" >

      11.7. Interaction with the standard Samba file attribute +NAME="AEN1901" +>10.7. Interaction with the standard Samba file attribute mapping

      Samba maps some of the DOS attribute bits (such as "read diff --git a/docs/htmldocs/vfs.html b/docs/htmldocs/vfs.html index 11934ae47c..0e39297ebb 100644 --- a/docs/htmldocs/vfs.html +++ b/docs/htmldocs/vfs.html @@ -5,8 +5,7 @@ >Stackable VFS modulesPrevNext

      Chapter 18. Stackable VFS modules

      Chapter 16. Stackable VFS modules

      18.1. Introduction and configuration

      16.1. Introduction and configuration

      Since samba 3.0, samba supports stackable VFS(Virtual File System) modules. Samba passes each request to access the unix file system thru the loaded VFS modules. @@ -118,13 +121,17 @@ CLASS="SECT1" >

      18.2. Included modules

      16.2. Included modules

      18.2.1. audit

      16.2.1. audit

      A simple module to audit file access to the syslog facility. The following operations are logged: @@ -160,7 +167,9 @@ CLASS="SECT2" >

      18.2.2. recycle

      16.2.2. recycle

      A recycle-bin like modules. When used any unlink call will be intercepted and files moved to the recycle @@ -229,7 +238,9 @@ CLASS="SECT2" >

      18.2.3. netatalk

      16.2.3. netatalk

      A netatalk module, that will ease co-existence of samba and netatalk file sharing services.

      18.3. VFS modules available elsewhere

      16.3. VFS modules available elsewhere

      This section contains a listing of various other VFS modules that have been posted but don't currently reside in the Samba CVS @@ -274,7 +287,9 @@ CLASS="SECT2" >

      18.3.1. DatabaseFS

      16.3.1. DatabaseFS

      URL:

      18.3.2. vscan

      16.3.2. vscan

      URL: PrevNextPassdb XML pluginImproved browsing in sambaStoring Samba's User/Machine Account information in an LDAP DirectoryAccess Samba source code via CVS

      + vfstest

      vfstest

      vfstest

      Synopsis

      vfstest [-d debuglevel] [-c command] [-l logfile] [-h]

      [-d debuglevel] [-c command] [-l logfile] [-h]

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      OPTIONS

      COMMANDS

      VFS COMMANDS

      load <module.so>load <module.so> - Load specified VFS module

    • populate <char> <size>populate <char> <size> - Populate a data buffer with the specified data

    • showdata [<offset> <len>]showdata [<offset> <len>] - Show data currently in data buffer

      GENERAL COMMANDS

      conf <smb.conf>conf <smb.conf> - Load a different configuration file

    • help [<command>]help [<command>] - Get list of commands or info about specified command

    • debuglevel <level>debuglevel <level> - Set debug level

    • VERSION

      AUTHOR

      wbinfo

      wbinfo

      DESCRIPTION

      This tool is part of the SambaThis tool is part of the Samba(7) suite.

      The wbinfo program queries and returns information - created and used by the winbindd(8)winbindd(8) daemon.

      The winbindd(8)The winbindd(8) daemon must be configured and running for the

      OPTIONS

      This option will list all users available - in the Windows NT domain for which the winbindd(8) - winbindd(8) daemon is operating in. Users in all trusted domains will also be listed. Note that this operation does not assign - user ids to any users that have not already been seen by - winbindd(8).

      winbindd(8) + .

      -g

      This option will list all groups available - in the Windows NT domain for which the winbindd(8) - Samba(7) daemon is operating in. Groups in all trusted domains will also be listed. Note that this operation does not assign - group ids to any groups that have not already been seen by - winbindd(8)winbindd(8).

      -N option - queries winbindd(8)winbindd(8) to query the WINS server for the IP address associated with the NetBIOS name specified by the -I option - queries winbindd(8)winbindd(8) to send a node status request to get the NetBIOS name associated with the IP address specified by the -n option - queries winbindd(8)winbindd(8) for the SID associated with the name specified. Domain names can be specified before the user name by using the winbind separator character. For example CWDOM1/Administrator refers to the Administrator user in the domain CWDOM1. If no domain is specified then the - domain used is the one specified in the smb.conf - smb.conf(5) workgroupworkgroup + parameter.

      Convert a SID to a UNIX user id. If the SID - does not correspond to a UNIX user mapped by winbindd(8)winbindd(8) then the operation will fail.

      Convert a SID to a UNIX group id. If the SID - does not correspond to a UNIX group mapped by winbindd(8) then the operation will fail.

      winbindd(8) then + the operation will fail.

      -t

      Produce a list of domains trusted by the - Windows NT server winbindd(8)winbindd(8) contacts when resolving names. This list does not include the Windows NT domain the server is a Primary Domain Controller for. @@ -308,16 +344,18 @@ CLASS="COMMAND" >

      EXIT STATUS

      The wbinfo program returns 0 if the operation - succeeded, or 1 if the operation failed. If the winbindd(8) - winbindd(8) daemon is not working wbinfo

      VERSION

      SEE ALSO

      winbindd(8) - winbindd(8)

      AUTHOR

      The conversion to DocBook for Samba 2.2 was done - by Gerald Carter

      Unified Logons between Windows NT and UNIX using WinbindNext

      Chapter 15. Unified Logons between Windows NT and UNIX using Winbind

      Chapter 14. Unified Logons between Windows NT and UNIX using Winbind

      15.1. Abstract

      14.1. Abstract

      Integration of UNIX and Microsoft Windows NT through a unified logon has been considered a "holy grail" in heterogeneous @@ -104,7 +107,9 @@ CLASS="SECT1" >

      15.2. Introduction

      14.2. Introduction

      It is well known that UNIX and Microsoft Windows NT have different models for representing user and group information and @@ -156,7 +161,9 @@ CLASS="SECT1" >

      15.3. What Winbind Provides

      14.3. What Winbind Provides

      Winbind unifies UNIX and Windows NT account management by allowing a UNIX box to become a full member of a NT domain. Once @@ -196,7 +203,9 @@ CLASS="SECT2" >

      15.3.1. Target Uses

      14.3.1. Target Uses

      Winbind is targeted at organizations that have an existing NT based domain infrastructure into which they wish @@ -218,7 +227,9 @@ CLASS="SECT1" >

      15.4. How Winbind Works

      14.4. How Winbind Works

      The winbind system is designed around a client/server architecture. A long running

      15.4.1. Microsoft Remote Procedure Calls

      14.4.1. Microsoft Remote Procedure Calls

      Over the last two years, efforts have been underway +>Over the last few years, efforts have been underway by various Samba Team members to decode various aspects of the Microsoft Remote Procedure Call (MSRPC) system. This system is used for most network related operations between @@ -260,7 +273,28 @@ CLASS="SECT2" >

      15.4.2. Name Service Switch

      14.4.2. Microsoft Active Directory Services

      Since late 2001, Samba has gained the ability to + interact with Microsoft Windows 2000 using its 'Native + Mode' protocols, rather than the NT4 RPC services. + Using LDAP and Kerberos, a domain member running + winbind can enumerate users and groups in exactly the + same way as a Win2k client would, and in so doing + provide a much more efficient and + effective winbind implementation. +

      14.4.3. Name Service Switch

      The Name Service Switch, or NSS, is a feature that is present in many UNIX operating systems. It allows system @@ -338,7 +372,9 @@ CLASS="SECT2" >

      15.4.3. Pluggable Authentication Modules

      14.4.4. Pluggable Authentication Modules

      Pluggable Authentication Modules, also known as PAM, is a system for abstracting authentication and authorization @@ -385,7 +421,9 @@ CLASS="SECT2" >

      15.4.4. User and Group ID Allocation

      14.4.5. User and Group ID Allocation

      When a user or group is created under Windows NT is it allocated a numerical relative identifier (RID). This is @@ -409,7 +447,9 @@ CLASS="SECT2" >

      15.4.5. Result Caching

      14.4.6. Result Caching

      An active system can generate a lot of user and group name lookups. To reduce the network cost of these lookups winbind @@ -430,7 +470,9 @@ CLASS="SECT1" >

      15.5. Installation and Configuration

      14.5. Installation and Configuration

      Many thanks to John Trostel

      15.5.1. Introduction

      14.5.1. Introduction

      This HOWTO describes the procedures used to get winbind up and running on my RedHat 7.1 system. Winbind is capable of providing access @@ -512,7 +556,9 @@ CLASS="SECT2" >

      15.5.2. Requirements

      14.5.2. Requirements

      If you have a samba configuration file that you are currently using...

      15.5.3. Testing Things Out

      14.5.3. Testing Things Out

      Before starting, it is probably best to kill off all the SAMBA related daemons running on your server. Kill off all

      15.5.3.1. Configure and compile SAMBA

      14.5.3.1. Configure and compile SAMBA

      The configuration and compilation of SAMBA is pretty straightforward. The first three steps may not be necessary depending upon @@ -657,7 +707,7 @@ CLASS="PROMPT" >root# ./configure --with-winbind./configure

      15.5.3.2. Configure 14.5.3.2. Configure nsswitch.conf and the @@ -790,7 +842,9 @@ CLASS="SECT3" >

      15.5.3.3. Configure smb.conf

      14.5.3.3. Configure smb.conf

      Several parameters are needed in the smb.conf file to control the behavior of

      [global]
      -     <...>
      +     <...>
            # separate domain and username with '+', like DOMAIN+username
            

      15.5.3.4. Join the SAMBA server to the PDC domain

      14.5.3.4. Join the SAMBA server to the PDC domain

      Enter the following command to make the SAMBA server join the PDC domain, where root# /usr/local/samba/bin/net rpc join -S PDC -U Administrator/usr/local/samba/bin/net join -S PDC -U Administrator

      The proper response to the command should be: "Joined the domain @@ -907,7 +963,9 @@ CLASS="SECT3" >

      15.5.3.5. Start up the winbindd daemon and test it!

      14.5.3.5. Start up the winbindd daemon and test it!

      Eventually, you will want to modify your smb startup script to automatically invoke the winbindd daemon when the other parts of @@ -1028,13 +1086,17 @@ CLASS="SECT3" >

      15.5.3.6. Fix the init.d startup scripts

      14.5.3.6. Fix the init.d startup scripts

      15.5.3.6.1. Linux

      14.5.3.6.1. Linux

      The

      15.5.3.6.2. Solaris

      14.5.3.6.2. Solaris

      On solaris, you need to modify the

      15.5.3.6.3. Restarting

      14.5.3.6.3. Restarting

      If you restart the

      15.5.3.7. Configure Winbind and PAM

      14.5.3.7. Configure Winbind and PAM

      If you have made it this far, you know that winbindd and samba are working together. If you want to use winbind to provide authentication for other @@ -1275,7 +1343,9 @@ CLASS="SECT4" >

      15.5.3.7.1. Linux/FreeBSD-specific PAM configuration

      14.5.3.7.1. Linux/FreeBSD-specific PAM configuration

      The

      15.5.3.7.2. Solaris-specific configuration

      14.5.3.7.2. Solaris-specific configuration

      The /etc/pam.conf needs to be changed. I changed this file so that my Domain users can logon both locally as well as telnet.The following are the changes @@ -1476,7 +1548,7 @@ dtsession auth required /usr/lib/security/$ISA/pam_unix.so.1 >I also added a try_first_pass line after the winbind.so line to get rid of annoying double prompts for passwords.

      Now restart your Samba & try connecting through your application that you +>Now restart your Samba and try connecting through your application that you configured in the pam.conf.

      15.6. Limitations

      14.6. Limitations

      Winbind has a number of limitations in its current released version that we hope to overcome in future @@ -1498,7 +1572,7 @@ NAME="AEN2542">15.6. Limitations

    • Winbind is currently only available for - the Linux operating system, although ports to other operating + the Linux, Solaris and IRIX operating systems, although ports to other operating systems are certainly possible. For such ports to be feasible, we require the C library of the target operating system to support the Name Service Switch and Pluggable Authentication @@ -1517,7 +1591,8 @@ NAME="AEN2542">15.6. Limitations

      Currently the winbind PAM module does not take into account possible workstation and logon time restrictions - that may be been set for Windows NT users.

    • 15.7. Conclusion

      14.7. Conclusion

      The winbind system, through the use of the Name Service Switch, Pluggable Authentication Modules, and appropriate @@ -1570,7 +1647,7 @@ WIDTH="33%" ALIGN="right" VALIGN="top" >NextPassdb MySQL pluginImproved browsing in samba

      + winbindd

      winbindd

      winbindd

      Synopsis

      winbindd [-F] [-S] [-i] [-B] [-d <debug level>] [-s <smb config file>] [-n]

      [-F] [-S] [-i] [-B] [-d <debug level>] [-s <smb config file>] [-n]

      DESCRIPTION

      This program is part of the SambaThis program is part of the Samba(7) suite.

      /etc/group and then from the - Windows NT server.

      passwd:         files winbind
      -group:          files winbind
      -	

      The following simple configuration in the @@ -198,7 +192,7 @@ CLASS="FILENAME" >

      OPTIONS

      Specifies the location of the all-important - smb.confsmb.conf(5) file.

    • NAME AND ID RESOLUTION

      CONFIGURATION

      winbindd
      daemon - is done through configuration parameters in the smb.conf(5) - smb.conf(5) file. All parameters should be specified in the [global] section of smb.conf.

      EXAMPLE SETUP

      /etc/nsswitch.conf
      put the - following:

      passwd:     files winbind
      -group:      files winbind
      -	

      In /etc/pam.d/* replace the - replace the auth auth lines with something like this:

       lines with something like this:
      +
      auth       required	/lib/security/pam_securetty.so
       auth       required	/lib/security/pam_nologin.so
       auth       sufficient	/lib/security/pam_winbind.so
      -auth       required     /lib/security/pam_pwdb.so use_first_pass shadow nullok
      -	

      Note in particular the use of the sufficientsufficient + - keyword and the keyword and the use_first_pass

      smbpasswd -j DOMAIN -r PDC -U - Administratornet join -S PDC -U Administrator

      The username after the can be any Domain user that has administrator privileges on the machine. - Substitute your domain name for "DOMAIN" and the name of your PDC - for "PDC".

      Next copy /lib and pam_winbind.so - to pam_winbind.so + to /lib/security. A symbolic link needs to be @@ -624,19 +598,15 @@ CLASS="FILENAME" >/lib/libnss_winbind.so.1.

      Finally, setup a smb.confFinally, setup a smb.conf(5) containing directives like the - following:

      [global]
       	winbind separator = +
      @@ -647,11 +617,7 @@ CLASS="PROGRAMLISTING"
               winbind gid = 10000-20000
               workgroup = DOMAIN
               security = domain
      -        password server = *
      -	

      Now start winbindd and you should find that your user and @@ -670,7 +636,7 @@ CLASS="COMMAND" >

      NOTES

      winbindd
      :

      nmbdnmbd(8) must be running on the local machine for to work. winbindd - queries the list of trusted domains for the Windows NT server +> queries + the list of trusted domains for the Windows NT server on startup and when a SIGHUP is received. Thus, for a running winbindd

      SIGNALS

      SIGHUP

      Reload the smb.conf(5) - file and apply any parameter changes to the running +>Reload the smb.conf(5) file and + apply any parameter changes to the running version of winbindd. This signal also clears any cached user and group information. The list of other domains trusted by winbindd is also reloaded.

      FILES

      VERSION

      SEE ALSO

      nsswitch.conf(5), - samba(7), - wbinfo(1), - smb.conf(5), Samba(7), wbinfo(8), smb.conf(5)

      AUTHOR

      and winbindd - were written by Tim Potter.

      were + written by Tim Potter.

      The conversion to DocBook for Samba 2.2 was done - by Gerald Carter

      .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "FINDSMB" "1" "15 January 2003" "" "" +.TH "FINDSMB" "1" "28 January 2003" "" "" + .SH NAME findsmb \- list info about machines that respond to SMB name queries on a subnet .SH SYNOPSIS @@ -12,12 +13,15 @@ findsmb \- list info about machines that respond to SMB name queries on a subne .SH "DESCRIPTION" .PP -This perl script is part of the Samba suite. +This perl script is part of the \fBSamba\fR(7) +suite. .PP \fBfindsmb\fR is a perl script that prints out several pieces of information about machines on a subnet that respond to SMB name query requests. -It uses \fB nmblookup(1)\fR to obtain this information. +It uses \fBnmblookup\fR(1) +and \fBsmbclient\fR(1) +to obtain this information. .SH "OPTIONS" .TP \fB-r\fR @@ -25,15 +29,16 @@ Controls whether \fBfindsmb\fR takes bugs in Windows95 into account when trying to find a Netbios name registered of the remote machine. This option is disabled by default because it is specific to Windows 95 and Windows 95 machines only. -If set, \fBnmblookup\fR +If set, \fBnmblookup\fR(1) will be called with -B option. .TP \fBsubnet broadcast address\fR Without this option, \fBfindsmb \fR will probe the subnet of the machine where -\fBfindsmb\fR is run. This value is passed -to \fBnmblookup\fR as part of the --B option. +\fBfindsmb\fR(1) +is run. This value is passed to +\fBnmblookup\fR(1) +as part of the -B option. .SH "EXAMPLES" .PP The output of \fBfindsmb\fR lists the following @@ -50,15 +55,15 @@ not show any information about the operating system or server version. .PP The command with -r option -must be run on a system without \fBnmbd\fR running. +must be run on a system without \fBnmbd\fR(8) running. If \fBnmbd\fR is running on the system, you will only get the IP address and the DNS name of the machine. To get proper responses from Windows 95 and Windows 98 machines, the command must be run as root and with -r option on a machine without \fBnmbd\fR running. .PP -For example, running \fBfindsmb\fR without --r option set would yield output similar +For example, running \fBfindsmb\fR +without -r option set would yield output similar to the following .nf @@ -74,7 +79,6 @@ IP ADDR NETBIOS NAME WORKGROUP/OS/VERSION 192.168.35.88 SCNT2 +[MVENGR] [Windows NT 4.0] [NT LAN Manager 4.0] 192.168.35.93 FROGSTAR-PC [MVENGR] [Windows 5.0] [Windows 2000 LAN Manager] 192.168.35.97 HERBNT1 *[HERB-NT] [Windows NT 4.0] [NT LAN Manager 4.0] - .fi .SH "VERSION" .PP @@ -82,9 +86,8 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBnmbd(8)\fR -\fBsmbclient(1) -\fR and \fBnmblookup(1)\fR +\fBnmbd\fR(8), +\fBsmbclient\fR(1), and \fBnmblookup\fR(1) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -94,7 +97,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 -release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) +and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for +Samba 2.2 was done by Gerald Carter. The conversion to DocBook +XML 4.2 for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/lmhosts.5 b/docs/manpages/lmhosts.5 index e5443f61e8..72509fa78c 100644 --- a/docs/manpages/lmhosts.5 +++ b/docs/manpages/lmhosts.5 @@ -3,15 +3,16 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "LMHOSTS" "5" "05 November 2002" "" "" +.TH "LMHOSTS" "5" "28 January 2003" "" "" + .SH NAME lmhosts \- The Samba NetBIOS hosts file .SH SYNOPSIS .PP -\fIlmhosts\fR is the Samba NetBIOS name to IP address mapping file. +\fIlmhosts\fR is the \fBSamba\fR(7) NetBIOS name to IP address mapping file. .SH "DESCRIPTION" .PP -This file is part of the Samba suite. +This file is part of the \fBSamba\fR(7) suite. .PP \fIlmhosts\fR is the \fBSamba \fR NetBIOS name to IP address mapping file. It @@ -23,7 +24,7 @@ to the NetBIOS naming format. It is an ASCII file containing one line for NetBIOS name. The two fields on each line are separated from each other by white space. Any entry beginning with '#' is ignored. Each line -in the lmhosts file contains the following information : +in the lmhosts file contains the following information: .TP 0.2i \(bu IP Address - in dotted decimal format. @@ -38,8 +39,7 @@ If the trailing '#' is omitted then the given IP address will be returned for all names that match the given name, whatever the NetBIOS name type in the lookup. .PP -An example follows : -.PP +An example follows: .nf # @@ -61,16 +61,13 @@ type for a name "NTSERVER" is queried. Any other name type will not be resolved. .PP The default location of the \fIlmhosts\fR file -is in the same directory as the -smb.conf(5)> file. +is in the same directory as the \fBsmb.conf\fR(5) file. .SH "VERSION" .PP -This man page is correct for version 2.2 of -the Samba suite. +This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBsmbclient(1) -\fR and \fB smbpasswd(8)\fR +\fBsmbclient\fR(1), \fBsmb.conf\fR(5), and \fBsmbpasswd\fR(8) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -83,4 +80,5 @@ The man page sources were converted to YODL format (another excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook +XML 4.2 was done by Alexander Bokovoy. diff --git a/docs/manpages/net.8 b/docs/manpages/net.8 index bf2b13997c..d65a9663f1 100644 --- a/docs/manpages/net.8 +++ b/docs/manpages/net.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "NET" "8" "05 November 2002" "" "" +.TH "NET" "8" "28 January 2003" "" "" + .SH NAME net \- Tool for administration of Samba and remote CIFS servers. .SH SYNOPSIS @@ -12,7 +13,7 @@ net \- Tool for administration of Samba and remote CIFS servers. .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP The samba net utility is meant to work just like the net utility available for windows and DOS. @@ -22,7 +23,8 @@ available for windows and DOS. Display summary of all available options. .TP \fB-w target-workgroup\fR -Sets target workgroup or domain. You have to specify either this option or the IP address or the name of a server. +Sets target workgroup or domain. You have to specify +either this option or the IP address or the name of a server. .TP \fB-W workgroup\fR Sets client workgroup or domain @@ -31,7 +33,8 @@ Sets client workgroup or domain User name to use .TP \fB-I ip-address\fR -IP address of target server to use. You have to specify either this option or a target workgroup or a target server. +IP address of target server to use. You have to +specify either this option or a target workgroup or a target server. .TP \fB-p port\fR Port on the target server to connect to. @@ -43,7 +46,8 @@ Sets name of the client. Specify alternative configuration file that should be loaded. .TP \fB-S server\fR -Name of target server. You should specify either this option or a target workgroup or a target IP address. +Name of target server. You should specify either +this option or a target workgroup or a target IP address. .TP \fB-C comment\fR FIXME @@ -87,11 +91,11 @@ Without any options, the \fBNET TIME\fR command displays the time on the remote server. .TP \fBSYSTEM\fR -Displays the time on the remote server in a format ready for /bin/date +Displays the time on the remote server in a format ready for \fB/bin/date\fR .TP \fBSET\fR Tries to set the date and time of the local server to that on -the remote server using /bin/date. +the remote server using \fB/bin/date\fR. .TP \fBZONE\fR Displays the timezone in hours from GMT on the remote computer. @@ -116,7 +120,7 @@ delete specified user \fBUSER INFO [misc options]\fR list the domain groups of the specified user .TP -\fBUSER ADD [password] [-F user flags] [misc. options\fR +\fBUSER ADD [password] [-F user flags] [misc. options]\fR Add specified user .TP \fBGROUP [misc options] [targets]\fR diff --git a/docs/manpages/nmbd.8 b/docs/manpages/nmbd.8 index ff98f0ce44..d8bff8bd46 100644 --- a/docs/manpages/nmbd.8 +++ b/docs/manpages/nmbd.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "NMBD" "8" "03 January 2003" "" "" +.TH "NMBD" "8" "28 January 2003" "" "" + .SH NAME nmbd \- NetBIOS name server to provide NetBIOS over IP naming services to clients .SH SYNOPSIS @@ -12,7 +13,7 @@ nmbd \- NetBIOS name server to provide NetBIOS over IP naming services to clien .SH "DESCRIPTION" .PP -This program is part of the Samba suite. +This program is part of the \fBSamba\fR(7) suite. .PP \fBnmbd\fR is a server that understands and can reply to NetBIOS over IP name service requests, like @@ -34,7 +35,7 @@ but this can be overridden with the \fB-n\fR option (see OPTIONS below). Thus \fBnmbd\fR will reply to broadcast queries for its own name(s). Additional names for \fBnmbd\fR to respond on can be set -via parameters in the \fI smb.conf(5)\fR configuration file. +via parameters in the \fBsmb.conf\fR(5) configuration file. .PP \fBnmbd\fR can also be used as a WINS (Windows Internet Name Server) server. What this basically means @@ -85,7 +86,7 @@ server to run "interactively", not as a daemon, even if the server is executed on the command line of a shell. Setting this parameter negates the implicit daemon mode when run from the command line. \fBnmbd\fR also logs to standard -output, as if the \fB-S\fR parameter had been +output, as if the -S parameter had been given. .TP \fB-o\fR @@ -102,8 +103,9 @@ for \fBnmbd\fR. NetBIOS lmhosts file. The lmhosts file is a list of NetBIOS names to IP addresses that is loaded by the nmbd server and used via the name -resolution mechanism name resolve order described in \fIsmb.conf(5)\fR -to resolve any NetBIOS name queries needed by the server. Note +resolution mechanism \fIname resolve +order\fR described in \fBsmb.conf\fR(5) to resolve any +NetBIOS name queries needed by the server. Note that the contents of this file are \fBNOT\fR used by \fBnmbd\fR to answer any name queries. Adding a line to this file affects name NetBIOS resolution @@ -113,9 +115,7 @@ The default path to this file is compiled into Samba as part of the build process. Common defaults are \fI/usr/local/samba/lib/lmhosts\fR, \fI/usr/samba/lib/lmhosts\fR or -\fI/etc/lmhosts\fR. See the -\fIlmhosts(5)\fR -man page for details on the contents of this file. +\fI/etc/samba/lmhosts\fR. See the \fBlmhosts\fR(5) man page for details on the contents of this file. .TP \fB-V\fR Prints the version number for @@ -140,8 +140,8 @@ and generate HUGE amounts of log data, most of which is extremely cryptic. Note that specifying this parameter here will override -the log level -parameter in the \fI smb.conf(5)\fR file. +the \fIlog level\fR +parameter in the \fBsmb.conf\fR(5) file. .TP \fB-l \fR The -l parameter specifies a directory @@ -156,10 +156,10 @@ will log to the default debug log location defined at compile time. \fB-n \fR This option allows you to override the NetBIOS name that Samba uses for itself. This is identical -to setting the NetBIOS name parameter in the -\fIsmb.conf\fR file. However, a command +to setting the \fINetBIOS +name\fR parameter in the \fBsmb.conf\fR(5) file. However, a command line setting will take precedence over settings in -\fIsmb.conf\fR. +\fBsmb.conf\fR(5). .TP \fB-p \fR UDP port number is a positive integer value. @@ -174,14 +174,14 @@ is set at build time, typically as \fI /usr/local/samba/lib/smb.conf\fR, but this may be changed when Samba is autoconfigured. The file specified contains the configuration details -required by the server. See \fIsmb.conf(5)\fR for more information. +required by the server. See \fBsmb.conf\fR(5) for more information. .SH "FILES" .TP \fB\fI/etc/inetd.conf\fB\fR If the server is to be run by the \fBinetd\fR meta-daemon, this file must contain suitable startup information for the -meta-daemon. See the UNIX_INSTALL.html document +meta-daemon. See the install document for details. .TP \fB\fI/etc/rc\fB\fR @@ -190,7 +190,7 @@ system uses). If running the server as a daemon at startup, this file will need to contain an appropriate startup -sequence for the server. See the UNIX_INSTALL.html document +sequence for the server. See the "How to Install and Test SAMBA" document for details. .TP \fB\fI/etc/services\fB\fR @@ -198,27 +198,26 @@ If running the server via the meta-daemon \fBinetd\fR, this file must contain a mapping of service name (e.g., netbios-ssn) to service port (e.g., 139) and protocol type (e.g., tcp). -See the UNIX_INSTALL.html +See the "How to Install and Test SAMBA" document for details. .TP \fB\fI/usr/local/samba/lib/smb.conf\fB\fR -This is the default location of the -\fIsmb.conf\fR -server configuration file. Other common places that systems +This is the default location of +the \fBsmb.conf\fR(5) server +configuration file. Other common places that systems install this file are \fI/usr/samba/lib/smb.conf\fR -and \fI/etc/smb.conf\fR. +and \fI/etc/samba/smb.conf\fR. When run as a WINS server (see the wins support -parameter in the \fIsmb.conf(5)\fR man page), +parameter in the \fBsmb.conf\fR(5) man page), \fBnmbd\fR will store the WINS database in the file \fIwins.dat\fR in the \fIvar/locks\fR directory configured under wherever Samba was configured to install itself. If \fBnmbd\fR is acting as a \fB browse master\fR (see the local master -parameter in the \fIsmb.conf(5)\fR man page, -\fBnmbd\fR +parameter in the \fBsmb.conf\fR(5) man page, \fBnmbd\fR will store the browsing database in the file \fIbrowse.dat \fR in the \fIvar/locks\fR directory configured under wherever Samba was configured to install itself. @@ -238,10 +237,10 @@ under wherever Samba was configured to install itself). This will also cause \fBnmbd\fR to dump out its server database in the \fIlog.nmb\fR file. .PP -The debug log level of nmbd may be raised or lowered using -\fBsmbcontrol(1)\fR - (SIGUSR[1|2] signals are no longer used in Samba 2.2). This is -to allow transient problems to be diagnosed, whilst still running +The debug log level of nmbd may be raised or lowered +using \fBsmbcontrol\fR(1) (SIGUSR[1|2] signals +are no longer used since Samba 2.2). This is to allow +transient problems to be diagnosed, whilst still running at a normally low log level. .SH "VERSION" .PP @@ -249,11 +248,8 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBinetd(8)\fR, \fBsmbd(8)\fR -\fIsmb.conf(5)\fR - \fBsmbclient(1) -\fR and the Internet RFC's -\fIrfc1001.txt\fR, \fIrfc1002.txt\fR. +\fBinetd\fR(8), \fBsmbd\fR(8), \fBsmb.conf\fR(5), \fBsmbclient\fR(1), \fBtestparm\fR(1), \fBtestprns\fR(1), and the Internet +RFC's \fIrfc1001.txt\fR, \fIrfc1002.txt\fR. In addition the CIFS (formerly SMB) specification is available as a link from the Web page http://samba.org/cifs/ . @@ -266,7 +262,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook +XML 4.2 for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/nmblookup.1 b/docs/manpages/nmblookup.1 index ecf10dfc1f..7abd080bf8 100644 --- a/docs/manpages/nmblookup.1 +++ b/docs/manpages/nmblookup.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "NMBLOOKUP" "1" "05 November 2002" "" "" +.TH "NMBLOOKUP" "1" "28 January 2003" "" "" + .SH NAME nmblookup \- NetBIOS over TCP/IP client used to lookup NetBIOS names .SH SYNOPSIS @@ -12,7 +13,7 @@ nmblookup \- NetBIOS over TCP/IP client used to lookup NetBIOS names .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBnmblookup\fR is used to query NetBIOS names and map them to IP addresses in a network using NetBIOS over TCP/IP @@ -33,7 +34,7 @@ to do a recursive lookup. This is used when sending a name query to a machine running a WINS server and the user wishes to query the names in the WINS server. If this bit is unset the normal (broadcast responding) NetBIOS processing code -on a machine is used instead. See rfc1001, rfc1002 for details. +on a machine is used instead. See RFC1001, RFC1002 for details. .TP \fB-S\fR Once the name query has returned an IP @@ -46,8 +47,7 @@ datagrams. The reason for this option is a bug in Windows 95 where it ignores the source port of the requesting packet and only replies to UDP port 137. Unfortunately, on most UNIX systems root privilege is needed to bind to this port, and -in addition, if the nmbd(8) -daemon is running on this machine it also binds to this port. +in addition, if the \fBnmbd\fR(8) daemon is running on this machine it also binds to this port. .TP \fB-A\fR Interpret \fIname\fR as @@ -61,7 +61,7 @@ Send the query to the given broadcast address. Without this option the default behavior of nmblookup is to send the query to the broadcast address of the network interfaces as either auto-detected or defined in the \fIinterfaces\fR - parameter of the \fIsmb.conf (5)\fR file. + parameter of the \fBsmb.conf\fR(5) file. .TP \fB-U \fR Do a unicast query to the specified address or @@ -126,8 +126,8 @@ area. .PP \fBnmblookup\fR can be used to query a WINS server (in the same way \fBnslookup\fR is -used to query DNS servers). To query a WINS server, -\fBnmblookup\fR must be called like this: +used to query DNS servers). To query a WINS server, \fBnmblookup\fR +must be called like this: .PP \fBnmblookup -U server -R 'name'\fR .PP @@ -143,8 +143,7 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBnmbd(8)\fR -samba(7) and smb.conf(5) +\fBnmbd\fR(8), \fBsamba\fR(7), and \fBsmb.conf\fR(5). .SH "AUTHOR" .PP The original Samba software and related utilities @@ -154,7 +153,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook +XML 4.2 for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/pdbedit.8 b/docs/manpages/pdbedit.8 index 278bc2727a..bd225a1805 100644 --- a/docs/manpages/pdbedit.8 +++ b/docs/manpages/pdbedit.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "PDBEDIT" "8" "26 November 2002" "" "" +.TH "PDBEDIT" "8" "28 January 2003" "" "" + .SH NAME pdbedit \- manage the SAM database .SH SYNOPSIS @@ -12,7 +13,7 @@ pdbedit \- manage the SAM database .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP The pdbedit program is used to manage the users accounts stored in the sam database and can only be run by root. @@ -37,9 +38,8 @@ Example: \fBpdbedit -l\fR .nf - sorce:500:Simo Sorce - samba:45:Test User - +sorce:500:Simo Sorce +samba:45:Test User .fi .TP \fB-v\fR @@ -51,40 +51,38 @@ Example: \fBpdbedit -l -v\fR .nf - --------------- - username: sorce - user ID/Group: 500/500 - user RID/GRID: 2000/2001 - Full Name: Simo Sorce - Home Directory: \\\\BERSERKER\\sorce - HomeDir Drive: H: - Logon Script: \\\\BERSERKER\\netlogon\\sorce.bat - Profile Path: \\\\BERSERKER\\profile - --------------- - username: samba - user ID/Group: 45/45 - user RID/GRID: 1090/1091 - Full Name: Test User - Home Directory: \\\\BERSERKER\\samba - HomeDir Drive: - Logon Script: - Profile Path: \\\\BERSERKER\\profile - +--------------- +username: sorce +user ID/Group: 500/500 +user RID/GRID: 2000/2001 +Full Name: Simo Sorce +Home Directory: \\\\BERSERKER\\sorce +HomeDir Drive: H: +Logon Script: \\\\BERSERKER\\netlogon\\sorce.bat +Profile Path: \\\\BERSERKER\\profile +--------------- +username: samba +user ID/Group: 45/45 +user RID/GRID: 1090/1091 +Full Name: Test User +Home Directory: \\\\BERSERKER\\samba +HomeDir Drive: +Logon Script: +Profile Path: \\\\BERSERKER\\profile .fi .TP \fB-w\fR This option sets the "smbpasswd" listing format. It will make pdbedit list the users in the database, printing out the account fields in a format compatible with the -\fIsmbpasswd\fR file format. (see the \fIsmbpasswd(5)\fR for details) +\fIsmbpasswd\fR file format. (see the +\fBsmbpasswd\fR(5) for details) Example: \fBpdbedit -l -w\fR - .nf - sorce:500:508818B733CE64BEAAD3B435B51404EE:D2A2418EFC466A8A0F6B1DBB5C3DB80C:[UX ]:LCT-00000000: - samba:45:0F2B255F7B67A7A9AAD3B435B51404EE:BC281CE3F53B6A5146629CD4751D3490:[UX ]:LCT-3BFA1E8D: - +sorce:500:508818B733CE64BEAAD3B435B51404EE:D2A2418EFC466A8A0F6B1DBB5C3DB80C:[UX ]:LCT-00000000: +samba:45:0F2B255F7B67A7A9AAD3B435B51404EE:BC281CE3F53B6A5146629CD4751D3490:[UX ]:LCT-3BFA1E8D: .fi .TP \fB-u username\fR @@ -139,7 +137,7 @@ Example: \fBpdbedit -a -u sorce\fR .nf new password: - retype new password +retype new password .fi .TP \fB-m\fR @@ -193,8 +191,7 @@ Example: \fBpdbedit -P "bad lockout attempt"\fR .nf - account policy value for bad lockout attempt is 0 - +account policy value for bad lockout attempt is 0 .fi .TP \fB-V account-policy-value\fR @@ -206,9 +203,8 @@ Example: \fBpdbedit -P "bad lockout attempt" -V 3\fR .nf - account policy value for bad lockout attempt was 0 - account policy value for bad lockout attempt is now 3 - +account policy value for bad lockout attempt was 0 +account policy value for bad lockout attempt is now 3 .fi .TP \fB-d|--debug=debuglevel\fR @@ -254,8 +250,7 @@ This man page is correct for version 2.2 of the Samba suite. .SH "SEE ALSO" .PP -smbpasswd(8) -samba(7) +\fBsmbpasswd\fR(5), \fBsamba\fR(7) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -265,7 +260,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook +XML 4.2 for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/rpcclient.1 b/docs/manpages/rpcclient.1 index e09892b5b9..d62080f596 100644 --- a/docs/manpages/rpcclient.1 +++ b/docs/manpages/rpcclient.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "RPCCLIENT" "1" "05 November 2002" "" "" +.TH "RPCCLIENT" "1" "28 January 2003" "" "" + .SH NAME rpcclient \- tool for executing client side MS-RPC functions .SH SYNOPSIS @@ -12,7 +13,7 @@ rpcclient \- tool for executing client side MS-RPC functions .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBrpcclient\fR is a utility initially developed to test MS-RPC functionality in Samba itself. It has undergone @@ -24,8 +25,7 @@ their UNIX workstation. \fBserver\fR NetBIOS name of Server to which to connect. The server can be any SMB/CIFS server. The name is -resolved using the \fIname resolve order\fR line from -\fIsmb.conf(5)\fR. +resolved using the \fIname resolve order\fR line from \fBsmb.conf\fR(5). .TP \fB-A|--authfile=filename\fR This option allows @@ -34,10 +34,9 @@ password used in the connection. The format of the file is .nf - username = - password = - domain = - +username = +password = +domain = .fi Make certain that the permissions on the file restrict @@ -47,6 +46,9 @@ access from unwanted users. execute semicolon separated commands (listed below)) .TP +\fB-h|--help\fR +Print a summary of command line options. +.TP \fB-d|--debug=debuglevel\fR \fIdebuglevel\fR is an integer from 0 to 10. The default value if this parameter is @@ -69,9 +71,6 @@ Note that specifying this parameter here will override the log level file. .TP -\fB-h|--help\fR -Print a summary of command line options. -.TP \fB-I IP-address\fR \fIIP address\fR is the address of the server to connect to. It should be specified in standard "a.b.c.d" notation. @@ -193,15 +192,14 @@ follows: .nf - Long Printer Name:\\ - Driver File Name:\\ - Data File Name:\\ - Config File Name:\\ - Help File Name:\\ - Language Monitor Name:\\ - Default Data Type:\\ - Comma Separated list of Files - +Long Printer Name:\\ +Driver File Name:\\ +Data File Name:\\ +Config File Name:\\ +Help File Name:\\ +Language Monitor Name:\\ +Default Data Type:\\ +Comma Separated list of Files .fi Any empty fields should be enter as the string "NULL". @@ -327,7 +325,7 @@ parameters where passed to the interpreter. .PP From Luke Leighton's original rpcclient man page: .PP -\fB"WARNING!\fR The MSRPC over SMB code has +\fBWARNING!\fR The MSRPC over SMB code has been developed from examining Network traces. No documentation is available from the original creators (Microsoft) on how MSRPC over SMB works, or how the individual MSRPC services work. Microsoft's @@ -335,12 +333,11 @@ implementation of these services has been demonstrated (and reported) to be... a bit flaky in places. .PP The development of Samba's implementation is also a bit rough, -and as more of the services are understood, it can even result in -versions of \fBsmbd(8)\fR and \fBrpcclient(1)\fR -that are incompatible for some commands or services. Additionally, +and as more of the services are understood, it can even result in +versions of \fBsmbd\fR(8) and \fBrpcclient\fR(1) that are incompatible for some commands or services. Additionally, the developers are sending reports to Microsoft, and problems found or reported to Microsoft are fixed in Service Packs, which may -result in incompatibilities." +result in incompatibilities. .SH "VERSION" .PP This man page is correct for version 3.0 of the Samba @@ -355,4 +352,5 @@ to the way the Linux kernel is developed. The original rpcclient man page was written by Matthew Geddes, Luke Kenneth Casson Leighton, and rewritten by Gerald Carter. The conversion to DocBook for Samba 2.2 was done by Gerald -Carter. +Carter. The conversion to DocBook XML 4.2 for Samba 3.0 was +done by Alexander Bokovoy. diff --git a/docs/manpages/samba.7 b/docs/manpages/samba.7 index 0635cc7884..0a25cbfe88 100644 --- a/docs/manpages/samba.7 +++ b/docs/manpages/samba.7 @@ -3,9 +3,10 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SAMBA" "7" "05 November 2002" "" "" +.TH "SAMBA" "7" "28 January 2003" "" "" + .SH NAME -SAMBA \- A Windows SMB/CIFS fileserver for UNIX +Samba \- A Windows SMB/CIFS fileserver for UNIX .SH SYNOPSIS \fBSamba\fR @@ -19,20 +20,19 @@ also referred to as the Common Internet File System (CIFS). For a more thorough description, see http://www.ubiqx.org/cifs/ . Samba also implements the NetBIOS protocol in nmbd. .TP -\fBsmbd\fR -The \fBsmbd \fR -daemon provides the file and print services to +\fBsmbd(8)\fR +The \fBsmbd\fR daemon provides the file and print services to SMB clients, such as Windows 95/98, Windows NT, Windows for Workgroups or LanManager. The configuration file -for this daemon is described in \fIsmb.conf\fR +for this daemon is described in \fBsmb.conf\fR(5) .TP -\fBnmbd\fR +\fBnmbd(8)\fR The \fBnmbd\fR daemon provides NetBIOS nameservice and browsing support. The configuration file for this daemon -is described in \fIsmb.conf\fR +is described in \fBsmb.conf\fR(5) .TP -\fBsmbclient\fR +\fBsmbclient(1)\fR The \fBsmbclient\fR program implements a simple ftp-like client. This is useful for accessing SMB shares on other compatible @@ -40,33 +40,33 @@ servers (such as Windows NT), and can also be used to allow a UNIX box to print to a printer attached to any SMB server (such as a PC running Windows NT). .TP -\fBtestparm\fR +\fBtestparm(1)\fR The \fBtestparm\fR -utility is a simple syntax checker for Samba's -\fIsmb.conf\fRconfiguration file. +utility is a simple syntax checker for Samba's \fBsmb.conf\fR(5) configuration file. .TP -\fBtestprns\fR +\fBtestprns(1)\fR The \fBtestprns\fR utility supports testing printer names defined in your \fIprintcap\fR file used by Samba. .TP -\fBsmbstatus\fR +\fBsmbstatus(1)\fR The \fBsmbstatus\fR tool provides access to information about the current connections to \fBsmbd\fR. .TP -\fBnmblookup\fR +\fBnmblookup(1)\fR The \fBnmblookup\fR tools allows NetBIOS name queries to be made from a UNIX host. .TP -\fBmake_smbcodepage\fR -The \fBmake_smbcodepage\fR -utility provides a means of creating SMB code page -definition files for your \fBsmbd\fR server. +\fBsmbgroupedit(8)\fR +The \fBsmbgroupedit\fR +tool allows for mapping unix groups to NT Builtin, +Domain, or Local groups. Also it allows setting +priviledges for that group, such as saAddUser, etc. .TP -\fBsmbpasswd\fR +\fBsmbpasswd(8)\fR The \fBsmbpasswd\fR command is a tool for changing LanMan and Windows NT password hashes on Samba and Windows NT servers. @@ -101,13 +101,13 @@ on the newsgroup comp.protocol.smb and the Samba list. Details on how to join the mailing list are given in the README file that comes with Samba. .PP -If you have access to a WWW viewer (such as Netscape -or Mosaic) then you will also find lots of useful information, +If you have access to a WWW viewer (such as Mozilla +or Konqueror) then you will also find lots of useful information, including back issues of the Samba mailing list, at http://lists.samba.org . .SH "VERSION" .PP -This man page is correct for version 2.2 of the +This man page is correct for version 3.0 of the Samba suite. .SH "CONTRIBUTIONS" .PP @@ -117,8 +117,8 @@ http://lists.samba.org . .PP If you have patches to submit, visit http://devel.samba.org/ -for information on how to do it properly. We prefer patches in -\fBdiff -u\fR format. +for information on how to do it properly. We prefer patches +in \fBdiff -u\fR format. .SH "CONTRIBUTORS" .PP Contributors to the project are now too numerous @@ -141,7 +141,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML +4.2 for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smb.conf.5 b/docs/manpages/smb.conf.5 index 8010871d66..fee4cf8989 100644 --- a/docs/manpages/smb.conf.5 +++ b/docs/manpages/smb.conf.5 @@ -3,18 +3,18 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMB.CONF" "5" "15 January 2003" "" "" +.TH "SMB.CONF" "5" "18 February 2003" "" "" + .SH NAME smb.conf \- The configuration file for the Samba suite .SH "SYNOPSIS" .PP -The \fIsmb.conf\fR file is a configuration -file for the Samba suite. \fIsmb.conf\fR contains -runtime configuration information for the Samba programs. The -\fIsmb.conf\fR file is designed to be configured and -administered by the \fBswat(8)\fR - program. The complete description of the file format and -possible parameters held within are here for reference purposes. +The \fIsmb.conf\fR file is a configuration +file for the Samba suite. \fIsmb.conf\fR contains +runtime configuration information for the Samba programs. The \fIsmb.conf\fR file +is designed to be configured and administered by the \fBswat\fR(8) program. The complete +description of the file format and possible parameters held within +are here for reference purposes. .SH "FILE FORMAT" .PP The file consists of sections and parameters. A section @@ -93,11 +93,9 @@ The user has write access to the path \fI/home/bar\fR. The share is accessed via the share name "foo": .nf - [foo] - path = /home/bar - read only = no - - +[foo] + path = /home/bar + read only = no .fi .PP The following sample section defines a printable share. @@ -108,13 +106,11 @@ access will be permitted as the default guest user (specified elsewhere): .nf - [aprinter] - path = /usr/spool/public - read only = yes - printable = yes - guest ok = yes - - +[aprinter] + path = /usr/spool/public + read only = yes + printable = yes + guest ok = yes .fi .SH "SPECIAL SECTIONS" .SS "THE [GLOBAL] SECTION" @@ -172,10 +168,8 @@ than others. The following is a typical and suitable [homes] section: .nf - [homes] - read only = no - - +[homes] + read only = no .fi .PP An important point is that if guest access is specified @@ -235,11 +229,10 @@ it. A typical [printers] entry would look like this: .nf - [printers] - path = /usr/spool/public - guest ok = yes - printable = yes - +[printers] + path = /usr/spool/public + guest ok = yes + printable = yes .fi .PP All aliases given for a printer in the printcap file @@ -249,9 +242,7 @@ to set up a pseudo-printcap. This is a file consisting of one or more lines like this: .nf - alias|alias|alias|alias... - - +alias|alias|alias|alias... .fi .PP Each alias should be an acceptable printer name for @@ -1445,10 +1436,9 @@ each parameter for details. Note that some are synonyms. \fIwriteable\fR .SH "EXPLANATION OF EACH PARAMETER" .TP -\fBabort shutdown script (G)\fR +\fB>abort shutdown script (G)\fR \fBThis parameter only exists in the HEAD cvs branch\fR -This a full path name to a script called by -\fBsmbd(8)\fR that +This a full path name to a script called by \fBsmbd\fR(8) that should stop a shutdown procedure issued by the \fIshutdown script\fR. This command will be run as user. @@ -1457,7 +1447,7 @@ Default: \fBNone\fR. Example: \fBabort shutdown script = /sbin/shutdown -c\fR .TP -\fBaddprinter command (G)\fR +\fB>addprinter command (G)\fR With the introduction of MS-RPC based printing support for Windows NT/2000 clients in Samba 2.2, The MS Add Printer Wizard (APW) icon is now also available in the @@ -1471,12 +1461,11 @@ printer command\fR defines a script to be run which will perform the necessary operations for adding the printer to the print system and to add the appropriate service definition to the \fIsmb.conf\fR file in order that it can be -shared by \fBsmbd(8)\fR - +shared by \fBsmbd\fR(8). The \fIaddprinter command\fR is automatically invoked with the following parameter (in -order: +order): .RS .TP 0.2i \(bu @@ -1518,7 +1507,7 @@ Default: \fBnone\fR Example: \fBaddprinter command = /usr/bin/addprinter \fR .TP -\fBadd share command (G)\fR +\fB>add share command (G)\fR Samba 2.2.0 introduced the ability to dynamically add and delete shares via the Windows NT 4.0 Server Manager. The \fIadd share command\fR is used to define an @@ -1561,9 +1550,9 @@ Default: \fBnone\fR Example: \fBadd share command = /usr/local/bin/addshare\fR .TP -\fBadd machine script (G)\fR +\fB>add machine script (G)\fR This is the full pathname to a script that will -be run by smbd(8) when a machine is added +be run by \fBsmbd\fR(8) when a machine is added to it's domain using the administrator username and password method. This option is only required when using sam back-ends tied to the @@ -1576,7 +1565,7 @@ Default: \fBadd machine script = Example: \fBadd machine script = /usr/sbin/adduser -n -g machines -c Machine -d /dev/null -s /bin/false %u \fR .TP -\fBads server (G)\fR +\fB>ads server (G)\fR If this option is specified, samba does not try to figure out what ads server to use itself, but uses the specified ads server. Either one DNS name or IP @@ -1586,10 +1575,9 @@ Default: \fBads server = \fR Example: \fBads server = 192.168.1.2\fR .TP -\fBadd user script (G)\fR +\fB>add user script (G)\fR This is the full pathname to a script that will -be run \fBAS ROOT\fR by smbd(8) - under special circumstances described below. +be run \fBAS ROOT\fR by \fBsmbd\fR(8) under special circumstances described below. Normally, a Samba server requires that UNIX users are created for all users accessing files on this server. For sites @@ -1598,15 +1586,14 @@ creating these users and keeping the user list in sync with the Windows NT PDC is an onerous task. This option allows smbd to create the required UNIX users \fBON DEMAND\fR when a user accesses the Samba server. -In order to use this option, smbd -must \fBNOT\fR be set to \fIsecurity = share\fR +In order to use this option, \fBsmbd\fR(8) must \fBNOT\fR be set to \fIsecurity = share\fR and \fIadd user script\fR must be set to a full pathname for a script that will create a UNIX user given one argument of \fI%u\fR, which expands into the UNIX user name to create. When the Windows user attempts to access the Samba server, -at login (session setup in the SMB protocol) time, smbd contacts the \fIpassword server\fR and +at login (session setup in the SMB protocol) time, \fBsmbd\fR(8) contacts the \fIpassword server\fR and attempts to authenticate the given user with the given password. If the authentication succeeds then \fBsmbd\fR attempts to find a UNIX user in the UNIX password database to map the @@ -1630,9 +1617,9 @@ Default: \fBadd user script = Example: \fBadd user script = /usr/local/samba/bin/add_user %u\fR .TP -\fBadd group script (G)\fR +\fB>add group script (G)\fR This is the full pathname to a script that will -be run \fBAS ROOT\fR by smbd(8) when a new group is +be run \fBAS ROOT\fR by \fBsmbd\fR(8) when a new group is requested. It will expand any \fI%g\fR to the group name passed. This script is only useful for installations using the @@ -1642,7 +1629,7 @@ circumvent unix group name restrictions. In that case the script must print the numeric gid of the created group on stdout. .TP -\fBadmin users (S)\fR +\fB>admin users (S)\fR This is a list of users who will be granted administrative privileges on the share. This means that they will do all file operations as the super-user (root). @@ -1655,22 +1642,21 @@ Default: \fBno admin users\fR Example: \fBadmin users = jason\fR .TP -\fBadd user to group script (G)\fR +\fB>add user to group script (G)\fR Full path to the script that will be called when a user is added to a group using the Windows NT domain administration -tools. It will be run by smbd(8) -\fBAS ROOT\fR. Any \fI%g\fR will be -replaced with the group name and any \fI%u\fR will -be replaced with the user name. +tools. It will be run by \fBsmbd\fR(8) \fBAS ROOT\fR. +Any \fI%g\fR will be replaced with the group name and +any \fI%u\fR will be replaced with the user name. Default: \fBadd user to group script = \fR Example: \fBadd user to group script = /usr/sbin/adduser %u %g\fR .TP -\fBallow hosts (S)\fR +\fB>allow hosts (S)\fR Synonym for \fIhosts allow\fR. .TP -\fBalgorithmic rid base (G)\fR +\fB>algorithmic rid base (G)\fR This determines how Samba will use its algorithmic mapping from uids/gid to the RIDs needed to construct NT Security Identifiers. @@ -1689,7 +1675,7 @@ Default: \fBalgorithmic rid base = 1000\fR Example: \fBalgorithmic rid base = 100000\fR .TP -\fBallow trusted domains (G)\fR +\fB>allow trusted domains (G)\fR This option only takes effect when the \fIsecurity\fR option is set to server or domain. If it is set to no, then attempts to connect to a resource from @@ -1708,10 +1694,8 @@ can make implementing a security boundary difficult. Default: \fBallow trusted domains = yes\fR .TP -\fBannounce as (G)\fR -This specifies what type of server -\fBnmbd\fR -will announce itself as, to a network neighborhood browse +\fB>announce as (G)\fR +This specifies what type of server \fBnmbd\fR(8) will announce itself as, to a network neighborhood browse list. By default this is set to Windows NT. The valid options are : "NT Server" (which can also be written as "NT"), "NT Workstation", "Win95" or "WfW" meaning Windows NT Server, @@ -1725,7 +1709,7 @@ Default: \fBannounce as = NT Server\fR Example: \fBannounce as = Win95\fR .TP -\fBannounce version (G)\fR +\fB>announce version (G)\fR This specifies the major and minor version numbers that nmbd will use when announcing itself as a server. The default is 4.9. Do not change this parameter unless you have a specific @@ -1735,10 +1719,10 @@ Default: \fBannounce version = 4.9\fR Example: \fBannounce version = 2.0\fR .TP -\fBauto services (G)\fR +\fB>auto services (G)\fR This is a synonym for the \fIpreload\fR. .TP -\fBauth methods (G)\fR +\fB>auth methods (G)\fR This option allows the administrator to chose what authentication methods \fBsmbd\fR will use when authenticating a user. This option defaults to sensible values based on \fI security\fR. @@ -1750,7 +1734,7 @@ Default: \fBauth methods = \fR Example: \fBauth methods = guest sam ntdomain\fR .TP -\fBavailable (S)\fR +\fB>available (S)\fR This parameter lets you "turn off" a service. If \fIavailable = no\fR, then \fBALL\fR attempts to connect to the service will fail. Such failures are @@ -1758,12 +1742,10 @@ logged. Default: \fBavailable = yes\fR .TP -\fBbind interfaces only (G)\fR +\fB>bind interfaces only (G)\fR This global parameter allows the Samba admin to limit what interfaces on a machine will serve SMB requests. It -affects file service smbd(8) and -name service nmbd(8) in slightly -different ways. +affects file service \fBsmbd\fR(8) and name service \fBnmbd\fR(8) in a slightly different ways. For name service it causes \fBnmbd\fR to bind to ports 137 and 138 on the interfaces listed in the interfaces parameter. \fBnmbd @@ -1782,8 +1764,8 @@ send packets that arrive through any interfaces not listed in the does defeat this simple check, however, so it must not be used seriously as a security feature for \fBnmbd\fR. -For file service it causes smbd(8) -to bind only to the interface list given in the interfaces parameter. This restricts the networks that +For file service it causes \fBsmbd\fR(8) to bind only to the interface list +given in the interfaces parameter. This restricts the networks that \fBsmbd\fR will serve to packets coming in those interfaces. Note that you should not use this parameter for machines that are serving PPP or other intermittent or non-broadcast network @@ -1791,9 +1773,7 @@ interfaces as it will not cope with non-permanent interfaces. If \fIbind interfaces only\fR is set then unless the network address \fB127.0.0.1\fR is added -to the \fIinterfaces\fR parameter list \fBsmbpasswd(8)\fR -and \fBswat(8)\fR may -not work as expected due to the reasons covered below. +to the \fIinterfaces\fR parameter list \fBsmbpasswd\fR(8) and \fBswat\fR(8) may not work as expected due to the reasons covered below. To change a users SMB password, the \fBsmbpasswd\fR by default connects to the \fBlocalhost - 127.0.0.1\fR @@ -1802,8 +1782,8 @@ address as an SMB client to issue the password change request. If network address \fB127.0.0.1\fR is added to the \fIinterfaces\fR parameter list then \fB smbpasswd\fR will fail to connect in it's default mode. \fBsmbpasswd\fR can be forced to use the primary IP interface -of the local host by using its \fI-r remote machine\fR - parameter, with \fIremote machine\fR set +of the local host by using its \fBsmbpasswd\fR(8) \fI-r remote machine\fR +parameter, with \fIremote machine\fR set to the IP name of the primary interface of the local host. The \fBswat\fR status page tries to connect with @@ -1815,8 +1795,9 @@ and \fBnmbd\fR. Default: \fBbind interfaces only = no\fR .TP -\fBblocking locks (S)\fR -This parameter controls the behavior of smbd(8) when given a request by a client +\fB>blocking locks (S)\fR +This parameter controls the behavior +of \fBsmbd\fR(8) when given a request by a client to obtain a byte range lock on a region of an open file, and the request has a time limit associated with it. @@ -1832,9 +1813,8 @@ cannot be obtained. Default: \fBblocking locks = yes\fR .TP -\fBblock size (S)\fR -This parameter controls the behavior of -smbd(8) when reporting disk free +\fB>block size (S)\fR +This parameter controls the behavior of \fBsmbd\fR(8) when reporting disk free sizes. By default, this reports a disk block size of 1024 bytes. Changing this parameter may have some effect on the @@ -1846,42 +1826,38 @@ is an experimental option it may be removed in a future release. Changing this option does not change the disk free reporting size, just the block size unit reported to the client. - -Default: \fBblock size = 1024\fR - -Example: \fBblock size = 65536\fR .TP -\fBbrowsable (S)\fR +\fB>browsable (S)\fR See the \fI browseable\fR. .TP -\fBbrowse list (G)\fR -This controls whether \fBsmbd(8)\fR will serve a browse list to +\fB>browse list (G)\fR +This controls whether \fBsmbd\fR(8) will serve a browse list to a client doing a \fBNetServerEnum\fR call. Normally set to yes. You should never need to change this. Default: \fBbrowse list = yes\fR .TP -\fBbrowseable (S)\fR +\fB>browseable (S)\fR This controls whether this share is seen in the list of available shares in a net view and in the browse list. Default: \fBbrowseable = yes\fR .TP -\fBcase sensitive (S)\fR +\fB>case sensitive (S)\fR See the discussion in the section NAME MANGLING. Default: \fBcase sensitive = no\fR .TP -\fBcasesignames (S)\fR +\fB>casesignames (S)\fR Synonym for case sensitive. .TP -\fBchange notify timeout (G)\fR +\fB>change notify timeout (G)\fR This SMB allows a client to tell a server to "watch" a particular directory for any changes and only reply to the SMB request when a change has occurred. Such constant scanning of -a directory is expensive under UNIX, hence an \fBsmbd(8)\fR daemon only performs such a scan +a directory is expensive under UNIX, hence an \fBsmbd\fR(8) daemon only performs such a scan on each requested directory once every \fIchange notify timeout\fR seconds. @@ -1891,7 +1867,7 @@ Example: \fBchange notify timeout = 300\fR Would change the scan time to every 5 minutes. .TP -\fBchange share command (G)\fR +\fB>change share command (G)\fR Samba 2.2.0 introduced the ability to dynamically add and delete shares via the Windows NT 4.0 Server Manager. The \fIchange share command\fR is used to define an @@ -1933,7 +1909,7 @@ Default: \fBnone\fR Example: \fBchange share command = /usr/local/bin/addshare\fR .TP -\fBcomment (S)\fR +\fB>comment (S)\fR This is a text field that is seen next to a share when a client does a queries the server, either via the network neighborhood or via \fBnet view\fR to list what shares @@ -1946,7 +1922,7 @@ Default: \fBNo comment string\fR Example: \fBcomment = Fred's Files\fR .TP -\fBconfig file (G)\fR +\fB>config file (G)\fR This allows you to override the config file to use, instead of the default (usually \fIsmb.conf\fR). There is a chicken and egg problem here as this option is set @@ -1966,7 +1942,7 @@ clients). Example: \fBconfig file = /usr/local/samba/lib/smb.conf.%m \fR .TP -\fBcopy (S)\fR +\fB>copy (S)\fR This parameter allows you to "clone" service entries. The specified service is simply duplicated under the current service's name. Any parameters specified in the current @@ -1981,7 +1957,7 @@ Default: \fBno value\fR Example: \fBcopy = otherservice\fR .TP -\fBcreate mask (S)\fR +\fB>create mask (S)\fR A synonym for this parameter is \fIcreate mode\fR \&. @@ -2018,10 +1994,10 @@ Default: \fBcreate mask = 0744\fR Example: \fBcreate mask = 0775\fR .TP -\fBcreate mode (S)\fR +\fB>create mode (S)\fR This is a synonym for \fI create mask\fR. .TP -\fBcsc policy (S)\fR +\fB>csc policy (S)\fR This stands for \fBclient-side caching policy\fR, and specifies how clients capable of offline caching will cache the files in the share. The valid values @@ -2038,7 +2014,7 @@ Default: \fBcsc policy = manual\fR Example: \fBcsc policy = programs\fR .TP -\fBdeadtime (G)\fR +\fB>deadtime (G)\fR The value of the parameter (a decimal integer) represents the number of minutes of inactivity before a connection is considered dead, and it is disconnected. The deadtime only takes @@ -2061,7 +2037,7 @@ Default: \fBdeadtime = 0\fR Example: \fBdeadtime = 15\fR .TP -\fBdebug hires timestamp (G)\fR +\fB>debug hires timestamp (G)\fR Sometimes the timestamps in the log messages are needed with a resolution of higher that seconds, this boolean parameter adds microsecond resolution to the timestamp @@ -2072,7 +2048,7 @@ effect. Default: \fBdebug hires timestamp = no\fR .TP -\fBdebug pid (G)\fR +\fB>debug pid (G)\fR When using only one log file for more then one forked smbdprocess there may be hard to follow which process outputs which message. This boolean parameter is adds the process-id @@ -2083,7 +2059,7 @@ effect. Default: \fBdebug pid = no\fR .TP -\fBdebug timestamp (G)\fR +\fB>debug timestamp (G)\fR Samba debug log messages are timestamped by default. If you are running at a high \fIdebug level\fR these timestamps can be distracting. This boolean parameter allows timestamping @@ -2091,7 +2067,7 @@ to be turned off. Default: \fBdebug timestamp = yes\fR .TP -\fBdebug uid (G)\fR +\fB>debug uid (G)\fR Samba is sometimes run as root and sometime run as the connected user, this boolean parameter inserts the current euid, egid, uid and gid to the timestamp message headers @@ -2102,18 +2078,18 @@ effect. Default: \fBdebug uid = no\fR .TP -\fBdebuglevel (G)\fR +\fB>debuglevel (G)\fR Synonym for \fI log level\fR. .TP -\fBdefault (G)\fR +\fB>default (G)\fR A synonym for \fI default service\fR. .TP -\fBdefault case (S)\fR +\fB>default case (S)\fR See the section on NAME MANGLING. Also note the \fIshort preserve case\fR parameter. Default: \fBdefault case = lower\fR .TP -\fBdefault devmode (S)\fR +\fB>default devmode (S)\fR This parameter is only applicable to printable services. When smbd is serving Printer Drivers to Windows NT/2k/XP clients, each printer on the Samba server has a Device Mode which defines things such as paper size and @@ -2141,7 +2117,7 @@ see the MSDN documentation . Default: \fBdefault devmode = no\fR .TP -\fBdefault service (G)\fR +\fB>default service (G)\fR This parameter specifies the name of a service which will be connected to if the service actually requested cannot be found. Note that the square brackets are \fBNOT\fR @@ -2171,14 +2147,15 @@ Example: [pub] path = /%S - .fi .TP -\fBdelete group script (G)\fR +\fB>delete group script (G)\fR This is the full pathname to a script that will -be run \fBAS ROOT\fR by smbd(8) when a group is requested to be deleted. It will expand any \fI%g\fR to the group name passed. This script is only useful for installations using the Windows NT domain administration tools. +be run \fBAS ROOT\fR \fBsmbd\fR(8) when a group is requested to be deleted. +It will expand any \fI%g\fR to the group name passed. +This script is only useful for installations using the Windows NT domain administration tools. .TP -\fBdeleteprinter command (G)\fR +\fB>deleteprinter command (G)\fR With the introduction of MS-RPC based printer support for Windows NT/2000 clients in Samba 2.2, it is now possible to delete printer at run time by issuing the @@ -2206,7 +2183,7 @@ Default: \fBnone\fR Example: \fBdeleteprinter command = /usr/bin/removeprinter \fR .TP -\fBdelete readonly (S)\fR +\fB>delete readonly (S)\fR This parameter allows readonly files to be deleted. This is not normal DOS semantics, but is allowed by UNIX. @@ -2216,7 +2193,7 @@ permissions, and DOS semantics prevent deletion of a read only file. Default: \fBdelete readonly = no\fR .TP -\fBdelete share command (G)\fR +\fB>delete share command (G)\fR Samba 2.2.0 introduced the ability to dynamically add and delete shares via the Windows NT 4.0 Server Manager. The \fIdelete share command\fR is used to define an @@ -2251,10 +2228,10 @@ Default: \fBnone\fR Example: \fBdelete share command = /usr/local/bin/delshare\fR .TP -\fBdelete user script (G)\fR +\fB>delete user script (G)\fR This is the full pathname to a script that will -be run by \fBsmbd(8)\fR -when managing user's with remote RPC (NT) tools. +be run by \fBsmbd\fR(8) when managing users +with remote RPC (NT) tools. This script is called when a remote client removes a user from the server, normally using 'User Manager for Domains' or @@ -2268,19 +2245,18 @@ Default: \fBdelete user script = Example: \fBdelete user script = /usr/local/samba/bin/del_user %u\fR .TP -\fBdelete user from group script (G)\fR +\fB>delete user from group script (G)\fR Full path to the script that will be called when a user is removed from a group using the Windows NT domain administration -tools. It will be run by smbd(8) -\fBAS ROOT\fR. Any \fI%g\fR will be -replaced with the group name and any \fI%u\fR will -be replaced with the user name. +tools. It will be run by \fBsmbd\fR(8) \fBAS ROOT\fR. +Any \fI%g\fR will be replaced with the group name and +any \fI%u\fR will be replaced with the user name. Default: \fBdelete user from group script = \fR Example: \fBdelete user from group script = /usr/sbin/deluser %u %g\fR .TP -\fBdelete veto files (S)\fR +\fB>delete veto files (S)\fR This option is used when Samba is attempting to delete a directory that contains one or more vetoed directories (see the \fIveto files\fR @@ -2304,11 +2280,11 @@ files\fR parameter. Default: \fBdelete veto files = no\fR .TP -\fBdeny hosts (S)\fR +\fB>deny hosts (S)\fR Synonym for \fIhosts deny\fR. .TP -\fBdfree command (G)\fR +\fB>dfree command (G)\fR The \fIdfree command\fR setting should only be used on systems where a problem occurs with the internal disk space calculations. This has been known to happen with Ultrix, @@ -2344,9 +2320,8 @@ Where the script dfree (which must be made executable) could be: .nf - #!/bin/sh - df $1 | tail -1 | awk '{print $2" "$4}' - +#!/bin/sh +df $1 | tail -1 | awk '{print $2" "$4}' .fi or perhaps (on Sys V based systems): @@ -2354,19 +2329,18 @@ or perhaps (on Sys V based systems): .nf - #!/bin/sh - /usr/bin/df -k $1 | tail -1 | awk '{print $3" "$5}' - +#!/bin/sh +/usr/bin/df -k $1 | tail -1 | awk '{print $3" "$5}' .fi Note that you may have to replace the command names with full path names on some systems. .TP -\fBdirectory (S)\fR +\fB>directory (S)\fR Synonym for \fIpath \fR. .TP -\fBdirectory mask (S)\fR +\fB>directory mask (S)\fR This parameter is the octal modes which are used when converting DOS modes to UNIX modes when creating UNIX directories. @@ -2407,10 +2381,10 @@ Default: \fBdirectory mask = 0755\fR Example: \fBdirectory mask = 0775\fR .TP -\fBdirectory mode (S)\fR +\fB>directory mode (S)\fR Synonym for \fI directory mask\fR .TP -\fBdirectory security mask (S)\fR +\fB>directory security mask (S)\fR This parameter controls what UNIX permission bits can be modified when a Windows NT client is manipulating the UNIX permission on a directory using the native NT security dialog @@ -2440,7 +2414,7 @@ Default: \fBdirectory security mask = 0777\fR Example: \fBdirectory security mask = 0700\fR .TP -\fBdisable netbios (G)\fR +\fB>disable netbios (G)\fR Enabling this parameter will disable netbios support in Samba. Netbios is the only available form of browsing in all windows versions except for 2000 and XP. @@ -2452,7 +2426,7 @@ Default: \fBdisable netbios = no\fR Example: \fBdisable netbios = yes\fR .TP -\fBdisable spoolss (G)\fR +\fB>disable spoolss (G)\fR Enabling this parameter will disable Samba's support for the SPOOLSS set of MS-RPC's and will yield identical behavior as Samba 2.0.x. Windows NT/2000 clients will downgrade to using @@ -2468,7 +2442,7 @@ See also use client driver Default : \fBdisable spoolss = no\fR .TP -\fBdisplay charset (G)\fR +\fB>display charset (G)\fR Specifies the charset that samba will use to print messages to stdout and stderr and SWAT will use. Should generally be the same as the \fBunix charset\fR. @@ -2477,12 +2451,11 @@ Default: \fBdisplay charset = ASCII\fR Example: \fBdisplay charset = UTF8\fR .TP -\fBdns proxy (G)\fR -Specifies that nmbd(8) -when acting as a WINS server and finding that a NetBIOS name has not -been registered, should treat the NetBIOS name word-for-word as a DNS -name and do a lookup with the DNS server for that name on behalf of -the name-querying client. +\fB>dns proxy (G)\fR +Specifies that \fBnmbd\fR(8) when acting as a WINS server and +finding that a NetBIOS name has not been registered, should treat the +NetBIOS name word-for-word as a DNS name and do a lookup with the DNS server +for that name on behalf of the name-querying client. Note that the maximum length for a NetBIOS name is 15 characters, so the DNS name (or DNS alias) can likewise only be @@ -2496,7 +2469,7 @@ See also the parameter \fI wins support\fR. Default: \fBdns proxy = yes\fR .TP -\fBdomain logons (G)\fR +\fB>domain logons (G)\fR If set to yes, the Samba server will serve Windows 95/98 Domain logons for the \fIworkgroup\fR it is in. Samba 2.2 has limited capability to act as a domain controller for Windows @@ -2506,18 +2479,17 @@ directory shipped with the source code. Default: \fBdomain logons = no\fR .TP -\fBdomain master (G)\fR -Tell \fB nmbd(8)\fR to enable WAN-wide browse list +\fB>domain master (G)\fR +Tell \fBsmbd\fR(8) to enable WAN-wide browse list collation. Setting this option causes \fBnmbd\fR to claim a special domain specific NetBIOS name that identifies it as a domain master browser for its given \fIworkgroup\fR. Local master browsers in the same \fIworkgroup\fR on broadcast-isolated subnets will give this \fBnmbd\fR their local browse lists, -and then ask \fBsmbd(8)\fR -for a complete copy of the browse list for the whole wide area -network. Browser clients will then contact their local master browser, -and will receive the domain-wide browse list, instead of just the list -for their broadcast-isolated subnet. +and then ask \fBsmbd\fR(8) for a complete copy of the browse +list for the whole wide area network. Browser clients will then contact +their local master browser, and will receive the domain-wide browse list, +instead of just the list for their broadcast-isolated subnet. Note that Windows NT Primary Domain Controllers expect to be able to claim this \fIworkgroup\fR specific special @@ -2537,7 +2509,7 @@ master\fR be enabled by default. Default: \fBdomain master = auto\fR .TP -\fBdont descend (S)\fR +\fB>dont descend (S)\fR There are certain directories on some systems (e.g., the \fI/proc\fR tree under Linux) that are either not of interest to clients or are infinitely deep (recursive). This @@ -2553,17 +2525,16 @@ to descend)\fR Example: \fBdont descend = /proc,/dev\fR .TP -\fBdos charset (G)\fR +\fB>dos charset (G)\fR DOS SMB clients assume the server has the same charset as they do. This option specifies which charset Samba should talk to DOS clients. The default depends on which charsets you have instaled. Samba tries to use charset 850 but falls back to ASCII in -case it is not available. Run testparm(1) - to check the default on your system. +case it is not available. Run \fBtestparm\fR(1) to check the default on your system. .TP -\fBdos filemode (S)\fR +\fB>dos filemode (S)\fR The default behavior in Samba is to provide UNIX-like behavior where only the owner of a file/directory is able to change the permissions on it. However, this behavior @@ -2577,13 +2548,12 @@ are modified. Default: \fBdos filemode = no\fR .TP -\fBdos filetime resolution (S)\fR +\fB>dos filetime resolution (S)\fR Under the DOS and Windows FAT filesystem, the finest granularity on time resolution is two seconds. Setting this parameter for a share causes Samba to round the reported time down to the nearest two second boundary when a query call that requires one second -resolution is made to \fBsmbd(8)\fR - +resolution is made to \fBsmbd\fR(8). This option is mainly used as a compatibility option for Visual C++ when used against Samba shares. If oplocks are enabled on a @@ -2598,18 +2568,18 @@ happy. Default: \fBdos filetime resolution = no\fR .TP -\fBdos filetimes (S)\fR +\fB>dos filetimes (S)\fR Under DOS and Windows, if a user can write to a file they can change the timestamp on it. Under POSIX semantics, only the owner of the file or root may change the timestamp. By default, Samba runs with POSIX semantics and refuses to change the timestamp on a file if the user \fBsmbd\fR is acting -on behalf of is not the file owner. Setting this option to yes allows DOS semantics and smbd will change the file +on behalf of is not the file owner. Setting this option to yes allows DOS semantics and \fBsmbd\fR(8) will change the file timestamp as DOS requires. Default: \fBdos filetimes = no\fR .TP -\fBencrypt passwords (G)\fR +\fB>encrypt passwords (G)\fR This boolean controls whether encrypted passwords will be negotiated with the client. Note that Windows NT 4.0 SP3 and above and also Windows 98 will by default expect encrypted passwords @@ -2618,16 +2588,15 @@ Samba see the file ENCRYPTION.txt in the Samba documentation directory \fIdocs/\fR shipped with the source code. In order for encrypted passwords to work correctly -\fBsmbd(8)\fR must either -have access to a local \fIsmbpasswd(5) -\fR program for information on how to set up +\fBsmbd\fR(8) must either +have access to a local \fBsmbpasswd\fR(5) file (see the \fBsmbpasswd\fR(8) program for information on how to set up and maintain this file), or set the security = [server|domain|ads] parameter which causes \fBsmbd\fR to authenticate against another server. Default: \fBencrypt passwords = yes\fR .TP -\fBenhanced browsing (G)\fR +\fB>enhanced browsing (G)\fR This option enables a couple of enhancements to cross-subnet browse propagation that have been added in Samba but which are not standard in Microsoft implementations. @@ -2648,7 +2617,7 @@ cross-subnet browse propagation much more reliable. Default: \fBenhanced browsing = yes\fR .TP -\fBenumports command (G)\fR +\fB>enumports command (G)\fR The concept of a "port" is fairly foreign to UNIX hosts. Under Windows NT/2000 print servers, a port is associated with a port monitor and generally takes the form of @@ -2669,10 +2638,10 @@ Default: \fBno enumports command\fR Example: \fBenumports command = /usr/bin/listports \fR .TP -\fBexec (S)\fR +\fB>exec (S)\fR This is a synonym for \fIpreexec\fR. .TP -\fBfake directory create times (S)\fR +\fB>fake directory create times (S)\fR NTFS and Windows VFAT file systems keep a create time for all files and directories. This is not the same as the ctime - status change time - that Unix keeps, so Samba by default @@ -2701,7 +2670,7 @@ will proceed as expected. Default: \fBfake directory create times = no\fR .TP -\fBfake oplocks (S)\fR +\fB>fake oplocks (S)\fR Oplocks are the way that SMB clients get permission from a server to locally cache file operations. If a server grants an oplock (opportunistic lock) then the client is free to assume @@ -2726,10 +2695,10 @@ this option carefully! Default: \fBfake oplocks = no\fR .TP -\fBfollow symlinks (S)\fR +\fB>follow symlinks (S)\fR This parameter allows the Samba administrator -to stop \fBsmbd(8)\fR -from following symbolic links in a particular share. Setting this +to stop \fBsmbd\fR(8) from following symbolic +links in a particular share. Setting this parameter to no prevents any file or directory that is a symbolic link from being followed (the user will get an error). This option is very useful to stop users from adding a @@ -2742,7 +2711,7 @@ follow symbolic links) by default. Default: \fBfollow symlinks = yes\fR .TP -\fBforce create mode (S)\fR +\fB>force create mode (S)\fR This parameter specifies a set of UNIX mode bit permissions that will \fBalways\fR be set on a file created by Samba. This is done by bitwise 'OR'ing these bits onto @@ -2766,7 +2735,7 @@ would force all created files to have read and execute permissions set for 'group' and 'other' as well as the read/write/execute bits set for the 'user'. .TP -\fBforce directory mode (S)\fR +\fB>force directory mode (S)\fR This parameter specifies a set of UNIX mode bit permissions that will \fBalways\fR be set on a directory created by Samba. This is done by bitwise 'OR'ing these bits onto the @@ -2789,7 +2758,7 @@ would force all created directories to have read and execute permissions set for 'group' and 'other' as well as the read/write/execute bits set for the 'user'. .TP -\fBforce directory security mode (S)\fR +\fB>force directory security mode (S)\fR This parameter controls what UNIX permission bits can be modified when a Windows NT client is manipulating the UNIX permission on a directory using the native NT security dialog box. @@ -2818,7 +2787,7 @@ Default: \fBforce directory security mode = 0\fR Example: \fBforce directory security mode = 700\fR .TP -\fBforce group (S)\fR +\fB>force group (S)\fR This specifies a UNIX group name that will be assigned as the default primary group for all users connecting to this service. This is useful for sharing files by ensuring @@ -2852,7 +2821,7 @@ Default: \fBno forced group\fR Example: \fBforce group = agroup\fR .TP -\fBforce security mode (S)\fR +\fB>force security mode (S)\fR This parameter controls what UNIX permission bits can be modified when a Windows NT client is manipulating the UNIX permission on a file using the native NT security dialog @@ -2882,7 +2851,7 @@ Default: \fBforce security mode = 0\fR Example: \fBforce security mode = 700\fR .TP -\fBforce user (S)\fR +\fB>force user (S)\fR This specifies a UNIX user name that will be assigned as the default user for all users connecting to this service. This is useful for sharing files. You should also use it carefully @@ -2906,11 +2875,10 @@ Default: \fBno forced user\fR Example: \fBforce user = auser\fR .TP -\fBfstype (S)\fR +\fB>fstype (S)\fR This parameter allows the administrator to configure the string that specifies the type of filesystem a share -is using that is reported by \fBsmbd(8) -\fR when a client queries the filesystem type +is using that is reported by \fBsmbd\fR(8) when a client queries the filesystem type for a share. The default type is NTFS for compatibility with Windows NT but this can be changed to other strings such as Samba or FAT @@ -2920,7 +2888,7 @@ Default: \fBfstype = NTFS\fR Example: \fBfstype = Samba\fR .TP -\fBgetwd cache (G)\fR +\fB>getwd cache (G)\fR This is a tuning option. When this is enabled a caching algorithm will be used to reduce the time taken for getwd() calls. This can have a significant impact on performance, especially @@ -2929,11 +2897,11 @@ parameter is set to no. Default: \fBgetwd cache = yes\fR .TP -\fBgroup (S)\fR +\fB>group (S)\fR Synonym for \fIforce group\fR. .TP -\fBguest account (S)\fR +\fB>guest account (S)\fR This is a username which will be used for access to services which are specified as \fI guest ok\fR (see below). Whatever privileges this user has will be available to any client connecting to the guest service. @@ -2957,16 +2925,20 @@ Default: \fBspecified at compile time, usually Example: \fBguest account = ftp\fR .TP -\fBguest ok (S)\fR +\fB>guest ok (S)\fR If this parameter is yes for a service, then no password is required to connect to the service. Privileges will be those of the \fI guest account\fR. +This paramater nullifies the benifits of setting +\fIrestrict +anonymous\fR = 2 + See the section below on \fI security\fR for more information about this option. Default: \fBguest ok = no\fR .TP -\fBguest only (S)\fR +\fB>guest only (S)\fR If this parameter is yes for a service, then only guest connections to the service are permitted. This parameter will have no effect if \fIguest ok\fR is not set for the service. @@ -2975,13 +2947,13 @@ See the section below on \fI security\fR for more information about this option Default: \fBguest only = no\fR .TP -\fBhide dot files (S)\fR +\fB>hide dot files (S)\fR This is a boolean parameter that controls whether files starting with a dot appear as hidden files. Default: \fBhide dot files = yes\fR .TP -\fBhide files(S)\fR +\fB>hide files(S)\fR This is a list of files or directories that are not visible but are accessible. The DOS 'hidden' attribute is applied to any files or directories that match. @@ -3014,35 +2986,35 @@ SMB client (DAVE) available from Thursby creates for internal use, and also still hides all files beginning with a dot. .TP -\fBhide local users(G)\fR +\fB>hide local users(G)\fR This parameter toggles the hiding of local UNIX users (root, wheel, floppy, etc) from remote clients. Default: \fBhide local users = no\fR .TP -\fBhide unreadable (G)\fR +\fB>hide unreadable (G)\fR This parameter prevents clients from seeing the existance of files that cannot be read. Defaults to off. Default: \fBhide unreadable = no\fR .TP -\fBhide unwriteable files (G)\fR +\fB>hide unwriteable files (G)\fR This parameter prevents clients from seeing the existance of files that cannot be written to. Defaults to off. Note that unwriteable directories are shown as usual. Default: \fBhide unwriteable = no\fR .TP -\fBhide special files (G)\fR +\fB>hide special files (G)\fR This parameter prevents clients from seeing special files such as sockets, devices and fifo's in directory listings. Default: \fBhide special files = no\fR .TP -\fBhomedir map (G)\fR +\fB>homedir map (G)\fR If\fInis homedir -\fR is yes, and \fBsmbd(8)\fR is also acting +\fR is yes, and \fBsmbd\fR(8) is also acting as a Win95/98 \fIlogon server\fR then this parameter specifies the NIS (or YP) map from which the server for the user's home directory should be extracted. At present, only the Sun @@ -3066,7 +3038,7 @@ Default: \fBhomedir map = \fR Example: \fBhomedir map = amd.homedir\fR .TP -\fBhost msdfs (G)\fR +\fB>host msdfs (G)\fR This boolean parameter is only available if Samba has been configured and compiled with the \fB --with-msdfs\fR option. If set to yes, Samba will act as a Dfs server, and allow Dfs-aware clients @@ -3078,7 +3050,7 @@ refer to msdfs_setup.html Default: \fBhost msdfs = no\fR .TP -\fBhostname lookups (G)\fR +\fB>hostname lookups (G)\fR Specifies whether samba should use (expensive) hostname lookups or use the ip addresses instead. An example place where hostname lookups are currently used is when checking @@ -3088,7 +3060,7 @@ Default: \fBhostname lookups = yes\fR Example: \fBhostname lookups = no\fR .TP -\fBhosts allow (S)\fR +\fB>hosts allow (S)\fR A synonym for this parameter is \fIallow hosts\fR. @@ -3136,9 +3108,8 @@ deny access from one particular host Note that access still requires suitable user-level passwords. -See \fBtestparm(1)\fR - for a way of testing your host access to see if it does -what you expect. +See \fBtestparm\fR(1) for a way of testing your host access +to see if it does what you expect. Default: \fBnone (i.e., all hosts permitted access) \fR @@ -3146,7 +3117,7 @@ Default: \fBnone (i.e., all hosts permitted access) Example: \fBallow hosts = 150.203.5. myhost.mynet.edu.au \fR .TP -\fBhosts deny (S)\fR +\fB>hosts deny (S)\fR The opposite of \fIhosts allow\fR - hosts listed here are \fBNOT\fR permitted access to services unless the specific services have their own lists to override @@ -3159,7 +3130,7 @@ Default: \fBnone (i.e., no hosts specifically excluded) Example: \fBhosts deny = 150.203.4. badhost.mynet.edu.au \fR .TP -\fBhosts equiv (G)\fR +\fB>hosts equiv (G)\fR If this global parameter is a non-null string, it specifies the name of a file to read for the names of hosts and users who will be allowed access without specifying a password. @@ -3181,7 +3152,7 @@ Default: \fBno host equivalences\fR Example: \fBhosts equiv = /etc/hosts.equiv\fR .TP -\fBinclude (G)\fR +\fB>include (G)\fR This allows you to include one config file inside another. The file is included literally, as though typed in place. @@ -3194,7 +3165,7 @@ Default: \fBno file included\fR Example: \fBinclude = /usr/local/samba/lib/admin_smb.conf \fR .TP -\fBinherit acls (S)\fR +\fB>inherit acls (S)\fR This parameter can be used to ensure that if default acls exist on parent directories, they are always honored when creating a subdirectory. @@ -3205,7 +3176,7 @@ default directory acls are propagated. Default: \fBinherit acls = no\fR .TP -\fBinherit permissions (S)\fR +\fB>inherit permissions (S)\fR The permissions on new files and directories are normally governed by \fI create mask\fR, \fIdirectory mask\fR, \fIforce create mode\fR and \fIforce @@ -3235,7 +3206,7 @@ See also \fIcreate mask Default: \fBinherit permissions = no\fR .TP -\fBinterfaces (G)\fR +\fB>interfaces (G)\fR This option allows you to override the default network interfaces list that Samba will use for browsing, name registration and other NBT traffic. By default Samba will query @@ -3286,7 +3257,7 @@ interfaces only\fR. Default: \fBall active interfaces except 127.0.0.1 that are broadcast capable\fR .TP -\fBinvalid users (S)\fR +\fB>invalid users (S)\fR This is a list of users that should not be allowed to login to this service. This is really a \fBparanoid\fR check to absolutely ensure an improper setting does not breach @@ -3318,7 +3289,7 @@ Default: \fBno invalid users\fR Example: \fBinvalid users = root fred admin @wheel \fR .TP -\fBkeepalive (G)\fR +\fB>keepalive (G)\fR The value of the parameter (an integer) represents the number of seconds between \fIkeepalive\fR packets. If this parameter is zero, no keepalive packets will be @@ -3333,17 +3304,16 @@ Default: \fBkeepalive = 300\fR Example: \fBkeepalive = 600\fR .TP -\fBkernel oplocks (G)\fR +\fB>kernel oplocks (G)\fR For UNIXes that support kernel based \fIoplocks\fR (currently only IRIX and the Linux 2.4 kernel), this parameter allows the use of them to be turned on or off. Kernel oplocks support allows Samba \fIoplocks \fR to be broken whenever a local UNIX process or NFS operation -accesses a file that \fBsmbd(8)\fR - has oplocked. This allows complete data consistency between -SMB/CIFS, NFS and local file access (and is a \fBvery\fR -cool feature :-). +accesses a file that \fBsmbd\fR(8) has oplocked. This allows complete +data consistency between SMB/CIFS, NFS and local file access (and is +a \fBvery\fR cool feature :-). This parameter defaults to on, but is translated to a no-op on systems that no not have the necessary kernel support. @@ -3355,18 +3325,17 @@ and \fIlevel2 oplocks Default: \fBkernel oplocks = yes\fR .TP -\fBlanman auth (G)\fR -This parameter determines whether or not smbd will -attempt to authenticate users using the LANMAN password hash. -If disabled, only clients which support NT password hashes (e.g. Windows -NT/2000 clients, smbclient, etc... but not Windows 95/98 or the MS DOS -network client) will be able to connect to the Samba host. +\fB>lanman auth (G)\fR +This parameter determines whether or not \fBsmbd\fR(8) will attempt to authenticate users +using the LANMAN password hash. If disabled, only clients which support NT +password hashes (e.g. Windows NT/2000 clients, smbclient, etc... but not +Windows 95/98 or the MS DOS network client) will be able to connect to the Samba host. Default : \fBlanman auth = yes\fR .TP -\fBlarge readwrite (G)\fR -This parameter determines whether or not smbd -supports the new 64k streaming read and write varient SMB requests introduced +\fB>large readwrite (G)\fR +This parameter determines whether or not \fBsmbd\fR(8) supports the new 64k streaming +read and write varient SMB requests introduced with Windows 2000. Note that due to Windows 2000 client redirector bugs this requires Samba to be running on a 64-bit capable operating system such as IRIX, Solaris or a Linux 2.4 kernel. Can improve performance by 10% with @@ -3375,18 +3344,18 @@ code paths. Default : \fBlarge readwrite = yes\fR .TP -\fBldap admin dn (G)\fR +\fB>ldap admin dn (G)\fR The \fIldap admin dn\fR defines the Distinguished Name (DN) name used by Samba to contact the ldap server when retreiving user account information. The \fIldap admin dn\fR is used in conjunction with the admin dn password stored in the \fIprivate/secrets.tdb\fR file. See the -\fBsmbpasswd(8)\fR man -page for more information on how to accmplish this. +\fBsmbpasswd\fR(8) man page for more information on how +to accmplish this. Default : \fBnone\fR .TP -\fBldap filter (G)\fR +\fB>ldap filter (G)\fR This parameter specifies the RFC 2254 compliant LDAP search filter. The default is to match the login name with the uid attribute for all entries matching the sambaAccount @@ -3394,7 +3363,7 @@ objectclass. Note that this filter should only return one entry. Default : \fBldap filter = (&(uid=%u)(objectclass=sambaAccount))\fR .TP -\fBldap port (G)\fR +\fB>ldap port (G)\fR This parameter is only available if Samba has been configure to include the \fB--with-ldapsam\fR option at compile time. @@ -3409,7 +3378,7 @@ Default : \fBldap port = 636 ; if ldap ssl = on\fR Default : \fBldap port = 389 ; if ldap ssl = off\fR .TP -\fBldap server (G)\fR +\fB>ldap server (G)\fR This parameter is only available if Samba has been configure to include the \fB--with-ldapsam\fR option at compile time. @@ -3419,7 +3388,7 @@ server which should be queried to locate user account information. Default : \fBldap server = localhost\fR .TP -\fBldap ssl (G)\fR +\fB>ldap ssl (G)\fR This option is used to define whether or not Samba should use SSL when connecting to the ldap server This is \fBNOT\fR related to @@ -3447,23 +3416,23 @@ to configure. See \fIpassdb backend\fR Default : \fBldap ssl = start_tls\fR .TP -\fBldap suffix (G)\fR +\fB>ldap suffix (G)\fR Specifies where user and machine accounts are added to the tree. Can be overriden by \fBldap user suffix\fR and \fBldap machine suffix\fR. It also used as the base dn for all ldap searches. Default : \fBnone\fR .TP -\fBldap user suffix (G)\fR +\fB>ldap user suffix (G)\fR It specifies where users are added to the tree. Default : \fBnone\fR .TP -\fBldap machine suffix (G)\fR +\fB>ldap machine suffix (G)\fR It specifies where machines should be added to the ldap tree. Default : \fBnone\fR .TP -\fBldap passwd sync (G)\fR +\fB>ldap passwd sync (G)\fR This option is used to define whether or not Samba should sync the LDAP password with the NT and LM hashes for normal accounts (NOT for @@ -3485,7 +3454,7 @@ The \fIldap passwd sync\fR can be set to one of three values: Default : \fBldap passwd sync = no\fR .TP -\fBldap trust ids (G)\fR +\fB>ldap trust ids (G)\fR Normally, Samba validates each entry in the LDAP server against getpwnam(). This allows LDAP to be used for Samba with the unix system using @@ -3502,7 +3471,7 @@ same LDAP server. Default: \fBldap trust ids = No\fR .TP -\fBlevel2 oplocks (S)\fR +\fB>level2 oplocks (S)\fR This parameter controls whether Samba supports level2 (read-only) oplocks on a share. @@ -3539,8 +3508,8 @@ parameters. Default: \fBlevel2 oplocks = yes\fR .TP -\fBlm announce (G)\fR -This parameter determines if \fBnmbd(8)\fR will produce Lanman announce +\fB>lm announce (G)\fR +This parameter determines if \fBnmbd\fR(8) will produce Lanman announce broadcasts that are needed by OS/2 clients in order for them to see the Samba server in their browse list. This parameter can have three values, yes, no, or @@ -3561,7 +3530,7 @@ Default: \fBlm announce = auto\fR Example: \fBlm announce = yes\fR .TP -\fBlm interval (G)\fR +\fB>lm interval (G)\fR If Samba is set to produce Lanman announce broadcasts needed by OS/2 clients (see the \fIlm announce\fR parameter) then this parameter defines the frequency in seconds with which they will be @@ -3576,7 +3545,7 @@ Default: \fBlm interval = 60\fR Example: \fBlm interval = 120\fR .TP -\fBload printers (G)\fR +\fB>load printers (G)\fR A boolean variable that controls whether all printers in the printcap will be loaded for browsing by default. See the printers section for @@ -3584,8 +3553,8 @@ more details. Default: \fBload printers = yes\fR .TP -\fBlocal master (G)\fR -This option allows \fB nmbd(8)\fR to try and become a local master browser +\fB>local master (G)\fR +This option allows \fBnmbd\fR(8) to try and become a local master browser on a subnet. If set to no then \fB nmbd\fR will not attempt to become a local master browser on a subnet and will also lose in all browsing elections. By default this value is set to yes. Setting this value to yes doesn't @@ -3597,10 +3566,10 @@ Setting this value to no will cause \fBnmbd\fR Default: \fBlocal master = yes\fR .TP -\fBlock dir (G)\fR +\fB>lock dir (G)\fR Synonym for \fI lock directory\fR. .TP -\fBlock directory (G)\fR +\fB>lock directory (G)\fR This option specifies the directory where lock files will be placed. The lock files are used to implement the \fImax connections\fR @@ -3610,7 +3579,7 @@ Default: \fBlock directory = ${prefix}/var/locks\fR Example: \fBlock directory = /var/run/samba/locks\fR .TP -\fBlock spin count (G)\fR +\fB>lock spin count (G)\fR This parameter controls the number of times that smbd should attempt to gain a byte range lock on the behalf of a client request. Experiments have shown that @@ -3622,7 +3591,7 @@ and FoxPro. Default: \fBlock spin count = 2\fR .TP -\fBlock spin time (G)\fR +\fB>lock spin time (G)\fR The time in microseconds that smbd should pause before attempting to gain a failed lock. See \fIlock spin @@ -3630,7 +3599,7 @@ count\fR for more details. Default: \fBlock spin time = 10\fR .TP -\fBlocking (S)\fR +\fB>locking (S)\fR This controls whether or not locking will be performed by the server in response to lock requests from the client. @@ -3653,7 +3622,7 @@ You should never need to set this parameter. Default: \fBlocking = yes\fR .TP -\fBlog file (G)\fR +\fB>log file (G)\fR This option allows you to override the name of the Samba log file (also known as the debug file). @@ -3663,7 +3632,7 @@ you to have separate log files for each user or machine. Example: \fBlog file = /usr/local/samba/var/log.%m \fR .TP -\fBlog level (G)\fR +\fB>log level (G)\fR The value of the parameter (a astring) allows the debug level (logging level) to be specified in the \fIsmb.conf\fR file. This parameter has been @@ -3677,7 +3646,7 @@ the command line or level zero if none was specified. Example: \fBlog level = 3 passdb:5 auth:10 winbind:2 \fR .TP -\fBlogon drive (G)\fR +\fB>logon drive (G)\fR This parameter specifies the local path to which the home directory will be connected (see \fIlogon home\fR) and is only used by NT Workstations. @@ -3689,7 +3658,7 @@ Default: \fBlogon drive = z:\fR Example: \fBlogon drive = h:\fR .TP -\fBlogon home (G)\fR +\fB>logon home (G)\fR This parameter specifies the home directory location when a Win95/98 or NT Workstation logs into a Samba PDC. It allows you to do @@ -3726,7 +3695,7 @@ Default: \fBlogon home = "\\\\%N\\%U"\fR Example: \fBlogon home = "\\\\remote_smb_server\\%U"\fR .TP -\fBlogon path (G)\fR +\fB>logon path (G)\fR This parameter specifies the home directory where roaming profiles (NTuser.dat etc files for Windows NT) are stored. Contrary to previous versions of these manual pages, it has @@ -3769,7 +3738,7 @@ Default: \fBlogon path = \\\\%N\\%U\\profile\fR Example: \fBlogon path = \\\\PROFILESERVER\\PROFILE\\%U\fR .TP -\fBlogon script (G)\fR +\fB>logon script (G)\fR This parameter specifies the batch file (.bat) or NT command file (.cmd) to be downloaded and run on a machine when a user successfully logs in. The file must contain the DOS @@ -3805,7 +3774,7 @@ Default: \fBno logon script defined\fR Example: \fBlogon script = scripts\\%U.bat\fR .TP -\fBlppause command (S)\fR +\fB>lppause command (S)\fR This parameter specifies the command to be executed on the server host in order to stop printing or spooling a specific print job. @@ -3844,7 +3813,7 @@ is SOFTQ, then the default is: Example for HPUX: \fBlppause command = /usr/bin/lpalt %p-%j -p0\fR .TP -\fBlpq cache time (G)\fR +\fB>lpq cache time (G)\fR This controls how long lpq info will be cached for to prevent the \fBlpq\fR command being called too often. A separate cache is kept for each variation of the \fB lpq\fR command used by the system, so if you use different @@ -3868,7 +3837,7 @@ Default: \fBlpq cache time = 10\fR Example: \fBlpq cache time = 30\fR .TP -\fBlpq command (S)\fR +\fB>lpq command (S)\fR This parameter specifies the command to be executed on the server host in order to obtain \fBlpq \fR-style printer status information. @@ -3906,7 +3875,7 @@ Default: \fBdepends on the setting of \fI printing\fB\fR Example: \fBlpq command = /usr/bin/lpq -P%p\fR .TP -\fBlpresume command (S)\fR +\fB>lpresume command (S)\fR This parameter specifies the command to be executed on the server host in order to restart or continue printing or spooling a specific print job. @@ -3941,7 +3910,7 @@ is SOFTQ, then the default is: Example for HPUX: \fBlpresume command = /usr/bin/lpalt %p-%j -p2\fR .TP -\fBlprm command (S)\fR +\fB>lprm command (S)\fR This parameter specifies the command to be executed on the server host in order to delete a print job. @@ -3968,7 +3937,7 @@ Example 1: \fBlprm command = /usr/bin/lprm -P%p %j Example 2: \fBlprm command = /usr/bin/cancel %p-%j \fR .TP -\fBmachine password timeout (G)\fR +\fB>machine password timeout (G)\fR If a Samba server is a member of a Windows NT Domain (see the security = domain) parameter) then periodically a running smbd(8) process will try and change the MACHINE ACCOUNT @@ -3977,12 +3946,11 @@ PASSWORD stored in the TDB called \fIprivate/secrets.tdb will be changed, in seconds. The default is one week (expressed in seconds), the same as a Windows NT Domain member server. -See also \fBsmbpasswd(8) -\fR and the security = domain) parameter. +See also \fBsmbpasswd\fR(8), and the security = domain) parameter. Default: \fBmachine password timeout = 604800\fR .TP -\fBmagic output (S)\fR +\fB>magic output (S)\fR This parameter specifies the name of a file which will contain output created by a magic script (see the \fImagic script\fR @@ -3997,7 +3965,7 @@ Default: \fBmagic output = .out Example: \fBmagic output = myfile.txt\fR .TP -\fBmagic script (S)\fR +\fB>magic script (S)\fR This parameter specifies the name of a file which, if opened, will be executed by the server when the file is closed. This allows a UNIX script to be sent to the Samba host and @@ -4023,12 +3991,12 @@ Default: \fBNone. Magic scripts disabled.\fR Example: \fBmagic script = user.csh\fR .TP -\fBmangle case (S)\fR +\fB>mangle case (S)\fR See the section on NAME MANGLING Default: \fBmangle case = no\fR .TP -\fBmangled map (S)\fR +\fB>mangled map (S)\fR This is for those who want to directly map UNIX file names which cannot be represented on Windows/DOS. The mangling of names is not always what is needed. In particular you may have @@ -4050,7 +4018,7 @@ Default: \fBno mangled map\fR Example: \fBmangled map = (*;1 *;)\fR .TP -\fBmangled names (S)\fR +\fB>mangled names (S)\fR This controls whether non-DOS names under UNIX should be mapped to DOS-compatible names ("mangled") and made visible, or whether non-DOS names should simply be ignored. @@ -4109,7 +4077,7 @@ do not change between sessions. Default: \fBmangled names = yes\fR .TP -\fBmangling method (G)\fR +\fB>mangling method (G)\fR controls the algorithm used for the generating the mangled names. Can take two different values, "hash" and "hash2". "hash" is the default and is the algorithm that has been @@ -4123,7 +4091,7 @@ Default: \fBmangling method = hash2\fR Example: \fBmangling method = hash\fR .TP -\fBmangle prefix (G)\fR +\fB>mangle prefix (G)\fR controls the number of prefix characters from the original name used when generating the mangled names. A larger value will give a weaker @@ -4134,9 +4102,9 @@ Default: \fBmangle prefix = 1\fR Example: \fBmangle prefix = 4\fR .TP -\fBmangled stack (G)\fR +\fB>mangled stack (G)\fR This parameter controls the number of mangled names -that should be cached in the Samba server smbd(8) +that should be cached in the Samba server \fBsmbd\fR(8). This stack is a list of recently mangled base names (extensions are only maintained if they are longer than 3 characters @@ -4154,7 +4122,7 @@ Default: \fBmangled stack = 50\fR Example: \fBmangled stack = 100\fR .TP -\fBmangling char (S)\fR +\fB>mangling char (S)\fR This controls what character is used as the \fBmagic\fR character in name mangling. The default is a '~' but this may interfere with some software. Use this option to set @@ -4164,7 +4132,7 @@ Default: \fBmangling char = ~\fR Example: \fBmangling char = ^\fR .TP -\fBmap archive (S)\fR +\fB>map archive (S)\fR This controls whether the DOS archive attribute should be mapped to the UNIX owner execute bit. The DOS archive bit is set when a file has been modified since its last backup. One @@ -4178,7 +4146,7 @@ parameter to be set such that owner execute bit is not masked out Default: \fBmap archive = yes\fR .TP -\fBmap hidden (S)\fR +\fB>map hidden (S)\fR This controls whether DOS style hidden files should be mapped to the UNIX world execute bit. @@ -4188,7 +4156,7 @@ it must include 001). See the parameter \fIcreate mask\fR for details. Default: \fBmap hidden = no\fR .TP -\fBmap system (S)\fR +\fB>map system (S)\fR This controls whether DOS style system files should be mapped to the UNIX group execute bit. @@ -4198,13 +4166,13 @@ it must include 010). See the parameter \fIcreate mask\fR for details. Default: \fBmap system = no\fR .TP -\fBmap to guest (G)\fR +\fB>map to guest (G)\fR This parameter is only useful in security modes other than \fIsecurity = share\fR - i.e. user, server, and domain. This parameter can take three different values, which tell -smbd(8) what to do with user +\fBsmbd\fR(8) what to do with user login requests that don't match a valid UNIX user in some way. The three settings are : @@ -4249,7 +4217,7 @@ Default: \fBmap to guest = Never\fR Example: \fBmap to guest = Bad User\fR .TP -\fBmax connections (S)\fR +\fB>max connections (S)\fR This option allows the number of simultaneous connections to a service to be limited. If \fImax connections \fR is greater than 0 then connections will be refused if @@ -4264,7 +4232,7 @@ Default: \fBmax connections = 0\fR Example: \fBmax connections = 10\fR .TP -\fBmax disk size (G)\fR +\fB>max disk size (G)\fR This option allows you to put an upper limit on the apparent size of disks. If you set this option to 100 then all shares will appear to be not larger than 100 MB in @@ -4287,7 +4255,7 @@ Default: \fBmax disk size = 0\fR Example: \fBmax disk size = 1000\fR .TP -\fBmax log size (G)\fR +\fB>max log size (G)\fR This option (an integer in kilobytes) specifies the max size the log file should grow to. Samba periodically checks the size and if it is exceeded it will rename the file, adding @@ -4299,16 +4267,16 @@ Default: \fBmax log size = 5000\fR Example: \fBmax log size = 1000\fR .TP -\fBmax mux (G)\fR +\fB>max mux (G)\fR This option controls the maximum number of outstanding simultaneous SMB operations that Samba tells the client it will allow. You should never need to set this parameter. Default: \fBmax mux = 50\fR .TP -\fBmax open files (G)\fR +\fB>max open files (G)\fR This parameter limits the maximum number of -open files that one smbd(8) file +open files that one \fBsmbd\fR(8) file serving process may have open for a client at any one time. The default for this parameter is set very high (10,000) as Samba uses only one bit per unopened file. @@ -4319,10 +4287,10 @@ this parameter so you should never need to touch this parameter. Default: \fBmax open files = 10000\fR .TP -\fBmax print jobs (S)\fR +\fB>max print jobs (S)\fR This parameter limits the maximum number of jobs allowable in a Samba printer queue at any given moment. -If this number is exceeded, \fB smbd(8)\fR will remote "Out of Space" to the client. +If this number is exceeded, \fBsmbd\fR(8) will remote "Out of Space" to the client. See all \fItotal print jobs\fR. @@ -4330,7 +4298,7 @@ Default: \fBmax print jobs = 1000\fR Example: \fBmax print jobs = 5000\fR .TP -\fBmax protocol (G)\fR +\fB>max protocol (G)\fR The value of the parameter (a string) is the highest protocol level that will be supported by the server. @@ -4368,22 +4336,22 @@ Default: \fBmax protocol = NT1\fR Example: \fBmax protocol = LANMAN1\fR .TP -\fBmax smbd processes (G)\fR +\fB>max smbd processes (G)\fR This parameter limits the maximum number of \fBsmbd(8)\fR processes concurrently running on a system and is intended as a stopgap to prevent degrading service to clients in the event that the server has insufficient resources to handle more than this number of connections. Remember that under normal operating -conditions, each user will have an smbd associated with him or her +conditions, each user will have an \fBsmbd\fR(8) associated with him or her to handle connections to all shares from a given host. Default: \fBmax smbd processes = 0\fR ## no limit Example: \fBmax smbd processes = 1000\fR .TP -\fBmax ttl (G)\fR -This option tells nmbd(8) +\fB>max ttl (G)\fR +This option tells \fBnmbd\fR(8) what the default 'time to live' of NetBIOS names should be (in seconds) when \fBnmbd\fR is requesting a name using either a broadcast packet or from a WINS server. You should never need to @@ -4391,9 +4359,8 @@ change this parameter. The default is 3 days. Default: \fBmax ttl = 259200\fR .TP -\fBmax wins ttl (G)\fR -This option tells nmbd(8) - when acting as a WINS server ( \fIwins support = yes\fR) what the maximum +\fB>max wins ttl (G)\fR +This option tells \fBsmbd\fR(8) when acting as a WINS server ( \fIwins support = yes\fR) what the maximum \&'time to live' of NetBIOS names that \fBnmbd\fR will grant will be (in seconds). You should never need to change this parameter. The default is 6 days (518400 seconds). @@ -4403,7 +4370,7 @@ wins ttl\fR parameter. Default: \fBmax wins ttl = 518400\fR .TP -\fBmax xmit (G)\fR +\fB>max xmit (G)\fR This option controls the maximum packet size that will be negotiated by Samba. The default is 65535, which is the maximum. In some cases you may find you get better performance @@ -4413,7 +4380,7 @@ Default: \fBmax xmit = 65535\fR Example: \fBmax xmit = 8192\fR .TP -\fBmessage command (G)\fR +\fB>message command (G)\fR This specifies what command to run when the server receives a WinPopup style message. @@ -4476,10 +4443,10 @@ Default: \fBno message command\fR Example: \fBmessage command = csh -c 'xedit %s; rm %s' &\fR .TP -\fBmin passwd length (G)\fR +\fB>min passwd length (G)\fR Synonym for \fImin password length\fR. .TP -\fBmin password length (G)\fR +\fB>min password length (G)\fR This option sets the minimum length in characters of a plaintext password that \fBsmbd\fR will accept when performing UNIX password changing. @@ -4490,7 +4457,7 @@ password sync\fR, \fIpasswd program\fR and \fIpasswd chat debug\fR Default: \fBmin password length = 5\fR .TP -\fBmin print space (S)\fR +\fB>min print space (S)\fR This sets the minimum amount of free disk space that must be available before a user will be able to spool a print job. It is specified in kilobytes. The default is 0, which @@ -4503,7 +4470,7 @@ Default: \fBmin print space = 0\fR Example: \fBmin print space = 2000\fR .TP -\fBmin protocol (G)\fR +\fB>min protocol (G)\fR The value of the parameter (a string) is the lowest SMB protocol dialect than Samba will support. Please refer to the \fImax protocol\fR @@ -4522,8 +4489,8 @@ Default : \fBmin protocol = CORE\fR Example : \fBmin protocol = NT1\fR # disable DOS clients .TP -\fBmin wins ttl (G)\fR -This option tells nmbd(8) +\fB>min wins ttl (G)\fR +This option tells \fBnmbd\fR(8) when acting as a WINS server (\fI wins support = yes\fR) what the minimum 'time to live' of NetBIOS names that \fBnmbd\fR will grant will be (in seconds). You should never need to change this parameter. The default @@ -4531,7 +4498,7 @@ is 6 hours (21600 seconds). Default: \fBmin wins ttl = 21600\fR .TP -\fBmsdfs proxy (S)\fR +\fB>msdfs proxy (S)\fR This parameter indicates that the share is a stand-in for another CIFS share whose location is specified by the value of the parameter. When clients attempt to connect to @@ -4544,25 +4511,25 @@ and \fIhost msdfs\fR options to find out how to set up a Dfs root share. -Example: \fBmsdfs proxy = \\otherserver\\someshare\fR +Example: \fBmsdfs proxy = \\\\\\\\otherserver\\\\someshare\fR .TP -\fBmsdfs root (S)\fR +\fB>msdfs root (S)\fR This boolean parameter is only available if Samba is configured and compiled with the \fB --with-msdfs\fR option. If set to yes, Samba treats the share as a Dfs root and allows clients to browse the distributed file system tree rooted at the share directory. Dfs links are specified in the share directory by symbolic -links of the form \fImsdfs:serverA\\shareA,serverB\\shareB\fR +links of the form \fImsdfs:serverA\\\\shareA,serverB\\\\shareB\fR and so on. For more information on setting up a Dfs tree -on Samba, refer to msdfs_setup.html - +on Samba, refer to "Hosting a Microsoft +Distributed File System tree on Samba" document. See also \fIhost msdfs \fR Default: \fBmsdfs root = no\fR .TP -\fBname cache timeout (G)\fR +\fB>name cache timeout (G)\fR Specifies the number of seconds it takes before entries in samba's hostname resolve cache time out. If the timeout is set to 0. the caching is disabled. @@ -4571,7 +4538,7 @@ Default: \fBname cache timeout = 660\fR Example: \fBname cache timeout = 0\fR .TP -\fBname resolve order (G)\fR +\fB>name resolve order (G)\fR This option is used by the programs in the Samba suite to determine what naming services to use and in what order to resolve host names to IP addresses. The option takes a space @@ -4620,7 +4587,7 @@ This will cause the local lmhosts file to be examined first, followed by a broadcast attempt, followed by a normal system hostname lookup. .TP -\fBnetbios aliases (G)\fR +\fB>netbios aliases (G)\fR This is a list of NetBIOS names that nmbd(8) will advertise as additional names by which the Samba server is known. This allows one machine to appear in browse lists under multiple names. If a machine is @@ -4636,7 +4603,7 @@ Default: \fBempty string (no additional names)\fR Example: \fBnetbios aliases = TEST TEST1 TEST2\fR .TP -\fBnetbios name (G)\fR +\fB>netbios name (G)\fR This sets the NetBIOS name by which a Samba server is known. By default it is the same as the first component of the host's DNS name. If a machine is a browse server or @@ -4651,12 +4618,12 @@ Default: \fBmachine DNS name\fR Example: \fBnetbios name = MYNAME\fR .TP -\fBnetbios scope (G)\fR +\fB>netbios scope (G)\fR This sets the NetBIOS scope that Samba will operate under. This should not be set unless every machine on your LAN also sets this value. .TP -\fBnis homedir (G)\fR +\fB>nis homedir (G)\fR Get the home share server from a NIS map. For UNIX systems that use an automounter, the user's home directory will often be mounted on a workstation on demand from a remote @@ -4683,7 +4650,7 @@ be a logon server. Default: \fBnis homedir = no\fR .TP -\fBnon unix account range (G)\fR +\fB>non unix account range (G)\fR The non unix account range parameter specifies the range of 'user ids' that are allocated by the various 'non unix account' passdb backends. These backends allow @@ -4701,7 +4668,7 @@ Default: \fBnon unix account range = Example: \fBnon unix account range = 10000-20000\fR .TP -\fBnt acl support (S)\fR +\fB>nt acl support (S)\fR This boolean parameter controls whether smbd(8) will attempt to map UNIX permissions into Windows NT access control lists. @@ -4710,16 +4677,16 @@ prior to 2.2.2. Default: \fBnt acl support = yes\fR .TP -\fBnt pipe support (G)\fR +\fB>nt pipe support (G)\fR This boolean parameter controls whether -smbd(8) will allow Windows NT +\fBsmbd\fR(8) will allow Windows NT clients to connect to the NT SMB specific IPC$ pipes. This is a developer debugging option and can be left alone. Default: \fBnt pipe support = yes\fR .TP -\fBnt status support (G)\fR +\fB>nt status support (G)\fR This boolean parameter controls whether smbd(8) will negotiate NT specific status support with Windows NT/2k/XP clients. This is a developer debugging option and should be left alone. @@ -4731,15 +4698,15 @@ You should not need to ever disable this parameter. Default: \fBnt status support = yes\fR .TP -\fBnull passwords (G)\fR +\fB>null passwords (G)\fR Allow or disallow client access to accounts that have null passwords. -See also smbpasswd (5) +See also \fBsmbpasswd\fR(5). Default: \fBnull passwords = no\fR .TP -\fBobey pam restrictions (G)\fR +\fB>obey pam restrictions (G)\fR When Samba 2.2 is configured to enable PAM support (i.e. --with-pam), this parameter will control whether or not Samba should obey PAM's account and session management directives. The @@ -4751,7 +4718,7 @@ authentication mechanism needed in the presence of SMB password encryption. Default: \fBobey pam restrictions = no\fR .TP -\fBonly user (S)\fR +\fB>only user (S)\fR This is a boolean option that controls whether connections with usernames not in the \fIuser\fR list will be allowed. By default this option is disabled so that a @@ -4773,10 +4740,10 @@ parameter. Default: \fBonly user = no\fR .TP -\fBonly guest (S)\fR +\fB>only guest (S)\fR A synonym for \fI guest only\fR. .TP -\fBoplock break wait time (G)\fR +\fB>oplock break wait time (G)\fR This is a tuning parameter added due to bugs in both Windows 9x and WinNT. If Samba responds to a client too quickly when that client issues an SMB that can cause an oplock @@ -4790,15 +4757,14 @@ AND UNDERSTOOD THE SAMBA OPLOCK CODE\fR. Default: \fBoplock break wait time = 0\fR .TP -\fBoplock contention limit (S)\fR +\fB>oplock contention limit (S)\fR This is a \fBvery\fR advanced smbd(8) tuning option to improve the efficiency of the granting of oplocks under multiple client contention for the same file. -In brief it specifies a number, which causes smbd not to -grant an oplock even when requested if the approximate number of -clients contending for an oplock on the same file goes over this +In brief it specifies a number, which causes \fBsmbd\fR(8)not to grant an oplock even when requested +if the approximate number of clients contending for an oplock on the same file goes over this limit. This causes \fBsmbd\fR to behave in a similar way to Windows NT. @@ -4807,7 +4773,7 @@ AND UNDERSTOOD THE SAMBA OPLOCK CODE\fR. Default: \fBoplock contention limit = 2\fR .TP -\fBoplocks (S)\fR +\fB>oplocks (S)\fR This boolean option tells \fBsmbd\fR whether to issue oplocks (opportunistic locks) to file open requests on this share. The oplock code can dramatically (approx. 30% or more) improve @@ -4830,19 +4796,21 @@ oplocks\fR and \fI level2 oplocks\fR parameters. Default: \fBoplocks = yes\fR .TP -\fBntlm auth (G)\fR -This parameter determines whether or not smbd will +\fB>ntlm auth (G)\fR +This parameter determines +whether or not \fBsmbd\fR(8) will attempt to authenticate users using the NTLM password hash. If disabled, only the lanman password hashes will be used. -Please note that at least this option or \fBlanman auth\fR should be enabled in order to be able to log in. +Please note that at least this option or \fBlanman auth\fR should +be enabled in order to be able to log in. Default : \fBntlm auth = yes\fR .TP -\fBos level (G)\fR +\fB>os level (G)\fR This integer value controls what level Samba advertises itself as for browse elections. The value of this -parameter determines whether nmbd(8) +parameter determines whether \fBnmbd\fR(8) has a chance of becoming a local master browser for the \fI WORKGROUP\fR in the local broadcast area. \fBNote :\fRBy default, Samba will win @@ -4857,7 +4825,7 @@ Default: \fBos level = 20\fR Example: \fBos level = 65 \fR .TP -\fBos2 driver map (G)\fR +\fB>os2 driver map (G)\fR The parameter is used to define the absolute path to a file containing a mapping of Windows NT printer driver names to OS/2 printer driver names. The format is: @@ -4872,13 +4840,12 @@ LaserJet 5L\fR. The need for the file is due to the printer driver namespace problem described in the Samba Printing HOWTO For more details on OS/2 clients, please -refer to the OS2-Client-HOWTO - containing in the Samba documentation. +refer to the OS2-Client-HOWTO containing in the Samba documentation. Default: \fBos2 driver map = \fR .TP -\fBpam password change (G)\fR +\fB>pam password change (G)\fR With the addition of better PAM support in Samba 2.2, this parameter, it is possible to use PAM's password change control flag for Samba. If enabled, then PAM will be used for password @@ -4890,25 +4857,28 @@ parameter for most setups. Default: \fBpam password change = no\fR .TP -\fBpanic action (G)\fR +\fB>panic action (G)\fR This is a Samba developer option that allows a -system command to be called when either smbd(8) -crashes. This is usually used to draw attention to the fact that -a problem occurred. +system command to be called when either \fBsmbd\fR(8) or \fBsmbd\fR(8) crashes. This is usually used to +draw attention to the fact that a problem occurred. Default: \fBpanic action = \fR Example: \fBpanic action = "/bin/sleep 90000"\fR .TP -\fBparanoid server security (G)\fR +\fB>paranoid server security (G)\fR Some version of NT 4.x allow non-guest users with a bad passowrd. When this option is enabled, samba will not use a broken NT 4.x server as password server, but instead complain -to the logs and exit. +to the logs and exit. + +Disabling this option prevents Samba from making +this check, which involves deliberatly attempting a +bad logon to the remote server. Default: \fBparanoid server security = yes\fR .TP -\fBpassdb backend (G)\fR +\fB>passdb backend (G)\fR This option allows the administrator to chose which backends to retrieve and store passwords with. This allows (for example) both smbpasswd and tdbsam to be used without a recompile. Multiple backends can be specified, separated by spaces. The backends will be searched in the order they are specified. New users are always added to the first backend specified. @@ -4999,11 +4969,11 @@ Example: \fBpassdb backend = ldapsam_nua:ldaps://ldap.example.com unixsam\fR Example: \fBpassdb backend = plugin:/usr/local/samba/lib/my_passdb.so:my_plugin_args tdbsam:/etc/samba/private/passdb.tdb\fR .TP -\fBpasswd chat (G)\fR +\fB>passwd chat (G)\fR This string controls the \fB"chat"\fR -conversation that takes places between smbd and the local password changing +conversation that takes places between \fBsmbd\fR(8) and the local password changing program to change the user's password. The string describes a -sequence of response-receive pairs that smbd(8) uses to determine what to send to the +sequence of response-receive pairs that \fBsmbd\fR(8) uses to determine what to send to the \fIpasswd program\fR and what to expect back. If the expected output is not received then the password is not changed. @@ -5023,7 +4993,7 @@ executed on the NIS master. The string can contain the macro \fI%n\fR which is substituted for the new password. The chat sequence can also contain the standard -macros \\n, \\r, \\t and \\s to give line-feed, +macros \\\\n, \\\\r, \\\\t and \\\\s to give line-feed, carriage-return, tab and space. The chat sequence string can also contain a '*' which matches any sequence of characters. Double quotes can be used to collect strings with spaces @@ -5041,18 +5011,18 @@ not any particular output. The \\n macro is ignored for PAM conversions. See also \fIunix password sync\fR, \fI passwd program\fR , \fIpasswd chat debug\fR and \fIpam password change\fR. -Default: \fBpasswd chat = *new*password* %n\\n -*new*password* %n\\n *changed*\fR +Default: \fBpasswd chat = *new*password* %n\\\\n +*new*password* %n\\\\n *changed*\fR -Example: \fBpasswd chat = "*Enter OLD password*" %o\\n -"*Enter NEW password*" %n\\n "*Reenter NEW password*" %n\\n "*Password +Example: \fBpasswd chat = "*Enter OLD password*" %o\\\\n +"*Enter NEW password*" %n\\\\n "*Reenter NEW password*" %n\\\\n "*Password changed*"\fR .TP -\fBpasswd chat debug (G)\fR +\fB>passwd chat debug (G)\fR This boolean specifies if the passwd chat script parameter is run in \fBdebug\fR mode. In this mode the strings passed to and received from the passwd chat are printed -in the smbd(8) log with a +in the \fBsmbd\fR(8) log with a \fIdebug level\fR of 100. This is a dangerous option as it will allow plaintext passwords to be seen in the \fBsmbd\fR log. It is available to help @@ -5069,7 +5039,7 @@ See also \fIpasswd chat\fR Default: \fBpasswd chat debug = no\fR .TP -\fBpasswd program (G)\fR +\fB>passwd program (G)\fR The name of a program that can be used to set UNIX user passwords. Any occurrences of \fI%u\fR will be replaced with the user name. The user name is checked for @@ -5102,7 +5072,7 @@ Default: \fBpasswd program = /bin/passwd\fR Example: \fBpasswd program = /sbin/npasswd %u\fR .TP -\fBpassword level (G)\fR +\fB>password level (G)\fR Some client/server combinations have difficulty with mixed-case passwords. One offending client is Windows for Workgroups, which for some reason forces passwords to upper @@ -5140,7 +5110,7 @@ Default: \fBpassword level = 0\fR Example: \fBpassword level = 4\fR .TP -\fBpassword server (G)\fR +\fB>password server (G)\fR By specifying the name of another SMB server (such as a WinNT box) with this option, and using \fBsecurity = domain \fR or \fBsecurity = server\fR you can get Samba @@ -5231,7 +5201,7 @@ Example: \fBpassword server = NT-PDC, NT-BDC1, NT-BDC2, * Example: \fBpassword server = *\fR .TP -\fBpath (S)\fR +\fB>path (S)\fR This parameter specifies a directory to which the user of the service is to be given access. In the case of printable services, this is where print data will spool prior to @@ -5256,7 +5226,7 @@ Default: \fBnone\fR Example: \fBpath = /home/fred\fR .TP -\fBpid directory (G)\fR +\fB>pid directory (G)\fR This option specifies the directory where pid files will be placed. @@ -5264,8 +5234,8 @@ Default: \fBpid directory = ${prefix}/var/locks\fR Example: \fBpid directory = /var/run/\fR .TP -\fBposix locking (S)\fR -The \fBsmbd(8)\fR +\fB>posix locking (S)\fR +The \fBsmbd\fR(8) daemon maintains an database of file locks obtained by SMB clients. The default behavior is to map this internal database to POSIX locks. This means that file locks obtained by SMB clients are @@ -5275,7 +5245,7 @@ You should never need to disable this parameter. Default: \fBposix locking = yes\fR .TP -\fBpostexec (S)\fR +\fB>postexec (S)\fR This option specifies a command to be run whenever the service is disconnected. It takes the usual substitutions. The command may be run as the root on some @@ -5294,7 +5264,7 @@ Default: \fBnone (no command executed)\fR Example: \fBpostexec = echo \\"%u disconnected from %S from %m (%I)\\" >> /tmp/log\fR .TP -\fBpostscript (S)\fR +\fB>postscript (S)\fR This parameter forces a printer to interpret the print files as PostScript. This is done by adding a %! to the start of print output. @@ -5305,7 +5275,7 @@ confuses your printer. Default: \fBpostscript = no\fR .TP -\fBpreexec (S)\fR +\fB>preexec (S)\fR This option specifies a command to be run whenever the service is connected to. It takes the usual substitutions. @@ -5327,14 +5297,14 @@ Default: \fBnone (no command executed)\fR Example: \fBpreexec = echo \\"%u connected to %S from %m (%I)\\" >> /tmp/log\fR .TP -\fBpreexec close (S)\fR +\fB>preexec close (S)\fR This boolean option controls whether a non-zero return code from \fIpreexec \fR should close the service being connected to. Default: \fBpreexec close = no\fR .TP -\fBpreferred master (G)\fR +\fB>preferred master (G)\fR This boolean parameter controls if nmbd(8) is a preferred master browser for its workgroup. @@ -5355,10 +5325,10 @@ See also \fIos level\fR Default: \fBpreferred master = auto\fR .TP -\fBprefered master (G)\fR +\fB>prefered master (G)\fR Synonym for \fI preferred master\fR for people who cannot spell :-). .TP -\fBpreload (G)\fR +\fB>preload (G)\fR This is a list of services that you want to be automatically added to the browse lists. This is most useful for homes and printers services that would otherwise not be @@ -5371,7 +5341,7 @@ Default: \fBno preloaded services\fR Example: \fBpreload = fred lp colorlp\fR .TP -\fBpreserve case (S)\fR +\fB>preserve case (S)\fR This controls if new filenames are created with the case that the client passes, or if they are forced to be the \fIdefault case @@ -5382,7 +5352,7 @@ Default: \fBpreserve case = yes\fR See the section on NAME MANGLING for a fuller discussion. .TP -\fBprint command (S)\fR +\fB>print command (S)\fR After a print job has finished spooling to a service, this command will be used via a \fBsystem()\fR call to process the spool file. Typically the command specified will @@ -5467,10 +5437,10 @@ set print command will be ignored. Example: \fBprint command = /usr/local/samba/bin/myprintscript %p %s\fR .TP -\fBprint ok (S)\fR +\fB>print ok (S)\fR Synonym for \fIprintable\fR. .TP -\fBprintable (S)\fR +\fB>printable (S)\fR If this parameter is yes, then clients may open, write to and submit spool files on the directory specified for the service. @@ -5483,10 +5453,10 @@ the resource. Default: \fBprintable = no\fR .TP -\fBprintcap (G)\fR +\fB>printcap (G)\fR Synonym for \fI printcap name\fR. .TP -\fBprintcap name (G)\fR +\fB>printcap name (G)\fR This parameter may be used to override the compiled-in default printcap name used by the server (usually \fI /etc/printcap\fR). See the discussion of the [printers] section above for reasons why you might want to do this. @@ -5510,12 +5480,11 @@ A minimal printcap file would look something like this: .nf - print1|My Printer 1 - print2|My Printer 2 - print3|My Printer 3 - print4|My Printer 4 - print5|My Printer 5 - +print1|My Printer 1 +print2|My Printer 2 +print3|My Printer 3 +print4|My Printer 4 +print5|My Printer 5 .fi where the '|' separates aliases of a printer. The fact @@ -5531,7 +5500,7 @@ Default: \fBprintcap name = /etc/printcap\fR Example: \fBprintcap name = /etc/myprintcap\fR .TP -\fBprinter admin (S)\fR +\fB>printer admin (S)\fR This is a list of users that can do anything to printers via the remote administration interfaces offered by MS-RPC (usually using a NT workstation). Note that the root user always @@ -5541,7 +5510,7 @@ Default: \fBprinter admin = \fR Example: \fBprinter admin = admin, @staff\fR .TP -\fBprinter driver (S)\fR +\fB>printer driver (S)\fR \fBNote :\fRThis is a deprecated parameter and will be removed in the next major release following version 2.2. Please see the instructions in @@ -5567,7 +5536,7 @@ driver file\fR. Example: \fBprinter driver = HP LaserJet 4L\fR .TP -\fBprinter driver file (G)\fR +\fB>printer driver file (G)\fR \fBNote :\fRThis is a deprecated parameter and will be removed in the next major release following version 2.2. Please see the instructions in @@ -5595,7 +5564,7 @@ Default: \fBNone (set in compile).\fR Example: \fBprinter driver file = /usr/local/samba/printers/drivers.def\fR .TP -\fBprinter driver location (S)\fR +\fB>printer driver location (S)\fR \fBNote :\fRThis is a deprecated parameter and will be removed in the next major release following version 2.2. Please see the instructions in @@ -5622,7 +5591,7 @@ Default: \fBnone\fR Example: \fBprinter driver location = \\\\MACHINE\\PRINTER$ \fR .TP -\fBprinter name (S)\fR +\fB>printer name (S)\fR This parameter specifies the name of the printer to which print jobs spooled through a printable service will be sent. @@ -5635,10 +5604,10 @@ on many systems)\fR Example: \fBprinter name = laserwriter\fR .TP -\fBprinter (S)\fR +\fB>printer (S)\fR Synonym for \fI printer name\fR. .TP -\fBprinting (S)\fR +\fB>printing (S)\fR This parameters controls how printer status information is interpreted on your system. It also affects the default values for the \fIprint command\fR, @@ -5661,21 +5630,21 @@ This option can be set on a per printer basis See also the discussion in the [printers] section. .TP -\fBprivate dir (G)\fR +\fB>private dir (G)\fR This parameters defines the directory smbd will use for storing such files as \fIsmbpasswd\fR and \fIsecrets.tdb\fR. Default :\fBprivate dir = ${prefix}/private\fR .TP -\fBprotocol (G)\fR +\fB>protocol (G)\fR Synonym for \fImax protocol\fR. .TP -\fBpublic (S)\fR +\fB>public (S)\fR Synonym for \fIguest ok\fR. .TP -\fBqueuepause command (S)\fR +\fB>queuepause command (S)\fR This parameter specifies the command to be executed on the server host in order to pause the printer queue. @@ -5699,7 +5668,7 @@ Default: \fBdepends on the setting of \fIprinting Example: \fBqueuepause command = disable %p\fR .TP -\fBqueueresume command (S)\fR +\fB>queueresume command (S)\fR This parameter specifies the command to be executed on the server host in order to resume the printer queue. It is the command to undo the behavior that is caused by the @@ -5726,7 +5695,7 @@ Default: \fBdepends on the setting of \fIprinting\fB\fR Example: \fBqueuepause command = enable %p \fR .TP -\fBread bmpx (G)\fR +\fB>read bmpx (G)\fR This boolean parameter controls whether smbd(8) will support the "Read Block Multiplex" SMB. This is now rarely used and defaults to no. You should never need to set this @@ -5734,7 +5703,7 @@ parameter. Default: \fBread bmpx = no\fR .TP -\fBread list (S)\fR +\fB>read list (S)\fR This is a list of users that are given read-only access to a service. If the connecting user is in this list then they will not be given write access, no matter what the \fIread only\fR @@ -5748,7 +5717,7 @@ Default: \fBread list = \fR Example: \fBread list = mary, @students\fR .TP -\fBread only (S)\fR +\fB>read only (S)\fR An inverted synonym is \fIwriteable\fR. If this parameter is yes, then users @@ -5761,7 +5730,7 @@ will \fBALWAYS\fR allow writing to the directory Default: \fBread only = yes\fR .TP -\fBread raw (G)\fR +\fB>read raw (G)\fR This parameter controls whether or not the server will support the raw read SMB requests when transferring data to clients. @@ -5778,7 +5747,7 @@ tool and left severely alone. See also \fIwrite raw\fR. Default: \fBread raw = yes\fR .TP -\fBread size (G)\fR +\fB>read size (G)\fR The option \fIread size\fR affects the overlap of disk reads/writes with network reads/writes. If the amount of data being transferred in several of the SMB @@ -5802,7 +5771,7 @@ Default: \fBread size = 16384\fR Example: \fBread size = 8192\fR .TP -\fBrealm (G)\fR +\fB>realm (G)\fR This option specifies the kerberos realm to use. The realm is used as the ADS equivalent of the NT4\fBdomain\fR. It is usually set to the DNS name of the kerberos server. @@ -5811,7 +5780,7 @@ Default: \fBrealm = \fR Example: \fBrealm = mysambabox.mycompany.com\fR .TP -\fBremote announce (G)\fR +\fB>remote announce (G)\fR This option allows you to setup nmbd(8) to periodically announce itself to arbitrary IP addresses with an arbitrary workgroup name. @@ -5835,13 +5804,13 @@ The IP addresses you choose would normally be the broadcast addresses of the remote networks, but can also be the IP addresses of known browse masters if your network config is that stable. -See the documentation file \fIBROWSING.txt\fR +See the documentation file BROWSING in the \fIdocs/\fR directory. Default: \fBremote announce = \fR .TP -\fBremote browse sync (G)\fR +\fB>remote browse sync (G)\fR This option allows you to setup nmbd(8) to periodically request synchronization of browse lists with the master browser of a Samba server that is on a remote segment. This option will allow you to @@ -5872,7 +5841,7 @@ is in fact the browse master on its segment. Default: \fBremote browse sync = \fR .TP -\fBrestrict anonymous (G)\fR +\fB>restrict anonymous (G)\fR This is a integer parameter, and mirrors as much as possible the functinality the RestrictAnonymous @@ -5880,13 +5849,13 @@ registry key does on NT/Win2k. Default: \fBrestrict anonymous = 0\fR .TP -\fBroot (G)\fR +\fB>root (G)\fR Synonym for \fIroot directory"\fR. .TP -\fBroot dir (G)\fR +\fB>root dir (G)\fR Synonym for \fIroot directory"\fR. .TP -\fBroot directory (G)\fR +\fB>root directory (G)\fR The server will \fBchroot()\fR (i.e. Change its root directory) to this directory on startup. This is not strictly necessary for secure operation. Even without it the @@ -5913,7 +5882,7 @@ Default: \fBroot directory = /\fR Example: \fBroot directory = /homes/smb\fR .TP -\fBroot postexec (S)\fR +\fB>root postexec (S)\fR This is the same as the \fIpostexec\fR parameter except that the command is run as root. This is useful for unmounting filesystems @@ -5924,7 +5893,7 @@ See also \fI postexec\fR. Default: \fBroot postexec = \fR .TP -\fBroot preexec (S)\fR +\fB>root preexec (S)\fR This is the same as the \fIpreexec\fR parameter except that the command is run as root. This is useful for mounting filesystems (such as CDROMs) when a @@ -5935,7 +5904,7 @@ See also \fI preexec\fR and \fIpreexec close\fR. Default: \fBroot preexec = \fR .TP -\fBroot preexec close (S)\fR +\fB>root preexec close (S)\fR This is the same as the \fIpreexec close \fR parameter except that the command is run as root. @@ -5943,13 +5912,12 @@ See also \fI preexec\fR and \fIpreexec close\fR. Default: \fBroot preexec close = no\fR .TP -\fBsecurity (G)\fR +\fB>security (G)\fR This option affects how clients respond to Samba and is one of the most important settings in the \fI smb.conf\fR file. The option sets the "security mode bit" in replies to -protocol negotiations with smbd(8) - to turn share level security on or off. Clients decide +protocol negotiations with \fBsmbd\fR(8) to turn share level security on or off. Clients decide based on this bit whether (and how) to transfer user and password information to the server. @@ -5990,7 +5958,7 @@ level security under different \fINetBIOS aliases\fR. The different settings will now be explained. -\fBSECURITY = SHARE +>\fBSECURITY = SHARE \fR When clients connect to a share level security server they @@ -6058,10 +6026,10 @@ be used in granting access. See also the section NOTE ABOUT USERNAME/PASSWORD VALIDATION. -\fBSECURITY = USER +>\fBSECURITY = USER \fR -This is the default security setting in Samba 2.2. +This is the default security setting in Samba 3.0. With user-level security a client must first "log-on" with a valid username and password (which can be mapped using the \fIusername map\fR parameter). Encrypted passwords (see the \fIencrypted passwords\fR parameter) can also @@ -6079,23 +6047,24 @@ parameter for details on doing this. See also the section NOTE ABOUT USERNAME/PASSWORD VALIDATION. -\fBSECURITY = SERVER +>\fBSECURITY = DOMAIN \fR -In this mode Samba will try to validate the username/password -by passing it to another SMB server, such as an NT box. If this -fails it will revert to \fBsecurity = user\fR, but note -that if encrypted passwords have been negotiated then Samba cannot -revert back to checking the UNIX password file, it must have a valid -\fIsmbpasswd\fR file to check users against. See the -documentation file in the \fIdocs/\fR directory -\fIENCRYPTION.txt\fR for details on how to set this -up. +This mode will only work correctly if \fBnet\fR(8) has been used to add this +machine into a Windows NT Domain. It expects the \fIencrypted passwords\fR +parameter to be set to yes. In this +mode Samba will try to validate the username/password by passing +it to a Windows NT Primary or Backup Domain Controller, in exactly +the same way that a Windows NT Server would do. -\fBNote\fR that from the client's point of -view \fBsecurity = server\fR is the same as \fB security = user\fR. It only affects how the server deals -with the authentication, it does not in any way affect what the -client sees. +\fBNote\fR that a valid UNIX user must still +exist as well as the account on the Domain Controller to allow +Samba to have a valid UNIX account to map file access to. + +\fBNote\fR that from the client's point +of view \fBsecurity = domain\fR is the same as \fBsecurity = user +\fR. It only affects how the server deals with the authentication, +it does not in any way affect what the client sees. \fBNote\fR that the name of the resource being requested is \fBnot\fR sent to the server until after @@ -6111,24 +6080,39 @@ See also the \fIpassword server\fR parameter and the \fIencrypted passwords\fR parameter. -\fBSECURITY = DOMAIN +>\fBSECURITY = SERVER \fR -This mode will only work correctly if smbpasswd(8) has been used to add this -machine into a Windows NT Domain. It expects the \fIencrypted passwords\fR -parameter to be set to yes. In this -mode Samba will try to validate the username/password by passing -it to a Windows NT Primary or Backup Domain Controller, in exactly -the same way that a Windows NT Server would do. +In this mode Samba will try to validate the username/password +by passing it to another SMB server, such as an NT box. If this +fails it will revert to \fBsecurity = +user\fR. It expects the \fIencrypted passwords\fR +parameter to be set to +yes, unless the remote server +does not support them. However note +that if encrypted passwords have been negotiated then Samba cannot +revert back to checking the UNIX password file, it must have a valid +\fIsmbpasswd\fR file to check users against. See the +documentation file in the \fIdocs/\fR directory +\fIENCRYPTION.txt\fR for details on how to set this +up. -\fBNote\fR that a valid UNIX user must still -exist as well as the account on the Domain Controller to allow -Samba to have a valid UNIX account to map file access to. +\fBNote\fR this mode of operation +has significant pitfalls, due to the fact that is +activly initiates a man-in-the-middle attack on the +remote SMB server. In particular, this mode of +operation can cause significant resource consuption on +the PDC, as it must maintain an active connection for +the duration of the user's session. Furthermore, if +this connection is lost, there is no way to +reestablish it, and futher authenticaions to the Samba +server may fail. (From a single client, till it +disconnects). -\fBNote\fR that from the client's point -of view \fBsecurity = domain\fR is the same as \fBsecurity = user -\fR. It only affects how the server deals with the authentication, -it does not in any way affect what the client sees. +\fBNote\fR that from the client's point of +view \fBsecurity = server\fR is the same as \fB security = user\fR. It only affects how the server deals +with the authentication, it does not in any way affect what the +client sees. \fBNote\fR that the name of the resource being requested is \fBnot\fR sent to the server until after @@ -6138,14 +6122,6 @@ the server to automatically map unknown users into the \fIguest account\fR. See the \fImap to guest\fR parameter for details on doing this. -\fBBUG:\fR There is currently a bug in the -implementation of \fBsecurity = domain\fR with respect -to multi-byte character set usernames. The communication with a -Domain Controller must be done in UNICODE and Samba currently -does not widen multi-byte user names to UNICODE correctly, thus -a multi-byte username will not be recognized correctly at the -Domain Controller. This issue will be addressed in a future release. - See also the section NOTE ABOUT USERNAME/PASSWORD VALIDATION. See also the \fIpassword @@ -6156,7 +6132,7 @@ Default: \fBsecurity = USER\fR Example: \fBsecurity = DOMAIN\fR .TP -\fBsecurity mask (S)\fR +\fB>security mask (S)\fR This parameter controls what UNIX permission bits can be modified when a Windows NT client is manipulating the UNIX permission on a file using the native NT security @@ -6185,7 +6161,7 @@ Default: \fBsecurity mask = 0777\fR Example: \fBsecurity mask = 0770\fR .TP -\fBserver string (G)\fR +\fB>server string (G)\fR This controls what string will show up in the printer comment box in print manager and next to the IPC connection in \fBnet view\fR. It can be any string that you wish @@ -6205,7 +6181,7 @@ Default: \fBserver string = Samba %v\fR Example: \fBserver string = University of GNUs Samba Server\fR .TP -\fBset directory (S)\fR +\fB>set directory (S)\fR If \fBset directory = no\fR, then users of the service may not use the setdir command to change directory. @@ -6216,7 +6192,7 @@ for details. Default: \fBset directory = no\fR .TP -\fBshare modes (S)\fR +\fB>share modes (S)\fR This enables or disables the honoring of the \fIshare modes\fR during a file open. These modes are used by clients to gain exclusive read or write access @@ -6239,7 +6215,7 @@ off as many Windows applications will break if you do so. Default: \fBshare modes = yes\fR .TP -\fBshort preserve case (S)\fR +\fB>short preserve case (S)\fR This boolean parameter controls if new files which conform to 8.3 syntax, that is all in upper case and of suitable length, are created upper case, or if they are forced @@ -6252,7 +6228,7 @@ See the section on NAME MANGLING. Default: \fBshort preserve case = yes\fR .TP -\fBshow add printer wizard (G)\fR +\fB>show add printer wizard (G)\fR With the introduction of MS-RPC based printing support for Windows NT/2000 client in Samba 2.2, a "Printers..." folder will appear on Samba hosts in the share listing. Normally this folder will @@ -6279,7 +6255,7 @@ command\fR, \fIdeleteprinter command\fR, \fIprinter admin\fR Default :\fBshow add printer wizard = yes\fR .TP -\fBshutdown script (G)\fR +\fB>shutdown script (G)\fR \fBThis parameter only exists in the HEAD cvs branch\fR This a full path name to a script called by \fBsmbd(8)\fR that @@ -6312,20 +6288,19 @@ Example: \fBabort shutdown script = /usr/local/samba/sbin/shutdown %m %t %r %f\f Shutdown script example: .nf - #!/bin/bash +#!/bin/bash - $time=0 - let "time/60" - let "time++" +$time=0 +let "time/60" +let "time++" - /sbin/shutdown $3 $4 +$time $1 & - +/sbin/shutdown $3 $4 +$time $1 & .fi Shutdown does not return so we need to launch it in background. See also \fIabort shutdown script\fR. .TP -\fBsmb passwd file (G)\fR +\fB>smb passwd file (G)\fR This option sets the path to the encrypted smbpasswd file. By default the path to the smbpasswd file is compiled into Samba. @@ -6336,13 +6311,13 @@ Default: \fBsmb passwd file = ${prefix}/private/smbpasswd Example: \fBsmb passwd file = /etc/samba/smbpasswd \fR .TP -\fBsmb ports (G)\fR +\fB>smb ports (G)\fR Specifies which ports the server should listen on for SMB traffic. Default: \fBsmb ports = 445 139\fR .TP -\fBsocket address (G)\fR +\fB>socket address (G)\fR This option allows you to control what address Samba will listen for connections on. This is used to support multiple virtual interfaces on the one server, each @@ -6353,7 +6328,7 @@ address. Example: \fBsocket address = 192.168.2.20\fR .TP -\fBsocket options (G)\fR +\fB>socket options (G)\fR This option allows you to set socket options to be used when talking with the client. @@ -6441,7 +6416,7 @@ Default: \fBsocket options = TCP_NODELAY\fR Example: \fBsocket options = IPTOS_LOWDELAY\fR .TP -\fBsource environment (G)\fR +\fB>source environment (G)\fR This parameter causes Samba to set environment variables as per the content of the file named. @@ -6465,26 +6440,31 @@ Examples: \fBsource environment = |/etc/smb.conf.sh Example: \fBsource environment = /usr/local/smb_env_vars\fR .TP -\fBuse spnego (G)\fR -This variable controls controls whether samba will try to use Simple and Protected NEGOciation (as specified by rfc2478) with WindowsXP and Windows2000sp2 clients to agree upon an authentication mechanism. As of samba 3.0alpha it must be set to "no" for these clients to join a samba domain controller. It can be set to "yes" to allow samba to participate in an AD domain controlled by a Windows2000 domain controller. +\fB>use spnego (G)\fR +This variable controls controls whether samba will try +to use Simple and Protected NEGOciation (as specified by rfc2478) with +WindowsXP and Windows2000sp2 clients to agree upon an authentication mechanism. +Unless further issues are discovered with our SPNEGO +implementation, there is no reason this should ever be +disabled. Default: \fBuse spnego = yes\fR .TP -\fBstat cache (G)\fR -This parameter determines if smbd(8) will use a cache in order to +\fB>stat cache (G)\fR +This parameter determines if \fBsmbd\fR(8) will use a cache in order to speed up case insensitive name mappings. You should never need to change this parameter. Default: \fBstat cache = yes\fR .TP -\fBstat cache size (G)\fR +\fB>stat cache size (G)\fR This parameter determines the number of entries in the \fIstat cache\fR. You should never need to change this parameter. Default: \fBstat cache size = 50\fR .TP -\fBstrict allocate (S)\fR +\fB>strict allocate (S)\fR This is a boolean that controls the handling of disk space allocation in the server. When this is set to yes the server will change from UNIX behaviour of not committing real @@ -6503,7 +6483,7 @@ of users. Default: \fBstrict allocate = no\fR .TP -\fBstrict locking (S)\fR +\fB>strict locking (S)\fR This is a boolean that controls the handling of file locking in the server. When this is set to yes the server will check every read and write access for file locks, and @@ -6518,7 +6498,7 @@ locking = no\fR is preferable. Default: \fBstrict locking = no\fR .TP -\fBstrict sync (S)\fR +\fB>strict sync (S)\fR Many Windows applications (including the Windows 98 explorer shell) seem to confuse flushing buffer contents to disk with doing a sync to disk. Under UNIX, a sync call forces @@ -6526,7 +6506,7 @@ the process to be suspended until the kernel has ensured that all outstanding data in kernel disk buffers has been safely stored onto stable storage. This is very slow and should only be done rarely. Setting this parameter to no (the -default) means that smbd ignores the Windows applications requests for +default) means that \fBsmbd\fR(8) ignores the Windows applications requests for a sync call. There is only a possibility of losing data if the operating system itself that Samba is running on crashes, so there is little danger in this default setting. In addition, this fixes many @@ -6538,14 +6518,14 @@ always>\fR parameter. Default: \fBstrict sync = no\fR .TP -\fBstrip dot (G)\fR +\fB>strip dot (G)\fR This is a boolean that controls whether to strip trailing dots off UNIX filenames. This helps with some CDROMs that have filenames ending in a single dot. Default: \fBstrip dot = no\fR .TP -\fBsync always (S)\fR +\fB>sync always (S)\fR This is a boolean parameter that controls whether writes will always be written to stable storage before the write call returns. If this is no then the server will be @@ -6562,7 +6542,7 @@ sync\fR parameter. Default: \fBsync always = no\fR .TP -\fBsyslog (G)\fR +\fB>syslog (G)\fR This parameter maps how Samba debug messages are logged onto the system syslog logging levels. Samba debug level zero maps onto syslog LOG_ERR, debug @@ -6576,14 +6556,14 @@ will be sent to syslog. Default: \fBsyslog = 1\fR .TP -\fBsyslog only (G)\fR +\fB>syslog only (G)\fR If this parameter is set then Samba debug messages are logged into the system syslog only, and not to the debug log files. Default: \fBsyslog only = no\fR .TP -\fBtemplate homedir (G)\fR +\fB>template homedir (G)\fR When filling out the user information for a Windows NT user, the winbindd(8) daemon uses this parameter to fill in the home directory for that user. @@ -6594,14 +6574,14 @@ NT user name. Default: \fBtemplate homedir = /home/%D/%U\fR .TP -\fBtemplate shell (G)\fR +\fB>template shell (G)\fR When filling out the user information for a Windows NT -user, the winbindd(8) daemon +user, the \fBwinbindd\fR(8) daemon uses this parameter to fill in the login shell for that user. Default: \fBtemplate shell = /bin/false\fR .TP -\fBtime offset (G)\fR +\fB>time offset (G)\fR This parameter is a setting in minutes to add to the normal GMT to local time conversion. This is useful if you are serving a lot of PCs that have incorrect daylight @@ -6611,21 +6591,20 @@ Default: \fBtime offset = 0\fR Example: \fBtime offset = 60\fR .TP -\fBtime server (G)\fR -This parameter determines if -nmbd(8) advertises itself as a time server to Windows +\fB>time server (G)\fR +This parameter determines if \fBnmbd\fR(8) advertises itself as a time server to Windows clients. Default: \fBtime server = no\fR .TP -\fBtimestamp logs (G)\fR +\fB>timestamp logs (G)\fR Synonym for \fI debug timestamp\fR. .TP -\fBtotal print jobs (G)\fR +\fB>total print jobs (G)\fR This parameter accepts an integer value which defines a limit on the maximum number of print jobs that will be accepted system wide at any given time. If a print job is submitted -by a client which will exceed this number, then smbd will return an +by a client which will exceed this number, then \fBsmbd\fR(8) will return an error indicating that no space is available on the server. The default value of 0 means that no such limit exists. This parameter can be used to prevent a server from exceeding its capacity and is @@ -6636,23 +6615,23 @@ Default: \fBtotal print jobs = 0\fR Example: \fBtotal print jobs = 5000\fR .TP -\fBunicode (G)\fR +\fB>unicode (G)\fR Specifies whether Samba should try to use unicode on the wire by default. Note: This does NOT mean that samba will assume that the unix machine uses unicode! Default: \fBunicode = yes\fR .TP -\fBunix charset (G)\fR +\fB>unix charset (G)\fR Specifies the charset the unix machine Samba runs on uses. Samba needs to know this in order to be able to convert text to the charsets other SMB clients use. -Default: \fBunix charset = ASCII\fR +Default: \fBunix charset = UTF8\fR -Example: \fBunix charset = UTF8\fR +Example: \fBunix charset = ASCII\fR .TP -\fBunix extensions(G)\fR +\fB>unix extensions(G)\fR This boolean parameter controls whether Samba implments the CIFS UNIX extensions, as defined by HP. These extensions enable Samba to better serve UNIX CIFS clients @@ -6662,7 +6641,7 @@ no current use to Windows clients. Default: \fBunix extensions = no\fR .TP -\fBunix password sync (G)\fR +\fB>unix password sync (G)\fR This boolean parameter controls whether Samba attempts to synchronize the UNIX password with the SMB password when the encrypted SMB password in the smbpasswd file is changed. @@ -6677,7 +6656,7 @@ program\fR, \fI passwd chat\fR. Default: \fBunix password sync = no\fR .TP -\fBupdate encrypted (G)\fR +\fB>update encrypted (G)\fR This boolean parameter allows a user logging on with a plaintext password to have their encrypted (hashed) password in the smbpasswd file to be updated automatically as @@ -6703,7 +6682,7 @@ password in order to connect correctly, and to update their hashed Default: \fBupdate encrypted = no\fR .TP -\fBuse client driver (S)\fR +\fB>use client driver (S)\fR This parameter applies only to Windows NT/2000 clients. It has no affect on Windows 95/98/ME clients. When serving a printer to Windows NT/2000 clients without first installing @@ -6735,7 +6714,7 @@ See also disable spoolss Default: \fBuse client driver = no\fR .TP -\fBuse mmap (G)\fR +\fB>use mmap (G)\fR This global parameter determines if the tdb internals of Samba can depend on mmap working correctly on the running system. Samba requires a coherent mmap/read-write system memory cache. Currently only HPUX does not have such a @@ -6746,7 +6725,7 @@ the tdb internal code. Default: \fBuse mmap = yes\fR .TP -\fBuse rhosts (G)\fR +\fB>use rhosts (G)\fR If this global parameter is yes, it specifies that the UNIX user's \fI.rhosts\fR file in their home directory will be read to find the names of hosts and users who will be allowed @@ -6760,13 +6739,13 @@ you are doing. Default: \fBuse rhosts = no\fR .TP -\fBuser (S)\fR +\fB>user (S)\fR Synonym for \fI username\fR. .TP -\fBusers (S)\fR +\fB>users (S)\fR Synonym for \fI username\fR. .TP -\fBusername (S)\fR +\fB>username (S)\fR Multiple users may be specified in a comma-delimited list, in which case the supplied password will be tested against each username in turn (left to right). @@ -6807,7 +6786,7 @@ If any of the usernames begin with a '+' then the name will be looked up only in the UNIX groups database and will expand to a list of all users in the group of that name. -If any of the usernames begin with a '&'then the name +If any of the usernames begin with a '&' then the name will be looked up only in the NIS netgroups database (if Samba is compiled with netgroup support) and will expand to a list of all users in the netgroup group of that name. @@ -6826,7 +6805,7 @@ else .\fR Examples:\fBusername = fred, mary, jack, jane, @users, @pcgroup\fR .TP -\fBusername level (G)\fR +\fB>username level (G)\fR This option helps Samba to try and 'guess' at the real UNIX username, as many DOS clients send an all-uppercase username. By default Samba tries all lowercase, followed by the @@ -6845,7 +6824,7 @@ Default: \fBusername level = 0\fR Example: \fBusername level = 5\fR .TP -\fBusername map (G)\fR +\fB>username map (G)\fR This option allows you to specify a file containing a mapping of usernames from the clients to the server. This can be used for several purposes. The most common is to map usernames @@ -6908,9 +6887,8 @@ that line. .nf - !sys = mary fred - guest = * - +!sys = mary fred +guest = * .fi Note that the remapping is applied to all occurrences @@ -6932,7 +6910,7 @@ Default: \fBno username map\fR Example: \fBusername map = /usr/local/samba/lib/users.map \fR .TP -\fBuse sendfile (S)\fR +\fB>use sendfile (S)\fR If this parameter is yes, and Samba was built with the --with-sendfile-support option, and the underlying operating system supports sendfile system call, then some SMB read calls (mainly ReadAndX @@ -6943,7 +6921,7 @@ as yet. Default: \fBuse sendfile = no\fR .TP -\fButmp (G)\fR +\fB>utmp (G)\fR This boolean parameter is only available if Samba has been configured and compiled with the option \fB --with-utmp\fR. If set to yes then Samba will attempt to add utmp or utmpx records (depending on the UNIX system) whenever a @@ -6960,7 +6938,7 @@ See also the \fI utmp directory\fR parameter. Default: \fButmp = no\fR .TP -\fButmp directory(G)\fR +\fB>utmp directory(G)\fR This parameter is only available if Samba has been configured and compiled with the option \fB --with-utmp\fR. It specifies a directory pathname that is used to store the utmp or utmpx files (depending on the UNIX system) that @@ -6973,7 +6951,7 @@ Default: \fBno utmp directory\fR Example: \fButmp directory = /var/run/utmp\fR .TP -\fBwtmp directory(G)\fR +\fB>wtmp directory(G)\fR This parameter is only available if Samba has been configured and compiled with the option \fB --with-utmp\fR. It specifies a directory pathname that is used to store the wtmp or wtmpx files (depending on the UNIX system) that @@ -6989,7 +6967,7 @@ Default: \fBno wtmp directory\fR Example: \fBwtmp directory = /var/log/wtmp\fR .TP -\fBvalid users (S)\fR +\fB>valid users (S)\fR This is a list of users that should be allowed to login to this service. Names starting with '@', '+' and '&' are interpreted using the same rules as described in the @@ -7010,7 +6988,7 @@ Default: \fBNo valid users list (anyone can login) Example: \fBvalid users = greg, @pcusers\fR .TP -\fBveto files(S)\fR +\fB>veto files(S)\fR This is a list of files and directories that are neither visible nor accessible. Each entry in the list must be separated by a '/', which allows spaces to be included @@ -7055,7 +7033,7 @@ veto files = /*Security*/*.tmp/*root*/ veto files = /.AppleDouble/.bin/.AppleDesktop/Network Trash Folder/ .fi .TP -\fBveto oplock files (S)\fR +\fB>veto oplock files (S)\fR This parameter is only valid when the \fIoplocks\fR parameter is turned on for a share. It allows the Samba administrator to selectively turn off the granting of oplocks on selected files that @@ -7077,7 +7055,7 @@ the particular NetBench share : Example: \fBveto oplock files = /*.SEM/ \fR .TP -\fBvfs path (S)\fR +\fB>vfs path (S)\fR This parameter specifies the directory to look in for vfs modules. The name of every \fBvfs object \fR will be prepended by this directory @@ -7086,7 +7064,7 @@ Default: \fBvfs path = \fR Example: \fBvfs path = /usr/lib/samba/vfs\fR .TP -\fBvfs object (S)\fR +\fB>vfs object (S)\fR This parameter specifies a shared object files that are used for Samba VFS I/O operations. By default, normal disk I/O operations are used but these can be overloaded @@ -7094,21 +7072,21 @@ with one or more VFS objects. Default : \fBno value\fR .TP -\fBvfs options (S)\fR +\fB>vfs options (S)\fR This parameter allows parameters to be passed to the vfs layer at initialization time. See also \fI vfs object\fR. Default : \fBno value\fR .TP -\fBvolume (S)\fR +\fB>volume (S)\fR This allows you to override the volume label returned for a share. Useful for CDROMs with installation programs that insist on a particular volume label. Default: \fBthe name of the share\fR .TP -\fBwide links (S)\fR +\fB>wide links (S)\fR This parameter controls whether or not links in the UNIX file system may be followed by the server. Links that point to areas within the directory tree exported by the @@ -7121,19 +7099,17 @@ that Samba has to do in order to perform the link checks. Default: \fBwide links = yes\fR .TP -\fBwinbind cache time (G)\fR -This parameter specifies the number of seconds the -winbindd(8) daemon will cache +\fB>winbind cache time (G)\fR +This parameter specifies the number of +seconds the \fBwinbindd\fR(8) daemon will cache user and group information before querying a Windows NT server again. Default: \fBwinbind cache type = 15\fR .TP -\fBwinbind enum users (G)\fR -On large installations using -winbindd(8) it may be -necessary to suppress the enumeration of users through the -\fB setpwent()\fR, +\fB>winbind enum users (G)\fR +On large installations using \fBwinbindd\fR(8) it may be +necessary to suppress the enumeration of users through the \fBsetpwent()\fR, \fBgetpwent()\fR and \fBendpwent()\fR group of system calls. If the \fIwinbind enum users\fR parameter is @@ -7148,11 +7124,9 @@ usernames. Default: \fBwinbind enum users = yes \fR .TP -\fBwinbind enum groups (G)\fR -On large installations using -winbindd(8) it may be -necessary to suppress the enumeration of groups through the -\fB setgrent()\fR, +\fB>winbind enum groups (G)\fR +On large installations using \fBwinbindd\fR(8) it may be necessary to suppress +the enumeration of groups through the \fBsetgrent()\fR, \fBgetgrent()\fR and \fBendgrent()\fR group of system calls. If the \fIwinbind enum groups\fR parameter is @@ -7164,9 +7138,9 @@ enumeration may cause some programs to behave oddly. Default: \fBwinbind enum groups = yes \fR .TP -\fBwinbind gid (G)\fR +\fB>winbind gid (G)\fR The winbind gid parameter specifies the range of group -ids that are allocated by the winbindd(8) daemon. This range of group ids should have no +ids that are allocated by the \fBwinbindd\fR(8) daemon. This range of group ids should have no existing local or NIS groups within it as strange conflicts can occur otherwise. @@ -7175,7 +7149,7 @@ Default: \fBwinbind gid = Example: \fBwinbind gid = 10000-20000\fR .TP -\fBwinbind separator (G)\fR +\fB>winbind separator (G)\fR This parameter allows an admin to define the character used when listing a username of the form of \fIDOMAIN \fR\\\fIuser\fR. This parameter @@ -7190,9 +7164,9 @@ Default: \fBwinbind separator = '\\'\fR Example: \fBwinbind separator = +\fR .TP -\fBwinbind uid (G)\fR +\fB>winbind uid (G)\fR The winbind gid parameter specifies the range of group -ids that are allocated by the winbindd(8) daemon. This range of ids should have no +ids that are allocated by the \fBwinbindd\fR(8) daemon. This range of ids should have no existing local or NIS users within it as strange conflicts can occur otherwise. @@ -7201,11 +7175,9 @@ Default: \fBwinbind uid = Example: \fBwinbind uid = 10000-20000\fR .TP -\fBwinbind use default domain\fR -.TP -\fBwinbind use default domain (G)\fR -This parameter specifies whether the winbindd(8) -daemon should operate on users without domain component in their username. +\fB>winbind use default domain (G)\fR +This parameter specifies whether the \fBwinbindd\fR(8) daemon should operate on users +without domain component in their username. Users without a domain component are treated as is part of the winbindd server's own domain. While this does not benifit Windows users, it makes SSH, FTP and e-mail function in a way much closer to the way they would in a native unix system. @@ -7215,7 +7187,7 @@ Default: \fBwinbind use default domain = Example: \fBwinbind use default domain = yes\fR .TP -\fBwins hook (G)\fR +\fB>wins hook (G)\fR When Samba is running as a WINS server this allows you to call an external program for all changes to the WINS database. The primary use for this option is to allow the @@ -7261,16 +7233,16 @@ An example script that calls the BIND dynamic DNS update program \fBnsupdate\fR is provided in the examples directory of the Samba source code. .TP -\fBwins proxy (G)\fR +\fB>wins proxy (G)\fR This is a boolean that controls if nmbd(8) will respond to broadcast name queries on behalf of other hosts. You may need to set this to yes for some older clients. Default: \fBwins proxy = no\fR .TP -\fBwins server (G)\fR +\fB>wins server (G)\fR This specifies the IP address (or DNS name: IP -address for preference) of the WINS server that nmbd(8) should register with. If you have a WINS server on +address for preference) of the WINS server that \fBnmbd\fR(8) should register with. If you have a WINS server on your network then you should set this to the WINS server's IP. You should point this at your WINS server if you have a @@ -7280,16 +7252,15 @@ multi-subnetted network. to a WINS server if you have multiple subnets and wish cross-subnet browsing to work correctly. -See the documentation file \fIBROWSING.txt\fR +See the documentation file BROWSING in the docs/ directory of your Samba source distribution. Default: \fBnot enabled\fR Example: \fBwins server = 192.9.200.1\fR .TP -\fBwins support (G)\fR -This boolean controls if the -nmbd(8) process in Samba will act as a WINS server. You should +\fB>wins support (G)\fR +This boolean controls if the \fBnmbd\fR(8) process in Samba will act as a WINS server. You should not set this to yes unless you have a multi-subnetted network and you wish a particular \fBnmbd\fR to be your WINS server. Note that you should \fBNEVER\fR set this to yes @@ -7297,7 +7268,7 @@ on more than one machine in your network. Default: \fBwins support = no\fR .TP -\fBworkgroup (G)\fR +\fB>workgroup (G)\fR This controls what workgroup your server will appear to be in when queried by clients. Note that this parameter also controls the Domain name used with the \fBsecurity = domain\fR @@ -7307,10 +7278,10 @@ Default: \fBset at compile time to WORKGROUP\fR Example: \fBworkgroup = MYGROUP\fR .TP -\fBwritable (S)\fR +\fB>writable (S)\fR Synonym for \fI writeable\fR for people who can't spell :-). .TP -\fBwrite cache size (S)\fR +\fB>write cache size (S)\fR If this integer parameter is set to non-zero value, Samba will create an in-memory cache for each oplocked file (it does \fBnot\fR do this for @@ -7336,7 +7307,7 @@ Example: \fBwrite cache size = 262144\fR for a 256k cache size per file. .TP -\fBwrite list (S)\fR +\fB>write list (S)\fR This is a list of users that are given read-write access to a service. If the connecting user is in this list then they will be given write access, no matter what the \fIread only\fR @@ -7355,7 +7326,7 @@ Default: \fBwrite list = Example: \fBwrite list = admin, root, @staff \fR .TP -\fBwins partners (G)\fR +\fB>wins partners (G)\fR A space separated list of partners' IP addresses for WINS replication. WINS partners are always defined as push/pull partners as defining only one way WINS replication is unreliable. @@ -7366,17 +7337,17 @@ Default: \fBwins partners = \fR Example: \fBwins partners = 192.168.0.1 172.16.1.2\fR .TP -\fBwrite ok (S)\fR +\fB>write ok (S)\fR Inverted synonym for \fI read only\fR. .TP -\fBwrite raw (G)\fR +\fB>write raw (G)\fR This parameter controls whether or not the server will support raw write SMB's when transferring data from clients. You should never need to change this parameter. Default: \fBwrite raw = yes\fR .TP -\fBwriteable (S)\fR +\fB>writeable (S)\fR Inverted synonym for \fI read only\fR. .SH "WARNINGS" .PP @@ -7386,8 +7357,7 @@ be ignored in comparisons anyway, so it shouldn't be a problem - but be aware of the possibility. .PP On a similar note, many clients - especially DOS clients - -limit service names to eight characters. smbd(8) - has no such limitation, but attempts to connect from such +limit service names to eight characters. \fBsmbd\fR(8) has no such limitation, but attempts to connect from such clients will fail if they truncate the service names. For this reason you should probably keep your service names down to eight characters in length. @@ -7399,19 +7369,10 @@ sections. In particular, ensure that the permissions on spool directories are correct. .SH "VERSION" .PP -This man page is correct for version 3.0 of -the Samba suite. +This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -samba(7) -\fBsmbpasswd(8)\fR -\fBswat(8)\fR -\fBsmbd(8)\fR -\fBnmbd(8)\fR -\fBsmbclient(1)\fR -\fBnmblookup(1)\fR -\fBtestparm(1)\fR -\fBtestprns(1)\fR +\fBsamba\fR(7), \fBsmbpasswd\fR(8), \fBswat\fR(8), \fBsmbd\fR(8), \fBnmbd\fR(8), \fBsmbclient\fR(1), \fBnmblookup\fR(1), \fBtestparm\fR(1), \fBtestprns\fR(1). .SH "AUTHOR" .PP The original Samba software and related utilities @@ -7421,7 +7382,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbcacls.1 b/docs/manpages/smbcacls.1 index 47be19d3d9..9840dab50b 100644 --- a/docs/manpages/smbcacls.1 +++ b/docs/manpages/smbcacls.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBCACLS" "1" "05 November 2002" "" "" +.TH "SMBCACLS" "1" "28 January 2003" "" "" + .SH NAME smbcacls \- Set or get ACLs on an NT file or directory names .SH SYNOPSIS @@ -12,7 +13,7 @@ smbcacls \- Set or get ACLs on an NT file or directory names .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP The \fBsmbcacls\fR program manipulates NT Access Control Lists (ACLs) on SMB file shares. @@ -45,7 +46,7 @@ type, owner and group for the call to succeed. Specifies a username used to connect to the specified service. The username may be of the form "username" in which case the user is prompted to enter in a password and the -workgroup specified in the \fIsmb.conf\fR file is +workgroup specified in the \fBsmb.conf\fR(5) file is used, or "username%password" or "DOMAIN\\username%password" and the password and workgroup names are used as provided. .TP @@ -85,7 +86,6 @@ REVISION: OWNER: GROUP: ACL::// - .fi .PP The revision of the ACL specifies the internal Windows @@ -116,7 +116,7 @@ common flags are: #define SEC_ACE_FLAG_CONTAINER_INHERIT 0x2 .TP 0.2i \(bu -#define SEC_ACE_FLAG_NO_PROPAGATE_INHERIT 0x4 +#define SEC_ACE_FLAG_NO_PROPAGATE_INHERIT 0x4 .TP 0.2i \(bu #define SEC_ACE_FLAG_INHERIT_ONLY 0x8 @@ -172,8 +172,7 @@ of 1 is returned. If there was an error parsing any command line arguments, an exit status of 2 is returned. .SH "VERSION" .PP -This man page is correct for version 2.2 of -the Samba suite. +This man page is correct for version 2.2 of the Samba suite. .SH "AUTHOR" .PP The original Samba software and related utilities @@ -185,4 +184,5 @@ to the way the Linux kernel is developed. and Tim Potter. .PP The conversion to DocBook for Samba 2.2 was done -by Gerald Carter +by Gerald Carter. The conversion to DocBook XML 4.2 for Samba 3.0 was done +by Alexander Bokovoy. diff --git a/docs/manpages/smbclient.1 b/docs/manpages/smbclient.1 index 0c33475048..6299ff9362 100644 --- a/docs/manpages/smbclient.1 +++ b/docs/manpages/smbclient.1 @@ -3,20 +3,21 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBCLIENT" "1" "05 November 2002" "" "" +.TH "SMBCLIENT" "1" "18 February 2003" "" "" + .SH NAME smbclient \- ftp-like client to access SMB/CIFS resources on servers .SH SYNOPSIS -\fBsmbclient\fR \fBservicename\fR [ \fBpassword\fR ] [ \fB-b \fR ] [ \fB-d debuglevel\fR ] [ \fB-D Directory\fR ] [ \fB-U username\fR ] [ \fB-W workgroup\fR ] [ \fB-M \fR ] [ \fB-m maxprotocol\fR ] [ \fB-A authfile\fR ] [ \fB-N\fR ] [ \fB-l logfile\fR ] [ \fB-L \fR ] [ \fB-I destinationIP\fR ] [ \fB-E\fR ] [ \fB-c \fR ] [ \fB-i scope\fR ] [ \fB-O \fR ] [ \fB-p port\fR ] [ \fB-R \fR ] [ \fB-s \fR ] [ \fB-TIXFqgbNan\fR ] +\fBsmbclient\fR \fBservicename\fR [ \fBpassword\fR ] [ \fB-b \fR ] [ \fB-d debuglevel\fR ] [ \fB-D Directory\fR ] [ \fB-U username\fR ] [ \fB-W workgroup\fR ] [ \fB-M \fR ] [ \fB-m maxprotocol\fR ] [ \fB-A authfile\fR ] [ \fB-N\fR ] [ \fB-l logfile\fR ] [ \fB-L \fR ] [ \fB-I destinationIP\fR ] [ \fB-E\fR ] [ \fB-c \fR ] [ \fB-i scope\fR ] [ \fB-O \fR ] [ \fB-p port\fR ] [ \fB-R \fR ] [ \fB-s \fR ] [ \fB-TIXFqgbNan\fR ] [ \fB-k\fR ] .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBsmbclient\fR is a client that can \&'talk' to an SMB/CIFS server. It offers an interface -similar to that of the ftp program (see \fBftp(1)\fR). +similar to that of the ftp program (see \fBftp\fR(1)). Operations include things like getting files from the server to the local machine, putting files from the local machine to the server, retrieving directory information from the server @@ -41,7 +42,8 @@ same as the IP hostname of the machine running the server. The server name is looked up according to either the \fI-R\fR parameter to \fBsmbclient\fR or -using the name resolve order parameter in the \fIsmb.conf\fR file, +using the name resolve order parameter in +the \fBsmb.conf\fR(5) file, allowing an administrator to change the order and methods by which server names are looked up. .TP @@ -66,12 +68,13 @@ or mixed case passwords may be rejected by these servers. Be cautious about including passwords in scripts. .TP \fB-s smb.conf\fR -Specifies the location of the all important -\fIsmb.conf\fR file. +Specifies the location of the all +important \fBsmb.conf\fR(5) file. .TP \fB-O socket options\fR TCP socket options to set on the client -socket. See the socket options parameter in the \fI smb.conf (5)\fR manpage for the list of valid +socket. See the socket options parameter in +the \fBsmb.conf\fR(5) manual page for the list of valid options. .TP \fB-R \fR @@ -81,17 +84,18 @@ host names to IP addresses. The option takes a space-separated string of different name resolution options. The options are :"lmhosts", "host", "wins" and "bcast". They -cause names to be resolved as follows : +cause names to be resolved as follows: .RS .TP 0.2i \(bu -lmhosts : Lookup an IP +lmhosts: Lookup an IP address in the Samba lmhosts file. If the line in lmhosts has -no name type attached to the NetBIOS name (see the lmhosts(5) for details) then +no name type attached to the NetBIOS name (see +the \fBlmhosts\fR(5) for details) then any name type matches for lookup. .TP 0.2i \(bu -host : Do a standard host +host: Do a standard host name to IP address resolution, using the system \fI/etc/hosts \fR, NIS, or DNS lookups. This method of name resolution is operating system dependent, for instance on IRIX or Solaris this @@ -101,13 +105,13 @@ type being queried is the 0x20 (server) name type, otherwise it is ignored. .TP 0.2i \(bu -wins : Query a name with +wins: Query a name with the IP address listed in the \fIwins server\fR parameter. If no WINS server has been specified this method will be ignored. .TP 0.2i \(bu -bcast : Do a broadcast on +bcast: Do a broadcast on each of the known local interfaces listed in the \fIinterfaces\fR parameter. This is the least reliable of the name resolution @@ -116,12 +120,12 @@ connected subnet. .RE If this parameter is not set then the name resolve order -defined in the \fIsmb.conf\fR file parameter +defined in the \fBsmb.conf\fR(5) file parameter (name resolve order) will be used. The default order is lmhosts, host, wins, bcast and without this parameter or any entry in the \fIname resolve order -\fR parameter of the \fIsmb.conf\fR file the name resolution +\fR parameter of the \fBsmb.conf\fR(5) file the name resolution methods will be attempted in this order. .TP \fB-M NetBIOS name\fR @@ -147,7 +151,7 @@ You may also find the \fI-U\fR and \fI-I\fR options useful, as they allow you to control the FROM and TO parts of the message. -See the message command parameter in the \fI smb.conf(5)\fR for a description of how to handle incoming +See the \fImessage command\fR parameter in the \fBsmb.conf\fR(5) for a description of how to handle incoming WinPopup messages in Samba. \fBNote\fR: Copy WinPopup into the startup group @@ -291,7 +295,6 @@ password used in the connection. The format of the file is username = password = domain = - .fi If the domain parameter is missing the current workgroup name @@ -327,9 +330,8 @@ observed to speed up file transfers to and from a Win9x server. .TP \fB-W WORKGROUP\fR Override the default workgroup (domain) specified -in the workgroup parameter of the \fIsmb.conf\fR -file for this connection. This may be needed to connect to some -servers. +in the workgroup parameter of the \fBsmb.conf\fR(5) file for this connection. This may be +needed to connect to some servers. .TP \fB-T tar options\fR smbclient may be used to create \fBtar(1) @@ -413,7 +415,7 @@ files in the archive with relative names, not absolute names. \fBTar Filenames\fR -All file names can be given as DOS path names (with '\\' +All file names can be given as DOS path names (with '\\\\' as the component separator) or as UNIX path names (with '/' as the component separator). @@ -457,6 +459,10 @@ commands to be executed instead of prompting from stdin. \fI -N\fR is implied b This is particularly useful in scripts and for printing stdin to the server, e.g. \fB-c 'print -'\fR. +.TP +\fB-k\fR +Try to authenticate with kerberos. Only useful in +an Active Directory environment. .SH "OPERATIONS" .PP Once the client is running, the user is presented with @@ -464,7 +470,7 @@ a prompt : .PP smb:\\> .PP -The backslash ("\\") indicates the current working directory +The backslash ("\\\\") indicates the current working directory on the server, and will change if the current working directory is changed. .PP @@ -766,8 +772,7 @@ The client log files should be put in a directory readable and writeable only by the user. .PP To test the client, you will need to know the name of a -running SMB/CIFS server. It is possible to run \fBsmbd(8) -\fR as an ordinary user - running that server as a daemon +running SMB/CIFS server. It is possible to run \fBsmbd\fR(8) as an ordinary user - running that server as a daemon on a user-accessible port (typically any port number over 1024) would provide a suitable test server. .SH "DIAGNOSTICS" @@ -781,8 +786,7 @@ on the debug level used by the client. If you have problems, set the debug level to 3 and peruse the log files. .SH "VERSION" .PP -This man page is correct for version 2.2 of -the Samba suite. +This man page is correct for version 2.2 of the Samba suite. .SH "AUTHOR" .PP The original Samba software and related utilities @@ -792,7 +796,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 for Samba 3.0 +was done by Alexander Bokovoy. diff --git a/docs/manpages/smbcontrol.1 b/docs/manpages/smbcontrol.1 index f78c4b96d4..80fee0a838 100644 --- a/docs/manpages/smbcontrol.1 +++ b/docs/manpages/smbcontrol.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBCONTROL" "1" "05 November 2002" "" "" +.TH "SMBCONTROL" "1" "28 January 2003" "" "" + .SH NAME smbcontrol \- send messages to smbd, nmbd or winbindd processes .SH SYNOPSIS @@ -15,13 +16,10 @@ smbcontrol \- send messages to smbd, nmbd or winbindd processes .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBsmbcontrol\fR is a very small program, which -sends messages to an smbd(8) -an nmbd(8) -or a winbindd(8) -daemon running on the system. +sends messages to a \fBsmbd\fR(8), a \fBnmbd\fR(8), or a \fBwinbindd\fR(8) daemon running on the system. .SH "OPTIONS" .TP \fB-i\fR @@ -31,8 +29,7 @@ on STDIN. An empty command line or a "q" will quit the program. .TP \fBdestination\fR -One of \fInmbd\fR -\fIsmbd\fR or a process ID. +One of \fInmbd\fR, \fIsmbd\fR or a process ID. The \fIsmbd\fR destination causes the message to "broadcast" to all smbd daemons. @@ -134,8 +131,7 @@ This man page is correct for version 2.2 of the Samba suite. .SH "SEE ALSO" .PP -\fBnmbd(8)\fR -and \fBsmbd(8)\fR +\fBnmbd\fR(8) and \fBsmbd\fR(8). .SH "AUTHOR" .PP The original Samba software and related utilities @@ -145,7 +141,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 for +Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbd.8 b/docs/manpages/smbd.8 index 3e0f1d83cc..47bc476aac 100644 --- a/docs/manpages/smbd.8 +++ b/docs/manpages/smbd.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBD" "8" "15 January 2003" "" "" +.TH "SMBD" "8" "28 January 2003" "" "" + .SH NAME smbd \- server to provide SMB/CIFS services to clients .SH SYNOPSIS @@ -12,7 +13,7 @@ smbd \- server to provide SMB/CIFS services to clients .SH "DESCRIPTION" .PP -This program is part of the Samba suite. +This program is part of the \fBSamba\fR(7) suite. .PP \fBsmbd\fR is the server daemon that provides filesharing and printing services to Windows clients. @@ -26,14 +27,12 @@ OS/2, DAVE for Macintosh, and smbfs for Linux. An extensive description of the services that the server can provide is given in the man page for the configuration file controlling the attributes of those -services (see \fIsmb.conf(5) -\fR This man page will not describe the +services (see \fBsmb.conf\fR(5). This man page will not describe the services, but will concentrate on the administrative aspects of running the server. .PP Please note that there are significant security -implications to running this server, and the \fIsmb.conf(5)\fR -manpage should be regarded as mandatory reading before +implications to running this server, and the \fBsmb.conf\fR(5) manual page should be regarded as mandatory reading before proceeding with installation. .PP A session is created whenever a client requests one. @@ -117,8 +116,8 @@ use only by developers and generate HUGE amounts of log data, most of which is extremely cryptic. Note that specifying this parameter here will -override the log -level file. +override the \fIlog +level\fR parameter in the \fBsmb.conf\fR(5) file. .TP \fB-l \fR If specified, @@ -127,8 +126,8 @@ specifies a log directory into which the "log.smbd" log file will be created for informational and debug messages from the running server. The log file generated is never removed by the server although -its size may be controlled by the max log size -option in the \fI smb.conf(5)\fR file. \fBBeware:\fR +its size may be controlled by the \fImax log size\fR +option in the \fBsmb.conf\fR(5) file. \fBBeware:\fR If the directory specified does not exist, \fBsmbd\fR will log to the default debug log location defined at compile time. @@ -136,9 +135,8 @@ The default log directory is specified at compile time. .TP \fB-O \fR -See the socket options -parameter in the \fIsmb.conf(5) -\fR file for details. +See the \fIsocket options\fR +parameter in the \fBsmb.conf\fR(5) file for details. .TP \fB-p \fR \fIport number\fR is a positive integer @@ -169,7 +167,7 @@ configuration details required by the server. The information in this file includes server-specific information such as what printcap file to use, as well as descriptions of all the services that the server is -to provide. See \fI smb.conf(5)\fR for more information. +to provide. See \fBsmb.conf\fR(5) for more information. The default configuration file name is determined at compile time. .SH "FILES" @@ -178,7 +176,7 @@ compile time. If the server is to be run by the \fBinetd\fR meta-daemon, this file must contain suitable startup information for the -meta-daemon. See the UNIX_INSTALL.html +meta-daemon. See the "How to Install and Test SAMBA" document for details. .TP \fB\fI/etc/rc\fB\fR @@ -187,7 +185,7 @@ system uses). If running the server as a daemon at startup, this file will need to contain an appropriate startup -sequence for the server. See the UNIX_INSTALL.html +sequence for the server. See the "How to Install and Test SAMBA" document for details. .TP \fB\fI/etc/services\fB\fR @@ -195,18 +193,16 @@ If running the server via the meta-daemon \fBinetd\fR, this file must contain a mapping of service name (e.g., netbios-ssn) to service port (e.g., 139) and protocol type (e.g., tcp). -See the UNIX_INSTALL.html +See the "How to Install and Test SAMBA" document for details. .TP \fB\fI/usr/local/samba/lib/smb.conf\fB\fR -This is the default location of the -\fIsmb.conf\fR -server configuration file. Other common places that systems +This is the default location of the \fBsmb.conf\fR(5) server configuration file. Other common places that systems install this file are \fI/usr/samba/lib/smb.conf\fR -and \fI/etc/smb.conf\fR. +and \fI/etc/samba/smb.conf\fR. This file describes all the services the server -is to make available to clients. See \fIsmb.conf(5)\fR for more information. +is to make available to clients. See \fBsmb.conf\fR(5) for more information. .SH "LIMITATIONS" .PP On some systems \fBsmbd\fR cannot change uid back @@ -229,9 +225,8 @@ is not specific to the server, however. Samba uses PAM for authentication (when presented with a plaintext password), for account checking (is this account disabled?) and for session management. The degree too which samba supports PAM is restricted -by the limitations of the SMB protocol and the -obey pam restricions -smb.conf paramater. When this is set, the following restrictions apply: +by the limitations of the SMB protocol and the \fIobey +pam restricions\fR \fBsmb.conf\fR(5) paramater. When this is set, the following restrictions apply: .TP 0.2i \(bu \fBAccount Validation\fR: All accesses to a @@ -279,9 +274,8 @@ an \fBsmbd\fR is to send it a SIGTERM (-15) signal and wait for it to die on its own. .PP The debug log level of \fBsmbd\fR may be raised -or lowered using \fBsmbcontrol(1) -\fR program (SIGUSR[1|2] signals are no longer used in -Samba 2.2). This is to allow transient problems to be diagnosed, +or lowered using \fBsmbcontrol\fR(1) program (SIGUSR[1|2] signals are no longer +used since Samba 2.2). This is to allow transient problems to be diagnosed, whilst still running at a normally low log level. .PP Note that as the signal handlers send a debug write, @@ -292,12 +286,8 @@ by un-blocking the signals before the select call and re-blocking them after, however this would affect performance. .SH "SEE ALSO" .PP -hosts_access(5), \fBinetd(8)\fR, -\fBnmbd(8)\fR -\fIsmb.conf(5)\fR - \fBsmbclient(1) -\fR and the Internet RFC's -\fIrfc1001.txt\fR, \fIrfc1002.txt\fR. +\fBhosts_access\fR(5), \fBinetd\fR(8), \fBnmbd\fR(8), \fBsmb.conf\fR(5), \fBsmbclient\fR(1), \fBtestparm\fR(1), \fBtestprns\fR(1), and the +Internet RFC's \fIrfc1001.txt\fR, \fIrfc1002.txt\fR. In addition the CIFS (formerly SMB) specification is available as a link from the Web page http://samba.org/cifs/ . @@ -310,7 +300,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 for +Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbgroupedit.8 b/docs/manpages/smbgroupedit.8 index b514b99793..f016044634 100644 --- a/docs/manpages/smbgroupedit.8 +++ b/docs/manpages/smbgroupedit.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBGROUPEDIT" "8" "03 January 2003" "" "" +.TH "SMBGROUPEDIT" "8" "28 January 2003" "" "" + .SH NAME smbgroupedit \- Query/set/change UNIX - Windows NT group mapping .SH SYNOPSIS @@ -12,8 +13,7 @@ smbgroupedit \- Query/set/change UNIX - Windows NT group mapping .SH "DESCRIPTION" .PP -This program is part of the Samba -suite. +This program is part of the \fBSamba\fR(7) suite. .PP The smbgroupedit command allows for mapping unix groups to NT Builtin, Domain, or Local groups. Also @@ -39,8 +39,7 @@ give a long listing, of the format: Privilege : .fi -For examples, - +For example: .nf Users @@ -59,8 +58,7 @@ display a short listing of the format: NTGroupName(SID) -> UnixGroupName .fi -For example, - +For example: .nf Users (S-1-5-32-545) -> -1 @@ -94,8 +92,7 @@ map this domadm group to the 'domain admins' group: .RS .TP 3 1. -Get the SID for the Windows NT "Domain Admins" -group: +Get the SID for the Windows NT "Domain Admins" group: .nf @@ -107,7 +104,6 @@ Domain Admins (S-1-5-21-1108995562-3116817432-1375597819-512) -> -1 map the unix domadm group to the Windows NT "Domain Admins" group, by running the command: - .nf root# \fBsmbgroupedit \\ -c S-1-5-21-1108995562-3116817432-1375597819-512 \\ @@ -119,7 +115,6 @@ Domain Admins SID (the S-1-5-21-...-512) is different for every PDC. .RE .PP To verify that your mapping has taken effect: -.PP .nf root# \fBsmbgroupedit -vs|grep "Domain Admins"\fR @@ -129,7 +124,6 @@ Domain Admins (S-1-5-21-1108995562-3116817432-1375597819-512) -> domadm To give access to a certain directory on a domain member machine (an NT/W2K or a samba server running winbind) to some users who are member of a group on your samba PDC, flag that group as a domain group: -.PP .nf root# \fBsmbgroupedit -a unixgroup -td\fR @@ -140,7 +134,7 @@ This man page is correct for the 3.0alpha releases of the Samba suite. .SH "SEE ALSO" .PP -smb.conf(5) +\fBsmb.conf\fR(5) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -150,4 +144,5 @@ to the way the Linux kernel is developed. .PP \fBsmbgroupedit\fR was written by Jean Francois Micouleau. The current set of manpages and documentation is maintained -by the Samba Team in the same fashion as the Samba source code. +by the Samba Team in the same fashion as the Samba source code. The conversion +to DocBook XML 4.2 for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbmnt.8 b/docs/manpages/smbmnt.8 index 6f7d79ea5d..63425850c9 100644 --- a/docs/manpages/smbmnt.8 +++ b/docs/manpages/smbmnt.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBMNT" "8" "05 November 2002" "" "" +.TH "SMBMNT" "8" "28 January 2003" "" "" + .SH NAME smbmnt \- helper utility for mounting SMB filesystems .SH SYNOPSIS @@ -21,8 +22,7 @@ A setuid smbmnt will only allow mounts on directories owned by the user, and that the user has write permission on. .PP The \fBsmbmnt\fR program is normally invoked -by \fBsmbmount(8)\fR - It should not be invoked directly by users. +by \fBsmbmount\fR(8). It should not be invoked directly by users. .PP smbmount searches the normal PATH for smbmnt. You must ensure that the smbmnt version in your path matches the smbmount used. @@ -61,4 +61,5 @@ The SAMBA Mailing list is the preferred place to ask questions regarding these programs. .PP The conversion of this manpage for Samba 2.2 was performed -by Gerald Carter +by Gerald Carter. The conversion to DocBook XML 4.2 for Samba 3.0 +was done by Alexander Bokovoy. diff --git a/docs/manpages/smbmount.8 b/docs/manpages/smbmount.8 index 525a10be7f..1b504e08b9 100644 --- a/docs/manpages/smbmount.8 +++ b/docs/manpages/smbmount.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBMOUNT" "8" "05 November 2002" "" "" +.TH "SMBMOUNT" "8" "28 January 2003" "" "" + .SH NAME smbmount \- mount an smbfs filesystem .SH SYNOPSIS @@ -14,7 +15,7 @@ smbmount \- mount an smbfs filesystem .PP \fBsmbmount\fR mounts a Linux SMB filesystem. It is usually invoked as \fBmount.smbfs\fR by -the \fBmount(8)\fR command when using the +the \fBmount\fR(8) command when using the "-t smbfs" option. This command only works in Linux, and the kernel must support the smbfs filesystem. .PP @@ -27,11 +28,10 @@ unknown options. \fBsmbmount\fR is a daemon. After mounting it keeps running until the mounted smbfs is umounted. It will log things that happen when in daemon mode using the "machine name" smbmount, so -typically this output will end up in \fIlog.smbmount\fR. The -\fBsmbmount\fR process may also be called mount.smbfs. +typically this output will end up in \fIlog.smbmount\fR. The \fB smbmount\fR process may also be called mount.smbfs. .PP \fBNOTE:\fR \fBsmbmount\fR -calls \fBsmbmnt(8)\fR to do the actual mount. You +calls \fBsmbmnt\fR(8) to do the actual mount. You must make sure that \fBsmbmnt\fR is in the path so that it can be found. .SH "OPTIONS" @@ -58,14 +58,12 @@ in the PASSWD environment variable or a credentials file (see below) will be read correctly. .TP \fBcredentials=\fR -specifies a file that contains a username -and/or password. The format of the file is: - +specifies a file that contains a username and/or password. +The format of the file is: .nf - username = - password = - +username = +password = .fi This is preferred over having passwords in plaintext in a @@ -114,8 +112,7 @@ sets the destination host or IP address. sets the workgroup on the destination .TP \fBsockopt=\fR -sets the TCP socket options. See the \fIsmb.conf -\fR \fIsocket options\fR option. +sets the TCP socket options. See the \fBsmb.conf\fR(5) \fIsocket options\fR option. .TP \fBscope=\fR sets the NetBIOS scope @@ -196,10 +193,8 @@ source tree may contain additional options and information. .PP FreeBSD also has a smbfs, but it is not related to smbmount .PP -For Solaris, HP-UX and others you may want to look at -\fBsmbsh(1)\fR or at other -solutions, such as sharity or perhaps replacing the SMB server with -a NFS server. +For Solaris, HP-UX and others you may want to look at \fBsmbsh\fR(1) or at other solutions, such as +Sharity or perhaps replacing the SMB server with a NFS server. .SH "AUTHOR" .PP Volker Lendecke, Andrew Tridgell, Michael H. Warfield @@ -212,4 +207,5 @@ The SAMBA Mailing list is the preferred place to ask questions regarding these programs. .PP The conversion of this manpage for Samba 2.2 was performed -by Gerald Carter +by Gerald Carter. The conversion to DocBook XML 4.2 for Samba 3.0 +was done by Alexander Bokovoy. diff --git a/docs/manpages/smbpasswd.5 b/docs/manpages/smbpasswd.5 index 907e388bee..46527236d9 100644 --- a/docs/manpages/smbpasswd.5 +++ b/docs/manpages/smbpasswd.5 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBPASSWD" "5" "05 November 2002" "" "" +.TH "SMBPASSWD" "5" "28 January 2003" "" "" + .SH NAME smbpasswd \- The Samba encrypted password file .SH SYNOPSIS @@ -11,7 +12,7 @@ smbpasswd \- The Samba encrypted password file \fIsmbpasswd\fR .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP smbpasswd is the Samba encrypted password file. It contains the username, Unix user id and the SMB hashed passwords of the @@ -95,7 +96,7 @@ This section contains flags that describe the attributes of the users account. In the Samba 2.2 release this field is bracketed by '[' and ']' characters and is always 13 characters in length (including the '[' and ']' characters). -The contents of this field may be any of the characters. +The contents of this field may be any of the following characters: .RS .TP 0.2i \(bu @@ -108,13 +109,11 @@ in the smbpasswd file. \fBN\fR - This means the account has no password (the passwords in the fields LANMAN Password Hash and NT Password Hash are ignored). Note that this -will only allow users to log on with no password if the \fI null passwords\fR parameter is set in the \fIsmb.conf(5) -\fR config file. +will only allow users to log on with no password if the \fI null passwords\fR parameter is set in the \fBsmb.conf\fR(5) config file. .TP 0.2i \(bu \fBD\fR - This means the account -is disabled and no SMB/CIFS logins will be allowed for -this user. +is disabled and no SMB/CIFS logins will be allowed for this user. .TP 0.2i \(bu \fBW\fR - This means this account @@ -139,8 +138,7 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBsmbpasswd(8)\fR -samba(7) and +\fBsmbpasswd\fR(8), \fBSamba\fR(7), and the Internet RFC1321 for details on the MD4 algorithm. .SH "AUTHOR" .PP @@ -151,7 +149,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbpasswd.8 b/docs/manpages/smbpasswd.8 index ad933517be..b2821a8e01 100644 --- a/docs/manpages/smbpasswd.8 +++ b/docs/manpages/smbpasswd.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBPASSWD" "8" "26 November 2002" "" "" +.TH "SMBPASSWD" "8" "28 January 2003" "" "" + .SH NAME smbpasswd \- change a user's SMB password .SH SYNOPSIS @@ -12,24 +13,23 @@ smbpasswd \- change a user's SMB password .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP The smbpasswd program has several different -functions, depending on whether it is run by the \fBroot\fR -user or not. When run as a normal user it allows the user to change +functions, depending on whether it is run by the \fBroot\fR user +or not. When run as a normal user it allows the user to change the password used for their SMB sessions on any machines that store SMB passwords. .PP By default (when run with no arguments) it will attempt to change the current user's SMB password on the local machine. This is -similar to the way the \fBpasswd(1)\fR program works. -\fBsmbpasswd\fR differs from how the passwd program works +similar to the way the \fBpasswd(1)\fR program works. \fB smbpasswd\fR differs from how the passwd program works however in that it is not \fBsetuid root\fR but works in -a client-server mode and communicates with a locally running -\fBsmbd(8)\fR. As a consequence in order for this to +a client-server mode and communicates with a +locally running \fBsmbd\fR(8). As a consequence in order for this to succeed the smbd daemon must be running on the local machine. On a UNIX machine the encrypted SMB passwords are usually stored in -the \fIsmbpasswd(5)\fR file. +the \fBsmbpasswd\fR(5) file. .PP When run by an ordinary user with no options, smbpasswd will prompt them for their old SMB password and then ask them @@ -41,12 +41,12 @@ the key when asked for your old password. .PP smbpasswd can also be used by a normal user to change their SMB password on remote machines, such as Windows NT Primary Domain -Controllers. See the (-r) and -U options below. +Controllers. See the (\fI-r\fR) and \fI-U\fR options +below. .PP When run by root, smbpasswd allows new users to be added and deleted in the smbpasswd file, as well as allows changes to -the attributes of the user in this file to be made. When run by root, -\fBsmbpasswd\fR accesses the local smbpasswd file +the attributes of the user in this file to be made. When run by root, \fB smbpasswd\fR accesses the local smbpasswd file directly, thus enabling changes to be made even if smbd is not running. .SH "OPTIONS" @@ -82,8 +82,7 @@ will fail. If the smbpasswd file is in the 'old' format (pre-Samba 2.0 format) there is no space in the user's password entry to write -this information and the command will FAIL. See \fBsmbpasswd(5) -\fR for details on the 'old' and new password file formats. +this information and the command will FAIL. See \fBsmbpasswd\fR(5) for details on the 'old' and new password file formats. This option is only available when running smbpasswd as root. @@ -96,7 +95,7 @@ disabled this option has no effect. Once the account is enabled then the user will be able to authenticate via SMB once again. If the smbpasswd file is in the 'old' format, then \fB smbpasswd\fR will FAIL to enable the account. -See \fBsmbpasswd (5)\fR for +See \fBsmbpasswd\fR(5) for details on the 'old' and new password file formats. This option is only available when running smbpasswd as root. @@ -164,17 +163,17 @@ what name resolution services to use when looking up the NetBIOS name of the host being connected to. The options are :"lmhosts", "host", "wins" and "bcast". They -cause names to be resolved as follows : +cause names to be resolved as follows: .RS .TP 0.2i \(bu -lmhosts : Lookup an IP +lmhosts: Lookup an IP address in the Samba lmhosts file. If the line in lmhosts has -no name type attached to the NetBIOS name (see the lmhosts(5) for details) then +no name type attached to the NetBIOS name (see the \fBlmhosts\fR(5) for details) then any name type matches for lookup. .TP 0.2i \(bu -host : Do a standard host +host: Do a standard host name to IP address resolution, using the system \fI/etc/hosts \fR, NIS, or DNS lookups. This method of name resolution is operating system depended for instance on IRIX or Solaris this @@ -184,13 +183,13 @@ type being queried is the 0x20 (server) name type, otherwise it is ignored. .TP 0.2i \(bu -wins : Query a name with +wins: Query a name with the IP address listed in the \fIwins server\fR parameter. If no WINS server has been specified this method will be ignored. .TP 0.2i \(bu -bcast : Do a broadcast on +bcast: Do a broadcast on each of the known local interfaces listed in the \fIinterfaces\fR parameter. This is the least reliable of the name resolution methods as it depends on the @@ -198,8 +197,7 @@ target host being on a locally connected subnet. .RE The default order is \fBlmhosts, host, wins, bcast\fR -and without this parameter or any entry in the -\fIsmb.conf\fR file the name resolution methods will +and without this parameter or any entry in the \fBsmb.conf\fR(5) file the name resolution methods will be attempted in this order. .TP \fB-m\fR @@ -235,7 +233,7 @@ has been configured to use the experimental switch is used to specify the password to be used with the \fIldap admin dn\fR Note that the password is stored in -the \fIprivate/secrets.tdb\fR and is keyed off +the \fIsecrets.tdb\fR and is keyed off of the admin's DN. This means that if the value of \fIldap admin dn\fR ever changes, the password will need to be manually updated as well. @@ -261,23 +259,20 @@ to modify attributes directly in the local smbpasswd file. Since \fBsmbpasswd\fR works in client-server mode communicating with a local smbd for a non-root user then the smbd daemon must be running for this to work. A common problem -is to add a restriction to the hosts that may access the \fB smbd\fR running on the local machine by specifying a -\fIallow hosts\fR or \fIdeny hosts\fR -entry in the \fIsmb.conf\fR file and neglecting to +is to add a restriction to the hosts that may access the \fB smbd\fR running on the local machine by specifying either \fIallow +hosts\fR or \fIdeny hosts\fR entry in +the \fBsmb.conf\fR(5) file and neglecting to allow "localhost" access to the smbd. .PP In addition, the smbpasswd command is only useful if Samba -has been set up to use encrypted passwords. See the file -\fIENCRYPTION.txt\fR in the docs directory for details +has been set up to use encrypted passwords. See the document "LanMan and NT Password Encryption in Samba" in the docs directory for details on how to do this. .SH "VERSION" .PP -This man page is correct for version 3.0 of -the Samba suite. +This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fIsmbpasswd(5)\fR -samba(7) +\fBsmbpasswd\fR(5), \fBSamba\fR(7). .SH "AUTHOR" .PP The original Samba software and related utilities @@ -287,7 +282,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbsh.1 b/docs/manpages/smbsh.1 index e9c1add9e9..463a456616 100644 --- a/docs/manpages/smbsh.1 +++ b/docs/manpages/smbsh.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBSH" "1" "26 November 2002" "" "" +.TH "SMBSH" "1" "28 January 2003" "" "" + .SH NAME smbsh \- Allows access to Windows NT filesystem using UNIX commands .SH SYNOPSIS @@ -12,7 +13,7 @@ smbsh \- Allows access to Windows NT filesystem using UNIX commands .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBsmbsh\fR allows you to access an NT filesystem using UNIX commands such as \fBls\fR, \fB egrep\fR, and \fBrcp\fR. You must use a @@ -22,7 +23,7 @@ to work correctly. .TP \fB-W WORKGROUP\fR Override the default workgroup specified in the -workgroup parameter of the \fIsmb.conf\fR file +workgroup parameter of the \fBsmb.conf\fR(5) file for this session. This may be needed to connect to some servers. .TP @@ -44,20 +45,20 @@ services and in what order to resolve host names to IP addresses. The option takes a space-separated string of different name resolution options. -The options are :"lmhosts", "host", "wins" and "bcast". +The options are: "lmhosts", "host", "wins" and "bcast". They cause names to be resolved as follows : .RS .TP 0.2i \(bu -lmhosts : +lmhosts: Lookup an IP address in the Samba lmhosts file. If the line in lmhosts has no name type attached to the NetBIOS name -(see the lmhosts(5) -for details) then any name type matches for lookup. +(see the \fBlmhosts\fR(5) for details) +then any name type matches for lookup. .TP 0.2i \(bu -host : +host: Do a standard host name to IP address resolution, using the system \fI/etc/hosts\fR, NIS, or DNS lookups. This method of name resolution is operating @@ -68,14 +69,14 @@ if the NetBIOS name type being queried is the 0x20 (server) name type, otherwise it is ignored. .TP 0.2i \(bu -wins : +wins: Query a name with the IP address listed in the \fIwins server\fR parameter. If no WINS server has been specified this method will be ignored. .TP 0.2i \(bu -bcast : +bcast: Do a broadcast on each of the known local interfaces listed in the \fIinterfaces\fR parameter. This is the least reliable of the name @@ -84,14 +85,13 @@ being on a locally connected subnet. .RE If this parameter is not set then the name resolve order -defined in the \fIsmb.conf\fR file parameter -(name resolve order) will be used. +defined in the \fBsmb.conf\fR(5) file parameter +(\fIname resolve order\fR) will be used. The default order is lmhosts, host, wins, bcast. Without this parameter or any entry in the \fIname resolve order -\fR parameter of the \fIsmb.conf\fR -file, the name resolution methods will be attempted in this -order. +\fR parameter of the \fBsmb.conf\fR(5) file, the name resolution methods +will be attempted in this order. .TP \fB-d \fR debug level is an integer from 0 to 10. @@ -100,7 +100,7 @@ The default value if this parameter is not specified is zero. The higher this value, the more detail will be logged -about the activities of \fBnmblookup\fR. At level +about the activities of \fBnmblookup\fR(1). At level 0, only critical errors and serious warnings will be logged. .TP \fB-l logfilename\fR @@ -118,13 +118,11 @@ value is specified at compile time. To use the \fBsmbsh\fR command, execute \fB smbsh\fR from the prompt and enter the username and password that authenticates you to the machine running the Windows NT operating system. -.PP .nf - system% \fBsmbsh\fR - Username: \fBuser\fR - Password: \fBXXXXXXX\fR - +system% \fBsmbsh\fR +Username: \fBuser\fR +Password: \fBXXXXXXX\fR .fi .PP Any dynamically linked command you execute from @@ -138,8 +136,7 @@ names for that machine. You could then, for example, use the \fB cd\fR command t edit files, and \fBrcp\fR to copy files. .SH "VERSION" .PP -This man page is correct for version 3.0 of -the Samba suite. +This man page is correct for version 3.0 of the Samba suite. .SH "BUGS" .PP \fBsmbsh\fR works by intercepting the standard @@ -153,8 +150,7 @@ of UNIX have a \fBfile\fR command that will describe how a program was linked. .SH "SEE ALSO" .PP -\fBsmbd(8)\fR -smb.conf(5) +\fBsmbd\fR(8), \fBsmb.conf\fR(5) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -164,7 +160,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbspool.8 b/docs/manpages/smbspool.8 index 708b68b4d4..e532b8301f 100644 --- a/docs/manpages/smbspool.8 +++ b/docs/manpages/smbspool.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBSPOOL" "8" "05 November 2002" "" "" +.TH "SMBSPOOL" "8" "28 January 2003" "" "" + .SH NAME smbspool \- send a print file to an SMB printer .SH SYNOPSIS @@ -12,7 +13,7 @@ smbspool \- send a print file to an SMB printer .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP smbspool is a very small print spooling program that sends a print file to an SMB printer. The command-line arguments @@ -77,12 +78,10 @@ name of the file to print. If this argument is not specified then the print file is read from the standard input. .SH "VERSION" .PP -This man page is correct for version 2.2 of -the Samba suite. +This man page is correct for version 2.2 of the Samba suite. .SH "SEE ALSO" .PP -\fBsmbd(8)\fR -and samba(7) +\fBsmbd\fR(8) and \fBSamba\fR(7). .SH "AUTHOR" .PP \fBsmbspool\fR was written by Michael Sweet @@ -95,7 +94,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbstatus.1 b/docs/manpages/smbstatus.1 index 0d2833025f..0b5a973f60 100644 --- a/docs/manpages/smbstatus.1 +++ b/docs/manpages/smbstatus.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBSTATUS" "1" "05 November 2002" "" "" +.TH "SMBSTATUS" "1" "28 January 2003" "" "" + .SH NAME smbstatus \- report on current Samba connections .SH SYNOPSIS @@ -12,7 +13,7 @@ smbstatus \- report on current Samba connections .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBsmbstatus\fR is a very simple program to list the current Samba connections. @@ -39,7 +40,7 @@ causes smbstatus to only list locks. causes smbstatus to include byte range locks. .TP \fB-p|--processes\fR -print a list of \fBsmbd(8)\fR processes and exit. +print a list of \fBsmbd\fR(8) processes and exit. Useful for scripting. .TP \fB-S|--shares\fR @@ -48,8 +49,7 @@ causes smbstatus to only list shares. \fB-s|--conf=\fR The default configuration file name is determined at compile time. The file specified contains the -configuration details required by the server. See \fIsmb.conf(5)\fR - for more information. +configuration details required by the server. See \fBsmb.conf\fR(5) for more information. .TP \fB-u|--user=\fR selects information relevant to @@ -60,8 +60,7 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBsmbd(8)\fR and -smb.conf(5) +\fBsmbd\fR(8) and \fBsmb.conf\fR(5). .SH "AUTHOR" .PP The original Samba software and related utilities @@ -71,7 +70,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbtar.1 b/docs/manpages/smbtar.1 index 93077fc16d..54de9fcc80 100644 --- a/docs/manpages/smbtar.1 +++ b/docs/manpages/smbtar.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBTAR" "1" "05 November 2002" "" "" +.TH "SMBTAR" "1" "28 January 2003" "" "" + .SH NAME smbtar \- shell script for backing up SMB/CIFS shares directly to UNIX tape drives .SH SYNOPSIS @@ -12,11 +13,10 @@ smbtar \- shell script for backing up SMB/CIFS shares directly to UNIX tape dri .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBsmbtar\fR is a very small shell script on top -of \fBsmbclient(1)\fR -which dumps SMB shares directly to tape. +of \fBsmbclient\fR(1) which dumps SMB shares directly to tape. .SH "OPTIONS" .TP \fB-s server\fR @@ -72,8 +72,7 @@ from the tar file. .TP \fB-l log level\fR Log (debug) level. Corresponds to the -\fI-d\fR flag of \fBsmbclient(1) -\fR. +\fI-d\fR flag of \fBsmbclient\fR(1). .SH "ENVIRONMENT VARIABLES" .PP The \fI$TAPE\fR variable specifies the @@ -91,18 +90,14 @@ on entire shares; should work on file lists. smbtar works best with GNU tar and may not work well with other versions. .SH "DIAGNOSTICS" .PP -See the \fBDIAGNOSTICS\fR section for the -\fBsmbclient(1)\fR - command. +See the \fBDIAGNOSTICS\fR section for the \fBsmbclient\fR(1) command. .SH "VERSION" .PP This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBsmbd(8)\fR -\fBsmbclient(1)\fR -smb.conf(5) +\fBsmbd\fR(8), \fBsmbclient\fR(1), \fBsmb.conf\fR(5). .SH "AUTHOR" .PP The original Samba software and related utilities @@ -115,7 +110,7 @@ wrote the tar extension and this man page. The \fBsmbtar\fR script was heavily rewritten and improved by Martin Kraemer . Many thanks to everyone who suggested extensions, improvements, bug fixes, etc. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter. +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 for +Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/smbumount.8 b/docs/manpages/smbumount.8 index 013e5dd79e..c8eb19831e 100644 --- a/docs/manpages/smbumount.8 +++ b/docs/manpages/smbumount.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SMBUMOUNT" "8" "05 November 2002" "" "" +.TH "SMBUMOUNT" "8" "28 January 2003" "" "" + .SH NAME smbumount \- smbfs umount for normal users .SH SYNOPSIS @@ -26,8 +27,7 @@ to make umount setuid root. The directory to unmount. .SH "SEE ALSO" .PP -\fBsmbmount(8)\fR - +\fBsmbmount\fR(8) .SH "AUTHOR" .PP Volker Lendecke, Andrew Tridgell, Michael H. Warfield @@ -40,4 +40,5 @@ The SAMBA Mailing list is the preferred place to ask questions regarding these programs. .PP The conversion of this manpage for Samba 2.2 was performed -by Gerald Carter +by Gerald Carter. The conversion to DocBook XML 4.2 for Samba 3.0 +was done by Alexander Bokovoy. diff --git a/docs/manpages/swat.8 b/docs/manpages/swat.8 index 7ec1892131..8893484c2e 100644 --- a/docs/manpages/swat.8 +++ b/docs/manpages/swat.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "SWAT" "8" "05 November 2002" "" "" +.TH "SWAT" "8" "28 January 2003" "" "" + .SH NAME swat \- Samba Web Administration Tool .SH SYNOPSIS @@ -12,10 +13,10 @@ swat \- Samba Web Administration Tool .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBswat\fR allows a Samba administrator to -configure the complex \fI smb.conf(5)\fR file via a Web browser. In addition, +configure the complex \fBsmb.conf\fR(5) file via a Web browser. In addition, a \fBswat\fR configuration page has help links to all the configurable options in the \fIsmb.conf\fR file allowing an administrator to easily look up the effects of any change. @@ -26,8 +27,8 @@ administrator to easily look up the effects of any change. \fB-s smb configuration file\fR The default configuration file path is determined at compile time. The file specified contains -the configuration details required by the \fBsmbd -\fR server. This is the file that \fBswat\fR will modify. +the configuration details required by the \fBsmbd\fR(8) server. This is the file +that \fBswat\fR will modify. The information in this file includes server-specific information such as what printcap file to use, as well as descriptions of all the services that the server is to provide. @@ -106,26 +107,21 @@ This file must contain a mapping of service name (e.g., tcp). .TP \fB\fI/usr/local/samba/lib/smb.conf\fB\fR -This is the default location of the \fIsmb.conf(5) -\fR server configuration file that swat edits. Other +This is the default location of the \fBsmb.conf\fR(5) server configuration file that swat edits. Other common places that systems install this file are \fI /usr/samba/lib/smb.conf\fR and \fI/etc/smb.conf \fR. This file describes all the services the server is to make available to clients. .SH "WARNINGS" .PP -\fBswat\fR will rewrite your \fIsmb.conf -\fR file. It will rearrange the entries and delete all +\fBswat\fR will rewrite your \fBsmb.conf\fR(5) file. It will rearrange the entries and delete all comments, \fIinclude=\fR and \fIcopy= \fR options. If you have a carefully crafted \fI smb.conf\fR then back it up or don't use swat! .SH "VERSION" .PP -This man page is correct for version 2.2 of -the Samba suite. +This man page is correct for version 2.2 of the Samba suite. .SH "SEE ALSO" .PP -\fBinetd(5)\fR, -\fBsmbd(8)\fR -smb.conf(5) +\fBinetd(5)\fR, \fBsmbd\fR(8), \fBsmb.conf\fR(5) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -135,7 +131,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 for +Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/testparm.1 b/docs/manpages/testparm.1 index 555c28c46c..fec26e18ae 100644 --- a/docs/manpages/testparm.1 +++ b/docs/manpages/testparm.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "TESTPARM" "1" "26 November 2002" "" "" +.TH "TESTPARM" "1" "28 January 2003" "" "" + .SH NAME testparm \- check an smb.conf configuration file for internal correctness .SH SYNOPSIS @@ -12,10 +13,10 @@ testparm \- check an smb.conf configuration file for internal correctness .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBtestparm\fR is a very simple test program -to check an \fBsmbd\fR configuration file for +to check an \fBsmbd\fR(8) configuration file for internal correctness. If this program reports no problems, you can use the configuration file with confidence that \fBsmbd \fR will successfully load the configuration file. @@ -49,9 +50,7 @@ This is useful for testing include files specified with the .TP \fB-v\fR If this option is specified, testparm -will also output all options that were not used in -\fIsmb.conf\fR and are thus set to -their defaults. +will also output all options that were not used in \fBsmb.conf\fR(5) and are thus set to their defaults. .TP \fB-t encoding\fR Output data in specified encoding. @@ -59,13 +58,13 @@ Output data in specified encoding. \fBconfigfilename\fR This is the name of the configuration file to check. If this parameter is not present then the -default \fIsmb.conf\fR file will be checked. +default \fBsmb.conf\fR(5) file will be checked. .TP \fBhostname\fR If this parameter and the following are specified, then \fBtestparm\fR will examine the \fIhosts allow\fR and \fIhosts deny\fR -parameters in the \fIsmb.conf\fR file to +parameters in the \fBsmb.conf\fR(5) file to determine if the hostname with this IP address would be allowed access to the \fBsmbd\fR server. If this parameter is supplied, the hostIP parameter must also @@ -77,9 +76,9 @@ in the previous parameter. This address must be supplied if the hostname parameter is supplied. .SH "FILES" .TP -\fB\fIsmb.conf\fB\fR +\fBsmb.conf(5)\fR This is usually the name of the configuration -file used by \fBsmbd\fR. +file used by \fBsmbd\fR(8). .SH "DIAGNOSTICS" .PP The program will issue a message saying whether the @@ -93,8 +92,7 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fIsmb.conf(5)\fR -\fBsmbd(8)\fR +\fBsmb.conf\fR(5), \fBsmbd\fR(8) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -104,7 +102,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/testprns.1 b/docs/manpages/testprns.1 index dc44a7d1bf..bb567b2a96 100644 --- a/docs/manpages/testprns.1 +++ b/docs/manpages/testprns.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "TESTPRNS" "1" "05 November 2002" "" "" +.TH "TESTPRNS" "1" "28 January 2003" "" "" + .SH NAME testprns \- check printer name for validity with smbd .SH SYNOPSIS @@ -12,11 +13,11 @@ testprns \- check printer name for validity with smbd .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBtestprns\fR is a very simple test program to determine whether a given printer name is valid for use in -a service to be provided by \fB smbd(8)\fR +a service to be provided by \fBsmbd\fR(8). .PP "Valid" in this context means "can be found in the printcap specified". This program is very stupid - so stupid in @@ -34,8 +35,7 @@ Note that no validation or checking of the printcap syntax is done beyond that required to extract the printer name. It may be that the print spooling system is more forgiving or less forgiving than \fBtestprns\fR. However, if -\fBtestprns\fR finds the printer then -\fBsmbd\fR should do so as well. +\fBtestprns\fR finds the printer then \fBsmbd\fR(8) should do so as well. .TP \fBprintcapname\fR This is the name of the printcap file within @@ -74,8 +74,7 @@ the Samba suite. .SH "SEE ALSO" .PP \fIprintcap(5)\fR, -\fBsmbd(8)\fR -\fBsmbclient(1)\fR +\fBsmbd\fR(8), \fBsmbclient\fR(1) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -85,7 +84,7 @@ to the way the Linux kernel is developed. .PP The original Samba man pages were written by Karl Auer. The man page sources were converted to YODL format (another -excellent piece of Open Source software, available at -ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 +excellent piece of Open Source software, available at ftp://ftp.icce.rug.nl/pub/unix/ ) and updated for the Samba 2.0 release by Jeremy Allison. The conversion to DocBook for -Samba 2.2 was done by Gerald Carter +Samba 2.2 was done by Gerald Carter. The conversion to DocBook XML 4.2 +for Samba 3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/vfstest.1 b/docs/manpages/vfstest.1 index ced1038112..134ee79c47 100644 --- a/docs/manpages/vfstest.1 +++ b/docs/manpages/vfstest.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "VFSTEST" "1" "26 November 2002" "" "" +.TH "VFSTEST" "1" "28 January 2003" "" "" + .SH NAME vfstest \- tool for testing samba VFS modules .SH SYNOPSIS @@ -12,7 +13,7 @@ vfstest \- tool for testing samba VFS modules .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP \fBvfstest\fR is a small command line utility that has the ability to test dso samba VFS modules. It gives the diff --git a/docs/manpages/wbinfo.1 b/docs/manpages/wbinfo.1 index 312ef3acb2..b8ce01f1c1 100644 --- a/docs/manpages/wbinfo.1 +++ b/docs/manpages/wbinfo.1 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "WBINFO" "1" "05 November 2002" "" "" +.TH "WBINFO" "1" "28 January 2003" "" "" + .SH NAME wbinfo \- Query information from winbind daemon .SH SYNOPSIS @@ -12,53 +13,51 @@ wbinfo \- Query information from winbind daemon .SH "DESCRIPTION" .PP -This tool is part of the Samba suite. +This tool is part of the \fBSamba\fR(7) suite. .PP The \fBwbinfo\fR program queries and returns information -created and used by the \fB winbindd(8)\fR daemon. +created and used by the \fBwinbindd\fR(8) daemon. .PP -The \fBwinbindd(8)\fR daemon must be configured +The \fBwinbindd\fR(8) daemon must be configured and running for the \fBwbinfo\fR program to be able to return information. .SH "OPTIONS" .TP \fB-u\fR This option will list all users available -in the Windows NT domain for which the \fBwinbindd(8) -\fR daemon is operating in. Users in all trusted domains +in the Windows NT domain for which the \fBwinbindd\fR(8) daemon is operating in. Users in all trusted domains will also be listed. Note that this operation does not assign -user ids to any users that have not already been seen by -\fBwinbindd(8)\fR. +user ids to any users that have not already been seen by \fBwinbindd\fR(8) +\&. .TP \fB-g\fR This option will list all groups available -in the Windows NT domain for which the \fBwinbindd(8) -\fR daemon is operating in. Groups in all trusted domains +in the Windows NT domain for which the \fBSamba\fR(7) daemon is operating in. Groups in all trusted domains will also be listed. Note that this operation does not assign -group ids to any groups that have not already been seen by -\fBwinbindd(8)\fR. +group ids to any groups that have not already been +seen by \fBwinbindd\fR(8). .TP \fB-N name\fR The \fI-N\fR option -queries \fBwinbindd(8)\fR to query the WINS +queries \fBwinbindd\fR(8) to query the WINS server for the IP address associated with the NetBIOS name specified by the \fIname\fR parameter. .TP \fB-I ip\fR The \fI-I\fR option -queries \fBwinbindd(8)\fR to send a node status +queries \fBwinbindd\fR(8) to send a node status request to get the NetBIOS name associated with the IP address specified by the \fIip\fR parameter. .TP \fB-n name\fR The \fI-n\fR option -queries \fBwinbindd(8)\fR for the SID +queries \fBwinbindd\fR(8) for the SID associated with the name specified. Domain names can be specified before the user name by using the winbind separator character. For example CWDOM1/Administrator refers to the Administrator user in the domain CWDOM1. If no domain is specified then the -domain used is the one specified in the \fIsmb.conf\fR -\fIworkgroup\fR parameter. +domain used is the one specified in the \fBsmb.conf\fR(5) \fIworkgroup +\fR parameter. .TP \fB-s sid\fR Use \fI-s\fR to resolve @@ -79,11 +78,12 @@ the winbind gid range then the operation will fail. .TP \fB-S sid\fR Convert a SID to a UNIX user id. If the SID -does not correspond to a UNIX user mapped by \fB winbindd(8)\fR then the operation will fail. +does not correspond to a UNIX user mapped by \fBwinbindd\fR(8) then the operation will fail. .TP \fB-Y sid\fR Convert a SID to a UNIX group id. If the SID -does not correspond to a UNIX group mapped by \fB winbindd(8)\fR then the operation will fail. +does not correspond to a UNIX group mapped by \fBwinbindd\fR(8) then +the operation will fail. .TP \fB-t\fR Verify that the workstation trust account @@ -92,7 +92,7 @@ domain is working. .TP \fB-m\fR Produce a list of domains trusted by the -Windows NT server \fBwinbindd(8)\fR contacts +Windows NT server \fBwinbindd\fR(8) contacts when resolving names. This list does not include the Windows NT domain the server is a Primary Domain Controller for. .TP @@ -114,8 +114,7 @@ Windows 2000 servers only). .SH "EXIT STATUS" .PP The wbinfo program returns 0 if the operation -succeeded, or 1 if the operation failed. If the \fBwinbindd(8) -\fR daemon is not working \fBwbinfo\fR will always return +succeeded, or 1 if the operation failed. If the \fBwinbindd\fR(8) daemon is not working \fBwbinfo\fR will always return failure. .SH "VERSION" .PP @@ -123,8 +122,7 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fBwinbindd(8)\fR - +\fBwinbindd\fR(8) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -136,4 +134,5 @@ to the way the Linux kernel is developed. were written by Tim Potter. .PP The conversion to DocBook for Samba 2.2 was done -by Gerald Carter +by Gerald Carter. The conversion to DocBook XML 4.2 for Samba +3.0 was done by Alexander Bokovoy. diff --git a/docs/manpages/winbindd.8 b/docs/manpages/winbindd.8 index 8cfb403723..a46c0769b5 100644 --- a/docs/manpages/winbindd.8 +++ b/docs/manpages/winbindd.8 @@ -3,7 +3,8 @@ .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . -.TH "WINBINDD" "8" "03 January 2003" "" "" +.TH "WINBINDD" "8" "18 February 2003" "" "" + .SH NAME winbindd \- Name Service Switch daemon for resolving names from NT servers .SH SYNOPSIS @@ -12,7 +13,7 @@ winbindd \- Name Service Switch daemon for resolving names from NT servers .SH "DESCRIPTION" .PP -This program is part of the Samba suite. +This program is part of the \fBSamba\fR(7) suite. .PP \fBwinbindd\fR is a daemon that provides a service for the Name Service Switch capability that is present @@ -59,13 +60,11 @@ For example, the following simple configuration in the \fI/etc/nsswitch.conf\fR file can be used to initially resolve user and group information from \fI/etc/passwd \fR and \fI/etc/group\fR and then from the -Windows NT server. -.PP +Windows NT server. .nf passwd: files winbind group: files winbind - .fi .PP The following simple configuration in the @@ -122,7 +121,7 @@ Advantage of this is that responses are accurate and fast. .TP \fB-s|--conf=smb.conf\fR Specifies the location of the all-important -\fIsmb.conf\fR file. +\fBsmb.conf\fR(5) file. .SH "NAME AND ID RESOLUTION" .PP Users and groups on a Windows NT server are assigned @@ -147,8 +146,7 @@ and group rids. .SH "CONFIGURATION" .PP Configuration of the \fBwinbindd\fR daemon -is done through configuration parameters in the \fIsmb.conf(5) -\fR file. All parameters should be specified in the +is done through configuration parameters in the \fBsmb.conf\fR(5) file. All parameters should be specified in the [global] section of smb.conf. .TP 0.2i \(bu @@ -185,28 +183,23 @@ following setup. This was tested on a RedHat 6.2 Linux box. .PP In \fI/etc/nsswitch.conf\fR put the following: -.PP .nf passwd: files winbind group: files winbind - .fi .PP -In \fI/etc/pam.d/*\fR replace the -\fIauth\fR lines with something like this: -.PP +In \fI/etc/pam.d/*\fR replace the \fI auth\fR lines with something like this: .nf auth required /lib/security/pam_securetty.so auth required /lib/security/pam_nologin.so auth sufficient /lib/security/pam_winbind.so auth required /lib/security/pam_pwdb.so use_first_pass shadow nullok - .fi .PP -Note in particular the use of the \fIsufficient\fR -keyword and the \fIuse_first_pass\fR keyword. +Note in particular the use of the \fIsufficient +\fR keyword and the \fIuse_first_pass\fR keyword. .PP Now replace the account lines with this: .PP @@ -216,25 +209,22 @@ Now replace the account lines with this: The next step is to join the domain. To do that use the \fBsmbpasswd\fR program like this: .PP -\fBsmbpasswd -j DOMAIN -r PDC -U -Administrator\fR +\fBnet join -S PDC -U Administrator\fR .PP The username after the \fI-U\fR can be any Domain user that has administrator privileges on the machine. -Substitute your domain name for "DOMAIN" and the name of your PDC -for "PDC". +Substitute the name or IP of your PDC for "PDC". .PP Next copy \fIlibnss_winbind.so\fR to -\fI/lib\fR and \fIpam_winbind.so\fR -to \fI/lib/security\fR. A symbolic link needs to be +\fI/lib\fR and \fIpam_winbind.so +\fR to \fI/lib/security\fR. A symbolic link needs to be made from \fI/lib/libnss_winbind.so\fR to \fI/lib/libnss_winbind.so.2\fR. If you are using an older version of glibc then the target of the link should be \fI/lib/libnss_winbind.so.1\fR. .PP -Finally, setup a \fIsmb.conf\fR containing directives like the -following: -.PP +Finally, setup a \fBsmb.conf\fR(5) containing directives like the +following: .nf [global] @@ -247,7 +237,6 @@ following: workgroup = DOMAIN security = domain password server = * - .fi .PP Now start winbindd and you should find that your user and @@ -261,9 +250,9 @@ commands \fBgetent passwd\fR and \fBgetent group The following notes are useful when configuring and running \fBwinbindd\fR: .PP -\fBnmbd\fR must be running on the local machine -for \fBwinbindd\fR to work. \fBwinbindd\fR -queries the list of trusted domains for the Windows NT server +\fBnmbd\fR(8) must be running on the local machine +for \fBwinbindd\fR to work. \fBwinbindd\fR queries +the list of trusted domains for the Windows NT server on startup and when a SIGHUP is received. Thus, for a running \fB winbindd\fR to become aware of new trust relationships between servers, it must be sent a SIGHUP signal. .PP @@ -289,8 +278,8 @@ The following signals can be used to manipulate the \fBwinbindd\fR daemon. .TP \fBSIGHUP\fR -Reload the \fIsmb.conf(5)\fR -file and apply any parameter changes to the running +Reload the \fBsmb.conf\fR(5) file and +apply any parameter changes to the running version of winbindd. This signal also clears any cached user and group information. The list of other domains trusted by winbindd is also reloaded. @@ -333,10 +322,7 @@ This man page is correct for version 3.0 of the Samba suite. .SH "SEE ALSO" .PP -\fInsswitch.conf(5)\fR, -samba(7) -wbinfo(1) -smb.conf(5) +\fInsswitch.conf(5)\fR, \fBSamba\fR(7), \fBwbinfo\fR(8), \fBsmb.conf\fR(5) .SH "AUTHOR" .PP The original Samba software and related utilities @@ -344,8 +330,9 @@ were created by Andrew Tridgell. Samba is now developed by the Samba Team as an Open Source project similar to the way the Linux kernel is developed. .PP -\fBwbinfo\fR and \fBwinbindd\fR -were written by Tim Potter. +\fBwbinfo\fR and \fBwinbindd\fR were +written by Tim Potter. .PP The conversion to DocBook for Samba 2.2 was done -by Gerald Carter +by Gerald Carter. The conversion to DocBook XML 4.2 for +Samba 3.0 was done by Alexander Bokovoy. -- cgit From 1d278baf06a0560b1e069a945b6db4af1c4f6f5e Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 19 Feb 2003 00:13:23 +0000 Subject: Remove reference to obsolete samba-bugs address. (This used to be commit 8e5f2ac3ca0b4cfb910f38532efb63526f28b579) --- source3/change-log | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/change-log b/source3/change-log index 1f7798b541..71f5012484 100644 --- a/source3/change-log +++ b/source3/change-log @@ -2,7 +2,7 @@ SUPERCEDED Change Log for Samba ^^^^^^^^^^ Unless otherwise attributed, all changes were made by -Andrew.Tridgell@anu.edu.au. All bugs to samba-bugs@samba.org. +Andrew.Tridgell@anu.edu.au. NOTE: THIS LOG IS IN CHRONOLOGICAL ORDER -- cgit From 46ae03ee59cf6783a10774a91d9d263fee4dc85a Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 19 Feb 2003 00:14:29 +0000 Subject: Remove reference to obsolete samba-bugs address. Suggest people report trouble in the first instance to samba@lists. (This used to be commit f2a4c51983636b90b8e2942cca765740592e08f7) --- README | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README b/README index 93c8cb133e..15363ce6ab 100644 --- a/README +++ b/README @@ -92,9 +92,9 @@ If you want to contribute to the development of the software then please join the mailing list. The Samba team accepts patches (preferably in "diff -u" format, see docs/BUGS.txt for more details) and are always glad to receive feedback or suggestions to the address -samba-bugs@samba.org. We have recently put a new bug tracking -system into place which should help the throughput quite a lot. You -can also get the Samba sourcecode straight from the CVS tree - see +samba@lists.samba.org. + +You can also get the Samba sourcecode straight from the CVS tree - see http://samba.org/cvs.html. You could also send hardware/software/money/jewelry or pizza -- cgit From 11d873bebf9df83219019ea03d42f695ca5387a9 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 19 Feb 2003 00:16:25 +0000 Subject: Remove tridge's old home address, and old samba-bugs adddress. He can add the new one if he wants. (I wonder if the new owners of that house wonder why pizza keeps turning up? :-) (This used to be commit 92ab401656ac96a255ba2ef4121823d9cd57ccf8) --- README | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/README b/README index 15363ce6ab..b4bd9a0f57 100644 --- a/README +++ b/README @@ -97,7 +97,7 @@ samba@lists.samba.org. You can also get the Samba sourcecode straight from the CVS tree - see http://samba.org/cvs.html. -You could also send hardware/software/money/jewelry or pizza +You could also send hardware/software/money/jewelry or pre-paid pizza vouchers directly to Andrew. The pizza vouchers would be especially welcome, in fact there is a special field in the survey for people who have paid up their pizza :-) @@ -111,16 +111,6 @@ we get. If noone tells us they like it then we'll probably move onto something else. However, as you can see from the user survey quite a lot of people do seem to like it at the moment :-) -Andrew Tridgell -Email: samba-bugs@samba.org - -3 Ballow Crescent -Macgregor, A.C.T. -2615 Australia - -Samba Team -Email: samba-bugs@samba.org - MORE INFO ========= -- cgit From 0ff05c7f66a6321bac3bb699e30a7c49ddbefdfd Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 19 Feb 2003 00:25:47 +0000 Subject: Remove old listproc address and webmaster mailing address. (Is this file actually still used? Perhaps it would be better to include something from the web site instead. I'm not going to merge this across because I think it's dead.) (This used to be commit 7096d5feb2e8be204881bdcb76ad08cc5aa4a79a) --- packaging/SGI/relnotes.html | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/packaging/SGI/relnotes.html b/packaging/SGI/relnotes.html index afcf579677..d055be6c1a 100644 --- a/packaging/SGI/relnotes.html +++ b/packaging/SGI/relnotes.html @@ -205,17 +205,8 @@ printer name to describe its location.
      of the docs directory from the Samba distribution; consult samba(7) for an introduction.

      -

      There is a mailing list for discussion of Samba. To subscribe send mail -to listproc@samba.org -with a body of "subscribe samba Your Name"

      - -

      To send mail to everyone on the list mail to samba@samba.org. -

      - -

      There is also an announcement mailing list where new versions are announced. -To subscribe send mail to listproc@samba.org -with a body of "subscribe samba-announce Your Name". All announcements -also go to the samba list.

      +

      There is a mailing list for discussion of Samba. To subscribe and + for more information go to lists.samba.org.

      You might also like to look at the Usenet news group comp.protocols.smb as it often contains lots of useful info and is frequented by lots of Samba @@ -223,10 +214,10 @@ users. The newsgroup was initially setup by people on the Samba mailing list. It is not, however, exclusive to Samba, it is a forum for discussing the SMB protocol (which Samba implements).

      -

      A Samba WWW site has been setup with lots of useful info. Connect to: -http://samba.org/pub/samba/. -It is maintained by Paul Blackman (thanks Paul!). You can contact him at -ictinus@lake.canberra.edu.au. +

      + A Samba WWW site has been setup with lots of useful info. Connect to: + http://samba.org/. You can + contact the webmaster at "webmaster at samba dot org".

      -- cgit From a0913929ef6f1e34ff2654e8773c8bf45c6230af Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 00:27:38 +0000 Subject: base64_decode() with heimdal libs, so I've renamed it base64_decode_inplace(). (This used to be commit 8c69212eeb4a0ec144b960d76319fd4940b8c239) --- source3/lib/util_str.c | 2 +- source3/web/cgi.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 8fe04f0f58..cc4b6fe5c5 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -1585,7 +1585,7 @@ DATA_BLOB base64_decode_data_blob(const char *s) /** * Decode a base64 string in-place - wrapper for the above **/ -void base64_decode(char *s) +void base64_decode_inplace(char *s) { DATA_BLOB decoded = base64_decode_data_blob(s); memcpy(s, decoded.data, decoded.length); diff --git a/source3/web/cgi.c b/source3/web/cgi.c index 46f33789bf..8abc2f0bd5 100644 --- a/source3/web/cgi.c +++ b/source3/web/cgi.c @@ -306,7 +306,7 @@ static BOOL cgi_handle_authorization(char *line) } line += 6; while (line[0] == ' ') line++; - base64_decode(line); + base64_decode_inplace(line); if (!(p=strchr_m(line,':'))) { /* * Always give the same error so a cracker -- cgit From f5cc7f35e9b8feed0f274affc46fcc65f2e77466 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 19 Feb 2003 00:47:41 +0000 Subject: Remove old listproc address; update instructions for subscribing to the mailing list. (This used to be commit cab94c8a315ba7ad68e71c62c0d5fa3ab9a90661) --- README | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/README b/README index b4bd9a0f57..cdc7e9e2a9 100644 --- a/README +++ b/README @@ -135,19 +135,63 @@ http://lists.samba.org/ MAILING LIST ------------ -There is a mailing list for discussion of Samba. To subscribe send -mail to listproc@samba.org with a body of "subscribe samba Your Name" -Please do NOT send this request to the list alias instead. +Please do NOT send subscription/unsubscription requests to the lists! -To send mail to everyone on the list mail to samba@listproc.anu.edu.au +There is a mailing list for discussion of Samba. For details go to + or send mail to There is also an announcement mailing list where new versions are -announced. To subscribe send mail to listproc@samba.org with a -body of "subscribe samba-announce Your Name". All announcements also -go to the samba list. +announced. To subscribe go to or send mail +to . All announcements also +go to the samba list, so you only need to be on one. For details of other Samba mailing lists and for access to archives, see -http://lists.samba.org/ + + + +MAILING LIST ETIQUETTE +---------------------- + +A few tips when submitting to this or any mailing list. + +1. Make your subject short and descriptive. Avoid the words "help" or + "Samba" in the subject. The readers of this list already know that + a) you need help, and b) you are writing about samba (of course, + you may need to distinguish between Samba PDC and other file + sharing software). Avoid phrases such as "what is" and "how do + i". Some good subject lines might look like "Slow response with + Excel files" or "Migrating from Samba PDC to NT PDC". + +2. If you include the original message in your reply, trim it so that + only the relevant lines, enough to establish context, are + included. Chances are (since this is a mailing list) we've already + read the original message. + +3. Trim irrelevant headers from the original message in your + reply. All we need to see is a) From, b) Date, and c) Subject. We + don't even really need the Subject, if you haven't changed + it. Better yet is to just preface the original message with "On + [date] [someone] wrote:". + +4. Please don't reply to or argue about spam, spam filters or viruses + on any Samba lists. We do have a spam filtering system that is + working quite well thank you very much but occasionally unwanted + messages slip through. Deal with it. + +5. Never say "Me too." It doesn't help anyone solve the + problem. Instead, if you ARE having the same problem, give more + information. Have you seen something that the other writer hasn't + mentioned, which may be helpful? + +6. If you ask about a problem, then come up with the solution on your + own or through another source, by all means post it. Someone else + may have the same problem and is waiting for an answer, but never + hears of it. + +7. Give as much *relevant* information as possible such as Samba + release number, OS, kernel version, etc... + +8. RTFM. Google. groups.google.com. NEWS GROUP -- cgit From e354fd27cb05f9d6259ca480831e325d17cfefea Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 00:50:38 +0000 Subject: Add support for detecting method of listing encryption types (MIT v Heimdal) (This used to be commit 48dcf5b97f2d53617c41237e09369ec678ab65e9) --- source3/configure.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source3/configure.in b/source3/configure.in index 77553cf5b7..b90d99bf3d 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -2194,6 +2194,9 @@ fi AC_CHECK_LIB(krb5, krb5_auth_con_setkey, [AC_DEFINE(HAVE_KRB5_AUTH_CON_SETKEY,1,[Whether krb5_auth_con_setkey is available])]) AC_CHECK_LIB(krb5, krb5_auth_con_setuseruserkey, [AC_DEFINE(HAVE_KRB5_AUTH_CON_SETUSERUSERKEY,1,[Whether krb5_auth_con_setuseruserkey is available])]) AC_CHECK_LIB(krb5, krb5_locate_kdc, [AC_DEFINE(HAVE_KRB5_LOCATE_KDC,1,[Whether krb5_locate_kdc is available])]) + AC_CHECK_LIB(krb5, krb5_get_permitted_enctypes, [AC_DEFINE(HAVE_KRB5_GET_PERMITTED_ENCTYPES,1,[Whether krb5_get_permitted_enctypes is available])]) + AC_CHECK_LIB(krb5, krb5_get_default_in_tkt_etypes, [AC_DEFINE(HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES,1,[Whether krb5_get_default_in_tkt_etypes is available])]) + AC_CHECK_LIB(krb5, krb5_free_ktypes, [AC_DEFINE(HAVE_KRB5_FREE_KTYPES,1,[Whether krb5_free_ktypes is available])]) AC_CACHE_CHECK([for addrtype in krb5_address],samba_cv_HAVE_ADDRTYPE_IN_KRB5_ADDRESS,[ AC_TRY_COMPILE([#include ], -- cgit From adfefcdcb6e9d8ea0458a11b6f684a5cf231c3ba Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 01:16:40 +0000 Subject: Try to get heimdal working with HEAD. - Provide generic functions for - get valid encryption types - free encryption types - Add encryption type parm to generic function create_kerberos_key_from_string() - Try to merge the two versions (between HEAD and SAMBA_3_0) of kerberos_verify.c I think this should work for both MIT and heimdal, in HEAD. If all goes smooth, I'll move it over to 3.0 soon... (This used to be commit 45e409fc8da9f26cf888e13d004392660d7c55d4) --- source3/include/includes.h | 5 +++-- source3/libads/kerberos_verify.c | 27 +++++++-------------------- source3/libsmb/clikrb5.c | 38 ++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/source3/include/includes.h b/source3/include/includes.h index 988913d16c..c5738f0a61 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -1224,11 +1224,12 @@ krb5_error_code krb5_auth_con_setuseruserkey(krb5_context context, krb5_auth_con /* Samba wrapper function for krb5 functionality. */ void setup_kaddr( krb5_address *pkaddr, struct sockaddr *paddr); -int create_kerberos_key_from_string(krb5_context context, krb5_principal host_princ, krb5_data *password, krb5_keyblock *key); +int create_kerberos_key_from_string(krb5_context context, krb5_principal host_princ, krb5_data *password, krb5_keyblock *key, krb5_enctype enctype); void get_auth_data_from_tkt(DATA_BLOB *auth_data, krb5_ticket *tkt); krb5_const_principal get_principal_from_tkt(krb5_ticket *tkt); krb5_error_code krb5_locate_kdc(krb5_context ctx, const krb5_data *realm, struct sockaddr **addr_pp, int *naddrs, int get_masters); - +krb5_error_code get_kerberos_allowed_etypes(krb5_context context, krb5_enctype **enctypes); +void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes); #endif /* HAVE_KRB5 */ #endif /* _INCLUDES_H */ diff --git a/source3/libads/kerberos_verify.c b/source3/libads/kerberos_verify.c index c1402b1370..17fecf60c8 100644 --- a/source3/libads/kerberos_verify.c +++ b/source3/libads/kerberos_verify.c @@ -36,8 +36,6 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, krb5_keytab keytab = NULL; krb5_data packet; krb5_ticket *tkt = NULL; - krb5_data salt; - krb5_encrypt_block eblock; int ret, i; krb5_keyblock * key; krb5_principal host_princ; @@ -92,17 +90,11 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, return NT_STATUS_LOGON_FAILURE; } - ret = krb5_principal2salt(context, host_princ, &salt); - if (ret) { - DEBUG(1,("krb5_principal2salt failed (%s)\n", error_message(ret))); - return NT_STATUS_LOGON_FAILURE; - } - if (!(key = (krb5_keyblock *)malloc(sizeof(*key)))) { return NT_STATUS_NO_MEMORY; } - if ((ret = krb5_get_permitted_enctypes(context, &enctypes))) { + if ((ret = get_kerberos_allowed_etypes(context, &enctypes))) { DEBUG(1,("krb5_get_permitted_enctypes failed (%s)\n", error_message(ret))); return NT_STATUS_LOGON_FAILURE; @@ -110,10 +102,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, /* we need to setup a auth context with each possible encoding type in turn */ for (i=0;enctypes[i];i++) { - krb5_use_enctype(context, &eblock, enctypes[i]); - - ret = krb5_string_to_key(context, &eblock, key, &password, &salt); - if (ret) { + if (create_kerberos_key_from_string(context, host_princ, &password, key, enctypes[i])) { continue; } @@ -124,7 +113,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, if (!(ret = krb5_rd_req(context, &auth_context, &packet, NULL, keytab, NULL, &tkt))) { - krb5_free_ktypes(context, enctypes); + free_kerberos_etypes(context, enctypes); auth_ok = True; break; } @@ -133,6 +122,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, if (!auth_ok) { DEBUG(3,("krb5_rd_req with auth failed (%s)\n", error_message(ret))); + SAFE_FREE(key); return NT_STATUS_LOGON_FAILURE; } @@ -140,11 +130,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, file_save("/tmp/ticket.dat", ticket->data, ticket->length); #endif - - if (tkt->enc_part2) { - *auth_data = data_blob(tkt->enc_part2->authorization_data[0]->contents, - tkt->enc_part2->authorization_data[0]->length); - } + get_auth_data_from_tkt(auth_data, tkt); #if 0 if (tkt->enc_part2) { @@ -154,7 +140,8 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, } #endif - if ((ret = krb5_unparse_name(context, tkt->enc_part2->client, principal))) { + if ((ret = krb5_unparse_name(context, get_principal_from_tkt(tkt), + principal))) { DEBUG(3,("krb5_unparse_name failed (%s)\n", error_message(ret))); return NT_STATUS_LOGON_FAILURE; diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index e380d80bcc..c13f663381 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -74,7 +74,8 @@ int create_kerberos_key_from_string(krb5_context context, krb5_principal host_princ, krb5_data *password, - krb5_keyblock *key) + krb5_keyblock *key, + krb5_enctype enctype) { int ret; krb5_data salt; @@ -85,14 +86,15 @@ DEBUG(1,("krb5_principal2salt failed (%s)\n", error_message(ret))); return ret; } - krb5_use_enctype(context, &eblock, ENCTYPE_DES_CBC_MD5); + krb5_use_enctype(context, &eblock, enctype); return krb5_string_to_key(context, &eblock, key, password, &salt); } #elif defined(HAVE_KRB5_GET_PW_SALT) && defined(HAVE_KRB5_STRING_TO_KEY_SALT) int create_kerberos_key_from_string(krb5_context context, krb5_principal host_princ, krb5_data *password, - krb5_keyblock *key) + krb5_keyblock *key, + krb5_enctype enctype) { int ret; krb5_salt salt; @@ -102,13 +104,41 @@ DEBUG(1,("krb5_get_pw_salt failed (%s)\n", error_message(ret))); return ret; } - return krb5_string_to_key_salt(context, ENCTYPE_DES_CBC_MD5, password->data, + return krb5_string_to_key_salt(context, enctype, password->data, salt, key); } #else __ERROR_XX_UNKNOWN_CREATE_KEY_FUNCTIONS #endif +#if defined(HAVE_KRB5_GET_PERMITTED_ENCTYPES) +krb5_error_code get_kerberos_allowed_etypes(krb5_context context, + krb5_enctype **enctypes) +{ + return krb5_get_permitted_enctypes(context, enctypes); +} +#elif defined(HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES) +krb5_error_code get_kerberos_allowed_etypes(krb5_context context, + krb5_enctype **enctypes) +{ + return krb5_get_default_in_tkt_etypes(context, enctypes); +} +#else + __ERROR_XX_UNKNOWN_GET_ENCTYPES_FUNCTIONS +#endif + +#if defined(HAVE_KRB5_FREE_KTYPES) +void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes) +{ + return krb5_free_ktypes(context, enctypes); +} +#else +void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes) +{ + return free(enctypes); +} +#endif + #if defined(HAVE_KRB5_AUTH_CON_SETKEY) && !defined(HAVE_KRB5_AUTH_CON_SETUSERUSERKEY) krb5_error_code krb5_auth_con_setuseruserkey(krb5_context context, krb5_auth_context auth_context, -- cgit From e7b5d059c2af0ffb71e3d6b12a35a1dcd3295942 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 19 Feb 2003 01:38:12 +0000 Subject: Bit of a hack job to prevent smbprn.XXX jobs appearing in the queue if the jobid is below the UNIX_JOB_START number. Jeremy. (This used to be commit e8a9bf67cbe5b3e33f99e6793fe4ec445d6e8819) --- source3/printing/printing.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 3bf992ad69..c9612ab3a9 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -579,11 +579,13 @@ static uint32 print_parse_jobid(char *fname) List a unix job in the print database. ****************************************************************************/ -static void print_unix_job(int snum, print_queue_struct *q) +static void print_unix_job(int snum, print_queue_struct *q, uint32 jobid) { - uint32 jobid = q->job + UNIX_JOB_START; struct printjob pj, *old_pj; + if (jobid == (uint32)-1) + jobid = q->job + UNIX_JOB_START; + /* Preserve the timestamp on an existing unix print job */ old_pj = print_job_find(snum, jobid); @@ -597,11 +599,14 @@ static void print_unix_job(int snum, print_queue_struct *q) pj.status = q->status; pj.size = q->size; pj.spooled = True; - pj.smbjob = False; - fstrcpy(pj.filename, ""); - fstrcpy(pj.jobname, q->fs_file); - fstrcpy(pj.user, q->fs_user); - fstrcpy(pj.queuename, lp_const_servicename(snum)); + pj.smbjob = (old_pj != NULL ? True : False); + fstrcpy(pj.filename, old_pj ? old_pj->filename : ""); + if (jobid < UNIX_JOB_START) + fstrcpy(pj.jobname, old_pj ? old_pj->jobname : "Remote Downlevel Document"); + else + fstrcpy(pj.jobname, old_pj ? old_pj->jobname : q->fs_file); + fstrcpy(pj.user, old_pj ? old_pj->user : q->fs_user); + fstrcpy(pj.queuename, old_pj ? old_pj->queuename : lp_const_servicename(snum)); pjob_store(snum, jobid, &pj); } @@ -879,7 +884,7 @@ static void print_queue_update(int snum) if (jobid == (uint32)-1) { /* assume its a unix print job */ - print_unix_job(snum, &queue[i]); + print_unix_job(snum, &queue[i], jobid); continue; } @@ -889,7 +894,7 @@ static void print_queue_update(int snum) /* err, somethings wrong. Probably smbd was restarted with jobs in the queue. All we can do is treat them like unix jobs. Pity. */ - print_unix_job(snum, &queue[i]); + print_unix_job(snum, &queue[i], jobid); continue; } -- cgit From b63edf9a28cf81536d45fbbe8021683262ff07a2 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 19 Feb 2003 02:34:33 +0000 Subject: Fix from Corny.Bondad@hp.com for missing if (setting_acls) on default perms. Jeremy. (This used to be commit ac96fa173cc3bd1c3226634154d6f99e4034179f) --- source3/smbd/posix_acls.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index 2739f73b0a..a40fb4042f 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -699,11 +699,11 @@ static BOOL ensure_canon_entry_valid(canon_ace **pp_ace, pace->unix_ug.world = -1; pace->trustee = global_sid_World; pace->attr = ALLOW_ACE; - if (setting_acl) + if (setting_acl) { pace->perms = 0; - else + apply_default_perms(fsp, pace, S_IROTH); + } else pace->perms = unix_perms_to_acl_perms(pst->st_mode, S_IROTH, S_IWOTH, S_IXOTH); - apply_default_perms(fsp, pace, S_IROTH); DLIST_ADD(*pp_ace, pace); } -- cgit From 3b541bdcfe14d30d961a5de20d382af179c381ee Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 03:19:30 +0000 Subject: Get non-krb systems to compile. How the heck do I keep something from being sucked into proto.h? (This used to be commit 7e84497882df5bf933ab7ae7fe9af3728393202c) --- source3/include/includes.h | 2 +- source3/libsmb/clikrb5.c | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/source3/include/includes.h b/source3/include/includes.h index c5738f0a61..bb78ae0780 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -1229,7 +1229,7 @@ void get_auth_data_from_tkt(DATA_BLOB *auth_data, krb5_ticket *tkt); krb5_const_principal get_principal_from_tkt(krb5_ticket *tkt); krb5_error_code krb5_locate_kdc(krb5_context ctx, const krb5_data *realm, struct sockaddr **addr_pp, int *naddrs, int get_masters); krb5_error_code get_kerberos_allowed_etypes(krb5_context context, krb5_enctype **enctypes); -void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes); +krb5_error_code free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes); #endif /* HAVE_KRB5 */ #endif /* _INCLUDES_H */ diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index c13f663381..2e07dfdb66 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -127,17 +127,18 @@ krb5_error_code get_kerberos_allowed_etypes(krb5_context context, __ERROR_XX_UNKNOWN_GET_ENCTYPES_FUNCTIONS #endif -#if defined(HAVE_KRB5_FREE_KTYPES) -void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes) + /* the following is defined as krb5_error_code to keep it from + being sucked into proto.h */ +krb5_error_code free_kerberos_etypes(krb5_context context, + krb5_enctype *enctypes) { - return krb5_free_ktypes(context, enctypes); -} +#if defined(HAVE_KRB5_FREE_KTYPES) + krb5_free_ktypes(context, enctypes); #else -void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes) -{ - return free(enctypes); -} + SAFE_FREE(enctypes); #endif + return 0; +} #if defined(HAVE_KRB5_AUTH_CON_SETKEY) && !defined(HAVE_KRB5_AUTH_CON_SETUSERUSERKEY) krb5_error_code krb5_auth_con_setuseruserkey(krb5_context context, -- cgit From f145c2e350db43e401cd477eff89fdef136e7f6c Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Feb 2003 10:12:14 +0000 Subject: Only do a kinit if we got told to use kerberos. Andrew Bartlett (This used to be commit 6af9ec50e010d171cf5287f40ec774e79e4a93fe) --- source3/libsmb/cliconnect.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 487b184dd6..c57f92eea9 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -630,19 +630,19 @@ static BOOL cli_session_setup_spnego(struct cli_state *cli, const char *user, /* If password is set we reauthenticate to kerberos server * and do not store results */ - if (*pass) { - int ret; - - use_in_memory_ccache(); - ret = kerberos_kinit_password(user, pass, 0 /* no time correction for now */); - - if (ret){ - DEBUG(0, ("Kinit failed: %s\n", error_message(ret))); - return False; - } - } - if (got_kerberos_mechanism && cli->use_kerberos) { + if (*pass) { + int ret; + + use_in_memory_ccache(); + ret = kerberos_kinit_password(user, pass, 0 /* no time correction for now */); + + if (ret){ + DEBUG(0, ("Kinit failed: %s\n", error_message(ret))); + return False; + } + } + return cli_session_setup_kerberos(cli, principal, workgroup); } #endif -- cgit From 9e3198cca7068c5125542d661013c7ea48fb7106 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Feb 2003 11:30:09 +0000 Subject: Fix logfile formatting, we were missing a "\n" (This used to be commit 53b8f8a44141a9f6d36ed1b237ff65c67119edd0) --- source3/smbd/service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/smbd/service.c b/source3/smbd/service.c index f9d84872d7..1c7e4017b0 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -364,14 +364,14 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser, } else if (vuser) { if (vuser->guest) { if (!lp_guest_ok(snum)) { - DEBUG(2, ("guest user (from session setup) not permitted to access this share (%s)", lp_servicename(snum))); + DEBUG(2, ("guest user (from session setup) not permitted to access this share (%s)\n", lp_servicename(snum))); conn_free(conn); *status = NT_STATUS_ACCESS_DENIED; return NULL; } } else { if (!user_ok(vuser->user.unix_name, snum, vuser->groups, vuser->n_groups)) { - DEBUG(2, ("user '%s' (from session setup) not permitted to access this share (%s)", vuser->user.unix_name, lp_servicename(snum))); + DEBUG(2, ("user '%s' (from session setup) not permitted to access this share (%s)\n", vuser->user.unix_name, lp_servicename(snum))); conn_free(conn); *status = NT_STATUS_ACCESS_DENIED; return NULL; -- cgit From 231f7375590110046ed67b7b337ac2e12d257736 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Feb 2003 11:30:52 +0000 Subject: After a talloc_zero(), we don't need to ZERO_STRUCTP too.. (This used to be commit 4fe8066394143c64c79c052c00f0d747e872103a) --- source3/libsmb/ntlmssp.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source3/libsmb/ntlmssp.c b/source3/libsmb/ntlmssp.c index e4398dad17..e1509f6b63 100644 --- a/source3/libsmb/ntlmssp.c +++ b/source3/libsmb/ntlmssp.c @@ -307,8 +307,6 @@ NTSTATUS ntlmssp_server_start(NTLMSSP_STATE **ntlmssp_state) return NT_STATUS_NO_MEMORY; } - ZERO_STRUCTP(*ntlmssp_state); - (*ntlmssp_state)->mem_ctx = mem_ctx; (*ntlmssp_state)->get_challenge = get_challenge; @@ -552,8 +550,6 @@ NTSTATUS ntlmssp_client_start(NTLMSSP_CLIENT_STATE **ntlmssp_state) return NT_STATUS_NO_MEMORY; } - ZERO_STRUCTP(*ntlmssp_state); - (*ntlmssp_state)->mem_ctx = mem_ctx; (*ntlmssp_state)->get_global_myname = global_myname; -- cgit From 1f1125577c000ab72754af00cd83c57fadcc85f1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Feb 2003 11:33:35 +0000 Subject: Move to a in-memory ccache for winbind, and replace setenv() properly. (According to the manpages, you cannot put a stack variable into putenv()). Yes, this leaks memory. Andrew Bartlett (This used to be commit 50bced1e26434ecc7474964062746e2831e5f433) --- source3/include/includes.h | 4 ++++ source3/lib/replace.c | 18 ++++++++++++++++++ source3/nsswitch/winbindd.h | 14 -------------- source3/nsswitch/winbindd_ads.c | 4 +--- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/source3/include/includes.h b/source3/include/includes.h index bb78ae0780..731d94996c 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -966,6 +966,10 @@ size_t strnlen(const char *s, size_t n); unsigned long strtoul(const char *nptr, char **endptr, int base); #endif +#ifndef HAVE_SETENV +int setenv(const char *name, const char *value, int overwrite); +#endif + #if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL)) /* stupid glibc */ int setresuid(uid_t ruid, uid_t euid, uid_t suid); diff --git a/source3/lib/replace.c b/source3/lib/replace.c index cd48b8d160..0c62ec9bfa 100644 --- a/source3/lib/replace.c +++ b/source3/lib/replace.c @@ -447,3 +447,21 @@ char *rep_inet_ntoa(struct in_addr ip) return t; } #endif + +#ifndef HAVE_SETENV + int setenv(const char *name, const char *value, int overwrite) +{ + char *p = NULL; + int ret = -1; + + asprintf(&p, "%s=%s", name, value); + + if (overwrite || getenv(name)) { + if (p) ret = putenv(p); + } else { + ret = 0; + } + + return ret; +} +#endif diff --git a/source3/nsswitch/winbindd.h b/source3/nsswitch/winbindd.h index e8bcf76bd3..164b7ffda7 100644 --- a/source3/nsswitch/winbindd.h +++ b/source3/nsswitch/winbindd.h @@ -205,18 +205,4 @@ typedef struct { #define DOM_SEQUENCE_NONE ((uint32)-1) -/* SETENV */ -#if HAVE_SETENV -#define SETENV(name, value, overwrite) setenv(name,value,overwrite) -#elif HAVE_PUTENV -#define SETENV(name, value, overwrite) \ -{ \ - fstring envvar; \ - slprintf(envvar, sizeof(fstring), "%s=%s", name, value); \ - putenv(envvar); \ -} -#else -#define SETENV(name, value, overwrite) ; -#endif - #endif /* _WINBINDD_H */ diff --git a/source3/nsswitch/winbindd_ads.c b/source3/nsswitch/winbindd_ads.c index 7cea4aa716..be4ed1c667 100644 --- a/source3/nsswitch/winbindd_ads.c +++ b/source3/nsswitch/winbindd_ads.c @@ -46,9 +46,7 @@ static ADS_STRUCT *ads_cached_connection(struct winbindd_domain *domain) } /* we don't want this to affect the users ccache */ - ccache = lock_path("winbindd_ccache"); - SETENV("KRB5CCNAME", ccache, 1); - unlink(ccache); + setenv("KRB5CCNAME", "MEMORY:winbind_ccache", 1); ads = ads_init(domain->alt_name, domain->name, NULL); if (!ads) { -- cgit From 39daab943dbf2f24d3d74fba5a8d76ef58b7dabf Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Feb 2003 11:35:02 +0000 Subject: Check return values of various join-related functions, and ensure we always compare push_* returns with (size_t)-1, not < 0. Andrew Bartlett (This used to be commit 63f5e92536c6bcac54b796d6e91b755e7d328f66) --- source3/libads/ldap.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index c92e481078..b7cfc8d84c 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -426,10 +426,10 @@ ADS_STATUS ads_do_paged_search(ADS_STRUCT *ads, const char *bind_path, return ADS_ERROR(LDAP_NO_MEMORY); /* 0 means the conversion worked but the result was empty - so we only fail if it's negative. In any case, it always + so we only fail if it's -1. In any case, it always at least nulls out the dest */ - if ((push_utf8_talloc(ctx, &utf8_exp, exp) < 0) || - (push_utf8_talloc(ctx, &utf8_path, bind_path) < 0)) { + if ((push_utf8_talloc(ctx, &utf8_exp, exp) == (size_t)-1) || + (push_utf8_talloc(ctx, &utf8_path, bind_path) == (size_t)-1)) { rc = LDAP_NO_MEMORY; goto done; } @@ -652,8 +652,8 @@ ADS_STATUS ads_do_search(ADS_STRUCT *ads, const char *bind_path, int scope, /* 0 means the conversion worked but the result was empty so we only fail if it's negative. In any case, it always at least nulls out the dest */ - if ((push_utf8_talloc(ctx, &utf8_exp, exp) < 0) || - (push_utf8_talloc(ctx, &utf8_path, bind_path) < 0)) { + if ((push_utf8_talloc(ctx, &utf8_exp, exp) == (size_t)-1) || + (push_utf8_talloc(ctx, &utf8_path, bind_path) == (size_t)-1)) { DEBUG(1,("ads_do_search: push_utf8_talloc() failed!")); rc = LDAP_NO_MEMORY; goto done; @@ -1432,8 +1432,8 @@ ADS_STATUS ads_set_machine_sd(ADS_STRUCT *ads, const char *hostname, char *dn) NTSTATUS status; ADS_STATUS ret; DOM_SID sid; - SEC_DESC *psd = 0; - TALLOC_CTX *ctx = 0; + SEC_DESC *psd = NULL; + TALLOC_CTX *ctx = NULL; /* Avoid segmentation fault in prs_mem_free if * we have to bail out before prs_init */ @@ -1464,7 +1464,11 @@ ADS_STATUS ads_set_machine_sd(ADS_STRUCT *ads, const char *hostname, char *dn) goto ads_set_sd_error; } - ads_pull_sid(ads, msg, attrs[1], &sid); + if (!ads_pull_sid(ads, msg, attrs[1], &sid)) { + ret = ADS_ERROR_NT(NT_STATUS_INVALID_PARAMETER); + goto ads_set_sd_error; + } + if (!(ctx = talloc_init("sec_io_desc"))) { ret = ADS_ERROR(LDAP_NO_MEMORY); goto ads_set_sd_error; @@ -1482,7 +1486,10 @@ ADS_STATUS ads_set_machine_sd(ADS_STRUCT *ads, const char *hostname, char *dn) goto ads_set_sd_error; } - prs_init(&ps_wire, sd_size, ctx, MARSHALL); + if (!prs_init(&ps_wire, sd_size, ctx, MARSHALL)) { + ret = ADS_ERROR_NT(NT_STATUS_NO_MEMORY); + } + if (!sec_io_desc("sd_wire", &psd, &ps_wire, 1)) { ret = ADS_ERROR(LDAP_NO_MEMORY); goto ads_set_sd_error; -- cgit From 51521fab16c9982200c3c5cd829629a541eb6e29 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Feb 2003 12:05:21 +0000 Subject: Now we have setenv() in replace.c, we don't need a seperate copy here. Andrew Bartlett (This used to be commit c4834c46902380455d2ea1dd62661224e8d4eb11) --- source3/smbwrapper/smbsh.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source3/smbwrapper/smbsh.c b/source3/smbwrapper/smbsh.c index f9697223c4..d853aa1afc 100644 --- a/source3/smbwrapper/smbsh.c +++ b/source3/smbwrapper/smbsh.c @@ -92,7 +92,7 @@ int main(int argc, char *argv[]) smbw_setshared("PASSWORD", p); } - smbw_setenv("PS1", "smbsh$ "); + setenv("PS1", "smbsh$ "); sys_getwd(wd); @@ -101,18 +101,18 @@ int main(int argc, char *argv[]) smbw_setshared(line, wd); slprintf(line,sizeof(line)-1,"%s/smbwrapper.so", libd); - smbw_setenv("LD_PRELOAD", line); + etenv("LD_PRELOAD", line); slprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so", libd); if (file_exist(line, NULL)) { slprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so:DEFAULT", libd); - smbw_setenv("_RLD_LIST", line); + setenv("_RLD_LIST", line); slprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd); - smbw_setenv("_RLDN32_LIST", line); + setenv("_RLDN32_LIST", line); } else { slprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd); - smbw_setenv("_RLD_LIST", line); + setenv("_RLD_LIST", line); } { -- cgit From 6540693fea3a61795801cfccd988b5552b8b307f Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Feb 2003 12:19:52 +0000 Subject: Missed one use of SETENV. (Compat macro no longer needed, as we have a replace.c function). (This used to be commit adad4c66fcfe756277de8c325ac9f8010f9d6f9c) --- source3/nsswitch/winbindd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index ddda2d5f8b..09b89462ec 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -790,7 +790,7 @@ static void usage(void) /* Set environment variable so we don't recursively call ourselves. This may also be useful interactively. */ - SETENV(WINBINDD_DONT_ENV, "1", 1); + setenv(WINBINDD_DONT_ENV, "1", 1); /* Initialise samba/rpc client stuff */ -- cgit From 02cb49bffae34d0f373f5d400077a7a8b7e809b2 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Wed, 19 Feb 2003 13:24:06 +0000 Subject: Improve detection of iconv(3) for various platforms. M4 code is similar to what I use in Midgard for past few years, modified for Samba needs. (This used to be commit 747d2d70a9eb4d9222d7b63e5fcec269eda76672) --- source3/aclocal.m4 | 92 ++++++++++++++++++++++++++++++++++++++++++++++ source3/configure.in | 60 +++++++++++++++++++++--------- source3/include/includes.h | 5 +++ 3 files changed, 140 insertions(+), 17 deletions(-) diff --git a/source3/aclocal.m4 b/source3/aclocal.m4 index 5b1500106c..345be73aed 100644 --- a/source3/aclocal.m4 +++ b/source3/aclocal.m4 @@ -485,3 +485,95 @@ AC_DEFUN(LIB_REMOVE_USR_LIB,[ done $1=[$]ac_new_flags ]) + +dnl From Bruno Haible. + +AC_DEFUN(jm_ICONV, +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable libiconv installed). + AC_MSG_CHECKING(for iconv in $1) + jm_cv_func_iconv="no" + jm_cv_lib_iconv=no + jm_cv_giconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + jm_cv_func_iconv=yes + jm_cv_giconv=yes) + + if test "$jm_cv_func_iconv" != yes; then + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + jm_cv_func_iconv=yes) + + if test "$jm_cv_lib_iconv" != yes; then + jm_save_LIBS="$LIBS" + LIBS="$LIBS -lgiconv" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + jm_cv_lib_iconv=yes + jm_cv_func_iconv=yes + jm_cv_giconv=yes) + LIBS="$jm_save_LIBS" + + if test "$jm_cv_func_iconv" != yes; then + jm_save_LIBS="$LIBS" + LIBS="$LIBS -liconv" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + jm_cv_lib_iconv=yes + jm_cv_func_iconv=yes) + LIBS="$jm_save_LIBS" + fi + fi + fi + + if test "$jm_cv_func_iconv" = yes; then + if test "$jm_cv_giconv" = yes; then + AC_DEFINE(HAVE_GICONV, 1, [What header to include for iconv() function: giconv.h]) + AC_MSG_RESULT(yes) + ICONV_FOUND=yes + else + AC_DEFINE(HAVE_ICONV, 1, [What header to include for iconv() function: iconv.h]) + AC_MSG_RESULT(yes) + ICONV_FOUND=yes + fi + else + AC_MSG_RESULT(no) + fi + if test "$jm_cv_lib_iconv" = yes; then + if test "$jm_cv_giconv" = yes; then + LIBS="$LIBS -lgiconv" + else + LIBS="$LIBS -liconv" + fi + fi +]) + +dnl CFLAGS_ADD_DIR(CFLAGS, $INCDIR) +dnl This function doesn't add -I/usr/include into CFLAGS +AC_DEFUN(CFLAGS_ADD_DIR,[ +if test "$2" != "/usr/include" ; then + $1="$$1 -I$2" +fi +]) + +dnl LIB_ADD_DIR(LDFLAGS, $LIBDIR) +dnl This function doesn't add -L/usr/lib into LDFLAGS +AC_DEFUN(LIB_ADD_DIR,[ +if test "$2" != "/usr/lib" ; then + $1="$$1 -L$2" +fi +]) diff --git a/source3/configure.in b/source3/configure.in index b90d99bf3d..dfd97bc42f 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -1482,26 +1482,47 @@ if test x"$samba_cv_HAVE_UX_UT_SYSLEN" = x"yes"; then fi -################################################# -# check for libiconv support -AC_MSG_CHECKING(whether to use libiconv) +ICONV_LOCATION=standard +LOOK_DIRS="/usr /usr/local /sw" AC_ARG_WITH(libiconv, [ --with-libiconv=BASEDIR Use libiconv in BASEDIR/lib and BASEDIR/include (default=auto) ], -[ case "$withval" in - no) - AC_MSG_RESULT(no) - ;; - *) - AC_MSG_RESULT(yes) - CFLAGS="$CFLAGS -I$withval/include" - LDFLAGS="$LDFLAGS -L$withval/lib" - AC_CHECK_LIB(iconv, iconv_open) - AC_DEFINE_UNQUOTED(WITH_LIBICONV, "${withval}",[Path to iconv]) - ;; - esac ], - AC_MSG_RESULT(no) -) +[ + if test "$withval" = "no" ; then + AC_MSG_ERROR(I won't take no for an answer) + else + if test "$withval" != "yes" ; then + LOOK_DIRS="$withval $LOOK_DIRS" + fi + fi +]) +ICONV_FOUND="no" +for i in $LOOK_DIRS ; do + save_LIBS=$LIBS + save_LDFLAGS=$LDFLAGS + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="-I$i/include" + LDFLAGS="-L$i/lib" + LIBS= + export LDFLAGS LIBS CPPFLAGS +dnl Try to find iconv(3) + jm_ICONV($i) + + CPPFLAGS=$save_CPPFLAGS + if test -n "$ICONV_FOUND" ; then + LDFLAGS=$save_LDFLAGS + LIB_ADD_DIR(LDFLAGS, "$i/lib") + CFLAGS_ADD_DIR(CPPFLAGS, "$i/include") + LIBS="$save_LIBS $LIBS" + ICONV_LOCATION=$i + export LDFLAGS LIBS CPPFLAGS + break + else + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + export LDFLAGS LIBS CPPFLAGS + fi +done ############ # check for iconv in libc @@ -1519,6 +1540,11 @@ if test x"$samba_cv_HAVE_NATIVE_ICONV" = x"yes"; then AC_DEFINE(HAVE_NATIVE_ICONV,1,[Whether to use native iconv]) fi +if test x"$ICONV_FOUND" = x"no" -o x"$samba_cv_HAVE_NATIVE_ICONV" != x"yes" ; then + AC_MSG_WARN([Sufficient support for iconv function was not found. + Install libiconv from http://freshmeat.net/projects/libiconv/ for better charset compatibility!]) +fi + AC_CACHE_CHECK([for Linux kernel oplocks],samba_cv_HAVE_KERNEL_OPLOCKS_LINUX,[ AC_TRY_RUN([ diff --git a/source3/include/includes.h b/source3/include/includes.h index 731d94996c..0d1c72cf1c 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -393,8 +393,13 @@ #endif /* HAVE_SYS_SHM_H */ #ifdef HAVE_NATIVE_ICONV +#ifdef HAVE_ICONV #include #endif +#ifdef HAVE_GICONV +#include +#endif +#endif #if HAVE_KRB5_H #include -- cgit From ad03d0a4f885a87b5dbe7c88e507b302cf06ece2 Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 15:03:04 +0000 Subject: Fix segv in net ads join...an extra & was the culprit (This used to be commit 9874b233d55a0b1aea7eb033848f4b63a531833b) --- source3/libads/ldap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index b7cfc8d84c..67669fc078 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -1506,7 +1506,7 @@ ADS_STATUS ads_set_machine_sd(ADS_STRUCT *ads, const char *hostname, char *dn) ret = ADS_ERROR(LDAP_NO_MEMORY); goto ads_set_sd_error; } - prs_copy_all_data_out((char *)&bval.bv_val, &ps_wire); + prs_copy_all_data_out(bval.bv_val, &ps_wire); ads_mod_ber(ctx, &mods, attrs[0], &bval); ret = ads_gen_mod(ads, dn, mods); -- cgit From ffcee0c95e05f652f4eebf9b9d46bd51d059891b Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 15:22:46 +0000 Subject: Correct way to keep fucntion from proto.h (This used to be commit 762b072efb0d6801775a874494cb19ea3d61fa97) --- source3/include/includes.h | 2 +- source3/libsmb/clikrb5.c | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/source3/include/includes.h b/source3/include/includes.h index 0d1c72cf1c..5b4c5a695f 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -1238,7 +1238,7 @@ void get_auth_data_from_tkt(DATA_BLOB *auth_data, krb5_ticket *tkt); krb5_const_principal get_principal_from_tkt(krb5_ticket *tkt); krb5_error_code krb5_locate_kdc(krb5_context ctx, const krb5_data *realm, struct sockaddr **addr_pp, int *naddrs, int get_masters); krb5_error_code get_kerberos_allowed_etypes(krb5_context context, krb5_enctype **enctypes); -krb5_error_code free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes); +void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes); #endif /* HAVE_KRB5 */ #endif /* _INCLUDES_H */ diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index 2e07dfdb66..da120622ea 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -127,17 +127,14 @@ krb5_error_code get_kerberos_allowed_etypes(krb5_context context, __ERROR_XX_UNKNOWN_GET_ENCTYPES_FUNCTIONS #endif - /* the following is defined as krb5_error_code to keep it from - being sucked into proto.h */ -krb5_error_code free_kerberos_etypes(krb5_context context, - krb5_enctype *enctypes) + void free_kerberos_etypes(krb5_context context, + krb5_enctype *enctypes) { #if defined(HAVE_KRB5_FREE_KTYPES) - krb5_free_ktypes(context, enctypes); + return krb5_free_ktypes(context, enctypes); #else - SAFE_FREE(enctypes); + return SAFE_FREE(enctypes); #endif - return 0; } #if defined(HAVE_KRB5_AUTH_CON_SETKEY) && !defined(HAVE_KRB5_AUTH_CON_SETUSERUSERKEY) -- cgit From f15ed71fbba9d3762f4e8a1382b65d6291a2a065 Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 15:46:15 +0000 Subject: Can't return SAFE_FREE...put on its own line. (This used to be commit 9f1a4809b503f050189d5f87a294b7d8675b1e95) --- source3/libsmb/clikrb5.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index da120622ea..96e737166c 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -133,7 +133,8 @@ krb5_error_code get_kerberos_allowed_etypes(krb5_context context, #if defined(HAVE_KRB5_FREE_KTYPES) return krb5_free_ktypes(context, enctypes); #else - return SAFE_FREE(enctypes); + SAFE_FREE(enctypes); + return; #endif } -- cgit From de88e704ceb74e4811f14845556d65449f9d592b Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Wed, 19 Feb 2003 20:37:34 +0000 Subject: libads/krb5_setpw.c (This used to be commit 4c52d7bd933f61bdba3d4159a204fe16db3d4f0f) --- source3/libads/krb5_setpw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/libads/krb5_setpw.c b/source3/libads/krb5_setpw.c index c3ec754e39..9d8fb8d24c 100644 --- a/source3/libads/krb5_setpw.c +++ b/source3/libads/krb5_setpw.c @@ -327,7 +327,8 @@ static krb5_error_code parse_setpw_reply(krb5_context context, return KRB5KDC_ERR_BADOPTION; break; case KRB5_KPASSWD_INITIAL_FLAG_NEEDED: - return KV5M_ALT_METHOD; + return KRB5KDC_ERR_BADOPTION; + /* return KV5M_ALT_METHOD; MIT-only define */ break; case KRB5_KPASSWD_ETYPE_NOSUPP: return KRB5KDC_ERR_ETYPE_NOSUPP; -- cgit From 29b94266df3df046bc545a466a9b505edd8b7ca8 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 19 Feb 2003 22:26:19 +0000 Subject: correct init for vfs.conn, thanks Stefan (This used to be commit 162683d2b5c15016fe1423876589573b48b9f5a6) --- source3/torture/vfstest.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/torture/vfstest.c b/source3/torture/vfstest.c index fef189844b..fd1f83109e 100644 --- a/source3/torture/vfstest.c +++ b/source3/torture/vfstest.c @@ -546,7 +546,8 @@ int main(int argc, char *argv[]) } /* some basic initialization stuff */ - vfs.conn = (struct connection_struct *)malloc(sizeof(struct connection_struct)); + conn_init(); + vfs.conn = conn_new(); vfs.conn->user = "vfstest"; for (i=0; i < 1024; i++) vfs.files[i] = NULL; -- cgit From 673cdea310f8447b138cd0c30b5c2313f5c9afe9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 19 Feb 2003 22:30:57 +0000 Subject: Fix inspired by Stefan (metze) Metzmacher - cache the sidtype also. Jeremy. (This used to be commit 634f20dff63d255c317f9dcc9f4caf4e8e79123c) --- source3/smbd/uid.c | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/source3/smbd/uid.c b/source3/smbd/uid.c index 4ebee75a15..6ac3528b1a 100644 --- a/source3/smbd/uid.c +++ b/source3/smbd/uid.c @@ -551,19 +551,21 @@ static struct uid_sid_cache { struct uid_sid_cache *next, *prev; uid_t uid; DOM_SID sid; + enum SID_NAME_USE sidtype; } *uid_sid_cache_head; static struct gid_sid_cache { struct gid_sid_cache *next, *prev; gid_t gid; DOM_SID sid; + enum SID_NAME_USE sidtype; } *gid_sid_cache_head; /***************************************************************** Find a SID given a uid. *****************************************************************/ -static BOOL fetch_sid_from_uid_cache(DOM_SID *psid, uid_t uid) +static BOOL fetch_sid_from_uid_cache(DOM_SID *psid, enum SID_NAME_USE *psidtype, uid_t uid) { struct uid_sid_cache *pc; @@ -571,6 +573,7 @@ static BOOL fetch_sid_from_uid_cache(DOM_SID *psid, uid_t uid) if (pc->uid == uid) { fstring sid; *psid = pc->sid; + *psidtype = pc->sidtype; DEBUG(3,("fetch sid from uid cache %u -> %s\n", (unsigned int)uid, sid_to_string(sid, psid))); DLIST_PROMOTE(uid_sid_cache_head, pc); @@ -584,7 +587,7 @@ static BOOL fetch_sid_from_uid_cache(DOM_SID *psid, uid_t uid) Find a uid given a SID. *****************************************************************/ -static BOOL fetch_uid_from_cache(uid_t *puid, const DOM_SID *psid) +static BOOL fetch_uid_from_cache(uid_t *puid, const DOM_SID *psid, enum SID_NAME_USE sidtype) { struct uid_sid_cache *pc; @@ -605,7 +608,7 @@ static BOOL fetch_uid_from_cache(uid_t *puid, const DOM_SID *psid) Store uid to SID mapping in cache. *****************************************************************/ -static void store_uid_sid_cache(const DOM_SID *psid, uid_t uid) +static void store_uid_sid_cache(const DOM_SID *psid, const enum SID_NAME_USE sidtype, uid_t uid) { struct uid_sid_cache *pc; @@ -629,6 +632,7 @@ static void store_uid_sid_cache(const DOM_SID *psid, uid_t uid) return; pc->uid = uid; sid_copy(&pc->sid, psid); + pc->sidtype = sidtype; DLIST_ADD(uid_sid_cache_head, pc); n_uid_sid_cache++; } @@ -637,7 +641,7 @@ static void store_uid_sid_cache(const DOM_SID *psid, uid_t uid) Find a SID given a gid. *****************************************************************/ -static BOOL fetch_sid_from_gid_cache(DOM_SID *psid, gid_t gid) +static BOOL fetch_sid_from_gid_cache(DOM_SID *psid, enum SID_NAME_USE *psidtype, gid_t gid) { struct gid_sid_cache *pc; @@ -645,6 +649,7 @@ static BOOL fetch_sid_from_gid_cache(DOM_SID *psid, gid_t gid) if (pc->gid == gid) { fstring sid; *psid = pc->sid; + *psidtype = pc->sidtype; DEBUG(3,("fetch sid from gid cache %u -> %s\n", (unsigned int)gid, sid_to_string(sid, psid))); DLIST_PROMOTE(gid_sid_cache_head, pc); @@ -658,7 +663,7 @@ static BOOL fetch_sid_from_gid_cache(DOM_SID *psid, gid_t gid) Find a gid given a SID. *****************************************************************/ -static BOOL fetch_gid_from_cache(gid_t *pgid, const DOM_SID *psid) +static BOOL fetch_gid_from_cache(gid_t *pgid, const DOM_SID *psid, enum SID_NAME_USE sidtype) { struct gid_sid_cache *pc; @@ -679,7 +684,7 @@ static BOOL fetch_gid_from_cache(gid_t *pgid, const DOM_SID *psid) Store gid to SID mapping in cache. *****************************************************************/ -static void store_gid_sid_cache(const DOM_SID *psid, gid_t gid) +static void store_gid_sid_cache(const DOM_SID *psid, const enum SID_NAME_USE sidtype, gid_t gid) { struct gid_sid_cache *pc; @@ -703,6 +708,7 @@ static void store_gid_sid_cache(const DOM_SID *psid, gid_t gid) return; pc->gid = gid; sid_copy(&pc->sid, psid); + pc->sidtype = sidtype; DLIST_ADD(gid_sid_cache_head, pc); n_gid_sid_cache++; } @@ -717,9 +723,10 @@ static void store_gid_sid_cache(const DOM_SID *psid, gid_t gid) DOM_SID *uid_to_sid(DOM_SID *psid, uid_t uid) { uid_t low, high; + enum SID_NAME_USE sidtype; fstring sid; - if (fetch_sid_from_uid_cache(psid, uid)) + if (fetch_sid_from_uid_cache(psid, &sidtype, uid)) return psid; if (lp_winbind_uid(&low, &high) && uid >= low && uid <= high) { @@ -729,7 +736,7 @@ DOM_SID *uid_to_sid(DOM_SID *psid, uid_t uid) (unsigned int)uid, sid_to_string(sid, psid))); if (psid) - store_uid_sid_cache(psid, uid); + store_uid_sid_cache(psid, SID_NAME_USER, uid); return psid; } } @@ -741,7 +748,7 @@ DOM_SID *uid_to_sid(DOM_SID *psid, uid_t uid) DEBUG(10,("uid_to_sid: local %u -> %s\n", (unsigned int)uid, sid_to_string(sid, psid))); if (psid) - store_uid_sid_cache(psid, uid); + store_uid_sid_cache(psid, SID_NAME_USER, uid); return psid; } @@ -755,9 +762,10 @@ DOM_SID *uid_to_sid(DOM_SID *psid, uid_t uid) DOM_SID *gid_to_sid(DOM_SID *psid, gid_t gid) { gid_t low, high; + enum SID_NAME_USE sidtype; fstring sid; - if (fetch_sid_from_gid_cache(psid, gid)) + if (fetch_sid_from_gid_cache(psid, &sidtype, gid)) return psid; if (lp_winbind_gid(&low, &high) && gid >= low && gid <= high) { @@ -767,7 +775,7 @@ DOM_SID *gid_to_sid(DOM_SID *psid, gid_t gid) (unsigned int)gid, sid_to_string(sid, psid))); if (psid) - store_gid_sid_cache(psid, gid); + store_gid_sid_cache(psid, SID_NAME_DOM_GRP, gid); return psid; } } @@ -776,7 +784,7 @@ DOM_SID *gid_to_sid(DOM_SID *psid, gid_t gid) psid = local_gid_to_sid(psid, gid); DEBUG(10,("gid_to_sid: local %u -> %s\n", (unsigned int)gid, sid_to_string(sid, psid))); if (psid) - store_gid_sid_cache(psid, gid); + store_gid_sid_cache(psid, SID_NAME_DOM_GRP, gid); return psid; } @@ -792,7 +800,7 @@ BOOL sid_to_uid(const DOM_SID *psid, uid_t *puid, enum SID_NAME_USE *sidtype) { fstring sid_str; - if (fetch_uid_from_cache(puid, psid)) + if (fetch_uid_from_cache(puid, psid, *sidtype)) return True; /* if we know its local then don't try winbindd */ @@ -802,7 +810,7 @@ BOOL sid_to_uid(const DOM_SID *psid, uid_t *puid, enum SID_NAME_USE *sidtype) result = local_sid_to_uid(puid, psid, sidtype); unbecome_root(); if (result) - store_uid_sid_cache(psid, *puid); + store_uid_sid_cache(psid, *sidtype, *puid); return result; } @@ -853,7 +861,7 @@ BOOL sid_to_uid(const DOM_SID *psid, uid_t *puid, enum SID_NAME_USE *sidtype) result = local_sid_to_uid(puid, psid, sidtype); unbecome_root(); if (result) - store_uid_sid_cache(psid, *puid); + store_uid_sid_cache(psid, *sidtype, *puid); return result; } @@ -861,7 +869,7 @@ BOOL sid_to_uid(const DOM_SID *psid, uid_t *puid, enum SID_NAME_USE *sidtype) sid_to_string(sid_str, psid), (unsigned int)*puid )); - store_uid_sid_cache(psid, *puid); + store_uid_sid_cache(psid, *sidtype, *puid); return True; } @@ -879,7 +887,7 @@ BOOL sid_to_gid(const DOM_SID *psid, gid_t *pgid, enum SID_NAME_USE *sidtype) *sidtype = SID_NAME_UNKNOWN; - if (fetch_gid_from_cache(pgid, psid)) + if (fetch_gid_from_cache(pgid, psid, *sidtype)) return True; /* @@ -893,7 +901,7 @@ BOOL sid_to_gid(const DOM_SID *psid, gid_t *pgid, enum SID_NAME_USE *sidtype) result = local_sid_to_gid(pgid, psid, sidtype); unbecome_root(); if (result) - store_gid_sid_cache(psid, *pgid); + store_gid_sid_cache(psid, *sidtype, *pgid); return result; } @@ -932,7 +940,7 @@ BOOL sid_to_gid(const DOM_SID *psid, gid_t *pgid, enum SID_NAME_USE *sidtype) sid_to_string(sid_str, psid), (unsigned int)*pgid )); - store_gid_sid_cache(psid, *pgid); + store_gid_sid_cache(psid, *sidtype, *pgid); return True; } -- cgit From 9061aae9b4bfed051b4c08b971561297710ef369 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 20 Feb 2003 03:33:20 +0000 Subject: (Merge from APPLIANCE_HEAD) CR1829: Fix memory leak when unpacking 'B' buffers in Python. (PyList_Append creates a new reference to the added object, and so we have to release the existing one.) (This used to be commit 55e114f596e0edfdf176cabdbcfe7f01fae6f8aa) --- source3/python/py_tdbpack.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source3/python/py_tdbpack.c b/source3/python/py_tdbpack.c index 6181a4918e..8aa4ee316a 100644 --- a/source3/python/py_tdbpack.c +++ b/source3/python/py_tdbpack.c @@ -638,6 +638,9 @@ pytdbunpack_buffer(char **pbuf, int *plen, PyObject *val_list) if (PyList_Append(val_list, str_obj) == -1) goto failed; + Py_DECREF(len_obj); + Py_DECREF(str_obj); + return val_list; failed: -- cgit From f8d9cf27266d9ce563011e44281483a4dfd0708f Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 20 Feb 2003 04:01:25 +0000 Subject: Doc (This used to be commit 5d7d400d6c49b195a1174ef40c7bf95065427fbd) --- source3/python/py_tdbpack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/python/py_tdbpack.c b/source3/python/py_tdbpack.c index 8aa4ee316a..243cb44683 100644 --- a/source3/python/py_tdbpack.c +++ b/source3/python/py_tdbpack.c @@ -1,7 +1,7 @@ /* -*- c-file-style: "python"; indent-tabs-mode: nil; -*- Python wrapper for Samba tdb pack/unpack functions - Copyright (C) Martin Pool 2002 + Copyright (C) Martin Pool 2002, 2003 NOTE PYTHON STYLE GUIDE -- cgit From 215ff67a039d3dea516d70d538083db8833f7b7e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 20 Feb 2003 10:43:21 +0000 Subject: for some (very weird) reason, the domain I was testing aginst would not return a DN for the user. Make sure we don't segfault. Andrew Bartlett (This used to be commit 9fdedeff6a3a9f8e8d048e6afd7001ad676c4e91) --- source3/nsswitch/winbindd_ads.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source3/nsswitch/winbindd_ads.c b/source3/nsswitch/winbindd_ads.c index be4ed1c667..9560a53fa0 100644 --- a/source3/nsswitch/winbindd_ads.c +++ b/source3/nsswitch/winbindd_ads.c @@ -490,6 +490,10 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, } user_dn = ads_pull_string(ads, mem_ctx, msg, "distinguishedName"); + if (!user_dn) { + DEBUG(1,("lookup_usergroups(rid=%d) ads_search did not return a a distinguishedName!\n", user_rid)); + goto done; + } if (msg) ads_msgfree(ads, msg); -- cgit From 512405321ac60ae8b1d6dd80139ff9a50add8714 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 20 Feb 2003 10:50:09 +0000 Subject: Like for NTLM logins, lookup the 'winbind' user first, then the 'local' user. This needs to change, to be a SID->UID lookup from the PAC. Andrew Bartlett (This used to be commit 4071ed06a051f87f27e10510427a69fcdf45ddac) --- source3/smbd/sesssetup.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index e408cc88e9..3a3209f172 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -148,6 +148,7 @@ static int reply_spnego_kerberos(connection_struct *conn, DATA_BLOB auth_data; auth_serversupplied_info *server_info = NULL; ADS_STRUCT *ads; + BOOL foreign = False; if (!spnego_parse_krb5_wrap(*secblob, &ticket)) { return ERROR_NT(NT_STATUS_LOGON_FAILURE); @@ -185,12 +186,20 @@ static int reply_spnego_kerberos(connection_struct *conn, if (!lp_allow_trusted_domains()) { return ERROR_NT(NT_STATUS_LOGON_FAILURE); } - /* this gives a fully qualified user name (ie. with full realm). - that leads to very long usernames, but what else can we do? */ - asprintf(&user, "%s%s%s", p+1, lp_winbind_separator(), client); - } else { - user = strdup(client); + foreign = True; + } + + /* this gives a fully qualified user name (ie. with full realm). + that leads to very long usernames, but what else can we do? */ + asprintf(&user, "%s%s%s", p+1, lp_winbind_separator(), client); + + pw = Get_Pwnam(user); + if (!pw && !foreign) { + pw = Get_Pwnam(client); + SAFE_FREE(user); + user = smb_xstrdup(client); } + ads_destroy(&ads); /* setup the string used by %U */ @@ -198,19 +207,6 @@ static int reply_spnego_kerberos(connection_struct *conn, reload_services(True); - /* the password is good - let them in */ - pw = Get_Pwnam(user); - if (!pw && !strstr(user, lp_winbind_separator())) { - char *user2; - /* try it with a winbind domain prefix */ - asprintf(&user2, "%s%s%s", lp_workgroup(), lp_winbind_separator(), user); - pw = Get_Pwnam(user2); - if (pw) { - free(user); - user = user2; - } - } - if (!pw) { DEBUG(1,("Username %s is invalid on this system\n",user)); return ERROR_NT(NT_STATUS_NO_SUCH_USER); -- cgit From d7b4f389e98e6b9cf32965e4ff41d39aa0d2cd4b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 20 Feb 2003 12:01:39 +0000 Subject: For a number of months now, support for being a domain member without also running winbind has been broken. This fixes that, by removing assumptions about being able to call sid_to_uid() at will. This whole area needs revising when we get groups into the PDB. Andrew Bartlett (This used to be commit 980eda74b7df347c38b567ce976197826963324a) --- source3/auth/auth_util.c | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c index 5218467dab..352d058f20 100644 --- a/source3/auth/auth_util.c +++ b/source3/auth/auth_util.c @@ -641,34 +641,25 @@ NT_USER_TOKEN *create_nt_token(uid_t uid, gid_t gid, int ngroups, gid_t *groups, * of groups. ******************************************************************************/ -static NTSTATUS get_user_groups_from_local_sam(const DOM_SID *user_sid, +static NTSTATUS get_user_groups_from_local_sam(SAM_ACCOUNT *sampass, int *n_groups, DOM_SID **groups, gid_t **unix_groups) { uid_t uid; - enum SID_NAME_USE snu; - fstring str; + gid_t gid; int n_unix_groups; int i; struct passwd *usr; - + *n_groups = 0; *groups = NULL; - - if (!sid_to_uid(user_sid, &uid, &snu)) { - DEBUG(2, ("get_user_groups_from_local_sam: Failed to convert user SID %s to a uid!\n", - sid_to_string(str, user_sid))); - /* This might be a non-unix account */ - return NT_STATUS_OK; - } - /* - * This is _essential_ to prevent occasional segfaults when - * winbind can't find uid -> username mapping - */ - if (!(usr = getpwuid_alloc(uid))) { - DEBUG(0, ("Couldn't find passdb structure for UID = %d ! Aborting.\n", uid)); + if (!IS_SAM_UNIX_USER(sampass)) { + DEBUG(1, ("user %s does not have a unix identity!\n", pdb_get_username(sampass))); return NT_STATUS_NO_SUCH_USER; - }; + } + + uid = pdb_get_uid(sampass); + gid = pdb_get_gid(sampass); n_unix_groups = groups_max(); if ((*unix_groups = malloc( sizeof(gid_t) * n_unix_groups ) ) == NULL) { @@ -677,7 +668,7 @@ static NTSTATUS get_user_groups_from_local_sam(const DOM_SID *user_sid, return NT_STATUS_NO_MEMORY; } - if (sys_getgrouplist(usr->pw_name, usr->pw_gid, *unix_groups, &n_unix_groups) == -1) { + if (sys_getgrouplist(pdb_get_username(sampass), gid, *unix_groups, &n_unix_groups) == -1) { gid_t *groups_tmp; groups_tmp = Realloc(*unix_groups, sizeof(gid_t) * n_unix_groups); if (!groups_tmp) { @@ -687,7 +678,7 @@ static NTSTATUS get_user_groups_from_local_sam(const DOM_SID *user_sid, } *unix_groups = groups_tmp; - if (sys_getgrouplist(usr->pw_name, usr->pw_gid, *unix_groups, &n_unix_groups) == -1) { + if (sys_getgrouplist(pdb_get_username(sampass), gid, *unix_groups, &n_unix_groups) == -1) { DEBUG(0, ("get_user_groups_from_local_sam: failed to get the unix group list\n")); SAFE_FREE(*unix_groups); passwd_free(&usr); @@ -695,9 +686,7 @@ static NTSTATUS get_user_groups_from_local_sam(const DOM_SID *user_sid, } } - debug_unix_user_token(DBGC_CLASS, 5, usr->pw_uid, usr->pw_gid, n_unix_groups, *unix_groups); - - passwd_free(&usr); + debug_unix_user_token(DBGC_CLASS, 5, uid, gid, n_unix_groups, *unix_groups); if (n_unix_groups > 0) { *groups = malloc(sizeof(DOM_SID) * n_unix_groups); @@ -763,7 +752,7 @@ NTSTATUS make_server_info_sam(auth_serversupplied_info **server_info, } if (!NT_STATUS_IS_OK(nt_status - = get_user_groups_from_local_sam(pdb_get_user_sid(sampass), + = get_user_groups_from_local_sam(sampass, &n_groupSIDs, &groupSIDs, &unix_groups))) { DEBUG(4,("get_user_groups_from_local_sam failed\n")); @@ -998,7 +987,7 @@ NTSTATUS make_server_info_info3(TALLOC_CTX *mem_ctx, returned to the caller. */ if (!NT_STATUS_IS_OK(nt_status - = get_user_groups_from_local_sam(&user_sid, + = get_user_groups_from_local_sam(sam_account, &n_lgroupSIDs, &lgroupSIDs, &unix_groups))) -- cgit From 14401bb368464295936bd18fb011d551a36576ce Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 20 Feb 2003 18:54:12 +0000 Subject: Ensure tdb error code is set for corrupt and i/o errors before calling the log function. This allows the log function to take action. Jeremy. (This used to be commit 0fa310cbc3f7ced0b15be0ffaeb70dc82e1d5d12) --- source3/tdb/tdb.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/source3/tdb/tdb.c b/source3/tdb/tdb.c index 8410538f01..097209ff7a 100644 --- a/source3/tdb/tdb.c +++ b/source3/tdb/tdb.c @@ -205,6 +205,11 @@ static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset, if (ret == -1) { if (!probe && lck_type != F_SETLK) { + /* Ensure error code is set for log fun to examine. */ + if (errno == EINTR && palarm_fired && *palarm_fired) + tdb->ecode = TDB_ERR_LOCK_TIMEOUT; + else + tdb->ecode = TDB_ERR_LOCK; TDB_LOG((tdb, 5,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d lck_type=%d\n", tdb->fd, offset, rw_type, lck_type)); } @@ -312,6 +317,8 @@ static int tdb_oob(TDB_CONTEXT *tdb, tdb_off len, int probe) return 0; if (tdb->flags & TDB_INTERNAL) { if (!probe) { + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, 0,"tdb_oob len %d beyond internal malloc size %d\n", (int)len, (int)tdb->map_size)); } @@ -323,6 +330,8 @@ static int tdb_oob(TDB_CONTEXT *tdb, tdb_off len, int probe) if (st.st_size < (size_t)len) { if (!probe) { + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, 0,"tdb_oob len %d beyond eof at %d\n", (int)len, (int)st.st_size)); } @@ -351,6 +360,8 @@ static int tdb_write(TDB_CONTEXT *tdb, tdb_off off, void *buf, tdb_len len) else if (lseek(tdb->fd, off, SEEK_SET) != off || write(tdb->fd, buf, len) != (ssize_t)len) { #endif + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, 0,"tdb_write failed at %d len=%d (%s)\n", off, len, strerror(errno))); return TDB_ERRCODE(TDB_ERR_IO, -1); @@ -372,6 +383,8 @@ static int tdb_read(TDB_CONTEXT *tdb,tdb_off off,void *buf,tdb_len len,int cv) else if (lseek(tdb->fd, off, SEEK_SET) != off || read(tdb->fd, buf, len) != (ssize_t)len) { #endif + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, 0,"tdb_read failed at %d len=%d (%s)\n", off, len, strerror(errno))); return TDB_ERRCODE(TDB_ERR_IO, -1); @@ -387,6 +400,8 @@ static char *tdb_alloc_read(TDB_CONTEXT *tdb, tdb_off offset, tdb_len len) char *buf; if (!(buf = malloc(len))) { + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_OOM; TDB_LOG((tdb, 0,"tdb_alloc_read malloc failed len=%d (%s)\n", len, strerror(errno))); return TDB_ERRCODE(TDB_ERR_OOM, buf); @@ -415,6 +430,8 @@ static int rec_read(TDB_CONTEXT *tdb, tdb_off offset, struct list_struct *rec) if (tdb_read(tdb, offset, rec, sizeof(*rec),DOCONV()) == -1) return -1; if (TDB_BAD_MAGIC(rec)) { + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_CORRUPT; TDB_LOG((tdb, 0,"rec_read bad magic 0x%x at offset=%d\n", rec->magic, offset)); return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); } @@ -443,6 +460,8 @@ static int rec_free_read(TDB_CONTEXT *tdb, tdb_off off, struct list_struct *rec) } if (rec->magic != TDB_FREE_MAGIC) { + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_CORRUPT; TDB_LOG((tdb, 0,"rec_free_read bad magic 0x%x at offset=%d\n", rec->magic, off)); return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); -- cgit From 9d913a62ad8f4bac575a53c362d9d10fd6175c8c Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 20 Feb 2003 19:10:19 +0000 Subject: Remove obsolete files (This used to be commit f035cba2cf5764722318e9cd10dbe7bef56d0732) --- source3/rpcclient/display.c | 1338 ------------------------------------- source3/rpcclient/display_spool.c | 927 ------------------------- source3/rpcclient/samsync.c | 773 --------------------- 3 files changed, 3038 deletions(-) delete mode 100644 source3/rpcclient/display.c delete mode 100644 source3/rpcclient/display_spool.c delete mode 100644 source3/rpcclient/samsync.c diff --git a/source3/rpcclient/display.c b/source3/rpcclient/display.c deleted file mode 100644 index d03465206e..0000000000 --- a/source3/rpcclient/display.c +++ /dev/null @@ -1,1338 +0,0 @@ -/* - Unix SMB/CIFS implementation. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1998 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1998 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" - - -/**************************************************************************** -convert a share mode to a string -****************************************************************************/ -char *get_file_mode_str(uint32 share_mode) -{ - static fstring mode; - - switch (GET_DENY_MODE(share_mode)) - { - case DENY_NONE : fstrcpy(mode, "DENY_NONE "); break; - case DENY_ALL : fstrcpy(mode, "DENY_ALL "); break; - case DENY_DOS : fstrcpy(mode, "DENY_DOS "); break; - case DENY_READ : fstrcpy(mode, "DENY_READ "); break; - case DENY_WRITE: fstrcpy(mode, "DENY_WRITE "); break; - case DENY_FCB: fstrcpy(mode, "DENY_FCB "); break; - default : fstrcpy(mode, "DENY_???? "); break; - } - - switch (share_mode & 0xF) - { - case 0 : fstrcat(mode, "RDONLY"); break; - case 1 : fstrcat(mode, "WRONLY"); break; - case 2 : fstrcat(mode, "RDWR "); break; - default: fstrcat(mode, "R??W??"); break; - } - - return mode; -} - -/**************************************************************************** -convert an oplock mode to a string -****************************************************************************/ -char *get_file_oplock_str(uint32 op_type) -{ - static fstring oplock; - BOOL excl = ((op_type & EXCLUSIVE_OPLOCK) != 0); - BOOL batch = ((op_type & BATCH_OPLOCK ) != 0); - - oplock[0] = 0; - - if (excl ) fstrcat(oplock, "EXCLUSIVE"); - if (excl && batch) fstrcat(oplock, "+"); - if ( batch) fstrcat(oplock, "BATCH"); - if (!excl && !batch) fstrcat(oplock, "NONE"); - - return oplock; -} - -/**************************************************************************** -convert a share type enum to a string -****************************************************************************/ -char *get_share_type_str(uint32 type) -{ - static fstring typestr; - - switch (type) - { - case STYPE_DISKTREE: fstrcpy(typestr, "Disk" ); break; - case STYPE_PRINTQ : fstrcpy(typestr, "Printer"); break; - case STYPE_DEVICE : fstrcpy(typestr, "Device" ); break; - case STYPE_IPC : fstrcpy(typestr, "IPC" ); break; - default : fstrcpy(typestr, "????" ); break; - } - return typestr; -} - -/**************************************************************************** -convert a server type enum to a string -****************************************************************************/ -char *get_server_type_str(uint32 type) -{ - static fstring typestr; - - if (type == SV_TYPE_ALL) - { - fstrcpy(typestr, "All"); - } - else - { - int i; - typestr[0] = 0; - for (i = 0; i < 32; i++) - { - if (type & (1 << i)) - { - switch (((unsigned)1) << i) - { - case SV_TYPE_WORKSTATION : fstrcat(typestr, "Wk " ); break; - case SV_TYPE_SERVER : fstrcat(typestr, "Sv " ); break; - case SV_TYPE_SQLSERVER : fstrcat(typestr, "Sql "); break; - case SV_TYPE_DOMAIN_CTRL : fstrcat(typestr, "PDC "); break; - case SV_TYPE_DOMAIN_BAKCTRL : fstrcat(typestr, "BDC "); break; - case SV_TYPE_TIME_SOURCE : fstrcat(typestr, "Tim "); break; - case SV_TYPE_AFP : fstrcat(typestr, "AFP "); break; - case SV_TYPE_NOVELL : fstrcat(typestr, "Nov "); break; - case SV_TYPE_DOMAIN_MEMBER : fstrcat(typestr, "Dom "); break; - case SV_TYPE_PRINTQ_SERVER : fstrcat(typestr, "PrQ "); break; - case SV_TYPE_DIALIN_SERVER : fstrcat(typestr, "Din "); break; - case SV_TYPE_SERVER_UNIX : fstrcat(typestr, "Unx "); break; - case SV_TYPE_NT : fstrcat(typestr, "NT " ); break; - case SV_TYPE_WFW : fstrcat(typestr, "Wfw "); break; - case SV_TYPE_SERVER_MFPN : fstrcat(typestr, "Mfp "); break; - case SV_TYPE_SERVER_NT : fstrcat(typestr, "SNT "); break; - case SV_TYPE_POTENTIAL_BROWSER: fstrcat(typestr, "PtB "); break; - case SV_TYPE_BACKUP_BROWSER : fstrcat(typestr, "BMB "); break; - case SV_TYPE_MASTER_BROWSER : fstrcat(typestr, "LMB "); break; - case SV_TYPE_DOMAIN_MASTER : fstrcat(typestr, "DMB "); break; - case SV_TYPE_SERVER_OSF : fstrcat(typestr, "OSF "); break; - case SV_TYPE_SERVER_VMS : fstrcat(typestr, "VMS "); break; - case SV_TYPE_WIN95_PLUS : fstrcat(typestr, "W95 "); break; - case SV_TYPE_ALTERNATE_XPORT : fstrcat(typestr, "Xpt "); break; - case SV_TYPE_LOCAL_LIST_ONLY : fstrcat(typestr, "Dom "); break; - case SV_TYPE_DOMAIN_ENUM : fstrcat(typestr, "Loc "); break; - } - } - } - i = strlen(typestr)-1; - if (typestr[i] == ' ') typestr[i] = 0; - - } - return typestr; -} - -/**************************************************************************** -server info level 101 display function -****************************************************************************/ -void display_srv_info_101(FILE *out_hnd, enum action_type action, - SRV_INFO_101 *sv101) -{ - if (sv101 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "Server Info Level 101:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring name; - fstring comment; - - rpcstr_pull(name, sv101->uni_name.buffer, sizeof(name), sv101->uni_name.uni_str_len*2, 0); - rpcstr_pull(comment, sv101->uni_comment.buffer, sizeof(comment), sv101->uni_comment.uni_str_len*2, 0); - - display_server(out_hnd, action, name, sv101->srv_type, comment); - - fprintf(out_hnd, "\tplatform_id : %d\n" , sv101->platform_id); - fprintf(out_hnd, "\tos version : %d.%d\n" , sv101->ver_major, sv101->ver_minor); - - break; - } - case ACTION_FOOTER: - { - break; - } - } - -} - -/**************************************************************************** -server info level 102 display function -****************************************************************************/ -void display_srv_info_102(FILE *out_hnd, enum action_type action,SRV_INFO_102 *sv102) -{ - if (sv102 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "Server Info Level 102:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring name; - fstring comment; - fstring usr_path; - - rpcstr_pull(name, sv102->uni_name.buffer, sizeof(name), sv102->uni_name.uni_str_len*2, 0); - rpcstr_pull(comment, sv102->uni_comment.buffer, sizeof(comment), sv102->uni_comment.uni_str_len*2, 0); - rpcstr_pull(usr_path, sv102->uni_usr_path.buffer, sizeof(usr_path), sv102->uni_usr_path.uni_str_len*2, 0); - - display_server(out_hnd, action, name, sv102->srv_type, comment); - - fprintf(out_hnd, "\tplatform_id : %d\n" , sv102->platform_id); - fprintf(out_hnd, "\tos version : %d.%d\n" , sv102->ver_major, sv102->ver_minor); - - fprintf(out_hnd, "\tusers : %x\n" , sv102->users ); - fprintf(out_hnd, "\tdisc, hidden : %x,%x\n" , sv102->disc , sv102->hidden ); - fprintf(out_hnd, "\tannounce, delta : %d, %d\n", sv102->announce , sv102->ann_delta); - fprintf(out_hnd, "\tlicenses : %d\n" , sv102->licenses ); - fprintf(out_hnd, "\tuser path : %s\n" , usr_path); - - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -server info container display function -****************************************************************************/ -void display_srv_info_ctr(FILE *out_hnd, enum action_type action,SRV_INFO_CTR *ctr) -{ - if (ctr == NULL || ctr->ptr_srv_ctr == 0) - { - fprintf(out_hnd, "Server Information: unavailable due to an error\n"); - return; - } - - switch (ctr->switch_value) - { - case 101: - { - display_srv_info_101(out_hnd, action, &(ctr->srv.sv101)); - break; - } - case 102: - { - display_srv_info_102(out_hnd, action, &(ctr->srv.sv102)); - break; - } - default: - { - fprintf(out_hnd, "Server Information: Unknown Info Level\n"); - break; - } - } -} - -/**************************************************************************** -connection info level 0 display function -****************************************************************************/ -void display_conn_info_0(FILE *out_hnd, enum action_type action, - CONN_INFO_0 *info0) -{ - if (info0 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "Connection Info Level 0:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fprintf(out_hnd, "\tid: %d\n", info0->id); - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 1 display function -****************************************************************************/ -void display_conn_info_1(FILE *out_hnd, enum action_type action, - CONN_INFO_1 *info1, CONN_INFO_1_STR *str1) -{ - if (info1 == NULL || str1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "Connection Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring usr_name; - fstring net_name; - - rpcstr_pull(usr_name, str1->uni_usr_name.buffer, sizeof(usr_name), str1->uni_usr_name.uni_str_len*2,0); - rpcstr_pull(net_name, str1->uni_net_name.buffer, sizeof(net_name), str1->uni_net_name.uni_str_len*2,0); - - fprintf(out_hnd, "\tid : %d\n", info1->id); - fprintf(out_hnd, "\ttype : %s\n", get_share_type_str(info1->type)); - fprintf(out_hnd, "\tnum_opens: %d\n", info1->num_opens); - fprintf(out_hnd, "\tnum_users: %d\n", info1->num_users); - fprintf(out_hnd, "\topen_time: %d\n", info1->open_time); - - fprintf(out_hnd, "\tuser name: %s\n", usr_name); - fprintf(out_hnd, "\tnet name: %s\n", net_name); - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 0 container display function -****************************************************************************/ -void display_srv_conn_info_0_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_0 *ctr) -{ - if (ctr == NULL) - { - fprintf(out_hnd, "display_srv_conn_info_0_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_conn_info_0(out_hnd, ACTION_HEADER , &(ctr->info_0[i])); - display_conn_info_0(out_hnd, ACTION_ENUMERATE, &(ctr->info_0[i])); - display_conn_info_0(out_hnd, ACTION_FOOTER , &(ctr->info_0[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -void display_srv_conn_info_1_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_1 *ctr) -{ - if (ctr == NULL) - { - fprintf(out_hnd, "display_srv_conn_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_conn_info_1(out_hnd, ACTION_HEADER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_conn_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_conn_info_1(out_hnd, ACTION_FOOTER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_CTR *ctr) -{ - if (ctr == NULL || ctr->ptr_conn_ctr == 0) - { - fprintf(out_hnd, "display_srv_conn_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (ctr->switch_value) - { - case 0: - { - display_srv_conn_info_0_ctr(out_hnd, action, - &(ctr->conn.info0)); - break; - } - case 1: - { - display_srv_conn_info_1_ctr(out_hnd, action, - &(ctr->conn.info1)); - break; - } - default: - { - fprintf(out_hnd, "display_srv_conn_info_ctr: Unknown Info Level\n"); - break; - } - } -} - - -/**************************************************************************** -share info level 1 display function -****************************************************************************/ -void display_share_info_1(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_1 *info1) -{ - if (info1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "Share Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring remark ; - fstring net_name; - - rpcstr_pull(net_name, info1->info_1_str.uni_netname.buffer, sizeof(net_name), info1->info_1_str.uni_netname.uni_str_len*2, 0); - rpcstr_pull(remark, info1->info_1_str.uni_remark.buffer, sizeof(remark), info1->info_1_str.uni_remark.uni_str_len*2, 0); - - display_share(out_hnd, action, net_name, info1->info_1.type, remark); - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -share info level 2 display function -****************************************************************************/ -void display_share_info_2(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_2 *info2) -{ - if (info2 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "Share Info Level 2:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring remark ; - fstring net_name; - fstring path ; - fstring passwd ; - - rpcstr_pull(net_name, info2->info_2_str.uni_netname.buffer, sizeof(net_name), info2->info_2_str.uni_netname.uni_str_len*2, 0); - rpcstr_pull(remark, info2->info_2_str.uni_remark.buffer, sizeof(remark), info2->info_2_str.uni_remark.uni_str_len*2, 0); - rpcstr_pull(path, info2->info_2_str.uni_path.buffer, sizeof(path), info2->info_2_str.uni_path.uni_str_len*2, 0); - rpcstr_pull(passwd, info2->info_2_str.uni_passwd.buffer, sizeof(passwd), info2->info_2_str.uni_passwd.uni_str_len*2, 0); - - display_share2(out_hnd, action, net_name, - info2->info_2.type, remark, info2->info_2.perms, - info2->info_2.max_uses, info2->info_2.num_uses, - path, passwd); - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -share info container display function -****************************************************************************/ -void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_CTR *ctr) -{ - if (ctr == NULL) - { - fprintf(out_hnd, "display_srv_share_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries; i++) - { - switch (ctr->info_level) { - case 1: - display_share_info_1(out_hnd, ACTION_HEADER , &(ctr->share.info1[i])); - display_share_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->share.info1[i])); - display_share_info_1(out_hnd, ACTION_FOOTER , &(ctr->share.info1[i])); - break; - case 2: - display_share_info_2(out_hnd, ACTION_HEADER , &(ctr->share.info2[i])); - display_share_info_2(out_hnd, ACTION_ENUMERATE, &(ctr->share.info2[i])); - display_share_info_2(out_hnd, ACTION_FOOTER , &(ctr->share.info2[i])); - break; - default: - fprintf(out_hnd, "display_srv_share_info_ctr: Unknown Info Level\n"); - break; - } - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -file info level 3 display function -****************************************************************************/ -void display_file_info_3(FILE *out_hnd, enum action_type action, - FILE_INFO_3 *info3, FILE_INFO_3_STR *str3) -{ - if (info3 == NULL || str3 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "File Info Level 3:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring path_name; - fstring user_name; - - rpcstr_pull(path_name, str3->uni_path_name.buffer, sizeof(path_name), str3->uni_path_name.uni_str_len*2, 0); - rpcstr_pull(user_name, str3->uni_user_name.buffer, sizeof(user_name), str3->uni_user_name.uni_str_len*2, 0); - - fprintf(out_hnd, "\tid : %d\n", info3->id); - fprintf(out_hnd, "\tperms : %s\n", get_file_mode_str(info3->perms)); - fprintf(out_hnd, "\tnum_locks: %d\n", info3->num_locks); - - fprintf(out_hnd, "\tpath name: %s\n", path_name); - fprintf(out_hnd, "\tuser name: %s\n", user_name); - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -file info level 3 container display function -****************************************************************************/ -void display_srv_file_info_3_ctr(FILE *out_hnd, enum action_type action, - SRV_FILE_INFO_3 *ctr) -{ - if (ctr == NULL) - { - fprintf(out_hnd, "display_srv_file_info_3_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_file_info_3(out_hnd, ACTION_HEADER , &(ctr->info_3[i]), &(ctr->info_3_str[i])); - display_file_info_3(out_hnd, ACTION_ENUMERATE, &(ctr->info_3[i]), &(ctr->info_3_str[i])); - display_file_info_3(out_hnd, ACTION_FOOTER , &(ctr->info_3[i]), &(ctr->info_3_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -file info container display function -****************************************************************************/ -void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action, - SRV_FILE_INFO_CTR *ctr) -{ - if (ctr == NULL || ctr->ptr_file_ctr == 0) - { - fprintf(out_hnd, "display_srv_file_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (ctr->switch_value) - { - case 3: - { - display_srv_file_info_3_ctr(out_hnd, action, - &(ctr->file.info3)); - break; - } - default: - { - fprintf(out_hnd, "display_srv_file_info_ctr: Unknown Info Level\n"); - break; - } - } -} - -/**************************************************************************** - print browse connection on a host - ****************************************************************************/ -void display_server(FILE *out_hnd, enum action_type action, - char *sname, uint32 type, char *comment) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fprintf(out_hnd, "\t%-15.15s%-20s %s\n", - sname, get_server_type_str(type), comment); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -print shares on a host -****************************************************************************/ -void display_share(FILE *out_hnd, enum action_type action, - char *sname, uint32 type, char *comment) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fprintf(out_hnd, "\t%-15.15s%-10.10s%s\n", - sname, get_share_type_str(type), comment); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - - -/**************************************************************************** -print shares on a host, level 2 -****************************************************************************/ -void display_share2(FILE *out_hnd, enum action_type action, - char *sname, uint32 type, char *comment, - uint32 perms, uint32 max_uses, uint32 num_uses, - char *path, char *passwd) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fprintf(out_hnd, "\t%-15.15s%-10.10s%s %x %x %x %s %s\n", - sname, get_share_type_str(type), comment, - perms, max_uses, num_uses, path, passwd); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - - -/**************************************************************************** -print name info -****************************************************************************/ -void display_name(FILE *out_hnd, enum action_type action, - char *sname) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fprintf(out_hnd, "\t%-21.21s\n", sname); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - - -/**************************************************************************** - display group rid info - ****************************************************************************/ -void display_group_rid_info(FILE *out_hnd, enum action_type action, - uint32 num_gids, DOM_GID *gid) -{ - switch (action) - { - case ACTION_HEADER: - { - if (num_gids == 0) - { - fprintf(out_hnd, "\tNo Groups\n"); - } - else - { - fprintf(out_hnd, "\tGroup Info\n"); - fprintf(out_hnd, "\t----------\n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_gids; i++) - { - fprintf(out_hnd, "\tGroup RID: %8x attr: %x\n", - gid[i].g_rid, gid[i].attr); - } - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** - display alias name info - ****************************************************************************/ -void display_alias_name_info(FILE *out_hnd, enum action_type action, - uint32 num_aliases, fstring *alias_name, uint32 *num_als_usrs) -{ - switch (action) - { - case ACTION_HEADER: - { - if (num_aliases == 0) - { - fprintf(out_hnd, "\tNo Aliases\n"); - } - else - { - fprintf(out_hnd, "\tAlias Names\n"); - fprintf(out_hnd, "\t----------- \n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_aliases; i++) - { - fprintf(out_hnd, "\tAlias Name: %s Attributes: %3d\n", - alias_name[i], num_als_usrs[i]); - } - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** - display sam_user_info_21 structure - ****************************************************************************/ -void display_sam_user_info_21(FILE *out_hnd, enum action_type action, SAM_USER_INFO_21 *usr) -{ - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "\tUser Info, Level 0x15\n"); - fprintf(out_hnd, "\t---------------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - pstring tmp; - rpcstr_pull(tmp, usr->uni_user_name.buffer, sizeof(tmp),usr->uni_user_name.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tUser Name : %s\n", tmp); /* username unicode string */ - rpcstr_pull(tmp, usr->uni_full_name.buffer, sizeof(tmp),usr->uni_full_name.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tFull Name : %s\n", tmp); /* user's full name unicode string */ - rpcstr_pull(tmp, usr->uni_home_dir.buffer, sizeof(tmp),usr->uni_home_dir.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tHome Drive : %s\n", tmp); /* home directory unicode string */ - rpcstr_pull(tmp, usr->uni_dir_drive.buffer, sizeof(tmp),usr->uni_dir_drive.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tDir Drive : %s\n", tmp); /* home directory drive unicode string */ - rpcstr_pull(tmp, usr->uni_profile_path.buffer, sizeof(tmp),usr->uni_profile_path.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tProfile Path: %s\n", tmp); /* profile path unicode string */ - rpcstr_pull(tmp, usr->uni_logon_script.buffer, sizeof(tmp),usr->uni_logon_script.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tLogon Script: %s\n", tmp); /* logon script unicode string */ - rpcstr_pull(tmp, usr->uni_acct_desc.buffer, sizeof(tmp),usr->uni_acct_desc.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tDescription : %s\n", tmp); /* user description unicode string */ - rpcstr_pull(tmp, usr->uni_workstations.buffer, sizeof(tmp),usr->uni_workstations.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tWorkstations: %s\n", tmp); /* workstaions unicode string */ - rpcstr_pull(tmp, usr->uni_unknows_str.buffer, sizeof(tmp),usr->uni_unknown_str.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tUnknown Str : %s\n", tmp); /* unknown string unicode string */ - rpcstr_pull(tmp, usr->uni_munged_dial.buffer, sizeof(tmp),usr->uni_munged_dial.uni_str_len*2, 0); - fprintf(out_hnd, "\t\tRemote Dial : %s\n", tmp); /* munged remote access unicode string */ - - fprintf(out_hnd, "\t\tLogon Time : %s\n", http_timestring(nt_time_to_unix(&(usr->logon_time )))); - fprintf(out_hnd, "\t\tLogoff Time : %s\n", http_timestring(nt_time_to_unix(&(usr->logoff_time )))); - fprintf(out_hnd, "\t\tKickoff Time : %s\n", http_timestring(nt_time_to_unix(&(usr->kickoff_time )))); - fprintf(out_hnd, "\t\tPassword last set Time : %s\n", http_timestring(nt_time_to_unix(&(usr->pass_last_set_time )))); - fprintf(out_hnd, "\t\tPassword can change Time : %s\n", http_timestring(nt_time_to_unix(&(usr->pass_can_change_time )))); - fprintf(out_hnd, "\t\tPassword must change Time: %s\n", http_timestring(nt_time_to_unix(&(usr->pass_must_change_time)))); - - fprintf(out_hnd, "\t\tunknown_2[0..31]...\n"); /* user passwords? */ - - fprintf(out_hnd, "\t\tuser_rid : %x\n" , usr->user_rid ); /* User ID */ - fprintf(out_hnd, "\t\tgroup_rid: %x\n" , usr->group_rid); /* Group ID */ - fprintf(out_hnd, "\t\tacb_info : %04x\n", usr->acb_info ); /* Account Control Info */ - - fprintf(out_hnd, "\t\tunknown_3: %08x\n", usr->unknown_3); /* 0x00ff ffff */ - fprintf(out_hnd, "\t\tlogon_divs: %d\n", usr->logon_divs); /* 0x0000 00a8 which is 168 which is num hrs in a week */ - fprintf(out_hnd, "\t\tunknown_5: %08x\n", usr->unknown_5); /* 0x0002 0000 */ - - fprintf(out_hnd, "\t\tpadding1[0..7]...\n"); - - if (usr->ptr_logon_hrs) - { - fprintf(out_hnd, "\t\tlogon_hrs[0..%d]...\n", usr->logon_hrs.len); - } - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** -convert a security permissions into a string -****************************************************************************/ -char *get_sec_mask_str(uint32 type) -{ - static fstring typestr; - int i; - - switch (type) - { - case SEC_RIGHTS_FULL_CONTROL: - { - fstrcpy(typestr, "Full Control"); - return typestr; - } - - case SEC_RIGHTS_READ: - { - fstrcpy(typestr, "Read"); - return typestr; - } - default: - { - break; - } - } - - typestr[0] = 0; - for (i = 0; i < 32; i++) - { - if (type & (1 << i)) - { - switch (((unsigned)1) << i) - { - case SEC_RIGHTS_QUERY_VALUE : fstrcat(typestr, "Query " ); break; - case SEC_RIGHTS_SET_VALUE : fstrcat(typestr, "Set " ); break; - case SEC_RIGHTS_CREATE_SUBKEY : fstrcat(typestr, "Create "); break; - case SEC_RIGHTS_ENUM_SUBKEYS : fstrcat(typestr, "Enum "); break; - case SEC_RIGHTS_NOTIFY : fstrcat(typestr, "Notify "); break; - case SEC_RIGHTS_CREATE_LINK : fstrcat(typestr, "CreateLink "); break; - case SEC_RIGHTS_DELETE : fstrcat(typestr, "Delete "); break; - case SEC_RIGHTS_READ_CONTROL : fstrcat(typestr, "ReadControl "); break; - case SEC_RIGHTS_WRITE_DAC : fstrcat(typestr, "WriteDAC "); break; - case SEC_RIGHTS_WRITE_OWNER : fstrcat(typestr, "WriteOwner "); break; - } - type &= ~(1 << i); - } - } - - /* remaining bits get added on as-is */ - if (type != 0) - { - fstring tmp; - slprintf(tmp, sizeof(tmp)-1, "[%08x]", type); - fstrcat(typestr, tmp); - } - - /* remove last space */ - i = strlen(typestr)-1; - if (typestr[i] == ' ') typestr[i] = 0; - - return typestr; -} - -/**************************************************************************** - display sec_access structure - ****************************************************************************/ -void display_sec_access(FILE *out_hnd, enum action_type action, SEC_ACCESS *info) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fprintf(out_hnd, "\t\tPermissions: %s\n", - get_sec_mask_str(info->mask)); - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display sec_ace structure - ****************************************************************************/ -void display_sec_ace(FILE *out_hnd, enum action_type action, SEC_ACE *ace) -{ - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "\tACE\n"); - break; - } - case ACTION_ENUMERATE: - { - fstring sid_str; - - display_sec_access(out_hnd, ACTION_HEADER , &ace->info); - display_sec_access(out_hnd, ACTION_ENUMERATE, &ace->info); - display_sec_access(out_hnd, ACTION_FOOTER , &ace->info); - - sid_to_string(sid_str, &ace->sid); - fprintf(out_hnd, "\t\tSID: %s\n", sid_str); - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display sec_acl structure - ****************************************************************************/ -void display_sec_acl(FILE *out_hnd, enum action_type action, SEC_ACL *sec_acl) -{ - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "\tACL\tNum ACEs:\t%d\trevision:\t%x\n", - sec_acl->num_aces, sec_acl->revision); - fprintf(out_hnd, "\t---\n"); - - break; - } - case ACTION_ENUMERATE: - { - if (sec_acl->size != 0 && sec_acl->num_aces != 0) - { - int i; - for (i = 0; i < sec_acl->num_aces; i++) - { - display_sec_ace(out_hnd, ACTION_HEADER , &sec_acl->ace[i]); - display_sec_ace(out_hnd, ACTION_ENUMERATE, &sec_acl->ace[i]); - display_sec_ace(out_hnd, ACTION_FOOTER , &sec_acl->ace[i]); - } - } - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display sec_desc structure - ****************************************************************************/ -void display_sec_desc(FILE *out_hnd, enum action_type action, SEC_DESC *sec) -{ - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "\tSecurity Descriptor\trevision:\t%x\ttype:\t%x\n", - sec->revision, sec->type); - fprintf(out_hnd, "\t-------------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring sid_str; - - if (sec->off_sacl != 0) - { - display_sec_acl(out_hnd, ACTION_HEADER , sec->sacl); - display_sec_acl(out_hnd, ACTION_ENUMERATE, sec->sacl); - display_sec_acl(out_hnd, ACTION_FOOTER , sec->sacl); - } - if (sec->off_dacl != 0) - { - display_sec_acl(out_hnd, ACTION_HEADER , sec->dacl); - display_sec_acl(out_hnd, ACTION_ENUMERATE, sec->dacl); - display_sec_acl(out_hnd, ACTION_FOOTER , sec->dacl); - } - if (sec->off_owner_sid != 0) - { - sid_to_string(sid_str, sec->owner_sid); - fprintf(out_hnd, "\tOwner SID:\t%s\n", sid_str); - } - if (sec->off_grp_sid != 0) - { - sid_to_string(sid_str, sec->grp_sid); - fprintf(out_hnd, "\tParent SID:\t%s\n", sid_str); - } - - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** -convert a security permissions into a string -****************************************************************************/ -char *get_reg_val_type_str(uint32 type) -{ - static fstring typestr; - - switch (type) - { - case 0x01: - { - fstrcpy(typestr, "string"); - return typestr; - } - - case 0x03: - { - fstrcpy(typestr, "bytes"); - return typestr; - } - - case 0x04: - { - fstrcpy(typestr, "uint32"); - return typestr; - } - - case 0x07: - { - fstrcpy(typestr, "multi"); - return typestr; - } - default: - { - break; - } - } - slprintf(typestr, sizeof(typestr)-1, "[%d]", type); - return typestr; -} - - -static void print_reg_value(FILE *out_hnd, char *val_name, uint32 val_type, BUFFER2 *value) -{ - fstring type; - pstring intvalue; - fstrcpy(type, get_reg_val_type_str(val_type)); - - switch (val_type) - { - case 0x01: /* unistr */ - { - rpcstr_pull(intvalue, value->buffer, sizeof(intvalue), value->buf_len, 0); - /*fprintf(out_hnd,"\t%s:\t%s:\t%s\n", val_name, type, dos_buffer2_to_str(value));*/ - fprintf(out_hnd,"\t%s:\t%s:\t%s\n", val_name, type, value); - break; - } - - default: /* unknown */ - case 0x03: /* bytes */ - { - if (value->buf_len <= 8) - { - fprintf(out_hnd,"\t%s:\t%s:\t", val_name, type); - out_data(out_hnd, (char*)value->buffer, value->buf_len, 8); - } - else - { - fprintf(out_hnd,"\t%s:\t%s:\n", val_name, type); - out_data(out_hnd, (char*)value->buffer, value->buf_len, 16); - } - break; - } - - case 0x04: /* uint32 */ - { - fprintf(out_hnd,"\t%s:\t%s: 0x%08x\n", val_name, type, buffer2_to_uint32(value)); - break; - } - - case 0x07: /* multiunistr */ - { - fprintf(out_hnd,"\t%s:\t%s:\t%s\n", val_name, type, dos_buffer2_to_multistr(value)); - break; - } - } -} - -/**************************************************************************** - display structure - ****************************************************************************/ -void display_reg_value_info(FILE *out_hnd, enum action_type action, - char *val_name, uint32 val_type, BUFFER2 *value) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - print_reg_value(out_hnd, val_name, val_type, value); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display structure - ****************************************************************************/ -void display_reg_key_info(FILE *out_hnd, enum action_type action, - char *key_name, time_t key_mod_time) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fprintf(out_hnd, "\t%s\t(%s)\n", - key_name, http_timestring(key_mod_time)); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -#if COPY_THIS_TEMPLATE -/**************************************************************************** - display structure - ****************************************************************************/ - void display_(FILE *out_hnd, enum action_type action, *) -{ - switch (action) - { - case ACTION_HEADER: - { - fprintf(out_hnd, "\t\n"); - fprintf(out_hnd, "\t-------------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - break; - } - case ACTION_FOOTER: - { - fprintf(out_hnd, "\n"); - break; - } - } -} - -#endif diff --git a/source3/rpcclient/display_spool.c b/source3/rpcclient/display_spool.c deleted file mode 100644 index b4baf570f1..0000000000 --- a/source3/rpcclient/display_spool.c +++ /dev/null @@ -1,927 +0,0 @@ -/* - Unix SMB/CIFS implementation. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" - -/**************************************************************************** -printer info level 0 display function -****************************************************************************/ -static void display_print_info_0(FILE *out_hnd, PRINTER_INFO_0 *i1) -{ - fstring name; - fstring server; - if (i1 == NULL) - return; - - rpcstr_pull(name, i1->printername.buffer, sizeof(name), 0, STR_TERMINATE); - rpcstr_pull(server, i1->servername.buffer, sizeof(server), 0, STR_TERMINATE); - - report(out_hnd, "\tprintername:[%s]\n", name); - report(out_hnd, "\tservername:[%s]\n", server); - report(out_hnd, "\tcjobs:[%x]\n", i1->cjobs); - report(out_hnd, "\ttotal_jobs:[%x]\n", i1->total_jobs); - - report(out_hnd, "\t:date: [%d]-[%d]-[%d] (%d)\n", i1->year, i1->month, i1->day, i1->dayofweek); - report(out_hnd, "\t:time: [%d]-[%d]-[%d]-[%d]\n", i1->hour, i1->minute, i1->second, i1->milliseconds); - - report(out_hnd, "\tglobal_counter:[%x]\n", i1->global_counter); - report(out_hnd, "\ttotal_pages:[%x]\n", i1->total_pages); - - report(out_hnd, "\tmajorversion:[%x]\n", i1->major_version); - report(out_hnd, "\tbuildversion:[%x]\n", i1->build_version); - - report(out_hnd, "\tunknown7:[%x]\n", i1->unknown7); - report(out_hnd, "\tunknown8:[%x]\n", i1->unknown8); - report(out_hnd, "\tunknown9:[%x]\n", i1->unknown9); - report(out_hnd, "\tsession_counter:[%x]\n", i1->session_counter); - report(out_hnd, "\tunknown11:[%x]\n", i1->unknown11); - report(out_hnd, "\tprinter_errors:[%x]\n", i1->printer_errors); - report(out_hnd, "\tunknown13:[%x]\n", i1->unknown13); - report(out_hnd, "\tunknown14:[%x]\n", i1->unknown14); - report(out_hnd, "\tunknown15:[%x]\n", i1->unknown15); - report(out_hnd, "\tunknown16:[%x]\n", i1->unknown16); - report(out_hnd, "\tchange_id:[%x]\n", i1->change_id); - report(out_hnd, "\tunknown18:[%x]\n", i1->unknown18); - report(out_hnd, "\tstatus:[%x]\n", i1->status); - report(out_hnd, "\tunknown20:[%x]\n", i1->unknown20); - report(out_hnd, "\tc_setprinter:[%x]\n", i1->c_setprinter); - report(out_hnd, "\tunknown22:[%x]\n", i1->unknown22); - report(out_hnd, "\tunknown23:[%x]\n", i1->unknown23); - report(out_hnd, "\tunknown24:[%x]\n", i1->unknown24); - report(out_hnd, "\tunknown25:[%x]\n", i1->unknown25); - report(out_hnd, "\tunknown26:[%x]\n", i1->unknown26); - report(out_hnd, "\tunknown27:[%x]\n", i1->unknown27); - report(out_hnd, "\tunknown28:[%x]\n", i1->unknown28); - report(out_hnd, "\tunknown29:[%x]\n", i1->unknown29); -} - -/**************************************************************************** -printer info level 1 display function -****************************************************************************/ -static void display_print_info_1(FILE *out_hnd, PRINTER_INFO_1 *i1) -{ - fstring desc; - fstring name; - fstring comm; - if (i1 == NULL) - return; - - rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); - rpcstr_pull(desc, i1->description.buffer, sizeof(desc), 0, STR_TERMINATE); - rpcstr_pull(comm, i1->comment.buffer, sizeof(comm), 0, STR_TERMINATE); - - report(out_hnd, "\tflags:[%x]\n", i1->flags); - report(out_hnd, "\tname:[%s]\n", name); - report(out_hnd, "\tdescription:[%s]\n", desc); - report(out_hnd, "\tcomment:[%s]\n\n", comm); -} - -/**************************************************************************** -printer info level 2 display function -****************************************************************************/ -static void display_print_info_2(FILE *out_hnd, PRINTER_INFO_2 *i2) -{ - fstring servername; - fstring printername; - fstring sharename; - fstring portname; - fstring drivername; - fstring comment; - fstring location; - fstring sepfile; - fstring printprocessor; - fstring datatype; - fstring parameters; - - if (i2 == NULL) - return; - - rpcstr_pull(servername, i2->servername.buffer,sizeof(servername), 0, STR_TERMINATE); - rpcstr_pull(printername, i2->printername.buffer,sizeof(printername), 0, STR_TERMINATE); - rpcstr_pull(sharename, i2->sharename.buffer,sizeof(sharename), 0, STR_TERMINATE); - rpcstr_pull(portname, i2->portname.buffer,sizeof(portname), 0, STR_TERMINATE); - rpcstr_pull(drivername, i2->drivername.buffer,sizeof(drivername), 0, STR_TERMINATE); - rpcstr_pull(comment, i2->comment.buffer,sizeof(comment), 0, STR_TERMINATE); - rpcstr_pull(location, i2->location.buffer,sizeof(location), 0, STR_TERMINATE); - rpcstr_pull(sepfile, i2->sepfile.buffer,sizeof(sepfile), 0, STR_TERMINATE); - rpcstr_pull(printprocessor, i2->printprocessor.buffer,sizeof(printprocessor), 0, STR_TERMINATE); - rpcstr_pull(datatype, i2->datatype.buffer,sizeof(datatype), 0, STR_TERMINATE); - rpcstr_pull(parameters, i2->parameters.buffer,sizeof(parameters), 0, STR_TERMINATE); - - report(out_hnd, "\tservername:[%s]\n", servername); - report(out_hnd, "\tprintername:[%s]\n", printername); - report(out_hnd, "\tsharename:[%s]\n", sharename); - report(out_hnd, "\tportname:[%s]\n", portname); - report(out_hnd, "\tdrivername:[%s]\n", drivername); - report(out_hnd, "\tcomment:[%s]\n", comment); - report(out_hnd, "\tlocation:[%s]\n", location); - report(out_hnd, "\tsepfile:[%s]\n", sepfile); - report(out_hnd, "\tprintprocessor:[%s]\n", printprocessor); - report(out_hnd, "\tdatatype:[%s]\n", datatype); - report(out_hnd, "\tparameters:[%s]\n", parameters); - report(out_hnd, "\tattributes:[%x]\n", i2->attributes); - report(out_hnd, "\tpriority:[%x]\n", i2->priority); - report(out_hnd, "\tdefaultpriority:[%x]\n", i2->defaultpriority); - report(out_hnd, "\tstarttime:[%x]\n", i2->starttime); - report(out_hnd, "\tuntiltime:[%x]\n", i2->untiltime); - report(out_hnd, "\tstatus:[%x]\n", i2->status); - report(out_hnd, "\tcjobs:[%x]\n", i2->cjobs); - report(out_hnd, "\taverageppm:[%x]\n\n", i2->averageppm); - - if (i2->secdesc != NULL) - { - display_sec_desc(out_hnd, ACTION_HEADER , i2->secdesc); - display_sec_desc(out_hnd, ACTION_ENUMERATE, i2->secdesc); - display_sec_desc(out_hnd, ACTION_FOOTER , i2->secdesc); - } -} - -/**************************************************************************** -printer info level 3 display function -****************************************************************************/ -static void display_print_info_3(FILE *out_hnd, PRINTER_INFO_3 *i3) -{ - if (i3 == NULL) - return; - - report(out_hnd, "\tflags:[%x]\n", i3->flags); - - display_sec_desc(out_hnd, ACTION_HEADER , i3->secdesc); - display_sec_desc(out_hnd, ACTION_ENUMERATE, i3->secdesc); - display_sec_desc(out_hnd, ACTION_FOOTER , i3->secdesc); -} - -/**************************************************************************** -connection info level 0 container display function -****************************************************************************/ -static void display_printer_info_0_ctr(FILE *out_hnd, enum action_type action, uint32 count, PRINTER_INFO_CTR ctr) -{ - int i; - PRINTER_INFO_0 *in; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer Info Level 0:\n"); - break; - case ACTION_ENUMERATE: - for (i = 0; i < count; i++) { - in=ctr.printers_0; - display_print_info_0(out_hnd, &(in[i]) ); - } - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -static void display_printer_info_1_ctr(FILE *out_hnd, enum action_type action, uint32 count, PRINTER_INFO_CTR ctr) -{ - int i; - PRINTER_INFO_1 *in; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer Info Level 1:\n"); - break; - case ACTION_ENUMERATE: - for (i = 0; i < count; i++) { - in=ctr.printers_1; - display_print_info_1(out_hnd, &(in[i]) ); - } - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info level 2 container display function -****************************************************************************/ -static void display_printer_info_2_ctr(FILE *out_hnd, enum action_type action, uint32 count, PRINTER_INFO_CTR ctr) -{ - int i; - PRINTER_INFO_2 *in; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer Info Level 2:\n"); - break; - case ACTION_ENUMERATE: - for (i = 0; i < count; i++) { - in=ctr.printers_2; - display_print_info_2(out_hnd, &(in[i]) ); - } - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info level 3 container display function -****************************************************************************/ -static void display_printer_info_3_ctr(FILE *out_hnd, enum action_type action, uint32 count, PRINTER_INFO_CTR ctr) -{ - int i; - PRINTER_INFO_3 *in; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer Info Level 3:\n"); - break; - case ACTION_ENUMERATE: - for (i = 0; i < count; i++) { - in=ctr.printers_3; - display_print_info_3(out_hnd, &(in[i]) ); - } - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_printer_info_ctr(FILE *out_hnd, enum action_type action, uint32 level, - uint32 count, PRINTER_INFO_CTR ctr) -{ - switch (level) { - case 0: - display_printer_info_0_ctr(out_hnd, action, count, ctr); - break; - case 1: - display_printer_info_1_ctr(out_hnd, action, count, ctr); - break; - case 2: - display_printer_info_2_ctr(out_hnd, action, count, ctr); - break; - case 3: - display_printer_info_3_ctr(out_hnd, action, count, ctr); - break; - default: - report(out_hnd, "display_printer_info_ctr: Unknown Info Level\n"); - break; - } -} - -/**************************************************************************** -connection info level 3 container display function -****************************************************************************/ -static void display_port_info_1_ctr(FILE *out_hnd, enum action_type action, - uint32 count, PORT_INFO_CTR *ctr) -{ - uint32 i = 0; - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Port Info Level 1:\n"); - break; - case ACTION_ENUMERATE: - for (i=0; iport.info_1[i]); - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info level 3 container display function -****************************************************************************/ -static void display_port_info_2_ctr(FILE *out_hnd, enum action_type action, - uint32 count, PORT_INFO_CTR *ctr) -{ - uint32 i = 0; - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Port Info Level 2:\n"); - break; - case ACTION_ENUMERATE: - for (i=0; iport.info_2[i]); - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_port_info_ctr(FILE *out_hnd, enum action_type action, uint32 level, - uint32 count, PORT_INFO_CTR *ctr) -{ - switch (level) { - case 1: - display_port_info_1_ctr(out_hnd, action, count, ctr); - break; - case 2: - display_port_info_2_ctr(out_hnd, action, count, ctr); - break; - default: - report(out_hnd, "display_port_info_ctr: Unknown Info Level\n"); - break; - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_port_info_1(FILE *out_hnd, enum action_type action, PORT_INFO_1 *i1) -{ - fstring buffer; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Port:\n"); - break; - case ACTION_ENUMERATE: - rpcstr_pull(buffer, i1->port_name.buffer, sizeof(bufferi), 0, STR_TERMINATE); - fprintf (out_hnd, "\tPort Name:\t[%s]\n\n", buffer); - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_port_info_2(FILE *out_hnd, enum action_type action, PORT_INFO_2 *i2) -{ - fstring buffer; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Port:\n"); - break; - case ACTION_ENUMERATE: - rpcstr_pull(buffer, i2->port_name.buffer, sizeof(buffer), 0, STR_TERMINATE); - fprintf (out_hnd, "\tPort Name:\t[%s]\n", buffer); - rpcstr_pull(buffer, i2->monitor_name.buffer, sizeof(buffer), 0, STR_TERMINATE); - - fprintf (out_hnd, "\tMonitor Name:\t[%s]\n", buffer); - rpcstr_pull(buffer, i2->description.buffer, sizeof(buffer), 0, STR_TERMINATE); - fprintf (out_hnd, "\tDescription:\t[%s]\n", buffer); - fprintf (out_hnd, "\tPort Type:\t[%d]\n", i2->port_type); - fprintf (out_hnd, "\tReserved:\t[%d]\n", i2->reserved); - fprintf (out_hnd, "\n"); - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_printer_enumdata(FILE *out_hnd, enum action_type action, uint32 idx, - uint32 valuelen, uint16 *value, uint32 rvaluelen, - uint32 type, - uint32 datalen, uint8 *data, uint32 rdatalen) -{ - fstring buffer; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer enum data:\n"); - report(out_hnd, "index\tvaluelen\tvalue\t\trvaluelen"); - report(out_hnd, "\ttype\tdatalen\tdata\trdatalen\n"); - break; - case ACTION_ENUMERATE: - report(out_hnd, "[%d]", idx); - report(out_hnd, "\t[%d]", valuelen); - rpcstr_pull(buffer, value, sizeof(buffer), 0, STR_TERMINATE); - report(out_hnd, "\t[%s]", buffer); - report(out_hnd, "\t[%d]", rvaluelen); - report(out_hnd, "\t\t[%d]", type); - report(out_hnd, "\t[%d]", datalen); -/* report(out_hnd, "\t[%s]", data);*/ - report(out_hnd, "\t[%d]\n", rdatalen); - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -job info level 2 display function -****************************************************************************/ -void display_job_info_2(FILE *out_hnd, enum action_type action, - JOB_INFO_2 *const i2) -{ - if (i2 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Job Info Level 2:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring tmp; - - report(out_hnd, "\tjob id:\t%d\n", i2->jobid); - rpcstr_pull(tmp, i2->printername.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tprinter name:\t%s\n", tmp); - rpcstr_pull(tmp, i2->machinename.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tmachine name:\t%s\n", tmp); - rpcstr_pull(tmp, i2->username.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tusername:\t%s\n", tmp); - rpcstr_pull(tmp, i2->document.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tdocument:\t%s\n", tmp); - rpcstr_pull(tmp, i2->notifyname.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tnotify name:\t%s\n", tmp); - rpcstr_pull(tmp, i2->datatype.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tdata type:\t%s\n", tmp); - rpcstr_pull(tmp, i2->printprocessor.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tprint processor:\t%s\n", tmp); - rpcstr_pull(tmp, i2->parameters.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tparameters:\t%s\n", tmp); - rpcstr_pull(tmp, i2->drivername.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tdriver name:\t%s\n", tmp); - report(out_hnd, "\tDevice Mode:\tNOT DISPLAYED YET\n"); - - rpcstr_pull(tmp, i2->text_status.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\ttext status:\t%s\n", tmp); - /* SEC_DESC sec_desc;*/ - report(out_hnd, "\tstatus:\t%d\n", i2->status); - report(out_hnd, "\tpriority:\t%d\n", i2->priority); - report(out_hnd, "\tposition:\t%d\n", i2->position); - report(out_hnd, "\tstarttime:\t%d\n", i2->starttime); - report(out_hnd, "\tuntiltime:\t%d\n", i2->untiltime); - report(out_hnd, "\ttotalpages:\t%d\n", i2->totalpages); - report(out_hnd, "\tsize:\t%d\n", i2->size); -/* - SYSTEMTIME submitted; -*/ - report(out_hnd, "\tsubmitted:\tNOT DISPLAYED YET\n"); - report(out_hnd, "\ttimeelapsed:\t%d\n", i2->timeelapsed); - report(out_hnd, "\tpagesprinted:\t%d\n", i2->pagesprinted); - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -job info level 1 display function -****************************************************************************/ -void display_job_info_1(FILE *out_hnd, enum action_type action, - JOB_INFO_1 *const i1) -{ - if (i1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Job Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring tmp; - - report(out_hnd, "\tjob id:\t%d\n", i1->jobid); - rpcstr_pull(tmp, i1->printername.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tprinter name:\t%s\n", tmp); - rpcstr_pull(tmp, i1->machinename.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tmachine name:\t%s\n", tmp); - rpcstr_pull(tmp, i1->username.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tusername:\t%s\n", tmp); - rpcstr_pull(tmp, i1->document.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tdocument:\t%s\n", tmp); - rpcstr_pull(tmp, i1->datatype.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\tdata type:\t%s\n", tmp); - rpcstr_pull(tmp, i1->text_status.buffer, sizeof(tmp), 0, STR_TERMINATE); - report(out_hnd, "\ttext status:\t%s\n", tmp); - report(out_hnd, "\tstatus:\t%d\n", i1->status); - report(out_hnd, "\tpriority:\t%d\n", i1->priority); - report(out_hnd, "\tposition:\t%d\n", i1->position); - report(out_hnd, "\ttotalpages:\t%d\n", i1->totalpages); -/* - SYSTEMTIME submitted; -*/ - report(out_hnd, "\tsubmitted:\tNOT DISPLAYED YET\n"); - report(out_hnd, "\tpagesprinted:\t%d\n", i1->pagesprinted); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 2 container display function -****************************************************************************/ -void display_job_info_2_ctr(FILE *out_hnd, enum action_type action, - uint32 count, JOB_INFO_2 *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_job_info_2_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < count; i++) - { - display_job_info_2(out_hnd, ACTION_HEADER , ctr[i]); - display_job_info_2(out_hnd, ACTION_ENUMERATE, ctr[i]); - display_job_info_2(out_hnd, ACTION_FOOTER , ctr[i]); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -void display_job_info_1_ctr(FILE *out_hnd, enum action_type action, - uint32 count, JOB_INFO_1 *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_job_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < count; i++) - { - display_job_info_1(out_hnd, ACTION_HEADER , ctr[i]); - display_job_info_1(out_hnd, ACTION_ENUMERATE, ctr[i]); - display_job_info_1(out_hnd, ACTION_FOOTER , ctr[i]); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_job_info_ctr(FILE *out_hnd, enum action_type action, - uint32 level, uint32 count, - void *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_job_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (level) - { - case 1: - { - display_job_info_1_ctr(out_hnd, action, - count, (JOB_INFO_1*const*const)ctr); - break; - } - case 2: - { - display_job_info_2_ctr(out_hnd, action, - count, (JOB_INFO_2*const*const)ctr); - break; - } - default: - { - report(out_hnd, "display_job_info_ctr: Unknown Info Level\n"); - break; - } - } -} - -/**************************************************************************** -printer info level 0 display function -****************************************************************************/ -static void display_print_driver_1(FILE *out_hnd, DRIVER_INFO_1 *i1) -{ - fstring name; - if (i1 == NULL) - return; - - rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); - - report(out_hnd, "\tname:[%s]\n", name); -} - -/**************************************************************************** -printer info level 1 display function -****************************************************************************/ -static void display_print_driver_2(FILE *out_hnd, DRIVER_INFO_2 *i1) -{ - fstring name; - fstring architecture; - fstring driverpath; - fstring datafile; - fstring configfile; - if (i1 == NULL) - return; - - rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); - rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), 0, STR_TERMINATE); - rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), 0, STR_TERMINATE); - rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), 0, STR_TERMINATE); - rpcstr_pull(configfile, i1->conigfile.buffer, sizeof(configfile), 0, STR_TERMINATE); - - report(out_hnd, "\tversion:[%x]\n", i1->version); - report(out_hnd, "\tname:[%s]\n", name); - report(out_hnd, "\tarchitecture:[%s]\n", architecture); - report(out_hnd, "\tdriverpath:[%s]\n", driverpath); - report(out_hnd, "\tdatafile:[%s]\n", datafile); - report(out_hnd, "\tconfigfile:[%s]\n", configfile); -} - -/**************************************************************************** -printer info level 2 display function -****************************************************************************/ -static void display_print_driver_3(FILE *out_hnd, DRIVER_INFO_3 *i1) -{ - fstring name; - fstring architecture; - fstring driverpath; - fstring datafile; - fstring configfile; - fstring helpfile; - fstring dependentfiles; - fstring monitorname; - fstring defaultdatatype; - - int length=0; - BOOL valid = True; - - if (i1 == NULL) - return; - - rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); - rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), 0, STR_TERMINATE); - rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), 0, STR_TERMINATE); - rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), 0, STR_TERMINATE); - rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), 0, STR_TERMINATE); - rpcstr_pull(helpfile, i1->helpfile.buffer, sizeof(helpfile), 0, STR_TERMINATE); - rpcstr_pull(monitorname, i1->monitorname.buffer, sizeof(monitorname), 0, STR_TERMINATE); - rpcstr_pull(defaultdatatype, i1->defaultdatatype.buffer, sizeof(defaultdatatype), 0, STR_TERMINATE); - - report(out_hnd, "\tversion:[%x]\n", i1->version); - report(out_hnd, "\tname:[%s]\n",name); - report(out_hnd, "\tarchitecture:[%s]\n", architecture); - report(out_hnd, "\tdriverpath:[%s]\n", driverpath); - report(out_hnd, "\tdatafile:[%s]\n", datafile); - report(out_hnd, "\tconfigfile:[%s]\n", configfile); - report(out_hnd, "\thelpfile:[%s]\n\n", helpfile); - - while (valid) - { - rpcstr_pull(dependentfiles, i1->dependentfiles+length, sizeof(dependentfiles), 0, STR_TERMINATE); - length+=strlen(dependentfiles)+1; - - if (strlen(dependentfiles) > 0) - { - report(out_hnd, "\tdependentfiles:[%s]\n", dependentfiles); - } - else - { - valid = False; - } - } - - report(out_hnd, "\n\tmonitorname:[%s]\n", monitorname); - report(out_hnd, "\tdefaultdatatype:[%s]\n", defaultdatatype); - -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -static void display_printer_driver_1_ctr(FILE *out_hnd, enum action_type action, uint32 count, PRINTER_DRIVER_CTR ctr) -{ - int i; - DRIVER_INFO_1 *in; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer driver Level 1:\n"); - break; - case ACTION_ENUMERATE: - for (i = 0; i < count; i++) { - in=ctr.info1; - display_print_driver_1(out_hnd, &(in[i]) ); - } - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info level 2 container display function -****************************************************************************/ -static void display_printer_driver_2_ctr(FILE *out_hnd, enum action_type action, uint32 count, PRINTER_DRIVER_CTR ctr) -{ - int i; - DRIVER_INFO_2 *in; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer driver Level 2:\n"); - break; - case ACTION_ENUMERATE: - for (i = 0; i < count; i++) { - in=ctr.info2; - display_print_driver_2(out_hnd, &(in[i]) ); - } - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info level 3 container display function -****************************************************************************/ -static void display_printer_driver_3_ctr(FILE *out_hnd, enum action_type action, uint32 count, PRINTER_DRIVER_CTR ctr) -{ - int i; - DRIVER_INFO_3 *in; - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer driver Level 3:\n"); - break; - case ACTION_ENUMERATE: - for (i = 0; i < count; i++) { - in=ctr.info3; - display_print_driver_3(out_hnd, &(in[i]) ); - } - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_printer_driver_ctr(FILE *out_hnd, enum action_type action, uint32 level, - uint32 count, PRINTER_DRIVER_CTR ctr) -{ - switch (level) { - case 1: - display_printer_driver_1_ctr(out_hnd, action, count, ctr); - break; - case 2: - display_printer_driver_2_ctr(out_hnd, action, count, ctr); - break; - case 3: - display_printer_driver_3_ctr(out_hnd, action, count, ctr); - break; - default: - report(out_hnd, "display_printer_driver_ctr: Unknown Info Level\n"); - break; - } -} - - -/**************************************************************************** -printer info level 1 display function -****************************************************************************/ -static void display_printdriverdir_info_1(FILE *out_hnd, DRIVER_DIRECTORY_1 *i1) -{ - fstring name; - if (i1 == NULL) - return; - - rpcstr_pull(name, i1->name.buffer, sizeof(name), 0, STR_TERMINATE); - - report(out_hnd, "\tname:[%s]\n", name); -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -static void display_printerdriverdir_info_1_ctr(FILE *out_hnd, enum action_type action, DRIVER_DIRECTORY_CTR ctr) -{ - - switch (action) - { - case ACTION_HEADER: - report(out_hnd, "Printer driver dir Info Level 1:\n"); - break; - case ACTION_ENUMERATE: - display_printdriverdir_info_1(out_hnd, &(ctr.driver.info_1) ); - break; - case ACTION_FOOTER: - report(out_hnd, "\n"); - break; - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_printerdriverdir_info_ctr(FILE *out_hnd, enum action_type action, uint32 level, - DRIVER_DIRECTORY_CTR ctr) -{ - switch (level) { - case 1: - display_printerdriverdir_info_1_ctr(out_hnd, action, ctr); - break; - default: - report(out_hnd, "display_printerdriverdir_info_ctr: Unknown Info Level\n"); - break; - } -} diff --git a/source3/rpcclient/samsync.c b/source3/rpcclient/samsync.c deleted file mode 100644 index a4061d2a87..0000000000 --- a/source3/rpcclient/samsync.c +++ /dev/null @@ -1,773 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SAM synchronisation and replication - - Copyright (C) Tim Potter 2001,2002 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" - -DOM_SID domain_sid; - -static void decode_domain_info(SAM_DOMAIN_INFO *a) -{ - fstring temp; - printf("Domain Information\n"); - printf("------------------\n"); - - unistr2_to_ascii(temp, &a->uni_dom_name, sizeof(temp)-1); - printf("\tDomain :%s\n", temp); - printf("\tMin password len :%d\n", a->min_pwd_len); - printf("\tpassword history len:%d\n", a->pwd_history_len); - printf("\tcreation time :%s\n", http_timestring(nt_time_to_unix(&a->creation_time))); -} - -static void decode_sam_group_info(SAM_GROUP_INFO *a) -{ - fstring temp; - printf("\nDomain Group Information\n"); - printf("------------------------\n"); - - unistr2_to_ascii(temp, &a->uni_grp_name, sizeof(temp)-1); - printf("\tGroup name :%s\n", temp); - unistr2_to_ascii(temp, &a->uni_grp_desc, sizeof(temp)-1); - printf("\tGroup description :%s\n", temp); - printf("\trid :%d\n", a->gid.g_rid); - printf("\tattribute :%d\n", a->gid.attr); -} - -static void decode_sam_account_info(SAM_ACCOUNT_INFO *a) -{ - fstring temp; - printf("\nUser Information\n"); - printf("----------------\n"); - - unistr2_to_ascii(temp, &a->uni_acct_name, sizeof(temp)-1); - printf("\tUser name :%s\n", temp); - printf("\tuser's rid :%d\n", a->user_rid); - printf("\tuser's primary gid :%d\n", a->group_rid); - unistr2_to_ascii(temp, &a->uni_full_name, sizeof(temp)-1); - printf("\tfull name :%s\n", temp); - unistr2_to_ascii(temp, &a->uni_home_dir, sizeof(temp)-1); - printf("\thome directory :%s\n", temp); - unistr2_to_ascii(temp, &a->uni_dir_drive, sizeof(temp)-1); - printf("\tdrive :%s\n", temp); - unistr2_to_ascii(temp, &a->uni_logon_script, sizeof(temp)-1); - printf("\tlogon script :%s\n", temp); - unistr2_to_ascii(temp, &a->uni_acct_desc, sizeof(temp)-1); - printf("\tdescription :%s\n", temp); - unistr2_to_ascii(temp, &a->uni_workstations, sizeof(temp)-1); - printf("\tworkstations :%s\n", temp); -} - -static void decode_sam_grp_mem_info(SAM_GROUP_MEM_INFO *a) -{ - int i; - printf("\nGroup members information\n"); - printf("-------------------------\n"); - printf("\tnum members :%d\n", a->num_members); - - for (i=0; inum_members; i++) { - printf("\trid, attr:%d, %d\n", a->rids[i], a->attribs[i]); - } -} - -static void decode_sam_alias_info(SAM_ALIAS_INFO *a) -{ - fstring temp; - printf("\nAlias Information\n"); - printf("-----------------\n"); - - unistr2_to_ascii(temp, &a->uni_als_name, sizeof(temp)-1); - printf("\tname :%s\n", temp); - unistr2_to_ascii(temp, &a->uni_als_desc, sizeof(temp)-1); - printf("\tdescription :%s\n", temp); - printf("\trid :%d\n", a->als_rid); -} - -static void decode_sam_als_mem_info(SAM_ALIAS_MEM_INFO *a) -{ - int i; - fstring temp; - printf("\nAlias members Information\n"); - printf("-------------------------\n"); - printf("\tnum members :%d\n", a->num_members); - printf("\tnum sids :%d\n", a->num_sids); - for (i=0; inum_sids; i++) { - printf("\tsid :%s\n", sid_to_string(temp, &a->sids[i].sid)); - } - - -} - -static void decode_sam_dom_info(SAM_DELTA_DOM *a) -{ - fstring temp; - printf("\nDomain information\n"); - printf("------------------\n"); - - unistr2_to_ascii(temp, &a->domain_name, sizeof(temp)-1); - printf("\tdomain name :%s\n", temp); - printf("\tsid :%s\n", sid_to_string(temp, &a->domain_sid.sid)); -} - -static void decode_sam_unk0e_info(SAM_DELTA_UNK0E *a) -{ - fstring temp; - printf("\nTrust information\n"); - printf("-----------------\n"); - - unistr2_to_ascii(temp, &a->domain, sizeof(temp)-1); - printf("\tdomain name :%s\n", temp); - printf("\tsid :%s\n", sid_to_string(temp, &a->sid.sid)); - display_sec_desc(a->sec_desc); -} - -static void decode_sam_privs_info(SAM_DELTA_PRIVS *a) -{ - int i; - fstring temp; - printf("\nSID and privileges information\n"); - printf("------------------------------\n"); - printf("\tsid :%s\n", sid_to_string(temp, &a->sid.sid)); - display_sec_desc(a->sec_desc); - printf("\tprivileges count :%d\n", a->privlist_count); - for (i=0; iprivlist_count; i++) { - unistr2_to_ascii(temp, &a->uni_privslist[i], sizeof(temp)-1); - printf("\tprivilege name :%s\n", temp); - printf("\tattribute :%d\n", a->attributes[i]); - } -} - -static void decode_sam_unk12_info(SAM_DELTA_UNK12 *a) -{ - fstring temp; - printf("\nTrusted information\n"); - printf("-------------------\n"); - - unistr2_to_ascii(temp, &a->secret, sizeof(temp)-1); - printf("\tsecret name :%s\n", temp); - display_sec_desc(a->sec_desc); - - printf("\ttime 1 :%s\n", http_timestring(nt_time_to_unix(&a->time1))); - printf("\ttime 2 :%s\n", http_timestring(nt_time_to_unix(&a->time2))); - - display_sec_desc(a->sec_desc2); -} - -static void decode_sam_stamp(SAM_DELTA_STAMP *a) -{ - printf("\nStamp information\n"); - printf("-----------------\n"); - printf("\tsequence number :%d\n", a->seqnum); -} - -static void decode_sam_deltas(uint32 num_deltas, SAM_DELTA_HDR *hdr_deltas, SAM_DELTA_CTR *deltas) -{ - int i; - for (i = 0; i < num_deltas; i++) { - switch (hdr_deltas[i].type) { - case SAM_DELTA_DOMAIN_INFO: { - SAM_DOMAIN_INFO *a; - a = &deltas[i].domain_info; - decode_domain_info(a); - break; - } - case SAM_DELTA_GROUP_INFO: { - SAM_GROUP_INFO *a; - a = &deltas[i].group_info; - decode_sam_group_info(a); - break; - } - case SAM_DELTA_ACCOUNT_INFO: { - SAM_ACCOUNT_INFO *a; - a = &deltas[i].account_info; - decode_sam_account_info(a); - break; - } - case SAM_DELTA_GROUP_MEM: { - SAM_GROUP_MEM_INFO *a; - a = &deltas[i].grp_mem_info; - decode_sam_grp_mem_info(a); - break; - } - case SAM_DELTA_ALIAS_INFO: { - SAM_ALIAS_INFO *a; - a = &deltas[i].alias_info; - decode_sam_alias_info(a); - break; - } - case SAM_DELTA_ALIAS_MEM: { - SAM_ALIAS_MEM_INFO *a; - a = &deltas[i].als_mem_info; - decode_sam_als_mem_info(a); - break; - } - case SAM_DELTA_POLICY_INFO: { - SAM_DELTA_POLICY *a; - a = &deltas[i].dom_info; - decode_sam_dom_info(a); - break; - } - case SAM_DELTA_UNK0E_INFO: { - SAM_DELTA_UNK0E *a; - a = &deltas[i].unk0e_info; - decode_sam_unk0e_info(a); - break; - } - case SAM_DELTA_PRIVS_INFO: { - SAM_DELTA_PRIVS *a; - a = &deltas[i].privs_info; - decode_sam_privs_info(a); - break; - } - case SAM_DELTA_UNK12_INFO: { - SAM_DELTA_UNK12 *a; - a = &deltas[i].unk12_info; - decode_sam_unk12_info(a); - break; - } - case SAM_DELTA_SAM_STAMP: { - SAM_DELTA_STAMP *a; - a = &deltas[i].stamp; - decode_sam_stamp(a); - break; - } - default: - DEBUG(0,("unknown delta type: %d\n", hdr_deltas[i].type)); - break; - } - } -} - -/* Convert a SAM_ACCOUNT_DELTA to a SAM_ACCOUNT. */ - -static void sam_account_from_delta(SAM_ACCOUNT *account, - SAM_ACCOUNT_INFO *delta) -{ - DOM_SID sid; - fstring s; - - /* Username, fullname, home dir, dir drive, logon script, acct - desc, workstations, profile. */ - - unistr2_to_ascii(s, &delta->uni_acct_name, sizeof(s) - 1); - pdb_set_nt_username(account, s); - - /* Unix username is the same - for sainity */ - pdb_set_username(account, s); - - unistr2_to_ascii(s, &delta->uni_full_name, sizeof(s) - 1); - pdb_set_fullname(account, s); - - unistr2_to_ascii(s, &delta->uni_home_dir, sizeof(s) - 1); - pdb_set_homedir(account, s, True); - - unistr2_to_ascii(s, &delta->uni_dir_drive, sizeof(s) - 1); - pdb_set_dir_drive(account, s, True); - - unistr2_to_ascii(s, &delta->uni_logon_script, sizeof(s) - 1); - pdb_set_logon_script(account, s, True); - - unistr2_to_ascii(s, &delta->uni_acct_desc, sizeof(s) - 1); - pdb_set_acct_desc(account, s); - - unistr2_to_ascii(s, &delta->uni_workstations, sizeof(s) - 1); - pdb_set_workstations(account, s); - - unistr2_to_ascii(s, &delta->uni_profile, sizeof(s) - 1); - pdb_set_profile_path(account, s, True); - - /* User and group sid */ - - sid_copy(&sid, &domain_sid); - sid_append_rid(&sid, delta->user_rid); - pdb_set_user_sid(account, &sid); - - sid_copy(&sid, &domain_sid); - sid_append_rid(&sid, delta->group_rid); - pdb_set_group_sid(account, &sid); - - /* Logon and password information */ - - pdb_set_logon_time(account, nt_time_to_unix(&delta->logon_time), True); - pdb_set_logoff_time(account, nt_time_to_unix(&delta->logoff_time), - True); - - pdb_set_logon_divs(account, delta->logon_divs); - - /* TODO: logon hours */ - /* TODO: bad password count */ - /* TODO: logon count */ - - pdb_set_pass_last_set_time( - account, nt_time_to_unix(&delta->pwd_last_set_time)); - - /* TODO: account expiry time */ - - pdb_set_acct_ctrl(account, delta->acb_info); -} - -static void apply_account_info(SAM_ACCOUNT_INFO *sam_acct_delta) -{ - SAM_ACCOUNT *sam_acct; - BOOL result; - - if (!NT_STATUS_IS_OK(pdb_init_sam(&sam_acct))) { - return; - } - - sam_account_from_delta(sam_acct, sam_acct_delta); - result = pdb_add_sam_account(sam_acct); -} - -/* Apply an array of deltas to the SAM database */ - -static void apply_deltas(uint32 num_deltas, SAM_DELTA_HDR *hdr_deltas, - SAM_DELTA_CTR *deltas) -{ - uint32 i; - - for (i = 0; i < num_deltas; i++) { - switch(hdr_deltas[i].type) { - case SAM_DELTA_ACCOUNT_INFO: - apply_account_info(&deltas[i].account_info); - break; - } - } -} - -/* Synchronise sam database */ - -static NTSTATUS sam_sync(struct cli_state *cli, unsigned char trust_passwd[16], - BOOL do_smbpasswd_output, BOOL verbose) -{ - TALLOC_CTX *mem_ctx; - SAM_DELTA_HDR *hdr_deltas_0, *hdr_deltas_2; - SAM_DELTA_CTR *deltas_0, *deltas_2; - uint32 num_deltas_0, num_deltas_2; - NTSTATUS result = NT_STATUS_UNSUCCESSFUL; - struct pdb_context *in; - uint32 neg_flags = 0x000001ff; - - DOM_CRED ret_creds; - - /* Initialise */ - - if (!NT_STATUS_IS_OK(make_pdb_context_list(&in, lp_passdb_backend()))){ - DEBUG(0, ("Can't initialize passdb backend.\n")); - return result; - } - - if (!(mem_ctx = talloc_init("sam_sync"))) { - DEBUG(0,("talloc_init failed\n")); - return result; - } - - if (!cli_nt_session_open (cli, PI_NETLOGON)) { - DEBUG(0, ("Could not initialize netlogon pipe!\n")); - goto done; - } - - /* Request a challenge */ - - if (!NT_STATUS_IS_OK(cli_nt_setup_creds(cli, SEC_CHAN_BDC, trust_passwd, &neg_flags, 2))) { - DEBUG(0, ("Error initialising session creds\n")); - goto done; - } - - /* on first call the returnAuthenticator is empty */ - memset(&ret_creds, 0, sizeof(ret_creds)); - - /* Do sam synchronisation on the SAM database*/ - - result = cli_netlogon_sam_sync(cli, mem_ctx, &ret_creds, 0, 0, - &num_deltas_0, &hdr_deltas_0, - &deltas_0); - - if (!NT_STATUS_IS_OK(result)) - goto done; - - - /* Update sam */ - - apply_deltas(num_deltas_0, hdr_deltas_0, deltas_0); - - - /* - * we can't yet do several sam_sync in a raw, it's a credential problem - * we must chain the credentials - */ - -#if 1 - /* Do sam synchronisation on the LSA database */ - - result = cli_netlogon_sam_sync(cli, mem_ctx, &ret_creds, 2, 0, &num_deltas_2, &hdr_deltas_2, &deltas_2); - - if (!NT_STATUS_IS_OK(result)) - goto done; - - /* verbose mode */ - if (verbose) - decode_sam_deltas(num_deltas_2, hdr_deltas_2, deltas_2); -#endif - - /* Produce smbpasswd output - good for migrating from NT! */ - - if (do_smbpasswd_output) { - int i; - - for (i = 0; i < num_deltas_0; i++) { - SAM_ACCOUNT_INFO *a; - fstring acct_name, hex_nt_passwd, hex_lm_passwd; - uchar lm_passwd[16], nt_passwd[16]; - - /* Skip non-user accounts */ - - if (hdr_deltas_0[i].type != SAM_DELTA_ACCOUNT_INFO) - continue; - - a = &deltas_0[i].account_info; - - unistr2_to_ascii(acct_name, &a->uni_acct_name, - sizeof(acct_name) - 1); - - /* Decode hashes from password hash */ - - sam_pwd_hash(a->user_rid, a->pass.buf_lm_pwd, - lm_passwd, 0); - sam_pwd_hash(a->user_rid, a->pass.buf_nt_pwd, - nt_passwd, 0); - - /* Encode as strings */ - - smbpasswd_sethexpwd(hex_lm_passwd, lm_passwd, - a->acb_info); - smbpasswd_sethexpwd(hex_nt_passwd, nt_passwd, - a->acb_info); - - /* Display user info */ - - printf("%s:%d:%s:%s:%s:LCT-0\n", acct_name, - a->user_rid, hex_lm_passwd, hex_nt_passwd, - smbpasswd_encode_acb_info(a->acb_info)); - } - - goto done; - } - - done: - cli_nt_session_close(cli); - talloc_destroy(mem_ctx); - - return result; -} - -/* Replicate sam deltas */ - -static NTSTATUS sam_repl(struct cli_state *cli, unsigned char trust_passwde[16], - uint32 low_serial) -{ - NTSTATUS result = NT_STATUS_UNSUCCESSFUL; - - return result; -} - -/* Connect to primary domain controller */ - -static struct cli_state *init_connection(struct cli_state **cli, - char *username, char *domain, - char *password) -{ - extern pstring global_myname; - struct in_addr pdc_ip; - fstring dest_host; - - /* Initialise myname */ - - if (!global_myname[0]) { - char *p; - - fstrcpy(global_myname, myhostname()); - p = strchr(global_myname, '.'); - if (p) - *p = 0; - } - - /* Look up name of PDC controller */ - - if (!get_pdc_ip(lp_workgroup(), &pdc_ip)) { - DEBUG(0, ("Cannot find domain controller for domain %s\n", - lp_workgroup())); - return NULL; - } - - if (!lookup_dc_name(global_myname, lp_workgroup(), pdc_ip, - dest_host)) { - DEBUG(0, ("Could not lookup up PDC name for domain %s\n", - lp_workgroup())); - return NULL; - } - - if (NT_STATUS_IS_OK(cli_full_connection(cli, global_myname, dest_host, - pdc_ip, 0, - "IPC$", "IPC", - username, domain, - password, 0))) { - return *cli; - } - - return NULL; -} - -/* Main function */ - -static fstring popt_username, popt_domain, popt_password; -static BOOL popt_got_pass; - -static void user_callback(poptContext con, - enum poptCallbackReason reason, - const struct poptOption *opt, - const char *arg, const void *data) -{ - const char *p, *ch; - - if (!arg) - return; - - switch(opt->val) { - - /* Check for [DOMAIN\\]username[%password]*/ - - case 'U': - - p = arg; - - if ((ch = strchr(p, '\\'))) { - fstrcpy(popt_domain, p); - popt_domain[ch - p] = 0; - } - - fstrcpy(popt_username, p); - - if ((ch = strchr(p, '%'))) { - popt_username[ch - p] = 0; - fstrcpy(popt_password, ch + 1); - popt_got_pass = True; - } - - break; - - case 'W': - fstrcpy(popt_domain, arg); - break; - } -} - -/* Return domain, username and password passed in from cmd line */ - -void popt_common_get_auth_info(char **domain, char **username, char **password, - BOOL *got_pass) -{ - *domain = popt_domain; - *username = popt_username; - *password = popt_password; - *got_pass = popt_got_pass; -} - -struct poptOption popt_common_auth_info[] = { - { NULL, 0, POPT_ARG_CALLBACK, user_callback }, - { "user", 'U', POPT_ARG_STRING, NULL, 'U', "Set username", - "[DOMAIN\\]username[%password]" }, - { "domain", 'W', POPT_ARG_STRING, NULL, 'W', "Set domain name", - "DOMAIN"}, - { 0 } -}; - -static BOOL popt_interactive; - -BOOL popt_common_is_interactive(void) -{ - return popt_interactive; -} - -struct poptOption popt_common_interactive[] = { - { "interactive", 'i', POPT_ARG_NONE, &popt_interactive, 'i', - "Log to stdout" }, - { 0 } -}; - - int main(int argc, char **argv) -{ - BOOL do_sam_sync = False, do_sam_repl = False; - struct cli_state *cli; - NTSTATUS result; - pstring logfile; - BOOL do_smbpasswd_output = False; - BOOL verbose = True, got_pass = False; - uint32 serial = 0; - unsigned char trust_passwd[16]; - char *username, *domain, *password; - poptContext pc; - char c; - - struct poptOption popt_samsync_opts[] = { - { "synchronise", 'S', POPT_ARG_NONE, &do_sam_sync, 'S', - "Perform full SAM synchronisation" }, - { "replicate", 'R', POPT_ARG_NONE, &do_sam_repl, 'R', - "Replicate SAM changes" }, - { "serial", 0, POPT_ARG_INT, &serial, 0, "SAM serial number" }, - { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug }, - { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, - { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_auth_info }, - { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_interactive }, - POPT_AUTOHELP - { 0 } - }; - - /* Read command line options */ - - pc = poptGetContext("samsync", argc, (const char **)argv, - popt_samsync_opts, 0); - - if (argc == 1) { - poptPrintUsage(pc, stdout, 0); - return 1; - } - - while ((c = poptGetNextOpt(pc)) != -1) { - - /* Argument processing error */ - - if (c < -1) { - fprintf(stderr, "samsync: %s: %s\n", - poptBadOption(pc, POPT_BADOPTION_NOALIAS), - poptStrerror(c)); - return 1; - } - - /* Handle arguments */ - - switch (c) { - case 'h': - poptPrintHelp(pc, stdout, 0); - return 1; - case 'u': - poptPrintUsage(pc, stdout, 0); - return 1; - } - } - - /* Bail out if any extra args were passed */ - - if (poptPeekArg(pc)) { - fprintf(stderr, "samsync: invalid argument %s\n", - poptPeekArg(pc)); - poptPrintUsage(pc, stdout, 0); - return 1; - } - - poptFreeContext(pc); - - /* Setup logging */ - - dbf = x_stdout; - - if (!lp_load(dyn_CONFIGFILE, True, False, False)) { - d_fprintf(stderr, "samsync: error opening config file %s. " - "Error was %s\n", dyn_CONFIGFILE, strerror(errno)); - return 1; - } - - slprintf(logfile, sizeof(logfile) - 1, "%s/log.%s", dyn_LOGFILEBASE, - "samsync"); - - lp_set_logfile(logfile); - - setup_logging("samsync", popt_common_is_interactive()); - - if (!popt_common_is_interactive()) - reopen_logs(); - - load_interfaces(); - - /* Check arguments make sense */ - - if (do_sam_sync && do_sam_repl) { - DEBUG(0, ("cannot specify both -S and -R\n")); - return 1; - - } - - if (!do_sam_sync && !do_sam_repl) { - DEBUG(0, ("samsync: you must either --synchronise or " - "--replicate the SAM database\n")); - return 1; - } - - if (do_sam_repl && serial == 0) { - DEBUG(0, ("samsync: must specify serial number\n")); - return 1; - } - - if (do_sam_sync && serial != 0) { - DEBUG(0, ("samsync: you can't specify a serial number when " - "synchonising the SAM database\n")); - return 1; - } - - /* BDC operations require the machine account password */ - - if (!secrets_init()) { - DEBUG(0, ("samsync: unable to initialise secrets database\n")); - return 1; - } - - if (!secrets_fetch_trust_account_password(lp_workgroup(), - trust_passwd, NULL)) { - DEBUG(0, ("samsync: could not fetch trust account password\n")); - return 1; - } - - /* I wish the domain sid wasn't stored in secrets.tdb */ - - if (!secrets_fetch_domain_sid(lp_workgroup(), &domain_sid)) { - DEBUG(0, ("samsync: could not retrieve domain sid\n")); - return 1; - } - - /* Perform sync or replication */ - - popt_common_get_auth_info(&domain, &username, &password, &got_pass); - - if (!init_connection(&cli, username, domain, password)) - return 1; - - if (do_sam_sync) - result = sam_sync(cli, trust_passwd, do_smbpasswd_output, - verbose); - - if (do_sam_repl) - result = sam_repl(cli, trust_passwd, serial); - - if (!NT_STATUS_IS_OK(result)) { - DEBUG(0, ("%s\n", nt_errstr(result))); - return 1; - } - - return 0; -} -- cgit From 1009ef3e37c82682e9c2c4c63bc7407420f20af8 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 20 Feb 2003 22:09:57 +0000 Subject: Added Volkers "print server role" patch. Jeremy. (This used to be commit e81d72ac221023ded9e0932be7dd303ad5280665) --- source3/utils/testparm.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c index 36b2bdfc6d..0fafd1b83d 100644 --- a/source3/utils/testparm.c +++ b/source3/utils/testparm.c @@ -283,6 +283,28 @@ int main(int argc, const char *argv[]) } } + + if (!silent_mode) { + printf("Server role: "); + switch(lp_server_role()) { + case ROLE_STANDALONE: + printf("ROLE_STANDALONE\n"); + break; + case ROLE_DOMAIN_MEMBER: + printf("ROLE_DOMAIN_MEMBER\n"); + break; + case ROLE_DOMAIN_BDC: + printf("ROLE_DOMAIN_BDC\n"); + break; + case ROLE_DOMAIN_PDC: + printf("ROLE_DOMAIN_PDC\n"); + break; + default: + printf("Unknown -- internal error?\n"); + break; + } + } + if (!cname) { if (!silent_mode) { printf("Press enter to see a dump of your service definitions\n"); -- cgit From 8d8a8c9633ea04d269d70b1fa8f4393cc73f7bbd Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 20 Feb 2003 22:26:28 +0000 Subject: Make init_module() and thus smb_load_module() return an int. modules/developer.c: init_module() should return an int (This used to be commit 7f59703550378ff2333e3c851bf1a77037510abd) --- source3/include/smb.h | 2 +- source3/lib/module.c | 18 +++++++++--------- source3/modules/developer.c | 2 +- source3/rpc_server/srv_pipe.c | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/source3/include/smb.h b/source3/include/smb.h index f96a19954a..71051e341e 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1721,6 +1721,6 @@ extern struct poptOption popt_common_netbios_name[]; extern struct poptOption popt_common_log_base[]; /* Module support */ -typedef NTSTATUS (init_module_function) (void); +typedef int (init_module_function) (void); #endif /* _SMB_H */ diff --git a/source3/lib/module.c b/source3/lib/module.c index 6febe8a9f1..dd94f79950 100644 --- a/source3/lib/module.c +++ b/source3/lib/module.c @@ -22,11 +22,11 @@ #include "includes.h" #ifdef HAVE_DLOPEN -NTSTATUS smb_load_module(const char *module_name) +int smb_load_module(const char *module_name) { void *handle; init_module_function *init; - NTSTATUS nt_status; + int status; const char *error; /* Always try to use LAZY symbol resolving; if the plugin has @@ -37,7 +37,7 @@ NTSTATUS smb_load_module(const char *module_name) if(!handle) { DEBUG(0, ("Error loading module '%s': %s\n", module_name, sys_dlerror())); - return NT_STATUS_UNSUCCESSFUL; + return False; } init = sys_dlsym(handle, "init_module"); @@ -47,14 +47,14 @@ NTSTATUS smb_load_module(const char *module_name) error = sys_dlerror(); if (error) { DEBUG(0, ("Error trying to resolve symbol 'init_module' in %s: %s\n", module_name, error)); - return NT_STATUS_UNSUCCESSFUL; + return False; } - nt_status = init(); + status = init(); DEBUG(2, ("Module '%s' loaded\n", module_name)); - return nt_status; + return status; } /* Load all modules in list and return number of @@ -65,7 +65,7 @@ int smb_load_modules(const char **modules) int success = 0; for(i = 0; modules[i]; i++){ - if(NT_STATUS_IS_OK(smb_load_module(modules[i]))) { + if(smb_load_module(modules[i])) { success++; } } @@ -77,10 +77,10 @@ int smb_load_modules(const char **modules) #else /* HAVE_DLOPEN */ -NTSTATUS smb_load_module(const char *module_name) +int smb_load_module(const char *module_name) { DEBUG(0,("This samba executable has not been build with plugin support")); - return NT_STATUS_NOT_SUPPORTED; + return False; } int smb_load_modules(const char **modules) diff --git a/source3/modules/developer.c b/source3/modules/developer.c index c12bbc562a..a697abcd22 100644 --- a/source3/modules/developer.c +++ b/source3/modules/developer.c @@ -128,5 +128,5 @@ struct charset_functions weird_functions = {"WEIRD", weird_pull, weird_push}; int init_module(void) { smb_register_charset(&weird_functions); - return 0; + return 1; } diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c index 0b8b7b229a..f6deac68f8 100644 --- a/source3/rpc_server/srv_pipe.c +++ b/source3/rpc_server/srv_pipe.c @@ -794,10 +794,10 @@ int rpc_pipe_register_commands(const char *clnt, const char *srv, const struct a /******************************************************************* Register commands to an RPC pipe *******************************************************************/ -NTSTATUS rpc_load_module(const char *module) +int rpc_load_module(const char *module) { pstring full_path; - NTSTATUS status; + int status; pstrcpy(full_path, lib_path("rpc")); pstrcat(full_path, "/librpc_"); @@ -805,7 +805,7 @@ NTSTATUS rpc_load_module(const char *module) pstrcat(full_path, "."); pstrcat(full_path, shlib_ext()); - if (!NT_STATUS_IS_OK(status = smb_load_module(full_path))) { + if (!(status = smb_load_module(full_path))) { DEBUG(0, ("Could not load requested pipe %s as %s\n", module, full_path)); } @@ -858,7 +858,7 @@ BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p) } } - if (!api_fd_commands[i].name && !NT_STATUS_IS_OK(rpc_load_module(p->name))) { + if (!api_fd_commands[i].name && !rpc_load_module(p->name)) { DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n", p->name )); if(!setup_bind_nak(p)) -- cgit From 5bec7f5fcac1a3e5a48b04f140b96f03b88f0965 Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Thu, 20 Feb 2003 22:46:37 +0000 Subject: From aliguori@us.ibm.com: This patch adds the architecture for an IDMAP backend system including a new smb.conf parameter "winbind backend". Right now, the only valid value is "tdb" but I'm currently working on an LDAP backend. (This used to be commit 35e4448dcb2deb0d5d34d9e974a49f2fb31f1356) --- source3/Makefile.in | 1 + source3/nsswitch/winbindd.h | 25 ++ source3/nsswitch/winbindd_idmap.c | 625 ++++++++++------------------------ source3/nsswitch/winbindd_idmap_tdb.c | 519 ++++++++++++++++++++++++++++ source3/param/loadparm.c | 6 + 5 files changed, 738 insertions(+), 438 deletions(-) create mode 100644 source3/nsswitch/winbindd_idmap_tdb.c diff --git a/source3/Makefile.in b/source3/Makefile.in index e04550cf21..efc3b935b4 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -579,6 +579,7 @@ WINBINDD_OBJ1 = \ nsswitch/winbindd_user.o \ nsswitch/winbindd_group.o \ nsswitch/winbindd_idmap.o \ + nsswitch/winbindd_idmap_tdb.o \ nsswitch/winbindd_util.o \ nsswitch/winbindd_cache.o \ nsswitch/winbindd_pam.o \ diff --git a/source3/nsswitch/winbindd.h b/source3/nsswitch/winbindd.h index 164b7ffda7..a498b76626 100644 --- a/source3/nsswitch/winbindd.h +++ b/source3/nsswitch/winbindd.h @@ -4,6 +4,7 @@ Winbind daemon for ntdom nss module Copyright (C) Tim Potter 2000 + Copyright (C) Anthony Liguori 2003 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -195,6 +196,30 @@ typedef struct { POLICY_HND pol; } CLI_POLICY_HND; +/* Filled out by IDMAP backends */ +struct idmap_methods { + /* Called when backend is first loaded */ + BOOL (*init)(void); + + BOOL (*get_sid_from_uid)(uid_t uid, DOM_SID *sid); + BOOL (*get_sid_from_gid)(gid_t gid, DOM_SID *sid); + + BOOL (*get_uid_from_sid)(DOM_SID *sid, uid_t *uid); + BOOL (*get_gid_from_sid)(DOM_SID *sid, gid_t *gid); + + BOOL (*get_rid_from_uid)(uid_t uid, uint32 *user_rid, + struct winbindd_domain **domain); + BOOL (*get_rid_from_gid)(gid_t gid, uint32 *group_rid, + struct winbindd_domain **domain); + BOOL (*get_uid_from_rid)(const char *dom_name, uint32 rid, uid_t *uid); + BOOL (*get_gid_from_rid)(const char *dom_name, uint32 rid, gid_t *gid); + + /* Called when backend is unloaded */ + BOOL (*close)(void); + /* Called to dump backend status */ + void (*status)(void); +}; + #include "winbindd_proto.h" #include "rpc_parse.h" diff --git a/source3/nsswitch/winbindd_idmap.c b/source3/nsswitch/winbindd_idmap.c index 6d184fec5f..d9448ef859 100644 --- a/source3/nsswitch/winbindd_idmap.c +++ b/source3/nsswitch/winbindd_idmap.c @@ -1,20 +1,19 @@ /* Unix SMB/CIFS implementation. - - Winbind daemon - user related function - + Winbind ID Mapping Copyright (C) Tim Potter 2000 - + Copyright (C) Anthony Liguori 2003 + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -22,508 +21,258 @@ #include "winbindd.h" -#undef DBGC_CLASS -#define DBGC_CLASS DBGC_WINBIND - -/* High water mark keys */ - -#define HWM_GROUP "GROUP HWM" -#define HWM_USER "USER HWM" - -/* idmap version determines auto-conversion */ -#define IDMAP_VERSION 2 - -/* Globals */ - -static TDB_CONTEXT *idmap_tdb; - -/* Allocate either a user or group id from the pool */ - -static BOOL allocate_id(uid_t *id, BOOL isgroup) +static struct { + const char *name; + /* Function to create a member of the idmap_methods list */ + BOOL (*reg_meth)(struct idmap_methods **methods); + struct idmap_methods *methods; +} builtin_idmap_functions[] = { + { "tdb", winbind_idmap_reg_tdb, NULL }, + /* { "ldap", winbind_idmap_reg_ldap, NULL },*/ + { NULL, NULL, NULL } +}; + +/* singleton pattern: uberlazy evaluation */ +static struct idmap_methods *impl; + +static struct idmap_methods *get_impl(const char *name) { - int hwm; - - /* Get current high water mark */ - - if ((hwm = tdb_fetch_int32(idmap_tdb, - isgroup ? HWM_GROUP : HWM_USER)) == -1) { - return False; - } - - /* Return next available uid in list */ + int i = 0; + struct idmap_methods *ret = NULL; - if ((isgroup && (hwm > server_state.gid_high)) || - (!isgroup && (hwm > server_state.uid_high))) { - DEBUG(0, ("winbind %sid range full!\n", isgroup ? "g" : "u")); - return False; - } + while (builtin_idmap_functions[i].name && + strcmp(builtin_idmap_functions[i].name, name)) { + i++; + } - if (id) { - *id = hwm; + if (builtin_idmap_functions[i].name) { + if (!builtin_idmap_functions[i].methods) { + builtin_idmap_functions[i].reg_meth(&builtin_idmap_functions[i].methods); } - hwm++; + ret = builtin_idmap_functions[i].methods; + } - /* Store new high water mark */ - - tdb_store_int32(idmap_tdb, isgroup ? HWM_GROUP : HWM_USER, hwm); - - return True; + return ret; } -/* Get an id from a rid */ -static BOOL get_id_from_sid(DOM_SID *sid, uid_t *id, BOOL isgroup) +/* Initialize backend */ +BOOL winbindd_idmap_init(void) { - TDB_DATA data, key; - fstring keystr; - BOOL result = False; - - /* Check if sid is present in database */ - sid_to_string(keystr, sid); - - key.dptr = keystr; - key.dsize = strlen(keystr) + 1; - - data = tdb_fetch(idmap_tdb, key); + BOOL ret = False; - if (data.dptr) { - fstring scanstr; - int the_id; + DEBUG(3, ("winbindd_idmap_init: using '%s' as backend\n", + lp_winbind_backend())); - /* Parse and return existing uid */ - fstrcpy(scanstr, isgroup ? "GID" : "UID"); - fstrcat(scanstr, " %d"); - - if (sscanf(data.dptr, scanstr, &the_id) == 1) { - /* Store uid */ - if (id) { - *id = the_id; - } - - result = True; - } - - SAFE_FREE(data.dptr); - } else { - - /* Allocate a new id for this sid */ + if (!impl) { + impl = get_impl(lp_winbind_backend()); + if (!impl) { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } + } - if (id && allocate_id(id, isgroup)) { - fstring keystr2; + if (impl) { + ret = impl->init(); + } - /* Store new id */ - - slprintf(keystr2, sizeof(keystr2), "%s %d", isgroup ? "GID" : "UID", *id); + DEBUG(3, ("winbind_idmap_init: returning %s\n", ret ? "true" : "false")); - data.dptr = keystr2; - data.dsize = strlen(keystr2) + 1; + return ret; +} - tdb_store(idmap_tdb, key, data, TDB_REPLACE); - tdb_store(idmap_tdb, data, key, TDB_REPLACE); +/* Get UID from SID */ +BOOL winbindd_idmap_get_uid_from_sid(DOM_SID *sid, uid_t *uid) +{ + BOOL ret = False; - result = True; - } + if (!impl) { + impl = get_impl(lp_winbind_backend()); + if (!impl) { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); } + } - return result; -} + if (impl) { + ret = impl->get_uid_from_sid(sid, uid); + } -/* Get a uid from a user sid */ -BOOL winbindd_idmap_get_uid_from_sid(DOM_SID *sid, uid_t *uid) -{ - return get_id_from_sid(sid, uid, False); + return ret; } -/* Get a gid from a group sid */ +/* Get GID from SID */ BOOL winbindd_idmap_get_gid_from_sid(DOM_SID *sid, gid_t *gid) { - return get_id_from_sid(sid, gid, True); -} - -/* Get a uid from a user rid */ -BOOL winbindd_idmap_get_uid_from_rid(const char *dom_name, uint32 rid, uid_t *uid) -{ - struct winbindd_domain *domain; - DOM_SID sid; + BOOL ret = False; - if (!(domain = find_domain_from_name(dom_name))) { - return False; - } + if (!impl) { + impl = get_impl(lp_winbind_backend()); + if (!impl) { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } + } - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, rid); + if (impl) { + ret = impl->get_gid_from_sid(sid, gid); + } - return get_id_from_sid(&sid, uid, False); + return ret; } -/* Get a gid from a group rid */ -BOOL winbindd_idmap_get_gid_from_rid(const char *dom_name, uint32 rid, gid_t *gid) +/* Get UID from RID */ +BOOL winbindd_idmap_get_uid_from_rid(const char *dom_name, uint32 rid, + uid_t *uid) { - struct winbindd_domain *domain; - DOM_SID sid; + BOOL ret = False; - if (!(domain = find_domain_from_name(dom_name))) { - return False; - } + if (!impl) { + impl = get_impl(lp_winbind_backend()); + if (!impl) { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } + } - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, rid); + if (impl) { + ret = impl->get_uid_from_rid(dom_name, rid, uid); + } - return get_id_from_sid(&sid, gid, True); + return ret; } - -BOOL get_sid_from_id(int id, DOM_SID *sid, BOOL isgroup) +/* Get GID From RID */ +BOOL winbindd_idmap_get_gid_from_rid(const char *dom_name, uint32 rid, + gid_t *gid) { - TDB_DATA key, data; - fstring keystr; - BOOL result = False; - - slprintf(keystr, sizeof(keystr), "%s %d", isgroup ? "GID" : "UID", id); - - key.dptr = keystr; - key.dsize = strlen(keystr) + 1; + BOOL ret = False; - data = tdb_fetch(idmap_tdb, key); - - if (data.dptr) { - result = string_to_sid(sid, data.dptr); - SAFE_FREE(data.dptr); + if (!impl) { + impl = get_impl(lp_winbind_backend()); + if (!impl) { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); } + } + + if (impl) { + ret = impl->get_gid_from_rid(dom_name, rid, gid); + } - return result; + return ret; } -/* Get a sid from a uid */ +/* Get SID from UID */ BOOL winbindd_idmap_get_sid_from_uid(uid_t uid, DOM_SID *sid) { - return get_sid_from_id((int)uid, sid, False); -} + BOOL ret = False; -/* Get a sid from a gid */ -BOOL winbindd_idmap_get_sid_from_gid(gid_t gid, DOM_SID *sid) -{ - return get_sid_from_id((int)gid, sid, True); + if (!impl) { + impl = get_impl(lp_winbind_backend()); + if (!impl) { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } + } + + if (impl) { + ret = impl->get_sid_from_uid(uid, sid); + } + + return ret; } -/* Get a user rid from a uid */ -BOOL winbindd_idmap_get_rid_from_uid(uid_t uid, uint32 *user_rid, - struct winbindd_domain **domain) +/* Get SID from GID */ +BOOL winbindd_idmap_get_sid_from_gid(gid_t gid, DOM_SID *sid) { - DOM_SID sid; + BOOL ret = False; - if (!get_sid_from_id((int)uid, &sid, False)) { - return False; - } + if (!impl) { + impl = get_impl(lp_winbind_backend()); + } - *domain = find_domain_from_sid(&sid); - if (! *domain) return False; + if (impl) { + ret = impl->get_sid_from_gid(gid, sid); + } else { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } - sid_split_rid(&sid, user_rid); - - return True; + return ret; } -/* Get a group rid from a gid */ - -BOOL winbindd_idmap_get_rid_from_gid(gid_t gid, uint32 *group_rid, +/* Get RID From UID */ +BOOL winbindd_idmap_get_rid_from_uid(uid_t uid, uint32 *user_rid, struct winbindd_domain **domain) { - DOM_SID sid; - - if (!get_sid_from_id((int)gid, &sid, True)) { - return False; - } + BOOL ret = False; - *domain = find_domain_from_sid(&sid); - if (! *domain) return False; + if (!impl) { + impl = get_impl(lp_winbind_backend()); + } - sid_split_rid(&sid, group_rid); + if (impl) { + ret = impl->get_rid_from_uid(uid, user_rid, domain); + } else { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } - return True; + return ret; } -/* convert one record to the new format */ -static int convert_fn(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA data, void *ignored) +/* Get RID from GID */ +BOOL winbindd_idmap_get_rid_from_gid(gid_t gid, uint32 *group_rid, + struct winbindd_domain **domain) { - struct winbindd_domain *domain; - char *p; - DOM_SID sid; - uint32 rid; - fstring keystr; - fstring dom_name; - TDB_DATA key2; - - p = strchr(key.dptr, '/'); - if (!p) - return 0; - - *p = 0; - fstrcpy(dom_name, key.dptr); - *p++ = '/'; - - domain = find_domain_from_name(dom_name); - if (!domain) { - /* We must delete the old record. */ - DEBUG(0,("winbindd: convert_fn : Unable to find domain %s\n", dom_name )); - DEBUG(0,("winbindd: convert_fn : deleting record %s\n", key.dptr )); - tdb_delete(idmap_tdb, key); - return 0; - } - - rid = atoi(p); - - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, rid); - - sid_to_string(keystr, &sid); - key2.dptr = keystr; - key2.dsize = strlen(keystr) + 1; - - if (tdb_store(idmap_tdb, key2, data, TDB_INSERT) != 0) { - /* not good! */ - DEBUG(0,("winbindd: convert_fn : Unable to update record %s\n", key2.dptr )); - DEBUG(0,("winbindd: convert_fn : conversion failed - idmap corrupt ?\n")); - return -1; - } - - if (tdb_store(idmap_tdb, data, key2, TDB_REPLACE) != 0) { - /* not good! */ - DEBUG(0,("winbindd: convert_fn : Unable to update record %s\n", data.dptr )); - DEBUG(0,("winbindd: convert_fn : conversion failed - idmap corrupt ?\n")); - return -1; - } - - tdb_delete(idmap_tdb, key); - - return 0; -} + BOOL ret = False; -#if 0 -/***************************************************************************** - Make a backup copy of the old idmap just to be safe.... JRA. -*****************************************************************************/ + if (!impl) { + impl = get_impl(lp_winbind_backend()); + } -static BOOL backup_old_idmap(const char *idmap_name) -{ - pstring new_name; - int outfd = -1; - SMB_OFF_T size; - struct stat st; - - pstrcpy(new_name, idmap_name); - pstrcat(new_name, ".bak"); - - DEBUG(10,("backup_old_idmap: backing up %s to %s before upgrade.\n", - idmap_name, new_name )); - - if (tdb_lockall(idmap_tdb) == -1) { - DEBUG(10,("backup_old_idmap: failed to lock %s. Error %s\n", - idmap_name, tdb_errorstr(idmap_tdb) )); - return False; - } - if ((outfd = open(new_name, O_CREAT|O_EXCL|O_RDWR, 0600)) == -1) { - DEBUG(10,("backup_old_idmap: failed to open %s. Error %s\n", - new_name, strerror(errno) )); - goto fail; - } - - if (fstat(idmap_tdb->fd, &st) == -1) { - DEBUG(10,("backup_old_idmap: failed to fstat %s. Error %s\n", - idmap_name, strerror(errno) )); - goto fail; - } - - size = (SMB_OFF_T)st.st_size; - - if (transfer_file(idmap_tdb->fd, outfd, size) != size ) { - DEBUG(10,("backup_old_idmap: failed to copy %s. Error %s\n", - idmap_name, strerror(errno) )); - goto fail; - } - - if (close(outfd) == -1) { - DEBUG(10,("backup_old_idmap: failed to close %s. Error %s\n", - idmap_name, strerror(errno) )); - outfd = -1; - goto fail; - } - tdb_unlockall(idmap_tdb); - return True; - -fail: - - if (outfd != -1) - close(outfd); - tdb_unlockall(idmap_tdb); - return False; -} -#endif - -/***************************************************************************** - Convert the idmap database from an older version. -*****************************************************************************/ + if (impl) { + ret = impl->get_rid_from_gid(gid, group_rid, domain); + } else { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } -static BOOL idmap_convert(const char *idmap_name) -{ - int32 vers = tdb_fetch_int32(idmap_tdb, "IDMAP_VERSION"); - BOOL bigendianheader = (idmap_tdb->flags & TDB_BIGENDIAN) ? True : False; - - if (vers == IDMAP_VERSION) - return True; - -#if 0 - /* Make a backup copy before doing anything else.... */ - if (!backup_old_idmap(idmap_name)) - return False; -#endif - - if (((vers == -1) && bigendianheader) || (IREV(vers) == IDMAP_VERSION)) { - /* Arrggghh ! Bytereversed or old big-endian - make order independent ! */ - /* - * high and low records were created on a - * big endian machine and will need byte-reversing. - */ - - int32 wm; - - wm = tdb_fetch_int32(idmap_tdb, HWM_USER); - - if (wm != -1) { - wm = IREV(wm); - } else - wm = server_state.uid_low; - - if (tdb_store_int32(idmap_tdb, HWM_USER, wm) == -1) { - DEBUG(0, ("idmap_convert: Unable to byteswap user hwm in idmap database\n")); - return False; - } - - wm = tdb_fetch_int32(idmap_tdb, HWM_GROUP); - if (wm != -1) { - wm = IREV(wm); - } else - wm = server_state.gid_low; - - if (tdb_store_int32(idmap_tdb, HWM_GROUP, wm) == -1) { - DEBUG(0, ("idmap_convert: Unable to byteswap group hwm in idmap database\n")); - return False; - } - } - - /* the old format stored as DOMAIN/rid - now we store the SID direct */ - tdb_traverse(idmap_tdb, convert_fn, NULL); - - if (tdb_store_int32(idmap_tdb, "IDMAP_VERSION", IDMAP_VERSION) == -1) { - DEBUG(0, ("idmap_convert: Unable to byteswap group hwm in idmap database\n")); - return False; - } - - return True; -} - -/***************************************************************************** - Initialise idmap database. -*****************************************************************************/ - -BOOL winbindd_idmap_init(void) -{ - /* Open tdb cache */ - - if (!(idmap_tdb = tdb_open_log(lock_path("winbindd_idmap.tdb"), 0, - TDB_DEFAULT, O_RDWR | O_CREAT, 0600))) { - DEBUG(0, ("winbindd_idmap_init: Unable to open idmap database\n")); - return False; - } - - /* possibly convert from an earlier version */ - if (!idmap_convert(lock_path("winbindd_idmap.tdb"))) { - DEBUG(0, ("winbindd_idmap_init: Unable to open idmap database\n")); - return False; - } - - /* Create high water marks for group and user id */ - - if (tdb_fetch_int32(idmap_tdb, HWM_USER) == -1) { - if (tdb_store_int32(idmap_tdb, HWM_USER, server_state.uid_low) == -1) { - DEBUG(0, ("winbindd_idmap_init: Unable to initialise user hwm in idmap database\n")); - return False; - } - } - - if (tdb_fetch_int32(idmap_tdb, HWM_GROUP) == -1) { - if (tdb_store_int32(idmap_tdb, HWM_GROUP, server_state.gid_low) == -1) { - DEBUG(0, ("winbindd_idmap_init: Unable to initialise group hwm in idmap database\n")); - return False; - } - } - - return True; + return ret; } +/* Close backend */ BOOL winbindd_idmap_close(void) { - if (idmap_tdb) - return (tdb_close(idmap_tdb) == 0); - return True; -} + BOOL ret = False; -/* Dump status information to log file. Display different stuff based on - the debug level: + if (!impl) { + impl = get_impl(lp_winbind_backend()); + } - Debug Level Information Displayed - ================================================================= - 0 Percentage of [ug]id range allocated - 0 High water marks (next allocated ids) -*/ + if (impl) { + ret = impl->close(); + } else { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } -#define DUMP_INFO 0 + return ret; +} +/* Dump backend status */ void winbindd_idmap_status(void) { - int user_hwm, group_hwm; - - DEBUG(0, ("winbindd idmap status:\n")); - - /* Get current high water marks */ - - if ((user_hwm = tdb_fetch_int32(idmap_tdb, HWM_USER)) == -1) { - DEBUG(DUMP_INFO, ("\tCould not get userid high water mark!\n")); - } - - if ((group_hwm = tdb_fetch_int32(idmap_tdb, HWM_GROUP)) == -1) { - DEBUG(DUMP_INFO, ("\tCould not get groupid high water mark!\n")); - } - - /* Display next ids to allocate */ - - if (user_hwm != -1) { - DEBUG(DUMP_INFO, ("\tNext userid to allocate is %d\n", user_hwm)); - } - - if (group_hwm != -1) { - DEBUG(DUMP_INFO, ("\tNext groupid to allocate is %d\n", group_hwm)); - } - - /* Display percentage of id range already allocated. */ - - if (user_hwm != -1) { - int num_users = user_hwm - server_state.uid_low; - int total_users = server_state.uid_high - server_state.uid_low; - - DEBUG(DUMP_INFO, ("\tUser id range is %d%% full (%d of %d)\n", - num_users * 100 / total_users, num_users, - total_users)); - } - - if (group_hwm != -1) { - int num_groups = group_hwm - server_state.gid_low; - int total_groups = server_state.gid_high - server_state.gid_low; - - DEBUG(DUMP_INFO, ("\tGroup id range is %d%% full (%d of %d)\n", - num_groups * 100 / total_groups, num_groups, - total_groups)); - } - - /* Display complete mapping of users and groups to rids */ + if (!impl) { + impl = get_impl(lp_winbind_backend()); + } + + if (impl) { + impl->status(); + } else { + DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", + lp_winbind_backend())); + } } + diff --git a/source3/nsswitch/winbindd_idmap_tdb.c b/source3/nsswitch/winbindd_idmap_tdb.c new file mode 100644 index 0000000000..f27c3c1b5f --- /dev/null +++ b/source3/nsswitch/winbindd_idmap_tdb.c @@ -0,0 +1,519 @@ +/* + Unix SMB/CIFS implementation. + + Winbind daemon - user related function + + Copyright (C) Tim Potter 2000 + Copyright (C) Anthony Liguori 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "winbindd.h" + +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_WINBIND + +/* High water mark keys */ +#define HWM_GROUP "GROUP HWM" +#define HWM_USER "USER HWM" + +/* idmap version determines auto-conversion */ +#define IDMAP_VERSION 2 + +/* Globals */ +static TDB_CONTEXT *idmap_tdb; + +/* convert one record to the new format */ +static int tdb_convert_fn(TDB_CONTEXT * tdb, TDB_DATA key, TDB_DATA data, + void *ignored) +{ + struct winbindd_domain *domain; + char *p; + DOM_SID sid; + uint32 rid; + fstring keystr; + fstring dom_name; + TDB_DATA key2; + + p = strchr(key.dptr, '/'); + if (!p) + return 0; + + *p = 0; + fstrcpy(dom_name, key.dptr); + *p++ = '/'; + + domain = find_domain_from_name(dom_name); + if (!domain) { + /* We must delete the old record. */ + DEBUG(0, + ("winbindd: tdb_convert_fn : Unable to find domain %s\n", + dom_name)); + DEBUG(0, + ("winbindd: tdb_convert_fn : deleting record %s\n", + key.dptr)); + tdb_delete(idmap_tdb, key); + return 0; + } + + rid = atoi(p); + + sid_copy(&sid, &domain->sid); + sid_append_rid(&sid, rid); + + sid_to_string(keystr, &sid); + key2.dptr = keystr; + key2.dsize = strlen(keystr) + 1; + + if (tdb_store(idmap_tdb, key2, data, TDB_INSERT) != 0) { + /* not good! */ + DEBUG(0, + ("winbindd: tdb_convert_fn : Unable to update record %s\n", + key2.dptr)); + DEBUG(0, + ("winbindd: tdb_convert_fn : conversion failed - idmap corrupt ?\n")); + return -1; + } + + if (tdb_store(idmap_tdb, data, key2, TDB_REPLACE) != 0) { + /* not good! */ + DEBUG(0, + ("winbindd: tdb_convert_fn : Unable to update record %s\n", + data.dptr)); + DEBUG(0, + ("winbindd: tdb_convert_fn : conversion failed - idmap corrupt ?\n")); + return -1; + } + + tdb_delete(idmap_tdb, key); + + return 0; +} + +/***************************************************************************** + Convert the idmap database from an older version. +*****************************************************************************/ +static BOOL tdb_idmap_convert(const char *idmap_name) +{ + int32 vers = tdb_fetch_int32(idmap_tdb, "IDMAP_VERSION"); + BOOL bigendianheader = + (idmap_tdb->flags & TDB_BIGENDIAN) ? True : False; + + if (vers == IDMAP_VERSION) + return True; + + if (((vers == -1) && bigendianheader) + || (IREV(vers) == IDMAP_VERSION)) { + /* Arrggghh ! Bytereversed or old big-endian - make order independent ! */ + /* + * high and low records were created on a + * big endian machine and will need byte-reversing. + */ + + int32 wm; + + wm = tdb_fetch_int32(idmap_tdb, HWM_USER); + + if (wm != -1) { + wm = IREV(wm); + } else + wm = server_state.uid_low; + + if (tdb_store_int32(idmap_tdb, HWM_USER, wm) == -1) { + DEBUG(0, + ("tdb_idmap_convert: Unable to byteswap user hwm in idmap database\n")); + return False; + } + + wm = tdb_fetch_int32(idmap_tdb, HWM_GROUP); + if (wm != -1) { + wm = IREV(wm); + } else + wm = server_state.gid_low; + + if (tdb_store_int32(idmap_tdb, HWM_GROUP, wm) == -1) { + DEBUG(0, + ("tdb_idmap_convert: Unable to byteswap group hwm in idmap database\n")); + return False; + } + } + + /* the old format stored as DOMAIN/rid - now we store the SID direct */ + tdb_traverse(idmap_tdb, tdb_convert_fn, NULL); + + if (tdb_store_int32(idmap_tdb, "IDMAP_VERSION", IDMAP_VERSION) == + -1) { + DEBUG(0, + ("tdb_idmap_convert: Unable to byteswap group hwm in idmap database\n")); + return False; + } + + return True; +} + +/* Allocate either a user or group id from the pool */ +static BOOL tdb_allocate_id(uid_t * id, BOOL isgroup) +{ + int hwm; + + /* Get current high water mark */ + if ((hwm = tdb_fetch_int32(idmap_tdb, + isgroup ? HWM_GROUP : HWM_USER)) == + -1) { + return False; + } + + /* Return next available uid in list */ + if ((isgroup && (hwm > server_state.gid_high)) || + (!isgroup && (hwm > server_state.uid_high))) { + DEBUG(0, + ("winbind %sid range full!\n", isgroup ? "g" : "u")); + return False; + } + + if (id) { + *id = hwm; + } + + hwm++; + + /* Store new high water mark */ + tdb_store_int32(idmap_tdb, isgroup ? HWM_GROUP : HWM_USER, hwm); + + return True; +} + +/* Get a sid from an id */ +static BOOL tdb_get_sid_from_id(int id, DOM_SID * sid, BOOL isgroup) +{ + TDB_DATA key, data; + fstring keystr; + BOOL result = False; + + slprintf(keystr, sizeof(keystr), "%s %d", isgroup ? "GID" : "UID", + id); + + key.dptr = keystr; + key.dsize = strlen(keystr) + 1; + + data = tdb_fetch(idmap_tdb, key); + + if (data.dptr) { + result = string_to_sid(sid, data.dptr); + SAFE_FREE(data.dptr); + } + + return result; +} + +/* Get an id from a sid */ +static BOOL tdb_get_id_from_sid(DOM_SID * sid, uid_t * id, BOOL isgroup) +{ + TDB_DATA data, key; + fstring keystr; + BOOL result = False; + + /* Check if sid is present in database */ + sid_to_string(keystr, sid); + + key.dptr = keystr; + key.dsize = strlen(keystr) + 1; + + data = tdb_fetch(idmap_tdb, key); + + if (data.dptr) { + fstring scanstr; + int the_id; + + /* Parse and return existing uid */ + fstrcpy(scanstr, isgroup ? "GID" : "UID"); + fstrcat(scanstr, " %d"); + + if (sscanf(data.dptr, scanstr, &the_id) == 1) { + /* Store uid */ + if (id) { + *id = the_id; + } + + result = True; + } + + SAFE_FREE(data.dptr); + } else { + + /* Allocate a new id for this sid */ + if (id && tdb_allocate_id(id, isgroup)) { + fstring keystr2; + + /* Store new id */ + slprintf(keystr2, sizeof(keystr2), "%s %d", + isgroup ? "GID" : "UID", *id); + + data.dptr = keystr2; + data.dsize = strlen(keystr2) + 1; + + tdb_store(idmap_tdb, key, data, TDB_REPLACE); + tdb_store(idmap_tdb, data, key, TDB_REPLACE); + + result = True; + } + } + + return result; +} + +/***************************************************************************** + Initialise idmap database. +*****************************************************************************/ +static BOOL tdb_idmap_init(void) +{ + /* Open tdb cache */ + if (!(idmap_tdb = tdb_open_log(lock_path("winbindd_idmap.tdb"), 0, + TDB_DEFAULT, O_RDWR | O_CREAT, + 0600))) { + DEBUG(0, + ("winbindd_idmap_init: Unable to open idmap database\n")); + return False; + } + + /* possibly convert from an earlier version */ + if (!tdb_idmap_convert(lock_path("winbindd_idmap.tdb"))) { + DEBUG(0, + ("winbindd_idmap_init: Unable to open idmap database\n")); + return False; + } + + /* Create high water marks for group and user id */ + if (tdb_fetch_int32(idmap_tdb, HWM_USER) == -1) { + if (tdb_store_int32 + (idmap_tdb, HWM_USER, server_state.uid_low) == -1) { + DEBUG(0, + ("winbindd_idmap_init: Unable to initialise user hwm in idmap database\n")); + return False; + } + } + + if (tdb_fetch_int32(idmap_tdb, HWM_GROUP) == -1) { + if (tdb_store_int32 + (idmap_tdb, HWM_GROUP, server_state.gid_low) == -1) { + DEBUG(0, + ("winbindd_idmap_init: Unable to initialise group hwm in idmap database\n")); + return False; + } + } + + return True; +} + +/* Get a sid from a uid */ +static BOOL tdb_get_sid_from_uid(uid_t uid, DOM_SID * sid) +{ + return tdb_get_sid_from_id((int) uid, sid, False); +} + +/* Get a sid from a gid */ +static BOOL tdb_get_sid_from_gid(gid_t gid, DOM_SID * sid) +{ + return tdb_get_sid_from_id((int) gid, sid, True); +} + +/* Get a uid from a sid */ +static BOOL tdb_get_uid_from_sid(DOM_SID * sid, uid_t * uid) +{ + return tdb_get_id_from_sid(sid, uid, False); +} + +/* Get a gid from a group sid */ +static BOOL tdb_get_gid_from_sid(DOM_SID * sid, gid_t * gid) +{ + return tdb_get_id_from_sid(sid, gid, True); +} + +/* Get a uid from a user rid */ +static BOOL tdb_get_uid_from_rid(const char *dom_name, uint32 rid, + uid_t * uid) +{ + struct winbindd_domain *domain; + DOM_SID sid; + + if (!(domain = find_domain_from_name(dom_name))) { + return False; + } + + sid_copy(&sid, &domain->sid); + sid_append_rid(&sid, rid); + + return tdb_get_id_from_sid(&sid, uid, False); +} + +/* Get a gid from a group rid */ +static BOOL tdb_get_gid_from_rid(const char *dom_name, uint32 rid, + gid_t * gid) +{ + struct winbindd_domain *domain; + DOM_SID sid; + + if (!(domain = find_domain_from_name(dom_name))) { + return False; + } + + sid_copy(&sid, &domain->sid); + sid_append_rid(&sid, rid); + + return tdb_get_id_from_sid(&sid, gid, True); +} + +/* Get a user rid from a uid */ +static BOOL tdb_get_rid_from_uid(uid_t uid, uint32 * user_rid, + struct winbindd_domain **domain) +{ + DOM_SID sid; + + if (!tdb_get_sid_from_id((int) uid, &sid, False)) { + return False; + } + + *domain = find_domain_from_sid(&sid); + if (!*domain) + return False; + + sid_split_rid(&sid, user_rid); + + return True; +} + +/* Get a group rid from a gid */ +static BOOL tdb_get_rid_from_gid(gid_t gid, uint32 * group_rid, + struct winbindd_domain **domain) +{ + DOM_SID sid; + + if (!tdb_get_sid_from_id((int) gid, &sid, True)) { + return False; + } + + *domain = find_domain_from_sid(&sid); + if (!*domain) + return False; + + sid_split_rid(&sid, group_rid); + + return True; +} + +/* Close the tdb */ +static BOOL tdb_idmap_close(void) +{ + if (idmap_tdb) + return (tdb_close(idmap_tdb) == 0); + return True; +} + + +/* Dump status information to log file. Display different stuff based on + the debug level: + + Debug Level Information Displayed + ================================================================= + 0 Percentage of [ug]id range allocated + 0 High water marks (next allocated ids) +*/ + +#define DUMP_INFO 0 + +static void tdb_idmap_status(void) +{ + int user_hwm, group_hwm; + + DEBUG(0, ("winbindd idmap status:\n")); + + /* Get current high water marks */ + + if ((user_hwm = tdb_fetch_int32(idmap_tdb, HWM_USER)) == -1) { + DEBUG(DUMP_INFO, + ("\tCould not get userid high water mark!\n")); + } + + if ((group_hwm = tdb_fetch_int32(idmap_tdb, HWM_GROUP)) == -1) { + DEBUG(DUMP_INFO, + ("\tCould not get groupid high water mark!\n")); + } + + /* Display next ids to allocate */ + + if (user_hwm != -1) { + DEBUG(DUMP_INFO, + ("\tNext userid to allocate is %d\n", user_hwm)); + } + + if (group_hwm != -1) { + DEBUG(DUMP_INFO, + ("\tNext groupid to allocate is %d\n", group_hwm)); + } + + /* Display percentage of id range already allocated. */ + + if (user_hwm != -1) { + int num_users = user_hwm - server_state.uid_low; + int total_users = + server_state.uid_high - server_state.uid_low; + + DEBUG(DUMP_INFO, + ("\tUser id range is %d%% full (%d of %d)\n", + num_users * 100 / total_users, num_users, + total_users)); + } + + if (group_hwm != -1) { + int num_groups = group_hwm - server_state.gid_low; + int total_groups = + server_state.gid_high - server_state.gid_low; + + DEBUG(DUMP_INFO, + ("\tGroup id range is %d%% full (%d of %d)\n", + num_groups * 100 / total_groups, num_groups, + total_groups)); + } + + /* Display complete mapping of users and groups to rids */ +} + +struct idmap_methods tdb_idmap_methods = { + tdb_idmap_init, + + tdb_get_sid_from_uid, + tdb_get_sid_from_gid, + + tdb_get_uid_from_sid, + tdb_get_gid_from_sid, + + tdb_get_rid_from_uid, + tdb_get_rid_from_gid, + + tdb_get_uid_from_rid, + tdb_get_gid_from_rid, + + tdb_idmap_close, + + tdb_idmap_status +}; + +BOOL winbind_idmap_reg_tdb(struct idmap_methods **meth) +{ + *meth = &tdb_idmap_methods; + + return True; +} diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 398ae88b97..01b6980c8f 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -8,6 +8,7 @@ Copyright (C) Simo Sorce 2001 Copyright (C) Alexander Bokovoy 2002 Copyright (C) Stefan (metze) Metzmacher 2002 + Copyright (C) Anthony Liguori 2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -171,6 +172,7 @@ typedef struct BOOL bWinbindEnumUsers; BOOL bWinbindEnumGroups; BOOL bWinbindUseDefaultDomain; + char *szWinbindBackend; char *szAddShareCommand; char *szChangeShareCommand; char *szDeleteShareCommand; @@ -1118,6 +1120,7 @@ static struct parm_struct parm_table[] = { {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, + {"winbind backend", P_STRING, P_GLOBAL, &Globals.szWinbindBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0} }; @@ -1458,6 +1461,8 @@ static void init_globals(void) Globals.bWinbindEnumGroups = True; Globals.bWinbindUseDefaultDomain = False; + string_set(&Globals.szWinbindBackend, "tdb"); + Globals.name_cache_timeout = 660; /* In seconds */ Globals.bUseSpnego = True; @@ -1630,6 +1635,7 @@ FN_GLOBAL_STRING(lp_acl_compatibility, &Globals.szAclCompat) FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers) FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups) FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain) +FN_GLOBAL_STRING(lp_winbind_backend, &Globals.szWinbindBackend) #ifdef WITH_LDAP_SAMCONFIG FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer) -- cgit From 1fc2976e14f8b79c85514d7947744bc495513670 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 21 Feb 2003 03:05:55 +0000 Subject: Doxygen janitor (This used to be commit 367997562998adb3f80602596c770d9ac319065b) --- source3/lib/util_unistr.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/source3/lib/util_unistr.c b/source3/lib/util_unistr.c index 5c9b4c783b..522ab7eb40 100644 --- a/source3/lib/util_unistr.c +++ b/source3/lib/util_unistr.c @@ -95,9 +95,14 @@ static int check_dos_char(smb_ucs2_t c) return (c == c2); } -/******************************************************************* -load the valid character map table -********************************************************************/ +/** + * Load the valid character map table from valid.dat or + * create from the configured codepage. + * + * This function is called whenever the configuration is reloaded. + * However, the valid character table is not changed if it's loaded + * from a file, because we can't unmap files. + **/ void init_valid_table(void) { static int initialised; @@ -114,6 +119,7 @@ void init_valid_table(void) return; } + /* Otherwise, using a dynamically loaded one. */ if (valid_table) free(valid_table); DEBUG(2,("creating default valid table\n")); @@ -128,6 +134,7 @@ void init_valid_table(void) } + /******************************************************************* Write a string in (little-endian) unicode format. src is in the current DOS codepage. len is the length in bytes of the -- cgit From 4834c61ebcc16397b496a8b37d5078021041b1c1 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 21 Feb 2003 04:25:04 +0000 Subject: Fix for only specifying one command with -c (This used to be commit 7418351427071edccb2e825ddbbf31fce8ef381e) --- source3/rpcclient/rpcclient.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index 37ce597d4e..7a9c464cf6 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -170,7 +170,10 @@ static char* next_command (char** cmdstr) if (p) *p = '\0'; pstrcpy(command, *cmdstr); - *cmdstr = p + 1; + if (p) + *cmdstr = p + 1; + else + *cmdstr = NULL; return command; } -- cgit From ae8d3538c762af4d2b5672cc3c9dd11f1c2db59b Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 21 Feb 2003 04:26:58 +0000 Subject: Exit path cleanup for cli_samr_enum_dom_users() (This used to be commit 0bc1dfc68b0d411801a4209c9681c735cd7a73cc) --- source3/rpc_client/cli_samr.c | 52 +++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/source3/rpc_client/cli_samr.c b/source3/rpc_client/cli_samr.c index f0035ca22e..08c68b7632 100644 --- a/source3/rpc_client/cli_samr.c +++ b/source3/rpc_client/cli_samr.c @@ -561,8 +561,8 @@ NTSTATUS cli_samr_enum_dom_users(struct cli_state *cli, TALLOC_CTX *mem_ctx, uint32 size, char ***dom_users, uint32 **rids, uint32 *num_dom_users) { - prs_struct qdata; - prs_struct rdata; + prs_struct qbuf; + prs_struct rbuf; SAMR_Q_ENUM_DOM_USERS q; SAMR_R_ENUM_DOM_USERS r; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -571,40 +571,24 @@ NTSTATUS cli_samr_enum_dom_users(struct cli_state *cli, TALLOC_CTX *mem_ctx, ZERO_STRUCT(q); ZERO_STRUCT(r); - if (cli == NULL || pol == NULL) - return result; - - /* initialise parse structures */ - prs_init(&qdata, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); - prs_init(&rdata, 0, mem_ctx, UNMARSHALL); - - DEBUG(4, ("SAMR Enum Domain Users. start_idx: %d, acb: %d, size: %d\n", - *start_idx, acb_mask, size)); + /* Initialise parse structures */ + + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); - /* fill query structure with parameters */ + /* Fill query structure with parameters */ + init_samr_q_enum_dom_users(&q, pol, *start_idx, acb_mask, 0, size); - /* prepare query stream */ - if (!samr_io_q_enum_dom_users("", &q, &qdata, 0)) { - prs_mem_free(&qdata); - prs_mem_free(&rdata); - return result; - } - - /* send rpc call over the pipe */ - if (!rpc_api_pipe_req(cli, SAMR_ENUM_DOM_USERS, &qdata, &rdata)) { - prs_mem_free(&qdata); - prs_mem_free(&rdata); - return result; + if (!samr_io_q_enum_dom_users("", &q, &qbuf, 0) || + !rpc_api_pipe_req(cli, SAMR_ENUM_DOM_USERS, &qbuf, &rbuf)) { + goto done; } - + /* unpack received stream */ - if(!samr_io_r_enum_dom_users("", &r, &rdata, 0)) { - prs_mem_free(&qdata); - prs_mem_free(&rdata); - result = r.status; - return result; - } + + if(!samr_io_r_enum_dom_users("", &r, &rbuf, 0)) + goto done; /* return the data obtained in response */ if (!NT_STATUS_IS_OK(r.status) && @@ -641,13 +625,13 @@ NTSTATUS cli_samr_enum_dom_users(struct cli_state *cli, TALLOC_CTX *mem_ctx, } } - prs_mem_free(&qdata); - prs_mem_free(&rdata); +done: + prs_mem_free(&qbuf); + prs_mem_free(&rbuf); return result; }; - /* Enumerate domain groups */ NTSTATUS cli_samr_enum_dom_groups(struct cli_state *cli, TALLOC_CTX *mem_ctx, -- cgit From 696895d5b1c7749e7efa512330a970bbda74edab Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 21 Feb 2003 04:28:32 +0000 Subject: Added enumdomusers command. (This used to be commit 30353da3e94f732e9f1b258e62da906f628e09d0) --- source3/rpcclient/cmd_samr.c | 75 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index 9e8d105c46..85aface7be 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -626,6 +626,80 @@ static NTSTATUS cmd_samr_query_groupmem(struct cli_state *cli, return result; } +/* Enumerate domain users */ + +static NTSTATUS cmd_samr_enum_dom_users(struct cli_state *cli, + TALLOC_CTX *mem_ctx, + int argc, char **argv) +{ + POLICY_HND connect_pol, domain_pol; + NTSTATUS result = NT_STATUS_UNSUCCESSFUL; + uint32 start_idx, size, num_dom_users, i; + char **dom_users; + uint32 *dom_rids; + uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; + uint16 acb_mask = ACB_NORMAL; + BOOL got_connect_pol = False, got_domain_pol = False; + + if ((argc < 1) || (argc > 2)) { + printf("Usage: %s [access_mask]\n", argv[0]); + return NT_STATUS_OK; + } + + if (argc > 1) + sscanf(argv[1], "%x", &access_mask); + + /* Get sam policy handle */ + + result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, + &connect_pol); + + if (!NT_STATUS_IS_OK(result)) + goto done; + + got_connect_pol = True; + + /* Get domain policy handle */ + + result = cli_samr_open_domain(cli, mem_ctx, &connect_pol, + access_mask, + &domain_sid, &domain_pol); + + if (!NT_STATUS_IS_OK(result)) + goto done; + + got_domain_pol = True; + + /* Enumerate domain users */ + + start_idx = 0; + size = 0xffff; + + do { + result = cli_samr_enum_dom_users( + cli, mem_ctx, &domain_pol, &start_idx, acb_mask, + size, &dom_users, &dom_rids, &num_dom_users); + + if (NT_STATUS_IS_OK(result) || + NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES)) { + + for (i = 0; i < num_dom_users; i++) + printf("group:[%s] rid:[0x%x]\n", + dom_users[i], dom_rids[i]); + } + + } while (NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES)); + + done: + if (got_domain_pol) + cli_samr_close(cli, mem_ctx, &domain_pol); + + if (got_connect_pol) + cli_samr_close(cli, mem_ctx, &connect_pol); + + return result; +} + /* Enumerate domain groups */ static NTSTATUS cmd_samr_enum_dom_groups(struct cli_state *cli, @@ -1428,6 +1502,7 @@ struct cmd_set samr_commands[] = { { "queryaliasmem", cmd_samr_query_aliasmem, PI_SAMR, "Query alias membership", "" }, { "querydispinfo", cmd_samr_query_dispinfo, PI_SAMR, "Query display info", "" }, { "querydominfo", cmd_samr_query_dominfo, PI_SAMR, "Query domain info", "" }, + { "enumdomusers", cmd_samr_enum_dom_users, PI_SAMR, "Enumerate domain users", "" }, { "enumdomgroups", cmd_samr_enum_dom_groups, PI_SAMR, "Enumerate domain groups", "" }, { "enumalsgroups", cmd_samr_enum_als_groups, PI_SAMR, "Enumerate alias groups", "" }, -- cgit From 9383d61f6c61ba8600ec73d22bd6f048c55a5261 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 21 Feb 2003 04:47:24 +0000 Subject: Fixed compiler warning. (This used to be commit b3f9cf8c1c293e905a536dfa5bb6a827627b7024) --- source3/rpc_server/srv_lsa_nt.c | 2 +- source3/smbd/sesssetup.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/source3/rpc_server/srv_lsa_nt.c b/source3/rpc_server/srv_lsa_nt.c index b230381d62..1b42c5f141 100644 --- a/source3/rpc_server/srv_lsa_nt.c +++ b/source3/rpc_server/srv_lsa_nt.c @@ -1280,7 +1280,7 @@ NTSTATUS _lsa_enum_acct_rights(pipes_struct *p, LSA_Q_ENUM_ACCT_RIGHTS *q_u, LSA r_u->status = privilege_enum_account_rights(&q_u->sid.sid, &num_rights, &rights); - init_r_enum_acct_rights(r_u, num_rights, rights); + init_r_enum_acct_rights(r_u, num_rights, (const char **)rights); for (i=0;i Date: Fri, 21 Feb 2003 04:53:39 +0000 Subject: Fixed another compiler warning. (This used to be commit d15b7425d408f17505c4f3a91ec68bcfc4472c16) --- source3/utils/net_ads.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c index d508320423..75bb29f213 100644 --- a/source3/utils/net_ads.c +++ b/source3/utils/net_ads.c @@ -110,7 +110,7 @@ static int net_ads_info(int argc, const char **argv) return 0; } -static void use_in_memory_ccache() { +static void use_in_memory_ccache(void) { /* Use in-memory credentials cache so we do not interfere with * existing credentials */ setenv(KRB5_ENV_CCNAME, "MEMORY:net_ads", 1); -- cgit From 7eff9dd5eff7656aa4b41ac0c413c28776b81b9e Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 21 Feb 2003 05:06:49 +0000 Subject: Fix another compiler warning. (This used to be commit 1ea27d7987d2c0f67977371a99efec3ded13c872) --- source3/nsswitch/winbindd_ads.c | 1 - 1 file changed, 1 deletion(-) diff --git a/source3/nsswitch/winbindd_ads.c b/source3/nsswitch/winbindd_ads.c index 9560a53fa0..9fd391870b 100644 --- a/source3/nsswitch/winbindd_ads.c +++ b/source3/nsswitch/winbindd_ads.c @@ -39,7 +39,6 @@ static ADS_STRUCT *ads_cached_connection(struct winbindd_domain *domain) { ADS_STRUCT *ads; ADS_STATUS status; - char *ccache; if (domain->private) { return (ADS_STRUCT *)domain->private; -- cgit From e1c987abf2c716e26d2484a89e23507d1d2a9c5e Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 21 Feb 2003 05:07:51 +0000 Subject: Doesn't anyone run ./configure.developer anymore? (This used to be commit 09be123c6c1b67621eaf6c8ffb3016eccd375e5b) --- source3/libsmb/cliconnect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index c57f92eea9..901daf4b09 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -453,7 +453,7 @@ static DATA_BLOB cli_session_setup_blob(struct cli_state *cli, DATA_BLOB blob) /**************************************************************************** Use in-memory credentials cache ****************************************************************************/ -static void use_in_memory_ccache() { +static void use_in_memory_ccache(void) { setenv(KRB5_ENV_CCNAME, "MEMORY:cliconnect", 1); } -- cgit From 6a46281dbb9c1f1f3278f199e812ba71bd0b45b8 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 21 Feb 2003 05:51:10 +0000 Subject: Ignore errors on python_clean target. (This used to be commit 3805a9c5d5e98e089e1cd9e794f7204fc354a311) --- source3/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index efc3b935b4..cbd8418a48 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1085,7 +1085,7 @@ python_install: $(PYTHON_OBJS) $(PYTHON) python/setup.py install python_clean: - @if test -n "$(PYTHON)"; then $(PYTHON) python/setup.py clean; fi + @-if test -n "$(PYTHON)"; then $(PYTHON) python/setup.py clean; fi # revert to the previously installed version revert: -- cgit From 2935d153763ca3f40de974418c479c4ef6cd4ec0 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 21 Feb 2003 06:25:39 +0000 Subject: Added comments to make it clearer when we're assigning a pointer that it must not be freed afterwards. Jeremy. (This used to be commit 80bad908c0235a57446c70b9632d3415c9d2fcf5) --- source3/smbd/posix_acls.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index a40fb4042f..93a57925f1 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -1000,8 +1000,16 @@ Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name )); return False; } + /* + * We must not free current_ace here as its + * pointer is now owned by the dir_ace list. + */ current_ace = dup_ace; } else { + /* + * We must not free current_ace here as its + * pointer is now owned by the dir_ace list. + */ current_ace = NULL; } } @@ -1036,6 +1044,10 @@ Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name )); print_canon_ace( current_ace, 0); } all_aces_are_inherit_only = False; + /* + * We must not free current_ace here as its + * pointer is now owned by the file_ace list. + */ current_ace = NULL; } -- cgit From db721d24c5ed337e2fd69860d0a4011a6c1f3e2d Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Fri, 21 Feb 2003 13:25:10 +0000 Subject: rename 'winbind backend' to 'idmap backend'. Put paramter in security section...does this make sense? (This used to be commit 822083f73e8ba4e096c53ff0f7578f47bc21b7b5) --- source3/nsswitch/winbindd_idmap.c | 46 +++++++++++++++++++-------------------- source3/param/loadparm.c | 8 +++---- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/source3/nsswitch/winbindd_idmap.c b/source3/nsswitch/winbindd_idmap.c index d9448ef859..0a17fcd87f 100644 --- a/source3/nsswitch/winbindd_idmap.c +++ b/source3/nsswitch/winbindd_idmap.c @@ -62,13 +62,13 @@ BOOL winbindd_idmap_init(void) BOOL ret = False; DEBUG(3, ("winbindd_idmap_init: using '%s' as backend\n", - lp_winbind_backend())); + lp_idmap_backend())); if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); if (!impl) { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } } @@ -87,10 +87,10 @@ BOOL winbindd_idmap_get_uid_from_sid(DOM_SID *sid, uid_t *uid) BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); if (!impl) { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } } @@ -107,10 +107,10 @@ BOOL winbindd_idmap_get_gid_from_sid(DOM_SID *sid, gid_t *gid) BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); if (!impl) { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } } @@ -128,10 +128,10 @@ BOOL winbindd_idmap_get_uid_from_rid(const char *dom_name, uint32 rid, BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); if (!impl) { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } } @@ -149,10 +149,10 @@ BOOL winbindd_idmap_get_gid_from_rid(const char *dom_name, uint32 rid, BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); if (!impl) { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } } @@ -169,10 +169,10 @@ BOOL winbindd_idmap_get_sid_from_uid(uid_t uid, DOM_SID *sid) BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); if (!impl) { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } } @@ -189,14 +189,14 @@ BOOL winbindd_idmap_get_sid_from_gid(gid_t gid, DOM_SID *sid) BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); } if (impl) { ret = impl->get_sid_from_gid(gid, sid); } else { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } return ret; @@ -209,14 +209,14 @@ BOOL winbindd_idmap_get_rid_from_uid(uid_t uid, uint32 *user_rid, BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); } if (impl) { ret = impl->get_rid_from_uid(uid, user_rid, domain); } else { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } return ret; @@ -229,14 +229,14 @@ BOOL winbindd_idmap_get_rid_from_gid(gid_t gid, uint32 *group_rid, BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); } if (impl) { ret = impl->get_rid_from_gid(gid, group_rid, domain); } else { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } return ret; @@ -248,14 +248,14 @@ BOOL winbindd_idmap_close(void) BOOL ret = False; if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); } if (impl) { ret = impl->close(); } else { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } return ret; @@ -265,14 +265,14 @@ BOOL winbindd_idmap_close(void) void winbindd_idmap_status(void) { if (!impl) { - impl = get_impl(lp_winbind_backend()); + impl = get_impl(lp_idmap_backend()); } if (impl) { impl->status(); } else { DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_winbind_backend())); + lp_idmap_backend())); } } diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 01b6980c8f..7aaae439b1 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -172,7 +172,7 @@ typedef struct BOOL bWinbindEnumUsers; BOOL bWinbindEnumGroups; BOOL bWinbindUseDefaultDomain; - char *szWinbindBackend; + char *szIDMapBackend; char *szAddShareCommand; char *szChangeShareCommand; char *szDeleteShareCommand; @@ -749,6 +749,7 @@ static struct parm_struct parm_table[] = { {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER}, {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, + {"idmap backend", P_STRING, P_GLOBAL, &Globals.szIDMapBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, FLAG_ADVANCED | FLAG_DEVELOPER}, @@ -1120,7 +1121,6 @@ static struct parm_struct parm_table[] = { {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, - {"winbind backend", P_STRING, P_GLOBAL, &Globals.szWinbindBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0} }; @@ -1461,7 +1461,7 @@ static void init_globals(void) Globals.bWinbindEnumGroups = True; Globals.bWinbindUseDefaultDomain = False; - string_set(&Globals.szWinbindBackend, "tdb"); + string_set(&Globals.szIDMapBackend, "tdb"); Globals.name_cache_timeout = 660; /* In seconds */ @@ -1635,7 +1635,7 @@ FN_GLOBAL_STRING(lp_acl_compatibility, &Globals.szAclCompat) FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers) FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups) FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain) -FN_GLOBAL_STRING(lp_winbind_backend, &Globals.szWinbindBackend) +FN_GLOBAL_STRING(lp_idmap_backend, &Globals.szIDMapBackend) #ifdef WITH_LDAP_SAMCONFIG FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer) -- cgit From 23553b48e6bd21481ca32c4b3ee54fc1aded4174 Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Fri, 21 Feb 2003 14:35:02 +0000 Subject: Fix IRIX build...void fn can't return another void fn (This used to be commit df3c7c9cbb275e9c35356b4f1cab1a741de6f500) --- source3/libsmb/clikrb5.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index 96e737166c..bef6998a49 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -131,7 +131,8 @@ krb5_error_code get_kerberos_allowed_etypes(krb5_context context, krb5_enctype *enctypes) { #if defined(HAVE_KRB5_FREE_KTYPES) - return krb5_free_ktypes(context, enctypes); + krb5_free_ktypes(context, enctypes); + return; #else SAFE_FREE(enctypes); return; -- cgit From 193f9200aa4ea692e9126f3df68a5cb83e3a4056 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 21 Feb 2003 16:15:30 +0000 Subject: patch from Hal Roberts check for a valid [f]chmod_acl function pointer before calling it. Fixes seg fault in audit VFS module (This used to be commit 5e115d43812021f9a16111fc7c05d750026cca1e) --- source3/modules/vfs_audit.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source3/modules/vfs_audit.c b/source3/modules/vfs_audit.c index 92b78c1c32..1944c98e53 100644 --- a/source3/modules/vfs_audit.c +++ b/source3/modules/vfs_audit.c @@ -233,7 +233,12 @@ static int audit_chmod(struct connection_struct *conn, const char *path, mode_t static int audit_chmod_acl(struct connection_struct *conn, const char *path, mode_t mode) { - int result = default_vfs_ops.chmod_acl(conn, path, mode); + int result; + + if ( !default_vfs_ops.chmod_acl ) + return 0; + + result = default_vfs_ops.chmod_acl(conn, path, mode); syslog(SYSLOG_PRIORITY, "chmod_acl %s mode 0x%x %s%s\n", path, mode, @@ -257,7 +262,12 @@ static int audit_fchmod(struct files_struct *fsp, int fd, mode_t mode) static int audit_fchmod_acl(struct files_struct *fsp, int fd, mode_t mode) { - int result = default_vfs_ops.fchmod_acl(fsp, fd, mode); + int result; + + if ( !default_vfs_ops.fchmod_acl ) + return 0; + + result = default_vfs_ops.fchmod_acl(fsp, fd, mode); syslog(SYSLOG_PRIORITY, "fchmod_acl %s mode 0x%x %s%s\n", fsp->fsp_name, mode, -- cgit From ab985b983f45a284b2ee9fdd08801989574edf4b Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 21 Feb 2003 17:08:43 +0000 Subject: couple of merges from APP_HEAD * performance optimization in enumprinterdataex() when keyname is empty * fix a few typos in comments * reload services after addprinter_command() dump registry data in ascii when the key is REG_SZ or REG_MULTI_SZ (This used to be commit fde6ef7cc62c58d512dc8053b214f0a3c59a78ab) --- source3/rpc_parse/parse_spoolss.c | 2 +- source3/rpc_server/srv_spoolss_nt.c | 27 ++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index cb3b2efd9d..fb2aaf71ec 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -1372,7 +1372,7 @@ BOOL spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, return False; } - if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size)) + if (!prs_uint8s( r_u->type&(REG_SZ|REG_MULTI_SZ), "data", ps, depth, r_u->data, r_u->size )) return False; if (!prs_align(ps)) diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index d94bebf4c1..4c87d0f73d 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -615,7 +615,7 @@ static BOOL is_monitoring_event(Printer_entry *p, uint16 notify_type, /* * Flags should always be zero when the change notify - * is registered by the cliebnt's spooler. A user Win32 app + * is registered by the client's spooler. A user Win32 app * might use the flags though instead of the NOTIFY_OPTION_INFO * --jerry */ @@ -5936,6 +5936,13 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, result = WERR_ACCESS_DENIED; goto done; } + + /* + * make sure we actually reload the services after + * this as smb.conf could have a new section in it + * .... shouldn't .... but could + */ + reload_services(False); } /* @@ -8871,11 +8878,24 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_ DEBUG(4,("_spoolss_enumprinterdataex\n")); if (!Printer) { - DEBUG(2,("_spoolss_enumprinterdata: Invalid handle (%s:%u:%u1<).\n", OUR_HANDLE(handle))); + DEBUG(2,("_spoolss_enumprinterdataex: Invalid handle (%s:%u:%u1<).\n", OUR_HANDLE(handle))); return WERR_BADFID; } - /* first get the printer off of disk */ + /* + * first check for a keyname of NULL or "". Win2k seems to send + * this a lot and we should send back WERR_INVALID_PARAM + * no need to spend time looking up the printer in this case. + * --jerry + */ + + unistr2_to_dos(key, &q_u->key, sizeof(key) - 1); + if ( !strlen(key) ) { + result = WERR_INVALID_PARAM; + goto done; + } + + /* get the printer off of disk */ if (!get_printer_snum(p,handle, &snum)) return WERR_BADFID; @@ -8971,6 +8991,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_ done: + if ( printer ) free_a_printer(&printer, 2); return result; -- cgit From 3d730f89cf3c30d8b17f0d35d2cdf28db53296e2 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 21 Feb 2003 20:00:46 +0000 Subject: i patched the wrong branch! s/unistr2_to_dos/unistr2_to_ascii/ (This used to be commit 513fb2ddd85a74de7684a6cb09d57011af69161f) --- source3/rpc_server/srv_spoolss_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 4c87d0f73d..93566c2bb7 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -8889,7 +8889,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_ * --jerry */ - unistr2_to_dos(key, &q_u->key, sizeof(key) - 1); + unistr2_to_ascii(key, &q_u->key, sizeof(key) - 1); if ( !strlen(key) ) { result = WERR_INVALID_PARAM; goto done; -- cgit From 301ebd6324138b9628638c0020597227d0cbf959 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 00:54:08 +0000 Subject: Fix a DEBUG() formatting, add some more debug to our SID pulling code and inline the call to prs_copy_all_data_out() so that we can know we are not overrunning our buffer. Also check more return values. Andrew Bartlett (This used to be commit e3b73d5d658584428c81c9ef3ccf024687a56e2f) --- source3/libads/ldap.c | 51 +++++++++++++++++++++++++-------------- source3/nsswitch/winbindd_group.c | 2 +- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index 67669fc078..bc90e90ea0 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -816,18 +816,18 @@ static ADS_STATUS ads_modlist_add(TALLOC_CTX *ctx, ADS_MODLIST *mods, { int curmod; LDAPMod **modlist = (LDAPMod **) *mods; - void **values; + struct berval **ber_values; + char **char_values; if (!invals) { - values = NULL; mod_op = LDAP_MOD_DELETE; } else { if (mod_op & LDAP_MOD_BVALUES) - values = (void **) ads_dup_values(ctx, - (const struct berval **)invals); + ber_values = ads_dup_values(ctx, + (const struct berval **)invals); else - values = (void **) ads_push_strvals(ctx, - (const char **) invals); + char_values = ads_push_strvals(ctx, + (const char **) invals); } /* find the first empty slot */ @@ -846,10 +846,14 @@ static ADS_STATUS ads_modlist_add(TALLOC_CTX *ctx, ADS_MODLIST *mods, if (!(modlist[curmod] = talloc_zero(ctx, sizeof(LDAPMod)))) return ADS_ERROR(LDAP_NO_MEMORY); modlist[curmod]->mod_type = talloc_strdup(ctx, name); - if (mod_op & LDAP_MOD_BVALUES) - modlist[curmod]->mod_bvalues = (struct berval **) values; - else - modlist[curmod]->mod_values = (char **) values; + if (mod_op & LDAP_MOD_BVALUES) { + modlist[curmod]->mod_bvalues = ber_values; + } else if (mod_op & LDAP_MOD_DELETE) { + modlist[curmod]->mod_values = NULL; + } else { + modlist[curmod]->mod_values = char_values; + } + modlist[curmod]->mod_op = mod_op; return ADS_ERROR(LDAP_SUCCESS); } @@ -1500,16 +1504,24 @@ ADS_STATUS ads_set_machine_sd(ADS_STRUCT *ads, const char *hostname, char *dn) #endif if (!(mods = ads_init_mods(ctx))) return ADS_ERROR(LDAP_NO_MEMORY); - bval.bv_len = sd_size; - bval.bv_val = talloc(ctx, sd_size); + bval.bv_len = prs_offset(&ps_wire); + bval.bv_val = talloc(ctx, bval.bv_len); if (!bval.bv_val) { ret = ADS_ERROR(LDAP_NO_MEMORY); goto ads_set_sd_error; } - prs_copy_all_data_out(bval.bv_val, &ps_wire); - ads_mod_ber(ctx, &mods, attrs[0], &bval); - ret = ads_gen_mod(ads, dn, mods); + prs_set_offset(&ps_wire, 0); + + if (!prs_copy_data_out(bval.bv_val, &ps_wire, bval.bv_len)) { + ret = ADS_ERROR(LDAP_NO_MEMORY); + goto ads_set_sd_error; + } + + ret = ads_mod_ber(ctx, &mods, attrs[0], &bval); + if (ADS_ERR_OK(ret)) { + ret = ads_gen_mod(ads, dn, mods); + } ads_set_sd_error: ads_msgfree(ads, res); @@ -1554,7 +1566,7 @@ char *ads_pull_string(ADS_STRUCT *ads, char **values; char *ret = NULL; char *ux_string; - int rc; + size_t rc; values = ldap_get_values(ads->ld, msg, field); if (!values) @@ -1563,7 +1575,7 @@ char *ads_pull_string(ADS_STRUCT *ads, if (values[0]) { rc = pull_utf8_talloc(mem_ctx, &ux_string, values[0]); - if (rc != -1) + if (rc != (size_t)-1) ret = ux_string; } @@ -1725,8 +1737,11 @@ int ads_pull_sids(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx, count = 0; for (i=0; values[i]; i++) { ret = sid_parse(values[i]->bv_val, values[i]->bv_len, &(*sids)[count]); - if (ret) + if (ret) { + fstring sid; + DEBUG(10, ("pulling SID: %s\n", sid_to_string(sid, &(*sids)[count]))); count++; + } } ldap_value_free_len(values); diff --git a/source3/nsswitch/winbindd_group.c b/source3/nsswitch/winbindd_group.c index 6b2f05f436..94a826fbbc 100644 --- a/source3/nsswitch/winbindd_group.c +++ b/source3/nsswitch/winbindd_group.c @@ -434,7 +434,7 @@ static BOOL get_sam_group_entries(struct getent_state *ent) status = domain->methods->enum_dom_groups(domain, mem_ctx, &num_entries, &sam_grp_entries); if (!NT_STATUS_IS_OK(status)) { - DEBUG(3, ("get_sam_group_entries: could not enumerate domain groups! Error: %s", nt_errstr(status))); + DEBUG(3, ("get_sam_group_entries: could not enumerate domain groups! Error: %s\n", nt_errstr(status))); result = False; goto done; } -- cgit From ca2e9955764fa0bec3ace1fc049f13bb8e2961ac Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 22 Feb 2003 01:08:19 +0000 Subject: New locktest7 code based on patch from "Srikanta Shivanna" Jeremy. (This used to be commit caf298c3808cbdd683e884b32b7a0538505a3066) --- source3/torture/torture.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 97e864de96..fe53baae7e 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -1569,6 +1569,139 @@ static BOOL run_locktest6(int dummy) return True; } +static BOOL run_locktest7(int dummy) +{ + static struct cli_state cli1; + const char *fname = "\\lockt7.lck"; + int fnum1; + char buf[200]; + BOOL correct = False; + + if (!torture_open_connection(&cli1)) { + return False; + } + + cli_sockopt(&cli1, sockops); + + printf("starting locktest7\n"); + + cli_unlink(&cli1, fname); + + fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE); + + memset(buf, 0, sizeof(buf)); + + if (cli_write(&cli1, fnum1, 0, buf, 0, sizeof(buf)) != sizeof(buf)) { + printf("Failed to create file\n"); + goto fail; + } + + cli_setpid(&cli1, 1); + + if (!cli_lock(&cli1, fnum1, 130, 4, 0, READ_LOCK)) { + printf("Unable to apply read lock on range 130:4, error was %s\n", cli_errstr(&cli1)); + goto fail; + } else { + printf("pid1 successfully locked range 130:4 for READ\n"); + } + + if (cli_read(&cli1, fnum1, buf, 130, 4) != 4) { + printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(&cli1)); + goto fail; + } else { + printf("pid1 successfully read the range 130:4\n"); + } + + if (cli_write(&cli1, fnum1, 0, buf, 130, 4) != 4) { + printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(&cli1)); + if (NT_STATUS_V(cli_nt_error(&cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) { + printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n"); + goto fail; + } + } else { + printf("pid1 successfully wrote to the range 130:4 (should be denied)\n"); + goto fail; + } + + cli_setpid(&cli1, 2); + + if (cli_read(&cli1, fnum1, buf, 130, 4) != 4) { + printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(&cli1)); + } else { + printf("pid2 successfully read the range 130:4\n"); + } + + if (cli_write(&cli1, fnum1, 0, buf, 130, 4) != 4) { + printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(&cli1)); + if (NT_STATUS_V(cli_nt_error(&cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) { + printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n"); + goto fail; + } + } else { + printf("pid2 successfully wrote to the range 130:4 (should be denied)\n"); + goto fail; + } + + cli_setpid(&cli1, 1); + cli_unlock(&cli1, fnum1, 130, 4); + + if (!cli_lock(&cli1, fnum1, 130, 4, 0, WRITE_LOCK)) { + printf("Unable to apply write lock on range 130:4, error was %s\n", cli_errstr(&cli1)); + goto fail; + } else { + printf("pid1 successfully locked range 130:4 for WRITE\n"); + } + + if (cli_read(&cli1, fnum1, buf, 130, 4) != 4) { + printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(&cli1)); + goto fail; + } else { + printf("pid1 successfully read the range 130:4\n"); + } + + if (cli_write(&cli1, fnum1, 0, buf, 130, 4) != 4) { + printf("pid1 unable to write to the range 130:4, error was %s\n", cli_errstr(&cli1)); + goto fail; + } else { + printf("pid1 successfully wrote to the range 130:4\n"); + } + + cli_setpid(&cli1, 2); + + if (cli_read(&cli1, fnum1, buf, 130, 4) != 4) { + printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(&cli1)); + if (NT_STATUS_V(cli_nt_error(&cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) { + printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n"); + goto fail; + } + } else { + printf("pid2 successfully read the range 130:4 (should be denied)\n"); + goto fail; + } + + if (cli_write(&cli1, fnum1, 0, buf, 130, 4) != 4) { + printf("pid2 unable to write to the range 130:4, error was %s\n", cli_errstr(&cli1)); + if (NT_STATUS_V(cli_nt_error(&cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) { + printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n"); + goto fail; + } + } else { + printf("pid2 successfully wrote to the range 130:4 (should be denied)\n"); + goto fail; + } + + cli_unlock(&cli1, fnum1, 130, 0); + correct = True; + +fail: + cli_close(&cli1, fnum1); + cli_unlink(&cli1, fname); + torture_close_connection(&cli1); + + printf("finished locktest7\n"); + return correct; +} + /* test whether fnums and tids open on one VC are available on another (a major security hole) @@ -3956,6 +4089,7 @@ static struct { {"LOCK4", run_locktest4, 0}, {"LOCK5", run_locktest5, 0}, {"LOCK6", run_locktest6, 0}, + {"LOCK7", run_locktest7, 0}, {"UNLINK", run_unlinktest, 0}, {"BROWSE", run_browsetest, 0}, {"ATTR", run_attrtest, 0}, -- cgit From 4fdb86eb3b9b7eb01a90e3f3a846fb9f223d7208 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 22 Feb 2003 01:09:42 +0000 Subject: When checking is_locked() new WRITE locks conflict with existing READ locks even if the context is the same. See LOCKTEST7 in smbtorture. Jeremy. (This used to be commit b362cc241b829f585a96b5d285ed12db50b21e2e) --- source3/locking/brlock.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 8c22f7d7ab..9902c7bbd7 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -151,9 +151,16 @@ static BOOL brl_conflict_other(struct lock_struct *lck1, struct lock_struct *lck if (lck1->lock_type == READ_LOCK && lck2->lock_type == READ_LOCK) return False; - if (brl_same_context(&lck1->context, &lck2->context) && - lck1->fnum == lck2->fnum) - return False; + /* + * Incoming WRITE locks conflict with existing READ locks even + * if the context is the same. JRA. See LOCKTEST7 in smbtorture. + */ + + if (!(lck2->lock_type == WRITE_LOCK && lck1->lock_type == READ_LOCK)) { + if (brl_same_context(&lck1->context, &lck2->context) && + lck1->fnum == lck2->fnum) + return False; + } if (lck1->start >= (lck2->start + lck2->size) || lck2->start >= (lck1->start + lck1->size)) return False; -- cgit From ab43a25b2893506d5de305626dfbbf98966f1f78 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 11:34:04 +0000 Subject: First check if the user is in the passdb, then check Get_Pwnam(). We check passdb becouse the user might have things like a logon script set, but we have to check the passdb becouse the user might not be in smbpasswd at all. This is in preperation for the removal of unixsam as an assuption. Andrew Bartlett (This used to be commit 61e3e2695860c58f9b0e8d1856972318666682c8) --- source3/auth/auth_rhosts.c | 62 +++++++++++++++++++++++----------------------- source3/auth/auth_util.c | 30 ++++++++++++++++++++++ 2 files changed, 61 insertions(+), 31 deletions(-) diff --git a/source3/auth/auth_rhosts.c b/source3/auth/auth_rhosts.c index 4ed0e6bbc4..d8e1b01942 100644 --- a/source3/auth/auth_rhosts.c +++ b/source3/auth/auth_rhosts.c @@ -129,23 +129,19 @@ static BOOL check_user_equiv(const char *user, const char *remote, const char *e return False; } - /**************************************************************************** check for a possible hosts equiv or rhosts entry for the user ****************************************************************************/ -static BOOL check_hosts_equiv(struct passwd *pass) +static BOOL check_hosts_equiv(SAM_ACCOUNT *account) { char *fname = NULL; - if (!pass) - return(False); - fname = lp_hosts_equiv(); /* note: don't allow hosts.equiv on root */ - if (fname && *fname && (pass->pw_uid != 0)) { - if (check_user_equiv(pass->pw_name,client_name(),fname)) + if (IS_SAM_UNIX_USER(account) && fname && *fname && (pdb_get_uid(account) != 0)) { + if (check_user_equiv(pdb_get_username(account),client_name(),fname)) return(True); } @@ -164,15 +160,15 @@ static NTSTATUS check_hostsequiv_security(const struct auth_context *auth_contex auth_serversupplied_info **server_info) { NTSTATUS nt_status = NT_STATUS_LOGON_FAILURE; - struct passwd *pass = Get_Pwnam(user_info->internal_username.str); - - if (pass) { - if (check_hosts_equiv(pass)) { - nt_status = NT_STATUS_OK; - make_server_info_pw(server_info, pass); - } - } else { - nt_status = NT_STATUS_NO_SUCH_USER; + SAM_ACCOUNT *account = NULL; + if (!NT_STATUS_IS_OK(nt_status = + auth_get_sam_account(user_info->internal_username.str, + &account))) { + return nt_status; + } + + if (check_hosts_equiv(account)) { + nt_status = make_server_info_sam(server_info, account); } return nt_status; @@ -186,6 +182,7 @@ NTSTATUS auth_init_hostsequiv(struct auth_context *auth_context, const char* par } (*auth_method)->auth = check_hostsequiv_security; + (*auth_method)->name = "hostsequiv"; return NT_STATUS_OK; } @@ -201,24 +198,26 @@ static NTSTATUS check_rhosts_security(const struct auth_context *auth_context, auth_serversupplied_info **server_info) { NTSTATUS nt_status = NT_STATUS_LOGON_FAILURE; - struct passwd *pass = Get_Pwnam(user_info->internal_username.str); - pstring rhostsfile; + SAM_ACCOUNT *account = NULL; - if (pass) { - char *home = pass->pw_dir; - if (home) { - slprintf(rhostsfile, sizeof(rhostsfile)-1, "%s/.rhosts", home); - become_root(); - if (check_user_equiv(pass->pw_name,client_name(),rhostsfile)) { - nt_status = NT_STATUS_OK; - make_server_info_pw(server_info, pass); - } - unbecome_root(); - } - } else { - nt_status = NT_STATUS_NO_SUCH_USER; + if (!NT_STATUS_IS_OK(nt_status = + auth_get_sam_account(user_info->internal_username.str, + &account))) { + return nt_status; } + pstring rhostsfile; + + char *home = pdb_get_unix_homedir(account); + if (home) { + slprintf(rhostsfile, sizeof(rhostsfile)-1, "%s/.rhosts", home); + become_root(); + if (check_user_equiv(pdb_get_username(account),client_name(),rhostsfile)) { + nt_status = make_server_info_sam(server_info, account); + } + unbecome_root(); + } + return nt_status; } @@ -230,5 +229,6 @@ NTSTATUS auth_init_rhosts(struct auth_context *auth_context, const char *param, } (*auth_method)->auth = check_rhosts_security; + (*auth_method)->name = "rhosts"; return NT_STATUS_OK; } diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c index 352d058f20..7d85153bd0 100644 --- a/source3/auth/auth_util.c +++ b/source3/auth/auth_util.c @@ -77,6 +77,36 @@ void smb_user_control(const auth_usersupplied_info *user_info, auth_serversuppli } } +/**************************************************************************** + Create a SAM_ACCOUNT - either by looking in the pdb, or by faking it up from + unix info. +****************************************************************************/ + +NTSTATUS auth_get_sam_account(const char *user, SAM_ACCOUNT **account) +{ + BOOL pdb_ret; + NTSTATUS nt_status; + if (!NT_STATUS_IS_OK(nt_status = pdb_init_sam(account))) { + return nt_status; + } + + become_root(); + pdb_ret = pdb_getsampwnam(*account, user); + unbecome_root(); + + if (!pdb_ret) { + + struct passwd *pass = Get_Pwnam(user); + if (!pass) + return NT_STATUS_NO_SUCH_USER; + + if (!NT_STATUS_IS_OK(nt_status = pdb_fill_sam_pw(*account, pass))) { + return nt_status; + } + } + return NT_STATUS_OK; +} + /**************************************************************************** Create an auth_usersupplied_data structure ****************************************************************************/ -- cgit From 3e19eda335057ec47483c8567395b43d316485db Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 12:01:05 +0000 Subject: Remove 'unixsam' from the default passdb backends. The intention is to remove the muliple passdb backends, but we need the 'guest' account to always be there. If the admin adds the guest account to (say) LDAP, there will only be one backend required for operation. This helps remove some nasty behaviours with adding accounts to the system for both the RPC 'create user' and the SAMSYNC code. Users 'added' with an 'add user/machine' script won't magicly appear, and machine accounts 'pre-added' to unix, but not the smbpasswd file will not cause mayhem. This commit also implements somthing tridge discussed with me, the concept of 'default' passdb operation pointers - so that each backend does not need it's own stub funcitons wrapping the default tdb privilages/group mapping code. This also removes an implicit 'sid->name' and 'name->sid' mapping from our own local SID space, to winbind usernames. When adding mapping for NIS/LDAP non-sam users in future, we need to be careful. Andrew Bartlett (This used to be commit 6f32fa234961a525760a05418a08ec48d22d7617) --- source3/Makefile.in | 5 +- source3/groupdb/mapping.c | 55 ++++++++++++++++++ source3/param/loadparm.c | 4 +- source3/passdb/passdb.c | 6 +- source3/passdb/pdb_guest.c | 123 +++++++++++++++++++++++++++++++++++++++++ source3/passdb/pdb_interface.c | 63 +++++++++++++++++++++ source3/passdb/pdb_ldap.c | 59 -------------------- source3/passdb/pdb_smbpasswd.c | 85 +++++----------------------- source3/passdb/pdb_tdb.c | 59 -------------------- source3/passdb/pdb_unix.c | 88 ----------------------------- 10 files changed, 264 insertions(+), 283 deletions(-) create mode 100644 source3/passdb/pdb_guest.c diff --git a/source3/Makefile.in b/source3/Makefile.in index cbd8418a48..7de4b0ae8f 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -286,8 +286,9 @@ PASSDB_GET_SET_OBJ = passdb/pdb_get_set.o PASSDB_OBJ = $(PASSDB_GET_SET_OBJ) passdb/passdb.o passdb/pdb_interface.o \ passdb/machine_sid.o passdb/pdb_smbpasswd.o \ passdb/pdb_tdb.o passdb/pdb_ldap.o \ - passdb/pdb_unix.o passdb/util_sam_sid.o \ - passdb/pdb_compat.o passdb/pdb_nisplus.o passdb/privileges.o + passdb/pdb_unix.o passdb/pdb_guest.o passdb/util_sam_sid.o \ + passdb/pdb_compat.o passdb/pdb_nisplus.o \ + passdb/privileges.o XML_OBJ = modules/xml.o MYSQL_OBJ = modules/mysql.o diff --git a/source3/groupdb/mapping.c b/source3/groupdb/mapping.c index 272783608c..02fc23418f 100644 --- a/source3/groupdb/mapping.c +++ b/source3/groupdb/mapping.c @@ -841,6 +841,7 @@ BOOL enum_group_mapping(enum SID_NAME_USE sid_name_use, GROUP_MAP **rmap, } *num_entries=entries; + return True; } @@ -1276,3 +1277,57 @@ int smb_delete_user_group(const char *unix_group, const char *unix_user) DEBUG(3,("smb_delete_user_group: Running the command `%s' gave %d\n",del_script,ret)); return ret; } + + +NTSTATUS pdb_default_getgrsid(struct pdb_methods *methods, GROUP_MAP *map, + DOM_SID sid, BOOL with_priv) +{ + return get_group_map_from_sid(sid, map, with_priv) ? + NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + +NTSTATUS pdb_default_getgrgid(struct pdb_methods *methods, GROUP_MAP *map, + gid_t gid, BOOL with_priv) +{ + return get_group_map_from_gid(gid, map, with_priv) ? + NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + +NTSTATUS pdb_default_getgrnam(struct pdb_methods *methods, GROUP_MAP *map, + char *name, BOOL with_priv) +{ + return get_group_map_from_ntname(name, map, with_priv) ? + NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + +NTSTATUS pdb_default_add_group_mapping_entry(struct pdb_methods *methods, + GROUP_MAP *map) +{ + return add_mapping_entry(map, TDB_INSERT) ? + NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + +NTSTATUS pdb_default_update_group_mapping_entry(struct pdb_methods *methods, + GROUP_MAP *map) +{ + return add_mapping_entry(map, TDB_REPLACE) ? + NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + +NTSTATUS pdb_default_delete_group_mapping_entry(struct pdb_methods *methods, + DOM_SID sid) +{ + return group_map_remove(sid) ? + NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + +NTSTATUS pdb_default_enum_group_mapping(struct pdb_methods *methods, + enum SID_NAME_USE sid_name_use, + GROUP_MAP **rmap, int *num_entries, + BOOL unix_only, BOOL with_priv) +{ + return enum_group_mapping(sid_name_use, rmap, num_entries, unix_only, + with_priv) ? + NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; +} + diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 7aaae439b1..b57b169adc 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -1408,9 +1408,9 @@ static void init_globals(void) #ifdef WITH_LDAP_SAMCONFIG string_set(&Globals.szLdapServer, "localhost"); Globals.ldap_port = 636; - Globals.szPassdbBackend = str_list_make("ldapsam unixsam", NULL); + Globals.szPassdbBackend = str_list_make("ldapsam guest", NULL); #else - Globals.szPassdbBackend = str_list_make("smbpasswd unixsam", NULL); + Globals.szPassdbBackend = str_list_make("smbpasswd guest", NULL); #endif /* WITH_LDAP_SAMCONFIG */ string_set(&Globals.szLdapSuffix, ""); diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c index 71a880d295..eff1ef4bcc 100644 --- a/source3/passdb/passdb.c +++ b/source3/passdb/passdb.c @@ -283,7 +283,7 @@ NTSTATUS pdb_init_sam_pw(SAM_ACCOUNT **new_sam_acct, const struct passwd *pwd) if (!pwd) { new_sam_acct = NULL; - return NT_STATUS_UNSUCCESSFUL; + return NT_STATUS_INVALID_PARAMETER; } if (!NT_STATUS_IS_OK(nt_status = pdb_init_sam(new_sam_acct))) { @@ -661,7 +661,7 @@ BOOL local_lookup_sid(DOM_SID *sid, char *name, enum SID_NAME_USE *psid_name_use pdb_free_sam(&sam_account); if (pdb_getgrsid(&map, *sid, MAPPING_WITHOUT_PRIV)) { - if (map.gid!=-1) { + if (map.gid!=(gid_t)-1) { DEBUG(5,("local_lookup_sid: mapped group %s to gid %u\n", map.nt_name, (unsigned int)map.gid)); } else { DEBUG(5,("local_lookup_sid: mapped group %s to no unix gid. Returning name.\n", map.nt_name)); @@ -950,7 +950,7 @@ BOOL local_sid_to_gid(gid_t *pgid, const DOM_SID *psid, enum SID_NAME_USE *name_ if (pdb_getgrsid(&map, *psid, MAPPING_WITHOUT_PRIV)) { /* the SID is in the mapping table but not mapped */ - if (map.gid==-1) + if (map.gid==(gid_t)-1) return False; *pgid = map.gid; diff --git a/source3/passdb/pdb_guest.c b/source3/passdb/pdb_guest.c new file mode 100644 index 0000000000..3f0f06d18d --- /dev/null +++ b/source3/passdb/pdb_guest.c @@ -0,0 +1,123 @@ +/* + * 'Guest' password backend for samba + * Copyright (C) Jelmer Vernooij 2002 + * Copyright (C) Andrew Bartlett 2003 + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 675 + * Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "includes.h" + +/****************************************************************** + Lookup a name in the SAM database + ******************************************************************/ + +static NTSTATUS guestsam_getsampwnam (struct pdb_methods *methods, SAM_ACCOUNT *user, const char *sname) +{ + NTSTATUS nt_status; + struct passwd *pass; + const char *guest_account = lp_guestaccount(); + if (!(guest_account && *guest_account)) { + DEBUG(1, ("NULL guest account!?!?\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + if (!methods) { + DEBUG(0,("invalid methods\n")); + return NT_STATUS_UNSUCCESSFUL; + } + if (!sname) { + DEBUG(0,("invalid name specified")); + return NT_STATUS_UNSUCCESSFUL; + } + + if (!strequal(guest_account, sname)) { + return NT_STATUS_NO_SUCH_USER; + } + + pass = getpwnam_alloc(guest_account); + + nt_status = pdb_fill_sam_pw(user, pass); + + passwd_free(&pass); + return nt_status; +} + + +/*************************************************************************** + Search by rid + **************************************************************************/ + +static NTSTATUS guestsam_getsampwrid (struct pdb_methods *methods, + SAM_ACCOUNT *user, uint32 rid) +{ + NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL; + struct passwd *pass = NULL; + const char *guest_account = lp_guestaccount(); + if (!(guest_account && *guest_account)) { + DEBUG(1, ("NULL guest account!?!?\n")); + return nt_status; + } + + if (!methods) { + DEBUG(0,("invalid methods\n")); + return nt_status; + } + + if (rid == DOMAIN_USER_RID_GUEST) { + pass = getpwnam_alloc(guest_account); + if (!pass) { + DEBUG(1, ("guest account %s does not seem to exist...\n", guest_account)); + return NT_STATUS_NO_SUCH_USER; + } + } else { + return NT_STATUS_NO_SUCH_USER; + } + + nt_status = pdb_fill_sam_pw(user, pass); + passwd_free(&pass); + + return nt_status; +} + +static NTSTATUS guestsam_getsampwsid(struct pdb_methods *my_methods, SAM_ACCOUNT * user, const DOM_SID *sid) +{ + uint32 rid; + if (!sid_peek_check_rid(get_global_sam_sid(), sid, &rid)) + return NT_STATUS_NO_SUCH_USER; + return guestsam_getsampwrid(my_methods, user, rid); +} + +NTSTATUS pdb_init_guestsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, const char *location) +{ + NTSTATUS nt_status; + + if (!pdb_context) { + DEBUG(0, ("invalid pdb_context specified\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + if (!NT_STATUS_IS_OK(nt_status = make_pdb_methods(pdb_context->mem_ctx, pdb_method))) { + return nt_status; + } + + (*pdb_method)->name = "guestsam"; + + (*pdb_method)->getsampwnam = guestsam_getsampwnam; + (*pdb_method)->getsampwsid = guestsam_getsampwsid; + + /* There's not very much to initialise here */ + return NT_STATUS_OK; +} diff --git a/source3/passdb/pdb_interface.c b/source3/passdb/pdb_interface.c index 778cb9425c..d465439dda 100644 --- a/source3/passdb/pdb_interface.c +++ b/source3/passdb/pdb_interface.c @@ -37,6 +37,7 @@ static const struct { { "ldapsam", pdb_init_ldapsam }, { "ldapsam_nua", pdb_init_ldapsam_nua }, { "unixsam", pdb_init_unixsam }, + { "guest", pdb_init_guestsam }, { "nisplussam", pdb_init_nisplussam }, { NULL, NULL} }; @@ -763,6 +764,51 @@ BOOL initialize_password_db(BOOL reload) } +/*************************************************************************** + Default implementations of some functions. + ****************************************************************************/ + +static NTSTATUS pdb_default_getsampwnam (struct pdb_methods *methods, SAM_ACCOUNT *user, const char *sname) +{ + return NT_STATUS_NO_SUCH_USER; +} + +static NTSTATUS pdb_default_getsampwsid(struct pdb_methods *my_methods, SAM_ACCOUNT * user, const DOM_SID *sid) +{ + return NT_STATUS_NO_SUCH_USER; +} + +static NTSTATUS pdb_default_add_sam_account (struct pdb_methods *methods, SAM_ACCOUNT *newpwd) +{ + DEBUG(0,("this backend (%s) should not be listed as the first passdb backend! You can't add users to it.\n", methods->name)); + return NT_STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS pdb_default_update_sam_account (struct pdb_methods *methods, SAM_ACCOUNT *newpwd) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS pdb_default_delete_sam_account (struct pdb_methods *methods, SAM_ACCOUNT *pwd) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS pdb_default_setsampwent(struct pdb_methods *methods, BOOL update) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS pdb_default_getsampwent(struct pdb_methods *methods, SAM_ACCOUNT *user) +{ + return NT_STATUS_NOT_IMPLEMENTED; +} + +static void pdb_default_endsampwent(struct pdb_methods *methods) +{ + return; /* NT_STATUS_NOT_IMPLEMENTED; */ +} + NTSTATUS make_pdb_methods(TALLOC_CTX *mem_ctx, PDB_METHODS **methods) { *methods = talloc(mem_ctx, sizeof(struct pdb_methods)); @@ -773,5 +819,22 @@ NTSTATUS make_pdb_methods(TALLOC_CTX *mem_ctx, PDB_METHODS **methods) ZERO_STRUCTP(*methods); + (*methods)->setsampwent = pdb_default_setsampwent; + (*methods)->endsampwent = pdb_default_endsampwent; + (*methods)->getsampwent = pdb_default_getsampwent; + (*methods)->getsampwnam = pdb_default_getsampwnam; + (*methods)->getsampwsid = pdb_default_getsampwsid; + (*methods)->add_sam_account = pdb_default_add_sam_account; + (*methods)->update_sam_account = pdb_default_update_sam_account; + (*methods)->delete_sam_account = pdb_default_delete_sam_account; + + (*methods)->getgrsid = pdb_default_getgrsid; + (*methods)->getgrgid = pdb_default_getgrgid; + (*methods)->getgrnam = pdb_default_getgrnam; + (*methods)->add_group_mapping_entry = pdb_default_add_group_mapping_entry; + (*methods)->update_group_mapping_entry = pdb_default_update_group_mapping_entry; + (*methods)->delete_group_mapping_entry = pdb_default_delete_group_mapping_entry; + (*methods)->enum_group_mapping = pdb_default_enum_group_mapping; + return NT_STATUS_OK; } diff --git a/source3/passdb/pdb_ldap.c b/source3/passdb/pdb_ldap.c index e058d2d108..548d7bc60d 100644 --- a/source3/passdb/pdb_ldap.c +++ b/source3/passdb/pdb_ldap.c @@ -1965,58 +1965,6 @@ static NTSTATUS ldapsam_add_sam_account(struct pdb_methods *my_methods, SAM_ACCO return NT_STATUS_OK; } -static NTSTATUS ldapsam_getgrsid(struct pdb_methods *methods, GROUP_MAP *map, - DOM_SID sid, BOOL with_priv) -{ - return get_group_map_from_sid(sid, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS ldapsam_getgrgid(struct pdb_methods *methods, GROUP_MAP *map, - gid_t gid, BOOL with_priv) -{ - return get_group_map_from_gid(gid, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS ldapsam_getgrnam(struct pdb_methods *methods, GROUP_MAP *map, - char *name, BOOL with_priv) -{ - return get_group_map_from_ntname(name, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS ldapsam_add_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return add_mapping_entry(map, TDB_INSERT) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS ldapsam_update_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return add_mapping_entry(map, TDB_REPLACE) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS ldapsam_delete_group_mapping_entry(struct pdb_methods *methods, - DOM_SID sid) -{ - return group_map_remove(sid) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS ldapsam_enum_group_mapping(struct pdb_methods *methods, - enum SID_NAME_USE sid_name_use, - GROUP_MAP **rmap, int *num_entries, - BOOL unix_only, BOOL with_priv) -{ - return enum_group_mapping(sid_name_use, rmap, num_entries, unix_only, - with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - static void free_private_data(void **vp) { struct ldapsam_privates **ldap_state = (struct ldapsam_privates **)vp; @@ -2056,13 +2004,6 @@ NTSTATUS pdb_init_ldapsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, co (*pdb_method)->add_sam_account = ldapsam_add_sam_account; (*pdb_method)->update_sam_account = ldapsam_update_sam_account; (*pdb_method)->delete_sam_account = ldapsam_delete_sam_account; - (*pdb_method)->getgrsid = ldapsam_getgrsid; - (*pdb_method)->getgrgid = ldapsam_getgrgid; - (*pdb_method)->getgrnam = ldapsam_getgrnam; - (*pdb_method)->add_group_mapping_entry = ldapsam_add_group_mapping_entry; - (*pdb_method)->update_group_mapping_entry = ldapsam_update_group_mapping_entry; - (*pdb_method)->delete_group_mapping_entry = ldapsam_delete_group_mapping_entry; - (*pdb_method)->enum_group_mapping = ldapsam_enum_group_mapping; /* TODO: Setup private data and free */ diff --git a/source3/passdb/pdb_smbpasswd.c b/source3/passdb/pdb_smbpasswd.c index 5fd6a828bf..b5a2bbbfe7 100644 --- a/source3/passdb/pdb_smbpasswd.c +++ b/source3/passdb/pdb_smbpasswd.c @@ -1222,7 +1222,6 @@ static BOOL build_sam_account(struct smbpasswd_privates *smbpasswd_state, return False; } } else { - if (!NT_STATUS_IS_OK(pdb_fill_sam_pw(sam_pass, pwfile))) { return False; } @@ -1380,14 +1379,19 @@ static NTSTATUS smbpasswd_getsampwnam(struct pdb_methods *my_methods, return NT_STATUS_OK; } -static NTSTATUS smbpasswd_getsampwrid(struct pdb_methods *my_methods, SAM_ACCOUNT *sam_acct,uint32 rid) +static NTSTATUS smbpasswd_getsampwsid(struct pdb_methods *my_methods, SAM_ACCOUNT *sam_acct, const DOM_SID *sid) { NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL; struct smbpasswd_privates *smbpasswd_state = (struct smbpasswd_privates*)my_methods->private_data; struct smb_passwd *smb_pw; void *fp = NULL; + fstring sid_str; + uint32 rid; + + DEBUG(10, ("smbpasswd_getsampwrid: search by sid: %s\n", sid_to_string(sid_str, sid))); - DEBUG(10, ("smbpasswd_getsampwrid: search by rid: %d\n", rid)); + if (!sid_peek_check_rid(get_global_sam_sid(), sid, &rid)) + return NT_STATUS_UNSUCCESSFUL; /* More special case 'guest account' hacks... */ if (rid == DOMAIN_USER_RID_GUEST) { @@ -1431,18 +1435,18 @@ static NTSTATUS smbpasswd_getsampwrid(struct pdb_methods *my_methods, SAM_ACCOUN if (!build_sam_account (smbpasswd_state, sam_acct, smb_pw)) return nt_status; + /* build_sam_account might change the SID on us, if the name was for the guest account */ + if (NT_STATUS_IS_OK(nt_status) && !sid_equal(pdb_get_user_sid(sam_acct), sid)) { + fstring sid_string1, sid_string2; + DEBUG(1, ("looking for user with sid %s instead returned %s for account %s!?!\n", + sid_to_string(sid_string1, sid), sid_to_string(sid_string2, pdb_get_user_sid(sam_acct)), pdb_get_username(sam_acct))); + return NT_STATUS_NO_SUCH_USER; + } + /* success */ return NT_STATUS_OK; } -static NTSTATUS smbpasswd_getsampwsid(struct pdb_methods *my_methods, SAM_ACCOUNT * user, const DOM_SID *sid) -{ - uint32 rid; - if (!sid_peek_check_rid(get_global_sam_sid(), sid, &rid)) - return NT_STATUS_UNSUCCESSFUL; - return smbpasswd_getsampwrid(my_methods, user, rid); -} - static NTSTATUS smbpasswd_add_sam_account(struct pdb_methods *my_methods, SAM_ACCOUNT *sampass) { struct smbpasswd_privates *smbpasswd_state = (struct smbpasswd_privates*)my_methods->private_data; @@ -1493,58 +1497,6 @@ static NTSTATUS smbpasswd_delete_sam_account (struct pdb_methods *my_methods, SA return NT_STATUS_UNSUCCESSFUL; } -static NTSTATUS smbpasswd_getgrsid(struct pdb_methods *methods, GROUP_MAP *map, - DOM_SID sid, BOOL with_priv) -{ - return get_group_map_from_sid(sid, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS smbpasswd_getgrgid(struct pdb_methods *methods, GROUP_MAP *map, - gid_t gid, BOOL with_priv) -{ - return get_group_map_from_gid(gid, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS smbpasswd_getgrnam(struct pdb_methods *methods, GROUP_MAP *map, - char *name, BOOL with_priv) -{ - return get_group_map_from_ntname(name, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS smbpasswd_add_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return add_mapping_entry(map, TDB_INSERT) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS smbpasswd_update_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return add_mapping_entry(map, TDB_REPLACE) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS smbpasswd_delete_group_mapping_entry(struct pdb_methods *methods, - DOM_SID sid) -{ - return group_map_remove(sid) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS smbpasswd_enum_group_mapping(struct pdb_methods *methods, - enum SID_NAME_USE sid_name_use, - GROUP_MAP **rmap, int *num_entries, - BOOL unix_only, BOOL with_priv) -{ - return enum_group_mapping(sid_name_use, rmap, num_entries, unix_only, - with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - static void free_private_data(void **vp) { struct smbpasswd_privates **privates = (struct smbpasswd_privates**)vp; @@ -1575,13 +1527,6 @@ NTSTATUS pdb_init_smbpasswd(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, (*pdb_method)->add_sam_account = smbpasswd_add_sam_account; (*pdb_method)->update_sam_account = smbpasswd_update_sam_account; (*pdb_method)->delete_sam_account = smbpasswd_delete_sam_account; - (*pdb_method)->getgrsid = smbpasswd_getgrsid; - (*pdb_method)->getgrgid = smbpasswd_getgrgid; - (*pdb_method)->getgrnam = smbpasswd_getgrnam; - (*pdb_method)->add_group_mapping_entry = smbpasswd_add_group_mapping_entry; - (*pdb_method)->update_group_mapping_entry = smbpasswd_update_group_mapping_entry; - (*pdb_method)->delete_group_mapping_entry = smbpasswd_delete_group_mapping_entry; - (*pdb_method)->enum_group_mapping = smbpasswd_enum_group_mapping; /* Setup private data and free function */ diff --git a/source3/passdb/pdb_tdb.c b/source3/passdb/pdb_tdb.c index a1f786c8cd..c48c9567b1 100644 --- a/source3/passdb/pdb_tdb.c +++ b/source3/passdb/pdb_tdb.c @@ -896,58 +896,6 @@ static NTSTATUS tdbsam_add_sam_account (struct pdb_methods *my_methods, SAM_ACCO return NT_STATUS_UNSUCCESSFUL; } -static NTSTATUS tdbsam_getgrsid(struct pdb_methods *methods, GROUP_MAP *map, - DOM_SID sid, BOOL with_priv) -{ - return get_group_map_from_sid(sid, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS tdbsam_getgrgid(struct pdb_methods *methods, GROUP_MAP *map, - gid_t gid, BOOL with_priv) -{ - return get_group_map_from_gid(gid, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS tdbsam_getgrnam(struct pdb_methods *methods, GROUP_MAP *map, - char *name, BOOL with_priv) -{ - return get_group_map_from_ntname(name, map, with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS tdbsam_add_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return add_mapping_entry(map, TDB_INSERT) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS tdbsam_update_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return add_mapping_entry(map, TDB_REPLACE) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS tdbsam_delete_group_mapping_entry(struct pdb_methods *methods, - DOM_SID sid) -{ - return group_map_remove(sid) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - -static NTSTATUS tdbsam_enum_group_mapping(struct pdb_methods *methods, - enum SID_NAME_USE sid_name_use, - GROUP_MAP **rmap, int *num_entries, - BOOL unix_only, BOOL with_priv) -{ - return enum_group_mapping(sid_name_use, rmap, num_entries, unix_only, - with_priv) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; -} - static void free_private_data(void **vp) { struct tdbsam_privates **tdb_state = (struct tdbsam_privates **)vp; @@ -985,13 +933,6 @@ NTSTATUS pdb_init_tdbsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, con (*pdb_method)->add_sam_account = tdbsam_add_sam_account; (*pdb_method)->update_sam_account = tdbsam_update_sam_account; (*pdb_method)->delete_sam_account = tdbsam_delete_sam_account; - (*pdb_method)->getgrsid = tdbsam_getgrsid; - (*pdb_method)->getgrgid = tdbsam_getgrgid; - (*pdb_method)->getgrnam = tdbsam_getgrnam; - (*pdb_method)->add_group_mapping_entry = tdbsam_add_group_mapping_entry; - (*pdb_method)->update_group_mapping_entry = tdbsam_update_group_mapping_entry; - (*pdb_method)->delete_group_mapping_entry = tdbsam_delete_group_mapping_entry; - (*pdb_method)->enum_group_mapping = tdbsam_enum_group_mapping; tdb_state = talloc_zero(pdb_context->mem_ctx, sizeof(struct tdbsam_privates)); diff --git a/source3/passdb/pdb_unix.c b/source3/passdb/pdb_unix.c index 8acc29b7a4..07acd08a4e 100644 --- a/source3/passdb/pdb_unix.c +++ b/source3/passdb/pdb_unix.c @@ -88,16 +88,6 @@ static NTSTATUS unixsam_getsampwsid(struct pdb_methods *my_methods, SAM_ACCOUNT return unixsam_getsampwrid(my_methods, user, rid); } -/*************************************************************************** - Adds an existing SAM_ACCOUNT - ****************************************************************************/ - -static NTSTATUS unixsam_add_sam_account (struct pdb_methods *methods, SAM_ACCOUNT *newpwd) -{ - DEBUG(0,("pdb_unix should not be listed as the first passdb backend! You can't add users to it.\n")); - return NT_STATUS_NOT_IMPLEMENTED; -} - /*************************************************************************** Updates a SAM_ACCOUNT @@ -113,70 +103,6 @@ static NTSTATUS unixsam_update_sam_account (struct pdb_methods *methods, SAM_ACC return methods->parent->pdb_add_sam_account(methods->parent, newpwd); } -static NTSTATUS unixsam_delete_sam_account (struct pdb_methods *methods, SAM_ACCOUNT *pwd) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_setsampwent(struct pdb_methods *methods, BOOL update) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_getsampwent(struct pdb_methods *methods, SAM_ACCOUNT *user) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static void unixsam_endsampwent(struct pdb_methods *methods) -{ - return; /* NT_STATUS_NOT_IMPLEMENTED; */ -} - -static NTSTATUS unixsam_getgrsid(struct pdb_methods *methods, GROUP_MAP *map, - DOM_SID sid, BOOL with_priv) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_getgrgid(struct pdb_methods *methods, GROUP_MAP *map, - gid_t gid, BOOL with_priv) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_getgrnam(struct pdb_methods *methods, GROUP_MAP *map, - char *name, BOOL with_priv) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_add_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_update_group_mapping_entry(struct pdb_methods *methods, - GROUP_MAP *map) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_delete_group_mapping_entry(struct pdb_methods *methods, - DOM_SID sid) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - -static NTSTATUS unixsam_enum_group_mapping(struct pdb_methods *methods, - enum SID_NAME_USE sid_name_use, - GROUP_MAP **rmap, int *num_entries, - BOOL unix_only, BOOL with_priv) -{ - return NT_STATUS_NOT_IMPLEMENTED; -} - NTSTATUS pdb_init_unixsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, const char *location) { NTSTATUS nt_status; @@ -191,22 +117,8 @@ NTSTATUS pdb_init_unixsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, co } (*pdb_method)->name = "unixsam"; - - (*pdb_method)->setsampwent = unixsam_setsampwent; - (*pdb_method)->endsampwent = unixsam_endsampwent; - (*pdb_method)->getsampwent = unixsam_getsampwent; (*pdb_method)->getsampwnam = unixsam_getsampwnam; (*pdb_method)->getsampwsid = unixsam_getsampwsid; - (*pdb_method)->add_sam_account = unixsam_add_sam_account; - (*pdb_method)->update_sam_account = unixsam_update_sam_account; - (*pdb_method)->delete_sam_account = unixsam_delete_sam_account; - (*pdb_method)->getgrsid = unixsam_getgrsid; - (*pdb_method)->getgrgid = unixsam_getgrgid; - (*pdb_method)->getgrnam = unixsam_getgrnam; - (*pdb_method)->add_group_mapping_entry = unixsam_add_group_mapping_entry; - (*pdb_method)->update_group_mapping_entry = unixsam_update_group_mapping_entry; - (*pdb_method)->delete_group_mapping_entry = unixsam_delete_group_mapping_entry; - (*pdb_method)->enum_group_mapping = unixsam_enum_group_mapping; /* There's not very much to initialise here */ return NT_STATUS_OK; -- cgit From e22a1915fee466c2266361a7b956d1225ad86f56 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 12:14:08 +0000 Subject: With assuptions about unixsam gone, we can forget about looking up the user a second time now. Andrew Bartlett (This used to be commit a1e27a02f52315df0dd05ab8a94ae5a2bf398655) --- source3/utils/net_rpc_samsync.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source3/utils/net_rpc_samsync.c b/source3/utils/net_rpc_samsync.c index ac3b78fc7a..7d5c8681ad 100644 --- a/source3/utils/net_rpc_samsync.c +++ b/source3/utils/net_rpc_samsync.c @@ -317,10 +317,7 @@ fetch_account_info(uint32 rid, SAM_ACCOUNT_INFO *delta) "gave %d\n", add_script, add_ret)); } - if (!pdb_getsampwnam(sam_account, account)) { - try_add = True; - /* still not there, hope the backend likes NUAs */ - } + try_add = True; } sam_account_from_delta(sam_account, delta); -- cgit From ae2f064dc65762e32db10de1362e2cef782eb304 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 12:16:17 +0000 Subject: Add static (This used to be commit d0365f20c242bcfc4f5d8286c6c5654e310a9d45) --- source3/torture/masktest.c | 2 +- source3/utils/profiles.c | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source3/torture/masktest.c b/source3/torture/masktest.c index df0a047aff..7d751fb789 100644 --- a/source3/torture/masktest.c +++ b/source3/torture/masktest.c @@ -254,7 +254,7 @@ struct cli_state *connect_one(char *share) static char *resultp; static file_info *f_info; -void listfn(file_info *f, const char *s, void *state) +static void listfn(file_info *f, const char *s, void *state) { if (strcmp(f->name,".") == 0) { resultp[0] = '+'; diff --git a/source3/utils/profiles.c b/source3/utils/profiles.c index 2ed102b677..b4087cf6cf 100644 --- a/source3/utils/profiles.c +++ b/source3/utils/profiles.c @@ -398,7 +398,7 @@ DOM_SID old_sid, new_sid; int change = 0, new = 0; /* Compare two SIDs for equality */ -int my_sid_equal(DOM_SID *s1, DOM_SID *s2) +static int my_sid_equal(DOM_SID *s1, DOM_SID *s2) { int sa1, sa2; @@ -417,7 +417,7 @@ int my_sid_equal(DOM_SID *s1, DOM_SID *s2) * Quick and dirty to read a SID in S-1-5-21-x-y-z-rid format and * construct a DOM_SID */ -int get_sid(DOM_SID *sid, char *sid_str) +static int get_sid(DOM_SID *sid, char *sid_str) { int i = 0, auth; char *lstr; @@ -460,7 +460,7 @@ int get_sid(DOM_SID *sid, char *sid_str) * This routine does not need to deal with endianism as * long as the incoming SIDs are both in the same (LE) format. */ -void change_sid(DOM_SID *s1, DOM_SID *s2) +static void change_sid(DOM_SID *s1, DOM_SID *s2) { int i; @@ -469,7 +469,7 @@ void change_sid(DOM_SID *s1, DOM_SID *s2) } } -void print_sid(DOM_SID *sid) +static void print_sid(DOM_SID *sid) { int i, comps = sid->num_auths; fprintf(stdout, "S-%u-%u", sid->sid_rev_num, sid->id_auth[5]); @@ -482,7 +482,7 @@ void print_sid(DOM_SID *sid) fprintf(stdout, "\n"); } -void process_sid(DOM_SID *sid, DOM_SID *o_sid, DOM_SID *n_sid) +static void process_sid(DOM_SID *sid, DOM_SID *o_sid, DOM_SID *n_sid) { int i; if (my_sid_equal(sid, o_sid)) { @@ -496,7 +496,7 @@ void process_sid(DOM_SID *sid, DOM_SID *o_sid, DOM_SID *n_sid) } -void process_acl(ACL *acl, const char *prefix) +static void process_acl(ACL *acl, const char *prefix) { int ace_cnt, i; ACE *ace; @@ -514,7 +514,7 @@ void process_acl(ACL *acl, const char *prefix) } } -void usage(void) +static void usage(void) { fprintf(stderr, "usage: profiles [-c -n ] \n"); fprintf(stderr, "Version: %s\n", VERSION); -- cgit From db94beaa41d6c2c82ee9351a171f2a73a9e358da Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 12:17:02 +0000 Subject: Fix comment - the other bits of code don't call this any more. (This used to be commit 523d1429b1072c999d376d2b4e13a1c08349990a) --- source3/passdb/passdb.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c index eff1ef4bcc..5e6466ff0a 100644 --- a/source3/passdb/passdb.c +++ b/source3/passdb/passdb.c @@ -992,10 +992,7 @@ BOOL local_sid_to_gid(gid_t *pgid, const DOM_SID *psid, enum SID_NAME_USE *name_ /************************************************************* Change a password entry in the local smbpasswd file. - FIXME!! The function needs to be abstracted into the - passdb interface or something. It is currently being called - by _api_samr_create_user() in rpc_server/srv_samr.c, - in SWAT and by smbpasswd/pdbedit. +It is currently being called by SWAT and by smbpasswd. --jerry *************************************************************/ -- cgit From 0dde23a7b24edf1cbf4d7d7e5afea485e37498e5 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 12:19:18 +0000 Subject: Fixes from Paul Green and vorlon@debian.org for building shared libraries (make it possible to build both shared and static) and -lcrypt handling. (This used to be commit 30510f50077fd157664c127ac0182ce26843d43f) --- source3/aclocal.m4 | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ source3/configure.in | 67 +++++++++++++++++++++++++++------------------------- 2 files changed, 99 insertions(+), 32 deletions(-) diff --git a/source3/aclocal.m4 b/source3/aclocal.m4 index 345be73aed..7bec88dd87 100644 --- a/source3/aclocal.m4 +++ b/source3/aclocal.m4 @@ -577,3 +577,67 @@ if test "$2" != "/usr/lib" ; then $1="$$1 -L$2" fi ]) + +dnl AC_ENABLE_SHARED - implement the --enable-shared flag +dnl Usage: AC_ENABLE_SHARED[(DEFAULT)] +dnl Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +dnl `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +dnl AC_ENABLE_STATIC - implement the --enable-static flag +dnl Usage: AC_ENABLE_STATIC[(DEFAULT)] +dnl Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +dnl `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +dnl AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) diff --git a/source3/configure.in b/source3/configure.in index dfd97bc42f..66bdf5edf1 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -6,6 +6,9 @@ AC_PREREQ(2.53) AC_INIT(include/includes.h) AC_CONFIG_HEADER(include/config.h) +AC_DISABLE_STATIC +AC_ENABLE_SHARED + ################################################# # Directory handling stuff to support both the # legacy SAMBA directories and FHS compliant @@ -726,11 +729,6 @@ fi AC_FUNC_MEMCMP -############################################### -# test for where we get crypt() from -AC_SEARCH_LIBS(crypt, [crypt], [AUTHLIBS="$AUTHLIBS -lcrypt"; - AC_DEFINE(HAVE_CRYPT,1,[Whether the system has the crypt() function])]) - ############################################### # Readline included by default unless explicitly asked not to test "${with_readline+set}" != "set" && with_readline=yes @@ -952,9 +950,8 @@ AC_LIBTESTFUNC(sec, bigcrypt) AC_LIBTESTFUNC(security, getprpwnam) AC_LIBTESTFUNC(sec, getprpwnam) -# this bit needs to be modified for each OS that is suported by -# smbwrapper. You need to specify how to created a shared library and -# how to compile C code to produce PIC object files +# Assume non-shared by default and override below +BLDSHARED="false" # these are the defaults, good for lots of systems HOST_OS="$host_os" @@ -965,12 +962,16 @@ PICFLAG="" PICSUFFIX="po" POBAD_CC="#" SHLIBEXT="so" -# Assume non-shared by default and override below -BLDSHARED="false" -AC_MSG_CHECKING([ability to build shared libraries]) -# and these are for particular systems -case "$host_os" in +if test "$enable_shared" = "yes"; then + # this bit needs to be modified for each OS that is suported by + # smbwrapper. You need to specify how to created a shared library and + # how to compile C code to produce PIC object files + + AC_MSG_CHECKING([ability to build shared libraries]) + + # and these are for particular systems + case "$host_os" in *linux*) AC_DEFINE(LINUX,1,[Whether the host os is linux]) BLDSHARED="true" LDSHFLAGS="-shared" @@ -1114,13 +1115,14 @@ case "$host_os" in *) AC_DEFINE(STAT_ST_BLOCKSIZE,512) ;; -esac -AC_SUBST(DYNEXP) -AC_MSG_RESULT($BLDSHARED) -AC_MSG_CHECKING([linker flags for shared libraries]) -AC_MSG_RESULT([$LDSHFLAGS]) -AC_MSG_CHECKING([compiler flags for position-independent code]) -AC_MSG_RESULT([$PICFLAGS]) + esac + AC_SUBST(DYNEXP) + AC_MSG_RESULT($BLDSHARED) + AC_MSG_CHECKING([linker flags for shared libraries]) + AC_MSG_RESULT([$LDSHFLAGS]) + AC_MSG_CHECKING([compiler flags for position-independent code]) + AC_MSG_RESULT([$PICFLAGS]) +fi ####################################################### # test whether building a shared library actually works @@ -2408,15 +2410,10 @@ AC_ARG_WITH(pam_smbpass, ############################################### -# test for where we get crypt() from, but only -# if not using PAM -if test x"$with_pam_for_crypt" = x"no"; then -AC_CHECK_FUNCS(crypt) -if test x"$ac_cv_func_crypt" = x"no"; then - AC_CHECK_LIB(crypt, crypt, [AUTHLIBS="$AUTHLIBS -lcrypt"; - AC_DEFINE(HAVE_CRYPT,1,[Whether crypt() is available])]) -fi -fi +# test for where we get crypt() from +AC_SEARCH_LIBS(crypt, [crypt], + [test "$ac_cv_search_crypt" = "none required" || AUTHLIBS="-lcrypt $AUTHLIBS" + AC_DEFINE(HAVE_CRYPT,1,[Whether the system has the crypt() function])]) ## ## moved after the check for -lcrypt in order to @@ -2673,9 +2670,12 @@ AC_ARG_WITH(libsmbclient, LIBSMBCLIENT=libsmbclient AC_MSG_RESULT(yes) else + enable_static=yes + AC_MSG_RESULT(no shared library support -- will supply static library) + fi + if test $enable_static = yes; then INSTALLCLIENTCMD_A="\$(INSTALLCMD)" LIBSMBCLIENT=libsmbclient - AC_MSG_RESULT(no shared library support -- will supply static library) fi ;; esac ], @@ -2686,10 +2686,13 @@ AC_ARG_WITH(libsmbclient, LIBSMBCLIENT_SHARED=bin/libsmbclient.$SHLIBEXT LIBSMBCLIENT=libsmbclient AC_MSG_RESULT(yes) - else + else + enable_static=yes + AC_MSG_RESULT(no shared library support -- will supply static library) + fi + if test $enable_static = yes; then INSTALLCLIENTCMD_A="\$(INSTALLCMD)" LIBSMBCLIENT=libsmbclient - AC_MSG_RESULT(no shared library support -- will supply static library) fi] ) -- cgit From 7e110f782a55d4dca1fb3fedd95bf059c9ec0638 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 12:22:06 +0000 Subject: More signed/unsigned fixes (yes, I run with funny compiler options) and make x_fwrite() match fwrite() in returning a size_t. Andrew Bartlett (This used to be commit 2943c695787b742e9a96b2eefe2d75f681bacf7c) --- source3/include/hash.h | 4 ++-- source3/lib/hash.c | 10 +++++----- source3/lib/pidfile.c | 2 +- source3/lib/time.c | 2 +- source3/lib/util_file.c | 2 +- source3/lib/util_seaccess.c | 2 +- source3/lib/xfile.c | 7 ++++--- source3/smbd/dosmode.c | 2 +- source3/smbd/mangle_hash2.c | 8 ++++---- 9 files changed, 20 insertions(+), 19 deletions(-) diff --git a/source3/include/hash.h b/source3/include/hash.h index c327c971ab..40cc8b7cab 100644 --- a/source3/include/hash.h +++ b/source3/include/hash.h @@ -66,8 +66,8 @@ typedef struct hash_element { typedef struct hash_table { ubi_dlList *buckets; ubi_dlList lru_chain; - int num_elements; - int size; + unsigned num_elements; + unsigned size; compare_function comp_func; } hash_table; diff --git a/source3/lib/hash.c b/source3/lib/hash.c index 6b7a8476b1..95af485707 100644 --- a/source3/lib/hash.c +++ b/source3/lib/hash.c @@ -28,7 +28,7 @@ #include "includes.h" static BOOL enlarge_hash_table(hash_table *table); -static int primes[] = +static unsigned primes[] = {17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209, 16411}; /**************************************************************************** @@ -47,9 +47,9 @@ static int primes[] = **************************************************************************** */ -BOOL hash_table_init(hash_table *table, int num_buckets, compare_function compare_func) +BOOL hash_table_init(hash_table *table, unsigned num_buckets, compare_function compare_func) { - int i; + unsigned i; ubi_dlList *bucket; table->num_elements = 0; @@ -118,7 +118,7 @@ static hash_element *hash_chain_find(hash_table *table, ubi_dlList *hash_chain, { hash_element *hash_elem; ubi_dlNodePtr lru_item; - int i = 0; + unsigned int i = 0; for (hash_elem = (hash_element *)(ubi_dlFirst(hash_chain)); i < hash_chain->count; i++, hash_elem = (hash_element *)(ubi_dlNext(hash_elem))) { @@ -299,7 +299,7 @@ static BOOL enlarge_hash_table(hash_table *table) void hash_clear(hash_table *table) { - int i; + unsigned int i; ubi_dlList *bucket = table->buckets; hash_element *hash_elem; for (i = 0; i < table->size; bucket++, i++) { diff --git a/source3/lib/pidfile.c b/source3/lib/pidfile.c index 16a12656b3..1a462bf128 100644 --- a/source3/lib/pidfile.c +++ b/source3/lib/pidfile.c @@ -100,7 +100,7 @@ void pidfile_create(const char *name) memset(buf, 0, sizeof(buf)); slprintf(buf, sizeof(buf) - 1, "%u\n", (unsigned int) sys_getpid()); - if (write(fd, buf, strlen(buf)) != strlen(buf)) { + if (write(fd, buf, strlen(buf)) != (ssize_t)strlen(buf)) { DEBUG(0,("ERROR: can't write to file %s: %s\n", pidFile, strerror(errno))); exit(1); diff --git a/source3/lib/time.c b/source3/lib/time.c index ea5c6837bf..f76a1bdc0d 100644 --- a/source3/lib/time.c +++ b/source3/lib/time.c @@ -479,7 +479,7 @@ check if it's a null mtime ****************************************************************************/ BOOL null_mtime(time_t mtime) { - if (mtime == 0 || mtime == 0xFFFFFFFF || mtime == (time_t)-1) + if (mtime == 0 || mtime == (time_t)0xFFFFFFFF || mtime == (time_t)-1) return(True); return(False); } diff --git a/source3/lib/util_file.c b/source3/lib/util_file.c index 4babab8931..02acbd4d7e 100644 --- a/source3/lib/util_file.c +++ b/source3/lib/util_file.c @@ -593,7 +593,7 @@ BOOL file_save(const char *fname, void *packet, size_t length) if (fd == -1) { return False; } - if (write(fd, packet, length) != length) { + if (write(fd, packet, length) != (size_t)length) { return False; } close(fd); diff --git a/source3/lib/util_seaccess.c b/source3/lib/util_seaccess.c index 21d7fe8599..eba8cab7fb 100644 --- a/source3/lib/util_seaccess.c +++ b/source3/lib/util_seaccess.c @@ -343,7 +343,7 @@ SEC_DESC_BUF *se_create_child_secdesc(TALLOC_CTX *ctx, SEC_DESC *parent_ctr, SEC_DESC *sd; SEC_ACL *new_dacl, *the_acl; SEC_ACE *new_ace_list = NULL; - int new_ace_list_ndx = 0, i; + unsigned int new_ace_list_ndx = 0, i; size_t size; /* Currently we only process the dacl when creating the child. The diff --git a/source3/lib/xfile.c b/source3/lib/xfile.c index 57f3e27638..1534dd855e 100644 --- a/source3/lib/xfile.c +++ b/source3/lib/xfile.c @@ -140,9 +140,10 @@ int x_fclose(XFILE *f) } /* simulate fwrite() */ -int x_fwrite(const void *p, size_t size, size_t nmemb, XFILE *f) +size_t x_fwrite(const void *p, size_t size, size_t nmemb, XFILE *f) { - int ret, total=0; + ssize_t ret; + size_t total=0; /* we might be writing unbuffered */ if (f->buftype == X_IONBF || @@ -154,7 +155,7 @@ int x_fwrite(const void *p, size_t size, size_t nmemb, XFILE *f) while (total < size*nmemb) { - int n = f->bufsize - f->bufused; + size_t n = f->bufsize - f->bufused; n = MIN(n, (size*nmemb)-total); if (n == 0) { diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index 77d8c9cc92..6c21dc04d0 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -181,7 +181,7 @@ uint32 dos_mode(connection_struct *conn,char *path,SMB_STRUCT_STAT *sbuf) /******************************************************************* chmod a file - but preserve some bits ********************************************************************/ -int file_chmod(connection_struct *conn,char *fname,int dosmode,SMB_STRUCT_STAT *st) +int file_chmod(connection_struct *conn,char *fname, uint32 dosmode,SMB_STRUCT_STAT *st) { SMB_STRUCT_STAT st1; int mask=0; diff --git a/source3/smbd/mangle_hash2.c b/source3/smbd/mangle_hash2.c index bbc9020eab..eda509214d 100644 --- a/source3/smbd/mangle_hash2.c +++ b/source3/smbd/mangle_hash2.c @@ -203,7 +203,7 @@ static const char *cache_lookup(u32 hash) */ static BOOL is_mangled_component(const char *name) { - int len, i; + unsigned int len, i; M_DEBUG(10,("is_mangled_component %s ?\n", name)); @@ -368,7 +368,7 @@ static void mangle_reset(void) static BOOL check_cache(char *name) { u32 hash, multiplier; - int i; + unsigned int i; const char *prefix; char extension[4]; @@ -489,8 +489,8 @@ static void name_map(char *name, BOOL need83, BOOL cache83) char *dot_p; char lead_chars[7]; char extension[4]; - int extension_length, i; - int prefix_len; + unsigned int extension_length, i; + unsigned int prefix_len; u32 hash, v; char new_name[13]; -- cgit From fa26737f40607baa084f2fcc481894473add69d4 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 20:01:00 +0000 Subject: See if I can make this look slightly like C. It compiled locally, honest... Andrew Bartlett (This used to be commit cfc4cc776899da92a5c9a17f0ea36c7cb65d7a80) --- source3/auth/auth_rhosts.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source3/auth/auth_rhosts.c b/source3/auth/auth_rhosts.c index d8e1b01942..8915acaecd 100644 --- a/source3/auth/auth_rhosts.c +++ b/source3/auth/auth_rhosts.c @@ -199,6 +199,8 @@ static NTSTATUS check_rhosts_security(const struct auth_context *auth_context, { NTSTATUS nt_status = NT_STATUS_LOGON_FAILURE; SAM_ACCOUNT *account = NULL; + pstring rhostsfile; + const char *home; if (!NT_STATUS_IS_OK(nt_status = auth_get_sam_account(user_info->internal_username.str, @@ -206,9 +208,8 @@ static NTSTATUS check_rhosts_security(const struct auth_context *auth_context, return nt_status; } - pstring rhostsfile; - - char *home = pdb_get_unix_homedir(account); + home = pdb_get_unix_homedir(account); + if (home) { slprintf(rhostsfile, sizeof(rhostsfile)-1, "%s/.rhosts", home); become_root(); -- cgit From 1d1ad2db2e1f78ed16bd7c62b4d062aa128bb27d Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 22 Feb 2003 20:11:29 +0000 Subject: Make sure we set the error code to indicate failure... Andrew Bartlett (This used to be commit 5a472e2a3cffe175ac4341e19c153a931505a2e8) --- source3/auth/auth_rhosts.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/source3/auth/auth_rhosts.c b/source3/auth/auth_rhosts.c index 8915acaecd..5451f7d930 100644 --- a/source3/auth/auth_rhosts.c +++ b/source3/auth/auth_rhosts.c @@ -169,6 +169,9 @@ static NTSTATUS check_hostsequiv_security(const struct auth_context *auth_contex if (check_hosts_equiv(account)) { nt_status = make_server_info_sam(server_info, account); + } else { + pdb_free_sam(&account); + nt_status = NT_STATUS_LOGON_FAILURE; } return nt_status; @@ -215,10 +218,16 @@ static NTSTATUS check_rhosts_security(const struct auth_context *auth_context, become_root(); if (check_user_equiv(pdb_get_username(account),client_name(),rhostsfile)) { nt_status = make_server_info_sam(server_info, account); + } else { + pdb_free_sam(&account); + nt_status = NT_STATUS_LOGON_FAILURE; } unbecome_root(); - } - + } else { + pdb_free_sam(&account); + nt_status = NT_STATUS_LOGON_FAILURE; + } + return nt_status; } -- cgit From bfc5f0ba8e7fed1f95f83cb1ee43631e307927fb Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sun, 23 Feb 2003 17:40:43 +0000 Subject: move genparser to use talloc contexts instead of [m|c|re]alloc() and free()s (This used to be commit 70fce680c01fa1baa65fb3cbc83dfaf822fdadd7) --- source3/lib/genparser.c | 233 ++++++++++++++++++++++-------------------- source3/lib/genparser_samba.c | 82 +++++++-------- 2 files changed, 163 insertions(+), 152 deletions(-) diff --git a/source3/lib/genparser.c b/source3/lib/genparser.c index 9fa9dbd33b..233050b432 100644 --- a/source3/lib/genparser.c +++ b/source3/lib/genparser.c @@ -34,12 +34,12 @@ static int all_zero(const char *ptr, unsigned size) } /* encode a buffer of bytes into a escaped string */ -static char *encode_bytes(const char *ptr, unsigned len) +static char *encode_bytes(TALLOC_CTX *mem_ctx, const char *ptr, unsigned len) { const char *hexdig = "0123456789abcdef"; char *ret, *p; unsigned i; - ret = malloc(len*3 + 1); /* worst case size */ + ret = talloc(mem_ctx, len*3 + 1); /* worst case size */ if (!ret) return NULL; for (p=ret,i=0;i 255) { - free(ret); return NULL; } *(unsigned char *)p = v; @@ -96,11 +100,11 @@ static char *decode_bytes(const char *s, unsigned *len) parse_string */ /* allocate more space if needed */ -static int addgen_alloc(struct parse_string *p, int n) +static int addgen_alloc(TALLOC_CTX *mem_ctx, struct parse_string *p, int n) { if (p->length + n <= p->allocated) return 0; p->allocated = p->length + n + 200; - p->s = realloc(p->s, p->allocated); + p->s = talloc_realloc(mem_ctx, p->s, p->allocated); if (!p->s) { errno = ENOMEM; return -1; @@ -109,9 +113,9 @@ static int addgen_alloc(struct parse_string *p, int n) } /* add a character to the buffer */ -static int addchar(struct parse_string *p, char c) +static int addchar(TALLOC_CTX *mem_ctx, struct parse_string *p, char c) { - if (addgen_alloc(p, 2) != 0) { + if (addgen_alloc(mem_ctx, p, 2) != 0) { return -1; } p->s[p->length++] = c; @@ -120,10 +124,10 @@ static int addchar(struct parse_string *p, char c) } /* add a string to the buffer */ -int addstr(struct parse_string *p, const char *s) +int addstr(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *s) { int len = strlen(s); - if (addgen_alloc(p, len+1) != 0) { + if (addgen_alloc(mem_ctx, p, len+1) != 0) { return -1; } memcpy(p->s + p->length, s, len+1); @@ -132,10 +136,10 @@ int addstr(struct parse_string *p, const char *s) } /* add a string to the buffer with a tab prefix */ -static int addtabbed(struct parse_string *p, const char *s, unsigned indent) +static int addtabbed(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *s, unsigned indent) { int len = strlen(s); - if (addgen_alloc(p, indent+len+1) != 0) { + if (addgen_alloc(mem_ctx, p, indent+len+1) != 0) { return -1; } while (indent--) { @@ -147,7 +151,7 @@ static int addtabbed(struct parse_string *p, const char *s, unsigned indent) } /* note! this can only be used for results up to 60 chars wide! */ -int addshort(struct parse_string *p, const char *fmt, ...) +int addshort(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *fmt, ...) { char buf[60]; int n; @@ -155,7 +159,7 @@ int addshort(struct parse_string *p, const char *fmt, ...) va_start(ap, fmt); n = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); - if (addgen_alloc(p, n + 1) != 0) { + if (addgen_alloc(mem_ctx, p, n + 1) != 0) { return -1; } if (n != 0) { @@ -170,7 +174,7 @@ int addshort(struct parse_string *p, const char *fmt, ...) this is here to make it easier for people to write dump functions for their own types */ -int gen_addgen(struct parse_string *p, const char *fmt, ...) +int gen_addgen(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *fmt, ...) { char *buf = NULL; int n; @@ -178,7 +182,7 @@ int gen_addgen(struct parse_string *p, const char *fmt, ...) va_start(ap, fmt); n = vasprintf(&buf, fmt, ap); va_end(ap); - if (addgen_alloc(p, n + 1) != 0) { + if (addgen_alloc(mem_ctx, p, n + 1) != 0) { if (buf) free(buf); return -1; } @@ -192,7 +196,8 @@ int gen_addgen(struct parse_string *p, const char *fmt, ...) } /* dump a enumerated type */ -int gen_dump_enum(const struct enum_struct *einfo, +int gen_dump_enum(TALLOC_CTX *mem_ctx, + const struct enum_struct *einfo, struct parse_string *p, const char *ptr, unsigned indent) @@ -201,36 +206,37 @@ int gen_dump_enum(const struct enum_struct *einfo, int i; for (i=0;einfo[i].name;i++) { if (v == einfo[i].value) { - addstr(p, einfo[i].name); + addstr(mem_ctx, p, einfo[i].name); return 0; } } /* hmm, maybe we should just fail? */ - return gen_dump_unsigned(p, ptr, indent); + return gen_dump_unsigned(mem_ctx, p, ptr, indent); } /* dump a single non-array element, hanlding struct and enum */ -static int gen_dump_one(struct parse_string *p, - const struct parse_struct *pinfo, - const char *ptr, - unsigned indent) +static int gen_dump_one(TALLOC_CTX *mem_ctx, + struct parse_string *p, + const struct parse_struct *pinfo, + const char *ptr, + unsigned indent) { if (pinfo->dump_fn == gen_dump_char && pinfo->ptr_count == 1) { - char *s = encode_bytes(ptr, strlen(ptr)); - if (addchar(p,'{') || - addstr(p, s) || - addstr(p, "}")) { - free(s); + char *s = encode_bytes(mem_ctx, ptr, strlen(ptr)); + if (addchar(mem_ctx, p,'{') || + addstr(mem_ctx, p, s) || + addstr(mem_ctx, p, "}")) { return -1; } return 0; } - return pinfo->dump_fn(p, ptr, indent); + return pinfo->dump_fn(mem_ctx, p, ptr, indent); } /* handle dumping of an array of arbitrary type */ -static int gen_dump_array(struct parse_string *p, +static int gen_dump_array(TALLOC_CTX *mem_ctx, + struct parse_string *p, const struct parse_struct *pinfo, const char *ptr, int array_len, @@ -242,13 +248,12 @@ static int gen_dump_array(struct parse_string *p, if (array_len != 0 && pinfo->ptr_count == 0 && pinfo->dump_fn == gen_dump_char) { - char *s = encode_bytes(ptr, array_len); + char *s = encode_bytes(mem_ctx, ptr, array_len); if (!s) return -1; - if (addtabbed(p, pinfo->name, indent) || - addstr(p, " = {") || - addstr(p, s) || - addstr(p, "}\n")) { - free(s); + if (addtabbed(mem_ctx, p, pinfo->name, indent) || + addstr(mem_ctx, p, " = {") || + addstr(mem_ctx, p, s) || + addstr(mem_ctx, p, "}\n")) { return -1; } free(s); @@ -272,23 +277,23 @@ static int gen_dump_array(struct parse_string *p, continue; } if (count == 0) { - if (addtabbed(p, pinfo->name, indent) || - addshort(p, " = %u:", i)) { + if (addtabbed(mem_ctx, p, pinfo->name, indent) || + addshort(mem_ctx, p, " = %u:", i)) { return -1; } } else { - if (addshort(p, ", %u:", i) != 0) { + if (addshort(mem_ctx, p, ", %u:", i) != 0) { return -1; } } - if (gen_dump_one(p, pinfo, p2, indent) != 0) { + if (gen_dump_one(mem_ctx, p, pinfo, p2, indent) != 0) { return -1; } ptr += size; count++; } if (count) { - return addstr(p, "\n"); + return addstr(mem_ctx, p, "\n"); } return 0; } @@ -325,36 +330,35 @@ static int find_var(const struct parse_struct *pinfo, } -int gen_dump_struct(const struct parse_struct *pinfo, +int gen_dump_struct(TALLOC_CTX *mem_ctx, + const struct parse_struct *pinfo, struct parse_string *p, const char *ptr, unsigned indent) { - char *s = gen_dump(pinfo, ptr, indent+1); + char *s = gen_dump(mem_ctx, pinfo, ptr, indent+1); if (!s) return -1; - if (addstr(p, "{\n") || - addstr(p,s) || - addtabbed(p,"}", indent)) { - free(s); + if (addstr(mem_ctx, p, "{\n") || + addstr(mem_ctx, p, s) || + addtabbed(mem_ctx, p, "}", indent)) { return -1; } - free(s); return 0; } -static int gen_dump_string(struct parse_string *p, +static int gen_dump_string(TALLOC_CTX *mem_ctx, + struct parse_string *p, const struct parse_struct *pinfo, const char *data, unsigned indent) { const char *ptr = *(char **)data; - char *s = encode_bytes(ptr, strlen(ptr)); - if (addtabbed(p, pinfo->name, indent) || - addstr(p, " = ") || - addchar(p,'{') || - addstr(p, s) || - addstr(p, "}\n")) { - free(s); + char *s = encode_bytes(mem_ctx, ptr, strlen(ptr)); + if (addtabbed(mem_ctx, p, pinfo->name, indent) || + addstr(mem_ctx, p, " = ") || + addchar(mem_ctx, p, '{') || + addstr(mem_ctx, p, s) || + addstr(mem_ctx, p, "}\n")) { return -1; } return 0; @@ -370,7 +374,7 @@ static int len_nullterm(const char *ptr, int size, int array_len) if (size == 1) { len = strnlen(ptr, array_len); } else { - for (len=0;lenparse_fn == gen_parse_char && pinfo->ptr_count==1) { unsigned len; - char *s = decode_bytes(str, &len); + char *s = decode_bytes(mem_ctx, str, &len); if (!s) return -1; *(char **)ptr = s; return 0; } if (pinfo->ptr_count) { + unsigned size = pinfo->ptr_count>1?sizeof(void *):pinfo->size; struct parse_struct p2 = *pinfo; - *(void **)ptr = calloc(1, pinfo->ptr_count>1?sizeof(void *):pinfo->size); + *(void **)ptr = talloc(mem_ctx, size); if (! *(void **)ptr) { return -1; } + memset(*(void **)ptr, 0, size); ptr = *(char **)ptr; p2.ptr_count--; - return gen_parse_base(&p2, ptr, str); + return gen_parse_base(mem_ctx, &p2, ptr, str); } - return pinfo->parse_fn(ptr, str); + return pinfo->parse_fn(mem_ctx, ptr, str); } /* parse a generic array */ -static int gen_parse_array(const struct parse_struct *pinfo, - char *ptr, - const char *str, - int array_len) +static int gen_parse_array(TALLOC_CTX *mem_ctx, + const struct parse_struct *pinfo, + char *ptr, + const char *str, + int array_len) { char *p, *p2; unsigned size = pinfo->size; @@ -564,11 +574,10 @@ static int gen_parse_array(const struct parse_struct *pinfo, pinfo->ptr_count == 0 && pinfo->dump_fn == gen_dump_char) { unsigned len = 0; - char *s = decode_bytes(str, &len); - if (!s) return -1; + char *s = decode_bytes(mem_ctx, str, &len); + if (!s || (len > array_len)) return -1; memset(ptr, 0, array_len); memcpy(ptr, s, len); - free(s); return 0; } @@ -593,7 +602,7 @@ static int gen_parse_array(const struct parse_struct *pinfo, p[strlen(p)-1] = 0; } - if (gen_parse_base(pinfo, ptr + idx*size, p) != 0) { + if (gen_parse_base(mem_ctx, pinfo, ptr + idx*size, p) != 0) { return -1; } @@ -605,7 +614,8 @@ static int gen_parse_array(const struct parse_struct *pinfo, } /* parse one element, hanlding dynamic and static arrays */ -static int gen_parse_one(const struct parse_struct *pinfo, +static int gen_parse_one(TALLOC_CTX *mem_ctx, + const struct parse_struct *pinfo, const char *name, char *data, const char *str) @@ -621,7 +631,8 @@ static int gen_parse_one(const struct parse_struct *pinfo, } if (pinfo[i].array_len) { - return gen_parse_array(&pinfo[i], data+pinfo[i].offset, + return gen_parse_array(mem_ctx, &pinfo[i], + data+pinfo[i].offset, str, pinfo[i].array_len); } @@ -632,33 +643,33 @@ static int gen_parse_one(const struct parse_struct *pinfo, return -1; } if (len > 0) { - unsigned size; struct parse_struct p2 = pinfo[i]; char *ptr; - size = pinfo[i].ptr_count>1?sizeof(void*):pinfo[i].size; - ptr = calloc(len, size); + unsigned size = pinfo[i].ptr_count>1?sizeof(void*):pinfo[i].size; + ptr = talloc(mem_ctx, len*size); if (!ptr) { errno = ENOMEM; return -1; } + memset(ptr, 0, len*size); *((char **)(data + pinfo[i].offset)) = ptr; p2.ptr_count--; p2.dynamic_len = NULL; - return gen_parse_array(&p2, ptr, str, len); + return gen_parse_array(mem_ctx, &p2, ptr, str, len); } return 0; } - return gen_parse_base(&pinfo[i], data + pinfo[i].offset, str); + return gen_parse_base(mem_ctx, &pinfo[i], data + pinfo[i].offset, str); } -int gen_parse_struct(const struct parse_struct *pinfo, char *ptr, const char *str) +int gen_parse_struct(TALLOC_CTX * mem_ctx, const struct parse_struct *pinfo, char *ptr, const char *str) { - return gen_parse(pinfo, ptr, str); + return gen_parse(mem_ctx, pinfo, ptr, str); } /* the main parse routine */ -int gen_parse(const struct parse_struct *pinfo, char *data, const char *s) +int gen_parse(TALLOC_CTX *mem_ctx, const struct parse_struct *pinfo, char *data, const char *s) { char *str, *s0; @@ -694,7 +705,7 @@ int gen_parse(const struct parse_struct *pinfo, char *data, const char *s) *str++ = 0; - if (gen_parse_one(pinfo, name, data, value) != 0) { + if (gen_parse_one(mem_ctx, pinfo, name, data, value) != 0) { free(s0); return -1; } @@ -708,68 +719,68 @@ int gen_parse(const struct parse_struct *pinfo, char *data, const char *s) /* for convenience supply some standard dumpers and parsers here */ -int gen_parse_char(char *ptr, const char *str) +int gen_parse_char(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(unsigned char *)ptr = atoi(str); return 0; } -int gen_parse_int(char *ptr, const char *str) +int gen_parse_int(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(int *)ptr = atoi(str); return 0; } -int gen_parse_unsigned(char *ptr, const char *str) +int gen_parse_unsigned(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(unsigned *)ptr = strtoul(str, NULL, 10); return 0; } -int gen_parse_time_t(char *ptr, const char *str) +int gen_parse_time_t(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(time_t *)ptr = strtoul(str, NULL, 10); return 0; } -int gen_parse_double(char *ptr, const char *str) +int gen_parse_double(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(double *)ptr = atof(str); return 0; } -int gen_parse_float(char *ptr, const char *str) +int gen_parse_float(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(float *)ptr = atof(str); return 0; } -int gen_dump_char(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_char(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%u", *(unsigned char *)(ptr)); + return addshort(mem_ctx, p, "%u", *(unsigned char *)(ptr)); } -int gen_dump_int(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_int(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%d", *(int *)(ptr)); + return addshort(mem_ctx, p, "%d", *(int *)(ptr)); } -int gen_dump_unsigned(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_unsigned(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%u", *(unsigned *)(ptr)); + return addshort(mem_ctx, p, "%u", *(unsigned *)(ptr)); } -int gen_dump_time_t(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_time_t(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%u", *(time_t *)(ptr)); + return addshort(mem_ctx, p, "%u", *(time_t *)(ptr)); } -int gen_dump_double(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_double(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%lg", *(double *)(ptr)); + return addshort(mem_ctx, p, "%lg", *(double *)(ptr)); } -int gen_dump_float(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_float(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%g", *(float *)(ptr)); + return addshort(mem_ctx, p, "%g", *(float *)(ptr)); } diff --git a/source3/lib/genparser_samba.c b/source3/lib/genparser_samba.c index 6c700d1094..bece587747 100644 --- a/source3/lib/genparser_samba.c +++ b/source3/lib/genparser_samba.c @@ -22,25 +22,25 @@ /* PARSE functions */ -int gen_parse_uint8(char *ptr, const char *str) +int gen_parse_uint8(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(uint8 *)ptr = atoi(str); return 0; } -int gen_parse_uint16(char *ptr, const char *str) +int gen_parse_uint16(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(uint16 *)ptr = atoi(str); return 0; } -int gen_parse_uint32(char *ptr, const char *str) +int gen_parse_uint32(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { *(uint32 *)ptr = strtoul(str, NULL, 10); return 0; } -int gen_parse_NTTIME(char *ptr, const char *str) +int gen_parse_NTTIME(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { if(sscanf(str, "%u,%u", &(((NTTIME *)(ptr))->high), &(((NTTIME *)(ptr))->low)) != 2) { errno = EINVAL; @@ -49,19 +49,19 @@ int gen_parse_NTTIME(char *ptr, const char *str) return 0; } -int gen_parse_DOM_SID(char *ptr, const char *str) +int gen_parse_DOM_SID(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { if(!string_to_sid((DOM_SID *)ptr, str)) return -1; return 0; } -int gen_parse_SEC_ACCESS(char *ptr, const char *str) +int gen_parse_SEC_ACCESS(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { ((SEC_ACCESS *)ptr)->mask = strtoul(str, NULL, 10); return 0; } -int gen_parse_GUID(char *ptr, const char *str) +int gen_parse_GUID(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { int info[GUID_SIZE]; int i; @@ -89,27 +89,27 @@ int gen_parse_GUID(char *ptr, const char *str) return 0; } -int gen_parse_SEC_ACE(char *ptr, const char *str) +int gen_parse_SEC_ACE(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { - return gen_parse_struct(pinfo_security_ace_info, ptr, str); + return gen_parse_struct(mem_ctx, pinfo_security_ace_info, ptr, str); } -int gen_parse_SEC_ACL(char *ptr, const char *str) +int gen_parse_SEC_ACL(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { - return gen_parse_struct(pinfo_security_acl_info, ptr, str); + return gen_parse_struct(mem_ctx, pinfo_security_acl_info, ptr, str); } -int gen_parse_SEC_DESC(char *ptr, const char *str) +int gen_parse_SEC_DESC(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { - return gen_parse_struct(pinfo_security_descriptor_info, ptr, str); + return gen_parse_struct(mem_ctx, pinfo_security_descriptor_info, ptr, str); } -int gen_parse_LUID_ATTR(char *ptr, const char *str) +int gen_parse_LUID_ATTR(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { - return gen_parse_struct(pinfo_luid_attr_info, ptr, str); + return gen_parse_struct(mem_ctx, pinfo_luid_attr_info, ptr, str); } -int gen_parse_LUID(char *ptr, const char *str) +int gen_parse_LUID(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { if(sscanf(str, "%u,%u", &(((LUID *)(ptr))->high), &(((LUID *)(ptr))->low)) != 2) { errno = EINVAL; @@ -122,79 +122,79 @@ int gen_parse_LUID(char *ptr, const char *str) /* DUMP functions */ -int gen_dump_uint8(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_uint8(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%u", *(uint8 *)(ptr)); + return addshort(mem_ctx, p, "%u", *(uint8 *)(ptr)); } -int gen_dump_uint16(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_uint16(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%u", *(uint16 *)(ptr)); + return addshort(mem_ctx, p, "%u", *(uint16 *)(ptr)); } -int gen_dump_uint32(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_uint32(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%u", *(uint32 *)(ptr)); + return addshort(mem_ctx, p, "%u", *(uint32 *)(ptr)); } -int gen_dump_NTTIME(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_NTTIME(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { uint32 low, high; high = ((NTTIME *)(ptr))->high; low = ((NTTIME *)(ptr))->low; - return addshort(p, "%u,%u", high, low); + return addshort(mem_ctx, p, "%u,%u", high, low); } -int gen_dump_DOM_SID(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_DOM_SID(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { fstring sidstr; sid_to_string(sidstr, (DOM_SID *)ptr); - return addstr(p, sidstr); + return addstr(mem_ctx, p, sidstr); } -int gen_dump_SEC_ACCESS(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_SEC_ACCESS(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return addshort(p, "%u", ((SEC_ACCESS *)ptr)->mask); + return addshort(mem_ctx, p, "%u", ((SEC_ACCESS *)ptr)->mask); } -int gen_dump_GUID(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_GUID(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { int i, r; for (i = 0; i < (GUID_SIZE - 1); i++) { - if (!(r = addshort(p, "%d,", ((GUID *)ptr)->info[i]))) return r; + if (!(r = addshort(mem_ctx, p, "%d,", ((GUID *)ptr)->info[i]))) return r; } - return addshort(p, "%d", ((GUID *)ptr)->info[i]); + return addshort(mem_ctx, p, "%d", ((GUID *)ptr)->info[i]); } -int gen_dump_SEC_ACE(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_SEC_ACE(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return gen_dump_struct(pinfo_security_ace_info, p, ptr, indent); + return gen_dump_struct(mem_ctx, pinfo_security_ace_info, p, ptr, indent); } -int gen_dump_SEC_ACL(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_SEC_ACL(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return gen_dump_struct(pinfo_security_acl_info, p, ptr, indent); + return gen_dump_struct(mem_ctx, pinfo_security_acl_info, p, ptr, indent); } -int gen_dump_SEC_DESC(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_SEC_DESC(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return gen_dump_struct(pinfo_security_descriptor_info, p, ptr, indent); + return gen_dump_struct(mem_ctx, pinfo_security_descriptor_info, p, ptr, indent); } -int gen_dump_LUID_ATTR(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_LUID_ATTR(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { - return gen_dump_struct(pinfo_luid_attr_info, p, ptr, indent); + return gen_dump_struct(mem_ctx, pinfo_luid_attr_info, p, ptr, indent); } -int gen_dump_LUID(struct parse_string *p, const char *ptr, unsigned indent) +int gen_dump_LUID(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { uint32 low, high; high = ((LUID *)(ptr))->high; low = ((LUID *)(ptr))->low; - return addshort(p, "%u,%u", high, low); + return addshort(mem_ctx, p, "%u,%u", high, low); } -- cgit From bd0bbde1bba4ad4e6e95f269912943d9d583dce4 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sun, 23 Feb 2003 18:08:07 +0000 Subject: forgot the altered include file (This used to be commit f3be08472b8b34d8921ff23c52dd2ba030c96f25) --- source3/include/genparser.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/include/genparser.h b/source3/include/genparser.h index 002d79f8f9..f28cd78249 100644 --- a/source3/include/genparser.h +++ b/source3/include/genparser.h @@ -46,8 +46,8 @@ struct parse_string { char *s; }; -typedef int (*gen_dump_fn)(struct parse_string *, const char *ptr, unsigned indent); -typedef int (*gen_parse_fn)(char *ptr, const char *str); +typedef int (*gen_dump_fn)(TALLOC_CTX *, struct parse_string *, const char *ptr, unsigned indent); +typedef int (*gen_parse_fn)(TALLOC_CTX *, char *ptr, const char *str); /* genstruct.pl generates arrays of these */ struct parse_struct { @@ -63,8 +63,8 @@ struct parse_struct { }; #define DUMP_PARSE_DECL(type) \ - int gen_dump_ ## type(struct parse_string *, const char *, unsigned); \ - int gen_parse_ ## type(char *, const char *); + int gen_dump_ ## type(TALLOC_CTX *, struct parse_string *, const char *, unsigned); \ + int gen_parse_ ## type(TALLOC_CTX *, char *, const char *); DUMP_PARSE_DECL(char) DUMP_PARSE_DECL(int) -- cgit From e68684aa65b579081163c175d681b7867a0828bf Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 01:13:31 +0000 Subject: Fix 2 off-by-one bugs in the use of malloc()ed strings and safe_strcpy(). safe_strcpy() isn't particularly safe (this has been noted before) as it does not take the size of the buffer, but instead the size of the buffer *minus 1* The locking.c fix was causing segfaults on machines running with --enable-developer, and was tracked down thanks to the fact that vance's build farm machine runs with such an option, and smbtorture's DIR1 test hits this bug very well. (The --enable-developer code writes to the last byte of the string, to check for incorrect use of safe_strcpy()). Andrew Bartlett (This used to be commit e908fd164d1b11b6f76a6fdffb22e139813cb3c0) --- source3/lib/hash.c | 6 ++++-- source3/locking/locking.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/source3/lib/hash.c b/source3/lib/hash.c index 95af485707..c7b1493b4c 100644 --- a/source3/lib/hash.c +++ b/source3/lib/hash.c @@ -171,6 +171,7 @@ hash_element *hash_insert(hash_table *table, char *value, char *key) hash_element *hash_elem; ubi_dlNodePtr lru_item; ubi_dlList *bucket; + size_t string_length; /* * If the hash table size has not reached the MAX_HASH_TABLE_SIZE, @@ -204,12 +205,13 @@ hash_element *hash_insert(hash_table *table, char *value, char *key) * string. */ - if(!(hash_elem = (hash_element *) malloc(sizeof(hash_element) + strlen(key)))) { + string_length = strlen(key); + if(!(hash_elem = (hash_element *) malloc(sizeof(hash_element) + string_length))) { DEBUG(0,("hash_insert: malloc fail !\n")); return (hash_element *)NULL; } - safe_strcpy((char *) hash_elem->key, key, strlen(key)+1); + safe_strcpy((char *) hash_elem->key, key, string_length); hash_elem->value = (char *)value; hash_elem->bucket = bucket; diff --git a/source3/locking/locking.c b/source3/locking/locking.c index d4794560f6..fdfd4d661c 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -630,7 +630,7 @@ BOOL set_share_mode(files_struct *fsp, uint16 port, uint16 op_type) fsp->fsp_name )); offset = sizeof(*data) + sizeof(share_mode_entry); - safe_strcpy(p + offset, fname, size - offset); + safe_strcpy(p + offset, fname, size - offset - 1); fill_share_mode(p + sizeof(*data), fsp, port, op_type); dbuf.dptr = p; dbuf.dsize = size; -- cgit From ded88da1ea1fdcd6da017de2e1378578971f7645 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 02:11:32 +0000 Subject: Add const (This used to be commit ffaa608be01d72075942ca3aff2325c6364e0556) --- source3/lib/util.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/lib/util.c b/source3/lib/util.c index 13f5b17781..3958600cbd 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -309,9 +309,9 @@ BOOL in_group(gid_t group, gid_t current_gid, int ngroups, const gid_t *groups) Like atoi but gets the value up to the separator character. ****************************************************************************/ -static char *Atoic(char *p, int *n, char *c) +static const char *Atoic(const char *p, int *n, const char *c) { - if (!isdigit((int)*p)) { + if (!isdigit((const int)*p)) { DEBUG(5, ("Atoic: malformed number\n")); return NULL; } @@ -333,7 +333,7 @@ static char *Atoic(char *p, int *n, char *c) Reads a list of numbers. *************************************************************************/ -char *get_numlist(char *p, uint32 **num, int *count) +const char *get_numlist(const char *p, uint32 **num, int *count) { int val; @@ -2400,7 +2400,7 @@ static BOOL unix_do_match(char *regexp, char *str) Simple case insensitive interface to a UNIX wildcard matcher. *******************************************************************/ -BOOL unix_wild_match(char *pattern, char *string) +BOOL unix_wild_match(const char *pattern, const char *string) { pstring p2, s2; char *p; -- cgit From e25aa22a8ff46b3c29fc373a585d8a5e5cc37296 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 24 Feb 2003 02:12:39 +0000 Subject: Merge: > Exit path cleanup for cli_samr_enum_dom_users() (This used to be commit 655c1e03519d4fa174a85534c165bdd1ce163ae8) --- source3/rpc_client/cli_samr.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source3/rpc_client/cli_samr.c b/source3/rpc_client/cli_samr.c index 08c68b7632..c451ee2e42 100644 --- a/source3/rpc_client/cli_samr.c +++ b/source3/rpc_client/cli_samr.c @@ -590,16 +590,14 @@ NTSTATUS cli_samr_enum_dom_users(struct cli_state *cli, TALLOC_CTX *mem_ctx, if(!samr_io_r_enum_dom_users("", &r, &rbuf, 0)) goto done; - /* return the data obtained in response */ - if (!NT_STATUS_IS_OK(r.status) && - (NT_STATUS_EQUAL(r.status, STATUS_MORE_ENTRIES) || - NT_STATUS_EQUAL(r.status, NT_STATUS_NO_MORE_ENTRIES))) { - return r.status; - } + result = r.status; + + if (!NT_STATUS_IS_OK(result) && + NT_STATUS_V(result) != NT_STATUS_V(STATUS_MORE_ENTRIES)) + goto done; *start_idx = r.next_idx; *num_dom_users = r.num_entries2; - result = r.status; if (r.num_entries2) { /* allocate memory needed to return received data */ -- cgit From 12f2ebf7f006369477824d9b4b917847d63a68af Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 03:45:02 +0000 Subject: Always initialise (This used to be commit ff2b5b2f85f2d9dade67077cea1b68719cf65352) --- source3/libads/ldap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index bc90e90ea0..29f44672f4 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -816,8 +816,8 @@ static ADS_STATUS ads_modlist_add(TALLOC_CTX *ctx, ADS_MODLIST *mods, { int curmod; LDAPMod **modlist = (LDAPMod **) *mods; - struct berval **ber_values; - char **char_values; + struct berval **ber_values = NULL; + char **char_values = NULL; if (!invals) { mod_op = LDAP_MOD_DELETE; -- cgit From 5b5453e6c799cbf3fa7638950825e3b1c276cdc2 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Mon, 24 Feb 2003 04:42:24 +0000 Subject: Merge documentation from 3_0. (This used to be commit 5002555a9719987ccdc887ffff64ea8d02c9881d) --- source3/lib/charcnv.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index bffa2a378c..a8df003f8b 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -22,17 +22,24 @@ */ #include "includes.h" -static pstring cvtbuf; - -static smb_iconv_t conv_handles[NUM_CHARSETS][NUM_CHARSETS]; - /** * @file * - * Character set conversion routines. + * @brief Character-set conversion routines built on our iconv. + * + * @note Samba's internal character set (at least in the 3.0 series) + * is always the same as the one for the Unix filesystem. It is + * not necessarily UTF-8 and may be different on machines that + * need i18n filenames to be compatible with Unix software. It does + * have to be a superset of ASCII. All multibyte sequences must start + * with a byte with the high bit set. * * @sa lib/iconv.c - **/ + */ + +static pstring cvtbuf; + +static smb_iconv_t conv_handles[NUM_CHARSETS][NUM_CHARSETS]; /** -- cgit From 6fa6b607c9f97dca9850e2d5c5dc175497fbebd8 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 24 Feb 2003 04:59:15 +0000 Subject: Quieten compiler warning. (This used to be commit eb5d1a72dc9dc35997d39f8778ee98163b8cce32) --- source3/python/py_tdbpack.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source3/python/py_tdbpack.c b/source3/python/py_tdbpack.c index 243cb44683..f0718b717e 100644 --- a/source3/python/py_tdbpack.c +++ b/source3/python/py_tdbpack.c @@ -25,6 +25,13 @@ #include "Python.h" +/* This symbol is used in both config.h and Python.h which causes an + annoying compiler warning. */ + +#ifdef HAVE_FSTAT +#undef HAVE_FSTAT +#endif + /* This module is supposed to be standalone, however for portability it would be good to use the FUNCTION_MACRO preprocessor define. */ -- cgit From 2295c0cf296090ed48d7e9bf47c4358de30eaec0 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 09:10:41 +0000 Subject: Fix off-by-one bugs, and move to strdup() rather than malloc()/strcpy(). Andrew Bartlett (This used to be commit aa486355e282b891b299d63cc07431f32213b1b8) --- source3/modules/vfs_recycle.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/source3/modules/vfs_recycle.c b/source3/modules/vfs_recycle.c index dcd83b7acd..a99a593caf 100644 --- a/source3/modules/vfs_recycle.c +++ b/source3/modules/vfs_recycle.c @@ -472,25 +472,21 @@ static void recycle_touch(connection_struct *conn, const char *fname) /** * Check if file should be recycled **/ -static int recycle_unlink(connection_struct *conn, const char *inname) +static int recycle_unlink(connection_struct *conn, const char *file_name) { recycle_bin_private_data *recdata; recycle_bin_connections *recconn; recycle_bin_struct *recbin; - char *file_name = NULL; char *path_name = NULL; char *temp_name = NULL; char *final_name = NULL; - char *base; + const char *base; int i; /* SMB_BIG_UINT dfree, dsize, bsize; */ SMB_OFF_T file_size; /* space_avail; */ BOOL exist; int rc = -1; - file_name = strdup(inname); - ALLOC_CHECK(file_name, done); - recbin = NULL; if (recycle_bin_private_handle) { recdata = (recycle_bin_private_data *)(recycle_bin_private_handle->data); @@ -560,14 +556,13 @@ static int recycle_unlink(connection_struct *conn, const char *inname) path_name = (char *)malloc(PATH_MAX); ALLOC_CHECK(path_name, done); *path_name = '\0'; - safe_strcpy(path_name, file_name, PATH_MAX); + safe_strcpy(path_name, file_name, PATH_MAX - 1); base = strrchr(path_name, '/'); if (base == NULL) { base = file_name; - safe_strcpy(path_name, "/", PATH_MAX); + safe_strcpy(path_name, "/", PATH_MAX - 1); } else { - *base = '\0'; base++; } @@ -591,14 +586,13 @@ static int recycle_unlink(connection_struct *conn, const char *inname) goto done; } - temp_name = (char *)malloc(PATH_MAX); + temp_name = (char *)strdup(recbin->repository); ALLOC_CHECK(temp_name, done); - safe_strcpy(temp_name, recbin->repository, PATH_MAX); /* see if we need to recreate the original directory structure in the recycle bin */ if (recbin->keep_dir_tree == True) { - safe_strcat(temp_name, "/", PATH_MAX); - safe_strcat(temp_name, path_name, PATH_MAX); + safe_strcat(temp_name, "/", PATH_MAX - 1); + safe_strcat(temp_name, path_name, PATH_MAX - 1); } exist = recycle_directory_exist(conn, temp_name); @@ -613,9 +607,9 @@ static int recycle_unlink(connection_struct *conn, const char *inname) } } - final_name = (char *)malloc(PATH_MAX); + final_name = NULL; + asprintf(&final_name, "%s/%s", temp_name, base); ALLOC_CHECK(final_name, done); - snprintf(final_name, PATH_MAX, "%s/%s", temp_name, base); DEBUG(10, ("recycle.bin: recycled file name%s\n", temp_name)); /* new filename with path */ /* check if we should delete file from recycle bin */ @@ -647,7 +641,6 @@ static int recycle_unlink(connection_struct *conn, const char *inname) recycle_touch(conn, final_name); done: - SAFE_FREE(file_name); SAFE_FREE(path_name); SAFE_FREE(temp_name); SAFE_FREE(final_name); -- cgit From 9c6d78c54c7f420903767f17659e9ce8d7002dbf Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 09:46:01 +0000 Subject: If it's a pstring, use pstrcpy(). (This used to be commit 34fb5f0b1a6281b3aa7782edb3fcb82cc4ec4877) --- source3/msdfs/msdfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/msdfs/msdfs.c b/source3/msdfs/msdfs.c index 4df3145009..bf3b3cc213 100644 --- a/source3/msdfs/msdfs.c +++ b/source3/msdfs/msdfs.c @@ -266,7 +266,7 @@ static BOOL resolve_dfs_path(char* dfspath, struct dfs_path* dp, if (consumedcntp) { char *q; pstring buf; - safe_strcpy(buf, dfspath, sizeof(buf)); + pstrcpy(buf, dfspath); trim_string(buf, NULL, "\\"); q = strrchr(buf, '\\'); if (q) @@ -633,7 +633,7 @@ int setup_dfs_referral(char* pathname, int max_referral_level, char** ppdata) && pathnamep[1] == '\\') pathnamep++; - safe_strcpy(buf, pathnamep, sizeof(buf)); + pstrcpy(buf, pathnamep); if (!get_referred_path(buf, &junction, &consumedcnt, &self_referral)) return -1; -- cgit From 2f0c70efb2c4b5b01eb073f5d5217108b4ca438f Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 10:35:24 +0000 Subject: setenv takes 3 arguments... (This used to be commit 6d18f64ef518cbb3d522cf1f92dc5cbc2e2cb642) --- source3/smbwrapper/smbsh.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/smbwrapper/smbsh.c b/source3/smbwrapper/smbsh.c index d853aa1afc..845d1d5606 100644 --- a/source3/smbwrapper/smbsh.c +++ b/source3/smbwrapper/smbsh.c @@ -92,7 +92,7 @@ int main(int argc, char *argv[]) smbw_setshared("PASSWORD", p); } - setenv("PS1", "smbsh$ "); + setenv("PS1", "smbsh$ ", 1); sys_getwd(wd); @@ -107,12 +107,12 @@ int main(int argc, char *argv[]) if (file_exist(line, NULL)) { slprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so:DEFAULT", libd); - setenv("_RLD_LIST", line); + setenv("_RLD_LIST", line, 1); slprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd); - setenv("_RLDN32_LIST", line); + setenv("_RLDN32_LIST", line, 1); } else { slprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd); - setenv("_RLD_LIST", line); + setenv("_RLD_LIST", line, 1); } { -- cgit From eb64538dba772a9846c05e2712839dbaa12c39a1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 11:09:21 +0000 Subject: Patch from Luke Howard to add mutual kerberos authentication, and SMB session keys for kerberos authentication. Andrew Bartlett (This used to be commit 8b798f03dbbdd670ff9af4eb46f7b0845c611e0f) --- source3/configure.in | 16 ++++++++++++ source3/include/ads.h | 5 ++++ source3/include/asn_1.h | 7 +++++ source3/libads/kerberos_verify.c | 32 ++++++++++++++++++----- source3/libsmb/cliconnect.c | 2 +- source3/libsmb/clikrb5.c | 56 +++++++++++++++++++++++++++++++++------- source3/libsmb/clispnego.c | 29 +++++++++++---------- source3/smbd/sesssetup.c | 52 +++++++++++++++++++++++++++---------- 8 files changed, 157 insertions(+), 42 deletions(-) diff --git a/source3/configure.in b/source3/configure.in index 66bdf5edf1..e3b5f2fe15 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -2250,6 +2250,22 @@ if test x"$samba_cv_HAVE_KRB5_TKT_ENC_PART2" = x"yes"; then AC_DEFINE(HAVE_KRB5_TKT_ENC_PART2,1,[Whether the krb5_ticket struct has a enc_part2 property]) fi +AC_CACHE_CHECK([for keyvalue in krb5_keyblock],samba_cv_HAVE_KRB5_KEYBLOCK_KEYVALUE,[ +AC_TRY_COMPILE([#include ], +[krb5_keyblock key; key.keyvalue.data = NULL;], +samba_cv_HAVE_KRB5_KEYBLOCK_KEYVALUE=yes,samba_cv_HAVE_KRB5_KEYBLOCK_KEYVALUE=no)]) +if test x"$samba_cv_HAVE_KRB5_KEYBLOCK_KEYVALUE" = x"yes"; then + AC_DEFINE(HAVE_KRB5_KEYBLOCK_KEYVALUE,1,[Whether the krb5_keyblock struct has a keyvalue property]) +fi + +AC_CACHE_CHECK([for ENCTYPE_ARCFOUR_HMAC_MD5],samba_cv_HAVE_ENCTYPE_ARCFOUR_HMAC_MD5,[ +AC_TRY_COMPILE([#include ], +[krb5_enctype enctype; enctype = ENCTYPE_ARCFOUR_HMAC_MD5;], +samba_cv_HAVE_ENCTYPE_ARCFOUR_HMAC_MD5=yes,samba_cv_HAVE_ENCTYPE_ARCFOUR_HMAC_MD5=no)]) +if test x"$samba_cv_HAVE_ENCTYPE_ARCFOUR_HMAC_MD5" = x"yes"; then + AC_DEFINE(HAVE_ENCTYPE_ARCFOUR_HMAC_MD5,1,[Whether the ENCTYPE_ARCFOUR_HMAC_MD5 key type is available]) +fi + ######################################################## # now see if we can find the krb5 libs in standard paths # or as specified above diff --git a/source3/include/ads.h b/source3/include/ads.h index 304a997b2c..f90983e405 100644 --- a/source3/include/ads.h +++ b/source3/include/ads.h @@ -208,3 +208,8 @@ typedef void **ADS_MODLIST; /* Kerberos environment variable names */ #define KRB5_ENV_CCNAME "KRB5CCNAME" + +/* Heimdal uses a slightly different name */ +#if defined(HAVE_ENCTYPE_ARCFOUR_HMAC_MD5) +#define ENCTYPE_ARCFOUR_HMAC ENCTYPE_ARCFOUR_HMAC_MD5 +#endif diff --git a/source3/include/asn_1.h b/source3/include/asn_1.h index ab7fa5d398..7d4da0db0c 100644 --- a/source3/include/asn_1.h +++ b/source3/include/asn_1.h @@ -59,4 +59,11 @@ typedef struct { #define SPNEGO_NEG_RESULT_INCOMPLETE 1 #define SPNEGO_NEG_RESULT_REJECT 2 +/* not really ASN.1, but RFC 1964 */ +#define TOK_ID_KRB_AP_REQ "\x01\x00" +#define TOK_ID_KRB_AP_REP "\x02\x00" +#define TOK_ID_KRB_ERROR "\x03\x00" +#define TOK_ID_GSS_GETMIC "\x01\x01" +#define TOK_ID_GSS_WRAP "\x02\x01" + #endif /* _ASN_1_H */ diff --git a/source3/libads/kerberos_verify.c b/source3/libads/kerberos_verify.c index 17fecf60c8..4d9a1bf765 100644 --- a/source3/libads/kerberos_verify.c +++ b/source3/libads/kerberos_verify.c @@ -3,7 +3,7 @@ kerberos utility library Copyright (C) Andrew Tridgell 2001 Copyright (C) Remus Koos 2001 - + Copyright (C) Luke Howard 2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,7 +29,9 @@ authorization_data if available */ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, - char **principal, DATA_BLOB *auth_data) + char **principal, DATA_BLOB *auth_data, + DATA_BLOB *ap_rep, + uint8 session_key[16]) { krb5_context context; krb5_auth_context auth_context = NULL; @@ -122,10 +124,24 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, if (!auth_ok) { DEBUG(3,("krb5_rd_req with auth failed (%s)\n", error_message(ret))); - SAFE_FREE(key); return NT_STATUS_LOGON_FAILURE; } + ret = krb5_mk_rep(context, auth_context, &packet); + if (ret) { + DEBUG(3,("Failed to generate mutual authentication reply (%s)\n", + error_message(ret))); + krb5_auth_con_free(context, auth_context); + return NT_STATUS_LOGON_FAILURE; + } + + *ap_rep = data_blob(packet.data, packet.length); + free(packet.data); + + krb5_get_smb_session_key(context, auth_context, session_key); + DEBUG(0,("SMB session key (from ticket) follows:\n")); + dump_data(0, session_key, 16); + #if 0 file_save("/tmp/ticket.dat", ticket->data, ticket->length); #endif @@ -134,20 +150,24 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket, #if 0 if (tkt->enc_part2) { - file_save("/tmp/authdata.dat", + file_save("/tmp/authdata.dat", tkt->enc_part2->authorization_data[0]->contents, tkt->enc_part2->authorization_data[0]->length); - } #endif if ((ret = krb5_unparse_name(context, get_principal_from_tkt(tkt), principal))) { DEBUG(3,("krb5_unparse_name failed (%s)\n", error_message(ret))); + data_blob_free(auth_data); + data_blob_free(ap_rep); + krb5_auth_con_free(context, auth_context); return NT_STATUS_LOGON_FAILURE; } + krb5_auth_con_free(context, auth_context); + return NT_STATUS_OK; } -#endif +#endif /* HAVE_KRB5 */ diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 901daf4b09..4962ffa3c9 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -2,7 +2,7 @@ Unix SMB/CIFS implementation. client connect/disconnect routines Copyright (C) Andrew Tridgell 1994-1998 - Copyright (C) Andrew Barteltt 2001-2003 + Copyright (C) Andrew Bartlett 2001-2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index bef6998a49..47dec1f171 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -2,7 +2,7 @@ Unix SMB/CIFS implementation. simple kerberos5 routines for active directory Copyright (C) Andrew Tridgell 2001 - Copyright (C) Luke Howard 2002 + Copyright (C) Luke Howard 2002-2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,16 @@ #ifdef HAVE_KRB5 +#ifdef HAVE_KRB5_KEYBLOCK_KEYVALUE +#define KRB5_KEY_TYPE(k) ((k)->keytype) +#define KRB5_KEY_LENGTH(k) ((k)->keyvalue.length) +#define KRB5_KEY_DATA(k) ((k)->keyvalue.data) +#else +#define KRB5_KEY_TYPE(k) ((k)->enctype) +#define KRB5_KEY_LENGTH(k) ((k)->length) +#define KRB5_KEY_DATA(k) ((k)->contents) +#endif /* HAVE_KRB5_KEYBLOCK_KEYVALUE */ + #ifndef HAVE_KRB5_SET_REAL_TIME /* * This function is not in the Heimdal mainline. @@ -124,7 +134,7 @@ krb5_error_code get_kerberos_allowed_etypes(krb5_context context, return krb5_get_default_in_tkt_etypes(context, enctypes); } #else - __ERROR_XX_UNKNOWN_GET_ENCTYPES_FUNCTIONS +#error UNKNOWN_GET_ENCTYPES_FUNCTIONS #endif void free_kerberos_etypes(krb5_context context, @@ -305,12 +315,12 @@ DATA_BLOB krb5_get_ticket(const char *principal, time_t time_offset) DATA_BLOB ret; krb5_enctype enc_types[] = { #ifdef ENCTYPE_ARCFOUR_HMAC - ENCTYPE_ARCFOUR_HMAC, -#endif - ENCTYPE_DES_CBC_MD5, - ENCTYPE_DES_CBC_CRC, - ENCTYPE_NULL}; - + ENCTYPE_ARCFOUR_HMAC, +#endif + ENCTYPE_DES_CBC_MD5, + ENCTYPE_DES_CBC_CRC, + ENCTYPE_NULL}; + retval = krb5_init_context(&context); if (retval) { DEBUG(1,("krb5_init_context failed (%s)\n", @@ -355,11 +365,39 @@ failed: return data_blob(NULL, 0); } +BOOL krb5_get_smb_session_key(krb5_context context, krb5_auth_context auth_context, uint8 session_key[16]) + { + krb5_keyblock *skey; + BOOL ret = False; + + memset(session_key, 0, 16); + +#ifdef ENCTYPE_ARCFOUR_HMAC + if (krb5_auth_con_getremotesubkey(context, auth_context, &skey) == 0 && skey != NULL) { + if (KRB5_KEY_TYPE(skey) == + ENCTYPE_ARCFOUR_HMAC + && KRB5_KEY_LENGTH(skey) == 16) { + memcpy(session_key, KRB5_KEY_DATA(skey), KRB5_KEY_LENGTH(skey)); + ret = True; + } + krb5_free_keyblock(context, skey); + } +#endif /* ENCTYPE_ARCFOUR_HMAC */ + + return ret; + } #else /* HAVE_KRB5 */ /* this saves a few linking headaches */ - DATA_BLOB krb5_get_ticket(const char *principal, time_t time_offset) +DATA_BLOB krb5_get_ticket(const char *principal, time_t time_offset) { DEBUG(0,("NO KERBEROS SUPPORT\n")); return data_blob(NULL, 0); } + +BOOL krb5_get_smb_session_key(krb5_context context, krb5_auth_context ac, uint8 session_key[16]) + { + DEBUG(0,("NO KERBEROS SUPPORT\n")); + memset(session_key, 0, 16); + return False; + } #endif diff --git a/source3/libsmb/clispnego.c b/source3/libsmb/clispnego.c index e93f1855dd..dfa8f80146 100644 --- a/source3/libsmb/clispnego.c +++ b/source3/libsmb/clispnego.c @@ -3,6 +3,7 @@ simple kerberos5/SPNEGO routines Copyright (C) Andrew Tridgell 2001 Copyright (C) Jim McDonough 2002 + Copyright (C) Luke Howard 2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -259,7 +260,7 @@ BOOL parse_negTokenTarg(DATA_BLOB blob, char *OIDs[ASN1_MAX_OIDS], DATA_BLOB *se /* generate a krb5 GSS-API wrapper packet given a ticket */ -DATA_BLOB spnego_gen_krb5_wrap(DATA_BLOB ticket) +DATA_BLOB spnego_gen_krb5_wrap(DATA_BLOB ticket, uint8 tok_id[2]) { ASN1_DATA data; DATA_BLOB ret; @@ -268,7 +269,8 @@ DATA_BLOB spnego_gen_krb5_wrap(DATA_BLOB ticket) asn1_push_tag(&data, ASN1_APPLICATION(0)); asn1_write_OID(&data, OID_KERBEROS5); - asn1_write_BOOLEAN(&data, 0); + + asn1_write(&data, tok_id, 2); asn1_write(&data, ticket.data, ticket.length); asn1_pop_tag(&data); @@ -286,7 +288,7 @@ DATA_BLOB spnego_gen_krb5_wrap(DATA_BLOB ticket) /* parse a krb5 GSS-API wrapper packet giving a ticket */ -BOOL spnego_parse_krb5_wrap(DATA_BLOB blob, DATA_BLOB *ticket) +BOOL spnego_parse_krb5_wrap(DATA_BLOB blob, DATA_BLOB *ticket, uint8 tok_id[2]) { BOOL ret; ASN1_DATA data; @@ -295,15 +297,15 @@ BOOL spnego_parse_krb5_wrap(DATA_BLOB blob, DATA_BLOB *ticket) asn1_load(&data, blob); asn1_start_tag(&data, ASN1_APPLICATION(0)); asn1_check_OID(&data, OID_KERBEROS5); - asn1_check_BOOLEAN(&data, 0); data_remaining = asn1_tag_remaining(&data); - if (data_remaining < 1) { + if (data_remaining < 3) { data.has_error = True; } else { - - *ticket = data_blob(data.data, data_remaining); + asn1_read(&data, tok_id, 2); + data_remaining -= 2; + *ticket = data_blob(NULL, data_remaining); asn1_read(&data, ticket->data, ticket->length); } @@ -330,7 +332,7 @@ DATA_BLOB spnego_gen_negTokenTarg(const char *principal, int time_offset) tkt = krb5_get_ticket(principal, time_offset); /* wrap that up in a nice GSS-API wrapping */ - tkt_wrapped = spnego_gen_krb5_wrap(tkt); + tkt_wrapped = spnego_gen_krb5_wrap(tkt, TOK_ID_KRB_AP_REQ); /* and wrap that in a shiny SPNEGO wrapper */ targ = gen_negTokenTarg(krb_mechs, tkt_wrapped); @@ -438,9 +440,10 @@ BOOL spnego_parse_auth(DATA_BLOB blob, DATA_BLOB *auth) } /* - generate a minimal SPNEGO NTLMSSP response packet. Doesn't contain much. + generate a minimal SPNEGO response packet. Doesn't contain much. */ -DATA_BLOB spnego_gen_auth_response(DATA_BLOB *ntlmssp_reply, NTSTATUS nt_status) +DATA_BLOB spnego_gen_auth_response(DATA_BLOB *reply, NTSTATUS nt_status, + const char *mechOID) { ASN1_DATA data; DATA_BLOB ret; @@ -462,13 +465,13 @@ DATA_BLOB spnego_gen_auth_response(DATA_BLOB *ntlmssp_reply, NTSTATUS nt_status) asn1_write_enumerated(&data, negResult); asn1_pop_tag(&data); - if (negResult == SPNEGO_NEG_RESULT_INCOMPLETE) { + if (reply->data != NULL) { asn1_push_tag(&data,ASN1_CONTEXT(1)); - asn1_write_OID(&data, OID_NTLMSSP); + asn1_write_OID(&data, mechOID); asn1_pop_tag(&data); asn1_push_tag(&data,ASN1_CONTEXT(2)); - asn1_write_OctetString(&data, ntlmssp_reply->data, ntlmssp_reply->length); + asn1_write_OctetString(&data, reply->data, reply->length); asn1_pop_tag(&data); } diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index eafe805aba..7e5ec56a27 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -4,6 +4,7 @@ Copyright (C) Andrew Tridgell 1998-2001 Copyright (C) Andrew Bartlett 2001 Copyright (C) Jim McDonough 2002 + Copyright (C) Luke Howard 2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -146,11 +147,14 @@ static int reply_spnego_kerberos(connection_struct *conn, int sess_vuid; NTSTATUS ret; DATA_BLOB auth_data; + DATA_BLOB ap_rep, ap_rep_wrapped, response; auth_serversupplied_info *server_info = NULL; ADS_STRUCT *ads; + uint8 session_key[16]; + uint8 tok_id[2]; BOOL foreign = False; - if (!spnego_parse_krb5_wrap(*secblob, &ticket)) { + if (!spnego_parse_krb5_wrap(*secblob, &ticket, tok_id)) { return ERROR_NT(NT_STATUS_LOGON_FAILURE); } @@ -162,7 +166,7 @@ static int reply_spnego_kerberos(connection_struct *conn, ads->auth.realm = strdup(lp_realm()); - ret = ads_verify_ticket(ads, &ticket, &client, &auth_data); + ret = ads_verify_ticket(ads, &ticket, &client, &auth_data, &ap_rep, session_key); if (!NT_STATUS_IS_OK(ret)) { DEBUG(1,("Failed to verify incoming ticket!\n")); ads_destroy(&ads); @@ -177,6 +181,7 @@ static int reply_spnego_kerberos(connection_struct *conn, if (!p) { DEBUG(3,("Doesn't look like a valid principal\n")); ads_destroy(&ads); + data_blob_free(&ap_rep); return ERROR_NT(NT_STATUS_LOGON_FAILURE); } @@ -184,6 +189,7 @@ static int reply_spnego_kerberos(connection_struct *conn, if (strcasecmp(p+1, ads->auth.realm) != 0) { DEBUG(3,("Ticket for foreign realm %s@%s\n", client, p+1)); if (!lp_allow_trusted_domains()) { + data_blob_free(&ap_rep); return ERROR_NT(NT_STATUS_LOGON_FAILURE); } foreign = True; @@ -209,31 +215,51 @@ static int reply_spnego_kerberos(connection_struct *conn, if (!pw) { DEBUG(1,("Username %s is invalid on this system\n",user)); + data_blob_free(&ap_rep); return ERROR_NT(NT_STATUS_NO_SUCH_USER); } if (!NT_STATUS_IS_OK(ret = make_server_info_pw(&server_info,pw))) { DEBUG(1,("make_server_info_from_pw failed!\n")); + data_blob_free(&ap_rep); return ERROR_NT(ret); } - + + /* Copy out the session key from the AP_REQ. */ + memcpy(server_info->session_key, session_key, sizeof(session_key)); + /* register_vuid keeps the server info */ sess_vuid = register_vuid(server_info, user); free(user); if (sess_vuid == -1) { - return ERROR_NT(NT_STATUS_LOGON_FAILURE); + ret = NT_STATUS_LOGON_FAILURE; + } else { + set_message(outbuf,4,0,True); + SSVAL(outbuf, smb_vwv3, 0); + + if (server_info->guest) { + SSVAL(outbuf,smb_vwv2,1); + } + + SSVAL(outbuf, smb_uid, sess_vuid); } - set_message(outbuf,4,0,True); - SSVAL(outbuf, smb_vwv3, 0); - add_signature(outbuf); - - SSVAL(outbuf,smb_uid,sess_vuid); - SSVAL(inbuf,smb_uid,sess_vuid); - - return chain_reply(inbuf,outbuf,length,bufsize); + /* wrap that up in a nice GSS-API wrapping */ + if (NT_STATUS_IS_OK(ret)) { + ap_rep_wrapped = spnego_gen_krb5_wrap(ap_rep, TOK_ID_KRB_AP_REP); + } else { + ap_rep_wrapped = data_blob(NULL, 0); + } + response = spnego_gen_auth_response(&ap_rep_wrapped, ret, OID_KERBEROS5_OLD); + reply_sesssetup_blob(conn, outbuf, response, ret); + + data_blob_free(&ap_rep); + data_blob_free(&ap_rep_wrapped); + data_blob_free(&response); + + return -1; /* already replied */ } #endif @@ -280,7 +306,7 @@ static BOOL reply_spnego_ntlmssp(connection_struct *conn, char *outbuf, } } - response = spnego_gen_auth_response(ntlmssp_blob, nt_status); + response = spnego_gen_auth_response(ntlmssp_blob, nt_status, OID_NTLMSSP); ret = reply_sesssetup_blob(conn, outbuf, response, nt_status); data_blob_free(&response); -- cgit From 0e6dbeb2737700ece2a4502a6edf094f4f26894c Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 11:16:27 +0000 Subject: typo (This used to be commit a47dee787413daaf0b550a47bbd78125490c356e) --- source3/smbwrapper/smbsh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/smbwrapper/smbsh.c b/source3/smbwrapper/smbsh.c index 845d1d5606..2cbdc76de1 100644 --- a/source3/smbwrapper/smbsh.c +++ b/source3/smbwrapper/smbsh.c @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) smbw_setshared(line, wd); slprintf(line,sizeof(line)-1,"%s/smbwrapper.so", libd); - etenv("LD_PRELOAD", line); + setenv("LD_PRELOAD", line); slprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so", libd); -- cgit From 426cd68f74bb0490df54da500d3d9c1ea475e16f Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 11:23:15 +0000 Subject: Move off-by-one buggy malloc()/safe_strcpy() combination to strdup() instead. Andrew Bartlett (This used to be commit c26881633d8a7f6d9b9ed9c6a97ce2b45bf2b317) --- source3/lib/util_getent.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source3/lib/util_getent.c b/source3/lib/util_getent.c index 7d45287bba..32641dbf83 100644 --- a/source3/lib/util_getent.c +++ b/source3/lib/util_getent.c @@ -224,18 +224,16 @@ static struct sys_userlist *add_members_to_userlist(struct sys_userlist *list_he for (i = 0; i < num_users; i++) { struct sys_userlist *entry = (struct sys_userlist *)malloc(sizeof(*entry)); - size_t len = strlen(grp->gr_mem[i])+1; if (entry == NULL) { free_userlist(list_head); return NULL; } - entry->unix_name = (char *)malloc(len); + entry->unix_name = (char *)strdup(grp->gr_mem[i]); if (entry->unix_name == NULL) { SAFE_FREE(entry); free_userlist(list_head); return NULL; } - safe_strcpy(entry->unix_name, grp->gr_mem[i],len); DLIST_ADD(list_head, entry); } return list_head; -- cgit From 05262ea49a3d428e015ef71c975231b108847b72 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 11:24:27 +0000 Subject: Finish removing setenv replacements from smbwrapper. (This used to be commit 059ac2d839bf258408490f5ceb786a47cb5acb58) --- source3/smbwrapper/shared.c | 20 +------------------- source3/smbwrapper/smbsh.c | 2 +- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/source3/smbwrapper/shared.c b/source3/smbwrapper/shared.c index 00dd30b70e..b4cfcf7148 100644 --- a/source3/smbwrapper/shared.c +++ b/source3/smbwrapper/shared.c @@ -52,7 +52,7 @@ void smbw_setup_shared(void) slprintf(s,sizeof(s)-1,"%d", shared_fd); - smbw_setenv("SMBW_HANDLE", s); + setenv("SMBW_HANDLE", s, 1); return; @@ -194,24 +194,6 @@ void smbw_setshared(const char *name, const char *val) } -/***************************************************************** -set an env variable - some systems don't have this -*****************************************************************/ -int smbw_setenv(const char *name, const char *value) -{ - pstring s; - char *p; - int ret = -1; - - slprintf(s,sizeof(s)-1,"%s=%s", name, value); - - p = strdup(s); - - if (p) ret = putenv(p); - - return ret; -} - /***************************************************************** return true if the passed fd is the SMBW_HANDLE *****************************************************************/ diff --git a/source3/smbwrapper/smbsh.c b/source3/smbwrapper/smbsh.c index 2cbdc76de1..221c6d87c2 100644 --- a/source3/smbwrapper/smbsh.c +++ b/source3/smbwrapper/smbsh.c @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) smbw_setshared(line, wd); slprintf(line,sizeof(line)-1,"%s/smbwrapper.so", libd); - setenv("LD_PRELOAD", line); + setenv("LD_PRELOAD", line, 1); slprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so", libd); -- cgit From 79aaa35ea5e8c74ff7755ec650aca88cc7e4cf7e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 21:07:03 +0000 Subject: Clean up non-krb5 breakages from my modifications to luke howard's patch. Andrew Bartlett (This used to be commit 32fd0c49009e38022523cc5c14567dd55de08206) --- source3/include/includes.h | 1 + source3/libsmb/clikrb5.c | 8 +------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/source3/include/includes.h b/source3/include/includes.h index 5b4c5a695f..fab02141cb 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -1239,6 +1239,7 @@ krb5_const_principal get_principal_from_tkt(krb5_ticket *tkt); krb5_error_code krb5_locate_kdc(krb5_context ctx, const krb5_data *realm, struct sockaddr **addr_pp, int *naddrs, int get_masters); krb5_error_code get_kerberos_allowed_etypes(krb5_context context, krb5_enctype **enctypes); void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes); +BOOL krb5_get_smb_session_key(krb5_context context, krb5_auth_context auth_context, uint8 session_key[16]); #endif /* HAVE_KRB5 */ #endif /* _INCLUDES_H */ diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index 47dec1f171..6b0c7ddaf2 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -365,7 +365,7 @@ failed: return data_blob(NULL, 0); } -BOOL krb5_get_smb_session_key(krb5_context context, krb5_auth_context auth_context, uint8 session_key[16]) + BOOL krb5_get_smb_session_key(krb5_context context, krb5_auth_context auth_context, uint8 session_key[16]) { krb5_keyblock *skey; BOOL ret = False; @@ -394,10 +394,4 @@ DATA_BLOB krb5_get_ticket(const char *principal, time_t time_offset) return data_blob(NULL, 0); } -BOOL krb5_get_smb_session_key(krb5_context context, krb5_auth_context ac, uint8 session_key[16]) - { - DEBUG(0,("NO KERBEROS SUPPORT\n")); - memset(session_key, 0, 16); - return False; - } #endif -- cgit From c5871a1893ccaf81116defcdc20d644502e2f98c Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 24 Feb 2003 22:25:19 +0000 Subject: Whenever we have a password, use the in-memory ccache. This fixes a bug where we were overwriting the user's ccache with the machine password (the -P option). Andrew Bartlett (This used to be commit 231d2f84ef36b30be98baf3b56ebf4a5cd8dad11) --- source3/utils/net_ads.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c index 75bb29f213..bb87879044 100644 --- a/source3/utils/net_ads.c +++ b/source3/utils/net_ads.c @@ -131,7 +131,6 @@ static ADS_STRUCT *ads_startup(void) if (opt_user_specified) { need_password = True; - use_in_memory_ccache(); } retry: @@ -142,8 +141,10 @@ retry: free(prompt); } - if (opt_password) + if (opt_password) { + use_in_memory_ccache(); ads->auth.password = strdup(opt_password); + } ads->auth.user_name = strdup(opt_user_name); -- cgit From f803c3237635880694d668d9ce3c29b46c311d43 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 25 Feb 2003 02:20:46 +0000 Subject: Fix a really nasty bug where some users in AD domains (particularly child domains) would not have the tokenGroups or memberOf attributes filled in. This would cause a user to have no supplementary group membership. Detect this by the fact that the primaryGid must be present in the tokenGroups, and if it isn't (ie, if there is no tokenGroups at all), do a server-side search on all groups using the 'member' attribute and the user's DN. Andrew Bartlett (This used to be commit a074f74e627e1d947a76bcf3a39e3c5df4d4ffe5) --- source3/nsswitch/winbindd_ads.c | 104 ++++++++++++++++++++++++++++++++++------ 1 file changed, 90 insertions(+), 14 deletions(-) diff --git a/source3/nsswitch/winbindd_ads.c b/source3/nsswitch/winbindd_ads.c index 9fd391870b..93c9babd5e 100644 --- a/source3/nsswitch/winbindd_ads.c +++ b/source3/nsswitch/winbindd_ads.c @@ -455,8 +455,10 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, ADS_STRUCT *ads = NULL; const char *attrs[] = {"distinguishedName", NULL}; const char *attrs2[] = {"tokenGroups", "primaryGroupID", NULL}; + const char *group_attrs[] = {"objectSid", "cn", NULL}; ADS_STATUS rc; int count; + void *res = NULL; void *msg = NULL; char *exp; char *user_dn; @@ -467,22 +469,30 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, char *sidstr; NTSTATUS status = NT_STATUS_UNSUCCESSFUL; - *num_groups = 0; - DEBUG(3,("ads: lookup_usergroups\n")); - - (*num_groups) = 0; + *num_groups = 0; sid_from_rid(domain, user_rid, &sid); ads = ads_cached_connection(domain); if (!ads) goto done; - sidstr = sid_binstring(&sid); - asprintf(&exp, "(objectSid=%s)", sidstr); + if (!(sidstr = sid_binstring(&sid))) { + DEBUG(1,("lookup_usergroups(rid=%d) sid_binstring returned NULL\n", user_rid)); + status = NT_STATUS_NO_MEMORY; + goto done; + } + if (asprintf(&exp, "(objectSid=%s)", sidstr) == -1) { + free(sidstr); + DEBUG(1,("lookup_usergroups(rid=%d) asprintf failed!\n", user_rid)); + status = NT_STATUS_NO_MEMORY; + goto done; + } + rc = ads_search_retry(ads, &msg, exp, attrs); free(exp); free(sidstr); + if (!ADS_ERR_OK(rc)) { DEBUG(1,("lookup_usergroups(rid=%d) ads_search: %s\n", user_rid, ads_errstr(rc))); goto done; @@ -507,20 +517,86 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, goto done; } - count = ads_pull_sids(ads, mem_ctx, msg, "tokenGroups", &sids) + 1; - (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * count); - (*user_gids)[(*num_groups)++] = primary_group; + count = ads_pull_sids(ads, mem_ctx, msg, "tokenGroups", &sids); - for (i=1;isid, &sids[i-1], &rid)) continue; - (*user_gids)[*num_groups] = rid; - (*num_groups)++; + if (msg) ads_msgfree(ads, msg); + + /* there must always be at least one group in the token, + unless we are talking to a buggy Win2k server */ + if (count == 0) { + /* buggy server, no tokenGroups. Instead lookup what groups this user + is a member of by DN search on member*/ + if (asprintf(&exp, "(&(member=%s)(objectClass=group))", user_dn) == -1) { + free(sidstr); + DEBUG(1,("lookup_usergroups(rid=%d) asprintf failed!\n", user_rid)); + status = NT_STATUS_NO_MEMORY; + goto done; + } + + rc = ads_search_retry(ads, &res, exp, group_attrs); + free(exp); + + if (!ADS_ERR_OK(rc)) { + DEBUG(1,("lookup_usergroups(rid=%d) ads_search member=%s: %s\n", user_rid, user_dn, ads_errstr(rc))); + goto done; + } + + count = ads_count_replies(ads, res); + if (count == 0) { + DEBUG(5,("lookup_usergroups: No supp groups found\n")); + goto done; + } + + (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); + (*user_gids)[0] = primary_group; + + *num_groups = 1; + + for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) { + uint32 rid; + DOM_SID group_sid; + fstring sid_string; + const char *cn; + + cn = ads_pull_string(ads, mem_ctx, msg, "cn"); + if (!cn) { + cn = ""; + } + + if (!ads_pull_sid(ads, msg, "objectSid", &group_sid)) { + DEBUG(1,("No sid for %s !?\n", cn)); + continue; + } + + if (!sid_peek_check_rid(&domain->sid, &group_sid, &rid)) { + DEBUG(5,("sid for %s is out of domain or invalid\n", sid_to_string(sid_string, &sid))); + continue; + } + if (rid == primary_group) continue; + + (*user_gids)[*num_groups] = rid; + (*num_groups)++; + + } + } else { + (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); + (*user_gids)[0] = primary_group; + + *num_groups = 1; + + for (i=0;isid, &sids[i-1], &rid)) continue; + if (rid == primary_group) continue; + (*user_gids)[*num_groups] = rid; + (*num_groups)++; + } } status = NT_STATUS_OK; DEBUG(3,("ads lookup_usergroups for rid=%d\n", user_rid)); done: + if (res) ads_msgfree(ads, res); if (msg) ads_msgfree(ads, msg); return status; -- cgit From d116f2c884ce66f69df2973faf34f20a1a7ec988 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 25 Feb 2003 02:23:19 +0000 Subject: tokenGroups are SIDs, so dump them as such. (This used to be commit 43f07e9de70ad9993265e28a54239caba0121ab6) --- source3/libads/ldap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index 29f44672f4..67827d27f3 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -1215,6 +1215,7 @@ static BOOL ads_dump_field(char *field, void **values, void *data_area) {"nTSecurityDescriptor", False, dump_sd}, {"dnsRecord", False, dump_binary}, {"objectSid", False, dump_sid}, + {"tokenGroups", False, dump_sid}, {NULL, True, NULL} }; int i; -- cgit From bf095b837272cf2a17c7ffeb94a96f304922a6bf Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 25 Feb 2003 03:30:39 +0000 Subject: For some reason some attributes in ADS do not appear (and are not available) in general searches, but only if searching for the DN only. In my case, it was the tokenGroups attribute that caused me trouble, hence this patch. Andrew Bartlett (This used to be commit 8a0cc4c2beb5d6ad7e44bf47bf0f9ec4a3ffdb96) --- source3/utils/net_ads.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c index bb87879044..8cd3bac802 100644 --- a/source3/utils/net_ads.c +++ b/source3/utils/net_ads.c @@ -53,6 +53,8 @@ int net_ads_usage(int argc, const char **argv) "\n\t lookup, add, or remove directory entry for a printer\n"\ "\nnet ads search"\ "\n\tperform a raw LDAP search and dump the results\n" +"\nnet ads dn"\ +"\n\tperform a raw LDAP search and dump attributes of a particular DN\n" ); return -1; } @@ -1003,7 +1005,7 @@ static int net_ads_search(int argc, const char **argv) exp = argv[0]; attrs = (argv + 1); - rc = ads_do_search_all(ads, ads->config.bind_path, + rc = ads_do_search_all(ads, ads->config.bind_path, LDAP_SCOPE_SUBTREE, exp, attrs, &res); if (!ADS_ERR_OK(rc)) { @@ -1023,6 +1025,65 @@ static int net_ads_search(int argc, const char **argv) } +/* + help for net ads search +*/ +static int net_ads_dn_usage(int argc, const char **argv) +{ + d_printf( + "\nnet ads dn \n"\ + "\nperform a raw LDAP search on a ADS server and dump the results\n"\ + "The DN standard LDAP DN, and the attributes are a list of LDAP fields \n"\ + "to show in the results\n\n"\ + "Example: net ads dn 'CN=administrator,CN=Users,DC=my,DC=domain' sAMAccountName\n\n" + ); + net_common_flags_usage(argc, argv); + return -1; +} + + +/* + general ADS search function. Useful in diagnosing problems in ADS +*/ +static int net_ads_dn(int argc, const char **argv) +{ + ADS_STRUCT *ads; + ADS_STATUS rc; + const char *dn; + const char **attrs; + void *res = NULL; + + if (argc < 1) { + return net_ads_dn_usage(argc, argv); + } + + if (!(ads = ads_startup())) { + return -1; + } + + dn = argv[0]; + attrs = (argv + 1); + + rc = ads_do_search_all(ads, dn, + LDAP_SCOPE_BASE, + "(objectclass=*)", attrs, &res); + if (!ADS_ERR_OK(rc)) { + d_printf("search failed: %s\n", ads_errstr(rc)); + return -1; + } + + d_printf("Got %d replies\n\n", ads_count_replies(ads, res)); + + /* dump the results */ + ads_dump(ads, res); + + ads_msgfree(ads, res); + ads_destroy(&ads); + + return 0; +} + + int net_ads_help(int argc, const char **argv) { struct functable func[] = { @@ -1058,6 +1119,7 @@ int net_ads(int argc, const char **argv) {"CHOSTPASS", net_ads_change_localhost_pass}, {"PRINTER", net_ads_printer}, {"SEARCH", net_ads_search}, + {"DN", net_ads_dn}, {"WORKGROUP", net_ads_workgroup}, {"LOOKUP", net_ads_lookup}, {"HELP", net_ads_help}, -- cgit From 589371e1d5844be9ea0da4c674635ccc42ab9498 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 25 Feb 2003 05:49:24 +0000 Subject: After some comments from tridge, clean the new usergroups code into a helper function. Andrew Bartlett (This used to be commit 212a52b3d2ca39fcea2990f9293754b08e9b68e4) --- source3/nsswitch/winbindd_ads.c | 165 +++++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 71 deletions(-) diff --git a/source3/nsswitch/winbindd_ads.c b/source3/nsswitch/winbindd_ads.c index 93c9babd5e..22e4648f15 100644 --- a/source3/nsswitch/winbindd_ads.c +++ b/source3/nsswitch/winbindd_ads.c @@ -4,6 +4,7 @@ Winbind ADS backend functions Copyright (C) Andrew Tridgell 2001 + Copyright (C) Andrew Bartlett 2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -445,6 +446,84 @@ done: return status; } +/* Lookup groups a user is a member of - alternate method, for when + tokenGroups are not available. */ +static NTSTATUS lookup_usergroups_alt(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, + const char *user_dn, + uint32 primary_group, + uint32 *num_groups, uint32 **user_gids) +{ + ADS_STATUS rc; + NTSTATUS status = NT_STATUS_UNSUCCESSFUL; + int count; + void *res = NULL; + void *msg = NULL; + char *exp; + ADS_STRUCT *ads; + const char *group_attrs[] = {"objectSid", NULL}; + + ads = ads_cached_connection(domain); + if (!ads) goto done; + + /* buggy server, no tokenGroups. Instead lookup what groups this user + is a member of by DN search on member*/ + if (asprintf(&exp, "(&(member=%s)(objectClass=group))", user_dn) == -1) { + DEBUG(1,("lookup_usergroups(dn=%s) asprintf failed!\n", user_dn)); + return NT_STATUS_NO_MEMORY; + } + + rc = ads_search_retry(ads, &res, exp, group_attrs); + free(exp); + + if (!ADS_ERR_OK(rc)) { + DEBUG(1,("lookup_usergroups ads_search member=%s: %s\n", user_dn, ads_errstr(rc))); + return ads_ntstatus(rc); + } + + count = ads_count_replies(ads, res); + if (count == 0) { + DEBUG(5,("lookup_usergroups: No supp groups found\n")); + + status = ads_ntstatus(rc); + goto done; + } + + (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); + (*user_gids)[0] = primary_group; + + *num_groups = 1; + + for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) { + uint32 rid; + DOM_SID group_sid; + fstring sid_string; + + if (!ads_pull_sid(ads, msg, "objectSid", &group_sid)) { + DEBUG(1,("No sid for this group ?!?\n")); + continue; + } + + if (!sid_peek_check_rid(&domain->sid, &group_sid, &rid)) { + DEBUG(5,("sid for %s is out of domain or invalid\n", sid_to_string(sid_string, &group_sid))); + continue; + } + if (rid == primary_group) continue; + + (*user_gids)[*num_groups] = rid; + (*num_groups)++; + + } + + if (res) ads_msgfree(ads, res); + if (msg) ads_msgfree(ads, msg); + + status = NT_STATUS_OK; + + DEBUG(3,("ads lookup_usergroups (alt) for dn=%s\n", user_dn)); +done: + return status; +} /* Lookup groups a user is a member of. */ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, @@ -455,10 +534,8 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, ADS_STRUCT *ads = NULL; const char *attrs[] = {"distinguishedName", NULL}; const char *attrs2[] = {"tokenGroups", "primaryGroupID", NULL}; - const char *group_attrs[] = {"objectSid", "cn", NULL}; ADS_STATUS rc; int count; - void *res = NULL; void *msg = NULL; char *exp; char *user_dn; @@ -524,81 +601,27 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, /* there must always be at least one group in the token, unless we are talking to a buggy Win2k server */ if (count == 0) { - /* buggy server, no tokenGroups. Instead lookup what groups this user - is a member of by DN search on member*/ - if (asprintf(&exp, "(&(member=%s)(objectClass=group))", user_dn) == -1) { - free(sidstr); - DEBUG(1,("lookup_usergroups(rid=%d) asprintf failed!\n", user_rid)); - status = NT_STATUS_NO_MEMORY; - goto done; - } - - rc = ads_search_retry(ads, &res, exp, group_attrs); - free(exp); - - if (!ADS_ERR_OK(rc)) { - DEBUG(1,("lookup_usergroups(rid=%d) ads_search member=%s: %s\n", user_rid, user_dn, ads_errstr(rc))); - goto done; - } - - count = ads_count_replies(ads, res); - if (count == 0) { - DEBUG(5,("lookup_usergroups: No supp groups found\n")); - goto done; - } - - (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); - (*user_gids)[0] = primary_group; - - *num_groups = 1; - - for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) { - uint32 rid; - DOM_SID group_sid; - fstring sid_string; - const char *cn; - - cn = ads_pull_string(ads, mem_ctx, msg, "cn"); - if (!cn) { - cn = ""; - } - - if (!ads_pull_sid(ads, msg, "objectSid", &group_sid)) { - DEBUG(1,("No sid for %s !?\n", cn)); - continue; - } - - if (!sid_peek_check_rid(&domain->sid, &group_sid, &rid)) { - DEBUG(5,("sid for %s is out of domain or invalid\n", sid_to_string(sid_string, &sid))); - continue; - } - if (rid == primary_group) continue; - - (*user_gids)[*num_groups] = rid; - (*num_groups)++; + return lookup_usergroups_alt(domain, mem_ctx, user_dn, + primary_group, + num_groups, user_gids); + } - } - } else { - (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); - (*user_gids)[0] = primary_group; - - *num_groups = 1; - - for (i=0;isid, &sids[i-1], &rid)) continue; - if (rid == primary_group) continue; - (*user_gids)[*num_groups] = rid; - (*num_groups)++; - } + (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); + (*user_gids)[0] = primary_group; + + *num_groups = 1; + + for (i=0;isid, &sids[i-1], &rid)) continue; + if (rid == primary_group) continue; + (*user_gids)[*num_groups] = rid; + (*num_groups)++; } status = NT_STATUS_OK; DEBUG(3,("ads lookup_usergroups for rid=%d\n", user_rid)); done: - if (res) ads_msgfree(ads, res); - if (msg) ads_msgfree(ads, msg); - return status; } -- cgit From 3a2f56cb630a7566ef0a70052b3102651bf653cc Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 25 Feb 2003 06:24:13 +0000 Subject: Fixed up some const related compiler warnings. (This used to be commit 923425e497112c5d1e2e569da6c13dcd02b6a8af) --- source3/client/client.c | 9 ++++++--- source3/rpcclient/cmd_lsarpc.c | 24 ++++++++++++------------ source3/rpcclient/cmd_samr.c | 38 +++++++++++++++++++------------------- source3/rpcclient/rpcclient.c | 6 +++--- source3/rpcclient/rpcclient.h | 4 ++-- 5 files changed, 42 insertions(+), 39 deletions(-) diff --git a/source3/client/client.c b/source3/client/client.c index 5da12fd984..b95d4d877c 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -51,7 +51,8 @@ static int max_protocol = PROTOCOL_NT1; extern pstring user_socket_options; static int process_tok(fstring tok); -static int cmd_help(void); +static NTSTATUS cmd_help(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, + const char **argv); /* 30 second timeout on most commands */ #define CLIENT_TIMEOUT (30*1000) @@ -979,7 +980,8 @@ static BOOL do_altname(char *name) /**************************************************************************** Exit client. ****************************************************************************/ -static int cmd_quit(void) +static NTSTATUS cmd_quit(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, + const char **argv) { cli_shutdown(cli); exit(0); @@ -2149,7 +2151,8 @@ static int process_tok(fstring tok) /**************************************************************************** help ****************************************************************************/ -static int cmd_help(void) +static NTSTATUS cmd_help(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, + const char **argv) { int i=0,j; fstring buf; diff --git a/source3/rpcclient/cmd_lsarpc.c b/source3/rpcclient/cmd_lsarpc.c index 03df170c09..fab6a89ed5 100644 --- a/source3/rpcclient/cmd_lsarpc.c +++ b/source3/rpcclient/cmd_lsarpc.c @@ -64,7 +64,7 @@ done: static NTSTATUS cmd_lsa_query_info_policy(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -134,7 +134,7 @@ static NTSTATUS cmd_lsa_query_info_policy(struct cli_state *cli, static NTSTATUS cmd_lsa_lookup_names(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -179,7 +179,7 @@ static NTSTATUS cmd_lsa_lookup_names(struct cli_state *cli, /* Resolve a list of SIDs to a list of names */ static NTSTATUS cmd_lsa_lookup_sids(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -246,7 +246,7 @@ static NTSTATUS cmd_lsa_lookup_sids(struct cli_state *cli, TALLOC_CTX *mem_ctx, static NTSTATUS cmd_lsa_enum_trust_dom(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -301,7 +301,7 @@ static NTSTATUS cmd_lsa_enum_trust_dom(struct cli_state *cli, static NTSTATUS cmd_lsa_enum_privilege(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -354,7 +354,7 @@ static NTSTATUS cmd_lsa_enum_privilege(struct cli_state *cli, static NTSTATUS cmd_lsa_get_dispname(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -392,7 +392,7 @@ static NTSTATUS cmd_lsa_get_dispname(struct cli_state *cli, static NTSTATUS cmd_lsa_enum_sids(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -445,7 +445,7 @@ static NTSTATUS cmd_lsa_enum_sids(struct cli_state *cli, static NTSTATUS cmd_lsa_enum_privsaccounts(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND dom_pol; POLICY_HND user_pol; @@ -500,7 +500,7 @@ static NTSTATUS cmd_lsa_enum_privsaccounts(struct cli_state *cli, static NTSTATUS cmd_lsa_enum_acct_rights(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND dom_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -666,8 +666,8 @@ static NTSTATUS cmd_lsa_remove_acct_rights(struct cli_state *cli, /* Get a privilege value given its name */ static NTSTATUS cmd_lsa_lookupprivvalue(struct cli_state *cli, - TALLOC_CTX *mem_ctx, int argc, - char **argv) + TALLOC_CTX *mem_ctx, int argc, + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -702,7 +702,7 @@ static NTSTATUS cmd_lsa_lookupprivvalue(struct cli_state *cli, static NTSTATUS cmd_lsa_query_secobj(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index 85aface7be..cec6b1680b 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -264,7 +264,7 @@ static NTSTATUS try_samr_connects(struct cli_state *cli, TALLOC_CTX *mem_ctx, */ static NTSTATUS cmd_samr_query_user(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, user_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -373,7 +373,7 @@ static void display_group_info_ctr(GROUP_INFO_CTR *ctr) */ static NTSTATUS cmd_samr_query_group(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, group_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -435,7 +435,7 @@ done: static NTSTATUS cmd_samr_query_usergroups(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, @@ -499,8 +499,8 @@ static NTSTATUS cmd_samr_query_usergroups(struct cli_state *cli, /* Query aliases a user is a member of */ static NTSTATUS cmd_samr_query_useraliases(struct cli_state *cli, - TALLOC_CTX *mem_ctx, - int argc, char **argv) + TALLOC_CTX *mem_ctx, + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -568,7 +568,7 @@ static NTSTATUS cmd_samr_query_useraliases(struct cli_state *cli, static NTSTATUS cmd_samr_query_groupmem(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, group_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -630,7 +630,7 @@ static NTSTATUS cmd_samr_query_groupmem(struct cli_state *cli, static NTSTATUS cmd_samr_enum_dom_users(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -704,7 +704,7 @@ static NTSTATUS cmd_samr_enum_dom_users(struct cli_state *cli, static NTSTATUS cmd_samr_enum_dom_groups(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -777,7 +777,7 @@ static NTSTATUS cmd_samr_enum_dom_groups(struct cli_state *cli, static NTSTATUS cmd_samr_enum_als_groups(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -859,7 +859,7 @@ static NTSTATUS cmd_samr_enum_als_groups(struct cli_state *cli, static NTSTATUS cmd_samr_query_aliasmem(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, alias_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -933,7 +933,7 @@ static NTSTATUS cmd_samr_query_aliasmem(struct cli_state *cli, static NTSTATUS cmd_samr_query_dispinfo(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -1067,7 +1067,7 @@ static NTSTATUS cmd_samr_query_dispinfo(struct cli_state *cli, static NTSTATUS cmd_samr_query_dominfo(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -1137,11 +1137,11 @@ static NTSTATUS cmd_samr_query_dominfo(struct cli_state *cli, static NTSTATUS cmd_samr_create_dom_user(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, user_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; - char *acct_name; + const char *acct_name; uint16 acb_info; uint32 unknown, user_rid; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; @@ -1193,7 +1193,7 @@ static NTSTATUS cmd_samr_create_dom_user(struct cli_state *cli, static NTSTATUS cmd_samr_lookup_names(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; POLICY_HND connect_pol, domain_pol; @@ -1263,7 +1263,7 @@ static NTSTATUS cmd_samr_lookup_names(struct cli_state *cli, static NTSTATUS cmd_samr_lookup_rids(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; POLICY_HND connect_pol, domain_pol; @@ -1320,7 +1320,7 @@ static NTSTATUS cmd_samr_lookup_rids(struct cli_state *cli, static NTSTATUS cmd_samr_delete_dom_user(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; POLICY_HND connect_pol, domain_pol, user_pol; @@ -1389,7 +1389,7 @@ static NTSTATUS cmd_samr_delete_dom_user(struct cli_state *cli, */ static NTSTATUS cmd_samr_query_sec_obj(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, user_pol, *pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -1466,7 +1466,7 @@ done: static NTSTATUS cmd_samr_get_dom_pwinfo(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; uint16 unk_0, unk_1, unk_2; diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index 7a9c464cf6..5803055598 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -259,7 +259,7 @@ static void fetch_machine_sid(struct cli_state *cli) /* List the available commands on a given pipe */ static NTSTATUS cmd_listcommands(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { struct cmd_list *tmp; struct cmd_set *tmp_set; @@ -364,7 +364,7 @@ static NTSTATUS cmd_help(struct cli_state *cli, TALLOC_CTX *mem_ctx, /* Change the debug level */ static NTSTATUS cmd_debuglevel(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { if (argc > 2) { printf("Usage: %s [debuglevel]\n", argv[0]); @@ -479,7 +479,7 @@ static NTSTATUS do_cmd(struct cli_state *cli, /* Run command */ - result = cmd_entry->fn(cli, mem_ctx, argc, (char **) argv); + result = cmd_entry->fn(cli, mem_ctx, argc, (const char **) argv); /* Cleanup */ diff --git a/source3/rpcclient/rpcclient.h b/source3/rpcclient/rpcclient.h index 3276a62437..1bd3c1a641 100644 --- a/source3/rpcclient/rpcclient.h +++ b/source3/rpcclient/rpcclient.h @@ -24,8 +24,8 @@ struct cmd_set { const char *name; - NTSTATUS (*fn)(struct cli_state*, TALLOC_CTX *mem_ctx, int argc, - char **argv); + NTSTATUS (*fn)(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, + const char **argv); int pipe_idx; const char *description; const char *usage; -- cgit From 7c7d796b6d292a7c98b099ad1e1adbc4f2363512 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Tue, 25 Feb 2003 20:51:23 +0000 Subject: Progress on CR 601 cache the printer_info_2 with the open printer handle. cache is invalidated on a mod_a_printer() call **on that smbd**. Yes, this means that the window for admins to step on each other from different clients just got larger, but since handles a generally short lived this is probably ok. (This used to be commit 33c7b7522504fb15989f32add8e9a087c8d9d0fa) --- source3/include/nt_printing.h | 45 +++++ source3/printing/nt_printing.c | 366 +++++++++++++++++++++--------------- source3/registry/reg_printing.c | 7 +- source3/rpc_parse/parse_spoolss.c | 2 +- source3/rpc_server/srv_spoolss_nt.c | 277 ++++++++++++--------------- source3/smbd/lanman.c | 6 +- 6 files changed, 388 insertions(+), 315 deletions(-) diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h index 6d952a89a5..ca65a40d48 100644 --- a/source3/include/nt_printing.h +++ b/source3/include/nt_printing.h @@ -434,4 +434,49 @@ typedef struct { SPOOLSS_NOTIFY_MSG_GROUP *msg_groups; } SPOOLSS_NOTIFY_MSG_CTR; +#define PRINTER_HANDLE_IS_PRINTER 0 +#define PRINTER_HANDLE_IS_PRINTSERVER 1 + +/* structure to store the printer handles */ +/* and a reference to what it's pointing to */ +/* and the notify info asked about */ +/* that's the central struct */ +typedef struct _Printer{ + struct _Printer *prev, *next; + BOOL document_started; + BOOL page_started; + uint32 jobid; /* jobid in printing backend */ + BOOL printer_type; + TALLOC_CTX *ctx; + union { + fstring handlename; + fstring printerservername; + } dev; + uint32 type; + uint32 access_granted; + struct { + uint32 flags; + uint32 options; + fstring localmachine; + uint32 printerlocal; + SPOOL_NOTIFY_OPTION *option; + POLICY_HND client_hnd; + BOOL client_connected; + uint32 change; + /* are we in a FindNextPrinterChangeNotify() call? */ + BOOL fnpcn; + } notify; + struct { + fstring machine; + fstring user; + } client; + + /* devmode sent in the OpenPrinter() call */ + NT_DEVICEMODE *nt_devmode; + + /* cache the printer info */ + NT_PRINTER_INFO_LEVEL *printer_info; + +} Printer_entry; + #endif /* NT_PRINTING_H_ */ diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index 836324ecc9..0f5067c5a0 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -3,7 +3,7 @@ * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-2000, * Copyright (C) Jean François Micouleau 1998-2000. - * Copyright (C) Gerald Carter 2002. + * Copyright (C) Gerald Carter 2002-2003. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -565,8 +565,9 @@ BOOL add_a_form(nt_forms_struct **list, const FORM *form, int *count) } /**************************************************************************** - delete a named form struct + Delete a named form struct. ****************************************************************************/ + BOOL delete_a_form(nt_forms_struct **list, UNISTR2 *del_name, int *count, WERROR *ret) { pstring key; @@ -603,8 +604,9 @@ BOOL delete_a_form(nt_forms_struct **list, UNISTR2 *del_name, int *count, WERROR } /**************************************************************************** -update a form struct + Update a form struct. ****************************************************************************/ + void update_a_form(nt_forms_struct **list, const FORM *form, int count) { int n=0; @@ -612,8 +614,7 @@ void update_a_form(nt_forms_struct **list, const FORM *form, int count) unistr2_to_ascii(form_name, &(form->name), sizeof(form_name)-1); DEBUG(106, ("[%s]\n", form_name)); - for (n=0; ndevicename, @@ -1937,15 +1940,13 @@ static int pack_values(NT_PRINTER_DATA *data, char *buf, int buflen) /* loop over all keys */ - for ( i=0; inum_keys; i++ ) - { + for ( i=0; inum_keys; i++ ) { val_ctr = &data->keys[i].values; num_values = regval_ctr_numvals( val_ctr ); /* loop over all values */ - for ( j=0; j\ */ val = regval_ctr_specific_value( val_ctr, j ); @@ -1991,7 +1992,7 @@ uint32 del_a_printer(char *sharename) } /* FIXME!!! Reorder so this forward declaration is not necessary --jerry */ -static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **, fstring); +static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **, const char* sharename); static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **); /**************************************************************************** ****************************************************************************/ @@ -2169,6 +2170,9 @@ NT_DEVICEMODE *dup_nt_devicemode(NT_DEVICEMODE *nt_devicemode) { NT_DEVICEMODE *new_nt_devicemode = NULL; + if ( !nt_devicemode ) + return NULL; + if ((new_nt_devicemode = (NT_DEVICEMODE *)memdup(nt_devicemode, sizeof(NT_DEVICEMODE))) == NULL) { DEBUG(0,("dup_nt_devicemode: malloc fail.\n")); return NULL; @@ -2222,8 +2226,7 @@ static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr) /* clean up all registry keys */ data = &info->data; - for ( i=0; inum_keys; i++ ) - { + for ( i=0; inum_keys; i++ ) { SAFE_FREE( data->keys[i].name ); regval_ctr_destroy( &data->keys[i].values ); } @@ -2311,8 +2314,8 @@ int unpack_devicemode(NT_DEVICEMODE **nt_devmode, char *buf, int buflen) } /**************************************************************************** - allocate and initialize a new slot in - ***************************************************************************/ + Allocate and initialize a new slot. +***************************************************************************/ static int add_new_printer_key( NT_PRINTER_DATA *data, const char *name ) { @@ -2360,8 +2363,7 @@ int lookup_printerkey( NT_PRINTER_DATA *data, const char *name ) /* loop over all existing keys */ - for ( i=0; inum_keys; i++ ) - { + for ( i=0; inum_keys; i++ ) { if ( strequal(data->keys[i].name, name) ) { DEBUG(12,("lookup_printerkey: Found [%s]!\n", name)); key_index = i; @@ -2388,10 +2390,8 @@ uint32 get_printer_subkeys( NT_PRINTER_DATA *data, const char* key, fstring **su if ( !data ) return 0; - for ( i=0; inum_keys; i++ ) - { - if ( StrnCaseCmp(data->keys[i].name, key, strlen(key)) == 0 ) - { + for ( i=0; inum_keys; i++ ) { + if ( StrnCaseCmp(data->keys[i].name, key, strlen(key)) == 0 ) { /* match sure it is a subkey and not the key itself */ key_len = strlen( key ); @@ -2436,7 +2436,7 @@ uint32 get_printer_subkeys( NT_PRINTER_DATA *data, const char* key, fstring **su /* tag of the end */ if (num_subkeys) - fstrcpy( subkeys_ptr[num_subkeys], "" ); + fstrcpy(subkeys_ptr[num_subkeys], "" ); *subkeys = subkeys_ptr; @@ -2692,12 +2692,12 @@ WERROR unpublish_it(NT_PRINTER_INFO_LEVEL *printer) * @return WERROR indicating status of publishing ***************************************************************************/ -WERROR nt_printer_publish(int snum, int action) +WERROR nt_printer_publish(Printer_entry *print_hnd, int snum, int action) { NT_PRINTER_INFO_LEVEL *printer = NULL; WERROR win_rc; - win_rc = get_a_printer(&printer, 2, lp_servicename(snum)); + win_rc = get_a_printer(print_hnd, &printer, 2, lp_servicename(snum)); if (!W_ERROR_IS_OK(win_rc)) return win_rc; @@ -2718,7 +2718,7 @@ WERROR nt_printer_publish(int snum, int action) return win_rc; } -BOOL is_printer_published(int snum, GUID *guid) +BOOL is_printer_published(Printer_entry *print_hnd, int snum, GUID *guid) { NT_PRINTER_INFO_LEVEL *printer = NULL; REGVAL_CTR *ctr; @@ -2727,7 +2727,7 @@ BOOL is_printer_published(int snum, GUID *guid) int i; - win_rc = get_a_printer(&printer, 2, lp_servicename(snum)); + win_rc = get_a_printer(print_hnd, &printer, 2, lp_servicename(snum)); if (!W_ERROR_IS_OK(win_rc)) return False; @@ -2753,11 +2753,11 @@ BOOL is_printer_published(int snum, GUID *guid) } #else -WERROR nt_printer_publish(int snum, int action) +WERROR nt_printer_publish(Printer_entry *print_hnd, int snum, int action) { return WERR_OK; } -BOOL is_printer_published(int snum, GUID *guid) +BOOL is_printer_published(Printer_entry *print_hnd, int snum, GUID *guid) { return False; } @@ -2780,10 +2780,8 @@ WERROR delete_all_printer_data( NT_PRINTER_INFO_LEVEL_2 *p2, const char *key ) /* remove all keys */ - if ( !strlen(key) ) - { - for ( i=0; inum_keys; i++ ) - { + if ( !strlen(key) ) { + for ( i=0; inum_keys; i++ ) { DEBUG(8,("delete_all_printer_data: Removed all Printer Data from key [%s]\n", data->keys[i].name)); @@ -2802,10 +2800,8 @@ WERROR delete_all_printer_data( NT_PRINTER_INFO_LEVEL_2 *p2, const char *key ) /* remove a specific key (and all subkeys) */ - for ( i=0; inum_keys; i++ ) - { - if ( StrnCaseCmp( data->keys[i].name, key, strlen(key)) == 0 ) - { + for ( i=0; inum_keys; i++ ) { + if ( StrnCaseCmp( data->keys[i].name, key, strlen(key)) == 0 ) { DEBUG(8,("delete_all_printer_data: Removed all Printer Data from key [%s]\n", data->keys[i].name)); @@ -2849,8 +2845,7 @@ WERROR delete_all_printer_data( NT_PRINTER_INFO_LEVEL_2 *p2, const char *key ) /* sanity check to see if anything is left */ - if ( !data->num_keys ) - { + if ( !data->num_keys ) { DEBUG(8,("delete_all_printer_data: No keys left for printer [%s]\n", p2->printername )); SAFE_FREE( data->keys ); @@ -2956,8 +2951,7 @@ static int unpack_values(NT_PRINTER_DATA *printer_data, char *buf, int buflen) /* loop and unpack the rest of the registry values */ - while ( True ) - { + while ( True ) { /* check to see if there are any more registry values */ @@ -3007,7 +3001,8 @@ static int unpack_values(NT_PRINTER_DATA *printer_data, char *buf, int buflen) regval_ctr_addvalue( &printer_data->keys[key_index].values, valuename, type, data_p, size ); - SAFE_FREE(data_p); /* 'B' option to tdb_unpack does a malloc() */ + SAFE_FREE(data_p); /* 'B' option to tdbpack does a malloc() */ + DEBUG(8,("specific: [%s:%s], len: %d\n", keyname, valuename, size)); } @@ -3099,9 +3094,9 @@ static void map_to_os2_driver(fstring drivername) } /**************************************************************************** -get a default printer info 2 struct + Get a default printer info 2 struct. ****************************************************************************/ -static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename) +static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, const char *sharename) { int snum; NT_PRINTER_INFO_LEVEL_2 info; @@ -3180,7 +3175,7 @@ static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin /**************************************************************************** ****************************************************************************/ -static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename) +static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, const char *sharename) { pstring key; NT_PRINTER_INFO_LEVEL_2 info; @@ -3270,7 +3265,7 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen } /**************************************************************************** -debugging function, dump at level 6 the struct in the logs + Debugging function, dump at level 6 the struct in the logs. ****************************************************************************/ static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) { @@ -3279,8 +3274,7 @@ static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) DEBUG(106,("Dumping printer at level [%d]\n", level)); - switch (level) - { + switch (level) { case 2: { if (printer.info_2 == NULL) @@ -3325,26 +3319,6 @@ static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) return result; } -/**************************************************************************** - Get the parameters we can substitute in an NT print job. -****************************************************************************/ - -void get_printer_subst_params(int snum, fstring *printername, fstring *sharename, fstring *portname) -{ - NT_PRINTER_INFO_LEVEL *printer = NULL; - - **printername = **sharename = **portname = '\0'; - - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, lp_servicename(snum)))) - return; - - fstrcpy(*printername, printer->info_2->printername); - fstrcpy(*sharename, printer->info_2->sharename); - fstrcpy(*portname, printer->info_2->portname); - - free_a_printer(&printer, 2); -} - /**************************************************************************** Update the changeid time. This is SO NASTY as some drivers need this to change, others need it @@ -3388,8 +3362,15 @@ WERROR mod_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) dump_a_printer(printer, level); - switch (level) - { + /* + * invalidate cache for all open handles to this printer. + * cache for a given handle will be updated on the next + * get_a_printer() + */ + + invalidate_printer_hnd_cache( printer.info_2->sharename ); + + switch (level) { case 2: { /* @@ -3424,6 +3405,7 @@ WERROR mod_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) */ result=update_a_printer_2(printer.info_2); + break; } default: @@ -3528,8 +3510,7 @@ BOOL set_driver_init(NT_PRINTER_INFO_LEVEL *printer, uint32 level) { BOOL result = False; - switch (level) - { + switch (level) { case 2: result = set_driver_init_2(printer->info_2); break; @@ -3600,7 +3581,8 @@ static uint32 update_driver_init_2(NT_PRINTER_INFO_LEVEL_2 *info) ret = -1; goto done; } - else buf = tb; + else + buf = tb; buflen = len; goto again; } @@ -3636,13 +3618,10 @@ uint32 update_driver_init(NT_PRINTER_INFO_LEVEL printer, uint32 level) dump_a_printer(printer, level); - switch (level) - { + switch (level) { case 2: - { result = update_driver_init_2(printer.info_2); break; - } default: result = 1; break; @@ -3711,8 +3690,7 @@ static WERROR save_driver_init_2(NT_PRINTER_INFO_LEVEL *printer, uint8 *data, ui */ DEBUG(8,("save_driver_init_2: Enter...\n")); - if ( !printer->info_2->devmode && data_len ) - { + if ( !printer->info_2->devmode && data_len ) { /* * Set devmode on printer info, so entire printer initialization can be * saved to tdb. @@ -3781,13 +3759,10 @@ WERROR save_driver_init(NT_PRINTER_INFO_LEVEL *printer, uint32 level, uint8 *dat { WERROR status = WERR_OK; - switch (level) - { + switch (level) { case 2: - { status = save_driver_init_2( printer, data, data_len ); break; - } default: status = WERR_UNKNOWN_LEVEL; break; @@ -3796,11 +3771,80 @@ WERROR save_driver_init(NT_PRINTER_INFO_LEVEL *printer, uint32 level, uint8 *dat return status; } +/**************************************************************************** + Deep copy a NT_PRINTER_DATA +****************************************************************************/ + +static NTSTATUS copy_printer_data( NT_PRINTER_DATA *dst, NT_PRINTER_DATA *src ) +{ + int i, j, num_vals, new_key_index; + REGVAL_CTR *src_key, *dst_key; + + if ( !dst || !src ) + return NT_STATUS_NO_MEMORY; + + for ( i=0; inum_keys; i++ ) { + + /* create a new instance of the printerkey in the destination + printer_data object */ + + new_key_index = add_new_printer_key( dst, src->keys[i].name ); + dst_key = &dst->keys[new_key_index].values; + + src_key = &src->keys[i].values; + num_vals = regval_ctr_numvals( src_key ); + + /* dup the printer entire printer key */ + + for ( j=0; jdevmode = dup_nt_devicemode( printer->devmode ); + + ZERO_STRUCT( copy->data ); + copy_printer_data( ©->data, &printer->data ); + + /* this is talloc()'d; very ugly that we have a structure that + is half malloc()'d and half talloc()'d but that is the way + that the PRINTER_INFO stuff is written right now. --jerry */ + + copy->secdesc_buf = dup_sec_desc_buf( ctx, printer->secdesc_buf ); + + return copy; +} + /**************************************************************************** Get a NT_PRINTER_INFO_LEVEL struct. It returns malloced memory. ****************************************************************************/ -WERROR get_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, fstring sharename) +#define ENABLE_PRINT_HND_CACHE 1 + +WERROR get_a_printer( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, + const char *sharename) { WERROR result; NT_PRINTER_INFO_LEVEL *printer = NULL; @@ -3809,24 +3853,70 @@ WERROR get_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, fstring s DEBUG(10,("get_a_printer: [%s] level %u\n", sharename, (unsigned int)level)); - switch (level) - { + switch (level) { case 2: - { if ((printer = (NT_PRINTER_INFO_LEVEL *)malloc(sizeof(NT_PRINTER_INFO_LEVEL))) == NULL) { DEBUG(0,("get_a_printer: malloc fail.\n")); return WERR_NOMEM; } ZERO_STRUCTP(printer); + + /* + * check for cache first. A Printer handle cannot changed + * to another printer object so we only check that the printer + * is actually for a printer and that the printer_info pointer + * is valid + */ +#ifdef ENABLE_PRINT_HND_CACHE /* JERRY */ + if ( print_hnd + && (print_hnd->printer_type==PRINTER_HANDLE_IS_PRINTER) + && print_hnd->printer_info ) + { + if ( !(printer->info_2 = dup_printer_2(print_hnd->ctx, print_hnd->printer_info->info_2)) ) { + DEBUG(0,("get_a_printer: unable to copy cached printer info!\n")); + + SAFE_FREE(printer); + return WERR_NOMEM; + } + + DEBUG(10,("get_a_printer: using cached copy of printer_info_2\n")); + + *pp_printer = printer; + result = WERR_OK; + + break; + } +#endif + + /* no cache; look it up on disk */ + result=get_a_printer_2(&printer->info_2, sharename); if (W_ERROR_IS_OK(result)) { dump_a_printer(*printer, level); + +#if ENABLE_PRINT_HND_CACHE /* JERRY */ + /* save a copy in cache */ + if ( print_hnd && (print_hnd->printer_type==PRINTER_HANDLE_IS_PRINTER)) { + if ( !print_hnd->printer_info ) + print_hnd->printer_info = (NT_PRINTER_INFO_LEVEL *)malloc(sizeof(NT_PRINTER_INFO_LEVEL)); + + if ( print_hnd->printer_info ) { + print_hnd->printer_info->info_2 = dup_printer_2(print_hnd->ctx, printer->info_2); + + /* don't fail the lookup just because the cache update failed */ + if ( !print_hnd->printer_info->info_2 ) + DEBUG(0,("get_a_printer: unable to copy new printer info!\n")); + } + + } +#endif *pp_printer = printer; - } else { - SAFE_FREE(printer); } + else + SAFE_FREE(printer); + + break; - } default: result=WERR_UNKNOWN_LEVEL; break; @@ -3851,21 +3941,15 @@ uint32 free_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level) if (printer == NULL) return 0; - switch (level) - { + switch (level) { case 2: - { - if (printer->info_2 != NULL) - { + if (printer->info_2 != NULL) { free_nt_printer_info_level_2(&printer->info_2); result=0; - } - else - { + } else result=4; - } break; - } + default: result=1; break; @@ -3883,19 +3967,15 @@ uint32 add_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) DEBUG(104,("adding a printer at level [%d]\n", level)); dump_a_printer_driver(driver, level); - switch (level) - { + switch (level) { case 3: - { result=add_a_printer_driver_3(driver.info_3); break; - } case 6: - { result=add_a_printer_driver_6(driver.info_6); break; - } + default: result=1; break; @@ -3905,13 +3985,13 @@ uint32 add_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) } /**************************************************************************** ****************************************************************************/ + WERROR get_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL *driver, uint32 level, fstring drivername, const char *architecture, uint32 version) { WERROR result; - switch (level) - { + switch (level) { case 3: /* Sometime we just want any version of the driver */ @@ -3924,8 +4004,7 @@ WERROR get_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL *driver, uint32 level, result = get_a_printer_driver_3( &driver->info_3, drivername, architecture, 2 ); } - } - else { + } else { result = get_a_printer_driver_3(&driver->info_3, drivername, architecture, version); } @@ -3948,8 +4027,7 @@ uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) { uint32 result; - switch (level) - { + switch (level) { case 3: { NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3; @@ -3960,9 +4038,7 @@ uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) ZERO_STRUCTP(info3); SAFE_FREE(info3); result=0; - } - else - { + } else { result=4; } break; @@ -3970,17 +4046,14 @@ uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) case 6: { NT_PRINTER_DRIVER_INFO_LEVEL_6 *info6; - if (driver.info_6 != NULL) - { + if (driver.info_6 != NULL) { info6=driver.info_6; SAFE_FREE(info6->dependentfiles); SAFE_FREE(info6->previousnames); ZERO_STRUCTP(info6); SAFE_FREE(info6); result=0; - } - else - { + } else { result=4; } break; @@ -4011,12 +4084,11 @@ BOOL printer_driver_in_use ( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3 ) /* loop through the printers.tdb and check for the drivername */ - for (snum=0; snumname, printer->info_2->drivername) ) { @@ -4063,11 +4135,9 @@ static BOOL drv_file_in_use( char* file, NT_PRINTER_DRIVER_INFO_LEVEL_3 *info ) if ( !info->dependentfiles ) return False; - while ( *info->dependentfiles[i] ) - { + while ( *info->dependentfiles[i] ) { if ( strequal(file, info->dependentfiles[i]) ) return True; - i++; } @@ -4085,8 +4155,7 @@ static void trim_dependent_file( fstring files[], int idx ) /* bump everything down a slot */ - while( *files[idx+1] ) - { + while( *files[idx+1] ) { fstrcpy( files[idx], files[idx+1] ); idx++; } @@ -4140,14 +4209,12 @@ static BOOL trim_overlap_drv_files( NT_PRINTER_DRIVER_INFO_LEVEL_3 *src, if ( !src->dependentfiles ) return in_use; - while ( *src->dependentfiles[i] ) - { + while ( *src->dependentfiles[i] ) { if ( drv_file_in_use(src->dependentfiles[i], drv) ) { in_use = True; DEBUG(10,("Removing [%s] from dependent file list\n", src->dependentfiles[i])); trim_dependent_file( src->dependentfiles, i ); - } - else + } else i++; } @@ -4192,15 +4259,12 @@ BOOL printer_driver_files_in_use ( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info ) /* check each driver for overlap in files */ - for (i=0; ienvironment, version)) ) - { + if ( !W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, list[i], info->environment, version)) ) { SAFE_FREE(list); return True; } @@ -4208,8 +4272,7 @@ BOOL printer_driver_files_in_use ( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info ) /* check if d2 uses any files from d1 */ /* only if this is a different driver than the one being deleted */ - if ( !strequal(info->name, driver.info_3->name) ) - { + if ( !strequal(info->name, driver.info_3->name) ) { if ( trim_overlap_drv_files(info, driver.info_3) ) { free_a_printer_driver(driver, 3); SAFE_FREE( list ); @@ -4307,15 +4370,13 @@ static BOOL delete_driver_files( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3, struct /* check if we are done removing files */ - if ( info_3->dependentfiles ) - { + if ( info_3->dependentfiles ) { while ( *info_3->dependentfiles[i] ) { char *file; /* bypass the "\print$" portion of the path */ - if ( (file = strchr( info_3->dependentfiles[i]+1, '\\' )) != NULL ) - { + if ( (file = strchr( info_3->dependentfiles[i]+1, '\\' )) != NULL ) { DEBUG(10,("deleting dependent file [%s]\n", file)); unlink_internals(conn, 0, file ); } @@ -4560,8 +4621,9 @@ BOOL nt_printing_getsec(TALLOC_CTX *ctx, const char *printername, SEC_DESC_BUF * fstring key; char *temp; - if (strlen(printername) > 2 && (temp = strchr(printername + 2, '\\'))) + if (strlen(printername) > 2 && (temp = strchr(printername + 2, '\\'))) { printername = temp + 1; + } /* Fetch security descriptor from tdb */ @@ -4803,7 +4865,7 @@ BOOL print_time_access_check(int snum) struct tm *t; uint32 mins; - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, lp_servicename(snum)))) return False; if (printer->info_2->starttime == 0 && printer->info_2->untiltime == 0) diff --git a/source3/registry/reg_printing.c b/source3/registry/reg_printing.c index 4b8eaa658e..619ffc7ee7 100644 --- a/source3/registry/reg_printing.c +++ b/source3/registry/reg_printing.c @@ -497,7 +497,7 @@ static int print_subpath_printers( char *key, REGSUBKEY_CTR *subkeys ) keystr = key2; reg_split_path( keystr, &base, &new_path ); - if ( !W_ERROR_IS_OK( get_a_printer(&printer, 2, base) ) ) + if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, base) ) ) goto done; num_subkeys = get_printer_subkeys( &printer->info_2->data, new_path?new_path:"", &subkey_names ); @@ -557,7 +557,7 @@ static int print_subpath_values_printers( char *key, REGVAL_CTR *val ) { /* we are dealing with the printer itself */ - if ( !W_ERROR_IS_OK( get_a_printer(&printer, 2, printername) ) ) + if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, printername) ) ) goto done; info2 = printer->info_2; @@ -628,7 +628,6 @@ static int print_subpath_values_printers( char *key, REGVAL_CTR *val ) } } - prs_mem_free( &prs ); num_values = regval_ctr_numvals( val ); @@ -639,7 +638,7 @@ static int print_subpath_values_printers( char *key, REGVAL_CTR *val ) /* now enumerate the key */ - if ( !W_ERROR_IS_OK( get_a_printer(&printer, 2, printername) ) ) + if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, printername) ) ) goto done; /* iterate over all printer data and fill the regval container */ diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index fb2aaf71ec..a34740f9ff 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -1372,7 +1372,7 @@ BOOL spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, return False; } - if (!prs_uint8s( r_u->type&(REG_SZ|REG_MULTI_SZ), "data", ps, depth, r_u->data, r_u->size )) + if (!prs_uint8s( False, "data", ps, depth, r_u->data, r_u->size )) return False; if (!prs_align(ps)) diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 93566c2bb7..fa9b8eaeff 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -5,7 +5,7 @@ * Copyright (C) Luke Kenneth Casson Leighton 1996-2000, * Copyright (C) Jean François Micouleau 1998-2000, * Copyright (C) Jeremy Allison 2001-2002, - * Copyright (C) Gerald Carter 2000-2002, + * Copyright (C) Gerald Carter 2000-2003, * Copyright (C) Tim Potter 2001-2002. * * This program is free software; you can redistribute it and/or modify @@ -37,8 +37,7 @@ #define MAGIC_DISPLAY_FREQUENCY 0xfade2bad #define PHANTOM_DEVMODE_KEY "_p_f_a_n_t_0_m_" -#define PRINTER_HANDLE_IS_PRINTER 0 -#define PRINTER_HANDLE_IS_PRINTSERVER 1 + /* Table to map the driver version */ /* to OS */ @@ -55,46 +54,6 @@ struct table_node { int version; }; - -/* structure to store the printer handles */ -/* and a reference to what it's pointing to */ -/* and the notify info asked about */ -/* that's the central struct */ -typedef struct _Printer{ - struct _Printer *prev, *next; - BOOL document_started; - BOOL page_started; - uint32 jobid; /* jobid in printing backend */ - BOOL printer_type; - union { - fstring handlename; - fstring printerservername; - } dev; - uint32 type; - uint32 access_granted; - struct { - uint32 flags; - uint32 options; - fstring localmachine; - uint32 printerlocal; - SPOOL_NOTIFY_OPTION *option; - POLICY_HND client_hnd; - BOOL client_connected; - uint32 change; - /* are we in a FindNextPrinterChangeNotify() call? */ - BOOL fnpcn; - } notify; - struct { - fstring machine; - fstring user; - } client; - - /* devmode sent in the OpenPrinter() call */ - NT_DEVICEMODE *nt_devmode; - - -} Printer_entry; - static Printer_entry *printers_list; typedef struct _counter_printer_0 { @@ -251,6 +210,9 @@ static void free_printer_entry(void *ptr) Printer->notify.client_connected=False; free_nt_devicemode( &Printer->nt_devmode ); + free_a_printer( &Printer->printer_info, 2 ); + + talloc_destroy( Printer->ctx ); /* Remove from the internal list. */ DLIST_REMOVE(printers_list, Printer); @@ -303,6 +265,29 @@ static Printer_entry *find_printer_index_by_hnd(pipes_struct *p, POLICY_HND *hnd return find_printer; } +/**************************************************************************** + find printer index by handle +****************************************************************************/ + +void invalidate_printer_hnd_cache( char *printername ) +{ + Printer_entry *p; + + DEBUG(10,("invalidate_printer_hnd_cache: printer [%s]\n", printername)); + + for ( p=printers_list; p; p=p->next ) + { + if ( p->printer_type==PRINTER_HANDLE_IS_PRINTER + && StrCaseCmp(p->dev.handlename, printername)==0) + { + DEBUG(10,("invalidating printer_info cache for handl:\n")); + free_a_printer( &p->printer_info, 2 ); + p->printer_info = NULL; + } + } + + return; +} /**************************************************************************** Close printer index by handle. ****************************************************************************/ @@ -534,6 +519,11 @@ static BOOL open_printer_hnd(pipes_struct *p, POLICY_HND *hnd, char *name, uint3 ZERO_STRUCTP(new_printer); + if ( !(new_printer->ctx = talloc_init("Printer Entry [0x%x]", (uint32)hnd)) ) { + DEBUG(0,("open_printer_hnd: talloc_init() failed!\n")); + return False; + } + new_printer->notify.option=NULL; /* Add to the internal list. */ @@ -861,8 +851,7 @@ static int notify_msg_ctr_addmsg( SPOOLSS_NOTIFY_MSG_CTR *ctr, SPOOLSS_NOTIFY_MS /* add a new group? */ - if ( i == ctr->num_groups ) - { + if ( i == ctr->num_groups ) { ctr->num_groups++; if ( !(groups = talloc_realloc( ctr->ctx, ctr->msg_groups, sizeof(SPOOLSS_NOTIFY_MSG_GROUP)*ctr->num_groups)) ) { @@ -929,8 +918,7 @@ static void send_notify2_changes( SPOOLSS_NOTIFY_MSG_CTR *ctr, uint32 idx ) /* loop over all printers */ - for (p = printers_list; p; p = p->next) - { + for (p = printers_list; p; p = p->next) { SPOOL_NOTIFY_INFO_DATA *data; uint32 data_len = 0; uint32 id; @@ -961,8 +949,7 @@ static void send_notify2_changes( SPOOLSS_NOTIFY_MSG_CTR *ctr, uint32 idx ) /* build the array of change notifications */ - for ( i=0; inum_msgs; i++ ) - { + for ( i=0; inum_msgs; i++ ) { SPOOLSS_NOTIFY_MSG *msg = &messages[i]; /* Are we monitoring this event? */ @@ -995,8 +982,7 @@ static void send_notify2_changes( SPOOLSS_NOTIFY_MSG_CTR *ctr, uint32 idx ) /* Convert unix jobid to smb jobid */ - if (msg->flags & SPOOLSS_NOTIFY_MSG_UNIX_JOBID) - { + if (msg->flags & SPOOLSS_NOTIFY_MSG_UNIX_JOBID) { id = sysjob_to_jobid(msg->id); if (id == -1) { @@ -1204,7 +1190,7 @@ void do_drv_upgrade_printer(int msg_type, pid_t src, void *buf, size_t len) WERROR result; NT_PRINTER_INFO_LEVEL *printer = NULL; - result = get_a_printer(&printer, 2, lp_servicename(snum)); + result = get_a_printer(NULL, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(result)) continue; @@ -1300,7 +1286,7 @@ void reset_all_printerdata(int msg_type, pid_t src, void *buf, size_t len) WERROR result; NT_PRINTER_INFO_LEVEL *printer = NULL; - result = get_a_printer( &printer, 2, lp_servicename(snum) ); + result = get_a_printer( NULL, &printer, 2, lp_const_servicename(snum) ); if ( !W_ERROR_IS_OK(result) ) continue; @@ -2157,9 +2143,7 @@ static WERROR get_printer_dataex( TALLOC_CTX *ctx, NT_PRINTER_INFO_LEVEL *printe static WERROR delete_printer_dataex( NT_PRINTER_INFO_LEVEL *printer, const char *key, const char *value ) { - delete_printer_data( printer->info_2, key, value ); - - return mod_a_printer(*printer, 2); + return delete_printer_data( printer->info_2, key, value ); } /**************************************************************************** @@ -2171,9 +2155,7 @@ static WERROR set_printer_dataex( NT_PRINTER_INFO_LEVEL *printer, const char *ke { delete_printer_data( printer->info_2, key, value ); - add_printer_data( printer->info_2, key, value, type, data, real_len ); - - return mod_a_printer(*printer, 2); + return add_printer_data( printer->info_2, key, value, type, data, real_len ); } /******************************************************************** @@ -2349,7 +2331,7 @@ WERROR _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO goto done; } - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_servicename(snum)); if ( !W_ERROR_IS_OK(status) ) goto done; @@ -3443,7 +3425,7 @@ void construct_info_data(SPOOL_NOTIFY_INFO_DATA *info_data, uint16 type, uint16 * ********************************************************************/ -static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int +static BOOL construct_notify_printer_info(Printer_entry *print_hnd, SPOOL_NOTIFY_INFO *info, int snum, SPOOL_NOTIFY_OPTION_TYPE *option_type, uint32 id, TALLOC_CTX *mem_ctx) @@ -3462,11 +3444,10 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int (option_type->type==PRINTER_NOTIFY_TYPE?"PRINTER_NOTIFY_TYPE":"JOB_NOTIFY_TYPE"), option_type->count, lp_servicename(snum))); - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &printer, 2, lp_const_servicename(snum)))) return False; - for(field_num=0; field_numcount; field_num++) - { + for(field_num=0; field_numcount; field_num++) { field = option_type->fields[field_num]; DEBUG(4,("construct_notify_printer_info: notify [%d]: type [%x], field [%x]\n", field_num, type, field)); @@ -3474,12 +3455,10 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int if (!search_notify(type, field, &j) ) continue; - if((tid=(SPOOL_NOTIFY_INFO_DATA *)Realloc(info->data, (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA))) == NULL) - { + if((tid=(SPOOL_NOTIFY_INFO_DATA *)Realloc(info->data, (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA))) == NULL) { DEBUG(2,("construct_notify_printer_info: failed to enlarge buffer info->data!\n")); return False; - } - else + } else info->data = tid; current_data = &info->data[info->count]; @@ -3611,7 +3590,7 @@ static WERROR printserver_notify_info(pipes_struct *p, POLICY_HND *hnd, for (snum=0; snumtype ) { case PRINTER_NOTIFY_TYPE: - if(construct_notify_printer_info(info, snum, + if(construct_notify_printer_info(Printer, info, snum, option_type, id, mem_ctx)) id--; @@ -3682,8 +3661,7 @@ static WERROR printer_notify_info(pipes_struct *p, POLICY_HND *hnd, SPOOL_NOTIFY count = print_queue_status(snum, &queue, &status); - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, - lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)))) goto done; for (j=0; jflags=flags; @@ -3997,7 +3975,7 @@ DEVICEMODE *construct_dev_mode(int snum) DEBUGADD(8,("getting printer characteristics\n")); - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, lp_const_servicename(snum)))) return NULL; if ( !printer->info_2->devmode ) { @@ -4030,14 +4008,14 @@ done: * fill a printer_info_2 struct ********************************************************************/ -static BOOL construct_printer_info_2(PRINTER_INFO_2 *printer, int snum) +static BOOL construct_printer_info_2(Printer_entry *print_hnd, PRINTER_INFO_2 *printer, int snum) { int count; NT_PRINTER_INFO_LEVEL *ntprinter = NULL; print_status_struct status; - if (!W_ERROR_IS_OK(get_a_printer(&ntprinter, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum)))) return False; count = print_queue_length(snum, &status); @@ -4093,12 +4071,12 @@ static BOOL construct_printer_info_2(PRINTER_INFO_2 *printer, int snum) * fill a printer_info_3 struct ********************************************************************/ -static BOOL construct_printer_info_3(PRINTER_INFO_3 **pp_printer, int snum) +static BOOL construct_printer_info_3(Printer_entry *print_hnd, PRINTER_INFO_3 **pp_printer, int snum) { NT_PRINTER_INFO_LEVEL *ntprinter = NULL; PRINTER_INFO_3 *printer = NULL; - if (!W_ERROR_IS_OK(get_a_printer(&ntprinter, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum)))) return False; *pp_printer = NULL; @@ -4148,11 +4126,11 @@ static BOOL construct_printer_info_3(PRINTER_INFO_3 **pp_printer, int snum) * fill a printer_info_4 struct ********************************************************************/ -static BOOL construct_printer_info_4(PRINTER_INFO_4 *printer, int snum) +static BOOL construct_printer_info_4(Printer_entry *print_hnd, PRINTER_INFO_4 *printer, int snum) { NT_PRINTER_INFO_LEVEL *ntprinter = NULL; - if (!W_ERROR_IS_OK(get_a_printer(&ntprinter, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum)))) return False; init_unistr(&printer->printername, ntprinter->info_2->printername); /* printername*/ @@ -4168,11 +4146,11 @@ static BOOL construct_printer_info_4(PRINTER_INFO_4 *printer, int snum) * fill a printer_info_5 struct ********************************************************************/ -static BOOL construct_printer_info_5(PRINTER_INFO_5 *printer, int snum) +static BOOL construct_printer_info_5(Printer_entry *print_hnd, PRINTER_INFO_5 *printer, int snum) { NT_PRINTER_INFO_LEVEL *ntprinter = NULL; - if (!W_ERROR_IS_OK(get_a_printer(&ntprinter, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum)))) return False; init_unistr(&printer->printername, ntprinter->info_2->printername); @@ -4194,12 +4172,12 @@ static BOOL construct_printer_info_5(PRINTER_INFO_5 *printer, int snum) * fill a printer_info_7 struct ********************************************************************/ -static BOOL construct_printer_info_7(PRINTER_INFO_7 *printer, int snum) +static BOOL construct_printer_info_7(Printer_entry *print_hnd, PRINTER_INFO_7 *printer, int snum) { char *guid_str = NULL; GUID guid; - if (is_printer_published(snum, &guid)) { + if (is_printer_published(print_hnd, snum, &guid)) { asprintf(&guid_str, "{%s}", uuid_string_static(guid)); strupper(guid_str); init_unistr(&printer->guid, guid_str); @@ -4230,7 +4208,7 @@ static WERROR enum_all_printers_info_1(uint32 flags, NEW_BUFFER *buffer, uint32 if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) { DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum)); - if (construct_printer_info_1(flags, ¤t_prt, snum)) { + if (construct_printer_info_1(NULL, flags, ¤t_prt, snum)) { if((tp=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_1))) == NULL) { DEBUG(2,("enum_all_printers_info_1: failed to enlarge printers buffer!\n")); SAFE_FREE(printers); @@ -4399,7 +4377,7 @@ static WERROR enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint3 if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) { DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum)); - if (construct_printer_info_2(¤t_prt, snum)) { + if (construct_printer_info_2(NULL, ¤t_prt, snum)) { if((tp=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_2))) == NULL) { DEBUG(2,("enum_all_printers_info_2: failed to enlarge printers buffer!\n")); SAFE_FREE(printers); @@ -4570,14 +4548,14 @@ WERROR _spoolss_enumprinters( pipes_struct *p, SPOOL_Q_ENUMPRINTERS *q_u, SPOOL_ /**************************************************************************** ****************************************************************************/ -static WERROR getprinter_level_0(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static WERROR getprinter_level_0(Printer_entry *print_hnd, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_0 *printer=NULL; if((printer=(PRINTER_INFO_0*)malloc(sizeof(PRINTER_INFO_0))) == NULL) return WERR_NOMEM; - construct_printer_info_0(printer, snum); + construct_printer_info_0(print_hnd, printer, snum); /* check the required size. */ *needed += spoolss_size_printer_info_0(printer); @@ -4603,14 +4581,14 @@ static WERROR getprinter_level_0(int snum, NEW_BUFFER *buffer, uint32 offered, u /**************************************************************************** ****************************************************************************/ -static WERROR getprinter_level_1(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static WERROR getprinter_level_1(Printer_entry *print_hnd, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_1 *printer=NULL; if((printer=(PRINTER_INFO_1*)malloc(sizeof(PRINTER_INFO_1))) == NULL) return WERR_NOMEM; - construct_printer_info_1(PRINTER_ENUM_ICON8, printer, snum); + construct_printer_info_1(print_hnd, PRINTER_ENUM_ICON8, printer, snum); /* check the required size. */ *needed += spoolss_size_printer_info_1(printer); @@ -4636,14 +4614,14 @@ static WERROR getprinter_level_1(int snum, NEW_BUFFER *buffer, uint32 offered, u /**************************************************************************** ****************************************************************************/ -static WERROR getprinter_level_2(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static WERROR getprinter_level_2(Printer_entry *print_hnd, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_2 *printer=NULL; if((printer=(PRINTER_INFO_2*)malloc(sizeof(PRINTER_INFO_2)))==NULL) return WERR_NOMEM; - construct_printer_info_2(printer, snum); + construct_printer_info_2(print_hnd, printer, snum); /* check the required size. */ *needed += spoolss_size_printer_info_2(printer); @@ -4672,11 +4650,11 @@ static WERROR getprinter_level_2(int snum, NEW_BUFFER *buffer, uint32 offered, u /**************************************************************************** ****************************************************************************/ -static WERROR getprinter_level_3(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static WERROR getprinter_level_3(Printer_entry *print_hnd, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_3 *printer=NULL; - if (!construct_printer_info_3(&printer, snum)) + if (!construct_printer_info_3(print_hnd, &printer, snum)) return WERR_NOMEM; /* check the required size. */ @@ -4703,14 +4681,14 @@ static WERROR getprinter_level_3(int snum, NEW_BUFFER *buffer, uint32 offered, u /**************************************************************************** ****************************************************************************/ -static WERROR getprinter_level_4(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static WERROR getprinter_level_4(Printer_entry *print_hnd, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_4 *printer=NULL; if((printer=(PRINTER_INFO_4*)malloc(sizeof(PRINTER_INFO_4)))==NULL) return WERR_NOMEM; - if (!construct_printer_info_4(printer, snum)) + if (!construct_printer_info_4(print_hnd, printer, snum)) return WERR_NOMEM; /* check the required size. */ @@ -4737,14 +4715,14 @@ static WERROR getprinter_level_4(int snum, NEW_BUFFER *buffer, uint32 offered, u /**************************************************************************** ****************************************************************************/ -static WERROR getprinter_level_5(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static WERROR getprinter_level_5(Printer_entry *print_hnd, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_5 *printer=NULL; if((printer=(PRINTER_INFO_5*)malloc(sizeof(PRINTER_INFO_5)))==NULL) return WERR_NOMEM; - if (!construct_printer_info_5(printer, snum)) + if (!construct_printer_info_5(print_hnd, printer, snum)) return WERR_NOMEM; /* check the required size. */ @@ -4768,14 +4746,14 @@ static WERROR getprinter_level_5(int snum, NEW_BUFFER *buffer, uint32 offered, u return WERR_OK; } -static WERROR getprinter_level_7(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static WERROR getprinter_level_7(Printer_entry *print_hnd, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_7 *printer=NULL; if((printer=(PRINTER_INFO_7*)malloc(sizeof(PRINTER_INFO_7)))==NULL) return WERR_NOMEM; - if (!construct_printer_info_7(printer, snum)) + if (!construct_printer_info_7(print_hnd, printer, snum)) return WERR_NOMEM; /* check the required size. */ @@ -4809,6 +4787,7 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET NEW_BUFFER *buffer = NULL; uint32 offered = q_u->offered; uint32 *needed = &r_u->needed; + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); int snum; @@ -4823,19 +4802,19 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET switch (level) { case 0: - return getprinter_level_0(snum, buffer, offered, needed); + return getprinter_level_0(Printer, snum, buffer, offered, needed); case 1: - return getprinter_level_1(snum, buffer, offered, needed); + return getprinter_level_1(Printer, snum, buffer, offered, needed); case 2: - return getprinter_level_2(snum, buffer, offered, needed); + return getprinter_level_2(Printer, snum, buffer, offered, needed); case 3: - return getprinter_level_3(snum, buffer, offered, needed); + return getprinter_level_3(Printer, snum, buffer, offered, needed); case 4: - return getprinter_level_4(snum, buffer, offered, needed); + return getprinter_level_4(Printer, snum, buffer, offered, needed); case 5: - return getprinter_level_5(snum, buffer, offered, needed); + return getprinter_level_5(Printer, snum, buffer, offered, needed); case 7: - return getprinter_level_7(snum, buffer, offered, needed); + return getprinter_level_7(Printer, snum, buffer, offered, needed); } return WERR_UNKNOWN_LEVEL; } @@ -4860,7 +4839,7 @@ static WERROR construct_printer_driver_info_1(DRIVER_INFO_1 *info, int snum, fst ZERO_STRUCT(driver); - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, lp_const_servicename(snum)))) return WERR_INVALID_PRINTER_NAME; if (!W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version))) @@ -4920,7 +4899,7 @@ static WERROR construct_printer_driver_info_2(DRIVER_INFO_2 *info, int snum, fst ZERO_STRUCT(printer); ZERO_STRUCT(driver); - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, lp_servicename(snum)))) + if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, lp_const_servicename(snum)))) return WERR_INVALID_PRINTER_NAME; if (!W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version))) @@ -5059,7 +5038,7 @@ static WERROR construct_printer_driver_info_3(DRIVER_INFO_3 *info, int snum, fst WERROR status; ZERO_STRUCT(driver); - status=get_a_printer(&printer, 2, lp_servicename(snum) ); + status=get_a_printer(NULL, &printer, 2, lp_const_servicename(snum) ); DEBUG(8,("construct_printer_driver_info_3: status: %s\n", dos_errstr(status))); if (!W_ERROR_IS_OK(status)) return WERR_INVALID_PRINTER_NAME; @@ -5184,7 +5163,7 @@ static WERROR construct_printer_driver_info_6(DRIVER_INFO_6 *info, int snum, ZERO_STRUCT(driver); - status=get_a_printer(&printer, 2, lp_servicename(snum) ); + status=get_a_printer(NULL, &printer, 2, lp_const_servicename(snum) ); DEBUG(8,("construct_printer_driver_info_6: status: %s\n", dos_errstr(status))); @@ -5853,13 +5832,6 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, result = WERR_OK; - if (level!=2) { - DEBUG(0,("update_printer: Send a mail to samba@samba.org\n")); - DEBUGADD(0,("with the following message: update_printer: level!=2\n")); - result = WERR_UNKNOWN_LEVEL; - goto done; - } - if (!Printer) { result = WERR_BADFID; goto done; @@ -5870,8 +5842,8 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, goto done; } - if (!W_ERROR_IS_OK(get_a_printer(&printer, 2, lp_servicename(snum))) || - (!W_ERROR_IS_OK(get_a_printer(&old_printer, 2, lp_servicename(snum))))) { + if (!W_ERROR_IS_OK(get_a_printer(Printer, &printer, 2, lp_const_servicename(snum))) || + (!W_ERROR_IS_OK(get_a_printer(Printer, &old_printer, 2, lp_const_servicename(snum))))) { result = WERR_BADFID; goto done; } @@ -5899,13 +5871,6 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, result = WERR_NOMEM; goto done; } - - /* - * make sure we actually reload the services after - * this as smb.conf could have a new section in it - * .... shouldn't .... but could - */ - reload_services(False); } /* Do sanity check on the requested changes for Samba */ @@ -5964,9 +5929,6 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, notify_printer_driver(snum, printer->info_2->drivername); } - /* Update printer info */ - result = mod_a_printer(*printer, 2); - /* * flag which changes actually occured. This is a small subset of * all the possible changes. We also have to update things in the @@ -6022,6 +5984,9 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "uNCName", REG_SZ, (uint8*)buffer.buffer, buffer.uni_str_len*2 ); + /* Update printer info */ + result = mod_a_printer(*printer, 2); + done: free_a_printer(&printer, 2); free_a_printer(&old_printer, 2); @@ -6051,7 +6016,7 @@ static WERROR publish_or_unpublish_printer(pipes_struct *p, POLICY_HND *handle, if (!get_printer_snum(p, handle, &snum)) return WERR_BADFID; - nt_printer_publish(snum, info7->action); + nt_printer_publish(Printer, snum, info7->action); return WERR_OK; #else @@ -6287,7 +6252,7 @@ static WERROR enumjobs_level2(print_queue_struct *queue, int snum, goto done; } - result = get_a_printer(&ntprinter, 2, lp_servicename(snum)); + result = get_a_printer(NULL, &ntprinter, 2, lp_servicename(snum)); if (!W_ERROR_IS_OK(result)) { *returned = 0; goto done; @@ -7591,7 +7556,7 @@ WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S if (!get_printer_snum(p,handle, &snum)) return WERR_BADFID; - result = get_a_printer(&printer, 2, lp_servicename(snum)); + result = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(result)) return result; @@ -7655,9 +7620,9 @@ WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S /* out_value should default to "" or else NT4 has problems unmarshalling the response */ - *out_max_value_len = (in_value_len/sizeof(uint16)); + *out_max_value_len=(in_value_len/sizeof(uint16)); - if ( (*out_value=(uint16 *)talloc_zero(p->mem_ctx, in_value_len*sizeof(uint8))) == NULL ) + if((*out_value=(uint16 *)talloc_zero(p->mem_ctx, in_value_len*sizeof(uint8))) == NULL) { result = WERR_NOMEM; goto done; @@ -7692,7 +7657,7 @@ WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S */ /* name */ - *out_max_value_len = ( in_value_len / sizeof(uint16) ); + *out_max_value_len=(in_value_len/sizeof(uint16)); if ( (*out_value = (uint16 *)talloc_zero(p->mem_ctx, in_value_len*sizeof(uint8))) == NULL ) { result = WERR_NOMEM; @@ -7765,7 +7730,7 @@ WERROR _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SP goto done; } - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) return status; @@ -7857,7 +7822,7 @@ WERROR _spoolss_deleteprinterdata(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATA *q_ return WERR_ACCESS_DENIED; } - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) return status; @@ -7901,7 +7866,7 @@ WERROR _spoolss_addform( pipes_struct *p, SPOOL_Q_ADDFORM *q_u, SPOOL_R_ADDFORM if (!get_printer_snum(p,handle, &snum)) return WERR_BADFID; - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) goto done; } @@ -7972,7 +7937,7 @@ WERROR _spoolss_deleteform( pipes_struct *p, SPOOL_Q_DELETEFORM *q_u, SPOOL_R_DE if (!get_printer_snum(p,handle, &snum)) return WERR_BADFID; - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) goto done; } @@ -8040,7 +8005,7 @@ WERROR _spoolss_setform(pipes_struct *p, SPOOL_Q_SETFORM *q_u, SPOOL_R_SETFORM * if (!get_printer_snum(p,handle, &snum)) return WERR_BADFID; - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) goto done; } @@ -8390,7 +8355,7 @@ static WERROR getjob_level_2(print_queue_struct *queue, int count, int snum, uin goto done; } - ret = get_a_printer(&ntprinter, 2, lp_servicename(snum)); + ret = get_a_printer(NULL, &ntprinter, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(ret)) goto done; @@ -8543,7 +8508,7 @@ WERROR _spoolss_getprinterdataex(pipes_struct *p, SPOOL_Q_GETPRINTERDATAEX *q_u, if ( !get_printer_snum(p,handle, &snum) ) return WERR_BADFID; - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_servicename(snum)); if ( !W_ERROR_IS_OK(status) ) goto done; @@ -8638,7 +8603,7 @@ WERROR _spoolss_setprinterdataex(pipes_struct *p, SPOOL_Q_SETPRINTERDATAEX *q_u, return WERR_ACCESS_DENIED; } - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_servicename(snum)); if (!W_ERROR_IS_OK(status)) return status; @@ -8657,11 +8622,10 @@ WERROR _spoolss_setprinterdataex(pipes_struct *p, SPOOL_Q_SETPRINTERDATAEX *q_u, status = set_printer_dataex( printer, keyname, valuename, type, data, real_len ); - /* save the OID if one was specified and the previous set call succeeded */ - - if ( W_ERROR_IS_OK(status) && oid_string ) + if ( W_ERROR_IS_OK(status) ) { - + /* save the OID if one was specified */ + if ( oid_string ) { fstrcat( keyname, "\\" ); fstrcat( keyname, SPOOL_OID_KEY ); @@ -8676,6 +8640,9 @@ WERROR _spoolss_setprinterdataex(pipes_struct *p, SPOOL_Q_SETPRINTERDATAEX *q_u, REG_SZ, (void*)oid_string, strlen(oid_string)+1 ); } + status = mod_a_printer(*printer, 2); + } + free_a_printer(&printer, 2); return status; @@ -8713,7 +8680,7 @@ WERROR _spoolss_deleteprinterdataex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATAEX return WERR_ACCESS_DENIED; } - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) return status; @@ -8757,7 +8724,7 @@ WERROR _spoolss_enumprinterkey(pipes_struct *p, SPOOL_Q_ENUMPRINTERKEY *q_u, SPO if ( !get_printer_snum(p,handle, &snum) ) return WERR_BADFID; - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) return status; @@ -8832,7 +8799,7 @@ WERROR _spoolss_deleteprinterkey(pipes_struct *p, SPOOL_Q_DELETEPRINTERKEY *q_u, return WERR_ACCESS_DENIED; } - status = get_a_printer(&printer, 2, lp_servicename(snum)); + status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(status)) return status; @@ -8901,7 +8868,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_ return WERR_BADFID; ZERO_STRUCT(printer); - result = get_a_printer(&printer, 2, lp_servicename(snum)); + result = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum)); if (!W_ERROR_IS_OK(result)) return result; diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index 25f390be55..98857c6d32 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -500,7 +500,7 @@ static BOOL get_driver_name(int snum, pstring drivername) NT_PRINTER_INFO_LEVEL *info = NULL; BOOL in_tdb = False; - get_a_printer (&info, 2, lp_servicename(snum)); + get_a_printer (NULL, &info, 2, lp_servicename(snum)); if (info != NULL) { pstrcpy( drivername, info->info_2->drivername); in_tdb = True; @@ -522,7 +522,7 @@ static void fill_printq_info_52(connection_struct *conn, int snum, NT_PRINTER_DRIVER_INFO_LEVEL driver; NT_PRINTER_INFO_LEVEL *printer = NULL; - if ( !W_ERROR_IS_OK(get_a_printer( &printer, 2, lp_servicename(snum))) ) { + if ( !W_ERROR_IS_OK(get_a_printer( NULL, &printer, 2, lp_servicename(snum))) ) { DEBUG(3,("fill_printq_info_52: Failed to lookup printer [%s]\n", lp_servicename(snum))); goto err; @@ -679,7 +679,7 @@ static int get_printerdrivernumber(int snum) NT_PRINTER_DRIVER_INFO_LEVEL driver; NT_PRINTER_INFO_LEVEL *printer = NULL; - if ( !W_ERROR_IS_OK(get_a_printer( &printer, 2, lp_servicename(snum))) ) { + if ( !W_ERROR_IS_OK(get_a_printer( NULL, &printer, 2, lp_servicename(snum))) ) { DEBUG(3,("get_printerdrivernumber: Failed to lookup printer [%s]\n", lp_servicename(snum))); goto done; -- cgit From 64e53c9b22f23506acfd2fb4552b7c43129631a6 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 25 Feb 2003 23:28:28 +0000 Subject: Fix breakage done by myself yesterday. (This used to be commit f4492de2d668082df6ae06933d12a3cfe120d403) --- source3/client/client.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/source3/client/client.c b/source3/client/client.c index b95d4d877c..5da12fd984 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -51,8 +51,7 @@ static int max_protocol = PROTOCOL_NT1; extern pstring user_socket_options; static int process_tok(fstring tok); -static NTSTATUS cmd_help(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - const char **argv); +static int cmd_help(void); /* 30 second timeout on most commands */ #define CLIENT_TIMEOUT (30*1000) @@ -980,8 +979,7 @@ static BOOL do_altname(char *name) /**************************************************************************** Exit client. ****************************************************************************/ -static NTSTATUS cmd_quit(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - const char **argv) +static int cmd_quit(void) { cli_shutdown(cli); exit(0); @@ -2151,8 +2149,7 @@ static int process_tok(fstring tok) /**************************************************************************** help ****************************************************************************/ -static NTSTATUS cmd_help(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - const char **argv) +static int cmd_help(void) { int i=0,j; fstring buf; -- cgit From 7d581bebd437cd66000a1cac4b74b1ec4408f672 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 25 Feb 2003 23:30:46 +0000 Subject: Fix unused variable warning when ENCTYPE_ARCFOUR_HMAC is not defined. (This used to be commit 92abafa62894a125c5a09fc92f5056e4d8b51089) --- source3/libsmb/clikrb5.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index 6b0c7ddaf2..5edc56daa9 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -367,7 +367,9 @@ failed: BOOL krb5_get_smb_session_key(krb5_context context, krb5_auth_context auth_context, uint8 session_key[16]) { +#ifdef ENCTYPE_ARCFOUR_HMAC krb5_keyblock *skey; +#endif BOOL ret = False; memset(session_key, 0, 16); -- cgit From 991f6cc3c13cdeb8d7cf0dea25af29bbc7987c64 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 25 Feb 2003 23:34:57 +0000 Subject: More const fixes and flow on fixes from yesterday's const-fest. (This used to be commit 018733eedd7897e6811e8461c07e3acf418c0e09) --- source3/rpc_client/cli_dfs.c | 12 ++++--- source3/rpc_client/cli_lsarpc.c | 5 +-- source3/rpc_client/cli_netlogon.c | 2 +- source3/rpc_client/cli_spoolss.c | 17 +++++----- source3/rpc_client/cli_srvsvc.c | 7 +++-- source3/rpc_parse/parse_dfs.c | 13 ++++---- source3/rpc_parse/parse_spoolss.c | 14 +++++---- source3/rpcclient/cmd_dfs.c | 16 +++++----- source3/rpcclient/cmd_ds.c | 2 +- source3/rpcclient/cmd_netlogon.c | 12 +++---- source3/rpcclient/cmd_reg.c | 4 +-- source3/rpcclient/cmd_spoolss.c | 66 +++++++++++++++++++-------------------- source3/rpcclient/cmd_srvsvc.c | 8 ++--- source3/rpcclient/rpcclient.c | 4 +-- source3/torture/samtest.c | 2 +- source3/torture/vfstest.c | 2 +- 16 files changed, 97 insertions(+), 89 deletions(-) diff --git a/source3/rpc_client/cli_dfs.c b/source3/rpc_client/cli_dfs.c index 7fc27b9c3b..2136b69df0 100644 --- a/source3/rpc_client/cli_dfs.c +++ b/source3/rpc_client/cli_dfs.c @@ -67,8 +67,8 @@ NTSTATUS cli_dfs_exist(struct cli_state *cli, TALLOC_CTX *mem_ctx, } NTSTATUS cli_dfs_add(struct cli_state *cli, TALLOC_CTX *mem_ctx, - char *entrypath, char *servername, char *sharename, - char *comment, uint32 flags) + const char *entrypath, const char *servername, + const char *sharename, const char *comment, uint32 flags) { prs_struct qbuf, rbuf; DFS_Q_DFS_ADD q; @@ -111,7 +111,8 @@ NTSTATUS cli_dfs_add(struct cli_state *cli, TALLOC_CTX *mem_ctx, } NTSTATUS cli_dfs_remove(struct cli_state *cli, TALLOC_CTX *mem_ctx, - char *entrypath, char *servername, char *sharename) + const char *entrypath, const char *servername, + const char *sharename) { prs_struct qbuf, rbuf; DFS_Q_DFS_REMOVE q; @@ -153,8 +154,9 @@ NTSTATUS cli_dfs_remove(struct cli_state *cli, TALLOC_CTX *mem_ctx, } NTSTATUS cli_dfs_get_info(struct cli_state *cli, TALLOC_CTX *mem_ctx, - char *entrypath, char *servername, char *sharename, - uint32 info_level, DFS_INFO_CTR *ctr) + const char *entrypath, const char *servername, + const char *sharename, uint32 info_level, + DFS_INFO_CTR *ctr) { prs_struct qbuf, rbuf; diff --git a/source3/rpc_client/cli_lsarpc.c b/source3/rpc_client/cli_lsarpc.c index e878d02211..9002ad3d1b 100644 --- a/source3/rpc_client/cli_lsarpc.c +++ b/source3/rpc_client/cli_lsarpc.c @@ -805,7 +805,8 @@ NTSTATUS cli_lsa_enum_privilege(struct cli_state *cli, TALLOC_CTX *mem_ctx, /** Get privilege name */ NTSTATUS cli_lsa_get_dispname(struct cli_state *cli, TALLOC_CTX *mem_ctx, - POLICY_HND *pol, char *name, uint16 lang_id, uint16 lang_id_sys, + POLICY_HND *pol, const char *name, + uint16 lang_id, uint16 lang_id_sys, fstring description, uint16 *lang_id_desc) { prs_struct qbuf, rbuf; @@ -1050,7 +1051,7 @@ NTSTATUS cli_lsa_enum_privsaccount(struct cli_state *cli, TALLOC_CTX *mem_ctx, /** Get a privilege value given its name */ NTSTATUS cli_lsa_lookupprivvalue(struct cli_state *cli, TALLOC_CTX *mem_ctx, - POLICY_HND *pol, char *name, LUID *luid) + POLICY_HND *pol, const char *name, LUID *luid) { prs_struct qbuf, rbuf; LSA_Q_LOOKUPPRIVVALUE q; diff --git a/source3/rpc_client/cli_netlogon.c b/source3/rpc_client/cli_netlogon.c index b5ad798755..cbb09803af 100644 --- a/source3/rpc_client/cli_netlogon.c +++ b/source3/rpc_client/cli_netlogon.c @@ -489,7 +489,7 @@ NTSTATUS cli_netlogon_sam_deltas(struct cli_state *cli, TALLOC_CTX *mem_ctx, /* Logon domain user */ NTSTATUS cli_netlogon_sam_logon(struct cli_state *cli, TALLOC_CTX *mem_ctx, - char *username, char *password, + const char *username, const char *password, int logon_type) { prs_struct qbuf, rbuf; diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c index a1aa6664c1..bb6ce1b998 100644 --- a/source3/rpc_client/cli_spoolss.c +++ b/source3/rpc_client/cli_spoolss.c @@ -1243,8 +1243,8 @@ WERROR cli_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx, */ WERROR cli_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, - POLICY_HND *handle, uint32 level, char *form_name, - FORM *form) + POLICY_HND *handle, uint32 level, + const char *form_name, FORM *form) { prs_struct qbuf, rbuf; SPOOL_Q_SETFORM q; @@ -1305,8 +1305,8 @@ WERROR cli_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, WERROR cli_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, uint32 offered, uint32 *needed, - POLICY_HND *handle, char *formname, uint32 level, - FORM_1 *form) + POLICY_HND *handle, const char *formname, + uint32 level, FORM_1 *form) { prs_struct qbuf, rbuf; SPOOL_Q_GETFORM q; @@ -1377,7 +1377,7 @@ WERROR cli_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, */ WERROR cli_spoolss_deleteform(struct cli_state *cli, TALLOC_CTX *mem_ctx, - POLICY_HND *handle, char *form_name) + POLICY_HND *handle, const char *form_name) { prs_struct qbuf, rbuf; SPOOL_Q_DELETEFORM q; @@ -1899,7 +1899,7 @@ WERROR cli_spoolss_enddocprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, WERROR cli_spoolss_getprinterdata(struct cli_state *cli, TALLOC_CTX *mem_ctx, uint32 offered, uint32 *needed, - POLICY_HND *hnd, char *valuename, + POLICY_HND *hnd, const char *valuename, REGISTRY_VALUE *value) { prs_struct qbuf, rbuf; @@ -1953,8 +1953,9 @@ WERROR cli_spoolss_getprinterdata(struct cli_state *cli, TALLOC_CTX *mem_ctx, WERROR cli_spoolss_getprinterdataex(struct cli_state *cli, TALLOC_CTX *mem_ctx, uint32 offered, uint32 *needed, - POLICY_HND *hnd, char *keyname, - char *valuename, REGISTRY_VALUE *value) + POLICY_HND *hnd, const char *keyname, + const char *valuename, + REGISTRY_VALUE *value) { prs_struct qbuf, rbuf; SPOOL_Q_GETPRINTERDATAEX q; diff --git a/source3/rpc_client/cli_srvsvc.c b/source3/rpc_client/cli_srvsvc.c index b6c6b377ff..6cd18f2e43 100644 --- a/source3/rpc_client/cli_srvsvc.c +++ b/source3/rpc_client/cli_srvsvc.c @@ -230,9 +230,10 @@ WERROR cli_srvsvc_net_share_del(struct cli_state *cli, TALLOC_CTX *mem_ctx, } WERROR cli_srvsvc_net_share_add(struct cli_state *cli, TALLOC_CTX *mem_ctx, - char *netname, uint32 type, char *remark, - uint32 perms, uint32 max_uses, uint32 num_uses, - char *path, char *passwd) + const char *netname, uint32 type, + const char *remark, uint32 perms, + uint32 max_uses, uint32 num_uses, + const char *path, const char *passwd) { prs_struct qbuf, rbuf; SRV_Q_NET_SHARE_ADD q; diff --git a/source3/rpc_parse/parse_dfs.c b/source3/rpc_parse/parse_dfs.c index ccd6d429fa..6f13500359 100644 --- a/source3/rpc_parse/parse_dfs.c +++ b/source3/rpc_parse/parse_dfs.c @@ -76,8 +76,8 @@ BOOL dfs_io_r_dfs_exist(const char *desc, DFS_R_DFS_EXIST *q_d, prs_struct *ps, Make a DFS_Q_DFS_REMOVE structure *******************************************************************/ -BOOL init_dfs_q_dfs_remove(DFS_Q_DFS_REMOVE *q_d, char *entrypath, - char *servername, char *sharename) +BOOL init_dfs_q_dfs_remove(DFS_Q_DFS_REMOVE *q_d, const char *entrypath, + const char *servername, const char *sharename) { DEBUG(5,("init_dfs_q_dfs_remove\n")); init_unistr2(&q_d->DfsEntryPath, entrypath, strlen(entrypath)+1); @@ -149,8 +149,9 @@ BOOL dfs_io_r_dfs_remove(const char *desc, DFS_R_DFS_REMOVE *r_d, prs_struct *ps Make a DFS_Q_DFS_ADD structure *******************************************************************/ -BOOL init_dfs_q_dfs_add(DFS_Q_DFS_ADD *q_d, char *entrypath, char *servername, - char *sharename, char *comment, uint32 flags) +BOOL init_dfs_q_dfs_add(DFS_Q_DFS_ADD *q_d, const char *entrypath, + const char *servername, const char *sharename, + const char *comment, uint32 flags) { DEBUG(5,("init_dfs_q_dfs_add\n")); q_d->ptr_DfsEntryPath = q_d->ptr_ServerName = q_d->ptr_ShareName = 1; @@ -231,8 +232,8 @@ BOOL dfs_io_r_dfs_add(const char *desc, DFS_R_DFS_ADD *r_d, prs_struct *ps, int return True; } -BOOL init_dfs_q_dfs_get_info(DFS_Q_DFS_GET_INFO *q_d, char *entrypath, - char *servername, char *sharename, +BOOL init_dfs_q_dfs_get_info(DFS_Q_DFS_GET_INFO *q_d, const char *entrypath, + const char *servername, const char *sharename, uint32 info_level) { DEBUG(5,("init_dfs_q2_get_info\n")); diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index a34740f9ff..47737908f0 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -1202,7 +1202,7 @@ BOOL make_spoolss_q_deleteprinterdriver( BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u, const POLICY_HND *handle, - char *valuename, uint32 size) + const char *valuename, uint32 size) { if (q_u == NULL) return False; @@ -1221,7 +1221,8 @@ BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u, BOOL make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u, const POLICY_HND *handle, - char *keyname, char *valuename, uint32 size) + const char *keyname, + const char *valuename, uint32 size) { if (q_u == NULL) return False; @@ -7503,7 +7504,7 @@ BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle, ********************************************************************/ BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle, - int level, char *form_name, FORM *form) + int level, const char *form_name, FORM *form) { memcpy(&q_u->handle, handle, sizeof(POLICY_HND)); q_u->level = level; @@ -7518,7 +7519,8 @@ BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle, * init a structure. ********************************************************************/ -BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, char *form) +BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, + const char *form) { memcpy(&q_u->handle, handle, sizeof(POLICY_HND)); init_unistr2(&q_u->name, form, strlen(form) + 1); @@ -7530,8 +7532,8 @@ BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, char ********************************************************************/ BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle, - char *formname, uint32 level, NEW_BUFFER *buffer, - uint32 offered) + const char *formname, uint32 level, + NEW_BUFFER *buffer, uint32 offered) { memcpy(&q_u->handle, handle, sizeof(POLICY_HND)); q_u->level = level; diff --git a/source3/rpcclient/cmd_dfs.c b/source3/rpcclient/cmd_dfs.c index e3c4b77645..715174c824 100644 --- a/source3/rpcclient/cmd_dfs.c +++ b/source3/rpcclient/cmd_dfs.c @@ -25,7 +25,7 @@ /* Check DFS is supported by the remote server */ static NTSTATUS cmd_dfs_exist(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { BOOL dfs_exists; NTSTATUS result; @@ -44,10 +44,10 @@ static NTSTATUS cmd_dfs_exist(struct cli_state *cli, TALLOC_CTX *mem_ctx, } static NTSTATUS cmd_dfs_add(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result; - char *entrypath, *servername, *sharename, *comment; + const char *entrypath, *servername, *sharename, *comment; uint32 flags = 0; if (argc != 5) { @@ -68,10 +68,10 @@ static NTSTATUS cmd_dfs_add(struct cli_state *cli, TALLOC_CTX *mem_ctx, } static NTSTATUS cmd_dfs_remove(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result; - char *entrypath, *servername, *sharename; + const char *entrypath, *servername, *sharename; if (argc != 4) { printf("Usage: %s entrypath servername sharename\n", argv[0]); @@ -169,7 +169,7 @@ static void display_dfs_info_ctr(DFS_INFO_CTR *ctr) /* Enumerate dfs shares */ static NTSTATUS cmd_dfs_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { DFS_INFO_CTR ctr; NTSTATUS result; @@ -192,10 +192,10 @@ static NTSTATUS cmd_dfs_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx, } static NTSTATUS cmd_dfs_getinfo(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result; - char *entrypath, *servername, *sharename; + const char *entrypath, *servername, *sharename; uint32 info_level = 1; DFS_INFO_CTR ctr; diff --git a/source3/rpcclient/cmd_ds.c b/source3/rpcclient/cmd_ds.c index 946015c1e3..9de6d6a9ec 100644 --- a/source3/rpcclient/cmd_ds.c +++ b/source3/rpcclient/cmd_ds.c @@ -26,7 +26,7 @@ static NTSTATUS cmd_ds_dsrole_getprimarydominfo(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { NTSTATUS result; DS_DOMINFO_CTR ctr; diff --git a/source3/rpcclient/cmd_netlogon.c b/source3/rpcclient/cmd_netlogon.c index 53a926d52b..407bff3735 100644 --- a/source3/rpcclient/cmd_netlogon.c +++ b/source3/rpcclient/cmd_netlogon.c @@ -24,7 +24,7 @@ static NTSTATUS cmd_netlogon_logon_ctrl2(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { uint32 query_level = 1; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -47,7 +47,7 @@ static NTSTATUS cmd_netlogon_logon_ctrl2(struct cli_state *cli, static NTSTATUS cmd_netlogon_logon_ctrl(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { #if 0 uint32 query_level = 1; @@ -143,7 +143,7 @@ static void display_sam_sync(uint32 num_deltas, SAM_DELTA_HDR *hdr_deltas, static NTSTATUS cmd_netlogon_sam_sync(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; unsigned char trust_passwd[16]; @@ -204,7 +204,7 @@ static NTSTATUS cmd_netlogon_sam_sync(struct cli_state *cli, static NTSTATUS cmd_netlogon_sam_deltas(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; unsigned char trust_passwd[16]; @@ -266,12 +266,12 @@ static NTSTATUS cmd_netlogon_sam_deltas(struct cli_state *cli, static NTSTATUS cmd_netlogon_sam_logon(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { unsigned char trust_passwd[16]; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; int logon_type = NET_LOGON_TYPE; - char *username, *password; + const char *username, *password; uint32 neg_flags = 0x000001ff; int auth_level = 2; diff --git a/source3/rpcclient/cmd_reg.c b/source3/rpcclient/cmd_reg.c index 5d29b4c51a..19c0e7f71f 100644 --- a/source3/rpcclient/cmd_reg.c +++ b/source3/rpcclient/cmd_reg.c @@ -895,7 +895,7 @@ static void cmd_reg_get_key_sec(struct client_info *info) nt registry shutdown ****************************************************************************/ static NTSTATUS cmd_reg_shutdown(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; fstring msg; @@ -950,7 +950,7 @@ abort a shutdown ****************************************************************************/ static NTSTATUS cmd_reg_abort_shutdown(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c index 66f2e8dc99..9f6f539e19 100644 --- a/source3/rpcclient/cmd_spoolss.c +++ b/source3/rpcclient/cmd_spoolss.c @@ -86,7 +86,7 @@ BOOL get_short_archi(char *short_archi, const char *long_archi) */ static NTSTATUS cmd_spoolss_not_implemented(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { printf ("(*) This command is not currently implemented.\n"); return NT_STATUS_OK; @@ -98,7 +98,7 @@ static NTSTATUS cmd_spoolss_not_implemented(struct cli_state *cli, */ static NTSTATUS cmd_spoolss_open_printer_ex(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR werror; fstring printername; @@ -300,7 +300,7 @@ static void display_print_info_3(PRINTER_INFO_3 *i3) static NTSTATUS cmd_spoolss_enum_printers(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR result; uint32 info_level = 1; @@ -405,7 +405,7 @@ static void display_port_info_2(PORT_INFO_2 *i2) static NTSTATUS cmd_spoolss_enum_ports(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { WERROR result; uint32 needed, info_level = 1; @@ -457,7 +457,7 @@ static NTSTATUS cmd_spoolss_enum_ports(struct cli_state *cli, */ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND pol; WERROR result; @@ -527,7 +527,7 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, */ static NTSTATUS cmd_spoolss_getprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND pol; WERROR result; @@ -646,7 +646,7 @@ static void display_reg_value(REGISTRY_VALUE value) */ static NTSTATUS cmd_spoolss_getprinterdata(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND pol; WERROR result; @@ -655,7 +655,7 @@ static NTSTATUS cmd_spoolss_getprinterdata(struct cli_state *cli, servername, user; uint32 needed; - char *valuename; + const char *valuename; REGISTRY_VALUE value; if (argc != 3) { @@ -690,7 +690,7 @@ static NTSTATUS cmd_spoolss_getprinterdata(struct cli_state *cli, /* Get printer info */ result = cli_spoolss_getprinterdata(cli, mem_ctx, 0, &needed, - &pol, valuename, &value); + &pol, valuename, &value); if (W_ERROR_V(result) == ERRmoredata) result = cli_spoolss_getprinterdata( @@ -717,7 +717,7 @@ static NTSTATUS cmd_spoolss_getprinterdata(struct cli_state *cli, */ static NTSTATUS cmd_spoolss_getprinterdataex(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND pol; WERROR result; @@ -726,7 +726,7 @@ static NTSTATUS cmd_spoolss_getprinterdataex(struct cli_state *cli, servername, user; uint32 needed; - char *valuename, *keyname; + const char *valuename, *keyname; REGISTRY_VALUE value; if (argc != 4) { @@ -902,7 +902,7 @@ static void display_print_driver_3(DRIVER_INFO_3 *i1) */ static NTSTATUS cmd_spoolss_getdriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND pol; WERROR werror; @@ -992,7 +992,7 @@ static NTSTATUS cmd_spoolss_getdriver(struct cli_state *cli, */ static NTSTATUS cmd_spoolss_enum_drivers(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR werror; uint32 info_level = 1; @@ -1080,7 +1080,7 @@ static void display_printdriverdir_1(DRIVER_DIRECTORY_1 *i1) */ static NTSTATUS cmd_spoolss_getdriverdir(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR result; fstring env; @@ -1145,7 +1145,7 @@ void set_drv_info_3_env (DRIVER_INFO_3 *info, const char *arch) wrapper for strtok to get the next parameter from a delimited list. Needed to handle the empty parameter string denoted by "NULL" *************************************************************************/ -static char* get_driver_3_param (char* str, const char* delim, UNISTR* dest) +static char* get_driver_3_param (const char* str, const char* delim, UNISTR* dest) { char *ptr; @@ -1175,7 +1175,7 @@ static char* get_driver_3_param (char* str, const char* delim, UNISTR* dest) static BOOL init_drv_info_3_members ( TALLOC_CTX *mem_ctx, DRIVER_INFO_3 *info, - char *args + const char *args ) { char *str, *str2; @@ -1224,7 +1224,7 @@ static BOOL init_drv_info_3_members ( static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR result; uint32 level = 3; @@ -1277,7 +1277,7 @@ static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, static NTSTATUS cmd_spoolss_addprinterex(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR result; uint32 level = 2; @@ -1334,7 +1334,7 @@ static NTSTATUS cmd_spoolss_addprinterex(struct cli_state *cli, static NTSTATUS cmd_spoolss_setdriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND pol; WERROR result; @@ -1412,7 +1412,7 @@ done: static NTSTATUS cmd_spoolss_deletedriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR result; fstring servername; @@ -1454,7 +1454,7 @@ static NTSTATUS cmd_spoolss_deletedriver(struct cli_state *cli, static NTSTATUS cmd_spoolss_getprintprocdir(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR result; char *servername = NULL, *environment = NULL; @@ -1497,7 +1497,7 @@ static NTSTATUS cmd_spoolss_getprintprocdir(struct cli_state *cli, /* Add a form */ static NTSTATUS cmd_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND handle; WERROR werror; @@ -1556,7 +1556,7 @@ static NTSTATUS cmd_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx, /* Set a form */ static NTSTATUS cmd_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND handle; WERROR werror; @@ -1614,7 +1614,7 @@ static NTSTATUS cmd_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, /* Get a form */ static NTSTATUS cmd_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { POLICY_HND handle; WERROR werror; @@ -1678,7 +1678,7 @@ static NTSTATUS cmd_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, static NTSTATUS cmd_spoolss_deleteform(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND handle; WERROR werror; @@ -1725,7 +1725,7 @@ static NTSTATUS cmd_spoolss_deleteform(struct cli_state *cli, static NTSTATUS cmd_spoolss_enum_forms(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { POLICY_HND handle; WERROR werror; @@ -1793,7 +1793,7 @@ static NTSTATUS cmd_spoolss_enum_forms(struct cli_state *cli, static NTSTATUS cmd_spoolss_setprinterdata(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { WERROR result; uint32 needed; @@ -1912,7 +1912,7 @@ static void display_job_info_2(JOB_INFO_2 *job) static NTSTATUS cmd_spoolss_enum_jobs(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { WERROR result; uint32 needed, level = 1, num_jobs, i; @@ -1987,7 +1987,7 @@ done: static NTSTATUS cmd_spoolss_enum_data( struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { WERROR result; uint32 i=0, val_needed, data_needed; @@ -2046,14 +2046,14 @@ done: static NTSTATUS cmd_spoolss_enum_data_ex( struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { WERROR result; uint32 needed, i; BOOL got_hnd = False; pstring printername; fstring servername, user; - char *keyname = NULL; + const char *keyname = NULL; POLICY_HND hnd; REGVAL_CTR ctr; @@ -2111,7 +2111,7 @@ done: static NTSTATUS cmd_spoolss_enum_printerkey( struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { WERROR result; uint32 needed, returned; @@ -2183,7 +2183,7 @@ done: static NTSTATUS cmd_spoolss_rffpcnex(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, - char **argv) + const char **argv) { fstring servername, printername; POLICY_HND hnd; diff --git a/source3/rpcclient/cmd_srvsvc.c b/source3/rpcclient/cmd_srvsvc.c index 10fdfd7437..8597c7bc2e 100644 --- a/source3/rpcclient/cmd_srvsvc.c +++ b/source3/rpcclient/cmd_srvsvc.c @@ -181,7 +181,7 @@ static void display_srv_info_102(SRV_INFO_102 *sv102) /* Server query info */ static NTSTATUS cmd_srvsvc_srv_query_info(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { uint32 info_level = 101; SRV_INFO_CTR ctr; @@ -248,7 +248,7 @@ static void display_share_info_2(SRV_SHARE_INFO_2 *info2) static NTSTATUS cmd_srvsvc_net_share_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { uint32 info_level = 2; SRV_SHARE_INFO_CTR ctr; @@ -294,7 +294,7 @@ static NTSTATUS cmd_srvsvc_net_share_enum(struct cli_state *cli, static NTSTATUS cmd_srvsvc_net_remote_tod(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { TIME_OF_DAY_INFO tod; WERROR result; @@ -316,7 +316,7 @@ static NTSTATUS cmd_srvsvc_net_remote_tod(struct cli_state *cli, static NTSTATUS cmd_srvsvc_net_file_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { uint32 info_level = 3; SRV_FILE_INFO_CTR ctr; diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index 5803055598..127506fb39 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -304,7 +304,7 @@ static NTSTATUS cmd_listcommands(struct cli_state *cli, TALLOC_CTX *mem_ctx, /* Display help on commands */ static NTSTATUS cmd_help(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { struct cmd_list *tmp; struct cmd_set *tmp_set; @@ -381,7 +381,7 @@ static NTSTATUS cmd_debuglevel(struct cli_state *cli, TALLOC_CTX *mem_ctx, } static NTSTATUS cmd_quit(struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { exit(0); return NT_STATUS_OK; /* NOTREACHED */ diff --git a/source3/torture/samtest.c b/source3/torture/samtest.c index a1ccec098b..0de2e5d288 100644 --- a/source3/torture/samtest.c +++ b/source3/torture/samtest.c @@ -73,7 +73,7 @@ static NTSTATUS cmd_conf(struct samtest_state *sam, TALLOC_CTX *mem_ctx, /* Display help on commands */ static NTSTATUS cmd_help(struct samtest_state *st, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { struct cmd_list *tmp; struct cmd_set *tmp_set; diff --git a/source3/torture/vfstest.c b/source3/torture/vfstest.c index fd1f83109e..04f31656d3 100644 --- a/source3/torture/vfstest.c +++ b/source3/torture/vfstest.c @@ -124,7 +124,7 @@ static NTSTATUS cmd_conf(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, /* Display help on commands */ static NTSTATUS cmd_help(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, - int argc, char **argv) + int argc, const char **argv) { struct cmd_list *tmp; struct cmd_set *tmp_set; -- cgit From f9d577ac099974f58522c1c5c42e5804a62c8e0b Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 25 Feb 2003 23:35:25 +0000 Subject: Fix compiler warning. (This used to be commit 0308f24ad209a28799b36d041be2dc2be2b2dac8) --- source3/utils/profiles.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/utils/profiles.c b/source3/utils/profiles.c index b4087cf6cf..4f40b93810 100644 --- a/source3/utils/profiles.c +++ b/source3/utils/profiles.c @@ -391,7 +391,7 @@ typedef struct acl_struct { #define OFF(f) (0x1000 + (f) + 4) -void print_sid(DOM_SID *sid); +static void print_sid(DOM_SID *sid); int verbose = 1; DOM_SID old_sid, new_sid; -- cgit From b906a9df75b6bdc6fe166e9aa5a8aa398176a518 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Wed, 26 Feb 2003 00:52:41 +0000 Subject: Merge from appliance: >Another hopeful fix for CR#1168. Change the RPC used in querying >domain users from QueryDispInfo to EnumDomainUsers. Hopefully this >will fix the random dropouts that keep occuring when listing large >domains. > >My thought is that since QueryDispInfo is only used in the NT user >manager it may have a bug with large domains. A more commonly used >RPC may not have such problems. (This used to be commit 0501b7d0b12fa8063ffe6a9d4ecc3391d0c2f45d) --- source3/nsswitch/winbindd_rpc.c | 57 +++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/source3/nsswitch/winbindd_rpc.c b/source3/nsswitch/winbindd_rpc.c index 48f528f520..90d8e4f616 100644 --- a/source3/nsswitch/winbindd_rpc.c +++ b/source3/nsswitch/winbindd_rpc.c @@ -3,7 +3,7 @@ Winbind rpc backend functions - Copyright (C) Tim Potter 2000-2001 + Copyright (C) Tim Potter 2000-2001,2003 Copyright (C) Andrew Tridgell 2001 This program is free software; you can redistribute it and/or modify @@ -39,18 +39,17 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, POLICY_HND dom_pol; BOOL got_dom_pol = False; uint32 des_access = SEC_RIGHTS_MAXIMUM_ALLOWED; - int i, loop_count = 0; - int retry; + int i, start_idx, retry; DEBUG(3,("rpc: query_user_list\n")); *num_entries = 0; *info = NULL; - /* Get sam handle */ - retry = 0; do { + /* Get sam handle */ + if (!(hnd = cm_get_sam_handle(domain->name))) goto done; @@ -66,50 +65,39 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, got_dom_pol = True; - i = 0; + i = start_idx = 0; do { - SAM_DISPINFO_CTR ctr; - SAM_DISPINFO_1 info1; - uint32 count = 0, start=i, max_entries, max_size; - int j; TALLOC_CTX *ctx2; + char **dom_users; + uint32 num_dom_users, *dom_rids, j, size = 0xffff; + uint16 acb_mask = ACB_NORMAL; - ctr.sam.info1 = &info1; - - ctx2 = talloc_init("winbindd dispinfo"); - if (!ctx2) { + if (!(ctx2 = talloc_init("winbindd enum_users"))) { result = NT_STATUS_NO_MEMORY; goto done; - } - - get_query_dispinfo_params( - loop_count, &max_entries, &max_size); - - /* Query display info level 1 */ - result = cli_samr_query_dispinfo( - hnd->cli, ctx2, &dom_pol, &start, 1, &count, - max_entries, max_size, &ctr); + } - loop_count++; + result = cli_samr_enum_dom_users( + hnd->cli, ctx2, &dom_pol, &start_idx, acb_mask, + size, &dom_users, &dom_rids, &num_dom_users); - if (!NT_STATUS_IS_OK(result) && - !NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) break; + *num_entries += num_dom_users; - (*num_entries) += count; + *info = talloc_realloc( + mem_ctx, *info, + (*num_entries) * sizeof(WINBIND_USERINFO)); - /* now map the result into the WINBIND_USERINFO structure */ - (*info) = talloc_realloc(mem_ctx, *info, - (*num_entries)*sizeof(WINBIND_USERINFO)); if (!(*info)) { result = NT_STATUS_NO_MEMORY; talloc_destroy(ctx2); goto done; } - for (j=0;j Date: Wed, 26 Feb 2003 06:19:16 +0000 Subject: init_valid_table: Fix a memory leak that would lose the dynamically-created valid table every time the configuration was reloaded. (This used to be commit e42b237d980461caf2dd2a8f82c17bf674facb7d) --- source3/lib/util_unistr.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/source3/lib/util_unistr.c b/source3/lib/util_unistr.c index 522ab7eb40..c666155f9f 100644 --- a/source3/lib/util_unistr.c +++ b/source3/lib/util_unistr.c @@ -105,27 +105,34 @@ static int check_dos_char(smb_ucs2_t c) **/ void init_valid_table(void) { - static int initialised; static int mapped_file; int i; const char *allowed = ".!#$%&'()_-@^`~"; + uint8 *valid_file; - if (initialised && mapped_file) return; - initialised = 1; + if (mapped_file) { + /* Can't unmap files, so stick with what we have */ + return; + } - valid_table = map_file(lib_path("valid.dat"), 0x10000); - if (valid_table) { + valid_file = map_file(lib_path("valid.dat"), 0x10000); + if (valid_file) { + valid_table = valid_file; mapped_file = 1; return; } - /* Otherwise, using a dynamically loaded one. */ + /* Otherwise, we're using a dynamically created valid_table. + * It might need to be regenerated if the code page changed. + * We know that we're not using a mapped file, so we can + * free() the old one. */ if (valid_table) free(valid_table); DEBUG(2,("creating default valid table\n")); valid_table = malloc(0x10000); - for (i=0;i<128;i++) valid_table[i] = isalnum(i) || - strchr(allowed,i); + for (i=0;i<128;i++) + valid_table[i] = isalnum(i) || strchr(allowed,i); + for (;i<0x10000;i++) { smb_ucs2_t c; SSVAL(&c, 0, i); -- cgit From cee64b535355ed14aa8c9a30f51432563391ea34 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 26 Feb 2003 12:21:01 +0000 Subject: Kill RID-only and domain+RID madness from winbind. Now we deal with SIDs in almost all of winbind (a couple of limited exceptions remain, but I'm looking into them - they use non-winbind structs ATM). This has particular benifits in returning out-of-domain SIDs for group membership (Need to look into this a bit more) as well as general code quality. This also removes much of the complexity from the idmap interface, which now only deals with mapping IDs, not with SID->domain translations. Breifly tested, but needs more. Fixes some valgrind-found bugs from my previous commit. Winbind cache chagned to using SID strings in some places, as I could not follow exactly how to save and restore multiple packed sids properly. Andrew Bartlett (This used to be commit 9247cf08c40f016a924d600ac906cfc6a7016777) --- source3/nsswitch/winbindd.h | 28 +++--- source3/nsswitch/winbindd_ads.c | 178 ++++++++++++++++++---------------- source3/nsswitch/winbindd_cache.c | 159 +++++++++++++++++------------- source3/nsswitch/winbindd_group.c | 114 +++++++++++----------- source3/nsswitch/winbindd_idmap.c | 82 ---------------- source3/nsswitch/winbindd_idmap_tdb.c | 78 --------------- source3/nsswitch/winbindd_rpc.c | 93 ++++++++++++------ source3/nsswitch/winbindd_user.c | 56 +++++------ source3/nsswitch/winbindd_util.c | 29 +++++- 9 files changed, 377 insertions(+), 440 deletions(-) diff --git a/source3/nsswitch/winbindd.h b/source3/nsswitch/winbindd.h index a498b76626..8bd8a83748 100644 --- a/source3/nsswitch/winbindd.h +++ b/source3/nsswitch/winbindd.h @@ -63,7 +63,8 @@ struct getent_state { struct getpwent_user { fstring name; /* Account name */ fstring gecos; /* User information */ - uint32 user_rid, group_rid; /* NT user and group rids */ + DOM_SID user_sid; /* NT user and primary group SIDs */ + DOM_SID group_sid; }; /* Server state structure */ @@ -81,8 +82,8 @@ extern struct winbindd_state server_state; /* Server information */ typedef struct { char *acct_name; char *full_name; - uint32 user_rid; - uint32 group_rid; /* primary group */ + DOM_SID *user_sid; /* NT user and primary group SIDs */ + DOM_SID *group_sid; } WINBIND_USERINFO; /* Structures to hold per domain information */ @@ -138,6 +139,7 @@ struct winbindd_methods { /* convert one user or group name to a sid */ NTSTATUS (*name_to_sid)(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, const char *name, DOM_SID *sid, enum SID_NAME_USE *type); @@ -149,10 +151,10 @@ struct winbindd_methods { char **name, enum SID_NAME_USE *type); - /* lookup user info for a given rid */ + /* lookup user info for a given SID */ NTSTATUS (*query_user)(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, + DOM_SID *user_sid, WINBIND_USERINFO *user_info); /* lookup all groups that a user is a member of. The backend @@ -160,14 +162,15 @@ struct winbindd_methods { function */ NTSTATUS (*lookup_usergroups)(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, - uint32 *num_groups, uint32 **user_gids); + DOM_SID *user_sid, + uint32 *num_groups, DOM_SID ***user_gids); /* find all members of the group with the specified group_rid */ NTSTATUS (*lookup_groupmem)(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 group_rid, uint32 *num_names, - uint32 **rid_mem, char ***names, + DOM_SID *group_sid, + uint32 *num_names, + DOM_SID ***sid_mem, char ***names, uint32 **name_types); /* return the current global sequence number */ @@ -207,13 +210,6 @@ struct idmap_methods { BOOL (*get_uid_from_sid)(DOM_SID *sid, uid_t *uid); BOOL (*get_gid_from_sid)(DOM_SID *sid, gid_t *gid); - BOOL (*get_rid_from_uid)(uid_t uid, uint32 *user_rid, - struct winbindd_domain **domain); - BOOL (*get_rid_from_gid)(gid_t gid, uint32 *group_rid, - struct winbindd_domain **domain); - BOOL (*get_uid_from_rid)(const char *dom_name, uint32 rid, uid_t *uid); - BOOL (*get_gid_from_rid)(const char *dom_name, uint32 rid, gid_t *gid); - /* Called when backend is unloaded */ BOOL (*close)(void); /* Called to dump backend status */ diff --git a/source3/nsswitch/winbindd_ads.c b/source3/nsswitch/winbindd_ads.c index 22e4648f15..6c79e59bae 100644 --- a/source3/nsswitch/winbindd_ads.c +++ b/source3/nsswitch/winbindd_ads.c @@ -89,13 +89,6 @@ static ADS_STRUCT *ads_cached_connection(struct winbindd_domain *domain) return ads; } -/* useful utility */ -static void sid_from_rid(struct winbindd_domain *domain, uint32 rid, DOM_SID *sid) -{ - sid_copy(sid, &domain->sid); - sid_append_rid(sid, rid); -} - /* Query display info for a realm. This is the basic user list fn */ static NTSTATUS query_user_list(struct winbindd_domain *domain, @@ -144,7 +137,9 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) { char *name, *gecos; DOM_SID sid; - uint32 rid, group; + DOM_SID *sid2; + DOM_SID *group_sid; + uint32 group; uint32 atype; if (!ads_pull_uint32(ads, msg, "sAMAccountType", &atype) || @@ -164,15 +159,20 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, continue; } - if (!sid_peek_check_rid(&domain->sid, &sid, &rid)) { - DEBUG(1,("No rid for %s !?\n", name)); - continue; + sid2 = talloc(mem_ctx, sizeof(*sid2)); + if (!sid2) { + status = NT_STATUS_NO_MEMORY; + goto done; } + sid_copy(sid2, &sid); + + group_sid = rid_to_talloced_sid(domain, mem_ctx, group); + (*info)[i].acct_name = name; (*info)[i].full_name = gecos; - (*info)[i].user_rid = rid; - (*info)[i].group_rid = group; + (*info)[i].user_sid = sid2; + (*info)[i].group_sid = group_sid; i++; } @@ -297,6 +297,7 @@ static NTSTATUS enum_local_groups(struct winbindd_domain *domain, /* convert a single name to a sid in a domain */ static NTSTATUS name_to_sid(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, const char *name, DOM_SID *sid, enum SID_NAME_USE *type) @@ -329,13 +330,13 @@ static NTSTATUS sid_to_name(struct winbindd_domain *domain, } -/* convert a DN to a name, rid and name type +/* convert a DN to a name, SID and name type this might become a major speed bottleneck if groups have lots of users, in which case we could cache the results */ static BOOL dn_lookup(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx, const char *dn, - char **name, uint32 *name_type, uint32 *rid) + char **name, uint32 *name_type, DOM_SID *sid) { char *exp; void *res = NULL; @@ -343,7 +344,6 @@ static BOOL dn_lookup(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx, "objectSid", "sAMAccountType", NULL}; ADS_STATUS rc; uint32 atype; - DOM_SID sid; char *escaped_dn = escape_ldap_string_alloc(dn); if (!escaped_dn) { @@ -366,8 +366,7 @@ static BOOL dn_lookup(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx, } (*name_type) = ads_atype_map(atype); - if (!ads_pull_sid(ads, res, "objectSid", &sid) || - !sid_peek_rid(&sid, rid)) { + if (!ads_pull_sid(ads, res, "objectSid", sid)) { goto failed; } @@ -382,60 +381,63 @@ failed: /* Lookup user information from a rid */ static NTSTATUS query_user(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, + DOM_SID *sid, WINBIND_USERINFO *info) { ADS_STRUCT *ads = NULL; const char *attrs[] = {"userPrincipalName", "sAMAccountName", - "name", "objectSid", + "name", "primaryGroupID", NULL}; ADS_STATUS rc; int count; void *msg = NULL; char *exp; - DOM_SID sid; char *sidstr; + uint32 group_rid; NTSTATUS status = NT_STATUS_UNSUCCESSFUL; + DOM_SID *sid2; + fstring sid_string; DEBUG(3,("ads: query_user\n")); - sid_from_rid(domain, user_rid, &sid); - ads = ads_cached_connection(domain); if (!ads) goto done; - sidstr = sid_binstring(&sid); + sidstr = sid_binstring(sid); asprintf(&exp, "(objectSid=%s)", sidstr); rc = ads_search_retry(ads, &msg, exp, attrs); free(exp); free(sidstr); if (!ADS_ERR_OK(rc)) { - DEBUG(1,("query_user(rid=%d) ads_search: %s\n", user_rid, ads_errstr(rc))); + DEBUG(1,("query_user(sid=%s) ads_search: %s\n", sid_to_string(sid_string, sid), ads_errstr(rc))); goto done; } count = ads_count_replies(ads, msg); if (count != 1) { - DEBUG(1,("query_user(rid=%d): Not found\n", user_rid)); + DEBUG(1,("query_user(sid=%s): Not found\n", sid_to_string(sid_string, sid))); goto done; } info->acct_name = ads_pull_username(ads, mem_ctx, msg); info->full_name = ads_pull_string(ads, mem_ctx, msg, "name"); - if (!ads_pull_sid(ads, msg, "objectSid", &sid)) { - DEBUG(1,("No sid for %d !?\n", user_rid)); - goto done; - } - if (!ads_pull_uint32(ads, msg, "primaryGroupID", &info->group_rid)) { - DEBUG(1,("No primary group for %d !?\n", user_rid)); + + if (!ads_pull_uint32(ads, msg, "primaryGroupID", &group_rid)) { + DEBUG(1,("No primary group for %s !?\n", sid_to_string(sid_string, sid))); goto done; } - if (!sid_peek_check_rid(&domain->sid,&sid, &info->user_rid)) { - DEBUG(1,("No rid for %d !?\n", user_rid)); + sid2 = talloc(mem_ctx, sizeof(*sid2)); + if (!sid2) { + status = NT_STATUS_NO_MEMORY; goto done; } + sid_copy(sid2, sid); + + info->user_sid = sid2; + + info->group_sid = rid_to_talloced_sid(domain, mem_ctx, group_rid); status = NT_STATUS_OK; @@ -451,8 +453,8 @@ done: static NTSTATUS lookup_usergroups_alt(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, const char *user_dn, - uint32 primary_group, - uint32 *num_groups, uint32 **user_gids) + DOM_SID *primary_group, + uint32 *num_groups, DOM_SID ***user_gids) { ADS_STATUS rc; NTSTATUS status = NT_STATUS_UNSUCCESSFUL; @@ -489,47 +491,48 @@ static NTSTATUS lookup_usergroups_alt(struct winbindd_domain *domain, goto done; } - (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); + (*user_gids) = talloc_zero(mem_ctx, sizeof(**user_gids) * (count + 1)); (*user_gids)[0] = primary_group; *num_groups = 1; for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) { - uint32 rid; DOM_SID group_sid; - fstring sid_string; if (!ads_pull_sid(ads, msg, "objectSid", &group_sid)) { DEBUG(1,("No sid for this group ?!?\n")); continue; } - if (!sid_peek_check_rid(&domain->sid, &group_sid, &rid)) { - DEBUG(5,("sid for %s is out of domain or invalid\n", sid_to_string(sid_string, &group_sid))); - continue; - } - if (rid == primary_group) continue; + if (sid_equal(&group_sid, primary_group)) continue; - (*user_gids)[*num_groups] = rid; + (*user_gids)[*num_groups] = talloc(mem_ctx, sizeof(***user_gids)); + if (!(*user_gids)[*num_groups]) { + status = NT_STATUS_NO_MEMORY; + goto done; + } + + sid_copy((*user_gids)[*num_groups], &group_sid); + (*num_groups)++; } - if (res) ads_msgfree(ads, res); - if (msg) ads_msgfree(ads, msg); - status = NT_STATUS_OK; DEBUG(3,("ads lookup_usergroups (alt) for dn=%s\n", user_dn)); done: + if (res) ads_msgfree(ads, res); + if (msg) ads_msgfree(ads, msg); + return status; } /* Lookup groups a user is a member of. */ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, - uint32 *num_groups, uint32 **user_gids) + DOM_SID *sid, + uint32 *num_groups, DOM_SID ***user_gids) { ADS_STRUCT *ads = NULL; const char *attrs[] = {"distinguishedName", NULL}; @@ -541,27 +544,26 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, char *user_dn; DOM_SID *sids; int i; - uint32 primary_group; - DOM_SID sid; + DOM_SID *primary_group; + uint32 primary_group_rid; char *sidstr; + fstring sid_string; NTSTATUS status = NT_STATUS_UNSUCCESSFUL; DEBUG(3,("ads: lookup_usergroups\n")); *num_groups = 0; - sid_from_rid(domain, user_rid, &sid); - ads = ads_cached_connection(domain); if (!ads) goto done; - if (!(sidstr = sid_binstring(&sid))) { - DEBUG(1,("lookup_usergroups(rid=%d) sid_binstring returned NULL\n", user_rid)); + if (!(sidstr = sid_binstring(sid))) { + DEBUG(1,("lookup_usergroups(sid=%s) sid_binstring returned NULL\n", sid_to_string(sid_string, sid))); status = NT_STATUS_NO_MEMORY; goto done; } if (asprintf(&exp, "(objectSid=%s)", sidstr) == -1) { free(sidstr); - DEBUG(1,("lookup_usergroups(rid=%d) asprintf failed!\n", user_rid)); + DEBUG(1,("lookup_usergroups(sid=%s) asprintf failed!\n", sid_to_string(sid_string, sid))); status = NT_STATUS_NO_MEMORY; goto done; } @@ -571,13 +573,13 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, free(sidstr); if (!ADS_ERR_OK(rc)) { - DEBUG(1,("lookup_usergroups(rid=%d) ads_search: %s\n", user_rid, ads_errstr(rc))); + DEBUG(1,("lookup_usergroups(sid=%s) ads_search: %s\n", sid_to_string(sid_string, sid), ads_errstr(rc))); goto done; } user_dn = ads_pull_string(ads, mem_ctx, msg, "distinguishedName"); if (!user_dn) { - DEBUG(1,("lookup_usergroups(rid=%d) ads_search did not return a a distinguishedName!\n", user_rid)); + DEBUG(1,("lookup_usergroups(sid=%s) ads_search did not return a a distinguishedName!\n", sid_to_string(sid_string, sid))); goto done; } @@ -585,15 +587,17 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, rc = ads_search_retry_dn(ads, &msg, user_dn, attrs2); if (!ADS_ERR_OK(rc)) { - DEBUG(1,("lookup_usergroups(rid=%d) ads_search tokenGroups: %s\n", user_rid, ads_errstr(rc))); + DEBUG(1,("lookup_usergroups(sid=%s) ads_search tokenGroups: %s\n", sid_to_string(sid_string, sid), ads_errstr(rc))); goto done; } - if (!ads_pull_uint32(ads, msg, "primaryGroupID", &primary_group)) { - DEBUG(1,("%s: No primary group for rid=%d !?\n", domain->name, user_rid)); + if (!ads_pull_uint32(ads, msg, "primaryGroupID", &primary_group_rid)) { + DEBUG(1,("%s: No primary group for sid=%s !?\n", domain->name, sid_to_string(sid_string, sid))); goto done; } + primary_group = rid_to_talloced_sid(domain, mem_ctx, primary_group_rid); + count = ads_pull_sids(ads, mem_ctx, msg, "tokenGroups", &sids); if (msg) ads_msgfree(ads, msg); @@ -602,25 +606,30 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, unless we are talking to a buggy Win2k server */ if (count == 0) { return lookup_usergroups_alt(domain, mem_ctx, user_dn, - primary_group, - num_groups, user_gids); + primary_group, + num_groups, user_gids); } - (*user_gids) = (uint32 *)talloc_zero(mem_ctx, sizeof(uint32) * (count + 1)); + (*user_gids) = talloc_zero(mem_ctx, sizeof(**user_gids) * (count + 1)); (*user_gids)[0] = primary_group; *num_groups = 1; for (i=0;isid, &sids[i-1], &rid)) continue; - if (rid == primary_group) continue; - (*user_gids)[*num_groups] = rid; + if (sid_equal(&sids[i], primary_group)) continue; + + (*user_gids)[*num_groups] = talloc(mem_ctx, sizeof(***user_gids)); + if (!(*user_gids)[*num_groups]) { + status = NT_STATUS_NO_MEMORY; + goto done; + } + + sid_copy((*user_gids)[*num_groups], &sids[i]); (*num_groups)++; } status = NT_STATUS_OK; - DEBUG(3,("ads lookup_usergroups for rid=%d\n", user_rid)); + DEBUG(3,("ads lookup_usergroups for sid=%s\n", sid_to_string(sid_string, sid))); done: return status; } @@ -630,11 +639,10 @@ done: */ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 group_rid, uint32 *num_names, - uint32 **rid_mem, char ***names, + DOM_SID *group_sid, uint32 *num_names, + DOM_SID ***sid_mem, char ***names, uint32 **name_types) { - DOM_SID group_sid; ADS_STATUS rc; int count; void *res=NULL; @@ -645,14 +653,14 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, const char *attrs[] = {"member", NULL}; char **members; int i, num_members; + fstring sid_string; *num_names = 0; ads = ads_cached_connection(domain); if (!ads) goto done; - sid_from_rid(domain, group_rid, &group_sid); - sidstr = sid_binstring(&group_sid); + sidstr = sid_binstring(group_sid); /* search for all members of the group */ asprintf(&exp, "(objectSid=%s)",sidstr); @@ -684,24 +692,30 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, for (i=0;members[i];i++) /* noop */ ; num_members = i; - (*rid_mem) = talloc_zero(mem_ctx, sizeof(uint32) * num_members); - (*name_types) = talloc_zero(mem_ctx, sizeof(uint32) * num_members); - (*names) = talloc_zero(mem_ctx, sizeof(char *) * num_members); + (*sid_mem) = talloc_zero(mem_ctx, sizeof(**sid_mem) * num_members); + (*name_types) = talloc_zero(mem_ctx, sizeof(**name_types) * num_members); + (*names) = talloc_zero(mem_ctx, sizeof(**names) * num_members); for (i=0;iofs += len; } +static void centry_put_sid(struct cache_entry *centry, const DOM_SID *sid) +{ + int len; + fstring sid_string; + centry_put_string(centry, sid_to_string(sid_string, sid)); +} + /* start a centry for output. When finished, call centry_end() */ @@ -393,6 +420,7 @@ struct cache_entry *centry_start(struct winbindd_domain *domain, NTSTATUS status /* finish a centry and write it to the tdb */ +static void centry_end(struct cache_entry *centry, const char *format, ...) PRINTF_ATTRIBUTE(2,3); static void centry_end(struct cache_entry *centry, const char *format, ...) { va_list ap; @@ -412,39 +440,30 @@ static void centry_end(struct cache_entry *centry, const char *format, ...) free(kstr); } -/* form a sid from the domain plus rid */ -static DOM_SID *form_sid(struct winbindd_domain *domain, uint32 rid) -{ - static DOM_SID sid; - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, rid); - return &sid; -} - -static void wcache_save_name_to_sid(struct winbindd_domain *domain, NTSTATUS status, - const char *name, DOM_SID *sid, enum SID_NAME_USE type) +static void wcache_save_name_to_sid(struct winbindd_domain *domain, + NTSTATUS status, + const char *name, DOM_SID *sid, + enum SID_NAME_USE type) { struct cache_entry *centry; uint32 len; fstring uname; + fstring sid_string; centry = centry_start(domain, status); if (!centry) return; - len = sid_size(sid); - centry_expand(centry, len); - centry_put_uint32(centry, type); - sid_linearize(centry->data + centry->ofs, len, sid); - centry->ofs += len; + centry_put_sid(centry, sid); fstrcpy(uname, name); strupper(uname); - centry_end(centry, "NS/%s/%s", domain->name, uname); + centry_end(centry, "NS/%s", sid_to_string(sid_string, sid)); centry_free(centry); } static void wcache_save_sid_to_name(struct winbindd_domain *domain, NTSTATUS status, - DOM_SID *sid, const char *name, enum SID_NAME_USE type, uint32 rid) + DOM_SID *sid, const char *name, enum SID_NAME_USE type) { struct cache_entry *centry; + fstring sid_string; centry = centry_start(domain, status); if (!centry) return; @@ -452,7 +471,7 @@ static void wcache_save_sid_to_name(struct winbindd_domain *domain, NTSTATUS sta centry_put_uint32(centry, type); centry_put_string(centry, name); } - centry_end(centry, "SN/%s/%d", domain->name, rid); + centry_end(centry, "SN/%s", sid_to_string(sid_string, sid)); centry_free(centry); } @@ -460,14 +479,15 @@ static void wcache_save_sid_to_name(struct winbindd_domain *domain, NTSTATUS sta static void wcache_save_user(struct winbindd_domain *domain, NTSTATUS status, WINBIND_USERINFO *info) { struct cache_entry *centry; + fstring sid_string; centry = centry_start(domain, status); if (!centry) return; centry_put_string(centry, info->acct_name); centry_put_string(centry, info->full_name); - centry_put_uint32(centry, info->user_rid); - centry_put_uint32(centry, info->group_rid); - centry_end(centry, "U/%s/%d", domain->name, info->user_rid); + centry_put_sid(centry, info->user_sid); + centry_put_sid(centry, info->group_sid); + centry_end(centry, "U/%s", sid_to_string(sid_string, info->user_sid)); centry_free(centry); } @@ -481,7 +501,7 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, struct winbind_cache *cache = get_cache(domain); struct cache_entry *centry = NULL; NTSTATUS status; - int i; + unsigned int i; if (!cache->tdb) goto do_query; @@ -497,8 +517,8 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, for (i=0; i<(*num_entries); i++) { (*info)[i].acct_name = centry_string(centry, mem_ctx); (*info)[i].full_name = centry_string(centry, mem_ctx); - (*info)[i].user_rid = centry_uint32(centry); - (*info)[i].group_rid = centry_uint32(centry); + (*info)[i].user_sid = centry_sid(centry, mem_ctx); + (*info)[i].group_sid = centry_sid(centry, mem_ctx); } do_cached: @@ -524,18 +544,18 @@ do_query: for (i=0; i<(*num_entries); i++) { centry_put_string(centry, (*info)[i].acct_name); centry_put_string(centry, (*info)[i].full_name); - centry_put_uint32(centry, (*info)[i].user_rid); - centry_put_uint32(centry, (*info)[i].group_rid); + centry_put_sid(centry, (*info)[i].user_sid); + centry_put_sid(centry, (*info)[i].group_sid); if (cache->backend->consistent) { /* when the backend is consistent we can pre-prime some mappings */ wcache_save_name_to_sid(domain, NT_STATUS_OK, (*info)[i].acct_name, - form_sid(domain, (*info)[i].user_rid), + (*info)[i].user_sid, SID_NAME_USER); wcache_save_sid_to_name(domain, NT_STATUS_OK, - form_sid(domain, (*info)[i].user_rid), + (*info)[i].user_sid, (*info)[i].acct_name, - SID_NAME_USER, (*info)[i].user_rid); + SID_NAME_USER); wcache_save_user(domain, NT_STATUS_OK, &(*info)[i]); } } @@ -555,7 +575,7 @@ static NTSTATUS enum_dom_groups(struct winbindd_domain *domain, struct winbind_cache *cache = get_cache(domain); struct cache_entry *centry = NULL; NTSTATUS status; - int i; + unsigned int i; if (!cache->tdb) goto do_query; @@ -615,7 +635,7 @@ static NTSTATUS enum_local_groups(struct winbindd_domain *domain, struct winbind_cache *cache = get_cache(domain); struct cache_entry *centry = NULL; NTSTATUS status; - int i; + unsigned int i; if (!cache->tdb) goto do_query; @@ -669,7 +689,7 @@ do_query: centry_put_string(centry, (*info)[i].acct_name); centry_put_string(centry, (*info)[i].acct_desc); centry_put_uint32(centry, (*info)[i].rid); - } + } centry_end(centry, "GL/%s/local", domain->name); centry_free(centry); @@ -679,6 +699,7 @@ skip_save: /* convert a single name to a sid in a domain */ static NTSTATUS name_to_sid(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, const char *name, DOM_SID *sid, enum SID_NAME_USE *type) @@ -687,6 +708,7 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain, struct cache_entry *centry = NULL; NTSTATUS status; fstring uname; + DOM_SID *sid2; if (!cache->tdb) goto do_query; @@ -695,7 +717,12 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain, centry = wcache_fetch(cache, domain, "NS/%s/%s", domain->name, uname); if (!centry) goto do_query; *type = centry_uint32(centry); - sid_parse(centry->data + centry->ofs, centry->len - centry->ofs, sid); + sid2 = centry_sid(centry, mem_ctx); + if (!sid2) { + ZERO_STRUCTP(sid); + } else { + sid_copy(sid, sid2); + } status = centry->status; centry_free(centry); @@ -707,7 +734,7 @@ do_query: if (wcache_server_down(domain)) { return NT_STATUS_SERVER_DISABLED; } - status = cache->backend->name_to_sid(domain, name, sid, type); + status = cache->backend->name_to_sid(domain, mem_ctx, name, sid, type); /* and save it */ wcache_save_name_to_sid(domain, status, name, sid, *type); @@ -729,14 +756,11 @@ static NTSTATUS sid_to_name(struct winbindd_domain *domain, struct winbind_cache *cache = get_cache(domain); struct cache_entry *centry = NULL; NTSTATUS status; - uint32 rid = 0; - - if (!sid_peek_check_rid(&domain->sid, sid, &rid)) - return NT_STATUS_INVALID_PARAMETER; + fstring sid_string; if (!cache->tdb) goto do_query; - centry = wcache_fetch(cache, domain, "SN/%s/%d", domain->name, rid); + centry = wcache_fetch(cache, domain, "SN/%s", sid_to_string(sid_string, sid)); if (!centry) goto do_query; if (NT_STATUS_IS_OK(centry->status)) { *type = centry_uint32(centry); @@ -756,7 +780,7 @@ do_query: /* and save it */ refresh_sequence_number(domain, True); - wcache_save_sid_to_name(domain, status, sid, *name, *type, rid); + wcache_save_sid_to_name(domain, status, sid, *name, *type); wcache_save_name_to_sid(domain, status, *name, sid, *type); return status; @@ -766,22 +790,23 @@ do_query: /* Lookup user information from a rid */ static NTSTATUS query_user(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, + DOM_SID *user_sid, WINBIND_USERINFO *info) { struct winbind_cache *cache = get_cache(domain); struct cache_entry *centry = NULL; NTSTATUS status; + fstring sid_string; if (!cache->tdb) goto do_query; - centry = wcache_fetch(cache, domain, "U/%s/%d", domain->name, user_rid); + centry = wcache_fetch(cache, domain, "U/%s", sid_to_string(sid_string, user_sid)); if (!centry) goto do_query; info->acct_name = centry_string(centry, mem_ctx); info->full_name = centry_string(centry, mem_ctx); - info->user_rid = centry_uint32(centry); - info->group_rid = centry_uint32(centry); + info->user_sid = centry_sid(centry, mem_ctx); + info->group_sid = centry_sid(centry, mem_ctx); status = centry->status; centry_free(centry); return status; @@ -793,7 +818,7 @@ do_query: return NT_STATUS_SERVER_DISABLED; } - status = cache->backend->query_user(domain, mem_ctx, user_rid, info); + status = cache->backend->query_user(domain, mem_ctx, user_sid, info); /* and save it */ refresh_sequence_number(domain, True); @@ -806,17 +831,18 @@ do_query: /* Lookup groups a user is a member of. */ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, - uint32 *num_groups, uint32 **user_gids) + DOM_SID *user_sid, + uint32 *num_groups, DOM_SID ***user_gids) { struct winbind_cache *cache = get_cache(domain); struct cache_entry *centry = NULL; NTSTATUS status; - int i; + unsigned int i; + fstring sid_string; if (!cache->tdb) goto do_query; - centry = wcache_fetch(cache, domain, "UG/%s/%d", domain->name, user_rid); + centry = wcache_fetch(cache, domain, "UG/%s", sid_to_string(sid_string, user_sid)); if (!centry) goto do_query; *num_groups = centry_uint32(centry); @@ -826,7 +852,7 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, (*user_gids) = talloc(mem_ctx, sizeof(**user_gids) * (*num_groups)); if (! (*user_gids)) smb_panic("lookup_usergroups out of memory"); for (i=0; i<(*num_groups); i++) { - (*user_gids)[i] = centry_uint32(centry); + (*user_gids)[i] = centry_sid(centry, mem_ctx); } do_cached: @@ -841,7 +867,7 @@ do_query: if (wcache_server_down(domain)) { return NT_STATUS_SERVER_DISABLED; } - status = cache->backend->lookup_usergroups(domain, mem_ctx, user_rid, num_groups, user_gids); + status = cache->backend->lookup_usergroups(domain, mem_ctx, user_sid, num_groups, user_gids); /* and save it */ refresh_sequence_number(domain, True); @@ -849,9 +875,9 @@ do_query: if (!centry) goto skip_save; centry_put_uint32(centry, *num_groups); for (i=0; i<(*num_groups); i++) { - centry_put_uint32(centry, (*user_gids)[i]); + centry_put_sid(centry, (*user_gids)[i]); } - centry_end(centry, "UG/%s/%d", domain->name, user_rid); + centry_end(centry, "UG/%s", sid_to_string(sid_string, user_sid)); centry_free(centry); skip_save: @@ -861,34 +887,35 @@ skip_save: static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 group_rid, uint32 *num_names, - uint32 **rid_mem, char ***names, + DOM_SID *group_sid, uint32 *num_names, + DOM_SID ***sid_mem, char ***names, uint32 **name_types) { struct winbind_cache *cache = get_cache(domain); struct cache_entry *centry = NULL; NTSTATUS status; - int i; + unsigned int i; + fstring sid_string; if (!cache->tdb) goto do_query; - centry = wcache_fetch(cache, domain, "GM/%s/%d", domain->name, group_rid); + centry = wcache_fetch(cache, domain, "GM/%s", sid_to_string(sid_string, group_sid)); if (!centry) goto do_query; *num_names = centry_uint32(centry); if (*num_names == 0) goto do_cached; - (*rid_mem) = talloc(mem_ctx, sizeof(**rid_mem) * (*num_names)); + (*sid_mem) = talloc(mem_ctx, sizeof(**sid_mem) * (*num_names)); (*names) = talloc(mem_ctx, sizeof(**names) * (*num_names)); (*name_types) = talloc(mem_ctx, sizeof(**name_types) * (*num_names)); - if (! (*rid_mem) || ! (*names) || ! (*name_types)) { + if (! (*sid_mem) || ! (*names) || ! (*name_types)) { smb_panic("lookup_groupmem out of memory"); } for (i=0; i<(*num_names); i++) { - (*rid_mem)[i] = centry_uint32(centry); + (*sid_mem)[i] = centry_sid(centry, mem_ctx); (*names)[i] = centry_string(centry, mem_ctx); (*name_types)[i] = centry_uint32(centry); } @@ -900,7 +927,7 @@ do_cached: do_query: (*num_names) = 0; - (*rid_mem) = NULL; + (*sid_mem) = NULL; (*names) = NULL; (*name_types) = NULL; @@ -908,8 +935,8 @@ do_query: if (wcache_server_down(domain)) { return NT_STATUS_SERVER_DISABLED; } - status = cache->backend->lookup_groupmem(domain, mem_ctx, group_rid, num_names, - rid_mem, names, name_types); + status = cache->backend->lookup_groupmem(domain, mem_ctx, group_sid, num_names, + sid_mem, names, name_types); /* and save it */ refresh_sequence_number(domain, True); @@ -917,11 +944,11 @@ do_query: if (!centry) goto skip_save; centry_put_uint32(centry, *num_names); for (i=0; i<(*num_names); i++) { - centry_put_uint32(centry, (*rid_mem)[i]); + centry_put_sid(centry, (*sid_mem)[i]); centry_put_string(centry, (*names)[i]); centry_put_uint32(centry, (*name_types)[i]); } - centry_end(centry, "GM/%s/%d", domain->name, group_rid); + centry_end(centry, "GM/%s", sid_to_string(sid_string, group_sid)); centry_free(centry); skip_save: diff --git a/source3/nsswitch/winbindd_group.c b/source3/nsswitch/winbindd_group.c index 94a826fbbc..d06db5943c 100644 --- a/source3/nsswitch/winbindd_group.c +++ b/source3/nsswitch/winbindd_group.c @@ -49,43 +49,44 @@ static BOOL fill_grent(struct winbindd_gr *gr, const char *dom_name, return True; } -/* Fill in the group membership field of a NT group given by group_rid */ +/* Fill in the group membership field of a NT group given by group_sid */ static BOOL fill_grent_mem(struct winbindd_domain *domain, - uint32 group_rid, + DOM_SID *group_sid, enum SID_NAME_USE group_name_type, int *num_gr_mem, char **gr_mem, int *gr_mem_len) { - uint32 *rid_mem = NULL, num_names = 0; + DOM_SID **sid_mem = NULL; + uint32 num_names = 0; uint32 *name_types = NULL; - int buf_len, buf_ndx, i; + unsigned int buf_len, buf_ndx, i; char **names = NULL, *buf; BOOL result = False; TALLOC_CTX *mem_ctx; NTSTATUS status; + fstring sid_string; if (!(mem_ctx = talloc_init("fill_grent_mem(%s)", domain->name))) return False; /* Initialise group membership information */ - DEBUG(10, ("group %s rid 0x%x\n", domain ? domain->name : "NULL", - group_rid)); + DEBUG(10, ("group SID %s\n", sid_to_string(sid_string, group_sid))); *num_gr_mem = 0; if (group_name_type != SID_NAME_DOM_GRP) { - DEBUG(1, ("rid %d in domain %s isn't a domain group\n", - group_rid, domain->name)); + DEBUG(1, ("SID %s in domain %s isn't a domain group\n", + sid_to_string(sid_string, group_sid), domain->name)); goto done; } /* Lookup group members */ - status = domain->methods->lookup_groupmem(domain, mem_ctx, group_rid, &num_names, - &rid_mem, &names, &name_types); + status = domain->methods->lookup_groupmem(domain, mem_ctx, group_sid, &num_names, + &sid_mem, &names, &name_types); if (!NT_STATUS_IS_OK(status)) { - DEBUG(1, ("could not lookup membership for group rid %d in domain %s (error: %s)\n", - group_rid, domain->name, nt_errstr(status))); + DEBUG(1, ("could not lookup membership for group rid %s in domain %s (error: %s)\n", + sid_to_string(sid_string, group_sid), domain->name, nt_errstr(status))); goto done; } @@ -94,7 +95,7 @@ static BOOL fill_grent_mem(struct winbindd_domain *domain, if (DEBUGLEVEL >= 10) { for (i = 0; i < num_names; i++) - DEBUG(10, ("\t%20s %x %d\n", names[i], rid_mem[i], + DEBUG(10, ("\t%20s %s %d\n", names[i], sid_to_string(sid_string, sid_mem[i]), name_types[i])); } @@ -190,7 +191,6 @@ enum winbindd_result winbindd_getgrnam(struct winbindd_cli_state *state) DOM_SID group_sid; struct winbindd_domain *domain; enum SID_NAME_USE name_type; - uint32 group_rid; fstring name_domain, name_group; char *tmp, *gr_mem; gid_t gid; @@ -233,10 +233,6 @@ enum winbindd_result winbindd_getgrnam(struct winbindd_cli_state *state) return WINBINDD_ERROR; } - /* Fill in group structure */ - if (!sid_peek_check_rid(&domain->sid, &group_sid, &group_rid)) - return WINBINDD_ERROR; - if (!winbindd_idmap_get_gid_from_sid(&group_sid, &gid)) { DEBUG(1, ("error converting unix gid to sid\n")); return WINBINDD_ERROR; @@ -244,7 +240,7 @@ enum winbindd_result winbindd_getgrnam(struct winbindd_cli_state *state) if (!fill_grent(&state->response.data.gr, name_domain, name_group, gid) || - !fill_grent_mem(domain, group_rid, name_type, + !fill_grent_mem(domain, &group_sid, name_type, &state->response.data.gr.num_gr_mem, &gr_mem, &gr_mem_len)) { return WINBINDD_ERROR; @@ -269,7 +265,6 @@ enum winbindd_result winbindd_getgrgid(struct winbindd_cli_state *state) enum SID_NAME_USE name_type; fstring dom_name; fstring group_name; - uint32 group_rid; int gr_mem_len; char *gr_mem; @@ -284,17 +279,13 @@ enum winbindd_result winbindd_getgrgid(struct winbindd_cli_state *state) /* Get rid from gid */ - if (!winbindd_idmap_get_rid_from_gid(state->request.data.gid, - &group_rid, &domain)) { + if (!winbindd_idmap_get_sid_from_gid(state->request.data.gid, &group_sid)) { DEBUG(1, ("could not convert gid %d to rid\n", state->request.data.gid)); return WINBINDD_ERROR; } - /* Get sid from gid */ - - sid_copy(&group_sid, &domain->sid); - sid_append_rid(&group_sid, group_rid); + /* Get name from sid */ if (!winbindd_lookup_name_by_sid(&group_sid, dom_name, group_name, &name_type)) { DEBUG(1, ("could not lookup sid\n")); @@ -310,9 +301,16 @@ enum winbindd_result winbindd_getgrgid(struct winbindd_cli_state *state) /* Fill in group structure */ + domain = find_domain_from_sid(&group_sid); + + if (!domain) { + DEBUG(1,("Can't find domain from sid\n")); + return WINBINDD_ERROR; + } + if (!fill_grent(&state->response.data.gr, dom_name, group_name, state->request.data.gid) || - !fill_grent_mem(domain, group_rid, name_type, + !fill_grent_mem(domain, &group_sid, name_type, &state->response.data.gr.num_gr_mem, &gr_mem, &gr_mem_len)) return WINBINDD_ERROR; @@ -544,7 +542,9 @@ enum winbindd_result winbindd_getgrent(struct winbindd_cli_state *state) gid_t group_gid; int gr_mem_len; char *gr_mem, *new_gr_mem_list; - + DOM_SID group_sid; + struct winbindd_domain *domain; + /* Do we need to fetch another chunk of groups? */ tryagain: @@ -578,16 +578,25 @@ enum winbindd_result winbindd_getgrent(struct winbindd_cli_state *state) name_list = ent->sam_entries; + if (!(domain = + find_domain_from_name(ent->domain_name))) { + DEBUG(3, ("No such domain %s in winbindd_getgrent\n", ent->domain_name)); + result = False; + goto done; + } + /* Lookup group info */ - if (!winbindd_idmap_get_gid_from_rid( - ent->domain_name, - name_list[ent->sam_entry_index].rid, - &group_gid)) { + sid_copy(&group_sid, &domain->sid); + sid_append_rid(&group_sid, name_list[ent->sam_entry_index].rid); + + if (!winbindd_idmap_get_gid_from_sid( + &group_sid, + &group_gid)) { DEBUG(1, ("could not look up gid for group %s\n", name_list[ent->sam_entry_index].acct_name)); - + ent->sam_entry_index++; goto tryagain; } @@ -608,15 +617,7 @@ enum winbindd_result winbindd_getgrent(struct winbindd_cli_state *state) /* Fill in group membership entry */ if (result) { - struct winbindd_domain *domain; - - if (!(domain = - find_domain_from_name(ent->domain_name))) { - DEBUG(3, ("No such domain %s in winbindd_getgrent\n", ent->domain_name)); - result = False; - goto done; - } - + DOM_SID member_sid; group_list[group_list_ndx].num_gr_mem = 0; gr_mem = NULL; gr_mem_len = 0; @@ -625,9 +626,11 @@ enum winbindd_result winbindd_getgrent(struct winbindd_cli_state *state) if (state->request.cmd == WINBINDD_GETGRLST) { result = True; } else { + sid_copy(&member_sid, &domain->sid); + sid_append_rid(&member_sid, name_list[ent->sam_entry_index].rid); result = fill_grent_mem( domain, - name_list[ent->sam_entry_index].rid, + &member_sid, SID_NAME_DOM_GRP, &group_list[group_list_ndx].num_gr_mem, &gr_mem, &gr_mem_len); @@ -730,7 +733,7 @@ enum winbindd_result winbindd_list_groups(struct winbindd_cli_state *state) struct winbindd_domain *domain; char *extra_data = NULL; char *ted = NULL; - int extra_data_len = 0, i; + unsigned int extra_data_len = 0, i; DEBUG(3, ("[%5d]: list groups\n", state->pid)); @@ -805,13 +808,13 @@ enum winbindd_result winbindd_getgroups(struct winbindd_cli_state *state) fstring name_domain, name_user; DOM_SID user_sid; enum SID_NAME_USE name_type; - uint32 user_rid, num_groups, num_gids; + uint32 num_groups, num_gids; NTSTATUS status; - uint32 *user_gids; + DOM_SID **user_gids; struct winbindd_domain *domain; enum winbindd_result result = WINBINDD_ERROR; gid_t *gid_list; - int i; + unsigned int i; TALLOC_CTX *mem_ctx; /* Ensure null termination */ @@ -852,9 +855,9 @@ enum winbindd_result winbindd_getgroups(struct winbindd_cli_state *state) goto done; } - sid_split_rid(&user_sid, &user_rid); - - status = domain->methods->lookup_usergroups(domain, mem_ctx, user_rid, &num_groups, &user_gids); + status = domain->methods->lookup_usergroups(domain, mem_ctx, + &user_sid, &num_groups, + &user_gids); if (!NT_STATUS_IS_OK(status)) goto done; /* Copy data back to client */ @@ -866,12 +869,13 @@ enum winbindd_result winbindd_getgroups(struct winbindd_cli_state *state) goto done; for (i = 0; i < num_groups; i++) { - if (!winbindd_idmap_get_gid_from_rid(domain->name, - user_gids[i], - &gid_list[num_gids])) { + if (!winbindd_idmap_get_gid_from_sid( + user_gids[i], + &gid_list[num_gids])) { + fstring sid_string; - DEBUG(1, ("unable to convert group rid %d to gid\n", - user_gids[i])); + DEBUG(1, ("unable to convert group sid %s to gid\n", + sid_to_string(sid_string, user_gids[i]))); continue; } diff --git a/source3/nsswitch/winbindd_idmap.c b/source3/nsswitch/winbindd_idmap.c index 0a17fcd87f..de547cde41 100644 --- a/source3/nsswitch/winbindd_idmap.c +++ b/source3/nsswitch/winbindd_idmap.c @@ -121,48 +121,6 @@ BOOL winbindd_idmap_get_gid_from_sid(DOM_SID *sid, gid_t *gid) return ret; } -/* Get UID from RID */ -BOOL winbindd_idmap_get_uid_from_rid(const char *dom_name, uint32 rid, - uid_t *uid) -{ - BOOL ret = False; - - if (!impl) { - impl = get_impl(lp_idmap_backend()); - if (!impl) { - DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_idmap_backend())); - } - } - - if (impl) { - ret = impl->get_uid_from_rid(dom_name, rid, uid); - } - - return ret; -} - -/* Get GID From RID */ -BOOL winbindd_idmap_get_gid_from_rid(const char *dom_name, uint32 rid, - gid_t *gid) -{ - BOOL ret = False; - - if (!impl) { - impl = get_impl(lp_idmap_backend()); - if (!impl) { - DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_idmap_backend())); - } - } - - if (impl) { - ret = impl->get_gid_from_rid(dom_name, rid, gid); - } - - return ret; -} - /* Get SID from UID */ BOOL winbindd_idmap_get_sid_from_uid(uid_t uid, DOM_SID *sid) { @@ -202,46 +160,6 @@ BOOL winbindd_idmap_get_sid_from_gid(gid_t gid, DOM_SID *sid) return ret; } -/* Get RID From UID */ -BOOL winbindd_idmap_get_rid_from_uid(uid_t uid, uint32 *user_rid, - struct winbindd_domain **domain) -{ - BOOL ret = False; - - if (!impl) { - impl = get_impl(lp_idmap_backend()); - } - - if (impl) { - ret = impl->get_rid_from_uid(uid, user_rid, domain); - } else { - DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_idmap_backend())); - } - - return ret; -} - -/* Get RID from GID */ -BOOL winbindd_idmap_get_rid_from_gid(gid_t gid, uint32 *group_rid, - struct winbindd_domain **domain) -{ - BOOL ret = False; - - if (!impl) { - impl = get_impl(lp_idmap_backend()); - } - - if (impl) { - ret = impl->get_rid_from_gid(gid, group_rid, domain); - } else { - DEBUG(0, ("winbindd_idmap_init: could not load backend '%s'\n", - lp_idmap_backend())); - } - - return ret; -} - /* Close backend */ BOOL winbindd_idmap_close(void) { diff --git a/source3/nsswitch/winbindd_idmap_tdb.c b/source3/nsswitch/winbindd_idmap_tdb.c index f27c3c1b5f..911b3b41d2 100644 --- a/source3/nsswitch/winbindd_idmap_tdb.c +++ b/source3/nsswitch/winbindd_idmap_tdb.c @@ -342,78 +342,6 @@ static BOOL tdb_get_gid_from_sid(DOM_SID * sid, gid_t * gid) return tdb_get_id_from_sid(sid, gid, True); } -/* Get a uid from a user rid */ -static BOOL tdb_get_uid_from_rid(const char *dom_name, uint32 rid, - uid_t * uid) -{ - struct winbindd_domain *domain; - DOM_SID sid; - - if (!(domain = find_domain_from_name(dom_name))) { - return False; - } - - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, rid); - - return tdb_get_id_from_sid(&sid, uid, False); -} - -/* Get a gid from a group rid */ -static BOOL tdb_get_gid_from_rid(const char *dom_name, uint32 rid, - gid_t * gid) -{ - struct winbindd_domain *domain; - DOM_SID sid; - - if (!(domain = find_domain_from_name(dom_name))) { - return False; - } - - sid_copy(&sid, &domain->sid); - sid_append_rid(&sid, rid); - - return tdb_get_id_from_sid(&sid, gid, True); -} - -/* Get a user rid from a uid */ -static BOOL tdb_get_rid_from_uid(uid_t uid, uint32 * user_rid, - struct winbindd_domain **domain) -{ - DOM_SID sid; - - if (!tdb_get_sid_from_id((int) uid, &sid, False)) { - return False; - } - - *domain = find_domain_from_sid(&sid); - if (!*domain) - return False; - - sid_split_rid(&sid, user_rid); - - return True; -} - -/* Get a group rid from a gid */ -static BOOL tdb_get_rid_from_gid(gid_t gid, uint32 * group_rid, - struct winbindd_domain **domain) -{ - DOM_SID sid; - - if (!tdb_get_sid_from_id((int) gid, &sid, True)) { - return False; - } - - *domain = find_domain_from_sid(&sid); - if (!*domain) - return False; - - sid_split_rid(&sid, group_rid); - - return True; -} - /* Close the tdb */ static BOOL tdb_idmap_close(void) { @@ -500,12 +428,6 @@ struct idmap_methods tdb_idmap_methods = { tdb_get_uid_from_sid, tdb_get_gid_from_sid, - tdb_get_rid_from_uid, - tdb_get_rid_from_gid, - - tdb_get_uid_from_rid, - tdb_get_gid_from_rid, - tdb_idmap_close, tdb_idmap_status diff --git a/source3/nsswitch/winbindd_rpc.c b/source3/nsswitch/winbindd_rpc.c index 90d8e4f616..03b0a1e706 100644 --- a/source3/nsswitch/winbindd_rpc.c +++ b/source3/nsswitch/winbindd_rpc.c @@ -26,6 +26,7 @@ #undef DBGC_CLASS #define DBGC_CLASS DBGC_WINBIND + /* Query display info for a domain. This returns enough information plus a bit extra to give an overview of domain users for the User Manager application. */ @@ -39,7 +40,7 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, POLICY_HND dom_pol; BOOL got_dom_pol = False; uint32 des_access = SEC_RIGHTS_MAXIMUM_ALLOWED; - int i, start_idx, retry; + unsigned int i, start_idx, retry; DEBUG(3,("rpc: query_user_list\n")); @@ -97,7 +98,7 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, (*info)[i].acct_name = talloc_strdup(mem_ctx, dom_users[j]); (*info)[i].full_name = talloc_strdup(mem_ctx, ""); - (*info)[i].user_rid = dom_rids[j]; + (*info)[i].user_sid = rid_to_talloced_sid(domain, mem_ctx, dom_rids[j]); /* For the moment we set the primary group for every user to be the Domain Users group. There are serious problems with determining @@ -105,7 +106,10 @@ static NTSTATUS query_user_list(struct winbindd_domain *domain, This should really be made into a 'winbind force group' smb.conf parameter or something like that. */ - (*info)[i].group_rid = DOMAIN_GROUP_RID_USERS; + (*info)[i].user_sid + = rid_to_talloced_sid(domain, + mem_ctx, + DOMAIN_GROUP_RID_USERS); } talloc_destroy(ctx2); @@ -252,11 +256,11 @@ static NTSTATUS enum_local_groups(struct winbindd_domain *domain, /* convert a single name to a sid in a domain */ static NTSTATUS name_to_sid(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, const char *name, DOM_SID *sid, enum SID_NAME_USE *type) { - TALLOC_CTX *mem_ctx; CLI_POLICY_HND *hnd; NTSTATUS status; DOM_SID *sids = NULL; @@ -266,23 +270,16 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain, DEBUG(3,("rpc: name_to_sid name=%s\n", name)); - if (!(mem_ctx = talloc_init("name_to_sid[rpc] for [%s]\\[%s]", domain->name, name))) { - DEBUG(0, ("talloc_init failed!\n")); - return NT_STATUS_NO_MEMORY; - } - full_name = talloc_asprintf(mem_ctx, "%s\\%s", domain->name, name); if (!full_name) { DEBUG(0, ("talloc_asprintf failed!\n")); - talloc_destroy(mem_ctx); return NT_STATUS_NO_MEMORY; } retry = 0; do { if (!(hnd = cm_get_lsa_handle(domain->name))) { - talloc_destroy(mem_ctx); return NT_STATUS_UNSUCCESSFUL; } @@ -297,7 +294,6 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain, *type = types[0]; } - talloc_destroy(mem_ctx); return status; } @@ -345,17 +341,22 @@ static NTSTATUS sid_to_name(struct winbindd_domain *domain, /* Lookup user information from a rid or username. */ static NTSTATUS query_user(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, + DOM_SID *user_sid, WINBIND_USERINFO *user_info) { CLI_POLICY_HND *hnd; - NTSTATUS result; + NTSTATUS result = NT_STATUS_UNSUCCESSFUL; POLICY_HND dom_pol, user_pol; BOOL got_dom_pol = False, got_user_pol = False; SAM_USERINFO_CTR *ctr; int retry; + fstring sid_string; + uint32 user_rid; - DEBUG(3,("rpc: query_user rid=%u\n", user_rid)); + DEBUG(3,("rpc: query_user rid=%s\n", sid_to_string(sid_string, user_sid))); + if (!sid_peek_check_rid(&domain->sid, user_sid, &user_rid)) { + goto done; + } retry = 0; do { @@ -394,8 +395,8 @@ static NTSTATUS query_user(struct winbindd_domain *domain, cli_samr_close(hnd->cli, mem_ctx, &user_pol); got_user_pol = False; - user_info->user_rid = user_rid; - user_info->group_rid = ctr->info.id21->group_rid; + user_info->user_sid = rid_to_talloced_sid(domain, mem_ctx, user_rid); + user_info->group_sid = rid_to_talloced_sid(domain, mem_ctx, ctr->info.id21->group_rid); user_info->acct_name = unistr2_tdup(mem_ctx, &ctr->info.id21->uni_user_name); user_info->full_name = unistr2_tdup(mem_ctx, @@ -415,8 +416,8 @@ static NTSTATUS query_user(struct winbindd_domain *domain, /* Lookup groups a user is a member of. I wish Unix had a call like this! */ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 user_rid, - uint32 *num_groups, uint32 **user_gids) + DOM_SID *user_sid, + uint32 *num_groups, DOM_SID ***user_gids) { CLI_POLICY_HND *hnd; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -424,15 +425,17 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, uint32 des_access = SEC_RIGHTS_MAXIMUM_ALLOWED; BOOL got_dom_pol = False, got_user_pol = False; DOM_GID *user_groups; - int i; - int retry; + unsigned int i; + unsigned int retry; + fstring sid_string; + uint32 user_rid; - DEBUG(3,("rpc: lookup_usergroups rid=%u\n", user_rid)); + DEBUG(3,("rpc: lookup_usergroups sid=%s\n", sid_to_string(sid_string, user_sid))); *num_groups = 0; /* First try cached universal groups from logon */ - *user_gids = uni_group_cache_fetch(&domain->sid, user_rid, mem_ctx, num_groups); + *user_gids = uni_group_cache_fetch(&domain->sid, user_sid, mem_ctx, num_groups); if((*num_groups > 0) && *user_gids) { return NT_STATUS_OK; } else { @@ -448,7 +451,7 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, /* Get domain handle */ result = cli_samr_open_domain(hnd->cli, mem_ctx, &hnd->pol, - des_access, &domain->sid, &dom_pol); + des_access, &domain->sid, &dom_pol); } while (!NT_STATUS_IS_OK(result) && (retry++ < 1) && hnd && hnd->cli && hnd->cli->fd == -1); if (!NT_STATUS_IS_OK(result)) @@ -456,6 +459,11 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, got_dom_pol = True; + + if (!sid_peek_check_rid(&domain->sid, user_sid, &user_rid)) { + goto done; + } + /* Get user handle */ result = cli_samr_open_user(hnd->cli, mem_ctx, &dom_pol, des_access, user_rid, &user_pol); @@ -473,8 +481,13 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, goto done; (*user_gids) = talloc(mem_ctx, sizeof(uint32) * (*num_groups)); + if (!(*user_gids)) { + result = NT_STATUS_NO_MEMORY; + goto done; + } + for (i=0;i<(*num_groups);i++) { - (*user_gids)[i] = user_groups[i].g_rid; + (*user_gids)[i] = rid_to_talloced_sid(domain, mem_ctx, user_groups[i].g_rid); } done: @@ -492,8 +505,8 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, /* Lookup group membership given a rid. */ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, - uint32 group_rid, uint32 *num_names, - uint32 **rid_mem, char ***names, + DOM_SID *group_sid, uint32 *num_names, + DOM_SID ***sid_mem, char ***names, uint32 **name_types) { CLI_POLICY_HND *hnd; @@ -502,9 +515,17 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, POLICY_HND dom_pol, group_pol; uint32 des_access = SEC_RIGHTS_MAXIMUM_ALLOWED; BOOL got_dom_pol = False, got_group_pol = False; + uint32 *rid_mem = NULL; + uint32 group_rid; int retry; + unsigned int j; + fstring sid_string; + + DEBUG(10,("rpc: lookup_groupmem %s sid=%s\n", domain->name, sid_to_string(sid_string, group_sid))); - DEBUG(10,("rpc: lookup_groupmem %s rid=%u\n", domain->name, group_rid)); + if (!sid_peek_check_rid(&domain->sid, group_sid, &group_rid)) { + goto done; + } *num_names = 0; @@ -539,7 +560,7 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, group. */ result = cli_samr_query_groupmem(hnd->cli, mem_ctx, - &group_pol, num_names, rid_mem, + &group_pol, num_names, &rid_mem, name_types); if (!NT_STATUS_IS_OK(result)) @@ -554,6 +575,16 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, *names = talloc_zero(mem_ctx, *num_names * sizeof(char *)); *name_types = talloc_zero(mem_ctx, *num_names * sizeof(uint32)); + *sid_mem = talloc_zero(mem_ctx, *num_names * sizeof(DOM_SID *)); + + for (j=0;j<(*num_names);j++) { + (*sid_mem)[j] = rid_to_talloced_sid(domain, mem_ctx, (rid_mem)[j]); + } + + if (!*names || !*name_types) { + result = NT_STATUS_NO_MEMORY; + goto done; + } for (i = 0; i < *num_names; i += MAX_LOOKUP_RIDS) { int num_lookup_rids = MIN(*num_names - i, MAX_LOOKUP_RIDS); @@ -566,7 +597,7 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, result = cli_samr_lookup_rids(hnd->cli, mem_ctx, &dom_pol, 1000, /* flags */ num_lookup_rids, - &(*rid_mem)[i], + &rid_mem[i], &tmp_num_names, &tmp_names, &tmp_types); @@ -581,7 +612,7 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, memcpy(&(*name_types)[i], tmp_types, sizeof(uint32) * tmp_num_names); - + total_names += tmp_num_names; } diff --git a/source3/nsswitch/winbindd_user.c b/source3/nsswitch/winbindd_user.c index 06c95224ab..ee05543d30 100644 --- a/source3/nsswitch/winbindd_user.c +++ b/source3/nsswitch/winbindd_user.c @@ -29,29 +29,30 @@ /* Fill a pwent structure with information we have obtained */ static BOOL winbindd_fill_pwent(char *dom_name, char *user_name, - uint32 user_rid, uint32 group_rid, + DOM_SID *user_sid, DOM_SID *group_sid, char *full_name, struct winbindd_pw *pw) { extern userdom_struct current_user_info; fstring output_username; pstring homedir; + fstring sid_string; if (!pw || !dom_name || !user_name) return False; /* Resolve the uid number */ - if (!winbindd_idmap_get_uid_from_rid(dom_name, user_rid, + if (!winbindd_idmap_get_uid_from_sid(user_sid, &pw->pw_uid)) { - DEBUG(1, ("error getting user id for rid %d\n", user_rid)); + DEBUG(1, ("error getting user id for sid %s\n", sid_to_string(sid_string, user_sid))); return False; } /* Resolve the gid number */ - if (!winbindd_idmap_get_gid_from_rid(dom_name, group_rid, + if (!winbindd_idmap_get_gid_from_sid(group_sid, &pw->pw_gid)) { - DEBUG(1, ("error getting group id for rid %d\n", group_rid)); + DEBUG(1, ("error getting group id for sid %s\n", sid_to_string(sid_string, group_sid))); return False; } @@ -95,7 +96,6 @@ static BOOL winbindd_fill_pwent(char *dom_name, char *user_name, enum winbindd_result winbindd_getpwnam(struct winbindd_cli_state *state) { - uint32 user_rid; WINBIND_USERINFO user_info; DOM_SID user_sid; NTSTATUS status; @@ -144,9 +144,7 @@ enum winbindd_result winbindd_getpwnam(struct winbindd_cli_state *state) return WINBINDD_ERROR; } - sid_split_rid(&user_sid, &user_rid); - - status = domain->methods->query_user(domain, mem_ctx, user_rid, + status = domain->methods->query_user(domain, mem_ctx, &user_sid, &user_info); if (!NT_STATUS_IS_OK(status)) { @@ -158,7 +156,7 @@ enum winbindd_result winbindd_getpwnam(struct winbindd_cli_state *state) /* Now take all this information and fill in a passwd structure */ if (!winbindd_fill_pwent(name_domain, name_user, - user_rid, user_info.group_rid, + user_info.user_sid, user_info.group_sid, user_info.full_name, &state->response.data.pw)) { talloc_destroy(mem_ctx); @@ -176,7 +174,6 @@ enum winbindd_result winbindd_getpwuid(struct winbindd_cli_state *state) { DOM_SID user_sid; struct winbindd_domain *domain; - uint32 user_rid; fstring dom_name; fstring user_name; enum SID_NAME_USE name_type; @@ -196,18 +193,15 @@ enum winbindd_result winbindd_getpwuid(struct winbindd_cli_state *state) /* Get rid from uid */ - if (!winbindd_idmap_get_rid_from_uid(state->request.data.uid, - &user_rid, &domain)) { - DEBUG(1, ("could not convert uid %d to rid\n", + if (!winbindd_idmap_get_sid_from_uid(state->request.data.uid, + &user_sid)) { + DEBUG(1, ("could not convert uid %d to SID\n", state->request.data.uid)); return WINBINDD_ERROR; } /* Get name and name type from rid */ - sid_copy(&user_sid, &domain->sid); - sid_append_rid(&user_sid, user_rid); - if (!winbindd_lookup_name_by_sid(&user_sid, dom_name, user_name, &name_type)) { fstring temp; @@ -216,6 +210,13 @@ enum winbindd_result winbindd_getpwuid(struct winbindd_cli_state *state) return WINBINDD_ERROR; } + domain = find_domain_from_sid(&user_sid); + + if (!domain) { + DEBUG(1,("Can't find domain from sid\n")); + return WINBINDD_ERROR; + } + /* Get some user info */ if (!(mem_ctx = talloc_init("winbind_getpwuid(%d)", @@ -225,7 +226,7 @@ enum winbindd_result winbindd_getpwuid(struct winbindd_cli_state *state) return WINBINDD_ERROR; } - status = domain->methods->query_user(domain, mem_ctx, user_rid, + status = domain->methods->query_user(domain, mem_ctx, &user_sid, &user_info); if (!NT_STATUS_IS_OK(status)) { @@ -237,7 +238,7 @@ enum winbindd_result winbindd_getpwuid(struct winbindd_cli_state *state) /* Resolve gid number */ - if (!winbindd_idmap_get_gid_from_rid(domain->name, user_info.group_rid, &gid)) { + if (!winbindd_idmap_get_gid_from_sid(user_info.group_sid, &gid)) { DEBUG(1, ("error getting group id for user %s\n", user_name)); talloc_destroy(mem_ctx); return WINBINDD_ERROR; @@ -245,7 +246,8 @@ enum winbindd_result winbindd_getpwuid(struct winbindd_cli_state *state) /* Fill in password structure */ - if (!winbindd_fill_pwent(domain->name, user_name, user_rid, user_info.group_rid, + if (!winbindd_fill_pwent(domain->name, user_name, user_info.user_sid, + user_info.group_sid, user_info.full_name, &state->response.data.pw)) { talloc_destroy(mem_ctx); return WINBINDD_ERROR; @@ -332,13 +334,13 @@ static BOOL get_sam_user_entries(struct getent_state *ent) TALLOC_CTX *mem_ctx; struct winbindd_domain *domain; struct winbindd_methods *methods; - int i; + unsigned int i; if (ent->num_sam_entries) return False; if (!(mem_ctx = talloc_init("get_sam_user_entries(%s)", - ent->domain_name))) + ent->domain_name))) return False; if (!(domain = find_domain_from_name(ent->domain_name))) { @@ -393,8 +395,8 @@ static BOOL get_sam_user_entries(struct getent_state *ent) } /* User and group ids */ - name_list[ent->num_sam_entries+i].user_rid = info[i].user_rid; - name_list[ent->num_sam_entries+i].group_rid = info[i].group_rid; + sid_copy(&name_list[ent->num_sam_entries+i].user_sid, info[i].user_sid); + sid_copy(&name_list[ent->num_sam_entries+i].group_sid, info[i].group_sid); } ent->num_sam_entries += num_entries; @@ -492,8 +494,8 @@ enum winbindd_result winbindd_getpwent(struct winbindd_cli_state *state) result = winbindd_fill_pwent( ent->domain_name, name_list[ent->sam_entry_index].name, - name_list[ent->sam_entry_index].user_rid, - name_list[ent->sam_entry_index].group_rid, + &name_list[ent->sam_entry_index].user_sid, + &name_list[ent->sam_entry_index].group_sid, name_list[ent->sam_entry_index].gecos, &user_list[user_list_ndx]); @@ -540,7 +542,7 @@ enum winbindd_result winbindd_list_users(struct winbindd_cli_state *state) for (domain = domain_list(); domain; domain = domain->next) { NTSTATUS status; struct winbindd_methods *methods; - int i; + unsigned int i; methods = domain->methods; diff --git a/source3/nsswitch/winbindd_util.c b/source3/nsswitch/winbindd_util.c index 3fa08029b6..fdbfd92b5a 100644 --- a/source3/nsswitch/winbindd_util.c +++ b/source3/nsswitch/winbindd_util.c @@ -271,14 +271,20 @@ BOOL winbindd_lookup_sid_by_name(struct winbindd_domain *domain, enum SID_NAME_USE *type) { NTSTATUS result; - + TALLOC_CTX *mem_ctx; /* Don't bother with machine accounts */ - + if (name[strlen(name) - 1] == '$') return False; + mem_ctx = talloc_init("lookup_sid_by_name for %s\n", name); + if (!mem_ctx) + return False; + /* Lookup name */ - result = domain->methods->name_to_sid(domain, name, sid, type); + result = domain->methods->name_to_sid(domain, mem_ctx, name, sid, type); + + talloc_destroy(mem_ctx); /* Return rid and type if lookup successful */ if (!NT_STATUS_IS_OK(result)) { @@ -528,3 +534,20 @@ int winbindd_num_clients(void) { return _num_clients; } + +/* Help with RID -> SID conversion */ + +DOM_SID *rid_to_talloced_sid(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, + uint32 rid) +{ + DOM_SID *sid; + sid = talloc(mem_ctx, sizeof(*sid)); + if (!sid) { + smb_panic("rid_to_to_talloced_sid: talloc for DOM_SID failed!\n"); + } + sid_copy(sid, &domain->sid); + sid_append_rid(sid, rid); + return sid; +} + -- cgit From ca80787248bfe7fe8dff12486ba32520f6910341 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 26 Feb 2003 12:23:03 +0000 Subject: Netlogon-unigroup changes needed for the winbind RID-to-SID conversion. This changes the cache format, which will simply invalidate existing entries, leaving them dead in the cache. Andrew Bartlett (This used to be commit 3fc179362ea849db23490b971a9f64f943e7f7f8) --- source3/libsmb/netlogon_unigrp.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/source3/libsmb/netlogon_unigrp.c b/source3/libsmb/netlogon_unigrp.c index fa2fe32f35..466410d800 100644 --- a/source3/libsmb/netlogon_unigrp.c +++ b/source3/libsmb/netlogon_unigrp.c @@ -22,6 +22,7 @@ */ #include "includes.h" +#define UNIGROUP_PREFIX "UNIGROUP" /* Handle for netlogon_unigrp.tdb database. It is used internally @@ -50,17 +51,22 @@ BOOL uni_group_cache_init(void) BOOL uni_group_cache_store_netlogon(TALLOC_CTX *mem_ctx, NET_USER_INFO_3 *user) { TDB_DATA key,data; - fstring keystr; - int i; + fstring keystr, sid_string; + DOM_SID user_sid; + unsigned int i; if (!uni_group_cache_init()) { DEBUG(0,("uni_group_cache_store_netlogon: cannot open netlogon_unigrp.tdb for write!\n")); return False; } - /* Prepare key as DOMAIN-SID/USER-RID string */ - slprintf(keystr, sizeof(keystr), "%s/%d", - sid_string_static(&user->dom_sid.sid), user->user_rid); + sid_copy(&user_sid, &user->dom_sid.sid); + sid_append_rid(&user_sid, user->user_rid); + + /* Prepare key as USER-SID string */ + slprintf(keystr, sizeof(keystr), "%s/%s", + UNIGROUP_PREFIX, + sid_to_string(sid_string, &user_sid)); key.dptr = keystr; key.dsize = strlen(keystr) + 1; @@ -90,14 +96,15 @@ BOOL uni_group_cache_store_netlogon(TALLOC_CTX *mem_ctx, NET_USER_INFO_3 *user) and elements are array[0] ... array[num_elements-1] */ -uint32* uni_group_cache_fetch(DOM_SID *domain, uint32 user_rid, +DOM_SID **uni_group_cache_fetch(DOM_SID *domain, DOM_SID *user_sid, TALLOC_CTX *mem_ctx, uint32 *num_groups) { TDB_DATA key,data; fstring keystr; - uint32 *groups; + DOM_SID **groups; uint32 i; uint32 group_count; + fstring sid_string; if (!domain) { DEBUG(1,("uni_group_cache_fetch: expected non-null domain sid\n")); @@ -123,8 +130,9 @@ uint32* uni_group_cache_fetch(DOM_SID *domain, uint32 user_rid, *num_groups = 0; /* Fetch universal groups */ - slprintf(keystr, sizeof(keystr), "%s/%d", - sid_string_static(domain), user_rid); + slprintf(keystr, sizeof(keystr), "%s/%s", + UNIGROUP_PREFIX, + sid_to_string(sid_string, user_sid)); key.dptr = keystr; key.dsize = strlen(keystr) + 1; data = tdb_fetch(netlogon_unigrp_tdb, key); @@ -136,12 +144,17 @@ uint32* uni_group_cache_fetch(DOM_SID *domain, uint32 user_rid, /* Transfer data to receiver's memory context */ group_count = IVAL(&((uint32*)data.dptr)[0],0); - groups = talloc(mem_ctx, (group_count)*sizeof(uint32)); + groups = talloc(mem_ctx, (group_count)*sizeof(*groups)); if (groups) { for(i=0; i Date: Wed, 26 Feb 2003 12:31:17 +0000 Subject: Add -Wwrite-strings to our --enable-developer settings. We have compiled relitivly 'clean' with this setting since I did a massive cleanup last month. This should help us stay that way. Andrew Bartlett (This used to be commit 284479bf388f5e39d9be78eeb1ac6cdd001fb8df) --- source3/configure.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/configure.in b/source3/configure.in index e3b5f2fe15..269d70c2fc 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -205,12 +205,12 @@ AC_ARG_ENABLE(debug, AC_ARG_ENABLE(developer, [ --enable-developer Turn on developer warnings and debugging (default=no)], [if eval "test x$enable_developer = xyes"; then - CFLAGS="${CFLAGS} -g -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align -DDEBUG_PASSWORD -DDEVELOPER" + CFLAGS="${CFLAGS} -g -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -DDEBUG_PASSWORD -DDEVELOPER" fi]) AC_ARG_ENABLE(krb5developer, [ --enable-krb5developer Turn on developer warnings and debugging, except -Wstrict-prototypes (default=no)], [if eval "test x$enable_krb5developer = xyes"; then - CFLAGS="${CFLAGS} -g -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -DDEBUG_PASSWORD -DDEVELOPER" + CFLAGS="${CFLAGS} -g -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -DDEBUG_PASSWORD -DDEVELOPER" fi]) AC_ARG_ENABLE(dmalloc, [ --enable-dmalloc Enable heap debugging [default=no]]) -- cgit From f6f76ad5ed7b3eee7cbd3bca6f3ccd1194a0e98a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 27 Feb 2003 00:43:23 +0000 Subject: Fix to allow blocking lock notification to be done rapidly (no wait for smb -> smb lock release). Adds new PENDING_LOCK type to lockdb (does not interfere with existing locks). Jeremy. (This used to be commit 22fc0d48ff2052b4274c65f85050c58b235bf4e4) --- source3/include/messages.h | 1 + source3/include/smb.h | 2 +- source3/locking/brlock.c | 82 ++++++++++++++++++++++++++++++++++++++++++---- source3/locking/locking.c | 4 +-- source3/smbd/blocking.c | 78 +++++++++++++++++++++++++++++++++++++++---- source3/smbd/process.c | 7 ++++ source3/smbd/reply.c | 7 ++-- 7 files changed, 162 insertions(+), 19 deletions(-) diff --git a/source3/include/messages.h b/source3/include/messages.h index 2b8ca8bbe9..ce167a772d 100644 --- a/source3/include/messages.h +++ b/source3/include/messages.h @@ -62,6 +62,7 @@ #define MSG_SMB_FORCE_TDIS 3002 #define MSG_SMB_SAM_SYNC 3003 #define MSG_SMB_SAM_REPL 3004 +#define MSG_SMB_UNLOCK 3005 /* Flags to classify messages - used in message_send_all() */ /* Sender will filter by flag. */ diff --git a/source3/include/smb.h b/source3/include/smb.h index 71051e341e..a2b341d0fc 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -772,7 +772,7 @@ typedef enum } parm_class; /* passed to br lock code */ -enum brl_type {READ_LOCK, WRITE_LOCK}; +enum brl_type {READ_LOCK, WRITE_LOCK, PENDING_LOCK}; struct enum_list { int value; diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 9902c7bbd7..4cd885f1a6 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -98,6 +98,9 @@ static BOOL brl_same_context(struct lock_context *ctx1, static BOOL brl_conflict(struct lock_struct *lck1, struct lock_struct *lck2) { + if (lck1->lock_type == PENDING_LOCK || lck2->lock_type == PENDING_LOCK ) + return False; + if (lck1->lock_type == READ_LOCK && lck2->lock_type == READ_LOCK) { return False; } @@ -119,6 +122,9 @@ static BOOL brl_conflict(struct lock_struct *lck1, static BOOL brl_conflict1(struct lock_struct *lck1, struct lock_struct *lck2) { + if (lck1->lock_type == PENDING_LOCK || lck2->lock_type == PENDING_LOCK ) + return False; + if (lck1->lock_type == READ_LOCK && lck2->lock_type == READ_LOCK) { return False; } @@ -148,6 +154,9 @@ static BOOL brl_conflict1(struct lock_struct *lck1, static BOOL brl_conflict_other(struct lock_struct *lck1, struct lock_struct *lck2) { + if (lck1->lock_type == PENDING_LOCK || lck2->lock_type == PENDING_LOCK ) + return False; + if (lck1->lock_type == READ_LOCK && lck2->lock_type == READ_LOCK) return False; @@ -385,16 +394,30 @@ NTSTATUS brl_lock(SMB_DEV_T dev, SMB_INO_T ino, int fnum, return status; } +/**************************************************************************** + Check if an unlock overlaps a pending lock. +****************************************************************************/ + +static BOOL brl_pending_overlap(struct lock_struct *lock, struct lock_struct *pend_lock) +{ + if ((lock->start <= pend_lock->start) && (lock->start + lock->size > pend_lock->start)) + return True; + if ((lock->start >= pend_lock->start) && (lock->start <= pend_lock->start + pend_lock->size)) + return True; + return False; +} + /**************************************************************************** Unlock a range of bytes. ****************************************************************************/ BOOL brl_unlock(SMB_DEV_T dev, SMB_INO_T ino, int fnum, uint16 smbpid, pid_t pid, uint16 tid, - br_off start, br_off size) + br_off start, br_off size, + BOOL remove_pending_locks_only) { TDB_DATA kbuf, dbuf; - int count, i; + int count, i, j; struct lock_struct *locks; struct lock_context context; @@ -452,9 +475,34 @@ BOOL brl_unlock(SMB_DEV_T dev, SMB_INO_T ino, int fnum, struct lock_struct *lock = &locks[i]; if (brl_same_context(&lock->context, &context) && - lock->fnum == fnum && - lock->start == start && - lock->size == size) { + lock->fnum == fnum && + lock->start == start && + lock->size == size) { + + if (remove_pending_locks_only && lock->lock_type != PENDING_LOCK) + continue; + + if (lock->lock_type != PENDING_LOCK) { + /* Send unlock messages to any pending waiters that overlap. */ + for (j=0; jlock_type != PENDING_LOCK) + continue; + + /* We could send specific lock info here... */ + if (brl_pending_overlap(lock, pend_lock)) { + DEBUG(10,("brl_unlock: sending unlock message to pid %u\n", + (unsigned int)pend_lock->context.pid )); + + message_send_pid(pend_lock->context.pid, + MSG_SMB_UNLOCK, + NULL, 0, True); + } + } + } + /* found it - delete it */ if (count == 1) { tdb_delete(tdb, kbuf); @@ -546,7 +594,7 @@ BOOL brl_locktest(SMB_DEV_T dev, SMB_INO_T ino, int fnum, void brl_close(SMB_DEV_T dev, SMB_INO_T ino, pid_t pid, int tid, int fnum) { TDB_DATA kbuf, dbuf; - int count, i, dcount=0; + int count, i, j, dcount=0; struct lock_struct *locks; kbuf = locking_key(dev,ino); @@ -561,12 +609,34 @@ void brl_close(SMB_DEV_T dev, SMB_INO_T ino, pid_t pid, int tid, int fnum) /* there are existing locks - remove any for this fnum */ locks = (struct lock_struct *)dbuf.dptr; count = dbuf.dsize / sizeof(*locks); + for (i=0; icontext.tid == tid && lock->context.pid == pid && lock->fnum == fnum) { + + /* Send unlock messages to any pending waiters that overlap. */ + for (j=0; jlock_type != PENDING_LOCK) + continue; + + if (pend_lock->context.tid == tid && + pend_lock->context.pid == pid && + pend_lock->fnum == fnum) + continue; + + /* We could send specific lock info here... */ + if (brl_pending_overlap(lock, pend_lock)) + message_send_pid(pend_lock->context.pid, + MSG_SMB_UNLOCK, + NULL, 0, True); + } + /* found it - delete it */ if (count > 1 && i < count-1) { memmove(&locks[i], &locks[i+1], diff --git a/source3/locking/locking.c b/source3/locking/locking.c index fdfd4d661c..651f905e15 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -132,7 +132,7 @@ static NTSTATUS do_lock(files_struct *fsp,connection_struct *conn, uint16 lock_p */ (void)brl_unlock(fsp->dev, fsp->inode, fsp->fnum, lock_pid, sys_getpid(), conn->cnum, - offset, count); + offset, count, False); } } } @@ -201,7 +201,7 @@ NTSTATUS do_unlock(files_struct *fsp,connection_struct *conn, uint16 lock_pid, */ ok = brl_unlock(fsp->dev, fsp->inode, fsp->fnum, - lock_pid, sys_getpid(), conn->cnum, offset, count); + lock_pid, sys_getpid(), conn->cnum, offset, count, False); if (!ok) { DEBUG(10,("do_unlock: returning ERRlock.\n" )); diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c index 14239272c2..581ce43f91 100644 --- a/source3/smbd/blocking.c +++ b/source3/smbd/blocking.c @@ -1,7 +1,7 @@ /* Unix SMB/CIFS implementation. Blocking Locking functions - Copyright (C) Jeremy Allison 1998 + Copyright (C) Jeremy Allison 1998-2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,6 +33,9 @@ typedef struct { files_struct *fsp; time_t expire_time; int lock_num; + SMB_BIG_UINT offset; + SMB_BIG_UINT count; + uint16 lock_pid; char *inbuf; int length; } blocking_lock_record; @@ -77,13 +80,18 @@ static BOOL in_chained_smb(void) return (chain_size != 0); } +static void received_unlock_msg(int msg_type, pid_t src, void *buf, size_t len); + /**************************************************************************** Function to push a blocking lock request onto the lock queue. ****************************************************************************/ -BOOL push_blocking_lock_request( char *inbuf, int length, int lock_timeout, int lock_num) +BOOL push_blocking_lock_request( char *inbuf, int length, int lock_timeout, + int lock_num, uint16 lock_pid, SMB_BIG_UINT offset, SMB_BIG_UINT count) { + static BOOL set_lock_msg; blocking_lock_record *blr; + NTSTATUS status; if(in_chained_smb() ) { DEBUG(0,("push_blocking_lock_request: cannot queue a chained request (currently).\n")); @@ -110,11 +118,31 @@ BOOL push_blocking_lock_request( char *inbuf, int length, int lock_timeout, int blr->fsp = get_fsp_from_pkt(inbuf); blr->expire_time = (lock_timeout == -1) ? (time_t)-1 : time(NULL) + (time_t)lock_timeout; blr->lock_num = lock_num; + blr->lock_pid = lock_pid; + blr->offset = offset; + blr->count = count; memcpy(blr->inbuf, inbuf, length); blr->length = length; + /* Add a pending lock record for this. */ + status = brl_lock(blr->fsp->dev, blr->fsp->inode, blr->fsp->fnum, + lock_pid, sys_getpid(), blr->fsp->conn->cnum, + offset, count, + PENDING_LOCK); + + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("push_blocking_lock_request: failed to add PENDING_LOCK record.\n")); + free_blocking_lock_record(blr); + return False; + } + ubi_slAddTail(&blocking_lock_queue, blr); + /* Ensure we'll receive messages when this is unlocked. */ + if (!set_lock_msg) { + message_register(MSG_SMB_UNLOCK, received_unlock_msg); + set_lock_msg = True; + } DEBUG(3,("push_blocking_lock_request: lock request length=%d blocked with expiry time %d (+%d) \ for fnum = %d, name = %s\n", length, (int)blr->expire_time, lock_timeout, @@ -493,6 +521,10 @@ void remove_pending_lock_requests_by_fid(files_struct *fsp) DEBUG(10,("remove_pending_lock_requests_by_fid - removing request type %d for \ file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum )); + brl_unlock(blr->fsp->dev, blr->fsp->inode, blr->fsp->fnum, + blr->lock_pid, sys_getpid(), blr->fsp->conn->cnum, + blr->offset, blr->count, True); + free_blocking_lock_record((blocking_lock_record *)ubi_slRemNext( &blocking_lock_queue, prev)); blr = (blocking_lock_record *)(prev ? ubi_slNext(prev) : ubi_slFirst(&blocking_lock_queue)); continue; @@ -520,6 +552,9 @@ void remove_pending_lock_requests_by_mid(int mid) file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum )); blocking_lock_reply_error(blr,NT_STATUS_CANCELLED); + brl_unlock(blr->fsp->dev, blr->fsp->inode, blr->fsp->fnum, + blr->lock_pid, sys_getpid(), blr->fsp->conn->cnum, + blr->offset, blr->count, True); free_blocking_lock_record((blocking_lock_record *)ubi_slRemNext( &blocking_lock_queue, prev)); blr = (blocking_lock_record *)(prev ? ubi_slNext(prev) : ubi_slFirst(&blocking_lock_queue)); continue; @@ -530,9 +565,20 @@ file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum )); } } +/**************************************************************************** + Set a flag as an unlock request affects one of our pending locks. +*****************************************************************************/ + +static void received_unlock_msg(int msg_type, pid_t src, void *buf, size_t len) +{ + DEBUG(10,("received_unlock_msg\n")); + process_blocking_lock_queue(time(NULL)); +} + /**************************************************************************** Return the number of seconds to the next blocking locks timeout, or default_timeout *****************************************************************************/ + unsigned blocking_locks_timeout(unsigned default_timeout) { unsigned timeout = default_timeout; @@ -540,22 +586,21 @@ unsigned blocking_locks_timeout(unsigned default_timeout) blocking_lock_record *blr = (blocking_lock_record *)ubi_slFirst(&blocking_lock_queue); /* note that we avoid the time() syscall if there are no blocking locks */ - if (!blr) { + if (!blr) return timeout; - } t = time(NULL); while (blr) { - if (timeout > (blr->expire_time - t)) { + if ((blr->expire_time != (time_t)-1) && + (timeout > (blr->expire_time - t))) { timeout = blr->expire_time - t; } blr = (blocking_lock_record *)ubi_slNext(blr); } - if (timeout < 1) { + if (timeout < 1) timeout = 1; - } return timeout; } @@ -604,6 +649,10 @@ void process_blocking_lock_queue(time_t t) DEBUG(5,("process_blocking_lock_queue: pending lock fnum = %d for file %s timed out.\n", fsp->fnum, fsp->fsp_name )); + brl_unlock(fsp->dev, fsp->inode, fsp->fnum, + blr->lock_pid, sys_getpid(), conn->cnum, + blr->offset, blr->count, True); + blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT); free_blocking_lock_record((blocking_lock_record *)ubi_slRemNext( &blocking_lock_queue, prev)); blr = (blocking_lock_record *)(prev ? ubi_slNext(prev) : ubi_slFirst(&blocking_lock_queue)); @@ -617,6 +666,11 @@ void process_blocking_lock_queue(time_t t) * Remove the entry and return an error to the client. */ blocking_lock_reply_error(blr,NT_STATUS_ACCESS_DENIED); + + brl_unlock(fsp->dev, fsp->inode, fsp->fnum, + blr->lock_pid, sys_getpid(), conn->cnum, + blr->offset, blr->count, True); + free_blocking_lock_record((blocking_lock_record *)ubi_slRemNext( &blocking_lock_queue, prev)); blr = (blocking_lock_record *)(prev ? ubi_slNext(prev) : ubi_slFirst(&blocking_lock_queue)); continue; @@ -628,6 +682,11 @@ void process_blocking_lock_queue(time_t t) * Remove the entry and return an error to the client. */ blocking_lock_reply_error(blr,NT_STATUS_ACCESS_DENIED); + + brl_unlock(fsp->dev, fsp->inode, fsp->fnum, + blr->lock_pid, sys_getpid(), conn->cnum, + blr->offset, blr->count, True); + free_blocking_lock_record((blocking_lock_record *)ubi_slRemNext( &blocking_lock_queue, prev)); blr = (blocking_lock_record *)(prev ? ubi_slNext(prev) : ubi_slFirst(&blocking_lock_queue)); change_to_root_user(); @@ -641,6 +700,11 @@ void process_blocking_lock_queue(time_t t) */ if(blocking_lock_record_process(blr)) { + + brl_unlock(fsp->dev, fsp->inode, fsp->fnum, + blr->lock_pid, sys_getpid(), conn->cnum, + blr->offset, blr->count, True); + free_blocking_lock_record((blocking_lock_record *)ubi_slRemNext( &blocking_lock_queue, prev)); blr = (blocking_lock_record *)(prev ? ubi_slNext(prev) : ubi_slFirst(&blocking_lock_queue)); change_to_root_user(); diff --git a/source3/smbd/process.c b/source3/smbd/process.c index c002abad16..57bc236eef 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -1271,6 +1271,13 @@ void smbd_process(void) lp_talloc_free(); main_loop_talloc_free(); + /* Did someone ask for immediate checks on things like blocking locks ? */ + if (select_timeout == 0) { + if(!timeout_processing( deadtime, &select_timeout, &last_timeout_processing_time)) + return; + num_smbs = 0; /* Reset smb counter. */ + } + while (!receive_message_or_smb(InBuffer,BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE,select_timeout)) { if(!timeout_processing( deadtime, &select_timeout, &last_timeout_processing_time)) return; diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 580878fe32..71e880476c 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1609,7 +1609,8 @@ int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length * this smb into a queued request and push it * onto the blocking lock queue. */ - if(push_blocking_lock_request(inbuf, length, -1, 0)) { + if(push_blocking_lock_request(inbuf, length, -1, 0, SVAL(inbuf,smb_pid), (SMB_BIG_UINT)startpos, + (SMB_BIG_UINT)numtoread)) { END_PROFILE(SMBlockread); return -1; } @@ -2514,7 +2515,7 @@ int reply_lock(connection_struct *conn, * this smb into a queued request and push it * onto the blocking lock queue. */ - if(push_blocking_lock_request(inbuf, length, -1, 0)) { + if(push_blocking_lock_request(inbuf, length, -1, 0, SVAL(inbuf,smb_pid), offset, count)) { END_PROFILE(SMBlock); return -1; } @@ -3955,7 +3956,7 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); * this smb into a queued request and push it * onto the blocking lock queue. */ - if(push_blocking_lock_request(inbuf, length, lock_timeout, i)) { + if(push_blocking_lock_request(inbuf, length, lock_timeout, i, lock_pid, offset, count)) { END_PROFILE(SMBlockingX); return -1; } -- cgit From d62f60f53ac18b3de9c7922105c6796361b91a11 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 27 Feb 2003 01:05:12 +0000 Subject: Fix possible memory leak on failure. (This used to be commit 052ebc44cde8d31571ed1edb602794349825be11) --- source3/nsswitch/winbindd_ads.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source3/nsswitch/winbindd_ads.c b/source3/nsswitch/winbindd_ads.c index 6c79e59bae..de3757aa44 100644 --- a/source3/nsswitch/winbindd_ads.c +++ b/source3/nsswitch/winbindd_ads.c @@ -580,6 +580,7 @@ static NTSTATUS lookup_usergroups(struct winbindd_domain *domain, user_dn = ads_pull_string(ads, mem_ctx, msg, "distinguishedName"); if (!user_dn) { DEBUG(1,("lookup_usergroups(sid=%s) ads_search did not return a a distinguishedName!\n", sid_to_string(sid_string, sid))); + if (msg) ads_msgfree(ads, msg); goto done; } -- cgit From d21b15ff57aa39337e76a06da74a55e48f4b0696 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 27 Feb 2003 01:54:41 +0000 Subject: - Rename 'modules = ' to 'preload modules = ' - Add smb_probe_module() - Add init_modules() - Call these functions (This used to be commit f8f21653225792c0001d183c6efe8b7d89a0785d) --- source3/lib/module.c | 35 +++++++++++++++++++++++++--- source3/param/loadparm.c | 6 ++--- source3/passdb/pdb_interface.c | 53 +++++++++++++++++++++++++++--------------- source3/smbd/server.c | 3 +-- source3/utils/pdbedit.c | 3 +-- source3/utils/testparm.c | 6 +++++ 6 files changed, 77 insertions(+), 29 deletions(-) diff --git a/source3/lib/module.c b/source3/lib/module.c index dd94f79950..4e2fe48af7 100644 --- a/source3/lib/module.c +++ b/source3/lib/module.c @@ -75,18 +75,47 @@ int smb_load_modules(const char **modules) return success; } +int smb_probe_module(const char *subsystem, const char *module) +{ + pstring full_path; + + /* Check for absolute path */ + if(module[0] == '/')return smb_load_module(module); + + pstrcpy(full_path, lib_path(subsystem)); + pstrcat(full_path, "/"); + pstrcat(full_path, module); + pstrcat(full_path, "."); + pstrcat(full_path, shlib_ext()); + + return smb_load_module(full_path); +} + #else /* HAVE_DLOPEN */ int smb_load_module(const char *module_name) { - DEBUG(0,("This samba executable has not been build with plugin support")); + DEBUG(0,("This samba executable has not been built with plugin support")); return False; } int smb_load_modules(const char **modules) { - DEBUG(0,("This samba executable has not been build with plugin support")); - return -1; + DEBUG(0,("This samba executable has not been built with plugin support")); + return False; +} + +int smb_probe_module(const char *subsystem, const char *module) +{ + DEBUG(0,("This samba executable has not been built with plugin support, not probing")); + return False; } #endif /* HAVE_DLOPEN */ + +void init_modules(void) +{ + if(lp_preload_modules()) + smb_load_modules(lp_preload_modules()); + /* FIXME: load static modules */ +} diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index b57b169adc..0eeb9be9de 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -120,7 +120,7 @@ typedef struct char *szPrivateDir; char **szPassdbBackend; char **szSamBackend; - char **szModules; + char **szPreloadModules; char *szPasswordServer; char *szSocketOptions; char *szRealm; @@ -823,7 +823,7 @@ static struct parm_struct parm_table[] = { {"allow hosts", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_HIDE}, {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER}, {"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_HIDE}, - {"modules", P_LIST, P_GLOBAL, &Globals.szModules, NULL, NULL, FLAG_BASIC | FLAG_GLOBAL}, + {"preload modules", P_LIST, P_GLOBAL, &Globals.szPreloadModules, NULL, NULL, FLAG_BASIC | FLAG_GLOBAL}, {"Logging Options", P_SEP, P_SEPARATOR}, @@ -1609,7 +1609,7 @@ static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion) FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases) FN_GLOBAL_LIST(lp_passdb_backend, &Globals.szPassdbBackend) FN_GLOBAL_LIST(lp_sam_backend, &Globals.szSamBackend) -FN_GLOBAL_LIST(lp_modules, &Globals.szModules) +FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules) FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction) FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript) FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript) diff --git a/source3/passdb/pdb_interface.c b/source3/passdb/pdb_interface.c index d465439dda..48a039b3de 100644 --- a/source3/passdb/pdb_interface.c +++ b/source3/passdb/pdb_interface.c @@ -86,6 +86,18 @@ BOOL smb_register_passdb(const char *name, pdb_init_function init, int version) return True; } +struct pdb_init_function_entry *pdb_find_backend_entry(const char *name) +{ + struct pdb_init_function_entry *entry = backends; + + while(entry) { + if (strequal(entry->name, name)) return entry; + entry = entry->next; + } + + return NULL; +} + static NTSTATUS context_setsampwent(struct pdb_context *context, BOOL update) { NTSTATUS ret = NT_STATUS_UNSUCCESSFUL; @@ -423,8 +435,6 @@ static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_c lazy_initialize_passdb(); - entry = backends; - p = strchr(module_name, ':'); if (p) { @@ -435,27 +445,32 @@ static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_c trim_string(module_name, " ", " "); + DEBUG(5,("Attempting to find an passdb backend to match %s (%s)\n", selected, module_name)); - while(entry) { - if (strequal(entry->name, module_name)) - { - DEBUG(5,("Found pdb backend %s\n", module_name)); - nt_status = entry->init(context, methods, module_location); - if (NT_STATUS_IS_OK(nt_status)) { - DEBUG(5,("pdb backend %s has a valid init\n", selected)); - } else { - DEBUG(0,("pdb backend %s did not correctly init (error was %s)\n", selected, nt_errstr(nt_status))); - } - SAFE_FREE(module_name); - return nt_status; - break; /* unreached */ - } - entry = entry->next; - } + entry = pdb_find_backend_entry(module_name); + + /* Try to find a module that contains this module */ + if(!entry) { + smb_probe_module("passdb", module_name); + entry = pdb_find_backend_entry(module_name); + } + /* No such backend found */ + if(!entry) { + SAFE_FREE(module_name); + return NT_STATUS_INVALID_PARAMETER; + } + + DEBUG(5,("Found pdb backend %s\n", module_name)); + nt_status = entry->init(context, methods, module_location); + if (NT_STATUS_IS_OK(nt_status)) { + DEBUG(5,("pdb backend %s has a valid init\n", selected)); + } else { + DEBUG(0,("pdb backend %s did not correctly init (error was %s)\n", selected, nt_errstr(nt_status))); + } SAFE_FREE(module_name); - return NT_STATUS_INVALID_PARAMETER; + return nt_status; } /****************************************************************** diff --git a/source3/smbd/server.c b/source3/smbd/server.c index ba03a9b9de..b7fb3b5701 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -412,8 +412,7 @@ static BOOL open_sockets_smbd(BOOL is_daemon, BOOL interactive, const char *smb_ } /* Load DSO's */ - if(lp_modules()) - smb_load_modules(lp_modules()); + init_modules(); return True; } diff --git a/source3/utils/pdbedit.c b/source3/utils/pdbedit.c index ee269114c9..cec3e70687 100644 --- a/source3/utils/pdbedit.c +++ b/source3/utils/pdbedit.c @@ -536,8 +536,7 @@ int main (int argc, char **argv) exit(1); } - if(lp_modules()) - smb_load_modules(lp_modules()); + init_modules(); if (!init_names()) exit(1); diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c index 0fafd1b83d..b68deaaa5d 100644 --- a/source3/utils/testparm.c +++ b/source3/utils/testparm.c @@ -177,6 +177,12 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_ printf("'algorithmic rid base' must be even.\n"); } +#ifndef HAVE_DLOPEN + if (lp_preload_modules()) { + printf("WARNING: 'preload modules = ' set while loading plugins not supported.\n"); + } +#endif + return ret; } -- cgit From 742dcedfa2d5ae6361e62cb057e87eb54eb46d26 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 27 Feb 2003 02:17:54 +0000 Subject: We now use instead of just (strict XML syntax) (This used to be commit 7c00fff475e15a9e9d5c3d2c8394a2cdc1b90cac) --- source3/script/find_missing_doc.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/script/find_missing_doc.pl b/source3/script/find_missing_doc.pl index b582446569..b27a405e4d 100755 --- a/source3/script/find_missing_doc.pl +++ b/source3/script/find_missing_doc.pl @@ -30,7 +30,7 @@ close(IN); open(IN,$topdir.$doc_file) || die("Can't open $topdir$doc_file"); while() { - if( /([^<]*?)([ ]*)\(.\)([ ]*)<\/term>/g ) { + if( /([^<]*?)([ ]*)\(.\)([ ]*)<\/term>/g ) { $key = $1; $value = $2; $doc{$value} = $key; -- cgit From 42b4caa63232975e7886fa3ab9ce128afe1c9af2 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 27 Feb 2003 02:28:26 +0000 Subject: Remove documentation for obsolete parameters, but add a note in 'upgrading-to-3.0' (This used to be commit e37b69f33410844b55bcca07e95d0a76aa48a7de) --- docs/docbook/manpages/smb.conf.5.sgml | 147 +---------------------------- docs/docbook/projdoc/upgrading-to-3.0.sgml | 17 ++++ 2 files changed, 18 insertions(+), 146 deletions(-) diff --git a/docs/docbook/manpages/smb.conf.5.sgml b/docs/docbook/manpages/smb.conf.5.sgml index b483a97b31..78c7ecaef1 100644 --- a/docs/docbook/manpages/smb.conf.5.sgml +++ b/docs/docbook/manpages/smb.conf.5.sgml @@ -683,6 +683,7 @@ alias|alias|alias|alias... logon script lpq cache time machine password timeout + mangle prefix mangled stack map to guest max disk size @@ -728,7 +729,6 @@ alias|alias|alias|alias... preload printcap printcap name - printer driver file private dir protocol read bmpx @@ -768,7 +768,6 @@ alias|alias|alias|alias... unix password sync update encrypted use mmap - use rhosts use sendfile username level username map @@ -880,7 +879,6 @@ alias|alias|alias|alias... path posix locking postexec - postscript preexec preexec close preserve case @@ -889,8 +887,6 @@ alias|alias|alias|alias... printable printer printer admin - printer driver - printer driver location printer name printing public @@ -5853,22 +5849,6 @@ df $1 | tail -1 | awk '{print $2" "$4}' - - postscript (S) - This parameter forces a printer to interpret - the print files as PostScript. This is done by adding a %! - to the start of print output. - - This is most useful when you have lots of PCs that persist - in putting a control-D at the start of print jobs, which then - confuses your printer. - - Default: postscript = no - - - - - preexec (S) This option specifies a command to be run whenever @@ -6174,111 +6154,6 @@ print5|My Printer 5 - - - - printer driver (S) - Note :This is a deprecated - parameter and will be removed in the next major release - following version 2.2. Please see the instructions in - the Samba 2.2. Printing - HOWTO for more information - on the new method of loading printer drivers onto a Samba server. - - - This option allows you to control the string - that clients receive when they ask the server for the printer driver - associated with a printer. If you are using Windows95 or Windows NT - then you can use this to automate the setup of printers on your - system. - - You need to set this parameter to the exact string (case - sensitive) that describes the appropriate printer driver for your - system. If you don't know the exact string to use then you should - first try with no - printer driver option set and the client will - give you a list of printer drivers. The appropriate strings are - shown in a scroll box after you have chosen the printer manufacturer. - - See also printer - driver file. - - Example: printer driver = HP LaserJet 4L - - - - - - - printer driver file (G) - Note :This is a deprecated - parameter and will be removed in the next major release - following version 2.2. Please see the instructions in - the Samba 2.2. Printing - HOWTO for more information - on the new method of loading printer drivers onto a Samba server. - - - This parameter tells Samba where the printer driver - definition file, used when serving drivers to Windows 95 clients, is - to be found. If this is not set, the default is : - - SAMBA_INSTALL_DIRECTORY - /lib/printers.def - - This file is created from Windows 95 msprint.inf - files found on the Windows 95 client system. For more - details on setting up serving of printer drivers to Windows 95 - clients, see the outdated documentation file in the docs/ - directory, PRINTER_DRIVER.txt. - - See also - printer driver location. - - Default: None (set in compile). - - Example: printer driver file = - /usr/local/samba/printers/drivers.def - - - - - - - - printer driver location (S) - Note :This is a deprecated - parameter and will be removed in the next major release - following version 2.2. Please see the instructions in - the Samba 2.2. Printing - HOWTO for more information - on the new method of loading printer drivers onto a Samba server. - - - This parameter tells clients of a particular printer - share where to find the printer driver files for the automatic - installation of drivers for Windows 95 machines. If Samba is set up - to serve printer drivers to Windows 95 machines, this should be set to - - \\MACHINE\PRINTER$ - - Where MACHINE is the NetBIOS name of your Samba server, - and PRINTER$ is a share you set up for serving printer driver - files. For more details on setting this up see the outdated documentation - file in the docs/ directory, - PRINTER_DRIVER.txt. - - See also - printer driver file. - - Default: none - Example: printer driver location = \\MACHINE\PRINTER$ - - - - - - printer name (S) This parameter specifies the name of the printer @@ -7729,26 +7604,6 @@ let "time++" - - use rhosts (G) - If this global parameter is yes, it specifies - that the UNIX user's .rhosts file in their home directory - will be read to find the names of hosts and users who will be allowed - access without specifying a password. - - NOTE: The use of use rhosts - can be a major security hole. This is because you are - trusting the PC to supply the correct username. It is very easy to - get a PC to supply a false username. I recommend that the - use rhosts option be only used if you really know what - you are doing. - - Default: use rhosts = no - - - - - user (S) Synonym for diff --git a/docs/docbook/projdoc/upgrading-to-3.0.sgml b/docs/docbook/projdoc/upgrading-to-3.0.sgml index 5b6b8dd635..c90c8922d6 100644 --- a/docs/docbook/projdoc/upgrading-to-3.0.sgml +++ b/docs/docbook/projdoc/upgrading-to-3.0.sgml @@ -16,4 +16,21 @@ FIXME + +Obsolete configuration options + + +In 3.0, the following configuration options have been removed. + + + +printer driver +printer driver file +printer driver location +use rhosts +postscript + + + + -- cgit From 5c82d3f00a2973b7f0881606d94ed36f0d0aa6be Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 27 Feb 2003 05:53:25 +0000 Subject: Doxygen janitor (This used to be commit 67bf36c69d19463c28066b276d74ac4784b26bed) --- source3/lib/iconv.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source3/lib/iconv.c b/source3/lib/iconv.c index 5292e9cf0a..f622704853 100644 --- a/source3/lib/iconv.c +++ b/source3/lib/iconv.c @@ -90,11 +90,12 @@ static size_t sys_iconv(void *cd, #endif } -/* - this is a simple portable iconv() implementaion. It only knows about - a very small number of character sets - just enough that Samba works - on systems that don't have iconv - */ +/** + * This is a simple portable iconv() implementaion. + * + * It only knows about a very small number of character sets - just + * enough that Samba works on systems that don't have iconv. + **/ size_t smb_iconv(smb_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) -- cgit From 97e7d2ffae74c9c07b38143c8fb028ee91b153bd Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 27 Feb 2003 21:21:02 +0000 Subject: additional fix for CR 601 * distinguish WinXP from Win2k * add a 1/3 of a second delay in OpenPrinter in order to trigger a LAN/WAN optimization in 2k clients. (This used to be commit 96570699d1b715f47c35aa211da6ec18f6fc4109) --- source3/include/smb.h | 2 +- source3/lib/util.c | 3 +++ source3/rpc_server/srv_spoolss_nt.c | 6 ++++++ source3/smbd/sesssetup.c | 17 ++++++++++++++++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/source3/include/smb.h b/source3/include/smb.h index a2b341d0fc..bd4f113039 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1408,7 +1408,7 @@ enum ldap_ssl_types {LDAP_SSL_ON, LDAP_SSL_OFF, LDAP_SSL_START_TLS}; enum ldap_passwd_sync_types {LDAP_PASSWD_SYNC_ON, LDAP_PASSWD_SYNC_OFF, LDAP_PASSWD_SYNC_ONLY}; /* Remote architectures we know about. */ -enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_WIN2K, RA_SAMBA}; +enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_WIN2K, RA_WINXP, RA_SAMBA}; /* case handling */ enum case_handling {CASE_LOWER,CASE_UPPER}; diff --git a/source3/lib/util.c b/source3/lib/util.c index 3958600cbd..15b75356a8 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -1764,6 +1764,9 @@ void set_remote_arch(enum remote_arch_types type) case RA_WIN2K: fstrcpy(remote_arch, "Win2K"); return; + case RA_WINXP: + fstrcpy(remote_arch, "WinXP"); + return; case RA_SAMBA: fstrcpy(remote_arch,"Samba"); return; diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index fa9b8eaeff..4006d0c08e 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -1675,6 +1675,12 @@ Can't find printer handle we created for printer %s\n", name )); &Printer->nt_devmode ); } + /* HACK ALERT!!! Sleep for 1/3 of a second to try trigger a LAN/WAN + optimization in Windows 2000 clients --jerry */ + + if ( RA_WIN2K == get_remote_arch() ) + usleep( 384000 ); + return WERR_OK; } diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index 7e5ec56a27..dfe246e398 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -557,7 +557,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf, set_remote_arch( RA_WIN95); } } - + if (!doencrypt) { /* both Win95 and WinNT stuff up the password lengths for non-encrypting systems. Uggh. @@ -607,6 +607,21 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf, p += srvstr_pull_buf(inbuf, native_lanman, p, sizeof(native_lanman), STR_TERMINATE); DEBUG(3,("Domain=[%s] NativeOS=[%s] NativeLanMan=[%s]\n", domain,native_os,native_lanman)); + + /* + * we distinguish between 2K and XP by the "Native Lan Manager" string + * WinXP => "Windows 2002 5.1" + * Win2k => "Windows 2000 5.0" + * NT4 => "Windows NT 4.0" + * Win9x => "Windows 4.0" + */ + + if ( ra_type == RA_WIN2K ) { + if ( 0 == strcmp( native_lanman, "Windows 2002 5.1" ) ) + set_remote_arch( RA_WINXP ); + } + + } DEBUG(3,("sesssetupX:name=[%s]\\[%s]@[%s]\n", domain, user, get_remote_machine_name())); -- cgit From dc1cd583cb4224f0fdb8c4529b59a66eeddba2f9 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 27 Feb 2003 21:37:54 +0000 Subject: don't pass NULL pointers to strcmp() (This used to be commit 6631984b12a3f74b93f7031c433dd81d6586a5df) --- source3/smbd/dir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index e022d26ea3..2a5f7ffd71 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1063,8 +1063,8 @@ char *DirCacheCheck( const char *path, const char *name, int snum ) NULL != entry; entry = (dir_cache_entry *)ubi_dlNext( entry ) ) { if( entry->snum == snum - && 0 == strcmp( name, entry->name ) - && 0 == strcmp( path, entry->path ) ) { + && entry->name && 0 == strcmp( name, entry->name ) + && entry->path && 0 == strcmp( path, entry->path ) ) { DEBUG(4, ("Got dir cache hit on %s %s -> %s\n",path,name,entry->dname)); return( entry->dname ); } -- cgit From 3a7d807ec9974f0b4d7938a4b734c2c7f350cd08 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 27 Feb 2003 23:24:26 +0000 Subject: and the winner of "i should have just written it in assembly is..." don't use pstrcpy() when you are not dealing with pstrings. (This used to be commit 7d547f50f914747291acc71fd3544ad92ce91f0e) --- source3/smbd/dir.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index 2a5f7ffd71..10241e88d9 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1028,9 +1028,9 @@ void DirCacheAdd( const char *path, char *name, char *dname, int snum ) return; /* so just return as if nothing happened. */ /* Set pointers correctly and load values. */ - entry->path = pstrcpy( (char *)&entry[1], path); - entry->name = pstrcpy( &(entry->path[pathlen]), name); - entry->dname = pstrcpy( &(entry->name[namelen]), dname); + entry->path = memcpy( (char *)&entry[1], path, strlen(path) ); + entry->name = memcpy( &(entry->path[pathlen]), name, strlen(name) ); + entry->dname = memcpy( &(entry->name[namelen]), dname, strlen(dname) ); entry->snum = snum; /* Add the new entry to the linked list. */ -- cgit From 17c417e6e66e05d6bcee98cb1c7ebfa7d98a5347 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 27 Feb 2003 23:52:37 +0000 Subject: don't forget the NULL (This used to be commit f80610120483c929afbec83d2b8649cb3e5111b0) --- source3/smbd/dir.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index 10241e88d9..95acf4a262 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1028,9 +1028,9 @@ void DirCacheAdd( const char *path, char *name, char *dname, int snum ) return; /* so just return as if nothing happened. */ /* Set pointers correctly and load values. */ - entry->path = memcpy( (char *)&entry[1], path, strlen(path) ); - entry->name = memcpy( &(entry->path[pathlen]), name, strlen(name) ); - entry->dname = memcpy( &(entry->name[namelen]), dname, strlen(dname) ); + entry->path = memcpy( (char *)&entry[1], path, strlen(path)+1 ); + entry->name = memcpy( &(entry->path[pathlen]), name, strlen(name)+1 ); + entry->dname = memcpy( &(entry->name[namelen]), dname, strlen(dname)+1 ); entry->snum = snum; /* Add the new entry to the linked list. */ -- cgit From 9f0ae6fad2d0099a58fec389ddd430c0448ec02e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 28 Feb 2003 00:26:20 +0000 Subject: *Excellent* patch from Michael Steffens to limit the unix domain sockets used by winbindd (also solves FD_SETSIZE problem in winbindd to boot !). Adds a "last_access" field to winbindd connections, and will close the oldest idle connection once the number of open connections goes over WINBINDD_MAX_SIMULTANEOUS_CLIENTS (defined in local.h as 200 currently). Jeremy. (This used to be commit a82caefda49396641e8650db8a7ef51752ba6c41) --- source3/include/local.h | 2 ++ source3/nsswitch/winbindd.c | 53 ++++++++++++++++++++++++++++++++++++++++----- source3/nsswitch/winbindd.h | 21 +++++++++--------- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/source3/include/local.h b/source3/include/local.h index e16cdbbc5d..29b0641119 100644 --- a/source3/include/local.h +++ b/source3/include/local.h @@ -221,4 +221,6 @@ /* Number in seconds for winbindd to wait for the mutex. Make this 2 * smbd wait time. */ #define WINBIND_SERVER_MUTEX_WAIT_TIME (( ((NUM_CLI_AUTH_CONNECT_RETRIES) * ((CLI_AUTH_TIMEOUT)/1000)) + 5)*2) +/* Max number of simultaneous winbindd socket connections. */ +#define WINBINDD_MAX_SIMULTANEOUS_CLIENTS 200 #endif diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index 09b89462ec..ad37768c09 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -339,7 +339,9 @@ static void new_connection(int listen_sock) ZERO_STRUCTP(state); state->sock = sock; - + + state->last_access = time(NULL); + /* Add to connection list */ winbindd_add_client(state); @@ -375,6 +377,35 @@ static void remove_client(struct winbindd_cli_state *state) } +/* Shutdown client connection which has been idle for the longest time */ + +static BOOL remove_idle_client(void) +{ + struct winbindd_cli_state *state, *remove_state = NULL; + time_t last_access = 0; + int nidle = 0; + + for (state = winbindd_client_list(); state; state = state->next) { + if (state->read_buf_len == 0 && state->write_buf_len == 0 && + !state->getpwent_state && !state->getgrent_state) { + nidle++; + if (!last_access || state->last_access < last_access) { + last_access = state->last_access; + remove_state = state; + } + } + } + + if (remove_state) { + DEBUG(5,("Found %d idle client connections, shutting down sock %d, pid %u\n", + nidle, remove_state->sock, (unsigned int)remove_state->pid)); + remove_client(remove_state); + return True; + } + + return False; +} + /* Process a complete received packet from a client */ void winbind_process_packet(struct winbindd_cli_state *state) @@ -427,6 +458,7 @@ void winbind_client_read(struct winbindd_cli_state *state) /* Update client state */ state->read_buf_len += n; + state->last_access = time(NULL); } /* Write some data to a client connection */ @@ -477,7 +509,8 @@ static void client_write(struct winbindd_cli_state *state) /* Update client state */ state->write_buf_len -= num_written; - + state->last_access = time(NULL); + /* Have we written all data? */ if (state->write_buf_len == 0) { @@ -508,7 +541,7 @@ static void client_write(struct winbindd_cli_state *state) } } -/* Process incoming clients on accept_sock. We use a tricky non-blocking, +/* Process incoming clients on listen_sock. We use a tricky non-blocking, non-forking, non-threaded model which allows us to handle many simultaneous connections while remaining impervious to many denial of service attacks. */ @@ -608,7 +641,7 @@ static void process_loop(void) exit(1); } - /* Create a new connection if accept_sock readable */ + /* Create a new connection if listen_sock readable */ if (selret > 0) { @@ -616,8 +649,18 @@ static void process_loop(void) dual_select(&w_fds); } - if (FD_ISSET(listen_sock, &r_fds)) + if (FD_ISSET(listen_sock, &r_fds)) { + while (winbindd_num_clients() > WINBINDD_MAX_SIMULTANEOUS_CLIENTS - 1) { + DEBUG(5,("winbindd: Exceeding %d client connections, removing idle connection.\n", + WINBINDD_MAX_SIMULTANEOUS_CLIENTS)); + if (!remove_idle_client()) { + DEBUG(0,("winbindd: Exceeding %d client connections, no idle connection found\n", + WINBINDD_MAX_SIMULTANEOUS_CLIENTS)); + break; + } + } new_connection(listen_sock); + } /* Process activity on client connections */ diff --git a/source3/nsswitch/winbindd.h b/source3/nsswitch/winbindd.h index 8bd8a83748..42ef209faf 100644 --- a/source3/nsswitch/winbindd.h +++ b/source3/nsswitch/winbindd.h @@ -36,16 +36,17 @@ /* Client state structure */ struct winbindd_cli_state { - struct winbindd_cli_state *prev, *next; /* Linked list pointers */ - int sock; /* Open socket from client */ - pid_t pid; /* pid of client */ - int read_buf_len, write_buf_len; /* Indexes in request/response */ - BOOL finished; /* Can delete from list */ - BOOL write_extra_data; /* Write extra_data field */ - struct winbindd_request request; /* Request from client */ - struct winbindd_response response; /* Respose to client */ - struct getent_state *getpwent_state; /* State for getpwent() */ - struct getent_state *getgrent_state; /* State for getgrent() */ + struct winbindd_cli_state *prev, *next; /* Linked list pointers */ + int sock; /* Open socket from client */ + pid_t pid; /* pid of client */ + int read_buf_len, write_buf_len; /* Indexes in request/response */ + BOOL finished; /* Can delete from list */ + BOOL write_extra_data; /* Write extra_data field */ + time_t last_access; /* Time of last access (read or write) */ + struct winbindd_request request; /* Request from client */ + struct winbindd_response response; /* Respose to client */ + struct getent_state *getpwent_state; /* State for getpwent() */ + struct getent_state *getgrent_state; /* State for getgrent() */ }; /* State between get{pw,gr}ent() calls */ -- cgit From a001b706bd85f40b2b9096af1ab92b135440f184 Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Fri, 28 Feb 2003 03:21:22 +0000 Subject: Improve net ads lookup: - More info is printed - (grand)child domains handled properly Thanks to Anthony Liguori (aliguori@us.ibm.com) (This used to be commit 3dbcb4d93f7c192eb2ccea5941a3843b5de1190e) --- source3/utils/net_ads_cldap.c | 203 +++++++++++++++++++++++++++++------------- 1 file changed, 142 insertions(+), 61 deletions(-) diff --git a/source3/utils/net_ads_cldap.c b/source3/utils/net_ads_cldap.c index f81c763093..d369fbdf50 100644 --- a/source3/utils/net_ads_cldap.c +++ b/source3/utils/net_ads_cldap.c @@ -2,6 +2,7 @@ Samba Unix/Linux SMB client library net ads cldap functions Copyright (C) 2001 Andrew Tridgell (tridge@samba.org) + Copyright (C) 2003 Jim McDonough (jmcd@us.ibm.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,60 +24,69 @@ #ifdef HAVE_ADS +struct netlogon_string { + uint32 comp_len; + char **component; + uint8 extra_flag; +}; + struct cldap_netlogon_reply { - uint32 version; + uint32 type; uint32 flags; GUID guid; - char *domain; - char *server_name; - char *domain_flatname; - char *server_flatname; - char *dns_name; - uint32 unknown2[2]; -}; + struct netlogon_string forest; + struct netlogon_string domain; + struct netlogon_string hostname; -/* - pull a length prefixed string from a packet - return number of bytes consumed -*/ -static unsigned pull_len_string(char **ret, const char *p) -{ - unsigned len = *p; - (*ret) = NULL; - if (len == 0) return 1; - (*ret) = smb_xstrndup(p+1, len); - return len+1; -} + struct netlogon_string netbios_domain; + struct netlogon_string netbios_hostname; + + struct netlogon_string user_name; + struct netlogon_string site_name; + + struct netlogon_string unk0; + + uint32 version; + uint16 lmnt_token; + uint16 lm20_token; +}; /* - pull a dotted string from a packet - return number of bytes consumed + These strings are rather interesting... They are composed of a series of + length encoded strings, terminated by either 1) a zero length string or 2) + a 0xc0 byte with what appears to be a one byte flags immediately following. */ -static unsigned pull_dotted_string(char **ret, const char *p) +static unsigned pull_netlogon_string(struct netlogon_string *ret,const char *d) { - char *s; - unsigned len, total_len=0; + char *s, *p = (char *)d; + + ZERO_STRUCTP(ret); - (*ret) = NULL; + do { + unsigned len = (unsigned char)*p; + p++; - while ((len = pull_len_string(&s, p)) > 1) { - if (total_len) { - char *s2; - asprintf(&s2, "%s.%s", *ret, s); - SAFE_FREE(*ret); - (*ret) = s2; + if (len > 0 && len != 0xc0) { + ret->component = realloc(ret->component, + ++ret->comp_len * + sizeof(char *)); + + ret->component[ret->comp_len - 1] = + smb_xstrndup(p, len); + p += len; } else { - (*ret) = s; + if (len == 0xc0) { + ret->extra_flag = *p; + p++; + }; + break; } - total_len += len; - p += len; - } + } while (1); - return total_len + 1; + return (p - d); } - /* do a cldap netlogon query */ @@ -190,19 +200,25 @@ static int recv_cldap_netlogon(int sock, struct cldap_netlogon_reply *reply) p = os3.data; - reply->version = IVAL(p, 0); p += 4; + reply->type = IVAL(p, 0); p += 4; reply->flags = IVAL(p, 0); p += 4; + memcpy(&reply->guid.info, p, GUID_SIZE); p += GUID_SIZE; - p += pull_dotted_string(&reply->domain, p); - p += 2; /* 0xc018 - whats this? */ - p += pull_len_string(&reply->server_name, p); - p += 2; /* 0xc018 - whats this? */ - p += pull_len_string(&reply->domain_flatname, p); - p += 1; - p += pull_len_string(&reply->server_flatname, p); - p += 2; - p += pull_len_string(&reply->dns_name, p); + + p += pull_netlogon_string(&reply->forest, p); + p += pull_netlogon_string(&reply->domain, p); + p += pull_netlogon_string(&reply->hostname, p); + p += pull_netlogon_string(&reply->netbios_domain, p); + p += pull_netlogon_string(&reply->netbios_hostname, p); + p += pull_netlogon_string(&reply->user_name, p); + p += pull_netlogon_string(&reply->site_name, p); + + p += pull_netlogon_string(&reply->unk0, p); + + reply->version = IVAL(p, 0); + reply->lmnt_token = SVAL(p, 4); + reply->lm20_token = SVAL(p, 6); data_blob_free(&os1); data_blob_free(&os2); @@ -212,17 +228,50 @@ static int recv_cldap_netlogon(int sock, struct cldap_netlogon_reply *reply) return 0; } +/* + free a netlogon string +*/ +static void netlogon_string_free(struct netlogon_string *str) +{ + int i; + + for (i = 0; i < str->comp_len; ++i) { + SAFE_FREE(str->component[i]); + } + SAFE_FREE(str->component); +} /* free a cldap reply packet */ static void cldap_reply_free(struct cldap_netlogon_reply *reply) { - SAFE_FREE(reply->domain); - SAFE_FREE(reply->server_name); - SAFE_FREE(reply->domain_flatname); - SAFE_FREE(reply->server_flatname); - SAFE_FREE(reply->dns_name); + netlogon_string_free(&reply->forest); + netlogon_string_free(&reply->domain); + netlogon_string_free(&reply->hostname); + netlogon_string_free(&reply->netbios_domain); + netlogon_string_free(&reply->netbios_hostname); + netlogon_string_free(&reply->user_name); + netlogon_string_free(&reply->site_name); + netlogon_string_free(&reply->unk0); +} + +static void d_print_netlogon_string(const char *label, + struct netlogon_string *str) +{ + int i; + + if (str->comp_len) { + d_printf("%s", label); + if (str->extra_flag) { + d_printf("[%d]", str->extra_flag); + } + d_printf(": "); + for (i = 0; i < str->comp_len; ++i) { + d_printf("%s%s", (i ? "." : ""), str->component[i]); + } + d_printf("\n"); + } } /* @@ -246,7 +295,6 @@ int ads_cldap_netlogon(ADS_STRUCT *ads) if (ret != 0) { return ret; } - ret = recv_cldap_netlogon(sock, &reply); close(sock); @@ -254,15 +302,48 @@ int ads_cldap_netlogon(ADS_STRUCT *ads) return -1; } - d_printf("Version: 0x%x\n", reply.version); + d_printf("Information for Domain Controller: %s\n\n", + ads->config.ldap_server_name); + + d_printf("Response Type: 0x%x\n", reply.type); d_printf("GUID: "); print_guid(&reply.guid); - d_printf("Flags: 0x%x\n", reply.flags); - d_printf("Domain: %s\n", reply.domain); - d_printf("Server Name: %s\n", reply.server_name); - d_printf("Flatname: %s\n", reply.domain_flatname); - d_printf("Server Name2: %s\n", reply.server_flatname); - d_printf("DNS Name: %s\n", reply.dns_name); + d_printf("Flags:\n" + "\tIs a PDC: %s\n" + "\tIs a GC of the forest: %s\n" + "\tIs an LDAP server: %s\n" + "\tSupports DS: %s\n" + "\tIs running a KDC: %s\n" + "\tIs running time services: %s\n" + "\tIs the closest DC: %s\n" + "\tIs writable: %s\n" + "\tHas a hardware clock: %s\n" + "\tIs a non-domain NC serviced by LDAP server: %s\n", + (reply.flags & ADS_PDC) ? "yes" : "no", + (reply.flags & ADS_GC) ? "yes" : "no", + (reply.flags & ADS_LDAP) ? "yes" : "no", + (reply.flags & ADS_DS) ? "yes" : "no", + (reply.flags & ADS_KDC) ? "yes" : "no", + (reply.flags & ADS_TIMESERV) ? "yes" : "no", + (reply.flags & ADS_CLOSEST) ? "yes" : "no", + (reply.flags & ADS_WRITABLE) ? "yes" : "no", + (reply.flags & ADS_GOOD_TIMESERV) ? "yes" : "no", + (reply.flags & ADS_NDNC) ? "yes" : "no"); + + d_print_netlogon_string("Forest", &reply.forest); + d_print_netlogon_string("Domain", &reply.domain); + d_print_netlogon_string("Hostname", &reply.hostname); + + d_print_netlogon_string("Pre-Win2k Domain", &reply.netbios_domain); + d_print_netlogon_string("Pre-Win2k Hostname", &reply.netbios_hostname); + + d_print_netlogon_string("User name", &reply.user_name); + d_print_netlogon_string("Site Name", &reply.site_name); + d_print_netlogon_string("Unknown Field", &reply.unk0); + + d_printf("NT Version: %d\n", reply.version); + d_printf("LMNT Token: %0.2x\n", reply.lmnt_token); + d_printf("LM20 Token: %0.2x\n", reply.lm20_token); cldap_reply_free(&reply); -- cgit From db47e9450aff5ff5b6853f163d4aab117d1c77aa Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Fri, 28 Feb 2003 03:29:03 +0000 Subject: cleanup some compiler warnings (This used to be commit 87cebe797f06fab4a5d0077fd78b2183ff7333a5) --- source3/utils/net_ads_cldap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source3/utils/net_ads_cldap.c b/source3/utils/net_ads_cldap.c index d369fbdf50..ad66af0439 100644 --- a/source3/utils/net_ads_cldap.c +++ b/source3/utils/net_ads_cldap.c @@ -59,7 +59,7 @@ struct cldap_netlogon_reply { */ static unsigned pull_netlogon_string(struct netlogon_string *ret,const char *d) { - char *s, *p = (char *)d; + char *p = (char *)d; ZERO_STRUCTP(ret); @@ -342,8 +342,8 @@ int ads_cldap_netlogon(ADS_STRUCT *ads) d_print_netlogon_string("Unknown Field", &reply.unk0); d_printf("NT Version: %d\n", reply.version); - d_printf("LMNT Token: %0.2x\n", reply.lmnt_token); - d_printf("LM20 Token: %0.2x\n", reply.lm20_token); + d_printf("LMNT Token: %.2x\n", reply.lmnt_token); + d_printf("LM20 Token: %.2x\n", reply.lm20_token); cldap_reply_free(&reply); -- cgit From 37e39f5be4ae0156565b009ae210f2c95e906142 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 03:34:18 +0000 Subject: Add simple test harness that exposes StrCaseCmp for testing. (This used to be commit ab77beca041595bc3bd70de3a6e1b49159a4964b) --- source3/torture/t_strcmp.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 source3/torture/t_strcmp.c diff --git a/source3/torture/t_strcmp.c b/source3/torture/t_strcmp.c new file mode 100644 index 0000000000..622769001b --- /dev/null +++ b/source3/torture/t_strcmp.c @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2003 by Martin Pool + * + * Test harness for StrCaseCmp + */ + +#include "includes.h" + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "usage: %s STRING1 STRING2\nCompares two strings\n", + argv[0]); + return 2; + } + + printf("%d\n", StrCaseCmp(argv[1], argv[2])); + + return 0; +} -- cgit From 921e569ed50408d42ddab5d524cf39a86429d488 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 03:51:25 +0000 Subject: Add a comment about the meaning of samba's internal character set and how this interacts with it. (This used to be commit eb876ee9cf24eda04e0856899b232d060c669c0c) --- source3/lib/iconv.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/source3/lib/iconv.c b/source3/lib/iconv.c index f622704853..6786003de5 100644 --- a/source3/lib/iconv.c +++ b/source3/lib/iconv.c @@ -21,6 +21,30 @@ #include "includes.h" + +/** + * @file + * + * @brief Samba wrapper/stub for iconv character set conversion. + * + * iconv is the XPG2 interface for converting between character + * encodings. This file provides a Samba wrapper around it, and also + * a simple reimplementation that is used if the system does not + * implement iconv. + * + * Samba only works with encodings that are supersets of ASCII: ascii + * characters like whitespace can be tested for directly, multibyte + * sequences start with a byte with the high bit set, and strings are + * terminated by \0. + * + * Note that the only function provided by iconv is conversion between + * characters. It doesn't directly support operations like + * uppercasing or comparison. We have to convert to UCS-2 and compare + * there. + * + * @sa Samba Developers Guide + **/ + static size_t ascii_pull(void *,char **, size_t *, char **, size_t *); static size_t ascii_push(void *,char **, size_t *, char **, size_t *); static size_t utf8_pull(void *,char **, size_t *, char **, size_t *); -- cgit From 290098e39e04d66897e09c792a85b9a79cd86d49 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 03:59:47 +0000 Subject: Remove reference to "mainpage.dox" and CodingStandards, which have been removed. Put subdirectory names in file list, so we get lib/util_chr.c, not just util_chr.c. (This used to be commit aa2efaab1ffc77bec051cd206000951c72adeccc) --- source3/Doxyfile | 7 +++---- source3/mainpage.dox | 7 ------- 2 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 source3/mainpage.dox diff --git a/source3/Doxyfile b/source3/Doxyfile index 914ba25672..c1040781d8 100644 --- a/source3/Doxyfile +++ b/source3/Doxyfile @@ -23,8 +23,8 @@ HIDE_UNDOC_CLASSES = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ALWAYS_DETAILED_SEC = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = *source +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = $(PWD)/ INTERNAL_DOCS = YES CLASS_DIAGRAMS = YES SOURCE_BROWSER = YES @@ -61,8 +61,7 @@ WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = . \ - mainpage.dox +INPUT = . FILE_PATTERNS = *.c \ *.h \ *.idl diff --git a/source3/mainpage.dox b/source3/mainpage.dox deleted file mode 100644 index 8b72f80462..0000000000 --- a/source3/mainpage.dox +++ /dev/null @@ -1,7 +0,0 @@ -/** - -@mainpage - -@li \ref CodingSuggestions - -**/ -- cgit From 7ca743713b71fe31e3e81f56c91b70206df7a143 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 04:06:56 +0000 Subject: Fix comment typo (This used to be commit d2fd52c1b50f2d1abad84668911b04c72fdc4b8d) --- source3/web/swat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/web/swat.c b/source3/web/swat.c index 21ae104cef..4211b2f15a 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -21,7 +21,7 @@ */ /** - * @group swat SWAT + * @defgroup swat SWAT * @{ * @file swat.c * -- cgit From 22d482dade44b51bc150aa9f34fc89e995ccc934 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 04:09:58 +0000 Subject: Doxygen janitor: check_domain_match parameter is spelled "auth_context". (This used to be commit 571c3ce19344276aac1af56d2f69fcc5523f36eb) --- source3/auth/auth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/auth/auth.c b/source3/auth/auth.c index 2abdec3a39..8b33010e91 100644 --- a/source3/auth/auth.c +++ b/source3/auth/auth.c @@ -162,8 +162,8 @@ static BOOL check_domain_match(const char *user, const char *domain) * @param user_info Contains the user supplied components, including the passwords. * Must be created with make_user_info() or one of its wrappers. * - * @param auth_info Supplies the challenges and some other data. - * Must be created with make_auth_info(), and the challenges should be + * @param auth_context Supplies the challenges and some other data. + * Must be created with make_auth_context(), and the challenges should be * filled in, either at creation or by calling the challenge geneation * function auth_get_challenge(). * -- cgit From 4125dfca83930b42d28ef08f920e41c6b2f62134 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 04:11:28 +0000 Subject: Doxygen janitor: rpc_resolve_dc parameter is spelled "trust_passwd" (This used to be commit 9dbc3dcfe0bccf1f76930ae86970b48ba5ed1e91) --- source3/auth/auth_domain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/auth/auth_domain.c b/source3/auth/auth_domain.c index b3f50072bc..0d90a184a4 100644 --- a/source3/auth/auth_domain.c +++ b/source3/auth/auth_domain.c @@ -115,7 +115,7 @@ static NTSTATUS rpc_resolve_dc(const char *server, * @param cli the cli to return containing the active connection * @param server either a machine name or text IP address to * connect to. - * @param trust_password the trust password to establish the + * @param trust_passwd the trust password to establish the * credentials with. * **/ -- cgit From f5f59e866e5b761a6b0c95d29bb2d1ec0136652f Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 04:17:30 +0000 Subject: Doxygen janitor: fix parameter names, grammar, tag names. (This used to be commit 42d9ec28cd55dbcfda546c84fb842938aeda544d) --- source3/lib/gencache.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c index 7260e477b8..5c8ad1339b 100644 --- a/source3/lib/gencache.c +++ b/source3/lib/gencache.c @@ -94,12 +94,12 @@ BOOL gencache_shutdown(void) * Set an entry in the cache file. If there's no such * one, then add it. * - * @param key string that represents a key of this entry + * @param keystr string that represents a key of this entry * @param value text representation value being cached * @param timeout time when the value is expired * - * @return true when entry is successfuly stored or - * false on the attempt's failure + * @retval true when entry is successfuly stored + * @retval false on failure **/ BOOL gencache_set(const char *keystr, const char *value, time_t timeout) @@ -134,12 +134,12 @@ BOOL gencache_set(const char *keystr, const char *value, time_t timeout) /** * Set existing entry to the cache file. * - * @param key string that represents a key of this entry - * @param value text representation value being cached + * @param keystr string that represents a key of this entry + * @param valstr text representation value being cached * @param timeout time when the value is expired * - * @return true when entry is successfuly set or - * false on the attempt's failure + * @retval true when entry is successfuly set + * @retval false on failure **/ BOOL gencache_set_only(const char *keystr, const char *valstr, time_t timeout) @@ -189,10 +189,10 @@ BOOL gencache_set_only(const char *keystr, const char *valstr, time_t timeout) /** * Delete one entry from the cache file. * - * @param key string that represents a key of this entry + * @param keystr string that represents a key of this entry * - * @return true upon successful deletion or - * false in case of failure + * @retval true upon successful deletion + * @retval false in case of failure **/ BOOL gencache_del(const char *keystr) @@ -218,14 +218,14 @@ BOOL gencache_del(const char *keystr) /** * Get existing entry from the cache file. * - * @param key string that represents a key of this entry - * @param value buffer that is allocated and filled with the entry value + * @param keystr string that represents a key of this entry + * @param valstr buffer that is allocated and filled with the entry value * buffer's disposing must be done outside * @param timeout pointer to a time_t that is filled with entry's * timeout * - * @return true when entry is successfuly fetched or - * false on the failure + * @retval true when entry is successfuly fetched + * @retval False for failure **/ BOOL gencache_get(const char *keystr, char **valstr, time_t *timeout) -- cgit From 481b4e6d6ceeab644b5c4d1ee11bc221d8035202 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 28 Feb 2003 04:21:55 +0000 Subject: Doxygen janitor (This used to be commit 9af07173152c5e861d13b33a8d4aee8167a50b66) --- source3/lib/iconv.c | 2 +- source3/lib/messages.c | 14 +++++++------- source3/web/swat.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source3/lib/iconv.c b/source3/lib/iconv.c index 6786003de5..8b360a14c6 100644 --- a/source3/lib/iconv.c +++ b/source3/lib/iconv.c @@ -35,7 +35,7 @@ * Samba only works with encodings that are supersets of ASCII: ascii * characters like whitespace can be tested for directly, multibyte * sequences start with a byte with the high bit set, and strings are - * terminated by \0. + * terminated by a nul byte. * * Note that the only function provided by iconv is conversion between * characters. It doesn't directly support operations like diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 3603758e9f..5ff0e45c61 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -21,11 +21,11 @@ */ /** - @defgroups messages Internal messaging framework - @{ - @file messages.c - - This module is used for internal messaging between Samba daemons. + @defgroup messages Internal messaging framework + @{ + @file messages.c + + @brief Module for internal messaging between Samba daemons. The idea is that if a part of Samba wants to do communication with another Samba process then it will do a message_register() of a @@ -36,7 +36,7 @@ use that to reply by message_send_pid(). See ping_message() for a simple example. - *NOTE*: Dispatch functions must be able to cope with incoming + @caution Dispatch functions must be able to cope with incoming messages on an *odd* byte boundary. This system doesn't have any inherent size limitations but is not @@ -524,7 +524,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void * @param n_sent Set to the number of messages sent. This should be * equal to the number of processes, but be careful for races. * - * @return True for success. + * @retval True for success. **/ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, const void *buf, size_t len, diff --git a/source3/web/swat.c b/source3/web/swat.c index 4211b2f15a..d6693b4e75 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -21,7 +21,7 @@ */ /** - * @defgroup swat SWAT + * @defgroup swat SWAT - Samba Web Administration Tool * @{ * @file swat.c * -- cgit From e7ff3803a385925b52f09526d2bbc8ca479d2ae4 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 28 Feb 2003 04:36:08 +0000 Subject: - added help on -P option - added general options to 'net -h' help (This used to be commit ee8a7fdab7f5aa6f4a64f2eea90f0d44ae0f388a) --- source3/utils/net_help.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source3/utils/net_help.c b/source3/utils/net_help.c index 782a530035..4000a248ff 100644 --- a/source3/utils/net_help.c +++ b/source3/utils/net_help.c @@ -47,6 +47,7 @@ int net_common_flags_usage(int argc, const char **argv) d_printf("\t-U or --user=\t\tuser name\n"); d_printf("\t-s or --conf=\t\tpathname of smb.conf file\n"); d_printf("\t-l or --long\t\t\tDisplay full information\n"); + d_printf("\t-P or --machine-pass\t\tAuthenticate as machine account\n"); return -1; } @@ -160,6 +161,7 @@ static int net_usage(int argc, const char **argv) " net rpc \tto run RPC commands\n"\ "\n"\ "Type \"net help - + Once the addprinter command has been executed, smbd will reparse the smb.conf to determine if the share defined by the APW exists. If the sharename is still invalid, then smbd will return an ACCESS_DENIED error to the client. + + + The "add printer command" program can output a single line of text, + which Samba will set as the port the new printer is connected to. + If this line isn't output, Samba won't reload its printer shares. + See also deleteprinter command, Date: Fri, 7 Mar 2003 00:30:29 +0000 Subject: Found at Connectathon, .NET RC1 arranges trans/trans2/nttrans parameters differently to W2K, cope with this. Jeremy. (This used to be commit 172f415c9eaa4d310a52794e3dc1a6bc92206ce4) --- source3/smbd/ipc.c | 101 +++++++++++++++++++++++++++++++++++------------- source3/smbd/nttrans.c | 102 ++++++++++++++++++++++++++++++++++++++----------- source3/smbd/trans2.c | 93 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 227 insertions(+), 69 deletions(-) diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c index 7fe02dbccf..08337c2901 100644 --- a/source3/smbd/ipc.c +++ b/source3/smbd/ipc.c @@ -360,52 +360,66 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int uint16 *setup=NULL; int outsize = 0; uint16 vuid = SVAL(inbuf,smb_uid); - int tpscnt = SVAL(inbuf,smb_vwv0); - int tdscnt = SVAL(inbuf,smb_vwv1); - int mprcnt = SVAL(inbuf,smb_vwv2); - int mdrcnt = SVAL(inbuf,smb_vwv3); - int msrcnt = CVAL(inbuf,smb_vwv4); + unsigned int tpscnt = SVAL(inbuf,smb_vwv0); + unsigned int tdscnt = SVAL(inbuf,smb_vwv1); + unsigned int mprcnt = SVAL(inbuf,smb_vwv2); + unsigned int mdrcnt = SVAL(inbuf,smb_vwv3); + unsigned int msrcnt = CVAL(inbuf,smb_vwv4); BOOL close_on_completion = BITSETW(inbuf+smb_vwv5,0); BOOL one_way = BITSETW(inbuf+smb_vwv5,1); - int pscnt = SVAL(inbuf,smb_vwv9); - int psoff = SVAL(inbuf,smb_vwv10); - int dscnt = SVAL(inbuf,smb_vwv11); - int dsoff = SVAL(inbuf,smb_vwv12); - int suwcnt = CVAL(inbuf,smb_vwv13); + unsigned int pscnt = SVAL(inbuf,smb_vwv9); + unsigned int psoff = SVAL(inbuf,smb_vwv10); + unsigned int dscnt = SVAL(inbuf,smb_vwv11); + unsigned int dsoff = SVAL(inbuf,smb_vwv12); + unsigned int suwcnt = CVAL(inbuf,smb_vwv13); START_PROFILE(SMBtrans); memset(name, '\0',sizeof(name)); srvstr_pull_buf(inbuf, name, smb_buf(inbuf), sizeof(name), STR_TERMINATE); - if (dscnt > tdscnt || pscnt > tpscnt) { - exit_server("invalid trans parameters"); - } + if (dscnt > tdscnt || pscnt > tpscnt) + goto bad_param; if (tdscnt) { if((data = (char *)malloc(tdscnt)) == NULL) { - DEBUG(0,("reply_trans: data malloc fail for %d bytes !\n", tdscnt)); + DEBUG(0,("reply_trans: data malloc fail for %u bytes !\n", tdscnt)); END_PROFILE(SMBtrans); return(ERROR_DOS(ERRDOS,ERRnomem)); } + if ((dsoff+dscnt < dsoff) || (dsoff+dscnt < dscnt)) + goto bad_param; + if (smb_base(inbuf)+dsoff+dscnt > inbuf + size) + goto bad_param; + memcpy(data,smb_base(inbuf)+dsoff,dscnt); } if (tpscnt) { if((params = (char *)malloc(tpscnt)) == NULL) { - DEBUG(0,("reply_trans: param malloc fail for %d bytes !\n", tpscnt)); + DEBUG(0,("reply_trans: param malloc fail for %u bytes !\n", tpscnt)); END_PROFILE(SMBtrans); return(ERROR_DOS(ERRDOS,ERRnomem)); } + if ((psoff+pscnt < psoff) || (psoff+pscnt < pscnt)) + goto bad_param; + if (smb_base(inbuf)+psoff+pscnt > inbuf + size) + goto bad_param; + memcpy(params,smb_base(inbuf)+psoff,pscnt); } if (suwcnt) { int i; if((setup = (uint16 *)malloc(suwcnt*sizeof(uint16))) == NULL) { - DEBUG(0,("reply_trans: setup malloc fail for %d bytes !\n", (int)(suwcnt * sizeof(uint16)))); - END_PROFILE(SMBtrans); - return(ERROR_DOS(ERRDOS,ERRnomem)); - } + DEBUG(0,("reply_trans: setup malloc fail for %u bytes !\n", (unsigned int)(suwcnt * sizeof(uint16)))); + END_PROFILE(SMBtrans); + return(ERROR_DOS(ERRDOS,ERRnomem)); + } + if (inbuf+smb_vwv14+(suwcnt*SIZEOFWORD) > inbuf + size) + goto bad_param; + if ((smb_vwv14+(suwcnt*SIZEOFWORD) < smb_vwv14) || (smb_vwv14+(suwcnt*SIZEOFWORD) < (suwcnt*SIZEOFWORD))) + goto bad_param; + for (i=0;i tdscnt || pscnt > tpscnt) { - exit_server("invalid trans parameters"); - } + if (dscnt > tdscnt || pscnt > tpscnt) + goto bad_param; - if (pcnt) + if (pcnt) { + if (pdisp+pcnt >= tpscnt) + goto bad_param; + if ((pdisp+pcnt < pdisp) || (pdisp+pcnt < pcnt)) + goto bad_param; + if (smb_base(inbuf) + poff + pcnt >= inbuf + bufsize) + goto bad_param; + if (params + pdisp < params) + goto bad_param; + memcpy(params+pdisp,smb_base(inbuf)+poff,pcnt); - if (dcnt) + } + + if (dcnt) { + if (ddisp+dcnt >= tdscnt) + goto bad_param; + if ((ddisp+dcnt < ddisp) || (ddisp+dcnt < dcnt)) + goto bad_param; + if (smb_base(inbuf) + doff + dcnt >= inbuf + bufsize) + goto bad_param; + if (data + ddisp < data) + goto bad_param; + memcpy(data+ddisp,smb_base(inbuf)+doff,dcnt); + } } @@ -517,4 +554,14 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int END_PROFILE(SMBtrans); return(outsize); + + + bad_param: + + DEBUG(0,("reply_trans: invalid trans parameters\n")); + SAFE_FREE(data); + SAFE_FREE(params); + SAFE_FREE(setup); + END_PROFILE(SMBtrans); + return ERROR_DOS(ERRDOS,ERRinvalidparam); } diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index bfac4e82e3..375c6c44f6 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1771,8 +1771,7 @@ due to being in oplock break state.\n", (unsigned int)function_code )); if(CVAL(inbuf, smb_wct) != 19 + (setup_count/2)) { DEBUG(2,("Invalid smb_wct %d in nttrans call (should be %d)\n", CVAL(inbuf, smb_wct), 19 + (setup_count/2))); - END_PROFILE(SMBnttrans); - return ERROR_DOS(ERRSRV,ERRerror); + goto bad_param; } /* Allocate the space for the setup, the maximum needed parameters and data */ @@ -1799,21 +1798,38 @@ due to being in oplock break state.\n", (unsigned int)function_code )); num_data_sofar = data_count; if (parameter_count > total_parameter_count || data_count > total_data_count) - exit_server("reply_nttrans: invalid sizes in packet."); + goto bad_param; if(setup) { - memcpy( setup, &inbuf[smb_nt_SetupStart], setup_count); DEBUG(10,("reply_nttrans: setup_count = %d\n", setup_count)); + if ((smb_nt_SetupStart + setup_count < smb_nt_SetupStart) || + (smb_nt_SetupStart + setup_count < setup_count)) + goto bad_param; + if (smb_nt_SetupStart + setup_count > length) + goto bad_param; + + memcpy( setup, &inbuf[smb_nt_SetupStart], setup_count); dump_data(10, setup, setup_count); } if(params) { - memcpy( params, smb_base(inbuf) + parameter_offset, parameter_count); DEBUG(10,("reply_nttrans: parameter_count = %d\n", parameter_count)); + if ((parameter_offset + parameter_count < parameter_offset) || + (parameter_offset + parameter_count < parameter_count)) + goto bad_param; + if (smb_base(inbuf) + parameter_offset + parameter_count > inbuf + length) + goto bad_param; + + memcpy( params, smb_base(inbuf) + parameter_offset, parameter_count); dump_data(10, params, parameter_count); } if(data) { - memcpy( data, smb_base(inbuf) + data_offset, data_count); DEBUG(10,("reply_nttrans: data_count = %d\n",data_count)); + if ((data_offset + data_count < data_offset) || (data_offset + data_count < data_count)) + goto bad_param; + if (smb_base(inbuf) + data_offset + data_count > inbuf + length) + goto bad_param; + + memcpy( data, smb_base(inbuf) + data_offset, data_count); dump_data(10, data, data_count); } @@ -1826,6 +1842,8 @@ due to being in oplock break state.\n", (unsigned int)function_code )); while( num_data_sofar < total_data_count || num_params_sofar < total_parameter_count) { BOOL ret; + uint32 parameter_displacement; + uint32 data_displacement; ret = receive_next_smb(inbuf,bufsize,SMB_SECONDARY_WAIT); @@ -1837,25 +1855,57 @@ due to being in oplock break state.\n", (unsigned int)function_code )); DEBUG(0,("reply_nttrans: %s in getting secondary nttrans response.\n", (smb_read_error == READ_ERROR) ? "error" : "timeout" )); } - SAFE_FREE(params); - SAFE_FREE(data); - SAFE_FREE(setup); - END_PROFILE(SMBnttrans); - return ERROR_DOS(ERRSRV,ERRerror); + goto bad_param; } /* Revise total_params and total_data in case they have changed downwards */ - total_parameter_count = IVAL(inbuf, smb_nts_TotalParameterCount); - total_data_count = IVAL(inbuf, smb_nts_TotalDataCount); - num_params_sofar += (parameter_count = IVAL(inbuf,smb_nts_ParameterCount)); - num_data_sofar += ( data_count = IVAL(inbuf, smb_nts_DataCount)); - if (num_params_sofar > total_parameter_count || num_data_sofar > total_data_count) - exit_server("reply_nttrans2: data overflow in secondary nttrans packet"); - - memcpy( ¶ms[ IVAL(inbuf, smb_nts_ParameterDisplacement)], - smb_base(inbuf) + IVAL(inbuf, smb_nts_ParameterOffset), parameter_count); - memcpy( &data[IVAL(inbuf, smb_nts_DataDisplacement)], - smb_base(inbuf)+ IVAL(inbuf, smb_nts_DataOffset), data_count); + if (IVAL(inbuf, smb_nts_TotalParameterCount) < total_parameter_count) + total_parameter_count = IVAL(inbuf, smb_nts_TotalParameterCount); + if (IVAL(inbuf, smb_nts_TotalDataCount) < total_data_count) + total_data_count = IVAL(inbuf, smb_nts_TotalDataCount); + + parameter_count = IVAL(inbuf,smb_nts_ParameterCount); + parameter_offset = IVAL(inbuf, smb_nts_ParameterOffset); + parameter_displacement = IVAL(inbuf, smb_nts_ParameterDisplacement); + num_params_sofar += parameter_count; + + data_count = IVAL(inbuf, smb_nts_DataCount); + data_displacement = IVAL(inbuf, smb_nts_DataDisplacement); + data_offset = IVAL(inbuf, smb_nts_DataDisplacement); + num_data_sofar += data_count; + + if (num_params_sofar > total_parameter_count || num_data_sofar > total_data_count) { + DEBUG(0,("reply_nttrans2: data overflow in secondary nttrans packet")); + goto bad_param; + } + + if (parameter_count) { + if (parameter_displacement + parameter_count >= total_parameter_count) + goto bad_param; + if ((parameter_displacement + parameter_count < parameter_displacement) || + (parameter_displacement + parameter_count < parameter_count)) + goto bad_param; + if (smb_base(inbuf) + parameter_offset + parameter_count >= inbuf + bufsize) + goto bad_param; + if (parameter_displacement + params < params) + goto bad_param; + + memcpy( ¶ms[parameter_displacement], smb_base(inbuf) + parameter_offset, parameter_count); + } + + if (data_count) { + if (data_displacement + data_count >= total_data_count) + goto bad_param; + if ((data_displacement + data_count < data_displacement) || + (data_displacement + data_count < data_count)) + goto bad_param; + if (smb_base(inbuf) + data_offset + data_count >= inbuf + bufsize) + goto bad_param; + if (data_displacement + data < data) + goto bad_param; + + memcpy( &data[data_displacement], smb_base(inbuf)+ data_offset, data_count); + } } } @@ -1933,4 +1983,12 @@ due to being in oplock break state.\n", (unsigned int)function_code )); return outsize; /* If a correct response was needed the call_nt_transact_xxxx calls have already sent it. If outsize != -1 then it is returning an error packet. */ + + bad_param: + + SAFE_FREE(params); + SAFE_FREE(data); + SAFE_FREE(setup); + END_PROFILE(SMBnttrans); + return ERROR_DOS(ERRDOS,ERRinvalidparam); } diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 155c996314..d57a29ff77 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -3094,7 +3094,7 @@ int reply_trans2(connection_struct *conn, unsigned int suwcnt = SVAL(inbuf, smb_suwcnt); unsigned int tran_call = SVAL(inbuf, smb_setup0); char *params = NULL, *data = NULL; - int num_params, num_params_sofar, num_data, num_data_sofar; + unsigned int num_params, num_params_sofar, num_data, num_data_sofar; START_PROFILE(SMBtrans2); if(global_oplock_break && (tran_call == TRANSACT2_OPEN)) { @@ -3133,10 +3133,10 @@ int reply_trans2(connection_struct *conn, (SVAL(inbuf,(smb_setup+6)) == LMFUNC_GETJOBID)) { DEBUG(2,("Got Trans2 DevIOctl jobid\n")); } else { - DEBUG(2,("Invalid smb_sucnt in trans2 call(%d)\n",suwcnt)); + DEBUG(2,("Invalid smb_sucnt in trans2 call(%u)\n",suwcnt)); DEBUG(2,("Transaction is %d\n",tran_call)); END_PROFILE(SMBtrans2); - return ERROR_DOS(ERRSRV,ERRerror); + ERROR_DOS(ERRDOS,ERRinvalidparam); } } @@ -3162,10 +3162,22 @@ int reply_trans2(connection_struct *conn, if (num_params > total_params || num_data > total_data) exit_server("invalid params in reply_trans2"); - if(params) - memcpy( params, smb_base(inbuf) + SVAL(inbuf, smb_psoff), num_params); - if(data) - memcpy( data, smb_base(inbuf) + SVAL(inbuf, smb_dsoff), num_data); + if(params) { + unsigned int psoff = SVAL(inbuf, smb_psoff); + if ((psoff + num_params < psoff) || (psoff + num_params < num_params)) + goto bad_param; + if (smb_base(inbuf) + psoff + num_params > inbuf + length) + goto bad_param; + memcpy( params, smb_base(inbuf) + psoff, num_params); + } + if(data) { + unsigned int dsoff = SVAL(inbuf, smb_dsoff); + if ((dsoff + num_data < dsoff) || (dsoff + num_data < num_data)) + goto bad_param; + if (smb_base(inbuf) + dsoff + num_data > inbuf + length) + goto bad_param; + memcpy( data, smb_base(inbuf) + dsoff, num_data); + } if(num_data_sofar < total_data || num_params_sofar < total_params) { /* We need to send an interim response then receive the rest @@ -3177,6 +3189,10 @@ int reply_trans2(connection_struct *conn, while (num_data_sofar < total_data || num_params_sofar < total_params) { BOOL ret; + unsigned int param_disp; + unsigned int param_off; + unsigned int data_disp; + unsigned int data_off; ret = receive_next_smb(inbuf,bufsize,SMB_SECONDARY_WAIT); @@ -3188,25 +3204,55 @@ int reply_trans2(connection_struct *conn, else DEBUG(0,("reply_trans2: %s in getting secondary trans2 response.\n", (smb_read_error == READ_ERROR) ? "error" : "timeout" )); - SAFE_FREE(params); - SAFE_FREE(data); - END_PROFILE(SMBtrans2); - return ERROR_DOS(ERRSRV,ERRerror); + goto bad_param; } /* Revise total_params and total_data in case they have changed downwards */ - total_params = SVAL(inbuf, smb_tpscnt); - total_data = SVAL(inbuf, smb_tdscnt); - num_params_sofar += (num_params = SVAL(inbuf,smb_spscnt)); - num_data_sofar += ( num_data = SVAL(inbuf, smb_sdscnt)); + if (SVAL(inbuf, smb_tpscnt) < total_params) + total_params = SVAL(inbuf, smb_tpscnt); + if (SVAL(inbuf, smb_tdscnt) < total_data) + total_data = SVAL(inbuf, smb_tdscnt); + + num_params = SVAL(inbuf,smb_spscnt); + param_off = SVAL(inbuf, smb_spsoff); + param_disp = SVAL(inbuf, smb_spsdisp); + num_params_sofar += num_params; + + num_data = SVAL(inbuf, smb_sdscnt); + data_off = SVAL(inbuf, smb_sdsoff); + data_disp = SVAL(inbuf, smb_sdsdisp); + num_data_sofar += num_data; + if (num_params_sofar > total_params || num_data_sofar > total_data) - exit_server("data overflow in trans2"); + goto bad_param; - memcpy( ¶ms[ SVAL(inbuf, smb_spsdisp)], - smb_base(inbuf) + SVAL(inbuf, smb_spsoff), num_params); - memcpy( &data[SVAL(inbuf, smb_sdsdisp)], - smb_base(inbuf)+ SVAL(inbuf, smb_sdsoff), num_data); + if (num_params) { + if (param_disp + num_params >= total_params) + goto bad_param; + if ((param_disp + num_params < param_disp) || + (param_disp + num_params < num_params)) + goto bad_param; + if (smb_base(inbuf) + param_off + num_params >= inbuf + bufsize) + goto bad_param; + if (params + param_disp < params) + goto bad_param; + + memcpy( ¶ms[param_disp], smb_base(inbuf) + param_off, num_params); + } + if (num_data) { + if (data_disp + num_data >= total_data) + goto bad_param; + if ((data_disp + num_data < data_disp) || + (data_disp + num_data < num_data)) + goto bad_param; + if (smb_base(inbuf) + data_off + num_data >= inbuf + bufsize) + goto bad_param; + if (data + data_disp < data) + goto bad_param; + + memcpy( &data[data_disp], smb_base(inbuf) + data_off, num_data); + } } } @@ -3320,4 +3366,11 @@ int reply_trans2(connection_struct *conn, return outsize; /* If a correct response was needed the call_trans2xxx calls have already sent it. If outsize != -1 then it is returning */ + + bad_param: + + SAFE_FREE(params); + SAFE_FREE(data); + END_PROFILE(SMBtrans2); + return ERROR_DOS(ERRDOS,ERRinvalidparam); } -- cgit From cea6fd0b0ae4131e8cb9e541a5c2e91ce226e5cd Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 7 Mar 2003 00:34:43 +0000 Subject: Fix noticed by Corny.Bondad@hp.com. Ensure we free up memory on error exit. Jeremy. (This used to be commit 1cbd53dc3cd2d56f5e62d42fed5d589efcecb8f8) --- source3/smbd/ipc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c index 08337c2901..67c5da01f3 100644 --- a/source3/smbd/ipc.c +++ b/source3/smbd/ipc.c @@ -397,6 +397,7 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int if (tpscnt) { if((params = (char *)malloc(tpscnt)) == NULL) { DEBUG(0,("reply_trans: param malloc fail for %u bytes !\n", tpscnt)); + SAFE_FREE(data); END_PROFILE(SMBtrans); return(ERROR_DOS(ERRDOS,ERRnomem)); } @@ -412,6 +413,8 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int int i; if((setup = (uint16 *)malloc(suwcnt*sizeof(uint16))) == NULL) { DEBUG(0,("reply_trans: setup malloc fail for %u bytes !\n", (unsigned int)(suwcnt * sizeof(uint16)))); + SAFE_FREE(data); + SAFE_FREE(params); END_PROFILE(SMBtrans); return(ERROR_DOS(ERRDOS,ERRnomem)); } -- cgit From 80087e6cfed8f6aa55ed396e1690dff2dc32ece7 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 7 Mar 2003 09:25:48 +0000 Subject: safe_strcpy() -> fstrcpy() fix, and a cleanup to how rpcclient calls the IP address resolving code. (This used to be commit 1f605fe77c56ee2a7838c9f87eedf4bb91ebf688) --- source3/rpcclient/cmd_reg.c | 2 +- source3/rpcclient/rpcclient.c | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/source3/rpcclient/cmd_reg.c b/source3/rpcclient/cmd_reg.c index 19c0e7f71f..8943331dab 100644 --- a/source3/rpcclient/cmd_reg.c +++ b/source3/rpcclient/cmd_reg.c @@ -914,7 +914,7 @@ static NTSTATUS cmd_reg_shutdown(struct cli_state *cli, TALLOC_CTX *mem_ctx, switch (opt) { case 'm': - safe_strcpy(msg, optarg, sizeof(msg)-1); + fstrcpy(msg, optarg); /*fprintf (stderr, "[%s|%s]\n", optarg, msg);*/ break; diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index 127506fb39..c3b2cd4ea1 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -592,6 +592,8 @@ out_free: { NULL } }; + ZERO_STRUCT(server_ip); + setlinebuf(stdout); /* Parse options */ @@ -674,13 +676,6 @@ out_free: if (!init_names()) return 1; - /* Resolve the IP address */ - - if (!opt_ipaddr && !resolve_name(server, &server_ip, 0x20)) { - fprintf(stderr, "Unable to resolve %s\n", server); - return 1; - } - /* * Get password * from stdin if necessary @@ -697,7 +692,7 @@ out_free: get_username(username); nt_status = cli_full_connection(&cli, global_myname(), server, - &server_ip, 0, + opt_ipaddr ? &server_ip : NULL, 0, "IPC$", "IPC", username, domain, password, 0, NULL); -- cgit From 04858cd7025bb4c3fdb34a2795568a6b52004c3b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 7 Mar 2003 09:29:56 +0000 Subject: Limit the number of SIDs that may be looked up, in line with existing code for name->sid. (This used to be commit 0ebccc0dbeecc10d423529909a2563fbc3bf9857) --- source3/rpc_server/srv_lsa_nt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source3/rpc_server/srv_lsa_nt.c b/source3/rpc_server/srv_lsa_nt.c index 1b42c5f141..fb6538db39 100644 --- a/source3/rpc_server/srv_lsa_nt.c +++ b/source3/rpc_server/srv_lsa_nt.c @@ -641,6 +641,11 @@ NTSTATUS _lsa_lookup_sids(pipes_struct *p, LSA_Q_LOOKUP_SIDS *q_u, LSA_R_LOOKUP_ LSA_TRANS_NAME_ENUM *names = NULL; uint32 mapped_count = 0; + if (num_entries > MAX_LOOKUP_SIDS) { + num_entries = MAX_LOOKUP_SIDS; + DEBUG(5,("_lsa_lookup_sids: truncating SID lookup list to %d\n", num_entries)); + } + ref = (DOM_R_REF *)talloc_zero(p->mem_ctx, sizeof(DOM_R_REF)); names = (LSA_TRANS_NAME_ENUM *)talloc_zero(p->mem_ctx, sizeof(LSA_TRANS_NAME_ENUM)); -- cgit From 8a751c019c21b1925fd352639f8237cf0a6ebac9 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 7 Mar 2003 18:26:24 +0000 Subject: Some progress towards gums and tdbsam2 genparser works fine, and it is a marvelous tool to store objects in tdb :) (This used to be commit 4c6d461a8572f03cd33cba95500cc837638b732c) --- source3/include/gums.h | 102 ++--- source3/include/includes.h | 2 + source3/include/tdbsam2.h | 11 +- source3/lib/util_sid.c | 18 + source3/rpc_parse/parse_sec.c | 18 - source3/sam/gumm_tdb.c | 891 ++++++++++++++++++++++++++++++++++++------ source3/sam/gums.c | 38 +- source3/sam/gums_api.c | 310 ++++++++++++--- source3/sam/gums_helper.c | 47 +-- source3/script/genstruct.pl | 15 +- 10 files changed, 1166 insertions(+), 286 deletions(-) diff --git a/source3/include/gums.h b/source3/include/gums.h index ca124d7442..789acc269f 100644 --- a/source3/include/gums.h +++ b/source3/include/gums.h @@ -21,8 +21,8 @@ #ifndef _GUMS_H #define _GUMS_H -#define GUMS_VERSION_MAJOR 0 -#define GUMS_VERSION_MINOR 1 +#define GUMS_VERSION_MAJOR 0 +#define GUMS_VERSION_MINOR 1 #define GUMS_OBJECT_VERSION 1 #define GUMS_OBJ_DOMAIN 1 @@ -74,10 +74,17 @@ typedef struct gums_group } GUMS_GROUP; +typedef struct gums_domain +{ + uint32 next_rid; + +} GUMS_DOMAIN; + union gums_obj_p { - gums_user *user; - gums_group *group; -} + GUMS_USER *user; + GUMS_GROUP *group; + GUMS_DOMAIN *domain; +}; typedef struct gums_object { @@ -112,6 +119,7 @@ typedef struct gums_commit_set DOM_SID sid; /* Object Sid */ uint32 count; /* number of changes */ GUMS_DATA_SET **data; + } GUMS_COMMIT_SET; typedef struct gums_privilege @@ -145,7 +153,7 @@ typedef struct gums_functions NTSTATUS (*delete_object) (const DOM_SID *sid); NTSTATUS (*get_object_from_sid) (GUMS_OBJECT **object, const DOM_SID *sid, const int obj_type); - NTSTATUS (*get_sid_from_name) (GUMS_OBJECT **object, const char *name); + NTSTATUS (*get_object_from_name) (GUMS_OBJECT **object, const char *name, const int onj_type); /* This function is used to get the list of all objects changed since b_time, it is used to support PDC<->BDC synchronization */ NTSTATUS (*get_updated_objects) (GUMS_OBJECT **objects, const NTTIME base_time); @@ -159,10 +167,10 @@ typedef struct gums_functions NTSTATUS (*set_object) (const GUMS_OBJECT *object); /* set object values function */ - NTSTATUS (*set_object_values) (DOM_SID *sid, uint32 count, GUMS_DATA_SET *data_set); + NTSTATUS (*set_object_values) (DOM_SID *sid, uint32 count, GUMS_DATA_SET **data_set); /* Group related functions */ - NTSTATUS (*add_memberss_to_group) (const DOM_SID *group, const DOM_SID **members); + NTSTATUS (*add_members_to_group) (const DOM_SID *group, const DOM_SID **members); NTSTATUS (*delete_members_from_group) (const DOM_SID *group, const DOM_SID **members); NTSTATUS (*enumerate_group_members) (DOM_SID **members, const DOM_SID *sid, const int type); @@ -177,54 +185,56 @@ typedef struct gums_functions NTSTATUS (*delete_members_from_privilege) (const LUID_ATTR *priv, const DOM_SID **members); NTSTATUS (*enumerate_privilege_members) (DOM_SID **members, const LUID_ATTR *priv); NTSTATUS (*get_sid_privileges) (DOM_SID **privs, const DOM_SID *sid); + /* warning!: set_privilege will overwrite a prior existing privilege if such exist */ NTSTATUS (*set_privilege) (GUMS_PRIVILEGE *priv); } GUMS_FUNCTIONS; /* define value types */ +#define GUMS_SET_PRIMARY_GROUP 0x1 +#define GUMS_SET_SEC_DESC 0x2 -#define GUMS_SET_PRIMARY_GROUP 1 -#define GUMS_SET_SEC_DESC 2 +#define GUMS_SET_NAME 0x10 +#define GUMS_SET_DESCRIPTION 0x11 +#define GUMS_SET_FULL_NAME 0x12 /* user specific type values */ -#define GUMS_SET_LOGON_TIME 10 /* keep NTTIME consecutive */ -#define GUMS_SET_LOGOFF_TIME 11 /* too ease checking */ -#define GUMS_SET_KICKOFF_TIME 13 -#define GUMS_SET_PASS_LAST_SET_TIME 14 -#define GUMS_SET_PASS_CAN_CHANGE_TIME 15 -#define GUMS_SET_PASS_MUST_CHANGE_TIME 16 /* NTTIME end */ - -#define GUMS_SET_NAME 20 /* keep strings consecutive */ -#define GUMS_SET_DESCRIPTION 21 /* too ease checking */ -#define GUMS_SET_FULL_NAME 22 -#define GUMS_SET_HOME_DIRECTORY 23 -#define GUMS_SET_DRIVE 24 -#define GUMS_SET_LOGON_SCRIPT 25 -#define GUMS_SET_PROFILE_PATH 26 -#define GUMS_SET_WORKSTATIONS 27 -#define GUMS_SET_UNKNOWN_STRING 28 -#define GUMS_SET_MUNGED_DIAL 29 /* strings end */ - -#define GUMS_SET_LM_PASSWORD 40 -#define GUMS_SET_NT_PASSWORD 41 -#define GUMS_SET_PLAINTEXT_PASSWORD 42 -#define GUMS_SET_UNKNOWN_3 43 -#define GUMS_SET_LOGON_DIVS 44 -#define GUMS_SET_HOURS_LEN 45 -#define GUMS_SET_HOURS 46 -#define GUMS_SET_UNKNOWN_5 47 -#define GUMS_SET_UNKNOWN_6 48 - -#define GUMS_SET_MUST_CHANGE_PASS 50 -#define GUMS_SET_CANNOT_CHANGE_PASS 51 -#define GUMS_SET_PASS_NEVER_EXPIRE 52 -#define GUMS_SET_ACCOUNT_DISABLED 53 -#define GUMS_SET_ACCOUNT_LOCKOUT 54 +#define GUMS_SET_LOGON_TIME 0x20 +#define GUMS_SET_LOGOFF_TIME 0x21 +#define GUMS_SET_KICKOFF_TIME 0x23 +#define GUMS_SET_PASS_LAST_SET_TIME 0x24 +#define GUMS_SET_PASS_CAN_CHANGE_TIME 0x25 +#define GUMS_SET_PASS_MUST_CHANGE_TIME 0x26 + + +#define GUMS_SET_HOME_DIRECTORY 0x31 +#define GUMS_SET_DRIVE 0x32 +#define GUMS_SET_LOGON_SCRIPT 0x33 +#define GUMS_SET_PROFILE_PATH 0x34 +#define GUMS_SET_WORKSTATIONS 0x35 +#define GUMS_SET_UNKNOWN_STRING 0x36 +#define GUMS_SET_MUNGED_DIAL 0x37 + +#define GUMS_SET_LM_PASSWORD 0x40 +#define GUMS_SET_NT_PASSWORD 0x41 +#define GUMS_SET_PLAINTEXT_PASSWORD 0x42 +#define GUMS_SET_UNKNOWN_3 0x43 +#define GUMS_SET_LOGON_DIVS 0x44 +#define GUMS_SET_HOURS_LEN 0x45 +#define GUMS_SET_HOURS 0x46 +#define GUMS_SET_UNKNOWN_5 0x47 +#define GUMS_SET_UNKNOWN_6 0x48 + +#define GUMS_SET_MUST_CHANGE_PASS 0x50 +#define GUMS_SET_CANNOT_CHANGE_PASS 0x51 +#define GUMS_SET_PASS_NEVER_EXPIRE 0x52 +#define GUMS_SET_ACCOUNT_DISABLED 0x53 +#define GUMS_SET_ACCOUNT_LOCKOUT 0x54 /*group specific type values */ -#define GUMS_ADD_SID_LIST 60 -#define GUMS_DEL_SID_LIST 61 -#define GUMS_SET_SID_LIST 62 +#define GUMS_ADD_SID_LIST 0x60 +#define GUMS_DEL_SID_LIST 0x61 +#define GUMS_SET_SID_LIST 0x62 #endif /* _GUMS_H */ diff --git a/source3/include/includes.h b/source3/include/includes.h index fab02141cb..b9ba4b84d5 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -775,6 +775,8 @@ extern int errno; #include "sam.h" +#include "gums.h" + #include "session.h" #include "asn_1.h" diff --git a/source3/include/tdbsam2.h b/source3/include/tdbsam2.h index 0ca9d34618..047b4e7c90 100644 --- a/source3/include/tdbsam2.h +++ b/source3/include/tdbsam2.h @@ -18,16 +18,17 @@ * Mass Ave, Cambridge, MA 02139, USA. */ - /* ALL strings assumes UTF8 as encoding */ GENSTRUCT struct tdbsam2_domain_data { uint32 xcounter; /* counter to be updated at any change */ SEC_DESC *sec_desc; /* Security Descriptor */ - DOM_SID *user_sid; /* The User SID */ - char *name; _NULLTERM /* NT User Name */ + DOM_SID *dom_sid; /* The Domain SID */ + char *name; _NULLTERM /* NT Domain Name */ char *description; _NULLTERM /* Descritpion (Gecos) */ + + uint32 next_rid; /* The Next free RID */ }; GENSTRUCT struct tdbsam2_user_data { @@ -67,14 +68,14 @@ GENSTRUCT struct tdbsam2_user_data { uint32 unknown_3; /* 0x00ff ffff */ uint32 unknown_5; /* 0x0002 0000 */ uint32 unknown_6; /* 0x0000 04ec */ -}; +}; GENSTRUCT struct tdbsam2_group_data { uint32 xcounter; /* counter to be updated at any change */ SEC_DESC *sec_desc; /* Security Descriptor */ DOM_SID *group_sid; /* The Group SID */ - char *name; _NULLTERM /* NT User Name */ + char *name; _NULLTERM /* NT Group Name */ char *description; _NULLTERM /* Descritpion (Gecos) */ uint32 count; /* number of sids */ diff --git a/source3/lib/util_sid.c b/source3/lib/util_sid.c index 824987f189..81d17ae3f2 100644 --- a/source3/lib/util_sid.c +++ b/source3/lib/util_sid.c @@ -629,3 +629,21 @@ void print_guid(GUID *guid) d_printf("%02x", guid->info[i]); d_printf("\n"); } + +/******************************************************************* + Tallocs a duplicate SID. +********************************************************************/ + +DOM_SID *sid_dup_talloc(TALLOC_CTX *ctx, DOM_SID *src) +{ + DOM_SID *dst; + + if(!src) + return NULL; + + if((dst = talloc_zero(ctx, sizeof(DOM_SID))) != NULL) { + sid_copy( dst, src); + } + + return dst; +} diff --git a/source3/rpc_parse/parse_sec.c b/source3/rpc_parse/parse_sec.c index dbd72e5250..10b0ff86ae 100644 --- a/source3/rpc_parse/parse_sec.c +++ b/source3/rpc_parse/parse_sec.c @@ -569,24 +569,6 @@ SEC_DESC_BUF *sec_desc_merge(TALLOC_CTX *ctx, SEC_DESC_BUF *new_sdb, SEC_DESC_BU return(return_sdb); } -/******************************************************************* - Tallocs a duplicate SID. -********************************************************************/ - -static DOM_SID *sid_dup_talloc(TALLOC_CTX *ctx, DOM_SID *src) -{ - DOM_SID *dst; - - if(!src) - return NULL; - - if((dst = talloc_zero(ctx, sizeof(DOM_SID))) != NULL) { - sid_copy( dst, src); - } - - return dst; -} - /******************************************************************* Creates a SEC_DESC structure ********************************************************************/ diff --git a/source3/sam/gumm_tdb.c b/source3/sam/gumm_tdb.c index 52eaab9e17..53ea872a11 100644 --- a/source3/sam/gumm_tdb.c +++ b/source3/sam/gumm_tdb.c @@ -23,7 +23,6 @@ */ #include "includes.h" -#include "gums.h" #include "tdbsam2.h" #include "tdbsam2_parse_info.h" @@ -31,15 +30,25 @@ static int tdbgumm_debug_level = DBGC_ALL; #undef DBGC_CLASS #define DBGC_CLASS tdbgumm_debug_level -#define TDBSAM_VERSION "20021215" +#define TDBSAM_VERSION 20021215 #define TDB_FILE_NAME "tdbsam2.tdb" -#define DOMAINPREFIX "DOMAIN_" -#define OBJECTPREFIX "OBJECT_" +#define NAMEPREFIX "NAME_" #define SIDPREFIX "SID_" #define PRIVILEGEPREFIX "PRIV_" #define TDB_FORMAT_STRING "ddB" +#define TALLOC_CHECK(ptr, err, label) do { if ((ptr) == NULL) { DEBUG(0, ("%s: Out of memory!\n", __FUNCTION__)); err = NT_STATUS_NO_MEMORY; goto label; } } while(0) +#define SET_OR_FAIL(func, label) do { if (NT_STATUS_IS_ERR(func)) { DEBUG(0, ("%s: Setting gums object data failed!\n", __FUNCTION__)); goto label; } } while(0) + +struct tdbsam2_enum_objs { + uint32 type; + fstring dom_sid; + TDB_CONTEXT *db; + TDB_DATA key; + struct tdbsam2_enum_objs *next; +}; + union tdbsam2_data { struct tdbsam2_domain_data *domain; struct tdbsam2_user_data *user; @@ -48,86 +57,363 @@ union tdbsam2_data { struct tdbsam2_object { uint32 type; + uint32 version; union tdbsam2_data data; }; static TDB_CONTEXT *tdbsam2_db; -#define TALLOC_CHECK(ptr, err, label) do { if ((ptr) == NULL) { DEBUG(0, ("%s: Out of memory!\n", __FUNCTION__)); err = NT_STATUS_NO_MEMORY; goto label; } } while(0) -#define SET_OR_FAIL(func, label) do { if (NT_STATUS_IS_ERR(func)) { DEBUG(0, ("%s: Setting gums object data failed!\n", __FUNCTION__)); goto label; } } while(0) +struct tdbsam2_enum_objs **teo_handlers; + +static NTSTATUS init_tdbsam2_object_from_buffer(struct tdbsam2_object *object, TALLOC_CTX *mem_ctx, char *buffer, int size) +{ + + NTSTATUS ret = NT_STATUS_UNSUCCESSFUL; + int iret; + char *obj_data; + int data_size = 0; + int len; + + len = tdb_unpack (buffer, size, TDB_FORMAT_STRING, + &(object->version), + &(object->type), + &data_size, &obj_data); + + if (len == -1) + goto done; + + /* version is checked inside this function so that backward compatibility code can be + called eventually. + this way we can easily handle database format upgrades */ + if (object->version != TDBSAM_VERSION) { + DEBUG(3,("init_tdbsam2_object_from_buffer: Error, db object has wrong tdbsam version!\n")); + goto done; + } + + /* be sure the string is terminated before trying to parse it */ + if (obj_data[data_size - 1] != '\0') + obj_data[data_size - 1] = '\0'; + + switch (object->type) { + case GUMS_OBJ_DOMAIN: + object->data.domain = (struct tdbsam2_domain_data *)talloc(mem_ctx, sizeof(struct tdbsam2_domain_data)); + TALLOC_CHECK(object->data.domain, ret, done); + memset(object->data.domain, 0, sizeof(struct tdbsam2_domain_data)); + + iret = gen_parse(mem_ctx, pinfo_tdbsam2_domain_data, (char *)(object->data.domain), obj_data); + break; + case GUMS_OBJ_GROUP: + case GUMS_OBJ_ALIAS: + object->data.group = (struct tdbsam2_group_data *)talloc(mem_ctx, sizeof(struct tdbsam2_group_data)); + TALLOC_CHECK(object->data.group, ret, done); + memset(object->data.group, 0, sizeof(struct tdbsam2_group_data)); + + iret = gen_parse(mem_ctx, pinfo_tdbsam2_group_data, (char *)(object->data.group), obj_data); + break; + case GUMS_OBJ_NORMAL_USER: + object->data.user = (struct tdbsam2_user_data *)talloc(mem_ctx, sizeof(struct tdbsam2_user_data)); + TALLOC_CHECK(object->data.user, ret, done); + memset(object->data.user, 0, sizeof(struct tdbsam2_user_data)); -static NTSTATUS init_tdbsam2_object_from_buffer(struct tdbsam2_object *object, TALLOC_CTX *mem_ctx, char *buffer, int size) { + iret = gen_parse(mem_ctx, pinfo_tdbsam2_user_data, (char *)(object->data.user), obj_data); + break; + default: + DEBUG(3,("init_tdbsam2_object_from_buffer: Error, wrong object type number!\n")); + goto done; + } + + if (iret != 0) { + DEBUG(0,("init_tdbsam2_object_from_buffer: Fatal Error! Unable to parse object!\n")); + DEBUG(0,("init_tdbsam2_object_from_buffer: DB Corrupted ?")); + goto done; + } + + ret = NT_STATUS_OK; +done: + SAFE_FREE(obj_data); + return ret; +} + +static NTSTATUS init_buffer_from_tdbsam2_object(char **buffer, size_t *len, TALLOC_CTX *mem_ctx, struct tdbsam2_object *object) +{ + + NTSTATUS ret; + char *buf1 = NULL; + size_t buflen; + + if (!buffer) + return NT_STATUS_INVALID_PARAMETER; + + switch (object->type) { + case GUMS_OBJ_DOMAIN: + buf1 = gen_dump(mem_ctx, pinfo_tdbsam2_domain_data, (char *)(object->data.domain), 0); + break; + case GUMS_OBJ_GROUP: + case GUMS_OBJ_ALIAS: + buf1 = gen_dump(mem_ctx, pinfo_tdbsam2_group_data, (char *)(object->data.group), 0); + break; + case GUMS_OBJ_NORMAL_USER: + buf1 = gen_dump(mem_ctx, pinfo_tdbsam2_user_data, (char *)(object->data.user), 0); + break; + default: + DEBUG(3,("init_buffer_from_tdbsam2_object: Error, wrong object type number!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + if (buf1 == NULL) { + DEBUG(0, ("init_buffer_from_tdbsam2_object: Fatal Error! Unable to dump object!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + buflen = tdb_pack(NULL, 0, TDB_FORMAT_STRING, + TDBSAM_VERSION, + object->type, + strlen(buf1) + 1, buf1); + + *buffer = talloc(mem_ctx, buflen); + TALLOC_CHECK(*buffer, ret, done); + + *len = tdb_pack(*buffer, buflen, TDB_FORMAT_STRING, + TDBSAM_VERSION, + object->type, + strlen(buf1) + 1, buf1); + + if (*len != buflen) { + DEBUG(0, ("init_tdb_data_from_tdbsam2_object: somthing odd is going on here: bufflen (%d) != len (%d) in tdb_pack operations!\n", + buflen, *len)); + *buffer = NULL; + ret = NT_STATUS_UNSUCCESSFUL; + goto done; + } + + ret = NT_STATUS_OK; +done: + return ret; +} + +static NTSTATUS opentdb(void) +{ + if (!tdbsam2_db) { + pstring tdbfile; + get_private_directory(tdbfile); + pstrcat(tdbfile, "/"); + pstrcat(tdbfile, TDB_FILE_NAME); + + tdbsam2_db = tdb_open_log(tdbfile, 0, TDB_DEFAULT, O_RDWR | O_CREAT, 0600); + if (!tdbsam2_db) + { + DEBUG(0, ("opentdb: Unable to open database (%s)!\n", tdbfile)); + return NT_STATUS_UNSUCCESSFUL; + } + } return NT_STATUS_OK; } -static NTSTATUS tdbsam2_opentdb(void) { +static NTSTATUS get_object_by_sid(TALLOC_CTX *mem_ctx, struct tdbsam2_object *obj, const DOM_SID *sid) +{ + NTSTATUS ret; + TDB_DATA data, key; + fstring keystr; + + if (!obj || !mem_ctx || !sid) + return NT_STATUS_INVALID_PARAMETER; + + if (NT_STATUS_IS_ERR(ret = opentdb())) { + return ret; + } + + slprintf(keystr, sizeof(keystr)-1, "%s%s", SIDPREFIX, sid_string_static(sid)); + key.dptr = keystr; + key.dsize = strlen(keystr) + 1; + + data = tdb_fetch(tdbsam2_db, key); + if (!data.dptr) { + DEBUG(5, ("get_object_by_sid: Error fetching database, domain entry not found!\n")); + DEBUGADD(5, (" Error: %s\n", tdb_errorstr(tdbsam2_db))); + DEBUGADD(5, (" Key: %s\n", keystr)); + return NT_STATUS_UNSUCCESSFUL; + } + + if (NT_STATUS_IS_ERR(init_tdbsam2_object_from_buffer(obj, mem_ctx, data.dptr, data.dsize))) { + SAFE_FREE(data.dptr); + DEBUG(0, ("get_object_by_sid: Error fetching database, malformed entry!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + SAFE_FREE(data.dptr); return NT_STATUS_OK; + } -static NTSTATUS tdbsam2_get_object_by_name(struct tdbsam2_object *obj, TALLOC_CTX *mem_ctx, const char* name) { +static NTSTATUS get_object_by_name(TALLOC_CTX *mem_ctx, struct tdbsam2_object *obj, const char* name) +{ NTSTATUS ret; TDB_DATA data, key; fstring keystr; fstring objname; + DOM_SID sid; + char *obj_sidstr; + int obj_version, obj_type, obj_sidstr_len, len; if (!obj || !mem_ctx || !name) return NT_STATUS_INVALID_PARAMETER; - if (tdbsam2_db == NULL) { - if (NT_STATUS_IS_ERR(ret = tdbsam2_opentdb())) { - goto done; - } + if (NT_STATUS_IS_ERR(ret = opentdb())) { + return ret; } unix_strlower(name, -1, objname, sizeof(objname)); - slprintf(keystr, sizeof(keystr)-1, "%s%s", OBJECTPREFIX, objname); + slprintf(keystr, sizeof(keystr)-1, "%s%s", NAMEPREFIX, objname); key.dptr = keystr; key.dsize = strlen(keystr) + 1; data = tdb_fetch(tdbsam2_db, key); if (!data.dptr) { - DEBUG(5, ("get_domain_sid: Error fetching database, domain entry not found!\n")); + DEBUG(5, ("get_object_by_name: Error fetching database, domain entry not found!\n")); DEBUGADD(5, (" Error: %s\n", tdb_errorstr(tdbsam2_db))); DEBUGADD(5, (" Key: %s\n", keystr)); - ret = NT_STATUS_UNSUCCESSFUL; - goto done; + return NT_STATUS_UNSUCCESSFUL; } - if (NT_STATUS_IS_ERR(init_tdbsam2_object_from_buffer(obj, mem_ctx, data.dptr, data.dsize))) { - SAFE_FREE(data.dptr); - DEBUG(0, ("get_domain_sid: Error fetching database, malformed entry!\n")); - ret = NT_STATUS_UNSUCCESSFUL; - goto done; - } + len = tdb_unpack(data.dptr, data.dsize, TDB_FORMAT_STRING, + &obj_version, + &obj_type, + &obj_sidstr_len, &obj_sidstr); + SAFE_FREE(data.dptr); - ret = NT_STATUS_OK; + if (len == -1 || obj_version != TDBSAM_VERSION || obj_sidstr_len <= 0) { + DEBUG(5, ("get_object_by_name: Error unpacking database object!\n")); + return NT_STATUS_UNSUCCESSFUL; + } -done: - return ret; + if (!string_to_sid(&sid, obj_sidstr)) { + DEBUG(5, ("get_object_by_name: Error invalid sid string found in database object!\n")); + SAFE_FREE(obj_sidstr); + return NT_STATUS_UNSUCCESSFUL; + } + SAFE_FREE(obj_sidstr); + + return get_object_by_sid(mem_ctx, obj, &sid); } - -static NTSTATUS tdbsam2_store(struct tdbsam2_object *object) { +static NTSTATUS store_object(TALLOC_CTX *mem_ctx, struct tdbsam2_object *object, BOOL new_obj) +{ NTSTATUS ret; + TDB_DATA data, key, key2; + fstring keystr; + fstring namestr; + int flag, r; + + if (NT_STATUS_IS_ERR(ret = opentdb())) { + return ret; + } + + if (new_obj) { + flag = TDB_INSERT; + } else { + flag = TDB_MODIFY; + } + + ret = init_buffer_from_tdbsam2_object(&(data.dptr), &(data.dsize), mem_ctx, object); + if (NT_STATUS_IS_ERR(ret)) + return ret; + + switch (object->type) { + case GUMS_OBJ_DOMAIN: + slprintf(keystr, sizeof(keystr) - 1, "%s%s", SIDPREFIX, sid_string_static(object->data.domain->dom_sid)); + slprintf(namestr, sizeof(namestr) - 1, "%s%s", NAMEPREFIX, object->data.domain->name); + break; + case GUMS_OBJ_GROUP: + case GUMS_OBJ_ALIAS: + slprintf(keystr, sizeof(keystr) - 1, "%s%s", SIDPREFIX, sid_string_static(object->data.group->group_sid)); + slprintf(namestr, sizeof(namestr) - 1, "%s%s", NAMEPREFIX, object->data.group->name); + break; + case GUMS_OBJ_NORMAL_USER: + slprintf(keystr, sizeof(keystr) - 1, "%s%s", SIDPREFIX, sid_string_static(object->data.user->user_sid)); + slprintf(namestr, sizeof(namestr) - 1, "%s%s", NAMEPREFIX, object->data.user->name); + break; + default: + return NT_STATUS_UNSUCCESSFUL; + } + + key.dptr = keystr; + key.dsize = strlen(keystr) + 1; + + if ((r = tdb_store(tdbsam2_db, key, data, flag)) != TDB_SUCCESS) { + DEBUG(0, ("store_object: Unable to modify SAM!\n")); + DEBUGADD(0, (" Error: %s", tdb_errorstr(tdbsam2_db))); + DEBUGADD(0, (" occured while storing the main record (%s)\n", keystr)); + if (r == TDB_ERR_EXISTS) return NT_STATUS_UNSUCCESSFUL; + return NT_STATUS_INTERNAL_DB_ERROR; + } + + key2.dptr = namestr; + key2.dsize = strlen(namestr) + 1; + + if ((r = tdb_store(tdbsam2_db, key2, key, flag)) != TDB_SUCCESS) { + DEBUG(0, ("store_object: Unable to modify SAM!\n")); + DEBUGADD(0, (" Error: %s", tdb_errorstr(tdbsam2_db))); + DEBUGADD(0, (" occured while storing the main record (%s)\n", keystr)); + if (r == TDB_ERR_EXISTS) return NT_STATUS_UNSUCCESSFUL; + return NT_STATUS_INTERNAL_DB_ERROR; + } +/* TODO: update the general database counter */ +/* TODO: update this entry counter too */ return NT_STATUS_OK; } -static NTSTATUS tdbsam2_get_next_sid(TALLOC_CTX *mem_ctx, DOM_SID *sid) { - +static NTSTATUS get_next_sid(TALLOC_CTX *mem_ctx, DOM_SID **sid) +{ NTSTATUS ret; + struct tdbsam2_object obj; + DOM_SID *dom_sid = get_global_sam_sid(); + uint32 new_rid; + +/* TODO: LOCK DOMAIN OBJECT */ + ret = get_object_by_sid(mem_ctx, &obj, dom_sid); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(0, ("get_next_sid: unable to get root Domain object!\n")); + ret = NT_STATUS_INTERNAL_DB_ERROR; + goto error; + } + + new_rid = obj.data.domain->next_rid; + + /* Increment the RID Counter */ + obj.data.domain->next_rid++; + + /* Store back Domain object */ + ret = store_object(mem_ctx, &obj, False); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(0, ("get_next_sid: unable to update root Domain object!\n")); + ret = NT_STATUS_INTERNAL_DB_ERROR; + goto error; + } +/* TODO: UNLOCK DOMAIN OBJECT */ + + *sid = sid_dup_talloc(mem_ctx, dom_sid); + TALLOC_CHECK(*sid, ret, error); + + if (!sid_append_rid(*sid, new_rid)) { + DEBUG(0, ("get_next_sid: unable to build new SID !?!\n")); + ret = NT_STATUS_UNSUCCESSFUL; + goto error; + } return NT_STATUS_OK; -} -static NTSTATUS tdbsam2_user_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_user_data *userdata, uint32 type) { +error: + return ret; +} +static NTSTATUS user_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_user_data *userdata) +{ NTSTATUS ret; if (!object || !userdata) { @@ -180,12 +466,12 @@ static NTSTATUS tdbsam2_user_data_to_gums_object(GUMS_OBJECT **object, struct td SET_OR_FAIL(gums_set_user_unknown_5(*object, userdata->unknown_5), error); SET_OR_FAIL(gums_set_user_unknown_6(*object, userdata->unknown_6), error); - SET_OR_FAIL(gums_set_user_logon_time(*object, userdata->logon_time), error); - SET_OR_FAIL(gums_set_user_logoff_time(*object, userdata->logoff_time), error); - SET_OR_FAIL(gums_set_user_kickoff_time(*object, userdata->kickoff_time), error); - SET_OR_FAIL(gums_set_user_pass_last_set_time(*object, userdata->pass_last_set_time), error); - SET_OR_FAIL(gums_set_user_pass_can_change_time(*object, userdata->pass_can_change_time), error); - SET_OR_FAIL(gums_set_user_pass_must_change_time(*object, userdata->pass_must_change_time), error); + SET_OR_FAIL(gums_set_user_logon_time(*object, *(userdata->logon_time)), error); + SET_OR_FAIL(gums_set_user_logoff_time(*object, *(userdata->logoff_time)), error); + SET_OR_FAIL(gums_set_user_kickoff_time(*object, *(userdata->kickoff_time)), error); + SET_OR_FAIL(gums_set_user_pass_last_set_time(*object, *(userdata->pass_last_set_time)), error); + SET_OR_FAIL(gums_set_user_pass_can_change_time(*object, *(userdata->pass_can_change_time)), error); + SET_OR_FAIL(gums_set_user_pass_must_change_time(*object, *(userdata->pass_must_change_time)), error); ret = NT_STATUS_OK; return ret; @@ -196,8 +482,8 @@ error: return ret; } -static NTSTATUS tdbsam2_group_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_group_data *groupdata, uint32 type) { - +static NTSTATUS group_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_group_data *groupdata) +{ NTSTATUS ret; if (!object || !groupdata) { @@ -226,11 +512,12 @@ error: return ret; } -static NTSTATUS tdbsam2_domain_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_domain_data *domdata, uint32 type) { +static NTSTATUS domain_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_domain_data *domdata) +{ NTSTATUS ret; - if (!object || !domdata) { + if (!object || !*object || !domdata) { DEBUG(0, ("tdbsam2_domain_data_to_gums_object: no NULL pointers are accepted here!\n")); return NT_STATUS_UNSUCCESSFUL; } @@ -253,7 +540,8 @@ error: return ret; } -static NTSTATUS tdbsam2_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_object *data) { +static NTSTATUS data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2_object *data) +{ NTSTATUS ret; @@ -271,16 +559,16 @@ static NTSTATUS tdbsam2_data_to_gums_object(GUMS_OBJECT **object, struct tdbsam2 switch (data->type) { case GUMS_OBJ_DOMAIN: - ret = tdbsam2_domain_data_to_gums_object(object, data->data.domain, data->type); + ret = domain_data_to_gums_object(object, data->data.domain); break; case GUMS_OBJ_NORMAL_USER: - ret = tdbsam2_user_data_to_gums_object(object, data->data.user, data->type); + ret = user_data_to_gums_object(object, data->data.user); break; case GUMS_OBJ_GROUP: case GUMS_OBJ_ALIAS: - ret = tdbsam2_group_data_to_gums_object(object, data->data.group, data->type); + ret = group_data_to_gums_object(object, data->data.group); break; default: @@ -292,83 +580,118 @@ done: } +/* GUMM object functions */ +static NTSTATUS tdbsam2_get_domain_sid(DOM_SID *sid, const char* name) +{ + NTSTATUS ret; + struct tdbsam2_object obj; + TALLOC_CTX *mem_ctx; + fstring domname; -/* GUMM object functions */ + if (!sid || !name) + return NT_STATUS_INVALID_PARAMETER; -static NTSTATUS get_domain_sid(DOM_SID *sid, const char* name) { + mem_ctx = talloc_init("tdbsam2_get_domain_sid"); + if (!mem_ctx) { + DEBUG(0, ("tdbsam2_new_object: Out of memory!\n")); + return NT_STATUS_NO_MEMORY; + } + + if (NT_STATUS_IS_ERR(ret = opentdb())) { + goto done; + } + + unix_strlower(name, -1, domname, sizeof(domname)); + + ret = get_object_by_name(mem_ctx, &obj, domname); + + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(0, ("tdbsam2_get_domain_sid: Error fetching database!\n")); + goto done; + } + + if (obj.type != GUMS_OBJ_DOMAIN) { + DEBUG(5, ("tdbsam2_get_domain_sid: Requested object is not a domain!\n")); + ret = NT_STATUS_UNSUCCESSFUL; + goto done; + } + + sid_copy(sid, obj.data.domain->dom_sid); + + ret = NT_STATUS_OK; + +done: + talloc_destroy(mem_ctx); + return ret; +} + +static NTSTATUS tdbsam2_set_domain_sid (const DOM_SID *sid, const char *name) +{ NTSTATUS ret; struct tdbsam2_object obj; TALLOC_CTX *mem_ctx; - TDB_DATA data, key; - fstring keystr; fstring domname; if (!sid || !name) return NT_STATUS_INVALID_PARAMETER; - mem_ctx = talloc_init("get_domain_sid"); + mem_ctx = talloc_init("tdbsam2_set_domain_sid"); if (!mem_ctx) { DEBUG(0, ("tdbsam2_new_object: Out of memory!\n")); return NT_STATUS_NO_MEMORY; } if (tdbsam2_db == NULL) { - if (NT_STATUS_IS_ERR(ret = tdbsam2_opentdb())) { + if (NT_STATUS_IS_ERR(ret = opentdb())) { goto done; } } unix_strlower(name, -1, domname, sizeof(domname)); - slprintf(keystr, sizeof(keystr)-1, "%s%s", DOMAINPREFIX, domname); - key.dptr = keystr; - key.dsize = strlen(keystr) + 1; +/* TODO: we need to lock this entry until updated! */ - data = tdb_fetch(tdbsam2_db, key); - if (!data.dptr) { - DEBUG(5, ("get_domain_sid: Error fetching database, domain entry not found!\n")); - DEBUGADD(5, (" Error: %s\n", tdb_errorstr(tdbsam2_db))); - DEBUGADD(5, (" Key: %s\n", keystr)); - ret = NT_STATUS_UNSUCCESSFUL; - goto done; - } + ret = get_object_by_name(mem_ctx, &obj, domname); - if (NT_STATUS_IS_ERR(init_tdbsam2_object_from_buffer(&obj, mem_ctx, data.dptr, data.dsize))) { - SAFE_FREE(data.dptr); - DEBUG(0, ("get_domain_sid: Error fetching database, malformed entry!\n")); - ret = NT_STATUS_UNSUCCESSFUL; + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(0, ("tdbsam2_get_domain_sid: Error fetching database!\n")); goto done; } - SAFE_FREE(data.dptr); if (obj.type != GUMS_OBJ_DOMAIN) { - DEBUG(5, ("get_domain_sid: Requested object is not a domain!\n")); + DEBUG(5, ("tdbsam2_get_domain_sid: Requested object is not a domain!\n")); ret = NT_STATUS_UNSUCCESSFUL; goto done; } - sid_copy(sid, obj.data.domain->dom_sid); + sid_copy(obj.data.domain->dom_sid, sid); - ret = NT_STATUS_OK; + ret = store_object(mem_ctx, &obj, False); done: +/* TODO: unlock here */ if (mem_ctx) talloc_destroy(mem_ctx); return ret; } - NTSTATUS (*set_domain_sid) (const DOM_SID *sid, const char *name); - +/* TODO */ NTSTATUS (*get_sequence_number) (void); -static NTSTATUS tdbsam2_new_object(DOM_SID **sid, const char *name, const int obj_type) { +extern DOM_SID global_sid_NULL; + +static NTSTATUS tdbsam2_new_object(DOM_SID *sid, const char *name, const int obj_type) +{ NTSTATUS ret; struct tdbsam2_object obj; TALLOC_CTX *mem_ctx; + NTTIME zero_time = {0,0}; + const char *defpw = "NOPASSWORDXXXXXX"; + uint8 defhours[21] = {255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}; if (!sid || !name) { DEBUG(0, ("tdbsam2_new_object: no NULL pointers are accepted here!\n")); @@ -381,19 +704,51 @@ static NTSTATUS tdbsam2_new_object(DOM_SID **sid, const char *name, const int ob return NT_STATUS_NO_MEMORY; } + obj.type = obj_type; + obj.version = TDBSAM_VERSION; + switch (obj_type) { case GUMS_OBJ_NORMAL_USER: obj.data.user = (struct tdbsam2_user_data *)talloc_zero(mem_ctx, sizeof(struct tdbsam2_user_data)); TALLOC_CHECK(obj.data.user, ret, done); - /*obj.data.user->sec_desc*/ - - tdbsam2_get_next_sid(mem_ctx, obj.data.user->user_sid); + get_next_sid(mem_ctx, &(obj.data.user->user_sid)); TALLOC_CHECK(obj.data.user->user_sid, ret, done); + sid_copy(sid, obj.data.user->user_sid); obj.data.user->name = talloc_strdup(mem_ctx, name); TALLOC_CHECK(obj.data.user, ret, done); + obj.data.user->xcounter = 1; + /*obj.data.user->sec_desc*/ + obj.data.user->description = ""; + obj.data.user->group_sid = &global_sid_NULL; + obj.data.user->logon_time = &zero_time; + obj.data.user->logoff_time = &zero_time; + obj.data.user->kickoff_time = &zero_time; + obj.data.user->pass_last_set_time = &zero_time; + obj.data.user->pass_can_change_time = &zero_time; + obj.data.user->pass_must_change_time = &zero_time; + + obj.data.user->full_name = ""; + obj.data.user->home_dir = ""; + obj.data.user->dir_drive = ""; + obj.data.user->logon_script = ""; + obj.data.user->profile_path = ""; + obj.data.user->workstations = ""; + obj.data.user->unknown_str = ""; + obj.data.user->munged_dial = ""; + + obj.data.user->lm_pw_ptr = defpw; + obj.data.user->nt_pw_ptr = defpw; + + obj.data.user->logon_divs = 168; + obj.data.user->hours_len = 21; + obj.data.user->hours = &defhours; + + obj.data.user->unknown_3 = 0x00ffffff; + obj.data.user->unknown_5 = 0x00020000; + obj.data.user->unknown_6 = 0x000004ec; break; case GUMS_OBJ_GROUP: @@ -401,133 +756,373 @@ static NTSTATUS tdbsam2_new_object(DOM_SID **sid, const char *name, const int ob obj.data.group = (struct tdbsam2_group_data *)talloc_zero(mem_ctx, sizeof(struct tdbsam2_group_data)); TALLOC_CHECK(obj.data.group, ret, done); - /*obj.data.user->sec_desc*/ - - tdbsam2_get_next_sid(mem_ctx, obj.data.group->group_sid); + get_next_sid(mem_ctx, &(obj.data.group->group_sid)); TALLOC_CHECK(obj.data.group->group_sid, ret, done); + sid_copy(sid, obj.data.group->group_sid); obj.data.group->name = talloc_strdup(mem_ctx, name); TALLOC_CHECK(obj.data.group, ret, done); + obj.data.group->xcounter = 1; + /*obj.data.group->sec_desc*/ + obj.data.group->description = ""; + break; case GUMS_OBJ_DOMAIN: - /* TODO: SHOULD WE ALLOW TO CREATE NEW DOMAINS ? */ + + /* FIXME: should we check against global_sam_sid to make it impossible + to store more than one domain ? */ + + obj.data.domain = (struct tdbsam2_domain_data *)talloc_zero(mem_ctx, sizeof(struct tdbsam2_domain_data)); + TALLOC_CHECK(obj.data.domain, ret, done); + + obj.data.domain->dom_sid = sid_dup_talloc(mem_ctx, get_global_sam_sid()); + TALLOC_CHECK(obj.data.domain->dom_sid, ret, done); + sid_copy(sid, obj.data.domain->dom_sid); + + obj.data.domain->name = talloc_strdup(mem_ctx, name); + TALLOC_CHECK(obj.data.domain, ret, done); + + obj.data.domain->xcounter = 1; + /*obj.data.domain->sec_desc*/ + obj.data.domain->next_rid = 0x3e9; + obj.data.domain->description = ""; + + ret = NT_STATUS_OK; + break; default: ret = NT_STATUS_UNSUCCESSFUL; goto done; } - ret = tdbsam2_store(&obj); + ret = store_object(mem_ctx, &obj, True); done: talloc_destroy(mem_ctx); return ret; } -static NTSTATUS tdbsam2_delete_object(const DOM_SID *sid) { - +static NTSTATUS tdbsam2_delete_object(const DOM_SID *sid) +{ NTSTATUS ret; struct tdbsam2_object obj; TALLOC_CTX *mem_ctx; TDB_DATA data, key; fstring keystr; - fstring sidstr; - char *obj_name = NULL; - int obj_type, obj_version, len; if (!sid) { - DEBUG(0, ("tdbsam2_new_object: no NULL pointers are accepted here!\n")); + DEBUG(0, ("tdbsam2_delete_object: no NULL pointers are accepted here!\n")); return NT_STATUS_INVALID_PARAMETER; } mem_ctx = talloc_init("tdbsam2_delete_object"); if (!mem_ctx) { - DEBUG(0, ("tdbsam2_new_object: Out of memory!\n")); + DEBUG(0, ("tdbsam2_delete_object: Out of memory!\n")); return NT_STATUS_NO_MEMORY; } if (tdbsam2_db == NULL) { - if (NT_STATUS_IS_ERR(ret = tdbsam2_opentdb())) { + if (NT_STATUS_IS_ERR(ret = opentdb())) { goto done; } } - sid_to_string(sidstr, sid); - - slprintf(keystr, sizeof(keystr)-1, "%s%s", SIDPREFIX, sidstr); + slprintf(keystr, sizeof(keystr)-1, "%s%s", SIDPREFIX, sid_string_static(sid)); key.dptr = keystr; key.dsize = strlen(keystr) + 1; data = tdb_fetch(tdbsam2_db, key); if (!data.dptr) { - DEBUG(5, ("get_domain_sid: Error fetching database, SID entry not found!\n")); + DEBUG(5, ("tdbsam2_delete_object: Error fetching database, SID entry not found!\n")); DEBUGADD(5, (" Error: %s\n", tdb_errorstr(tdbsam2_db))); DEBUGADD(5, (" Key: %s\n", keystr)); ret = NT_STATUS_UNSUCCESSFUL; goto done; } - len = tdb_unpack(data.dptr, data.dsize, TDB_FORMAT_STRING, - &obj_version, - &obj_type, - &obj_name); + if (tdb_delete(tdbsam2_db, key) != TDB_SUCCESS) { + DEBUG(5, ("tdbsam2_delete_object: Error deleting object!\n")); + DEBUGADD(5, (" Error: %s\n", tdb_errorstr(tdbsam2_db))); + DEBUGADD(5, (" Key: %s\n", keystr)); + ret = NT_STATUS_UNSUCCESSFUL; + goto done; + } - if (len == -1) { + if (NT_STATUS_IS_ERR(init_tdbsam2_object_from_buffer(&obj, mem_ctx, data.dptr, data.dsize))) { + SAFE_FREE(data.dptr); + DEBUG(0, ("tdbsam2_delete_object: Error fetching database, malformed entry!\n")); ret = NT_STATUS_UNSUCCESSFUL; goto done; } + switch (obj.type) { + case GUMS_OBJ_DOMAIN: + /* TODO: SHOULD WE ALLOW TO DELETE DOMAINS ? */ + slprintf(keystr, sizeof(keystr) - 1, "%s%s", NAMEPREFIX, obj.data.domain->name); + break; + case GUMS_OBJ_GROUP: + case GUMS_OBJ_ALIAS: + slprintf(keystr, sizeof(keystr) - 1, "%s%s", NAMEPREFIX, obj.data.group->name); + break; + case GUMS_OBJ_NORMAL_USER: + slprintf(keystr, sizeof(keystr) - 1, "%s%s", NAMEPREFIX, obj.data.user->name); + break; + default: + ret = NT_STATUS_UNSUCCESSFUL; + goto done; + } + + key.dptr = keystr; + key.dsize = strlen(keystr) + 1; + if (tdb_delete(tdbsam2_db, key) != TDB_SUCCESS) { - DEBUG(5, ("tdbsam2_object_delete: Error deleting object!\n")); + DEBUG(5, ("tdbsam2_delete_object: Error deleting object!\n")); DEBUGADD(5, (" Error: %s\n", tdb_errorstr(tdbsam2_db))); DEBUGADD(5, (" Key: %s\n", keystr)); ret = NT_STATUS_UNSUCCESSFUL; goto done; - } + } - switch (obj_type) { - case GUMS_OBJ_NORMAL_USER: - case GUMS_OBJ_GROUP: - case GUMS_OBJ_ALIAS: - - slprintf(keystr, sizeof(keystr)-1, "%s%s", OBJECTPREFIX, obj_name); - key.dptr = keystr; - key.dsize = strlen(keystr) + 1; - - if (tdb_delete(tdbsam2_db, key) != TDB_SUCCESS) { - DEBUG(5, ("tdbsam2_object_delete: Error deleting object!\n")); - DEBUGADD(5, (" Error: %s\n", tdb_errorstr(tdbsam2_db))); - DEBUGADD(5, (" Key: %s\n", keystr)); - ret = NT_STATUS_UNSUCCESSFUL; - goto done; +/* TODO: update the general database counter */ + +done: + SAFE_FREE(data.dptr); + talloc_destroy(mem_ctx); + return ret; +} + +static NTSTATUS tdbsam2_get_object_from_sid(GUMS_OBJECT **object, const DOM_SID *sid, const int obj_type) +{ + NTSTATUS ret; + struct tdbsam2_object obj; + TALLOC_CTX *mem_ctx; + + if (!object || !sid) { + DEBUG(0, ("tdbsam2_get_object_from_sid: no NULL pointers are accepted here!\n")); + return NT_STATUS_INVALID_PARAMETER; + } + + mem_ctx = talloc_init("tdbsam2_get_object_from_sid"); + if (!mem_ctx) { + DEBUG(0, ("tdbsam2_get_object_from_sid: Out of memory!\n")); + return NT_STATUS_NO_MEMORY; + } + + ret = get_object_by_sid(mem_ctx, &obj, sid); + if (NT_STATUS_IS_ERR(ret) || (obj_type && obj.type != obj_type)) { + DEBUG(0, ("tdbsam2_get_object_from_sid: error fetching object or wrong object type!\n")); + goto done; + } + + ret = data_to_gums_object(object, &obj); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(0, ("tdbsam2_get_object_from_sid: error setting object data!\n")); + goto done; + } + +done: + talloc_destroy(mem_ctx); + return ret; +} + +static NTSTATUS tdbsam2_get_object_from_name(GUMS_OBJECT **object, const char *name, const int obj_type) +{ + NTSTATUS ret; + struct tdbsam2_object obj; + TALLOC_CTX *mem_ctx; + + if (!object || !name) { + DEBUG(0, ("tdbsam2_get_object_from_sid: no NULL pointers are accepted here!\n")); + return NT_STATUS_INVALID_PARAMETER; + } + + mem_ctx = talloc_init("tdbsam2_get_object_from_sid"); + if (!mem_ctx) { + DEBUG(0, ("tdbsam2_get_object_from_sid: Out of memory!\n")); + return NT_STATUS_NO_MEMORY; + } + + ret = get_object_by_name(mem_ctx, &obj, name); + if (NT_STATUS_IS_ERR(ret) || (obj_type && obj.type != obj_type)) { + DEBUG(0, ("tdbsam2_get_object_from_sid: error fetching object or wrong object type!\n")); + goto done; + } + + ret = data_to_gums_object(object, &obj); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(0, ("tdbsam2_get_object_from_sid: error setting object data!\n")); + goto done; + } + +done: + talloc_destroy(mem_ctx); + return ret; +} + + /* This function is used to get the list of all objects changed since base_time, it is + used to support PDC<->BDC synchronization */ + NTSTATUS (*get_updated_objects) (GUMS_OBJECT **objects, const NTTIME base_time); + +static NTSTATUS tdbsam2_enumerate_objects_start(void *handle, const DOM_SID *sid, const int obj_type) +{ + struct tdbsam2_enum_objs *teo, *t; + pstring tdbfile; + + teo = (struct tdbsam2_enum_objs *)calloc(1, sizeof(struct tdbsam2_enum_objs)); + if (!teo) { + DEBUG(0, ("tdbsam2_enumerate_objects_start: Out of Memory!\n")); + return NT_STATUS_NO_MEMORY; + } + + teo->type = obj_type; + if (sid) { + sid_to_string(teo->dom_sid, sid); + } + + get_private_directory(tdbfile); + pstrcat(tdbfile, "/"); + pstrcat(tdbfile, TDB_FILE_NAME); + + teo->db = tdb_open_log(tdbfile, 0, TDB_DEFAULT, O_RDONLY, 0600); + if (!teo->db) + { + DEBUG(0, ("tdbsam2_enumerate_objects_start: Unable to open database (%s)!\n", tdbfile)); + SAFE_FREE(teo); + return NT_STATUS_UNSUCCESSFUL; + } + + if (!teo_handlers) { + *teo_handlers = teo; + } else { + t = *teo_handlers; + while (t->next) { + t = t->next; + } + t->next = teo; + } + + handle = teo; + + teo->key = tdb_firstkey(teo->db); + + return NT_STATUS_OK; +} + +static NTSTATUS tdbsam2_enumerate_objects_get_next(GUMS_OBJECT **object, void *handle) +{ + NTSTATUS ret; + TALLOC_CTX *mem_ctx; + TDB_DATA data; + struct tdbsam2_enum_objs *teo; + struct tdbsam2_object obj; + const char *prefix = SIDPREFIX; + const int preflen = strlen(prefix); + + if (!object || !handle) { + DEBUG(0, ("tdbsam2_get_object_from_sid: no NULL pointers are accepted here!\n")); + return NT_STATUS_INVALID_PARAMETER; + } + + teo = (struct tdbsam2_enum_objs *)handle; + + mem_ctx = talloc_init("tdbsam2_enumerate_objects_get_next"); + if (!mem_ctx) { + DEBUG(0, ("tdbsam2_enumerate_objects_get_next: Out of memory!\n")); + return NT_STATUS_NO_MEMORY; + } + + while ((teo->key.dsize != 0)) { + int len, version, type, size; + char *ptr; + + if (strncmp(teo->key.dptr, prefix, preflen)) { + teo->key = tdb_nextkey(teo->db, teo->key); + continue; + } + + if (teo->dom_sid) { + if (strncmp(&(teo->key.dptr[preflen]), teo->dom_sid, strlen(teo->dom_sid))) { + teo->key = tdb_nextkey(teo->db, teo->key); + continue; } - break; + } - case GUMS_OBJ_DOMAIN: - /* TODO: SHOULD WE ALLOW TO DELETE DOMAINS ? */ + data = tdb_fetch(teo->db, teo->key); + if (!data.dptr) { + DEBUG(5, ("tdbsam2_enumerate_objects_get_next: Error fetching database, SID entry not found!\n")); + DEBUGADD(5, (" Error: %s\n", tdb_errorstr(teo->db))); + DEBUGADD(5, (" Key: %s\n", teo->key.dptr)); + ret = NT_STATUS_UNSUCCESSFUL; + goto done; + } - default: + len = tdb_unpack (data.dptr, data.dsize, TDB_FORMAT_STRING, + &version, + &type, + &size, &ptr); + + if (len == -1) { + DEBUG(5, ("tdbsam2_enumerate_objects_get_next: Error unable to unpack data!\n")); ret = NT_STATUS_UNSUCCESSFUL; goto done; + } + SAFE_FREE(ptr); + + if (teo->type && type != teo->type) { + SAFE_FREE(data.dptr); + data.dsize = 0; + teo->key = tdb_nextkey(teo->db, teo->key); + continue; + } + + break; } + if (data.dsize != 0) { + if (NT_STATUS_IS_ERR(init_tdbsam2_object_from_buffer(&obj, mem_ctx, data.dptr, data.dsize))) { + SAFE_FREE(data.dptr); + DEBUG(0, ("tdbsam2_enumerate_objects_get_next: Error fetching database, malformed entry!\n")); + ret = NT_STATUS_UNSUCCESSFUL; + goto done; + } + SAFE_FREE(data.dptr); + } + + ret = data_to_gums_object(object, &obj); + done: - SAFE_FREE(obj_name); talloc_destroy(mem_ctx); return ret; } - NTSTATUS (*get_object_from_sid) (GUMS_OBJECT **object, const DOM_SID *sid, const int obj_type); - NTSTATUS (*get_sid_from_name) (GUMS_OBJECT **object, const char *name); - /* This function is used to get the list of all objects changed since b_time, it is - used to support PDC<->BDC synchronization */ - NTSTATUS (*get_updated_objects) (GUMS_OBJECT **objects, const NTTIME base_time); +static NTSTATUS tdbsam2_enumerate_objects_stop(void *handle) +{ + struct tdbsam2_enum_objs *teo, *t, *p; + + teo = (struct tdbsam2_enum_objs *)handle; + + if (*teo_handlers == teo) { + *teo_handlers = teo->next; + } else { + t = *teo_handlers; + while (t != teo) { + p = t; + t = t->next; + if (t == NULL) { + DEBUG(0, ("tdbsam2_enumerate_objects_stop: Error, handle not found!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + } + p = t->next; + } + + tdb_close(teo->db); + SAFE_FREE(teo); - NTSTATUS (*enumerate_objects_start) (void *handle, const DOM_SID *sid, const int obj_type); - NTSTATUS (*enumerate_objects_get_next) (GUMS_OBJECT **object, void *handle); - NTSTATUS (*enumerate_objects_stop) (void *handle); + return NT_STATUS_OK; +} /* This function MUST be used ONLY by PDC<->BDC replication code or recovery tools. Never use this function to update an object in the database, use set_object_values() */ @@ -556,7 +1151,43 @@ done: NTSTATUS (*set_privilege) (GUMS_PRIVILEGE *priv); -int gumm_init(GUMS_FUNCTIONS **storage) { +int gumm_init(GUMS_FUNCTIONS **storage) +{ + tdbsam2_db = NULL; + teo_handlers = 0; return 0; } + +#if 0 +int main(int argc, char *argv[]) +{ + NTSTATUS ret; + DOM_SID dsid; + + if (argc < 2) { + printf ("not enough arguments!\n"); + exit(0); + } + + if (!lp_load(dyn_CONFIGFILE,True,False,False)) { + fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE); + exit(1); + } + + ret = tdbsam2_new_object(&dsid, "_domain_", GUMS_OBJ_DOMAIN); + if (NT_STATUS_IS_OK(ret)) { + printf ("_domain_ created, sid=%s\n", sid_string_static(&dsid)); + } else { + printf ("_domain_ creation error n. 0x%08x\n", ret.v); + } + ret = tdbsam2_new_object(&dsid, argv[1], GUMS_OBJ_NORMAL_USER); + if (NT_STATUS_IS_OK(ret)) { + printf ("%s user created, sid=%s\n", argv[1], sid_string_static(&dsid)); + } else { + printf ("%s user creation error n. 0x%08x\n", argv[1], ret.v); + } + + exit(0); +} +#endif diff --git a/source3/sam/gums.c b/source3/sam/gums.c index 3a20ef6fc9..a118740637 100644 --- a/source3/sam/gums.c +++ b/source3/sam/gums.c @@ -26,10 +26,40 @@ #define GMV_MAJOR 0 #define GMV_MINOR 1 +#define PRIV_NONE 0 +#define PRIV_CREATE_TOKEN 1 +#define PRIV_ASSIGNPRIMARYTOKEN 2 +#define PRIV_LOCK_MEMORY 3 +#define PRIV_INCREASE_QUOTA 4 +#define PRIV_MACHINE_ACCOUNT 5 +#define PRIV_TCB 6 +#define PRIV_SECURITY 7 +#define PRIV_TAKE_OWNERSHIP 8 +#define PRIV_LOAD_DRIVER 9 +#define PRIV_SYSTEM_PROFILE 10 +#define PRIV_SYSTEMTIME 11 +#define PRIV_PROF_SINGLE_PROCESS 12 +#define PRIV_INC_BASE_PRIORITY 13 +#define PRIV_CREATE_PAGEFILE 14 +#define PRIV_CREATE_PERMANENT 15 +#define PRIV_BACKUP 16 +#define PRIV_RESTORE 17 +#define PRIV_SHUTDOWN 18 +#define PRIV_DEBUG 19 +#define PRIV_AUDIT 20 +#define PRIV_SYSTEM_ENVIRONMENT 21 +#define PRIV_CHANGE_NOTIFY 22 +#define PRIV_REMOTE_SHUTDOWN 23 +#define PRIV_UNDOCK 24 +#define PRIV_SYNC_AGENT 25 +#define PRIV_ENABLE_DELEGATION 26 +#define PRIV_ALL 255 + + GUMS_FUNCTIONS *gums_storage; static void *dl_handle; -PRIVS privs[] = { +static PRIVS gums_privs[] = { {PRIV_NONE, "no_privs", "No privilege"}, /* this one MUST be first */ {PRIV_CREATE_TOKEN, "SeCreateToken", "Create Token"}, {PRIV_ASSIGNPRIMARYTOKEN, "SeAssignPrimaryToken", "Assign Primary Token"}, @@ -110,19 +140,19 @@ done: NTSTATUS gums_unload(void) { - NSTATUS ret; + NTSTATUS ret; NTSTATUS (*module_finalize)(); if (!dl_handle) return NT_STATUS_UNSUCCESSFUL; - module_close = sys_dlsym(dl_handle, "gumm_finalize"); + module_finalize = sys_dlsym(dl_handle, "gumm_finalize"); if (!module_finalize) { DEBUG(0, ("ERROR: Failed to find gums module's init function!\n")); return NT_STATUS_UNSUCCESSFUL; } - DEBUG(5, ("Finalizing module %s\n", module_name)); + DEBUG(5, ("Finalizing module")); ret = module_finalize(); sys_dlclose(dl_handle); diff --git a/source3/sam/gums_api.c b/source3/sam/gums_api.c index 75e32fa861..2e5dcd143a 100644 --- a/source3/sam/gums_api.c +++ b/source3/sam/gums_api.c @@ -20,6 +20,182 @@ #include "includes.h" + +/******************************************************************* + Create a SEC_ACL structure. +********************************************************************/ + +static SEC_ACL *make_sec_acl(TALLOC_CTX *ctx, uint16 revision, int num_aces, SEC_ACE *ace_list) +{ + SEC_ACL *dst; + int i; + + if((dst = (SEC_ACL *)talloc_zero(ctx,sizeof(SEC_ACL))) == NULL) + return NULL; + + dst->revision = revision; + dst->num_aces = num_aces; + dst->size = SEC_ACL_HEADER_SIZE; + + /* Now we need to return a non-NULL address for the ace list even + if the number of aces required is zero. This is because there + is a distinct difference between a NULL ace and an ace with zero + entries in it. This is achieved by checking that num_aces is a + positive number. */ + + if ((num_aces) && + ((dst->ace = (SEC_ACE *)talloc(ctx, sizeof(SEC_ACE) * num_aces)) + == NULL)) { + return NULL; + } + + for (i = 0; i < num_aces; i++) { + dst->ace[i] = ace_list[i]; /* Structure copy. */ + dst->size += ace_list[i].size; + } + + return dst; +} + + + +/******************************************************************* + Duplicate a SEC_ACL structure. +********************************************************************/ + +static SEC_ACL *dup_sec_acl(TALLOC_CTX *ctx, SEC_ACL *src) +{ + if(src == NULL) + return NULL; + + return make_sec_acl(ctx, src->revision, src->num_aces, src->ace); +} + + + +/******************************************************************* + Creates a SEC_DESC structure +********************************************************************/ + +static SEC_DESC *make_sec_desc(TALLOC_CTX *ctx, uint16 revision, + DOM_SID *owner_sid, DOM_SID *grp_sid, + SEC_ACL *sacl, SEC_ACL *dacl, size_t *sd_size) +{ + SEC_DESC *dst; + uint32 offset = 0; + uint32 offset_sid = SEC_DESC_HEADER_SIZE; + uint32 offset_acl = 0; + + *sd_size = 0; + + if(( dst = (SEC_DESC *)talloc_zero(ctx, sizeof(SEC_DESC))) == NULL) + return NULL; + + dst->revision = revision; + dst->type = SEC_DESC_SELF_RELATIVE; + + if (sacl) dst->type |= SEC_DESC_SACL_PRESENT; + if (dacl) dst->type |= SEC_DESC_DACL_PRESENT; + + dst->off_owner_sid = 0; + dst->off_grp_sid = 0; + dst->off_sacl = 0; + dst->off_dacl = 0; + + if(owner_sid && ((dst->owner_sid = sid_dup_talloc(ctx,owner_sid)) == NULL)) + goto error_exit; + + if(grp_sid && ((dst->grp_sid = sid_dup_talloc(ctx,grp_sid)) == NULL)) + goto error_exit; + + if(sacl && ((dst->sacl = dup_sec_acl(ctx, sacl)) == NULL)) + goto error_exit; + + if(dacl && ((dst->dacl = dup_sec_acl(ctx, dacl)) == NULL)) + goto error_exit; + + offset = 0; + + /* + * Work out the linearization sizes. + */ + if (dst->owner_sid != NULL) { + + if (offset == 0) + offset = SEC_DESC_HEADER_SIZE; + + offset += sid_size(dst->owner_sid); + } + + if (dst->grp_sid != NULL) { + + if (offset == 0) + offset = SEC_DESC_HEADER_SIZE; + + offset += sid_size(dst->grp_sid); + } + + if (dst->sacl != NULL) { + + offset_acl = SEC_DESC_HEADER_SIZE; + + dst->off_sacl = offset_acl; + offset_acl += dst->sacl->size; + offset += dst->sacl->size; + offset_sid += dst->sacl->size; + } + + if (dst->dacl != NULL) { + + if (offset_acl == 0) + offset_acl = SEC_DESC_HEADER_SIZE; + + dst->off_dacl = offset_acl; + offset_acl += dst->dacl->size; + offset += dst->dacl->size; + offset_sid += dst->dacl->size; + } + + *sd_size = (size_t)((offset == 0) ? SEC_DESC_HEADER_SIZE : offset); + + if (dst->owner_sid != NULL) + dst->off_owner_sid = offset_sid; + + /* sid_size() returns 0 if the sid is NULL so this is ok */ + + if (dst->grp_sid != NULL) + dst->off_grp_sid = offset_sid + sid_size(dst->owner_sid); + + return dst; + +error_exit: + + *sd_size = 0; + return NULL; +} + +/******************************************************************* + Duplicate a SEC_DESC structure. +********************************************************************/ + +static SEC_DESC *dup_sec_desc( TALLOC_CTX *ctx, SEC_DESC *src) +{ + size_t dummy; + + if(src == NULL) + return NULL; + + return make_sec_desc( ctx, src->revision, + src->owner_sid, src->grp_sid, src->sacl, + src->dacl, &dummy); +} + + + + + + + extern GUMS_FUNCTIONS *gums_storage; /* Functions to get/set info from a GUMS object */ @@ -37,7 +213,7 @@ NTSTATUS gums_create_object(GUMS_OBJECT **obj, uint32 type) { TALLOC_CTX *mem_ctx = talloc_init("gums_create_object"); GUMS_OBJECT *go; - NT_STATUS ret; + NTSTATUS ret; go = talloc_zero(mem_ctx, sizeof(GUMS_OBJECT)); go->mem_ctx = mem_ctx; @@ -54,12 +230,12 @@ NTSTATUS gums_create_object(GUMS_OBJECT **obj, uint32 type) case GUMS_OBJ_DOMAIN_TRUST: */ case GUMS_OBJ_NORMAL_USER: - go->data = (GUMS_USER *)talloc_zero(mem_ctx, sizeof(GUMS_USER)); + go->data.user = (GUMS_USER *)talloc_zero(mem_ctx, sizeof(GUMS_USER)); break; case GUMS_OBJ_GROUP: case GUMS_OBJ_ALIAS: - go->data = (GUMS_GROUP *)talloc_zero(mem_ctx, sizeof(GUMS_GROUP)); + go->data.group = (GUMS_GROUP *)talloc_zero(mem_ctx, sizeof(GUMS_GROUP)); break; default: @@ -68,7 +244,7 @@ NTSTATUS gums_create_object(GUMS_OBJECT **obj, uint32 type) goto error; } - if (!(go->data)) { + if (!(go->data.user)) { ret = NT_STATUS_NO_MEMORY; DEBUG(0, ("gums_create_object: Out of memory!\n")); goto error; @@ -190,6 +366,30 @@ NTSTATUS gums_get_object_privileges(PRIVILEGE_SET **priv_set, const GUMS_OBJECT } */ +NTSTATUS gums_get_domain_next_rid(uint32 *rid, const GUMS_OBJECT *obj) +{ + if (!obj) + return NT_STATUS_INVALID_PARAMETER; + + if (obj->type != GUMS_OBJ_DOMAIN) + return NT_STATUS_OBJECT_TYPE_MISMATCH; + + *rid = obj->data.domain->next_rid; + return NT_STATUS_OK; +} + +NTSTATUS gums_set_domain_next_rid(GUMS_OBJECT *obj, uint32 rid) +{ + if (!obj) + return NT_STATUS_INVALID_PARAMETER; + + if (obj->type != GUMS_OBJ_DOMAIN) + return NT_STATUS_OBJECT_TYPE_MISMATCH; + + obj->data.domain->next_rid = rid; + return NT_STATUS_OK; +} + NTSTATUS gums_get_user_pri_group(DOM_SID **sid, const GUMS_OBJECT *obj) { if (!sid || !obj) @@ -223,19 +423,19 @@ NTSTATUS gums_get_user_nt_pwd(DATA_BLOB **nt_pwd, const GUMS_OBJECT *obj) if (obj->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_OBJECT_TYPE_MISMATCH; - *nt_pwd = obj->data.user->nt_pw; + *nt_pwd = &(obj->data.user->nt_pw); return NT_STATUS_OK; } NTSTATUS gums_set_user_nt_pwd(GUMS_OBJECT *obj, const DATA_BLOB nt_pwd) { - if (!obj || !nt_pwd || nt_pwd != NT_HASH_LEN) + if (!obj || nt_pwd.length != NT_HASH_LEN) return NT_STATUS_INVALID_PARAMETER; if (obj->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_OBJECT_TYPE_MISMATCH; - obj->data.user->nt_pwd = data_blob_talloc(obj->mem_ctx, nt_pwd.data, nt_pwd.lenght); + obj->data.user->nt_pw = data_blob_talloc(obj->mem_ctx, nt_pwd.data, nt_pwd.length); return NT_STATUS_OK; } @@ -247,19 +447,19 @@ NTSTATUS gums_get_user_lm_pwd(DATA_BLOB **lm_pwd, const GUMS_OBJECT *obj) if (obj->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_OBJECT_TYPE_MISMATCH; - *lm_pwd = obj->data.user->lm_pw; + *lm_pwd = &(obj->data.user->lm_pw); return NT_STATUS_OK; } NTSTATUS gums_set_user_lm_pwd(GUMS_OBJECT *obj, const DATA_BLOB lm_pwd) { - if (!obj || !lm_pwd || lm_pwd != LM_HASH_LEN) + if (!obj || lm_pwd.length != LM_HASH_LEN) return NT_STATUS_INVALID_PARAMETER; if (obj->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_OBJECT_TYPE_MISMATCH; - obj->data.user->lm_pwd = data_blob_talloc(obj->mem_ctx, lm_pwd.data, lm_pwd.lenght); + obj->data.user->lm_pw = data_blob_talloc(obj->mem_ctx, lm_pwd.data, lm_pwd.length); return NT_STATUS_OK; } @@ -591,7 +791,7 @@ NTSTATUS gums_get_user_pass_must_change_time(NTTIME *pass_must_change_time, cons if (obj->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_OBJECT_TYPE_MISMATCH; - *pass_must_change_time = obj->data-user->pass_must_change_time; + *pass_must_change_time = obj->data.user->pass_must_change_time; return NT_STATUS_OK; } @@ -768,7 +968,7 @@ NTSTATUS gums_get_group_members(uint32 *count, DOM_SID **members, const GUMS_OBJ return NT_STATUS_OBJECT_TYPE_MISMATCH; *count = obj->data.group->count; - *members = obj->data.group->members; + *members = *(obj->data.group->members); return NT_STATUS_OK; } @@ -786,7 +986,7 @@ NTSTATUS gums_set_group_members(GUMS_OBJECT *obj, uint32 count, DOM_SID **member obj->data.group->count = count; n = 0; do { - obj->data.group->members[n] = dup_sec_desc(obj->mem_ctx, members[n]); + obj->data.group->members[n] = sid_dup_talloc(obj->mem_ctx, members[n]); if (!(obj->data.group->members[n])) return NT_STATUS_NO_MEMORY; n++; } while (n < count); @@ -836,8 +1036,8 @@ NTSTATUS gums_cs_set_sec_desc(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, SEC if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = GUMS_SET_SEC_DESC; new_sec_desc = dup_sec_desc(mem_ctx, sec_desc); @@ -849,6 +1049,7 @@ NTSTATUS gums_cs_set_sec_desc(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, SEC return NT_STATUS_OK; } +/* NTSTATUS gums_cs_add_privilege(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, LUID_ATTR priv) { GUMS_DATA_SET *data_set; @@ -858,7 +1059,7 @@ NTSTATUS gums_cs_add_privilege(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, LU return NT_STATUS_INVALID_PARAMETER; com_set->count = com_set->count + 1; - if (com_set->count == 1) { /* first data set */ + if (com_set->count == 1) { data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET)); } else { data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count); @@ -866,8 +1067,8 @@ NTSTATUS gums_cs_add_privilege(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, LU if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = GUMS_ADD_PRIVILEGE; if (NT_STATUS_IS_ERR(dupalloc_luid_attr(mem_ctx, &new_priv, priv))) @@ -887,7 +1088,7 @@ NTSTATUS gums_cs_del_privilege(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, LU return NT_STATUS_INVALID_PARAMETER; com_set->count = com_set->count + 1; - if (com_set->count == 1) { /* first data set */ + if (com_set->count == 1) { data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET)); } else { data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count); @@ -895,8 +1096,8 @@ NTSTATUS gums_cs_del_privilege(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, LU if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = GUMS_DEL_PRIVILEGE; if (NT_STATUS_IS_ERR(dupalloc_luid_attr(mem_ctx, &new_priv, priv))) @@ -916,7 +1117,7 @@ NTSTATUS gums_cs_set_privilege_set(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set return NT_STATUS_INVALID_PARAMETER; com_set->count = com_set->count + 1; - if (com_set->count == 1) { /* first data set */ + if (com_set->count == 1) { data_set = (GUMS_DATA_SET *)talloc(mem_ctx, sizeof(GUMS_DATA_SET)); } else { data_set = (GUMS_DATA_SET *)talloc_realloc(mem_ctx, com_set->data, sizeof(GUMS_DATA_SET) * com_set->count); @@ -924,10 +1125,10 @@ NTSTATUS gums_cs_set_privilege_set(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); - data_set->type = GUMS_SET_SEC_DESC; + data_set->type = GUMS_SET_PRIVILEGE; if (NT_STATUS_IS_ERR(dup_priv_set(&new_priv_set, mem_ctx, priv_set))) return NT_STATUS_NO_MEMORY; @@ -935,6 +1136,7 @@ NTSTATUS gums_cs_set_privilege_set(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set return NT_STATUS_OK; } +*/ NTSTATUS gums_cs_set_string(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, uint32 type, char *str) { @@ -953,8 +1155,8 @@ NTSTATUS gums_cs_set_string(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, uint3 if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = type; new_str = talloc_strdup(mem_ctx, str); @@ -968,12 +1170,12 @@ NTSTATUS gums_cs_set_string(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, uint3 NTSTATUS gums_cs_set_name(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *name) { - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, name); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, name); } NTSTATUS gums_cs_set_description(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *desc) { - return gums_set_string(mem_ctx, com_set, GUMS_SET_DESCRIPTION, desc); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_DESCRIPTION, desc); } NTSTATUS gums_cs_set_full_name(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *full_name) @@ -981,7 +1183,7 @@ NTSTATUS gums_cs_set_full_name(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, ch if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, full_name); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, full_name); } NTSTATUS gums_cs_set_home_directory(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *home_dir) @@ -989,7 +1191,7 @@ NTSTATUS gums_cs_set_home_directory(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_se if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, home_dir); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, home_dir); } NTSTATUS gums_cs_set_drive(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *drive) @@ -997,7 +1199,7 @@ NTSTATUS gums_cs_set_drive(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char * if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, drive); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, drive); } NTSTATUS gums_cs_set_logon_script(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *logon_script) @@ -1005,7 +1207,7 @@ NTSTATUS gums_cs_set_logon_script(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, logon_script); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, logon_script); } NTSTATUS gums_cs_set_profile_path(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *prof_path) @@ -1013,7 +1215,7 @@ NTSTATUS gums_cs_set_profile_path(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, prof_path); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, prof_path); } NTSTATUS gums_cs_set_workstations(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *wks) @@ -1021,7 +1223,7 @@ NTSTATUS gums_cs_set_workstations(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, wks); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, wks); } NTSTATUS gums_cs_set_unknown_string(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *unkn_str) @@ -1029,7 +1231,7 @@ NTSTATUS gums_cs_set_unknown_string(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_se if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, unkn_str); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, unkn_str); } NTSTATUS gums_cs_set_munged_dial(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, char *munged_dial) @@ -1037,7 +1239,7 @@ NTSTATUS gums_cs_set_munged_dial(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_string(mem_ctx, com_set, GUMS_SET_NAME, munged_dial); + return gums_cs_set_string(mem_ctx, com_set, GUMS_SET_NAME, munged_dial); } NTSTATUS gums_cs_set_nttime(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, uint32 type, NTTIME *nttime) @@ -1057,8 +1259,8 @@ NTSTATUS gums_cs_set_nttime(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, uint3 if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = type; new_time = talloc(mem_ctx, sizeof(NTTIME)); @@ -1077,7 +1279,7 @@ NTSTATUS gums_cs_set_logon_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, N if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, logon_time); + return gums_cs_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, logon_time); } NTSTATUS gums_cs_set_logoff_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *logoff_time) @@ -1085,7 +1287,7 @@ NTSTATUS gums_cs_set_logoff_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGOFF_TIME, logoff_time); + return gums_cs_set_nttime(mem_ctx, com_set, GUMS_SET_LOGOFF_TIME, logoff_time); } NTSTATUS gums_cs_set_kickoff_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *kickoff_time) @@ -1093,7 +1295,7 @@ NTSTATUS gums_cs_set_kickoff_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_nttime(mem_ctx, com_set, GUMS_SET_KICKOFF_TIME, kickoff_time); + return gums_cs_set_nttime(mem_ctx, com_set, GUMS_SET_KICKOFF_TIME, kickoff_time); } NTSTATUS gums_cs_set_pass_last_set_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *pls_time) @@ -1101,7 +1303,7 @@ NTSTATUS gums_cs_set_pass_last_set_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *co if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pls_time); + return gums_cs_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pls_time); } NTSTATUS gums_cs_set_pass_can_change_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *pcc_time) @@ -1109,7 +1311,7 @@ NTSTATUS gums_cs_set_pass_can_change_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET * if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pcc_time); + return gums_cs_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pcc_time); } NTSTATUS gums_cs_set_pass_must_change_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, NTTIME *pmc_time) @@ -1117,7 +1319,7 @@ NTSTATUS gums_cs_set_pass_must_change_time(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET if (com_set->type != GUMS_OBJ_NORMAL_USER) return NT_STATUS_INVALID_PARAMETER; - return gums_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pmc_time); + return gums_cs_set_nttime(mem_ctx, com_set, GUMS_SET_LOGON_TIME, pmc_time); } NTSTATUS gums_cs_add_sids_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count) @@ -1138,8 +1340,8 @@ NTSTATUS gums_cs_add_sids_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = GUMS_ADD_SID_LIST; new_sids = (DOM_SID **)talloc(mem_ctx, (sizeof(void *) * count)); @@ -1163,7 +1365,7 @@ NTSTATUS gums_cs_add_users_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_se if (com_set->type != GUMS_OBJ_GROUP || com_set->type != GUMS_OBJ_ALIAS) return NT_STATUS_INVALID_PARAMETER; - return gums_add_sids_to_group(mem_ctx, com_set, sids, count); + return gums_cs_add_sids_to_group(mem_ctx, com_set, sids, count); } NTSTATUS gums_cs_add_groups_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count) @@ -1173,7 +1375,7 @@ NTSTATUS gums_cs_add_groups_to_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_s if (com_set->type != GUMS_OBJ_ALIAS) return NT_STATUS_INVALID_PARAMETER; - return gums_add_sids_to_group(mem_ctx, com_set, sids, count); + return gums_cs_add_sids_to_group(mem_ctx, com_set, sids, count); } NTSTATUS gums_cs_del_sids_from_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set, const DOM_SID **sids, const uint32 count) @@ -1196,8 +1398,8 @@ NTSTATUS gums_cs_del_sids_from_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_s if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = GUMS_DEL_SID_LIST; new_sids = (DOM_SID **)talloc(mem_ctx, (sizeof(void *) * count)); @@ -1234,8 +1436,8 @@ NTSTATUS gums_ds_set_sids_in_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set if (data_set == NULL) return NT_STATUS_NO_MEMORY; - com_set->data = data_set; - data_set = &((com_set->data)[com_set->count - 1]); + com_set->data[0] = data_set; + data_set = ((com_set->data)[com_set->count - 1]); data_set->type = GUMS_SET_SID_LIST; new_sids = (DOM_SID **)talloc(mem_ctx, (sizeof(void *) * count)); @@ -1255,7 +1457,7 @@ NTSTATUS gums_ds_set_sids_in_group(TALLOC_CTX *mem_ctx, GUMS_COMMIT_SET *com_set NTSTATUS gums_commit_data(GUMS_COMMIT_SET *set) { - return gums_storage->set_object_values(set->sid, set->count, set->data); + return gums_storage->set_object_values(&(set->sid), set->count, set->data); } NTSTATUS gums_destroy_commit_set(GUMS_COMMIT_SET **com_set) diff --git a/source3/sam/gums_helper.c b/source3/sam/gums_helper.c index 8526a2f1cc..c22e6cf7ff 100644 --- a/source3/sam/gums_helper.c +++ b/source3/sam/gums_helper.c @@ -57,13 +57,13 @@ extern DOM_SID global_sid_Builtin_Guests; loops with winbind may happen. ****************************************************************************/ -/* +#if 0 NTSTATUS is_mapped_group(BOOL *mapped, const DOM_SID *sid) { NTSTATUS result; gid_t id; - /* look if mapping exist, do not make idmap alloc an uid if SID is not found * / + /* look if mapping exist, do not make idmap alloc an uid if SID is not found */ result = idmap_get_gid_from_sid(&id, sid, False); if (NT_STATUS_IS_OK(result)) { *mapped = gid_is_in_winbind_range(id); @@ -73,7 +73,7 @@ NTSTATUS is_mapped_group(BOOL *mapped, const DOM_SID *sid) return result; } -*/ +#endif /**************************************************************************** duplicate alloc luid_attr @@ -96,7 +96,7 @@ NTSTATUS dupalloc_luid_attr(TALLOC_CTX *ctx, LUID_ATTR **new_la, LUID_ATTR old_l /**************************************************************************** initialise a privilege list ****************************************************************************/ -void init_privilege(PRIVILEGE_SET *priv_set) +void gums_init_privilege(PRIVILEGE_SET *priv_set) { priv_set->count=0; priv_set->control=0; @@ -106,12 +106,12 @@ void init_privilege(PRIVILEGE_SET *priv_set) /**************************************************************************** add a privilege to a privilege array ****************************************************************************/ -NTSTATUS add_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx, LUID_ATTR set) +NTSTATUS gums_add_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx, LUID_ATTR set) { LUID_ATTR *new_set; /* check if the privilege is not already in the list */ - if (check_priv_in_privilege(priv_set, set)) + if (gums_check_priv_in_privilege(priv_set, set)) return NT_STATUS_UNSUCCESSFUL; /* we can allocate memory to add the new privilege */ @@ -135,7 +135,7 @@ NTSTATUS add_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx, LUID_ATTR set) /**************************************************************************** add all the privileges to a privilege array ****************************************************************************/ -NTSTATUS add_all_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx) +NTSTATUS gums_add_all_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx) { NTSTATUS result = NT_STATUS_OK; LUID_ATTR set; @@ -144,15 +144,15 @@ NTSTATUS add_all_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx) set.luid.high=0; set.luid.low=SE_PRIV_ADD_USERS; - result = add_privilege(priv_set, ctx, set); + result = gums_add_privilege(priv_set, ctx, set); NTSTATUS_CHECK("add_all_privilege", "add_privilege", result, done); set.luid.low=SE_PRIV_ADD_MACHINES; - result = add_privilege(priv_set, ctx, set); + result = gums_add_privilege(priv_set, ctx, set); NTSTATUS_CHECK("add_all_privilege", "add_privilege", result, done); set.luid.low=SE_PRIV_PRINT_OPERATOR; - result = add_privilege(priv_set, ctx, set); + result = gums_add_privilege(priv_set, ctx, set); NTSTATUS_CHECK("add_all_privilege", "add_privilege", result, done); done: @@ -162,7 +162,7 @@ done: /**************************************************************************** check if the privilege list is empty ****************************************************************************/ -BOOL check_empty_privilege(PRIVILEGE_SET *priv_set) +BOOL gums_check_empty_privilege(PRIVILEGE_SET *priv_set) { return (priv_set->count == 0); } @@ -170,12 +170,12 @@ BOOL check_empty_privilege(PRIVILEGE_SET *priv_set) /**************************************************************************** check if the privilege is in the privilege list ****************************************************************************/ -BOOL check_priv_in_privilege(PRIVILEGE_SET *priv_set, LUID_ATTR set) +BOOL gums_check_priv_in_privilege(PRIVILEGE_SET *priv_set, LUID_ATTR set) { int i; /* if the list is empty, obviously we can't have it */ - if (check_empty_privilege(priv_set)) + if (gums_check_empty_privilege(priv_set)) return False; for (i=0; icount; i++) { @@ -193,19 +193,19 @@ BOOL check_priv_in_privilege(PRIVILEGE_SET *priv_set, LUID_ATTR set) /**************************************************************************** remove a privilege from a privilege array ****************************************************************************/ -NTSTATUS remove_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx, LUID_ATTR set) +NTSTATUS gums_remove_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx, LUID_ATTR set) { LUID_ATTR *new_set; LUID_ATTR *old_set; int i,j; /* check if the privilege is in the list */ - if (!check_priv_in_privilege(priv_set, set)) + if (!gums_check_priv_in_privilege(priv_set, set)) return NT_STATUS_UNSUCCESSFUL; /* special case if it's the only privilege in the list */ if (priv_set->count==1) { - init_privilege(priv_set); + gums_init_privilege(priv_set); return NT_STATUS_OK; } @@ -252,14 +252,14 @@ NTSTATUS remove_privilege(PRIVILEGE_SET *priv_set, TALLOC_CTX *ctx, LUID_ATTR se /**************************************************************************** duplicates a privilege array ****************************************************************************/ -NTSTATUS dup_priv_set(PRIVILEGE_SET **new_priv_set, TALLOC_CTX *mem_ctx, PRIVILEGE_SET *priv_set) +NTSTATUS gums_dup_priv_set(PRIVILEGE_SET **new_priv_set, TALLOC_CTX *mem_ctx, PRIVILEGE_SET *priv_set) { LUID_ATTR *new_set; LUID_ATTR *old_set; int i; *new_priv_set = (PRIVILEGE_SET *)talloc(mem_ctx, sizeof(PRIVILEGE_SET)); - init_privilege(*new_priv_set); + gums_init_privilege(*new_priv_set); /* special case if there are no privileges in the list */ if (priv_set->count == 0) { @@ -301,6 +301,8 @@ NTSTATUS dup_priv_set(PRIVILEGE_SET **new_priv_set, TALLOC_CTX *mem_ctx, PRIVILE #define ALIAS_DEFAULT_SACL_SEC_ACE_FLAG (SEC_ACE_FLAG_FAILED_ACCESS | SEC_ACE_FLAG_SUCCESSFUL_ACCESS) /* 0xc0 */ + +#if 0 NTSTATUS create_builtin_alias_default_sec_desc(SEC_DESC **sec_desc, TALLOC_CTX *ctx) { DOM_SID *world = &global_sid_World; @@ -378,14 +380,14 @@ NTSTATUS gums_init_builtin_groups(void) return NT_STATUS_NO_MEMORY; } - /* Administrators */ + /* Administrators * / /* alloc group structure */ - g_obj.data = (void *)talloc(g_obj.mem_ctx, sizeof(GUMS_OBJ_GROUP)); - ALLOC_CHECK("gums_init_backend", g_obj.data, result, done); + g_obj.data.group = (GUMS_GROUP *)talloc(g_obj.mem_ctx, sizeof(GUMS_GROUP)); + ALLOC_CHECK("gums_init_backend", g_obj.data.group, result, done); /* make admins sid */ - g_grp = (GUMS_GROUP *)g_obj.data; + g_grp = (GUMS_GROUP *)g_obj.data.group; sid_copy(g_obj.sid, &global_sid_Builtin_Administrators); /* make security descriptor */ @@ -604,4 +606,5 @@ done: talloc_destroy(g_priv.mem_ctx); return result; } +#endif diff --git a/source3/script/genstruct.pl b/source3/script/genstruct.pl index 081b81f510..a6abd718c9 100755 --- a/source3/script/genstruct.pl +++ b/source3/script/genstruct.pl @@ -131,12 +131,13 @@ sub parse_elements($$) print ", $name"; } - print OFILE "int gen_dump_struct_$name(struct parse_string *, const char *, unsigned);\n"; - print OFILE "int gen_parse_struct_$name(char *, const char *);\n"; + print OFILE "int gen_dump_struct_$name(TALLOC_CTX *mem_ctx, struct parse_string *, const char *, unsigned);\n"; + print OFILE "int gen_parse_struct_$name(TALLOC_CTX *mem_ctx, char *, const char *);\n"; print OFILE "static const struct parse_struct pinfo_" . $name . "[] = {\n"; - while ($elements =~ /^.*?([a-z].*?);\s*?(\S*?)\s*?\$(.*)/msi) { + + while ($elements =~ /^.*?([a-z].*?);\s*?(\S*?)\s*?$(.*)/msi) { my($element) = $1; my($flags) = $2; $elements = $3; @@ -146,11 +147,11 @@ sub parse_elements($$) print OFILE "{NULL, 0, 0, 0, 0, NULL, 0, NULL, NULL}};\n"; print OFILE " -int gen_dump_struct_$name(struct parse_string *p, const char *ptr, unsigned indent) { - return gen_dump_struct(pinfo_$name, p, ptr, indent); +int gen_dump_struct_$name(TALLOC_CTX *mem_ctx, struct parse_string *p, const char *ptr, unsigned indent) { + return gen_dump_struct(mem_ctx, pinfo_$name, p, ptr, indent); } -int gen_parse_struct_$name(char *ptr, const char *str) { - return gen_parse_struct(pinfo_$name, ptr, str); +int gen_parse_struct_$name(TALLOC_CTX *mem_ctx, char *ptr, const char *str) { + return gen_parse_struct(mem_ctx, pinfo_$name, ptr, str); } "; -- cgit From 6a141b7963de61b1223031ea4012605aeca13bc7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 7 Mar 2003 19:37:27 +0000 Subject: Patch from Michael Steffens. In his own words : ------------------------------------------------------------------------- I think there are basically two problem: 1. Windows clients do not always send ACEs for SMB_ACL_USER_OBJ, SMB_ACL_GROUP_OBJ, and SMB_ACL_OTHER. The function ensure_canon_entry_valid() is prepared for that, but tries to "guess" values from group or other permissions, respectively, otherwise falling back to minimum r-- for the owner. Even if the owner had full permissions before setting ACL. This is the problem with W2k clients. 2. Function set_nt_acl() always chowns *before* attempting to set POSIX ACLs. This is ok in a take-ownership situation, but must fail if the file is to be given away. This is the problem with XP clients, trying to transfer ownership of the original file to the temp file. The problem with NT4 clients (no ACEs are transferred to the temp file, thus are lost after moving the temp file to the original name) is a client problem. It simply doesn't attempt to. I have played around with that using posic_acls.c from 3.0 merged into 2.2. As a result I can now present two patches, one for each branch. They basically modify: 1. Interpret missing SMB_ACL_USER_OBJ, SMB_ACL_GROUP_OBJ, or SMB_ACL_OTHER as "preserve current value" instead of attempting to build one ourself. The original code is still in, but only as fallback in case current values can't be retrieved. 2. Rearrange set_nt_acl() such that chown is only done before setting ACLs if there is either no change of owning user, or change of owning user is towards the current user. Otherwise chown is done after setting ACLs. It now seems to produce reasonable results. (Well, as far as it can. If NT4 doesn't even try to transfer ACEs, only deliberate use of named default ACEs and/or "force group" or the crystal ball can help :) ------------------------------------------------------------------------- Jeremy. (This used to be commit 8ec20cbae7ca7e685b1a4186d8482c7405915dc3) --- source3/smbd/posix_acls.c | 277 +++++++++++++++++++++++++++++++++------------- 1 file changed, 199 insertions(+), 78 deletions(-) diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index 93a57925f1..2aea3a2c90 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -559,12 +559,18 @@ static BOOL uid_entry_in_group( canon_ace *uid_ace, canon_ace *group_ace ) extern DOM_SID global_sid_World; fstring u_name; fstring g_name; + extern struct current_user current_user; /* "Everyone" always matches every uid. */ if (sid_equal(&group_ace->trustee, &global_sid_World)) return True; + /* Assume that the current user is in the current group (force group) */ + + if (uid_ace->unix_ug.uid == current_user.uid && group_ace->unix_ug.gid == current_user.gid) + return True; + fstrcpy(u_name, uidtoname(uid_ace->unix_ug.uid)); fstrcpy(g_name, gidtoname(group_ace->unix_ug.gid)); @@ -600,6 +606,14 @@ static BOOL ensure_canon_entry_valid(canon_ace **pp_ace, BOOL got_other = False; canon_ace *pace_other = NULL; canon_ace *pace_group = NULL; + connection_struct *conn = fsp->conn; + SMB_ACL_T current_posix_acl = NULL; + mode_t current_user_perms = 0; + mode_t current_grp_perms = 0; + mode_t current_other_perms = 0; + BOOL got_current_user = False; + BOOL got_current_grp = False; + BOOL got_current_other = False; for (pace = *pp_ace; pace; pace = pace->next) { if (pace->type == SMB_ACL_USER_OBJ) { @@ -632,6 +646,62 @@ static BOOL ensure_canon_entry_valid(canon_ace **pp_ace, } } + /* + * When setting ACLs and missing one out of SMB_ACL_USER_OBJ, + * SMB_ACL_GROUP_OBJ, SMB_ACL_OTHER, try to retrieve current + * values. For user and other a simple vfs_stat would do, but + * we would get mask instead of group. Let's do it via ACL. + */ + + if (setting_acl && (!got_user || !got_grp || !got_other)) { + + SMB_ACL_ENTRY_T entry; + int entry_id = SMB_ACL_FIRST_ENTRY; + + if(fsp->is_directory || fsp->fd == -1) { + current_posix_acl = conn->vfs_ops.sys_acl_get_file(conn, fsp->fsp_name, SMB_ACL_TYPE_ACCESS); + } else { + current_posix_acl = conn->vfs_ops.sys_acl_get_fd(fsp, fsp->fd); + } + + if (current_posix_acl) { + while (conn->vfs_ops.sys_acl_get_entry(conn, current_posix_acl, entry_id, &entry) == 1) { + SMB_ACL_TAG_T tagtype; + SMB_ACL_PERMSET_T permset; + + /* get_next... */ + if (entry_id == SMB_ACL_FIRST_ENTRY) + entry_id = SMB_ACL_NEXT_ENTRY; + + /* Is this a MASK entry ? */ + if (conn->vfs_ops.sys_acl_get_tag_type(conn, entry, &tagtype) == -1) + continue; + + if (conn->vfs_ops.sys_acl_get_permset(conn, entry, &permset) == -1) + continue; + + switch(tagtype) { + case SMB_ACL_USER_OBJ: + current_user_perms = convert_permset_to_mode_t(conn, permset); + got_current_user = True; + break; + case SMB_ACL_GROUP_OBJ: + current_grp_perms = convert_permset_to_mode_t(conn, permset); + got_current_grp = True; + break; + case SMB_ACL_OTHER: + current_other_perms = convert_permset_to_mode_t(conn, permset); + got_current_other = True; + break; + } + } + conn->vfs_ops.sys_acl_free_acl(conn, current_posix_acl); + } else { + DEBUG(10,("ensure_canon_entry_valid: failed to retrieve current ACL of %s\n", + fsp->fsp_name)); + } + } + if (!got_user) { if ((pace = (canon_ace *)malloc(sizeof(canon_ace))) == NULL) { DEBUG(0,("ensure_canon_entry_valid: malloc fail.\n")); @@ -646,13 +716,19 @@ static BOOL ensure_canon_entry_valid(canon_ace **pp_ace, pace->attr = ALLOW_ACE; if (setting_acl) { - /* If we only got an "everyone" perm, just use that. */ - if (!got_grp && got_other) - pace->perms = pace_other->perms; - else if (got_grp && uid_entry_in_group(pace, pace_group)) - pace->perms = pace_group->perms; - else - pace->perms = 0; + if (got_current_user) { + pace->perms = current_user_perms; + } else { + /* If we only got an "everyone" perm, just use that. */ + if (!got_grp && got_other) + pace->perms = pace_other->perms; + else if (got_grp && uid_entry_in_group(pace, pace_group)) + pace->perms = pace_group->perms; + else + pace->perms = 0; + + } + apply_default_perms(fsp, pace, S_IRUSR); } else { pace->perms = unix_perms_to_acl_perms(pst->st_mode, S_IRUSR, S_IWUSR, S_IXUSR); @@ -674,11 +750,15 @@ static BOOL ensure_canon_entry_valid(canon_ace **pp_ace, pace->trustee = *pfile_grp_sid; pace->attr = ALLOW_ACE; if (setting_acl) { - /* If we only got an "everyone" perm, just use that. */ - if (got_other) - pace->perms = pace_other->perms; - else - pace->perms = unix_perms_to_acl_perms(pst->st_mode, S_IRGRP, S_IWGRP, S_IXGRP); + if (got_current_grp) { + pace->perms = current_grp_perms; + } else { + /* If we only got an "everyone" perm, just use that. */ + if (got_other) + pace->perms = pace_other->perms; + else + pace->perms = unix_perms_to_acl_perms(pst->st_mode, S_IRGRP, S_IWGRP, S_IXGRP); + } apply_default_perms(fsp, pace, S_IRGRP); } else { pace->perms = unix_perms_to_acl_perms(pst->st_mode, S_IRGRP, S_IWGRP, S_IXGRP); @@ -700,7 +780,10 @@ static BOOL ensure_canon_entry_valid(canon_ace **pp_ace, pace->trustee = global_sid_World; pace->attr = ALLOW_ACE; if (setting_acl) { - pace->perms = 0; + if (got_current_other) + pace->perms = current_other_perms; + else + pace->perms = 0; apply_default_perms(fsp, pace, S_IROTH); } else pace->perms = unix_perms_to_acl_perms(pst->st_mode, S_IROTH, S_IWOTH, S_IXOTH); @@ -1734,6 +1817,11 @@ static BOOL set_canon_ace_list(files_struct *fsp, canon_ace *the_ace, BOOL defau BOOL needs_mask = False; mode_t mask_perms = 0; +#if defined(POSIX_ACL_NEEDS_MASK) + /* HP-UX always wants to have a mask (called "class" there). */ + needs_mask = True; +#endif + if (the_acl == NULL) { if (errno != ENOSYS) { @@ -1748,6 +1836,13 @@ static BOOL set_canon_ace_list(files_struct *fsp, canon_ace *the_ace, BOOL defau return False; } + if( DEBUGLVL( 10 )) { + dbgtext("set_canon_ace_list: setting ACL:\n"); + for (i = 0, p_ace = the_ace; p_ace; p_ace = p_ace->next, i++ ) { + print_canon_ace( p_ace, i); + } + } + for (i = 0, p_ace = the_ace; p_ace; p_ace = p_ace->next, i++ ) { SMB_ACL_ENTRY_T the_entry; SMB_ACL_PERMSET_T the_permset; @@ -2460,6 +2555,8 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) mode_t orig_mode = (mode_t)0; uid_t orig_uid; gid_t orig_gid; + BOOL need_chown = False; + extern struct current_user current_user; DEBUG(10,("set_nt_acl: called for file %s\n", fsp->fsp_name )); @@ -2496,7 +2593,15 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) * Do we need to chown ? */ - if((user != (uid_t)-1 || grp != (uid_t)-1) && (orig_uid != user || orig_gid != grp)) { + need_chown = (user != (uid_t)-1 && orig_uid != user || grp != (uid_t)-1 && orig_gid != grp); + + /* + * Chown before setting ACL only if we don't change the user, or + * if we change to the current user, but not if we want to give away + * the file. + */ + + if (need_chown && (user == (uid_t)-1 || user == current_user.uid)) { DEBUG(3,("set_nt_acl: chown %s. uid = %u, gid = %u.\n", fsp->fsp_name, (unsigned int)user, (unsigned int)grp )); @@ -2533,6 +2638,9 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) orig_mode = sbuf.st_mode; orig_uid = sbuf.st_uid; orig_gid = sbuf.st_gid; + + /* We did it, don't try again */ + need_chown = False; } create_file_sids(&sbuf, &file_owner_sid, &file_grp_sid); @@ -2540,97 +2648,110 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) acl_perms = unpack_canon_ace( fsp, &sbuf, &file_owner_sid, &file_grp_sid, &file_ace_list, &dir_ace_list, security_info_sent, psd); - if ((file_ace_list == NULL) && (dir_ace_list == NULL)) { - /* W2K traverse DACL set - ignore. */ - return True; - } - - if (!acl_perms) { - DEBUG(3,("set_nt_acl: cannot set permissions\n")); - free_canon_ace_list(file_ace_list); - free_canon_ace_list(dir_ace_list); - return False; - } + /* Ignore W2K traverse DACL set. */ + if (file_ace_list || dir_ace_list) { - /* - * Only change security if we got a DACL. - */ - - if((security_info_sent & DACL_SECURITY_INFORMATION) && (psd->dacl != NULL)) { - - BOOL acl_set_support = False; - BOOL ret = False; + if (!acl_perms) { + DEBUG(3,("set_nt_acl: cannot set permissions\n")); + free_canon_ace_list(file_ace_list); + free_canon_ace_list(dir_ace_list); + return False; + } /* - * Try using the POSIX ACL set first. Fall back to chmod if - * we have no ACL support on this filesystem. + * Only change security if we got a DACL. */ - if (acl_perms && file_ace_list) { - ret = set_canon_ace_list(fsp, file_ace_list, False, &acl_set_support); - if (acl_set_support && ret == False) { - DEBUG(3,("set_nt_acl: failed to set file acl on file %s (%s).\n", fsp->fsp_name, strerror(errno) )); - free_canon_ace_list(file_ace_list); - free_canon_ace_list(dir_ace_list); - return False; - } - } + if((security_info_sent & DACL_SECURITY_INFORMATION) && (psd->dacl != NULL)) { - if (acl_perms && acl_set_support && fsp->is_directory) { - if (dir_ace_list) { - if (!set_canon_ace_list(fsp, dir_ace_list, True, &acl_set_support)) { - DEBUG(3,("set_nt_acl: failed to set default acl on directory %s (%s).\n", fsp->fsp_name, strerror(errno) )); - free_canon_ace_list(file_ace_list); - free_canon_ace_list(dir_ace_list); - return False; - } - } else { + BOOL acl_set_support = False; + BOOL ret = False; - /* - * No default ACL - delete one if it exists. - */ + /* + * Try using the POSIX ACL set first. Fall back to chmod if + * we have no ACL support on this filesystem. + */ - if (conn->vfs_ops.sys_acl_delete_def_file(conn, fsp->fsp_name) == -1) { - DEBUG(3,("set_nt_acl: sys_acl_delete_def_file failed (%s)\n", strerror(errno))); + if (acl_perms && file_ace_list) { + ret = set_canon_ace_list(fsp, file_ace_list, False, &acl_set_support); + if (acl_set_support && ret == False) { + DEBUG(3,("set_nt_acl: failed to set file acl on file %s (%s).\n", fsp->fsp_name, strerror(errno) )); free_canon_ace_list(file_ace_list); + free_canon_ace_list(dir_ace_list); return False; } } - } - /* - * If we cannot set using POSIX ACLs we fall back to checking if we need to chmod. - */ + if (acl_perms && acl_set_support && fsp->is_directory) { + if (dir_ace_list) { + if (!set_canon_ace_list(fsp, dir_ace_list, True, &acl_set_support)) { + DEBUG(3,("set_nt_acl: failed to set default acl on directory %s (%s).\n", fsp->fsp_name, strerror(errno) )); + free_canon_ace_list(file_ace_list); + free_canon_ace_list(dir_ace_list); + return False; + } + } else { - if(!acl_set_support && acl_perms) { - mode_t posix_perms; + /* + * No default ACL - delete one if it exists. + */ - if (!convert_canon_ace_to_posix_perms( fsp, file_ace_list, &posix_perms)) { - free_canon_ace_list(file_ace_list); - free_canon_ace_list(dir_ace_list); - DEBUG(3,("set_nt_acl: failed to convert file acl to posix permissions for file %s.\n", - fsp->fsp_name )); - return False; + if (conn->vfs_ops.sys_acl_delete_def_file(conn, fsp->fsp_name) == -1) { + DEBUG(3,("set_nt_acl: sys_acl_delete_def_file failed (%s)\n", strerror(errno))); + free_canon_ace_list(file_ace_list); + free_canon_ace_list(dir_ace_list); + return False; + } + } } - if (orig_mode != posix_perms) { + /* + * If we cannot set using POSIX ACLs we fall back to checking if we need to chmod. + */ - DEBUG(3,("set_nt_acl: chmod %s. perms = 0%o.\n", - fsp->fsp_name, (unsigned int)posix_perms )); + if(!acl_set_support && acl_perms) { + mode_t posix_perms; - if(conn->vfs_ops.chmod(conn,fsp->fsp_name, posix_perms) == -1) { - DEBUG(3,("set_nt_acl: chmod %s, 0%o failed. Error = %s.\n", - fsp->fsp_name, (unsigned int)posix_perms, strerror(errno) )); + if (!convert_canon_ace_to_posix_perms( fsp, file_ace_list, &posix_perms)) { free_canon_ace_list(file_ace_list); free_canon_ace_list(dir_ace_list); + DEBUG(3,("set_nt_acl: failed to convert file acl to posix permissions for file %s.\n", + fsp->fsp_name )); return False; } + + if (orig_mode != posix_perms) { + + DEBUG(3,("set_nt_acl: chmod %s. perms = 0%o.\n", + fsp->fsp_name, (unsigned int)posix_perms )); + + if(conn->vfs_ops.chmod(conn,fsp->fsp_name, posix_perms) == -1) { + DEBUG(3,("set_nt_acl: chmod %s, 0%o failed. Error = %s.\n", + fsp->fsp_name, (unsigned int)posix_perms, strerror(errno) )); + free_canon_ace_list(file_ace_list); + free_canon_ace_list(dir_ace_list); + return False; + } + } } } + + free_canon_ace_list(file_ace_list); + free_canon_ace_list(dir_ace_list); } - free_canon_ace_list(file_ace_list); - free_canon_ace_list(dir_ace_list); + /* Any chown pending? */ + if (need_chown) { + + DEBUG(3,("set_nt_acl: chown %s. uid = %u, gid = %u.\n", + fsp->fsp_name, (unsigned int)user, (unsigned int)grp )); + + if(try_chown( fsp->conn, fsp->fsp_name, user, grp) == -1) { + DEBUG(3,("set_nt_acl: chown %s, %u, %u failed. Error = %s.\n", + fsp->fsp_name, (unsigned int)user, (unsigned int)grp, strerror(errno) )); + return False; + } + } return True; } -- cgit From 24c95539d593ccb703a4c381060a0bcad5052458 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 7 Mar 2003 19:46:51 +0000 Subject: Missed parentheses around complex logic. Jeremy. (This used to be commit e81427c2d69be166afad94bc083e750e8f48fba7) --- source3/smbd/posix_acls.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index 2aea3a2c90..01e3c31ba7 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -2593,7 +2593,8 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) * Do we need to chown ? */ - need_chown = (user != (uid_t)-1 && orig_uid != user || grp != (uid_t)-1 && orig_gid != grp); + if (((user != (uid_t)-1) && (orig_uid != user)) || (( grp != (uid_t)-1) && (orig_gid != grp))) + need_chown = True; /* * Chown before setting ACL only if we don't change the user, or -- cgit From f944fd6975a598a154a943867c94f3dabc7a1139 Mon Sep 17 00:00:00 2001 From: Steve French Date: Fri, 7 Mar 2003 22:29:14 +0000 Subject: Add early prototype of cifs mount helper for Linux (This used to be commit b20bcf8d336b4b2079eb42342a96d1fe714709de) --- source3/client/mount.cifs.c | 389 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 389 insertions(+) create mode 100755 source3/client/mount.cifs.c diff --git a/source3/client/mount.cifs.c b/source3/client/mount.cifs.c new file mode 100755 index 0000000000..5b19752f8b --- /dev/null +++ b/source3/client/mount.cifs.c @@ -0,0 +1,389 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MOUNT_CIFS_VERSION "1" + +extern char *getusername(void); + +char * thisprogram; +int verboseflag = 0; +static int got_password = 0; +static int got_user = 0; +static char * user_name = NULL; +char * mountpassword = NULL; + + +void mount_cifs_usage() +{ + printf("\nUsage: %s remotetarget dir\n", thisprogram); + printf("\nMount the remotetarget, specified as either a UNC name or "); + printf(" CIFS URL, to the local directory, dir.\n"); + + return; +} + +/* caller frees username if necessary */ +char * getusername() { + char *username = NULL; + struct passwd *password = getpwuid(getuid()); + + if (password) { + username = password->pw_name; + } + return username; +} + +char * parse_cifs_url(unc_name) +{ + printf("\ncifs url %s\n",unc_name); +} + +char * parse_options(char * options) +{ + /* BB add missing code BB */ +} + +/* Note that caller frees the returned buffer if necessary */ +char * parse_server(char * unc_name) +{ + int length = strnlen(unc_name,1024); + char * share; + char * ipaddress_string = NULL; + struct hostent * host_entry; + struct in_addr server_ipaddr; + int rc,j; + char temp[64]; + + + if(length > 1023) { + printf("mount error: UNC name too long"); + return 0; + } + if (strncasecmp("cifs://",unc_name,7) == 0) + return parse_cifs_url(unc_name+7); + if (strncasecmp("smb://",unc_name,6) == 0) { + return parse_cifs_url(unc_name+6); + } + + if(length < 3) { + /* BB add code to find DFS root here */ + printf("\nMounting the DFS root for domain not implemented yet"); + return 0; + } else { + /* BB add support for \\\\ not just // */ + if(strncmp(unc_name,"//",2) && strncmp(unc_name,"\\\\",2)) { + printf("mount error: improperly formatted UNC name."); + printf(" %s does not begin with \\\\ or //\n",unc_name); + return 0; + } else { + unc_name += 2; + if (share = strchr(unc_name, '/')) { + *share = 0; /* temporarily terminate the string */ + share += 1; + host_entry = gethostbyname(unc_name); + *(share - 1) = '\\'; /* put the slash back */ +/* rc = getipnodebyname(unc_name, AF_INET, AT_ADDRCONFIG ,&rc);*/ + if(host_entry == NULL) { + printf("mount error: could not find target server. TCP name %s not found ", unc_name); + printf(" rc = %d\n",rc); + return 0; + } + else { + printf("Target server %s %x found\n",host_entry->h_name,host_entry->h_addr); /* BB removeme */ + /* BB should we pass an alternate version of the share name as Unicode */ + /* BB what about ipv6? BB */ + /* BB add retries with alternate servers in list */ + + memcpy(&server_ipaddr.s_addr, host_entry->h_addr, 4); + + ipaddress_string = inet_ntoa(server_ipaddr); + if(ipaddress_string == NULL) { + printf("mount error: could not get valid ip address for target server\n"); + return 0; + } + return ipaddress_string; + } + } else { + /* BB add code to find DFS root (send null path on get DFS Referral to specified server here */ + printf("Mounting the DFS root for a particular server not implemented yet\n"); + return 0; + } + } + } +} + +static struct option longopts[] = { + { "all", 0, 0, 'a' }, + { "help", 0, 0, 'h' }, + { "read-only", 0, 0, 'r' }, + { "ro", 0, 0, 'r' }, + { "verbose", 0, 0, 'v' }, + { "version", 0, 0, 'V' }, + { "read-write", 0, 0, 'w' }, + { "rw", 0, 0, 'w' }, + { "options", 1, 0, 'o' }, + { "types", 1, 0, 't' }, + { "replace", 0, 0, 129 }, + { "after", 0, 0, 130 }, + { "before", 0, 0, 131 }, + { "over", 0, 0, 132 }, + { "move", 0, 0, 133 }, + { "rsize",1, 0, 136 }, + { "wsize",1, 0, 137 }, + { "uid", 1, 0, 138}, + { "gid", 1, 0, 139}, + { "uuid",1,0,'U' }, + { "user",1,0,140}, + { "username",1,0,140}, + { "dom",1,0,141}, + { "domain",1,0,141}, + { "password",1,0,142}, + { NULL, 0, 0, 0 } +}; + +int main(int argc, char ** argv) +{ + int c; + int flags = MS_MANDLOCK | MS_MGC_VAL; + char * orgoptions = NULL; + char * options; + char * share_name; + char * domain_name = NULL; + char * ipaddr; + char * mount_point; + char * uuid = NULL; + int rc,i; + int rsize = 0; + int wsize = 0; + int nomtab = 0; + int uid = 0; + int gid = 0; + int optlen = 0; + struct stat statbuf; + struct utsname sysinfo; + + /* setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); */ + + if(argc && argv) { + thisprogram = argv[0]; + } + if(thisprogram == NULL) + thisprogram = "mount.cifs"; + + uname(&sysinfo); +#ifdef _GNU_SOURCE + printf(" node: %s machine: %s\n", sysinfo.nodename,sysinfo.machine); +#endif + mount_cifs_usage(); + share_name = argv[1]; + mount_point = argv[2]; + /* add sharename in opts string as unc= parm */ + + while ((c = getopt_long (argc, argv, "afFhilL:no:O:rsU:vVwt:", + longopts, NULL)) != -1) { + switch (c) { +/* case 'a': + ++mount_all; + break; + case 'f': + ++fake; + break; + case 'F': + ++optfork; + break; */ + case 'h': /* help */ + mount_cifs_usage (); + break; +/* case 'i': + external_allowed = 0; + break; + case 'l': + list_with_volumelabel = 1; + break; + case 'L': + volumelabel = optarg; + break; */ + case 'n': + ++nomtab; + break; + case 'o': + if (orgoptions) { + orgoptions = strcat(orgoptions, ","); + orgoptions = strcat(orgoptions,optarg); + } else + orgoptions = strdup(optarg); + break; + +/* case 'O': + if (test_opts) + test_opts = xstrconcat3(test_opts, ",", optarg); + else + test_opts = xstrdup(optarg); + break;*/ + case 'r': /* mount readonly */ + flags |= MS_RDONLY;; + break; + case 'U': + uuid = optarg; + break; + case 'v': + ++verboseflag; + break; +/* case 'V': + printf ("mount: %s\n", version); + exit (0);*/ + case 'w': + flags &= ~MS_RDONLY;; + break; +/* case 0: + break; + + case 128: + mounttype = MS_BIND; + break; + case 129: + mounttype = MS_REPLACE; + break; + case 130: + mounttype = MS_AFTER; + break; + case 131: + mounttype = MS_BEFORE; + break; + case 132: + mounttype = MS_OVER; + break; + case 133: + mounttype = MS_MOVE; + break; + case 135: + mounttype = (MS_BIND | MS_REC); + break; */ + case 136: + rsize = atoi(optarg) ; + break; + case 137: + wsize = atoi(optarg); + break; + case 138: + uid = atoi(optarg); + break; + case 139: + gid = atoi(optarg); + break; + case 140: + got_user = 1; + user_name = optarg; + break; + case 141: + domain_name = optarg; + break; + case 142: + got_password = 1; + mountpassword = optarg; + break; + case '?': + default: + mount_cifs_usage (); + } + } + + for(i = 0;i < argc;i++) /* BB remove */ + printf("\narg %d is %s",i,argv[i]); /* BB remove */ + printf("\n"); /* BB removeme */ + + /* canonicalize the path in argv[1]? */ + + if(stat (mount_point, &statbuf)) { + printf("mount error: mount point %s does not exist\n",mount_point); + return -1; + } + if (S_ISDIR(statbuf.st_mode) == 0) { + printf("mount error: mount point %s is not a directory\n",mount_point); + return -1; + } + + if(geteuid()) { + printf("mount error: permission denied, not superuser and cifs.mount not installed SUID\n"); + return -1; + } + + ipaddr = parse_server(share_name); +/* if(share_name == NULL) + return 1; */ + parse_options(orgoptions); + + if(got_user == 0) + user_name = getusername(); + +/* check username for user%password format */ + + if(got_password == 0) { + if (getenv("PASSWD")) { + mountpassword = malloc(33); + if(mountpassword) { + strncpy(mountpassword,getenv("PASSWD"),32); + got_password = 1; + } +/* } else if (getenv("PASSWD_FD") || getenv("PASSWD_FILE")) { + get_password_file(); + got_password = 1;*/ /* BB add missing function */ + } else { + mountpassword = getpass("Password: "); /* BB obsolete */ + got_password = 1; + } + } + + /* launch daemon (handles dfs name resolution and credential change) */ + if(orgoptions) + optlen = strlen(orgoptions); + else + optlen = 0; + options = malloc(optlen + 25 + strlen(share_name) + strlen(user_name) + + strlen(ipaddr) + 1); + strcpy(options,"unc="); + strcat(options,share_name); + strncat(options,",ip=",4); + strcat(options,ipaddr); + strncat(options,",user=",6); + strcat(options,user_name); + strncat(options,",pass=",6); + strcat(options,mountpassword); + strncat(options,",ver=",5); + strcat(options,MOUNT_CIFS_VERSION); + if(optlen) + strcat(options,orgoptions); + printf("\noptions %s \n",options); + if(mount(share_name, mount_point, "cifs", flags, options)) { + /* remember to kill daemon on error */ + switch (errno) { + case 0: + printf(" success\n"); /* BB removeme */ + return 0; + case ENODEV: + printf("mount error: cifs filesystem not supported by the system\n"); + break; + default: + printf("mount error %d = %s",errno,strerror(errno)); + } + printf("\nRefer to the mount.cifs(8) manual page (e.g.man mount.cifs)\n"); + return -1; + } else + printf(" mount succeeded\n"); /* BB removeme */ +} + -- cgit From eed8772da109ecc6e9f35fd27b719795b28a47fb Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 7 Mar 2003 23:34:55 +0000 Subject: Use ERROR_NT, not ERROR_DOS as Andrew Bartlett pointed out. Jeremy. (This used to be commit c0930e6d15eb68f06453d9b67142ccd7fb1370a0) --- source3/smbd/ipc.c | 2 +- source3/smbd/nttrans.c | 2 +- source3/smbd/trans2.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c index 67c5da01f3..da30ec7440 100644 --- a/source3/smbd/ipc.c +++ b/source3/smbd/ipc.c @@ -566,5 +566,5 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int SAFE_FREE(params); SAFE_FREE(setup); END_PROFILE(SMBtrans); - return ERROR_DOS(ERRDOS,ERRinvalidparam); + return ERROR_NT(NT_STATUS_INVALID_PARAMETER); } diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 375c6c44f6..e6884cbb1e 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1990,5 +1990,5 @@ due to being in oplock break state.\n", (unsigned int)function_code )); SAFE_FREE(data); SAFE_FREE(setup); END_PROFILE(SMBnttrans); - return ERROR_DOS(ERRDOS,ERRinvalidparam); + return ERROR_NT(NT_STATUS_INVALID_PARAMETER); } diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index d57a29ff77..bea09e9e37 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -3372,5 +3372,5 @@ int reply_trans2(connection_struct *conn, SAFE_FREE(params); SAFE_FREE(data); END_PROFILE(SMBtrans2); - return ERROR_DOS(ERRDOS,ERRinvalidparam); + return ERROR_NT(NT_STATUS_INVALID_PARAMETER); } -- cgit From 64e49aa3c5392fd0ba5fc33ea21eff87c548995e Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 7 Mar 2003 23:47:59 +0000 Subject: initial work for the new idmpa interface (This used to be commit 8338e74ac4e5f31150c96f459a67e52090dc6013) --- source3/include/idmap.h | 49 ++++++++++++++++ source3/sam/idmap.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 source3/include/idmap.h create mode 100644 source3/sam/idmap.c diff --git a/source3/include/idmap.h b/source3/include/idmap.h new file mode 100644 index 0000000000..0d358d3fbe --- /dev/null +++ b/source3/include/idmap.h @@ -0,0 +1,49 @@ +/* + Unix SMB/CIFS implementation. + + Idmap headers + + Copyright (C) Anthony Liguori 2003 + Copyright (C) Simo Sorce 2003 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#define ID_USERID 1 +#define ID_GROUPID 2 +#define ID_OTHER 3 + +typedef union id_t { + uid_t uid; + gid_t gid; +} id_t; + +/* Filled out by IDMAP backends */ +struct idmap_methods { + + /* Called when backend is first loaded */ + NTSTATUS (*init)(void); + + NTSTATUS (*get_sid_from_id)(DOM_SID *sid, id_t id, int id_type); + NTSTATUS (*get_id_from_sid)(id_t *id, int *id_type, DOM_SID *sid); + + /* Called when backend is unloaded */ + NTSTATUS (*close)(void); + + /* Called to dump backend status */ + void (*status)(void); +}; + diff --git a/source3/sam/idmap.c b/source3/sam/idmap.c new file mode 100644 index 0000000000..617cbc9d28 --- /dev/null +++ b/source3/sam/idmap.c @@ -0,0 +1,145 @@ +/* + Unix SMB/CIFS implementation. + Winbind ID Mapping + Copyright (C) Tim Potter 2000 + Copyright (C) Anthony Liguori 2003 + Copyright (C) Simo Sorce 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "idmap.h" + +static struct { + + const char *name; + /* Function to create a member of the idmap_methods list */ + NTSTATUS (*reg_meth)(struct idmap_methods **methods); + struct idmap_methods *methods; +} builtin_idmap_functions[] = { + { "tdb", idmap_reg_tdb, NULL }, + /* { "ldap", idmap_reg_ldap, NULL },*/ + { NULL, NULL, NULL } +}; + +/* singleton pattern: uberlazy evaluation */ +static struct idmap_methods *impl; + +static struct idmap_methods *get_impl(const char *name) +{ + int i = 0; + struct idmap_methods *ret = NULL; + + while (builtin_idmap_functions[i].name && strcmp(builtin_idmap_functions[i].name, name)) { + i++; + } + + if (builtin_idmap_functions[i].name) { + + if (!builtin_idmap_functions[i].methods) { + builtin_idmap_functions[i].reg_meth(&builtin_idmap_functions[i].methods); + } + + ret = builtin_idmap_functions[i].methods; + } + + return ret; +} + +/* Load idmap backend functions */ +BOOL set_impl(void) +{ + if (!impl) { + DEBUG(3, ("idmap_init: using '%s' as backend\n", lp_idmap_backend())); + + impl = get_impl(lp_idmap_backend()); + if (!impl) { + DEBUG(0, ("set_impl: could not load backend '%s'\n", lp_idmap_backend())); + return False; + } + } + return True; +} + +/* Initialize backend */ +NTSTATUS idmap_init(void) +{ + NTSTATUS ret; + + if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; + + ret = impl->init(); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(3, ("idmap_init: init failed!\n")); + } + + return ret; +} + +/* Get ID from SID */ +NTSTATUS idmap_get_id_from_sid(id_t *id, int *id_type, DOM_SID *sid) +{ + NTSTATUS ret; + + if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; + + ret = impl->get_id_from_sid(id, id_type, sid); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(3, ("idmap_get_id_from_sid: error fetching id!\n")); + } + + return ret; +} + +/* Get SID from ID */ +NTSTATUS idmap_get_sid_from_id(DOM_SID *sid, id_t id, int id_type) +{ + NTSTATUS ret; + + if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; + + ret = impl->get_sid_from_id(sid, id, id_type); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(3, ("idmap_get_sid_from_id: error fetching sid!\n")); + } + + return ret; +} + + +/* Close backend */ +NTSTATUS idmap_close(void) +{ + NTSTATUS ret; + + if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; + + ret = impl->close(); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(3, ("idmap_close: close failed!\n")); + } + + return ret; +} + +/* Dump backend status */ +void idmap_status(void) +{ + if (!set_impl()) return; + + impl->status(); +} + -- cgit From 4a1d2ddd48c1c06b1874ff473275d22a0038c2c8 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sat, 8 Mar 2003 00:49:18 +0000 Subject: some more code (not tested yet) (This used to be commit 0d6cec90c13731827abcbc61974efc993e794003) --- source3/include/debug.h | 1 + source3/include/idmap.h | 1 + source3/sam/idmap.c | 3 + source3/sam/idmap_tdb.c | 469 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 474 insertions(+) create mode 100644 source3/sam/idmap_tdb.c diff --git a/source3/include/debug.h b/source3/include/debug.h index d4f45539f4..70f9f7706d 100644 --- a/source3/include/debug.h +++ b/source3/include/debug.h @@ -88,6 +88,7 @@ extern int DEBUGLEVEL; #define DBGC_AUTH 10 #define DBGC_WINBIND 11 #define DBGC_VFS 12 +#define DBGC_IDMAP 13 /* So you can define DBGC_CLASS before including debug.h */ #ifndef DBGC_CLASS diff --git a/source3/include/idmap.h b/source3/include/idmap.h index 0d358d3fbe..5a1f4fafc3 100644 --- a/source3/include/idmap.h +++ b/source3/include/idmap.h @@ -22,6 +22,7 @@ Boston, MA 02111-1307, USA. */ +#define ID_EMPTY 0 #define ID_USERID 1 #define ID_GROUPID 2 #define ID_OTHER 3 diff --git a/source3/sam/idmap.c b/source3/sam/idmap.c index 617cbc9d28..96638b4723 100644 --- a/source3/sam/idmap.c +++ b/source3/sam/idmap.c @@ -23,6 +23,9 @@ #include "includes.h" #include "idmap.h" +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_IDMAP + static struct { const char *name; diff --git a/source3/sam/idmap_tdb.c b/source3/sam/idmap_tdb.c new file mode 100644 index 0000000000..3aaab3ac42 --- /dev/null +++ b/source3/sam/idmap_tdb.c @@ -0,0 +1,469 @@ +/* + Unix SMB/CIFS implementation. + + idmap TDB backend + + Copyright (C) Tim Potter 2000 + Copyright (C) Anthony Liguori 2003 + Copyright (C) Simo Sorce 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "idmap.h" + +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_IDMAP + +/* High water mark keys */ +#define HWM_GROUP "GROUP HWM" +#define HWM_USER "USER HWM" + +/* idmap version determines auto-conversion */ +#define IDMAP_VERSION 2 + +/* Globals */ +static TDB_CONTEXT *idmap_tdb; + +/* FIXME: let handle conversions when all things work ok. + I think it is better to handle the conversion at + upgrade time and leave the old db intact. + That would also make easier to go back to 2.2 if needed + ---SSS */ +#if 0 + +/* convert one record to the new format */ +static int tdb_convert_fn(TDB_CONTEXT * tdb, TDB_DATA key, TDB_DATA data, + void *ignored) +{ + struct winbindd_domain *domain; + char *p; + DOM_SID sid; + uint32 rid; + fstring keystr; + fstring dom_name; + TDB_DATA key2; + + p = strchr(key.dptr, '/'); + if (!p) + return 0; + + *p = 0; + fstrcpy(dom_name, key.dptr); + *p++ = '/'; + + domain = find_domain_from_name(dom_name); + if (!domain) { + /* We must delete the old record. */ + DEBUG(0, + ("winbindd: tdb_convert_fn : Unable to find domain %s\n", + dom_name)); + DEBUG(0, + ("winbindd: tdb_convert_fn : deleting record %s\n", + key.dptr)); + tdb_delete(idmap_tdb, key); + return 0; + } + + rid = atoi(p); + + sid_copy(&sid, &domain->sid); + sid_append_rid(&sid, rid); + + sid_to_string(keystr, &sid); + key2.dptr = keystr; + key2.dsize = strlen(keystr) + 1; + + if (tdb_store(idmap_tdb, key2, data, TDB_INSERT) != 0) { + /* not good! */ + DEBUG(0, + ("winbindd: tdb_convert_fn : Unable to update record %s\n", + key2.dptr)); + DEBUG(0, + ("winbindd: tdb_convert_fn : conversion failed - idmap corrupt ?\n")); + return -1; + } + + if (tdb_store(idmap_tdb, data, key2, TDB_REPLACE) != 0) { + /* not good! */ + DEBUG(0, + ("winbindd: tdb_convert_fn : Unable to update record %s\n", + data.dptr)); + DEBUG(0, + ("winbindd: tdb_convert_fn : conversion failed - idmap corrupt ?\n")); + return -1; + } + + tdb_delete(idmap_tdb, key); + + return 0; +} + +/***************************************************************************** + Convert the idmap database from an older version. +*****************************************************************************/ +static BOOL tdb_idmap_convert(const char *idmap_name) +{ + int32 vers = tdb_fetch_int32(idmap_tdb, "IDMAP_VERSION"); + BOOL bigendianheader = + (idmap_tdb->flags & TDB_BIGENDIAN) ? True : False; + + if (vers == IDMAP_VERSION) + return True; + + if (((vers == -1) && bigendianheader) + || (IREV(vers) == IDMAP_VERSION)) { + /* Arrggghh ! Bytereversed or old big-endian - make order independent ! */ + /* + * high and low records were created on a + * big endian machine and will need byte-reversing. + */ + + int32 wm; + + wm = tdb_fetch_int32(idmap_tdb, HWM_USER); + + if (wm != -1) { + wm = IREV(wm); + } else + wm = server_state.uid_low; + + if (tdb_store_int32(idmap_tdb, HWM_USER, wm) == -1) { + DEBUG(0, + ("tdb_idmap_convert: Unable to byteswap user hwm in idmap database\n")); + return False; + } + + wm = tdb_fetch_int32(idmap_tdb, HWM_GROUP); + if (wm != -1) { + wm = IREV(wm); + } else + wm = server_state.gid_low; + + if (tdb_store_int32(idmap_tdb, HWM_GROUP, wm) == -1) { + DEBUG(0, + ("tdb_idmap_convert: Unable to byteswap group hwm in idmap database\n")); + return False; + } + } + + /* the old format stored as DOMAIN/rid - now we store the SID direct */ + tdb_traverse(idmap_tdb, tdb_convert_fn, NULL); + + if (tdb_store_int32(idmap_tdb, "IDMAP_VERSION", IDMAP_VERSION) == + -1) { + DEBUG(0, + ("tdb_idmap_convert: Unable to byteswap group hwm in idmap database\n")); + return False; + } + + return True; +} +#endif + +/* Allocate either a user or group id from the pool */ +static NTSTATUS tdb_allocate_id(id_t *id, int id_type) +{ + int hwm; + + if (!id) return NT_STATUS_INVALID_PARAMETER; + + /* Get current high water mark */ + switch (id_type) { + case ID_USERID: + if ((hwm = tdb_fetch_int32(idmap_tdb, HWM_USER)) == -1) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + + if (hwm > server_state.uid_high) { + DEBUG(0, ("idmap Fatal Error: UID range full!!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + *id.uid = hwm++; + + /* Store new high water mark */ + tdb_store_int32(idmap_tdb, HWM_USER, hwm); + break; + case ID_GROUPID: + if ((hwm = tdb_fetch_int32(idmap_tdb, HWM_GROUP)) == -1) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + + if (hwm > server_state.gid_high) { + DEBUG(0, ("idmap Fatal Error: GID range full!!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + *id.gid = hwm++; + + /* Store new high water mark */ + tdb_store_int32(idmap_tdb, HWM_GROUP, hwm); + break; + default: + return NT_STATUS_INVALID_PARAMETER; + } + + return NT_STATUS_OK; +} + +/* Get a sid from an id */ +static NTSTATUS tdb_get_sid_from_id(DOM_SID *sid, id_t id, int id_type) +{ + TDB_DATA key, data; + fstring keystr; + NTSTATUS ret = NT_STATUS_UNSUCCESSFUL; + + if (!sid) return NT_STATUS_INVALID_PARAMETER; + + switch (id_type) { + case ID_USERID: + slprintf(keystr, sizeof(keystr), "UID %d", id.uid); + break; + case ID_GROUPID: + slprintf(keystr, sizeof(keystr), "GID %d", id.gid); + break; + default: + return NT_STATUS_UNSUCCESSFUL; + } + + key.dptr = keystr; + key.dsize = strlen(keystr) + 1; + + data = tdb_fetch(idmap_tdb, key); + + if (data.dptr) { + if (string_to_sid(sid, data.dptr)) { + ret = NT_STATUS_OK; + } + SAFE_FREE(data.dptr); + } + + return ret; +} + +/* Get an id from a sid */ +static NTSTATUS tdb_get_id_from_sid(id_t *id, int *id_type, DOM_SID *sid) +{ + TDB_DATA data, key; + fstring keystr; + NTSTATUS ret = NT_STATUS_UNSUCCESSFUL; + + if (!sid || !id || !id_type) return NT_STATUS_INVALID_PARAMETER; + + /* Check if sid is present in database */ + sid_to_string(keystr, sid); + + key.dptr = keystr; + key.dsize = strlen(keystr) + 1; + + data = tdb_fetch(idmap_tdb, key); + + if (data.dptr) { + fstring scanstr; + + if (*id_type == ID_EMPTY || *id_type == ID_USERID) { + /* Parse and return existing uid */ + fstrcpy(scanstr, "UID %d"); + + if (sscanf(data.dptr, scanstr, *id.uid) == 1) { + /* uid ok? */ + if (*id_type == ID_EMPTY) { + *id_type = ID_USERID; + } + ret = NT_STATUS_OK; + goto idok; + } + } + + if (*id_type == ID_EMPTY || *id_type == ID_GROUPID) { + /* Parse and return existing gid */ + fstrcpy(scanstr, "GID %d"); + + if (sscanf(data.dptr, scanstr, *id.gid) == 1) { + /* gid ok? */ + if (*id_type == ID_EMPTY) { + *id_type = ID_GROUPID; + } + ret = NT_STATUS_OK; + } + } +idok: + SAFE_FREE(data.dptr); + + } else if (*id_type == ID_USERID || *id_type == ID_GROUPID) { + + /* Allocate a new id for this sid */ + ret = tdb_allocate_id(id, id_type); + if (NT_STATUS_IS_OK(ret)) { + fstring keystr2; + + /* Store new id */ + slprintf(keystr2, sizeof(keystr2), "%s %d", + *id_type ? "GID" : "UID", *id); + + data.dptr = keystr2; + data.dsize = strlen(keystr2) + 1; + + if (tdb_store(idmap_tdb, key, data, TDB_INSERT) == -1) + return NT_STATUS_UNSUCCESSFUL; + if (tdb_store(idmap_tdb, data, key, TDB_INSERT) == -1) + return NT_STATUS_UNSUCCESSFUL; + + ret = NT_STATUS_OK; + } + } + + return ret; +} + +/***************************************************************************** + Initialise idmap database. +*****************************************************************************/ +static NTSTATUS tdb_idmap_init(void) +{ + /* Open tdb cache */ + if (!(idmap_tdb = tdb_open_log(lock_path("idmap.tdb"), 0, + TDB_DEFAULT, O_RDWR | O_CREAT, + 0600))) { + DEBUG(0, ("idmap_init: Unable to open idmap database\n")); + return NT_STATUS_UNSUCCESSFUL; + } + +#if 0 + /* possibly convert from an earlier version */ + if (!tdb_idmap_convert(lock_path("winbind_idmap.tdb"))) { + DEBUG(0, + ("idmap_init: Unable to open old idmap database\n")); + return False; + } +#endif + + /* Create high water marks for group and user id */ + if (tdb_fetch_int32(idmap_tdb, HWM_USER) == -1) { + if (tdb_store_int32(idmap_tdb, HWM_USER, server_state.uid_low) == -1) { + DEBUG(0, ("idmap_init: Unable to initialise user hwm in idmap database\n")); + return NT_STATUS_INTERNAL_DB_ERROR; + } + } + + if (tdb_fetch_int32(idmap_tdb, HWM_GROUP) == -1) { + if (tdb_store_int32(idmap_tdb, HWM_GROUP, server_state.gid_low) == -1) { + DEBUG(0, ("idmap_init: Unable to initialise group hwm in idmap database\n")); + return NT_STATUS_INTERNAL_DB_ERROR; + } + } + + return NT_STATUS_OK; +} + +/* Close the tdb */ +static NTSTATUS tdb_idmap_close(void) +{ + if (idmap_tdb) + if (tdb_close(idmap_tdb) == 0) + return NT_STATUS_OK; + else + retrun NT_STATUS_UNSUCCESSFUL; + return NT_STATUS_OK; +} + + +/* Dump status information to log file. Display different stuff based on + the debug level: + + Debug Level Information Displayed + ================================================================= + 0 Percentage of [ug]id range allocated + 0 High water marks (next allocated ids) +*/ + +#define DUMP_INFO 0 + +static void tdb_idmap_status(void) +{ + int user_hwm, group_hwm; + + DEBUG(0, ("winbindd idmap status:\n")); + + /* Get current high water marks */ + + if ((user_hwm = tdb_fetch_int32(idmap_tdb, HWM_USER)) == -1) { + DEBUG(DUMP_INFO, + ("\tCould not get userid high water mark!\n")); + } + + if ((group_hwm = tdb_fetch_int32(idmap_tdb, HWM_GROUP)) == -1) { + DEBUG(DUMP_INFO, + ("\tCould not get groupid high water mark!\n")); + } + + /* Display next ids to allocate */ + + if (user_hwm != -1) { + DEBUG(DUMP_INFO, + ("\tNext userid to allocate is %d\n", user_hwm)); + } + + if (group_hwm != -1) { + DEBUG(DUMP_INFO, + ("\tNext groupid to allocate is %d\n", group_hwm)); + } + + /* Display percentage of id range already allocated. */ + + if (user_hwm != -1) { + int num_users = user_hwm - server_state.uid_low; + int total_users = + server_state.uid_high - server_state.uid_low; + + DEBUG(DUMP_INFO, + ("\tUser id range is %d%% full (%d of %d)\n", + num_users * 100 / total_users, num_users, + total_users)); + } + + if (group_hwm != -1) { + int num_groups = group_hwm - server_state.gid_low; + int total_groups = + server_state.gid_high - server_state.gid_low; + + DEBUG(DUMP_INFO, + ("\tGroup id range is %d%% full (%d of %d)\n", + num_groups * 100 / total_groups, num_groups, + total_groups)); + } + + /* Display complete mapping of users and groups to rids */ +} + +struct idmap_methods tdb_idmap_methods = { + + tdb_idmap_init, + tdb_get_sid_from_id, + tdb_get_id_from_sid, + tdb_idmap_close, + tdb_idmap_status + +}; + +NTSTATUS idmap_reg_tdb(struct idmap_methods **meth) +{ + *meth = &tdb_idmap_methods; + + return NTSTATUS_OK; +} + -- cgit From 7b2409214febbf7deaec434df50e7b090905e7f1 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 8 Mar 2003 01:16:30 +0000 Subject: Fix typo in earlier fix, caught by Ranjit @ HP. Jeremy. (This used to be commit 13ab94fa73dbaf54da0169bbcf4d027d5c07d207) --- source3/smbd/nttrans.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index e6884cbb1e..6d9c649045 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1871,7 +1871,7 @@ due to being in oplock break state.\n", (unsigned int)function_code )); data_count = IVAL(inbuf, smb_nts_DataCount); data_displacement = IVAL(inbuf, smb_nts_DataDisplacement); - data_offset = IVAL(inbuf, smb_nts_DataDisplacement); + data_offset = IVAL(inbuf, smb_nts_DataOffset); num_data_sofar += data_count; if (num_params_sofar > total_parameter_count || num_data_sofar > total_data_count) { -- cgit From bbf8961b284a877b5cfa4101e0fd677664a867f1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 8 Mar 2003 05:18:08 +0000 Subject: Make it clear that this is a fstrcpy(). (This used to be commit c2a266b7b661d319e13982bfdbc3a86e8502b8a4) --- source3/libsmb/clientgen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 9598f4ac96..6ef7a7bd9c 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -200,8 +200,8 @@ void cli_setup_bcc(struct cli_state *cli, void *p) void cli_init_creds(struct cli_state *cli, const struct ntuser_creds *usr) { /* copy_nt_creds(&cli->usr, usr); */ - safe_strcpy(cli->domain , usr->domain , sizeof(usr->domain )-1); - safe_strcpy(cli->user_name, usr->user_name, sizeof(usr->user_name)-1); + fstrcpy(cli->domain , usr->domain); + fstrcpy(cli->user_name, usr->user_name); memcpy(&cli->pwd, &usr->pwd, sizeof(usr->pwd)); cli->ntlmssp_flags = usr->ntlmssp_flags; cli->ntlmssp_cli_flgs = usr != NULL ? usr->ntlmssp_flags : 0; -- cgit From 01289b14a7cbe0e1a1e135349037b0e7ba5fe70b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 8 Mar 2003 10:22:50 +0000 Subject: Make sure that the 'remote' machine name can only be set once. For some weird reason, during a Win2003 installation, when you select 'domain join' it sends one machine name in the name exchange, and litraly 'machinename' during the NTLMSSP login. Also fix up winbindd's logfile handling, so that it matches smbd and nmbd. (This helps me, by seperating the logs by pid). Andrew Bartlett (This used to be commit afe5a3832f79131fb74461577f1db0e5e8bf4b6d) --- source3/auth/auth_ntlmssp.c | 2 +- source3/client/smbmount.c | 2 +- source3/lib/substitute.c | 31 +++++++++++++++++++++++++++++-- source3/nmbd/nmbd.c | 2 +- source3/nsswitch/winbindd.c | 11 ++--------- source3/smbd/reply.c | 4 ++-- source3/smbd/server.c | 4 ++-- source3/wrepld/server.c | 2 +- 8 files changed, 39 insertions(+), 19 deletions(-) diff --git a/source3/auth/auth_ntlmssp.c b/source3/auth/auth_ntlmssp.c index d32d248296..a381219d74 100644 --- a/source3/auth/auth_ntlmssp.c +++ b/source3/auth/auth_ntlmssp.c @@ -50,7 +50,7 @@ static NTSTATUS auth_ntlmssp_check_password(struct ntlmssp_state *ntlmssp_state) /* the client has given us its machine name (which we otherwise would not get on port 445). we need to possibly reload smb.conf if smb.conf includes depend on the machine name */ - set_remote_machine_name(auth_ntlmssp_state->ntlmssp_state->workstation); + set_remote_machine_name(auth_ntlmssp_state->ntlmssp_state->workstation, True); /* setup the string used by %U */ /* sub_set_smb_name checks for weird internally */ diff --git a/source3/client/smbmount.c b/source3/client/smbmount.c index e2372d02b4..98302485e4 100644 --- a/source3/client/smbmount.c +++ b/source3/client/smbmount.c @@ -398,7 +398,7 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat } /* here we are no longer interactive */ - set_remote_machine_name("smbmount"); /* sneaky ... */ + set_remote_machine_name("smbmount", False); /* sneaky ... */ setup_logging("mount.smbfs", False); reopen_logs(); DEBUG(0, ("mount.smbfs: entering daemon mode for service %s, pid=%d\n", the_service, sys_getpid())); diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c index 2d1b2ab1fa..1e3f51e2d8 100644 --- a/source3/lib/substitute.c +++ b/source3/lib/substitute.c @@ -29,9 +29,20 @@ fstring remote_proto="UNKNOWN"; static fstring remote_machine; static fstring smb_user_name; +/** + * Set the 'local' machine name + * @param local_name the name we are being called + * @param if this is the 'final' name for us, not be be changed again + */ -void set_local_machine_name(const char* local_name) +void set_local_machine_name(const char* local_name, BOOL perm) { + static BOOL already_perm = False; + if (already_perm) + return; + + already_perm = perm; + fstring tmp_local_machine; fstrcpy(tmp_local_machine,local_name); @@ -40,8 +51,20 @@ void set_local_machine_name(const char* local_name) alpha_strcpy(local_machine,tmp_local_machine,SAFE_NETBIOS_CHARS,sizeof(local_machine)-1); } -void set_remote_machine_name(const char* remote_name) +/** + * Set the 'remote' machine name + * @param remote_name the name our client wants to be called by + * @param if this is the 'final' name for them, not be be changed again + */ + +void set_remote_machine_name(const char* remote_name, BOOL perm) { + static BOOL already_perm = False; + if (already_perm) + return; + + already_perm = perm; + fstring tmp_remote_machine; fstrcpy(tmp_remote_machine,remote_name); @@ -57,6 +80,10 @@ const char* get_remote_machine_name(void) const char* get_local_machine_name(void) { + if (!*local_machine) { + return global_myname(); + } + return local_machine; } diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index 2b7d8033a2..fc08645f1d 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -292,7 +292,7 @@ static BOOL reload_nmbd_services(BOOL test) { BOOL ret; - set_remote_machine_name("nmbd"); + set_remote_machine_name("nmbd", False); if ( lp_loaded() ) { pstring fname; diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index ad37768c09..921f7d2864 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -43,15 +43,9 @@ static BOOL reload_services_file(BOOL test) } } - snprintf(logfile, sizeof(logfile), "%s/log.winbindd", dyn_LOGFILEBASE); - lp_set_logfile(logfile); - reopen_logs(); ret = lp_load(dyn_CONFIGFILE,False,False,True); - snprintf(logfile, sizeof(logfile), "%s/log.winbindd", dyn_LOGFILEBASE); - lp_set_logfile(logfile); - reopen_logs(); load_interfaces(); @@ -823,13 +817,12 @@ static void usage(void) fault_setup((void (*)(void *))fault_quit ); - snprintf(logfile, sizeof(logfile), "%s/log.winbindd", dyn_LOGFILEBASE); - lp_set_logfile(logfile); - /* Initialise for running in non-root mode */ sec_init(); + set_remote_machine_name("winbindd", False); + /* Set environment variable so we don't recursively call ourselves. This may also be useful interactively. */ diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 71e880476c..fb730bc625 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -87,8 +87,8 @@ int reply_special(char *inbuf,char *outbuf) name2[15] = 0; } - set_local_machine_name(name1); - set_remote_machine_name(name2); + set_local_machine_name(name1, True); + set_remote_machine_name(name2, True); DEBUG(2,("netbios connect: local=%s remote=%s\n", get_local_machine_name(), get_remote_machine_name() )); diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 0bcfcb9c78..aff402df66 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -398,7 +398,7 @@ static BOOL open_sockets_smbd(BOOL is_daemon, BOOL interactive, const char *smb_ /* this is needed so that we get decent entries in smbstatus for port 445 connects */ - set_remote_machine_name(get_socket_addr(smbd_server_fd())); + set_remote_machine_name(get_socket_addr(smbd_server_fd()), False); /* Reset global variables in util.c so that client substitutions will be @@ -706,7 +706,7 @@ static BOOL init_structs(void ) load_case_tables(); - set_remote_machine_name("smbd"); + set_remote_machine_name("smbd", False); if (interactive) { Fork = False; diff --git a/source3/wrepld/server.c b/source3/wrepld/server.c index 349f2a21ab..31f260e94c 100644 --- a/source3/wrepld/server.c +++ b/source3/wrepld/server.c @@ -619,7 +619,7 @@ static void process(void) lp_set_logfile(logfile); } - set_remote_machine_name("wrepld"); + set_remote_machine_name("wrepld", False); setup_logging(argv[0],log_stdout); -- cgit From c08c475cf2b287b57779b4bf515cf351ad1f686d Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 8 Mar 2003 10:24:48 +0000 Subject: Testparm needs the extra arg to set_local_machine_name() too. (This used to be commit 30ba31e6355b5dfb902e42d2b5edc71630db2923) --- source3/utils/testparm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c index b68deaaa5d..60243b671b 100644 --- a/source3/utils/testparm.c +++ b/source3/utils/testparm.c @@ -227,7 +227,7 @@ int main(int argc, const char *argv[]) caddr = poptGetArg(pc); if (new_local_machine) { - set_local_machine_name(new_local_machine); + set_local_machine_name(new_local_machine, True); } dbf = x_stdout; -- cgit From 8742d1ff96919151d9745676a447750c11173a7e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Mar 2003 15:27:54 +0000 Subject: Add notes on increasing performance on AIX, based on an email from William Jojo (This used to be commit 7dc2b10215c2b015a36e78c3b9b8f13cecfdfeba) --- docs/docbook/projdoc/Portability.sgml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/docbook/projdoc/Portability.sgml b/docs/docbook/projdoc/Portability.sgml index afafacc5e4..dae267e8b5 100644 --- a/docs/docbook/projdoc/Portability.sgml +++ b/docs/docbook/projdoc/Portability.sgml @@ -175,4 +175,16 @@ Corrective Action: Delete the entry after the word loopback in the line starting 127.0.0.1 + + +AIX + +Sequential Read Ahead + + +Disabling Sequential Read Ahead using "vmtune -r 0" improves +samba performance significally. + + + -- cgit From ad2e7324f0feda2a391a21c06f7515ef2a152b7e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Mar 2003 17:29:00 +0000 Subject: Add Q&A for people having trouble trying to log in without a proper samba user database. (This used to be commit 957c11e40e0aedc24d2dce2aaae9888673d68e01) --- docs/docbook/faq/config.sgml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/docbook/faq/config.sgml b/docs/docbook/faq/config.sgml index a95ac84d2f..db27102cdf 100644 --- a/docs/docbook/faq/config.sgml +++ b/docs/docbook/faq/config.sgml @@ -8,4 +8,18 @@ When you have a user in 'admin users', samba will always do file operations for this user as 'root', even if 'force user' has been set. + + +I have just installed samba and I'm trying to log in from Windows, but samba refuses all logins! + + +Newer windows clients(NT4, 2000, XP) send encrypted passwords. Samba can't compare these +passwords to the unix password database, so it needs it's own user database. You can +add users to this database using "smbpasswd -a user-name". + + + +See also the "User database" chapter of the samba HOWTO Collection. + + -- cgit From bebdbcd248ccb3021d0b94f360fc3cf8ba9e90a6 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sat, 8 Mar 2003 17:29:40 +0000 Subject: more on idmap two layers structure with - local tdb cache - remote idmap repository compiles (This used to be commit 8fb4e210bc7564ed491d121c20d598ba0bfbddff) --- source3/include/idmap.h | 24 +++++---- source3/sam/idmap.c | 134 ++++++++++++++++++++++++++++++++++++------------ source3/sam/idmap_tdb.c | 127 ++++++++++++++++++++++++++++++++------------- 3 files changed, 207 insertions(+), 78 deletions(-) diff --git a/source3/include/idmap.h b/source3/include/idmap.h index 5a1f4fafc3..fd7646a324 100644 --- a/source3/include/idmap.h +++ b/source3/include/idmap.h @@ -22,24 +22,30 @@ Boston, MA 02111-1307, USA. */ -#define ID_EMPTY 0 -#define ID_USERID 1 -#define ID_GROUPID 2 -#define ID_OTHER 3 +#define ID_EMPTY 0x00 +#define ID_USERID 0x01 +#define ID_GROUPID 0x02 +#define ID_OTHER 0x04 -typedef union id_t { +#define ID_TYPEMASK 0x0f + +#define ID_NOMAP 0x10 +#define ID_CACHE 0x20 + +typedef union unid_t { uid_t uid; gid_t gid; -} id_t; +} unid_t; /* Filled out by IDMAP backends */ struct idmap_methods { /* Called when backend is first loaded */ - NTSTATUS (*init)(void); + NTSTATUS (*init)(const char *init_str); - NTSTATUS (*get_sid_from_id)(DOM_SID *sid, id_t id, int id_type); - NTSTATUS (*get_id_from_sid)(id_t *id, int *id_type, DOM_SID *sid); + NTSTATUS (*get_sid_from_id)(DOM_SID *sid, unid_t id, int id_type); + NTSTATUS (*get_id_from_sid)(unid_t *id, int *id_type, DOM_SID *sid); + NTSTATUS (*set_mapping)(DOM_SID *sid, unid_t id, int id_type); /* Called when backend is unloaded */ NTSTATUS (*close)(void); diff --git a/source3/sam/idmap.c b/source3/sam/idmap.c index 96638b4723..b18423a13b 100644 --- a/source3/sam/idmap.c +++ b/source3/sam/idmap.c @@ -21,7 +21,6 @@ */ #include "includes.h" -#include "idmap.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_IDMAP @@ -32,48 +31,58 @@ static struct { /* Function to create a member of the idmap_methods list */ NTSTATUS (*reg_meth)(struct idmap_methods **methods); struct idmap_methods *methods; -} builtin_idmap_functions[] = { + +} remote_idmap_functions[] = { + { "tdb", idmap_reg_tdb, NULL }, /* { "ldap", idmap_reg_ldap, NULL },*/ { NULL, NULL, NULL } + }; -/* singleton pattern: uberlazy evaluation */ -static struct idmap_methods *impl; +static struct idmap_methods *local_cache; +static struct idmap_methods *remote_repo; -static struct idmap_methods *get_impl(const char *name) +static struct idmap_methods *get_methods(const char *name) { int i = 0; struct idmap_methods *ret = NULL; - while (builtin_idmap_functions[i].name && strcmp(builtin_idmap_functions[i].name, name)) { + while (remote_idmap_functions[i].name && strcmp(remote_idmap_functions[i].name, name)) { i++; } - if (builtin_idmap_functions[i].name) { + if (remote_idmap_functions[i].name) { - if (!builtin_idmap_functions[i].methods) { - builtin_idmap_functions[i].reg_meth(&builtin_idmap_functions[i].methods); + if (!remote_idmap_functions[i].methods) { + remote_idmap_functions[i].reg_meth(&remote_idmap_functions[i].methods); } - ret = builtin_idmap_functions[i].methods; + ret = remote_idmap_functions[i].methods; } return ret; } /* Load idmap backend functions */ -BOOL set_impl(void) +BOOL load_methods(void) { - if (!impl) { - DEBUG(3, ("idmap_init: using '%s' as backend\n", lp_idmap_backend())); + if (!local_cache) { + idmap_reg_tdb(&local_cache); + } + + if (!remote_repo && lp_idmap_backend()) { + DEBUG(3, ("load_methods: using '%s' as remote backend\n", lp_idmap_backend())); - impl = get_impl(lp_idmap_backend()); - if (!impl) { - DEBUG(0, ("set_impl: could not load backend '%s'\n", lp_idmap_backend())); + remote_repo = get_methods(lp_idmap_backend()); + if (!remote_repo) { + DEBUG(0, ("load_methods: could not load remote backend '%s'\n", lp_idmap_backend())); return False; } } + + idmap_init(); + return True; } @@ -82,9 +91,7 @@ NTSTATUS idmap_init(void) { NTSTATUS ret; - if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; - - ret = impl->init(); + ret = remote_repo->init("idmap.tdb"); if (NT_STATUS_IS_ERR(ret)) { DEBUG(3, ("idmap_init: init failed!\n")); } @@ -92,47 +99,105 @@ NTSTATUS idmap_init(void) return ret; } +static NTSTATUS idmap_set_mapping(DOM_SID *sid, unid_t id, int id_type) +{ + NTSTATUS ret; + + if (!load_methods()) return NT_STATUS_UNSUCCESSFUL; + + ret = local_cache->set_mapping(sid, id, id_type); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG (0, ("idmap_set_mapping: Error, unable to modify local cache!\n")); + return ret; + } + + /* Being able to update the remote cache is seldomly right. + Generally this is a forbidden operation. */ + if (!(id_type & ID_CACHE) && (remote_repo != NULL)) { + remote_repo->set_mapping(sid, id, id_type); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG (0, ("idmap_set_mapping: Error, unable to modify remote cache!\n")); + } + } + + return ret; +} + /* Get ID from SID */ -NTSTATUS idmap_get_id_from_sid(id_t *id, int *id_type, DOM_SID *sid) +NTSTATUS idmap_get_id_from_sid(unid_t *id, int *id_type, DOM_SID *sid) { NTSTATUS ret; + int loc_type; - if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; + if (!load_methods()) return NT_STATUS_UNSUCCESSFUL; - ret = impl->get_id_from_sid(id, id_type, sid); + loc_type = *id_type; + if (remote_repo) { /* We have a central remote idmap */ + loc_type |= ID_NOMAP; + } + ret = local_cache->get_id_from_sid(id, &loc_type, sid); if (NT_STATUS_IS_ERR(ret)) { - DEBUG(3, ("idmap_get_id_from_sid: error fetching id!\n")); + if (remote_repo) { + ret = remote_repo->get_id_from_sid(id, id_type, sid); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(3, ("idmap_get_id_from_sid: error fetching id!\n")); + } else { + loc_type |= ID_CACHE; + idmap_set_mapping(sid, *id, loc_type); + } + } + } else { + *id_type = loc_type & ID_TYPEMASK; } return ret; } /* Get SID from ID */ -NTSTATUS idmap_get_sid_from_id(DOM_SID *sid, id_t id, int id_type) +NTSTATUS idmap_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type) { NTSTATUS ret; + int loc_type; - if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; + if (!load_methods()) return NT_STATUS_UNSUCCESSFUL; - ret = impl->get_sid_from_id(sid, id, id_type); + loc_type = id_type; + if (remote_repo) { + loc_type = id_type | ID_NOMAP; + } + ret = local_cache->get_sid_from_id(sid, id, loc_type); if (NT_STATUS_IS_ERR(ret)) { - DEBUG(3, ("idmap_get_sid_from_id: error fetching sid!\n")); + if (remote_repo) { + ret = remote_repo->get_sid_from_id(sid, id, id_type); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(3, ("idmap_get_sid_from_id: unable to fetch sid!\n")); + } else { + loc_type |= ID_CACHE; + idmap_set_mapping(sid, id, loc_type); + } + } } return ret; } - /* Close backend */ NTSTATUS idmap_close(void) { NTSTATUS ret; - if (!set_impl()) return NT_STATUS_UNSUCCESSFUL; + if (!load_methods()) return NT_STATUS_UNSUCCESSFUL; - ret = impl->close(); + ret = local_cache->close(); if (NT_STATUS_IS_ERR(ret)) { - DEBUG(3, ("idmap_close: close failed!\n")); + DEBUG(3, ("idmap_close: failed to close local cache!\n")); + } + + if (remote_repo) { + ret = remote_repo->close(); + if (NT_STATUS_IS_ERR(ret)) { + DEBUG(3, ("idmap_close: failed to close remote idmap repository!\n")); + } } return ret; @@ -141,8 +206,9 @@ NTSTATUS idmap_close(void) /* Dump backend status */ void idmap_status(void) { - if (!set_impl()) return; - - impl->status(); + if (load_methods()) { + local_cache->status(); + remote_repo->status(); + } } diff --git a/source3/sam/idmap_tdb.c b/source3/sam/idmap_tdb.c index 3aaab3ac42..4af46ac8d3 100644 --- a/source3/sam/idmap_tdb.c +++ b/source3/sam/idmap_tdb.c @@ -23,7 +23,6 @@ */ #include "includes.h" -#include "idmap.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_IDMAP @@ -38,6 +37,15 @@ /* Globals */ static TDB_CONTEXT *idmap_tdb; +struct idmap_state { + + /* User and group id pool */ + + uid_t uid_low, uid_high; /* Range of uids to allocate */ + gid_t gid_low, gid_high; /* Range of gids to allocate */ +} idmap_state; + + /* FIXME: let handle conversions when all things work ok. I think it is better to handle the conversion at upgrade time and leave the old db intact. @@ -175,25 +183,25 @@ static BOOL tdb_idmap_convert(const char *idmap_name) #endif /* Allocate either a user or group id from the pool */ -static NTSTATUS tdb_allocate_id(id_t *id, int id_type) +static NTSTATUS tdb_allocate_id(unid_t *id, int id_type) { int hwm; if (!id) return NT_STATUS_INVALID_PARAMETER; /* Get current high water mark */ - switch (id_type) { + switch (id_type & ID_TYPEMASK) { case ID_USERID: if ((hwm = tdb_fetch_int32(idmap_tdb, HWM_USER)) == -1) { return NT_STATUS_INTERNAL_DB_ERROR; } - if (hwm > server_state.uid_high) { + if (hwm > idmap_state.uid_high) { DEBUG(0, ("idmap Fatal Error: UID range full!!\n")); return NT_STATUS_UNSUCCESSFUL; } - *id.uid = hwm++; + (*id).uid = hwm++; /* Store new high water mark */ tdb_store_int32(idmap_tdb, HWM_USER, hwm); @@ -203,12 +211,12 @@ static NTSTATUS tdb_allocate_id(id_t *id, int id_type) return NT_STATUS_INTERNAL_DB_ERROR; } - if (hwm > server_state.gid_high) { + if (hwm > idmap_state.gid_high) { DEBUG(0, ("idmap Fatal Error: GID range full!!\n")); return NT_STATUS_UNSUCCESSFUL; } - *id.gid = hwm++; + (*id).gid = hwm++; /* Store new high water mark */ tdb_store_int32(idmap_tdb, HWM_GROUP, hwm); @@ -221,7 +229,7 @@ static NTSTATUS tdb_allocate_id(id_t *id, int id_type) } /* Get a sid from an id */ -static NTSTATUS tdb_get_sid_from_id(DOM_SID *sid, id_t id, int id_type) +static NTSTATUS tdb_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type) { TDB_DATA key, data; fstring keystr; @@ -229,7 +237,7 @@ static NTSTATUS tdb_get_sid_from_id(DOM_SID *sid, id_t id, int id_type) if (!sid) return NT_STATUS_INVALID_PARAMETER; - switch (id_type) { + switch (id_type & ID_TYPEMASK) { case ID_USERID: slprintf(keystr, sizeof(keystr), "UID %d", id.uid); break; @@ -256,7 +264,7 @@ static NTSTATUS tdb_get_sid_from_id(DOM_SID *sid, id_t id, int id_type) } /* Get an id from a sid */ -static NTSTATUS tdb_get_id_from_sid(id_t *id, int *id_type, DOM_SID *sid) +static NTSTATUS tdb_get_id_from_sid(unid_t *id, int *id_type, DOM_SID *sid) { TDB_DATA data, key; fstring keystr; @@ -273,15 +281,16 @@ static NTSTATUS tdb_get_id_from_sid(id_t *id, int *id_type, DOM_SID *sid) data = tdb_fetch(idmap_tdb, key); if (data.dptr) { + int type = *id_type & ID_TYPEMASK; fstring scanstr; - if (*id_type == ID_EMPTY || *id_type == ID_USERID) { + if (type == ID_EMPTY || type == ID_USERID) { /* Parse and return existing uid */ fstrcpy(scanstr, "UID %d"); - if (sscanf(data.dptr, scanstr, *id.uid) == 1) { + if (sscanf(data.dptr, scanstr, (*id).uid) == 1) { /* uid ok? */ - if (*id_type == ID_EMPTY) { + if (type == ID_EMPTY) { *id_type = ID_USERID; } ret = NT_STATUS_OK; @@ -289,13 +298,13 @@ static NTSTATUS tdb_get_id_from_sid(id_t *id, int *id_type, DOM_SID *sid) } } - if (*id_type == ID_EMPTY || *id_type == ID_GROUPID) { + if (type == ID_EMPTY || type == ID_GROUPID) { /* Parse and return existing gid */ fstrcpy(scanstr, "GID %d"); - if (sscanf(data.dptr, scanstr, *id.gid) == 1) { + if (sscanf(data.dptr, scanstr, (*id).gid) == 1) { /* gid ok? */ - if (*id_type == ID_EMPTY) { + if (type == ID_EMPTY) { *id_type = ID_GROUPID; } ret = NT_STATUS_OK; @@ -304,24 +313,33 @@ static NTSTATUS tdb_get_id_from_sid(id_t *id, int *id_type, DOM_SID *sid) idok: SAFE_FREE(data.dptr); - } else if (*id_type == ID_USERID || *id_type == ID_GROUPID) { + } else if (!(*id_type & ID_NOMAP) && + (((*id_type & ID_TYPEMASK) == ID_USERID) + || (*id_type & ID_TYPEMASK) == ID_GROUPID)) { /* Allocate a new id for this sid */ - ret = tdb_allocate_id(id, id_type); + ret = tdb_allocate_id(id, *id_type); if (NT_STATUS_IS_OK(ret)) { fstring keystr2; /* Store new id */ - slprintf(keystr2, sizeof(keystr2), "%s %d", - *id_type ? "GID" : "UID", *id); + if (*id_type & ID_USERID) { + slprintf(keystr2, sizeof(keystr2), "UID %d", (*id).uid); + } else { + slprintf(keystr2, sizeof(keystr2), "GID %d", (*id).gid); + } data.dptr = keystr2; data.dsize = strlen(keystr2) + 1; - if (tdb_store(idmap_tdb, key, data, TDB_INSERT) == -1) + if (tdb_store(idmap_tdb, key, data, TDB_INSERT) == -1) { + /* TODO: print tdb error !! */ return NT_STATUS_UNSUCCESSFUL; - if (tdb_store(idmap_tdb, data, key, TDB_INSERT) == -1) + } + if (tdb_store(idmap_tdb, data, key, TDB_INSERT) == -1) { + /* TODO: print tdb error !! */ return NT_STATUS_UNSUCCESSFUL; + } ret = NT_STATUS_OK; } @@ -330,13 +348,49 @@ idok: return ret; } +static NTSTATUS tdb_set_mapping(DOM_SID *sid, unid_t id, int id_type) +{ + TDB_DATA ksid, kid; + fstring ksidstr; + fstring kidstr; + + if (!sid) return NT_STATUS_INVALID_PARAMETER; + + sid_to_string(ksidstr, sid); + + ksid.dptr = ksidstr; + ksid.dsize = strlen(ksidstr) + 1; + + id_type &= ID_TYPEMASK; + if (id_type & ID_USERID) { + slprintf(kidstr, sizeof(kidstr), "UID %d", id.uid); + } else if (id_type & ID_GROUPID) { + slprintf(kidstr, sizeof(kidstr), "GID %d", id.gid); + } else { + return NT_STATUS_INVALID_PARAMETER; + } + + kid.dptr = kidstr; + kid.dsize = strlen(kidstr) + 1; + + if (tdb_store(idmap_tdb, ksid, kid, TDB_INSERT) == -1) { + /* TODO: print tdb error !! */ + return NT_STATUS_UNSUCCESSFUL; + } + if (tdb_store(idmap_tdb, kid, ksid, TDB_INSERT) == -1) { + /* TODO: print tdb error !! */ + return NT_STATUS_UNSUCCESSFUL; + } + return NT_STATUS_OK; +} + /***************************************************************************** Initialise idmap database. *****************************************************************************/ -static NTSTATUS tdb_idmap_init(void) +static NTSTATUS tdb_idmap_init(const char *db_name) { /* Open tdb cache */ - if (!(idmap_tdb = tdb_open_log(lock_path("idmap.tdb"), 0, + if (!(idmap_tdb = tdb_open_log(lock_path(db_name), 0, TDB_DEFAULT, O_RDWR | O_CREAT, 0600))) { DEBUG(0, ("idmap_init: Unable to open idmap database\n")); @@ -354,14 +408,14 @@ static NTSTATUS tdb_idmap_init(void) /* Create high water marks for group and user id */ if (tdb_fetch_int32(idmap_tdb, HWM_USER) == -1) { - if (tdb_store_int32(idmap_tdb, HWM_USER, server_state.uid_low) == -1) { + if (tdb_store_int32(idmap_tdb, HWM_USER, idmap_state.uid_low) == -1) { DEBUG(0, ("idmap_init: Unable to initialise user hwm in idmap database\n")); return NT_STATUS_INTERNAL_DB_ERROR; } } if (tdb_fetch_int32(idmap_tdb, HWM_GROUP) == -1) { - if (tdb_store_int32(idmap_tdb, HWM_GROUP, server_state.gid_low) == -1) { + if (tdb_store_int32(idmap_tdb, HWM_GROUP, idmap_state.gid_low) == -1) { DEBUG(0, ("idmap_init: Unable to initialise group hwm in idmap database\n")); return NT_STATUS_INTERNAL_DB_ERROR; } @@ -373,11 +427,13 @@ static NTSTATUS tdb_idmap_init(void) /* Close the tdb */ static NTSTATUS tdb_idmap_close(void) { - if (idmap_tdb) - if (tdb_close(idmap_tdb) == 0) + if (idmap_tdb) { + if (tdb_close(idmap_tdb) == 0) { return NT_STATUS_OK; - else - retrun NT_STATUS_UNSUCCESSFUL; + } else { + return NT_STATUS_UNSUCCESSFUL; + } + } return NT_STATUS_OK; } @@ -426,9 +482,9 @@ static void tdb_idmap_status(void) /* Display percentage of id range already allocated. */ if (user_hwm != -1) { - int num_users = user_hwm - server_state.uid_low; + int num_users = user_hwm - idmap_state.uid_low; int total_users = - server_state.uid_high - server_state.uid_low; + idmap_state.uid_high - idmap_state.uid_low; DEBUG(DUMP_INFO, ("\tUser id range is %d%% full (%d of %d)\n", @@ -437,9 +493,9 @@ static void tdb_idmap_status(void) } if (group_hwm != -1) { - int num_groups = group_hwm - server_state.gid_low; + int num_groups = group_hwm - idmap_state.gid_low; int total_groups = - server_state.gid_high - server_state.gid_low; + idmap_state.gid_high - idmap_state.gid_low; DEBUG(DUMP_INFO, ("\tGroup id range is %d%% full (%d of %d)\n", @@ -455,6 +511,7 @@ struct idmap_methods tdb_idmap_methods = { tdb_idmap_init, tdb_get_sid_from_id, tdb_get_id_from_sid, + tdb_set_mapping, tdb_idmap_close, tdb_idmap_status @@ -464,6 +521,6 @@ NTSTATUS idmap_reg_tdb(struct idmap_methods **meth) { *meth = &tdb_idmap_methods; - return NTSTATUS_OK; + return NT_STATUS_OK; } -- cgit From 8ccff3e99527b7303e75f860e50d74bb83fdfb15 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 8 Mar 2003 23:39:44 +0000 Subject: This is C, not C++ (This used to be commit 25d210b90b6c0377046d89a1dce7a32f94fd7859) --- source3/lib/substitute.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c index 1e3f51e2d8..ef68bce985 100644 --- a/source3/lib/substitute.c +++ b/source3/lib/substitute.c @@ -38,13 +38,13 @@ static fstring smb_user_name; void set_local_machine_name(const char* local_name, BOOL perm) { static BOOL already_perm = False; + fstring tmp_local_machine; + if (already_perm) return; already_perm = perm; - fstring tmp_local_machine; - fstrcpy(tmp_local_machine,local_name); trim_string(tmp_local_machine," "," "); strlower(tmp_local_machine); @@ -60,13 +60,13 @@ void set_local_machine_name(const char* local_name, BOOL perm) void set_remote_machine_name(const char* remote_name, BOOL perm) { static BOOL already_perm = False; + fstring tmp_remote_machine; + if (already_perm) return; already_perm = perm; - fstring tmp_remote_machine; - fstrcpy(tmp_remote_machine,remote_name); trim_string(tmp_remote_machine," "," "); strlower(tmp_remote_machine); -- cgit From 6ed674023620cc77e3276561f913b7a62ed26245 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 9 Mar 2003 01:13:41 +0000 Subject: Don't fault on error returns (ptr == 0) for this LSA query. (for example, query to non-dc) Andrew Bartlett (This used to be commit d1dde5f684652f86e63ac6cfa34ff42a680693de) --- source3/rpc_parse/parse_lsa.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/source3/rpc_parse/parse_lsa.c b/source3/rpc_parse/parse_lsa.c index 53a0fc958d..2753ae524a 100644 --- a/source3/rpc_parse/parse_lsa.c +++ b/source3/rpc_parse/parse_lsa.c @@ -2219,18 +2219,21 @@ BOOL lsa_io_r_query_info2(const char *desc, LSA_R_QUERY_INFO2 *r_c, if(!prs_uint32("ptr", ps, depth, &r_c->ptr)) return False; - if(!prs_uint16("info_class", ps, depth, &r_c->info_class)) - return False; - switch(r_c->info_class) { - case 0x000c: - if (!lsa_io_dns_dom_info("info12", &r_c->info.dns_dom_info, - ps, depth)) + + if (r_c->ptr != 0) { + if(!prs_uint16("info_class", ps, depth, &r_c->info_class)) return False; + switch(r_c->info_class) { + case 0x000c: + if (!lsa_io_dns_dom_info("info12", &r_c->info.dns_dom_info, + ps, depth)) + return False; break; - default: - DEBUG(0,("lsa_io_r_query_info2: unknown info class %d\n", - r_c->info_class)); - return False; + default: + DEBUG(0,("lsa_io_r_query_info2: unknown info class %d\n", + r_c->info_class)); + return False; + } } if(!prs_align(ps)) -- cgit From 2ed7730f2d498a446dc7281e652d02a9dd2d94cf Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 9 Mar 2003 09:23:09 +0000 Subject: Change the way we sign SMB packets, to a function pointer interface. The intention is to allow for NTLMSSP and kerberos signing of packets, but for now it's just what I call 'simple' signing. (aka SMB signing per the SNIA spec) Andrew Bartlett (This used to be commit b9cf95c3dc04a45de71fb16e85c1bfbae50e6d8f) --- source3/Makefile.in | 2 +- source3/include/client.h | 13 +- source3/libsmb/cliconnect.c | 47 +------ source3/libsmb/clientgen.c | 8 +- source3/libsmb/smb_signing.c | 329 +++++++++++++++++++++++++++++++++++++++++++ source3/libsmb/smbencrypt.c | 100 +------------ 6 files changed, 346 insertions(+), 153 deletions(-) create mode 100644 source3/libsmb/smb_signing.c diff --git a/source3/Makefile.in b/source3/Makefile.in index 7de4b0ae8f..23c88d3ab1 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -201,7 +201,7 @@ LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \ libsmb/clirap.o libsmb/clierror.o libsmb/climessage.o \ libsmb/clireadwrite.o libsmb/clilist.o libsmb/cliprint.o \ libsmb/clitrans.o libsmb/clisecdesc.o libsmb/clidgram.o \ - libsmb/clistr.o \ + libsmb/clistr.o libsmb/smb_signing.o \ libsmb/smberr.o libsmb/credentials.o libsmb/pwd_cache.o \ libsmb/clioplock.o libsmb/errormap.o libsmb/clirap2.o \ libsmb/passchange.o libsmb/doserr.o \ diff --git a/source3/include/client.h b/source3/include/client.h index 73e29a1fff..2e6b9337e4 100644 --- a/source3/include/client.h +++ b/source3/include/client.h @@ -58,14 +58,15 @@ struct print_job_info }; typedef struct smb_sign_info { - BOOL use_smb_signing; + void (*sign_outgoing_message)(struct cli_state *cli); + BOOL (*check_incoming_message)(struct cli_state *cli); + void (*free_signing_context)(struct cli_state *cli); + void *signing_context; + BOOL negotiated_smb_signing; - BOOL temp_smb_signing; - size_t mac_key_len; - uint8 mac_key[64]; - uint32 send_seq_num; - uint32 reply_seq_num; BOOL allow_smb_signing; + BOOL doing_signing; + BOOL mandetory_signing; } smb_sign_info; struct cli_state { diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 49b0004ac2..589c7b36bb 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -228,39 +228,11 @@ static BOOL cli_session_setup_plaintext(struct cli_state *cli, const char *user, return True; } -static void set_signing_on_cli (struct cli_state *cli, uint8 user_session_key[16], DATA_BLOB response) -{ - uint8 zero_sig[8]; - ZERO_STRUCT(zero_sig); - - DEBUG(5, ("Server returned security sig:\n")); - dump_data(5, &cli->inbuf[smb_ss_field], 8); - - if (cli->sign_info.use_smb_signing) { - DEBUG(5, ("smb signing already active on connection\n")); - } else if (memcmp(&cli->inbuf[smb_ss_field], zero_sig, 8) != 0) { - - DEBUG(3, ("smb signing enabled!\n")); - cli->sign_info.use_smb_signing = True; - cli_calculate_mac_key(cli, user_session_key, response); - } else { - DEBUG(5, ("smb signing NOT enabled!\n")); - } -} - static void set_cli_session_key (struct cli_state *cli, DATA_BLOB session_key) { memcpy(cli->user_session_key, session_key.data, MIN(session_key.length, sizeof(cli->user_session_key))); } - -static void set_temp_signing_on_cli(struct cli_state *cli) -{ - if (cli->sign_info.negotiated_smb_signing) - cli->sign_info.temp_smb_signing = True; -} - - /**************************************************************************** do a NT1 NTLM/LM encrypted session setup @param cli client state to create do session setup on @@ -310,8 +282,7 @@ static BOOL cli_session_setup_nt1(struct cli_state *cli, const char *user, session_key = data_blob(NULL, 16); SMBsesskeygen_ntv1(nt_hash, NULL, session_key.data); } - - set_temp_signing_on_cli(cli); + cli_simple_set_signing(cli, session_key.data, nt_response); } else { /* pre-encrypted password supplied. Only used for security=server, can't do @@ -374,14 +345,14 @@ static BOOL cli_session_setup_nt1(struct cli_state *cli, const char *user, if (session_key.data) { /* Have plaintext orginal */ set_cli_session_key(cli, session_key); - set_signing_on_cli(cli, session_key.data, nt_response); } + ret = True; end: data_blob_free(&lm_response); data_blob_free(&nt_response); data_blob_free(&session_key); - return True; + return ret; } /**************************************************************************** @@ -403,8 +374,6 @@ static DATA_BLOB cli_session_setup_blob(struct cli_state *cli, DATA_BLOB blob) set_message(cli->outbuf,12,0,True); SCVAL(cli->outbuf,smb_com,SMBsesssetupX); - set_temp_signing_on_cli(cli); - cli_setup_packet(cli); SCVAL(cli->outbuf,smb_vwv0,0xFF); @@ -883,11 +852,6 @@ BOOL cli_negprot(struct cli_state *cli) int numprots; int plength; - if (cli->sign_info.use_smb_signing) { - DEBUG(0, ("Cannot send negprot again, particularly after setting up SMB Signing\n")); - return False; - } - if (cli->protocol < PROTOCOL_NT1) cli->use_spnego = False; @@ -1013,11 +977,6 @@ BOOL cli_session_request(struct cli_state *cli, if (cli->port == 445) return True; - if (cli->sign_info.use_smb_signing) { - DEBUG(0, ("Cannot send session resquest again, particularly after setting up SMB Signing\n")); - return False; - } - /* send a session request (RFC 1002) */ /* setup the packet length * Remove four bytes from the length count, since the length diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 6ef7a7bd9c..3cae643c38 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -177,9 +177,6 @@ void cli_setup_packet(struct cli_state *cli) flags2 |= FLAGS2_32_BIT_ERROR_CODES; if (cli->use_spnego) flags2 |= FLAGS2_EXTENDED_SECURITY; - if (cli->sign_info.use_smb_signing - || cli->sign_info.temp_smb_signing) - flags2 |= FLAGS2_SMB_SECURITY_SIGNATURES; SSVAL(cli->outbuf,smb_flg2, flags2); } } @@ -262,6 +259,9 @@ struct cli_state *cli_initialise(struct cli_state *cli) if (getenv("CLI_FORCE_DOSERR")) cli->force_dos_errors = True; + /* initialise signing */ + cli_null_set_signing(cli); + if (lp_client_signing()) cli->sign_info.allow_smb_signing = True; @@ -303,6 +303,7 @@ void cli_close_connection(struct cli_state *cli) SAFE_FREE(cli->outbuf); SAFE_FREE(cli->inbuf); + cli_free_signing_context(cli); data_blob_free(&cli->secblob); if (cli->mem_ctx) { @@ -314,6 +315,7 @@ void cli_close_connection(struct cli_state *cli) close(cli->fd); cli->fd = -1; cli->smb_rw_error = 0; + } /**************************************************************************** diff --git a/source3/libsmb/smb_signing.c b/source3/libsmb/smb_signing.c new file mode 100644 index 0000000000..b3a6351893 --- /dev/null +++ b/source3/libsmb/smb_signing.c @@ -0,0 +1,329 @@ +/* + Unix SMB/CIFS implementation. + SMB Signing Code + Copyright (C) Jeremy Allison 2002. + Copyright (C) Andrew Bartlett 2002-2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +struct smb_basic_signing_context { + DATA_BLOB mac_key; + uint32 send_seq_num; + uint32 reply_seq_num; +}; + +/*********************************************************** + SMB signing - Common code before we set a new signing implementation +************************************************************/ + +static BOOL set_smb_signing_common(struct cli_state *cli) +{ + if (cli->sign_info.doing_signing) { + return False; + } + + if (cli->sign_info.free_signing_context) + cli->sign_info.free_signing_context(cli); + + /* These calls are INCONPATIBLE with SMB signing */ + cli->readbraw_supported = False; + cli->writebraw_supported = False; + + return True; +} + +/*********************************************************** + SMB signing - Common code for 'real' implementations +************************************************************/ + +static BOOL set_smb_signing_real_common(struct cli_state *cli) +{ + if (cli->sign_info.mandetory_signing) { + DEBUG(5, ("Mandetory SMB signing enabled!\n")); + cli->sign_info.doing_signing = True; + } + + DEBUG(5, ("SMB signing enabled!\n")); + + return True; +} + +static void mark_packet_signed(struct cli_state *cli) +{ + uint16 flags2; + flags2 = SVAL(cli->outbuf,smb_flg2); + flags2 |= FLAGS2_SMB_SECURITY_SIGNATURES; + SSVAL(cli->outbuf,smb_flg2, flags2); +} + +/*********************************************************** + SMB signing - Simple implementation - calculate a MAC to send. +************************************************************/ + +static void cli_simple_sign_outgoing_message(struct cli_state *cli) +{ + unsigned char calc_md5_mac[16]; + struct MD5Context md5_ctx; + struct smb_basic_signing_context *data = cli->sign_info.signing_context; + + /* + * Firstly put the sequence number into the first 4 bytes. + * and zero out the next 4 bytes. + */ + SIVAL(cli->outbuf, smb_ss_field, + data->send_seq_num); + SIVAL(cli->outbuf, smb_ss_field + 4, 0); + + /* mark the packet as signed - BEFORE we sign it...*/ + mark_packet_signed(cli); + + /* Calculate the 16 byte MAC and place first 8 bytes into the field. */ + MD5Init(&md5_ctx); + MD5Update(&md5_ctx, data->mac_key.data, + data->mac_key.length); + MD5Update(&md5_ctx, cli->outbuf + 4, smb_len(cli->outbuf)); + MD5Final(calc_md5_mac, &md5_ctx); + + DEBUG(10, ("sent SMB signiture of\n")); + dump_data(10, calc_md5_mac, 8); + + memcpy(&cli->outbuf[smb_ss_field], calc_md5_mac, 8); + +/* cli->outbuf[smb_ss_field+2]=0; + Uncomment this to test if the remote server actually verifies signitures...*/ + data->send_seq_num++; + data->reply_seq_num = data->send_seq_num; + data->send_seq_num++; +} + +/*********************************************************** + SMB signing - Simple implementation - check a MAC sent by server. +************************************************************/ + +static BOOL cli_simple_check_incoming_message(struct cli_state *cli) +{ + BOOL good; + unsigned char calc_md5_mac[16]; + unsigned char server_sent_mac[8]; + struct MD5Context md5_ctx; + struct smb_basic_signing_context *data = cli->sign_info.signing_context; + + /* + * Firstly put the sequence number into the first 4 bytes. + * and zero out the next 4 bytes. + */ + + memcpy(server_sent_mac, &cli->inbuf[smb_ss_field], sizeof(server_sent_mac)); + + DEBUG(10, ("got SMB signiture of\n")); + dump_data(10, server_sent_mac, 8); + + SIVAL(cli->inbuf, smb_ss_field, data->reply_seq_num); + SIVAL(cli->inbuf, smb_ss_field + 4, 0); + + /* Calculate the 16 byte MAC and place first 8 bytes into the field. */ + MD5Init(&md5_ctx); + MD5Update(&md5_ctx, data->mac_key.data, + data->mac_key.length); + MD5Update(&md5_ctx, cli->inbuf + 4, smb_len(cli->inbuf)); + MD5Final(calc_md5_mac, &md5_ctx); + + good = (memcmp(server_sent_mac, calc_md5_mac, 8) == 0); + + if (good && !cli->sign_info.doing_signing) { + cli->sign_info.doing_signing = True; + } + + if (!good) { + DEBUG(1, ("SMB signiture check failed!\n")); + } + + return good; +} + +/*********************************************************** + SMB signing - Simple implementation - free signing context +************************************************************/ + +static void cli_simple_free_signing_context(struct cli_state *cli) +{ + struct smb_basic_signing_context *data = cli->sign_info.signing_context; + + data_blob_free(&data->mac_key); + SAFE_FREE(cli->sign_info.signing_context); + + return; +} + +/*********************************************************** + SMB signing - Simple implementation - setup the MAC key. +************************************************************/ + +void cli_simple_set_signing(struct cli_state *cli, const uchar user_session_key[16], const DATA_BLOB response) +{ + struct smb_basic_signing_context *data; + + if (!set_smb_signing_common(cli)) { + return; + } + + if (!set_smb_signing_real_common(cli)) { + return; + } + + data = smb_xmalloc(sizeof(*data)); + cli->sign_info.signing_context = data; + + data->mac_key = data_blob(NULL, MIN(response.length + 16, 40)); + + memcpy(&data->mac_key.data[0], user_session_key, 16); + memcpy(&data->mac_key.data[16],response.data, MIN(response.length, 40 - 16)); + + /* Initialise the sequence number */ + data->send_seq_num = 0; + + cli->sign_info.sign_outgoing_message = cli_simple_sign_outgoing_message; + cli->sign_info.check_incoming_message = cli_simple_check_incoming_message; + cli->sign_info.free_signing_context = cli_simple_free_signing_context; +} + +/*********************************************************** + SMB signing - NULL implementation - calculate a MAC to send. +************************************************************/ + +static void cli_null_sign_outgoing_message(struct cli_state *cli) +{ + static uchar zeros[8]; + memcpy(&cli->outbuf[smb_ss_field], zeros, sizeof(zeros)); +} + +/*********************************************************** + SMB signing - NULL implementation - check a MAC sent by server. +************************************************************/ + +static BOOL cli_null_check_incoming_message(struct cli_state *cli) +{ + return True; +} + +/*********************************************************** + SMB signing - NULL implementation - free signing context +************************************************************/ + +static void cli_null_free_signing_context(struct cli_state *cli) +{ + return; +} + +/*********************************************************** + SMB signing - NULL implementation - setup the MAC key. +************************************************************/ + +void cli_null_set_signing(struct cli_state *cli) +{ + struct smb_basic_sign_data *data; + + if (!set_smb_signing_common(cli)) { + return; + } + + cli->sign_info.signing_context = NULL; + + cli->sign_info.sign_outgoing_message = cli_null_sign_outgoing_message; + cli->sign_info.check_incoming_message = cli_null_check_incoming_message; + cli->sign_info.free_signing_context = cli_null_free_signing_context; +} + +/*********************************************************** + SMB signing - TEMP implementation - calculate a MAC to send. +************************************************************/ + +static void cli_temp_sign_outgoing_message(struct cli_state *cli) +{ + memcpy(&cli->outbuf[smb_ss_field], "SignRequest", 8); + return; +} + +/*********************************************************** + SMB signing - TEMP implementation - check a MAC sent by server. +************************************************************/ + +static BOOL cli_temp_check_incoming_message(struct cli_state *cli) +{ + return True; +} + +/*********************************************************** + SMB signing - TEMP implementation - free signing context +************************************************************/ + +static void cli_temp_free_signing_context(struct cli_state *cli) +{ + return; +} + +/*********************************************************** + SMB signing - NULL implementation - setup the MAC key. +************************************************************/ + +void cli_temp_set_signing(struct cli_state *cli) +{ + if (!set_smb_signing_common(cli)) { + return; + } + + cli->sign_info.signing_context = NULL; + + cli->sign_info.sign_outgoing_message = cli_temp_sign_outgoing_message; + cli->sign_info.check_incoming_message = cli_temp_check_incoming_message; + cli->sign_info.free_signing_context = cli_temp_free_signing_context; +} + +/** + * Free the singing context + */ + +void cli_free_signing_context(struct cli_state *cli) +{ + if (cli->sign_info.free_signing_context) + cli->sign_info.free_signing_context(cli); + + cli_null_set_signing(cli); +} + +void cli_caclulate_sign_mac(struct cli_state *cli) +{ + cli->sign_info.sign_outgoing_message(cli); +} + +BOOL cli_check_sign_mac(struct cli_state *cli) +{ + BOOL good; + good = cli->sign_info.check_incoming_message(cli); + + if (!good) { + if (cli->sign_info.doing_signing) { + return False; + } else { + cli_free_signing_context(cli); + } + } + + return True; +} + diff --git a/source3/libsmb/smbencrypt.c b/source3/libsmb/smbencrypt.c index aa9391325f..28160d9609 100644 --- a/source3/libsmb/smbencrypt.c +++ b/source3/libsmb/smbencrypt.c @@ -295,7 +295,7 @@ void SMBsesskeygen_ntv1(const uchar kr[16], #endif } -DATA_BLOB NTLMv2_generate_response(uchar ntlm_v2_hash[16], +static DATA_BLOB NTLMv2_generate_response(uchar ntlm_v2_hash[16], DATA_BLOB server_chal, size_t client_chal_length) { uchar ntlmv2_response[16]; @@ -416,101 +416,3 @@ BOOL decode_pw_buffer(char in_buffer[516], char *new_pwrd, return True; } - -/*********************************************************** - SMB signing - setup the MAC key. -************************************************************/ - -void cli_calculate_mac_key(struct cli_state *cli, const uchar user_session_key[16], const DATA_BLOB response) -{ - - memcpy(&cli->sign_info.mac_key[0], user_session_key, 16); - memcpy(&cli->sign_info.mac_key[16],response.data, MIN(response.length, 40 - 16)); - cli->sign_info.mac_key_len = MIN(response.length + 16, 40); - cli->sign_info.use_smb_signing = True; - - /* These calls are INCONPATIBLE with SMB signing */ - cli->readbraw_supported = False; - cli->writebraw_supported = False; - - /* Reset the sequence number in case we had a previous (aborted) attempt */ - cli->sign_info.send_seq_num = 2; -} - -/*********************************************************** - SMB signing - calculate a MAC to send. -************************************************************/ - -void cli_caclulate_sign_mac(struct cli_state *cli) -{ - unsigned char calc_md5_mac[16]; - struct MD5Context md5_ctx; - - if (cli->sign_info.temp_smb_signing) { - memcpy(&cli->outbuf[smb_ss_field], "SignRequest", 8); - cli->sign_info.temp_smb_signing = False; - return; - } - - if (!cli->sign_info.use_smb_signing) { - return; - } - - /* - * Firstly put the sequence number into the first 4 bytes. - * and zero out the next 4 bytes. - */ - SIVAL(cli->outbuf, smb_ss_field, cli->sign_info.send_seq_num); - SIVAL(cli->outbuf, smb_ss_field + 4, 0); - - /* Calculate the 16 byte MAC and place first 8 bytes into the field. */ - MD5Init(&md5_ctx); - MD5Update(&md5_ctx, cli->sign_info.mac_key, cli->sign_info.mac_key_len); - MD5Update(&md5_ctx, cli->outbuf + 4, smb_len(cli->outbuf)); - MD5Final(calc_md5_mac, &md5_ctx); - - memcpy(&cli->outbuf[smb_ss_field], calc_md5_mac, 8); - -/* cli->outbuf[smb_ss_field+2]=0; - Uncomment this to test if the remote server actually verifies signitures...*/ - cli->sign_info.send_seq_num++; - cli->sign_info.reply_seq_num = cli->sign_info.send_seq_num; - cli->sign_info.send_seq_num++; -} - -/*********************************************************** - SMB signing - check a MAC sent by server. -************************************************************/ - -BOOL cli_check_sign_mac(struct cli_state *cli) -{ - unsigned char calc_md5_mac[16]; - unsigned char server_sent_mac[8]; - struct MD5Context md5_ctx; - - if (cli->sign_info.temp_smb_signing) { - return True; - } - - if (!cli->sign_info.use_smb_signing) { - return True; - } - - /* - * Firstly put the sequence number into the first 4 bytes. - * and zero out the next 4 bytes. - */ - - memcpy(server_sent_mac, &cli->inbuf[smb_ss_field], sizeof(server_sent_mac)); - - SIVAL(cli->inbuf, smb_ss_field, cli->sign_info.reply_seq_num); - SIVAL(cli->inbuf, smb_ss_field + 4, 0); - - /* Calculate the 16 byte MAC and place first 8 bytes into the field. */ - MD5Init(&md5_ctx); - MD5Update(&md5_ctx, cli->sign_info.mac_key, cli->sign_info.mac_key_len); - MD5Update(&md5_ctx, cli->inbuf + 4, smb_len(cli->inbuf)); - MD5Final(calc_md5_mac, &md5_ctx); - - return (memcmp(server_sent_mac, calc_md5_mac, 8) == 0); -} -- cgit From 6d6be870e369acc432e2e424a88a72148b7d2a75 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 9 Mar 2003 12:08:36 +0000 Subject: Add some printing question & answers (This used to be commit 998537ca398100974075d11e28d5199997424f15) --- docs/docbook/faq/printing.sgml | 16 ++++++++++++++++ docs/docbook/faq/sambafaq.sgml | 2 ++ 2 files changed, 18 insertions(+) create mode 100644 docs/docbook/faq/printing.sgml diff --git a/docs/docbook/faq/printing.sgml b/docs/docbook/faq/printing.sgml new file mode 100644 index 0000000000..cc8d210cf9 --- /dev/null +++ b/docs/docbook/faq/printing.sgml @@ -0,0 +1,16 @@ + +Printing problems + + +cupsaddsmb fails! + +This can have a few causes: + + +Does the user you are trying to add the printer with have the correct rights? Make sure +this user is listed in 'printer admin = ' in the section [global] + + + + + diff --git a/docs/docbook/faq/sambafaq.sgml b/docs/docbook/faq/sambafaq.sgml index e9e5ed7a3c..2cc7d466fd 100644 --- a/docs/docbook/faq/sambafaq.sgml +++ b/docs/docbook/faq/sambafaq.sgml @@ -5,6 +5,7 @@ + ]> @@ -34,4 +35,5 @@ and the old samba text documents which were mostly written by John Terpstra. &clientapp; &errors; &features; +&printing; -- cgit From 14cf457c567b16cf4a3725d3a3c7527593a4982a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 9 Mar 2003 16:39:34 +0000 Subject: Add Ronan Waide's info about the setdriver call. (This used to be commit ef6cb3ec1aa943d4e52ea08e7b43a47d781d3273) --- docs/docbook/faq/printing.sgml | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/docbook/faq/printing.sgml b/docs/docbook/faq/printing.sgml index cc8d210cf9..cc01a5d3b0 100644 --- a/docs/docbook/faq/printing.sgml +++ b/docs/docbook/faq/printing.sgml @@ -1,16 +1,36 @@ + + + RonanWaide + + + Printing problems -cupsaddsmb fails! +setdriver or cupsaddsmb failes -This can have a few causes: +setdriver expects the following setup: -Does the user you are trying to add the printer with have the correct rights? Make sure -this user is listed in 'printer admin = ' in the section [global] +you are a printer admin, or root. this is the smb.conf printer admin group, not the Printer Operators group in NT. I've not tried the latter, but I don't believe it will work based on the current code. +printer admins has to be defined in [global] +upload the driver files to \\server\print$\w32x86 and win40 as appropriate. DON'T put them in the 0 or 2 subdirectories. +Make sure that the user you're connecting as is able to write to the print$ directories +Use adddriver (with appropriate parameters) to create the driver. note, this will not just update samba's notion of drivers, it will also move the files from the w32x86 and win40 directories to an appropriate subdirectory (based on driver version, I think, but not important enough for me to find out) +Use setdriver to associate the driver with a printer + +The setdriver call will fail if the printer doesn't already exist in +samba's view of the world. Either create the printer in cups and +restart samba, or create an add printer command (see smb.conf doco) +and use RPC calls to create a printer. NB the add printer command MUST +return a single line of text indicating which port the printer was +added on. If it doesn't, Samba won't reload the printer +definitions. Although samba doesn't really support the notion of +ports, suitable add printer command and enumport command settings can +allow you pretty good remote control of the samba printer setup. -- cgit From 2b6a6df0f65caccb31c78008539d24f8c4a2f72a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 9 Mar 2003 21:09:28 +0000 Subject: Try not to clobber the session request. (This used to be commit 05cffbee56f0556f550b4d14f3111bd7db972621) --- source3/libsmb/smb_signing.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/source3/libsmb/smb_signing.c b/source3/libsmb/smb_signing.c index b3a6351893..581d18fef7 100644 --- a/source3/libsmb/smb_signing.c +++ b/source3/libsmb/smb_signing.c @@ -208,8 +208,10 @@ void cli_simple_set_signing(struct cli_state *cli, const uchar user_session_key[ static void cli_null_sign_outgoing_message(struct cli_state *cli) { - static uchar zeros[8]; - memcpy(&cli->outbuf[smb_ss_field], zeros, sizeof(zeros)); + /* we can't zero out the sig, as we might be trying to send a + session request - which is NBT-level, not SMB level and doesn't + have the feild */ + return; } /*********************************************************** @@ -295,7 +297,7 @@ void cli_temp_set_signing(struct cli_state *cli) } /** - * Free the singing context + * Free the singing context */ void cli_free_signing_context(struct cli_state *cli) @@ -306,11 +308,21 @@ void cli_free_signing_context(struct cli_state *cli) cli_null_set_signing(cli); } +/** + * Sign a packet with the current mechinism + */ + void cli_caclulate_sign_mac(struct cli_state *cli) { cli->sign_info.sign_outgoing_message(cli); } +/** + * Check a packet with the current mechinism + * @return False if we had an established signing connection + * which had a back checksum, True otherwise + */ + BOOL cli_check_sign_mac(struct cli_state *cli) { BOOL good; -- cgit From cb1de38cfd09bae002b8adf104d92569a9b695bb Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Mon, 10 Mar 2003 00:37:25 +0000 Subject: Check for valgrind.h (This used to be commit 0ece70d631bf095bf9c8819180b6c59990159cd0) --- source3/configure.in | 1 + 1 file changed, 1 insertion(+) diff --git a/source3/configure.in b/source3/configure.in index cc38e37f3f..b2cd15b3b3 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -556,6 +556,7 @@ AC_CHECK_HEADERS(sys/mount.h sys/vfs.h sys/fs/s5param.h sys/filsys.h termios.h t AC_CHECK_HEADERS(sys/termio.h sys/statfs.h sys/dustat.h sys/statvfs.h stdarg.h sys/sockio.h) AC_CHECK_HEADERS(security/pam_modules.h security/_pam_macros.h ldap.h lber.h dlfcn.h) AC_CHECK_HEADERS(sys/syslog.h syslog.h) +AC_CHECK_HEADERS(valgrind.h) # # HPUX has a bug in that including shadow.h causes a re-definition of MAXINT. -- cgit From becf7a099710ba50f4611d0e16151337236b8a93 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Mon, 10 Mar 2003 00:45:28 +0000 Subject: Include valgrind.h if present on the system. (This used to be commit 65ba78c6bd4c5ab7ec9bf4d15e4410482e82588d) --- source3/include/includes.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source3/include/includes.h b/source3/include/includes.h index b9ba4b84d5..297f38ae97 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -433,6 +433,11 @@ #include #endif +#if HAVE_VALGRIND_H +/* Special macros that are no-ops except when run under Valgrind on x86. */ +#include +#endif + /* we support ADS if we want it and have krb5 and ldap libs */ #if defined(WITH_ADS) && defined(HAVE_KRB5) && defined(HAVE_LDAP) #define HAVE_ADS -- cgit From de6b39d898d5fb3106d7ed80249be7f74f83caf6 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Mon, 10 Mar 2003 01:10:45 +0000 Subject: Clobber strings with 0xf1f1f1f1 before writing to them to check buffer lengths are correct. Attempts to pstrcpy into an fstring or allocated string should fail in developer builds. This builds on abartlet's earlier overflow probe for safe_strcpy, but by clobbering the whole string with a nonzero value is more likely to find overflows on the stack. This is only used in -DDEVELOPER mode. Reviewed by abartlet, tpot. (This used to be commit 8d915e266cd8ccc8b27e9c7ea8e9d003d05f8182) --- source3/lib/util_str.c | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 070c59c1b2..924cf9d921 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -430,6 +430,27 @@ BOOL str_is_all(const char *s,char c) return True; } + +/** + * In developer builds, clobber a region of memory. + * + * If we think a string buffer is longer than it really is, this ought + * to make the failure obvious, by segfaulting (if in the heap) or by + * killing the return address (on the stack), or by trapping under a + * memory debugger. + * + * This is meant to catch possible string overflows, even if the + * actual string copied is not big enough to cause an overflow. + **/ +void clobber_region(char *dest, size_t len) +{ +#ifdef DEVELOPER + /* F1 is odd and 0xf1f1f1f1 shouldn't be a valid pointer */ + memset(dest, 0xF1, len); +#endif +} + + /** Safe string copy into a known length string. maxlength does not include the terminating zero. @@ -444,13 +465,7 @@ char *safe_strcpy(char *dest,const char *src, size_t maxlength) return NULL; } -#ifdef DEVELOPER - /* We intentionally write out at the extremity of the destination - * string. If the destination is too short (e.g. pstrcpy into mallocd - * or fstring) then this should cause an error under a memory - * checker. */ - dest[maxlength] = '\0'; -#endif + clobber_region(dest, maxlength+1); if (!src) { *dest = 0; @@ -490,6 +505,8 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength) src_len = strlen(src); dest_len = strlen(dest); + clobber_region(dest + dest_len, maxlength + 1 - dest_len); + if (src_len + dest_len > maxlength) { DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n", (int)(src_len + dest_len - maxlength), src)); @@ -499,7 +516,7 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength) dest[maxlength] = 0; return NULL; } - + memcpy(&dest[dest_len], src, src_len); dest[dest_len + src_len] = 0; return dest; @@ -516,6 +533,8 @@ char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, si { size_t len, i; + clobber_region(dest, maxlength); + if (!dest) { DEBUG(0,("ERROR: NULL dest in alpha_strcpy\n")); return NULL; @@ -554,8 +573,12 @@ char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, si char *StrnCpy(char *dest,const char *src,size_t n) { char *d = dest; + + clobber_region(dest, n+1); + if (!dest) return(NULL); + if (!src) { *dest = 0; return(dest); @@ -576,6 +599,8 @@ char *strncpyn(char *dest, const char *src, size_t n, char c) char *p; size_t str_len; + clobber_region(dest, n+1); + p = strchr_m(src, c); if (p == NULL) { DEBUG(5, ("strncpyn: separator character (%c) not found\n", c)); -- cgit From e9a94cd2c9cab4518603620259dae44b40d9049e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 10 Mar 2003 02:14:35 +0000 Subject: Further work on NTLMSSP-based SMB signing. Current status is that I cannnot get Win2k to send a valid signiture in it's session setup reply - which it will give to win2k clients. So, I need to look at becoming 'more like MS', but for now I'll get this code into the tree. It's actually based on the TNG cli_pipe_ntlmssp.c, as it was slightly easier to understand than our own (but only the utility functions remain in any way intact...). This includes the mysical 'NTLM2' code - I have no idea if it actually works. (I couldn't get TNG to use it for its pipes either). Andrew Bartlett (This used to be commit a034a5e381ba5612be21e2ba640d11f82cd945da) --- source3/include/ntlmssp.h | 23 +++++ source3/libsmb/cliconnect.c | 47 ++++++++-- source3/libsmb/ntlmssp.c | 37 +++++--- source3/libsmb/ntlmssp_sign.c | 208 ++++++++++++++++++++++++++++++++++++++++++ source3/libsmb/smb_signing.c | 180 ++++++++++++++++++++++++++++++------ 5 files changed, 447 insertions(+), 48 deletions(-) create mode 100644 source3/libsmb/ntlmssp_sign.c diff --git a/source3/include/ntlmssp.h b/source3/include/ntlmssp.h index 4fa4259a6a..f0278ffece 100644 --- a/source3/include/ntlmssp.h +++ b/source3/include/ntlmssp.h @@ -92,6 +92,8 @@ typedef struct ntlmssp_state typedef struct ntlmssp_client_state { TALLOC_CTX *mem_ctx; + unsigned int ref_count; + BOOL unicode; BOOL use_ntlmv2; char *user; @@ -102,9 +104,30 @@ typedef struct ntlmssp_client_state const char *(*get_global_myname)(void); const char *(*get_domain)(void); + DATA_BLOB chal; + DATA_BLOB lm_resp; + DATA_BLOB nt_resp; DATA_BLOB session_key; uint32 neg_flags; + + /* SMB Signing */ + + uint32 ntlmssp_seq_num; + + /* ntlmv2 */ + char cli_sign_const[16]; + char cli_seal_const[16]; + char srv_sign_const[16]; + char srv_seal_const[16]; + + unsigned char cli_sign_hash[258]; + unsigned char cli_seal_hash[258]; + unsigned char srv_sign_hash[258]; + unsigned char srv_seal_hash[258]; + + /* ntlmv1 */ + unsigned char ntlmssp_hash[258]; } NTLMSSP_CLIENT_STATE; diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 589c7b36bb..36b6f609f5 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -356,15 +356,13 @@ end: } /**************************************************************************** - Send a extended security session setup blob, returning a reply blob. + Send a extended security session setup blob ****************************************************************************/ -static DATA_BLOB cli_session_setup_blob(struct cli_state *cli, DATA_BLOB blob) +static BOOL cli_session_setup_blob_send(struct cli_state *cli, DATA_BLOB blob) { uint32 capabilities = cli_session_setup_capabilities(cli); char *p; - DATA_BLOB blob2 = data_blob(NULL, 0); - uint32 len; capabilities |= CAP_EXTENDED_SECURITY; @@ -389,7 +387,18 @@ static DATA_BLOB cli_session_setup_blob(struct cli_state *cli, DATA_BLOB blob) p += clistr_push(cli, p, "Unix", -1, STR_TERMINATE); p += clistr_push(cli, p, "Samba", -1, STR_TERMINATE); cli_setup_bcc(cli, p); - cli_send_smb(cli); + return cli_send_smb(cli); +} + +/**************************************************************************** + Send a extended security session setup blob, returning a reply blob. +****************************************************************************/ + +static DATA_BLOB cli_session_setup_blob_receive(struct cli_state *cli) +{ + DATA_BLOB blob2 = data_blob(NULL, 0); + char *p; + size_t len; if (!cli_receive_smb(cli)) return blob2; @@ -418,6 +427,20 @@ static DATA_BLOB cli_session_setup_blob(struct cli_state *cli, DATA_BLOB blob) return blob2; } +/**************************************************************************** + Send a extended security session setup blob, returning a reply blob. +****************************************************************************/ + +static DATA_BLOB cli_session_setup_blob(struct cli_state *cli, DATA_BLOB blob) +{ + DATA_BLOB blob2 = data_blob(NULL, 0); + if (!cli_session_setup_blob_send(cli, blob)) { + return blob2; + } + + return cli_session_setup_blob_receive(cli); +} + #ifdef HAVE_KRB5 /**************************************************************************** Use in-memory credentials cache @@ -471,6 +494,8 @@ static BOOL cli_session_setup_ntlmssp(struct cli_state *cli, const char *user, DATA_BLOB blob_in = data_blob(NULL, 0); DATA_BLOB blob_out; + cli_temp_set_signing(cli); + if (!NT_STATUS_IS_OK(nt_status = ntlmssp_client_start(&ntlmssp_state))) { return False; } @@ -501,8 +526,15 @@ static BOOL cli_session_setup_ntlmssp(struct cli_state *cli, const char *user, } /* now send that blob on its way */ - blob = cli_session_setup_blob(cli, msg1); + if (!cli_session_setup_blob_send(cli, msg1)) { + return False; + } data_blob_free(&msg1); + + cli_ntlmssp_set_signing(cli, ntlmssp_state); + + blob = cli_session_setup_blob_receive(cli); + nt_status = cli_nt_error(cli); } @@ -539,6 +571,9 @@ static BOOL cli_session_setup_ntlmssp(struct cli_state *cli, const char *user, set_cli_session_key(cli, ntlmssp_state->session_key); } + /* we have a reference conter on ntlmssp_state, if we are signing + then the state will be kept by the signing engine */ + if (!NT_STATUS_IS_OK(ntlmssp_client_end(&ntlmssp_state))) { return False; } diff --git a/source3/libsmb/ntlmssp.c b/source3/libsmb/ntlmssp.c index e1509f6b63..5722b8efcd 100644 --- a/source3/libsmb/ntlmssp.c +++ b/source3/libsmb/ntlmssp.c @@ -81,7 +81,7 @@ static const uint8 *get_challenge(struct ntlmssp_state *ntlmssp_state) /** * Determine correct target name flags for reply, given server role - * and negoitated falgs + * and negotiated flags * * @param ntlmssp_state NTLMSSP State * @param neg_flags The flags from the packet @@ -291,7 +291,7 @@ static NTSTATUS ntlmssp_server_auth(struct ntlmssp_state *ntlmssp_state, /** * Create an NTLMSSP state machine * - * @param ntlmssp_state NTLMSSP State, allocated by this funciton + * @param ntlmssp_state NTLMSSP State, allocated by this function */ NTSTATUS ntlmssp_server_start(NTLMSSP_STATE **ntlmssp_state) @@ -322,7 +322,7 @@ NTSTATUS ntlmssp_server_start(NTLMSSP_STATE **ntlmssp_state) /** * End an NTLMSSP state machine * - * @param ntlmssp_state NTLMSSP State, free()ed by this funciton + * @param ntlmssp_state NTLMSSP State, free()ed by this function */ NTSTATUS ntlmssp_server_end(NTLMSSP_STATE **ntlmssp_state) @@ -431,7 +431,7 @@ static NTSTATUS ntlmssp_client_challenge(struct ntlmssp_client_state *ntlmssp_st DATA_BLOB session_key = data_blob(NULL, 0); uint8 datagram_sess_key[16]; - ZERO_STRUCT(datagram_sess_key); + generate_random_buffer(datagram_sess_key, sizeof(datagram_sess_key), False); if (!msrpc_parse(&reply, "CdBd", "NTLMSSP", @@ -508,8 +508,6 @@ static NTSTATUS ntlmssp_client_challenge(struct ntlmssp_client_state *ntlmssp_st session_key = data_blob(NULL, 16); SMBsesskeygen_ntv1(nt_hash, NULL, session_key.data); } - - data_blob_free(&challenge_blob); /* this generates the actual auth packet */ if (!msrpc_gen(next_request, auth_gen_string, @@ -520,7 +518,7 @@ static NTSTATUS ntlmssp_client_challenge(struct ntlmssp_client_state *ntlmssp_st ntlmssp_state->domain, ntlmssp_state->user, ntlmssp_state->get_global_myname(), - datagram_sess_key, 0, + datagram_sess_key, 16, ntlmssp_state->neg_flags)) { data_blob_free(&lm_response); @@ -529,9 +527,14 @@ static NTSTATUS ntlmssp_client_challenge(struct ntlmssp_client_state *ntlmssp_st return NT_STATUS_NO_MEMORY; } - data_blob_free(&lm_response); - data_blob_free(&nt_response); + data_blob_free(&ntlmssp_state->chal); + data_blob_free(&ntlmssp_state->lm_resp); + data_blob_free(&ntlmssp_state->nt_resp); + data_blob_free(&ntlmssp_state->session_key); + ntlmssp_state->chal = challenge_blob; + ntlmssp_state->lm_resp = lm_response; + ntlmssp_state->nt_resp = nt_response; ntlmssp_state->session_key = session_key; return NT_STATUS_MORE_PROCESSING_REQUIRED; @@ -558,10 +561,12 @@ NTSTATUS ntlmssp_client_start(NTLMSSP_CLIENT_STATE **ntlmssp_state) (*ntlmssp_state)->unicode = True; (*ntlmssp_state)->neg_flags = - NTLMSSP_NEGOTIATE_128 | + NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_REQUEST_TARGET; + (*ntlmssp_state)->ref_count = 1; + return NT_STATUS_OK; } @@ -569,8 +574,16 @@ NTSTATUS ntlmssp_client_end(NTLMSSP_CLIENT_STATE **ntlmssp_state) { TALLOC_CTX *mem_ctx = (*ntlmssp_state)->mem_ctx; - data_blob_free(&(*ntlmssp_state)->session_key); - talloc_destroy(mem_ctx); + (*ntlmssp_state)->ref_count--; + + if ((*ntlmssp_state)->ref_count == 0) { + data_blob_free(&(*ntlmssp_state)->chal); + data_blob_free(&(*ntlmssp_state)->lm_resp); + data_blob_free(&(*ntlmssp_state)->nt_resp); + data_blob_free(&(*ntlmssp_state)->session_key); + talloc_destroy(mem_ctx); + } + *ntlmssp_state = NULL; return NT_STATUS_OK; } diff --git a/source3/libsmb/ntlmssp_sign.c b/source3/libsmb/ntlmssp_sign.c new file mode 100644 index 0000000000..f51d532319 --- /dev/null +++ b/source3/libsmb/ntlmssp_sign.c @@ -0,0 +1,208 @@ +/* + * Unix SMB/CIFS implementation. + * Version 3.0 + * NTLMSSP Signing routines + * Copyright (C) Luke Kenneth Casson Leighton 1996-2001 + * Copyright (C) Andrew Bartlett 2003 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "includes.h" + +#define CLI_SIGN "session key to client-to-server signing key magic constant" +#define CLI_SEAL "session key to client-to-server sealing key magic constant" +#define SRV_SIGN "session key to server-to-client signing key magic constant" +#define SRV_SEAL "session key to server-to-client sealing key magic constant" + +static void NTLMSSPcalc_ap( unsigned char *hash, unsigned char *data, int len) +{ + unsigned char index_i = hash[256]; + unsigned char index_j = hash[257]; + int ind; + + for (ind = 0; ind < len; ind++) + { + unsigned char tc; + unsigned char t; + + index_i++; + index_j += hash[index_i]; + + tc = hash[index_i]; + hash[index_i] = hash[index_j]; + hash[index_j] = tc; + + t = hash[index_i] + hash[index_j]; + data[ind] = data[ind] ^ hash[t]; + } + + hash[256] = index_i; + hash[257] = index_j; +} + +static void calc_hash(unsigned char *hash, const char *k2, int k2l) +{ + unsigned char j = 0; + int ind; + + for (ind = 0; ind < 256; ind++) + { + hash[ind] = (unsigned char)ind; + } + + for (ind = 0; ind < 256; ind++) + { + unsigned char tc; + + j += (hash[ind] + k2[ind%k2l]); + + tc = hash[ind]; + hash[ind] = hash[j]; + hash[j] = tc; + } + + hash[256] = 0; + hash[257] = 0; +} + +static void calc_ntlmv2_hash(unsigned char hash[16], char digest[16], + const char encrypted_response[16], + const char *constant) +{ + struct MD5Context ctx3; + + MD5Init(&ctx3); + MD5Update(&ctx3, encrypted_response, 5); + MD5Update(&ctx3, constant, strlen(constant)); + MD5Final(digest, &ctx3); + + calc_hash(hash, digest, 16); +} + +static NTSTATUS ntlmssp_make_packet_signiture(NTLMSSP_CLIENT_STATE *ntlmssp_state, + const uchar *data, size_t length, + DATA_BLOB *sig) +{ + if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) { + HMACMD5Context ctx; + char seq_num[4]; + uchar digest[16]; + SIVAL(seq_num, 0, &ntlmssp_state->ntlmssp_seq_num); + + hmac_md5_init_limK_to_64(ntlmssp_state->cli_sign_const, 16, &ctx); + hmac_md5_update(seq_num, 4, &ctx); + hmac_md5_update(data, length, &ctx); + hmac_md5_final(digest, &ctx); + + if (!msrpc_gen(sig, "Bd", digest, sizeof(digest), ntlmssp_state->ntlmssp_seq_num)) { + return NT_STATUS_NO_MEMORY; + } + + NTLMSSPcalc_ap(ntlmssp_state->cli_seal_hash, sig->data, sig->length); + } else { + uint32 crc; + crc = crc32_calc_buffer(data, length); + if (!msrpc_gen(sig, "ddd", 0, crc, ntlmssp_state->ntlmssp_seq_num)) { + return NT_STATUS_NO_MEMORY; + } + + NTLMSSPcalc_ap(ntlmssp_state->ntlmssp_hash, sig->data, sig->length); + } + return NT_STATUS_OK; +} + +NTSTATUS ntlmssp_client_sign_packet(NTLMSSP_CLIENT_STATE *ntlmssp_state, + const uchar *data, size_t length, + DATA_BLOB *sig) +{ + ntlmssp_state->ntlmssp_seq_num++; + return ntlmssp_make_packet_signiture(ntlmssp_state, data, length, sig); +} + +/** + * Check the signature of an incoming packet + * @note caller *must* check that the signature is the size it expects + * + */ + +NTSTATUS ntlmssp_client_check_packet(NTLMSSP_CLIENT_STATE *ntlmssp_state, + const uchar *data, size_t length, + const DATA_BLOB *sig) +{ + DATA_BLOB local_sig; + NTSTATUS nt_status; + + if (sig->length < 8) { + DEBUG(0, ("NTLMSSP packet check failed due to short signiture (%u bytes)!\n", + sig->length)); + } + + nt_status = ntlmssp_make_packet_signiture(ntlmssp_state, data, + length, &local_sig); + + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(0, ("NTLMSSP packet check failed with %s\n", nt_errstr(nt_status))); + return nt_status; + } + + if (memcmp(sig->data, local_sig.data, MIN(sig->length, local_sig.length)) == 0) { + return NT_STATUS_OK; + } else { + DEBUG(0, ("NTLMSSP packet check failed due to invalid signiture!\n")); + return NT_STATUS_ACCESS_DENIED; + } +} + +/** + Initialise the state for NTLMSSP signing. +*/ +NTSTATUS ntlmssp_client_sign_init(NTLMSSP_CLIENT_STATE *ntlmssp_state) +{ + unsigned char p24[24]; + unsigned char lm_hash[16]; + + if (!ntlmssp_state->lm_resp.data) { + /* can't sign or check signitures yet */ + return NT_STATUS_UNSUCCESSFUL; + } + + E_deshash(ntlmssp_state->password, lm_hash); + + NTLMSSPOWFencrypt(lm_hash, ntlmssp_state->lm_resp.data, p24); + + if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) + { + calc_ntlmv2_hash(ntlmssp_state->cli_sign_hash, ntlmssp_state->cli_sign_const, p24, CLI_SIGN); + calc_ntlmv2_hash(ntlmssp_state->cli_seal_hash, ntlmssp_state->cli_seal_const, p24, CLI_SEAL); + calc_ntlmv2_hash(ntlmssp_state->srv_sign_hash, ntlmssp_state->srv_sign_const, p24, SRV_SIGN); + calc_ntlmv2_hash(ntlmssp_state->srv_seal_hash, ntlmssp_state->srv_seal_const, p24, SRV_SEAL); + } + else + { + char k2[8]; + memcpy(k2, p24, 5); + k2[5] = 0xe5; + k2[6] = 0x38; + k2[7] = 0xb0; + + calc_hash(ntlmssp_state->ntlmssp_hash, k2, 8); + } + + ntlmssp_state->ntlmssp_seq_num = 0; + + ZERO_STRUCT(lm_hash); + return NT_STATUS_OK; +} diff --git a/source3/libsmb/smb_signing.c b/source3/libsmb/smb_signing.c index 581d18fef7..40359c5c8c 100644 --- a/source3/libsmb/smb_signing.c +++ b/source3/libsmb/smb_signing.c @@ -33,6 +33,11 @@ struct smb_basic_signing_context { static BOOL set_smb_signing_common(struct cli_state *cli) { + if (!cli->sign_info.negotiated_smb_signing + && !cli->sign_info.mandetory_signing) { + return False; + } + if (cli->sign_info.doing_signing) { return False; } @@ -40,7 +45,7 @@ static BOOL set_smb_signing_common(struct cli_state *cli) if (cli->sign_info.free_signing_context) cli->sign_info.free_signing_context(cli); - /* These calls are INCONPATIBLE with SMB signing */ + /* These calls are INCOMPATIBLE with SMB signing */ cli->readbraw_supported = False; cli->writebraw_supported = False; @@ -54,7 +59,7 @@ static BOOL set_smb_signing_common(struct cli_state *cli) static BOOL set_smb_signing_real_common(struct cli_state *cli) { if (cli->sign_info.mandetory_signing) { - DEBUG(5, ("Mandetory SMB signing enabled!\n")); + DEBUG(5, ("Mandatory SMB signing enabled!\n")); cli->sign_info.doing_signing = True; } @@ -71,6 +76,28 @@ static void mark_packet_signed(struct cli_state *cli) SSVAL(cli->outbuf,smb_flg2, flags2); } +static BOOL signing_good(struct cli_state *cli, BOOL good) +{ + DEBUG(10, ("got SMB signature of\n")); + dump_data(10,&cli->outbuf[smb_ss_field] , 8); + + if (good && !cli->sign_info.doing_signing) { + cli->sign_info.doing_signing = True; + } + + if (!good) { + if (cli->sign_info.doing_signing) { + DEBUG(1, ("SMB signature check failed!\n")); + return False; + } else { + DEBUG(3, ("Server did not sign reply correctly\n")); + cli_free_signing_context(cli); + return False; + } + } + return True; +} + /*********************************************************** SMB signing - Simple implementation - calculate a MAC to send. ************************************************************/ @@ -99,7 +126,7 @@ static void cli_simple_sign_outgoing_message(struct cli_state *cli) MD5Update(&md5_ctx, cli->outbuf + 4, smb_len(cli->outbuf)); MD5Final(calc_md5_mac, &md5_ctx); - DEBUG(10, ("sent SMB signiture of\n")); + DEBUG(10, ("sent SMB signature of\n")); dump_data(10, calc_md5_mac, 8); memcpy(&cli->outbuf[smb_ss_field], calc_md5_mac, 8); @@ -130,7 +157,7 @@ static BOOL cli_simple_check_incoming_message(struct cli_state *cli) memcpy(server_sent_mac, &cli->inbuf[smb_ss_field], sizeof(server_sent_mac)); - DEBUG(10, ("got SMB signiture of\n")); + DEBUG(10, ("got SMB signature of\n")); dump_data(10, server_sent_mac, 8); SIVAL(cli->inbuf, smb_ss_field, data->reply_seq_num); @@ -145,15 +172,7 @@ static BOOL cli_simple_check_incoming_message(struct cli_state *cli) good = (memcmp(server_sent_mac, calc_md5_mac, 8) == 0); - if (good && !cli->sign_info.doing_signing) { - cli->sign_info.doing_signing = True; - } - - if (!good) { - DEBUG(1, ("SMB signiture check failed!\n")); - } - - return good; + return signing_good(cli, good); } /*********************************************************** @@ -174,16 +193,16 @@ static void cli_simple_free_signing_context(struct cli_state *cli) SMB signing - Simple implementation - setup the MAC key. ************************************************************/ -void cli_simple_set_signing(struct cli_state *cli, const uchar user_session_key[16], const DATA_BLOB response) +BOOL cli_simple_set_signing(struct cli_state *cli, const uchar user_session_key[16], const DATA_BLOB response) { struct smb_basic_signing_context *data; if (!set_smb_signing_common(cli)) { - return; + return False; } if (!set_smb_signing_real_common(cli)) { - return; + return False; } data = smb_xmalloc(sizeof(*data)); @@ -194,12 +213,105 @@ void cli_simple_set_signing(struct cli_state *cli, const uchar user_session_key[ memcpy(&data->mac_key.data[0], user_session_key, 16); memcpy(&data->mac_key.data[16],response.data, MIN(response.length, 40 - 16)); - /* Initialise the sequence number */ + /* Initialize the sequence number */ data->send_seq_num = 0; cli->sign_info.sign_outgoing_message = cli_simple_sign_outgoing_message; cli->sign_info.check_incoming_message = cli_simple_check_incoming_message; cli->sign_info.free_signing_context = cli_simple_free_signing_context; + + return True; +} + +/*********************************************************** + SMB signing - NTLMSSP implementation - calculate a MAC to send. +************************************************************/ + +static void cli_ntlmssp_sign_outgoing_message(struct cli_state *cli) +{ + NTSTATUS nt_status; + DATA_BLOB sig; + NTLMSSP_CLIENT_STATE *ntlmssp_state = cli->sign_info.signing_context; + + /* mark the packet as signed - BEFORE we sign it...*/ + mark_packet_signed(cli); + + nt_status = ntlmssp_client_sign_packet(ntlmssp_state, cli->outbuf + 4, + smb_len(cli->outbuf), &sig); + + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(0, ("NTLMSSP signing failed with %s\n", nt_errstr(nt_status))); + return; + } + + DEBUG(10, ("sent SMB signature of\n")); + dump_data(10, sig.data, MIN(sig.length, 8)); + memcpy(&cli->outbuf[smb_ss_field], sig.data, MIN(sig.length, 8)); + + data_blob_free(&sig); +} + +/*********************************************************** + SMB signing - NTLMSSP implementation - check a MAC sent by server. +************************************************************/ + +static BOOL cli_ntlmssp_check_incoming_message(struct cli_state *cli) +{ + BOOL good; + NTSTATUS nt_status; + DATA_BLOB sig = data_blob(&cli->outbuf[smb_ss_field], 8); + + NTLMSSP_CLIENT_STATE *ntlmssp_state = cli->sign_info.signing_context; + + nt_status = ntlmssp_client_check_packet(ntlmssp_state, cli->outbuf + 4, + smb_len(cli->outbuf), &sig); + + data_blob_free(&sig); + + good = NT_STATUS_IS_OK(nt_status); + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(5, ("NTLMSSP signing failed with %s\n", nt_errstr(nt_status))); + } + + return signing_good(cli, good); +} + +/*********************************************************** + SMB signing - NTLMSSP implementation - free signing context +************************************************************/ + +static void cli_ntlmssp_free_signing_context(struct cli_state *cli) +{ + ntlmssp_client_end((NTLMSSP_CLIENT_STATE **)&cli->sign_info.signing_context); +} + +/*********************************************************** + SMB signing - NTLMSSP implementation - setup the MAC key. +************************************************************/ + +BOOL cli_ntlmssp_set_signing(struct cli_state *cli, + NTLMSSP_CLIENT_STATE *ntlmssp_state) +{ + if (!set_smb_signing_common(cli)) { + return False; + } + + if (!NT_STATUS_IS_OK(ntlmssp_client_sign_init(ntlmssp_state))) { + return False; + } + + if (!set_smb_signing_real_common(cli)) { + return False; + } + + cli->sign_info.signing_context = ntlmssp_state; + ntlmssp_state->ref_count++; + + cli->sign_info.sign_outgoing_message = cli_ntlmssp_sign_outgoing_message; + cli->sign_info.check_incoming_message = cli_ntlmssp_check_incoming_message; + cli->sign_info.free_signing_context = cli_ntlmssp_free_signing_context; + + return True; } /*********************************************************** @@ -210,7 +322,7 @@ static void cli_null_sign_outgoing_message(struct cli_state *cli) { /* we can't zero out the sig, as we might be trying to send a session request - which is NBT-level, not SMB level and doesn't - have the feild */ + have the field */ return; } @@ -232,23 +344,24 @@ static void cli_null_free_signing_context(struct cli_state *cli) return; } -/*********************************************************** +/** SMB signing - NULL implementation - setup the MAC key. -************************************************************/ -void cli_null_set_signing(struct cli_state *cli) + @note Used as an initialisation only - it will not correctly + shut down a real signing mechinism +*/ + +BOOL cli_null_set_signing(struct cli_state *cli) { struct smb_basic_sign_data *data; - if (!set_smb_signing_common(cli)) { - return; - } - cli->sign_info.signing_context = NULL; cli->sign_info.sign_outgoing_message = cli_null_sign_outgoing_message; cli->sign_info.check_incoming_message = cli_null_check_incoming_message; cli->sign_info.free_signing_context = cli_null_free_signing_context; + + return True; } /*********************************************************** @@ -257,7 +370,12 @@ void cli_null_set_signing(struct cli_state *cli) static void cli_temp_sign_outgoing_message(struct cli_state *cli) { - memcpy(&cli->outbuf[smb_ss_field], "SignRequest", 8); + /* mark the packet as signed - BEFORE we sign it...*/ + mark_packet_signed(cli); + + /* I wonder what BSRSPYL stands for - but this is what MS + actually sends! */ + memcpy(&cli->outbuf[smb_ss_field], "BSRSPYL ", 8); return; } @@ -283,10 +401,10 @@ static void cli_temp_free_signing_context(struct cli_state *cli) SMB signing - NULL implementation - setup the MAC key. ************************************************************/ -void cli_temp_set_signing(struct cli_state *cli) +BOOL cli_temp_set_signing(struct cli_state *cli) { if (!set_smb_signing_common(cli)) { - return; + return False; } cli->sign_info.signing_context = NULL; @@ -294,6 +412,8 @@ void cli_temp_set_signing(struct cli_state *cli) cli->sign_info.sign_outgoing_message = cli_temp_sign_outgoing_message; cli->sign_info.check_incoming_message = cli_temp_check_incoming_message; cli->sign_info.free_signing_context = cli_temp_free_signing_context; + + return True; } /** @@ -309,7 +429,7 @@ void cli_free_signing_context(struct cli_state *cli) } /** - * Sign a packet with the current mechinism + * Sign a packet with the current mechanism */ void cli_caclulate_sign_mac(struct cli_state *cli) @@ -318,7 +438,7 @@ void cli_caclulate_sign_mac(struct cli_state *cli) } /** - * Check a packet with the current mechinism + * Check a packet with the current mechanism * @return False if we had an established signing connection * which had a back checksum, True otherwise */ -- cgit From 190708832c7aa10b03bab8c48077faca486c539d Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 10 Mar 2003 02:48:32 +0000 Subject: Makefile.in for NTLMSSP singing update (This used to be commit 7717555438e4d74bb63d12abde3573933c15342a) --- source3/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index 23c88d3ab1..3ae939c4f5 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -192,7 +192,7 @@ SECRETS_OBJ = passdb/secrets.o LIBNMB_OBJ = libsmb/unexpected.o libsmb/namecache.o libsmb/nmblib.o \ libsmb/namequery.o -LIBNTLMSSP_OBJ = libsmb/ntlmssp.o libsmb/ntlmssp_parse.o +LIBNTLMSSP_OBJ = libsmb/ntlmssp.o libsmb/ntlmssp_parse.o libsmb/ntlmssp_sign.o LIBSAMBA_OBJ = libsmb/nterr.o libsmb/smbdes.o libsmb/smbencrypt.o -- cgit From 44bd743c286405cad0b10149ff5e116fc21e8322 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 10 Mar 2003 02:49:52 +0000 Subject: added -i option for ignoring dot errors in masktest (This used to be commit 0f4d1172a6add3f490fca22a45975d2588485146) --- source3/torture/masktest.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source3/torture/masktest.c b/source3/torture/masktest.c index 7d751fb789..06dead3f16 100644 --- a/source3/torture/masktest.c +++ b/source3/torture/masktest.c @@ -33,6 +33,7 @@ static const char *filechars = "abcdefghijklm."; static int verbose; static int die_on_error; static int NumLoops = 0; +static int ignore_dot_errors = 0; /* a test fn for LANMAN mask support */ int ms_fnmatch_lanman_core(const char *pattern, const char *string) @@ -324,7 +325,9 @@ static void testpair(struct cli_state *cli, char *mask, char *file) res2 = reg_test(cli, mask, long_name, short_name); - if (showall || strcmp(res1, res2)) { + if (showall || + ((strcmp(res1, res2) && !ignore_dot_errors) || + (strcmp(res1+2, res2+2) && ignore_dot_errors))) { DEBUG(0,("%s %s %d mask=[%s] file=[%s] rfile=[%s/%s]\n", res1, res2, count, mask, file, long_name, short_name)); if (die_on_error) exit(1); @@ -409,6 +412,7 @@ static void usage(void) -v verbose mode\n\ -E die on error\n\ -a show all tests\n\ + -i ignore . and .. errors\n\ \n\ This program tests wildcard matching between two servers. It generates\n\ random pairs of filenames/masks and tests that they match in the same\n\ @@ -461,7 +465,7 @@ static void usage(void) seed = time(NULL); - while ((opt = getopt(argc, argv, "n:d:U:s:hm:f:aoW:M:vE")) != EOF) { + while ((opt = getopt(argc, argv, "n:d:U:s:hm:f:aoW:M:vEi")) != EOF) { switch (opt) { case 'n': NumLoops = atoi(optarg); @@ -472,6 +476,9 @@ static void usage(void) case 'E': die_on_error = 1; break; + case 'i': + ignore_dot_errors = 1; + break; case 'v': verbose++; break; -- cgit From 8dd9e99f37c984f94e9ebc2005e3806c9bb43767 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 10 Mar 2003 02:51:30 +0000 Subject: fixed use_oplocks and the timeout in smbtorture startup (This used to be commit cec1ef09e5009cdac22e6c9ca101a49c5ef36b1a) --- source3/torture/torture.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/source3/torture/torture.c b/source3/torture/torture.c index ca4dbed1d8..090f08c160 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -150,15 +150,25 @@ BOOL torture_open_connection(struct cli_state **c) { BOOL retry; int flags = 0; + NTSTATUS status; + if (use_kerberos) flags |= CLI_FULL_CONNECTION_USE_KERBEROS; - return (NT_STATUS_IS_OK( - cli_full_connection(c, myname, - host, NULL, port_to_use, - share, "?????", - username, workgroup, - password, flags, &retry))); + status = cli_full_connection(c, myname, + host, NULL, port_to_use, + share, "?????", + username, workgroup, + password, flags, &retry); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + if (use_oplocks) (*c)->use_oplocks = True; + if (use_level_II_oplocks) (*c)->use_level_II_oplocks = True; + (*c)->timeout = 120000; /* set a really long timeout (2 minutes) */ + + return True; } -- cgit From fba0a720353c113e7aedc6fb7e90f0aff938a8fb Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Mon, 10 Mar 2003 03:04:47 +0000 Subject: Use "$@" to preserve shell quoting in case somebody passes an escaped string as a configure parameter. (This used to be commit 3285c80cb0e41d6736b4f74b01a65d55753a7920) --- source3/configure.developer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/configure.developer b/source3/configure.developer index 0409a75061..a7074acfd3 100755 --- a/source3/configure.developer +++ b/source3/configure.developer @@ -1,2 +1,2 @@ #!/bin/sh -`dirname $0`/configure --enable-developer $* +`dirname $0`/configure --enable-developer "$@" -- cgit From 8cad904f385dfe25e6dffe39a773641d02ed2776 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 10 Mar 2003 12:08:32 +0000 Subject: Don't segfault on make_server_info_guest() failure - instead return the error code. make_server_info_guest() requires an entry in the SAM at the moment, but this will change before release. Andrew Bartlett (This used to be commit 6a956390fa253e87e38b3f1909f13595fbf2767a) --- source3/smbd/sesssetup.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index dfe246e398..2661fe3f93 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -39,16 +39,14 @@ static NTSTATUS do_map_to_guest(NTSTATUS status, auth_serversupplied_info **serv (lp_map_to_guest() == MAP_TO_GUEST_ON_BAD_PASSWORD)) { DEBUG(3,("No such user %s [%s] - using guest account\n", user, domain)); - make_server_info_guest(server_info); - status = NT_STATUS_OK; + status = make_server_info_guest(server_info); } } if (NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) { if (lp_map_to_guest() == MAP_TO_GUEST_ON_BAD_PASSWORD) { DEBUG(3,("Registered username %s for guest access\n",user)); - make_server_info_guest(server_info); - status = NT_STATUS_OK; + status = make_server_info_guest(server_info); } } -- cgit From 683c17ac0dfce64e7cfcafbc640b18ea4610f021 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 10 Mar 2003 15:05:06 +0000 Subject: check a pointer before dereferencing it; not sure why userdata == NULL though (This used to be commit 6fca29ddcdb111af24ee051b555ab4eec8cadd1d) --- source3/nmbd/nmbd_browsesync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/nmbd/nmbd_browsesync.c b/source3/nmbd/nmbd_browsesync.c index 84c6f43f57..5914ea9637 100644 --- a/source3/nmbd/nmbd_browsesync.c +++ b/source3/nmbd/nmbd_browsesync.c @@ -258,7 +258,7 @@ static void domain_master_node_status_fail(struct subnet_record *subrec, { dbgtext( "domain_master_node_status_fail:\n" ); dbgtext( "Doing a node status request to the domain master browser\n" ); - dbgtext( "for workgroup %s ", userdata->data ); + dbgtext( "for workgroup %s ", userdata ? userdata->data : "NULL" ); dbgtext( "at IP %s failed.\n", inet_ntoa(rrec->packet->ip) ); dbgtext( "Cannot sync browser lists.\n" ); } -- cgit From 06c4d9a8ff4373227ba6a418b8af627aaddbc4d0 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 10 Mar 2003 16:59:29 +0000 Subject: Some conversion to pstrcpy_base. Volker (This used to be commit 329911e43681b724cb0579aad77b4a658759d7ba) --- source3/libsmb/clirap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source3/libsmb/clirap.c b/source3/libsmb/clirap.c index 24108d40f3..a1845b2e16 100644 --- a/source3/libsmb/clirap.c +++ b/source3/libsmb/clirap.c @@ -85,19 +85,19 @@ BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation) p = param; SSVAL(p,0,132); /* api number */ p += 2; - pstrcpy(p,"OOWb54WrLh"); + pstrcpy_base(p,"OOWb54WrLh",param); p = skip_string(p,1); - pstrcpy(p,"WB21BWDWWDDDDDDDzzzD"); + pstrcpy_base(p,"WB21BWDWWDDDDDDDzzzD",param); p = skip_string(p,1); SSVAL(p,0,1); p += 2; - pstrcpy(p,user); + pstrcpy_base(p,user,param); strupper(p); p += 21; p++; p += 15; p++; - pstrcpy(p, workstation); + pstrcpy_base(p, workstation, param); strupper(p); p += 16; SSVAL(p, 0, CLI_BUFFER_SIZE); @@ -145,9 +145,9 @@ int cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, co p = param; SSVAL(p,0,0); /* api number */ p += 2; - pstrcpy(p,"WrLeh"); + pstrcpy_base(p,"WrLeh",param); p = skip_string(p,1); - pstrcpy(p,"B13BWz"); + pstrcpy_base(p,"B13BWz",param); p = skip_string(p,1); SSVAL(p,0,1); /* -- cgit From 2e3f9c35d5c16bfe8cf78374f699abe9ed56b4ca Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 11 Mar 2003 00:14:55 +0000 Subject: Patch from Ronan Waide: > when doing "enumdomusers", rpcclient prints each one preceded by the > word "group" instead of "user" (This used to be commit 17567dd1d510d4cf1dffa67be78510ae51571ec6) --- source3/rpcclient/cmd_samr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index cec6b1680b..95ea27562e 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -684,7 +684,7 @@ static NTSTATUS cmd_samr_enum_dom_users(struct cli_state *cli, NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES)) { for (i = 0; i < num_dom_users; i++) - printf("group:[%s] rid:[0x%x]\n", + printf("user:[%s] rid:[0x%x]\n", dom_users[i], dom_rids[i]); } -- cgit From dcf7cad4bff3797fd2c606f6225a4ed68b0a3c51 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 11 Mar 2003 02:30:17 +0000 Subject: Remove obsolete file. (This used to be commit c5c1a7979385778c08d6dd7796cfe8be1815992f) --- source3/nsswitch/README | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 source3/nsswitch/README diff --git a/source3/nsswitch/README b/source3/nsswitch/README deleted file mode 100644 index 9f0c581df6..0000000000 --- a/source3/nsswitch/README +++ /dev/null @@ -1,13 +0,0 @@ -This extension provides a "wins" module for NSS on glibc2/Linux. This -allows you to use a WINS entry in /etc/nsswitch.conf for hostname -resolution, allowing you to resolve netbios names via start unix -gethostbyname() calls. The end result is that you can use netbios -names as host names in unix apps. - -1) run configure -2) run "make nsswitch" -3) cp nsswitch/libnss_wins.so /lib/libnss_wins.so.2 -4) add a wins entry to the hosts line in /etc/nsswitch.conf -5) use it - -tridge@linuxcare.com -- cgit From ee28d38fbc5639140478e51cc33ec0a312d785da Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 11 Mar 2003 04:21:14 +0000 Subject: When opening an existing DB, don't require the hash_size specified to the open call to be the same as that of the existing tdb. The specified hash_size is only used if the tdb needs to be (re)created. With this patch in place, tdbtool can open the printing tdbs, which are created with a hash_size of 5000. Before it would fail with EIO. (This used to be commit e412dd6d7e5a41de94c07c64b186390ccce104cc) --- source3/tdb/tdb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source3/tdb/tdb.c b/source3/tdb/tdb.c index 097209ff7a..0ec770ed81 100644 --- a/source3/tdb/tdb.c +++ b/source3/tdb/tdb.c @@ -1728,8 +1728,7 @@ TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags, if (read(tdb->fd, &tdb->header, sizeof(tdb->header)) != sizeof(tdb->header) || strcmp(tdb->header.magic_food, TDB_MAGIC_FOOD) != 0 - || tdb->header.version != TDB_VERSION - || (tdb->header.hash_size != hash_size + || (tdb->header.version != TDB_VERSION && !(rev = (tdb->header.version==TDB_BYTEREV(TDB_VERSION))))) { /* its not a valid database - possibly initialise it */ if (!(open_flags & O_CREAT) || tdb_new_database(tdb, hash_size) == -1) { -- cgit From cca61adcd242b96a1cf3c3b6528fd23a4998c2c3 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 11 Mar 2003 05:57:53 +0000 Subject: If using --enable-developer and valgrind.h is present, define VALGRIND. (This used to be commit 71c8e90117f00f168416f2f35a1c25755e2d0ed4) --- source3/include/includes.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source3/include/includes.h b/source3/include/includes.h index 297f38ae97..7e5ad0e3cd 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -438,6 +438,14 @@ #include #endif +/* If we have --enable-developer and the valgrind header is present, + * then we're OK to use it. Set a macro so this logic can be done only + * once. */ +#if defined(DEVELOPER) && HAVE_VALGRIND_H +#define VALGRIND +#endif + + /* we support ADS if we want it and have krb5 and ldap libs */ #if defined(WITH_ADS) && defined(HAVE_KRB5) && defined(HAVE_LDAP) #define HAVE_ADS -- cgit From c13990277f1ab2e6810ada193caa720f6e71f087 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 11 Mar 2003 06:31:23 +0000 Subject: make sure we have an empty directory when we start the utable test (This used to be commit af415842b80f024ca26b4e3bc52fd73fce0a28f3) --- source3/torture/utable.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source3/torture/utable.c b/source3/torture/utable.c index d9c1fcbafd..d8a1557dbb 100644 --- a/source3/torture/utable.c +++ b/source3/torture/utable.c @@ -129,8 +129,12 @@ BOOL torture_casetable(int dummy) memset(equiv, 0, sizeof(equiv)); - cli_mkdir(cli, "\\utable"); cli_unlink(cli, "\\utable\\*"); + cli_rmdir(cli, "\\utable"); + if (!cli_mkdir(cli, "\\utable")) { + printf("Failed to create utable directory!\n"); + return False; + } for (c=1; c < 0x10000; c++) { size_t size; -- cgit From 191b44b91c628d2647a1e1355508c2eafa59535f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 11 Mar 2003 06:53:10 +0000 Subject: fixed the MANGLE smbtorture test with the new paranoid string code (This used to be commit 7be44dbe009a8d831c0720a2649fc871b067beef) --- source3/torture/mangle_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/torture/mangle_test.c b/source3/torture/mangle_test.c index 86030027ba..d1475eb64e 100644 --- a/source3/torture/mangle_test.c +++ b/source3/torture/mangle_test.c @@ -135,7 +135,7 @@ static void gen_name(char *name) /* and a medium probability of a common lead string */ if (random() % 10 == 0) { - strncpy(p, "ABCDE", 5); + strncpy(p, "ABCDE", 6); } /* and a high probability of a good extension length */ -- cgit From 538c832ba147caa4c5f66439022ecb11ee2e5335 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 11 Mar 2003 06:53:44 +0000 Subject: having sticky create times is not a bug (This used to be commit f283f71104319fa9f1e7d22fc91b8d7224ae157a) --- source3/torture/torture.c | 1 - 1 file changed, 1 deletion(-) diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 090f08c160..327212c6be 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -2130,7 +2130,6 @@ static BOOL run_trans2test(int dummy) printf("create time=%s", ctime(&c_time)); printf("modify time=%s", ctime(&m_time)); printf("This system appears to have sticky create times\n"); - correct = False; } if (a_time % (60*60) == 0) { printf("access time=%s", ctime(&a_time)); -- cgit From 6f7ac2dcab02a0babf4c18e6fe1d1697943bddfc Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 11 Mar 2003 07:23:43 +0000 Subject: Note about using Valgrind with tdbs. (This used to be commit 36c6f67d4af50d8fc4c8bd54486df315861d55c2) --- source3/tdb/tdb.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/source3/tdb/tdb.c b/source3/tdb/tdb.c index 0ec770ed81..ab50f40ef6 100644 --- a/source3/tdb/tdb.c +++ b/source3/tdb/tdb.c @@ -20,6 +20,27 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +/* NOTE: If you use tdbs under valgrind, and in particular if you run + * tdbtorture, you may get spurious "uninitialized value" warnings. I + * think this is because valgrind doesn't understand that the mmap'd + * area may be written to by other processes. Memory can, from the + * point of view of the grinded process, spontaneously become + * initialized. + * + * I can think of a few solutions. [mbp 20030311] + * + * 1 - Write suppressions for Valgrind so that it doesn't complain + * about this. Probably the most reasonable but people need to + * remember to use them. + * + * 2 - Use IO not mmap when running under valgrind. Not so nice. + * + * 3 - Use the special valgrind macros to mark memory as valid at the + * right time. Probably too hard -- the process just doesn't know. + */ + #ifdef STANDALONE #if HAVE_CONFIG_H #include -- cgit From 2e01ef5957bcdecb057d94122529b7cbd7f40ec2 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 11 Mar 2003 07:25:48 +0000 Subject: Remove valgrind_strlen function, hopefully no longer needed with recent Valgrind relases and clashing with -DVALGRIND. (This used to be commit 98479f1315cf8968152e1566966ac57e171008c3) --- source3/include/includes.h | 4 ---- source3/lib/util_str.c | 9 --------- source3/tdb/tdbbackup.c | 10 ---------- 3 files changed, 23 deletions(-) diff --git a/source3/include/includes.h b/source3/include/includes.h index 7e5ad0e3cd..b6abdd99ce 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -1220,10 +1220,6 @@ int smb_xvasprintf(char **ptr, const char *format, va_list ap) PRINTF_ATTRIBUTE( time_t timegm(struct tm *tm); #endif -#if defined(VALGRIND) -#define strlen(x) valgrind_strlen(x) -#endif - /* * Veritas File System. Often in addition to native. * Quotas different. diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 924cf9d921..7dd5ee4242 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -1667,12 +1667,3 @@ char * base64_encode_data_blob(DATA_BLOB data) return result; } -#ifdef VALGRIND -size_t valgrind_strlen(const char *s) -{ - size_t count; - for(count = 0; *s++; count++) - ; - return count; -} -#endif diff --git a/source3/tdb/tdbbackup.c b/source3/tdb/tdbbackup.c index 7b344de6c4..36ba7db918 100644 --- a/source3/tdb/tdbbackup.c +++ b/source3/tdb/tdbbackup.c @@ -303,13 +303,3 @@ static void usage(void) return ret; } - -#ifdef VALGRIND -size_t valgrind_strlen(const char *s) -{ - size_t count; - for(count = 0; *s++; count++) - ; - return count; -} -#endif -- cgit From d40890e6a05badaac4b41979890a17ef1e69b5f7 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Tue, 11 Mar 2003 09:16:37 +0000 Subject: This is how combination of domain logons and security parameter best combine. Comments wellcome. Simo. (This used to be commit e1431424e7603d946f63cfe7fe669b0b32ac8095) --- source3/param/loadparm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index f7f12bbe80..2a83905a9f 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -3804,14 +3804,14 @@ static void set_server_role(void) switch (lp_security()) { case SEC_SHARE: + case SEC_SERVER: + case SEC_ADS: if (lp_domain_logons()) DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n")); break; - case SEC_SERVER: case SEC_DOMAIN: - case SEC_ADS: if (lp_domain_logons()) { - server_role = ROLE_DOMAIN_PDC; + server_role = ROLE_DOMAIN_BDC; break; } server_role = ROLE_DOMAIN_MEMBER; -- cgit From da6266f4f18b3406676372c6632d3b8199aaa420 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 11 Mar 2003 10:06:34 +0000 Subject: After 'consultation' with idra, this is how I think the server roles should work... Andrew Bartlett (This used to be commit 5c1f1005907bf50b809dfae1f8251c7122103098) --- source3/param/loadparm.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 2a83905a9f..5bffa2c862 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -3804,18 +3804,23 @@ static void set_server_role(void) switch (lp_security()) { case SEC_SHARE: - case SEC_SERVER: - case SEC_ADS: if (lp_domain_logons()) DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n")); break; - case SEC_DOMAIN: + case SEC_SERVER: + if (lp_domain_logons()) + DEBUG(0, ("Server's Role (logon server) conflicts with server-level security\n")); + break; + case SEC_ADS: if (lp_domain_logons()) { - server_role = ROLE_DOMAIN_BDC; + server_role = ROLE_DOMAIN_PDC; break; } server_role = ROLE_DOMAIN_MEMBER; break; + case SEC_DOMAIN: + if (lp_domain_logons()) + DEBUG(0, ("Server's Role (logon server) NOT ADVISED with domain-level security\n")); case SEC_USER: if (lp_domain_logons()) { -- cgit From 60a8e3c20c24b6150946d7b6f348e8e5b050ed94 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 11 Mar 2003 10:13:57 +0000 Subject: Some further tought on the server role issue - try not to break it compeatly. Andrew Bartlett (This used to be commit 4c6a2d8d28d1752d7fee52d253ce2829bd0a0671) --- source3/param/loadparm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 5bffa2c862..7d0208fb85 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -3810,6 +3810,12 @@ static void set_server_role(void) case SEC_SERVER: if (lp_domain_logons()) DEBUG(0, ("Server's Role (logon server) conflicts with server-level security\n")); + server_role = ROLE_DOMAIN_MEMBER; + break; + case SEC_DOMAIN: + if (lp_domain_logons()) + DEBUG(0, ("Server's Role (logon server) NOT ADVISED with domain-level security\n")); + server_role = ROLE_DOMAIN_MEMBER; break; case SEC_ADS: if (lp_domain_logons()) { @@ -3818,9 +3824,6 @@ static void set_server_role(void) } server_role = ROLE_DOMAIN_MEMBER; break; - case SEC_DOMAIN: - if (lp_domain_logons()) - DEBUG(0, ("Server's Role (logon server) NOT ADVISED with domain-level security\n")); case SEC_USER: if (lp_domain_logons()) { -- cgit From 17030fc403feb3ce5097d088ecf992e8b684d81a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 11 Mar 2003 10:53:46 +0000 Subject: security=domain and domain logons = yes should be a BDC (of sorts). Matches 2.2 Andrew Bartlett (This used to be commit f6497fd639c5bb7d61eda0286c4c3c38609933b0) --- source3/param/loadparm.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 7d0208fb85..c21b88ff20 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -3813,8 +3813,11 @@ static void set_server_role(void) server_role = ROLE_DOMAIN_MEMBER; break; case SEC_DOMAIN: - if (lp_domain_logons()) - DEBUG(0, ("Server's Role (logon server) NOT ADVISED with domain-level security\n")); + if (lp_domain_logons()) { + DEBUG(1, ("Server's Role (logon server) NOT ADVISED with domain-level security\n")); + server_role = ROLE_DOMAIN_BDC; + break; + } server_role = ROLE_DOMAIN_MEMBER; break; case SEC_ADS: -- cgit From 3b580ff000d9f258c581efded52d5d7c55375173 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 11 Mar 2003 11:28:59 +0000 Subject: This patch attemptes to clean up winbindd's mutex locking. The current locking scheme in winbind is a complete mess - indeed, the next step should be to push the locking into cli_full_connection(), but I'll leave it for now. This patch works on the noted behaviour that 2 parts of the connection process need protection - and independent protection. Tim Potter did some work on this a little while back, verifying the second case. The two cases are: - between connect() and first session setup - during the auth2 phase of the netlogon pipe setup. I've removed the counter on the lock, as I fail to see what it gains us. This patch also adds 'anonymous fallback' to our winbindd -> DC connection. If the authenticated connection fails (wbinfo -A specifed) - say that account isn't trusted by a trusted DC - then we try an anonymous. Both tpot and mbp like the patch. Andrew Bartlett (This used to be commit 0620320002082298a15cbba72bd79aecfc607947) --- source3/lib/server_mutex.c | 6 ++-- source3/nsswitch/winbindd_cm.c | 78 ++++++++++++++++++++---------------------- source3/passdb/secrets.c | 30 ++++------------ 3 files changed, 46 insertions(+), 68 deletions(-) diff --git a/source3/lib/server_mutex.c b/source3/lib/server_mutex.c index 878e5497d8..3e5512c734 100644 --- a/source3/lib/server_mutex.c +++ b/source3/lib/server_mutex.c @@ -30,8 +30,6 @@ like the single-connection that NT makes. */ static char *mutex_server_name; -/* FIXME. ref_count should be allocated per name... JRA. */ -size_t ref_count; BOOL grab_server_mutex(const char *name) { @@ -40,7 +38,7 @@ BOOL grab_server_mutex(const char *name) DEBUG(0,("grab_server_mutex: malloc failed for %s\n", name)); return False; } - if (!secrets_named_mutex(mutex_server_name, 10, &ref_count)) { + if (!secrets_named_mutex(mutex_server_name, 10)) { DEBUG(10,("grab_server_mutex: failed for %s\n", name)); SAFE_FREE(mutex_server_name); return False; @@ -52,7 +50,7 @@ BOOL grab_server_mutex(const char *name) void release_server_mutex(void) { if (mutex_server_name) { - secrets_named_mutex_release(mutex_server_name, &ref_count); + secrets_named_mutex_release(mutex_server_name); SAFE_FREE(mutex_server_name); } } diff --git a/source3/nsswitch/winbindd_cm.c b/source3/nsswitch/winbindd_cm.c index 54096c0c1d..1b49d8ce01 100644 --- a/source3/nsswitch/winbindd_cm.c +++ b/source3/nsswitch/winbindd_cm.c @@ -302,7 +302,7 @@ static void add_failed_connection_entry(struct winbindd_cm_conn *new_conn, /* Open a connction to the remote server, cache failures for 30 seconds */ static NTSTATUS cm_open_connection(const char *domain, const int pipe_index, - struct winbindd_cm_conn *new_conn, BOOL keep_mutex) + struct winbindd_cm_conn *new_conn) { struct failed_connection_cache *fcc; NTSTATUS result; @@ -310,7 +310,6 @@ static NTSTATUS cm_open_connection(const char *domain, const int pipe_index, struct in_addr dc_ip; int i; BOOL retry = True; - BOOL got_mutex = False; ZERO_STRUCT(dc_ip); @@ -366,24 +365,21 @@ static NTSTATUS cm_open_connection(const char *domain, const int pipe_index, new_conn->controller, global_myname(), ipc_domain, ipc_username)); for (i = 0; retry && (i < 3); i++) { - - if (!secrets_named_mutex(new_conn->controller, WINBIND_SERVER_MUTEX_WAIT_TIME, &new_conn->mutex_ref_count)) { + BOOL got_mutex; + if (!(got_mutex = secrets_named_mutex(new_conn->controller, WINBIND_SERVER_MUTEX_WAIT_TIME))) { DEBUG(0,("cm_open_connection: mutex grab failed for %s\n", new_conn->controller)); result = NT_STATUS_POSSIBLE_DEADLOCK; continue; } - - got_mutex = True; - + result = cli_full_connection(&new_conn->cli, global_myname(), new_conn->controller, - &dc_ip, 0, "IPC$", "IPC", ipc_username, ipc_domain, - ipc_password, 0, &retry); + &dc_ip, 0, "IPC$", "IPC", ipc_username, ipc_domain, + ipc_password, CLI_FULL_CONNECTION_ANNONYMOUS_FALLBACK, &retry); + + secrets_named_mutex_release(new_conn->controller); if (NT_STATUS_IS_OK(result)) break; - - secrets_named_mutex_release(new_conn->controller, &new_conn->mutex_ref_count); - got_mutex = False; } SAFE_FREE(ipc_username); @@ -391,8 +387,6 @@ static NTSTATUS cm_open_connection(const char *domain, const int pipe_index, SAFE_FREE(ipc_password); if (!NT_STATUS_IS_OK(result)) { - if (got_mutex) - secrets_named_mutex_release(new_conn->controller, &new_conn->mutex_ref_count); add_failed_connection_entry(new_conn, result); return result; } @@ -407,16 +401,12 @@ static NTSTATUS cm_open_connection(const char *domain, const int pipe_index, * if the PDC is an NT4 box. but since there is only one 2k * specific UUID right now, i'm not going to bother. --jerry */ - if (got_mutex) - secrets_named_mutex_release(new_conn->controller, &new_conn->mutex_ref_count); if ( !is_win2k_pipe(pipe_index) ) add_failed_connection_entry(new_conn, result); cli_shutdown(new_conn->cli); return result; } - if ((got_mutex) && !keep_mutex) - secrets_named_mutex_release(new_conn->controller, &new_conn->mutex_ref_count); return NT_STATUS_OK; } @@ -455,7 +445,7 @@ static BOOL connection_ok(struct winbindd_cm_conn *conn) /* Get a connection to the remote DC and open the pipe. If there is already a connection, use that */ static NTSTATUS get_connection_from_cache(const char *domain, const char *pipe_name, - struct winbindd_cm_conn **conn_out, BOOL keep_mutex) + struct winbindd_cm_conn **conn_out) { struct winbindd_cm_conn *conn, conn_temp; NTSTATUS result; @@ -472,12 +462,6 @@ static NTSTATUS get_connection_from_cache(const char *domain, const char *pipe_n SAFE_FREE(conn); conn = &conn_temp; /* Just to keep the loop moving */ } else { - if (keep_mutex) { - if (!secrets_named_mutex(conn->controller, - WINBIND_SERVER_MUTEX_WAIT_TIME, &conn->mutex_ref_count)) - DEBUG(0,("get_connection_from_cache: mutex grab failed for %s\n", - conn->controller)); - } break; } } @@ -489,7 +473,7 @@ static NTSTATUS get_connection_from_cache(const char *domain, const char *pipe_n ZERO_STRUCTP(conn); - if (!NT_STATUS_IS_OK(result = cm_open_connection(domain, get_pipe_index(pipe_name), conn, keep_mutex))) { + if (!NT_STATUS_IS_OK(result = cm_open_connection(domain, get_pipe_index(pipe_name), conn))) { DEBUG(3, ("Could not open a connection to %s for %s (%s)\n", domain, pipe_name, nt_errstr(result))); SAFE_FREE(conn); @@ -517,7 +501,7 @@ BOOL cm_check_for_native_mode_win2k( const char *domain ) ZERO_STRUCT( ctr ); - if ( !NT_STATUS_IS_OK(result = cm_open_connection(domain, PI_LSARPC_DS, &conn, False)) ) { + if ( !NT_STATUS_IS_OK(result = cm_open_connection(domain, PI_LSARPC_DS, &conn)) ) { DEBUG(5, ("cm_check_for_native_mode_win2k: Could not open a connection to %s for PIPE_LSARPC (%s)\n", domain, nt_errstr(result))); return False; @@ -555,7 +539,7 @@ CLI_POLICY_HND *cm_get_lsa_handle(const char *domain) /* Look for existing connections */ - if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_LSARPC, &conn, False))) + if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_LSARPC, &conn))) return NULL; /* This *shitty* code needs scrapping ! JRA */ @@ -571,7 +555,7 @@ CLI_POLICY_HND *cm_get_lsa_handle(const char *domain) if (!NT_STATUS_IS_OK(result)) { /* Hit the cache code again. This cleans out the old connection and gets a new one */ if (conn->cli->fd == -1) { /* Try again, if the remote host disapeared */ - if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_LSARPC, &conn, False))) + if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_LSARPC, &conn))) return NULL; result = cli_lsa_open_policy(conn->cli, conn->cli->mem_ctx, False, @@ -603,7 +587,7 @@ CLI_POLICY_HND *cm_get_sam_handle(char *domain) /* Look for existing connections */ - if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_SAMR, &conn, False))) + if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_SAMR, &conn))) return NULL; /* This *shitty* code needs scrapping ! JRA */ @@ -618,7 +602,7 @@ CLI_POLICY_HND *cm_get_sam_handle(char *domain) if (!NT_STATUS_IS_OK(result)) { /* Hit the cache code again. This cleans out the old connection and gets a new one */ if (conn->cli->fd == -1) { /* Try again, if the remote host disapeared */ - if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_SAMR, &conn, False))) + if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_SAMR, &conn))) return NULL; result = cli_samr_connect(conn->cli, conn->cli->mem_ctx, @@ -875,35 +859,47 @@ NTSTATUS cm_get_netlogon_cli(const char *domain, const unsigned char *trust_pass NTSTATUS result = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; struct winbindd_cm_conn *conn; uint32 neg_flags = 0x000001ff; + fstring lock_name; + BOOL got_mutex; if (!cli) return NT_STATUS_INVALID_PARAMETER; /* Open an initial conection - keep the mutex. */ - if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_NETLOGON, &conn, True))) + if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_NETLOGON, &conn))) return result; - result = cli_nt_setup_creds(conn->cli, get_sec_chan(), trust_passwd, &neg_flags, 2); - - if (conn->mutex_ref_count) - secrets_named_mutex_release(conn->controller, &conn->mutex_ref_count); + snprintf(lock_name, sizeof(lock_name), "NETLOGON\\%s", conn->controller); + if (!(got_mutex = secrets_named_mutex(lock_name, WINBIND_SERVER_MUTEX_WAIT_TIME))) { + DEBUG(0,("cm_get_netlogon_cli: mutex grab failed for %s\n", conn->controller)); + } + + result = cli_nt_setup_creds(conn->cli, get_sec_chan(), trust_passwd, &neg_flags, 2); + + if (got_mutex) + secrets_named_mutex_release(lock_name); + if (!NT_STATUS_IS_OK(result)) { DEBUG(0, ("error connecting to domain password server: %s\n", nt_errstr(result))); /* Hit the cache code again. This cleans out the old connection and gets a new one */ if (conn->cli->fd == -1) { - - if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_NETLOGON, &conn, True))) + if (!NT_STATUS_IS_OK(result = get_connection_from_cache(domain, PIPE_NETLOGON, &conn))) return result; + snprintf(lock_name, sizeof(lock_name), "NETLOGON\\%s", conn->controller); + if (!(got_mutex = secrets_named_mutex(lock_name, WINBIND_SERVER_MUTEX_WAIT_TIME))) { + DEBUG(0,("cm_get_netlogon_cli: mutex grab failed for %s\n", conn->controller)); + } + /* Try again */ result = cli_nt_setup_creds( conn->cli, get_sec_chan(),trust_passwd, &neg_flags, 2); - - if (conn->mutex_ref_count) - secrets_named_mutex_release(conn->controller, &conn->mutex_ref_count); + + if (got_mutex) + secrets_named_mutex_release(lock_name); } if (!NT_STATUS_IS_OK(result)) { diff --git a/source3/passdb/secrets.c b/source3/passdb/secrets.c index a58ea492ea..2b944a9941 100644 --- a/source3/passdb/secrets.c +++ b/source3/passdb/secrets.c @@ -588,24 +588,17 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in between smbd instances. *******************************************************************************/ -BOOL secrets_named_mutex(const char *name, unsigned int timeout, size_t *p_ref_count) +BOOL secrets_named_mutex(const char *name, unsigned int timeout) { - size_t ref_count = *p_ref_count; int ret = 0; if (!message_init()) return False; - if (ref_count == 0) { - ret = tdb_lock_bystring(tdb, name, timeout); - if (ret == 0) - DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name )); - } + ret = tdb_lock_bystring(tdb, name, timeout); + if (ret == 0) + DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name )); - if (ret == 0) { - *p_ref_count = ++ref_count; - DEBUG(10,("secrets_named_mutex: ref_count for mutex %s = %u\n", name, (unsigned int)ref_count )); - } return (ret == 0); } @@ -613,19 +606,10 @@ BOOL secrets_named_mutex(const char *name, unsigned int timeout, size_t *p_ref_c Unlock a named mutex. *******************************************************************************/ -void secrets_named_mutex_release(const char *name, size_t *p_ref_count) +void secrets_named_mutex_release(const char *name) { - size_t ref_count = *p_ref_count; - - SMB_ASSERT(ref_count != 0); - - if (ref_count == 1) { - tdb_unlock_bystring(tdb, name); - DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name )); - } - - *p_ref_count = --ref_count; - DEBUG(10,("secrets_named_mutex_release: ref_count for mutex %s = %u\n", name, (unsigned int)ref_count )); + tdb_unlock_bystring(tdb, name); + DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name )); } /********************************************************* -- cgit From 77916f652fba812287541ab0d6a5ed203852cd3d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 11 Mar 2003 18:10:36 +0000 Subject: Fix up zero termination. Spotted by Sebastian Krahmer . Jeremy. (This used to be commit 69becdb563b2620513931811a6695481bebcceed) --- source3/smbd/quotas.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/smbd/quotas.c b/source3/smbd/quotas.c index 9d3bfe2d64..c2f001423e 100644 --- a/source3/smbd/quotas.c +++ b/source3/smbd/quotas.c @@ -413,10 +413,11 @@ static BOOL nfs_quotas(char *nfspath, uid_t euser_id, SMB_BIG_UINT *bsize, SMB_B len=strcspn(mnttype, ":"); pathname=strstr(mnttype, ":"); - cutstr = (char *) malloc(sizeof(char) * len ); + cutstr = (char *) malloc(len+1); if (!cutstr) return False; + memset(cutstr, '\0', len+1); host = strncat(cutstr,mnttype, sizeof(char) * len ); DEBUG(5,("nfs_quotas: looking for mount on \"%s\"\n", cutstr)); DEBUG(5,("nfs_quotas: of path \"%s\"\n", mnttype)); -- cgit From 0a2d131a35e4e73409ebb6c146308cb3f9c17a93 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 11 Mar 2003 20:57:41 +0000 Subject: We use unsigned now, so use %u. Jeremy. (This used to be commit 01727b0296ee407e49444b9d9c4e7993892cb537) --- source3/smbd/ipc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c index da30ec7440..c8bb0c2505 100644 --- a/source3/smbd/ipc.c +++ b/source3/smbd/ipc.c @@ -508,7 +508,7 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int } - DEBUG(3,("trans <%s> data=%d params=%d setup=%d\n", + DEBUG(3,("trans <%s> data=%u params=%u setup=%u\n", name,tdscnt,tpscnt,suwcnt)); /* -- cgit From a16b155fc92e7802d17d1ed27b8dc832fa7e531f Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 02:57:48 +0000 Subject: Add example of string overflow which is now caught in developer mode. (This used to be commit dcf1705782f5d589120624c90b695b81a0332e6b) --- source3/torture/t_stringoverflow.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 source3/torture/t_stringoverflow.c diff --git a/source3/torture/t_stringoverflow.c b/source3/torture/t_stringoverflow.c new file mode 100644 index 0000000000..b0503adb8f --- /dev/null +++ b/source3/torture/t_stringoverflow.c @@ -0,0 +1,16 @@ +#include "includes.h" + + int main(void) +{ + fstring dest; + + printf("running on valgrind? %d\n", RUNNING_ON_VALGRIND); + + /* Try copying a string into an fstring buffer. The string + * will actually fit, but this is still wrong because you + * can't pstrcpy into an fstring. This should trap in a + * developer build. */ + pstrcpy(dest, "hello"); + + return 0; +} -- cgit From 9a63d8bc2af36386bd863dcda8d749cc9f29bb47 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 02:58:45 +0000 Subject: Update usage message. (This used to be commit 17f01f6959fb79ba11a56d6869ec9789e3ee2f74) --- source3/torture/t_strcmp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/torture/t_strcmp.c b/source3/torture/t_strcmp.c index 622769001b..b510d64cf0 100644 --- a/source3/torture/t_strcmp.c +++ b/source3/torture/t_strcmp.c @@ -9,7 +9,8 @@ int main(int argc, char *argv[]) { if (argc != 3) { - fprintf(stderr, "usage: %s STRING1 STRING2\nCompares two strings\n", + fprintf(stderr, "usage: %s STRING1 STRING2\n" + "Compares two strings, prints the results of StrCaseCmp\n", argv[0]); return 2; } -- cgit From ffd5eae60eaae186d93f37537cc3cb4d5d446c83 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 03:04:37 +0000 Subject: Start importing the Python testing framework that Tim and I have been working on into the main Samba tree. (This used to be commit f3b77aae13df2559a81db6453d04e0fe8004cd52) --- source3/stf/README.stf | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 source3/stf/README.stf diff --git a/source3/stf/README.stf b/source3/stf/README.stf new file mode 100644 index 0000000000..3fbd33cb6c --- /dev/null +++ b/source3/stf/README.stf @@ -0,0 +1,3 @@ +This directory contains the Samba Testing Framework, a Python-based +system for exercising Samba in various ways. It is quite small at the +moment. -- cgit From 57b68013e170e290292cf23bb2259dfb09259d2d Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 03:06:42 +0000 Subject: Import ComfyChair framework from trunk. (This used to be commit a7fb1fcc72ffe3cc2aa9c5abfcbd8197e7610167) --- source3/stf/comfychair.py | 266 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 source3/stf/comfychair.py diff --git a/source3/stf/comfychair.py b/source3/stf/comfychair.py new file mode 100644 index 0000000000..00b2262b26 --- /dev/null +++ b/source3/stf/comfychair.py @@ -0,0 +1,266 @@ +#! /usr/bin/env python + +# Copyright (C) 2002, 2003 by Martin Pool +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA + +"""comfychair: a Python-based instrument of software torture. + +Copyright (C) 2002, 2003 by Martin Pool + +This is a test framework designed for testing programs written in +Python, or (through a fork/exec interface) any other language. It is +similar in design to the very nice 'svntest' system used by +Subversion, but has no Subversion-specific features. + +It is somewhat similar to PyUnit, except: + + - it allows capture of detailed log messages from a test, to be + optionally displayed if the test fails. + + - it allows execution of a specified subset of tests + + - it avoids Java idioms that are not so useful in Python + +WRITING TESTS: + + Each test case is a callable object, typically a function. Its + documentation string describes the test, and the first line of the + docstring should be a brief name. + + The test should return 0 for pass, or non-zero for failure. + Alternatively they may raise an exception. + + Tests may import this "comfychair" module to get some useful + utilities, but that is not strictly required. + +""" + +# TODO: Put everything into a temporary directory? + +# TODO: Have a means for tests to customize the display of their +# failure messages. In particular, if a shell command failed, then +# give its stderr. + +import sys, re + +class TestCase: + """A base class for tests. This class defines required functions which + can optionally be overridden by subclasses. It also provides some + utility functions for""" + + def __init__(self): + self.test_log = "" + self.background_pids = [] + + def setUp(self): + """Set up test fixture.""" + pass + + def tearDown(self): + """Tear down test fixture.""" + pass + + def runTest(self): + """Run the test.""" + pass + + def fail(self, reason = ""): + """Say the test failed.""" + raise AssertionError(reason) + + def assert_(self, expr, reason = ""): + if not expr: + raise AssertionError(reason) + + def assert_re_match(self, pattern, s): + """Assert that a string matches a particular pattern + + Inputs: + pattern string: regular expression + s string: to be matched + + Raises: + AssertionError if not matched + """ + if not re.match(pattern, s): + raise AssertionError("string %s does not match regexp %s" % (`s`, `pattern`)) + + def assert_regexp(self, pattern, s): + """Assert that a string *contains* a particular pattern + + Inputs: + pattern string: regular expression + s string: to be searched + + Raises: + AssertionError if not matched + """ + if not re.search(pattern, s): + raise AssertionError("string %s does not contain regexp %s" % (`s`, `pattern`)) + + + def assert_no_file(self, filename): + import os.path + assert not os.path.exists(filename), ("file exists but should not: %s" % filename) + + + def runCmdNoWait(self, cmd): + import os + name = cmd[0] + self.test_log = self.test_log + "Run in background:\n" + `cmd` + "\n" + pid = os.spawnvp(os.P_NOWAIT, name, cmd) + self.test_log = self.test_log + "pid: %d\n" % pid + return pid + + + def runCmd(self, cmd, expectedResult = 0): + """Run a command, fail if the command returns an unexpected exit + code. Return the output produced.""" + rc, output = self.runCmdUnchecked(cmd) + if rc != expectedResult: + raise AssertionError("command returned %d; expected %s: \"%s\"" % + (rc, expectedResult, cmd)) + + return output + + def runCmdUnchecked(self, cmd, skip_on_noexec = 0): + """Invoke a command; return (exitcode, stdout)""" + import os, popen2 + pobj = popen2.Popen4(cmd) + output = pobj.fromchild.read() + waitstatus = pobj.wait() + assert not os.WIFSIGNALED(waitstatus), \ + ("%s terminated with signal %d", cmd, os.WTERMSIG(waitstatus)) + rc = os.WEXITSTATUS(waitstatus) + self.test_log = self.test_log + ("""Run command: %s +Wait status: %#x +Output: +%s""" % (cmd, waitstatus, output)) + if skip_on_noexec and rc == 127: + # Either we could not execute the command or the command + # returned exit code 127. According to system(3) we can't + # tell the difference. + raise NotRunError, "could not execute %s" % cmd + return rc, output + + def explainFailure(self, exc_info = None): + import traceback + # Move along, nothing to see here + if not exc_info and self.test_log == "": + return + print "-----------------------------------------------------------------" + if exc_info: + traceback.print_exc(file=sys.stdout) + print self.test_log + print "-----------------------------------------------------------------" + + def require(self, predicate, message): + """Check a predicate for running this test. + +If the predicate value is not true, the test is skipped with a message explaining +why.""" + if not predicate: + raise NotRunError, message + + def require_root(self): + """Skip this test unless run by root.""" + import os + self.require(os.getuid() == 0, + "must be root to run this test") + + def log(self, msg): + """Log a message to the test log. This message is displayed if + the test fails, or when the runtests function is invoked with + the verbose option.""" + self.test_log = self.test_log + msg + "\n" + +class NotRunError(Exception): + def __init__(self, value = None): + self.value = value + +def test_name(test): + """Return a human-readable name for a test. + + Inputs: + test some kind of callable test object + + Returns: + name string: a short printable name + """ + try: + return test.__name__ + except: + return `test` + +def runtests(test_list, verbose = 0): + """Run a series of tests. + + Eventually, this routine will also examine sys.argv[] to handle + extra options. + + Inputs: + test_list sequence of callable test objects + + Returns: + unix return code: 0 for success, 1 for failures, 2 for test failure + """ + import traceback + ret = 0 + for test in test_list: + print "%-60s" % test_name(test), + # flush now so that long running tests are easier to follow + sys.stdout.flush() + + try: + try: # run test and show result + obj = test() + if hasattr(obj, "setUp"): + obj.setUp() + obj.runTest() + print "OK" + except KeyboardInterrupt: + print "INTERRUPT" + obj.explainFailure(sys.exc_info()) + ret = 2 + break + except NotRunError, msg: + print "NOTRUN, %s" % msg.value + except: + print "FAIL" + obj.explainFailure(sys.exc_info()) + ret = 1 + finally: + try: + if hasattr(obj, "tearDown"): + obj.tearDown() + except KeyboardInterrupt: + print "interrupted during tearDown" + obj.explainFailure(sys.exc_info()) + ret = 2 + break + except: + print "error during tearDown" + obj.explainFailure(sys.exc_info()) + ret = 1 + # Display log file if we're verbose + if ret == 0 and verbose: + obj.explainFailure() + + return ret + +if __name__ == '__main__': + print __doc__ -- cgit From 053435a8febdd12b240db752ca83b0833f8c1909 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 03:07:46 +0000 Subject: Import design notes by martin and tpot from ComfyChair and stf modules. (This used to be commit f923729ca37c18fd58943015a530607c05e96659) --- source3/stf/notes.txt | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 source3/stf/notes.txt diff --git a/source3/stf/notes.txt b/source3/stf/notes.txt new file mode 100644 index 0000000000..68aca63c23 --- /dev/null +++ b/source3/stf/notes.txt @@ -0,0 +1,175 @@ + -*- indented-text -*- + +(set lotus no) + + + +Notes on using comfychair with Samba (samba testing framework units): + +The tests need to rely on some external resources, such as + +If suitable resources are not available, need to skip particular +tests. Must include a message indicating what resources would be +needed to run that test. (e.g. must be root.) + +We want to be able to select and run particular subsets of tests, such +as "all winbind tests". + +We want to keep the number of configurable parameters down as much as +possible, to make it easy on people running the tests. + +Wherever possible, the tests should set up their preconditions, but a +few basic resources need to be provided by the people running the +tests. So for example, rather than asking the user for the name of a +non-root user, we should give the tests the administrator name and +password, and it can create a new user to use. + +This makes it simpler to get the tests running, and possible also +makes them more reproducible. + +In the future, rather than using NT machines provided by the test +person, we might have a way to drive VMWare non-persistent sessions, +to make tests even more tightly controlled. + + +Another design question is how to communicate this information to the +tests. If there's a lot of settings, then it might need to be stored +in a configuration file. + +However, if we succeed in cutting down the number of parameters, then +it might be straightforward to pass the information on the command +line or in an environment variable. + +Environment variables are probably better because they can't be seen +by other users, and they are more easily passed down through an +invocation of "make check". + + + +Notes on Samba Testing Framework for Unittests +---------------------------------------------- + +This is to be read after reading the notes.txt from comfychair. I'm +proposing a slightly more concrete description of what's described +there. + +The model of having tests require named resources looks useful for +incorporation into a framework that can be run by many people in +widely different environments. + +Some possible environments for running the test framework in are: + + - Casual downloader of Samba compiling from source and just wants + to run 'make check'. May only have one Unix machine and a + handful of clients. + + - Samba team member with access to a small number of other + machines or VMware sessions. + + - PSA developer who may not have intimate knowledge of Samba + internals and is only interested in testing against the PSA. + + - Non-team hacker wanting to run test suite after making small + hacks. + + - Build farm environment (loaner machine with no physical access + or root privilege). + + - HP BAT. + +Developers in most of these environments are also potential test case +authors. It should be easy for people unfamiliar with the framework +to write new tests and have them work. We should provide examples and +the existing tests should well written and understandable. + +Different types of tests: + + - Tests that check Samba internals and link against + libbigballofmud.so. For example: + + - Upper/lowercase string functions + - user_in_list() for large lists + + - Tests that use the Samba Python extensions. + + - Tests that execute Samba command line programs, for example + smbpasswd. + + - Tests that require other resources on the network such as domain + controllers or PSAs. + + - Tests that are performed on the documentation or the source code + such as: + + - grep for common spelling mistakes made by abartlet (-: + - grep for company copyright (IBM, HP) + + - Link to other existing testing frameworks (smbtorture, + abartlet's bash based build farm tests) + +I propose a TestResourceManager which would be instantiated by a test +case. The test case would require("resourcename") as part of its +constructor and raise a comfychair.NotRun exception if the resource +was not present. A TestResource class could be defined which could +read a configuration file or examine a environment variable and +register a resource only if some condition was satisfied. + +It would be nice to be able to completely separate the PSA testing +from the test framework. This would entail being able to define test +resources dynamically, possibly with a plugin type system. + +class TestResourceManager: + def __init__(self, name): + self.resources = {} + + def register(self, resource): + name = resource.name() + if self.resources.has_key(name): + raise "Test manager already has resource %s" % name + self.resources[name] = resource + + def require(self, resource_name): + if not self.resources.has_key(resource_name): + raise "Test manager does not have resources %s" % resource_name + +class TestResource: + def __init__(self, name): + self.name = name + + def name(self): + return self.name + +import os + +trm = TestResourceManager() + +if os.getuid() == 0: + trm.register(TestResource("root")) + +A config-o-matic Python module can take a list of machines and +administrator%password entries and classify them by operating system +version and service pack. These resources would be registered with +the TestResourceManager. + +Some random thoughts about named resources for network servers: + +require("nt4.sp3") +require("nt4.domaincontroller") +require("psa") + +Some kind of format for location of passwords, libraries: + +require("exec(smbpasswd)") +require("lib(bigballofmud)") + +maybe require("exec.smbpasswd") looks nicer... + +The require() function could return a dictionary of configuration +information or some handle to fetch dynamic information on. We may +need to create and destroy extra users or print queues. How to manage +cleanup of dynamic resources? + +Requirements for running stf: + + - Python, obviously + - Samba python extensions -- cgit From eb4ea93ac3a1bc1bb395ee0d74d72b08b3fe8190 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 03:08:28 +0000 Subject: Import Samba Testing Framework code from private CVS module. (This used to be commit 0effe832a48f0c51d50675558cc2744e815d68c7) --- source3/stf/osver.py | 55 ++++++++++ source3/stf/spoolss.py | 288 +++++++++++++++++++++++++++++++++++++++++++++++++ source3/stf/stf.py | 101 +++++++++++++++++ source3/stf/test.py | 28 +++++ 4 files changed, 472 insertions(+) create mode 100755 source3/stf/osver.py create mode 100755 source3/stf/spoolss.py create mode 100755 source3/stf/stf.py create mode 100755 source3/stf/test.py diff --git a/source3/stf/osver.py b/source3/stf/osver.py new file mode 100755 index 0000000000..68601fa7bb --- /dev/null +++ b/source3/stf/osver.py @@ -0,0 +1,55 @@ +#!/usr/bin/python +# +# Utilities for determining the Windows operating system version remotely. +# + +from samba import srvsvc + +# Constants + +PLATFORM_UNKNOWN = 0 +PLATFORM_WIN9X = 1 +PLATFORM_NT4 = 2 +PLATFORM_NT5 = 3 # Windows 2000 + +def platform_name(platform_type): + + platform_names = { PLATFORM_UNKNOWN: "Unknown", + PLATFORM_WIN9X: "Windows 9x", + PLATFORM_NT4: "Windows NT", + PLATFORM_NT5: "Windows 2000" } + + if platform_names.has_key(platform_type): + return platform_names[platform_type] + + return "Unknown" + +def platform_type(info101): + """Determine the operating system type from a SRV_INFO_101.""" + + if info101['major_version'] == 4 and info101['minor_version'] == 0: + return PLATFORM_NT4 + + if info101['major_version'] == 5 and info101['minor_version'] == 0: + return PLATFORM_NT5 + + return PLATFORM_UNKNOWN + +def is_domain_controller(info101): + """Return true if the server_type field from a SRV_INFO_101 + indicates a domain controller.""" + return info101['server_type'] & srvsvc.SV_TYPE_DOMAIN_CTRL + +def os_version(name): + info = srvsvc.netservergetinfo("\\\\%s" % name, 101) + return platform_type(info) + +if __name__ == "__main__": + import sys + if len(sys.argv) != 2: + print "Usage: osver.py server" + sys.exit(0) + info = srvsvc.netservergetinfo("\\\\%s" % sys.argv[1], 101) + print "platform type = %d" % platform_type(info) + if is_domain_controller(info): + print "%s is a domain controller" % sys.argv[1] diff --git a/source3/stf/spoolss.py b/source3/stf/spoolss.py new file mode 100755 index 0000000000..735291508b --- /dev/null +++ b/source3/stf/spoolss.py @@ -0,0 +1,288 @@ +#!/usr/bin/python + +import re +import comfychair, stf +from samba import spoolss + +class PrintServerTest(comfychair.TestCase): + """An abstract class requiring a print server.""" + def setUp(self): + # TODO: create a test printer + self.server = stf.get_server(platform = "nt") + self.require(self.server != None, "print server required") + # TODO: remove hardcoded printer name + self.printername = "p" + self.uncname = "\\\\%s\\%s" % \ + (self.server["hostname"], self.printername) + +class W2kPrintServerTest(comfychair.TestCase): + """An abstract class requiring a print server.""" + def setUp(self): + # TODO: create a test printer + self.server = stf.get_server(platform = "nt5") + self.require(self.server != None, "print server required") + # TODO: remove hardcoded printer name + self.printername = "p" + self.uncname = "\\\\%s\\%s" % \ + (self.server["hostname"], self.printername) + +class CredentialTest(PrintServerTest): + """An class that calls a function with various sets of credentials.""" + def runTest(self): + + bad_user_creds = {"username": "spotty", + "domain": "dog", + "password": "bone"} + + cases = ((self.server["administrator"], "Admin credentials", 1), + (bad_user_creds, "Bad credentials", 0)) + + # TODO: add unpriv user case + + for creds, testname, result in cases: + try: + self.runTestArg(creds) + except: + if result: + import traceback + traceback.print_exc() + self.fail("rpc with creds %s failed when it " + "should have suceeded" % creds) + return + + if not result: + self.fail("rpc with creds %s suceeded when it should " + "have failed" % creds) + +class ArgTestServer(PrintServerTest): + """Test a RPC that takes a UNC print server name.""" + def runTest(self): + + # List of test cases, %s substituted for server name + + cases = (("", "No server name", 0), + ("\\\\%s", "Valid server name", 1), + ("\\%s", "Invalid unc server name", 0), + ("\\\\%s__", "Invalid unc server name", 0)) + + for unc, testname, result in cases: + unc = re.sub("%s", self.server["hostname"], unc) + try: + self.runTestArg(unc) + except: + if result: + self.fail("rpc(\"%s\") failed when it should have " + "suceeded" % unc) + return + + if not result: + # Suceeded when we should have failed + self.fail("rpc(\"%s\") suceeded when it should have " + "failed" % unc) + +class ArgTestServerAndPrinter(ArgTestServer): + """Test a RPC that takes a UNC print server or UNC printer name.""" + def runTest(self): + + ArgTestServer.runTest(self) + + # List of test cases, %s substituted for server name, %p substituted + # for printer name. + + cases = (("\\\\%s\\%p", "Valid server and printer name", 1), + ("\\\\%s\\%p__", "Valid server, invalid printer name", 0), + ("\\\\%s__\\%p", "Invalid server, valid printer name", 0)) + + for unc, testname, result in cases: + unc = re.sub("%s", self.server["hostname"], unc) + unc = re.sub("%p", self.printername, unc) + try: + self.runTestArg(unc) + except: + if result: + self.fail("openprinter(\"%s\") failed when it should have " + "suceeded" % unc) + return + + if not result: + # Suceeded when we should have failed + self.fail("openprinter(\"%s\") suceeded when it should have " + "failed" % unc) + +class OpenPrinterArg(ArgTestServerAndPrinter): + """Test the OpenPrinter RPC with combinations of valid and invalid + server and printer names.""" + def runTestArg(self, unc): + spoolss.openprinter(unc) + +class OpenPrinterCred(CredentialTest): + """Test opening printer with good and bad credentials.""" + def runTestArg(self, creds): + spoolss.openprinter(self.uncname, creds = creds) + +class ClosePrinter(PrintServerTest): + """Test the ClosePrinter RPC on a printer handle.""" + def runTest(self): + hnd = spoolss.openprinter(self.uncname) + spoolss.closeprinter(hnd) + +class ClosePrinterServer(PrintServerTest): + """Test the ClosePrinter RPC on a print server handle.""" + def runTest(self): + hnd = spoolss.openprinter("\\\\%s" % self.server["hostname"]) + spoolss.closeprinter(hnd) + +class GetPrinterInfo(PrintServerTest): + """Retrieve printer info at various levels.""" + + # Sample printer data + + sample_info = { + 0: {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '\\\\win2kdc1', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': 1114112, 'name': '\\\\win2kdc1\\p', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 2, 'status': 1, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}, + 1: {'comment': "I'm a teapot!", 'level': 1, 'flags': 8388608, 'name': '\\\\win2kdc1\\p', 'description': '\\\\win2kdc1\\p,HP LaserJet 4,Canberra office'}, + 2: {'comment': "I'm a teapot!", 'status': 1, 'print_processor': 'WinPrint', 'until_time': 0, 'share_name': 'p', 'start_time': 0, 'device_mode': {'icm_method': 1, 'bits_per_pel': 0, 'log_pixels': 0, 'orientation': 1, 'panning_width': 0, 'color': 2, 'pels_width': 0, 'print_quality': 600, 'driver_version': 24, 'display_flags': 0, 'y_resolution': 600, 'media_type': 0, 'display_frequency': 0, 'icm_intent': 0, 'pels_height': 0, 'reserved1': 0, 'size': 220, 'scale': 100, 'dither_type': 0, 'panning_height': 0, 'default_source': 7, 'duplex': 1, 'fields': 16131, 'spec_version': 1025, 'copies': 1, 'device_name': '\\\\win2kdc1\\p', 'paper_size': 1, 'paper_length': 0, 'private': 'private', 'collate': 0, 'paper_width': 0, 'form_name': 'Letter', 'reserved2': 0, 'tt_option': 0}, 'port_name': 'LPT1:', 'sepfile': '', 'parameters': '', 'security_descriptor': {'group_sid': 'S-1-5-21-1606980848-1677128483-854245398-513', 'sacl': None, 'dacl': {'ace_list': [{'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-544'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-544'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1121'}, {'flags': 10, 'type': 0, 'mask': 131072, 'trustee': 'S-1-3-0'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-3-0'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1124'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-1-0'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-550'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-550'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-549'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-549'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1106'}], 'revision': 2}, 'owner_sid': 'S-1-5-32-544', 'revision': 1}, 'name': '\\\\win2kdc1\\p', 'server_name': '\\\\win2kdc1', 'level': 2, 'datatype': 'RAW', 'cjobs': 0, 'average_ppm': 0, 'priority': 1, 'driver_name': 'HP LaserJet 4', 'location': 'Canberra office', 'attributes': 8776, 'default_priority': 0}, + 3: {'flags': 4, 'security_descriptor': {'group_sid': 'S-1-5-21-1606980848-1677128483-854245398-513', 'sacl': None, 'dacl': {'ace_list': [{'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-544'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-544'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1121'}, {'flags': 10, 'type': 0, 'mask': 131072, 'trustee': 'S-1-3-0'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-3-0'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1124'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-1-0'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-550'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-550'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-549'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-549'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1106'}], 'revision': 2}, 'owner_sid': 'S-1-5-32-544', 'revision': 1}, 'level': 3} + } + + def runTest(self): + self.hnd = spoolss.openprinter(self.uncname) + + # Everyone should have getprinter levels 0-3 + + for i in (0, 1, 2, 3): + info = self.hnd.getprinter(level = i) + try: + stf.dict_check(self.sample_info[i], info) + except ValueError, msg: + raise "info%d: %s" % (i, msg) + +class EnumPrinters(PrintServerTest): + """Enumerate print info at various levels.""" + + sample_info = { + + 0: {'q': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': -1833435136, 'name': 'q', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 0, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}, 'p': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': -1831337984, 'name': 'p', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 1, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}, 'magpie': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': 1114112, 'name': 'magpie', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 0, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}}, + + 1: {'q': {'comment': 'cheepy birds', 'level': 1, 'flags': 8388608, 'name': 'q', 'description': 'q,HP LaserJet 4,'}, 'p': {'comment': "I'm a teapot!", 'level': 1, 'flags': 8388608, 'name': 'p', 'description': 'p,HP LaserJet 4,Canberra office'}, 'magpie': {'comment': '', 'level': 1, 'flags': 8388608, 'name': 'magpie', 'description': 'magpie,Generic / Text Only,'}} + } + + def runTest(self): + for i in (0, 1): + info = spoolss.enumprinters( + "\\\\%s" % self.server["hostname"], level = i) + try: + stf.dict_check(self.sample_info[i], info) + except ValueError, msg: + raise "info%d: %s" % (i, msg) + +class EnumPrintersArg(ArgTestServer): + def runTestArg(self, unc): + spoolss.enumprinters(unc) + +class EnumPrintersCred(CredentialTest): + """Test opening printer with good and bad credentials.""" + def runTestArg(self, creds): + spoolss.enumprinters( + "\\\\%s" % self.server["hostname"], creds = creds) + +class EnumPrinterdrivers(PrintServerTest): + + sample_info = { + 1: {'Okipage 10ex (PCL5E) : STANDARD': {'name': 'Okipage 10ex (PCL5E) : STANDARD', 'level': 1}, 'Generic / Text Only': {'name': 'Generic / Text Only', 'level': 1}, 'Brother HL-1030 series': {'name': 'Brother HL-1030 series', 'level': 1}, 'Brother HL-1240 series': {'name': 'Brother HL-1240 series', 'level': 1}, 'HP DeskJet 1220C Printer': {'name': 'HP DeskJet 1220C Printer', 'level': 1}, 'HP LaserJet 4100 PCL 6': {'name': 'HP LaserJet 4100 PCL 6', 'level': 1}, 'HP LaserJet 4': {'name': 'HP LaserJet 4', 'level': 1}}, + 2: {'Okipage 10ex (PCL5E) : STANDARD': {'version': 2, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\RASDDUI.DLL', 'name': 'Okipage 10ex (PCL5E) : STANDARD', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\2\\RASDD.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\OKIPAGE.DLL', 'level': 2, 'architecture': 'Windows NT x86'}, 'Generic / Text Only': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\UNIDRVUI.DLL', 'name': 'Generic / Text Only', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\UNIDRV.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\TTY.GPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'Brother HL-1030 series': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BRUHL99A.DLL', 'name': 'Brother HL-1030 series', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL99A.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL103.PPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'Brother HL-1240 series': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BRUHL99A.DLL', 'name': 'Brother HL-1240 series', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL99A.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL124.PPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP DeskJet 1220C Printer': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'name': 'HP DeskJet 1220C Printer', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP LaserJet 4100 PCL 6': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042E.DLL', 'name': 'HP LaserJet 4100 PCL 6', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042G.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042I.PMD', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP LaserJet 4': {'version': 2, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff0.dll', 'name': 'HP LaserJet 4', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff2.dll', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff39.pmd', 'level': 2, 'architecture': 'Windows NT x86'}} + } + + def runTest(self): + for i in (1, 2): + info = spoolss.enumprinterdrivers( + "\\\\%s" % self.server["hostname"], level = i) + try: + if not self.sample_info.has_key(i): + self.log("%s" % info) + self.fail() + stf.dict_check(self.sample_info[i], info) + except ValueError, msg: + raise "info%d: %s" % (i, msg) + +class EnumPrinterdriversArg(ArgTestServer): + def runTestArg(self, unc): + spoolss.enumprinterdrivers(unc) + +class EnumPrinterdriversCred(CredentialTest): + """Test opening printer with good and bad credentials.""" + def runTestArg(self, creds): + spoolss.enumprinterdrivers( + "\\\\%s" % self.server["hostname"], creds = creds) + +def usage(): + print "Usage: spoolss.py [options] [test1[,test2...]]" + print "\t -v/--verbose Display debugging information" + print "\t -l/--list-tests List available tests" + print + print "A list of comma separated test names or regular expressions" + print "can be used to filter the tests performed." + +def test_match(subtest_list, test_name): + """Return true if a test matches a comma separated list of regular + expression of test names.""" + # re.match does an implicit ^ at the start of the pattern. + # Explicitly anchor to end to avoid matching substrings. + for s in string.split(subtest_list, ","): + if re.match(s + "$", test_name): + return 1 + return 0 + +if __name__ == "__main__": + import os, sys, string + import getopt + + try: + opts, args = getopt.getopt(sys.argv[1:], "vl", \ + ["verbose", "list-tests"]) + except getopt.GetoptError: + usage() + sys.exit(0) + + verbose = 0 + list_tests = 0 + + for opt, arg in opts: + if opt in ("-v", "--verbose"): + verbose = 1 + if opt in ("-l", "--list-tests"): + list_tests = 1 + + if len(args) > 1: + usage() + sys.exit(0) + + test_list = [ + OpenPrinterArg, + OpenPrinterCred, + ClosePrinter, + ClosePrinterServer, + GetPrinterInfo, + EnumPrinters, + EnumPrintersCred, + EnumPrintersArg, + EnumPrinterdrivers, + EnumPrinterdriversCred, + EnumPrinterdriversArg, + ] + + if len(args): + t = [] + for test in test_list: + if test_match(args[0], test.__name__): + t.append(test) + test_list = t + + if os.environ.has_key("SAMBA_DEBUG"): + spoolss.setup_logging(interactive = 1) + spoolss.set_debuglevel(10) + + if list_tests: + for test in test_list: + print test.__name__ + else: + comfychair.runtests(test_list, verbose = verbose) diff --git a/source3/stf/stf.py b/source3/stf/stf.py new file mode 100755 index 0000000000..ee0ff73561 --- /dev/null +++ b/source3/stf/stf.py @@ -0,0 +1,101 @@ +#!/usr/bin/python +# +# Samba Testing Framework for Unit-testing +# + +import os, string, re +import osver + +def get_server_list_from_string(s): + + server_list = [] + + # Format is a list of server:domain\username%password separated + # by commas. + + for entry in string.split(s, ","): + + # Parse entry + + m = re.match("(.*):(.*)(\\\\|/)(.*)%(.*)", entry) + if not m: + raise "badly formed server list entry '%s'" % entry + + server = m.group(1) + domain = m.group(2) + username = m.group(4) + password = m.group(5) + + # Categorise servers + + server_list.append({"platform": osver.os_version(server), + "hostname": server, + "administrator": {"username": username, + "domain": domain, + "password" : password}}) + + return server_list + +def get_server_list(): + """Iterate through all sources of server info and append them all + in one big list.""" + + server_list = [] + + # The $STF_SERVERS environment variable + + if os.environ.has_key("STF_SERVERS"): + server_list = server_list + \ + get_server_list_from_string(os.environ["STF_SERVERS"]) + + return server_list + +def get_server(platform = None): + """Return configuration information for a server. The platform + argument can be a string either 'nt4' or 'nt5' for Windows NT or + Windows 2000 servers, or just 'nt' for Windows NT and higher.""" + + server_list = get_server_list() + + for server in server_list: + if platform: + p = server["platform"] + if platform == "nt": + if (p == osver.PLATFORM_NT4 or p == osver.PLATFORM_NT5): + return server + if platform == "nt4" and p == osver.PLATFORM_NT4: + return server + if platform == "nt5" and p == osver.PLATFORM_NT5: + return server + else: + # No filter defined, return first in list + return server + + return None + +def dict_check(sample_dict, real_dict): + """Check that real_dict contains all the keys present in sample_dict + and no extras. Also check that common keys are of them same type.""" + tmp = real_dict.copy() + for key in sample_dict.keys(): + # Check existing key and type + if not real_dict.has_key(key): + raise ValueError, "dict does not contain key '%s'" % key + if type(sample_dict[key]) != type(real_dict[key]): + raise ValueError, "dict has differing types (%s vs %s) for key " \ + "'%s'" % (type(sample_dict[key]), type(real_dict[key]), key) + # Check dictionaries recursively + if type(sample_dict[key]) == dict: + dict_check(sample_dict[key], real_dict[key]) + # Delete visited keys from copy + del(tmp[key]) + # Any keys leftover are present in the real dict but not the sample + if len(tmp) == 0: + return + result = "dict has extra keys: " + for key in tmp.keys(): + result = result + key + " " + raise ValueError, result + +if __name__ == "__main__": + print get_server(platform = "nt") diff --git a/source3/stf/test.py b/source3/stf/test.py new file mode 100755 index 0000000000..2e9abd976f --- /dev/null +++ b/source3/stf/test.py @@ -0,0 +1,28 @@ +#!/usr/bin/python + +# meta-test-case / example for comfychair. Should demonstrate +# different kinds of failure. + +import comfychair, stf + +class NormalTest(comfychair.TestCase): + def runTest(self): + pass + +class RootTest(comfychair.TestCase): + def setUp(self): + self.require_root() + + def runTest(self): + pass + +class GoodExecTest(comfychair.TestCase): + def runTest(self): + exit, stdout = self.runCmdUnchecked("ls -l") + +class BadExecTest(comfychair.TestCase): + def setUp(self): + exit, stdout = self.runCmdUnchecked("spottyfoot --slobber", + skip_on_noexec = 1) + +comfychair.runtests([NormalTest, RootTest, GoodExecTest, BadExecTest]) -- cgit From 62ead1b8bede20e73e18fdca5bcaf0aee9d1f56b Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 07:14:03 +0000 Subject: New import of ComfyChair, many changes (This used to be commit e84046e769a518fa1970827f4dcb8284ba9b9952) --- source3/stf/comfychair.py | 214 ++++++++++++++++++++++++++++++---------------- 1 file changed, 139 insertions(+), 75 deletions(-) diff --git a/source3/stf/comfychair.py b/source3/stf/comfychair.py index 00b2262b26..b552baccd2 100644 --- a/source3/stf/comfychair.py +++ b/source3/stf/comfychair.py @@ -22,31 +22,11 @@ Copyright (C) 2002, 2003 by Martin Pool This is a test framework designed for testing programs written in -Python, or (through a fork/exec interface) any other language. It is -similar in design to the very nice 'svntest' system used by -Subversion, but has no Subversion-specific features. +Python, or (through a fork/exec interface) any other language. -It is somewhat similar to PyUnit, except: +For more information, see the file README.comfychair. - - it allows capture of detailed log messages from a test, to be - optionally displayed if the test fails. - - - it allows execution of a specified subset of tests - - - it avoids Java idioms that are not so useful in Python - -WRITING TESTS: - - Each test case is a callable object, typically a function. Its - documentation string describes the test, and the first line of the - docstring should be a brief name. - - The test should return 0 for pass, or non-zero for failure. - Alternatively they may raise an exception. - - Tests may import this "comfychair" module to get some useful - utilities, but that is not strictly required. - +To run a test suite based on ComfyChair, just run it as a program. """ # TODO: Put everything into a temporary directory? @@ -66,15 +46,15 @@ class TestCase: self.test_log = "" self.background_pids = [] - def setUp(self): + def setup(self): """Set up test fixture.""" pass - def tearDown(self): + def teardown(self): """Tear down test fixture.""" pass - def runTest(self): + def runtest(self): """Run the test.""" pass @@ -82,10 +62,39 @@ class TestCase: """Say the test failed.""" raise AssertionError(reason) + + ############################################################# + # Requisition methods + + def require(self, predicate, message): + """Check a predicate for running this test. + +If the predicate value is not true, the test is skipped with a message explaining +why.""" + if not predicate: + raise NotRunError, message + + def require_root(self): + """Skip this test unless run by root.""" + import os + self.require(os.getuid() == 0, + "must be root to run this test") + + ############################################################# + # Assertion methods + def assert_(self, expr, reason = ""): if not expr: raise AssertionError(reason) + def assert_equal(self, a, b): + if not a == b: + raise AssertionError("assertEquals failed: %s" % `(a, b)`) + + def assert_notequal(self, a, b): + if a == b: + raise AssertionError("assertNotEqual failed: %s" % `(a, b)`) + def assert_re_match(self, pattern, s): """Assert that a string matches a particular pattern @@ -97,9 +106,11 @@ class TestCase: AssertionError if not matched """ if not re.match(pattern, s): - raise AssertionError("string %s does not match regexp %s" % (`s`, `pattern`)) + raise AssertionError("string does not match regexp\n" + " string: %s\n" + " re: %s" % (`s`, `pattern`)) - def assert_regexp(self, pattern, s): + def assert_re_search(self, pattern, s): """Assert that a string *contains* a particular pattern Inputs: @@ -110,7 +121,9 @@ class TestCase: AssertionError if not matched """ if not re.search(pattern, s): - raise AssertionError("string %s does not contain regexp %s" % (`s`, `pattern`)) + raise AssertionError("string does not contain regexp\n" + " string: %s\n" + " re: %s" % (`s`, `pattern`)) def assert_no_file(self, filename): @@ -118,7 +131,10 @@ class TestCase: assert not os.path.exists(filename), ("file exists but should not: %s" % filename) - def runCmdNoWait(self, cmd): + ############################################################# + # Methods for running programs + + def runcmd_background(self, cmd): import os name = cmd[0] self.test_log = self.test_log + "Run in background:\n" + `cmd` + "\n" @@ -127,17 +143,17 @@ class TestCase: return pid - def runCmd(self, cmd, expectedResult = 0): + def runcmd(self, cmd, expectedResult = 0): """Run a command, fail if the command returns an unexpected exit code. Return the output produced.""" - rc, output = self.runCmdUnchecked(cmd) + rc, output = self.runcmd_unchecked(cmd) if rc != expectedResult: raise AssertionError("command returned %d; expected %s: \"%s\"" % (rc, expectedResult, cmd)) return output - def runCmdUnchecked(self, cmd, skip_on_noexec = 0): + def runcmd_unchecked(self, cmd, skip_on_noexec = 0): """Invoke a command; return (exitcode, stdout)""" import os, popen2 pobj = popen2.Popen4(cmd) @@ -157,7 +173,7 @@ Output: raise NotRunError, "could not execute %s" % cmd return rc, output - def explainFailure(self, exc_info = None): + def explain_failure(self, exc_info = None): import traceback # Move along, nothing to see here if not exc_info and self.test_log == "": @@ -168,19 +184,6 @@ Output: print self.test_log print "-----------------------------------------------------------------" - def require(self, predicate, message): - """Check a predicate for running this test. - -If the predicate value is not true, the test is skipped with a message explaining -why.""" - if not predicate: - raise NotRunError, message - - def require_root(self): - """Skip this test unless run by root.""" - import os - self.require(os.getuid() == 0, - "must be root to run this test") def log(self, msg): """Log a message to the test log. This message is displayed if @@ -188,23 +191,12 @@ why.""" the verbose option.""" self.test_log = self.test_log + msg + "\n" + class NotRunError(Exception): + """Raised if a test must be skipped because of missing resources""" def __init__(self, value = None): self.value = value -def test_name(test): - """Return a human-readable name for a test. - - Inputs: - test some kind of callable test object - - Returns: - name string: a short printable name - """ - try: - return test.__name__ - except: - return `test` def runtests(test_list, verbose = 0): """Run a series of tests. @@ -220,47 +212,119 @@ def runtests(test_list, verbose = 0): """ import traceback ret = 0 - for test in test_list: - print "%-60s" % test_name(test), + for test_class in test_list: + print "%-60s" % _test_name(test_class), # flush now so that long running tests are easier to follow sys.stdout.flush() try: try: # run test and show result - obj = test() - if hasattr(obj, "setUp"): - obj.setUp() - obj.runTest() + obj = test_class() + if hasattr(obj, "setup"): + obj.setup() + obj.runtest() print "OK" except KeyboardInterrupt: print "INTERRUPT" - obj.explainFailure(sys.exc_info()) + obj.explain_failure(sys.exc_info()) ret = 2 break except NotRunError, msg: print "NOTRUN, %s" % msg.value except: print "FAIL" - obj.explainFailure(sys.exc_info()) + obj.explain_failure(sys.exc_info()) ret = 1 finally: try: - if hasattr(obj, "tearDown"): - obj.tearDown() + if hasattr(obj, "teardown"): + obj.teardown() except KeyboardInterrupt: - print "interrupted during tearDown" - obj.explainFailure(sys.exc_info()) + print "interrupted during teardown" + obj.explain_failure(sys.exc_info()) ret = 2 break except: - print "error during tearDown" - obj.explainFailure(sys.exc_info()) + print "error during teardown" + obj.explain_failure(sys.exc_info()) ret = 1 # Display log file if we're verbose if ret == 0 and verbose: - obj.explainFailure() + obj.explain_failure() return ret + +def _test_name(test_class): + """Return a human-readable name for a test class. + """ + try: + return test_class.__name__ + except: + return `test_class` + + +def print_help(): + """Help for people running tests""" + import sys + print """%s: software test suite based on ComfyChair + +usage: + To run all tests, just run this program. To run particular tests, + list them on the command line. + +options: + --help show usage message + --list list available tests + --verbose show more information while running tests +""" % sys.argv[0] + + +def print_list(test_list): + """Show list of available tests""" + for test_class in test_list: + print " %s" % _test_name(test_class) + + +def main(tests): + """Main entry point for test suites based on ComfyChair. + +Test suites should contain this boilerplate: + + if __name__ == '__main__': + comfychair.main(tests) + +This function handles standard options such as --help and --list, and +by default runs all tests in the suggested order. + +Calls sys.exit() on completion. +""" + from sys import argv + import getopt, sys + + verbose = 0 + + opts, args = getopt.getopt(argv[1:], '', ['help', 'list', 'verbose']) + if ('--help', '') in opts: + print_help() + return + elif ('--list', '') in opts: + print_list(tests) + return + + if ('--verbose', '') in opts: + verbose = 1 + + if args: + by_name = {} + for t in tests: + by_name[_test_name(t)] = t + which_tests = [by_name[name] for name in args] + else: + which_tests = tests + + sys.exit(runtests(which_tests, verbose)) + + if __name__ == '__main__': print __doc__ -- cgit From 52fbbf051b926cea44b9458289ea155d36a8bb7c Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 12 Mar 2003 07:17:39 +0000 Subject: Update for new version of ComfyChair: some methods are renamed to be more consistent, and it now looks at command-line arguments to work out what to do. Run this program to get a quick demonstration of what ComfyChair does. (This used to be commit 9b0c59a10707b2bbe3837d718e5030a6cdf19bfa) --- source3/stf/test.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/source3/stf/test.py b/source3/stf/test.py index 2e9abd976f..fb57926cc3 100755 --- a/source3/stf/test.py +++ b/source3/stf/test.py @@ -3,26 +3,31 @@ # meta-test-case / example for comfychair. Should demonstrate # different kinds of failure. -import comfychair, stf +import comfychair class NormalTest(comfychair.TestCase): - def runTest(self): + def runtest(self): pass class RootTest(comfychair.TestCase): - def setUp(self): + def setup(self): self.require_root() def runTest(self): pass class GoodExecTest(comfychair.TestCase): - def runTest(self): - exit, stdout = self.runCmdUnchecked("ls -l") + def runtest(self): + stdout = self.runcmd("ls -l") class BadExecTest(comfychair.TestCase): - def setUp(self): - exit, stdout = self.runCmdUnchecked("spottyfoot --slobber", - skip_on_noexec = 1) + def setup(self): + exit, stdout = self.runcmd_unchecked("spottyfoot --slobber", + skip_on_noexec = 1) + + +tests = [NormalTest, RootTest, GoodExecTest, BadExecTest] -comfychair.runtests([NormalTest, RootTest, GoodExecTest, BadExecTest]) +if __name__ == '__main__': + comfychair.main(tests) + -- cgit From a6c6800746a77fd041151b42c4aad9d170efb931 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 12 Mar 2003 10:36:14 +0000 Subject: Patch from Ken Cross to take a username in the form of user@realm for kerberos logins. Andrew Bartlett (This used to be commit ce013dc13e9e77b5cb9b2d5a4b76d54f91614e6c) --- source3/utils/net_ads.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c index 8cd3bac802..ea31a92575 100644 --- a/source3/utils/net_ads.c +++ b/source3/utils/net_ads.c @@ -124,6 +124,7 @@ static ADS_STRUCT *ads_startup(void) ADS_STATUS status; BOOL need_password = False; BOOL second_time = False; + char *realm; ads = ads_init(NULL, NULL, opt_host); @@ -150,6 +151,16 @@ retry: ads->auth.user_name = strdup(opt_user_name); + /* + * If the username is of the form "name@realm", + * extract the realm and convert to upper case. + */ + if (realm = strchr(ads->auth.user_name, '@')) { + *realm++ = '\0'; + ads->auth.realm = strdup(realm); + strupper(ads->auth.realm); + } + status = ads_connect(ads); if (!ADS_ERR_OK(status)) { if (!need_password && !second_time) { -- cgit From 02abe94f81136f85dc72b7015213871831ce2e1a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 12 Mar 2003 10:56:55 +0000 Subject: - Fix a double-free (I can't say I understand the code, but it matches the other cases and keeps valgrind quiet). - Add static Andrew Bartlett (This used to be commit e9da9c500b96a828d744e7a1c64427fc01153310) --- source3/libads/krb5_setpw.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source3/libads/krb5_setpw.c b/source3/libads/krb5_setpw.c index ac7377cd2f..29bf1a427c 100644 --- a/source3/libads/krb5_setpw.c +++ b/source3/libads/krb5_setpw.c @@ -546,7 +546,6 @@ ADS_STATUS krb5_set_password(const char *kdc_host, const char *princ, const char krb5_free_creds(context, credsp); krb5_free_principal(context, creds.client); - krb5_free_principal(context, creds.server); krb5_free_principal(context, principal); krb5_free_context(context); @@ -579,11 +578,11 @@ kerb_prompter(krb5_context ctx, void *data, return 0; } -ADS_STATUS krb5_chg_password(const char *kdc_host, - const char *principal, - const char *oldpw, - const char *newpw, - int time_offset) +static ADS_STATUS krb5_chg_password(const char *kdc_host, + const char *principal, + const char *oldpw, + const char *newpw, + int time_offset) { ADS_STATUS aret; krb5_error_code ret; -- cgit From f4a8417d6fa058ec33753a4df1222131a73add3e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 12 Mar 2003 11:00:02 +0000 Subject: Add const (This used to be commit 147a0c8b13d20e06c557fb817a36fddf9a920d65) --- source3/lib/crc32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/lib/crc32.c b/source3/lib/crc32.c index bd4f1633e5..da3aeaa901 100644 --- a/source3/lib/crc32.c +++ b/source3/lib/crc32.c @@ -8,7 +8,7 @@ #include "includes.h" -static unsigned long CRCTable[256] = +static const unsigned long CRCTable[256] = { 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F, 0xE963A535,0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988, @@ -55,7 +55,7 @@ static unsigned long CRCTable[256] = 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; -uint32 crc32_calc_buffer( char *buffer, uint32 count) +uint32 crc32_calc_buffer( const char *buffer, uint32 count) { uint32 crc=0xffffffff, i; for(i=0;i Date: Wed, 12 Mar 2003 15:40:43 +0000 Subject: adding some initiaial code to sert %a to Win2K3 (using Native LanMan string from .NET RC2) (This used to be commit 4c823e61d14a33344deb887043b60b2e3c83416f) --- source3/include/smb.h | 2 +- source3/lib/util.c | 3 +++ source3/smbd/sesssetup.c | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/source3/include/smb.h b/source3/include/smb.h index bd4f113039..bf2d5631a7 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1408,7 +1408,7 @@ enum ldap_ssl_types {LDAP_SSL_ON, LDAP_SSL_OFF, LDAP_SSL_START_TLS}; enum ldap_passwd_sync_types {LDAP_PASSWD_SYNC_ON, LDAP_PASSWD_SYNC_OFF, LDAP_PASSWD_SYNC_ONLY}; /* Remote architectures we know about. */ -enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_WIN2K, RA_WINXP, RA_SAMBA}; +enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_WIN2K, RA_WINXP, RA_WIN2K3, RA_SAMBA}; /* case handling */ enum case_handling {CASE_LOWER,CASE_UPPER}; diff --git a/source3/lib/util.c b/source3/lib/util.c index 15b75356a8..8d62db5ebb 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -1767,6 +1767,9 @@ void set_remote_arch(enum remote_arch_types type) case RA_WINXP: fstrcpy(remote_arch, "WinXP"); return; + case RA_WIN2K3: + fstrcpy(remote_arch, "Win2K3"); + return; case RA_SAMBA: fstrcpy(remote_arch,"Samba"); return; diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index 2661fe3f93..70158a9015 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -617,6 +617,8 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf, if ( ra_type == RA_WIN2K ) { if ( 0 == strcmp( native_lanman, "Windows 2002 5.1" ) ) set_remote_arch( RA_WINXP ); + else if ( 0 == strcmp( native_lanman, "Windows .NET 5.2" ) ) + set_remote_arch( RA_WIN2K3 ); } -- cgit From 15ae0c4dedbfb279c9ee77cd37e9c4a55b8434e5 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 12 Mar 2003 19:08:01 +0000 Subject: Ensure we count the length correctly in mangle_map. Jeremy. (This used to be commit 596705198c555568da208f59008ab87c5164bfb4) --- source3/smbd/mangle_map.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/source3/smbd/mangle_map.c b/source3/smbd/mangle_map.c index 553e3d949d..5ae3ebd174 100644 --- a/source3/smbd/mangle_map.c +++ b/source3/smbd/mangle_map.c @@ -150,36 +150,45 @@ static void mangled_map(char *s, const char *MangledMap) } DEBUG( 5, ("End of first in pair '%s'\n", end) ); if( (match_string = map_filename( s, start, end-start )) ) { + int size_left = sizeof(new_string) - 1; DEBUG( 5, ("Found a match\n") ); /* Found a match. */ start = end + 1; /* Point to start of what it is to become. */ DEBUG( 5, ("Start of second in pair '%s'\n", start) ); end = start; np = new_string; - while( (*end) /* Not the end of string. */ + while( (*end && size_left > 0) /* Not the end of string. */ && (*end != ')') /* Not the end of the pattern. */ - && (*end != '*') ) /* Not a wildcard. */ + && (*end != '*') ) { /* Not a wildcard. */ *np++ = *end++; + size_left--; + } if( !*end ) { start = end; continue; /* Always check for the end. */ } if( *end == '*' ) { - pstrcpy( np, match_string ); + if (size_left > 0 ) + safe_strcpy( np, match_string, size_left ); np += strlen( match_string ); + size_left -= strlen( match_string ); end++; /* Skip the '*' */ - while ((*end) /* Not the end of string. */ + while ((*end && size_left > 0) /* Not the end of string. */ && (*end != ')') /* Not the end of the pattern. */ - && (*end != '*'))/* Not a wildcard. */ + && (*end != '*')) { /* Not a wildcard. */ *np++ = *end++; + size_left--; + } } if (!*end) { start = end; continue; /* Always check for the end. */ } - *np++ = '\0'; /* NULL terminate it. */ + if (size_left > 0) + *np++ = '\0'; /* NULL terminate it. */ DEBUG(5,("End of second in pair '%s'\n", end)); + new_string[sizeof(new_string)-1] = '\0'; pstrcpy( s, new_string ); /* Substitute with the new name. */ DEBUG( 5, ("s is now '%s'\n", s) ); } -- cgit From 00d89c3f7c647b56381ba333658c0ed8e02dccdc Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 12 Mar 2003 21:01:25 +0000 Subject: fixed a strcat noticed by metze (This used to be commit db3ad0dbe0bca729f98ca5d5a698388fe086daf2) --- source3/param/loadparm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index c21b88ff20..3878dabb60 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -3095,7 +3095,7 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue ZERO_STRUCT(vfskey); pstr_sprintf(vfskey, "%s:", pszParmName); slen = strlen(vfskey); - safe_strcat(vfskey, sep+1, sizeof(pstring)); + pstrcat(vfskey, sep+1); trim_string(vfskey+slen, " ", " "); not_added = True; data = (snum < 0) ? Globals.param_opt : -- cgit From ddfed383a0791986c6d08fde67840e99424ebb1a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 12 Mar 2003 22:24:12 +0000 Subject: Change size parameters from signed to unsigned to fix up warnings. Jeremy. (This used to be commit 2e9880ef7c259b67eb75edc8098b734c3b7b22c1) --- source3/include/client.h | 2 +- source3/libsmb/clifile.c | 12 +-- source3/libsmb/clilist.c | 2 +- source3/libsmb/clirap.c | 38 ++++---- source3/libsmb/clitrans.c | 233 ++++++++++++++++++++++++++++++++-------------- 5 files changed, 191 insertions(+), 96 deletions(-) diff --git a/source3/include/client.h b/source3/include/client.h index 2e6b9337e4..a3efda4918 100644 --- a/source3/include/client.h +++ b/source3/include/client.h @@ -114,7 +114,7 @@ struct cli_state { int max_mux; char *outbuf; char *inbuf; - int bufsize; + unsigned int bufsize; int initialised; int win95; uint32 capabilities; diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 31d7ea5911..f61787abde 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -29,8 +29,8 @@ static BOOL cli_link_internal(struct cli_state *cli, const char *fname_src, const char *fname_dst, BOOL hard_link) { - int data_len = 0; - int param_len = 0; + unsigned int data_len = 0; + unsigned int param_len = 0; uint16 setup = TRANSACT2_SETPATHINFO; char param[sizeof(pstring)+6]; pstring data; @@ -123,8 +123,8 @@ BOOL cli_unix_hardlink(struct cli_state *cli, const char *fname_src, const char static BOOL cli_unix_chmod_chown_internal(struct cli_state *cli, const char *fname, uint32 mode, uint32 uid, uint32 gid) { - int data_len = 0; - int param_len = 0; + unsigned int data_len = 0; + unsigned int param_len = 0; uint16 setup = TRANSACT2_SETPATHINFO; char param[sizeof(pstring)+6]; char data[100]; @@ -335,8 +335,8 @@ BOOL cli_rmdir(struct cli_state *cli, const char *dname) int cli_nt_delete_on_close(struct cli_state *cli, int fnum, BOOL flag) { - int data_len = 1; - int param_len = 6; + unsigned int data_len = 1; + unsigned int param_len = 6; uint16 setup = TRANSACT2_SETFILEINFO; pstring param; unsigned char data; diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c index 89ab5d6414..3884e4da82 100644 --- a/source3/libsmb/clilist.c +++ b/source3/libsmb/clilist.c @@ -154,7 +154,7 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute, int ff_dir_handle=0; int loop_count = 0; char *rparam=NULL, *rdata=NULL; - int param_len, data_len; + unsigned int param_len, data_len; uint16 setup; pstring param; diff --git a/source3/libsmb/clirap.c b/source3/libsmb/clirap.c index a1845b2e16..b38e7d5c23 100644 --- a/source3/libsmb/clirap.c +++ b/source3/libsmb/clirap.c @@ -41,8 +41,8 @@ BOOL cli_api_pipe(struct cli_state *cli, const char *pipe_name, data, data_count, max_data_count); return (cli_receive_trans(cli, SMBtrans, - rparam, (int *)rparam_count, - rdata, (int *)rdata_count)); + rparam, (unsigned int *)rparam_count, + rdata, (unsigned int *)rdata_count)); } /**************************************************************************** @@ -51,8 +51,8 @@ call a remote api BOOL cli_api(struct cli_state *cli, char *param, int prcnt, int mprcnt, char *data, int drcnt, int mdrcnt, - char **rparam, int *rprcnt, - char **rdata, int *rdrcnt) + char **rparam, unsigned int *rprcnt, + char **rdata, unsigned int *rdrcnt) { cli_send_trans(cli,SMBtrans, PIPE_LANMAN, /* Name */ @@ -286,8 +286,8 @@ BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char char *p = param; unsigned char old_pw_hash[16]; unsigned char new_pw_hash[16]; - int data_len; - int param_len = 0; + unsigned int data_len; + unsigned int param_len = 0; char *rparam = NULL; char *rdata = NULL; int rprcnt, rdrcnt; @@ -368,9 +368,9 @@ BOOL cli_qpathinfo(struct cli_state *cli, const char *fname, time_t *c_time, time_t *a_time, time_t *m_time, size_t *size, uint16 *mode) { - int data_len = 0; - int param_len = 0; - int rparam_len, rdata_len; + unsigned int data_len = 0; + unsigned int param_len = 0; + unsigned int rparam_len, rdata_len; uint16 setup = TRANSACT2_QPATHINFO; pstring param; char *rparam=NULL, *rdata=NULL; @@ -449,8 +449,8 @@ BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, time_t *w_time, size_t *size, uint16 *mode, SMB_INO_T *ino) { - int data_len = 0; - int param_len = 0; + unsigned int data_len = 0; + unsigned int param_len = 0; uint16 setup = TRANSACT2_QPATHINFO; pstring param; char *rparam=NULL, *rdata=NULL; @@ -518,8 +518,8 @@ send a qfileinfo QUERY_FILE_NAME_INFO call BOOL cli_qfilename(struct cli_state *cli, int fnum, pstring name) { - int data_len = 0; - int param_len = 0; + unsigned int data_len = 0; + unsigned int param_len = 0; uint16 setup = TRANSACT2_QFILEINFO; pstring param; char *rparam=NULL, *rdata=NULL; @@ -563,8 +563,8 @@ BOOL cli_qfileinfo(struct cli_state *cli, int fnum, time_t *c_time, time_t *a_time, time_t *m_time, time_t *w_time, SMB_INO_T *ino) { - int data_len = 0; - int param_len = 0; + unsigned int data_len = 0; + unsigned int param_len = 0; uint16 setup = TRANSACT2_QFILEINFO; pstring param; char *rparam=NULL, *rdata=NULL; @@ -631,8 +631,8 @@ send a qfileinfo call ****************************************************************************/ BOOL cli_qfileinfo_test(struct cli_state *cli, int fnum, int level, char *outdata) { - int data_len = 0; - int param_len = 0; + unsigned int data_len = 0; + unsigned int param_len = 0; uint16 setup = TRANSACT2_QFILEINFO; pstring param; char *rparam=NULL, *rdata=NULL; @@ -677,8 +677,8 @@ send a qpathinfo SMB_QUERY_FILE_ALT_NAME_INFO call ****************************************************************************/ NTSTATUS cli_qpathinfo_alt_name(struct cli_state *cli, const char *fname, fstring alt_name) { - int data_len = 0; - int param_len = 0; + unsigned int data_len = 0; + unsigned int param_len = 0; uint16 setup = TRANSACT2_QPATHINFO; pstring param; char *rparam=NULL, *rdata=NULL; diff --git a/source3/libsmb/clitrans.c b/source3/libsmb/clitrans.c index 3d862a1796..7e3357a8cc 100644 --- a/source3/libsmb/clitrans.c +++ b/source3/libsmb/clitrans.c @@ -24,18 +24,19 @@ /**************************************************************************** - send a SMB trans or trans2 request - ****************************************************************************/ + Send a SMB trans or trans2 request. +****************************************************************************/ + BOOL cli_send_trans(struct cli_state *cli, int trans, const char *pipe_name, int fid, int flags, - uint16 *setup, int lsetup, int msetup, - char *param, int lparam, int mparam, - char *data, int ldata, int mdata) + uint16 *setup, unsigned int lsetup, unsigned int msetup, + char *param, unsigned int lparam, unsigned int mparam, + char *data, unsigned int ldata, unsigned int mdata) { int i; - int this_ldata,this_lparam; - int tot_data=0,tot_param=0; + unsigned int this_ldata,this_lparam; + unsigned int tot_data=0,tot_param=0; char *outdata,*outparam; char *p; int pipe_name_len=0; @@ -83,14 +84,13 @@ BOOL cli_send_trans(struct cli_state *cli, int trans, cli_setup_bcc(cli, outdata+this_ldata); show_msg(cli->outbuf); - cli_send_smb(cli); + if (!cli_send_smb(cli)) + return False; if (this_ldata < ldata || this_lparam < lparam) { /* receive interim response */ - if (!cli_receive_smb(cli) || - cli_is_error(cli)) { + if (!cli_receive_smb(cli) || cli_is_error(cli)) return(False); - } tot_data = this_ldata; tot_param = this_lparam; @@ -123,7 +123,8 @@ BOOL cli_send_trans(struct cli_state *cli, int trans, cli_setup_bcc(cli, outdata+this_ldata); show_msg(cli->outbuf); - cli_send_smb(cli); + if (!cli_send_smb(cli)) + return False; tot_data += this_ldata; tot_param += this_lparam; @@ -133,17 +134,17 @@ BOOL cli_send_trans(struct cli_state *cli, int trans, return(True); } - /**************************************************************************** - receive a SMB trans or trans2 response allocating the necessary memory - ****************************************************************************/ + Receive a SMB trans or trans2 response allocating the necessary memory. +****************************************************************************/ + BOOL cli_receive_trans(struct cli_state *cli,int trans, - char **param, int *param_len, - char **data, int *data_len) + char **param, unsigned int *param_len, + char **data, unsigned int *data_len) { - int total_data=0; - int total_param=0; - int this_data,this_param; + unsigned int total_data=0; + unsigned int total_param=0; + unsigned int this_data,this_param; NTSTATUS status; char *tdata; char *tparam; @@ -170,9 +171,8 @@ BOOL cli_receive_trans(struct cli_state *cli,int trans, */ status = cli_nt_error(cli); - if (NT_STATUS_IS_ERR(status)) { + if (NT_STATUS_IS_ERR(status)) return False; - } /* parse out the lengths */ total_data = SVAL(cli->inbuf,smb_tdrcnt); @@ -199,7 +199,7 @@ BOOL cli_receive_trans(struct cli_state *cli,int trans, *param = tparam; } - while (1) { + for (;;) { this_data = SVAL(cli->inbuf,smb_drcnt); this_param = SVAL(cli->inbuf,smb_prcnt); @@ -209,21 +209,59 @@ BOOL cli_receive_trans(struct cli_state *cli,int trans, return False; } - if (this_data) - memcpy(*data + SVAL(cli->inbuf,smb_drdisp), - smb_base(cli->inbuf) + SVAL(cli->inbuf,smb_droff), - this_data); - if (this_param) - memcpy(*param + SVAL(cli->inbuf,smb_prdisp), - smb_base(cli->inbuf) + SVAL(cli->inbuf,smb_proff), - this_param); + if (this_data + *data_len < this_data || + this_data + *data_len < *data_len || + this_param + *param_len < this_param || + this_param + *param_len < *param_len) { + DEBUG(1,("Data overflow in cli_receive_trans\n")); + return False; + } + + if (this_data) { + unsigned int data_offset_out = SVAL(cli->inbuf,smb_drdisp); + unsigned int data_offset_in = SVAL(cli->inbuf,smb_droff); + + if (data_offset_out > total_data || + data_offset_out + this_data > total_data || + data_offset_out + this_data < data_offset_out || + data_offset_out + this_data < this_data) { + DEBUG(1,("Data overflow in cli_receive_trans\n")); + return False; + } + if (data_offset_in > cli->bufsize || + data_offset_in + this_data > cli->bufsize || + data_offset_in + this_data < data_offset_in || + data_offset_in + this_data < this_data) { + DEBUG(1,("Data overflow in cli_receive_trans\n")); + return False; + } + + memcpy(*data + data_offset_out, smb_base(cli->inbuf) + data_offset_in, this_data); + } + if (this_param) { + unsigned int param_offset_out = SVAL(cli->inbuf,smb_prdisp); + unsigned int param_offset_in = SVAL(cli->inbuf,smb_proff); + + if (param_offset_out > total_param || + param_offset_out + this_param > total_param || + param_offset_out + this_param < param_offset_out || + param_offset_out + this_param < this_param) { + DEBUG(1,("Param overflow in cli_receive_trans\n")); + return False; + } + if (param_offset_in > cli->bufsize || + param_offset_in + this_param > cli->bufsize || + param_offset_in + this_param < param_offset_in || + param_offset_in + this_param < this_param) { + DEBUG(1,("Param overflow in cli_receive_trans\n")); + return False; + } + + memcpy(*param + param_offset_out, smb_base(cli->inbuf) + param_offset_in, this_param); + } *data_len += this_data; *param_len += this_param; - /* parse out the total lengths again - they can shrink! */ - total_data = SVAL(cli->inbuf,smb_tdrcnt); - total_param = SVAL(cli->inbuf,smb_tprcnt); - if (total_data <= *data_len && total_param <= *param_len) break; @@ -242,27 +280,35 @@ BOOL cli_receive_trans(struct cli_state *cli,int trans, if (NT_STATUS_IS_ERR(cli_nt_error(cli))) { return(False); } + + /* parse out the total lengths again - they can shrink! */ + if (SVAL(cli->inbuf,smb_tdrcnt) < total_data) + total_data = SVAL(cli->inbuf,smb_tdrcnt); + if (SVAL(cli->inbuf,smb_tprcnt) < total_param) + total_param = SVAL(cli->inbuf,smb_tprcnt); + + if (total_data <= *data_len && total_param <= *param_len) + break; + } return(True); } - - - /**************************************************************************** - send a SMB nttrans request - ****************************************************************************/ + Send a SMB nttrans request. +****************************************************************************/ + BOOL cli_send_nt_trans(struct cli_state *cli, int function, int flags, - uint16 *setup, int lsetup, int msetup, - char *param, int lparam, int mparam, - char *data, int ldata, int mdata) + uint16 *setup, unsigned int lsetup, unsigned int msetup, + char *param, unsigned int lparam, unsigned int mparam, + char *data, unsigned int ldata, unsigned int mdata) { - int i; - int this_ldata,this_lparam; - int tot_data=0,tot_param=0; + unsigned int i; + unsigned int this_ldata,this_lparam; + unsigned int tot_data=0,tot_param=0; char *outdata,*outparam; this_lparam = MIN(lparam,cli->max_xmit - (500+lsetup*2)); /* hack */ @@ -301,14 +347,13 @@ BOOL cli_send_nt_trans(struct cli_state *cli, cli_setup_bcc(cli, outdata+this_ldata); show_msg(cli->outbuf); - cli_send_smb(cli); + if (!cli_send_smb(cli)) + return False; if (this_ldata < ldata || this_lparam < lparam) { /* receive interim response */ - if (!cli_receive_smb(cli) || - cli_is_error(cli)) { + if (!cli_receive_smb(cli) || cli_is_error(cli)) return(False); - } tot_data = this_ldata; tot_param = this_lparam; @@ -340,7 +385,8 @@ BOOL cli_send_nt_trans(struct cli_state *cli, cli_setup_bcc(cli, outdata+this_ldata); show_msg(cli->outbuf); - cli_send_smb(cli); + if (!cli_send_smb(cli)) + return False; tot_data += this_ldata; tot_param += this_lparam; @@ -355,13 +401,14 @@ BOOL cli_send_nt_trans(struct cli_state *cli, /**************************************************************************** receive a SMB nttrans response allocating the necessary memory ****************************************************************************/ + BOOL cli_receive_nt_trans(struct cli_state *cli, - char **param, int *param_len, - char **data, int *data_len) + char **param, unsigned int *param_len, + char **data, unsigned int *data_len) { - int total_data=0; - int total_param=0; - int this_data,this_param; + unsigned int total_data=0; + unsigned int total_param=0; + unsigned int this_data,this_param; uint8 eclass; uint32 ecode; char *tdata; @@ -423,25 +470,65 @@ BOOL cli_receive_nt_trans(struct cli_state *cli, if (this_data + *data_len > total_data || this_param + *param_len > total_param) { - DEBUG(1,("Data overflow in cli_receive_trans\n")); + DEBUG(1,("Data overflow in cli_receive_nt_trans\n")); + return False; + } + + if (this_data + *data_len < this_data || + this_data + *data_len < *data_len || + this_param + *param_len < this_param || + this_param + *param_len < *param_len) { + DEBUG(1,("Data overflow in cli_receive_nt_trans\n")); return False; } - if (this_data) - memcpy(*data + SVAL(cli->inbuf,smb_ntr_DataDisplacement), - smb_base(cli->inbuf) + SVAL(cli->inbuf,smb_ntr_DataOffset), - this_data); - if (this_param) - memcpy(*param + SVAL(cli->inbuf,smb_ntr_ParameterDisplacement), - smb_base(cli->inbuf) + SVAL(cli->inbuf,smb_ntr_ParameterOffset), - this_param); + if (this_data) { + unsigned int data_offset_out = SVAL(cli->inbuf,smb_ntr_DataDisplacement); + unsigned int data_offset_in = SVAL(cli->inbuf,smb_ntr_DataOffset); + + if (data_offset_out > total_data || + data_offset_out + this_data > total_data || + data_offset_out + this_data < data_offset_out || + data_offset_out + this_data < this_data) { + DEBUG(1,("Data overflow in cli_receive_nt_trans\n")); + return False; + } + if (data_offset_in > cli->bufsize || + data_offset_in + this_data > cli->bufsize || + data_offset_in + this_data < data_offset_in || + data_offset_in + this_data < this_data) { + DEBUG(1,("Data overflow in cli_receive_nt_trans\n")); + return False; + } + + memcpy(*data + data_offset_out, smb_base(cli->inbuf) + data_offset_in, this_data); + } + + if (this_param) { + unsigned int param_offset_out = SVAL(cli->inbuf,smb_ntr_ParameterDisplacement); + unsigned int param_offset_in = SVAL(cli->inbuf,smb_ntr_ParameterOffset); + + if (param_offset_out > total_param || + param_offset_out + this_param > total_param || + param_offset_out + this_param < param_offset_out || + param_offset_out + this_param < this_param) { + DEBUG(1,("Param overflow in cli_receive_nt_trans\n")); + return False; + } + if (param_offset_in > cli->bufsize || + param_offset_in + this_param > cli->bufsize || + param_offset_in + this_param < param_offset_in || + param_offset_in + this_param < this_param) { + DEBUG(1,("Param overflow in cli_receive_nt_trans\n")); + return False; + } + + memcpy(*param + param_offset_out, smb_base(cli->inbuf) + param_offset_in, this_param); + } + *data_len += this_data; *param_len += this_param; - /* parse out the total lengths again - they can shrink! */ - total_data = SVAL(cli->inbuf,smb_ntr_TotalDataCount); - total_param = SVAL(cli->inbuf,smb_ntr_TotalParameterCount); - if (total_data <= *data_len && total_param <= *param_len) break; @@ -462,6 +549,14 @@ BOOL cli_receive_nt_trans(struct cli_state *cli, !(eclass == ERRDOS && ecode == ERRmoredata)) return(False); } + /* parse out the total lengths again - they can shrink! */ + if (SVAL(cli->inbuf,smb_ntr_TotalDataCount) < total_data) + total_data = SVAL(cli->inbuf,smb_ntr_TotalDataCount); + if (SVAL(cli->inbuf,smb_ntr_TotalParameterCount) < total_param) + total_param = SVAL(cli->inbuf,smb_ntr_TotalParameterCount); + + if (total_data <= *data_len && total_param <= *param_len) + break; } return(True); -- cgit From 3b104f6e2dc56c5edcf0278e7e43d4993e7db368 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 13 Mar 2003 04:34:31 +0000 Subject: win2000 can take much longer than the specified time to respond to a lock - so to make the torture tests valid I give it a grace time of 10 seconds instead of 2 (This used to be commit c9c9e9eb26ec3042395637d14a6661d04a629ccc) --- source3/libsmb/clifile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index f61787abde..8e84963c09 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -633,7 +633,7 @@ BOOL cli_lock(struct cli_state *cli, int fnum, cli_send_smb(cli); if (timeout != 0) { - cli->timeout = (timeout == -1) ? 0x7FFFFFFF : (timeout + 2*1000); + cli->timeout = (timeout == -1) ? 0x7FFFFFFF : (timeout + 10*1000); } if (!cli_receive_smb(cli)) { -- cgit From 537e4d55651a51227fc7af4de0853165503c7b12 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 13 Mar 2003 04:35:15 +0000 Subject: fixed the unmarshalling of the queryaliasmem SAMR call (This used to be commit 80c45434092a881fe2c9ae7f90856deea4722cb0) --- source3/rpc_parse/parse_samr.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source3/rpc_parse/parse_samr.c b/source3/rpc_parse/parse_samr.c index d031d13955..222af57e5b 100644 --- a/source3/rpc_parse/parse_samr.c +++ b/source3/rpc_parse/parse_samr.c @@ -4623,13 +4623,17 @@ BOOL samr_io_r_query_aliasmem(const char *desc, SAMR_R_QUERY_ALIASMEM * r_u, for (i = 0; i < r_u->num_sids1; i++) { ptr_sid[i] = 1; - if(!prs_uint32("", ps, depth, &ptr_sid[i])) + if(!prs_uint32("ptr_sid", ps, depth, &ptr_sid[i])) return False; } + if (UNMARSHALLING(ps)) { + r_u->sid = talloc(ps->mem_ctx, r_u->num_sids1 * sizeof(DOM_SID)); + } + for (i = 0; i < r_u->num_sids1; i++) { if (ptr_sid[i] != 0) { - if(!smb_io_dom_sid2("", &r_u->sid[i], ps, depth)) + if(!smb_io_dom_sid2("sid", &r_u->sid[i], ps, depth)) return False; } } -- cgit From d2a85e518536796c69c689ded50cb6551d460f97 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 13 Mar 2003 04:36:32 +0000 Subject: show which files we fail to create in the casetable test (This used to be commit d40e3747cfa2994349aa84568f7b79457341a058) --- source3/torture/utable.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source3/torture/utable.c b/source3/torture/utable.c index d8a1557dbb..74d5f164c0 100644 --- a/source3/torture/utable.c +++ b/source3/torture/utable.c @@ -141,7 +141,7 @@ BOOL torture_casetable(int dummy) if (c == '.' || c == '\\') continue; - printf("%04x\n", c); + printf("%04x (%c)\n", c, isprint(c)?c:'.'); fname = form_name(c); fnum = cli_nt_create_full(cli, fname, @@ -150,7 +150,10 @@ BOOL torture_casetable(int dummy) FILE_SHARE_NONE, FILE_OPEN_IF, 0); - if (fnum == -1) continue; + if (fnum == -1) { + printf("Failed to create file with char %04x\n", c); + continue; + } size = 0; -- cgit From 5e7f809f8f2806f0315f81b109688b3e2ff8b950 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Thu, 13 Mar 2003 05:52:49 +0000 Subject: Fixed crash bug when calling tdb_unlockkeys() with no locked keys. woot! (This used to be commit eb432700c0010e536be3a0703f152c533357b851) --- source3/tdb/tdb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source3/tdb/tdb.c b/source3/tdb/tdb.c index ab50f40ef6..c414ae0d31 100644 --- a/source3/tdb/tdb.c +++ b/source3/tdb/tdb.c @@ -1954,6 +1954,8 @@ int tdb_lockkeys(TDB_CONTEXT *tdb, u32 number, TDB_DATA keys[]) void tdb_unlockkeys(TDB_CONTEXT *tdb) { u32 i; + if (!tdb->lockedkeys) + return; for (i = 0; i < tdb->lockedkeys[0]; i++) tdb_unlock(tdb, tdb->lockedkeys[i+1], F_WRLCK); SAFE_FREE(tdb->lockedkeys); -- cgit From 6d0a1eaaaad05b2860561619856698f8d1e193c1 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Thu, 13 Mar 2003 06:09:18 +0000 Subject: Added chainlock, chainunlock, lock_bystring and unlock_bystring methods. (This used to be commit cd5c47f47379a8c4021771ec28a9da0085f80d98) --- source3/python/py_tdb.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/source3/python/py_tdb.c b/source3/python/py_tdb.c index 4969c1047e..e525422a30 100644 --- a/source3/python/py_tdb.c +++ b/source3/python/py_tdb.c @@ -1,7 +1,7 @@ /* Python wrappers for TDB module - Copyright (C) Tim Potter, 2002 + Copyright (C) Tim Potter, 2002-2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -481,6 +481,82 @@ PyObject *py_tdb_hnd_traverse(PyObject *self, PyObject *args, PyObject *kw) return PyInt_FromLong(result); } +PyObject *py_tdb_hnd_chainlock(PyObject *self, PyObject *args) +{ + tdb_hnd_object *obj = (tdb_hnd_object *)self; + TDB_DATA key; + int result; + + if (!obj->tdb) { + PyErr_SetString(py_tdb_error, "tdb object has been closed"); + return NULL; + } + + if (!PyArg_ParseTuple(args, "s#", &key.dptr, &key.dsize)) + return NULL; + + result = tdb_chainlock(obj->tdb, key); + + return PyInt_FromLong(result != -1); +} + +PyObject *py_tdb_hnd_chainunlock(PyObject *self, PyObject *args) +{ + tdb_hnd_object *obj = (tdb_hnd_object *)self; + TDB_DATA key; + int result; + + if (!obj->tdb) { + PyErr_SetString(py_tdb_error, "tdb object has been closed"); + return NULL; + } + + if (!PyArg_ParseTuple(args, "s#", &key.dptr, &key.dsize)) + return NULL; + + result = tdb_chainunlock(obj->tdb, key); + + return PyInt_FromLong(result != -1); +} + +PyObject *py_tdb_hnd_lock_bystring(PyObject *self, PyObject *args) +{ + tdb_hnd_object *obj = (tdb_hnd_object *)self; + int result, timeout = 30; + char *s; + + if (!obj->tdb) { + PyErr_SetString(py_tdb_error, "tdb object has been closed"); + return NULL; + } + + if (!PyArg_ParseTuple(args, "s|i", &s, &timeout)) + return NULL; + + result = tdb_lock_bystring(obj->tdb, s, timeout); + + return PyInt_FromLong(result != -1); +} + +PyObject *py_tdb_hnd_unlock_bystring(PyObject *self, PyObject *args) +{ + tdb_hnd_object *obj = (tdb_hnd_object *)self; + char *s; + + if (!obj->tdb) { + PyErr_SetString(py_tdb_error, "tdb object has been closed"); + return NULL; + } + + if (!PyArg_ParseTuple(args, "s", &s)) + return NULL; + + tdb_unlock_bystring(obj->tdb, s); + + Py_INCREF(Py_None); + return Py_None; +} + /* * Method dispatch table for this module */ @@ -505,6 +581,10 @@ static PyMethodDef tdb_hnd_methods[] = { { "lock", (PyCFunction)py_tdb_hnd_lock, METH_VARARGS }, { "unlock", (PyCFunction)py_tdb_hnd_unlock, METH_VARARGS }, { "traverse", (PyCFunction)py_tdb_hnd_traverse, METH_VARARGS | METH_KEYWORDS }, + { "chainlock", (PyCFunction)py_tdb_hnd_chainlock, METH_VARARGS | METH_KEYWORDS }, + { "chainunlock", (PyCFunction)py_tdb_hnd_chainunlock, METH_VARARGS | METH_KEYWORDS }, + { "lock_bystring", (PyCFunction)py_tdb_hnd_lock_bystring, METH_VARARGS | METH_KEYWORDS }, + { "unlock_bystring", (PyCFunction)py_tdb_hnd_unlock_bystring, METH_VARARGS | METH_KEYWORDS }, { NULL } }; -- cgit From 9951cca72fcbba4d4f93ac0e30bab2e4f54487f5 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 13 Mar 2003 06:16:51 +0000 Subject: In Valgrind 1.9.4, the headers have moved to , etc. So check for that as well as the old names. (This used to be commit 1ffa4d75b75979b8abb409634212ce43a0826467) --- source3/configure.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source3/configure.in b/source3/configure.in index b2cd15b3b3..aa95cf19fe 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -556,7 +556,10 @@ AC_CHECK_HEADERS(sys/mount.h sys/vfs.h sys/fs/s5param.h sys/filsys.h termios.h t AC_CHECK_HEADERS(sys/termio.h sys/statfs.h sys/dustat.h sys/statvfs.h stdarg.h sys/sockio.h) AC_CHECK_HEADERS(security/pam_modules.h security/_pam_macros.h ldap.h lber.h dlfcn.h) AC_CHECK_HEADERS(sys/syslog.h syslog.h) -AC_CHECK_HEADERS(valgrind.h) + +# In valgrind 1.0.x, it's just valgrind.h. In 1.9.x+ there's a +# subdirectory of headers. +AC_CHECK_HEADERS(valgrind.h valgrind/valgrind.h valgrind/memcheck.h) # # HPUX has a bug in that including shadow.h causes a re-definition of MAXINT. -- cgit From 197f98aededbb456951be2d0d7f8ac587006a60d Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 13 Mar 2003 06:18:18 +0000 Subject: In Valgrind 1.9.4, the headers have moved to , etc. So check for that as well as the old names when including macros and conditionally defining -DVALGRIND. (This used to be commit c9151c7b1113e2f01bd33d4dd301a2e7e2040b35) --- source3/include/includes.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source3/include/includes.h b/source3/include/includes.h index b6abdd99ce..25245e9c0c 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -433,15 +433,19 @@ #include #endif -#if HAVE_VALGRIND_H -/* Special macros that are no-ops except when run under Valgrind on x86. */ +/* Special macros that are no-ops except when run under Valgrind on + * x86. They've moved a little bit from valgrind 1.0.4 to 1.9.4 */ +#if HAVE_VALGRIND_MEMCHECK_H + /* memcheck.h includes valgrind.h */ +#include +#elif HAVE_VALGRIND_H #include #endif /* If we have --enable-developer and the valgrind header is present, * then we're OK to use it. Set a macro so this logic can be done only * once. */ -#if defined(DEVELOPER) && HAVE_VALGRIND_H +#if defined(DEVELOPER) && (HAVE_VALGRIND_H || HAVE_VALGRIND_VALGRIND_H) #define VALGRIND #endif -- cgit From 593ed8d1d995d4b31b8798367f5a4e963ce2e312 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 13 Mar 2003 07:05:10 +0000 Subject: Add bin/libbigballofmud.a non-shared library. A bit easier to link to for testing than the .so. (http://www.laputan.org/mud/mud.html) (This used to be commit 386087d77f836b8133afc977c9c3e8e7845125dc) --- source3/Makefile.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source3/Makefile.in b/source3/Makefile.in index 3ae939c4f5..78cd5746a7 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -893,6 +893,10 @@ bin/libbigballofmud.@SHLIBEXT@: $(LIBBIGBALLOFMUD_PICOBJS) $(SHLD) $(LDSHFLAGS) -o $@ $(LIBBIGBALLOFMUD_PICOBJS) $(LIBS) \ @SONAMEFLAG@`basename $@`.$(LIBBIGBALLOFMUD_MAJOR) +bin/libbigballofmud.a: $(LIBBIGBALLOFMUD_OBJS) + @echo Linking bigballofmud non-shared library $@ + -$(AR) -rc $@ $(LIBBIGBALLOFMUD_OBJS) + libsmbclient: bin/libsmbclient.a @LIBSMBCLIENT_SHARED@ bin/librpc_lsarpc.@SHLIBEXT@: $(RPC_LSA_OBJ) -- cgit From 285886b3cf0b2e886d59ddafb4b06d6a2fb459ce Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Thu, 13 Mar 2003 14:55:44 +0000 Subject: Merge cifsntdomain.sgml fixes from 3.0 branch (This used to be commit fb85311941967fa1080b84103a01d16b4fd33926) --- docs/docbook/devdoc/cifsntdomain.sgml | 61 ++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/docs/docbook/devdoc/cifsntdomain.sgml b/docs/docbook/devdoc/cifsntdomain.sgml index 0197f4e1be..7c3c22d106 100644 --- a/docs/docbook/devdoc/cifsntdomain.sgml +++ b/docs/docbook/devdoc/cifsntdomain.sgml @@ -2662,18 +2662,22 @@ pwdump(machine$) (initially) == md4(lmowf(unicode(machine))) Protocol - -C->S ReqChal,Cc S->C Cs - + +C->S ReqChal,Cc +S->C Cs + - + C & S compute session key Ks = E(PW[9..15],E(PW[0..6],Add(Cc,Cs))) - + - -C: Rc = Cred(Ks,Cc) C->S Authenticate,Rc S: Rs = Cred(Ks,Cs), -assert(Rc == Cred(Ks,Cc)) S->C Rs C: assert(Rs == Cred(Ks,Cs)) - + +C: Rc = Cred(Ks,Cc) +C->S Authenticate,Rc +S: Rs = Cred(Ks,Cs), assert(Rc == Cred(Ks,Cc)) +S->C Rs +C: assert(Rs == Cred(Ks,Cs)) + On joining the domain the client will optionally attempt to change its @@ -2681,29 +2685,34 @@ password and the domain controller may refuse to update it depending on registry settings. This will also occur weekly afterwards. - -C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S ServerPasswordSet,Rc',Tc, -arc4(Ks[0..7,16],lmowf(randompassword()) C: Rc = Cred(Ks,Rc+Tc+1) S: -assert(Rc' == Cred(Ks,Rc+Tc)), Ts = Time() S: Rs' = Cred(Ks,Rs+Tc+1) -S->C Rs',Ts C: assert(Rs' == Cred(Ks,Rs+Tc+1)) S: Rs = Rs' - + +C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) +C->S ServerPasswordSet,Rc',Tc,arc4(Ks[0..7,16],lmowf(randompassword()) +C: Rc = Cred(Ks,Rc+Tc+1) +S: assert(Rc' == Cred(Ks,Rc+Tc)), Ts = Time() +S: Rs' = Cred(Ks,Rs+Tc+1) +S->C Rs',Ts +C: assert(Rs' == Cred(Ks,Rs+Tc+1)) +S: Rs = Rs' + User: U with password P wishes to login to the domain (incidental data such as workstation and domain omitted) - -C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) C->S NetLogonSamLogon,Rc',Tc,U, -arc4(Ks[0..7,16],16,ntowf(P),16), arc4(Ks[0..7,16],16,lmowf(P),16) S: -assert(Rc' == Cred(Ks,Rc+Tc)) assert(passwords match those in SAM) S: -Ts = Time() - - - -S->C Cred(Ks,Cred(Ks,Rc+Tc+1)),userinfo(logon script,UID,SIDs,etc) C: -assert(Rs == Cred(Ks,Cred(Rc+Tc+1)) C: Rc = Cred(Ks,Rc+Tc+1) - + +C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc) +C->S NetLogonSamLogon,Rc',Tc,U,arc4(Ks[0..7,16],16,ntowf(P),16), arc4(Ks[0..7,16],16,lmowf(P),16) +S: assert(Rc' == Cred(Ks,Rc+Tc)) assert(passwords match those in SAM) +S: Ts = Time() + + + +S->C Cred(Ks,Cred(Ks,Rc+Tc+1)),userinfo(logon script,UID,SIDs,etc) +C: assert(Rs == Cred(Ks,Cred(Rc+Tc+1)) +C: Rc = Cred(Ks,Rc+Tc+1) + -- cgit From f764518bd100310a35b5d8cd9b747b12ae4a4755 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 14 Mar 2003 04:50:17 +0000 Subject: Merge from Subversion * Better report formatting (This used to be commit e7eafa10da828b4dc46a05a99164eb8ac37563df) --- source3/stf/comfychair.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/stf/comfychair.py b/source3/stf/comfychair.py index b552baccd2..d7e23efc10 100644 --- a/source3/stf/comfychair.py +++ b/source3/stf/comfychair.py @@ -170,7 +170,7 @@ Output: # Either we could not execute the command or the command # returned exit code 127. According to system(3) we can't # tell the difference. - raise NotRunError, "could not execute %s" % cmd + raise NotRunError, "could not execute %s" % `cmd` return rc, output def explain_failure(self, exc_info = None): @@ -213,7 +213,7 @@ def runtests(test_list, verbose = 0): import traceback ret = 0 for test_class in test_list: - print "%-60s" % _test_name(test_class), + print "%-30s" % _test_name(test_class), # flush now so that long running tests are easier to follow sys.stdout.flush() -- cgit From bc7f13cdb36212d0e2f9a8d86be9892a3c9dd373 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 14 Mar 2003 04:54:10 +0000 Subject: Add examples of ComfyChair (This used to be commit dfee0a6ad5d203df04df8a54da87ff5e493a33ca) --- source3/stf/example.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100755 source3/stf/example.py diff --git a/source3/stf/example.py b/source3/stf/example.py new file mode 100755 index 0000000000..1f121fd9af --- /dev/null +++ b/source3/stf/example.py @@ -0,0 +1,33 @@ +#! /usr/bin/env python + +# Copyright (C) 2003 by Martin Pool +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA + + +"""example of using ComfyChair""" + +import comfychair + +class OnePlusOne(comfychair.TestCase): + def runtest(self): + self.assert_(1 + 1 == 2) + +tests = [OnePlusOne] + +if __name__ == '__main__': + comfychair.main(tests) + -- cgit From e37372f4d6e10204adf272f978524751420e890f Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 14 Mar 2003 10:02:12 +0000 Subject: Found by metze with the clobber-region check - if it's a pstring, use pstrcpy(). Andrew Bartlett (This used to be commit f9c3c93f55cac774e576fd5975c0582e0b334d6a) --- source3/libsmb/clifile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 8e84963c09..d86f36405d 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -948,7 +948,7 @@ BOOL cli_chkpath(struct cli_state *cli, const char *path) pstring path2; char *p; - safe_strcpy(path2,path,sizeof(pstring)); + pstrcpy(path2,path); trim_string(path2,NULL,"\\"); if (!*path2) *path2 = '\\'; -- cgit From 33c8a6779d490bd1aa722231a59a3b68343dbc17 Mon Sep 17 00:00:00 2001 From: Rafal Szczesniak Date: Fri, 14 Mar 2003 17:05:13 +0000 Subject: /tmp/newfun.msg (This used to be commit 3f4cb7b2c4d9b54b41bcc184ccfd00032e2b021b) --- source3/Makefile.in | 4 +- source3/libsmb/trust_passwd.c | 116 ---------------------------- source3/libsmb/trusts_util.c | 174 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 118 deletions(-) delete mode 100644 source3/libsmb/trust_passwd.c create mode 100644 source3/libsmb/trusts_util.c diff --git a/source3/Makefile.in b/source3/Makefile.in index 78cd5746a7..e42dd1f395 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -214,8 +214,8 @@ LIBMSRPC_OBJ = rpc_client/cli_lsarpc.o rpc_client/cli_samr.o \ rpc_client/cli_reg.o rpc_client/cli_pipe.o \ rpc_client/cli_spoolss.o rpc_client/cli_spoolss_notify.o \ rpc_client/cli_ds.o libsmb/namequery_dc.o - -LIBMSRPC_SERVER_OBJ = libsmb/trust_passwd.o + +LIBMSRPC_SERVER_OBJ = libsmb/trusts_util.o REGOBJS_OBJ = registry/reg_objects.o REGISTRY_OBJ = registry/reg_frontend.o registry/reg_cachehook.o registry/reg_printing.o \ diff --git a/source3/libsmb/trust_passwd.c b/source3/libsmb/trust_passwd.c deleted file mode 100644 index cf9fd58b13..0000000000 --- a/source3/libsmb/trust_passwd.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Unix SMB/CIFS implementation. - * Routines to change trust account passwords. - * Copyright (C) Andrew Bartlett 2001. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "includes.h" - -/********************************************************* - Change the domain password on the PDC. - - Just changes the password betwen the two values specified. - - Caller must have the cli connected to the netlogon pipe - already. -**********************************************************/ -static NTSTATUS just_change_the_password(struct cli_state *cli, TALLOC_CTX *mem_ctx, - unsigned char orig_trust_passwd_hash[16], - unsigned char new_trust_passwd_hash[16]) -{ - NTSTATUS result; - uint32 neg_flags = 0x000001ff; - - result = cli_nt_setup_creds(cli, get_sec_chan(), orig_trust_passwd_hash, &neg_flags, 2); - - if (!NT_STATUS_IS_OK(result)) { - DEBUG(1,("just_change_the_password: unable to setup creds (%s)!\n", - nt_errstr(result))); - return result; - } - - result = cli_net_srv_pwset(cli, mem_ctx, global_myname(), new_trust_passwd_hash); - - if (!NT_STATUS_IS_OK(result)) { - DEBUG(0,("just_change_the_password: unable to change password (%s)!\n", - nt_errstr(result))); - } - return result; -} - -/********************************************************* - Change the domain password on the PDC. - Store the password ourselves, but use the supplied password - Caller must have already setup the connection to the NETLOGON pipe -**********************************************************/ - -NTSTATUS trust_pw_change_and_store_it(struct cli_state *cli, TALLOC_CTX *mem_ctx, - unsigned char orig_trust_passwd_hash[16]) -{ - unsigned char new_trust_passwd_hash[16]; - char *new_trust_passwd; - char *str; - NTSTATUS nt_status; - - /* Create a random machine account password */ - str = generate_random_str(DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH); - new_trust_passwd = talloc_strdup(mem_ctx, str); - - E_md4hash(new_trust_passwd, new_trust_passwd_hash); - - nt_status = just_change_the_password(cli, mem_ctx, orig_trust_passwd_hash, - new_trust_passwd_hash); - - if (NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("%s : trust_pw_change_and_store_it: Changed password.\n", - timestring(False))); - /* - * Return the result of trying to write the new password - * back into the trust account file. - */ - if (!secrets_store_machine_password(new_trust_passwd)) { - nt_status = NT_STATUS_UNSUCCESSFUL; - } - } - - return nt_status; -} - -/********************************************************* - Change the domain password on the PDC. - Do most of the legwork ourselfs. Caller must have - already setup the connection to the NETLOGON pipe -**********************************************************/ - -NTSTATUS trust_pw_find_change_and_store_it(struct cli_state *cli, TALLOC_CTX *mem_ctx, - const char *domain) -{ - unsigned char old_trust_passwd_hash[16]; - char *up_domain; - - up_domain = talloc_strdup(mem_ctx, domain); - - if (!secrets_fetch_trust_account_password(domain, - old_trust_passwd_hash, - NULL)) { - DEBUG(0, ("could not fetch domain secrets for domain %s!\n", domain)); - return NT_STATUS_UNSUCCESSFUL; - } - - return trust_pw_change_and_store_it(cli, mem_ctx, old_trust_passwd_hash); - -} diff --git a/source3/libsmb/trusts_util.c b/source3/libsmb/trusts_util.c new file mode 100644 index 0000000000..055851f6b7 --- /dev/null +++ b/source3/libsmb/trusts_util.c @@ -0,0 +1,174 @@ +/* + * Unix SMB/CIFS implementation. + * Routines to operate on various trust relationships + * Copyright (C) Andrew Bartlett 2001 + * Copyright (C) Rafal Szczesniak 2003 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "includes.h" + +/********************************************************* + Change the domain password on the PDC. + + Just changes the password betwen the two values specified. + + Caller must have the cli connected to the netlogon pipe + already. +**********************************************************/ +static NTSTATUS just_change_the_password(struct cli_state *cli, TALLOC_CTX *mem_ctx, + unsigned char orig_trust_passwd_hash[16], + unsigned char new_trust_passwd_hash[16]) +{ + NTSTATUS result; + uint32 neg_flags = 0x000001ff; + + result = cli_nt_setup_creds(cli, get_sec_chan(), orig_trust_passwd_hash, &neg_flags, 2); + + if (!NT_STATUS_IS_OK(result)) { + DEBUG(1,("just_change_the_password: unable to setup creds (%s)!\n", + nt_errstr(result))); + return result; + } + + result = cli_net_srv_pwset(cli, mem_ctx, global_myname(), new_trust_passwd_hash); + + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0,("just_change_the_password: unable to change password (%s)!\n", + nt_errstr(result))); + } + return result; +} + +/********************************************************* + Change the domain password on the PDC. + Store the password ourselves, but use the supplied password + Caller must have already setup the connection to the NETLOGON pipe +**********************************************************/ + +NTSTATUS trust_pw_change_and_store_it(struct cli_state *cli, TALLOC_CTX *mem_ctx, + unsigned char orig_trust_passwd_hash[16]) +{ + unsigned char new_trust_passwd_hash[16]; + char *new_trust_passwd; + char *str; + NTSTATUS nt_status; + + /* Create a random machine account password */ + str = generate_random_str(DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH); + new_trust_passwd = talloc_strdup(mem_ctx, str); + + E_md4hash(new_trust_passwd, new_trust_passwd_hash); + + nt_status = just_change_the_password(cli, mem_ctx, orig_trust_passwd_hash, + new_trust_passwd_hash); + + if (NT_STATUS_IS_OK(nt_status)) { + DEBUG(3,("%s : trust_pw_change_and_store_it: Changed password.\n", + timestring(False))); + /* + * Return the result of trying to write the new password + * back into the trust account file. + */ + if (!secrets_store_machine_password(new_trust_passwd)) { + nt_status = NT_STATUS_UNSUCCESSFUL; + } + } + + return nt_status; +} + +/********************************************************* + Change the domain password on the PDC. + Do most of the legwork ourselfs. Caller must have + already setup the connection to the NETLOGON pipe +**********************************************************/ + +NTSTATUS trust_pw_find_change_and_store_it(struct cli_state *cli, TALLOC_CTX *mem_ctx, + const char *domain) +{ + unsigned char old_trust_passwd_hash[16]; + char *up_domain; + + up_domain = talloc_strdup(mem_ctx, domain); + + if (!secrets_fetch_trust_account_password(domain, + old_trust_passwd_hash, + NULL)) { + DEBUG(0, ("could not fetch domain secrets for domain %s!\n", domain)); + return NT_STATUS_UNSUCCESSFUL; + } + + return trust_pw_change_and_store_it(cli, mem_ctx, old_trust_passwd_hash); + +} + + +/** + * Verify whether or not given domain is trusted. + * + * @param domain_name name of the domain to be verified + * @return true if domain is one of the trusted once or + * false if otherwise + **/ + +BOOL is_trusted_domain(const char* dom_name) +{ + int enum_ctx = 0; + const int trustdom_size = 10; + int num_domains, i; + TRUSTDOM **domains; + NTSTATUS result; + fstring trustdom_name; + DOM_SID trustdom_sid; + TALLOC_CTX *mem_ctx; + + /* + * Query the secrets db as an ultimate source of information + * about trusted domain names. This is PDC or BDC case. + */ + mem_ctx = talloc_init("is_trusted_domain"); + + do { + result = secrets_get_trusted_domains(mem_ctx, &enum_ctx, trustdom_size, + &num_domains, &domains); + /* compare each returned entry against incoming connection's domain */ + for (i = 0; i < num_domains; i++) { + pull_ucs2_fstring(trustdom_name, domains[i]->name); + if (strequal(trustdom_name, dom_name)) { + talloc_destroy(mem_ctx); + return True; + } + } + } while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)); + + /* + * Query the trustdom_cache updated periodically. The only + * way for domain member server. + */ + if (trustdom_cache_enable() && + trustdom_cache_fetch(dom_name, &trustdom_sid)) { + trustdom_cache_shutdown(); + return True; + } + + /* + * if nothing's been found, then give up here, although + * the last resort might be to query the PDC. + */ + return False; +} + -- cgit From e583dd6278fedf9ad45b551dccf94fbe6c785119 Mon Sep 17 00:00:00 2001 From: Rafal Szczesniak Date: Fri, 14 Mar 2003 17:12:40 +0000 Subject: Fresh meat in trusted domains code: - packing/unpacking utility functions for trusted domain password struct; can be used to prepare buffer to store in secrets.tdb or (soon) passdb backend - similiar functions for DOM_SID - respectively modified secrets_(fetch|store) routines - new auth mapping code utilising introduced is_trusted_domain function - added tdb (un)packing of single bytes Rafal (This used to be commit 5281ee7e84421b9be746aed2f1718ceaf2a2fe3d) --- source3/auth/auth_util.c | 26 ++------ source3/include/secrets.h | 4 +- source3/passdb/secrets.c | 77 ++++++++++++++--------- source3/tdb/tdbutil.c | 153 +++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 201 insertions(+), 59 deletions(-) diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c index 7d85153bd0..a6ad2b883b 100644 --- a/source3/auth/auth_util.c +++ b/source3/auth/auth_util.c @@ -227,27 +227,13 @@ NTSTATUS make_user_info_map(auth_usersupplied_info **user_info, domain = client_domain; - if ((smb_name) && (*smb_name)) { /* Don't do this for guests */ - char *user = NULL; - if (asprintf(&user, "%s%s%s", - client_domain, lp_winbind_separator(), - smb_name) < 0) { - DEBUG(0, ("make_user_info_map: asprintf() failed!\n")); - return NT_STATUS_NO_MEMORY; - } - - DEBUG(5, ("make_user_info_map: testing for user %s\n", user)); - - if (Get_Pwnam(user) == NULL) { - DEBUG(5, ("make_user_info_map: test for user %s failed\n", user)); - domain = lp_workgroup(); - DEBUG(5, ("make_user_info_map: trusted domain %s doesn't appear to exist, using %s\n", - client_domain, domain)); - } else { - DEBUG(5, ("make_user_info_map: using trusted domain %s\n", domain)); - } - SAFE_FREE(user); + if (is_trusted_domain(domain)) { + return make_user_info(user_info, smb_name, internal_username, + client_domain, domain, wksta_name, + lm_pwd, nt_pwd, plaintext, ntlmssp_flags, + encrypted); } + } else { domain = lp_workgroup(); } diff --git a/source3/include/secrets.h b/source3/include/secrets.h index 183b29d7a8..07faf28d43 100644 --- a/source3/include/secrets.h +++ b/source3/include/secrets.h @@ -57,14 +57,14 @@ struct machine_acct_pass { /* * storage structure for trusted domain */ -struct trusted_dom_pass { +typedef struct trusted_dom_pass { size_t uni_name_len; smb_ucs2_t uni_name[32]; /* unicode domain name */ size_t pass_len; fstring pass; /* trust relationship's password */ time_t mod_time; DOM_SID domain_sid; /* remote domain's sid */ -}; +} TRUSTED_DOM_PASS; /* * trusted domain entry/entries returned by secrets_get_trusted_domains diff --git a/source3/passdb/secrets.c b/source3/passdb/secrets.c index 2b944a9941..4b0913a624 100644 --- a/source3/passdb/secrets.c +++ b/source3/passdb/secrets.c @@ -265,38 +265,44 @@ BOOL secrets_fetch_trust_account_password(const char *domain, uint8 ret_pwd[16], ************************************************************************/ BOOL secrets_fetch_trusted_domain_password(const char *domain, char** pwd, - DOM_SID *sid, time_t *pass_last_set_time) + DOM_SID *sid, time_t *pass_last_set_time) { - struct trusted_dom_pass *pass; + struct trusted_dom_pass pass; size_t size; + + /* unpacking structures */ + char* pass_buf; + int pass_len = 0; + + ZERO_STRUCT(pass); /* fetching trusted domain password structure */ - if (!(pass = secrets_fetch(trustdom_keystr(domain), &size))) { + if (!(pass_buf = secrets_fetch(trustdom_keystr(domain), &size))) { DEBUG(5, ("secrets_fetch failed!\n")); return False; } - if (size != sizeof(*pass)) { - DEBUG(0, ("secrets were of incorrect size!\n")); + /* unpack trusted domain password */ + pass_len = tdb_trusted_dom_pass_unpack(pass_buf, size, &pass); + if (pass_len != size) { + DEBUG(5, ("Invalid secrets size. Unpacked data doesn't match trusted_dom_pass structure.\n")); return False; } - + /* the trust's password */ if (pwd) { - *pwd = strdup(pass->pass); + *pwd = strdup(pass.pass); if (!*pwd) { return False; } } /* last change time */ - if (pass_last_set_time) *pass_last_set_time = pass->mod_time; + if (pass_last_set_time) *pass_last_set_time = pass.mod_time; /* domain sid */ - memcpy(&sid, &(pass->domain_sid), sizeof(sid)); - - SAFE_FREE(pass); - + sid_copy(sid, &pass.domain_sid); + return True; } @@ -315,7 +321,7 @@ BOOL secrets_store_trust_account_password(const char *domain, uint8 new_pwd[16]) } /** - * Routine to set the password for trusted domain + * Routine to store the password for trusted domain * * @param domain remote domain name * @param pwd plain text password of trust relationship @@ -325,12 +331,17 @@ BOOL secrets_store_trust_account_password(const char *domain, uint8 new_pwd[16]) **/ BOOL secrets_store_trusted_domain_password(const char* domain, smb_ucs2_t *uni_dom_name, - size_t uni_name_len, const char* pwd, - DOM_SID sid) -{ + size_t uni_name_len, const char* pwd, + DOM_SID sid) +{ + /* packing structures */ + pstring pass_buf; + int pass_len = 0; + int pass_buf_len = sizeof(pass_buf); + struct trusted_dom_pass pass; ZERO_STRUCT(pass); - + /* unicode domain name and its length */ if (!uni_dom_name) return False; @@ -346,9 +357,11 @@ BOOL secrets_store_trusted_domain_password(const char* domain, smb_ucs2_t *uni_d fstrcpy(pass.pass, pwd); /* domain sid */ - memcpy(&(pass.domain_sid), &sid, sizeof(sid)); + sid_copy(&pass.domain_sid, &sid); + + pass_len = tdb_trusted_dom_pass_pack(pass_buf, pass_buf_len, &pass); - return secrets_store(trustdom_keystr(domain), (void *)&pass, sizeof(pass)); + return secrets_store(trustdom_keystr(domain), (void *)&pass_buf, pass_len); } /************************************************************************ @@ -475,9 +488,10 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in char *pattern; unsigned int start_idx; uint32 idx = 0; - size_t size; + size_t size, packed_size = 0; fstring dom_name; - struct trusted_dom_pass *pass; + char *packed_pass; + struct trusted_dom_pass *pass = talloc_zero(ctx, sizeof(struct trusted_dom_pass)); NTSTATUS status; if (!secrets_init()) return NT_STATUS_ACCESS_DENIED; @@ -505,7 +519,7 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in */ status = NT_STATUS_NO_MORE_ENTRIES; - /* searching for keys in sectrets db -- way to go ... */ + /* searching for keys in secrets db -- way to go ... */ for (k = keys; k; k = k->next) { char *secrets_key; @@ -516,14 +530,20 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in return NT_STATUS_NO_MEMORY; } - pass = secrets_fetch(secrets_key, &size); - - if (size != sizeof(*pass)) { + packed_pass = secrets_fetch(secrets_key, &size); + packed_size = tdb_trusted_dom_pass_unpack(packed_pass, size, pass); + + if (size != packed_size) { DEBUG(2, ("Secrets record %s is invalid!\n", secrets_key)); SAFE_FREE(pass); - continue; + if (size) SAFE_FREE(packed_pass); + + return NT_STATUS_UNSUCCESSFUL; } + /* packed representation isn't needed anymore */ + SAFE_FREE(packed_pass); + pull_ucs2_fstring(dom_name, pass->uni_name); DEBUG(18, ("Fetched secret record num %d.\nDomain name: %s, SID: %s\n", idx, dom_name, sid_string_static(&pass->domain_sid))); @@ -569,10 +589,7 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in start_idx, max_num_domains)); } - idx++; - - /* free returned tdb record */ - SAFE_FREE(pass); + idx++; } DEBUG(5, ("secrets_get_trusted_domains: got %d domains\n", *num_domains)); diff --git a/source3/tdb/tdbutil.c b/source3/tdb/tdbutil.c index 0d8f6128cc..b153d442bd 100644 --- a/source3/tdb/tdbutil.c +++ b/source3/tdb/tdbutil.c @@ -42,7 +42,7 @@ static void gotalarm_sig(void) static TDB_DATA make_tdb_data(const char *dptr, size_t dsize) { TDB_DATA ret; - ret.dptr = dptr; + ret.dptr = smb_xstrdup(dptr); ret.dsize = dsize; return ret; } @@ -387,6 +387,7 @@ BOOL tdb_change_uint32_atomic(TDB_CONTEXT *tdb, const char *keystr, uint32 *oldv size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) { va_list ap; + uint8 bt; uint16 w; uint32 d; int i; @@ -402,40 +403,46 @@ size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) while (*fmt) { switch ((c = *fmt++)) { - case 'w': + case 'b': /* unsigned 8-bit integer */ + len = 1; + bt = (uint8)va_arg(ap, int); + if (bufsize >= len) + SSVAL(buf, 0, bt); + break; + case 'w': /* unsigned 16-bit integer */ len = 2; w = (uint16)va_arg(ap, int); if (bufsize >= len) SSVAL(buf, 0, w); break; - case 'd': + case 'd': /* signed 32-bit integer (standard int in most systems) */ len = 4; d = va_arg(ap, uint32); if (bufsize >= len) SIVAL(buf, 0, d); break; - case 'p': + case 'p': /* pointer */ len = 4; p = va_arg(ap, void *); d = p?1:0; if (bufsize >= len) SIVAL(buf, 0, d); break; - case 'P': + case 'P': /* null-terminated string */ s = va_arg(ap,char *); w = strlen(s); len = w + 1; if (bufsize >= len) memcpy(buf, s, len); break; - case 'f': + case 'f': /* null-terminated string */ s = va_arg(ap,char *); w = strlen(s); len = w + 1; if (bufsize >= len) memcpy(buf, s, len); break; - case 'B': + case 'B': /* fixed-length string */ i = va_arg(ap, int); s = va_arg(ap, char *); len = 4+i; @@ -471,6 +478,7 @@ size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) int tdb_unpack(char *buf, int bufsize, const char *fmt, ...) { va_list ap; + uint8 *bt; uint16 *w; uint32 *d; int len; @@ -486,6 +494,13 @@ int tdb_unpack(char *buf, int bufsize, const char *fmt, ...) while (*fmt) { switch ((c=*fmt++)) { + case 'b': + len = 1; + bt = va_arg(ap, uint8 *); + if (bufsize < len) + goto no_space; + *bt = SVAL(buf, 0); + break; case 'w': len = 2; w = va_arg(ap, uint16 *); @@ -563,6 +578,130 @@ int tdb_unpack(char *buf, int bufsize, const char *fmt, ...) return -1; } + +/** + * Pack SID passed by pointer + * + * @param pack_buf pointer to buffer which is to be filled with packed data + * @param bufsize size of packing buffer + * @param sid pointer to sid to be packed + * + * @return length of the packed representation of the whole structure + **/ +size_t tdb_sid_pack(char* pack_buf, int bufsize, DOM_SID* sid) +{ + int idx; + size_t len = 0; + + if (!sid || !pack_buf) return -1; + + len += tdb_pack(pack_buf + len, bufsize - len, "bb", sid->sid_rev_num, + sid->num_auths); + + for (idx = 0; idx < 6; idx++) { + len += tdb_pack(pack_buf + len, bufsize - len, "b", sid->id_auth[idx]); + } + + for (idx = 0; idx < MAXSUBAUTHS; idx++) { + len += tdb_pack(pack_buf + len, bufsize - len, "d", sid->sub_auths[idx]); + } + + return len; +} + + +/** + * Unpack SID into a pointer + * + * @param pack_buf pointer to buffer with packed representation + * @param bufsize size of the buffer + * @param sid pointer to sid structure to be filled with unpacked data + * + * @return size of structure unpacked from buffer + **/ +size_t tdb_sid_unpack(char* pack_buf, int bufsize, DOM_SID* sid) +{ + int idx, len = 0; + + if (!sid || !pack_buf) return -1; + + len += tdb_unpack(pack_buf + len, bufsize - len, "bb", + &sid->sid_rev_num, &sid->num_auths); + + for (idx = 0; idx < 6; idx++) { + len += tdb_unpack(pack_buf + len, bufsize - len, "b", &sid->id_auth[idx]); + } + + for (idx = 0; idx < MAXSUBAUTHS; idx++) { + len += tdb_unpack(pack_buf + len, bufsize - len, "d", &sid->sub_auths[idx]); + } + + return len; +} + + +/** + * Pack TRUSTED_DOM_PASS passed by pointer + * + * @param pack_buf pointer to buffer which is to be filled with packed data + * @param bufsize size of the buffer + * @param pass pointer to trusted domain password to be packed + * + * @return length of the packed representation of the whole structure + **/ +size_t tdb_trusted_dom_pass_pack(char* pack_buf, int bufsize, TRUSTED_DOM_PASS* pass) +{ + int idx, len = 0; + + if (!pack_buf || !pass) return -1; + + /* packing unicode domain name and password */ + len += tdb_pack(pack_buf + len, bufsize - len, "d", pass->uni_name_len); + + for (idx = 0; idx < 32; idx++) + len += tdb_pack(pack_buf + len, bufsize - len, "w", pass->uni_name[idx]); + + len += tdb_pack(pack_buf + len, bufsize - len, "dPd", pass->pass_len, + pass->pass, pass->mod_time); + + /* packing SID structure */ + len += tdb_sid_pack(pack_buf + len, bufsize - len, &pass->domain_sid); + + return len; +} + + +/** + * Unpack TRUSTED_DOM_PASS passed by pointer + * + * @param pack_buf pointer to buffer with packed representation + * @param bufsize size of the buffer + * @param pass pointer to trusted domain password to be filled with unpacked data + * + * @return size of structure unpacked from buffer + **/ +size_t tdb_trusted_dom_pass_unpack(char* pack_buf, int bufsize, TRUSTED_DOM_PASS* pass) +{ + int idx, len = 0; + + if (!pack_buf || !pass) return -1; + + /* unpack unicode domain name and plaintext password */ + len += tdb_unpack(pack_buf, bufsize - len, "d", &pass->uni_name_len); + + for (idx = 0; idx < 32; idx++) + len += tdb_unpack(pack_buf + len, bufsize - len, "w", &pass->uni_name[idx]); + + len += tdb_unpack(pack_buf + len, bufsize - len, "dPd", &pass->pass_len, &pass->pass, + &pass->mod_time); + + /* unpack domain sid */ + len += tdb_sid_unpack(pack_buf + len, bufsize - len, &pass->domain_sid); + + return len; +} + + /**************************************************************************** Log tdb messages via DEBUG(). ****************************************************************************/ -- cgit From 5f86db85dfe26ad235dae8bb479cac8ef9af2d15 Mon Sep 17 00:00:00 2001 From: Rafal Szczesniak Date: Fri, 14 Mar 2003 17:16:33 +0000 Subject: Extending code to work both in case of domain membership and domain controller respecting interdomain trust relationships. In the latter case we need to find DC of remote domain instead of ours. In the former 'domain' is our domain name. Rafal (This used to be commit 0cd45d5d3b3e3ec5a589c3ee9f0e369901eefe8f) --- source3/auth/auth_domain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/auth/auth_domain.c b/source3/auth/auth_domain.c index 0d90a184a4..079bb49a21 100644 --- a/source3/auth/auth_domain.c +++ b/source3/auth/auth_domain.c @@ -272,7 +272,7 @@ static NTSTATUS find_connect_dc(struct cli_state **cli, struct in_addr dc_ip; fstring srv_name; - if ( !rpc_find_dc(lp_workgroup(), srv_name, &dc_ip) ) { + if (!rpc_find_dc(domain, srv_name, &dc_ip)) { DEBUG(0,("find_connect_dc: Failed to find an DCs for %s\n", lp_workgroup())); return NT_STATUS_NO_LOGON_SERVERS; } -- cgit From 9db9982cd34d36d8b23e94a4063761c8b6aa9e17 Mon Sep 17 00:00:00 2001 From: Rafal Szczesniak Date: Fri, 14 Mar 2003 17:20:13 +0000 Subject: We haven't implemented The Singing Contexts so far. Who knows what .NET server brings, though ...? ;-) Rafal (This used to be commit d81b0d26903004be6a99ac029dd531fd18947268) --- source3/libsmb/smb_signing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/libsmb/smb_signing.c b/source3/libsmb/smb_signing.c index 40359c5c8c..c3538ee9fd 100644 --- a/source3/libsmb/smb_signing.c +++ b/source3/libsmb/smb_signing.c @@ -417,7 +417,7 @@ BOOL cli_temp_set_signing(struct cli_state *cli) } /** - * Free the singing context + * Free the signing context */ void cli_free_signing_context(struct cli_state *cli) -- cgit From 7ae555c43c55ab95f75fb4afdd3d2bcb403ad3b3 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 14 Mar 2003 23:11:19 +0000 Subject: fix WinXP & Win2K3 remote_arch and check pointer in ntlmssp code before dereferencing (This used to be commit 2487480228b99183cab9e34ab497997e0c144ed6) --- source3/Makefile.in | 5 +++-- source3/lib/util.c | 16 ++++++++++++++++ source3/smbd/sesssetup.c | 35 ++++++++++++++++++----------------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index e42dd1f395..2334e278f2 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -85,6 +85,7 @@ PIDDIR = @piddir@ # man pages language(s) man_langs = "@manlangs@" +LIBSMBCLIENT=bin/libsmbclient.a @LIBSMBCLIENT_SHARED@ LIBSMBCLIENT_MAJOR=0 LIBSMBCLIENT_MINOR=1 @@ -897,7 +898,7 @@ bin/libbigballofmud.a: $(LIBBIGBALLOFMUD_OBJS) @echo Linking bigballofmud non-shared library $@ -$(AR) -rc $@ $(LIBBIGBALLOFMUD_OBJS) -libsmbclient: bin/libsmbclient.a @LIBSMBCLIENT_SHARED@ +libsmbclient: $(LIBSMBCLIENT) bin/librpc_lsarpc.@SHLIBEXT@: $(RPC_LSA_OBJ) @echo "Linking $@" @@ -1135,7 +1136,7 @@ TOPFILES=dynconfig.o dynconfig.po clean: delheaders python_clean -rm -f core */*~ *~ */*.o */*.po */*.po32 */*.@SHLIBEXT@ \ - $(TOPFILES) $(BIN_PROGS) $(SBIN_PROGS) $(MODULES) $(TORTURE_PROGS) .headers.stamp + $(TOPFILES) $(BIN_PROGS) $(SBIN_PROGS) $(MODULES) $(TORTURE_PROGS) $(LIBSMBCLIENT) .headers.stamp # Making this target will just make sure that the prototype files # exist, not necessarily that they are up to date. Since they're diff --git a/source3/lib/util.c b/source3/lib/util.c index 8d62db5ebb..77ffa70a47 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -1740,6 +1740,22 @@ BOOL is_myworkgroup(const char *s) return(ret); } +/******************************************************************* + we distinguish between 2K and XP by the "Native Lan Manager" string + WinXP => "Windows 2002 5.1" + Win2k => "Windows 2000 5.0" + NT4 => "Windows NT 4.0" + Win9x => "Windows 4.0" +********************************************************************/ + +void ra_lanman_string( const char *native_lanman ) +{ + if ( 0 == strcmp( native_lanman, "Windows 2002 5.1" ) ) + set_remote_arch( RA_WINXP ); + else if ( 0 == strcmp( native_lanman, "Windows .NET 5.2" ) ) + set_remote_arch( RA_WIN2K3 ); +} + /******************************************************************* Set the horrid remote_arch string based on an enum. ********************************************************************/ diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index 70158a9015..674f6145d3 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -396,8 +396,10 @@ static int reply_spnego_auth(connection_struct *conn, char *inbuf, char *outbuf, return ERROR_NT(NT_STATUS_LOGON_FAILURE); } + if ( global_ntlmssp_state ) { nt_status = auth_ntlmssp_update(global_ntlmssp_state, auth, &auth_reply); + } data_blob_free(&auth); @@ -422,6 +424,10 @@ static int reply_sesssetup_and_X_spnego(connection_struct *conn, char *inbuf, DATA_BLOB blob1; int ret; size_t bufrem; + fstring native_os, native_lanman; + char *p2; + uint16 data_blob_len = SVAL(inbuf, smb_vwv7); + enum remote_arch_types ra_type = get_remote_arch(); DEBUG(3,("Doing spnego session setup\n")); @@ -431,19 +437,27 @@ static int reply_sesssetup_and_X_spnego(connection_struct *conn, char *inbuf, p = (uint8 *)smb_buf(inbuf); - if (SVAL(inbuf, smb_vwv7) == 0) { + if (data_blob_len == 0) { /* an invalid request */ return ERROR_NT(NT_STATUS_LOGON_FAILURE); } bufrem = smb_bufrem(inbuf, p); /* pull the spnego blob */ - blob1 = data_blob(p, MIN(bufrem, SVAL(inbuf, smb_vwv7))); + blob1 = data_blob(p, MIN(bufrem, data_blob_len)); #if 0 file_save("negotiate.dat", blob1.data, blob1.length); #endif + p2 = inbuf + smb_vwv13 + data_blob_len; + p2 += srvstr_pull_buf(inbuf, native_os, p2, sizeof(native_os), STR_TERMINATE); + p2 += srvstr_pull_buf(inbuf, native_lanman, p2, sizeof(native_lanman), STR_TERMINATE); + DEBUG(3,("NativeOS=[%s] NativeLanMan=[%s]\n", native_os, native_lanman)); + + if ( ra_type == RA_WIN2K ) + ra_lanman_string( native_lanman ); + if (blob1.data[0] == ASN1_APPLICATION(0)) { /* its a negTokenTarg packet */ ret = reply_spnego_negotiate(conn, inbuf, outbuf, length, bufsize, blob1); @@ -606,21 +620,8 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf, DEBUG(3,("Domain=[%s] NativeOS=[%s] NativeLanMan=[%s]\n", domain,native_os,native_lanman)); - /* - * we distinguish between 2K and XP by the "Native Lan Manager" string - * WinXP => "Windows 2002 5.1" - * Win2k => "Windows 2000 5.0" - * NT4 => "Windows NT 4.0" - * Win9x => "Windows 4.0" - */ - - if ( ra_type == RA_WIN2K ) { - if ( 0 == strcmp( native_lanman, "Windows 2002 5.1" ) ) - set_remote_arch( RA_WINXP ); - else if ( 0 == strcmp( native_lanman, "Windows .NET 5.2" ) ) - set_remote_arch( RA_WIN2K3 ); - } - + if ( ra_type == RA_WIN2K ) + ra_lanman_string( native_lanman ); } -- cgit From dadae3bdd261e7768162448049952244abd7c8af Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:10:48 +0000 Subject: Now that mimir has done the grunt work, I'll fix up the comment (This used to be commit 7154fe10969a34b97ddc8321bfb5271b8e6d4795) --- source3/auth/auth_util.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c index a6ad2b883b..f4c43d2d4b 100644 --- a/source3/auth/auth_util.c +++ b/source3/auth/auth_util.c @@ -219,10 +219,7 @@ NTSTATUS make_user_info_map(auth_usersupplied_info **user_info, where it doens't supply a domain for logon script 'net use' commands. - The way I do it here is by checking if the fully - qualified username exists. This is rather reliant - on winbind, but until we have a better method this - will have to do + Finally, we do this by looking up a cache of trusted domains! */ domain = client_domain; -- cgit From ef07127b3014742550b15cb163b595bafeebafb5 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:31:23 +0000 Subject: strictly, you can't #if on somthing that may or may not be defined. Andrew Bartlett (This used to be commit 49bae0227323e811cb71ada24928d24f7dc56d1f) --- source3/tdb/spinlock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/tdb/spinlock.h b/source3/tdb/spinlock.h index d6a2ac6eb8..8b0e833ff5 100644 --- a/source3/tdb/spinlock.h +++ b/source3/tdb/spinlock.h @@ -1,7 +1,7 @@ #ifndef __SPINLOCK_H__ #define __SPINLOCK_H__ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H #include #endif -- cgit From c3221b8377e267133b7c04d78d98d806c54da599 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:34:32 +0000 Subject: Found by my new checking code (yet to be commited): Allow a service longer than 4 characters in CORE tcon. Andrew Bartlett (This used to be commit b56613c1cc13ebd5c9ba11a35d2f96c4c3eb0628) --- source3/smbd/reply.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index fb730bc625..80f648981a 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -161,7 +161,7 @@ int reply_tcon(connection_struct *conn, *service_buf = *password = *dev = 0; p = smb_buf(inbuf)+1; - p += srvstr_pull_buf(inbuf, service_buf, p, sizeof(service), STR_TERMINATE) + 1; + p += srvstr_pull_buf(inbuf, service_buf, p, sizeof(service_buf), STR_TERMINATE) + 1; pwlen = srvstr_pull_buf(inbuf, password, p, sizeof(password), STR_TERMINATE) + 1; p += pwlen; p += srvstr_pull_buf(inbuf, dev, p, sizeof(dev), STR_TERMINATE) + 1; -- cgit From 44f9f1042c9c436ccda7fefafd4a68749ffb5fe8 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:41:31 +0000 Subject: Clean up the VFS module loading logic by making the parameter an P_LIST, rather than a runtime-parsed string. Andrew Bartlett (This used to be commit 3465cd6cd92c39c018979b5a82acbddca0927623) --- source3/param/loadparm.c | 21 ++------------ source3/smbd/vfs.c | 74 ++++++++++++++++++++++-------------------------- 2 files changed, 36 insertions(+), 59 deletions(-) diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 3878dabb60..d558b09d24 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -548,7 +548,6 @@ static int default_server_announce; /* prototypes for the special type handlers */ static BOOL handle_include(const char *pszParmValue, char **ptr); static BOOL handle_copy(const char *pszParmValue, char **ptr); -static BOOL handle_vfs_object(const char *pszParmValue, char **ptr); static BOOL handle_source_env(const char *pszParmValue, char **ptr); static BOOL handle_netbios_name(const char *pszParmValue, char **ptr); static BOOL handle_winbind_uid(const char *pszParmValue, char **ptr); @@ -1104,7 +1103,7 @@ static struct parm_struct parm_table[] = { {"VFS module options", P_SEP, P_SEPARATOR}, - {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, FLAG_SHARE}, + {"vfs object", P_LIST, P_LOCAL, &sDefault.szVfsObjectFile, NULL, NULL, FLAG_SHARE}, {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, FLAG_SHARE}, {"vfs path", P_STRING, P_LOCAL, &sDefault.szVfsPath, NULL, NULL, FLAG_SHARE}, @@ -1774,7 +1773,7 @@ FN_LOCAL_LIST(lp_readlist, readlist) FN_LOCAL_LIST(lp_writelist, writelist) FN_LOCAL_LIST(lp_printer_admin, printer_admin) FN_LOCAL_STRING(lp_fstype, fstype) -FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile) +FN_LOCAL_LIST(lp_vfsobj, szVfsObjectFile) FN_LOCAL_STRING(lp_vfs_options, szVfsOptions) FN_LOCAL_STRING(lp_vfs_path, szVfsPath) FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy) @@ -2738,22 +2737,6 @@ static BOOL handle_source_env(const char *pszParmValue, char **ptr) return (result); } -/*************************************************************************** - Handle the interpretation of the vfs object parameter. -*************************************************************************/ - -static BOOL handle_vfs_object(const char *pszParmValue, char **ptr) -{ - /* Set string value */ - - string_set(ptr, pszParmValue); - - /* Do any other initialisation required for vfs. Note that - anything done here may have linking repercussions in nmbd. */ - - return True; -} - /*************************************************************************** Handle the include operation. ***************************************************************************/ diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 533c64b229..3bbe8a737a 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -215,54 +215,48 @@ Proceeding in compatibility mode, new operations (since version #%d) will fallba BOOL smbd_vfs_init(connection_struct *conn) { - char **vfs_objects, *vfsobj, *vfs_module, *vfs_path; - int nobj, i; + const char **vfs_objects; + char *vfs_module, *vfs_path; + unsigned int i; + unsigned int j = 0; struct smb_vfs_handle_struct *handle; /* Normal share - initialise with disk access functions */ vfs_init_default(conn); + vfs_objects = lp_vfsobj(SNUM(conn)); /* Override VFS functions if 'vfs object' was specified*/ - if (*lp_vfsobj(SNUM(conn))) { - vfsobj = NULL; - for(i=0; ivfs_private = NULL; + handle = (struct smb_vfs_handle_struct *) smb_xmalloc(sizeof(smb_vfs_handle_struct)); + /* Loadable object file */ + handle->handle = NULL; + DLIST_ADD(conn->vfs_private, handle); + vfs_module = NULL; + if (vfs_path) { + asprintf(&vfs_module, "%s/%s", vfs_path, vfs_objects[j]); + } else { + asprintf(&vfs_module, "%s", vfs_objects[j]); } - if (string_set(&vfsobj, lp_vfsobj(SNUM(conn)))) { - /* Parse passed modules specification to array of modules */ - set_first_token(vfsobj); - /* We are using default separators: ' \t\r\n' */ - vfs_objects = toktocliplist(&nobj, NULL); - if (vfs_objects) { - vfs_path = lp_vfs_path(SNUM(conn)); - conn->vfs_private = NULL; - for(i=nobj-1; i>=0; i--) { - handle = (struct smb_vfs_handle_struct *) smb_xmalloc(sizeof(smb_vfs_handle_struct)); - /* Loadable object file */ - handle->handle = NULL; - DLIST_ADD(conn->vfs_private, handle) - vfs_module = NULL; - if (vfs_path) { - asprintf(&vfs_module, "%s/%s", vfs_path, vfs_objects[i]); - } else { - asprintf(&vfs_module, "%s", vfs_objects[i]); - } - if (!vfs_init_custom(conn, vfs_module)) { - DEBUG(0, ("smbd_vfs_init: vfs_init_custom failed for %s\n", vfs_module)); - string_free(&vfsobj); - SAFE_FREE(vfs_module); - DLIST_REMOVE(conn->vfs_private, handle); - SAFE_FREE(handle); - return False; - } - SAFE_FREE(vfs_module); - } - } - string_free(&vfsobj); - return True; + if (!vfs_init_custom(conn, vfs_module)) { + DEBUG(0, ("smbd_vfs_init: vfs_init_custom failed for %s\n", vfs_module)); + SAFE_FREE(vfs_module); + DLIST_REMOVE(conn->vfs_private, handle); + SAFE_FREE(handle); + return False; } + SAFE_FREE(vfs_module); } return True; } -- cgit From d21f97a25d01d1d576f71cf45f5c2003bcfc8fe8 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:42:44 +0000 Subject: If it's an fstring, use fstrcpy(). Andrew Bartlett (This used to be commit bf5e0698eed72d7fc005be08feb36ef82ada716c) --- source3/nsswitch/winbindd_wins.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source3/nsswitch/winbindd_wins.c b/source3/nsswitch/winbindd_wins.c index 8ddd5dc10d..a1d38ed69a 100644 --- a/source3/nsswitch/winbindd_wins.c +++ b/source3/nsswitch/winbindd_wins.c @@ -137,8 +137,8 @@ enum winbindd_result winbindd_wins_byip(struct winbindd_cli_state *state) SAFE_FREE(status); return WINBINDD_ERROR; } - safe_strcat(response,state->request.data.winsreq,maxlen); - safe_strcat(response,"\t",maxlen); + fstrcat(response,state->request.data.winsreq); + fstrcat(response,"\t"); for (i = 0; i < count; i++) { /* ignore group names */ if (status[i].flags & 0x80) continue; @@ -148,8 +148,8 @@ enum winbindd_result winbindd_wins_byip(struct winbindd_cli_state *state) SAFE_FREE(status); return WINBINDD_ERROR; } - safe_strcat(response, status[i].name, maxlen); - safe_strcat(response, " ", maxlen); + fstrcat(response, status[i].name); + fstrcat(response, " "); } } /* make last character a newline */ @@ -190,16 +190,16 @@ enum winbindd_result winbindd_wins_byname(struct winbindd_cli_state *state) /* Clear out the newline character */ response[strlen(response)-1] = ' '; } - safe_strcat(response,addr,maxlen); - safe_strcat(response,"\t",maxlen); + fstrcat(response,addr); + fstrcat(response,"\t"); } size = strlen(state->request.data.winsreq) + strlen(response); if (size > maxlen) { SAFE_FREE(ip_list); return WINBINDD_ERROR; } - safe_strcat(response,state->request.data.winsreq,maxlen); - safe_strcat(response,"\n",maxlen); + fstrcat(response,state->request.data.winsreq); + fstrcat(response,"\n"); SAFE_FREE(ip_list); } else return WINBINDD_ERROR; -- cgit From 6fe590983b5d4dca8cea82eaa8dfb7b3a13bc3d1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:43:37 +0000 Subject: Add const, and a signed/unsigned fix. (This used to be commit f07a93eaeba20f5704f43c7f02141adc564db136) --- source3/libsmb/clitrans.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source3/libsmb/clitrans.c b/source3/libsmb/clitrans.c index 7e3357a8cc..3d3cd427d7 100644 --- a/source3/libsmb/clitrans.c +++ b/source3/libsmb/clitrans.c @@ -31,10 +31,10 @@ BOOL cli_send_trans(struct cli_state *cli, int trans, const char *pipe_name, int fid, int flags, uint16 *setup, unsigned int lsetup, unsigned int msetup, - char *param, unsigned int lparam, unsigned int mparam, - char *data, unsigned int ldata, unsigned int mdata) + const char *param, unsigned int lparam, unsigned int mparam, + const char *data, unsigned int ldata, unsigned int mdata) { - int i; + unsigned int i; unsigned int this_ldata,this_lparam; unsigned int tot_data=0,tot_param=0; char *outdata,*outparam; -- cgit From 16ec110b0f1fe45b598a04e171397d97c3cb5aef Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:45:19 +0000 Subject: client-side smbpasswd fixes - use pstrcpy_base to avoid clobber_region bugs Andrew Bartlett (This used to be commit 7ab6559369b4e6ee3c5269d8cff04e5a39f6b493) --- source3/libsmb/clirap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source3/libsmb/clirap.c b/source3/libsmb/clirap.c index b38e7d5c23..224c37046c 100644 --- a/source3/libsmb/clirap.c +++ b/source3/libsmb/clirap.c @@ -281,7 +281,7 @@ Send a SamOEMChangePassword command BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char *new_password, const char *old_password) { - char param[16+sizeof(fstring)]; + pstring param; char data[532]; char *p = param; unsigned char old_pw_hash[16]; @@ -300,11 +300,11 @@ BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char SSVAL(p,0,214); /* SamOEMChangePassword command. */ p += 2; - pstrcpy(p, "zsT"); + pstrcpy_base(p, "zsT", param); p = skip_string(p,1); - pstrcpy(p, "B516B16"); + pstrcpy_base(p, "B516B16", param); p = skip_string(p,1); - pstrcpy(p,user); + pstrcpy_base(p,user, param); p = skip_string(p,1); SSVAL(p,0,532); p += 2; @@ -317,7 +317,7 @@ BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char */ E_deshash(old_password, old_pw_hash); - clistr_push(cli, dos_new_password, new_password, -1, STR_TERMINATE|STR_ASCII); + clistr_push(cli, dos_new_password, new_password, sizeof(dos_new_password), STR_TERMINATE|STR_ASCII); if (!make_oem_passwd_hash( data, dos_new_password, old_pw_hash, False)) return False; @@ -685,7 +685,7 @@ NTSTATUS cli_qpathinfo_alt_name(struct cli_state *cli, const char *fname, fstrin int count=8; char *p; BOOL ret; - int len; + unsigned int len; p = param; memset(p, 0, 6); -- cgit From dc7c505dec59329c5dde35763febab3547f6d642 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:46:05 +0000 Subject: Be parinoid, malloc an extra SAFETY_MARGIN on the client's inbuf and outbuf. Andrew Bartlett (This used to be commit 2effcae13f9dfbff40b34d32c7fd82118c3fd096) --- source3/libsmb/clientgen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 3cae643c38..d969193089 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -245,8 +245,8 @@ struct cli_state *cli_initialise(struct cli_state *cli) cli->timeout = 20000; /* Timeout is in milliseconds. */ cli->bufsize = CLI_BUFFER_SIZE+4; cli->max_xmit = cli->bufsize; - cli->outbuf = (char *)malloc(cli->bufsize); - cli->inbuf = (char *)malloc(cli->bufsize); + cli->outbuf = (char *)malloc(cli->bufsize+SAFETY_MARGIN); + cli->inbuf = (char *)malloc(cli->bufsize+SAFETY_MARGIN); cli->oplock_handler = cli_oplock_ack; cli->use_spnego = lp_client_use_spnego(); -- cgit From a4ba0496846924df4688cf3678940ec3b14e6376 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:46:43 +0000 Subject: Specify buffer sizes (This used to be commit aa12379b3fd9646199a8ff3f217ec7dfef1942a5) --- source3/libsmb/cliconnect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 36b6f609f5..763878f9b3 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -66,7 +66,7 @@ static BOOL cli_session_setup_lanman2(struct cli_state *cli, const char *user, memcpy(pword, pass, passlen); } else if (passlen > 0) { /* Plaintext mode needed, assume plaintext supplied. */ - passlen = clistr_push(cli, pword, pass, -1, STR_TERMINATE); + passlen = clistr_push(cli, pword, pass, sizeof(pword), STR_TERMINATE); } /* send a session setup command */ @@ -778,7 +778,7 @@ BOOL cli_send_tconX(struct cli_state *cli, /* * Non-encrypted passwords - convert to DOS codepage before using. */ - passlen = clistr_push(cli, pword, pass, -1, STR_TERMINATE); + passlen = clistr_push(cli, pword, pass, sizeof(pword), STR_TERMINATE); } else { memcpy(pword, pass, passlen); } -- cgit From 58abc7b5b623e19d81586db4ae834c8e18e83082 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:50:45 +0000 Subject: If the server went away, don't segfault by attempting to FD_SET -1. Andrew Bartlett (This used to be commit 4b1337ee94a19e39a2f4012c4dbc32a2e58cacf5) --- source3/client/client.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source3/client/client.c b/source3/client/client.c index 065cd2fcc9..99fc779a9e 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -2269,6 +2269,9 @@ static void readline_callback(void) last_t = t; + if (cli->fd == -1) + return; + again: FD_ZERO(&fds); FD_SET(cli->fd,&fds); -- cgit From eca1293fadf8774f016e18ca56ac200546ca70ba Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:51:57 +0000 Subject: specify the size of these buffers (This used to be commit f6ea572cd57d4e655d387fe225a5d7122d587a9b) --- source3/libsmb/clilist.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c index 3884e4da82..5bd1283ab7 100644 --- a/source3/libsmb/clilist.c +++ b/source3/libsmb/clilist.c @@ -178,7 +178,7 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute, SSVAL(param,6,info_level); SIVAL(param,8,0); p = param+12; - p += clistr_push(cli, param+12, mask, -1, + p += clistr_push(cli, param+12, mask, sizeof(param)-12, STR_TERMINATE); } else { setup = TRANSACT2_FINDNEXT; @@ -188,7 +188,7 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute, SIVAL(param,6,0); /* ff_resume_key */ SSVAL(param,10,8+4+2); /* continue + resume required + close on end */ p = param+12; - p += clistr_push(cli, param+12, mask, -1, + p += clistr_push(cli, param+12, mask, sizeof(param)-12, STR_TERMINATE); } -- cgit From 32ae87014ce4bc7ddc25f15d44428b8ef2cf5593 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:53:37 +0000 Subject: Truncate the machinename manually, so as not to generate level 0 debugs for an expected situation. Andrew Bartlett (This used to be commit a07fccb7ae169c0b5089e3f7d2c5d6465b2e4686) --- source3/utils/pdbedit.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/source3/utils/pdbedit.c b/source3/utils/pdbedit.c index cec3e70687..affcc75d67 100644 --- a/source3/utils/pdbedit.c +++ b/source3/utils/pdbedit.c @@ -363,20 +363,21 @@ static int new_machine (struct pdb_context *in, const char *machine_in) { SAM_ACCOUNT *sam_pwent=NULL; fstring machinename; + fstring machineaccount; struct passwd *pwd = NULL; - char name[16]; fstrcpy(machinename, machine_in); + machinename[15]= '\0'; if (machinename[strlen (machinename) -1] == '$') machinename[strlen (machinename) -1] = '\0'; strlower_m(machinename); - safe_strcpy (name, machinename, 16); - safe_strcat (name, "$", 16); + fstrcpy(machineaccount, machinename); + fstrcat(machineaccount, "$"); - if ((pwd = getpwnam_alloc(name))) { + if ((pwd = getpwnam_alloc(machineaccount))) { if (!NT_STATUS_IS_OK(pdb_init_sam_pw( &sam_pwent, pwd))) { fprintf(stderr, "Could not init sam from pw\n"); passwd_free(&pwd); @@ -392,14 +393,14 @@ static int new_machine (struct pdb_context *in, const char *machine_in) pdb_set_plaintext_passwd (sam_pwent, machinename); - pdb_set_username (sam_pwent, name, PDB_CHANGED); + pdb_set_username (sam_pwent, machineaccount, PDB_CHANGED); pdb_set_acct_ctrl (sam_pwent, ACB_WSTRUST, PDB_CHANGED); pdb_set_group_sid_from_rid(sam_pwent, DOMAIN_GROUP_RID_COMPUTERS, PDB_CHANGED); if (NT_STATUS_IS_OK(in->pdb_add_sam_account (in, sam_pwent))) { - print_user_info (in, name, True, False); + print_user_info (in, machineaccount, True, False); } else { fprintf (stderr, "Unable to add machine! (does it already exist?)\n"); pdb_free_sam (&sam_pwent); @@ -435,12 +436,13 @@ static int delete_user_entry (struct pdb_context *in, const char *username) static int delete_machine_entry (struct pdb_context *in, const char *machinename) { - char name[16]; + fstring name; SAM_ACCOUNT *samaccount = NULL; - safe_strcpy (name, machinename, 16); - if (name[strlen(name)] != '$') - safe_strcat (name, "$", 16); + fstrcpy(name, machinename); + name[15] = '\0'; + if (name[strlen(name)-1] != '$') + fstrcat (name, "$"); if (!NT_STATUS_IS_OK(pdb_init_sam (&samaccount))) { return -1; -- cgit From 9a00acc472b3a9530ca71705faef3166aa9c4d47 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 06:54:09 +0000 Subject: Fix off-by-one bug in safe_strcpy size paramater. (This used to be commit 9af30c9aae3623c4db1edca39a91973f0279acb4) --- source3/utils/smbcacls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/utils/smbcacls.c b/source3/utils/smbcacls.c index a5cee0dae1..bce64df960 100644 --- a/source3/utils/smbcacls.c +++ b/source3/utils/smbcacls.c @@ -916,7 +916,7 @@ You can string acls together with spaces, commas or newlines\n\ if (filename[0] != '\\') { pstring s; s[0] = '\\'; - safe_strcpy(&s[1], filename, sizeof(pstring)-1); + safe_strcpy(&s[1], filename, sizeof(pstring)-2); pstrcpy(filename, s); } -- cgit From 3b5bc93e9db4df6ded2eef7b32bda74328b04811 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 07:14:55 +0000 Subject: String handling parinoia fixes. This patch enables the compile-time checking of strings assable by means of sizeof(). (Original code had the configure check reversed). This is extended to all safe_strcpy() users, push_string and pull_string, as well as the cli and srv derivitives. There is an attempt to cap strings at the end of the cli buffer, and clobber_region() of the speified length (when not -1 :-). Becouse of the way they are declared, the 'overmalloc a string' users of safe_strcpy() have been changed to use overmalloc_safe_strcpy() (which skips some of the checks). This whole ball of mud worked fine, until I pulled out my 'fix' for our statcache. When jeremy fixes that, we should be able to get back to testing this stuff. This patch also includes a 'marker' of the last caller to clobber_region (ie, the function that called pstrcpy() that called clobber_region) to assist in debugging problems that may have smashed the stack. This is printed at smb_panic() time. (Original idea and patch by metze). It also removes some unsused functions, and #if 0's some others that are unused but probably should be used in the near future. For now, this patch gives us some confidence on one class of trivial parsing error in our code. Andrew Bartlett (This used to be commit 31f4827acc2a2f00399a5528fc83a0dae5cebaf4) --- source3/Makefile.in | 2 +- source3/configure.in | 2 +- source3/include/includes.h | 1 + source3/include/safe_string.h | 161 +++++++++++++++++++++++++++++++++++------ source3/include/srvstr.h | 36 +++++++++ source3/lib/charcnv.c | 83 ++++----------------- source3/lib/util.c | 16 +++- source3/lib/util_str.c | 72 ++++++++---------- source3/libsmb/clistr.c | 28 +++++-- source3/nmbd/nmbd_become_lmb.c | 2 +- source3/nmbd/nmbd_browsesync.c | 2 +- source3/smbd/srvstr.c | 41 ----------- source3/smbd/statcache.c | 12 +-- 13 files changed, 264 insertions(+), 194 deletions(-) create mode 100644 source3/include/srvstr.h delete mode 100644 source3/smbd/srvstr.c diff --git a/source3/Makefile.in b/source3/Makefile.in index 2334e278f2..1a4d97e083 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -336,7 +336,7 @@ SMBD_OBJ_SRV = smbd/files.o smbd/chgpasswd.o smbd/connection.o \ smbd/vfs.o smbd/vfs-wrap.o smbd/statcache.o \ smbd/posix_acls.o lib/sysacls.o lib/server_mutex.o \ smbd/process.o smbd/service.o smbd/error.o \ - printing/printfsp.o lib/util_seaccess.o smbd/srvstr.o \ + printing/printfsp.o lib/util_seaccess.o \ smbd/build_options.o \ smbd/change_trust_pw.o \ $(MANGLE_OBJ) diff --git a/source3/configure.in b/source3/configure.in index aa95cf19fe..e038654f7e 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -662,7 +662,7 @@ AC_CACHE_CHECK([if the compiler will optimize out function calls],samba_cv_optim AC_TRY_LINK([ #include ], [ - if (1) { + if (0) { this_function_does_not_exist(); } else { return 1; diff --git a/source3/include/includes.h b/source3/include/includes.h index 25245e9c0c..2bba9d5084 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -855,6 +855,7 @@ struct printjob; /* String routines */ +#include "srvstr.h" #include "safe_string.h" #ifdef __COMPAR_FN_T diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h index 6c2bd82bb9..c7386d3ac4 100644 --- a/source3/include/safe_string.h +++ b/source3/include/safe_string.h @@ -48,29 +48,45 @@ #endif /* !_SPLINT_ */ + char * __unsafe_string_function_usage_here__(void); -#ifdef HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS +size_t __unsafe_string_function_usage_here2__(void); -#define pstrcpy(d,s) ((sizeof(d) != sizeof(pstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcpy((d), (s),sizeof(pstring)-1)) -#define pstrcat(d,s) ((sizeof(d) != sizeof(pstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcat((d), (s),sizeof(pstring)-1)) -#define fstrcpy(d,s) ((sizeof(d) != sizeof(fstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcpy((d),(s),sizeof(fstring)-1)) -#define fstrcat(d,s) ((sizeof(d) != sizeof(fstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcat((d),(s),sizeof(fstring)-1)) +#ifdef HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS -#define fstrterminate(d) ((sizeof(d) != sizeof(fstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : (((d)[sizeof(fstring)-1]) = '\0')) -#define pstrterminate(d) ((sizeof(d) != sizeof(pstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : (((d)[sizeof(pstring)-1]) = '\0')) +/* if the compiler will optimize out function calls, then use this to tell if we are + have the correct types (this works only where sizeof() returns the size of the buffer, not + the size of the pointer). */ + +#define CHECK_STRING_SIZE(d, len) (sizeof(d) != (len) && sizeof(d) != sizeof(char *)) + +#define fstrterminate(d) (CHECK_STRING_SIZE(d, sizeof(fstring)) \ + ? __unsafe_string_function_usage_here__() \ + : (((d)[sizeof(fstring)-1]) = '\0')) +#define pstrterminate(d) (CHECK_STRING_SIZE(d, sizeof(pstring)) \ + ? __unsafe_string_function_usage_here__() \ + : (((d)[sizeof(pstring)-1]) = '\0')) + +#define wpstrcpy(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \ + ? __unsafe_string_function_usage_here__() \ + : safe_strcpy_w((d),(s),sizeof(wpstring))) +#define wpstrcat(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \ + ? __unsafe_string_function_usage_here__() \ + : safe_strcat_w((d),(s),sizeof(wpstring))) +#define wfstrcpy(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \ + ? __unsafe_string_function_usage_here__() \ + : safe_strcpy_w((d),(s),sizeof(wfstring))) +#define wfstrcat(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \ + ? __unsafe_string_function_usage_here__() \ + : safe_strcat_w((d),(s),sizeof(wfstring))) -#define wpstrcpy(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcpy_w((d),(s),sizeof(wpstring))) -#define wpstrcat(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcat_w((d),(s),sizeof(wpstring))) -#define wfstrcpy(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcpy_w((d),(s),sizeof(wfstring))) -#define wfstrcat(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcat_w((d),(s),sizeof(wfstring))) +#define push_pstring_base(dest, src, pstring_base) \ + (CHECK_STRING_SIZE(pstring_base, sizeof(pstring)) \ + ? __unsafe_string_function_usage_here2__() \ + : push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE)) -#else - -#define pstrcpy(d,s) safe_strcpy((d), (s),sizeof(pstring)-1) -#define pstrcat(d,s) safe_strcat((d), (s),sizeof(pstring)-1) -#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1) -#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1) +#else /* HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS */ #define fstrterminate(d) (((d)[sizeof(fstring)-1]) = '\0') #define pstrterminate(d) (((d)[sizeof(pstring)-1]) = '\0') @@ -80,12 +96,10 @@ char * __unsafe_string_function_usage_here__(void); #define wfstrcpy(d,s) safe_strcpy_w((d),(s),sizeof(wfstring)) #define wfstrcat(d,s) safe_strcat_w((d),(s),sizeof(wfstring)) -#endif +#define push_pstring_base(dest, src, pstring_base) \ + push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE) -/* replace some string functions with multi-byte - versions */ -#define strlower(s) strlower_m(s) -#define strupper(s) strupper_m(s) +#endif /* HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS */ /* the addition of the DEVELOPER checks in safe_strcpy means we must * update a lot of code. To make this a little easier here are some @@ -93,7 +107,106 @@ char * __unsafe_string_function_usage_here__(void); #define pstrcpy_base(dest, src, pstring_base) \ safe_strcpy(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1) -#define push_pstring_base(dest, src, pstring_base) \ - push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE) + +/* String copy functions - macro hell below adds 'type checking' (limited, but the best we can + do in C) and may tag with function name/number to record the last 'clobber region' on + that string */ + +#define pstrcpy(d,s) safe_strcpy((d), (s),sizeof(pstring)-1) +#define pstrcat(d,s) safe_strcat((d), (s),sizeof(pstring)-1) +#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1) +#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1) + +/* the addition of the DEVELOPER checks in safe_strcpy means we must + * update a lot of code. To make this a little easier here are some + * functions that provide the lengths with less pain */ +#define pstrcpy_base(dest, src, pstring_base) \ + safe_strcpy(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1) + + +/* inside the _fn varients of these is a call to 'clobber_region' - which might + destory the stack on a buggy function. Help the debugging process by putting + the function and line it was last called from into a static buffer + + But only for developers */ + +#ifdef DEVELOPER +#define overmalloc_safe_strcpy(dest,src,maxlength) safe_strcpy_fn(__FUNCTION__,__LINE__,dest,src,maxlength) +#define safe_strcpy(dest,src,maxlength) safe_strcpy_fn2(__FUNCTION__,__LINE__,dest,src,maxlength) +#define safe_strcat(dest,src,maxlength) safe_strcat_fn2(__FUNCTION__,__LINE__,dest,src,maxlength) +#define push_string(base_ptr, dest, src, dest_len, flags) push_string_fn2(__FUNCTION__, __LINE__, base_ptr, dest, src, dest_len, flags) +#define pull_string(base_ptr, dest, src, dest_len, src_len, flags) pull_string_fn2(__FUNCTION__, __LINE__, base_ptr, dest, src, dest_len, src_len, flags) +#define clistr_push(cli, dest, src, dest_len, flags) clistr_push_fn2(__FUNCTION__, __LINE__, cli, dest, src, dest_len, flags) +#define clistr_pull(cli, dest, src, dest_len, src_len, flags) clistr_pull_fn2(__FUNCTION__, __LINE__, cli, dest, src, dest_len, src_len, flags) + +#define alpha_strcpy(dest,src,other_safe_chars,maxlength) alpha_strcpy_fn(__FUNCTION__,__LINE__,dest,src,other_safe_chars,maxlength) +#define StrnCpy(dest,src,n) StrnCpy_fn(__FUNCTION__,__LINE__,dest,src,n) + +#else + +#define overmalloc_safe_strcpy(dest,src,maxlength) safe_strcpy_fn(NULL,0,dest,src,maxlength) +#define safe_strcpy(dest,src,maxlength) safe_strcpy_fn2(NULL,0,dest,src,maxlength) +#define safe_strcat(dest,src,maxlength) safe_strcat_fn2(NULL,0,dest,src,maxlength) +#define push_string(base_ptr, dest, src, dest_len, flags) push_string_fn2(NULL, 0, base_ptr, dest, src, dest_len, flags) +#define pull_string(base_ptr, dest, src, dest_len, src_len, flags) pull_string_fn2(NULL, 0, base_ptr, dest, src, dest_len, src_len, flags) +#define clistr_push(cli, dest, src, dest_len, flags) clistr_push_fn2(NULL, 0, cli, dest, src, dest_len, flags) +#define clistr_pull(cli, dest, src, dest_len, src_len, flags) clistr_push_fn2(NULL, 0, cli, dest, src, dest_len, src_len, flags) + +#define alpha_strcpy(dest,src,other_safe_chars,maxlength) alpha_strcpy_fn(NULL,0,dest,src,other_safe_chars,maxlength) +#define StrnCpy(dest,src,n) StrnCpy_fn(NULL,0,dest,src,n) +#endif /* DEVELOPER */ + + +#ifdef HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS + +/* if the compiler will optimize out function calls, then use this to tell if we are + have the correct types (this works only where sizeof() returns the size of the buffer, not + the size of the pointer). */ + +#define safe_strcpy_fn2(fn_name, fn_line, d, s, max_len) \ + (CHECK_STRING_SIZE(d, max_len+1) \ + ? __unsafe_string_function_usage_here__() \ + : safe_strcpy_fn(fn_name, fn_line, (d), (s), (max_len))) + +#define safe_strcat_fn2(fn_name, fn_line, d, s, max_len) \ + (CHECK_STRING_SIZE(d, max_len+1) \ + ? __unsafe_string_function_usage_here__() \ + : safe_strcat_fn(fn_name, fn_line, (d), (s), (max_len))) + +#define push_string_fn2(fn_name, fn_line, base_ptr, dest, src, dest_len, flags) \ + (CHECK_STRING_SIZE(dest, dest_len) \ + ? __unsafe_string_function_usage_here2__() \ + : push_string_fn(fn_name, fn_line, base_ptr, dest, src, dest_len, flags)) + +#define pull_string_fn2(fn_name, fn_line, base_ptr, dest, src, dest_len, src_len, flags) \ + (CHECK_STRING_SIZE(dest, dest_len) \ + ? __unsafe_string_function_usage_here2__() \ + : pull_string_fn(fn_name, fn_line, base_ptr, dest, src, dest_len, src_len, flags)) + +#define clistr_push_fn2(fn_name, fn_line, cli, dest, src, dest_len, flags) \ + (CHECK_STRING_SIZE(dest, dest_len) \ + ? __unsafe_string_function_usage_here2__() \ + : clistr_push_fn(fn_name, fn_line, cli, dest, src, dest_len, flags)) + +#define clistr_pull_fn2(fn_name, fn_line, cli, dest, src, dest_len, srclen, flags) \ + (CHECK_STRING_SIZE(dest, dest_len) \ + ? __unsafe_string_function_usage_here2__() \ + : clistr_pull_fn(fn_name, fn_line, cli, dest, src, dest_len, srclen, flags)) + +#else + +#define safe_strcpy_fn2 safe_strcpy_fn +#define safe_strcat_fn2 safe_strcat_fn +#define push_string_fn2 push_string_fn +#define pull_string_fn2 pull_string_fn +#define clistr_push_fn2 clistr_push_fn2 +#define clistr_pull_fn2 clistr_pull_fn2 + +#endif + +/* replace some string functions with multi-byte + versions */ +#define strlower(s) strlower_m(s) +#define strupper(s) strupper_m(s) #endif diff --git a/source3/include/srvstr.h b/source3/include/srvstr.h new file mode 100644 index 0000000000..a433e0e3f9 --- /dev/null +++ b/source3/include/srvstr.h @@ -0,0 +1,36 @@ +/* + Unix SMB/CIFS implementation. + server specific string routines + Copyright (C) Andrew Tridgell 2001 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +#define srvstr_push(base_ptr, dest, src, dest_len, flags) \ + push_string(base_ptr, dest, src, dest_len, flags) + +#define srvstr_pull(base_ptr, dest, src, dest_len, src_len, flags) \ + pull_string(base_ptr, dest, src, dest_len, src_len, flags) + +/* pull a string from the smb_buf part of a packet. In this case the + string can either be null terminated or it can be terminated by the + end of the smbbuf area +*/ + +#define srvstr_pull_buf(inbuf, dest, src, dest_len, flags) \ + pull_string(inbuf, dest, src, dest_len, smb_bufrem(inbuf, src), flags) + diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index a8df003f8b..76d77ddd67 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -186,7 +186,7 @@ size_t convert_string(charset_t from, charset_t to, * @returns Size in bytes of the converted string; or -1 in case of error. **/ -size_t convert_string_allocate(charset_t from, charset_t to, +static size_t convert_string_allocate(charset_t from, charset_t to, void const *src, size_t srclen, void **dest) { size_t i_len, o_len, destlen; @@ -265,7 +265,7 @@ convert: * * @returns Size in bytes of the converted string; or -1 in case of error. **/ -size_t convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to, +static size_t convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to, void const *src, size_t srclen, void **dest) { void *alloced_string; @@ -303,7 +303,7 @@ size_t unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen) } -size_t ucs2_align(const void *base_ptr, const void *p, int flags) +static size_t ucs2_align(const void *base_ptr, const void *p, int flags) { if (flags & (STR_NOALIGN|STR_ASCII)) return 0; @@ -356,11 +356,6 @@ size_t push_ascii_pstring(void *dest, const char *src) return push_ascii(dest, src, sizeof(pstring), STR_TERMINATE); } -size_t push_pstring(void *dest, const char *src) -{ - return push_ascii(dest, src, sizeof(pstring), STR_TERMINATE); -} - /** * Copy a string from a dos codepage source to a unix char* destination. * @@ -507,7 +502,7 @@ size_t push_ucs2_allocate(smb_ucs2_t **dest, const char *src) is -1 then no maxiumum is used. **/ -size_t push_utf8(void *dest, const char *src, size_t dest_len, int flags) +static size_t push_utf8(void *dest, const char *src, size_t dest_len, int flags) { size_t src_len = strlen(src); pstring tmpbuf; @@ -533,11 +528,6 @@ size_t push_utf8_fstring(void *dest, const char *src) return push_utf8(dest, src, sizeof(fstring), STR_TERMINATE); } -size_t push_utf8_pstring(void *dest, const char *src) -{ - return push_utf8(dest, src, sizeof(pstring), STR_TERMINATE); -} - /** * Copy a string from a unix char* src to a UTF-8 destination, allocating a buffer using talloc * @@ -666,7 +656,7 @@ size_t pull_ucs2_allocate(void **dest, const smb_ucs2_t *src) The resulting string in "dest" is always null terminated. **/ -size_t pull_utf8(char *dest, const void *src, size_t dest_len, size_t src_len, int flags) +static size_t pull_utf8(char *dest, const void *src, size_t dest_len, size_t src_len, int flags) { size_t ret; @@ -690,16 +680,7 @@ size_t pull_utf8(char *dest, const void *src, size_t dest_len, size_t src_len, i return src_len; } - -size_t pull_utf8_pstring(char *dest, const void *src) -{ - return pull_utf8(dest, src, sizeof(pstring), -1, STR_TERMINATE); -} - -size_t pull_utf8_fstring(char *dest, const void *src) -{ - return pull_utf8(dest, src, sizeof(fstring), -1, STR_TERMINATE); -} +#endif /** * Copy a string from a UTF-8 src to a unix char * destination, allocating a buffer using talloc @@ -745,8 +726,11 @@ size_t pull_utf8_allocate(void **dest, const char *src) is -1 then no maxiumum is used. **/ -size_t push_string(const void *base_ptr, void *dest, const char *src, size_t dest_len, int flags) +size_t push_string_fn(const char *function, unsigned int line, const void *base_ptr, void *dest, const char *src, size_t dest_len, int flags) { + if (dest_len != (size_t)-1) + clobber_region(function, line, dest, dest_len); + if (!(flags & STR_ASCII) && \ ((flags & STR_UNICODE || \ (SVAL(base_ptr, smb_flg2) & FLAGS2_UNICODE_STRINGS)))) { @@ -770,8 +754,11 @@ size_t push_string(const void *base_ptr, void *dest, const char *src, size_t des The resulting string in "dest" is always null terminated. **/ -size_t pull_string(const void *base_ptr, char *dest, const void *src, size_t dest_len, size_t src_len, int flags) +size_t pull_string_fn(const char *function, unsigned int line, const void *base_ptr, char *dest, const void *src, size_t dest_len, size_t src_len, int flags) { + if (dest_len != (size_t)-1) + clobber_region(function, line, dest, dest_len); + if (!(flags & STR_ASCII) && \ ((flags & STR_UNICODE || \ (SVAL(base_ptr, smb_flg2) & FLAGS2_UNICODE_STRINGS)))) { @@ -790,27 +777,6 @@ size_t align_string(const void *base_ptr, const char *p, int flags) return 0; } -/** - Convert from ucs2 to unix charset and return the - allocated and converted string or NULL if an error occurred. - You must provide a zero terminated string. - The returning string will be zero terminated. -**/ - -char *acnv_u2ux(const smb_ucs2_t *src) -{ - size_t slen; - size_t dlen; - void *dest; - - slen = (strlen_w(src) + 1) * sizeof(smb_ucs2_t); - dlen = convert_string_allocate(CH_UCS2, CH_UNIX, src, slen, &dest); - if (dlen == (size_t)-1) - return NULL; - else - return dest; -} - /** Convert from unix to ucs2 charset and return the allocated and converted string or NULL if an error occurred. @@ -832,27 +798,6 @@ smb_ucs2_t *acnv_uxu2(const char *src) return dest; } -/** - Convert from ucs2 to dos charset and return the - allocated and converted string or NULL if an error occurred. - You must provide a zero terminated string. - The returning string will be zero terminated. -**/ - -char *acnv_u2dos(const smb_ucs2_t *src) -{ - size_t slen; - size_t dlen; - void *dest; - - slen = (strlen_w(src) + 1) * sizeof(smb_ucs2_t); - dlen = convert_string_allocate(CH_UCS2, CH_DOS, src, slen, &dest); - if (dlen == (size_t)-1) - return NULL; - else - return dest; -} - /** Convert from dos to ucs2 charset and return the allocated and converted string or NULL if an error occurred. diff --git a/source3/lib/util.c b/source3/lib/util.c index 77ffa70a47..1f300a2815 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -1398,9 +1398,23 @@ gid_t nametogid(const char *name) void smb_panic(const char *why) { - char *cmd = lp_panic_action(); + char *cmd; int result; +#ifdef DEVELOPER + { + extern char *global_clobber_region_function; + extern unsigned int global_clobber_region_line; + + if (global_clobber_region_function) { + DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n", + global_clobber_region_function, + global_clobber_region_line)); + } + } +#endif + + cmd = lp_panic_action(); if (cmd && *cmd) { DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd)); result = system(cmd); diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 7dd5ee4242..7643c2807e 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -21,6 +21,11 @@ #include "includes.h" +#ifdef DEVELOPER +const char *global_clobber_region_function; +unsigned int global_clobber_region_line; +#endif + /** * Get the next token from a string, return False if none found. * Handles double-quotes. @@ -73,7 +78,7 @@ parameter so you can pass NULL. This is useful for user interface code but beware the fact that it is not re-entrant! **/ -static char *last_ptr=NULL; +static const char *last_ptr=NULL; BOOL next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize) { @@ -409,28 +414,6 @@ size_t count_chars(const char *s,char c) return(count); } -/** -Return True if a string consists only of one particular character. -**/ - -BOOL str_is_all(const char *s,char c) -{ - smb_ucs2_t *ptr; - - if(s == NULL) - return False; - if(!*s) - return False; - - push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE); - for(ptr=tmpbuf;*ptr;ptr++) - if(*ptr!=UCS2_CHAR(c)) - return False; - - return True; -} - - /** * In developer builds, clobber a region of memory. * @@ -442,11 +425,13 @@ BOOL str_is_all(const char *s,char c) * This is meant to catch possible string overflows, even if the * actual string copied is not big enough to cause an overflow. **/ -void clobber_region(char *dest, size_t len) +void clobber_region(const char *fn, unsigned int line, char *dest, size_t len) { #ifdef DEVELOPER /* F1 is odd and 0xf1f1f1f1 shouldn't be a valid pointer */ memset(dest, 0xF1, len); + global_clobber_region_function = fn; + global_clobber_region_line = line; #endif } @@ -456,7 +441,7 @@ void clobber_region(char *dest, size_t len) include the terminating zero. **/ -char *safe_strcpy(char *dest,const char *src, size_t maxlength) +char *safe_strcpy_fn(const char *fn, int line, char *dest,const char *src, size_t maxlength) { size_t len; @@ -465,7 +450,7 @@ char *safe_strcpy(char *dest,const char *src, size_t maxlength) return NULL; } - clobber_region(dest, maxlength+1); + clobber_region(fn,line,dest, maxlength+1); if (!src) { *dest = 0; @@ -489,8 +474,7 @@ char *safe_strcpy(char *dest,const char *src, size_t maxlength) Safe string cat into a string. maxlength does not include the terminating zero. **/ - -char *safe_strcat(char *dest, const char *src, size_t maxlength) +char *safe_strcat_fn(const char *fn, int line, char *dest, const char *src, size_t maxlength) { size_t src_len, dest_len; @@ -505,8 +489,8 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength) src_len = strlen(src); dest_len = strlen(dest); - clobber_region(dest + dest_len, maxlength + 1 - dest_len); - + clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len); + if (src_len + dest_len > maxlength) { DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n", (int)(src_len + dest_len - maxlength), src)); @@ -528,12 +512,11 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength) and replaces with '_'. Deliberately does *NOT* check for multibyte characters. Don't change it ! **/ - -char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, size_t maxlength) +char *alpha_strcpy_fn(const char *fn, int line, char *dest, const char *src, const char *other_safe_chars, size_t maxlength) { size_t len, i; - clobber_region(dest, maxlength); + clobber_region(fn, line, dest, maxlength); if (!dest) { DEBUG(0,("ERROR: NULL dest in alpha_strcpy\n")); @@ -569,13 +552,12 @@ char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, si Like strncpy but always null terminates. Make sure there is room! The variable n should always be one less than the available size. **/ - -char *StrnCpy(char *dest,const char *src,size_t n) +char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n) { char *d = dest; - clobber_region(dest, n+1); - + clobber_region(fn, line, dest, n+1); + if (!dest) return(NULL); @@ -589,12 +571,13 @@ char *StrnCpy(char *dest,const char *src,size_t n) return(dest); } +#if 0 /** Like strncpy but copies up to the character marker. always null terminates. returns a pointer to the character marker in the source string (src). **/ -char *strncpyn(char *dest, const char *src, size_t n, char c) +static char *strncpyn(char *dest, const char *src, size_t n, char c) { char *p; size_t str_len; @@ -613,6 +596,7 @@ char *strncpyn(char *dest, const char *src, size_t n, char c) return p; } +#endif /** Routine to get hex characters and turn them into a 16 byte array. @@ -923,7 +907,7 @@ void all_string_sub(char *s,const char *pattern,const char *insert, size_t len) Use with caution! **/ -smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern, +static smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern, const smb_ucs2_t *insert) { smb_ucs2_t *r, *rp; @@ -981,11 +965,12 @@ smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern, return all_string_sub_w(s, p, i); } +#if 0 /** Splits out the front and back at a separator. **/ -void split_at_last_component(char *path, char *front, char sep, char *back) +static void split_at_last_component(char *path, char *front, char sep, char *back) { char *p = strrchr_m(path, sep); @@ -1004,6 +989,7 @@ void split_at_last_component(char *path, char *front, char sep, char *back) back[0] = 0; } } +#endif /** Write an octal as a string. @@ -1023,7 +1009,7 @@ const char *octal_string(int i) Truncate a string at a specified length. **/ -char *string_truncate(char *s, int length) +char *string_truncate(char *s, unsigned int length) { if (s && strlen(s) > length) s[length] = 0; @@ -1182,11 +1168,12 @@ char *binary_string(char *buf, int len) return ret; } +#if 0 /** Just a typesafety wrapper for snprintf into a fstring. **/ - int fstr_sprintf(fstring s, const char *fmt, ...) +static int fstr_sprintf(fstring s, const char *fmt, ...) { va_list ap; int ret; @@ -1196,6 +1183,7 @@ char *binary_string(char *buf, int len) va_end(ap); return ret; } +#endif #ifndef HAVE_STRNDUP /** diff --git a/source3/libsmb/clistr.c b/source3/libsmb/clistr.c index 3c9964368e..97a3fa6cc9 100644 --- a/source3/libsmb/clistr.c +++ b/source3/libsmb/clistr.c @@ -20,24 +20,38 @@ #include "includes.h" -int clistr_push(struct cli_state *cli, void *dest, const char *src, int dest_len, int flags) +size_t clistr_push_fn(const char *function, unsigned int line, + struct cli_state *cli, void *dest, + const char *src, int dest_len, int flags) { - return push_string(cli->outbuf, dest, src, dest_len, flags); + size_t buf_used = PTR_DIFF(dest, cli->outbuf); + if (dest_len == -1) { + if (((ptrdiff_t)dest < (ptrdiff_t)cli->outbuf) || (buf_used > cli->bufsize)) { + DEBUG(0, ("Pushing string of 'unlimited' length into non-SMB buffer!\n")); + return push_string_fn(function, line, cli->outbuf, dest, src, -1, flags); + } + return push_string_fn(function, line, cli->outbuf, dest, src, cli->bufsize - buf_used, flags); + } + + /* 'normal' push into size-specified buffer */ + return push_string_fn(function, line, cli->outbuf, dest, src, dest_len, flags); } -int clistr_pull(struct cli_state *cli, char *dest, const void *src, int dest_len, int src_len, - int flags) +size_t clistr_pull_fn(const char *function, unsigned int line, + struct cli_state *cli, char *dest, const void *src, + int dest_len, int src_len, + int flags) { - return pull_string(cli->inbuf, dest, src, dest_len, src_len, flags); + return pull_string_fn(function, line, cli->inbuf, dest, src, dest_len, src_len, flags); } -int clistr_align_out(struct cli_state *cli, const void *p, int flags) +size_t clistr_align_out(struct cli_state *cli, const void *p, int flags) { return align_string(cli->outbuf, p, flags); } -int clistr_align_in(struct cli_state *cli, const void *p, int flags) +size_t clistr_align_in(struct cli_state *cli, const void *p, int flags) { return align_string(cli->inbuf, p, flags); } diff --git a/source3/nmbd/nmbd_become_lmb.c b/source3/nmbd/nmbd_become_lmb.c index 829496c195..6f8e7efb1a 100644 --- a/source3/nmbd/nmbd_become_lmb.c +++ b/source3/nmbd/nmbd_become_lmb.c @@ -563,7 +563,7 @@ in workgroup %s on subnet %s\n", userdata->copy_fn = NULL; userdata->free_fn = NULL; userdata->userdata_len = strlen(work->work_group)+1; - safe_strcpy(userdata->data, work->work_group, size - sizeof(*userdata) - 1); + overmalloc_safe_strcpy(userdata->data, work->work_group, size - sizeof(*userdata) - 1); /* Register the special browser group name. */ register_name(subrec, MSBROWSE, 0x01, samba_nb_type|NB_GROUP, diff --git a/source3/nmbd/nmbd_browsesync.c b/source3/nmbd/nmbd_browsesync.c index 5914ea9637..b9082ee1c3 100644 --- a/source3/nmbd/nmbd_browsesync.c +++ b/source3/nmbd/nmbd_browsesync.c @@ -333,7 +333,7 @@ static void find_domain_master_name_query_success(struct subnet_record *subrec, userdata->copy_fn = NULL; userdata->free_fn = NULL; userdata->userdata_len = strlen(work->work_group)+1; - safe_strcpy(userdata->data, work->work_group, size - sizeof(*userdata) - 1); + overmalloc_safe_strcpy(userdata->data, work->work_group, size - sizeof(*userdata) - 1); node_status( subrec, &nmbname, answer_ip, domain_master_node_status_success, diff --git a/source3/smbd/srvstr.c b/source3/smbd/srvstr.c deleted file mode 100644 index 36fecf5bd2..0000000000 --- a/source3/smbd/srvstr.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - Unix SMB/CIFS implementation. - server specific string routines - Copyright (C) Andrew Tridgell 2001 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" - -int srvstr_push(void *base_ptr, void *dest, const char *src, int dest_len, int flags) -{ - return push_string(base_ptr, dest, src, dest_len, flags); -} - -int srvstr_pull(void *base_ptr, char *dest, const void *src, int dest_len, int src_len, - int flags) -{ - return pull_string(base_ptr, dest, src, dest_len, src_len, flags); -} - -/* pull a string from the smb_buf part of a packet. In this case the - string can either be null terminated or it can be terminated by the - end of the smbbuf area -*/ -int srvstr_pull_buf(void *inbuf, char *dest, const void *src, int dest_len, int flags) -{ - return pull_string(inbuf, dest, src, dest_len, smb_bufrem(inbuf, src), flags); -} diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index b6e84ec9a5..ac4ffcf575 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -62,7 +62,7 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) return; /* - * If we are in case insentive mode, we need to + * If we are in case insentive mode, we don't need to * store names that need no translation - else, it * would be a waste. */ @@ -106,8 +106,8 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) DEBUG(0,("stat_cache_add: Out of memory !\n")); return; } - safe_strcpy(scp->names, orig_name, namelen); - safe_strcpy((scp->names+namelen+1), translated_path, namelen); + overmalloc_safe_strcpy(scp->names, orig_name, namelen); + overmalloc_safe_strcpy((scp->names+namelen+1), translated_path, namelen); scp->name_len = namelen; hash_insert(&stat_cache, (char *)scp, orig_name); } @@ -122,8 +122,8 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) DEBUG(0,("stat_cache_add: Out of memory !\n")); return; } - safe_strcpy(scp->names, orig_name, namelen); - safe_strcpy(scp->names+namelen+1, translated_path, namelen); + overmalloc_safe_strcpy(scp->names, orig_name, namelen); + overmalloc_safe_strcpy(scp->names+namelen+1, translated_path, namelen); scp->name_len = namelen; hash_insert(&stat_cache, (char *)scp, orig_name); } @@ -136,7 +136,7 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) Return True if we translated (and did a scuccessful stat on) the entire name. *****************************************************************************/ -BOOL stat_cache_lookup(connection_struct *conn, char *name, char *dirpath, +BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath, char **start, SMB_STRUCT_STAT *pst) { stat_cache_entry *scp; -- cgit From d8549b0360b86f151a8cd221838d005e083bfba8 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 07:16:32 +0000 Subject: signed/unsigned fix (This used to be commit f6bcfa59447700e0ccfc069d0228019a9bdca9d2) --- source3/include/client.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/include/client.h b/source3/include/client.h index a3efda4918..0ea793de68 100644 --- a/source3/include/client.h +++ b/source3/include/client.h @@ -110,8 +110,8 @@ struct cli_state { int readbraw_supported; int writebraw_supported; int timeout; /* in milliseconds. */ - int max_xmit; - int max_mux; + size_t max_xmit; + size_t max_mux; char *outbuf; char *inbuf; unsigned int bufsize; -- cgit From a27d434c4b4363762e7a0d5eeddd35e2b8dbb374 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 07:45:51 +0000 Subject: Fix signed/unsigned issues - mostly 'i' counters. Fix an inconpatible poitner type that caused the IA64 not to build Andrew Bartlett (This used to be commit 37436b0aae108fceace3049d3868510e1ba592ac) --- source3/rpc_parse/parse_lsa.c | 14 +++++++------- source3/rpc_parse/parse_misc.c | 10 +++++----- source3/rpc_parse/parse_net.c | 22 +++++++++++----------- source3/rpc_parse/parse_prs.c | 4 ++-- source3/rpc_parse/parse_sec.c | 16 ++++++++-------- source3/rpc_parse/parse_srv.c | 20 ++++++++++---------- source3/utils/net_ads_cldap.c | 8 ++++---- 7 files changed, 47 insertions(+), 47 deletions(-) diff --git a/source3/rpc_parse/parse_lsa.c b/source3/rpc_parse/parse_lsa.c index 2753ae524a..fc9999dc4d 100644 --- a/source3/rpc_parse/parse_lsa.c +++ b/source3/rpc_parse/parse_lsa.c @@ -80,7 +80,7 @@ static BOOL lsa_io_trans_name(const char *desc, LSA_TRANS_NAME *trn, prs_struct static BOOL lsa_io_dom_r_ref(const char *desc, DOM_R_REF *r_r, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "lsa_io_dom_r_ref"); depth++; @@ -531,7 +531,7 @@ BOOL lsa_io_q_enum_trust_dom(const char *desc, LSA_Q_ENUM_TRUST_DOM *q_e, void init_r_enum_trust_dom(TALLOC_CTX *ctx, LSA_R_ENUM_TRUST_DOM *r_e, uint32 enum_context, uint32 req_num_domains, uint32 num_domains, TRUSTDOM **td) { - int i; + unsigned int i; DEBUG(5, ("init_r_enum_trust_dom\n")); @@ -851,7 +851,7 @@ static void init_lsa_sid_enum(TALLOC_CTX *mem_ctx, LSA_SID_ENUM *sen, static BOOL lsa_io_sid_enum(const char *desc, LSA_SID_ENUM *sen, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "lsa_io_sid_enum"); depth++; @@ -967,7 +967,7 @@ BOOL lsa_io_q_lookup_sids(const char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct * static BOOL lsa_io_trans_names(const char *desc, LSA_TRANS_NAME_ENUM *trn, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "lsa_io_trans_names"); depth++; @@ -1063,7 +1063,7 @@ makes a structure. void init_q_lookup_names(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_NAMES *q_l, POLICY_HND *hnd, int num_names, const char **names) { - int i; + unsigned int i; DEBUG(5, ("init_q_lookup_names\n")); @@ -1102,7 +1102,7 @@ reads or writes a structure. BOOL lsa_io_q_lookup_names(const char *desc, LSA_Q_LOOKUP_NAMES *q_r, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "lsa_io_q_lookup_names"); depth++; @@ -1166,7 +1166,7 @@ reads or writes a structure. BOOL lsa_io_r_lookup_names(const char *desc, LSA_R_LOOKUP_NAMES *r_r, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "lsa_io_r_lookup_names"); depth++; diff --git a/source3/rpc_parse/parse_misc.c b/source3/rpc_parse/parse_misc.c index df80c76ee5..b7b0e9346b 100644 --- a/source3/rpc_parse/parse_misc.c +++ b/source3/rpc_parse/parse_misc.c @@ -697,7 +697,7 @@ BOOL smb_io_buffer5(const char *desc, BUFFER5 *buf5, prs_struct *ps, int depth) Inits a BUFFER2 structure. ********************************************************************/ -void init_buffer2(BUFFER2 *str, const uint8 *buf, int len) +void init_buffer2(BUFFER2 *str, const uint8 *buf, size_t len) { ZERO_STRUCTP(str); @@ -1050,7 +1050,7 @@ BOOL smb_io_unistr2(const char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct * BOOL init_unistr2_array(UNISTR2_ARRAY *array, uint32 count, const char **strings) { - int i; + unsigned int i; array->count = count; array->ref_id = count?1:0; @@ -1078,7 +1078,7 @@ BOOL init_unistr2_array(UNISTR2_ARRAY *array, ********************************************************************/ BOOL smb_io_unistr2_array(const char *desc, UNISTR2_ARRAY *array, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "smb_io_unistr2_array"); depth++; @@ -1128,7 +1128,7 @@ BOOL smb_io_unistr2_array(const char *desc, UNISTR2_ARRAY *array, prs_struct *ps BOOL init_sid_array(SID_ARRAY *array, uint32 count, DOM_SID *sids) { - int i; + unsigned int i; array->count = count; array->ref_id = count?1:0; @@ -1155,7 +1155,7 @@ BOOL init_sid_array(SID_ARRAY *array, ********************************************************************/ BOOL smb_io_sid_array(const char *desc, SID_ARRAY *array, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "smb_io_sid_array"); depth++; diff --git a/source3/rpc_parse/parse_net.c b/source3/rpc_parse/parse_net.c index 53f660fcc3..a660084250 100644 --- a/source3/rpc_parse/parse_net.c +++ b/source3/rpc_parse/parse_net.c @@ -432,7 +432,7 @@ BOOL net_io_r_logon_ctrl(const char *desc, NET_R_LOGON_CTRL *r_l, prs_struct *ps void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t, uint32 num_doms, const char *dom_name) { - int i = 0; + unsigned int i = 0; DEBUG(5,("init_r_trust_dom\n")); @@ -1038,12 +1038,12 @@ void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name, uint32 log_id_low, uint32 log_id_high, const char *user_name, const char *wksta_name, const uchar lm_challenge[8], - const uchar * lm_chal_resp, int lm_chal_resp_len, - const uchar * nt_chal_resp, int nt_chal_resp_len) + const uchar * lm_chal_resp, size_t lm_chal_resp_len, + const uchar * nt_chal_resp, size_t nt_chal_resp_len) { - int len_domain_name = strlen(domain_name); - int len_user_name = strlen(user_name ); - int len_wksta_name = strlen(wksta_name ); + size_t len_domain_name = strlen(domain_name); + size_t len_user_name = strlen(user_name ); + size_t len_wksta_name = strlen(wksta_name ); unsigned char lm_owf[24]; unsigned char nt_owf[128]; @@ -1281,7 +1281,7 @@ void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr, { /* only cope with one "other" sid, right now. */ /* need to count the number of space-delimited sids */ - int i; + unsigned int i; int num_other_sids = 0; NTTIME logon_time, logoff_time, kickoff_time, @@ -1390,7 +1390,7 @@ void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr, BOOL net_io_user_info3(const char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, int depth, uint16 validation_level) { - int i; + unsigned int i; if (usr == NULL) return False; @@ -2363,7 +2363,7 @@ reads or writes a structure. static BOOL net_io_sam_policy_info(const char *desc, SAM_DELTA_POLICY *info, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "net_io_sam_policy_info"); depth++; @@ -2584,7 +2584,7 @@ reads or writes a structure. static BOOL net_io_sam_privs_info(const char *desc, SAM_DELTA_PRIVS *info, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "net_io_sam_privs_info"); depth++; @@ -2895,7 +2895,7 @@ reads or writes a structure. BOOL net_io_r_sam_deltas(const char *desc, uint8 sess_key[16], NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth) { - int i; + unsigned int i; prs_debug(ps, depth, desc, "net_io_r_sam_deltas"); depth++; diff --git a/source3/rpc_parse/parse_prs.c b/source3/rpc_parse/parse_prs.c index 702375be35..aeaa42ac92 100644 --- a/source3/rpc_parse/parse_prs.c +++ b/source3/rpc_parse/parse_prs.c @@ -938,7 +938,7 @@ BOOL prs_buffer2(BOOL charmode, const char *name, prs_struct *ps, int depth, BUF BOOL prs_string2(BOOL charmode, const char *name, prs_struct *ps, int depth, STRING2 *str) { - int i; + unsigned int i; char *q = prs_mem_get(ps, str->str_max_len); if (q == NULL) return False; @@ -1035,7 +1035,7 @@ BOOL prs_unistr3(BOOL charmode, const char *name, UNISTR3 *str, prs_struct *ps, BOOL prs_unistr(const char *name, prs_struct *ps, int depth, UNISTR *str) { - int len = 0; + unsigned int len = 0; unsigned char *p = (unsigned char *)str->buffer; uint8 *start; char *q; diff --git a/source3/rpc_parse/parse_sec.c b/source3/rpc_parse/parse_sec.c index 10b0ff86ae..081173cf8d 100644 --- a/source3/rpc_parse/parse_sec.c +++ b/source3/rpc_parse/parse_sec.c @@ -159,7 +159,7 @@ BOOL sec_io_ace(const char *desc, SEC_ACE *psa, prs_struct *ps, int depth) NTSTATUS sec_ace_add_sid(TALLOC_CTX *ctx, SEC_ACE **new, SEC_ACE *old, unsigned *num, DOM_SID *sid, uint32 mask) { - int i = 0; + unsigned int i = 0; if (!ctx || !new || !old || !sid || !num) return NT_STATUS_INVALID_PARAMETER; @@ -185,7 +185,7 @@ NTSTATUS sec_ace_add_sid(TALLOC_CTX *ctx, SEC_ACE **new, SEC_ACE *old, unsigned NTSTATUS sec_ace_mod_sid(SEC_ACE *ace, size_t num, DOM_SID *sid, uint32 mask) { - int i = 0; + unsigned int i = 0; if (!ace || !sid) return NT_STATUS_INVALID_PARAMETER; @@ -202,14 +202,14 @@ NTSTATUS sec_ace_mod_sid(SEC_ACE *ace, size_t num, DOM_SID *sid, uint32 mask) delete SID from ACL ********************************************************************/ -NTSTATUS sec_ace_del_sid(TALLOC_CTX *ctx, SEC_ACE **new, SEC_ACE *old, size_t *num, DOM_SID *sid) +static NTSTATUS sec_ace_del_sid(TALLOC_CTX *ctx, SEC_ACE **new, SEC_ACE *old, uint32 *num, DOM_SID *sid) { - int i = 0; - int n_del = 0; + unsigned int i = 0; + unsigned int n_del = 0; if (!ctx || !new || !old || !sid || !num) return NT_STATUS_INVALID_PARAMETER; - if((new[0] = (SEC_ACE *) talloc_zero(ctx, *num * sizeof(SEC_ACE))) == 0) + if((new[0] = (SEC_ACE *) talloc_zero(ctx, (*num) * sizeof(SEC_ACE))) == 0) return NT_STATUS_NO_MEMORY; for (i = 0; i < *num; i ++) { @@ -283,7 +283,7 @@ SEC_ACL *dup_sec_acl(TALLOC_CTX *ctx, SEC_ACL *src) BOOL sec_io_acl(const char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth) { - int i; + unsigned int i; uint32 old_offset; uint32 offset_acl_size; SEC_ACL *psa; @@ -407,7 +407,7 @@ BOOL sec_ace_equal(SEC_ACE *s1, SEC_ACE *s2) BOOL sec_acl_equal(SEC_ACL *s1, SEC_ACL *s2) { - int i, j; + unsigned int i, j; /* Trivial cases */ diff --git a/source3/rpc_parse/parse_srv.c b/source3/rpc_parse/parse_srv.c index bfa1a13be9..27763aa224 100644 --- a/source3/rpc_parse/parse_srv.c +++ b/source3/rpc_parse/parse_srv.c @@ -1665,8 +1665,8 @@ static BOOL srv_io_srv_sess_info_0(const char *desc, SRV_SESS_INFO_0 *ss0, prs_s return False; if (ss0->ptr_sess_info != 0) { - int i; - int num_entries = ss0->num_entries_read; + uint32 i; + uint32 num_entries = ss0->num_entries_read; if (num_entries > MAX_SESS_ENTRIES) { num_entries = MAX_SESS_ENTRIES; /* report this! */ @@ -1802,8 +1802,8 @@ static BOOL srv_io_srv_sess_info_1(const char *desc, SRV_SESS_INFO_1 *ss1, prs_s return False; if (ss1->ptr_sess_info != 0) { - int i; - int num_entries = ss1->num_entries_read; + uint32 i; + uint32 num_entries = ss1->num_entries_read; if (num_entries > MAX_SESS_ENTRIES) { num_entries = MAX_SESS_ENTRIES; /* report this! */ @@ -1944,7 +1944,7 @@ BOOL srv_io_q_net_sess_enum(const char *desc, SRV_Q_NET_SESS_ENUM *q_n, prs_stru if(!prs_uint32("sess_level", ps, depth, &q_n->sess_level)) return False; - if (q_n->sess_level != -1) { + if (q_n->sess_level != (uint32)-1) { if(!srv_io_srv_sess_ctr("sess_ctr", &q_n->ctr, ps, depth)) return False; } @@ -1976,7 +1976,7 @@ BOOL srv_io_r_net_sess_enum(const char *desc, SRV_R_NET_SESS_ENUM *r_n, prs_stru if(!prs_uint32("sess_level", ps, depth, &r_n->sess_level)) return False; - if (r_n->sess_level != -1) { + if (r_n->sess_level != (uint32)-1) { if(!srv_io_srv_sess_ctr("sess_ctr", &r_n->ctr, ps, depth)) return False; } @@ -2309,7 +2309,7 @@ BOOL srv_io_q_net_conn_enum(const char *desc, SRV_Q_NET_CONN_ENUM *q_n, prs_stru if(!prs_uint32("conn_level", ps, depth, &q_n->conn_level)) return False; - if (q_n->conn_level != -1) { + if (q_n->conn_level != (uint32)-1) { if(!srv_io_srv_conn_ctr("conn_ctr", &q_n->ctr, ps, depth)) return False; } @@ -2341,7 +2341,7 @@ BOOL srv_io_r_net_conn_enum(const char *desc, SRV_R_NET_CONN_ENUM *r_n, prs_str if(!prs_uint32("conn_level", ps, depth, &r_n->conn_level)) return False; - if (r_n->conn_level != -1) { + if (r_n->conn_level != (uint32)-1) { if(!srv_io_srv_conn_ctr("conn_ctr", &r_n->ctr, ps, depth)) return False; } @@ -2573,7 +2573,7 @@ BOOL srv_io_q_net_file_enum(const char *desc, SRV_Q_NET_FILE_ENUM *q_n, prs_stru if(!prs_uint32("file_level", ps, depth, &q_n->file_level)) return False; - if (q_n->file_level != -1) { + if (q_n->file_level != (uint32)-1) { if(!srv_io_srv_file_ctr("file_ctr", &q_n->ctr, ps, depth)) return False; } @@ -3271,7 +3271,7 @@ BOOL srv_io_q_net_disk_enum(const char *desc, SRV_Q_NET_DISK_ENUM *q_n, prs_stru BOOL srv_io_r_net_disk_enum(const char *desc, SRV_R_NET_DISK_ENUM *r_n, prs_struct *ps, int depth) { - int i; + unsigned int i; uint32 entries_read, entries_read2, entries_read3; if (r_n == NULL) diff --git a/source3/utils/net_ads_cldap.c b/source3/utils/net_ads_cldap.c index ad66af0439..86d5abea4b 100644 --- a/source3/utils/net_ads_cldap.c +++ b/source3/utils/net_ads_cldap.c @@ -59,7 +59,7 @@ struct cldap_netlogon_reply { */ static unsigned pull_netlogon_string(struct netlogon_string *ret,const char *d) { - char *p = (char *)d; + const char *p = (const char *)d; ZERO_STRUCTP(ret); @@ -140,7 +140,7 @@ static int send_cldap_netlogon(int sock, const char *domain, return -1; } - if (write(sock, data.data, data.length) != data.length) { + if (write(sock, data.data, data.length) != (ssize_t)data.length) { d_printf("failed to send cldap query (%s)\n", strerror(errno)); } @@ -233,7 +233,7 @@ static int recv_cldap_netlogon(int sock, struct cldap_netlogon_reply *reply) */ static void netlogon_string_free(struct netlogon_string *str) { - int i; + unsigned int i; for (i = 0; i < str->comp_len; ++i) { SAFE_FREE(str->component[i]); @@ -259,7 +259,7 @@ static void cldap_reply_free(struct cldap_netlogon_reply *reply) static void d_print_netlogon_string(const char *label, struct netlogon_string *str) { - int i; + unsigned int i; if (str->comp_len) { d_printf("%s", label); -- cgit From f1d333ea35a4fed92e2d51aafa4e758f577e5cf1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 08:03:11 +0000 Subject: Remove an unused function and fix the build. Andrew Bartlett (This used to be commit 67a0319d268dfc0e2154d3ab0f8bf866e3cbb6db) --- source3/lib/charcnv.c | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index 76d77ddd67..fa646573d8 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -646,42 +646,6 @@ size_t pull_ucs2_allocate(void **dest, const smb_ucs2_t *src) return convert_string_allocate(CH_UCS2, CH_UNIX, src, src_len, dest); } -/** - Copy a string from a utf-8 source to a unix char* destination. - Flags can have: - STR_TERMINATE means the string in src is null terminated. - if STR_TERMINATE is set then src_len is ignored. - src_len is the length of the source area in bytes - Return the number of bytes occupied by the string in src. - The resulting string in "dest" is always null terminated. -**/ - -static size_t pull_utf8(char *dest, const void *src, size_t dest_len, size_t src_len, int flags) -{ - size_t ret; - - if (dest_len == (size_t)-1) - dest_len = sizeof(pstring); - - if (flags & STR_TERMINATE) { - if (src_len == (size_t)-1) { - src_len = strlen(src) + 1; - } else { - size_t len = strnlen(src, src_len); - if (len < src_len) - len++; - src_len = len; - } - } - - ret = convert_string(CH_UTF8, CH_UNIX, src, src_len, dest, dest_len); - if (dest_len) - dest[MIN(ret, dest_len-1)] = 0; - - return src_len; -} -#endif - /** * Copy a string from a UTF-8 src to a unix char * destination, allocating a buffer using talloc * -- cgit From 02704f973347f05af5ebcb0d4a494a6102199536 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 08:18:29 +0000 Subject: Minor fixes. - signed/unsigned - quieten warning about assignment as truth value - whitespace Andrew Bartlett (This used to be commit a13ce0df4b4a776fa635a1fb804dd00d195f58d0) --- source3/include/rpc_lsa.h | 2 +- source3/libsmb/trusts_util.c | 4 ++-- source3/smbd/ipc.c | 8 ++++---- source3/utils/net_ads.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source3/include/rpc_lsa.h b/source3/include/rpc_lsa.h index c091e73321..8e1368810f 100644 --- a/source3/include/rpc_lsa.h +++ b/source3/include/rpc_lsa.h @@ -237,7 +237,7 @@ typedef struct r_lsa_query_sec_obj_info typedef struct lsa_query_info { POLICY_HND pol; /* policy handle */ - uint16 info_class; /* info class */ + uint16 info_class; /* info class */ } LSA_Q_QUERY_INFO; diff --git a/source3/libsmb/trusts_util.c b/source3/libsmb/trusts_util.c index 055851f6b7..f7b2c2e3a6 100644 --- a/source3/libsmb/trusts_util.c +++ b/source3/libsmb/trusts_util.c @@ -152,9 +152,9 @@ BOOL is_trusted_domain(const char* dom_name) talloc_destroy(mem_ctx); return True; } - } + } } while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)); - + /* * Query the trustdom_cache updated periodically. The only * way for domain member server. diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c index c8bb0c2505..85e28f5d17 100644 --- a/source3/smbd/ipc.c +++ b/source3/smbd/ipc.c @@ -138,9 +138,9 @@ void send_trans_reply(char *outbuf, set_message(outbuf,10,1+this_ldata+this_lparam+align,False); copy_trans_params_and_data(outbuf, align, - rparam, tot_param_sent, this_lparam, - rdata, tot_data_sent, this_ldata); - + rparam, tot_param_sent, this_lparam, + rdata, tot_data_sent, this_ldata); + SSVAL(outbuf,smb_vwv3,this_lparam); SSVAL(outbuf,smb_vwv4,smb_offset(smb_buf(outbuf)+1,outbuf)); SSVAL(outbuf,smb_vwv5,tot_param_sent); @@ -410,7 +410,7 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int } if (suwcnt) { - int i; + unsigned int i; if((setup = (uint16 *)malloc(suwcnt*sizeof(uint16))) == NULL) { DEBUG(0,("reply_trans: setup malloc fail for %u bytes !\n", (unsigned int)(suwcnt * sizeof(uint16)))); SAFE_FREE(data); diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c index ea31a92575..22b9d50ea1 100644 --- a/source3/utils/net_ads.c +++ b/source3/utils/net_ads.c @@ -155,7 +155,7 @@ retry: * If the username is of the form "name@realm", * extract the realm and convert to upper case. */ - if (realm = strchr(ads->auth.user_name, '@')) { + if ((realm = strchr(ads->auth.user_name, '@'))) { *realm++ = '\0'; ads->auth.realm = strdup(realm); strupper(ads->auth.realm); -- cgit From 662b5498183a7ed981bc0fa9d29acb634f326d7c Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 10:59:14 +0000 Subject: Fix the non-DEVELOPER case of my macro madness... Andrew Bartlett (This used to be commit 618bda3a28f65417e3c31a70229f6da70cf223fc) --- source3/include/safe_string.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h index c7386d3ac4..8b3665d97b 100644 --- a/source3/include/safe_string.h +++ b/source3/include/safe_string.h @@ -150,7 +150,7 @@ size_t __unsafe_string_function_usage_here2__(void); #define push_string(base_ptr, dest, src, dest_len, flags) push_string_fn2(NULL, 0, base_ptr, dest, src, dest_len, flags) #define pull_string(base_ptr, dest, src, dest_len, src_len, flags) pull_string_fn2(NULL, 0, base_ptr, dest, src, dest_len, src_len, flags) #define clistr_push(cli, dest, src, dest_len, flags) clistr_push_fn2(NULL, 0, cli, dest, src, dest_len, flags) -#define clistr_pull(cli, dest, src, dest_len, src_len, flags) clistr_push_fn2(NULL, 0, cli, dest, src, dest_len, src_len, flags) +#define clistr_pull(cli, dest, src, dest_len, src_len, flags) clistr_pull_fn2(NULL, 0, cli, dest, src, dest_len, src_len, flags) #define alpha_strcpy(dest,src,other_safe_chars,maxlength) alpha_strcpy_fn(NULL,0,dest,src,other_safe_chars,maxlength) #define StrnCpy(dest,src,n) StrnCpy_fn(NULL,0,dest,src,n) -- cgit From a4261c229571bea5ce3fc00f024133b3b50cd4bf Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 11:28:45 +0000 Subject: Fix the 'non-optomizing compiler' case... Andrew Bartlett (This used to be commit 94424c5d72246b2e58f3a21aa0de6949d7eb2da1) --- source3/include/safe_string.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h index 8b3665d97b..3e19659961 100644 --- a/source3/include/safe_string.h +++ b/source3/include/safe_string.h @@ -199,8 +199,8 @@ size_t __unsafe_string_function_usage_here2__(void); #define safe_strcat_fn2 safe_strcat_fn #define push_string_fn2 push_string_fn #define pull_string_fn2 pull_string_fn -#define clistr_push_fn2 clistr_push_fn2 -#define clistr_pull_fn2 clistr_pull_fn2 +#define clistr_push_fn2 clistr_push_fn +#define clistr_pull_fn2 clistr_pull_fn #endif -- cgit From 2055e724ada91865ba00b2d79bc0737504ea761d Mon Sep 17 00:00:00 2001 From: Steve French Date: Sat, 15 Mar 2003 22:35:47 +0000 Subject: Checkin cifs vfs for Linux mount helper (This used to be commit a55acfd7a296c5ae9b043dc03393a29d87e43a40) --- source3/client/mount.cifs.c | 254 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 211 insertions(+), 43 deletions(-) diff --git a/source3/client/mount.cifs.c b/source3/client/mount.cifs.c index 5b19752f8b..7167859d7b 100755 --- a/source3/client/mount.cifs.c +++ b/source3/client/mount.cifs.c @@ -13,6 +13,7 @@ #include #include #include +#include #define MOUNT_CIFS_VERSION "1" @@ -22,6 +23,11 @@ char * thisprogram; int verboseflag = 0; static int got_password = 0; static int got_user = 0; +static int got_domain = 0; +static int got_ip = 0; +static int got_unc = 0; +static int got_uid = 0; +static int got_gid = 0; static char * user_name = NULL; char * mountpassword = NULL; @@ -32,7 +38,7 @@ void mount_cifs_usage() printf("\nMount the remotetarget, specified as either a UNC name or "); printf(" CIFS URL, to the local directory, dir.\n"); - return; + exit(1); } /* caller frees username if necessary */ @@ -51,9 +57,137 @@ char * parse_cifs_url(unc_name) printf("\ncifs url %s\n",unc_name); } -char * parse_options(char * options) +int parse_options(char * options) { - /* BB add missing code BB */ + char * data; + char * value = 0; + + if (!options) + return 1; + + while ((data = strsep(&options, ",")) != NULL) { + if (!*data) + continue; + if ((value = strchr(data, '=')) != NULL) { + *value++ = '\0'; + } + if (strncmp(data, "user", 4) == 0) { + if (!value || !*value) { + printf("invalid or missing username\n"); + return 1; /* needs_arg; */ + } + if (strnlen(value, 260) < 260) { + got_user=1; + /* BB add check for format user%pass */ + /* if(strchr(username%passw) got_password = 1) */ + } else { + printf("username too long\n"); + return 1; + } + } else if (strncmp(data, "pass", 4) == 0) { + if (!value || !*value) { + if(got_password) { + printf("password specified twice, ignoring second\n"); + } else + got_password = 1; + } else if (strnlen(value, 17) < 17) { + got_password = 1; + } else { + printf("password too long\n"); + return 1; + } + } else if (strncmp(data, "ip", 2) == 0) { + if (!value || !*value) { + printf("target ip address argument missing"); + } else if (strnlen(value, 35) < 35) { + got_ip = 1; + } else { + printf("ip address too long\n"); + return 1; + } + } else if ((strncmp(data, "unc", 3) == 0) + || (strncmp(data, "target", 6) == 0) + || (strncmp(data, "path", 4) == 0)) { + if (!value || !*value) { + printf("invalid path to network resource\n"); + return 1; /* needs_arg; */ + } else if(strnlen(value,5) < 5) { + printf("UNC name too short"); + } + + if (strnlen(value, 300) < 300) { + got_unc = 1; + if (strncmp(value, "//", 2) == 0) { + if(got_unc) + printf("unc name specified twice, ignoring second\n"); + else + got_unc = 1; + } else if (strncmp(value, "\\\\", 2) != 0) { + printf("UNC Path does not begin with // or \\\\ \n"); + return 1; + } else { + if(got_unc) + printf("unc name specified twice, ignoring second\n"); + else + got_unc = 1; + } + } else { + printf("CIFS: UNC name too long\n"); + return 1; + } + } else if ((strncmp(data, "domain", 3) == 0) + || (strncmp(data, "workgroup", 5) == 0)) { + if (!value || !*value) { + printf("CIFS: invalid domain name\n"); + return 1; /* needs_arg; */ + } + if (strnlen(value, 65) < 65) { + got_domain = 1; + } else { + printf("domain name too long\n"); + return 1; + } + } else if (strncmp(data, "uid", 3) == 0) { + if (value && *value) { + got_uid = 1; + } + } else if (strncmp(data, "gid", 3) == 0) { + if (value && *value) { + got_gid = 1; + } + } /* else if (strnicmp(data, "file_mode", 4) == 0) { + if (value && *value) { + vol->file_mode = + simple_strtoul(value, &value, 0); + } + } else if (strnicmp(data, "dir_mode", 3) == 0) { + if (value && *value) { + vol->dir_mode = + simple_strtoul(value, &value, 0); + } + } else if (strnicmp(data, "port", 4) == 0) { + if (value && *value) { + vol->port = + simple_strtoul(value, &value, 0); + } + } else if (strnicmp(data, "rsize", 5) == 0) { + if (value && *value) { + vol->rsize = + simple_strtoul(value, &value, 0); + } + } else if (strnicmp(data, "wsize", 5) == 0) { + if (value && *value) { + vol->wsize = + simple_strtoul(value, &value, 0); + } + } else if (strnicmp(data, "version", 3) == 0) { + + } else if (strnicmp(data, "rw", 2) == 0) { + + } else + printf("CIFS: Unknown mount option %s\n",data); */ + } + return 0; } /* Note that caller frees the returned buffer if necessary */ @@ -67,7 +201,6 @@ char * parse_server(char * unc_name) int rc,j; char temp[64]; - if(length > 1023) { printf("mount error: UNC name too long"); return 0; @@ -89,8 +222,11 @@ char * parse_server(char * unc_name) printf(" %s does not begin with \\\\ or //\n",unc_name); return 0; } else { + unc_name[0] = '\\'; + unc_name[1] = '\\'; unc_name += 2; - if (share = strchr(unc_name, '/')) { + if ((share = strchr(unc_name, '/')) || + (share = strchr(unc_name,'\\'))) { *share = 0; /* temporarily terminate the string */ share += 1; host_entry = gethostbyname(unc_name); @@ -102,7 +238,6 @@ char * parse_server(char * unc_name) return 0; } else { - printf("Target server %s %x found\n",host_entry->h_name,host_entry->h_addr); /* BB removeme */ /* BB should we pass an alternate version of the share name as Unicode */ /* BB what about ipv6? BB */ /* BB add retries with alternate servers in list */ @@ -159,12 +294,12 @@ int main(int argc, char ** argv) int c; int flags = MS_MANDLOCK | MS_MGC_VAL; char * orgoptions = NULL; - char * options; - char * share_name; + char * share_name = NULL; char * domain_name = NULL; - char * ipaddr; - char * mount_point; + char * ipaddr = NULL; char * uuid = NULL; + char * mountpoint; + char * options; int rc,i; int rsize = 0; int wsize = 0; @@ -174,6 +309,8 @@ int main(int argc, char ** argv) int optlen = 0; struct stat statbuf; struct utsname sysinfo; + struct mntent mountent; + FILE * pmntfile; /* setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); @@ -186,12 +323,14 @@ int main(int argc, char ** argv) thisprogram = "mount.cifs"; uname(&sysinfo); -#ifdef _GNU_SOURCE + /* BB add workstation name and domain and pass down */ +/*#ifdef _GNU_SOURCE printf(" node: %s machine: %s\n", sysinfo.nodename,sysinfo.machine); -#endif - mount_cifs_usage(); +#endif*/ + if(argc < 3) + mount_cifs_usage(); share_name = argv[1]; - mount_point = argv[2]; + mountpoint = argv[2]; /* add sharename in opts string as unc= parm */ while ((c = getopt_long (argc, argv, "afFhilL:no:O:rsU:vVwt:", @@ -291,7 +430,7 @@ int main(int argc, char ** argv) user_name = optarg; break; case 141: - domain_name = optarg; + domain_name = optarg; break; case 142: got_password = 1; @@ -303,18 +442,14 @@ int main(int argc, char ** argv) } } - for(i = 0;i < argc;i++) /* BB remove */ - printf("\narg %d is %s",i,argv[i]); /* BB remove */ - printf("\n"); /* BB removeme */ - /* canonicalize the path in argv[1]? */ - if(stat (mount_point, &statbuf)) { - printf("mount error: mount point %s does not exist\n",mount_point); + if(stat (mountpoint, &statbuf)) { + printf("mount error: mount point %s does not exist\n",mountpoint); return -1; } if (S_ISDIR(statbuf.st_mode) == 0) { - printf("mount error: mount point %s is not a directory\n",mount_point); + printf("mount error: mount point %s is not a directory\n",mountpoint); return -1; } @@ -326,7 +461,8 @@ int main(int argc, char ** argv) ipaddr = parse_server(share_name); /* if(share_name == NULL) return 1; */ - parse_options(orgoptions); + if (parse_options(strdup(orgoptions))) + return 1; if(got_user == 0) user_name = getusername(); @@ -348,32 +484,50 @@ int main(int argc, char ** argv) got_password = 1; } } - - /* launch daemon (handles dfs name resolution and credential change) */ - if(orgoptions) + /* FIXME launch daemon (handles dfs name resolution and credential change) + remember to clear parms and overwrite password field before launching */ + if(orgoptions) { optlen = strlen(orgoptions); - else + } else optlen = 0; - options = malloc(optlen + 25 + strlen(share_name) + strlen(user_name) - + strlen(ipaddr) + 1); - strcpy(options,"unc="); + if(share_name) + optlen += strlen(share_name) + 4; + if(user_name) + optlen += strlen(user_name) + 6; + if(ipaddr) + optlen += strlen(ipaddr) + 4; + if(mountpassword) + optlen += strlen(mountpassword) + 6; + options = malloc(optlen + 10); + + options[0] = 0; + strncat(options,"unc=",4); strcat(options,share_name); - strncat(options,",ip=",4); - strcat(options,ipaddr); - strncat(options,",user=",6); - strcat(options,user_name); - strncat(options,",pass=",6); - strcat(options,mountpassword); + if(ipaddr) { + strncat(options,",ip=",4); + strcat(options,ipaddr); + } + if(user_name) { + strncat(options,",user=",6); + strcat(options,user_name); + } + if(mountpassword) { + strncat(options,",pass=",6); + strcat(options,mountpassword); + } strncat(options,",ver=",5); strcat(options,MOUNT_CIFS_VERSION); - if(optlen) + + if(orgoptions) { + strcat(options,","); strcat(options,orgoptions); - printf("\noptions %s \n",options); - if(mount(share_name, mount_point, "cifs", flags, options)) { + } + /* printf("\noptions %s \n",options);*/ + if(mount(share_name, mountpoint, "cifs", flags, options)) { /* remember to kill daemon on error */ switch (errno) { case 0: - printf(" success\n"); /* BB removeme */ + printf("mount failed but no error number set\n"); return 0; case ENODEV: printf("mount error: cifs filesystem not supported by the system\n"); @@ -381,9 +535,23 @@ int main(int argc, char ** argv) default: printf("mount error %d = %s",errno,strerror(errno)); } - printf("\nRefer to the mount.cifs(8) manual page (e.g.man mount.cifs)\n"); + printf("Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)\n"); return -1; - } else - printf(" mount succeeded\n"); /* BB removeme */ + } else { + pmntfile = setmntent(MOUNTED, "a+"); + if(pmntfile) { + mountent.mnt_fsname = share_name; + mountent.mnt_dir = mountpoint; + mountent.mnt_type = "cifs"; + mountent.mnt_opts = ""; + mountent.mnt_freq = 0; + mountent.mnt_passno = 0; + rc = addmntent(pmntfile,&mountent); + endmntent(pmntfile); + } else { + printf("could not update mount table\n"); + } + } + return 0; } -- cgit From 4b6b03e1838a8cf06c56b6afdaa00402a8a7b83d Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 22:57:00 +0000 Subject: Fix non-gmake syntax error. (This used to be commit 97daece056516e52e56bf5a749676e7c53e087e3) --- source3/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index 1a4d97e083..40abe5d71b 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -215,7 +215,7 @@ LIBMSRPC_OBJ = rpc_client/cli_lsarpc.o rpc_client/cli_samr.o \ rpc_client/cli_reg.o rpc_client/cli_pipe.o \ rpc_client/cli_spoolss.o rpc_client/cli_spoolss_notify.o \ rpc_client/cli_ds.o libsmb/namequery_dc.o - + LIBMSRPC_SERVER_OBJ = libsmb/trusts_util.o REGOBJS_OBJ = registry/reg_objects.o -- cgit From 0dca6fab27039a8874c4b3ab0da5401975344fa9 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Mar 2003 23:16:40 +0000 Subject: A hack to get us building on a slightly older heimdal kerberos. It appears that we don't need this flag - heimdal's internal password change routines don't set it. Andrew Bartlett (This used to be commit 069825bd78f2bf125e8a4e72933da924d393f5a5) --- source3/include/ads.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source3/include/ads.h b/source3/include/ads.h index f90983e405..07bf6e4b3b 100644 --- a/source3/include/ads.h +++ b/source3/include/ads.h @@ -213,3 +213,10 @@ typedef void **ADS_MODLIST; #if defined(HAVE_ENCTYPE_ARCFOUR_HMAC_MD5) #define ENCTYPE_ARCFOUR_HMAC ENCTYPE_ARCFOUR_HMAC_MD5 #endif + +/* The older versions of heimdal that don't have this + define don't seem to use it anyway. I'm told they + always use a subkey */ +#ifndef AP_OPTS_USE_SUBKEY +#define AP_OPTS_USE_SUBKEY 0 +#endif -- cgit From 3a9bdacca98560706eeb4e625ef1ce7c92d4dfab Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 00:39:40 +0000 Subject: More work on my macro mess - we need function prototypes of different types, and we were missing the 'char' type. Andrew Bartlett (This used to be commit 193e80fafbda9e3af58fec1e629ec607f29b4099) --- source3/include/safe_string.h | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h index 3e19659961..3bd38ea74e 100644 --- a/source3/include/safe_string.h +++ b/source3/include/safe_string.h @@ -48,10 +48,13 @@ #endif /* !_SPLINT_ */ - +/* We need a number of different prototypes for our + non-existant fuctions */ char * __unsafe_string_function_usage_here__(void); -size_t __unsafe_string_function_usage_here2__(void); +size_t __unsafe_string_function_usage_here_size_t__(void); + +size_t __unsafe_string_function_usage_here_char__(void); #ifdef HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS @@ -62,10 +65,10 @@ size_t __unsafe_string_function_usage_here2__(void); #define CHECK_STRING_SIZE(d, len) (sizeof(d) != (len) && sizeof(d) != sizeof(char *)) #define fstrterminate(d) (CHECK_STRING_SIZE(d, sizeof(fstring)) \ - ? __unsafe_string_function_usage_here__() \ + ? __unsafe_string_function_usage_here_char__() \ : (((d)[sizeof(fstring)-1]) = '\0')) #define pstrterminate(d) (CHECK_STRING_SIZE(d, sizeof(pstring)) \ - ? __unsafe_string_function_usage_here__() \ + ? __unsafe_string_function_usage_here_char__() \ : (((d)[sizeof(pstring)-1]) = '\0')) #define wpstrcpy(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \ @@ -83,7 +86,7 @@ size_t __unsafe_string_function_usage_here2__(void); #define push_pstring_base(dest, src, pstring_base) \ (CHECK_STRING_SIZE(pstring_base, sizeof(pstring)) \ - ? __unsafe_string_function_usage_here2__() \ + ? __unsafe_string_function_usage_here_size_t__() \ : push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE)) #else /* HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS */ @@ -175,22 +178,22 @@ size_t __unsafe_string_function_usage_here2__(void); #define push_string_fn2(fn_name, fn_line, base_ptr, dest, src, dest_len, flags) \ (CHECK_STRING_SIZE(dest, dest_len) \ - ? __unsafe_string_function_usage_here2__() \ + ? __unsafe_string_function_usage_here_size_t__() \ : push_string_fn(fn_name, fn_line, base_ptr, dest, src, dest_len, flags)) #define pull_string_fn2(fn_name, fn_line, base_ptr, dest, src, dest_len, src_len, flags) \ (CHECK_STRING_SIZE(dest, dest_len) \ - ? __unsafe_string_function_usage_here2__() \ + ? __unsafe_string_function_usage_here_size_t__() \ : pull_string_fn(fn_name, fn_line, base_ptr, dest, src, dest_len, src_len, flags)) #define clistr_push_fn2(fn_name, fn_line, cli, dest, src, dest_len, flags) \ (CHECK_STRING_SIZE(dest, dest_len) \ - ? __unsafe_string_function_usage_here2__() \ + ? __unsafe_string_function_usage_here_size_t__() \ : clistr_push_fn(fn_name, fn_line, cli, dest, src, dest_len, flags)) #define clistr_pull_fn2(fn_name, fn_line, cli, dest, src, dest_len, srclen, flags) \ (CHECK_STRING_SIZE(dest, dest_len) \ - ? __unsafe_string_function_usage_here2__() \ + ? __unsafe_string_function_usage_here_size_t__() \ : clistr_pull_fn(fn_name, fn_line, cli, dest, src, dest_len, srclen, flags)) #else -- cgit From 2f62a72d9aebf3cfe9aa60a0bdc73f1ae477d5b2 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 02:14:05 +0000 Subject: Changes to help the kerberos change password code work on systems that have some of the labels 'duplicated' (ie, the defines double-up). Also, to an ads_connect() to try and find our KDC. (So we don't segfualt *every* time) Andrew Bartlett (This used to be commit 56dce7ddad118051c93c62507234efca3920bc9b) --- source3/libads/krb5_setpw.c | 66 ++++++++++++++++++++------------------------- source3/utils/net_ads.c | 9 +++++++ 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/source3/libads/krb5_setpw.c b/source3/libads/krb5_setpw.c index 29bf1a427c..214871b3fb 100644 --- a/source3/libads/krb5_setpw.c +++ b/source3/libads/krb5_setpw.c @@ -178,47 +178,39 @@ static krb5_error_code build_kpasswd_request(uint16 pversion, return 0; } +static const struct kpasswd_errors { + int result_code; + const char *error_string; +} kpasswd_errors[] = { + {KRB5_KPASSWD_MALFORMED, "Malformed request error"}, + {KRB5_KPASSWD_HARDERROR, "Server error"}, + {KRB5_KPASSWD_AUTHERROR, "Authentication error"}, + {KRB5_KPASSWD_SOFTERROR, "Password change rejected"}, + {KRB5_KPASSWD_ACCESSDENIED, "Client does not have proper authorization"}, + {KRB5_KPASSWD_BAD_VERSION, "Protocol version not supported"}, + {KRB5_KPASSWD_INITIAL_FLAG_NEEDED, "Authorization ticket must have initial flag set"}, + {KRB5_KPASSWD_POLICY_REJECT, "Password rejected due to policy requirements"}, + {KRB5_KPASSWD_BAD_PRINCIPAL, "Target principal does not exist"}, + {KRB5_KPASSWD_ETYPE_NOSUPP, "Unsupported encryption type"}, + {0, NULL} +}; + static krb5_error_code krb5_setpw_result_code_string(krb5_context context, int result_code, const char **code_string) { - switch (result_code) { - case KRB5_KPASSWD_MALFORMED: - *code_string = "Malformed request error"; - break; - case KRB5_KPASSWD_HARDERROR: - *code_string = "Server error"; - break; - case KRB5_KPASSWD_AUTHERROR: - *code_string = "Authentication error"; - break; - case KRB5_KPASSWD_SOFTERROR: - *code_string = "Password change rejected"; - break; - case KRB5_KPASSWD_ACCESSDENIED: - *code_string = "Client does not have proper authorization"; - break; - case KRB5_KPASSWD_BAD_VERSION: - *code_string = "Protocol version not supported"; - break; - case KRB5_KPASSWD_INITIAL_FLAG_NEEDED: - *code_string = "Authorization ticket must have initial flag set"; - break; - case KRB5_KPASSWD_POLICY_REJECT: - *code_string = "Password rejected due to policy requirements"; - break; - case KRB5_KPASSWD_BAD_PRINCIPAL: - *code_string = "Target principal does not exist"; - break; - case KRB5_KPASSWD_ETYPE_NOSUPP: - *code_string = "Unsupported encryption type"; - break; - default: - *code_string = "Password change failed"; - break; - } - - return(0); + unsigned int idx = 0; + + while (kpasswd_errors[idx].error_string != NULL) { + if (kpasswd_errors[idx].result_code == + result_code) { + *code_string = kpasswd_errors[idx].error_string; + return 0; + } + idx++; + } + *code_string = "Password change failed"; + return (0); } static krb5_error_code parse_setpw_reply(krb5_context context, diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c index 22b9d50ea1..0f2d673b4b 100644 --- a/source3/utils/net_ads.c +++ b/source3/utils/net_ads.c @@ -910,6 +910,15 @@ static int net_ads_password(int argc, const char **argv) in realms other than default */ if (!(ads = ads_init(realm, NULL, NULL))) return -1; + /* we don't actually need a full connect, but it's the easy way to + fill in the KDC's addresss */ + ads_connect(ads); + + if (!ads || !ads->config.realm) { + d_printf("Didn't find the kerberos server!\n"); + return -1; + } + asprintf(&prompt, "Enter new password for %s:", argv[0]); new_password = getpass(prompt); -- cgit From 7cf0003dd23114947eec5fb6956f65f85efac7c1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 03:21:58 +0000 Subject: Fix nmbd under -DDEVELOPER (pstrcpy on not-pstring). Make a new macro to help in this situation, and add memcpy() parinoia Andrew Bartlett (This used to be commit 4d00626b6e003952df6715fa80615ec028facdf4) --- source3/include/safe_string.h | 2 ++ source3/nmbd/nmbd_packets.c | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h index 3bd38ea74e..65ec05a5c6 100644 --- a/source3/include/safe_string.h +++ b/source3/include/safe_string.h @@ -110,6 +110,8 @@ size_t __unsafe_string_function_usage_here_char__(void); #define pstrcpy_base(dest, src, pstring_base) \ safe_strcpy(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1) +#define safe_strcpy_base(dest, src, base, size) \ + safe_strcpy(dest, src, size-PTR_DIFF(dest,base)-1) /* String copy functions - macro hell below adds 'type checking' (limited, but the best we can do in C) and may tag with function name/number to record the last 'clobber region' on diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c index d83cd10d0c..6c3446d6c8 100644 --- a/source3/nmbd/nmbd_packets.c +++ b/source3/nmbd/nmbd_packets.c @@ -1929,7 +1929,7 @@ BOOL listen_for_packets(BOOL run_election) /**************************************************************************** Construct and send a netbios DGRAM. **************************************************************************/ -BOOL send_mailslot(BOOL unique, const char *mailslot,char *buf,int len, +BOOL send_mailslot(BOOL unique, const char *mailslot,char *buf, size_t len, const char *srcname, int src_type, const char *dstname, int dest_type, struct in_addr dest_ip,struct in_addr src_ip, @@ -1979,11 +1979,16 @@ BOOL send_mailslot(BOOL unique, const char *mailslot,char *buf,int len, SSVAL(ptr,smb_vwv15,1); SSVAL(ptr,smb_vwv16,2); p2 = smb_buf(ptr); - pstrcpy(p2,mailslot); + safe_strcpy_base(p2, mailslot, dgram->data, sizeof(dgram->data)); p2 = skip_string(p2,1); - - memcpy(p2,buf,len); - p2 += len; + + if (((p2+len) > dgram->data+sizeof(dgram->data)) || ((p2+len) < p2)) { + DEBUG(0, ("send_mailslot: Cannot write beyond end of packet\n")); + return False; + } else { + memcpy(p2,buf,len); + p2 += len; + } dgram->datasize = PTR_DIFF(p2,ptr+4); /* +4 for tcp length. */ -- cgit From 6ba75b540f7c7dab382b4ce223a4aba4c5e4eca0 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 13:15:29 +0000 Subject: New statcache internals - this time it's actually possible to follow what's going on. In particular, add doxygen documentation. Andrew Bartlett (This used to be commit 7ff77ab46c63eca3b6edf18f39024eadb83a1a90) --- source3/smbd/statcache.c | 136 ++++++++++++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 54 deletions(-) diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index ac4ffcf575..812e0dde37 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -30,8 +30,10 @@ extern BOOL case_sensitive; *****************************************************************************/ typedef struct { - int name_len; - char names[2]; /* This is extended via malloc... */ + char *original_path; + char *translated_path; + size_t translated_path_length; + char names[2]; /* This is extended via malloc... */ } stat_cache_entry; #define INIT_STAT_CACHE_SIZE 512 @@ -45,15 +47,16 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) { stat_cache_entry *scp; stat_cache_entry *found_scp; - pstring orig_name; - pstring translated_path; - int namelen; + char *translated_path; + size_t translated_path_length; + + char *original_path; + size_t original_path_length; + hash_element *hash_elem; if (!lp_stat_cache()) return; - namelen = strlen(orig_translated_path); - /* * Don't cache trivial valid directory entries. */ @@ -75,74 +78,97 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) * translated path. */ - pstrcpy(translated_path, orig_translated_path); - if(translated_path[namelen-1] == '/') { - translated_path[namelen-1] = '\0'; - namelen--; + translated_path = strdup(orig_translated_path); + if (!translated_path) + return; + + translated_path_length = strlen(translated_path); + + if(translated_path[translated_path_length-1] == '/') { + translated_path[translated_path_length-1] = '\0'; + translated_path_length--; } + original_path = strdup(full_orig_name); + if (!original_path) + return; + + original_path_length = strlen(original_path); + + if(!case_sensitive) + strupper(original_path); + +#if 0 /* * We will only replace namelen characters * of full_orig_name. * StrnCpy always null terminates. */ - StrnCpy(orig_name, full_orig_name, namelen); + smbStrnCpy(orig_name, full_orig_name, namelen); if(!case_sensitive) strupper( orig_name ); +#endif /* * Check this name doesn't exist in the cache before we * add it. */ - if ((hash_elem = hash_lookup(&stat_cache, orig_name))) { - found_scp = (stat_cache_entry *)(hash_elem->value); - if (strcmp((found_scp->names+found_scp->name_len+1), translated_path) == 0) { - return; - } else { - hash_remove(&stat_cache, hash_elem); - if((scp = (stat_cache_entry *)malloc(sizeof(stat_cache_entry)+2*namelen)) == NULL) { - DEBUG(0,("stat_cache_add: Out of memory !\n")); - return; - } - overmalloc_safe_strcpy(scp->names, orig_name, namelen); - overmalloc_safe_strcpy((scp->names+namelen+1), translated_path, namelen); - scp->name_len = namelen; - hash_insert(&stat_cache, (char *)scp, orig_name); - } - return; - } else { + if ((hash_elem = hash_lookup(&stat_cache, original_path))) { + found_scp = (stat_cache_entry *)(hash_elem->value); + if (strcmp((found_scp->translated_path), orig_translated_path) == 0) { + /* already in hash table */ + return; + } + /* hash collision - remove before we re-add */ + hash_remove(&stat_cache, hash_elem); + } + + /* + * New entry. + */ + + if((scp = (stat_cache_entry *)malloc(sizeof(stat_cache_entry) + +original_path_length + +translated_path_length)) == NULL) { + DEBUG(0,("stat_cache_add: Out of memory !\n")); + return; + } - /* - * New entry. - */ + scp->original_path = scp->names; + scp->translated_path = scp->names + original_path_length + 1; + safe_strcpy(scp->original_path, original_path, original_path_length); + safe_strcpy(scp->translated_path, translated_path, translated_path_length); + scp->translated_path_length = translated_path_length; - if((scp = (stat_cache_entry *)malloc(sizeof(stat_cache_entry)+2*namelen)) == NULL) { - DEBUG(0,("stat_cache_add: Out of memory !\n")); - return; - } - overmalloc_safe_strcpy(scp->names, orig_name, namelen); - overmalloc_safe_strcpy(scp->names+namelen+1, translated_path, namelen); - scp->name_len = namelen; - hash_insert(&stat_cache, (char *)scp, orig_name); - } + hash_insert(&stat_cache, (char *)scp, original_path); - DEBUG(5,("stat_cache_add: Added entry %s -> %s\n", scp->names, (scp->names+scp->name_len+1))); + DEBUG(5,("stat_cache_add: Added entry %s -> %s\n", scp->original_path, scp->translated_path)); } -/**************************************************************************** - Look through the stat cache for an entry - promote it to the top if found. - Return True if we translated (and did a scuccessful stat on) the entire name. -*****************************************************************************/ +/** + * Look through the stat cache for an entry + * + * The hash-table's internals will promote it to the top if found. + * + * @param conn A connection struct to do the stat() with. + * @param name The path we are attempting to cache, modified by this routine + * to be correct as far as the cache can tell us + * @param dirpath The path as far as the stat cache told us. + * @param start A pointer into name, for where to 'start' in fixing the rest of the name up. + * @param psd A stat buffer, NOT from the cache, but just a side-effect. + * + * @return True if we translated (and did a scuccessful stat on) the entire name. + * + */ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath, char **start, SMB_STRUCT_STAT *pst) { stat_cache_entry *scp; - char *trans_name; pstring chk_name; - int namelen; + size_t namelen; hash_element *hash_elem; char *sp; @@ -191,18 +217,20 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath, } else { scp = (stat_cache_entry *)(hash_elem->value); DO_PROFILE_INC(statcache_hits); - trans_name = scp->names+scp->name_len+1; - if(vfs_stat(conn,trans_name, pst) != 0) { + if(vfs_stat(conn,scp->translated_path, pst) != 0) { /* Discard this entry - it doesn't exist in the filesystem. */ hash_remove(&stat_cache, hash_elem); return False; } - memcpy(name, trans_name, scp->name_len); - *start = &name[scp->name_len]; + memcpy(name, scp->translated_path, MIN(sizeof(pstring)-1, scp->translated_path_length)); + + /* set pointer for 'where to start' on fixing the rest of the name */ + *start = &name[scp->translated_path_length]; if(**start == '/') ++*start; - StrnCpy( dirpath, trans_name, name - (*start)); - return (namelen == scp->name_len); + + pstrcpy(dirpath, scp->translated_path); + return (namelen == scp->translated_path_length); } } } -- cgit From 644ab8e9b13970f6c6ea7f89760a01484b591172 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 13:16:42 +0000 Subject: Try to avoid dereferencing a null pointer. Andrew Bartlett (This used to be commit 4e96585b60512905776c2c6692c76d45241f089d) --- source3/smbd/sesssetup.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index 674f6145d3..e36760c148 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -273,10 +273,11 @@ static BOOL reply_spnego_ntlmssp(connection_struct *conn, char *outbuf, { BOOL ret; DATA_BLOB response; - struct auth_serversupplied_info *server_info; - server_info = (*auth_ntlmssp_state)->server_info; + struct auth_serversupplied_info *server_info = NULL; - if (!NT_STATUS_IS_OK(nt_status)) { + if (NT_STATUS_IS_OK(nt_status)) { + server_info = (*auth_ntlmssp_state)->server_info; + } else { nt_status = do_map_to_guest(nt_status, &server_info, (*auth_ntlmssp_state)->ntlmssp_state->user, @@ -387,19 +388,22 @@ static int reply_spnego_auth(connection_struct *conn, char *inbuf, char *outbuf, DATA_BLOB blob1) { DATA_BLOB auth, auth_reply; - NTSTATUS nt_status; + NTSTATUS nt_status = NT_STATUS_INVALID_PARAMETER; if (!spnego_parse_auth(blob1, &auth)) { #if 0 file_save("auth.dat", blob1.data, blob1.length); #endif - return ERROR_NT(NT_STATUS_LOGON_FAILURE); + return ERROR_NT(NT_STATUS_INVALID_PARAMETER); } - - if ( global_ntlmssp_state ) { - nt_status = auth_ntlmssp_update(global_ntlmssp_state, - auth, &auth_reply); + + if (!global_ntlmssp_state) { + /* auth before negotiatiate? */ + return ERROR_NT(NT_STATUS_INVALID_PARAMETER); } + + nt_status = auth_ntlmssp_update(global_ntlmssp_state, + auth, &auth_reply); data_blob_free(&auth); -- cgit From 400bb4bfab01a6c262b15658dee5c0d011d0e883 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 13:21:12 +0000 Subject: - Make ReadDirName return a const char*. - Consequential changes from that - mark our fstring/pstring assumptions in function prototypes Andrew Bartlett (This used to be commit fe2bc64bc439b27387b8f326b0f4f3bfcc3d04a1) --- source3/client/client.c | 2 +- source3/lib/util.c | 2 +- source3/smbd/chgpasswd.c | 2 +- source3/smbd/mangle.c | 2 +- source3/smbd/mangle_hash2.c | 2 +- source3/smbd/mangle_map.c | 2 +- source3/smbd/trans2.c | 53 +++++++++++++++++++++++++-------------------- 7 files changed, 36 insertions(+), 29 deletions(-) diff --git a/source3/client/client.c b/source3/client/client.c index 99fc779a9e..1248c25659 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -1291,7 +1291,7 @@ static int file_find(struct file_list **list, const char *directory, int ret; char *path; BOOL isdir; - char *dname; + const char *dname; dir = opendir(directory); if (!dir) return -1; diff --git a/source3/lib/util.c b/source3/lib/util.c index 1f300a2815..4216310335 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -1435,7 +1435,7 @@ void smb_panic(const char *why) A readdir wrapper which just returns the file name. ********************************************************************/ -char *readdirname(DIR *p) +const char *readdirname(DIR *p) { SMB_STRUCT_DIRENT *ptr; char *dname; diff --git a/source3/smbd/chgpasswd.c b/source3/smbd/chgpasswd.c index 401ab131ad..31c4fa7cc9 100644 --- a/source3/smbd/chgpasswd.c +++ b/source3/smbd/chgpasswd.c @@ -64,7 +64,7 @@ static int findpty(char **slave) int master; static fstring line; DIR *dirp; - char *dpname; + const char *dpname; #if defined(HAVE_GRANTPT) /* Try to open /dev/ptmx. If that fails, fall through to old method. */ diff --git a/source3/smbd/mangle.c b/source3/smbd/mangle.c index f5c703a5bf..c5d7582c03 100644 --- a/source3/smbd/mangle.c +++ b/source3/smbd/mangle.c @@ -107,7 +107,7 @@ BOOL mangle_check_cache(char *s) map a long filename to a 8.3 name. */ -void mangle_map(char *OutName, BOOL need83, BOOL cache83, int snum) +void mangle_map(pstring OutName, BOOL need83, BOOL cache83, int snum) { /* name mangling can be disabled for speed, in which case we just truncate the string */ diff --git a/source3/smbd/mangle_hash2.c b/source3/smbd/mangle_hash2.c index eda509214d..cdce28e1bd 100644 --- a/source3/smbd/mangle_hash2.c +++ b/source3/smbd/mangle_hash2.c @@ -484,7 +484,7 @@ static BOOL is_legal_name(const char *name) the name parameter must be able to hold 13 bytes */ -static void name_map(char *name, BOOL need83, BOOL cache83) +static void name_map(fstring name, BOOL need83, BOOL cache83) { char *dot_p; char lead_chars[7]; diff --git a/source3/smbd/mangle_map.c b/source3/smbd/mangle_map.c index 5ae3ebd174..9e798fd41b 100644 --- a/source3/smbd/mangle_map.c +++ b/source3/smbd/mangle_map.c @@ -201,7 +201,7 @@ static void mangled_map(char *s, const char *MangledMap) front end routine to the mangled map code personally I think that the whole idea of "mangled map" is completely bogus */ -void mangle_map_filename(char *fname, int snum) +void mangle_map_filename(fstring fname, int snum) { char *map; diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index bea09e9e37..4129852f77 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -460,7 +460,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn, BOOL *out_of_space, BOOL *got_exact_match, int *last_name_off) { - char *dname; + const char *dname; BOOL found = False; SMB_STRUCT_STAT sbuf; pstring mask; @@ -1173,7 +1173,8 @@ resume_key = %d resume name = %s continue=%d level = %d\n", */ int current_pos, start_pos; - char *dname = NULL; + const char *dname = NULL; + pstring dname_pstring; void *dirptr = conn->dirptr; start_pos = TellDir(dirptr); for(current_pos = start_pos; current_pos >= 0; current_pos--) { @@ -1181,21 +1182,24 @@ resume_key = %d resume name = %s continue=%d level = %d\n", SeekDir(dirptr, current_pos); dname = ReadDirName(dirptr); + if (dname) { + /* + * Remember, mangle_map is called by + * get_lanman2_dir_entry(), so the resume name + * could be mangled. Ensure we do the same + * here. + */ + + /* make sure we get a copy that mangle_map can modify */ - /* - * Remember, mangle_map is called by - * get_lanman2_dir_entry(), so the resume name - * could be mangled. Ensure we do the same - * here. - */ - - if(dname != NULL) - mangle_map( dname, False, True, SNUM(conn)); - - if(dname && strcsequal( resume_name, dname)) { - SeekDir(dirptr, current_pos+1); - DEBUG(7,("call_trans2findnext: got match at pos %d\n", current_pos+1 )); - break; + pstrcpy(dname_pstring, dname); + mangle_map( dname_pstring, False, True, SNUM(conn)); + + if(strcsequal( resume_name, dname_pstring)) { + SeekDir(dirptr, current_pos+1); + DEBUG(7,("call_trans2findnext: got match at pos %d\n", current_pos+1 )); + break; + } } } @@ -1215,13 +1219,17 @@ resume_key = %d resume name = %s continue=%d level = %d\n", * here. */ - if(dname != NULL) - mangle_map( dname, False, True, SNUM(conn)); + if(dname) { + /* make sure we get a copy that mangle_map can modify */ + + pstrcpy(dname_pstring, dname); + mangle_map(dname_pstring, False, True, SNUM(conn)); - if(dname && strcsequal( resume_name, dname)) { - SeekDir(dirptr, current_pos+1); - DEBUG(7,("call_trans2findnext: got match at pos %d\n", current_pos+1 )); - break; + if(strcsequal( resume_name, dname_pstring)) { + SeekDir(dirptr, current_pos+1); + DEBUG(7,("call_trans2findnext: got match at pos %d\n", current_pos+1 )); + break; + } } } /* end for */ } /* end if current_pos */ @@ -1269,7 +1277,6 @@ resume_key = %d resume name = %s continue=%d level = %d\n", dptr_close(&dptr_num); /* This frees up the saved mask */ } - /* Set up the return parameter block */ SSVAL(params,0,numentries); SSVAL(params,2,finished); -- cgit From c6cf08774114a906645a405dea8a7546d614de35 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 13:23:12 +0000 Subject: Add const. (This used to be commit 5371720971bc60a4cfba0460614306f322aa10b8) --- source3/smbd/dir.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index 95acf4a262..ec570d3a18 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -578,7 +578,7 @@ BOOL dir_check_ftype(connection_struct *conn,int mode,SMB_STRUCT_STAT *st,int di return True; } -static BOOL mangle_mask_match(connection_struct *conn, char *filename, char *mask) +static BOOL mangle_mask_match(connection_struct *conn, fstring filename, char *mask) { mangle_map(filename,True,False,SNUM(conn)); return mask_match(filename,mask,False); @@ -588,10 +588,10 @@ static BOOL mangle_mask_match(connection_struct *conn, char *filename, char *mas Get an 8.3 directory entry. ****************************************************************************/ -BOOL get_dir_entry(connection_struct *conn,char *mask,int dirtype,char *fname, +BOOL get_dir_entry(connection_struct *conn,char *mask,int dirtype, pstring fname, SMB_OFF_T *size,int *mode,time_t *date,BOOL check_descend) { - char *dname; + const char *dname; BOOL found = False; SMB_STRUCT_STAT sbuf; pstring path; @@ -627,8 +627,8 @@ BOOL get_dir_entry(connection_struct *conn,char *mask,int dirtype,char *fname, see masktest for a demo */ if ((strcmp(mask,"*.*") == 0) || - mask_match(filename,mask,False) || - mangle_mask_match(conn,filename,mask)) { + mask_match(filename,mask,False) || + mangle_mask_match(conn,filename,mask)) { if (isrootdir && (strequal(filename,"..") || strequal(filename,"."))) continue; @@ -907,7 +907,7 @@ void *OpenDir(connection_struct *conn, const char *name, BOOL use_veto) dirp->current = dirp->data; } - safe_strcpy(dirp->data+used,n, dirp->mallocsize - used - 1); + safe_strcpy_base(dirp->data+used,n, dirp->data, dirp->mallocsize); used += l; dirp->numentries++; } @@ -933,7 +933,7 @@ void CloseDir(void *p) Read from a directory. ********************************************************************/ -char *ReadDirName(void *p) +const char *ReadDirName(void *p) { char *ret; Dir *dirp = (Dir *)p; -- cgit From 7b18c5d1647b44f46cf973701b3bcc9aefb37e7d Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 13:24:36 +0000 Subject: Make sure we mark the assumption of a fstring parameter for 'devicetype' in the function prototype, and change callers to respect this. Andrew Bartlett (This used to be commit 9f3d3c380120f16d76d68f346799282d61eec892) --- source3/rpc_server/srv_srvsvc_nt.c | 9 +++++++-- source3/smbd/reply.c | 4 ++-- source3/smbd/service.c | 12 ++++++------ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6d2320d67d..815dd75d22 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1840,6 +1840,8 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC struct current_user user; connection_struct *conn = NULL; BOOL became_user = False; + fstring dev; + fstrcpy(dev, "A:"); ZERO_STRUCT(st); @@ -1853,7 +1855,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC get_current_user(&user, p); become_root(); - conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, dev, user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { @@ -1943,9 +1945,12 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ struct current_user user; connection_struct *conn = NULL; BOOL became_user = False; + fstring dev; + fstrcpy(dev, "A:"); ZERO_STRUCT(st); + r_u->status = WERR_OK; unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); @@ -1956,7 +1961,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ get_current_user(&user, p); become_root(); - conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, dev, user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 80f648981a..5ca0ae52de 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -148,7 +148,7 @@ int reply_tcon(connection_struct *conn, const char *service; pstring service_buf; pstring password; - pstring dev; + fstring dev; int outsize = 0; uint16 vuid = SVAL(inbuf,smb_uid); int pwlen=0; @@ -204,7 +204,7 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt { fstring service; DATA_BLOB password; - pstring devicename; + fstring devicename; NTSTATUS nt_status; uint16 vuid = SVAL(inbuf,smb_uid); int passlen = SVAL(inbuf,smb_vwv3); diff --git a/source3/smbd/service.c b/source3/smbd/service.c index 1c7e4017b0..a47e6c1bbc 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -218,7 +218,7 @@ int find_service(fstring service) do some basic sainity checks on the share. This function modifies dev, ecode. ****************************************************************************/ -static NTSTATUS share_sanity_checks(int snum, pstring dev) +static NTSTATUS share_sanity_checks(int snum, fstring dev) { if (!lp_snum_ok(snum) || @@ -233,9 +233,9 @@ static NTSTATUS share_sanity_checks(int snum, pstring dev) if (dev[0] == '?' || !dev[0]) { if (lp_print_ok(snum)) { - pstrcpy(dev,"LPT1:"); + fstrcpy(dev,"LPT1:"); } else { - pstrcpy(dev,"A:"); + fstrcpy(dev,"A:"); } } @@ -248,7 +248,7 @@ static NTSTATUS share_sanity_checks(int snum, pstring dev) /* Behave as a printer if we are supposed to */ if (lp_print_ok(snum) && (strcmp(dev, "A:") == 0)) { - pstrcpy(dev, "LPT1:"); + fstrcpy(dev, "LPT1:"); } return NT_STATUS_OK; @@ -326,7 +326,7 @@ static void set_admin_user(connection_struct *conn, gid_t *groups, size_t n_grou static connection_struct *make_connection_snum(int snum, user_struct *vuser, DATA_BLOB password, - char *dev, NTSTATUS *status) + fstring dev, NTSTATUS *status) { struct passwd *pass = NULL; BOOL guest = False; @@ -747,7 +747,7 @@ connection_struct *make_connection_with_chdir(const char *service_in, DATA_BLOB ****************************************************************************/ connection_struct *make_connection(const char *service_in, DATA_BLOB password, - char *dev, uint16 vuid, NTSTATUS *status) + fstring dev, uint16 vuid, NTSTATUS *status) { uid_t euid; user_struct *vuser = NULL; -- cgit From 3ecf5d663864cab17288b73426183e1a1499e37c Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sun, 16 Mar 2003 22:07:36 +0000 Subject: Missed one when I move 'share_sanity_checks' to use an fstring for 'dev'. Andrew Bartlett (This used to be commit a0208a4f74f9c61eb1e346d9cb62dbe00ef4c24a) --- source3/smbd/service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/smbd/service.c b/source3/smbd/service.c index a47e6c1bbc..dc471ab87e 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -229,7 +229,7 @@ static NTSTATUS share_sanity_checks(int snum, fstring dev) /* you can only connect to the IPC$ service as an ipc device */ if (strequal(lp_fstype(snum), "IPC")) - pstrcpy(dev,"IPC"); + fstrcpy(dev,"IPC"); if (dev[0] == '?' || !dev[0]) { if (lp_print_ok(snum)) { -- cgit From 1171b0c9ac59e7bd667bb82f48cda27c203721d8 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 03:47:15 +0000 Subject: Fix memory leaks and add parinoioa code to our stat() cache. Andrew Bartlett (This used to be commit 3fd07bd25eefdb2a7a6891fa1169ab2425607249) --- source3/smbd/statcache.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index 812e0dde37..57ba6ada81 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -90,14 +90,28 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) } original_path = strdup(full_orig_name); - if (!original_path) + if (!original_path) { + SAFE_FREE(translated_path); return; + } original_path_length = strlen(original_path); + if(original_path[original_path_length-1] == '/') { + original_path[original_path_length-1] = '\0'; + original_path_length--; + } + if(!case_sensitive) strupper(original_path); - + + if(!(original_path_length == translated_path_length)) { + DEBUG(0, ("OOPS - tried to store stat cache entry for non-equal length paths [%s] %u and [%s] %u)!\n", original_path, original_path_length, translated_path, translated_path_length)); + SAFE_FREE(original_path); + SAFE_FREE(translated_path); + return; + } + #if 0 /* * We will only replace namelen characters @@ -119,6 +133,8 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) found_scp = (stat_cache_entry *)(hash_elem->value); if (strcmp((found_scp->translated_path), orig_translated_path) == 0) { /* already in hash table */ + SAFE_FREE(original_path); + SAFE_FREE(translated_path); return; } /* hash collision - remove before we re-add */ @@ -133,6 +149,8 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) +original_path_length +translated_path_length)) == NULL) { DEBUG(0,("stat_cache_add: Out of memory !\n")); + SAFE_FREE(original_path); + SAFE_FREE(translated_path); return; } @@ -144,6 +162,9 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) hash_insert(&stat_cache, (char *)scp, original_path); + SAFE_FREE(original_path); + SAFE_FREE(translated_path); + DEBUG(5,("stat_cache_add: Added entry %s -> %s\n", scp->original_path, scp->translated_path)); } -- cgit From 077e093d8ae79519baa7edc0c4cbd5b4b853a19a Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 17 Mar 2003 03:56:58 +0000 Subject: Some cosmetic changes to make the popt --usage output look nicer. (This used to be commit 39124b9a62e1ba0f8089c36b27d6c79352a27973) --- source3/nsswitch/wbinfo.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source3/nsswitch/wbinfo.c b/source3/nsswitch/wbinfo.c index 68dc178bcd..4f621e7008 100644 --- a/source3/nsswitch/wbinfo.c +++ b/source3/nsswitch/wbinfo.c @@ -663,7 +663,7 @@ static BOOL wbinfo_ping(void) /* Display response */ - d_printf("'ping' to winbindd %s on fd %d\n", + d_printf("Ping to winbindd %s on fd %d\n", (result == NSS_STATUS_SUCCESS) ? "succeeded" : "failed", winbindd_fd); return result == NSS_STATUS_SUCCESS; @@ -695,8 +695,8 @@ int main(int argc, char **argv) { "domain-users", 'u', POPT_ARG_NONE, 0, 'u', "Lists all domain users"}, { "domain-groups", 'g', POPT_ARG_NONE, 0, 'g', "Lists all domain groups" }, - { "WINS-by-name", 'N', POPT_ARG_STRING, &string_arg, 'N', "Converts NetBIOS name to IP (WINS)", "NETBIOS-NAME" }, - { "WINS-by-ip", 'I', POPT_ARG_STRING, &string_arg, 'I', "Converts IP address to NetBIOS name (WINS)", "IP" }, + { "WINS-by-name", 'N', POPT_ARG_STRING, &string_arg, 'N', "Converts NetBIOS name to IP", "NETBIOS-NAME" }, + { "WINS-by-ip", 'I', POPT_ARG_STRING, &string_arg, 'I', "Converts IP address to NetBIOS name", "IP" }, { "name-to-sid", 'n', POPT_ARG_STRING, &string_arg, 'n', "Converts name to sid", "NAME" }, { "sid-to-name", 's', POPT_ARG_STRING, &string_arg, 's', "Converts sid to name", "SID" }, { "uid-to-sid", 'U', POPT_ARG_INT, &int_arg, 'U', "Converts uid to sid" , "UID" }, @@ -705,12 +705,12 @@ int main(int argc, char **argv) { "sid-to-gid", 'Y', POPT_ARG_STRING, &string_arg, 'Y', "Converts sid to gid", "SID" }, { "check-secret", 't', POPT_ARG_NONE, 0, 't', "Check shared secret" }, { "trusted-domains", 'm', POPT_ARG_NONE, 0, 'm', "List trusted domains" }, - { "sequence", 0, POPT_ARG_NONE, 0, OPT_SEQUENCE, "show sequence numbers of all domains" }, + { "sequence", 0, POPT_ARG_NONE, 0, OPT_SEQUENCE, "Show sequence numbers of all domains" }, { "user-groups", 'r', POPT_ARG_STRING, &string_arg, 'r', "Get user groups", "USER" }, { "authenticate", 'a', POPT_ARG_STRING, &string_arg, 'a', "authenticate user", "user%password" }, { "set-auth-user", 'A', POPT_ARG_STRING, &string_arg, OPT_SET_AUTH_USER, "Store user and password used by winbindd (root only)", "user%password" }, { "get-auth-user", 0, POPT_ARG_NONE, NULL, OPT_GET_AUTH_USER, "Retrieve user and password used by winbindd (root only)", NULL }, - { "ping", 'p', POPT_ARG_NONE, 0, 'p', "'ping' winbindd to see if it is alive" }, + { "ping", 'p', POPT_ARG_NONE, 0, 'p', "Ping winbindd to see if it is alive" }, { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_version}, { 0, 0, 0, 0 } }; -- cgit From 0ab29d6186135bd66c4154b545ac8323232a6f2e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 04:42:57 +0000 Subject: Fix a memory leak - 'smbcontrol smbd pool-usage' is your freind! Andrew Bartlett (This used to be commit a12e8524997e329a4f4cd766d6371e384698795a) --- source3/libsmb/trusts_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source3/libsmb/trusts_util.c b/source3/libsmb/trusts_util.c index f7b2c2e3a6..b8f84ba890 100644 --- a/source3/libsmb/trusts_util.c +++ b/source3/libsmb/trusts_util.c @@ -155,6 +155,8 @@ BOOL is_trusted_domain(const char* dom_name) } } while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)); + talloc_destroy(mem_ctx); + /* * Query the trustdom_cache updated periodically. The only * way for domain member server. -- cgit From 355bea4b2cd62bdd00bfbb3fba017c62b11ebc95 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 17 Mar 2003 05:46:54 +0000 Subject: Ignore .pyc files. (This used to be commit b20a357ac534b513383ad20046a99bb7f39bba25) --- source3/stf/.cvsignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 source3/stf/.cvsignore diff --git a/source3/stf/.cvsignore b/source3/stf/.cvsignore new file mode 100644 index 0000000000..7e99e367f8 --- /dev/null +++ b/source3/stf/.cvsignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file -- cgit From 1eae003fefaa8e4e9e131c9d5f2a299cec2b5e55 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 17 Mar 2003 05:55:41 +0000 Subject: Applied waider's patch to return DOS error codes for pipes that support it. (This used to be commit ac3df9a8051bd105e8e4192d36b3024fdf9f9506) --- source3/rpcclient/cmd_dfs.c | 10 +- source3/rpcclient/cmd_ds.c | 2 +- source3/rpcclient/cmd_lsarpc.c | 28 ++--- source3/rpcclient/cmd_netlogon.c | 10 +- source3/rpcclient/cmd_reg.c | 4 +- source3/rpcclient/cmd_samr.c | 36 +++--- source3/rpcclient/cmd_spoolss.c | 229 +++++++++++++++++++-------------------- source3/rpcclient/cmd_srvsvc.c | 32 +++--- source3/rpcclient/rpcclient.c | 48 +++++--- source3/rpcclient/rpcclient.h | 10 +- 10 files changed, 217 insertions(+), 192 deletions(-) diff --git a/source3/rpcclient/cmd_dfs.c b/source3/rpcclient/cmd_dfs.c index 715174c824..44e97f9881 100644 --- a/source3/rpcclient/cmd_dfs.c +++ b/source3/rpcclient/cmd_dfs.c @@ -227,11 +227,11 @@ struct cmd_set dfs_commands[] = { { "DFS" }, - { "dfsexist", cmd_dfs_exist, PI_NETDFS, "Query DFS support", "" }, - { "dfsadd", cmd_dfs_add, PI_NETDFS, "Add a DFS share", "" }, - { "dfsremove", cmd_dfs_remove, PI_NETDFS, "Remove a DFS share", "" }, - { "dfsgetinfo", cmd_dfs_getinfo, PI_NETDFS, "Query DFS share info", "" }, - { "dfsenum", cmd_dfs_enum, PI_NETDFS, "Enumerate dfs shares", "" }, + { "dfsexist", RPC_RTYPE_NTSTATUS, cmd_dfs_exist, NULL, PI_NETDFS, "Query DFS support", "" }, + { "dfsadd", RPC_RTYPE_NTSTATUS, cmd_dfs_add, NULL, PI_NETDFS, "Add a DFS share", "" }, + { "dfsremove", RPC_RTYPE_NTSTATUS, cmd_dfs_remove, NULL, PI_NETDFS, "Remove a DFS share", "" }, + { "dfsgetinfo",RPC_RTYPE_NTSTATUS, cmd_dfs_getinfo, NULL, PI_NETDFS, "Query DFS share info", "" }, + { "dfsenum", RPC_RTYPE_NTSTATUS, cmd_dfs_enum, NULL, PI_NETDFS, "Enumerate dfs shares", "" }, { NULL } }; diff --git a/source3/rpcclient/cmd_ds.c b/source3/rpcclient/cmd_ds.c index 9de6d6a9ec..4c2f52e291 100644 --- a/source3/rpcclient/cmd_ds.c +++ b/source3/rpcclient/cmd_ds.c @@ -53,7 +53,7 @@ struct cmd_set ds_commands[] = { { "LSARPC-DS" }, - { "dsroledominfo", cmd_ds_dsrole_getprimarydominfo, PI_LSARPC_DS, "Get Primary Domain Information", "" }, + { "dsroledominfo", RPC_RTYPE_NTSTATUS, cmd_ds_dsrole_getprimarydominfo, NULL, PI_LSARPC_DS, "Get Primary Domain Information", "" }, { NULL } }; diff --git a/source3/rpcclient/cmd_lsarpc.c b/source3/rpcclient/cmd_lsarpc.c index fab6a89ed5..808ef50a45 100644 --- a/source3/rpcclient/cmd_lsarpc.c +++ b/source3/rpcclient/cmd_lsarpc.c @@ -741,20 +741,20 @@ struct cmd_set lsarpc_commands[] = { { "LSARPC" }, - { "lsaquery", cmd_lsa_query_info_policy, PI_LSARPC, "Query info policy", "" }, - { "lookupsids", cmd_lsa_lookup_sids, PI_LSARPC, "Convert SIDs to names", "" }, - { "lookupnames", cmd_lsa_lookup_names, PI_LSARPC, "Convert names to SIDs", "" }, - { "enumtrust", cmd_lsa_enum_trust_dom, PI_LSARPC, "Enumerate trusted domains", "Usage: [preferred max number] [enum context (0)]" }, - { "enumprivs", cmd_lsa_enum_privilege, PI_LSARPC, "Enumerate privileges", "" }, - { "getdispname", cmd_lsa_get_dispname, PI_LSARPC, "Get the privilege name", "" }, - { "lsaenumsid", cmd_lsa_enum_sids, PI_LSARPC, "Enumerate the LSA SIDS", "" }, - { "lsaenumprivsaccount", cmd_lsa_enum_privsaccounts, PI_LSARPC, "Enumerate the privileges of an SID", "" }, - { "lsaenumacctrights", cmd_lsa_enum_acct_rights, PI_LSARPC, "Enumerate the rights of an SID", "" }, - { "lsaenumacctwithright",cmd_lsa_enum_acct_with_right,PI_LSARPC,"Enumerate accounts with a right", "" }, - { "lsaaddacctrights", cmd_lsa_add_acct_rights, PI_LSARPC, "Add rights to an account", "" }, - { "lsaremoveacctrights", cmd_lsa_remove_acct_rights, PI_LSARPC, "Remove rights from an account", "" }, - { "lsalookupprivvalue", cmd_lsa_lookupprivvalue, PI_LSARPC, "Get a privilege value given its name", "" }, - { "lsaquerysecobj", cmd_lsa_query_secobj, PI_LSARPC, "Query LSA security object", "" }, + { "lsaquery", RPC_RTYPE_NTSTATUS, cmd_lsa_query_info_policy, NULL, PI_LSARPC, "Query info policy", "" }, + { "lookupsids", RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_sids, NULL, PI_LSARPC, "Convert SIDs to names", "" }, + { "lookupnames", RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_names, NULL, PI_LSARPC, "Convert names to SIDs", "" }, + { "enumtrust", RPC_RTYPE_NTSTATUS, cmd_lsa_enum_trust_dom, NULL, PI_LSARPC, "Enumerate trusted domains", "Usage: [preferred max number] [enum context (0)]" }, + { "enumprivs", RPC_RTYPE_NTSTATUS, cmd_lsa_enum_privilege, NULL, PI_LSARPC, "Enumerate privileges", "" }, + { "getdispname", RPC_RTYPE_NTSTATUS, cmd_lsa_get_dispname, NULL, PI_LSARPC, "Get the privilege name", "" }, + { "lsaenumsid", RPC_RTYPE_NTSTATUS, cmd_lsa_enum_sids, NULL, PI_LSARPC, "Enumerate the LSA SIDS", "" }, + { "lsaenumprivsaccount", RPC_RTYPE_NTSTATUS, cmd_lsa_enum_privsaccounts, NULL, PI_LSARPC, "Enumerate the privileges of an SID", "" }, + { "lsaenumacctrights", RPC_RTYPE_NTSTATUS, cmd_lsa_enum_acct_rights, NULL, PI_LSARPC, "Enumerate the rights of an SID", "" }, + { "lsaenumacctwithright",RPC_RTYPE_NTSTATUS, cmd_lsa_enum_acct_with_right,NULL, PI_LSARPC,"Enumerate accounts with a right", "" }, + { "lsaaddacctrights", RPC_RTYPE_NTSTATUS, cmd_lsa_add_acct_rights, NULL, PI_LSARPC, "Add rights to an account", "" }, + { "lsaremoveacctrights", RPC_RTYPE_NTSTATUS, cmd_lsa_remove_acct_rights, NULL, PI_LSARPC, "Remove rights from an account", "" }, + { "lsalookupprivvalue", RPC_RTYPE_NTSTATUS, cmd_lsa_lookupprivvalue, NULL, PI_LSARPC, "Get a privilege value given its name", "" }, + { "lsaquerysecobj", RPC_RTYPE_NTSTATUS, cmd_lsa_query_secobj, NULL, PI_LSARPC, "Query LSA security object", "" }, { NULL } }; diff --git a/source3/rpcclient/cmd_netlogon.c b/source3/rpcclient/cmd_netlogon.c index 407bff3735..1421c4da26 100644 --- a/source3/rpcclient/cmd_netlogon.c +++ b/source3/rpcclient/cmd_netlogon.c @@ -332,11 +332,11 @@ struct cmd_set netlogon_commands[] = { { "NETLOGON" }, - { "logonctrl2", cmd_netlogon_logon_ctrl2, PI_NETLOGON, "Logon Control 2", "" }, - { "logonctrl", cmd_netlogon_logon_ctrl, PI_NETLOGON, "Logon Control", "" }, - { "samsync", cmd_netlogon_sam_sync, PI_NETLOGON, "Sam Synchronisation", "" }, - { "samdeltas", cmd_netlogon_sam_deltas, PI_NETLOGON, "Query Sam Deltas", "" }, - { "samlogon", cmd_netlogon_sam_logon, PI_NETLOGON, "Sam Logon", "" }, + { "logonctrl2", RPC_RTYPE_NTSTATUS, cmd_netlogon_logon_ctrl2, NULL, PI_NETLOGON, "Logon Control 2", "" }, + { "logonctrl", RPC_RTYPE_NTSTATUS, cmd_netlogon_logon_ctrl, NULL, PI_NETLOGON, "Logon Control", "" }, + { "samsync", RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_sync, NULL, PI_NETLOGON, "Sam Synchronisation", "" }, + { "samdeltas", RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_deltas, NULL, PI_NETLOGON, "Query Sam Deltas", "" }, + { "samlogon", RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_logon, NULL, PI_NETLOGON, "Sam Logon", "" }, { NULL } }; diff --git a/source3/rpcclient/cmd_reg.c b/source3/rpcclient/cmd_reg.c index 8943331dab..bf85d21716 100644 --- a/source3/rpcclient/cmd_reg.c +++ b/source3/rpcclient/cmd_reg.c @@ -970,10 +970,10 @@ struct cmd_set reg_commands[] = { { "REG" }, - { "shutdown", cmd_reg_shutdown, PI_WINREG, "Remote Shutdown", + { "shutdown", RPC_RTYPE_NTSTATUS, cmd_reg_shutdown, NULL, PI_WINREG, "Remote Shutdown", "syntax: shutdown [-m message] [-t timeout] [-r] [-h] [-f] (-r == reboot, -h == halt, -f == force)" }, - { "abortshutdown", cmd_reg_abort_shutdown, PI_WINREG, "Abort Shutdown", + { "abortshutdown", RPC_RTYPE_NTSTATUS, cmd_reg_abort_shutdown, NULL, PI_WINREG, "Abort Shutdown", "syntax: abortshutdown" }, /* { "regenum", cmd_reg_enum, "Registry Enumeration", diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index 95ea27562e..866381456b 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -1494,24 +1494,24 @@ struct cmd_set samr_commands[] = { { "SAMR" }, - { "queryuser", cmd_samr_query_user, PI_SAMR, "Query user info", "" }, - { "querygroup", cmd_samr_query_group, PI_SAMR, "Query group info", "" }, - { "queryusergroups", cmd_samr_query_usergroups, PI_SAMR, "Query user groups", "" }, - { "queryuseraliases", cmd_samr_query_useraliases, PI_SAMR, "Query user aliases", "" }, - { "querygroupmem", cmd_samr_query_groupmem, PI_SAMR, "Query group membership", "" }, - { "queryaliasmem", cmd_samr_query_aliasmem, PI_SAMR, "Query alias membership", "" }, - { "querydispinfo", cmd_samr_query_dispinfo, PI_SAMR, "Query display info", "" }, - { "querydominfo", cmd_samr_query_dominfo, PI_SAMR, "Query domain info", "" }, - { "enumdomusers", cmd_samr_enum_dom_users, PI_SAMR, "Enumerate domain users", "" }, - { "enumdomgroups", cmd_samr_enum_dom_groups, PI_SAMR, "Enumerate domain groups", "" }, - { "enumalsgroups", cmd_samr_enum_als_groups, PI_SAMR, "Enumerate alias groups", "" }, - - { "createdomuser", cmd_samr_create_dom_user, PI_SAMR, "Create domain user", "" }, - { "samlookupnames", cmd_samr_lookup_names, PI_SAMR, "Look up names", "" }, - { "samlookuprids", cmd_samr_lookup_rids, PI_SAMR, "Look up names", "" }, - { "deletedomuser", cmd_samr_delete_dom_user, PI_SAMR, "Delete domain user", "" }, - { "samquerysecobj", cmd_samr_query_sec_obj, PI_SAMR, "Query SAMR security object", "" }, - { "getdompwinfo", cmd_samr_get_dom_pwinfo, PI_SAMR, "Retrieve domain password info", "" }, + { "queryuser", RPC_RTYPE_NTSTATUS, cmd_samr_query_user, NULL, PI_SAMR, "Query user info", "" }, + { "querygroup", RPC_RTYPE_NTSTATUS, cmd_samr_query_group, NULL, PI_SAMR, "Query group info", "" }, + { "queryusergroups", RPC_RTYPE_NTSTATUS, cmd_samr_query_usergroups, NULL, PI_SAMR, "Query user groups", "" }, + { "queryuseraliases", RPC_RTYPE_NTSTATUS, cmd_samr_query_useraliases, NULL, PI_SAMR, "Query user aliases", "" }, + { "querygroupmem", RPC_RTYPE_NTSTATUS, cmd_samr_query_groupmem, NULL, PI_SAMR, "Query group membership", "" }, + { "queryaliasmem", RPC_RTYPE_NTSTATUS, cmd_samr_query_aliasmem, NULL, PI_SAMR, "Query alias membership", "" }, + { "querydispinfo", RPC_RTYPE_NTSTATUS, cmd_samr_query_dispinfo, NULL, PI_SAMR, "Query display info", "" }, + { "querydominfo", RPC_RTYPE_NTSTATUS, cmd_samr_query_dominfo, NULL, PI_SAMR, "Query domain info", "" }, + { "enumdomusers", RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_users, NULL, PI_SAMR, "Enumerate domain users", "" }, + { "enumdomgroups", RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_groups, NULL, PI_SAMR, "Enumerate domain groups", "" }, + { "enumalsgroups", RPC_RTYPE_NTSTATUS, cmd_samr_enum_als_groups, NULL, PI_SAMR, "Enumerate alias groups", "" }, + + { "createdomuser", RPC_RTYPE_NTSTATUS, cmd_samr_create_dom_user, NULL, PI_SAMR, "Create domain user", "" }, + { "samlookupnames", RPC_RTYPE_NTSTATUS, cmd_samr_lookup_names, NULL, PI_SAMR, "Look up names", "" }, + { "samlookuprids", RPC_RTYPE_NTSTATUS, cmd_samr_lookup_rids, NULL, PI_SAMR, "Look up names", "" }, + { "deletedomuser", RPC_RTYPE_NTSTATUS, cmd_samr_delete_dom_user, NULL, PI_SAMR, "Delete domain user", "" }, + { "samquerysecobj", RPC_RTYPE_NTSTATUS, cmd_samr_query_sec_obj, NULL, PI_SAMR, "Query SAMR security object", "" }, + { "getdompwinfo", RPC_RTYPE_NTSTATUS, cmd_samr_get_dom_pwinfo, NULL, PI_SAMR, "Retrieve domain password info", "" }, { NULL } }; diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c index 9686fd1e24..3ce7f9e6ac 100644 --- a/source3/rpcclient/cmd_spoolss.c +++ b/source3/rpcclient/cmd_spoolss.c @@ -84,19 +84,19 @@ BOOL get_short_archi(char *short_archi, const char *long_archi) /********************************************************************** * dummy function -- placeholder */ -static NTSTATUS cmd_spoolss_not_implemented(struct cli_state *cli, +static WERROR cmd_spoolss_not_implemented(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { printf ("(*) This command is not currently implemented.\n"); - return NT_STATUS_OK; + return WERR_OK; } #endif /*********************************************************************** * Get printer information */ -static NTSTATUS cmd_spoolss_open_printer_ex(struct cli_state *cli, +static WERROR cmd_spoolss_open_printer_ex(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -107,11 +107,11 @@ static NTSTATUS cmd_spoolss_open_printer_ex(struct cli_state *cli, if (argc != 2) { printf("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (!cli) - return NT_STATUS_UNSUCCESSFUL; + return WERR_GENERAL_FAILURE; slprintf (servername, sizeof(servername)-1, "\\\\%s", cli->desthost); strupper (servername); @@ -134,7 +134,7 @@ static NTSTATUS cmd_spoolss_open_printer_ex(struct cli_state *cli, } } - return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } @@ -298,7 +298,7 @@ static void display_print_info_3(PRINTER_INFO_3 *i3) /* Enumerate printers */ -static NTSTATUS cmd_spoolss_enum_printers(struct cli_state *cli, +static WERROR cmd_spoolss_enum_printers(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -311,7 +311,7 @@ static NTSTATUS cmd_spoolss_enum_printers(struct cli_state *cli, if (argc > 3) { printf("Usage: %s [level] [name]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 2) @@ -367,7 +367,7 @@ static NTSTATUS cmd_spoolss_enum_printers(struct cli_state *cli, } done: - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /**************************************************************************** @@ -403,7 +403,7 @@ static void display_port_info_2(PORT_INFO_2 *i2) /* Enumerate ports */ -static NTSTATUS cmd_spoolss_enum_ports(struct cli_state *cli, +static WERROR cmd_spoolss_enum_ports(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -414,7 +414,7 @@ static NTSTATUS cmd_spoolss_enum_ports(struct cli_state *cli, if (argc > 2) { printf("Usage: %s [level]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 2) @@ -449,13 +449,13 @@ static NTSTATUS cmd_spoolss_enum_ports(struct cli_state *cli, } } - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /*********************************************************************** * Set printer comment - use a level2 set. */ -static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, +static WERROR cmd_spoolss_setprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -473,7 +473,7 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, if (argc == 1 || argc > 3) { printf("Usage: %s printername comment\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Open a printer handle */ @@ -519,13 +519,13 @@ static NTSTATUS cmd_spoolss_setprinter(struct cli_state *cli, if (opened_hnd) cli_spoolss_close_printer(cli, mem_ctx, &pol); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /*********************************************************************** * Get printer information */ -static NTSTATUS cmd_spoolss_getprinter(struct cli_state *cli, +static WERROR cmd_spoolss_getprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -541,7 +541,7 @@ static NTSTATUS cmd_spoolss_getprinter(struct cli_state *cli, if (argc == 1 || argc > 3) { printf("Usage: %s [level]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Open a printer handle */ @@ -601,7 +601,7 @@ static NTSTATUS cmd_spoolss_getprinter(struct cli_state *cli, if (opened_hnd) cli_spoolss_close_printer(cli, mem_ctx, &pol); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } static void display_reg_value(REGISTRY_VALUE value) @@ -644,7 +644,7 @@ static void display_reg_value(REGISTRY_VALUE value) /*********************************************************************** * Get printer data */ -static NTSTATUS cmd_spoolss_getprinterdata(struct cli_state *cli, +static WERROR cmd_spoolss_getprinterdata(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -661,7 +661,7 @@ static NTSTATUS cmd_spoolss_getprinterdata(struct cli_state *cli, if (argc != 3) { printf("Usage: %s \n", argv[0]); printf(" of . queries print server\n"); - return NT_STATUS_OK; + return WERR_OK; } valuename = argv[2]; @@ -709,13 +709,13 @@ static NTSTATUS cmd_spoolss_getprinterdata(struct cli_state *cli, if (opened_hnd) cli_spoolss_close_printer(cli, mem_ctx, &pol); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /*********************************************************************** * Get printer data */ -static NTSTATUS cmd_spoolss_getprinterdataex(struct cli_state *cli, +static WERROR cmd_spoolss_getprinterdataex(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -733,7 +733,7 @@ static NTSTATUS cmd_spoolss_getprinterdataex(struct cli_state *cli, printf("Usage: %s \n", argv[0]); printf(" of . queries print server\n"); - return NT_STATUS_OK; + return WERR_OK; } valuename = argv[3]; keyname = argv[2]; @@ -784,7 +784,7 @@ static NTSTATUS cmd_spoolss_getprinterdataex(struct cli_state *cli, if (opened_hnd) cli_spoolss_close_printer(cli, mem_ctx, &pol); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /**************************************************************************** @@ -900,13 +900,12 @@ static void display_print_driver_3(DRIVER_INFO_3 *i1) /*********************************************************************** * Get printer information */ -static NTSTATUS cmd_spoolss_getdriver(struct cli_state *cli, +static WERROR cmd_spoolss_getdriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND pol; WERROR werror; - NTSTATUS result; uint32 info_level = 3; BOOL opened_hnd = False; PRINTER_DRIVER_CTR ctr; @@ -918,7 +917,7 @@ static NTSTATUS cmd_spoolss_getdriver(struct cli_state *cli, if ((argc == 1) || (argc > 3)) { printf("Usage: %s [level]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* get the arguments need to open the printer handle */ @@ -935,11 +934,9 @@ static NTSTATUS cmd_spoolss_getdriver(struct cli_state *cli, PRINTER_ACCESS_USE, servername, user, &pol); - result = W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; - - if (!NT_STATUS_IS_OK(result)) { + if (!W_ERROR_IS_OK(werror)) { printf("Error opening printer handle for %s!\n", printername); - return result; + return werror; } opened_hnd = True; @@ -984,13 +981,13 @@ static NTSTATUS cmd_spoolss_getdriver(struct cli_state *cli, if (opened_hnd) cli_spoolss_close_printer (cli, mem_ctx, &pol); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } /*********************************************************************** * Get printer information */ -static NTSTATUS cmd_spoolss_enum_drivers(struct cli_state *cli, +static WERROR cmd_spoolss_enum_drivers(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1003,7 +1000,7 @@ static NTSTATUS cmd_spoolss_enum_drivers(struct cli_state *cli, if (argc > 2) { printf("Usage: enumdrivers [level]\n"); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 2) @@ -1058,7 +1055,7 @@ static NTSTATUS cmd_spoolss_enum_drivers(struct cli_state *cli, } } - return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } /**************************************************************************** @@ -1078,7 +1075,7 @@ static void display_printdriverdir_1(DRIVER_DIRECTORY_1 *i1) /*********************************************************************** * Get printer driver directory information */ -static NTSTATUS cmd_spoolss_getdriverdir(struct cli_state *cli, +static WERROR cmd_spoolss_getdriverdir(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1089,7 +1086,7 @@ static NTSTATUS cmd_spoolss_getdriverdir(struct cli_state *cli, if (argc > 2) { printf("Usage: %s [environment]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Get the arguments need to open the printer handle */ @@ -1111,7 +1108,7 @@ static NTSTATUS cmd_spoolss_getdriverdir(struct cli_state *cli, if (W_ERROR_IS_OK(result)) display_printdriverdir_1(ctr.info1); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /******************************************************************************* @@ -1222,7 +1219,7 @@ static BOOL init_drv_info_3_members ( } -static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, +static WERROR cmd_spoolss_addprinterdriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1241,7 +1238,7 @@ static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, printf ("\t:::\\\n"); printf ("\t:\n"); - return NT_STATUS_OK; + return WERR_OK; } /* Fill in the DRIVER_INFO_3 struct */ @@ -1249,7 +1246,7 @@ static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, if (!get_short_archi(arch, argv[1])) { printf ("Error Unknown architechture [%s]\n", argv[1]); - return NT_STATUS_INVALID_PARAMETER; + return WERR_INVALID_PARAM; } else set_drv_info_3_env(&info3, arch); @@ -1257,7 +1254,7 @@ static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, if (!init_drv_info_3_members(mem_ctx, &info3, argv[2])) { printf ("Error Invalid parameter list - %s.\n", argv[2]); - return NT_STATUS_INVALID_PARAMETER; + return WERR_INVALID_PARAM; } @@ -1271,11 +1268,11 @@ static NTSTATUS cmd_spoolss_addprinterdriver(struct cli_state *cli, driver_name); } - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } -static NTSTATUS cmd_spoolss_addprinterex(struct cli_state *cli, +static WERROR cmd_spoolss_addprinterex(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1289,7 +1286,7 @@ static NTSTATUS cmd_spoolss_addprinterex(struct cli_state *cli, if (argc != 5) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } slprintf (servername, sizeof(servername)-1, "\\\\%s", cli->desthost); @@ -1329,10 +1326,10 @@ static NTSTATUS cmd_spoolss_addprinterex(struct cli_state *cli, if (W_ERROR_IS_OK(result)) printf ("Printer %s successfully installed.\n", argv[1]); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } -static NTSTATUS cmd_spoolss_setdriver(struct cli_state *cli, +static WERROR cmd_spoolss_setdriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1351,7 +1348,7 @@ static NTSTATUS cmd_spoolss_setdriver(struct cli_state *cli, if (argc != 3) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } slprintf (servername, sizeof(servername)-1, "\\\\%s", cli->desthost); @@ -1406,11 +1403,11 @@ done: if (opened_hnd) cli_spoolss_close_printer(cli, mem_ctx, &pol); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } -static NTSTATUS cmd_spoolss_deletedriver(struct cli_state *cli, +static WERROR cmd_spoolss_deletedriver(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1422,7 +1419,7 @@ static NTSTATUS cmd_spoolss_deletedriver(struct cli_state *cli, if (argc != 2) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } slprintf (servername, sizeof(servername)-1, "\\\\%s", cli->desthost); @@ -1449,10 +1446,10 @@ static NTSTATUS cmd_spoolss_deletedriver(struct cli_state *cli, } } - return W_ERROR_IS_OK(result) || W_ERROR_EQUAL(result, WERR_UNKNOWN_PRINTER_DRIVER) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } -static NTSTATUS cmd_spoolss_getprintprocdir(struct cli_state *cli, +static WERROR cmd_spoolss_getprintprocdir(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1464,17 +1461,17 @@ static NTSTATUS cmd_spoolss_getprintprocdir(struct cli_state *cli, /* parse the command arguements */ if (argc > 2) { printf ("Usage: %s [environment]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (asprintf(&servername, "\\\\%s", cli->desthost) < 0) - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; strupper(servername); if (asprintf(&environment, "%s", (argc == 2) ? argv[1] : PRINTER_DRIVER_ARCHITECTURE) < 0) { SAFE_FREE(servername); - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; } result = cli_spoolss_getprintprocessordirectory( @@ -1491,12 +1488,12 @@ static NTSTATUS cmd_spoolss_getprintprocdir(struct cli_state *cli, SAFE_FREE(servername); SAFE_FREE(environment); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /* Add a form */ -static NTSTATUS cmd_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx, +static WERROR cmd_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND handle; @@ -1509,7 +1506,7 @@ static NTSTATUS cmd_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx, if (argc != 3) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Get a printer handle */ @@ -1550,12 +1547,12 @@ static NTSTATUS cmd_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx, SAFE_FREE(servername); SAFE_FREE(printername); - return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } /* Set a form */ -static NTSTATUS cmd_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, +static WERROR cmd_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND handle; @@ -1568,7 +1565,7 @@ static NTSTATUS cmd_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, if (argc != 3) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Get a printer handle */ @@ -1608,12 +1605,12 @@ static NTSTATUS cmd_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx, SAFE_FREE(servername); SAFE_FREE(printername); - return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } /* Get a form */ -static NTSTATUS cmd_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, +static WERROR cmd_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND handle; @@ -1627,7 +1624,7 @@ static NTSTATUS cmd_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, if (argc != 3) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Get a printer handle */ @@ -1671,12 +1668,12 @@ static NTSTATUS cmd_spoolss_getform(struct cli_state *cli, TALLOC_CTX *mem_ctx, SAFE_FREE(servername); SAFE_FREE(printername); - return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } /* Delete a form */ -static NTSTATUS cmd_spoolss_deleteform(struct cli_state *cli, +static WERROR cmd_spoolss_deleteform(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1689,7 +1686,7 @@ static NTSTATUS cmd_spoolss_deleteform(struct cli_state *cli, if (argc != 3) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Get a printer handle */ @@ -1718,12 +1715,12 @@ static NTSTATUS cmd_spoolss_deleteform(struct cli_state *cli, SAFE_FREE(servername); SAFE_FREE(printername); - return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } /* Enumerate forms */ -static NTSTATUS cmd_spoolss_enum_forms(struct cli_state *cli, +static WERROR cmd_spoolss_enum_forms(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1738,7 +1735,7 @@ static NTSTATUS cmd_spoolss_enum_forms(struct cli_state *cli, if (argc != 2) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Get a printer handle */ @@ -1788,10 +1785,10 @@ static NTSTATUS cmd_spoolss_enum_forms(struct cli_state *cli, SAFE_FREE(servername); SAFE_FREE(printername); - return W_ERROR_IS_OK(werror) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return werror; } -static NTSTATUS cmd_spoolss_setprinterdata(struct cli_state *cli, +static WERROR cmd_spoolss_setprinterdata(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1807,7 +1804,7 @@ static NTSTATUS cmd_spoolss_setprinterdata(struct cli_state *cli, /* parse the command arguements */ if (argc != 4) { printf ("Usage: %s \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } slprintf (servername, sizeof(servername)-1, "\\\\%s", cli->desthost); @@ -1869,7 +1866,7 @@ done: if (opened_hnd) cli_spoolss_close_printer(cli, mem_ctx, &pol); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } static void display_job_info_1(JOB_INFO_1 *job) @@ -1910,7 +1907,7 @@ static void display_job_info_2(JOB_INFO_2 *job) /* Enumerate jobs */ -static NTSTATUS cmd_spoolss_enum_jobs(struct cli_state *cli, +static WERROR cmd_spoolss_enum_jobs(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1924,7 +1921,7 @@ static NTSTATUS cmd_spoolss_enum_jobs(struct cli_state *cli, if (argc < 2 || argc > 3) { printf("Usage: %s printername [level]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 3) @@ -1980,12 +1977,12 @@ done: if (got_hnd) cli_spoolss_close_printer(cli, mem_ctx, &hnd); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /* enumerate data */ -static NTSTATUS cmd_spoolss_enum_data( struct cli_state *cli, +static WERROR cmd_spoolss_enum_data( struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -1998,7 +1995,7 @@ static NTSTATUS cmd_spoolss_enum_data( struct cli_state *cli, if (argc != 2) { printf("Usage: %s printername\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } /* Open printer handle */ @@ -2039,12 +2036,12 @@ done: if (got_hnd) cli_spoolss_close_printer(cli, mem_ctx, &hnd); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /* enumerate data for a given key */ -static NTSTATUS cmd_spoolss_enum_data_ex( struct cli_state *cli, +static WERROR cmd_spoolss_enum_data_ex( struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -2059,7 +2056,7 @@ static NTSTATUS cmd_spoolss_enum_data_ex( struct cli_state *cli, if (argc != 3) { printf("Usage: %s printername \n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } keyname = argv[2]; @@ -2104,12 +2101,12 @@ done: if (got_hnd) cli_spoolss_close_printer(cli, mem_ctx, &hnd); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /* enumerate subkeys */ -static NTSTATUS cmd_spoolss_enum_printerkey( struct cli_state *cli, +static WERROR cmd_spoolss_enum_printerkey( struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -2124,7 +2121,7 @@ static NTSTATUS cmd_spoolss_enum_printerkey( struct cli_state *cli, if (argc < 2 || argc > 3) { printf("Usage: %s printername [keyname]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 3) @@ -2178,10 +2175,10 @@ done: if (got_hnd) cli_spoolss_close_printer(cli, mem_ctx, &hnd); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } -static NTSTATUS cmd_spoolss_rffpcnex(struct cli_state *cli, +static WERROR cmd_spoolss_rffpcnex(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -2257,7 +2254,7 @@ done: if (got_hnd) cli_spoolss_close_printer(cli, mem_ctx, &hnd); - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /* List of commands exported by this module */ @@ -2265,33 +2262,33 @@ struct cmd_set spoolss_commands[] = { { "SPOOLSS" }, - { "adddriver", cmd_spoolss_addprinterdriver, PI_SPOOLSS, "Add a print driver", "" }, - { "addprinter", cmd_spoolss_addprinterex, PI_SPOOLSS, "Add a printer", "" }, - { "deldriver", cmd_spoolss_deletedriver, PI_SPOOLSS, "Delete a printer driver", "" }, - { "enumdata", cmd_spoolss_enum_data, PI_SPOOLSS, "Enumerate printer data", "" }, - { "enumdataex", cmd_spoolss_enum_data_ex, PI_SPOOLSS, "Enumerate printer data for a key", "" }, - { "enumkey", cmd_spoolss_enum_printerkey, PI_SPOOLSS, "Enumerate printer keys", "" }, - { "enumjobs", cmd_spoolss_enum_jobs, PI_SPOOLSS, "Enumerate print jobs", "" }, - { "enumports", cmd_spoolss_enum_ports, PI_SPOOLSS, "Enumerate printer ports", "" }, - { "enumdrivers", cmd_spoolss_enum_drivers, PI_SPOOLSS, "Enumerate installed printer drivers", "" }, - { "enumprinters", cmd_spoolss_enum_printers, PI_SPOOLSS, "Enumerate printers", "" }, - { "getdata", cmd_spoolss_getprinterdata, PI_SPOOLSS, "Get print driver data", "" }, - { "getdataex", cmd_spoolss_getprinterdataex, PI_SPOOLSS, "Get printer driver data with keyname", ""}, - { "getdriver", cmd_spoolss_getdriver, PI_SPOOLSS, "Get print driver information", "" }, - { "getdriverdir", cmd_spoolss_getdriverdir, PI_SPOOLSS, "Get print driver upload directory", "" }, - { "getprinter", cmd_spoolss_getprinter, PI_SPOOLSS, "Get printer info", "" }, - { "getprintprocdir", cmd_spoolss_getprintprocdir, PI_SPOOLSS, "Get print processor directory", "" }, - { "openprinter", cmd_spoolss_open_printer_ex, PI_SPOOLSS, "Open printer handle", "" }, - { "setdriver", cmd_spoolss_setdriver, PI_SPOOLSS, "Set printer driver", "" }, - { "getprintprocdir", cmd_spoolss_getprintprocdir, PI_SPOOLSS, "Get print processor directory", "" }, - { "addform", cmd_spoolss_addform, PI_SPOOLSS, "Add form", "" }, - { "setform", cmd_spoolss_setform, PI_SPOOLSS, "Set form", "" }, - { "getform", cmd_spoolss_getform, PI_SPOOLSS, "Get form", "" }, - { "deleteform", cmd_spoolss_deleteform, PI_SPOOLSS, "Delete form", "" }, - { "enumforms", cmd_spoolss_enum_forms, PI_SPOOLSS, "Enumerate forms", "" }, - { "setprinter", cmd_spoolss_setprinter, PI_SPOOLSS, "Set printer comment", "" }, - { "setprinterdata", cmd_spoolss_setprinterdata, PI_SPOOLSS, "Set REG_SZ printer data", "" }, - { "rffpcnex", cmd_spoolss_rffpcnex, PI_SPOOLSS, "Rffpcnex test", "" }, + { "adddriver", RPC_RTYPE_WERROR, NULL, cmd_spoolss_addprinterdriver, PI_SPOOLSS, "Add a print driver", "" }, + { "addprinter", RPC_RTYPE_WERROR, NULL, cmd_spoolss_addprinterex, PI_SPOOLSS, "Add a printer", "" }, + { "deldriver", RPC_RTYPE_WERROR, NULL, cmd_spoolss_deletedriver, PI_SPOOLSS, "Delete a printer driver", "" }, + { "enumdata", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_data, PI_SPOOLSS, "Enumerate printer data", "" }, + { "enumdataex", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_data_ex, PI_SPOOLSS, "Enumerate printer data for a key", "" }, + { "enumkey", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_printerkey, PI_SPOOLSS, "Enumerate printer keys", "" }, + { "enumjobs", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_jobs, PI_SPOOLSS, "Enumerate print jobs", "" }, + { "enumports", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_ports, PI_SPOOLSS, "Enumerate printer ports", "" }, + { "enumdrivers", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_drivers, PI_SPOOLSS, "Enumerate installed printer drivers", "" }, + { "enumprinters", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_printers, PI_SPOOLSS, "Enumerate printers", "" }, + { "getdata", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getprinterdata, PI_SPOOLSS, "Get print driver data", "" }, + { "getdataex", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getprinterdataex, PI_SPOOLSS, "Get printer driver data with keyname", ""}, + { "getdriver", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getdriver, PI_SPOOLSS, "Get print driver information", "" }, + { "getdriverdir", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getdriverdir, PI_SPOOLSS, "Get print driver upload directory", "" }, + { "getprinter", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getprinter, PI_SPOOLSS, "Get printer info", "" }, + { "getprintprocdir",RPC_RTYPE_WERROR, NULL, cmd_spoolss_getprintprocdir, PI_SPOOLSS, "Get print processor directory", "" }, + { "openprinter", RPC_RTYPE_WERROR, NULL, cmd_spoolss_open_printer_ex, PI_SPOOLSS, "Open printer handle", "" }, + { "setdriver", RPC_RTYPE_WERROR, NULL, cmd_spoolss_setdriver, PI_SPOOLSS, "Set printer driver", "" }, + { "getprintprocdir", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getprintprocdir, PI_SPOOLSS, "Get print processor directory", "" }, + { "addform", RPC_RTYPE_WERROR, NULL, cmd_spoolss_addform, PI_SPOOLSS, "Add form", "" }, + { "setform", RPC_RTYPE_WERROR, NULL, cmd_spoolss_setform, PI_SPOOLSS, "Set form", "" }, + { "getform", RPC_RTYPE_WERROR, NULL, cmd_spoolss_getform, PI_SPOOLSS, "Get form", "" }, + { "deleteform", RPC_RTYPE_WERROR, NULL, cmd_spoolss_deleteform, PI_SPOOLSS, "Delete form", "" }, + { "enumforms", RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_forms, PI_SPOOLSS, "Enumerate forms", "" }, + { "setprinter", RPC_RTYPE_WERROR, NULL, cmd_spoolss_setprinter, PI_SPOOLSS, "Set printer comment", "" }, + { "setprinterdata", RPC_RTYPE_WERROR, NULL, cmd_spoolss_setprinterdata, PI_SPOOLSS, "Set REG_SZ printer data", "" }, + { "rffpcnex", RPC_RTYPE_WERROR, NULL, cmd_spoolss_rffpcnex, PI_SPOOLSS, "Rffpcnex test", "" }, { NULL } }; diff --git a/source3/rpcclient/cmd_srvsvc.c b/source3/rpcclient/cmd_srvsvc.c index 8597c7bc2e..3e569f51ce 100644 --- a/source3/rpcclient/cmd_srvsvc.c +++ b/source3/rpcclient/cmd_srvsvc.c @@ -179,7 +179,7 @@ static void display_srv_info_102(SRV_INFO_102 *sv102) } /* Server query info */ -static NTSTATUS cmd_srvsvc_srv_query_info(struct cli_state *cli, +static WERROR cmd_srvsvc_srv_query_info(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -189,7 +189,7 @@ static NTSTATUS cmd_srvsvc_srv_query_info(struct cli_state *cli, if (argc > 2) { printf("Usage: %s [infolevel]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 2) @@ -217,7 +217,7 @@ static NTSTATUS cmd_srvsvc_srv_query_info(struct cli_state *cli, } done: - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } static void display_share_info_1(SRV_SHARE_INFO_1 *info1) @@ -246,7 +246,7 @@ static void display_share_info_2(SRV_SHARE_INFO_2 *info2) printf("\tpassword:\t%s\n", passwd); } -static NTSTATUS cmd_srvsvc_net_share_enum(struct cli_state *cli, +static WERROR cmd_srvsvc_net_share_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -258,7 +258,7 @@ static NTSTATUS cmd_srvsvc_net_share_enum(struct cli_state *cli, if (argc > 2) { printf("Usage: %s [infolevel]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 2) @@ -289,10 +289,10 @@ static NTSTATUS cmd_srvsvc_net_share_enum(struct cli_state *cli, } done: - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } -static NTSTATUS cmd_srvsvc_net_remote_tod(struct cli_state *cli, +static WERROR cmd_srvsvc_net_remote_tod(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -301,7 +301,7 @@ static NTSTATUS cmd_srvsvc_net_remote_tod(struct cli_state *cli, if (argc > 1) { printf("Usage: %s\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } result = cli_srvsvc_net_remote_tod( @@ -311,10 +311,10 @@ static NTSTATUS cmd_srvsvc_net_remote_tod(struct cli_state *cli, goto done; done: - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } -static NTSTATUS cmd_srvsvc_net_file_enum(struct cli_state *cli, +static WERROR cmd_srvsvc_net_file_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { @@ -326,7 +326,7 @@ static NTSTATUS cmd_srvsvc_net_file_enum(struct cli_state *cli, if (argc > 2) { printf("Usage: %s [infolevel]\n", argv[0]); - return NT_STATUS_OK; + return WERR_OK; } if (argc == 2) @@ -343,7 +343,7 @@ static NTSTATUS cmd_srvsvc_net_file_enum(struct cli_state *cli, goto done; done: - return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; + return result; } /* List of commands exported by this module */ @@ -352,10 +352,10 @@ struct cmd_set srvsvc_commands[] = { { "SRVSVC" }, - { "srvinfo", cmd_srvsvc_srv_query_info, PI_SRVSVC, "Server query info", "" }, - { "netshareenum", cmd_srvsvc_net_share_enum, PI_SRVSVC, "Enumerate shares", "" }, - { "netfileenum", cmd_srvsvc_net_file_enum, PI_SRVSVC, "Enumerate open files", "" }, - { "netremotetod", cmd_srvsvc_net_remote_tod, PI_SRVSVC, "Fetch remote time of day", "" }, + { "srvinfo", RPC_RTYPE_WERROR, NULL, cmd_srvsvc_srv_query_info, PI_SRVSVC, "Server query info", "" }, + { "netshareenum",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_share_enum, PI_SRVSVC, "Enumerate shares", "" }, + { "netfileenum", RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_file_enum, PI_SRVSVC, "Enumerate open files", "" }, + { "netremotetod",RPC_RTYPE_WERROR, NULL, cmd_srvsvc_net_remote_tod, PI_SRVSVC, "Fetch remote time of day", "" }, { NULL } }; diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index c3b2cd4ea1..2338d72f19 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -73,7 +73,10 @@ static char **completion_fn(char *text, int start, int end) for (i=0; commands->cmd_set[i].name; i++) { if ((strncmp(text, commands->cmd_set[i].name, strlen(text)) == 0) && - commands->cmd_set[i].fn) + (( commands->cmd_set[i].returntype == RPC_RTYPE_NTSTATUS && + commands->cmd_set[i].ntfn ) || + ( commands->cmd_set[i].returntype == RPC_RTYPE_WERROR && + commands->cmd_set[i].wfn))) { matches[count] = strdup(commands->cmd_set[i].name); if (!matches[count]) @@ -393,18 +396,18 @@ static struct cmd_set rpcclient_commands[] = { { "GENERAL OPTIONS" }, - { "help", cmd_help, -1, "Get help on commands", "[command]" }, - { "?", cmd_help, -1, "Get help on commands", "[command]" }, - { "debuglevel", cmd_debuglevel, -1, "Set debug level", "level" }, - { "list", cmd_listcommands, -1, "List available commands on ", "pipe" }, - { "exit", cmd_quit, -1, "Exit program", "" }, - { "quit", cmd_quit, -1, "Exit program", "" }, + { "help", RPC_RTYPE_NTSTATUS, cmd_help, NULL, -1, "Get help on commands", "[command]" }, + { "?", RPC_RTYPE_NTSTATUS, cmd_help, NULL, -1, "Get help on commands", "[command]" }, + { "debuglevel", RPC_RTYPE_NTSTATUS, cmd_debuglevel, NULL, -1, "Set debug level", "level" }, + { "list", RPC_RTYPE_NTSTATUS, cmd_listcommands, NULL, -1, "List available commands on ", "pipe" }, + { "exit", RPC_RTYPE_NTSTATUS, cmd_quit, NULL, -1, "Exit program", "" }, + { "quit", RPC_RTYPE_NTSTATUS, cmd_quit, NULL, -1, "Exit program", "" }, { NULL } }; static struct cmd_set separator_command[] = { - { "---------------", NULL, -1, "----------------------" }, + { "---------------", MAX_RPC_RETURN_TYPE, NULL, NULL, -1, "----------------------" }, { NULL } }; @@ -458,7 +461,8 @@ static NTSTATUS do_cmd(struct cli_state *cli, struct cmd_set *cmd_entry, int argc, char **argv) { - NTSTATUS result; + NTSTATUS ntresult; + WERROR wresult; TALLOC_CTX *mem_ctx; @@ -477,9 +481,22 @@ static NTSTATUS do_cmd(struct cli_state *cli, return NT_STATUS_UNSUCCESSFUL; } - /* Run command */ - - result = cmd_entry->fn(cli, mem_ctx, argc, (const char **) argv); + /* Run command */ + + if ( cmd_entry->returntype == RPC_RTYPE_NTSTATUS ) { + ntresult = cmd_entry->ntfn(cli, mem_ctx, argc, (const char **) argv); + if (!NT_STATUS_IS_OK(ntresult)) { + printf("result was %s\n", nt_errstr(ntresult)); + } + } else { + wresult = cmd_entry->wfn( cli, mem_ctx, argc, (const char **) argv); + /* print out the DOS error */ + if (!W_ERROR_IS_OK(wresult)) { + printf( "result was %s\n", dos_errstr(wresult)); + } + ntresult = W_ERROR_IS_OK(wresult)?NT_STATUS_OK:NT_STATUS_UNSUCCESSFUL; + } + /* Cleanup */ @@ -488,7 +505,7 @@ static NTSTATUS do_cmd(struct cli_state *cli, talloc_destroy(mem_ctx); - return result; + return ntresult; } @@ -517,7 +534,8 @@ static NTSTATUS process_cmd(struct cli_state *cli, char *cmd) while (temp_set->name) { if (strequal(argv[0], temp_set->name)) { - if (!temp_set->fn) { + if (!(temp_set->returntype == RPC_RTYPE_NTSTATUS && temp_set->ntfn ) && + !(temp_set->returntype == RPC_RTYPE_WERROR && temp_set->wfn )) { fprintf (stderr, "Invalid command\n"); goto out_free; } @@ -535,9 +553,11 @@ static NTSTATUS process_cmd(struct cli_state *cli, char *cmd) } out_free: +/* moved to do_cmd() if (!NT_STATUS_IS_OK(result)) { printf("result was %s\n", nt_errstr(result)); } +*/ if (argv) { /* NOTE: popt allocates the whole argv, including the diff --git a/source3/rpcclient/rpcclient.h b/source3/rpcclient/rpcclient.h index 1bd3c1a641..1db4246d37 100644 --- a/source3/rpcclient/rpcclient.h +++ b/source3/rpcclient/rpcclient.h @@ -22,10 +22,18 @@ #ifndef RPCCLIENT_H #define RPCCLIENT_H +typedef enum { + RPC_RTYPE_NTSTATUS = 0, + RPC_RTYPE_WERROR, + MAX_RPC_RETURN_TYPE, +} RPC_RETURN_TYPE; + struct cmd_set { const char *name; - NTSTATUS (*fn)(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, + RPC_RETURN_TYPE returntype; + NTSTATUS (*ntfn)(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv); + WERROR (*wfn)(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv); int pipe_idx; const char *description; const char *usage; -- cgit From a564fed756a82d944ebde45da1ce4ea932011f10 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 08:03:08 +0000 Subject: More statcache fixes - and add a bit more doco. Andrew Bartlett (This used to be commit 0e8dd52f6973ac5219e2c2dd53824de71f512083) --- source3/smbd/statcache.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index 57ba6ada81..b1cb0f6e0f 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -39,11 +39,19 @@ typedef struct { #define INIT_STAT_CACHE_SIZE 512 static hash_table stat_cache; -/**************************************************************************** - Add an entry into the stat cache. -*****************************************************************************/ +/** + * Add an entry into the stat cache. + * + * @param full_orig_name The original name as specified by the client + * @param orig_translated_path The name on our filesystem. + * + * @note Only the first strlen(orig_translated_path) characters are stored + * into the cache. This means that full_orig_name will be internally + * truncated. + * + */ -void stat_cache_add( char *full_orig_name, char *orig_translated_path) +void stat_cache_add( const char *full_orig_name, const char *orig_translated_path) { stat_cache_entry *scp; stat_cache_entry *found_scp; @@ -105,11 +113,19 @@ void stat_cache_add( char *full_orig_name, char *orig_translated_path) if(!case_sensitive) strupper(original_path); - if(!(original_path_length == translated_path_length)) { - DEBUG(0, ("OOPS - tried to store stat cache entry for non-equal length paths [%s] %u and [%s] %u)!\n", original_path, original_path_length, translated_path, translated_path_length)); - SAFE_FREE(original_path); - SAFE_FREE(translated_path); - return; + if (original_path_length != translated_path_length) { + if (original_path_length < translated_path_length) { + DEBUG(0, ("OOPS - tried to store stat cache entry for werid length paths [%s] %u and [%s] %u)!\n", original_path, original_path_length, translated_path, translated_path_length)); + SAFE_FREE(original_path); + SAFE_FREE(translated_path); + return; + } + + /* we only want to store the first part of translated_path, + up to the length of original_path */ + + translated_path[original_path_length] = '\0'; + translated_path_length = original_path_length; } #if 0 -- cgit From 1331a361bd6c5cde775da4db8aade78983ca71b1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 09:08:34 +0000 Subject: Add const. (This used to be commit 02f81719c7c179b61663bdf789c01ab62286fea2) --- source3/smbd/dir.c | 2 +- source3/smbd/filename.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index ec570d3a18..6cf56fd373 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1008,7 +1008,7 @@ static ubi_dlNewList( dir_cache ); Output: None. *****************************************************************************/ -void DirCacheAdd( const char *path, char *name, char *dname, int snum ) +void DirCacheAdd( const char *path, const char *name, const char *dname, int snum ) { int pathlen; int namelen; diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 7d3527402e..ad707a2b9d 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -39,7 +39,7 @@ static BOOL scan_directory(const char *path, char *name,size_t maxlength, This needs to be careful about whether we are case sensitive. ****************************************************************************/ -static BOOL fname_equal(char *name1, char *name2) +static BOOL fname_equal(const char *name1, const char *name2) { /* Normal filename handling */ if (case_sensitive) @@ -52,7 +52,7 @@ static BOOL fname_equal(char *name1, char *name2) Mangle the 2nd name and check if it is then equal to the first name. ****************************************************************************/ -static BOOL mangled_equal(char *name1, const char *name2, int snum) +static BOOL mangled_equal(const char *name1, const char *name2, int snum) { pstring tmpname; @@ -439,7 +439,7 @@ static BOOL scan_directory(const char *path, char *name, size_t maxlength, connection_struct *conn,BOOL docache) { void *cur_dir; - char *dname; + const char *dname; BOOL mangled; mangled = mangle_is_mangled(name); -- cgit From 0273df0bf75f135a781ca6b58cc4c7e3247e5aef Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 09:18:06 +0000 Subject: Fix const warnings. Andrew Bartlett (This used to be commit fc1408d5d1a8b64dfd20268ab6f4a5f2a007614b) --- source3/smbd/reply.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 5ca0ae52de..138870453d 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1305,7 +1305,7 @@ NTSTATUS unlink_internals(connection_struct *conn, int dirtype, char *name) } } else { void *dirptr = NULL; - char *dname; + const char *dname; if (check_name(directory,conn)) dirptr = OpenDir(conn, directory, True); @@ -2861,7 +2861,7 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, static BOOL recursive_rmdir(connection_struct *conn, char *directory) { - char *dname = NULL; + const char *dname = NULL; BOOL ret = False; void *dirptr = OpenDir(conn, directory, False); @@ -2926,7 +2926,7 @@ BOOL rmdir_internals(connection_struct *conn, char *directory) * do a recursive delete) then fail the rmdir. */ BOOL all_veto_files = True; - char *dname; + const char *dname; void *dirptr = OpenDir(conn, directory, False); if(dirptr != NULL) { @@ -3285,7 +3285,7 @@ directory = %s, newname = %s, newname_last_component = %s, is_8_3 = %d\n", * Wildcards - process each file that matches. */ void *dirptr = NULL; - char *dname; + const char *dname; pstring destname; if (check_name(directory,conn)) @@ -3574,7 +3574,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, } } else { void *dirptr = NULL; - char *dname; + const char *dname; pstring destname; if (check_name(directory,conn)) -- cgit From 63c1aa25cfbc96abf67bb4f5c99291d05bffb9bb Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 17 Mar 2003 10:26:44 +0000 Subject: Call AC_MSG_ERROR if jw, perl or htmldoc is not installed rather than generate a bodgy Makefile. (This used to be commit 2842e0925debe8bfabfdf011913cf5e13e824c10) --- docs/docbook/configure.in | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/docbook/configure.in b/docs/docbook/configure.in index 3a9ed51d16..57482d134e 100644 --- a/docs/docbook/configure.in +++ b/docs/docbook/configure.in @@ -1,8 +1,18 @@ AC_INIT(global.ent) +# Jade wrapper AC_PATH_PROG(JW, jw) +if test "x$JW" = x; then + AC_MSG_ERROR("jw is required") +fi AC_PATH_PROG(PERL, perl) +if test "x$PERL" = x; then + AC_MSG_ERROR("perl is required") +fi AC_PATH_PROG(HTMLDOC, htmldoc) +if test "x$HTMLDOC" = x; then + AC_MSG_ERROR("htmldoc is required") +fi DOC_BUILD_DATE=`date '+%d-%m-%Y'` AC_SUBST(DOC_BUILD_DATE) -- cgit From 99e5d02f747dcc44800b2e47fa45aa1dff9c5bf7 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 10:58:05 +0000 Subject: Brain fart - make sure we truncate the right string... Andrew Bartlett (This used to be commit 32eb2cdca62a784d96207507e273bbbf77b0c6c3) --- source3/smbd/statcache.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index b1cb0f6e0f..1e06b2b103 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -121,11 +121,11 @@ void stat_cache_add( const char *full_orig_name, const char *orig_translated_pat return; } - /* we only want to store the first part of translated_path, - up to the length of original_path */ + /* we only want to store the first part of original_path, + up to the length of translated_path */ - translated_path[original_path_length] = '\0'; - translated_path_length = original_path_length; + original_path[translated_path_length] = '\0'; + original_path_length = translated_path_length; } #if 0 -- cgit From a9034ec179239274bdb0f7dffbe87c11c4a0539d Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 10:59:11 +0000 Subject: Fix invalid SAFE_FREE() of talloc()ed memory. Andrew Bartlett (This used to be commit 21add5f97d0d112094e34a02e6319991a1d2af4d) --- source3/passdb/secrets.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/source3/passdb/secrets.c b/source3/passdb/secrets.c index 4b0913a624..4c9802dd29 100644 --- a/source3/passdb/secrets.c +++ b/source3/passdb/secrets.c @@ -535,7 +535,6 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in if (size != packed_size) { DEBUG(2, ("Secrets record %s is invalid!\n", secrets_key)); - SAFE_FREE(pass); if (size) SAFE_FREE(packed_pass); return NT_STATUS_UNSUCCESSFUL; @@ -554,8 +553,6 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in dom = talloc_zero(ctx, sizeof(*dom)); if (!dom) { /* free returned tdb record */ - SAFE_FREE(pass); - return NT_STATUS_NO_MEMORY; } -- cgit From 9349b44ea741d32a74ba34f68675bd80b61123a6 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 17 Mar 2003 11:02:54 +0000 Subject: Run autoconf. Shouldn't we have an autogen.sh here? (This used to be commit a43fe8e5f0cc95a8fb89db4ab1ee051b8c9d1bab) --- docs/docbook/configure | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/docbook/configure b/docs/docbook/configure index 609c17ed87..8680e5b5ab 100755 --- a/docs/docbook/configure +++ b/docs/docbook/configure @@ -557,10 +557,13 @@ else echo "$ac_t""no" 1>&6 fi +if test "x$JW" = x; then + { echo "configure: error: "jw is required"" 1>&2; exit 1; } +fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:564: checking for $ac_word" >&5 +echo "configure:567: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -592,10 +595,13 @@ else echo "$ac_t""no" 1>&6 fi +if test "x$PERL" = x; then + { echo "configure: error: "perl is required"" 1>&2; exit 1; } +fi # Extract the first word of "htmldoc", so it can be a program name with args. set dummy htmldoc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:599: checking for $ac_word" >&5 +echo "configure:605: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_HTMLDOC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -627,6 +633,9 @@ else echo "$ac_t""no" 1>&6 fi +if test "x$HTMLDOC" = x; then + { echo "configure: error: "htmldoc is required"" 1>&2; exit 1; } +fi DOC_BUILD_DATE=`date '+%d-%m-%Y'` -- cgit From 4adde4c8505851cba42b3d5315a5206eb7825c90 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 17 Mar 2003 11:03:29 +0000 Subject: Added a slightly modified version of Tridge's note about securing a Samba server. (This used to be commit 03a227b7ee7ed6927541966ec226344cd8c88aff) --- docs/docbook/projdoc/samba-doc.sgml | 2 + docs/docbook/projdoc/securing-samba.sgml | 181 +++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 docs/docbook/projdoc/securing-samba.sgml diff --git a/docs/docbook/projdoc/samba-doc.sgml b/docs/docbook/projdoc/samba-doc.sgml index 54650f1ed9..246fba1228 100644 --- a/docs/docbook/projdoc/samba-doc.sgml +++ b/docs/docbook/projdoc/samba-doc.sgml @@ -23,6 +23,7 @@ + ]> @@ -115,6 +116,7 @@ part each cover one specific feature. &GROUP-MAPPING-HOWTO; &SPEED; &GroupProfiles; +&SecuringSamba; diff --git a/docs/docbook/projdoc/securing-samba.sgml b/docs/docbook/projdoc/securing-samba.sgml new file mode 100644 index 0000000000..bfedc5456f --- /dev/null +++ b/docs/docbook/projdoc/securing-samba.sgml @@ -0,0 +1,181 @@ + + + + + AndrewTridgell + Samba Team + + 17 March 2003 + + +Securing Samba + + +Introduction + +This note was attached to the Samba 2.2.8 release notes as it contained an +important security fix. The information contained here applies to Samba +installations in general. + + + + + +Using host based protection + + +In many installations of Samba the greatest threat comes for outside +your immediate network. By default Samba will accept connections from +any host, which means that if you run an insecure version of Samba on +a host that is directly connected to the Internet you can be +especially vulnerable. + + + +One of the simplest fixes in this case is to use the 'hosts allow' and +'hosts deny' options in the Samba smb.conf configuration file to only +allow access to your server from a specific range of hosts. An example +might be: + + + + hosts allow = 127.0.0.1 192.168.2.0/24 192.168.3.0/24 + hosts deny = 0.0.0.0/0 + + + +The above will only allow SMB connections from 'localhost' (your own +computer) and from the two private networks 192.168.2 and +192.168.3. All other connections will be refused connections as soon +as the client sends its first packet. The refusal will be marked as a +'not listening on called name' error. + + + + + + +Using interface protection + + +By default Samba will accept connections on any network interface that +it finds on your system. That means if you have a ISDN line or a PPP +connection to the Internet then Samba will accept connections on those +links. This may not be what you want. + + + +You can change this behaviour using options like the following: + + + + interfaces = eth* lo + bind interfaces only = yes + + + +This tells Samba to only listen for connections on interfaces with a +name starting with 'eth' such as eth0, eth1, plus on the loopback +interface called 'lo'. The name you will need to use depends on what +OS you are using, in the above I used the common name for Ethernet +adapters on Linux. + + + +If you use the above and someone tries to make a SMB connection to +your host over a PPP interface called 'ppp0' then they will get a TCP +connection refused reply. In that case no Samba code is run at all as +the operating system has been told not to pass connections from that +interface to any process. + + + + + +Using a firewall + + +Many people use a firewall to deny access to services that they don't +want exposed outside their network. This can be a very good idea, +although I would recommend using it in conjunction with the above +methods so that you are protected even if your firewall is not active +for some reason. + + + +If you are setting up a firewall then you need to know what TCP and +UDP ports to allow and block. Samba uses the following: + + + +UDP/137 - used by nmbd +UDP/138 - used by nmbd +TCP/139 - used by smbd +TCP/445 - used by smbd + + + +The last one is important as many older firewall setups may not be +aware of it, given that this port was only added to the protocol in +recent years. + + + + + +Using a IPC$ share deny + + +If the above methods are not suitable, then you could also place a +more specific deny on the IPC$ share that is used in the recently +discovered security hole. This allows you to offer access to other +shares while denying access to IPC$ from potentially untrustworthy +hosts. + + + +To do that you could use: + + + + [ipc$] + hosts allow = 192.168.115.0/24 127.0.0.1 + hosts deny = 0.0.0.0/0 + + + +this would tell Samba that IPC$ connections are not allowed from +anywhere but the two listed places (localhost and a local +subnet). Connections to other shares would still be allowed. As the +IPC$ share is the only share that is always accessible anonymously +this provides some level of protection against attackers that do not +know a username/password for your host. + + + +If you use this method then clients will be given a 'access denied' +reply when they try to access the IPC$ share. That means that those +clients will not be able to browse shares, and may also be unable to +access some other resources. + + + +This is not recommended unless you cannot use one of the other +methods listed above for some reason. + + + + + +Upgrading Samba + + +Please check regularly on http://www.samba.org/ for updates and +important announcements. Occasionally security releases are made and +it is highly recommended to upgrade Samba when a security vulnerability +is discovered. + + + + + -- cgit From 0a8e719a4bc6ac88bea6b76e7a7d840bb0fed403 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 17 Mar 2003 22:09:06 +0000 Subject: Fix memory leak. Volker (This used to be commit e8975d6e7bdcceb78a83a3446cf1430e1e3f1a72) --- source3/passdb/pdb_ldap.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source3/passdb/pdb_ldap.c b/source3/passdb/pdb_ldap.c index 548d7bc60d..46e0994379 100644 --- a/source3/passdb/pdb_ldap.c +++ b/source3/passdb/pdb_ldap.c @@ -1838,12 +1838,14 @@ static NTSTATUS ldapsam_update_sam_account(struct pdb_methods *my_methods, SAM_A rc = ldapsam_search_one_user_by_name(ldap_state, pdb_get_username(newpwd), &result); if (rc != LDAP_SUCCESS) { + ldap_mods_free(mods, 1); return NT_STATUS_UNSUCCESSFUL; } if (ldap_count_entries(ldap_state->ldap_struct, result) == 0) { DEBUG(0, ("No user to modify!\n")); ldap_msgfree(result); + ldap_mods_free(mods, 1); return NT_STATUS_UNSUCCESSFUL; } -- cgit From e0e31ca14a12635886110cd5ae7100365fd2cc88 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 22:22:46 +0000 Subject: Add copyright. (This used to be commit a7f9c3657ff052e382e290059f50f1d9812b8221) --- source3/smbd/statcache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index 1e06b2b103..0f42a3a83f 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -3,7 +3,7 @@ stat cache code Copyright (C) Andrew Tridgell 1992-2000 Copyright (C) Jeremy Allison 1999-2000 - + Copyright (C) Andrew Bartlett 2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -- cgit From 2e20359a8add2a5b5880116f5354cfe2cad3cde2 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 18 Mar 2003 01:32:51 +0000 Subject: Start of a unit test for info3 caching. Much unfrastructure required before this can be fully implemented. )-: (This used to be commit a040a8471f884cb295100f841594d86ddf754bb6) --- source3/stf/info3cache.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100755 source3/stf/info3cache.py diff --git a/source3/stf/info3cache.py b/source3/stf/info3cache.py new file mode 100755 index 0000000000..96d5a1d459 --- /dev/null +++ b/source3/stf/info3cache.py @@ -0,0 +1,54 @@ +#!/usr/bin/python +# +# Upon a winbindd authentication, test that an info3 record is cached in +# netsamlogon_cache.tdb and cache records are removed from winbindd_cache.tdb +# + +import comfychair, stf +from samba import tdb, winbind + +# +# We want to implement the following test on a win2k native mode domain. +# +# 1. trash netsamlogon_cache.tdb +# 2. wbinfo -r DOMAIN\Administrator [FAIL] +# 3. wbinfo --auth-crap DOMAIN\Administrator%password [PASS] +# 4. wbinfo -r DOMAIN\Administrator [PASS] +# +# Also for step 3 we want to try 'wbinfo --auth-smbd' and +# 'wbinfo --auth-plaintext' +# + +# +# TODO: To implement this test we need to be able to +# +# - pass username%password combination for an invidivual winbindd request +# (so we can get the administrator SID so we can clear the info3 cache) +# +# - start/restart winbindd (to trash the winbind cache) +# +# - from samba import dynconfig (to find location of info3 cache) +# +# - be able to modify the winbindd cache (to set/reset individual winbind +# cache entries) +# +# - have --auth-crap present in HEAD +# + +class WinbindAuthCrap(comfychair.TestCase): + def runtest(self): + raise comfychair.NotRunError, "not implemented" + +class WinbindAuthSmbd(comfychair.TestCase): + def runtest(self): + # Grr - winbindd in HEAD doesn't contain the auth_smbd function + raise comfychair.NotRunError, "no auth_smbd in HEAD" + +class WinbindAuthPlaintext(comfychair.TestCase): + def runtest(self): + raise comfychair.NotRunError, "not implemented" + +tests = [WinbindAuthCrap, WinbindAuthSmbd, WinbindAuthPlaintext] + +if __name__ == "__main__": + comfychair.main(tests) -- cgit From 47b547c69da1e02fcc218ccb44793e2ef38521b8 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 18 Mar 2003 01:34:09 +0000 Subject: Added #ifdef'ed out implementation of auth_smbd python fn. Uncomment when auth_smbd functionality merged to HEAD. (This used to be commit 2b6d13672dc1e4a46fc2600e729c22d0ee7e534b) --- source3/python/py_winbind.c | 72 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/source3/python/py_winbind.c b/source3/python/py_winbind.c index e9fc4b7dd8..20bbe9dba4 100644 --- a/source3/python/py_winbind.c +++ b/source3/python/py_winbind.c @@ -3,7 +3,7 @@ Python wrapper for winbind client functions. - Copyright (C) Tim Potter 2002 + Copyright (C) Tim Potter 2002-2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -452,6 +452,65 @@ static PyObject *py_auth_crap(PyObject *self, PyObject *args, PyObject *kw) return PyInt_FromLong(response.data.auth.nt_status); } +#if 0 /* Include when auth_smbd merged to HEAD */ + +/* Challenge/response authentication, with secret */ + +static PyObject *py_auth_smbd(PyObject *self, PyObject *args, PyObject *kw) +{ + static char *kwlist[] = + {"username", "password", "use_lm_hash", "use_nt_hash", NULL }; + struct winbindd_request request; + struct winbindd_response response; + char *username, *password; + int use_lm_hash = 1, use_nt_hash = 1; + + if (!PyArg_ParseTupleAndKeywords( + args, kw, "ss|ii", kwlist, &username, &password, + &use_lm_hash, &use_nt_hash)) + return NULL; + + ZERO_STRUCT(request); + ZERO_STRUCT(response); + + fstrcpy(request.data.smbd_auth_crap.user, username); + + generate_random_buffer(request.data.smbd_auth_crap.chal, 8, False); + + if (use_lm_hash) { + SMBencrypt((uchar *)password, + request.data.smbd_auth_crap.chal, + (uchar *)request.data.smbd_auth_crap.lm_resp); + request.data.smbd_auth_crap.lm_resp_len = 24; + } + + if (use_nt_hash) { + SMBNTencrypt((uchar *)password, + request.data.smbd_auth_crap.chal, + (uchar *)request.data.smbd_auth_crap.nt_resp); + request.data.smbd_auth_crap.nt_resp_len = 24; + } + + if (!secrets_fetch_trust_account_password( + lp_workgroup(), request.data.smbd_auth_crap.proof, NULL)) { + PyErr_SetString( + winbind_error, "unable to fetch domain secret"); + return NULL; + } + + + + if (winbindd_request(WINBINDD_SMBD_AUTH_CRAP, &request, &response) + != NSS_STATUS_SUCCESS) { + PyErr_SetString(winbind_error, "lookup failed"); + return NULL; + } + + return PyInt_FromLong(response.data.auth.nt_status); +} + +#endif /* 0 */ + /* Get user info from name */ static PyObject *py_getpwnam(PyObject *self, PyObject *args) @@ -648,6 +707,17 @@ Authenticate a username and password using the challenge/response protocol. The NT status code is returned with zero indicating success." }, +#if 0 /* Include when smbd_auth merged to HEAD */ + + { "auth_smbd", (PyCFunction)py_auth_crap, METH_VARARGS, + "auth_smbd(s, s) -> int + +Authenticate a username and password using the challenge/response +protocol but using the domain secret to prove we are root. The NT +status code is returned with zero indicating success." }, + +#endif + { NULL } }; -- cgit From 1b0033dac6e1044ee276d82d5e08bab78c99ef8b Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 03:07:39 +0000 Subject: Decode waitstatus values when a command fails. (This used to be commit e1baab1ee04b27447445351d0d88b0c02a5fa85d) --- source3/stf/comfychair.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source3/stf/comfychair.py b/source3/stf/comfychair.py index d7e23efc10..8ff7726955 100644 --- a/source3/stf/comfychair.py +++ b/source3/stf/comfychair.py @@ -1,6 +1,7 @@ #! /usr/bin/env python # Copyright (C) 2002, 2003 by Martin Pool +# Copyright (C) 2003 by Tim Potter # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -20,6 +21,7 @@ """comfychair: a Python-based instrument of software torture. Copyright (C) 2002, 2003 by Martin Pool +Copyright (C) 2003 by Tim Potter This is a test framework designed for testing programs written in Python, or (through a fork/exec interface) any other language. @@ -163,9 +165,10 @@ why.""" ("%s terminated with signal %d", cmd, os.WTERMSIG(waitstatus)) rc = os.WEXITSTATUS(waitstatus) self.test_log = self.test_log + ("""Run command: %s -Wait status: %#x +Wait status: %#x (exit code %d, signal %d) Output: -%s""" % (cmd, waitstatus, output)) +%s""" % (cmd, waitstatus, os.WEXITSTATUS(waitstatus), os.WTERMSIG(waitstatus), + output)) if skip_on_noexec and rc == 127: # Either we could not execute the command or the command # returned exit code 127. According to system(3) we can't -- cgit From eb8374894061e9dc3bc83e397a92248d23b99f22 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:00:02 +0000 Subject: global_globber_region_function/line ought to be recorded before clobbering the region, just in case clobbering causes us to crash immediately. (That might happen if we just shot ourselves in the stack and strcpy was not inlined.) Also, in DEVELOPER mode and when Valgrind is available, mark the clobbered region as uninitialized. This is an even stronger protection than clobbering with 0xf1. (This used to be commit 5653a42ae695f4b8f4c14d3184ca76523d38b51b) --- source3/lib/util_str.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 7643c2807e..b734452867 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -424,15 +424,27 @@ size_t count_chars(const char *s,char c) * * This is meant to catch possible string overflows, even if the * actual string copied is not big enough to cause an overflow. + * + * In addition, under Valgrind the buffer is marked as uninitialized. **/ void clobber_region(const char *fn, unsigned int line, char *dest, size_t len) { #ifdef DEVELOPER - /* F1 is odd and 0xf1f1f1f1 shouldn't be a valid pointer */ - memset(dest, 0xF1, len); global_clobber_region_function = fn; global_clobber_region_line = line; -#endif + + /* F1 is odd and 0xf1f1f1f1 shouldn't be a valid pointer */ + memset(dest, 0xF1, len); +#ifdef VALGRIND + /* Even though we just wrote to this, from the application's + * point of view it is not initialized. + * + * (This is not redundant with the clobbering above. The + * marking might not actually take effect if we're not running + * under valgrind or not with --client-perms.) */ + VALGRIND_MAKE_WRITABLE(dest, len); +#endif /* VALGRIND */ +#endif /* DEVELOPER */ } -- cgit From b9a8ad5f3bcf8f0d75c39b8f993010f3d1fded7e Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:04:44 +0000 Subject: Speling fixes and a little extra documentation. (This used to be commit 8da383bb3e63d25ceb0204c775580f2f1b3336ec) --- source3/include/safe_string.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h index 65ec05a5c6..d01a6c6321 100644 --- a/source3/include/safe_string.h +++ b/source3/include/safe_string.h @@ -129,12 +129,12 @@ size_t __unsafe_string_function_usage_here_char__(void); safe_strcpy(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1) -/* inside the _fn varients of these is a call to 'clobber_region' - which might - destory the stack on a buggy function. Help the debugging process by putting - the function and line it was last called from into a static buffer - - But only for developers */ - +/* Inside the _fn variants of these is a call to clobber_region(), - + * which might destroy the stack on a buggy function. We help the + * debugging process by putting the function and line who last caused + * a clobbering into a static buffer. If the program crashes at + * address 0xf1f1f1f1 then this function is probably, but not + * necessarily, to blame. */ #ifdef DEVELOPER #define overmalloc_safe_strcpy(dest,src,maxlength) safe_strcpy_fn(__FUNCTION__,__LINE__,dest,src,maxlength) #define safe_strcpy(dest,src,maxlength) safe_strcpy_fn2(__FUNCTION__,__LINE__,dest,src,maxlength) -- cgit From 556fea4e1e68d9d0c711a87905d9be310add7f83 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:30:15 +0000 Subject: Update comment: Valgrind 1.9.4 seems to always respect client requests, without needing --client-perms=yes. (This used to be commit 412a8780c35ee9449c9682e3ef73afb2c4933285) --- source3/lib/util_str.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index b734452867..3836d42872 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -441,7 +441,7 @@ void clobber_region(const char *fn, unsigned int line, char *dest, size_t len) * * (This is not redundant with the clobbering above. The * marking might not actually take effect if we're not running - * under valgrind or not with --client-perms.) */ + * under valgrind.) */ VALGRIND_MAKE_WRITABLE(dest, len); #endif /* VALGRIND */ #endif /* DEVELOPER */ -- cgit From 2f07f71d787dc2dfcefac6a1f723c2cde76d4884 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:31:52 +0000 Subject: The new string macros catch a bug at compile that previously only trapped at runtime, which is great. So we have to try a little harder to provoke an overflow -- which is still caught nicely in developer mode. (This used to be commit cea126f62ad411f5efbebc7c5d39297fd8ef9efb) --- source3/torture/t_stringoverflow.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source3/torture/t_stringoverflow.c b/source3/torture/t_stringoverflow.c index b0503adb8f..ec14d81189 100644 --- a/source3/torture/t_stringoverflow.c +++ b/source3/torture/t_stringoverflow.c @@ -3,6 +3,7 @@ int main(void) { fstring dest; + char *ptr = dest; printf("running on valgrind? %d\n", RUNNING_ON_VALGRIND); @@ -10,7 +11,13 @@ * will actually fit, but this is still wrong because you * can't pstrcpy into an fstring. This should trap in a * developer build. */ + +#if 0 + /* As of CVS 20030318, this will be trapped at compile time! */ pstrcpy(dest, "hello"); +#endif /* 0 */ + + pstrcpy(ptr, "hello!"); return 0; } -- cgit From 29fa4c1631d70daf564a52cf23740c6e1b5316f6 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:37:23 +0000 Subject: Remove static libbigballofmud, which just does not seem to link. Add bin/t_stringoverflow test case. Not built by default. (This used to be commit 7741bb8d18e7ba16522c00513174f2909d75535d) --- source3/Makefile.in | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source3/Makefile.in b/source3/Makefile.in index 40abe5d71b..a2290e8f57 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -894,9 +894,10 @@ bin/libbigballofmud.@SHLIBEXT@: $(LIBBIGBALLOFMUD_PICOBJS) $(SHLD) $(LDSHFLAGS) -o $@ $(LIBBIGBALLOFMUD_PICOBJS) $(LIBS) \ @SONAMEFLAG@`basename $@`.$(LIBBIGBALLOFMUD_MAJOR) -bin/libbigballofmud.a: $(LIBBIGBALLOFMUD_OBJS) - @echo Linking bigballofmud non-shared library $@ - -$(AR) -rc $@ $(LIBBIGBALLOFMUD_OBJS) +# It would be nice to build a static bigballofmud too, but when I try +# I get linker errors about dl_open and similar things. I'm not sure +# if it can be fixed or if they just can't be called from a static +# library. libsmbclient: $(LIBSMBCLIENT) @@ -1027,6 +1028,9 @@ bin/tdbbackup@EXEEXT@: $(TDBBACKUP_OBJ) bin/.dummy @echo Linking $@ @$(CC) $(FLAGS) -o $@ $(TDBBACKUP_OBJ) +bin/t_stringoverflow: bin/libbigballofmud.@SHLIBEXT@ torture/t_stringoverflow.o + $(CC) $(FLAGS) -o $@ torture/t_stringoverflow.o -L./bin -lbigballofmud + install: installbin installman installscripts installdat installswat # DESTDIR is used here to prevent packagers wasting their time -- cgit From c52a31b21a656928caedc48211905b713779801a Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:42:53 +0000 Subject: Comment about deprecated macro overmalloc_safe_strcpy(). (This used to be commit 5ac062580690eee9b4bd423dbb82631c0cdb8b30) --- source3/include/safe_string.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h index d01a6c6321..61ef4bdf96 100644 --- a/source3/include/safe_string.h +++ b/source3/include/safe_string.h @@ -135,6 +135,12 @@ size_t __unsafe_string_function_usage_here_char__(void); * a clobbering into a static buffer. If the program crashes at * address 0xf1f1f1f1 then this function is probably, but not * necessarily, to blame. */ + +/* overmalloc_safe_strcpy: DEPRECATED! Used when you know the + * destination buffer is longer than maxlength, but you don't know how + * long. This is not a good situation, because we can't do the normal + * sanity checks. Don't use in new code! */ + #ifdef DEVELOPER #define overmalloc_safe_strcpy(dest,src,maxlength) safe_strcpy_fn(__FUNCTION__,__LINE__,dest,src,maxlength) #define safe_strcpy(dest,src,maxlength) safe_strcpy_fn2(__FUNCTION__,__LINE__,dest,src,maxlength) -- cgit From 8cfec8554e54429654a8fef7335cb857ac481221 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:51:41 +0000 Subject: Ignore .po and .po32 files. (This used to be commit 8d64419625dda242fdb7a5d956644b052b43a2ea) --- source3/rpc_client/.cvsignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 source3/rpc_client/.cvsignore diff --git a/source3/rpc_client/.cvsignore b/source3/rpc_client/.cvsignore new file mode 100644 index 0000000000..07da2225c7 --- /dev/null +++ b/source3/rpc_client/.cvsignore @@ -0,0 +1,3 @@ +*.po +*.po32 + -- cgit From 6cb8656c2601254ebd04a71cc68650edcba53869 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 05:52:05 +0000 Subject: Ignore t_stringoverflow binary. (This used to be commit 195582c4cb7906ab95e47f5a2aea4ae86a7ab023) --- source3/bin/.cvsignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source3/bin/.cvsignore b/source3/bin/.cvsignore index 5cad4ba406..f03ce48d2c 100644 --- a/source3/bin/.cvsignore +++ b/source3/bin/.cvsignore @@ -2,6 +2,7 @@ .dummy .libs debug2html +editreg locktest locktest2 make_printerdef @@ -36,6 +37,7 @@ smbtorture smbtree smbumount swat +t_stringoverflow talloctort tdbbackup testparm @@ -44,4 +46,3 @@ vfstest wbinfo winbindd wrepld -editreg -- cgit From a084f06fe33eb9903489763bc34c7092080a0a5e Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 18 Mar 2003 07:09:23 +0000 Subject: Split "clobber" function and variables into its own file before it grows too much larger. (This used to be commit 4bbddbfc6a97ebb11e299aa7bd07ebebeab42c65) --- source3/Makefile.in | 2 +- source3/lib/clobber.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ source3/lib/util_str.c | 39 -------------------------------- 3 files changed, 61 insertions(+), 40 deletions(-) create mode 100644 source3/lib/clobber.c diff --git a/source3/Makefile.in b/source3/Makefile.in index a2290e8f57..88e616de47 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -154,7 +154,7 @@ LIB_OBJ = lib/charcnv.o lib/debug.o lib/fault.o \ lib/util_getent.o lib/util_pw.o lib/access.o lib/smbrun.o \ lib/bitmap.o lib/crc32.o lib/snprintf.o lib/dprintf.o \ lib/xfile.o lib/wins_srv.o \ - lib/util_str.o lib/util_sid.o lib/util_uuid.o \ + lib/util_str.o lib/clobber.o lib/util_sid.o lib/util_uuid.o \ lib/util_unistr.o lib/util_file.o lib/data_blob.o \ lib/util.o lib/util_sock.o lib/util_sec.o \ lib/talloc.o lib/hash.o lib/substitute.o lib/fsusage.o \ diff --git a/source3/lib/clobber.c b/source3/lib/clobber.c new file mode 100644 index 0000000000..fb3a0dc281 --- /dev/null +++ b/source3/lib/clobber.c @@ -0,0 +1,60 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Martin Pool 2003 + Copyright (C) Andrew Bartlett 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +#ifdef DEVELOPER +const char *global_clobber_region_function; +unsigned int global_clobber_region_line; +#endif + +/** + * In developer builds, clobber a region of memory. + * + * If we think a string buffer is longer than it really is, this ought + * to make the failure obvious, by segfaulting (if in the heap) or by + * killing the return address (on the stack), or by trapping under a + * memory debugger. + * + * This is meant to catch possible string overflows, even if the + * actual string copied is not big enough to cause an overflow. + * + * In addition, under Valgrind the buffer is marked as uninitialized. + **/ +void clobber_region(const char *fn, unsigned int line, char *dest, size_t len) +{ +#ifdef DEVELOPER + global_clobber_region_function = fn; + global_clobber_region_line = line; + + /* F1 is odd and 0xf1f1f1f1 shouldn't be a valid pointer */ + memset(dest, 0xF1, len); +#ifdef VALGRIND + /* Even though we just wrote to this, from the application's + * point of view it is not initialized. + * + * (This is not redundant with the clobbering above. The + * marking might not actually take effect if we're not running + * under valgrind.) */ + VALGRIND_MAKE_WRITABLE(dest, len); +#endif /* VALGRIND */ +#endif /* DEVELOPER */ +} diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 3836d42872..8ef4ddade6 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -21,11 +21,6 @@ #include "includes.h" -#ifdef DEVELOPER -const char *global_clobber_region_function; -unsigned int global_clobber_region_line; -#endif - /** * Get the next token from a string, return False if none found. * Handles double-quotes. @@ -414,40 +409,6 @@ size_t count_chars(const char *s,char c) return(count); } -/** - * In developer builds, clobber a region of memory. - * - * If we think a string buffer is longer than it really is, this ought - * to make the failure obvious, by segfaulting (if in the heap) or by - * killing the return address (on the stack), or by trapping under a - * memory debugger. - * - * This is meant to catch possible string overflows, even if the - * actual string copied is not big enough to cause an overflow. - * - * In addition, under Valgrind the buffer is marked as uninitialized. - **/ -void clobber_region(const char *fn, unsigned int line, char *dest, size_t len) -{ -#ifdef DEVELOPER - global_clobber_region_function = fn; - global_clobber_region_line = line; - - /* F1 is odd and 0xf1f1f1f1 shouldn't be a valid pointer */ - memset(dest, 0xF1, len); -#ifdef VALGRIND - /* Even though we just wrote to this, from the application's - * point of view it is not initialized. - * - * (This is not redundant with the clobbering above. The - * marking might not actually take effect if we're not running - * under valgrind.) */ - VALGRIND_MAKE_WRITABLE(dest, len); -#endif /* VALGRIND */ -#endif /* DEVELOPER */ -} - - /** Safe string copy into a known length string. maxlength does not include the terminating zero. -- cgit