summaryrefslogtreecommitdiffstats
path: root/source4/librpc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source4/librpc/dcerpc.pc.in11
-rw-r--r--source4/librpc/dcerpc_samr.pc.in11
-rw-r--r--source4/librpc/gen_ndr/README4
-rw-r--r--source4/librpc/idl/IDL_LICENSE.txt9
-rw-r--r--source4/librpc/idl/irpc.idl221
-rw-r--r--source4/librpc/idl/ntp_signd.idl40
-rw-r--r--source4/librpc/idl/opendb.idl46
-rw-r--r--source4/librpc/idl/sasl_helpers.idl20
-rw-r--r--source4/librpc/idl/winbind.idl35
-rw-r--r--source4/librpc/idl/winsif.idl342
-rw-r--r--source4/librpc/idl/winsrepl.idl174
-rw-r--r--source4/librpc/idl/wscript_build17
-rw-r--r--source4/librpc/ndr/py_auth.c76
-rw-r--r--source4/librpc/ndr/py_lsa.c77
-rw-r--r--source4/librpc/ndr/py_misc.c165
-rw-r--r--source4/librpc/ndr/py_security.c743
-rw-r--r--source4/librpc/ndr/py_xattr.c100
-rw-r--r--source4/librpc/rpc/dcerpc.c2630
-rw-r--r--source4/librpc/rpc/dcerpc.h264
-rw-r--r--source4/librpc/rpc/dcerpc.py18
-rw-r--r--source4/librpc/rpc/dcerpc_auth.c556
-rw-r--r--source4/librpc/rpc/dcerpc_connect.c1252
-rw-r--r--source4/librpc/rpc/dcerpc_roh.c914
-rw-r--r--source4/librpc/rpc/dcerpc_roh.h111
-rw-r--r--source4/librpc/rpc/dcerpc_roh_channel_in.c303
-rw-r--r--source4/librpc/rpc/dcerpc_roh_channel_out.c582
-rw-r--r--source4/librpc/rpc/dcerpc_schannel.c623
-rw-r--r--source4/librpc/rpc/dcerpc_secondary.c431
-rw-r--r--source4/librpc/rpc/dcerpc_smb.c310
-rw-r--r--source4/librpc/rpc/dcerpc_sock.c499
-rw-r--r--source4/librpc/rpc/dcerpc_util.c811
-rw-r--r--source4/librpc/rpc/pyrpc.c651
-rw-r--r--source4/librpc/rpc/pyrpc.h60
-rw-r--r--source4/librpc/rpc/pyrpc_util.c555
-rw-r--r--source4/librpc/rpc/pyrpc_util.h74
-rwxr-xr-xsource4/librpc/scripts/build_idl.sh37
-rw-r--r--source4/librpc/tests/binding_string.c327
-rw-r--r--source4/librpc/tests/claims_CLAIMS_SET_NDR.dat23
-rw-r--r--source4/librpc/tests/claims_CLAIMS_SET_NDR.txt55
-rw-r--r--source4/librpc/tests/compressed_claims.txt96
-rw-r--r--source4/librpc/tests/dns-decode_dns_name_packet-hex.dat7
-rw-r--r--source4/librpc/tests/dns-decode_dns_name_packet-hex.txt35
-rw-r--r--source4/librpc/tests/dnsp-DnssrvRpcRecord.txt32
-rw-r--r--source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.b64.txt1
-rw-r--r--source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.txt785
-rw-r--r--source4/librpc/tests/fuzzed_drsuapi_DsGetNCChanges.txt76
-rw-r--r--source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.b64.txt1
-rw-r--r--source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.txt60
-rwxr-xr-xsource4/librpc/tests/fuzzed_drsuapi_DsaAddressListItem_V1-in.b64.txt1
-rw-r--r--source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.b64.txt1
-rw-r--r--source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.txt167
-rw-r--r--source4/librpc/tests/fuzzed_ntlmssp-CHALLENGE_MESSAGE.txt89
-rw-r--r--source4/librpc/tests/gmsa_MANAGEDPASSWORD_BLOB.txt28
-rw-r--r--source4/librpc/tests/krb5pac-PAC_DATA.datbin0 -> 768 bytes
-rw-r--r--source4/librpc/tests/krb5pac_upn_dns_info_ex.b64.txt1
-rw-r--r--source4/librpc/tests/krb5pac_upn_dns_info_ex.txt281
-rw-r--r--source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.b64.txt1
-rw-r--r--source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.txt282
-rw-r--r--source4/librpc/tests/misc-GUID.dat1
-rw-r--r--source4/librpc/tests/samr-CreateUser-in.datbin0 -> 60 bytes
-rw-r--r--source4/librpc/tests/samr-CreateUser-out.datbin0 -> 32 bytes
-rw-r--r--source4/librpc/tests/uncompressed_claims.txt66
-rw-r--r--source4/librpc/tests/xattr_NTACL.dat20
-rw-r--r--source4/librpc/tests/xattr_NTACL.txt107
-rw-r--r--source4/librpc/wscript_build554
65 files changed, 15869 insertions, 0 deletions
diff --git a/source4/librpc/dcerpc.pc.in b/source4/librpc/dcerpc.pc.in
new file mode 100644
index 0000000..53e83d9
--- /dev/null
+++ b/source4/librpc/dcerpc.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: dcerpc
+Description: DCE/RPC client library
+Requires: ndr samba-util
+Version: @PACKAGE_VERSION@
+Libs: @LIB_RPATH@ -L${libdir} -ldcerpc -ldcerpc-binding
+Cflags: -I${includedir} -DHAVE_IMMEDIATE_STRUCTURES=1
diff --git a/source4/librpc/dcerpc_samr.pc.in b/source4/librpc/dcerpc_samr.pc.in
new file mode 100644
index 0000000..cd2d74a
--- /dev/null
+++ b/source4/librpc/dcerpc_samr.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: dcerpc_samr
+Description: DCE/RPC client library - SAMR
+Requires: dcerpc ndr ndr_standard
+Version: @PACKAGE_VERSION@
+Libs: @LIB_RPATH@ -L${libdir} -ldcerpc-samr
+Cflags: -I${includedir} -DHAVE_IMMEDIATE_STRUCTURES=1
diff --git a/source4/librpc/gen_ndr/README b/source4/librpc/gen_ndr/README
new file mode 100644
index 0000000..5ccb89d
--- /dev/null
+++ b/source4/librpc/gen_ndr/README
@@ -0,0 +1,4 @@
+This contains the generated files from PIDL for the IDL files in ../idl/*.idl
+
+DO NOT REMOVE THIS FILE. The waf 1.5 build relies on this directory
+existing in the source tree.
diff --git a/source4/librpc/idl/IDL_LICENSE.txt b/source4/librpc/idl/IDL_LICENSE.txt
new file mode 100644
index 0000000..01ae670
--- /dev/null
+++ b/source4/librpc/idl/IDL_LICENSE.txt
@@ -0,0 +1,9 @@
+The IDL files in this directory are made available by the Samba Team
+under the following license:
+
+ Permission to use, copy, modify, and distribute these interface
+ definitions for any purpose is hereby granted without fee.
+
+ This work 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.
diff --git a/source4/librpc/idl/irpc.idl b/source4/librpc/idl/irpc.idl
new file mode 100644
index 0000000..b4517da
--- /dev/null
+++ b/source4/librpc/idl/irpc.idl
@@ -0,0 +1,221 @@
+#include "idl_types.h"
+
+import "misc.idl", "security.idl", "nbt.idl", "netlogon.idl", "server_id.idl";
+
+/*
+ definitions for irpc primitives
+*/
+[ uuid("e770c620-0b06-4b5e-8d87-a26e20f28340"),
+ version(1.0),
+ pointer_default(unique)
+] interface irpc
+{
+ typedef bitmap {
+ IRPC_FLAG_REPLY = 0x0001
+ } irpc_flags;
+
+ typedef struct {
+ security_token *token;
+ } irpc_creds;
+
+ typedef [public] struct {
+ GUID uuid;
+ uint32 if_version;
+ uint32 callnum;
+ uint32 callid;
+ irpc_flags flags;
+ NTSTATUS status;
+ [subcontext(4)] irpc_creds creds;
+ [flag(NDR_ALIGN8)] DATA_BLOB _pad;
+ } irpc_header;
+
+ typedef [public] struct {
+ utf8string name;
+ uint32 count;
+ [size_is(count)] server_id ids[*];
+ } irpc_name_record;
+
+ typedef [public] struct {
+ [size_is(num_records)] irpc_name_record *names[*];
+ uint32 num_records;
+ } irpc_name_records;
+
+ /******************************************************
+ uptime call - supported by all messaging servers
+ *******************************************************/
+ void irpc_uptime([out,ref] NTTIME *start_time);
+
+ /******************************************************
+ management calls for the nbt server
+ ******************************************************/
+ typedef [v1_enum] enum {
+ NBTD_INFO_STATISTICS
+ } nbtd_info_level;
+
+ typedef struct {
+ hyper total_received;
+ hyper total_sent;
+ hyper query_count;
+ hyper register_count;
+ hyper release_count;
+ } nbtd_statistics;
+
+ typedef [switch_type(nbtd_info_level)] union {
+ [case(NBTD_INFO_STATISTICS)] nbtd_statistics *stats;
+ } nbtd_info;
+
+ void nbtd_information(
+ [in] nbtd_info_level level,
+ [out,switch_is(level)] nbtd_info info
+ );
+
+ /* Send a GetDCName from the privileged port (owned by nbtd),
+ * and await a reply */
+
+ void nbtd_getdcname(
+ [in] astring domainname,
+ [in] astring ip_address,
+ [in] astring my_computername,
+ [in] astring my_accountname,
+ [in] uint32 account_control,
+ [in] dom_sid *domain_sid,
+ [out,unique] astring *dcname
+ );
+
+ typedef struct {
+ ipv4address addr;
+ } nbtd_proxy_wins_addr;
+
+ void nbtd_proxy_wins_challenge(
+ [in] nbt_name name,
+ [in,out] uint32 num_addrs,
+ [in,out] nbtd_proxy_wins_addr addrs[num_addrs]
+ );
+
+ void nbtd_proxy_wins_release_demand(
+ [in] nbt_name name,
+ [in] uint32 num_addrs,
+ [in] nbtd_proxy_wins_addr addrs[num_addrs]
+ );
+
+ /*
+ Generic Kerberos package call (on the NETLOGON pipe, as a SamLogon)
+
+ The normal use for this call is to check the PAC signature in the KDC
+
+ The KDC has the routines to check this, so it is easier to
+ proxy the request over by IRPC than set up the environment
+ */
+
+ void kdc_check_generic_kerberos(
+ [in] DATA_BLOB generic_request,
+ [out] DATA_BLOB generic_reply
+ );
+
+ /******************************************************
+ management calls for the smb server
+ ******************************************************/
+ typedef [v1_enum] enum {
+ SMBSRV_INFO_SESSIONS,
+ SMBSRV_INFO_TCONS
+ } smbsrv_info_level;
+
+ typedef struct {
+ hyper vuid;
+ astring account_name;
+ astring domain_name;
+ astring client_ip;
+ NTTIME connect_time;
+ NTTIME auth_time;
+ NTTIME last_use_time;
+ } smbsrv_session_info;
+
+ typedef struct {
+ uint32 num_sessions;
+ [size_is(num_sessions)] smbsrv_session_info *sessions;
+ } smbsrv_sessions;
+
+ typedef struct {
+ uint32 tid;
+ astring share_name;
+ astring client_ip;
+ NTTIME connect_time;
+ NTTIME last_use_time;
+ } smbsrv_tcon_info;
+
+ typedef struct {
+ uint32 num_tcons;
+ [size_is(num_tcons)] smbsrv_tcon_info *tcons;
+ } smbsrv_tcons;
+
+ typedef [switch_type(smbsrv_info_level)] union {
+ [case(SMBSRV_INFO_SESSIONS)] smbsrv_sessions sessions;
+ [case(SMBSRV_INFO_TCONS)] smbsrv_tcons tcons;
+ } smbsrv_info;
+
+ void smbsrv_information(
+ [in] smbsrv_info_level level,
+ [out,switch_is(level)] smbsrv_info info
+ );
+
+ /*
+ called when samba should shutdown
+ */
+ void samba_terminate(
+ [in] astring reason
+ );
+
+ /******************************************************
+ management calls for the drepl server
+ ******************************************************/
+ /**
+ * Force dreplsrv to fefresh internal cache.
+ * @param partition_dn Partition to refresh cache for.
+ * If empty/NULL, refresh all partitions.
+ */
+ WERROR dreplsrv_refresh();
+
+ /*
+ called when role transfer is requested via LDAP
+ */
+ typedef [v1_enum] enum {
+ DREPL_SCHEMA_MASTER,
+ DREPL_RID_MASTER,
+ DREPL_INFRASTRUCTURE_MASTER,
+ DREPL_NAMING_MASTER,
+ DREPL_PDC_MASTER
+ } drepl_role_master;
+
+ WERROR drepl_takeFSMORole(
+ [in] drepl_role_master role
+ );
+
+ /*
+ * message to tell the drepl server to initiate a REPL_SECRET
+ * replication of a users secrets
+ */
+ void drepl_trigger_repl_secret(
+ [in] astring user_dn
+ );
+
+ /*
+ message to do RODC DNS updates via the dnsupdate task
+ */
+ NTSTATUS dnsupdate_RODC(
+ [in,unique] dom_sid *dom_sid,
+ [in,unique] [string,charset(UTF16)] uint16 *site_name,
+ [in] uint32 dns_ttl,
+ [in,out,ref] NL_DNS_NAME_INFO_ARRAY *dns_names
+ );
+
+ /******************************************************
+ * Management calls for the dns server
+ ******************************************************/
+ /**
+ * Force internal DNS server to reload the DNS zones.
+ *
+ * Called when zones are added or deleted through RPC
+ * or replicated by DRS.
+ */
+ NTSTATUS dnssrv_reload_dns_zones();
+}
diff --git a/source4/librpc/idl/ntp_signd.idl b/source4/librpc/idl/ntp_signd.idl
new file mode 100644
index 0000000..c081ca0
--- /dev/null
+++ b/source4/librpc/idl/ntp_signd.idl
@@ -0,0 +1,40 @@
+/*
+ NTP signing IRPC interface
+*/
+
+#include "idl_types.h"
+
+[
+ uuid("0da00951-5b6c-4488-9a89-750cac70920c"),
+ version(1.0),
+ pointer_default(unique)
+]
+interface ntp_signd
+{
+
+ const int NTP_SIGND_PROTOCOL_VERSION_0 = 0;
+
+ typedef [v1_enum] enum {
+ SIGN_TO_CLIENT = 0,
+ ASK_SERVER_TO_SIGN = 1,
+ CHECK_SERVER_SIGNATURE = 2,
+ SIGNING_SUCCESS = 3,
+ SIGNING_FAILURE = 4
+ } ntp_signd_op;
+
+ typedef [flag(NDR_BIG_ENDIAN),public] struct {
+ [value(NTP_SIGND_PROTOCOL_VERSION_0)] uint32 version;
+ ntp_signd_op op;
+ uint16 packet_id;
+ [flag(NDR_LITTLE_ENDIAN)] uint32 key_id;
+ [flag(NDR_REMAINING)] DATA_BLOB packet_to_sign;
+
+ } sign_request;
+
+ typedef [flag(NDR_BIG_ENDIAN),public] struct samba_key_out {
+ [value(NTP_SIGND_PROTOCOL_VERSION_0)] uint32 version;
+ ntp_signd_op op;
+ uint32 packet_id;
+ [flag(NDR_REMAINING)] DATA_BLOB signed_packet;
+ } signed_reply;
+}
diff --git a/source4/librpc/idl/opendb.idl b/source4/librpc/idl/opendb.idl
new file mode 100644
index 0000000..b769929
--- /dev/null
+++ b/source4/librpc/idl/opendb.idl
@@ -0,0 +1,46 @@
+#include "idl_types.h"
+
+/*
+ IDL structures for opendb code
+
+ this defines the structures used in the opendb database code, in
+ ntvfs/common/opendb.c
+*/
+
+import "server_id.idl";
+
+[
+ pointer_default(unique)
+]
+interface opendb
+{
+ typedef struct {
+ server_id server;
+ uint32 stream_id;
+ uint32 share_access;
+ uint32 access_mask;
+ pointer file_handle;
+ pointer fd;
+ /* we need a per-entry delete on close, as well as a per-file
+ one, to cope with strange semantics on open */
+ boolean8 delete_on_close;
+ boolean8 allow_level_II_oplock;
+ uint32 oplock_level;
+ } opendb_entry;
+
+ typedef struct {
+ server_id server;
+ pointer notify_ptr;
+ } opendb_pending;
+
+ typedef [public] struct {
+ boolean8 delete_on_close;
+ NTTIME open_write_time;
+ NTTIME changed_write_time;
+ utf8string path;
+ uint32 num_entries;
+ opendb_entry entries[num_entries];
+ uint32 num_pending;
+ opendb_pending pending[num_pending];
+ } opendb_file;
+}
diff --git a/source4/librpc/idl/sasl_helpers.idl b/source4/librpc/idl/sasl_helpers.idl
new file mode 100644
index 0000000..5f5d521
--- /dev/null
+++ b/source4/librpc/idl/sasl_helpers.idl
@@ -0,0 +1,20 @@
+#include "idl_types.h"
+
+[
+ uuid("7512b2f4-5f4f-11e4-bbe6-3c970e8d8226"),
+ version(1.0),
+ pointer_default(unique),
+ helpstring("SASL helpers")
+]
+interface sasl_helpers {
+ typedef [public,flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX)] struct {
+ [value(strlen_m(authid))] uint16 authid_length;
+ [charset(UTF8)] uint8 authid[authid_length];
+ uint16 passwd_length;
+ uint8 passwd[passwd_length];
+ [value(strlen_m(service))] uint16 service_length;
+ [charset(UTF8)] uint8 service[service_length];
+ [value(strlen_m(realm))] uint16 realm_length;
+ [charset(UTF8)] uint8 realm[realm_length];
+ } saslauthdRequest;
+}
diff --git a/source4/librpc/idl/winbind.idl b/source4/librpc/idl/winbind.idl
new file mode 100644
index 0000000..f79eba7
--- /dev/null
+++ b/source4/librpc/idl/winbind.idl
@@ -0,0 +1,35 @@
+/*
+ winbind IRPC interface
+*/
+
+#include "idl_types.h"
+
+import "netlogon.idl";
+
+[
+ uuid("b875118e-47a3-4210-b5f7-c240cce656b2"),
+ version(1.0),
+ pointer_default(unique)
+]
+interface winbind
+{
+ typedef [switch_type(uint16)] union netr_LogonLevel netr_LogonLevel;
+ typedef [switch_type(uint16)] union netr_Validation netr_Validation;
+
+ /*
+ * do a netr_LogonSamLogon() against the right DC
+ */
+ NTSTATUS winbind_SamLogon(
+ [in] uint16 logon_level,
+ [in] [switch_is(logon_level)] netr_LogonLevel logon,
+ [in] uint16 validation_level,
+ [out] [switch_is(validation_level)] netr_Validation validation,
+ [out] uint8 authoritative
+ );
+
+ NTSTATUS winbind_DsrUpdateReadOnlyServerDnsRecords(
+ [in,unique] [string,charset(UTF16)] uint16 *site_name,
+ [in] uint32 dns_ttl,
+ [in,out,ref] NL_DNS_NAME_INFO_ARRAY *dns_names
+ );
+}
diff --git a/source4/librpc/idl/winsif.idl b/source4/librpc/idl/winsif.idl
new file mode 100644
index 0000000..433e6bc
--- /dev/null
+++ b/source4/librpc/idl/winsif.idl
@@ -0,0 +1,342 @@
+#include "idl_types.h"
+
+import "nbt.idl";
+
+[
+ uuid("45f52c28-7f9f-101a-b52b-08002b2efabe"),
+ version(1.0),
+ helpstring("WINS Administration Interface1"),
+ helper("../libcli/nbt/libnbt.h"),
+ pointer_default(unique)
+] interface winsif
+{
+ /*****************/
+ /* Function 0x00 */
+ typedef struct {
+ uint8 type;
+ uint32 length;
+ ipv4address addr;
+ } winsif_Address;
+
+ typedef enum {
+ WINSIF_ACTION_INSERT = 0x0000,
+ WINSIF_ACTION_DELETE = 0x0001,
+ WINSIF_ACTION_RELEASE = 0x0002,
+ WINSIF_ACTION_MODIFY = 0x0003,
+ WINSIF_ACTION_QUERY = 0x0004
+ } winsif_Action;
+
+ typedef enum {
+ WINSIF_RECORD_UNIQUE_NAME = 0x0000,
+ WINSIF_RECORD_GROUP_NAME = 0x0001,
+ WINSIF_RECORD_SGROUP_NAME = 0x0002,
+ WINSIF_RECORD_MHOMED_NAME = 0x0003
+ } winsif_RecordType;
+
+ typedef [enum8bit] enum {
+ WINSIF_NODE_B = 0x00,
+ WINSIF_NODE_P = 0x01,
+ WINSIF_NODE_H = 0x03
+ } winsif_NodeType;
+
+ typedef [v1_enum] enum {
+ WINSIF_RECORD_ACTIVE = 0x00000000,
+ WINSIF_RECORD_RELEASED = 0x00000001,
+ WINSIF_RECORD_TOMBSTONE = 0x00000002,
+ WINSIF_RECORD_DELETED = 0x00000003
+ } winsif_RecordState;
+
+ typedef struct {
+ winsif_Action cmd;
+ wrepl_nbt_name *name;
+ [value(name?16:0)] uint32 name_len;
+ winsif_RecordType record_type;
+ uint32 num_of_addresses;
+ [size_is(num_of_addresses)] winsif_Address *addresses;
+ winsif_Address address;
+ hyper version_number;
+ winsif_NodeType node_type;
+ ipv4address owner_address;
+ winsif_RecordState record_state;
+ boolean32 is_static;
+ time_t expire_time;
+ } winsif_RecordAction;
+
+ WERROR winsif_WinsRecordAction(
+ [in,out,ref] winsif_RecordAction **record_action
+ );
+
+ /*****************/
+ /* Function 0x01 */
+ typedef struct {
+ winsif_Address address;
+ hyper version_number;
+ } winsif_AddressVersionMap;
+
+ typedef enum {
+ WINSIF_PRIORITY_NORMAL = 0x0000,
+ WINSIF_PRIORITY_HIGH = 0x0001
+ } winsif_PriorityClass;
+
+ typedef struct {
+ winsif_Address address;
+ uint32 num_replications;
+ uint32 num_communication_failures;
+ } winsif_ReplCounter;
+
+ typedef struct {
+ uint32 num_unique_registrations;
+ uint32 num_group_registrations;
+ uint32 num_queries;
+ uint32 num_successful_queries;
+ uint32 num_failed_queries;
+ uint32 num_unique_refreshes;
+ uint32 num_group_refreshes;
+ uint32 num_releases;
+ uint32 num_successful_releases;
+ uint32 num_failed_releases;
+ uint32 num_unique_conflicts;
+ uint32 num_group_conflicts;
+ } winsif_StatCounters;
+
+ typedef struct {
+ time_t wins_start_time;
+ time_t last_periodic_scavenging;
+ time_t last_triggered_scavenging;
+ time_t last_tombstone_scavenging;
+ time_t last_verification_scavenging;
+ time_t last_periodic_pull_replication;
+ time_t last_triggered_pull_replication;
+ time_t ignore_last_ntrepl;
+ time_t ignore_last_actrepl;
+ time_t last_init_db;
+ time_t counter_reset;
+ } winsif_StatTimeStamps;
+
+ typedef struct {
+ winsif_StatCounters counters;
+ winsif_StatTimeStamps time_stamps;
+ uint32 num_partners;
+ [size_is(num_partners)] winsif_ReplCounter *partners;
+ } winsif_Stat;
+
+ typedef struct {
+ uint32 num_owners;
+ winsif_AddressVersionMap address_version_maps[25];
+ hyper my_max_version_number;
+ uint32 refresh_interval;
+ uint32 tombstone_interval;
+ uint32 tombstone_timeout;
+ uint32 verify_interval;
+ winsif_PriorityClass prioritiy_class;
+ uint32 num_worker_threads;
+ winsif_Stat wstat;
+ } winsif_Results;
+
+ typedef enum {
+ WINSIF_STATUS_CMD_ADDRESS_VERSION_MAP = 0x0000,
+ WINSIF_STATUS_CMD_CONFIG = 0x0001,
+ WINSIF_STATUS_CMD_STAT = 0x0002,
+ WINSIF_STATUS_CMD_ALL_MAPS = 0x0003
+ } winsif_StatusCmd;
+
+ WERROR winsif_WinsStatus(
+ [in] winsif_StatusCmd cmd,
+ [in,out,ref] winsif_Results *results
+ );
+
+ /*****************/
+ /* Function 0x02 */
+ typedef enum {
+ WINSIF_TRIGGER_PULL = 0x0000,
+ WINSIF_TRIGGER_PUSH = 0x0001,
+ WINSIF_TRIGGER_PUSH_PROP= 0x0002
+ } winsif_TriggerType;
+
+ WERROR winsif_WinsTrigger(
+ [in,ref] winsif_Address *owner_address,
+ [in] winsif_TriggerType trigger_type
+ );
+
+ /*****************/
+ /* Function 0x03 */
+ WERROR winsif_WinsDoStaticInit(
+ [in,unique,string,charset(UTF16)] uint16 *data_file_path,
+ [in] boolean32 delete_file
+ );
+
+ /*****************/
+ /* Function 0x04 */
+ WERROR winsif_WinsDoScavenging();
+
+ /*****************/
+ /* Function 0x05 */
+ typedef struct {
+ uint32 buffer_size;
+ [size_is(num_records)] winsif_RecordAction *row;
+ uint32 num_records;
+ uint32 total_num_records;
+ } winsif_Records;
+
+ WERROR winsif_WinsGetDbRecs(
+ [in,unique] winsif_Address *owner_address,
+ [in] hyper min_version_number,
+ [in] hyper max_version_number,
+ [out,ref] winsif_Records *records
+ );
+
+ /*****************/
+ /* Function 0x06 */
+ WERROR winsif_WinsTerm(
+ [in] uint16 abrupt_termination
+ );
+
+ /*****************/
+ /* Function 0x07 */
+ WERROR winsif_WinsBackup(
+ [in,ref,string,charset(DOS)] uint8 *backup_path,
+ [in] uint16 incremental
+ );
+
+ /*****************/
+ /* Function 0x08 */
+ WERROR winsif_WinsDelDbRecs(
+ [in,ref] winsif_Address *owner_address,
+ [in] hyper min_version_number,
+ [in] hyper max_version_number
+ );
+
+ /*****************/
+ /* Function 0x09 */
+ WERROR winsif_WinsPullRange(
+ [in,ref] winsif_Address *server_address,
+ [in,ref] winsif_Address *owner_address,
+ [in] hyper min_version_number,
+ [in] hyper max_version_number
+ );
+
+ /*****************/
+ /* Function 0x0A */
+ WERROR winsif_WinsSetPriorityClass(
+ [in] winsif_PriorityClass prioritiy_class
+ );
+
+ /*****************/
+ /* Function 0x0B */
+ WERROR winsif_WinsResetCounters();
+
+ /*****************/
+ /* Function 0x0C */
+ WERROR winsif_WinsWorkerThreadUpdate(
+ [in] uint32 num_of_threads
+ );
+
+ /*****************/
+ /* Function 0x0D */
+ WERROR winsif_WinsGetNameAndAdd(
+ [out,ref] winsif_Address *server_address,
+ /*
+ * TODO: fix pidl to handles this completely correct...
+ * currently it gives a warning about a missing pointer.
+ */
+ [out,ref,string,charset(DOS),size_is(80)] uint8 *unc_name
+ );
+
+ /*****************/
+ /* Function 0x0E */
+ typedef struct {
+ uint32 name_len;
+ [string,charset(DOS)] uint8 *name;
+ } winsif_BrowserInfo;
+
+ typedef struct {
+ uint32 num_entries;
+ [size_is(num_entries)] winsif_BrowserInfo *info;
+ } winsif_BrowserNames;
+
+ WERROR winsif_WinsGetBrowserNames_Old(
+ [out,ref] winsif_BrowserNames *names
+ );
+
+ /*****************/
+ /* Function 0x0F */
+ WERROR winsif_WinsDeleteWins(
+ [in,ref] winsif_Address *owner_address
+ );
+
+ /*****************/
+ /* Function 0x10 */
+ WERROR winsif_WinsSetFlags(
+ [in] uint32 flags
+ );
+
+ /*****************/
+ /* Function 0x11 */
+ typedef struct {
+ boolean32 tcp_ip;
+ [string,charset(DOS)] uint8 *server_address;
+ [string,charset(DOS)] uint8 *pipe_name;
+ } winsif_BindData;
+
+ WERROR winsif_WinsGetBrowserNames(
+ [in,ref] winsif_BindData *server_handle,
+ [out,ref] winsif_BrowserNames *names
+ );
+
+ /*****************/
+ /* Function 0x12 */
+ WERROR winsif_WinsGetDbRecsByName(
+ [in,unique] winsif_Address *owner_address,
+ [in] boolean32 search_backward,
+ [in,unique] wrepl_nbt_name *name,
+ [in,value(name?16:0),range(0,16)] uint32 name_len,
+ [in] uint32 num_records_desired,
+ [in] boolean32 only_statics,
+ [out,ref] winsif_Records *records
+ );
+
+ /*****************/
+ /* Function 0x13 */
+ typedef struct {
+ uint32 num_owners;
+ [size_is(num_owners)] winsif_AddressVersionMap *address_version_maps;
+ hyper my_max_version_number;
+ uint32 refresh_interval;
+ uint32 tombstone_interval;
+ uint32 tombstone_timeout;
+ uint32 verify_interval;
+ winsif_PriorityClass prioritiy_class;
+ uint32 num_worker_threads;
+ winsif_Stat wstat;
+ } winsif_ResultsNew;
+
+ WERROR winsif_WinsStatusNew(
+ [in] winsif_StatusCmd cmd,
+ [out,ref] winsif_ResultsNew *results
+ );
+
+ /*****************/
+ /* Function 0x14 */
+ WERROR winsif_WinsStatusWHdl(
+ [in,ref] winsif_BindData *server_handle,
+ [in] winsif_StatusCmd cmd,
+ [in,out,ref] winsif_ResultsNew *results
+ );
+
+ /*****************/
+ /* Function 0x15 */
+ typedef enum {
+ WINSIF_SCAVENGING_GENERAL = 0x0000,
+ WINSIF_SCAVENGING_VERIFY = 0x0001
+ } winsif_ScavengingOpcode;
+
+ typedef struct {
+ winsif_ScavengingOpcode opcode;
+ uint32 age;
+ boolean32 force;
+ } winsif_ScavengingRequest;
+
+ WERROR winsif_WinsDoScanvengingNew(
+ [in,ref] winsif_ScavengingRequest *request
+ );
+}
diff --git a/source4/librpc/idl/winsrepl.idl b/source4/librpc/idl/winsrepl.idl
new file mode 100644
index 0000000..4ef2e8e
--- /dev/null
+++ b/source4/librpc/idl/winsrepl.idl
@@ -0,0 +1,174 @@
+#include "idl_types.h"
+
+/*
+ IDL structures for WINS replication protocol (port 42)
+
+ Note that WINS replication is not traditionally encoded using
+ IDL/NDR
+
+ Written by Andrew Tridgell <tridge@osdl.org>
+*/
+
+import "nbt.idl";
+
+[
+ uuid("915f5653-bac1-431c-97ee-9ffb34526921"),
+ helpstring("WINS Replication PDUs"),
+ helper("../libcli/nbt/libnbt.h")
+] interface winsrepl
+{
+ const int WINS_REPLICATION_PORT = 42;
+
+ typedef [flag(NDR_BIG_ENDIAN)] struct {
+ ipv4address owner;
+ ipv4address ip;
+ } wrepl_ip;
+
+ typedef [flag(NDR_LITTLE_ENDIAN)] struct {
+ uint32 num_ips;
+ wrepl_ip ips[num_ips];
+ } wrepl_address_list;
+
+ typedef [nodiscriminant] union {
+ [case(0)] ipv4address ip;
+ [case(2)] wrepl_address_list addresses;
+ } wrepl_addresses;
+
+ typedef [enum8bit] enum {
+ WREPL_TYPE_UNIQUE = 0x0,
+ WREPL_TYPE_GROUP = 0x1,
+ WREPL_TYPE_SGROUP = 0x2,
+ WREPL_TYPE_MHOMED = 0x3
+ } wrepl_name_type;
+
+ typedef [enum8bit] enum {
+ WREPL_STATE_ACTIVE = 0x0,
+ WREPL_STATE_RELEASED = 0x1,
+ WREPL_STATE_TOMBSTONE = 0x2,
+ WREPL_STATE_RESERVED = 0x3
+ } wrepl_name_state;
+
+ typedef [enum8bit] enum {
+ WREPL_NODE_B = 0x0,
+ WREPL_NODE_P = 0x1,
+ WREPL_NODE_M = 0x2,
+ WREPL_NODE_H = 0x3
+ } wrepl_name_node;
+
+ typedef [bitmap32bit] bitmap {
+ WREPL_FLAGS_RECORD_TYPE = 0x00000003,
+ WREPL_FLAGS_RECORD_STATE = 0x0000000C,
+ WREPL_FLAGS_REGISTERED_LOCAL = 0x00000010,
+ WREPL_FLAGS_NODE_TYPE = 0x00000060,
+ WREPL_FLAGS_IS_STATIC = 0x00000080
+ } wrepl_flags;
+
+ typedef [v1_enum] enum {
+ WREPL_GROUP_FLAG_NO_GROUP = 0x00000000,
+ WREPL_GROUP_FLAG_IS_GROUP = 0x00000001
+ } wrepl_group_flag;
+
+#define WREPL_IS_GROUP(flags) (\
+ ((((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_GROUP)|| \
+ (((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_SGROUP))\
+ ? WREPL_GROUP_FLAG_IS_GROUP : WREPL_GROUP_FLAG_NO_GROUP)
+
+ typedef struct {
+ wrepl_nbt_name name;
+ wrepl_flags flags;
+ [flag(NDR_LITTLE_ENDIAN),value(WREPL_IS_GROUP(flags))] wrepl_group_flag is_group;
+ udlongr id;
+ [switch_is(flags & 2)] wrepl_addresses addresses;
+ ipv4address unknown;
+ } wrepl_wins_name;
+
+ typedef struct {
+ uint32 num_names;
+ wrepl_wins_name names[num_names];
+ } wrepl_send_reply;
+
+ typedef struct {
+ ipv4address address;
+ udlongr max_version;
+ udlongr min_version;
+ uint32 type;
+ } wrepl_wins_owner;
+
+ typedef struct {
+ uint32 partner_count;
+ wrepl_wins_owner partners[partner_count];
+ ipv4address initiator;
+ } wrepl_table;
+
+ typedef [v1_enum] enum {
+ WREPL_REPL_TABLE_QUERY = 0,
+ WREPL_REPL_TABLE_REPLY = 1,
+ WREPL_REPL_SEND_REQUEST = 2,
+ WREPL_REPL_SEND_REPLY = 3,
+ WREPL_REPL_UPDATE = 4,
+ WREPL_REPL_UPDATE2 = 5,
+ WREPL_REPL_INFORM = 8,
+ WREPL_REPL_INFORM2 = 9
+ } wrepl_replication_cmd;
+
+ typedef [nodiscriminant] union {
+ [case(WREPL_REPL_TABLE_QUERY)] ;
+ [case(WREPL_REPL_TABLE_REPLY)] wrepl_table table;
+ [case(WREPL_REPL_SEND_REQUEST)] wrepl_wins_owner owner;
+ [case(WREPL_REPL_SEND_REPLY)] wrepl_send_reply reply;
+ [case(WREPL_REPL_UPDATE)] wrepl_table table;
+ [case(WREPL_REPL_UPDATE2)] wrepl_table table;
+ [case(WREPL_REPL_INFORM)] wrepl_table table;
+ [case(WREPL_REPL_INFORM2)] wrepl_table table;
+ } wrepl_replication_info;
+
+ typedef struct {
+ wrepl_replication_cmd command;
+ [switch_is(command)] wrepl_replication_info info;
+ } wrepl_replication;
+
+ typedef struct {
+ uint32 assoc_ctx;
+ uint16 minor_version;
+ uint16 major_version;
+ } wrepl_start;
+
+ typedef struct {
+ uint32 reason;
+ } wrepl_stop;
+
+ typedef [v1_enum] enum {
+ WREPL_START_ASSOCIATION = 0,
+ WREPL_START_ASSOCIATION_REPLY = 1,
+ WREPL_STOP_ASSOCIATION = 2,
+ WREPL_REPLICATION = 3
+ } wrepl_mess_type;
+
+ typedef [nodiscriminant] union {
+ [case(WREPL_START_ASSOCIATION)] wrepl_start start;
+ [case(WREPL_START_ASSOCIATION_REPLY)] wrepl_start start_reply;
+ [case(WREPL_STOP_ASSOCIATION)] wrepl_stop stop;
+ [case(WREPL_REPLICATION)] wrepl_replication replication;
+ } wrepl_message;
+
+ /*
+ the opcode appears to be a bitfield, but as far as I can tell
+ you must always set the following bits. Additional bits don't
+ seem to matter. Very strange.
+ */
+ const int WREPL_OPCODE_BITS = 0x7800;
+
+
+ typedef [gensize,flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
+ uint32 opcode;
+ uint32 assoc_ctx;
+ wrepl_mess_type mess_type;
+ [switch_is(mess_type)] wrepl_message message;
+ [flag(NDR_REMAINING)] DATA_BLOB padding;
+ } wrepl_packet;
+
+ typedef [flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
+ [value(ndr_size_wrepl_packet(&packet, ndr->flags))] uint32 size;
+ wrepl_packet packet;
+ } wrepl_wrap;
+}
diff --git a/source4/librpc/idl/wscript_build b/source4/librpc/idl/wscript_build
new file mode 100644
index 0000000..58555e6
--- /dev/null
+++ b/source4/librpc/idl/wscript_build
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+
+import os
+
+topinclude=os.path.join(bld.srcnode.abspath(), 'librpc/idl')
+
+bld.SAMBA_PIDL_LIST('PIDL',
+ source='''ntp_signd.idl
+ opendb.idl sasl_helpers.idl
+ winsif.idl winsrepl.idl''',
+ options="--includedir=%s --header --ndr-parser" % topinclude,
+ output_dir='../gen_ndr')
+
+bld.SAMBA_PIDL_LIST('PIDL',
+ source='''irpc.idl''',
+ options="--includedir=%s --header --ndr-parser --client --python" % topinclude,
+ output_dir='../gen_ndr')
diff --git a/source4/librpc/ndr/py_auth.c b/source4/librpc/ndr/py_auth.c
new file mode 100644
index 0000000..8d233b3
--- /dev/null
+++ b/source4/librpc/ndr/py_auth.c
@@ -0,0 +1,76 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2011
+ Copyright (C) Andrew Bartlett <abartlet@samba.org> 2011
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "lib/replace/system/python.h"
+#include "includes.h"
+#include "libcli/util/pyerrors.h"
+#include "pyauth.h"
+#include "auth/auth.h"
+#include "auth/credentials/pycredentials.h"
+#include "librpc/rpc/pyrpc_util.h"
+
+static void PyType_AddGetSet(PyTypeObject *type, PyGetSetDef *getset)
+{
+ PyObject *dict;
+ int i;
+ if (type->tp_dict == NULL)
+ type->tp_dict = PyDict_New();
+ dict = type->tp_dict;
+ for (i = 0; getset[i].name; i++) {
+ PyObject *descr;
+ descr = PyDescr_NewGetSet(type, &getset[i]);
+ PyDict_SetItemString(dict, getset[i].name,
+ descr);
+ Py_CLEAR(descr);
+ }
+}
+
+static PyObject *py_auth_session_get_credentials(PyObject *self, void *closure)
+{
+ struct auth_session_info *session = pytalloc_get_type(self, struct auth_session_info);
+ PyObject *py_credentials;
+ /* This is evil, as the credentials are not IDL structures */
+ py_credentials = py_return_ndr_struct("samba.credentials", "Credentials", session->credentials, session->credentials);
+ return py_credentials;
+}
+
+static int py_auth_session_set_credentials(PyObject *self, PyObject *value, void *closure)
+{
+ struct auth_session_info *session = pytalloc_get_type(self, struct auth_session_info);
+ session->credentials = talloc_reference(session, PyCredentials_AsCliCredentials(value));
+ return 0;
+}
+
+static PyGetSetDef py_auth_session_extra_getset[] = {
+ {
+ .name = discard_const_p(char, "credentials"),
+ .get = (getter)py_auth_session_get_credentials,
+ .set = (setter)py_auth_session_set_credentials,
+ },
+ { .name = NULL },
+};
+
+static void py_auth_session_info_patch(PyTypeObject *type)
+{
+ PyType_AddGetSet(type, py_auth_session_extra_getset);
+}
+
+#define PY_SESSION_INFO_PATCH py_auth_session_info_patch
+
diff --git a/source4/librpc/ndr/py_lsa.c b/source4/librpc/ndr/py_lsa.c
new file mode 100644
index 0000000..c5e221f
--- /dev/null
+++ b/source4/librpc/ndr/py_lsa.c
@@ -0,0 +1,77 @@
+/*
+ Unix SMB/CIFS implementation.
+ Samba utility functions
+
+ Copyright (C) Catalyst IT 2017
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+#include "lib/replace/system/python.h"
+#include "librpc/gen_ndr/lsa.h"
+
+static PyObject *py_lsa_String_str(PyObject *py_self)
+{
+ struct lsa_String *self = pytalloc_get_ptr(py_self);
+ PyObject *ret = NULL;
+ if (self->string == NULL) {
+ const char *empty = "";
+ ret = PyUnicode_FromString(empty);
+ } else {
+ ret = PyUnicode_FromString(self->string);
+ }
+ return ret;
+}
+
+static PyObject *py_lsa_String_repr(PyObject *py_self)
+{
+ struct lsa_String *self = pytalloc_get_ptr(py_self);
+ PyObject *ret = NULL;
+ if (self->string == NULL) {
+ const char *empty = "lsaString(None)";
+ ret = PyUnicode_FromString(empty);
+ } else {
+ ret = PyUnicode_FromFormat("lsaString('%s')", self->string);
+ }
+ return ret;
+}
+
+static int py_lsa_String_init(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ struct lsa_String *string = pytalloc_get_ptr(self);
+ const char *str = NULL;
+ const char *kwnames[] = { "str", NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", discard_const_p(char *, kwnames), &str))
+ return -1;
+
+ string->string = talloc_strdup(string, str);
+
+ if (str != NULL && string->string == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+
+ return 0;
+}
+
+
+static void py_lsa_String_patch(PyTypeObject *type)
+{
+ type->tp_init = py_lsa_String_init;
+ type->tp_str = py_lsa_String_str;
+ type->tp_repr = py_lsa_String_repr;
+}
+
+#define PY_STRING_PATCH py_lsa_String_patch
+
diff --git a/source4/librpc/ndr/py_misc.c b/source4/librpc/ndr/py_misc.c
new file mode 100644
index 0000000..16e2960
--- /dev/null
+++ b/source4/librpc/ndr/py_misc.c
@@ -0,0 +1,165 @@
+/*
+ Unix SMB/CIFS implementation.
+ Samba utility functions
+
+ Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+#include "lib/replace/system/python.h"
+#include "python/py3compat.h"
+#include "librpc/gen_ndr/misc.h"
+
+static PyObject *py_GUID_richcmp(PyObject *py_self, PyObject *py_other, int op)
+{
+ int ret;
+ struct GUID *self = pytalloc_get_ptr(py_self), *other;
+ other = pytalloc_get_ptr(py_other);
+ if (other == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+
+ ret = GUID_compare(self, other);
+
+ switch (op) {
+ case Py_EQ: if (ret == 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_NE: if (ret != 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_LT: if (ret < 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_GT: if (ret > 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_LE: if (ret <= 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_GE: if (ret >= 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ }
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+}
+
+static PyObject *py_GUID_str(PyObject *py_self)
+{
+ struct GUID *self = pytalloc_get_ptr(py_self);
+ struct GUID_txt_buf buf;
+ PyObject *ret = PyUnicode_FromString(GUID_buf_string(self, &buf));
+ return ret;
+}
+
+static PyObject *py_GUID_repr(PyObject *py_self)
+{
+ struct GUID *self = pytalloc_get_ptr(py_self);
+ struct GUID_txt_buf buf;
+ PyObject *ret = PyUnicode_FromFormat(
+ "GUID('%s')", GUID_buf_string(self, &buf));
+ return ret;
+}
+
+static int py_GUID_init(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ PyObject *str = NULL;
+ NTSTATUS status;
+ struct GUID *guid = pytalloc_get_ptr(self);
+ const char *kwnames[] = { "str", NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", discard_const_p(char *, kwnames), &str))
+ return -1;
+
+ if (str != NULL) {
+ DATA_BLOB guid_val;
+ Py_ssize_t _size;
+
+ if (PyUnicode_Check(str)) {
+ guid_val.data =
+ discard_const_p(uint8_t,
+ PyUnicode_AsUTF8AndSize(str, &_size));
+ } else if (PyBytes_Check(str)) {
+ guid_val.data =
+ discard_const_p(uint8_t,
+ PyBytes_AsString(str));
+ _size = PyBytes_Size(str);
+ } else {
+ PyErr_SetString(PyExc_TypeError,
+ "Expected a string or bytes argument to GUID()");
+ return -1;
+ }
+ guid_val.length = _size;
+ status = GUID_from_data_blob(&guid_val, guid);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static void py_GUID_patch(PyTypeObject *type)
+{
+ type->tp_init = py_GUID_init;
+ type->tp_str = py_GUID_str;
+ type->tp_repr = py_GUID_repr;
+ type->tp_richcompare = py_GUID_richcmp;
+}
+
+#define PY_GUID_PATCH py_GUID_patch
+
+static int py_policy_handle_init(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ char *str = NULL;
+ NTSTATUS status;
+ struct policy_handle *handle = pytalloc_get_ptr(self);
+ const char *kwnames[] = { "uuid", "type", NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|sI", discard_const_p(char *, kwnames), &str, &handle->handle_type))
+ return -1;
+
+ if (str != NULL) {
+ status = GUID_from_string(str, &handle->uuid);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static PyObject *py_policy_handle_repr(PyObject *py_self)
+{
+ struct policy_handle *self = pytalloc_get_ptr(py_self);
+ struct GUID_txt_buf buf;
+ PyObject *ret = PyUnicode_FromFormat(
+ "policy_handle(%d, '%s')",
+ self->handle_type,
+ GUID_buf_string(&self->uuid, &buf));
+ return ret;
+}
+
+static PyObject *py_policy_handle_str(PyObject *py_self)
+{
+ struct policy_handle *self = pytalloc_get_ptr(py_self);
+ struct GUID_txt_buf buf;
+ PyObject *ret = PyUnicode_FromFormat(
+ "%d, %s",
+ self->handle_type,
+ GUID_buf_string(&self->uuid, &buf));
+ return ret;
+}
+
+static void py_policy_handle_patch(PyTypeObject *type)
+{
+ type->tp_init = py_policy_handle_init;
+ type->tp_repr = py_policy_handle_repr;
+ type->tp_str = py_policy_handle_str;
+}
+
+#define PY_POLICY_HANDLE_PATCH py_policy_handle_patch
+
diff --git a/source4/librpc/ndr/py_security.c b/source4/librpc/ndr/py_security.c
new file mode 100644
index 0000000..581f06e
--- /dev/null
+++ b/source4/librpc/ndr/py_security.c
@@ -0,0 +1,743 @@
+/*
+ Unix SMB/CIFS implementation.
+ Samba utility functions
+
+ Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008-2010
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+#include "lib/replace/system/python.h"
+#include "gen_ndr/conditional_ace.h"
+#include "py3compat.h"
+#include "libcli/security/sddl.h"
+#include "libcli/security/security.h"
+
+
+/* Set up in py_mod_security_patch() */
+static PyObject *PyExc_SDDLValueError = NULL;
+
+
+static void PyType_AddMethods(PyTypeObject *type, PyMethodDef *methods)
+{
+ PyObject *dict;
+ int i;
+ if (type->tp_dict == NULL)
+ type->tp_dict = PyDict_New();
+ dict = type->tp_dict;
+ for (i = 0; methods[i].ml_name; i++) {
+ PyObject *descr;
+ if (methods[i].ml_flags & METH_CLASS)
+ descr = PyCFunction_New(&methods[i], (PyObject *)type);
+ else
+ descr = PyDescr_NewMethod(type, &methods[i]);
+ PyDict_SetItemString(dict, methods[i].ml_name,
+ descr);
+ Py_CLEAR(descr);
+ }
+}
+
+static PyObject *py_dom_sid_split(PyObject *py_self, PyObject *args)
+{
+ struct dom_sid *self = pytalloc_get_ptr(py_self);
+ struct dom_sid *domain_sid;
+ TALLOC_CTX *mem_ctx;
+ uint32_t rid;
+ NTSTATUS status;
+ PyObject *py_domain_sid;
+
+ mem_ctx = talloc_new(NULL);
+ if (mem_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ status = dom_sid_split_rid(mem_ctx, self, &domain_sid, &rid);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetString(PyExc_RuntimeError, "dom_sid_split_rid failed");
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ py_domain_sid = pytalloc_steal(&dom_sid_Type, domain_sid);
+ talloc_free(mem_ctx);
+ return Py_BuildValue("(OI)", py_domain_sid, rid);
+}
+
+static PyObject *py_dom_sid_richcmp(PyObject *py_self, PyObject *py_other, int op)
+{
+ struct dom_sid *self = pytalloc_get_ptr(py_self), *other;
+ int val;
+
+ other = pytalloc_get_ptr(py_other);
+ if (other == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+
+ val = dom_sid_compare(self, other);
+
+ switch (op) {
+ case Py_EQ: if (val == 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_NE: if (val != 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_LT: if (val < 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_GT: if (val > 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_LE: if (val <= 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ case Py_GE: if (val >= 0) Py_RETURN_TRUE; else Py_RETURN_FALSE;
+ }
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+}
+
+static PyObject *py_dom_sid_str(PyObject *py_self)
+{
+ struct dom_sid *self = pytalloc_get_ptr(py_self);
+ struct dom_sid_buf buf;
+ PyObject *ret = PyUnicode_FromString(dom_sid_str_buf(self, &buf));
+ return ret;
+}
+
+static PyObject *py_dom_sid_repr(PyObject *py_self)
+{
+ struct dom_sid *self = pytalloc_get_ptr(py_self);
+ struct dom_sid_buf buf;
+ PyObject *ret = PyUnicode_FromFormat(
+ "dom_sid('%s')", dom_sid_str_buf(self, &buf));
+ return ret;
+}
+
+static int py_dom_sid_init(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ char *str = NULL;
+ struct dom_sid *sid = pytalloc_get_ptr(self);
+ const char *kwnames[] = { "str", NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", discard_const_p(char *, kwnames), &str))
+ return -1;
+
+ if (str != NULL && !dom_sid_parse(str, sid)) {
+ PyErr_Format(PyExc_ValueError,
+ "Unable to parse string: '%s'", str);
+ return -1;
+ }
+
+ return 0;
+}
+
+static PyMethodDef py_dom_sid_extra_methods[] = {
+ { "split", (PyCFunction)py_dom_sid_split, METH_NOARGS,
+ "S.split() -> (domain_sid, rid)\n"
+ "Split a domain sid" },
+ {0}
+};
+
+
+static void py_dom_sid_patch(PyTypeObject *type)
+{
+ type->tp_init = py_dom_sid_init;
+ type->tp_str = py_dom_sid_str;
+ type->tp_repr = py_dom_sid_repr;
+ type->tp_richcompare = py_dom_sid_richcmp;
+ PyType_AddMethods(type, py_dom_sid_extra_methods);
+}
+
+#define PY_DOM_SID_PATCH py_dom_sid_patch
+
+static PyObject *py_descriptor_sacl_add(PyObject *self, PyObject *args)
+{
+ struct security_descriptor *desc = pytalloc_get_ptr(self);
+ NTSTATUS status;
+ struct security_ace *ace;
+ PyObject *py_ace;
+ Py_ssize_t idx = -1;
+
+ if (!PyArg_ParseTuple(args, "O|n", &py_ace, &idx))
+ return NULL;
+
+ ace = pytalloc_get_ptr(py_ace);
+ status = security_descriptor_sacl_insert(desc, ace, idx);
+ PyErr_NTSTATUS_IS_ERR_RAISE(status);
+ Py_RETURN_NONE;
+}
+
+static PyObject *py_descriptor_dacl_add(PyObject *self, PyObject *args)
+{
+ struct security_descriptor *desc = pytalloc_get_ptr(self);
+ NTSTATUS status;
+ struct security_ace *ace;
+ PyObject *py_ace;
+ Py_ssize_t idx = -1;
+
+ if (!PyArg_ParseTuple(args, "O|n", &py_ace, &idx))
+ return NULL;
+
+ ace = pytalloc_get_ptr(py_ace);
+
+ status = security_descriptor_dacl_insert(desc, ace, idx);
+ PyErr_NTSTATUS_IS_ERR_RAISE(status);
+ Py_RETURN_NONE;
+}
+
+static PyObject *py_descriptor_dacl_del(PyObject *self, PyObject *args)
+{
+ struct security_descriptor *desc = pytalloc_get_ptr(self);
+ NTSTATUS status;
+ struct dom_sid *sid;
+ PyObject *py_sid;
+
+ if (!PyArg_ParseTuple(args, "O", &py_sid))
+ return NULL;
+
+ sid = pytalloc_get_ptr(py_sid);
+ status = security_descriptor_dacl_del(desc, sid);
+ PyErr_NTSTATUS_IS_ERR_RAISE(status);
+ Py_RETURN_NONE;
+}
+
+static PyObject *py_descriptor_sacl_del(PyObject *self, PyObject *args)
+{
+ struct security_descriptor *desc = pytalloc_get_ptr(self);
+ NTSTATUS status;
+ struct dom_sid *sid;
+ PyObject *py_sid;
+
+ if (!PyArg_ParseTuple(args, "O", &py_sid))
+ return NULL;
+
+ sid = pytalloc_get_ptr(py_sid);
+ status = security_descriptor_sacl_del(desc, sid);
+ PyErr_NTSTATUS_IS_ERR_RAISE(status);
+ Py_RETURN_NONE;
+}
+
+static PyObject *py_descriptor_dacl_del_ace(PyObject *self, PyObject *args)
+{
+ struct security_descriptor *desc = pytalloc_get_ptr(self);
+ NTSTATUS status;
+ struct security_ace *ace = NULL;
+ PyObject *py_ace = Py_None;
+
+ if (!PyArg_ParseTuple(args, "O!", &security_ace_Type, &py_ace))
+ return NULL;
+
+ if (!PyObject_TypeCheck(py_ace, &security_ace_Type)) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected security.security_ace "
+ "for first argument to .dacl_del_ace");
+ return NULL;
+ }
+
+ ace = pytalloc_get_ptr(py_ace);
+ status = security_descriptor_dacl_del_ace(desc, ace);
+ PyErr_NTSTATUS_IS_ERR_RAISE(status);
+ Py_RETURN_NONE;
+}
+
+static PyObject *py_descriptor_sacl_del_ace(PyObject *self, PyObject *args)
+{
+ struct security_descriptor *desc = pytalloc_get_ptr(self);
+ NTSTATUS status;
+ struct security_ace *ace = NULL;
+ PyObject *py_ace = Py_None;
+
+ if (!PyArg_ParseTuple(args, "O!", &security_ace_Type, &py_ace))
+ return NULL;
+
+ if (!PyObject_TypeCheck(py_ace, &security_ace_Type)) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected security.security_ace "
+ "for first argument to .sacl_del_ace");
+ return NULL;
+ }
+
+ ace = pytalloc_get_ptr(py_ace);
+ status = security_descriptor_sacl_del_ace(desc, ace);
+ PyErr_NTSTATUS_IS_ERR_RAISE(status);
+ Py_RETURN_NONE;
+}
+
+static PyObject *py_descriptor_new(PyTypeObject *self, PyObject *args, PyObject *kwargs)
+{
+ return pytalloc_steal(self, security_descriptor_initialise(NULL));
+}
+
+static PyObject *py_descriptor_from_sddl(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ TALLOC_CTX *tmp_ctx = NULL;
+ static const char *kwnames[] = { "", "", "allow_device_in_sddl", NULL };
+ struct security_descriptor *secdesc;
+ char *sddl;
+ PyObject *py_sid;
+ int allow_device_in_sddl = 1;
+ struct dom_sid *sid;
+ const char *err_msg = NULL;
+ size_t err_msg_offset = 0;
+ enum ace_condition_flags ace_condition_flags = 0;
+
+ if (!PyArg_ParseTupleAndKeywords(args,
+ kwargs,
+ "sO!|$p",
+ discard_const_p(char *, kwnames),
+ &sddl,
+ &dom_sid_Type,
+ &py_sid,
+ &allow_device_in_sddl))
+ return NULL;
+
+ if (!PyObject_TypeCheck(py_sid, &dom_sid_Type)) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected security.dom_sid "
+ "for second argument to .from_sddl");
+ return NULL;
+ }
+
+ sid = pytalloc_get_ptr(py_sid);
+
+ if (allow_device_in_sddl) {
+ ace_condition_flags |= ACE_CONDITION_FLAG_ALLOW_DEVICE;
+ }
+
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ secdesc = sddl_decode_err_msg(tmp_ctx, sddl, sid,
+ ace_condition_flags,
+ &err_msg, &err_msg_offset);
+ if (secdesc == NULL) {
+ PyObject *exc = NULL;
+ if (err_msg == NULL) {
+ err_msg = "unknown error";
+ }
+ /*
+ * Some notes about this exception value:
+ *
+ * We don't want to add the offset first, so as not to
+ * confuse those who are used to the integer error
+ * code coming first.
+ *
+ * The errant sddl is added so that the exception can
+ * be caught some distance away from the call and we
+ * still know what the messages refer to.
+ */
+ exc = Py_BuildValue("(s, s, i, s)",
+ "Unable to parse SDDL",
+ err_msg,
+ err_msg_offset,
+ sddl);
+ if (exc == NULL) {
+ talloc_free(tmp_ctx);
+ /* an exception was set by Py_BuildValue() */
+ return NULL;
+ }
+ PyErr_SetObject(PyExc_SDDLValueError, exc);
+ Py_DECREF(exc);
+ talloc_free(tmp_ctx);
+ return NULL;
+ }
+
+ secdesc = talloc_steal(NULL, secdesc);
+ talloc_free(tmp_ctx);
+
+ return pytalloc_steal((PyTypeObject *)self, secdesc);
+}
+
+static PyObject *py_descriptor_as_sddl(PyObject *self, PyObject *args)
+{
+ struct dom_sid *sid;
+ PyObject *py_sid = Py_None;
+ struct security_descriptor *desc = pytalloc_get_ptr(self);
+ char *text;
+ PyObject *ret;
+
+ if (!PyArg_ParseTuple(args, "|O!", &dom_sid_Type, &py_sid))
+ return NULL;
+
+ if (py_sid != Py_None)
+ sid = pytalloc_get_ptr(py_sid);
+ else
+ sid = NULL;
+
+ text = sddl_encode(NULL, desc, sid);
+ if (text == NULL) {
+ PyErr_SetString(PyExc_ValueError, "Unable to encode SDDL");
+ return NULL;
+ }
+
+ ret = PyUnicode_FromString(text);
+
+ talloc_free(text);
+
+ return ret;
+}
+
+static PyMethodDef py_descriptor_extra_methods[] = {
+ { "sacl_add", (PyCFunction)py_descriptor_sacl_add, METH_VARARGS,
+ "S.sacl_add(ace) -> None\n"
+ "Add a security ace to this security descriptor" },
+ { "dacl_add", (PyCFunction)py_descriptor_dacl_add, METH_VARARGS,
+ NULL },
+ { "dacl_del", (PyCFunction)py_descriptor_dacl_del, METH_VARARGS,
+ NULL },
+ { "sacl_del", (PyCFunction)py_descriptor_sacl_del, METH_VARARGS,
+ NULL },
+ { "dacl_del_ace", (PyCFunction)py_descriptor_dacl_del_ace, METH_VARARGS,
+ NULL },
+ { "sacl_del_ace", (PyCFunction)py_descriptor_sacl_del_ace, METH_VARARGS,
+ NULL },
+ { "from_sddl", (PyCFunction)py_descriptor_from_sddl, METH_VARARGS|METH_KEYWORDS|METH_CLASS,
+ NULL },
+ { "as_sddl", (PyCFunction)py_descriptor_as_sddl, METH_VARARGS,
+ NULL },
+ {0}
+};
+
+static PyObject *py_descriptor_richcmp(
+ PyObject *py_self, PyObject *py_other, int op)
+{
+ struct security_descriptor *self = pytalloc_get_ptr(py_self);
+ struct security_descriptor *other = pytalloc_get_ptr(py_other);
+ bool eq;
+
+ if (other == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+
+ eq = security_descriptor_equal(self, other);
+
+ switch(op) {
+ case Py_EQ:
+ if (eq) {
+ Py_RETURN_TRUE;
+ } else {
+ Py_RETURN_FALSE;
+ }
+ break;
+ case Py_NE:
+ if (eq) {
+ Py_RETURN_FALSE;
+ } else {
+ Py_RETURN_TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+
+ Py_RETURN_NOTIMPLEMENTED;
+}
+
+static void py_descriptor_patch(PyTypeObject *type)
+{
+ type->tp_new = py_descriptor_new;
+ type->tp_richcompare = py_descriptor_richcmp;
+ PyType_AddMethods(type, py_descriptor_extra_methods);
+}
+
+#define PY_DESCRIPTOR_PATCH py_descriptor_patch
+
+static PyObject *py_token_is_sid(PyObject *self, PyObject *args)
+{
+ PyObject *py_sid;
+ struct dom_sid *sid;
+ struct security_token *token = pytalloc_get_ptr(self);
+ if (!PyArg_ParseTuple(args, "O", &py_sid))
+ return NULL;
+
+ sid = pytalloc_get_ptr(py_sid);
+
+ return PyBool_FromLong(security_token_is_sid(token, sid));
+}
+
+static PyObject *py_token_has_sid(PyObject *self, PyObject *args)
+{
+ PyObject *py_sid;
+ struct dom_sid *sid;
+ struct security_token *token = pytalloc_get_ptr(self);
+ if (!PyArg_ParseTuple(args, "O", &py_sid))
+ return NULL;
+
+ sid = pytalloc_get_ptr(py_sid);
+
+ return PyBool_FromLong(security_token_has_sid(token, sid));
+}
+
+static PyObject *py_token_is_anonymous(PyObject *self,
+ PyObject *Py_UNUSED(ignored))
+{
+ struct security_token *token = pytalloc_get_ptr(self);
+
+ return PyBool_FromLong(security_token_is_anonymous(token));
+}
+
+static PyObject *py_token_is_system(PyObject *self,
+ PyObject *Py_UNUSED(ignored))
+{
+ struct security_token *token = pytalloc_get_ptr(self);
+
+ return PyBool_FromLong(security_token_is_system(token));
+}
+
+static PyObject *py_token_has_builtin_administrators(PyObject *self,
+ PyObject *Py_UNUSED(ignored))
+{
+ struct security_token *token = pytalloc_get_ptr(self);
+
+ return PyBool_FromLong(security_token_has_builtin_administrators(token));
+}
+
+static PyObject *py_token_has_nt_authenticated_users(PyObject *self,
+ PyObject *Py_UNUSED(ignored))
+{
+ struct security_token *token = pytalloc_get_ptr(self);
+
+ return PyBool_FromLong(security_token_has_nt_authenticated_users(token));
+}
+
+static PyObject *py_token_has_privilege(PyObject *self, PyObject *args)
+{
+ int priv;
+ struct security_token *token = pytalloc_get_ptr(self);
+
+ if (!PyArg_ParseTuple(args, "i", &priv))
+ return NULL;
+
+ return PyBool_FromLong(security_token_has_privilege(token, priv));
+}
+
+static PyObject *py_token_set_privilege(PyObject *self, PyObject *args)
+{
+ int priv;
+ struct security_token *token = pytalloc_get_ptr(self);
+
+ if (!PyArg_ParseTuple(args, "i", &priv))
+ return NULL;
+
+ security_token_set_privilege(token, priv);
+ Py_RETURN_NONE;
+}
+
+static PyObject *py_token_new(PyTypeObject *self, PyObject *args, PyObject *kwargs)
+{
+ int evaluate_claims = CLAIMS_EVALUATION_INVALID_STATE;
+ const char *kwnames[] = { "evaluate_claims", NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i",
+ discard_const_p(char *, kwnames),
+ &evaluate_claims)) {
+ return NULL;
+ }
+
+ return pytalloc_steal(self, security_token_initialise(NULL, evaluate_claims));
+}
+
+static PyMethodDef py_token_extra_methods[] = {
+ { "is_sid", (PyCFunction)py_token_is_sid, METH_VARARGS,
+ "S.is_sid(sid) -> bool\n"
+ "Check whether this token is of the specified SID." },
+ { "has_sid", (PyCFunction)py_token_has_sid, METH_VARARGS,
+ NULL },
+ { "is_anonymous", (PyCFunction)py_token_is_anonymous, METH_NOARGS,
+ "S.is_anonymous() -> bool\n"
+ "Check whether this is an anonymous token." },
+ { "is_system", (PyCFunction)py_token_is_system, METH_NOARGS,
+ NULL },
+ { "has_builtin_administrators", (PyCFunction)py_token_has_builtin_administrators, METH_NOARGS,
+ NULL },
+ { "has_nt_authenticated_users", (PyCFunction)py_token_has_nt_authenticated_users, METH_NOARGS,
+ NULL },
+ { "has_privilege", (PyCFunction)py_token_has_privilege, METH_VARARGS,
+ NULL },
+ { "set_privilege", (PyCFunction)py_token_set_privilege, METH_VARARGS,
+ NULL },
+ {0}
+};
+
+#define PY_TOKEN_PATCH py_token_patch
+static void py_token_patch(PyTypeObject *type)
+{
+ type->tp_new = py_token_new;
+ PyType_AddMethods(type, py_token_extra_methods);
+}
+
+static PyObject *py_privilege_name(PyObject *self, PyObject *args)
+{
+ int priv;
+ const char *name = NULL;
+ if (!PyArg_ParseTuple(args, "i", &priv)) {
+ return NULL;
+ }
+ name = sec_privilege_name(priv);
+ if (name == NULL) {
+ PyErr_Format(PyExc_ValueError,
+ "Invalid privilege LUID: %d", priv);
+ return NULL;
+ }
+
+ return PyUnicode_FromString(name);
+}
+
+static PyObject *py_privilege_id(PyObject *self, PyObject *args)
+{
+ char *name;
+
+ if (!PyArg_ParseTuple(args, "s", &name))
+ return NULL;
+
+ return PyLong_FromLong(sec_privilege_id(name));
+}
+
+static PyObject *py_random_sid(PyObject *self,
+ PyObject *Py_UNUSED(ignored))
+{
+ struct dom_sid *sid;
+ PyObject *ret;
+ char *str = talloc_asprintf(
+ NULL,
+ "S-1-5-21-%"PRIu32"-%"PRIu32"-%"PRIu32,
+ generate_random(),
+ generate_random(),
+ generate_random());
+
+ sid = dom_sid_parse_talloc(NULL, str);
+ talloc_free(str);
+ ret = pytalloc_steal(&dom_sid_Type, sid);
+ return ret;
+}
+
+static PyMethodDef py_mod_security_extra_methods[] = {
+ { "random_sid", (PyCFunction)py_random_sid, METH_NOARGS, NULL },
+ { "privilege_id", (PyCFunction)py_privilege_id, METH_VARARGS, NULL },
+ { "privilege_name", (PyCFunction)py_privilege_name, METH_VARARGS, NULL },
+ {0}
+};
+
+static bool py_mod_security_patch(PyObject *m)
+{
+ int ret;
+ int i;
+ for (i = 0; py_mod_security_extra_methods[i].ml_name; i++) {
+ PyObject *descr = PyCFunction_New(&py_mod_security_extra_methods[i], NULL);
+ ret = PyModule_AddObject(m, py_mod_security_extra_methods[i].ml_name,
+ descr);
+ if (ret != 0) {
+ return false;
+ }
+ }
+ /*
+ * I wanted to make this a subclass of ValueError, but it
+ * seems there isn't an easy way to do that using the API.
+ * (c.f. SimpleExtendsException in cpython:Objects/exceptions.c)
+ */
+ PyExc_SDDLValueError = PyErr_NewException("security.SDDLValueError",
+ NULL, NULL);
+
+ if (PyExc_SDDLValueError == NULL) {
+ return false;
+ }
+ ret = PyModule_AddObject(m, "SDDLValueError", PyExc_SDDLValueError);
+ if (ret != 0) {
+ return false;
+ }
+ return true;
+}
+
+#define PY_MOD_SECURITY_PATCH(m) \
+ do { \
+ bool _ok = py_mod_security_patch(m); \
+ if (! _ok) { \
+ Py_XDECREF(m); \
+ return NULL; \
+ } \
+ } while(0)
+
+static PyObject *py_security_ace_equal(PyObject *py_self, PyObject *py_other, int op)
+{
+ struct security_ace *self = pytalloc_get_ptr(py_self);
+ struct security_ace *other = NULL;
+ bool eq;
+
+ if (!PyObject_TypeCheck(py_other, &security_ace_Type)) {
+ eq = false;
+ } else {
+ other = pytalloc_get_ptr(py_other);
+ eq = security_ace_equal(self, other);
+ }
+
+ switch(op) {
+ case Py_EQ:
+ if (eq) {
+ Py_RETURN_TRUE;
+ } else {
+ Py_RETURN_FALSE;
+ }
+ break;
+ case Py_NE:
+ if (eq) {
+ Py_RETURN_FALSE;
+ } else {
+ Py_RETURN_TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+
+ Py_RETURN_NOTIMPLEMENTED;
+}
+
+static PyObject *py_security_ace_as_sddl(PyObject *self, PyObject *args)
+{
+ struct security_ace *ace = pytalloc_get_ptr(self);
+ PyObject *py_sid = Py_None;
+ struct dom_sid *sid = NULL;
+ char *text = NULL;
+ PyObject *ret = Py_None;
+
+ if (!PyArg_ParseTuple(args, "O!", &dom_sid_Type, &py_sid))
+ return NULL;
+
+ if (!PyObject_TypeCheck(py_sid, &dom_sid_Type)) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected security.dom_sid "
+ "for second argument to .sddl_encode_ace");
+ return NULL;
+ }
+
+ sid = pytalloc_get_ptr(py_sid);
+
+ text = sddl_encode_ace(NULL, ace, sid);
+ if (text == NULL) {
+ return NULL;
+ }
+ ret = PyUnicode_FromString(text);
+ talloc_free(text);
+
+ return ret;
+}
+
+static PyMethodDef py_security_ace_extra_methods[] = {
+ { "as_sddl", (PyCFunction)py_security_ace_as_sddl, METH_VARARGS, NULL },
+ {0}
+};
+
+#define PY_ACE_PATCH py_security_ace_patch
+
+static void py_security_ace_patch(PyTypeObject *type)
+{
+ type->tp_richcompare = py_security_ace_equal;
+ PyType_AddMethods(type, py_security_ace_extra_methods);
+}
diff --git a/source4/librpc/ndr/py_xattr.c b/source4/librpc/ndr/py_xattr.c
new file mode 100644
index 0000000..523c1ab
--- /dev/null
+++ b/source4/librpc/ndr/py_xattr.c
@@ -0,0 +1,100 @@
+/*
+ Unix SMB/CIFS implementation.
+ Samba utility functions
+ Copyright (C) Matthieu Patou <mat@matws.net> 2010
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "lib/replace/system/python.h"
+
+static void PyType_AddMethods(PyTypeObject *type, PyMethodDef *methods)
+{
+ PyObject *dict;
+ int i;
+ if (type->tp_dict == NULL)
+ type->tp_dict = PyDict_New();
+ dict = type->tp_dict;
+ for (i = 0; methods[i].ml_name; i++) {
+ PyObject *descr;
+ if (methods[i].ml_flags & METH_CLASS)
+ descr = PyCFunction_New(&methods[i], (PyObject *)type);
+ else
+ descr = PyDescr_NewMethod(type, &methods[i]);
+ PyDict_SetItemString(dict, methods[i].ml_name,
+ descr);
+ Py_CLEAR(descr);
+ }
+}
+
+static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
+
+static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...)
+{
+ va_list ap;
+ char *s = NULL;
+ int i, ret;
+
+ va_start(ap, format);
+ ret = vasprintf(&s, format, ap);
+ va_end(ap);
+
+ if (ret == -1) {
+ return;
+ }
+
+ for (i=0;i<ndr->depth;i++) {
+ printf(" ");
+ }
+
+ printf("%s\n", s);
+ free(s);
+}
+
+static PyObject *py_ntacl_print(PyObject *self, PyObject *args)
+{
+ struct xattr_NTACL *ntacl = pytalloc_get_ptr(self);
+ struct ndr_print *pr;
+ TALLOC_CTX *mem_ctx;
+
+ mem_ctx = talloc_new(NULL);
+
+ pr = talloc_zero(mem_ctx, struct ndr_print);
+ if (!pr) {
+ PyErr_NoMemory();
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+ pr->print = ntacl_print_debug_helper;
+ ndr_print_xattr_NTACL(pr, "file", ntacl);
+
+ talloc_free(mem_ctx);
+
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef py_ntacl_extra_methods[] = {
+ { "dump", (PyCFunction)py_ntacl_print, METH_NOARGS,
+ NULL },
+ {0}
+};
+
+static void py_xattr_NTACL_patch(PyTypeObject *type)
+{
+ PyType_AddMethods(type, py_ntacl_extra_methods);
+}
+
+#define PY_NTACL_PATCH py_xattr_NTACL_patch
+
+
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
new file mode 100644
index 0000000..802759c
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc.c
@@ -0,0 +1,2630 @@
+/*
+ Unix SMB/CIFS implementation.
+ raw dcerpc operations
+
+ Copyright (C) Tim Potter 2003
+ Copyright (C) Andrew Tridgell 2003-2005
+ Copyright (C) Jelmer Vernooij 2004-2005
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "system/filesys.h"
+#include "../lib/util/dlinklist.h"
+#include "lib/events/events.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "librpc/rpc/dcerpc_util.h"
+#include "librpc/rpc/dcerpc_pkt_auth.h"
+#include "librpc/gen_ndr/ndr_misc.h"
+#include "librpc/gen_ndr/ndr_dcerpc.h"
+#include "auth/gensec/gensec.h"
+#include "param/param.h"
+#include "lib/util/tevent_ntstatus.h"
+#include "librpc/rpc/rpc_common.h"
+#include "lib/tsocket/tsocket.h"
+#include "libcli/smb/tstream_smbXcli_np.h"
+
+
+enum rpc_request_state {
+ RPC_REQUEST_QUEUED,
+ RPC_REQUEST_PENDING,
+ RPC_REQUEST_DONE
+};
+
+/*
+ handle for an async dcerpc request
+*/
+struct rpc_request {
+ struct rpc_request *next, *prev;
+ struct dcerpc_pipe *p;
+ NTSTATUS status;
+ uint32_t call_id;
+ enum rpc_request_state state;
+ DATA_BLOB payload;
+ uint32_t flags;
+ uint32_t fault_code;
+
+ /* this is used to distinguish bind and alter_context requests
+ from normal requests */
+ void (*recv_handler)(struct rpc_request *conn,
+ DATA_BLOB *blob, struct ncacn_packet *pkt);
+
+ const struct GUID *object;
+ uint16_t opnum;
+ DATA_BLOB request_data;
+ bool ignore_timeout;
+ bool wait_for_sync;
+ bool verify_bitmask1;
+ bool verify_pcontext;
+
+ struct {
+ void (*callback)(struct rpc_request *);
+ void *private_data;
+ } async;
+};
+
+_PUBLIC_ NTSTATUS dcerpc_init(void)
+{
+ return gensec_init();
+}
+
+static void dcerpc_connection_dead(struct dcecli_connection *conn, NTSTATUS status);
+static void dcerpc_schedule_io_trigger(struct dcecli_connection *c);
+
+static struct rpc_request *dcerpc_request_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe *p,
+ const struct GUID *object,
+ uint16_t opnum,
+ DATA_BLOB *stub_data);
+static NTSTATUS dcerpc_request_recv(struct rpc_request *req,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *stub_data);
+static NTSTATUS dcerpc_ndr_validate_in(struct dcecli_connection *c,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB blob,
+ size_t struct_size,
+ ndr_push_flags_fn_t ndr_push,
+ ndr_pull_flags_fn_t ndr_pull);
+static NTSTATUS dcerpc_ndr_validate_out(struct dcecli_connection *c,
+ struct ndr_pull *pull_in,
+ void *struct_ptr,
+ size_t struct_size,
+ ndr_push_flags_fn_t ndr_push,
+ ndr_pull_flags_fn_t ndr_pull,
+ ndr_print_function_t ndr_print);
+static NTSTATUS dcerpc_shutdown_pipe(struct dcecli_connection *p, NTSTATUS status);
+static NTSTATUS dcerpc_send_request(struct dcecli_connection *p, DATA_BLOB *data,
+ bool trigger_read);
+static NTSTATUS dcerpc_send_read(struct dcecli_connection *p);
+
+/* destroy a dcerpc connection */
+static int dcerpc_connection_destructor(struct dcecli_connection *conn)
+{
+ if (conn->dead) {
+ conn->free_skipped = true;
+ return -1;
+ }
+ dcerpc_connection_dead(conn, NT_STATUS_LOCAL_DISCONNECT);
+ return 0;
+}
+
+
+/* initialise a dcerpc connection.
+ the event context is optional
+*/
+static struct dcecli_connection *dcerpc_connection_init(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev)
+{
+ struct dcecli_connection *c;
+
+ c = talloc_zero(mem_ctx, struct dcecli_connection);
+ if (!c) {
+ return NULL;
+ }
+
+ c->event_ctx = ev;
+
+ if (c->event_ctx == NULL) {
+ talloc_free(c);
+ return NULL;
+ }
+
+ c->call_id = 1;
+ c->security_state.auth_type = DCERPC_AUTH_TYPE_NONE;
+ c->security_state.auth_level = DCERPC_AUTH_LEVEL_NONE;
+ c->security_state.auth_context_id = 0;
+ c->security_state.session_key = dcecli_generic_session_key;
+ c->security_state.generic_state = NULL;
+ c->flags = 0;
+ /*
+ * Windows uses 5840 for ncacn_ip_tcp,
+ * so we also use it (for every transport)
+ * by default. But we give the transport
+ * the chance to overwrite it.
+ */
+ c->srv_max_xmit_frag = 5840;
+ c->srv_max_recv_frag = 5840;
+ c->max_total_response_size = DCERPC_NCACN_RESPONSE_DEFAULT_MAX_SIZE;
+ c->pending = NULL;
+
+ c->io_trigger = tevent_create_immediate(c);
+ if (c->io_trigger == NULL) {
+ talloc_free(c);
+ return NULL;
+ }
+
+ talloc_set_destructor(c, dcerpc_connection_destructor);
+
+ return c;
+}
+
+struct dcerpc_bh_state {
+ struct dcerpc_pipe *p;
+};
+
+static bool dcerpc_bh_is_connected(struct dcerpc_binding_handle *h)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+
+ if (!hs->p) {
+ return false;
+ }
+
+ if (!hs->p->conn) {
+ return false;
+ }
+
+ if (hs->p->conn->dead) {
+ return false;
+ }
+
+ return true;
+}
+
+static uint32_t dcerpc_bh_set_timeout(struct dcerpc_binding_handle *h,
+ uint32_t timeout)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+ uint32_t old;
+
+ if (!hs->p) {
+ return DCERPC_REQUEST_TIMEOUT;
+ }
+
+ old = hs->p->request_timeout;
+ hs->p->request_timeout = timeout;
+
+ return old;
+}
+
+static void dcerpc_bh_auth_info(struct dcerpc_binding_handle *h,
+ enum dcerpc_AuthType *auth_type,
+ enum dcerpc_AuthLevel *auth_level)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+
+ if (hs->p == NULL) {
+ return;
+ }
+
+ if (hs->p->conn == NULL) {
+ return;
+ }
+
+ *auth_type = hs->p->conn->security_state.auth_type;
+ *auth_level = hs->p->conn->security_state.auth_level;
+}
+
+struct dcerpc_bh_raw_call_state {
+ struct tevent_context *ev;
+ struct dcerpc_binding_handle *h;
+ DATA_BLOB in_data;
+ DATA_BLOB out_data;
+ uint32_t out_flags;
+};
+
+static void dcerpc_bh_raw_call_done(struct rpc_request *subreq);
+
+static struct tevent_req *dcerpc_bh_raw_call_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct dcerpc_binding_handle *h,
+ const struct GUID *object,
+ uint32_t opnum,
+ uint32_t in_flags,
+ const uint8_t *in_data,
+ size_t in_length)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+ struct tevent_req *req;
+ struct dcerpc_bh_raw_call_state *state;
+ bool ok;
+ struct rpc_request *subreq;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct dcerpc_bh_raw_call_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ state->ev = ev;
+ state->h = h;
+ state->in_data.data = discard_const_p(uint8_t, in_data);
+ state->in_data.length = in_length;
+
+ ok = dcerpc_bh_is_connected(h);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_DISCONNECTED);
+ return tevent_req_post(req, ev);
+ }
+
+ subreq = dcerpc_request_send(state,
+ hs->p,
+ object,
+ opnum,
+ &state->in_data);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ subreq->async.callback = dcerpc_bh_raw_call_done;
+ subreq->async.private_data = req;
+
+ return req;
+}
+
+static void dcerpc_bh_raw_call_done(struct rpc_request *subreq)
+{
+ struct tevent_req *req =
+ talloc_get_type_abort(subreq->async.private_data,
+ struct tevent_req);
+ struct dcerpc_bh_raw_call_state *state =
+ tevent_req_data(req,
+ struct dcerpc_bh_raw_call_state);
+ NTSTATUS status;
+ uint32_t fault_code;
+
+ state->out_flags = 0;
+ if (subreq->flags & DCERPC_PULL_BIGENDIAN) {
+ state->out_flags |= LIBNDR_FLAG_BIGENDIAN;
+ }
+
+ fault_code = subreq->fault_code;
+
+ status = dcerpc_request_recv(subreq, state, &state->out_data);
+ if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
+ status = dcerpc_fault_to_nt_status(fault_code);
+ }
+
+ /*
+ * We trigger the callback in the next event run
+ * because the code in this file might trigger
+ * multiple request callbacks from within a single
+ * while loop.
+ *
+ * In order to avoid segfaults from within
+ * dcerpc_connection_dead() we call
+ * tevent_req_defer_callback().
+ */
+ tevent_req_defer_callback(req, state->ev);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return;
+ }
+
+ tevent_req_done(req);
+}
+
+static NTSTATUS dcerpc_bh_raw_call_recv(struct tevent_req *req,
+ TALLOC_CTX *mem_ctx,
+ uint8_t **out_data,
+ size_t *out_length,
+ uint32_t *out_flags)
+{
+ struct dcerpc_bh_raw_call_state *state =
+ tevent_req_data(req,
+ struct dcerpc_bh_raw_call_state);
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ *out_data = talloc_move(mem_ctx, &state->out_data.data);
+ *out_length = state->out_data.length;
+ *out_flags = state->out_flags;
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
+
+struct dcerpc_bh_disconnect_state {
+ uint8_t _dummy;
+};
+
+static struct tevent_req *dcerpc_bh_disconnect_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct dcerpc_binding_handle *h)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+ struct tevent_req *req;
+ struct dcerpc_bh_disconnect_state *state;
+ bool ok;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct dcerpc_bh_disconnect_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ ok = dcerpc_bh_is_connected(h);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_DISCONNECTED);
+ return tevent_req_post(req, ev);
+ }
+
+ /* TODO: do a real disconnect ... */
+ hs->p = NULL;
+
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+}
+
+static NTSTATUS dcerpc_bh_disconnect_recv(struct tevent_req *req)
+{
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
+
+static bool dcerpc_bh_push_bigendian(struct dcerpc_binding_handle *h)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+
+ if (hs->p->conn->flags & DCERPC_PUSH_BIGENDIAN) {
+ return true;
+ }
+
+ return false;
+}
+
+static bool dcerpc_bh_ref_alloc(struct dcerpc_binding_handle *h)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+
+ if (hs->p->conn->flags & DCERPC_NDR_REF_ALLOC) {
+ return true;
+ }
+
+ return false;
+}
+
+static bool dcerpc_bh_use_ndr64(struct dcerpc_binding_handle *h)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+
+ if (hs->p->conn->flags & DCERPC_NDR64) {
+ return true;
+ }
+
+ return false;
+}
+
+static void dcerpc_bh_do_ndr_print(struct dcerpc_binding_handle *h,
+ ndr_flags_type ndr_flags,
+ const void *_struct_ptr,
+ const struct ndr_interface_call *call)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+ void *struct_ptr = discard_const(_struct_ptr);
+ bool print_in = false;
+ bool print_out = false;
+
+ if (hs->p->conn->flags & DCERPC_DEBUG_PRINT_IN) {
+ print_in = true;
+ }
+
+ if (hs->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) {
+ print_out = true;
+ }
+
+ if (DEBUGLEVEL >= 11) {
+ print_in = true;
+ print_out = true;
+ }
+
+ if (ndr_flags & NDR_IN) {
+ if (print_in) {
+ ndr_print_function_debug(call->ndr_print,
+ call->name,
+ ndr_flags,
+ struct_ptr);
+ }
+ }
+ if (ndr_flags & NDR_OUT) {
+ if (print_out) {
+ ndr_print_function_debug(call->ndr_print,
+ call->name,
+ ndr_flags,
+ struct_ptr);
+ }
+ }
+}
+
+static void dcerpc_bh_ndr_push_failed(struct dcerpc_binding_handle *h,
+ NTSTATUS error,
+ const void *struct_ptr,
+ const struct ndr_interface_call *call)
+{
+ DEBUG(2,("Unable to ndr_push structure for %s - %s\n",
+ call->name, nt_errstr(error)));
+}
+
+static void dcerpc_bh_ndr_pull_failed(struct dcerpc_binding_handle *h,
+ NTSTATUS error,
+ const DATA_BLOB *blob,
+ const struct ndr_interface_call *call)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+ const uint32_t num_examples = 20;
+ uint32_t i;
+
+ DEBUG(2,("Unable to ndr_pull structure for %s - %s\n",
+ call->name, nt_errstr(error)));
+
+ if (hs->p->conn->packet_log_dir == NULL) return;
+
+ for (i=0;i<num_examples;i++) {
+ char *name=NULL;
+ int ret;
+
+ ret = asprintf(&name, "%s/rpclog/%s-out.%d",
+ hs->p->conn->packet_log_dir,
+ call->name, i);
+ if (ret == -1) {
+ return;
+ }
+ if (!file_exist(name)) {
+ if (file_save(name, blob->data, blob->length)) {
+ DEBUG(10,("Logged rpc packet to %s\n", name));
+ }
+ free(name);
+ break;
+ }
+ free(name);
+ }
+}
+
+static NTSTATUS dcerpc_bh_ndr_validate_in(struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ const DATA_BLOB *blob,
+ const struct ndr_interface_call *call)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+
+ if (hs->p->conn->flags & DCERPC_DEBUG_VALIDATE_IN) {
+ NTSTATUS status;
+
+ status = dcerpc_ndr_validate_in(hs->p->conn,
+ mem_ctx,
+ *blob,
+ call->struct_size,
+ call->ndr_push,
+ call->ndr_pull);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("Validation [in] failed for %s - %s\n",
+ call->name, nt_errstr(status)));
+ return status;
+ }
+ }
+
+ DEBUG(10,("rpc request data:\n"));
+ dump_data(10, blob->data, blob->length);
+
+ return NT_STATUS_OK;
+}
+
+static NTSTATUS dcerpc_bh_ndr_validate_out(struct dcerpc_binding_handle *h,
+ struct ndr_pull *pull_in,
+ const void *_struct_ptr,
+ const struct ndr_interface_call *call)
+{
+ struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
+ struct dcerpc_bh_state);
+ void *struct_ptr = discard_const(_struct_ptr);
+
+ DEBUG(10,("rpc reply data:\n"));
+ dump_data(10, pull_in->data, pull_in->data_size);
+
+ if (pull_in->offset != pull_in->data_size) {
+ DEBUG(0,("Warning! ignoring %u unread bytes at ofs:%u (0x%08X) for %s!\n",
+ pull_in->data_size - pull_in->offset,
+ pull_in->offset, pull_in->offset,
+ call->name));
+ /* we used to return NT_STATUS_INFO_LENGTH_MISMATCH here,
+ but it turns out that early versions of NT
+ (specifically NT3.1) add junk onto the end of rpc
+ packets, so if we want to interoperate at all with
+ those versions then we need to ignore this error */
+ }
+
+ if (hs->p->conn->flags & DCERPC_DEBUG_VALIDATE_OUT) {
+ NTSTATUS status;
+
+ status = dcerpc_ndr_validate_out(hs->p->conn,
+ pull_in,
+ struct_ptr,
+ call->struct_size,
+ call->ndr_push,
+ call->ndr_pull,
+ call->ndr_print);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(2,("Validation [out] failed for %s - %s\n",
+ call->name, nt_errstr(status)));
+ return status;
+ }
+ }
+
+ return NT_STATUS_OK;
+}
+
+static const struct dcerpc_binding_handle_ops dcerpc_bh_ops = {
+ .name = "dcerpc",
+ .is_connected = dcerpc_bh_is_connected,
+ .set_timeout = dcerpc_bh_set_timeout,
+ .auth_info = dcerpc_bh_auth_info,
+ .raw_call_send = dcerpc_bh_raw_call_send,
+ .raw_call_recv = dcerpc_bh_raw_call_recv,
+ .disconnect_send = dcerpc_bh_disconnect_send,
+ .disconnect_recv = dcerpc_bh_disconnect_recv,
+
+ .push_bigendian = dcerpc_bh_push_bigendian,
+ .ref_alloc = dcerpc_bh_ref_alloc,
+ .use_ndr64 = dcerpc_bh_use_ndr64,
+ .do_ndr_print = dcerpc_bh_do_ndr_print,
+ .ndr_push_failed = dcerpc_bh_ndr_push_failed,
+ .ndr_pull_failed = dcerpc_bh_ndr_pull_failed,
+ .ndr_validate_in = dcerpc_bh_ndr_validate_in,
+ .ndr_validate_out = dcerpc_bh_ndr_validate_out,
+};
+
+/* initialise a dcerpc pipe. */
+struct dcerpc_binding_handle *dcerpc_pipe_binding_handle(struct dcerpc_pipe *p,
+ const struct GUID *object,
+ const struct ndr_interface_table *table)
+{
+ struct dcerpc_binding_handle *h;
+ struct dcerpc_bh_state *hs;
+
+ h = dcerpc_binding_handle_create(p,
+ &dcerpc_bh_ops,
+ object,
+ table,
+ &hs,
+ struct dcerpc_bh_state,
+ __location__);
+ if (h == NULL) {
+ return NULL;
+ }
+ hs->p = p;
+
+ dcerpc_binding_handle_set_sync_ev(h, p->conn->event_ctx);
+
+ return h;
+}
+
+/* initialise a dcerpc pipe. */
+_PUBLIC_ struct dcerpc_pipe *dcerpc_pipe_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev)
+{
+ struct dcerpc_pipe *p;
+
+ p = talloc_zero(mem_ctx, struct dcerpc_pipe);
+ if (!p) {
+ return NULL;
+ }
+
+ p->conn = dcerpc_connection_init(p, ev);
+ if (p->conn == NULL) {
+ talloc_free(p);
+ return NULL;
+ }
+
+ p->request_timeout = DCERPC_REQUEST_TIMEOUT;
+
+ if (DEBUGLVL(100)) {
+ p->conn->flags |= DCERPC_DEBUG_PRINT_BOTH;
+ }
+
+ return p;
+}
+
+
+/*
+ choose the next call id to use
+*/
+static uint32_t next_call_id(struct dcecli_connection *c)
+{
+ c->call_id++;
+ if (c->call_id == 0) {
+ c->call_id++;
+ }
+ return c->call_id;
+}
+
+/**
+ setup for a ndr pull, also setting up any flags from the binding string
+*/
+static struct ndr_pull *ndr_pull_init_flags(struct dcecli_connection *c,
+ DATA_BLOB *blob, TALLOC_CTX *mem_ctx)
+{
+ struct ndr_pull *ndr = ndr_pull_init_blob(blob, mem_ctx);
+
+ if (ndr == NULL) return ndr;
+
+ if (c->flags & DCERPC_DEBUG_PAD_CHECK) {
+ ndr->flags |= LIBNDR_FLAG_PAD_CHECK;
+ }
+
+ if (c->flags & DCERPC_NDR_REF_ALLOC) {
+ ndr->flags |= LIBNDR_FLAG_REF_ALLOC;
+ }
+
+ if (c->flags & DCERPC_NDR64) {
+ ndr->flags |= LIBNDR_FLAG_NDR64;
+ }
+
+ return ndr;
+}
+
+/*
+ parse the authentication information on a dcerpc response packet
+*/
+static NTSTATUS ncacn_pull_pkt_auth(struct dcecli_connection *c,
+ TALLOC_CTX *mem_ctx,
+ enum dcerpc_pkt_type ptype,
+ uint8_t required_flags,
+ uint8_t optional_flags,
+ uint8_t payload_offset,
+ DATA_BLOB *payload_and_verifier,
+ DATA_BLOB *raw_packet,
+ const struct ncacn_packet *pkt)
+{
+ const struct dcerpc_auth tmp_auth = {
+ .auth_type = c->security_state.auth_type,
+ .auth_level = c->security_state.auth_level,
+ .auth_context_id = c->security_state.auth_context_id,
+ };
+ NTSTATUS status;
+
+ status = dcerpc_ncacn_pull_pkt_auth(&tmp_auth,
+ c->security_state.generic_state,
+ true, /* check_pkt_auth_fields */
+ mem_ctx,
+ ptype,
+ required_flags,
+ optional_flags,
+ payload_offset,
+ payload_and_verifier,
+ raw_packet,
+ pkt);
+ if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROTOCOL_ERROR)) {
+ return NT_STATUS_INVALID_NETWORK_RESPONSE;
+ }
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ return NT_STATUS_OK;
+}
+
+
+/*
+ push a dcerpc request packet into a blob, possibly signing it.
+*/
+static NTSTATUS ncacn_push_request_sign(struct dcecli_connection *c,
+ DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
+ size_t sig_size,
+ struct ncacn_packet *pkt)
+{
+ const struct dcerpc_auth tmp_auth = {
+ .auth_type = c->security_state.auth_type,
+ .auth_level = c->security_state.auth_level,
+ .auth_context_id = c->security_state.auth_context_id,
+ };
+ NTSTATUS status;
+ uint8_t payload_offset = DCERPC_REQUEST_LENGTH;
+
+ if (pkt->pfc_flags & DCERPC_PFC_FLAG_OBJECT_UUID) {
+ payload_offset += 16;
+ }
+
+ status = dcerpc_ncacn_push_pkt_auth(&tmp_auth,
+ c->security_state.generic_state,
+ mem_ctx, blob,
+ sig_size,
+ payload_offset,
+ &pkt->u.request.stub_and_verifier,
+ pkt);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ return NT_STATUS_OK;
+}
+
+
+/*
+ fill in the fixed values in a dcerpc header
+*/
+static void init_ncacn_hdr(struct dcecli_connection *c, struct ncacn_packet *pkt)
+{
+ pkt->rpc_vers = 5;
+ pkt->rpc_vers_minor = 0;
+ if (c->flags & DCERPC_PUSH_BIGENDIAN) {
+ pkt->drep[0] = 0;
+ } else {
+ pkt->drep[0] = DCERPC_DREP_LE;
+ }
+ pkt->drep[1] = 0;
+ pkt->drep[2] = 0;
+ pkt->drep[3] = 0;
+}
+
+/*
+ map a bind nak reason to a NTSTATUS
+*/
+static NTSTATUS dcerpc_map_nak_reason(enum dcerpc_bind_nak_reason reason)
+{
+ switch (reason) {
+ case DCERPC_BIND_NAK_REASON_PROTOCOL_VERSION_NOT_SUPPORTED:
+ return NT_STATUS_REVISION_MISMATCH;
+ case DCERPC_BIND_NAK_REASON_INVALID_AUTH_TYPE:
+ return NT_STATUS_INVALID_PARAMETER;
+ default:
+ break;
+ }
+ return NT_STATUS_UNSUCCESSFUL;
+}
+
+static NTSTATUS dcerpc_map_ack_reason(const struct dcerpc_ack_ctx *ack)
+{
+ if (ack == NULL) {
+ return NT_STATUS_RPC_PROTOCOL_ERROR;
+ }
+
+ switch (ack->result) {
+ case DCERPC_BIND_ACK_RESULT_NEGOTIATE_ACK:
+ /*
+ * We have not asked for this...
+ */
+ return NT_STATUS_RPC_PROTOCOL_ERROR;
+ default:
+ break;
+ }
+
+ switch (ack->reason.value) {
+ case DCERPC_BIND_ACK_REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED:
+ return NT_STATUS_RPC_UNSUPPORTED_NAME_SYNTAX;
+ case DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED:
+ return NT_STATUS_RPC_UNSUPPORTED_NAME_SYNTAX;
+ default:
+ break;
+ }
+ return NT_STATUS_UNSUCCESSFUL;
+}
+
+/*
+ remove requests from the pending or queued queues
+ */
+static int dcerpc_req_dequeue(struct rpc_request *req)
+{
+ switch (req->state) {
+ case RPC_REQUEST_QUEUED:
+ DLIST_REMOVE(req->p->conn->request_queue, req);
+ break;
+ case RPC_REQUEST_PENDING:
+ DLIST_REMOVE(req->p->conn->pending, req);
+ break;
+ case RPC_REQUEST_DONE:
+ break;
+ }
+ return 0;
+}
+
+
+/*
+ mark the dcerpc connection dead. All outstanding requests get an error
+*/
+static void dcerpc_connection_dead(struct dcecli_connection *conn, NTSTATUS status)
+{
+ if (conn->dead) return;
+
+ conn->dead = true;
+
+ TALLOC_FREE(conn->io_trigger);
+ conn->io_trigger_pending = false;
+
+ dcerpc_shutdown_pipe(conn, status);
+
+ /* all pending requests get the error */
+ while (conn->pending) {
+ struct rpc_request *req = conn->pending;
+ dcerpc_req_dequeue(req);
+ req->state = RPC_REQUEST_DONE;
+ req->status = status;
+ if (req->async.callback) {
+ req->async.callback(req);
+ }
+ }
+
+ /* all requests, which are not shipped */
+ while (conn->request_queue) {
+ struct rpc_request *req = conn->request_queue;
+ dcerpc_req_dequeue(req);
+ req->state = RPC_REQUEST_DONE;
+ req->status = status;
+ if (req->async.callback) {
+ req->async.callback(req);
+ }
+ }
+
+ talloc_set_destructor(conn, NULL);
+ if (conn->free_skipped) {
+ talloc_free(conn);
+ }
+}
+
+/*
+ forward declarations of the recv_data handlers for the types of
+ packets we need to handle
+*/
+static void dcerpc_request_recv_data(struct dcecli_connection *c,
+ DATA_BLOB *raw_packet, struct ncacn_packet *pkt);
+
+/*
+ receive a dcerpc reply from the transport. Here we work out what
+ type of reply it is (normal request, bind or alter context) and
+ dispatch to the appropriate handler
+*/
+static void dcerpc_recv_data(struct dcecli_connection *conn, DATA_BLOB *blob, NTSTATUS status)
+{
+ struct ncacn_packet pkt;
+
+ if (conn->dead) {
+ return;
+ }
+
+ if (NT_STATUS_IS_OK(status) && blob->length == 0) {
+ status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
+ }
+
+ /* the transport may be telling us of a severe error, such as
+ a dropped socket */
+ if (!NT_STATUS_IS_OK(status)) {
+ data_blob_free(blob);
+ dcerpc_connection_dead(conn, status);
+ return;
+ }
+
+ /* parse the basic packet to work out what type of response this is */
+ status = dcerpc_pull_ncacn_packet(blob->data, blob, &pkt);
+ if (!NT_STATUS_IS_OK(status)) {
+ data_blob_free(blob);
+ dcerpc_connection_dead(conn, status);
+ return;
+ }
+
+ dcerpc_request_recv_data(conn, blob, &pkt);
+}
+
+/*
+ handle timeouts of individual dcerpc requests
+*/
+static void dcerpc_timeout_handler(struct tevent_context *ev, struct tevent_timer *te,
+ struct timeval t, void *private_data)
+{
+ struct rpc_request *req = talloc_get_type(private_data, struct rpc_request);
+
+ if (req->ignore_timeout) {
+ dcerpc_req_dequeue(req);
+ req->state = RPC_REQUEST_DONE;
+ req->status = NT_STATUS_IO_TIMEOUT;
+ if (req->async.callback) {
+ req->async.callback(req);
+ }
+ return;
+ }
+
+ dcerpc_connection_dead(req->p->conn, NT_STATUS_IO_TIMEOUT);
+}
+
+struct dcerpc_bind_state {
+ struct tevent_context *ev;
+ struct dcerpc_pipe *p;
+};
+
+static void dcerpc_bind_fail_handler(struct rpc_request *subreq);
+static void dcerpc_bind_recv_handler(struct rpc_request *subreq,
+ DATA_BLOB *raw_packet,
+ struct ncacn_packet *pkt);
+
+struct tevent_req *dcerpc_bind_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct dcerpc_pipe *p,
+ const struct ndr_syntax_id *syntax,
+ const struct ndr_syntax_id *transfer_syntax)
+{
+ struct tevent_req *req;
+ struct dcerpc_bind_state *state;
+ struct ncacn_packet pkt;
+ DATA_BLOB blob;
+ NTSTATUS status;
+ struct rpc_request *subreq;
+ uint32_t flags;
+ struct ndr_syntax_id bind_time_features;
+
+ bind_time_features = dcerpc_construct_bind_time_features(
+ DCERPC_BIND_TIME_SECURITY_CONTEXT_MULTIPLEXING |
+ DCERPC_BIND_TIME_KEEP_CONNECTION_ON_ORPHAN);
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct dcerpc_bind_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ state->ev = ev;
+ state->p = p;
+
+ p->syntax = *syntax;
+ p->transfer_syntax = *transfer_syntax;
+
+ flags = dcerpc_binding_get_flags(p->binding);
+
+ init_ncacn_hdr(p->conn, &pkt);
+
+ pkt.ptype = DCERPC_PKT_BIND;
+ pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST;
+ pkt.call_id = p->conn->call_id;
+ pkt.auth_length = 0;
+
+ if (flags & DCERPC_CONCURRENT_MULTIPLEX) {
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_CONC_MPX;
+ }
+
+ if (p->conn->flags & DCERPC_PROPOSE_HEADER_SIGNING) {
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN;
+ }
+
+ pkt.u.bind.max_xmit_frag = p->conn->srv_max_xmit_frag;
+ pkt.u.bind.max_recv_frag = p->conn->srv_max_recv_frag;
+ pkt.u.bind.assoc_group_id = dcerpc_binding_get_assoc_group_id(p->binding);
+ pkt.u.bind.num_contexts = 2;
+ pkt.u.bind.ctx_list = talloc_zero_array(state, struct dcerpc_ctx_list,
+ pkt.u.bind.num_contexts);
+ if (tevent_req_nomem(pkt.u.bind.ctx_list, req)) {
+ return tevent_req_post(req, ev);
+ }
+ pkt.u.bind.ctx_list[0].context_id = p->context_id;
+ pkt.u.bind.ctx_list[0].num_transfer_syntaxes = 1;
+ pkt.u.bind.ctx_list[0].abstract_syntax = p->syntax;
+ pkt.u.bind.ctx_list[0].transfer_syntaxes = &p->transfer_syntax;
+ pkt.u.bind.ctx_list[1].context_id = p->context_id + 1;
+ pkt.u.bind.ctx_list[1].num_transfer_syntaxes = 1;
+ pkt.u.bind.ctx_list[1].abstract_syntax = p->syntax;
+ pkt.u.bind.ctx_list[1].transfer_syntaxes = &bind_time_features;
+ pkt.u.bind.auth_info = data_blob(NULL, 0);
+
+ /* construct the NDR form of the packet */
+ status = dcerpc_ncacn_push_auth(&blob,
+ state,
+ &pkt,
+ p->conn->security_state.tmp_auth_info.out);
+ if (tevent_req_nterror(req, status)) {
+ return tevent_req_post(req, ev);
+ }
+
+ /*
+ * we allocate a dcerpc_request so we can be in the same
+ * request queue as normal requests
+ */
+ subreq = talloc_zero(state, struct rpc_request);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ subreq->state = RPC_REQUEST_PENDING;
+ subreq->call_id = pkt.call_id;
+ subreq->async.private_data = req;
+ subreq->async.callback = dcerpc_bind_fail_handler;
+ subreq->p = p;
+ subreq->recv_handler = dcerpc_bind_recv_handler;
+ DLIST_ADD_END(p->conn->pending, subreq);
+ talloc_set_destructor(subreq, dcerpc_req_dequeue);
+
+ status = dcerpc_send_request(p->conn, &blob, true);
+ if (tevent_req_nterror(req, status)) {
+ return tevent_req_post(req, ev);
+ }
+
+ tevent_add_timer(ev, subreq,
+ timeval_current_ofs(DCERPC_REQUEST_TIMEOUT, 0),
+ dcerpc_timeout_handler, subreq);
+
+ return req;
+}
+
+static void dcerpc_bind_fail_handler(struct rpc_request *subreq)
+{
+ struct tevent_req *req =
+ talloc_get_type_abort(subreq->async.private_data,
+ struct tevent_req);
+ struct dcerpc_bind_state *state =
+ tevent_req_data(req,
+ struct dcerpc_bind_state);
+ NTSTATUS status = subreq->status;
+
+ TALLOC_FREE(subreq);
+
+ /*
+ * We trigger the callback in the next event run
+ * because the code in this file might trigger
+ * multiple request callbacks from within a single
+ * while loop.
+ *
+ * In order to avoid segfaults from within
+ * dcerpc_connection_dead() we call
+ * tevent_req_defer_callback().
+ */
+ tevent_req_defer_callback(req, state->ev);
+
+ tevent_req_nterror(req, status);
+}
+
+static void dcerpc_bind_recv_handler(struct rpc_request *subreq,
+ DATA_BLOB *raw_packet,
+ struct ncacn_packet *pkt)
+{
+ struct tevent_req *req =
+ talloc_get_type_abort(subreq->async.private_data,
+ struct tevent_req);
+ struct dcerpc_bind_state *state =
+ tevent_req_data(req,
+ struct dcerpc_bind_state);
+ struct dcecli_connection *conn = state->p->conn;
+ struct dcecli_security *sec = &conn->security_state;
+ struct dcerpc_binding *b = NULL;
+ NTSTATUS status;
+ uint32_t flags;
+
+ /*
+ * Note that pkt is allocated under raw_packet->data,
+ * while raw_packet->data is a child of subreq.
+ */
+ talloc_steal(state, raw_packet->data);
+ TALLOC_FREE(subreq);
+
+ /*
+ * We trigger the callback in the next event run
+ * because the code in this file might trigger
+ * multiple request callbacks from within a single
+ * while loop.
+ *
+ * In order to avoid segfaults from within
+ * dcerpc_connection_dead() we call
+ * tevent_req_defer_callback().
+ */
+ tevent_req_defer_callback(req, state->ev);
+
+ if (pkt->ptype == DCERPC_PKT_BIND_NAK) {
+ status = dcerpc_map_nak_reason(pkt->u.bind_nak.reject_reason);
+
+ DEBUG(2,("dcerpc: bind_nak reason %d - %s\n",
+ pkt->u.bind_nak.reject_reason, nt_errstr(status)));
+
+ tevent_req_nterror(req, status);
+ return;
+ }
+
+ status = dcerpc_verify_ncacn_packet_header(pkt,
+ DCERPC_PKT_BIND_ACK,
+ pkt->u.bind_ack.auth_info.length,
+ DCERPC_PFC_FLAG_FIRST |
+ DCERPC_PFC_FLAG_LAST,
+ DCERPC_PFC_FLAG_CONC_MPX |
+ DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN);
+ if (!NT_STATUS_IS_OK(status)) {
+ state->p->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
+ tevent_req_nterror(req, NT_STATUS_NET_WRITE_FAULT);
+ return;
+ }
+
+ if (pkt->u.bind_ack.num_results < 1) {
+ state->p->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
+ tevent_req_nterror(req, NT_STATUS_NET_WRITE_FAULT);
+ return;
+ }
+
+ if (pkt->u.bind_ack.ctx_list[0].result != 0) {
+ status = dcerpc_map_ack_reason(&pkt->u.bind_ack.ctx_list[0]);
+ DEBUG(2,("dcerpc: bind_ack failed - reason %d - %s\n",
+ pkt->u.bind_ack.ctx_list[0].reason.value,
+ nt_errstr(status)));
+ tevent_req_nterror(req, status);
+ return;
+ }
+
+ if (pkt->u.bind_ack.num_results >= 2) {
+ if (pkt->u.bind_ack.ctx_list[1].result == DCERPC_BIND_ACK_RESULT_NEGOTIATE_ACK) {
+ conn->bind_time_features = pkt->u.bind_ack.ctx_list[1].reason.negotiate;
+ } else {
+ status = dcerpc_map_ack_reason(&pkt->u.bind_ack.ctx_list[1]);
+ DEBUG(10,("dcerpc: bind_time_feature failed - reason %d - %s\n",
+ pkt->u.bind_ack.ctx_list[1].reason.value,
+ nt_errstr(status)));
+ status = NT_STATUS_OK;
+ }
+ }
+
+ /*
+ * DCE-RPC 1.1 (c706) specifies
+ * CONST_MUST_RCV_FRAG_SIZE as 1432
+ */
+ if (pkt->u.bind_ack.max_xmit_frag < 1432) {
+ state->p->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
+ tevent_req_nterror(req, NT_STATUS_NET_WRITE_FAULT);
+ return;
+ }
+ if (pkt->u.bind_ack.max_recv_frag < 1432) {
+ state->p->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
+ tevent_req_nterror(req, NT_STATUS_NET_WRITE_FAULT);
+ return;
+ }
+ conn->srv_max_xmit_frag = MIN(conn->srv_max_xmit_frag,
+ pkt->u.bind_ack.max_xmit_frag);
+ conn->srv_max_recv_frag = MIN(conn->srv_max_recv_frag,
+ pkt->u.bind_ack.max_recv_frag);
+
+ flags = dcerpc_binding_get_flags(state->p->binding);
+
+ if (flags & DCERPC_CONCURRENT_MULTIPLEX) {
+ if (pkt->pfc_flags & DCERPC_PFC_FLAG_CONC_MPX) {
+ conn->flags |= DCERPC_CONCURRENT_MULTIPLEX;
+ } else {
+ conn->flags &= ~DCERPC_CONCURRENT_MULTIPLEX;
+ }
+ }
+
+ if (!(conn->flags & DCERPC_CONCURRENT_MULTIPLEX)) {
+ struct dcerpc_binding *pb =
+ discard_const_p(struct dcerpc_binding, state->p->binding);
+ /*
+ * clear DCERPC_CONCURRENT_MULTIPLEX
+ */
+ status = dcerpc_binding_set_flags(pb, 0,
+ DCERPC_CONCURRENT_MULTIPLEX);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+ }
+ if ((conn->flags & DCERPC_PROPOSE_HEADER_SIGNING) &&
+ (pkt->pfc_flags & DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN)) {
+ conn->flags |= DCERPC_HEADER_SIGNING;
+ }
+
+ /* the bind_ack might contain a reply set of credentials */
+ if (pkt->auth_length != 0 && sec->tmp_auth_info.in != NULL) {
+ status = dcerpc_pull_auth_trailer(pkt, sec->tmp_auth_info.mem,
+ &pkt->u.bind_ack.auth_info,
+ sec->tmp_auth_info.in,
+ NULL, true);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+ }
+
+ /*
+ * We're the owner of the binding, so we're allowed to modify it.
+ */
+ b = discard_const_p(struct dcerpc_binding, state->p->binding);
+ status = dcerpc_binding_set_assoc_group_id(b,
+ pkt->u.bind_ack.assoc_group_id);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ tevent_req_done(req);
+}
+
+NTSTATUS dcerpc_bind_recv(struct tevent_req *req)
+{
+ return tevent_req_simple_recv_ntstatus(req);
+}
+
+/*
+ perform a continued bind (and auth3)
+*/
+NTSTATUS dcerpc_auth3(struct dcerpc_pipe *p,
+ TALLOC_CTX *mem_ctx)
+{
+ struct ncacn_packet pkt;
+ NTSTATUS status;
+ DATA_BLOB blob;
+ uint32_t flags;
+
+ flags = dcerpc_binding_get_flags(p->binding);
+
+ init_ncacn_hdr(p->conn, &pkt);
+
+ pkt.ptype = DCERPC_PKT_AUTH3;
+ pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST;
+ pkt.call_id = next_call_id(p->conn);
+ pkt.auth_length = 0;
+ pkt.u.auth3.auth_info = data_blob(NULL, 0);
+
+ if (flags & DCERPC_CONCURRENT_MULTIPLEX) {
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_CONC_MPX;
+ }
+
+ /* construct the NDR form of the packet */
+ status = dcerpc_ncacn_push_auth(&blob,
+ mem_ctx,
+ &pkt,
+ p->conn->security_state.tmp_auth_info.out);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ /* send it on its way */
+ status = dcerpc_send_request(p->conn, &blob, false);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ return NT_STATUS_OK;
+}
+
+
+/*
+ process a fragment received from the transport layer during a
+ request
+
+ This function frees the data
+*/
+static void dcerpc_request_recv_data(struct dcecli_connection *c,
+ DATA_BLOB *raw_packet, struct ncacn_packet *pkt)
+{
+ struct rpc_request *req;
+ unsigned int length;
+ NTSTATUS status = NT_STATUS_OK;
+
+ /*
+ if this is an authenticated connection then parse and check
+ the auth info. We have to do this before finding the
+ matching packet, as the request structure might have been
+ removed due to a timeout, but if it has been we still need
+ to run the auth routines so that we don't get the sign/seal
+ info out of step with the server
+ */
+ switch (pkt->ptype) {
+ case DCERPC_PKT_RESPONSE:
+ status = ncacn_pull_pkt_auth(c, raw_packet->data,
+ DCERPC_PKT_RESPONSE,
+ 0, /* required_flags */
+ DCERPC_PFC_FLAG_FIRST |
+ DCERPC_PFC_FLAG_LAST,
+ DCERPC_REQUEST_LENGTH,
+ &pkt->u.response.stub_and_verifier,
+ raw_packet, pkt);
+ break;
+ default:
+ break;
+ }
+
+ /* find the matching request */
+ for (req=c->pending;req;req=req->next) {
+ if (pkt->call_id == req->call_id) break;
+ }
+
+#if 0
+ /* useful for testing certain vendors RPC servers */
+ if (req == NULL && c->pending && pkt->call_id == 0) {
+ DEBUG(0,("HACK FOR INCORRECT CALL ID\n"));
+ req = c->pending;
+ }
+#endif
+
+ if (req == NULL) {
+ DEBUG(2,("dcerpc_request: unmatched call_id %u in response packet\n", pkt->call_id));
+ data_blob_free(raw_packet);
+ return;
+ }
+
+ talloc_steal(req, raw_packet->data);
+
+ if (req->recv_handler != NULL) {
+ dcerpc_req_dequeue(req);
+ req->state = RPC_REQUEST_DONE;
+
+ /*
+ * We have to look at shipping further requests before calling
+ * the async function, that one might close the pipe
+ */
+ dcerpc_schedule_io_trigger(c);
+
+ req->recv_handler(req, raw_packet, pkt);
+ return;
+ }
+
+ if (pkt->ptype == DCERPC_PKT_FAULT) {
+ status = dcerpc_fault_to_nt_status(pkt->u.fault.status);
+ DEBUG(5,("rpc fault: %s\n", dcerpc_errstr(c, pkt->u.fault.status)));
+ if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROTOCOL_ERROR)) {
+ dcerpc_connection_dead(c, status);
+ return;
+ }
+ if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_SEC_PKG_ERROR)) {
+ dcerpc_connection_dead(c, status);
+ return;
+ }
+ req->fault_code = pkt->u.fault.status;
+ req->status = NT_STATUS_NET_WRITE_FAULT;
+ goto req_done;
+ }
+
+ if (pkt->ptype != DCERPC_PKT_RESPONSE) {
+ DEBUG(2,("Unexpected packet type %d in dcerpc response\n",
+ (int)pkt->ptype));
+ dcerpc_connection_dead(c, NT_STATUS_RPC_PROTOCOL_ERROR);
+ return;
+ }
+
+ /* now check the status from the auth routines, and if it failed then fail
+ this request accordingly */
+ if (!NT_STATUS_IS_OK(status)) {
+ dcerpc_connection_dead(c, status);
+ return;
+ }
+
+ length = pkt->u.response.stub_and_verifier.length;
+
+ if (req->payload.length + length > c->max_total_response_size) {
+ DEBUG(2,("Unexpected total payload 0x%X > 0x%X dcerpc response\n",
+ (unsigned)req->payload.length + length,
+ (unsigned)c->max_total_response_size));
+ dcerpc_connection_dead(c, NT_STATUS_RPC_PROTOCOL_ERROR);
+ return;
+ }
+
+ if (length > 0) {
+ req->payload.data = talloc_realloc(req,
+ req->payload.data,
+ uint8_t,
+ req->payload.length + length);
+ if (!req->payload.data) {
+ req->status = NT_STATUS_NO_MEMORY;
+ goto req_done;
+ }
+ memcpy(req->payload.data+req->payload.length,
+ pkt->u.response.stub_and_verifier.data, length);
+ req->payload.length += length;
+ }
+
+ if (!(pkt->pfc_flags & DCERPC_PFC_FLAG_LAST)) {
+ data_blob_free(raw_packet);
+ dcerpc_send_read(c);
+ return;
+ }
+
+ if (req->verify_bitmask1) {
+ req->p->conn->security_state.verified_bitmask1 = true;
+ }
+ if (req->verify_pcontext) {
+ req->p->verified_pcontext = true;
+ }
+
+ if (!(pkt->drep[0] & DCERPC_DREP_LE)) {
+ req->flags |= DCERPC_PULL_BIGENDIAN;
+ } else {
+ req->flags &= ~DCERPC_PULL_BIGENDIAN;
+ }
+
+req_done:
+ data_blob_free(raw_packet);
+
+ /* we've got the full payload */
+ dcerpc_req_dequeue(req);
+ req->state = RPC_REQUEST_DONE;
+
+ /*
+ * We have to look at shipping further requests before calling
+ * the async function, that one might close the pipe
+ */
+ dcerpc_schedule_io_trigger(c);
+
+ if (req->async.callback) {
+ req->async.callback(req);
+ }
+}
+
+static NTSTATUS dcerpc_request_prepare_vt(struct rpc_request *req);
+
+/*
+ perform the send side of a async dcerpc request
+*/
+static struct rpc_request *dcerpc_request_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe *p,
+ const struct GUID *object,
+ uint16_t opnum,
+ DATA_BLOB *stub_data)
+{
+ struct rpc_request *req;
+ NTSTATUS status;
+
+ req = talloc_zero(mem_ctx, struct rpc_request);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ req->p = p;
+ req->call_id = next_call_id(p->conn);
+ req->state = RPC_REQUEST_QUEUED;
+
+ if (object != NULL) {
+ req->object = (struct GUID *)talloc_memdup(req, (const void *)object, sizeof(*object));
+ if (req->object == NULL) {
+ talloc_free(req);
+ return NULL;
+ }
+ }
+
+ req->opnum = opnum;
+ req->request_data.length = stub_data->length;
+ req->request_data.data = stub_data->data;
+
+ status = dcerpc_request_prepare_vt(req);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(req);
+ return NULL;
+ }
+
+ DLIST_ADD_END(p->conn->request_queue, req);
+ talloc_set_destructor(req, dcerpc_req_dequeue);
+
+ dcerpc_schedule_io_trigger(p->conn);
+
+ if (p->request_timeout) {
+ tevent_add_timer(p->conn->event_ctx, req,
+ timeval_current_ofs(p->request_timeout, 0),
+ dcerpc_timeout_handler, req);
+ }
+
+ return req;
+}
+
+static NTSTATUS dcerpc_request_prepare_vt(struct rpc_request *req)
+{
+ struct dcecli_security *sec = &req->p->conn->security_state;
+ struct dcerpc_sec_verification_trailer *t;
+ struct dcerpc_sec_vt *c = NULL;
+ struct ndr_push *ndr = NULL;
+ enum ndr_err_code ndr_err;
+
+ if (sec->auth_level < DCERPC_AUTH_LEVEL_PACKET) {
+ return NT_STATUS_OK;
+ }
+
+ t = talloc_zero(req, struct dcerpc_sec_verification_trailer);
+ if (t == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ if (!sec->verified_bitmask1) {
+ t->commands = talloc_realloc(t, t->commands,
+ struct dcerpc_sec_vt,
+ t->count.count + 1);
+ if (t->commands == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ c = &t->commands[t->count.count++];
+ ZERO_STRUCTP(c);
+
+ c->command = DCERPC_SEC_VT_COMMAND_BITMASK1;
+ if (req->p->conn->flags & DCERPC_PROPOSE_HEADER_SIGNING) {
+ c->u.bitmask1 = DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING;
+ }
+ req->verify_bitmask1 = true;
+ }
+
+ if (!req->p->verified_pcontext) {
+ t->commands = talloc_realloc(t, t->commands,
+ struct dcerpc_sec_vt,
+ t->count.count + 1);
+ if (t->commands == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ c = &t->commands[t->count.count++];
+ ZERO_STRUCTP(c);
+
+ c->command = DCERPC_SEC_VT_COMMAND_PCONTEXT;
+ c->u.pcontext.abstract_syntax = req->p->syntax;
+ c->u.pcontext.transfer_syntax = req->p->transfer_syntax;
+
+ req->verify_pcontext = true;
+ }
+
+ if (!(req->p->conn->flags & DCERPC_HEADER_SIGNING)) {
+ t->commands = talloc_realloc(t, t->commands,
+ struct dcerpc_sec_vt,
+ t->count.count + 1);
+ if (t->commands == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ c = &t->commands[t->count.count++];
+ ZERO_STRUCTP(c);
+
+ c->command = DCERPC_SEC_VT_COMMAND_HEADER2;
+ c->u.header2.ptype = DCERPC_PKT_REQUEST;
+ if (req->p->conn->flags & DCERPC_PUSH_BIGENDIAN) {
+ c->u.header2.drep[0] = 0;
+ } else {
+ c->u.header2.drep[0] = DCERPC_DREP_LE;
+ }
+ c->u.header2.drep[1] = 0;
+ c->u.header2.drep[2] = 0;
+ c->u.header2.drep[3] = 0;
+ c->u.header2.call_id = req->call_id;
+ c->u.header2.context_id = req->p->context_id;
+ c->u.header2.opnum = req->opnum;
+ }
+
+ if (t->count.count == 0) {
+ TALLOC_FREE(t);
+ return NT_STATUS_OK;
+ }
+
+ c = &t->commands[t->count.count - 1];
+ c->command |= DCERPC_SEC_VT_COMMAND_END;
+
+ if (DEBUGLEVEL >= 10) {
+ NDR_PRINT_DEBUG(dcerpc_sec_verification_trailer, t);
+ }
+
+ ndr = ndr_push_init_ctx(req);
+ if (ndr == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ /*
+ * for now we just copy and append
+ */
+
+ ndr_err = ndr_push_bytes(ndr, req->request_data.data,
+ req->request_data.length);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ ndr_err = ndr_push_dcerpc_sec_verification_trailer(ndr,
+ NDR_SCALARS | NDR_BUFFERS,
+ t);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+ req->request_data = ndr_push_blob(ndr);
+
+ return NT_STATUS_OK;
+}
+
+/*
+ Send a request using the transport
+*/
+
+static void dcerpc_ship_next_request(struct dcecli_connection *c)
+{
+ struct rpc_request *req;
+ struct dcerpc_pipe *p;
+ DATA_BLOB *stub_data;
+ struct ncacn_packet pkt;
+ DATA_BLOB blob;
+ uint32_t remaining, chunk_size;
+ bool first_packet = true;
+ size_t sig_size = 0;
+ bool need_async = false;
+ bool can_async = true;
+
+ req = c->request_queue;
+ if (req == NULL) {
+ return;
+ }
+
+ p = req->p;
+ stub_data = &req->request_data;
+
+ if (c->pending) {
+ need_async = true;
+ }
+
+ if (c->security_state.auth_level >= DCERPC_AUTH_LEVEL_PACKET) {
+ can_async = gensec_have_feature(c->security_state.generic_state,
+ GENSEC_FEATURE_ASYNC_REPLIES);
+ }
+
+ if (need_async && !can_async) {
+ req->wait_for_sync = true;
+ return;
+ }
+
+ DLIST_REMOVE(c->request_queue, req);
+ DLIST_ADD(c->pending, req);
+ req->state = RPC_REQUEST_PENDING;
+
+ init_ncacn_hdr(p->conn, &pkt);
+
+ remaining = stub_data->length;
+
+ /* we can write a full max_recv_frag size, minus the dcerpc
+ request header size */
+ chunk_size = p->conn->srv_max_recv_frag;
+ chunk_size -= DCERPC_REQUEST_LENGTH;
+ if (c->security_state.auth_level >= DCERPC_AUTH_LEVEL_PACKET) {
+ size_t max_payload = chunk_size;
+
+ max_payload -= DCERPC_AUTH_TRAILER_LENGTH;
+ max_payload -= (max_payload % DCERPC_AUTH_PAD_ALIGNMENT);
+
+ sig_size = gensec_sig_size(c->security_state.generic_state,
+ max_payload);
+ if (sig_size) {
+ chunk_size -= DCERPC_AUTH_TRAILER_LENGTH;
+ chunk_size -= sig_size;
+ }
+ }
+ chunk_size -= (chunk_size % DCERPC_AUTH_PAD_ALIGNMENT);
+
+ pkt.ptype = DCERPC_PKT_REQUEST;
+ pkt.call_id = req->call_id;
+ pkt.auth_length = 0;
+ pkt.pfc_flags = 0;
+ pkt.u.request.context_id = p->context_id;
+ pkt.u.request.opnum = req->opnum;
+
+ if (req->object) {
+ pkt.u.request.object.object = *req->object;
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_OBJECT_UUID;
+ chunk_size -= ndr_size_GUID(req->object,0);
+ }
+
+ /* we send a series of pdus without waiting for a reply */
+ while (remaining > 0 || first_packet) {
+ uint32_t chunk = MIN(chunk_size, remaining);
+ bool last_frag = false;
+ bool do_trans = false;
+
+ first_packet = false;
+ pkt.pfc_flags &= ~(DCERPC_PFC_FLAG_FIRST |DCERPC_PFC_FLAG_LAST);
+
+ if (remaining == stub_data->length) {
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_FIRST;
+ }
+ if (chunk == remaining) {
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_LAST;
+ last_frag = true;
+ }
+
+ pkt.u.request.alloc_hint = remaining;
+ pkt.u.request.stub_and_verifier.data = stub_data->data +
+ (stub_data->length - remaining);
+ pkt.u.request.stub_and_verifier.length = chunk;
+
+ req->status = ncacn_push_request_sign(p->conn, &blob, req, sig_size, &pkt);
+ if (!NT_STATUS_IS_OK(req->status)) {
+ req->state = RPC_REQUEST_DONE;
+ DLIST_REMOVE(p->conn->pending, req);
+ return;
+ }
+
+ if (last_frag && !need_async) {
+ do_trans = true;
+ }
+
+ req->status = dcerpc_send_request(p->conn, &blob, do_trans);
+ if (!NT_STATUS_IS_OK(req->status)) {
+ req->state = RPC_REQUEST_DONE;
+ DLIST_REMOVE(p->conn->pending, req);
+ return;
+ }
+
+ if (last_frag && !do_trans) {
+ req->status = dcerpc_send_read(p->conn);
+ if (!NT_STATUS_IS_OK(req->status)) {
+ req->state = RPC_REQUEST_DONE;
+ DLIST_REMOVE(p->conn->pending, req);
+ return;
+ }
+ }
+
+ remaining -= chunk;
+ }
+}
+
+static void dcerpc_io_trigger(struct tevent_context *ctx,
+ struct tevent_immediate *im,
+ void *private_data)
+{
+ struct dcecli_connection *c =
+ talloc_get_type_abort(private_data,
+ struct dcecli_connection);
+
+ c->io_trigger_pending = false;
+
+ dcerpc_schedule_io_trigger(c);
+
+ dcerpc_ship_next_request(c);
+}
+
+static void dcerpc_schedule_io_trigger(struct dcecli_connection *c)
+{
+ if (c->dead) {
+ return;
+ }
+
+ if (c->request_queue == NULL) {
+ return;
+ }
+
+ if (c->request_queue->wait_for_sync && c->pending) {
+ return;
+ }
+
+ if (c->io_trigger_pending) {
+ return;
+ }
+
+ c->io_trigger_pending = true;
+
+ tevent_schedule_immediate(c->io_trigger,
+ c->event_ctx,
+ dcerpc_io_trigger,
+ c);
+}
+
+/*
+ perform the receive side of a async dcerpc request
+*/
+static NTSTATUS dcerpc_request_recv(struct rpc_request *req,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *stub_data)
+{
+ NTSTATUS status;
+
+ while (req->state != RPC_REQUEST_DONE) {
+ struct tevent_context *ctx = req->p->conn->event_ctx;
+ if (tevent_loop_once(ctx) != 0) {
+ return NT_STATUS_CONNECTION_DISCONNECTED;
+ }
+ }
+ *stub_data = req->payload;
+ status = req->status;
+ if (stub_data->data) {
+ stub_data->data = talloc_steal(mem_ctx, stub_data->data);
+ }
+ if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
+ req->p->last_fault_code = req->fault_code;
+ }
+ talloc_unlink(talloc_parent(req), req);
+ return status;
+}
+
+/*
+ this is a paranoid NDR validator. For every packet we push onto the wire
+ we pull it back again, then push it again. Then we compare the raw NDR data
+ for that to the NDR we initially generated. If they don't match then we know
+ we must have a bug in either the pull or push side of our code
+*/
+static NTSTATUS dcerpc_ndr_validate_in(struct dcecli_connection *c,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB blob,
+ size_t struct_size,
+ ndr_push_flags_fn_t ndr_push,
+ ndr_pull_flags_fn_t ndr_pull)
+{
+ void *st;
+ struct ndr_pull *pull;
+ struct ndr_push *push;
+ DATA_BLOB blob2;
+ enum ndr_err_code ndr_err;
+
+ st = talloc_size(mem_ctx, struct_size);
+ if (!st) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ pull = ndr_pull_init_flags(c, &blob, mem_ctx);
+ if (!pull) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+
+ if (c->flags & DCERPC_PUSH_BIGENDIAN) {
+ pull->flags |= LIBNDR_FLAG_BIGENDIAN;
+ }
+
+ if (c->flags & DCERPC_NDR64) {
+ pull->flags |= LIBNDR_FLAG_NDR64;
+ }
+
+ ndr_err = ndr_pull(pull, NDR_IN, st);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+ ndr_err = ndr_pull_error(pull, NDR_ERR_VALIDATE,
+ "failed input validation pull - %s",
+ nt_errstr(status));
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ push = ndr_push_init_ctx(mem_ctx);
+ if (!push) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ if (c->flags & DCERPC_PUSH_BIGENDIAN) {
+ push->flags |= LIBNDR_FLAG_BIGENDIAN;
+ }
+
+ if (c->flags & DCERPC_NDR64) {
+ push->flags |= LIBNDR_FLAG_NDR64;
+ }
+
+ ndr_err = ndr_push(push, NDR_IN, st);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+ ndr_err = ndr_pull_error(pull, NDR_ERR_VALIDATE,
+ "failed input validation push - %s",
+ nt_errstr(status));
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ blob2 = ndr_push_blob(push);
+
+ if (data_blob_cmp(&blob, &blob2) != 0) {
+ DEBUG(3,("original:\n"));
+ dump_data(3, blob.data, blob.length);
+ DEBUG(3,("secondary:\n"));
+ dump_data(3, blob2.data, blob2.length);
+ ndr_err = ndr_pull_error(pull, NDR_ERR_VALIDATE,
+ "failed input validation blobs doesn't match");
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ return NT_STATUS_OK;
+}
+
+/*
+ this is a paranoid NDR input validator. For every packet we pull
+ from the wire we push it back again then pull and push it
+ again. Then we compare the raw NDR data for that to the NDR we
+ initially generated. If they don't match then we know we must have a
+ bug in either the pull or push side of our code
+*/
+static NTSTATUS dcerpc_ndr_validate_out(struct dcecli_connection *c,
+ struct ndr_pull *pull_in,
+ void *struct_ptr,
+ size_t struct_size,
+ ndr_push_flags_fn_t ndr_push,
+ ndr_pull_flags_fn_t ndr_pull,
+ ndr_print_function_t ndr_print)
+{
+ void *st;
+ struct ndr_pull *pull;
+ struct ndr_push *push;
+ DATA_BLOB blob, blob2;
+ TALLOC_CTX *mem_ctx = pull_in;
+ char *s1, *s2;
+ enum ndr_err_code ndr_err;
+
+ st = talloc_size(mem_ctx, struct_size);
+ if (!st) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ memcpy(st, struct_ptr, struct_size);
+
+ push = ndr_push_init_ctx(mem_ctx);
+ if (!push) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ ndr_err = ndr_push(push, NDR_OUT, struct_ptr);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+ ndr_err = ndr_push_error(push, NDR_ERR_VALIDATE,
+ "failed output validation push - %s",
+ nt_errstr(status));
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ blob = ndr_push_blob(push);
+
+ pull = ndr_pull_init_flags(c, &blob, mem_ctx);
+ if (!pull) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+ ndr_err = ndr_pull(pull, NDR_OUT, st);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+ ndr_err = ndr_pull_error(pull, NDR_ERR_VALIDATE,
+ "failed output validation pull - %s",
+ nt_errstr(status));
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ push = ndr_push_init_ctx(mem_ctx);
+ if (!push) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ ndr_err = ndr_push(push, NDR_OUT, st);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+ ndr_err = ndr_push_error(push, NDR_ERR_VALIDATE,
+ "failed output validation push2 - %s",
+ nt_errstr(status));
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ blob2 = ndr_push_blob(push);
+
+ if (data_blob_cmp(&blob, &blob2) != 0) {
+ DEBUG(3,("original:\n"));
+ dump_data(3, blob.data, blob.length);
+ DEBUG(3,("secondary:\n"));
+ dump_data(3, blob2.data, blob2.length);
+ ndr_err = ndr_push_error(push, NDR_ERR_VALIDATE,
+ "failed output validation blobs doesn't match");
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ /* this checks the printed forms of the two structures, which effectively
+ tests all of the value() attributes */
+ s1 = ndr_print_function_string(mem_ctx, ndr_print, "VALIDATE",
+ NDR_OUT, struct_ptr);
+ s2 = ndr_print_function_string(mem_ctx, ndr_print, "VALIDATE",
+ NDR_OUT, st);
+ if (strcmp(s1, s2) != 0) {
+#if 1
+ DEBUG(3,("VALIDATE ERROR:\nWIRE:\n%s\n GEN:\n%s\n", s1, s2));
+#else
+ /* this is sometimes useful */
+ printf("VALIDATE ERROR\n");
+ file_save("wire.dat", s1, strlen(s1));
+ file_save("gen.dat", s2, strlen(s2));
+ system("diff -u wire.dat gen.dat");
+#endif
+ ndr_err = ndr_push_error(push, NDR_ERR_VALIDATE,
+ "failed output validation strings doesn't match");
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ return NT_STATUS_OK;
+}
+
+/*
+ a useful function for retrieving the server name we connected to
+*/
+_PUBLIC_ const char *dcerpc_server_name(struct dcerpc_pipe *p)
+{
+ return p->conn ? p->conn->server_name : NULL;
+}
+
+
+/*
+ get the dcerpc auth_level for a open connection
+*/
+uint32_t dcerpc_auth_level(struct dcecli_connection *c)
+{
+ uint8_t auth_level;
+
+ if (c->flags & DCERPC_SEAL) {
+ auth_level = DCERPC_AUTH_LEVEL_PRIVACY;
+ } else if (c->flags & DCERPC_SIGN) {
+ auth_level = DCERPC_AUTH_LEVEL_INTEGRITY;
+ } else if (c->flags & DCERPC_PACKET) {
+ auth_level = DCERPC_AUTH_LEVEL_PACKET;
+ } else if (c->flags & DCERPC_CONNECT) {
+ auth_level = DCERPC_AUTH_LEVEL_CONNECT;
+ } else {
+ auth_level = DCERPC_AUTH_LEVEL_NONE;
+ }
+ return auth_level;
+}
+
+struct dcerpc_alter_context_state {
+ struct tevent_context *ev;
+ struct dcerpc_pipe *p;
+};
+
+static void dcerpc_alter_context_fail_handler(struct rpc_request *subreq);
+static void dcerpc_alter_context_recv_handler(struct rpc_request *req,
+ DATA_BLOB *raw_packet,
+ struct ncacn_packet *pkt);
+
+struct tevent_req *dcerpc_alter_context_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct dcerpc_pipe *p,
+ const struct ndr_syntax_id *syntax,
+ const struct ndr_syntax_id *transfer_syntax)
+{
+ struct tevent_req *req;
+ struct dcerpc_alter_context_state *state;
+ struct ncacn_packet pkt;
+ DATA_BLOB blob;
+ NTSTATUS status;
+ struct rpc_request *subreq;
+ uint32_t flags;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct dcerpc_alter_context_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ state->ev = ev;
+ state->p = p;
+
+ p->syntax = *syntax;
+ p->transfer_syntax = *transfer_syntax;
+
+ flags = dcerpc_binding_get_flags(p->binding);
+
+ init_ncacn_hdr(p->conn, &pkt);
+
+ pkt.ptype = DCERPC_PKT_ALTER;
+ pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST;
+ pkt.call_id = p->conn->call_id;
+ pkt.auth_length = 0;
+
+ if (flags & DCERPC_CONCURRENT_MULTIPLEX) {
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_CONC_MPX;
+ }
+
+ pkt.u.alter.max_xmit_frag = p->conn->srv_max_xmit_frag;
+ pkt.u.alter.max_recv_frag = p->conn->srv_max_recv_frag;
+ pkt.u.alter.assoc_group_id = dcerpc_binding_get_assoc_group_id(p->binding);
+ pkt.u.alter.num_contexts = 1;
+ pkt.u.alter.ctx_list = talloc_zero_array(state, struct dcerpc_ctx_list,
+ pkt.u.alter.num_contexts);
+ if (tevent_req_nomem(pkt.u.alter.ctx_list, req)) {
+ return tevent_req_post(req, ev);
+ }
+ pkt.u.alter.ctx_list[0].context_id = p->context_id;
+ pkt.u.alter.ctx_list[0].num_transfer_syntaxes = 1;
+ pkt.u.alter.ctx_list[0].abstract_syntax = p->syntax;
+ pkt.u.alter.ctx_list[0].transfer_syntaxes = &p->transfer_syntax;
+ pkt.u.alter.auth_info = data_blob(NULL, 0);
+
+ /* construct the NDR form of the packet */
+ status = dcerpc_ncacn_push_auth(&blob,
+ state,
+ &pkt,
+ p->conn->security_state.tmp_auth_info.out);
+ if (tevent_req_nterror(req, status)) {
+ return tevent_req_post(req, ev);
+ }
+
+ /*
+ * we allocate a dcerpc_request so we can be in the same
+ * request queue as normal requests
+ */
+ subreq = talloc_zero(state, struct rpc_request);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ subreq->state = RPC_REQUEST_PENDING;
+ subreq->call_id = pkt.call_id;
+ subreq->async.private_data = req;
+ subreq->async.callback = dcerpc_alter_context_fail_handler;
+ subreq->p = p;
+ subreq->recv_handler = dcerpc_alter_context_recv_handler;
+ DLIST_ADD_END(p->conn->pending, subreq);
+ talloc_set_destructor(subreq, dcerpc_req_dequeue);
+
+ status = dcerpc_send_request(p->conn, &blob, true);
+ if (tevent_req_nterror(req, status)) {
+ return tevent_req_post(req, ev);
+ }
+
+ tevent_add_timer(ev, subreq,
+ timeval_current_ofs(DCERPC_REQUEST_TIMEOUT, 0),
+ dcerpc_timeout_handler, subreq);
+
+ return req;
+}
+
+static void dcerpc_alter_context_fail_handler(struct rpc_request *subreq)
+{
+ struct tevent_req *req =
+ talloc_get_type_abort(subreq->async.private_data,
+ struct tevent_req);
+ struct dcerpc_alter_context_state *state =
+ tevent_req_data(req,
+ struct dcerpc_alter_context_state);
+ NTSTATUS status = subreq->status;
+
+ TALLOC_FREE(subreq);
+
+ /*
+ * We trigger the callback in the next event run
+ * because the code in this file might trigger
+ * multiple request callbacks from within a single
+ * while loop.
+ *
+ * In order to avoid segfaults from within
+ * dcerpc_connection_dead() we call
+ * tevent_req_defer_callback().
+ */
+ tevent_req_defer_callback(req, state->ev);
+
+ tevent_req_nterror(req, status);
+}
+
+static void dcerpc_alter_context_recv_handler(struct rpc_request *subreq,
+ DATA_BLOB *raw_packet,
+ struct ncacn_packet *pkt)
+{
+ struct tevent_req *req =
+ talloc_get_type_abort(subreq->async.private_data,
+ struct tevent_req);
+ struct dcerpc_alter_context_state *state =
+ tevent_req_data(req,
+ struct dcerpc_alter_context_state);
+ struct dcecli_connection *conn = state->p->conn;
+ struct dcecli_security *sec = &conn->security_state;
+ NTSTATUS status;
+
+ /*
+ * Note that pkt is allocated under raw_packet->data,
+ * while raw_packet->data is a child of subreq.
+ */
+ talloc_steal(state, raw_packet->data);
+ TALLOC_FREE(subreq);
+
+ /*
+ * We trigger the callback in the next event run
+ * because the code in this file might trigger
+ * multiple request callbacks from within a single
+ * while loop.
+ *
+ * In order to avoid segfaults from within
+ * dcerpc_connection_dead() we call
+ * tevent_req_defer_callback().
+ */
+ tevent_req_defer_callback(req, state->ev);
+
+ if (pkt->ptype == DCERPC_PKT_FAULT) {
+ DEBUG(5,("dcerpc: alter_resp - rpc fault: %s\n",
+ dcerpc_errstr(state, pkt->u.fault.status)));
+ if (pkt->u.fault.status == DCERPC_FAULT_ACCESS_DENIED) {
+ state->p->last_fault_code = pkt->u.fault.status;
+ tevent_req_nterror(req, NT_STATUS_LOGON_FAILURE);
+ } else if (pkt->u.fault.status == DCERPC_FAULT_SEC_PKG_ERROR) {
+ state->p->last_fault_code = pkt->u.fault.status;
+ tevent_req_nterror(req, NT_STATUS_LOGON_FAILURE);
+ } else {
+ state->p->last_fault_code = pkt->u.fault.status;
+ status = dcerpc_fault_to_nt_status(pkt->u.fault.status);
+ tevent_req_nterror(req, status);
+ }
+ return;
+ }
+
+ status = dcerpc_verify_ncacn_packet_header(pkt,
+ DCERPC_PKT_ALTER_RESP,
+ pkt->u.alter_resp.auth_info.length,
+ DCERPC_PFC_FLAG_FIRST |
+ DCERPC_PFC_FLAG_LAST,
+ DCERPC_PFC_FLAG_CONC_MPX |
+ DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN);
+ if (!NT_STATUS_IS_OK(status)) {
+ state->p->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
+ tevent_req_nterror(req, NT_STATUS_NET_WRITE_FAULT);
+ return;
+ }
+
+ if (pkt->u.alter_resp.num_results != 1) {
+ state->p->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
+ tevent_req_nterror(req, NT_STATUS_NET_WRITE_FAULT);
+ return;
+ }
+
+ if (pkt->u.alter_resp.ctx_list[0].result != 0) {
+ status = dcerpc_map_ack_reason(&pkt->u.alter_resp.ctx_list[0]);
+ DEBUG(2,("dcerpc: alter_resp failed - reason %d - %s\n",
+ pkt->u.alter_resp.ctx_list[0].reason.value,
+ nt_errstr(status)));
+ tevent_req_nterror(req, status);
+ return;
+ }
+
+ /* the alter_resp might contain a reply set of credentials */
+ if (pkt->auth_length != 0 && sec->tmp_auth_info.in != NULL) {
+ status = dcerpc_pull_auth_trailer(pkt, sec->tmp_auth_info.mem,
+ &pkt->u.alter_resp.auth_info,
+ sec->tmp_auth_info.in,
+ NULL, true);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+ }
+
+ tevent_req_done(req);
+}
+
+NTSTATUS dcerpc_alter_context_recv(struct tevent_req *req)
+{
+ return tevent_req_simple_recv_ntstatus(req);
+}
+
+/*
+ send a dcerpc alter_context request
+*/
+_PUBLIC_ NTSTATUS dcerpc_alter_context(struct dcerpc_pipe *p,
+ TALLOC_CTX *mem_ctx,
+ const struct ndr_syntax_id *syntax,
+ const struct ndr_syntax_id *transfer_syntax)
+{
+ struct tevent_req *subreq;
+ struct tevent_context *ev = p->conn->event_ctx;
+ bool ok;
+
+ /* TODO: create a new event context here */
+
+ subreq = dcerpc_alter_context_send(mem_ctx, ev,
+ p, syntax, transfer_syntax);
+ if (subreq == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ ok = tevent_req_poll(subreq, ev);
+ if (!ok) {
+ NTSTATUS status;
+ status = map_nt_error_from_unix_common(errno);
+ return status;
+ }
+
+ return dcerpc_alter_context_recv(subreq);
+}
+
+static void dcerpc_transport_dead(struct dcecli_connection *c, NTSTATUS status)
+{
+ if (c->transport.stream == NULL) {
+ return;
+ }
+
+ tevent_queue_stop(c->transport.write_queue);
+ TALLOC_FREE(c->transport.read_subreq);
+ TALLOC_FREE(c->transport.stream);
+
+ if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) {
+ status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
+ }
+
+ if (NT_STATUS_EQUAL(NT_STATUS_OK, status)) {
+ status = NT_STATUS_END_OF_FILE;
+ }
+
+ dcerpc_recv_data(c, NULL, status);
+}
+
+
+/*
+ shutdown SMB pipe connection
+*/
+struct dcerpc_shutdown_pipe_state {
+ struct dcecli_connection *c;
+ NTSTATUS status;
+};
+
+static void dcerpc_shutdown_pipe_done(struct tevent_req *subreq);
+
+static NTSTATUS dcerpc_shutdown_pipe(struct dcecli_connection *c, NTSTATUS status)
+{
+ struct dcerpc_shutdown_pipe_state *state;
+ struct tevent_req *subreq;
+
+ if (c->transport.stream == NULL) {
+ return NT_STATUS_OK;
+ }
+
+ state = talloc_zero(c, struct dcerpc_shutdown_pipe_state);
+ if (state == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ state->c = c;
+ state->status = status;
+
+ subreq = tstream_disconnect_send(state, c->event_ctx, c->transport.stream);
+ if (subreq == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ tevent_req_set_callback(subreq, dcerpc_shutdown_pipe_done, state);
+
+ return status;
+}
+
+static void dcerpc_shutdown_pipe_done(struct tevent_req *subreq)
+{
+ struct dcerpc_shutdown_pipe_state *state =
+ tevent_req_callback_data(subreq, struct dcerpc_shutdown_pipe_state);
+ struct dcecli_connection *c = state->c;
+ NTSTATUS status = state->status;
+ int error;
+
+ /*
+ * here we ignore the return values...
+ */
+ tstream_disconnect_recv(subreq, &error);
+ TALLOC_FREE(subreq);
+
+ TALLOC_FREE(state);
+
+ dcerpc_transport_dead(c, status);
+}
+
+
+
+struct dcerpc_send_read_state {
+ struct dcecli_connection *p;
+};
+
+static int dcerpc_send_read_state_destructor(struct dcerpc_send_read_state *state)
+{
+ struct dcecli_connection *p = state->p;
+
+ p->transport.read_subreq = NULL;
+
+ return 0;
+}
+
+static void dcerpc_send_read_done(struct tevent_req *subreq);
+
+static NTSTATUS dcerpc_send_read(struct dcecli_connection *p)
+{
+ struct dcerpc_send_read_state *state;
+
+ if (p->transport.read_subreq != NULL) {
+ p->transport.pending_reads++;
+ return NT_STATUS_OK;
+ }
+
+ state = talloc_zero(p, struct dcerpc_send_read_state);
+ if (state == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ state->p = p;
+
+ talloc_set_destructor(state, dcerpc_send_read_state_destructor);
+
+ p->transport.read_subreq = dcerpc_read_ncacn_packet_send(state,
+ p->event_ctx,
+ p->transport.stream);
+ if (p->transport.read_subreq == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ tevent_req_set_callback(p->transport.read_subreq, dcerpc_send_read_done, state);
+
+ return NT_STATUS_OK;
+}
+
+static void dcerpc_send_read_done(struct tevent_req *subreq)
+{
+ struct dcerpc_send_read_state *state =
+ tevent_req_callback_data(subreq,
+ struct dcerpc_send_read_state);
+ struct dcecli_connection *p = state->p;
+ NTSTATUS status;
+ struct ncacn_packet *pkt;
+ DATA_BLOB blob;
+
+ status = dcerpc_read_ncacn_packet_recv(subreq, state,
+ &pkt, &blob);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(state);
+ dcerpc_transport_dead(p, status);
+ return;
+ }
+
+ /*
+ * here we steal into thet connection context,
+ * but p->transport.recv_data() will steal or free it again
+ */
+ talloc_steal(p, blob.data);
+ TALLOC_FREE(state);
+
+ if (p->transport.pending_reads > 0) {
+ p->transport.pending_reads--;
+
+ status = dcerpc_send_read(p);
+ if (!NT_STATUS_IS_OK(status)) {
+ dcerpc_transport_dead(p, status);
+ return;
+ }
+ }
+
+ dcerpc_recv_data(p, &blob, NT_STATUS_OK);
+}
+
+struct dcerpc_send_request_state {
+ struct dcecli_connection *p;
+ DATA_BLOB blob;
+ struct iovec iov;
+};
+
+static int dcerpc_send_request_state_destructor(struct dcerpc_send_request_state *state)
+{
+ struct dcecli_connection *p = state->p;
+
+ p->transport.read_subreq = NULL;
+
+ return 0;
+}
+
+static void dcerpc_send_request_wait_done(struct tevent_req *subreq);
+static void dcerpc_send_request_done(struct tevent_req *subreq);
+
+static NTSTATUS dcerpc_send_request(struct dcecli_connection *p, DATA_BLOB *data,
+ bool trigger_read)
+{
+ struct dcerpc_send_request_state *state;
+ struct tevent_req *subreq;
+ bool use_trans = trigger_read;
+
+ if (p->transport.stream == NULL) {
+ return NT_STATUS_CONNECTION_DISCONNECTED;
+ }
+
+ state = talloc_zero(p, struct dcerpc_send_request_state);
+ if (state == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ state->p = p;
+
+ state->blob = data_blob_talloc(state, data->data, data->length);
+ if (state->blob.data == NULL) {
+ TALLOC_FREE(state);
+ return NT_STATUS_NO_MEMORY;
+ }
+ state->iov.iov_base = (void *)state->blob.data;
+ state->iov.iov_len = state->blob.length;
+
+ if (p->transport.read_subreq != NULL) {
+ use_trans = false;
+ }
+
+ if (!tstream_is_smbXcli_np(p->transport.stream)) {
+ use_trans = false;
+ }
+
+ if (use_trans) {
+ /*
+ * we need to block reads until our write is
+ * the next in the write queue.
+ */
+ p->transport.read_subreq = tevent_queue_wait_send(state, p->event_ctx,
+ p->transport.write_queue);
+ if (p->transport.read_subreq == NULL) {
+ TALLOC_FREE(state);
+ return NT_STATUS_NO_MEMORY;
+ }
+ tevent_req_set_callback(p->transport.read_subreq,
+ dcerpc_send_request_wait_done,
+ state);
+
+ talloc_set_destructor(state, dcerpc_send_request_state_destructor);
+
+ trigger_read = false;
+ }
+
+ subreq = tstream_writev_queue_send(state, p->event_ctx,
+ p->transport.stream,
+ p->transport.write_queue,
+ &state->iov, 1);
+ if (subreq == NULL) {
+ TALLOC_FREE(state);
+ return NT_STATUS_NO_MEMORY;
+ }
+ tevent_req_set_callback(subreq, dcerpc_send_request_done, state);
+
+ if (trigger_read) {
+ dcerpc_send_read(p);
+ }
+
+ return NT_STATUS_OK;
+}
+
+static void dcerpc_send_request_wait_done(struct tevent_req *subreq)
+{
+ struct dcerpc_send_request_state *state =
+ tevent_req_callback_data(subreq,
+ struct dcerpc_send_request_state);
+ struct dcecli_connection *p = state->p;
+ NTSTATUS status;
+ bool ok;
+
+ p->transport.read_subreq = NULL;
+ talloc_set_destructor(state, NULL);
+
+ ok = tevent_queue_wait_recv(subreq);
+ if (!ok) {
+ TALLOC_FREE(state);
+ dcerpc_transport_dead(p, NT_STATUS_NO_MEMORY);
+ return;
+ }
+
+ if (tevent_queue_length(p->transport.write_queue) <= 2) {
+ status = tstream_smbXcli_np_use_trans(p->transport.stream);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(state);
+ dcerpc_transport_dead(p, status);
+ return;
+ }
+ }
+
+ /* we free subreq after tstream_cli_np_use_trans */
+ TALLOC_FREE(subreq);
+
+ dcerpc_send_read(p);
+}
+
+static void dcerpc_send_request_done(struct tevent_req *subreq)
+{
+ struct dcerpc_send_request_state *state =
+ tevent_req_callback_data(subreq,
+ struct dcerpc_send_request_state);
+ int ret;
+ int error;
+
+ ret = tstream_writev_queue_recv(subreq, &error);
+ TALLOC_FREE(subreq);
+ if (ret == -1) {
+ struct dcecli_connection *p = state->p;
+ NTSTATUS status = map_nt_error_from_unix_common(error);
+
+ TALLOC_FREE(state);
+ dcerpc_transport_dead(p, status);
+ return;
+ }
+
+ TALLOC_FREE(state);
+}
diff --git a/source4/librpc/rpc/dcerpc.h b/source4/librpc/rpc/dcerpc.h
new file mode 100644
index 0000000..a9cfc32
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc.h
@@ -0,0 +1,264 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ DCERPC client side interface structures
+
+ Copyright (C) Tim Potter 2003
+ Copyright (C) Andrew Tridgell 2003-2005
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+/* This is a public header file that is installed as part of Samba.
+ * If you remove any functions or change their signature, update
+ * the so version number. */
+
+#ifndef __S4_DCERPC_H__
+#define __S4_DCERPC_H__
+
+#include "../lib/util/data_blob.h"
+#include "librpc/gen_ndr/dcerpc.h"
+#include "../librpc/ndr/libndr.h"
+#include "../librpc/rpc/rpc_common.h"
+
+struct tevent_context;
+struct tevent_req;
+struct dcerpc_binding_handle;
+struct tstream_context;
+struct ndr_interface_table;
+struct resolve_context;
+
+/*
+ this defines a generic security context for signed/sealed dcerpc pipes.
+*/
+struct dcecli_connection;
+struct gensec_settings;
+struct cli_credentials;
+struct dcecli_security {
+ enum dcerpc_AuthType auth_type;
+ enum dcerpc_AuthLevel auth_level;
+ uint32_t auth_context_id;
+ struct {
+ struct dcerpc_auth *out;
+ struct dcerpc_auth *in;
+ TALLOC_CTX *mem;
+ } tmp_auth_info;
+ struct gensec_security *generic_state;
+
+ /* get the session key */
+ NTSTATUS (*session_key)(struct dcecli_connection *, DATA_BLOB *);
+
+ bool verified_bitmask1;
+
+};
+
+/*
+ this holds the information that is not specific to a particular rpc context_id
+*/
+struct rpc_request;
+struct dcecli_connection {
+ uint32_t call_id;
+ uint32_t srv_max_xmit_frag;
+ uint32_t srv_max_recv_frag;
+ uint32_t flags;
+ struct dcecli_security security_state;
+ struct tevent_context *event_ctx;
+
+ struct tevent_immediate *io_trigger;
+ bool io_trigger_pending;
+
+ /** Directory in which to save ndrdump-parseable files */
+ const char *packet_log_dir;
+
+ bool dead;
+ bool free_skipped;
+
+ struct dcerpc_transport {
+ enum dcerpc_transport_t transport;
+ void *private_data;
+ bool encrypted;
+
+ struct tstream_context *stream;
+ /** to serialize write events */
+ struct tevent_queue *write_queue;
+ /** the current active read request if any */
+ struct tevent_req *read_subreq;
+ /** number of read requests other than the current active */
+ uint32_t pending_reads;
+ } transport;
+
+ const char *server_name;
+
+ /* Requests that have been sent, waiting for a reply */
+ struct rpc_request *pending;
+
+ /* Sync requests waiting to be shipped */
+ struct rpc_request *request_queue;
+
+ /* the next context_id to be assigned */
+ uint32_t next_context_id;
+
+ /* The maximum total payload of reassembled response pdus */
+ size_t max_total_response_size;
+
+ /* the negotiated bind time features */
+ uint16_t bind_time_features;
+};
+
+/*
+ this encapsulates a full dcerpc client side pipe
+*/
+struct dcerpc_pipe {
+ struct dcerpc_binding_handle *binding_handle;
+
+ uint32_t context_id;
+
+ struct GUID object;
+ struct ndr_syntax_id syntax;
+ struct ndr_syntax_id transfer_syntax;
+
+ struct dcecli_connection *conn;
+ const struct dcerpc_binding *binding;
+
+ /** the last fault code from a DCERPC fault */
+ uint32_t last_fault_code;
+
+ /** timeout for individual rpc requests, in seconds */
+ uint32_t request_timeout;
+
+ /*
+ * Set for the timeout in dcerpc_pipe_connect_b_send(), to
+ * allow the timeout not to destroy the stack during a nested
+ * event loop caused by gensec_update()
+ */
+ bool inhibit_timeout_processing;
+ bool timed_out;
+
+ bool verified_pcontext;
+};
+
+/* default timeout for all rpc requests, in seconds */
+#define DCERPC_REQUEST_TIMEOUT 60
+
+struct epm_tower;
+struct epm_floor;
+
+struct smbcli_tree;
+struct smb2_tree;
+struct smbXcli_conn;
+struct smbXcli_session;
+struct smbXcli_tcon;
+struct roh_connection;
+struct tstream_tls_params;
+struct socket_address;
+
+NTSTATUS dcerpc_pipe_connect(TALLOC_CTX *parent_ctx,
+ struct dcerpc_pipe **pp,
+ const char *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx);
+const char *dcerpc_server_name(struct dcerpc_pipe *p);
+struct dcerpc_pipe *dcerpc_pipe_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev);
+NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe *p,
+ struct smbcli_tree *tree,
+ const char *pipe_name);
+NTSTATUS dcerpc_pipe_open_smb2(struct dcerpc_pipe *p,
+ struct smb2_tree *tree,
+ const char *pipe_name);
+NTSTATUS dcerpc_bind_auth_none(struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table);
+NTSTATUS dcerpc_fetch_session_key(struct dcerpc_pipe *p,
+ DATA_BLOB *session_key);
+bool dcerpc_transport_encrypted(struct dcerpc_pipe *p);
+struct composite_context;
+NTSTATUS dcerpc_secondary_connection_recv(struct composite_context *c,
+ struct dcerpc_pipe **p2);
+
+struct composite_context* dcerpc_pipe_connect_b_send(TALLOC_CTX *parent_ctx,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx);
+
+NTSTATUS dcerpc_pipe_connect_b_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p);
+
+NTSTATUS dcerpc_pipe_connect_b(TALLOC_CTX *parent_ctx,
+ struct dcerpc_pipe **pp,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx);
+
+NTSTATUS dcerpc_pipe_auth(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx);
+NTSTATUS dcerpc_init(void);
+struct composite_context *dcerpc_secondary_smb_send(struct dcecli_connection *c1,
+ struct dcecli_connection *c2,
+ const char *pipe_name);
+NTSTATUS dcerpc_secondary_smb_recv(struct composite_context *c);
+NTSTATUS dcerpc_secondary_context(struct dcerpc_pipe *p,
+ struct dcerpc_pipe **pp2,
+ const struct ndr_interface_table *table);
+NTSTATUS dcerpc_alter_context(struct dcerpc_pipe *p,
+ TALLOC_CTX *mem_ctx,
+ const struct ndr_syntax_id *syntax,
+ const struct ndr_syntax_id *transfer_syntax);
+
+NTSTATUS dcerpc_bind_auth(struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct gensec_settings *gensec_settings,
+ uint8_t auth_type, uint8_t auth_level,
+ const char *service);
+struct composite_context* dcerpc_pipe_connect_send(TALLOC_CTX *parent_ctx,
+ const char *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev, struct loadparm_context *lp_ctx);
+NTSTATUS dcerpc_pipe_connect_recv(struct composite_context *c,
+ TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **pp);
+
+NTSTATUS dcerpc_epm_map_binding(TALLOC_CTX *mem_ctx, struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table, struct tevent_context *ev,
+ struct loadparm_context *lp_ctx);
+struct composite_context* dcerpc_secondary_auth_connection_send(struct dcerpc_pipe *p,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx);
+NTSTATUS dcerpc_secondary_auth_connection_recv(struct composite_context *c,
+ TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p);
+NTSTATUS dcerpc_secondary_auth_connection(struct dcerpc_pipe *p,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx,
+ TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p2);
+
+struct composite_context* dcerpc_secondary_connection_send(struct dcerpc_pipe *p,
+ const struct dcerpc_binding *b);
+
+#endif /* __S4_DCERPC_H__ */
diff --git a/source4/librpc/rpc/dcerpc.py b/source4/librpc/rpc/dcerpc.py
new file mode 100644
index 0000000..64dd6e3
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc.py
@@ -0,0 +1,18 @@
+# Unix SMB/CIFS implementation.
+# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+
+from samba.dcerpc.base import *
diff --git a/source4/librpc/rpc/dcerpc_auth.c b/source4/librpc/rpc/dcerpc_auth.c
new file mode 100644
index 0000000..7f84bdf
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_auth.c
@@ -0,0 +1,556 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Generic Authentication Interface
+
+ Copyright (C) Andrew Tridgell 2003
+ Copyright (C) Andrew Bartlett <abartlet@samba.org> 2004-2005
+ Copyright (C) Stefan Metzmacher 2004
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include <tevent.h>
+#include "libcli/composite/composite.h"
+#include "auth/gensec/gensec.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "param/param.h"
+
+/*
+ return the rpc syntax and transfer syntax given the pipe uuid and version
+*/
+static NTSTATUS dcerpc_init_syntaxes(struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table,
+ struct ndr_syntax_id *syntax,
+ struct ndr_syntax_id *transfer_syntax)
+{
+ struct GUID *object = NULL;
+
+ p->object = dcerpc_binding_get_object(p->binding);
+ if (!GUID_all_zero(&p->object)) {
+ object = &p->object;
+ }
+
+ p->binding_handle = dcerpc_pipe_binding_handle(p, object, table);
+ if (p->binding_handle == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ syntax->uuid = table->syntax_id.uuid;
+ syntax->if_version = table->syntax_id.if_version;
+
+ if (p->conn->flags & DCERPC_NDR64) {
+ *transfer_syntax = ndr_transfer_syntax_ndr64;
+ } else {
+ *transfer_syntax = ndr_transfer_syntax_ndr;
+ }
+
+ return NT_STATUS_OK;
+}
+
+
+/*
+ Send request to do a non-authenticated dcerpc bind
+*/
+static void dcerpc_bind_auth_none_done(struct tevent_req *subreq);
+
+struct composite_context *dcerpc_bind_auth_none_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table)
+{
+ struct ndr_syntax_id syntax;
+ struct ndr_syntax_id transfer_syntax;
+
+ struct composite_context *c;
+ struct tevent_req *subreq;
+
+ c = composite_create(mem_ctx, p->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ c->status = dcerpc_init_syntaxes(p, table,
+ &syntax, &transfer_syntax);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(2,("Invalid uuid string in "
+ "dcerpc_bind_auth_none_send\n"));
+ composite_error(c, c->status);
+ return c;
+ }
+
+ subreq = dcerpc_bind_send(mem_ctx, p->conn->event_ctx, p,
+ &syntax, &transfer_syntax);
+ if (composite_nomem(subreq, c)) return c;
+ tevent_req_set_callback(subreq, dcerpc_bind_auth_none_done, c);
+
+ return c;
+}
+
+static void dcerpc_bind_auth_none_done(struct tevent_req *subreq)
+{
+ struct composite_context *ctx =
+ tevent_req_callback_data(subreq,
+ struct composite_context);
+
+ ctx->status = dcerpc_bind_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(ctx)) return;
+
+ composite_done(ctx);
+}
+
+/*
+ Receive result of a non-authenticated dcerpc bind
+*/
+NTSTATUS dcerpc_bind_auth_none_recv(struct composite_context *ctx)
+{
+ NTSTATUS result = composite_wait(ctx);
+ TALLOC_FREE(ctx);
+ return result;
+}
+
+
+/*
+ Perform sync non-authenticated dcerpc bind
+*/
+_PUBLIC_ NTSTATUS dcerpc_bind_auth_none(struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table)
+{
+ struct composite_context *ctx;
+
+ ctx = dcerpc_bind_auth_none_send(p, p, table);
+ return dcerpc_bind_auth_none_recv(ctx);
+}
+
+
+struct bind_auth_state {
+ struct dcerpc_pipe *pipe;
+ struct ndr_syntax_id syntax;
+ struct ndr_syntax_id transfer_syntax;
+ struct dcerpc_auth out_auth_info;
+ struct dcerpc_auth in_auth_info;
+ bool more_processing; /* Is there anything more to do after the
+ * first bind itself received? */
+};
+
+static void bind_auth_next_gensec_done(struct tevent_req *subreq);
+static void bind_auth_recv_alter(struct tevent_req *subreq);
+
+static void bind_auth_next_step(struct composite_context *c)
+{
+ struct bind_auth_state *state;
+ struct dcecli_security *sec;
+ struct tevent_req *subreq;
+
+ state = talloc_get_type(c->private_data, struct bind_auth_state);
+ sec = &state->pipe->conn->security_state;
+
+ if (state->in_auth_info.auth_type != sec->auth_type) {
+ composite_error(c, NT_STATUS_RPC_PROTOCOL_ERROR);
+ return;
+ }
+
+ if (state->in_auth_info.auth_level != sec->auth_level) {
+ composite_error(c, NT_STATUS_RPC_PROTOCOL_ERROR);
+ return;
+ }
+
+ if (state->in_auth_info.auth_context_id != sec->auth_context_id) {
+ composite_error(c, NT_STATUS_RPC_PROTOCOL_ERROR);
+ return;
+ }
+
+ state->out_auth_info = (struct dcerpc_auth) {
+ .auth_type = sec->auth_type,
+ .auth_level = sec->auth_level,
+ .auth_context_id = sec->auth_context_id,
+ };
+
+ /* The status value here, from GENSEC is vital to the security
+ * of the system. Even if the other end accepts, if GENSEC
+ * claims 'MORE_PROCESSING_REQUIRED' then you must keep
+ * feeding it blobs, or else the remote host/attacker might
+ * avoid mutual authentication requirements.
+ *
+ * Likewise, you must not feed GENSEC too much (after the OK),
+ * it doesn't like that either
+ */
+
+ state->pipe->inhibit_timeout_processing = true;
+ state->pipe->timed_out = false;
+
+ subreq = gensec_update_send(state,
+ state->pipe->conn->event_ctx,
+ sec->generic_state,
+ state->in_auth_info.credentials);
+ if (composite_nomem(subreq, c)) return;
+ tevent_req_set_callback(subreq, bind_auth_next_gensec_done, c);
+}
+
+static void bind_auth_next_gensec_done(struct tevent_req *subreq)
+{
+ struct composite_context *c =
+ tevent_req_callback_data(subreq,
+ struct composite_context);
+ struct bind_auth_state *state =
+ talloc_get_type_abort(c->private_data,
+ struct bind_auth_state);
+ struct dcerpc_pipe *p = state->pipe;
+ struct dcecli_security *sec = &p->conn->security_state;
+ bool more_processing = false;
+
+ state->pipe->inhibit_timeout_processing = false;
+
+ c->status = gensec_update_recv(subreq, state,
+ &state->out_auth_info.credentials);
+ TALLOC_FREE(subreq);
+
+ if (NT_STATUS_EQUAL(c->status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+ more_processing = true;
+ c->status = NT_STATUS_OK;
+ }
+
+ if (!composite_is_ok(c)) return;
+
+ if (!more_processing) {
+ if (state->pipe->conn->flags & DCERPC_HEADER_SIGNING) {
+ gensec_want_feature(sec->generic_state,
+ GENSEC_FEATURE_SIGN_PKT_HEADER);
+ }
+ }
+
+ if (state->out_auth_info.credentials.length == 0) {
+ composite_done(c);
+ return;
+ }
+
+ state->in_auth_info = (struct dcerpc_auth) {
+ .auth_type = DCERPC_AUTH_TYPE_NONE,
+ };
+ sec->tmp_auth_info.in = &state->in_auth_info;
+ sec->tmp_auth_info.mem = state;
+ sec->tmp_auth_info.out = &state->out_auth_info;
+
+ if (!more_processing) {
+ /* NO reply expected, so just send it */
+ c->status = dcerpc_auth3(state->pipe, state);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+ return;
+ }
+
+ /* We are demanding a reply, so use a request that will get us one */
+
+ subreq = dcerpc_alter_context_send(state, state->pipe->conn->event_ctx,
+ state->pipe,
+ &state->pipe->syntax,
+ &state->pipe->transfer_syntax);
+ if (composite_nomem(subreq, c)) return;
+ tevent_req_set_callback(subreq, bind_auth_recv_alter, c);
+}
+
+
+static void bind_auth_recv_alter(struct tevent_req *subreq)
+{
+ struct composite_context *c =
+ tevent_req_callback_data(subreq,
+ struct composite_context);
+ struct bind_auth_state *state = talloc_get_type(c->private_data,
+ struct bind_auth_state);
+ struct dcecli_security *sec = &state->pipe->conn->security_state;
+
+ ZERO_STRUCT(sec->tmp_auth_info);
+
+ c->status = dcerpc_alter_context_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ bind_auth_next_step(c);
+}
+
+
+static void bind_auth_recv_bindreply(struct tevent_req *subreq)
+{
+ struct composite_context *c =
+ tevent_req_callback_data(subreq,
+ struct composite_context);
+ struct bind_auth_state *state = talloc_get_type(c->private_data,
+ struct bind_auth_state);
+ struct dcecli_security *sec = &state->pipe->conn->security_state;
+
+ ZERO_STRUCT(sec->tmp_auth_info);
+
+ c->status = dcerpc_bind_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ if (!state->more_processing) {
+ /* The first gensec_update has not requested a second run, so
+ * we're done here. */
+ composite_done(c);
+ return;
+ }
+
+ bind_auth_next_step(c);
+}
+
+
+static void dcerpc_bind_auth_gensec_done(struct tevent_req *subreq);
+
+/**
+ Bind to a DCE/RPC pipe, send async request
+ @param mem_ctx TALLOC_CTX for the allocation of the composite_context
+ @param p The dcerpc_pipe to bind (must already be connected)
+ @param table The interface table to use (the DCE/RPC bind both selects and interface and authenticates)
+ @param credentials The credentials of the account to connect with
+ @param auth_type Select the authentication scheme to use
+ @param auth_level Chooses between unprotected (connect), signed or sealed
+ @param service The service (used by Kerberos to select the service principal to contact)
+ @retval A composite context describing the partial state of the bind
+*/
+
+struct composite_context *dcerpc_bind_auth_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct gensec_settings *gensec_settings,
+ uint8_t auth_type, uint8_t auth_level,
+ const char *service)
+{
+ struct composite_context *c;
+ struct bind_auth_state *state;
+ struct dcecli_security *sec;
+ struct tevent_req *subreq;
+ const char *target_principal = NULL;
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, p->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ state = talloc(c, struct bind_auth_state);
+ if (composite_nomem(state, c)) return c;
+ c->private_data = state;
+
+ state->pipe = p;
+
+ c->status = dcerpc_init_syntaxes(p, table,
+ &state->syntax,
+ &state->transfer_syntax);
+ if (!composite_is_ok(c)) return c;
+
+ sec = &p->conn->security_state;
+
+ c->status = gensec_client_start(p, &sec->generic_state,
+ gensec_settings);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(1, ("Failed to start GENSEC client mode: %s\n",
+ nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return c;
+ }
+
+ c->status = gensec_set_credentials(sec->generic_state, credentials);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(1, ("Failed to set GENSEC client credentials: %s\n",
+ nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return c;
+ }
+
+ c->status = gensec_set_target_hostname(sec->generic_state,
+ dcerpc_server_name(p));
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(1, ("Failed to set GENSEC target hostname: %s\n",
+ nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return c;
+ }
+
+ if (service != NULL) {
+ c->status = gensec_set_target_service(sec->generic_state,
+ service);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(1, ("Failed to set GENSEC target service: %s\n",
+ nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return c;
+ }
+ }
+
+ if (p->binding != NULL) {
+ target_principal = dcerpc_binding_get_string_option(p->binding,
+ "target_principal");
+ }
+ if (target_principal != NULL) {
+ c->status = gensec_set_target_principal(sec->generic_state,
+ target_principal);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(1, ("Failed to set GENSEC target principal to %s: %s\n",
+ target_principal, nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return c;
+ }
+ }
+
+ c->status = gensec_start_mech_by_authtype(sec->generic_state,
+ auth_type, auth_level);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(1, ("Failed to start GENSEC client mechanism %s: %s\n",
+ gensec_get_name_by_authtype(sec->generic_state, auth_type),
+ nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return c;
+ }
+
+ sec->auth_type = auth_type;
+ sec->auth_level = auth_level,
+ /*
+ * We use auth_context_id = 1 as some older
+ * Samba versions (<= 4.2.3) use that value hardcoded
+ * in a response.
+ */
+ sec->auth_context_id = 1;
+
+ state->out_auth_info = (struct dcerpc_auth) {
+ .auth_type = sec->auth_type,
+ .auth_level = sec->auth_level,
+ .auth_context_id = sec->auth_context_id,
+ };
+
+ /* The status value here, from GENSEC is vital to the security
+ * of the system. Even if the other end accepts, if GENSEC
+ * claims 'MORE_PROCESSING_REQUIRED' then you must keep
+ * feeding it blobs, or else the remote host/attacker might
+ * avoid mutual authentication requirements.
+ *
+ * Likewise, you must not feed GENSEC too much (after the OK),
+ * it doesn't like that either
+ */
+
+ state->pipe->inhibit_timeout_processing = true;
+ state->pipe->timed_out = false;
+
+ subreq = gensec_update_send(state,
+ p->conn->event_ctx,
+ sec->generic_state,
+ data_blob_null);
+ if (composite_nomem(subreq, c)) return c;
+ tevent_req_set_callback(subreq, dcerpc_bind_auth_gensec_done, c);
+
+ return c;
+}
+
+static void dcerpc_bind_auth_gensec_done(struct tevent_req *subreq)
+{
+ struct composite_context *c =
+ tevent_req_callback_data(subreq,
+ struct composite_context);
+ struct bind_auth_state *state =
+ talloc_get_type_abort(c->private_data,
+ struct bind_auth_state);
+ struct dcerpc_pipe *p = state->pipe;
+ struct dcecli_security *sec = &p->conn->security_state;
+
+ state->pipe->inhibit_timeout_processing = false;
+
+ c->status = gensec_update_recv(subreq, state,
+ &state->out_auth_info.credentials);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(c->status) &&
+ !NT_STATUS_EQUAL(c->status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+ composite_error(c, c->status);
+ return;
+ }
+
+ state->more_processing = NT_STATUS_EQUAL(c->status,
+ NT_STATUS_MORE_PROCESSING_REQUIRED);
+
+ if (state->out_auth_info.credentials.length == 0) {
+ composite_done(c);
+ return;
+ }
+
+ if (gensec_have_feature(sec->generic_state, GENSEC_FEATURE_SIGN_PKT_HEADER)) {
+ if (sec->auth_level >= DCERPC_AUTH_LEVEL_PACKET) {
+ state->pipe->conn->flags |= DCERPC_PROPOSE_HEADER_SIGNING;
+ }
+ }
+
+ state->in_auth_info = (struct dcerpc_auth) {
+ .auth_type = DCERPC_AUTH_TYPE_NONE,
+ };
+ sec->tmp_auth_info.in = &state->in_auth_info;
+ sec->tmp_auth_info.mem = state;
+ sec->tmp_auth_info.out = &state->out_auth_info;
+
+ /* The first request always is a dcerpc_bind. The subsequent ones
+ * depend on gensec results */
+ subreq = dcerpc_bind_send(state, p->conn->event_ctx, p,
+ &state->syntax, &state->transfer_syntax);
+ if (composite_nomem(subreq, c)) return;
+ tevent_req_set_callback(subreq, bind_auth_recv_bindreply, c);
+
+ return;
+}
+
+
+/**
+ Bind to a DCE/RPC pipe, receive result
+ @param creq A composite context describing state of async call
+ @retval NTSTATUS code
+*/
+
+NTSTATUS dcerpc_bind_auth_recv(struct composite_context *creq)
+{
+ NTSTATUS result = composite_wait(creq);
+ struct bind_auth_state *state = talloc_get_type(creq->private_data,
+ struct bind_auth_state);
+
+ if (NT_STATUS_IS_OK(result)) {
+ /*
+ after a successful authenticated bind the session
+ key reverts to the generic session key
+ */
+ state->pipe->conn->security_state.session_key = dcecli_generic_session_key;
+ }
+
+ talloc_free(creq);
+ return result;
+}
+
+
+/**
+ Perform a GENSEC authenticated bind to a DCE/RPC pipe, sync
+ @param p The dcerpc_pipe to bind (must already be connected)
+ @param table The interface table to use (the DCE/RPC bind both selects and interface and authenticates)
+ @param credentials The credentials of the account to connect with
+ @param auth_type Select the authentication scheme to use
+ @param auth_level Chooses between unprotected (connect), signed or sealed
+ @param service The service (used by Kerberos to select the service principal to contact)
+ @retval NTSTATUS status code
+*/
+
+_PUBLIC_ NTSTATUS dcerpc_bind_auth(struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct gensec_settings *gensec_settings,
+ uint8_t auth_type, uint8_t auth_level,
+ const char *service)
+{
+ struct composite_context *creq;
+ creq = dcerpc_bind_auth_send(p, p, table, credentials, gensec_settings,
+ auth_type, auth_level, service);
+ return dcerpc_bind_auth_recv(creq);
+}
diff --git a/source4/librpc/rpc/dcerpc_connect.c b/source4/librpc/rpc/dcerpc_connect.c
new file mode 100644
index 0000000..69183a2
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_connect.c
@@ -0,0 +1,1252 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ dcerpc connect functions
+
+ Copyright (C) Andrew Tridgell 2003
+ Copyright (C) Jelmer Vernooij 2004
+ Copyright (C) Andrew Bartlett <abartlet@samba.org> 2005-2007
+ Copyright (C) Rafal Szczesniak 2005
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include "includes.h"
+#include "libcli/composite/composite.h"
+#include "libcli/smb_composite/smb_composite.h"
+#include "lib/events/events.h"
+#include "libcli/smb2/smb2.h"
+#include "libcli/smb2/smb2_calls.h"
+#include "libcli/smb/smbXcli_base.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "auth/credentials/credentials.h"
+#include "param/param.h"
+#include "libcli/resolve/resolve.h"
+#include "libcli/http/http.h"
+#include "lib/util/util_net.h"
+
+#undef strcasecmp
+
+struct dcerpc_pipe_connect {
+ struct dcecli_connection *conn;
+ struct dcerpc_binding *binding;
+ const struct ndr_interface_table *interface;
+ struct cli_credentials *creds;
+ struct resolve_context *resolve_ctx;
+ struct {
+ const char *dir;
+ } ncalrpc;
+ struct {
+ struct smbXcli_conn *conn;
+ struct smbXcli_session *session;
+ struct smbXcli_tcon *tcon;
+ const char *pipe_name;
+ } smb;
+};
+
+struct pipe_np_smb_state {
+ struct smb_composite_connect conn;
+ struct dcerpc_pipe_connect io;
+};
+
+
+/*
+ Stage 3 of ncacn_np_smb: Named pipe opened (or not)
+*/
+static void continue_pipe_open_smb(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ /* receive result of named pipe open request on smb */
+ c->status = dcerpc_pipe_open_smb_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+static void continue_smb_open(struct composite_context *c);
+static void continue_smb2_connect(struct tevent_req *subreq);
+static void continue_smbXcli_connect(struct tevent_req *subreq);
+
+/*
+ Stage 2 of ncacn_np_smb: Open a named pipe after successful smb connection
+*/
+static void continue_smb_connect(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_np_smb_state *s = talloc_get_type(c->private_data,
+ struct pipe_np_smb_state);
+ struct smbcli_tree *t;
+
+ /* receive result of smb connect request */
+ c->status = smb_composite_connect_recv(ctx, s->io.conn);
+ if (!composite_is_ok(c)) return;
+
+ t = s->conn.out.tree;
+
+ /* prepare named pipe open parameters */
+ s->io.smb.conn = t->session->transport->conn;
+ s->io.smb.session = t->session->smbXcli;
+ s->io.smb.tcon = t->smbXcli;
+ smb1cli_tcon_set_id(s->io.smb.tcon, t->tid);
+ s->io.smb.pipe_name = dcerpc_binding_get_string_option(s->io.binding,
+ "endpoint");
+
+ continue_smb_open(c);
+}
+
+static void continue_smb_open(struct composite_context *c)
+{
+ struct pipe_np_smb_state *s = talloc_get_type(c->private_data,
+ struct pipe_np_smb_state);
+ struct composite_context *open_ctx;
+
+ /* send named pipe open request */
+ open_ctx = dcerpc_pipe_open_smb_send(s->io.conn,
+ s->io.smb.conn,
+ s->io.smb.session,
+ s->io.smb.tcon,
+ DCERPC_REQUEST_TIMEOUT * 1000,
+ s->io.smb.pipe_name);
+ if (composite_nomem(open_ctx, c)) return;
+
+ composite_continue(c, open_ctx, continue_pipe_open_smb, c);
+}
+
+
+/*
+ Initiate async open of a rpc connection to a rpc pipe on SMB using
+ the binding structure to determine the endpoint and options
+*/
+static struct composite_context *dcerpc_pipe_connect_ncacn_np_smb_send(TALLOC_CTX *mem_ctx, struct dcerpc_pipe_connect *io, struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct pipe_np_smb_state *s;
+ struct tevent_req *subreq = NULL;
+ struct smb_composite_connect *conn;
+ uint32_t flags;
+ const char *target_hostname = NULL;
+ const char *dest_address = NULL;
+ const char *calling_name = NULL;
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, io->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_np_smb_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ s->io = *io;
+ conn = &s->conn;
+
+ if (smbXcli_conn_is_connected(s->io.smb.conn)) {
+ continue_smb_open(c);
+ return c;
+ }
+
+ if (s->io.creds == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ /* prepare smb connection parameters: we're connecting to IPC$ share on
+ remote rpc server */
+ target_hostname = dcerpc_binding_get_string_option(s->io.binding, "target_hostname");
+ conn->in.dest_host = dcerpc_binding_get_string_option(s->io.binding, "host");
+ conn->in.dest_ports = lpcfg_smb_ports(lp_ctx);
+ conn->in.called_name = target_hostname;
+ if (conn->in.called_name == NULL) {
+ conn->in.called_name = "*SMBSERVER";
+ }
+ conn->in.socket_options = lpcfg_socket_options(lp_ctx);
+ conn->in.service = "IPC$";
+ conn->in.service_type = NULL;
+ conn->in.workgroup = lpcfg_workgroup(lp_ctx);
+ conn->in.gensec_settings = lpcfg_gensec_settings(conn, lp_ctx);
+
+ lpcfg_smbcli_options(lp_ctx, &conn->in.options);
+ lpcfg_smbcli_session_options(lp_ctx, &conn->in.session_options);
+
+ /*
+ * provide proper credentials - user supplied, but allow a
+ * fallback to anonymous if this is an schannel connection
+ * (might be NT4 not allowing machine logins at session
+ * setup) or if asked to do so by the caller (perhaps a SAMR password change?)
+ */
+ s->conn.in.credentials = s->io.creds;
+ flags = dcerpc_binding_get_flags(s->io.binding);
+ if (flags & (DCERPC_SCHANNEL|DCERPC_ANON_FALLBACK)) {
+ conn->in.fallback_to_anonymous = true;
+ } else {
+ conn->in.fallback_to_anonymous = false;
+ }
+
+ conn->in.options.min_protocol = lpcfg_client_ipc_min_protocol(lp_ctx);
+ conn->in.options.max_protocol = lpcfg_client_ipc_max_protocol(lp_ctx);
+ if ((flags & DCERPC_SMB1) && (flags & DCERPC_SMB2)) {
+ /* auto */
+ } else if (flags & DCERPC_SMB2) {
+ if (conn->in.options.min_protocol < PROTOCOL_SMB2_02) {
+ conn->in.options.min_protocol = PROTOCOL_SMB2_02;
+ }
+ if (conn->in.options.max_protocol < PROTOCOL_SMB2_02) {
+ conn->in.options.max_protocol = PROTOCOL_LATEST;
+ }
+ } else if (flags & DCERPC_SMB1) {
+ conn->in.options.min_protocol = PROTOCOL_NT1;
+ conn->in.options.max_protocol = PROTOCOL_NT1;
+ } else {
+ /* auto */
+ }
+
+ conn->in.options.signing = lpcfg_client_ipc_signing(lp_ctx);
+
+ if (s->conn.in.credentials != NULL) {
+ calling_name = cli_credentials_get_workstation(s->conn.in.credentials);
+ }
+ if (calling_name == NULL) {
+ calling_name = "SMBCLIENT";
+ }
+
+ if (target_hostname == NULL) {
+ target_hostname = conn->in.dest_host;
+ }
+
+ if (conn->in.dest_host != NULL && is_ipaddress(conn->in.dest_host)) {
+ dest_address = conn->in.dest_host;
+ }
+
+ subreq = smb_connect_nego_send(s,
+ c->event_ctx,
+ s->io.resolve_ctx,
+ &conn->in.options,
+ conn->in.socket_options,
+ conn->in.dest_host,
+ dest_address,
+ conn->in.dest_ports,
+ target_hostname,
+ conn->in.called_name,
+ calling_name);
+ if (composite_nomem(subreq, c)) return c;
+ tevent_req_set_callback(subreq,
+ continue_smbXcli_connect,
+ c);
+
+ return c;
+}
+
+static void continue_smbXcli_connect(struct tevent_req *subreq)
+{
+ struct composite_context *c =
+ tevent_req_callback_data(subreq,
+ struct composite_context);
+ struct pipe_np_smb_state *s =
+ talloc_get_type_abort(c->private_data,
+ struct pipe_np_smb_state);
+ struct smb_composite_connect *conn = &s->conn;
+ struct composite_context *creq = NULL;
+ enum protocol_types protocol;
+
+ c->status = smb_connect_nego_recv(subreq, s,
+ &conn->in.existing_conn);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ protocol = smbXcli_conn_protocol(conn->in.existing_conn);
+ if (protocol >= PROTOCOL_SMB2_02) {
+ /*
+ * continue with smb2 session setup/tree connect
+ * on the established connection.
+ */
+ subreq = smb2_connect_send(s, c->event_ctx,
+ conn->in.dest_host,
+ conn->in.dest_ports,
+ conn->in.service,
+ s->io.resolve_ctx,
+ conn->in.credentials,
+ conn->in.fallback_to_anonymous,
+ &conn->in.existing_conn,
+ 0, /* previous_session_id */
+ &conn->in.options,
+ conn->in.socket_options,
+ conn->in.gensec_settings);
+ if (composite_nomem(subreq, c)) return;
+ tevent_req_set_callback(subreq, continue_smb2_connect, c);
+ return;
+ }
+
+ /*
+ * continue with smb1 session setup/tree connect
+ * on the established connection.
+ */
+ creq = smb_composite_connect_send(conn, s->io.conn,
+ s->io.resolve_ctx,
+ c->event_ctx);
+ if (composite_nomem(creq, c)) return;
+
+ composite_continue(c, creq, continue_smb_connect, c);
+ return;
+}
+
+
+/*
+ Receive result of a rpc connection to a rpc pipe on SMB
+*/
+static NTSTATUS dcerpc_pipe_connect_ncacn_np_smb_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+/*
+ Stage 2 of ncacn_np_smb2: Open a named pipe after successful smb2 connection
+*/
+static void continue_smb2_connect(struct tevent_req *subreq)
+{
+ struct composite_context *c =
+ tevent_req_callback_data(subreq,
+ struct composite_context);
+ struct pipe_np_smb_state *s = talloc_get_type(c->private_data,
+ struct pipe_np_smb_state);
+ struct smb2_tree *t;
+
+ /* receive result of smb2 connect request */
+ c->status = smb2_connect_recv(subreq, s->io.conn, &t);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ s->io.smb.conn = t->session->transport->conn;
+ s->io.smb.session = t->session->smbXcli;
+ s->io.smb.tcon = t->smbXcli;
+ s->io.smb.pipe_name = dcerpc_binding_get_string_option(s->io.binding,
+ "endpoint");
+
+ continue_smb_open(c);
+}
+
+
+struct pipe_ip_tcp_state {
+ struct dcerpc_pipe_connect io;
+ const char *localaddr;
+ const char *host;
+ const char *target_hostname;
+ uint32_t port;
+};
+
+
+/*
+ Stage 2 of ncacn_ip_tcp: rpc pipe opened (or not)
+*/
+static void continue_pipe_open_ncacn_ip_tcp(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_ip_tcp_state *s = talloc_get_type(c->private_data,
+ struct pipe_ip_tcp_state);
+ char *localaddr = NULL;
+ char *remoteaddr = NULL;
+
+ /* receive result of named pipe open request on tcp/ip */
+ c->status = dcerpc_pipe_open_tcp_recv(ctx, s, &localaddr, &remoteaddr);
+ if (!composite_is_ok(c)) return;
+
+ c->status = dcerpc_binding_set_string_option(s->io.binding,
+ "localaddress",
+ localaddr);
+ if (!composite_is_ok(c)) return;
+
+ c->status = dcerpc_binding_set_string_option(s->io.binding,
+ "host",
+ remoteaddr);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ Initiate async open of a rpc connection to a rpc pipe on TCP/IP using
+ the binding structure to determine the endpoint and options
+*/
+static struct composite_context* dcerpc_pipe_connect_ncacn_ip_tcp_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ struct pipe_ip_tcp_state *s;
+ struct composite_context *pipe_req;
+ const char *endpoint;
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, io->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_ip_tcp_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store input parameters in state structure */
+ s->io = *io;
+ s->localaddr = dcerpc_binding_get_string_option(io->binding,
+ "localaddress");
+ s->host = dcerpc_binding_get_string_option(io->binding, "host");
+ s->target_hostname = dcerpc_binding_get_string_option(io->binding,
+ "target_hostname");
+ endpoint = dcerpc_binding_get_string_option(io->binding, "endpoint");
+ /* port number is a binding endpoint here */
+ if (endpoint != NULL) {
+ s->port = atoi(endpoint);
+ }
+
+ if (s->port == 0) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ /* send pipe open request on tcp/ip */
+ pipe_req = dcerpc_pipe_open_tcp_send(s->io.conn, s->localaddr, s->host, s->target_hostname,
+ s->port, io->resolve_ctx);
+ composite_continue(c, pipe_req, continue_pipe_open_ncacn_ip_tcp, c);
+ return c;
+}
+
+
+/*
+ Receive result of a rpc connection to a rpc pipe on TCP/IP
+*/
+static NTSTATUS dcerpc_pipe_connect_ncacn_ip_tcp_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+struct pipe_http_state {
+ struct dcerpc_pipe_connect io;
+ const char *localaddr;
+ const char *target_hostname;
+ const char *rpc_server;
+ uint32_t rpc_server_port;
+ char *rpc_proxy;
+ uint32_t rpc_proxy_port;
+ char *http_proxy;
+ uint32_t http_proxy_port;
+ bool use_tls;
+ bool use_proxy;
+ enum http_auth_method http_auth;
+ struct loadparm_context *lp_ctx;
+};
+
+/*
+ Stage 2 of ncacn_http: rpc pipe opened (or not)
+ */
+static void continue_pipe_open_ncacn_http(struct tevent_req *subreq)
+{
+ struct composite_context *c = NULL;
+ struct pipe_http_state *s = NULL;
+ struct tstream_context *stream = NULL;
+ struct tevent_queue *queue = NULL;
+
+ c = tevent_req_callback_data(subreq, struct composite_context);
+ s = talloc_get_type(c->private_data, struct pipe_http_state);
+
+ /* receive result of RoH connect request */
+ c->status = dcerpc_pipe_open_roh_recv(subreq, s->io.conn,
+ &stream, &queue);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ s->io.conn->transport.transport = NCACN_HTTP;
+ s->io.conn->transport.stream = stream;
+ s->io.conn->transport.write_queue = queue;
+ s->io.conn->transport.pending_reads = 0;
+ s->io.conn->server_name = strupper_talloc(s->io.conn,
+ s->target_hostname);
+
+ composite_done(c);
+}
+
+/*
+ Initiate async open of a rpc connection to a rpc pipe using HTTP transport,
+ and using the binding structure to determine the endpoint and options
+*/
+static struct composite_context* dcerpc_pipe_connect_ncacn_http_send(
+ TALLOC_CTX *mem_ctx, struct dcerpc_pipe_connect *io,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct pipe_http_state *s;
+ struct tevent_req *subreq;
+ const char *endpoint;
+ const char *use_proxy;
+ char *proxy;
+ char *port;
+ const char *opt;
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, io->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_http_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store input parameters in state structure */
+ s->lp_ctx = lp_ctx;
+ s->io = *io;
+ s->localaddr = dcerpc_binding_get_string_option(io->binding,
+ "localaddress");
+ /* RPC server and port (the endpoint) */
+ s->rpc_server = dcerpc_binding_get_string_option(io->binding, "host");
+ s->target_hostname = dcerpc_binding_get_string_option(io->binding,
+ "target_hostname");
+ endpoint = dcerpc_binding_get_string_option(io->binding, "endpoint");
+ if (endpoint == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+ s->rpc_server_port = atoi(endpoint);
+ if (s->rpc_server_port == 0) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ /* Use TLS */
+ opt = dcerpc_binding_get_string_option(io->binding, "HttpUseTls");
+ if (opt) {
+ if (strcasecmp(opt, "true") == 0) {
+ s->use_tls = true;
+ } else if (strcasecmp(opt, "false") == 0) {
+ s->use_tls = false;
+ } else {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+ } else {
+ s->use_tls = true;
+ }
+
+ /* RPC Proxy */
+ proxy = port = talloc_strdup(s, dcerpc_binding_get_string_option(
+ io->binding, "RpcProxy"));
+ s->rpc_proxy = strsep(&port, ":");
+ if (proxy && port) {
+ s->rpc_proxy_port = atoi(port);
+ } else {
+ s->rpc_proxy_port = s->use_tls ? 443 : 80;
+ }
+ if (s->rpc_proxy == NULL) {
+ s->rpc_proxy = talloc_strdup(s, s->rpc_server);
+ if (composite_nomem(s->rpc_proxy, c)) return c;
+ }
+
+ /* HTTP Proxy */
+ proxy = port = talloc_strdup(s, dcerpc_binding_get_string_option(
+ io->binding, "HttpProxy"));
+ s->http_proxy = strsep(&port, ":");
+ if (proxy && port) {
+ s->http_proxy_port = atoi(port);
+ } else {
+ s->http_proxy_port = s->use_tls ? 443 : 80;
+ }
+
+ /* Use local proxy */
+ use_proxy = dcerpc_binding_get_string_option(io->binding,
+ "HttpConnectOption");
+ if (use_proxy && strcasecmp(use_proxy, "UseHttpProxy")) {
+ s->use_proxy = true;
+ }
+
+ /* If use local proxy set, the http proxy should be provided */
+ if (s->use_proxy && !s->http_proxy) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ /* Check which HTTP authentication method to use */
+ opt = dcerpc_binding_get_string_option(io->binding, "HttpAuthOption");
+ if (opt) {
+ if (strcasecmp(opt, "basic") == 0) {
+ s->http_auth = HTTP_AUTH_BASIC;
+ } else if (strcasecmp(opt, "ntlm") == 0) {
+ s->http_auth = HTTP_AUTH_NTLM;
+ } else if (strcasecmp(opt, "negotiate") == 0) {
+ s->http_auth = HTTP_AUTH_NEGOTIATE;
+ } else {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+ } else {
+ s->http_auth = HTTP_AUTH_NTLM;
+ }
+
+ subreq = dcerpc_pipe_open_roh_send(s->io.conn, s->localaddr,
+ s->rpc_server, s->rpc_server_port,
+ s->rpc_proxy, s->rpc_proxy_port,
+ s->http_proxy, s->http_proxy_port,
+ s->use_tls, s->use_proxy,
+ s->io.creds, io->resolve_ctx,
+ s->lp_ctx, s->http_auth);
+ if (composite_nomem(subreq, c)) return c;
+
+ tevent_req_set_callback(subreq, continue_pipe_open_ncacn_http, c);
+ return c;
+}
+
+static NTSTATUS dcerpc_pipe_connect_ncacn_http_recv(struct composite_context *c)
+{
+ return composite_wait_free(c);
+}
+
+
+struct pipe_unix_state {
+ struct dcerpc_pipe_connect io;
+ const char *path;
+};
+
+
+/*
+ Stage 2 of ncacn_unix: rpc pipe opened (or not)
+*/
+static void continue_pipe_open_ncacn_unix_stream(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ /* receive result of pipe open request on unix socket */
+ c->status = dcerpc_pipe_open_unix_stream_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ Initiate async open of a rpc connection to a rpc pipe on unix socket using
+ the binding structure to determine the endpoint and options
+*/
+static struct composite_context* dcerpc_pipe_connect_ncacn_unix_stream_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ struct pipe_unix_state *s;
+ struct composite_context *pipe_req;
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, io->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_unix_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* prepare pipe open parameters and store them in state structure
+ also, verify whether biding endpoint is not null */
+ s->io = *io;
+
+ s->path = dcerpc_binding_get_string_option(io->binding, "endpoint");
+ if (s->path == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ /* send pipe open request on unix socket */
+ pipe_req = dcerpc_pipe_open_unix_stream_send(s->io.conn, s->path);
+ composite_continue(c, pipe_req, continue_pipe_open_ncacn_unix_stream, c);
+ return c;
+}
+
+
+/*
+ Receive result of a rpc connection to a pipe on unix socket
+*/
+static NTSTATUS dcerpc_pipe_connect_ncacn_unix_stream_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+struct pipe_ncalrpc_state {
+ struct dcerpc_pipe_connect io;
+};
+
+static NTSTATUS dcerpc_pipe_connect_ncalrpc_recv(struct composite_context *c);
+
+/*
+ Stage 2 of ncalrpc: rpc pipe opened (or not)
+*/
+static void continue_pipe_open_ncalrpc(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ /* receive result of pipe open request on ncalrpc */
+ c->status = dcerpc_pipe_connect_ncalrpc_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ Initiate async open of a rpc connection request on NCALRPC using
+ the binding structure to determine the endpoint and options
+*/
+static struct composite_context* dcerpc_pipe_connect_ncalrpc_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ struct pipe_ncalrpc_state *s;
+ struct composite_context *pipe_req;
+ const char *endpoint;
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, io->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_ncalrpc_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store input parameters in state structure */
+ s->io = *io;
+
+ endpoint = dcerpc_binding_get_string_option(io->binding, "endpoint");
+ if (endpoint == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ /* send pipe open request */
+ pipe_req = dcerpc_pipe_open_pipe_send(s->io.conn,
+ s->io.ncalrpc.dir,
+ endpoint);
+ composite_continue(c, pipe_req, continue_pipe_open_ncalrpc, c);
+ return c;
+}
+
+
+/*
+ Receive result of a rpc connection to a rpc pipe on NCALRPC
+*/
+static NTSTATUS dcerpc_pipe_connect_ncalrpc_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+struct pipe_connect_state {
+ struct dcerpc_pipe *pipe;
+ struct dcerpc_binding *binding;
+ const struct ndr_interface_table *table;
+ struct cli_credentials *credentials;
+ struct loadparm_context *lp_ctx;
+};
+
+
+static void continue_map_binding(struct composite_context *ctx);
+static void continue_connect(struct composite_context *c, struct pipe_connect_state *s);
+static void continue_pipe_connect_ncacn_np_smb(struct composite_context *ctx);
+static void continue_pipe_connect_ncacn_ip_tcp(struct composite_context *ctx);
+static void continue_pipe_connect_ncacn_http(struct composite_context *ctx);
+static void continue_pipe_connect_ncacn_unix(struct composite_context *ctx);
+static void continue_pipe_connect_ncalrpc(struct composite_context *ctx);
+static void continue_pipe_connect(struct composite_context *c, struct pipe_connect_state *s);
+static void continue_pipe_auth(struct composite_context *ctx);
+
+
+/*
+ Stage 2 of pipe_connect_b: Receive result of endpoint mapping
+*/
+static void continue_map_binding(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type(c->private_data,
+ struct pipe_connect_state);
+ const char *endpoint;
+
+ c->status = dcerpc_epm_map_binding_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ endpoint = dcerpc_binding_get_string_option(s->binding, "endpoint");
+ DEBUG(4,("Mapped to DCERPC endpoint %s\n", endpoint));
+
+ continue_connect(c, s);
+}
+
+
+/*
+ Stage 2 of pipe_connect_b: Continue connection after endpoint is known
+*/
+static void continue_connect(struct composite_context *c, struct pipe_connect_state *s)
+{
+ struct dcerpc_pipe_connect pc;
+
+ /* potential exits to another stage by sending an async request */
+ struct composite_context *ncacn_np_smb_req;
+ struct composite_context *ncacn_ip_tcp_req;
+ struct composite_context *ncacn_http_req;
+ struct composite_context *ncacn_unix_req;
+ struct composite_context *ncalrpc_req;
+ enum dcerpc_transport_t transport;
+
+ /* dcerpc pipe connect input parameters */
+ ZERO_STRUCT(pc);
+ pc.conn = s->pipe->conn;
+ pc.binding = s->binding;
+ pc.interface = s->table;
+ pc.creds = s->credentials;
+ pc.resolve_ctx = lpcfg_resolve_context(s->lp_ctx);
+
+ transport = dcerpc_binding_get_transport(s->binding);
+
+ /* connect dcerpc pipe depending on required transport */
+ switch (transport) {
+ case NCACN_NP:
+ /*
+ * SMB1/2/3...
+ */
+ ncacn_np_smb_req = dcerpc_pipe_connect_ncacn_np_smb_send(c, &pc, s->lp_ctx);
+ composite_continue(c, ncacn_np_smb_req, continue_pipe_connect_ncacn_np_smb, c);
+ return;
+
+ case NCACN_IP_TCP:
+ ncacn_ip_tcp_req = dcerpc_pipe_connect_ncacn_ip_tcp_send(c, &pc);
+ composite_continue(c, ncacn_ip_tcp_req, continue_pipe_connect_ncacn_ip_tcp, c);
+ return;
+
+ case NCACN_HTTP:
+ ncacn_http_req = dcerpc_pipe_connect_ncacn_http_send(c, &pc, s->lp_ctx);
+ composite_continue(c, ncacn_http_req, continue_pipe_connect_ncacn_http, c);
+ return;
+
+ case NCACN_UNIX_STREAM:
+ ncacn_unix_req = dcerpc_pipe_connect_ncacn_unix_stream_send(c, &pc);
+ composite_continue(c, ncacn_unix_req, continue_pipe_connect_ncacn_unix, c);
+ return;
+
+ case NCALRPC:
+ pc.ncalrpc.dir = lpcfg_ncalrpc_dir(s->lp_ctx);
+ c->status = dcerpc_binding_set_string_option(s->binding, "ncalrpc_dir",
+ pc.ncalrpc.dir);
+ if (!composite_is_ok(c)) return;
+ ncalrpc_req = dcerpc_pipe_connect_ncalrpc_send(c, &pc);
+ composite_continue(c, ncalrpc_req, continue_pipe_connect_ncalrpc, c);
+ return;
+
+ default:
+ /* looks like a transport we don't support now */
+ composite_error(c, NT_STATUS_NOT_SUPPORTED);
+ }
+}
+
+
+/*
+ Stage 3 of pipe_connect_b: Receive result of pipe connect request on
+ named pipe on smb
+*/
+static void continue_pipe_connect_ncacn_np_smb(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type(c->private_data,
+ struct pipe_connect_state);
+
+ c->status = dcerpc_pipe_connect_ncacn_np_smb_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_connect(c, s);
+}
+
+
+/*
+ Stage 3 of pipe_connect_b: Receive result of pipe connect request on tcp/ip
+*/
+static void continue_pipe_connect_ncacn_ip_tcp(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type(c->private_data,
+ struct pipe_connect_state);
+
+ c->status = dcerpc_pipe_connect_ncacn_ip_tcp_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_connect(c, s);
+}
+
+
+/*
+ Stage 3 of pipe_connect_b: Receive result of pipe connect request on http
+*/
+static void continue_pipe_connect_ncacn_http(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type(c->private_data,
+ struct pipe_connect_state);
+
+ c->status = dcerpc_pipe_connect_ncacn_http_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_connect(c, s);
+}
+
+
+/*
+ Stage 3 of pipe_connect_b: Receive result of pipe connect request on unix socket
+*/
+static void continue_pipe_connect_ncacn_unix(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type(c->private_data,
+ struct pipe_connect_state);
+
+ c->status = dcerpc_pipe_connect_ncacn_unix_stream_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_connect(c, s);
+}
+
+
+/*
+ Stage 3 of pipe_connect_b: Receive result of pipe connect request on local rpc
+*/
+static void continue_pipe_connect_ncalrpc(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type(c->private_data,
+ struct pipe_connect_state);
+
+ c->status = dcerpc_pipe_connect_ncalrpc_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_connect(c, s);
+}
+
+
+/*
+ Stage 4 of pipe_connect_b: Start an authentication on connected dcerpc pipe
+ depending on credentials and binding flags passed.
+*/
+static void continue_pipe_connect(struct composite_context *c, struct pipe_connect_state *s)
+{
+ struct composite_context *auth_bind_req;
+
+ s->pipe->binding = dcerpc_binding_dup(s->pipe, s->binding);
+ if (composite_nomem(s->pipe->binding, c)) {
+ return;
+ }
+
+ auth_bind_req = dcerpc_pipe_auth_send(s->pipe, s->binding, s->table,
+ s->credentials, s->lp_ctx);
+ composite_continue(c, auth_bind_req, continue_pipe_auth, c);
+}
+
+
+/*
+ Stage 5 of pipe_connect_b: Receive result of pipe authentication request
+ and say if all went ok
+*/
+static void continue_pipe_auth(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type(c->private_data, struct pipe_connect_state);
+
+ c->status = dcerpc_pipe_auth_recv(ctx, s, &s->pipe);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ handle timeouts of a dcerpc connect
+*/
+static void dcerpc_connect_timeout_handler(struct tevent_context *ev, struct tevent_timer *te,
+ struct timeval t, void *private_data)
+{
+ struct composite_context *c = talloc_get_type_abort(private_data,
+ struct composite_context);
+ struct pipe_connect_state *s = talloc_get_type_abort(c->private_data, struct pipe_connect_state);
+ if (!s->pipe->inhibit_timeout_processing) {
+ composite_error(c, NT_STATUS_IO_TIMEOUT);
+ } else {
+ s->pipe->timed_out = true;
+ }
+}
+
+/*
+ start a request to open a rpc connection to a rpc pipe, using
+ specified binding structure to determine the endpoint and options
+*/
+_PUBLIC_ struct composite_context* dcerpc_pipe_connect_b_send(TALLOC_CTX *parent_ctx,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct pipe_connect_state *s;
+ enum dcerpc_transport_t transport;
+ const char *endpoint = NULL;
+ struct cli_credentials *epm_creds = NULL;
+
+ /* composite context allocation and setup */
+ c = composite_create(parent_ctx, ev);
+ if (c == NULL) {
+ return NULL;
+ }
+
+ s = talloc_zero(c, struct pipe_connect_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* initialise dcerpc pipe structure */
+ s->pipe = dcerpc_pipe_init(c, ev);
+ if (composite_nomem(s->pipe, c)) return c;
+
+ if (DEBUGLEVEL >= 10) {
+ s->pipe->conn->packet_log_dir = lpcfg_lock_directory(lp_ctx);
+ }
+
+ /* store parameters in state structure */
+ s->binding = dcerpc_binding_dup(s, binding);
+ if (composite_nomem(s->binding, c)) return c;
+ s->table = table;
+ s->credentials = credentials;
+ s->lp_ctx = lp_ctx;
+
+ s->pipe->timed_out = false;
+ s->pipe->inhibit_timeout_processing = false;
+
+ tevent_add_timer(c->event_ctx, c,
+ timeval_current_ofs(DCERPC_REQUEST_TIMEOUT, 0),
+ dcerpc_connect_timeout_handler, c);
+
+ transport = dcerpc_binding_get_transport(s->binding);
+
+ switch (transport) {
+ case NCACN_NP:
+ case NCACN_IP_TCP:
+ case NCALRPC:
+ endpoint = dcerpc_binding_get_string_option(s->binding, "endpoint");
+
+ /* anonymous credentials for rpc connection used to get endpoint mapping */
+ epm_creds = cli_credentials_init_anon(s);
+ if (composite_nomem(epm_creds, c)) return c;
+
+ break;
+ case NCACN_HTTP:
+ endpoint = dcerpc_binding_get_string_option(s->binding, "endpoint");
+ epm_creds = credentials;
+ break;
+ default:
+ DBG_INFO("Unknown transport; continuing with anon, no endpoint.\n");
+ epm_creds = cli_credentials_init_anon(s);
+ if (composite_nomem(epm_creds, c)){
+ return c;
+ }
+ break;
+ }
+
+ if (endpoint == NULL) {
+ struct composite_context *binding_req;
+
+ binding_req = dcerpc_epm_map_binding_send(c, s->binding, s->table,
+ epm_creds,
+ s->pipe->conn->event_ctx,
+ s->lp_ctx);
+ composite_continue(c, binding_req, continue_map_binding, c);
+ return c;
+ }
+
+ continue_connect(c, s);
+ return c;
+}
+
+
+/*
+ receive result of a request to open a rpc connection to a rpc pipe
+*/
+_PUBLIC_ NTSTATUS dcerpc_pipe_connect_b_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p)
+{
+ NTSTATUS status;
+ struct pipe_connect_state *s;
+
+ status = composite_wait(c);
+
+ if (NT_STATUS_IS_OK(status)) {
+ s = talloc_get_type(c->private_data, struct pipe_connect_state);
+ talloc_steal(mem_ctx, s->pipe);
+ *p = s->pipe;
+ }
+ talloc_free(c);
+ return status;
+}
+
+
+/*
+ open a rpc connection to a rpc pipe, using the specified
+ binding structure to determine the endpoint and options - sync version
+*/
+_PUBLIC_ NTSTATUS dcerpc_pipe_connect_b(TALLOC_CTX *parent_ctx,
+ struct dcerpc_pipe **pp,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+
+ c = dcerpc_pipe_connect_b_send(parent_ctx, binding, table,
+ credentials, ev, lp_ctx);
+ return dcerpc_pipe_connect_b_recv(c, parent_ctx, pp);
+}
+
+
+struct pipe_conn_state {
+ struct dcerpc_pipe *pipe;
+};
+
+
+static void continue_pipe_connect_b(struct composite_context *ctx);
+
+
+/*
+ Initiate rpc connection to a rpc pipe, using the specified string
+ binding to determine the endpoint and options.
+ The string is to be parsed to a binding structure first.
+*/
+_PUBLIC_ struct composite_context* dcerpc_pipe_connect_send(TALLOC_CTX *parent_ctx,
+ const char *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev, struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct pipe_conn_state *s;
+ struct dcerpc_binding *b;
+ struct composite_context *pipe_conn_req;
+
+ /* composite context allocation and setup */
+ c = composite_create(parent_ctx, ev);
+ if (c == NULL) {
+ return NULL;
+ }
+
+ s = talloc_zero(c, struct pipe_conn_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* parse binding string to the structure */
+ c->status = dcerpc_parse_binding(c, binding, &b);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(0, ("Failed to parse dcerpc binding '%s'\n", binding));
+ composite_error(c, c->status);
+ return c;
+ }
+
+ DEBUG(3, ("Using binding %s\n", dcerpc_binding_string(c, b)));
+
+ /*
+ start connecting to a rpc pipe after binding structure
+ is established
+ */
+ pipe_conn_req = dcerpc_pipe_connect_b_send(c, b, table,
+ credentials, ev, lp_ctx);
+ composite_continue(c, pipe_conn_req, continue_pipe_connect_b, c);
+ return c;
+}
+
+
+/*
+ Stage 2 of pipe_connect: Receive result of actual pipe connect request
+ and say if we're done ok
+*/
+static void continue_pipe_connect_b(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_conn_state *s = talloc_get_type(c->private_data,
+ struct pipe_conn_state);
+
+ c->status = dcerpc_pipe_connect_b_recv(ctx, c, &s->pipe);
+ talloc_steal(s, s->pipe);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ Receive result of pipe connect (using binding string) request
+ and return connected pipe structure.
+*/
+NTSTATUS dcerpc_pipe_connect_recv(struct composite_context *c,
+ TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **pp)
+{
+ NTSTATUS status;
+ struct pipe_conn_state *s;
+
+ status = composite_wait(c);
+ if (NT_STATUS_IS_OK(status)) {
+ s = talloc_get_type(c->private_data, struct pipe_conn_state);
+ *pp = talloc_steal(mem_ctx, s->pipe);
+ }
+ talloc_free(c);
+ return status;
+}
+
+
+/*
+ Open a rpc connection to a rpc pipe, using the specified string
+ binding to determine the endpoint and options - sync version
+*/
+_PUBLIC_ NTSTATUS dcerpc_pipe_connect(TALLOC_CTX *parent_ctx,
+ struct dcerpc_pipe **pp,
+ const char *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ c = dcerpc_pipe_connect_send(parent_ctx, binding,
+ table, credentials, ev, lp_ctx);
+ return dcerpc_pipe_connect_recv(c, parent_ctx, pp);
+}
+
diff --git a/source4/librpc/rpc/dcerpc_roh.c b/source4/librpc/rpc/dcerpc_roh.c
new file mode 100644
index 0000000..3aa7551
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_roh.c
@@ -0,0 +1,914 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ [MS-RPCH] - RPC over HTTP client
+
+ Copyright (C) 2013 Samuel Cabrero <samuelcabrero@kernevil.me>
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "lib/events/events.h"
+#include "lib/util/tevent_ntstatus.h"
+#include "lib/tls/tls.h"
+#include "libcli/resolve/resolve.h"
+#include "libcli/composite/composite.h"
+#include "auth/credentials/credentials.h"
+#include "tsocket/tsocket.h"
+#include "tsocket/tsocket_internal.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_roh.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "lib/param/param.h"
+#include "libcli/http/http.h"
+#include "lib/util/util_net.h"
+
+static ssize_t tstream_roh_pending_bytes(struct tstream_context *stream);
+static struct tevent_req * tstream_roh_readv_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream,
+ struct iovec *vector,
+ size_t count);
+static int tstream_roh_readv_recv(struct tevent_req *req, int *perrno);
+static struct tevent_req * tstream_roh_writev_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream,
+ const struct iovec *vector,
+ size_t count);
+static int tstream_roh_writev_recv(struct tevent_req *req, int *perrno);
+static struct tevent_req * tstream_roh_disconnect_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream);
+static int tstream_roh_disconnect_recv(struct tevent_req *req, int *perrno);
+
+static const struct tstream_context_ops tstream_roh_ops = {
+ .name = "roh",
+ .pending_bytes = tstream_roh_pending_bytes,
+ .readv_send = tstream_roh_readv_send,
+ .readv_recv = tstream_roh_readv_recv,
+ .writev_send = tstream_roh_writev_send,
+ .writev_recv = tstream_roh_writev_recv,
+ .disconnect_send = tstream_roh_disconnect_send,
+ .disconnect_recv = tstream_roh_disconnect_recv,
+};
+
+struct tstream_roh_context {
+ struct roh_connection *roh_conn;
+};
+
+struct roh_open_connection_state {
+ struct tevent_req *req;
+ struct tevent_context *event_ctx;
+ struct cli_credentials *credentials;
+ struct resolve_context *resolve_ctx;
+ const char **rpcproxy_addresses;
+ unsigned int rpcproxy_address_index;
+
+ struct dcecli_connection *conn;
+ bool tls;
+
+ const char *rpc_proxy;
+ unsigned int rpc_proxy_port;
+ const char *rpc_server;
+ unsigned int rpc_server_port;
+ const char *target_hostname;
+
+ struct roh_connection *roh;
+ struct tstream_tls_params *tls_params;
+ struct loadparm_context *lp_ctx;
+ uint8_t http_auth;
+};
+
+NTSTATUS dcerpc_pipe_open_roh_recv(struct tevent_req *req,
+ TALLOC_CTX *mem_ctx,
+ struct tstream_context **stream,
+ struct tevent_queue **queue)
+{
+ struct roh_open_connection_state *state;
+ struct tstream_roh_context *roh_stream_ctx;
+ NTSTATUS status;
+
+ state = tevent_req_data(req, struct roh_open_connection_state);
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ *stream = tstream_context_create(mem_ctx, &tstream_roh_ops,
+ &roh_stream_ctx,
+ struct tstream_roh_context,
+ __location__);
+ if (!stream) {
+ tevent_req_received(req);
+ return NT_STATUS_NO_MEMORY;
+ }
+ ZERO_STRUCTP(roh_stream_ctx);
+
+ roh_stream_ctx->roh_conn = talloc_move(mem_ctx, &state->roh);
+ *queue = http_conn_send_queue(
+ roh_stream_ctx->roh_conn->default_channel_in->http_conn);
+
+ tevent_req_received(req);
+
+ return NT_STATUS_OK;
+}
+
+struct roh_connect_channel_state {
+ struct roh_channel *channel;
+};
+
+static void roh_connect_channel_done(struct tevent_req *subreq);
+static struct tevent_req *roh_connect_channel_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ const char *rpcproxy_ip_address,
+ unsigned int rpcproxy_port,
+ struct cli_credentials *credentials,
+ bool tls,
+ struct tstream_tls_params *tls_params)
+{
+ struct tevent_req *req = NULL;
+ struct tevent_req *subreq = NULL;
+ struct roh_connect_channel_state *state = NULL;
+
+ DBG_DEBUG("Connecting ROH channel socket, RPC proxy is "
+ "%s:%d (TLS: %s)\n", rpcproxy_ip_address, rpcproxy_port,
+ (tls ? "true" : "false"));
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct roh_connect_channel_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ if (!is_ipaddress(rpcproxy_ip_address)) {
+ DBG_ERR("Invalid host (%s), needs to be an IP address\n",
+ rpcproxy_ip_address);
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return tevent_req_post(req, ev);
+ }
+
+ /* Initialize channel structure */
+ state->channel = talloc_zero(state, struct roh_channel);
+ if (tevent_req_nomem(state->channel, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ state->channel->channel_cookie = GUID_random();
+
+ subreq = http_connect_send(state,
+ ev,
+ rpcproxy_ip_address,
+ rpcproxy_port,
+ credentials,
+ tls ? tls_params : NULL);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_connect_channel_done, req);
+
+ return req;
+}
+
+static void roh_connect_channel_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = NULL;
+ struct roh_connect_channel_state *state = NULL;
+ NTSTATUS status;
+ int ret;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_connect_channel_state);
+
+ ret = http_connect_recv(subreq,
+ state->channel,
+ &state->channel->http_conn);
+ TALLOC_FREE(subreq);
+ if (ret != 0) {
+ status = map_nt_error_from_unix_common(ret);
+ tevent_req_nterror(req, status);
+ return;
+ }
+
+ DBG_DEBUG("HTTP connected\n");
+ tevent_req_done(req);
+}
+
+static NTSTATUS roh_connect_channel_recv(struct tevent_req *req,
+ TALLOC_CTX *mem_ctx,
+ struct roh_channel **channel)
+{
+ struct roh_connect_channel_state *state = tevent_req_data(
+ req, struct roh_connect_channel_state);
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ *channel = talloc_move(mem_ctx, &state->channel);
+ tevent_req_received(req);
+
+ return NT_STATUS_OK;
+}
+
+static void roh_continue_resolve_name(struct composite_context *ctx);
+
+/**
+ * Send rpc pipe open request to given host:port using http transport
+ */
+struct tevent_req *dcerpc_pipe_open_roh_send(struct dcecli_connection *conn,
+ const char *localaddr,
+ const char *rpc_server,
+ uint32_t rpc_server_port,
+ const char *rpc_proxy,
+ uint32_t rpc_proxy_port,
+ const char *http_proxy,
+ uint32_t http_proxy_port,
+ bool use_tls,
+ bool use_proxy,
+ struct cli_credentials *credentials,
+ struct resolve_context *resolve_ctx,
+ struct loadparm_context *lp_ctx,
+ uint8_t http_auth)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct composite_context *ctx;
+ struct roh_open_connection_state *state;
+ struct nbt_name name;
+
+ req = tevent_req_create(conn, &state, struct roh_open_connection_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ /* Set state fields */
+ state->req = req;
+ state->event_ctx = conn->event_ctx;
+ state->lp_ctx = lp_ctx,
+ state->credentials = credentials;
+ state->conn = conn;
+ state->tls = use_tls;
+
+ /* Initialize connection structure (3.2.1.3) */
+ /* TODO Initialize virtual connection cookie table */
+ state->rpc_server = talloc_strdup(state, rpc_server);
+ state->rpc_server_port = rpc_server_port;
+ state->rpc_proxy = talloc_strdup(state, rpc_proxy);
+ state->rpc_proxy_port = rpc_proxy_port;
+ state->http_auth = http_auth;
+
+ state->roh = talloc_zero(state, struct roh_connection);
+ state->roh->protocol_version = ROH_V2;
+ state->roh->connection_state = ROH_STATE_OPEN_START;
+ state->roh->connection_cookie = GUID_random();
+ state->roh->association_group_id_cookie = GUID_random();
+
+ /* Additional initialization steps (3.2.2.3) */
+ state->roh->proxy_use = use_proxy;
+ state->roh->current_keep_alive_time = 0;
+ state->roh->current_keep_alive_interval = 0;
+
+ /* Initialize TLS */
+ if (use_tls) {
+ char *ca_file = lpcfg_tls_cafile(state, lp_ctx);
+ char *crl_file = lpcfg_tls_crlfile(state, lp_ctx);
+ const char *tls_priority = lpcfg_tls_priority(lp_ctx);
+ enum tls_verify_peer_state verify_peer =
+ lpcfg_tls_verify_peer(lp_ctx);
+
+ status = tstream_tls_params_client(state->roh,
+ ca_file, crl_file,
+ tls_priority,
+ verify_peer,
+ state->rpc_proxy,
+ &state->tls_params);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("%s: Failed tstream_tls_params_client - %s\n",
+ __func__, nt_errstr(status)));
+ tevent_req_nterror(req, status);
+ return tevent_req_post(req, conn->event_ctx);
+ }
+ }
+
+ /* Resolve RPC proxy server name */
+ make_nbt_name_server(&name, state->rpc_proxy);
+ ctx = resolve_name_send(resolve_ctx, state, &name, state->event_ctx);
+ if (tevent_req_nomem(ctx, req)) {
+ return tevent_req_post(req, state->event_ctx);
+ }
+ ctx->async.fn = roh_continue_resolve_name;
+ ctx->async.private_data = state;
+
+ return req;
+}
+
+static void roh_connect_channel_in_done(struct tevent_req *subreq);
+static void roh_continue_resolve_name(struct composite_context *ctx)
+{
+ NTSTATUS status;
+ struct roh_open_connection_state *state;
+ struct tevent_req *subreq;
+
+ state = talloc_get_type_abort(ctx->async.private_data,
+ struct roh_open_connection_state);
+ status = resolve_name_multiple_recv(ctx, state,
+ &state->rpcproxy_addresses);
+ if (tevent_req_nterror(state->req, status)) {
+ DEBUG(2, ("%s: No server found: %s\n", __func__,
+ nt_errstr(status)));
+ return;
+ }
+
+ state->rpcproxy_address_index = 0;
+ if (state->rpcproxy_addresses[state->rpcproxy_address_index] == NULL) {
+ DEBUG(2, ("%s: No server found\n", __func__));
+ tevent_req_nterror(state->req, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+ return;
+ }
+
+ /*
+ * TODO Determine proxy use
+ * If state->roh->proxy_use == true, the client has requested to
+ * always use local proxy. Otherwise, run the proxy use discovery
+ */
+ state->roh->connection_state = ROH_STATE_OPEN_START;
+ subreq = roh_connect_channel_send(state,
+ state->event_ctx,
+ state->rpcproxy_addresses[state->rpcproxy_address_index],
+ state->rpc_proxy_port,
+ state->credentials,
+ state->tls,
+ state->tls_params);
+ if (tevent_req_nomem(subreq, state->req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_connect_channel_in_done, state->req);
+}
+
+static void roh_connect_channel_out_done(struct tevent_req *);
+static void roh_connect_channel_in_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_connect_channel_recv(subreq, state->roh,
+ &state->roh->default_channel_in);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ subreq = roh_connect_channel_send(state,
+ state->event_ctx,
+ state->rpcproxy_addresses[state->rpcproxy_address_index],
+ state->rpc_proxy_port,
+ state->credentials,
+ state->tls,
+ state->tls_params);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_connect_channel_out_done, req);
+}
+
+static void roh_send_RPC_DATA_IN_done(struct tevent_req *);
+static void roh_connect_channel_out_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_connect_channel_recv(subreq, state->roh,
+ &state->roh->default_channel_out);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ subreq = roh_send_RPC_DATA_IN_send(state, state->lp_ctx,
+ state->event_ctx,
+ state->credentials,
+ state->roh,
+ state->rpc_server,
+ state->rpc_server_port,
+ state->rpc_proxy,
+ state->http_auth);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_send_RPC_DATA_IN_done, req);
+}
+
+static void roh_send_RPC_DATA_OUT_done(struct tevent_req *);
+static void roh_send_RPC_DATA_IN_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_send_RPC_DATA_IN_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ subreq = roh_send_RPC_DATA_OUT_send(state,
+ state->lp_ctx,
+ state->event_ctx,
+ state->credentials,
+ state->roh,
+ state->rpc_server,
+ state->rpc_server_port,
+ state->rpc_proxy,
+ state->http_auth);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_send_RPC_DATA_OUT_done, req);
+}
+
+static void roh_send_CONN_A1_done(struct tevent_req *);
+static void roh_send_RPC_DATA_OUT_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_send_RPC_DATA_OUT_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ subreq = roh_send_CONN_A1_send(state, state->event_ctx, state->roh);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_send_CONN_A1_done, req);
+}
+
+static void roh_send_CONN_B1_done(struct tevent_req *);
+static void roh_send_CONN_A1_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_send_CONN_A1_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ subreq = roh_send_CONN_B1_send(state, state->event_ctx, state->roh);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_send_CONN_B1_done, req);
+}
+
+static void roh_recv_out_channel_response_done(struct tevent_req *);
+static void roh_send_CONN_B1_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_send_CONN_B1_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ state->roh->connection_state = ROH_STATE_OUT_CHANNEL_WAIT;
+ subreq = roh_recv_out_channel_response_send(state, state->event_ctx,
+ state->roh);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_recv_out_channel_response_done, req);
+}
+
+static void roh_recv_CONN_A3_done(struct tevent_req *);
+static void roh_recv_out_channel_response_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ char *response;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_recv_out_channel_response_recv(subreq, state, &response);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ state->roh->connection_state = ROH_STATE_WAIT_A3W;
+ subreq = roh_recv_CONN_A3_send(state, state->event_ctx, state->roh);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_recv_CONN_A3_done, req);
+}
+
+static void roh_recv_CONN_C2_done(struct tevent_req *);
+static void roh_recv_CONN_A3_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_recv_CONN_A3_recv(subreq, &state->roh->default_channel_out->connection_timeout);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ state->roh->connection_state = ROH_STATE_WAIT_C2;
+ subreq = roh_recv_CONN_C2_send(state, state->event_ctx, state->roh);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, roh_recv_CONN_C2_done, req);
+}
+
+static void roh_recv_CONN_C2_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_open_connection_state *state;
+ unsigned int version;
+ unsigned int recv;
+ unsigned int timeout;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_open_connection_state);
+
+ status = roh_recv_CONN_C2_recv(subreq, &version, &recv, &timeout);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+ state->roh->connection_state = ROH_STATE_OPENED;
+
+ tevent_req_done(req);
+}
+
+static ssize_t tstream_roh_pending_bytes(struct tstream_context *stream)
+{
+ struct tstream_roh_context *ctx = NULL;
+ struct tstream_context *tstream = NULL;
+
+ ctx = tstream_context_data(stream, struct tstream_roh_context);
+ if (!ctx->roh_conn) {
+ errno = ENOTCONN;
+ return -1;
+ }
+
+ tstream = http_conn_tstream(
+ ctx->roh_conn->default_channel_out->http_conn);
+ if (tstream == NULL) {
+ errno = ENOTCONN;
+ return -1;
+ }
+ return tstream_pending_bytes(tstream);
+}
+
+struct tstream_roh_readv_state {
+ struct roh_connection *roh_conn;
+ int ret;
+};
+
+static void tstream_roh_readv_handler(struct tevent_req *subreq);
+static struct tevent_req * tstream_roh_readv_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream,
+ struct iovec *vector,
+ size_t count)
+{
+ struct tstream_roh_context *ctx = NULL;
+ struct tstream_roh_readv_state *state;
+ struct tevent_req *req, *subreq;
+ struct tstream_context *channel_stream = NULL;
+
+ req = tevent_req_create(mem_ctx, &state, struct tstream_roh_readv_state);
+ if (!req) {
+ return NULL;
+ }
+
+ ctx = tstream_context_data(stream, struct tstream_roh_context);
+ if (!ctx->roh_conn) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+ if (!ctx->roh_conn->default_channel_out) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+ channel_stream = http_conn_tstream(
+ ctx->roh_conn->default_channel_out->http_conn);
+ if (channel_stream == NULL) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+
+ state->roh_conn = ctx->roh_conn;
+
+ subreq = tstream_readv_send(state, ev,
+ channel_stream,
+ vector, count);
+ if (tevent_req_nomem(subreq, req)) {
+ goto post;
+ }
+ tevent_req_set_callback(subreq, tstream_roh_readv_handler, req);
+
+ return req;
+post:
+ tevent_req_post(req, ev);
+ return req;
+}
+
+static void tstream_roh_readv_handler(struct tevent_req *subreq)
+{
+ struct tevent_req *req;
+ struct tstream_roh_readv_state *state;
+ int ret;
+ int sys_errno;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct tstream_roh_readv_state);
+ ret = tstream_readv_recv(subreq, &sys_errno);
+ TALLOC_FREE(subreq);
+ if (ret == -1) {
+ tevent_req_error(req, sys_errno);
+ return;
+ }
+
+ state->ret = ret;
+
+ tevent_req_done(req);
+}
+
+static int tstream_roh_readv_recv(struct tevent_req *req, int *perrno)
+{
+ struct tstream_roh_readv_state *state;
+ int ret;
+
+ state = tevent_req_data(req, struct tstream_roh_readv_state);
+ ret = tsocket_simple_int_recv(req, perrno);
+ if (ret == 0) {
+ ret = state->ret;
+ }
+
+ tevent_req_received(req);
+ return ret;
+}
+
+struct tstream_roh_writev_state {
+ struct roh_connection *roh_conn;
+ int nwritten;
+};
+
+static void tstream_roh_writev_handler(struct tevent_req *subreq);
+static struct tevent_req * tstream_roh_writev_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream,
+ const struct iovec *vector,
+ size_t count)
+{
+ struct tstream_roh_context *ctx = NULL;
+ struct tstream_roh_writev_state *state = NULL;
+ struct tevent_req *req = NULL;
+ struct tevent_req *subreq = NULL;
+ struct tstream_context *channel_stream = NULL;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct tstream_roh_writev_state);
+ if (!req) {
+ return NULL;
+ }
+
+ ctx = tstream_context_data(stream, struct tstream_roh_context);
+ if (!ctx->roh_conn) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+ if (!ctx->roh_conn->default_channel_in) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+ channel_stream = http_conn_tstream(
+ ctx->roh_conn->default_channel_in->http_conn);
+ if (channel_stream == NULL) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+
+ state->roh_conn = ctx->roh_conn;
+
+ subreq = tstream_writev_send(state, ev,
+ channel_stream,
+ vector, count);
+ if (tevent_req_nomem(subreq, req)) {
+ goto post;
+ }
+ tevent_req_set_callback(subreq, tstream_roh_writev_handler, req);
+
+ return req;
+post:
+ tevent_req_post(req, ev);
+ return req;
+}
+
+static void tstream_roh_writev_handler(struct tevent_req *subreq)
+{
+ struct tevent_req *req;
+ struct tstream_roh_writev_state *state;
+ int nwritten;
+ int sys_errno;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct tstream_roh_writev_state);
+ nwritten = tstream_writev_recv(subreq, &sys_errno);
+ TALLOC_FREE(subreq);
+ if (nwritten == -1) {
+ tevent_req_error(req, sys_errno);
+ return;
+ }
+ state->nwritten = nwritten;
+ state->roh_conn->default_channel_in->sent_bytes += nwritten;
+
+ tevent_req_done(req);
+}
+
+static int tstream_roh_writev_recv(struct tevent_req *req, int *perrno)
+{
+ struct tstream_roh_writev_state *state;
+ int ret;
+
+ state = tevent_req_data(req, struct tstream_roh_writev_state);
+ ret = tsocket_simple_int_recv(req, perrno);
+ if (ret == 0) {
+ ret = state->nwritten;
+ }
+
+ return ret;
+}
+
+struct tstream_roh_disconnect_state {
+ struct tstream_context *stream;
+ struct tevent_context *ev;
+};
+
+static void tstream_roh_disconnect_channel_in_handler(struct tevent_req *subreq);
+static struct tevent_req * tstream_roh_disconnect_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream)
+{
+ struct tstream_roh_context *ctx = NULL;
+ struct tevent_req *req, *subreq;
+ struct tstream_roh_disconnect_state *state;
+
+ req = tevent_req_create(mem_ctx, &state, struct tstream_roh_disconnect_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ state->stream = stream;
+ state->ev = ev;
+
+ ctx = tstream_context_data(stream, struct tstream_roh_context);
+ if (!ctx->roh_conn) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+ if (!ctx->roh_conn->default_channel_in) {
+ tevent_req_error(req, ENOTCONN);
+ goto post;
+ }
+
+ subreq = http_disconnect_send(
+ state,
+ ev,
+ ctx->roh_conn->default_channel_in->http_conn);
+ if (tevent_req_nomem(subreq, req)) {
+ goto post;
+ }
+ tevent_req_set_callback(subreq, tstream_roh_disconnect_channel_in_handler, req);
+
+ return req;
+post:
+ tevent_req_post(req, ev);
+ return req;
+}
+
+static void tstream_roh_disconnect_channel_out_handler(struct tevent_req *subreq);
+
+static void tstream_roh_disconnect_channel_in_handler(struct tevent_req *subreq)
+{
+ struct tevent_req *req;
+ struct tstream_roh_disconnect_state *state;
+ struct tstream_context *stream;
+ struct tstream_roh_context *roh_stream;
+ int ret;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct tstream_roh_disconnect_state);
+ stream = state->stream;
+ roh_stream = tstream_context_data(stream, struct tstream_roh_context);
+
+ ret = http_disconnect_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (ret != 0) {
+ tevent_req_error(req, ret);
+ return;
+ }
+ TALLOC_FREE(roh_stream->roh_conn->default_channel_in);
+
+ subreq = http_disconnect_send(
+ state,
+ state->ev,
+ roh_stream->roh_conn->default_channel_out->http_conn);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, tstream_roh_disconnect_channel_out_handler, req);
+
+ return;
+}
+
+static void tstream_roh_disconnect_channel_out_handler(struct tevent_req *subreq)
+{
+ struct tevent_req *req;
+ struct tstream_roh_disconnect_state *state;
+ struct tstream_context *stream;
+ struct tstream_roh_context *roh_stream;
+ int ret;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct tstream_roh_disconnect_state);
+ stream = state->stream;
+ roh_stream = tstream_context_data(stream, struct tstream_roh_context);
+
+ ret = http_disconnect_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (ret != 0) {
+ tevent_req_error(req, ret);
+ return;
+ }
+ TALLOC_FREE(roh_stream->roh_conn->default_channel_out);
+
+ tevent_req_done(req);
+}
+
+static int tstream_roh_disconnect_recv(struct tevent_req *req, int *perrno)
+{
+ int ret;
+
+ ret = tsocket_simple_int_recv(req, perrno);
+ tevent_req_received(req);
+
+ return ret;
+}
diff --git a/source4/librpc/rpc/dcerpc_roh.h b/source4/librpc/rpc/dcerpc_roh.h
new file mode 100644
index 0000000..f7a9c75
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_roh.h
@@ -0,0 +1,111 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ [MS-RPCH] - RPC over HTTP
+
+ Copyright (C) 2013 Samuel Cabrero <samuelcabrero@kernevil.me>
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef DCERPC_ROH_H_
+#define DCERPC_ROH_H_
+
+#include "librpc/gen_ndr/misc.h"
+
+struct tevent_queue;
+struct tstream_context;
+struct tstream_tls_params;
+
+struct roh_channel {
+ /*
+ * The ConnectionTimeout command specifies the desired frequency for
+ * sending keep-alive PDUs (2.2.3.5.3)
+ */
+ unsigned int connection_timeout;
+
+ unsigned int sent_bytes;
+
+ struct GUID channel_cookie;
+
+ struct http_conn *http_conn;
+};
+
+enum roh_protocol_version {
+ ROH_V1,
+ ROH_V2,
+};
+
+enum roh_connection_state {
+ ROH_STATE_OPEN_START,
+ ROH_STATE_OUT_CHANNEL_WAIT,
+ ROH_STATE_WAIT_A3W,
+ ROH_STATE_WAIT_C2,
+ ROH_STATE_OPENED,
+};
+
+/*
+ * protocol_version: A client node should be capable of using v1 and v2,
+ * try to use v2 in first place. If it fails, fallback
+ * to v1
+ * connection_state: Tracks the protocol current state
+ * connection_cookie: Identifies the virtual connection among a client, one
+ * or more inbound proxies, one or more outbound proxies,
+ * and a server
+ * association_group_id_cookie: Used by higher layer protocols to link
+ * multiple virtual connections (2.2.3.1)
+ * default_channel_in:
+ * default_channel_out:
+ * non_default_channel_in:
+ * non_default_channel_out:
+ */
+struct roh_connection {
+ enum roh_protocol_version protocol_version;
+ enum roh_connection_state connection_state;
+
+ struct GUID connection_cookie;
+ struct GUID association_group_id_cookie;
+
+ struct roh_channel *default_channel_in;
+ struct roh_channel *non_default_channel_in;
+
+ struct roh_channel *default_channel_out;
+ struct roh_channel *non_default_channel_out;
+
+ /* Client role specific fields (3.2.2.1) */
+ bool proxy_use;
+ uint32_t current_keep_alive_time;
+ uint32_t current_keep_alive_interval;
+
+ /* TODO Add timers 3.2.2.2 */
+};
+
+/* Command type constants */
+#define ROH_CMD_TYPE_RECV_WINDOWS_SIZE 0x00000000 /* Section 2.2.3.5.1 */
+#define ROH_CMD_TYPE_FLOW_CONTROL_ACK 0x00000001 /* Section 2.2.3.5.2 */
+#define ROH_CMD_TYPE_CONNECTION_TIMEOUT 0x00000002 /* Section 2.2.3.5.3 */
+#define ROH_CMD_TYPE_COOKIE 0x00000003 /* Section 2.2.3.5.4 */
+#define ROH_CMD_TYPE_CHANNEL_LIFETIME 0x00000004 /* Section 2.2.3.5.5 */
+#define ROH_CMD_TYPE_CLIENT_KEEPALIVE 0x00000005 /* Section 2.2.3.5.6 */
+#define ROH_CMD_TYPE_VERSION 0x00000006 /* Section 2.2.3.5.7 */
+#define ROH_CMD_TYPE_EMPTY 0x00000007 /* Section 2.2.3.5.8 */
+#define ROH_CMD_TYPE_PADDING 0x00000008 /* Section 2.2.3.5.9 */
+#define ROH_CMD_TYPE_NEGATIVE_ANCE 0x00000009 /* Section 2.2.3.5.10 */
+#define ROH_CMD_TYPE_ANCE 0x0000000A /* Section 2.2.3.5.11 */
+#define ROH_CMD_TYPE_CLIENT_ADDRESS 0x0000000B /* Section 2.2.3.5.12 */
+#define ROH_CMD_TYPE_ASSOCIATION_GRP_ID 0x0000000C /* Section 2.2.3.5.13 */
+#define ROH_CMD_TYPE_DESTINATION 0x0000000D /* Section 2.2.3.5.14 */
+#define ROH_CMD_TYPE_PING 0x0000000E /* Section 2.2.3.5.15 */
+
+#endif /* DCERPC_ROH_H_ */
diff --git a/source4/librpc/rpc/dcerpc_roh_channel_in.c b/source4/librpc/rpc/dcerpc_roh_channel_in.c
new file mode 100644
index 0000000..5010452
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_roh_channel_in.c
@@ -0,0 +1,303 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ [MS-RPCH] - RPC over HTTP client
+
+ Copyright (C) 2013 Samuel Cabrero <samuelcabrero@kernevil.me>
+ Copyright (C) Julien Kerihuel <j.kerihuel@openchange.org> 2013
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include <tevent.h>
+#include <talloc.h>
+#include "lib/tsocket/tsocket.h"
+#include "lib/tls/tls.h"
+#include "lib/util/tevent_ntstatus.h"
+#include "lib/util/util_net.h"
+#include "libcli/resolve/resolve.h"
+#include "libcli/composite/composite.h"
+#include "auth/credentials/credentials.h"
+#include "auth/credentials/credentials_internal.h"
+#include <gen_ndr/dcerpc.h>
+#include <gen_ndr/ndr_dcerpc.h>
+
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_roh.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "libcli/http/http.h"
+
+struct roh_request_state {
+ struct http_request *request;
+ struct http_request *response;
+};
+
+static void roh_send_RPC_DATA_IN_done(struct tevent_req *subreq);
+struct tevent_req *roh_send_RPC_DATA_IN_send(TALLOC_CTX *mem_ctx,
+ struct loadparm_context *lp_ctx,
+ struct tevent_context *ev,
+ struct cli_credentials *credentials,
+ struct roh_connection *roh,
+ const char *rpc_server,
+ uint32_t rpc_server_port,
+ const char *rpc_proxy,
+ uint8_t http_auth)
+{
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ struct roh_request_state *state;
+ const char *path;
+ char *query;
+ char *uri;
+
+ DEBUG(8, ("%s: Sending RPC_IN_DATA request\n", __func__));
+
+ req = tevent_req_create(mem_ctx, &state, struct roh_request_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ state->request = talloc_zero(state, struct http_request);
+ if (tevent_req_nomem(state->request, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ /* Build URI, as specified in section 2.2.2 */
+ query = talloc_asprintf(state, "%s:%d", rpc_server, rpc_server_port);
+ if (tevent_req_nomem(query, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ /*
+ * TODO This path changes to "/rpcwithcert/rpcproxy.dll" when using
+ * certificates
+ */
+ path = "/rpc/rpcproxy.dll";
+ uri = talloc_asprintf(state, "%s?%s", path, query);
+ if (tevent_req_nomem(uri, req)) {
+ tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+ return tevent_req_post(req, ev);
+ }
+ TALLOC_FREE(query);
+
+ /*
+ * Create the HTTP channel IN request as specified in the
+ * section 2.1.2.1.1
+ */
+ state->request->type = HTTP_REQ_RPC_IN_DATA;
+ state->request->uri = uri;
+ state->request->body.length = 0;
+ state->request->body.data = NULL;
+ state->request->major = '1';
+ state->request->minor = '0';
+
+ http_add_header(state, &state->request->headers,
+ "Accept", "application/rpc");
+ http_add_header(state, &state->request->headers,
+ "User-Agent", "MSRPC");
+ http_add_header(state, &state->request->headers,
+ "Host", rpc_proxy);
+ http_add_header(state, &state->request->headers,
+ "Connection", "keep-alive");
+ http_add_header(state, &state->request->headers,
+ "Content-Length", "1073741824");
+ http_add_header(state, &state->request->headers,
+ "Cache-Control", "no-cache");
+ http_add_header(state, &state->request->headers,
+ "Pragma", "no-cache");
+
+ subreq = http_send_auth_request_send(state,
+ ev,
+ roh->default_channel_in->http_conn,
+ state->request,
+ credentials,
+ lp_ctx,
+ http_auth);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_send_RPC_DATA_IN_done, req);
+
+ return req;
+}
+
+static void roh_send_RPC_DATA_IN_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+
+ /* Receive the sent bytes to check if request has been properly sent */
+ status = http_send_auth_request_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ DEBUG(8, ("%s: RPC_IN_DATA sent\n", __func__));
+
+ tevent_req_done(req);
+}
+
+NTSTATUS roh_send_RPC_DATA_IN_recv(struct tevent_req *req)
+{
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
+
+struct roh_send_pdu_state {
+ DATA_BLOB buffer;
+ struct iovec iov;
+ int bytes_written;
+ int sys_errno;
+};
+
+static void roh_send_CONN_B1_done(struct tevent_req *subreq);
+struct tevent_req *roh_send_CONN_B1_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct roh_connection *roh)
+{
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ struct roh_send_pdu_state *state;
+ struct dcerpc_rts rts;
+ struct ncacn_packet pkt;
+ struct ndr_push *ndr;
+ struct tstream_context *stream = NULL;
+ struct tevent_queue *send_queue = NULL;
+
+ DEBUG(8, ("%s: Sending CONN/B1 request\n", __func__));
+
+ req = tevent_req_create(mem_ctx, &state, struct roh_send_pdu_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ rts.Flags = RTS_FLAG_NONE;
+ rts.NumberOfCommands = 6;
+ rts.Commands = talloc_array(state, struct dcerpc_rts_cmd, 6);
+
+ /* CONN/B1: Version RTS command */
+ rts.Commands[0].CommandType = 0x00000006;
+ rts.Commands[0].Command.Version.Version = 0x00000001;
+
+ /* CONN/B1: VirtualConnectionCookie RTS command */
+ rts.Commands[1].CommandType = 0x00000003;
+ rts.Commands[1].Command.Cookie.Cookie.Cookie = roh->connection_cookie;
+
+ /* CONN/B1: InChannelCookie RTS command */
+ rts.Commands[2].CommandType = 0x00000003;
+ rts.Commands[2].Command.Cookie.Cookie.Cookie =
+ roh->default_channel_in->channel_cookie;
+
+ /* CONN/B1: ChannelLifetime */
+ rts.Commands[3].CommandType = 0x00000004;
+ rts.Commands[3].Command.ReceiveWindowSize.ReceiveWindowSize =
+ 0x40000000;
+
+ /* CONN/B1: ClientKeepAlive */
+ rts.Commands[4].CommandType = 0x00000005;
+ rts.Commands[4].Command.ClientKeepalive.ClientKeepalive = 0x000493e0;
+
+ /* CONN/B1: AssociationGroupId */
+ rts.Commands[5].CommandType = 0x0000000C;
+ rts.Commands[5].Command.AssociationGroupId.AssociationGroupId.Cookie =
+ roh->association_group_id_cookie;
+
+ pkt.rpc_vers = 5;
+ pkt.rpc_vers_minor = 0;
+ pkt.ptype = DCERPC_PKT_RTS;
+ pkt.pfc_flags = DCERPC_PFC_FLAG_LAST | DCERPC_PFC_FLAG_FIRST;
+ pkt.drep[0] = DCERPC_DREP_LE;
+ pkt.drep[1] = 0;
+ pkt.drep[2] = 0;
+ pkt.drep[3] = 0;
+ pkt.frag_length = 104;
+ pkt.auth_length = 0;
+ pkt.call_id = 0;
+ pkt.u.rts = rts;
+
+ ndr = ndr_push_init_ctx(state);
+ if (ndr == NULL) {
+ return NULL;
+ }
+ ndr->offset = 0;
+ ndr_push_ncacn_packet(ndr, NDR_SCALARS, &pkt);
+
+ state->buffer = ndr_push_blob(ndr);
+ state->iov.iov_base = (char *) state->buffer.data;
+ state->iov.iov_len = state->buffer.length;
+
+ stream = http_conn_tstream(roh->default_channel_in->http_conn);
+ send_queue = http_conn_send_queue(roh->default_channel_in->http_conn);
+
+ subreq = tstream_writev_queue_send(mem_ctx,
+ ev,
+ stream,
+ send_queue,
+ &state->iov,
+ 1);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_send_CONN_B1_done, req);
+
+ return req;
+}
+
+static void roh_send_CONN_B1_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_send_pdu_state *state;
+ int sys_errno;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_send_pdu_state);
+
+ state->bytes_written = tstream_writev_queue_recv(subreq, &sys_errno);
+ state->sys_errno = sys_errno;
+ TALLOC_FREE(subreq);
+ if (state->bytes_written <= 0 && state->sys_errno != 0) {
+ status = map_nt_error_from_unix_common(sys_errno);
+ tevent_req_nterror(req, status);
+ return;
+ }
+ DEBUG(8, ("%s: CONN/B1 sent (%d bytes written)\n",
+ __func__, state->bytes_written));
+
+ tevent_req_done(req);
+}
+
+NTSTATUS roh_send_CONN_B1_recv(struct tevent_req *req)
+{
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
diff --git a/source4/librpc/rpc/dcerpc_roh_channel_out.c b/source4/librpc/rpc/dcerpc_roh_channel_out.c
new file mode 100644
index 0000000..476033e
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_roh_channel_out.c
@@ -0,0 +1,582 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ [MS-RPCH] - RPC over HTTP client
+
+ Copyright (C) 2013 Samuel Cabrero <samuelcabrero@kernevil.me>
+ Copyright (C) Julien Kerihuel <j.kerihuel@openchange.org> 2013
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include <tevent.h>
+#include <talloc.h>
+#include "lib/tsocket/tsocket.h"
+#include "lib/tls/tls.h"
+#include "lib/util/tevent_ntstatus.h"
+#include "lib/util/util_net.h"
+#include "libcli/resolve/resolve.h"
+#include "libcli/composite/composite.h"
+#include "auth/credentials/credentials.h"
+#include "auth/credentials/credentials_internal.h"
+#include <gen_ndr/dcerpc.h>
+#include <gen_ndr/ndr_dcerpc.h>
+
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_roh.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "librpc/rpc/dcerpc_util.h"
+#include "libcli/http/http.h"
+
+struct roh_request_state {
+ struct http_request *request;
+ struct http_request *response;
+};
+
+static void roh_send_RPC_DATA_OUT_done(struct tevent_req *subreq);
+struct tevent_req *roh_send_RPC_DATA_OUT_send(TALLOC_CTX *mem_ctx,
+ struct loadparm_context *lp_ctx,
+ struct tevent_context *ev,
+ struct cli_credentials *credentials,
+ struct roh_connection *roh,
+ const char *rpc_server,
+ uint32_t rpc_server_port,
+ const char *rpc_proxy,
+ uint8_t http_auth)
+{
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ struct roh_request_state *state;
+ const char *path;
+ char *query;
+ char *uri;
+
+ DEBUG(8, ("%s: Sending RPC_OUT_DATA request\n", __func__));
+
+ req = tevent_req_create(mem_ctx, &state, struct roh_request_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ state->request = talloc_zero(state, struct http_request);
+ if (tevent_req_nomem(state->request, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ /* Build URI, as specified in section 2.2.2 */
+ query = talloc_asprintf(state, "%s:%d", rpc_server, rpc_server_port);
+ if (tevent_req_nomem(query, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ /*
+ * TODO This path changes to "/rpcwithcert/rpcproxy.dll" when using
+ * certificates
+ */
+ path = "/rpc/rpcproxy.dll";
+ uri = talloc_asprintf(state, "%s?%s", path, query);
+ if (tevent_req_nomem(uri, req)) {
+ tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+ return tevent_req_post(req, ev);
+ }
+ TALLOC_FREE(query);
+
+ /*
+ * Create the HTTP channel OUT request as specified in the
+ * section 2.1.2.1.2
+ */
+ state->request->type = HTTP_REQ_RPC_OUT_DATA;
+ state->request->uri = uri;
+ state->request->body.length = 0;
+ state->request->body.data = NULL;
+ state->request->major = '1';
+ state->request->minor = '0';
+
+ http_add_header(state, &state->request->headers,
+ "Accept", "application/rpc");
+ http_add_header(state, &state->request->headers,
+ "User-Agent", "MSRPC");
+ http_add_header(state, &state->request->headers,
+ "Host", rpc_proxy);
+ http_add_header(state, &state->request->headers,
+ "Connection", "keep-alive");
+ http_add_header(state, &state->request->headers,
+ "Content-Length", "76");
+ http_add_header(state, &state->request->headers,
+ "Cache-Control", "no-cache");
+ http_add_header(state, &state->request->headers,
+ "Pragma", "no-cache");
+
+ subreq = http_send_auth_request_send(state,
+ ev,
+ roh->default_channel_out->http_conn,
+ state->request,
+ credentials,
+ lp_ctx,
+ http_auth);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_send_RPC_DATA_OUT_done, req);
+
+ return req;
+}
+
+static void roh_send_RPC_DATA_OUT_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+
+ /* Receive the sent bytes to check if request has been properly sent */
+ status = http_send_auth_request_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ DEBUG(8, ("%s: RPC_OUT_DATA sent\n", __func__));
+
+ tevent_req_done(req);
+}
+
+NTSTATUS roh_send_RPC_DATA_OUT_recv(struct tevent_req *req)
+{
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
+
+struct roh_send_pdu_state {
+ DATA_BLOB buffer;
+ struct iovec iov;
+ int bytes_written;
+ int sys_errno;
+};
+
+static void roh_send_CONN_A1_done(struct tevent_req *subreq);
+struct tevent_req *roh_send_CONN_A1_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct roh_connection *roh)
+{
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ struct roh_send_pdu_state *state;
+ struct dcerpc_rts rts;
+ struct ncacn_packet pkt;
+ struct ndr_push *ndr;
+ struct tstream_context *stream = NULL;
+ struct tevent_queue *send_queue = NULL;
+
+ DEBUG(8, ("%s: Sending CONN/A1 request\n", __func__));
+
+ req = tevent_req_create(mem_ctx, &state, struct roh_send_pdu_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ rts.Flags = RTS_FLAG_NONE;
+ rts.NumberOfCommands = 4;
+ rts.Commands = talloc_array(state, struct dcerpc_rts_cmd, 4);
+
+ /* CONN/A1: Version RTS command */
+ rts.Commands[0].CommandType = 0x00000006;
+ rts.Commands[0].Command.Version.Version = 0x00000001;
+
+ /* CONN/A1: VirtualConnectionCookie RTS command */
+ rts.Commands[1].CommandType = 0x00000003;
+ rts.Commands[1].Command.Cookie.Cookie.Cookie = roh->connection_cookie;
+
+ /* CONN/A1: OutChannelCookie RTS command */
+ rts.Commands[2].CommandType = 0x00000003;
+ rts.Commands[2].Command.Cookie.Cookie.Cookie =
+ roh->default_channel_out->channel_cookie;
+
+ /* CONN/A1: ReceiveWindowSize */
+ rts.Commands[3].CommandType = 0x00000000;
+ rts.Commands[3].Command.ReceiveWindowSize.ReceiveWindowSize = 0x40000;
+
+ pkt.rpc_vers = 5;
+ pkt.rpc_vers_minor = 0;
+ pkt.ptype = DCERPC_PKT_RTS;
+ pkt.pfc_flags = DCERPC_PFC_FLAG_LAST | DCERPC_PFC_FLAG_FIRST;
+ pkt.drep[0] = DCERPC_DREP_LE;
+ pkt.drep[1] = 0;
+ pkt.drep[2] = 0;
+ pkt.drep[3] = 0;
+ pkt.frag_length = 76;
+ pkt.auth_length = 0;
+ pkt.call_id = 0;
+ pkt.u.rts = rts;
+
+ ndr = ndr_push_init_ctx(state);
+ if (ndr == NULL) {
+ return NULL;
+ }
+ ndr->offset = 0;
+ ndr_push_ncacn_packet(ndr, NDR_SCALARS, &pkt);
+
+ state->buffer = ndr_push_blob(ndr);
+ state->iov.iov_base = (char *) state->buffer.data;
+ state->iov.iov_len = state->buffer.length;
+
+ stream = http_conn_tstream(roh->default_channel_out->http_conn);
+ send_queue = http_conn_send_queue(roh->default_channel_out->http_conn);
+
+ subreq = tstream_writev_queue_send(mem_ctx,
+ ev,
+ stream,
+ send_queue,
+ &state->iov,
+ 1);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_send_CONN_A1_done, req);
+
+ return req;
+}
+
+static void roh_send_CONN_A1_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_send_pdu_state *state;
+ int sys_errno;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_send_pdu_state);
+
+ state->bytes_written = tstream_writev_queue_recv(subreq, &sys_errno);
+ state->sys_errno = sys_errno;
+ TALLOC_FREE(subreq);
+ if (state->bytes_written <= 0 && sys_errno != 0) {
+ status = map_nt_error_from_unix_common(sys_errno);
+ tevent_req_nterror(req, status);
+ return;
+ }
+ DEBUG(8, ("%s: CONN/A1 sent (%d bytes written)\n",
+ __func__, state->bytes_written));
+
+ tevent_req_done(req);
+}
+
+NTSTATUS roh_send_CONN_A1_recv(struct tevent_req *req)
+{
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
+
+struct roh_recv_response_state
+{
+ struct http_request *response;
+};
+
+static void roh_recv_out_channel_response_done(struct tevent_req *);
+struct tevent_req *roh_recv_out_channel_response_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct roh_connection *roh)
+{
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ struct roh_recv_response_state *state;
+
+ DEBUG(8, ("%s: Waiting for RPC_OUT_DATA response\n", __func__));
+
+ req = tevent_req_create(mem_ctx, &state, struct roh_recv_response_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ subreq = http_read_response_send(state, ev,
+ roh->default_channel_out->http_conn,
+ 0); /* we'll get the content later */
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_recv_out_channel_response_done, req);
+
+ return req;
+}
+
+static void roh_recv_out_channel_response_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_recv_response_state *state;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_recv_response_state);
+ status = http_read_response_recv(subreq, state, &state->response);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ DEBUG(8, ("%s: RCP_OUT_DATA response received\n", __func__));
+
+ /* TODO Map response code to nt error */
+ switch (state->response->response_code) {
+ case 200:
+ break;
+ case 401:
+ DEBUG(0, ("%s: Server response: Access denied\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+ return;
+ case 503:
+ /* TODO Decode error info as specified in section 2.1.2.1.3 */
+ DEBUG(0, ("%s: Server response: RPC error\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_GENERIC_NOT_MAPPED);
+ return;
+ default:
+ DEBUG(0, ("%s: Server response: Unknown error\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_GENERIC_NOT_MAPPED);
+ return;
+ }
+
+ tevent_req_done(req);
+}
+
+NTSTATUS roh_recv_out_channel_response_recv(struct tevent_req *req,
+ TALLOC_CTX *mem_ctx,
+ char **response_msg)
+{
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
+
+struct roh_recv_pdu_state {
+ struct roh_connection *roh;
+ uint32_t connection_timeout;
+ uint32_t version;
+ uint32_t recv_window_size;
+};
+
+static void roh_recv_CONN_A3_done(struct tevent_req *subreq);
+struct tevent_req *roh_recv_CONN_A3_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct roh_connection *roh)
+{
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ struct roh_recv_pdu_state *state;
+ struct tstream_context *stream = NULL;
+
+ req = tevent_req_create(mem_ctx, &state, struct roh_recv_pdu_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ DEBUG(8, ("%s: Waiting for CONN/A3\n", __func__));
+
+ stream = http_conn_tstream(roh->default_channel_out->http_conn);
+
+ subreq = dcerpc_read_ncacn_packet_send(state, ev, stream);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_recv_CONN_A3_done, req);
+
+ return req;
+}
+
+static void roh_recv_CONN_A3_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_recv_pdu_state *state;
+ struct ncacn_packet *pkt;
+ DATA_BLOB buffer;
+ struct dcerpc_rts rts;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_recv_pdu_state);
+ status = dcerpc_read_ncacn_packet_recv(subreq, state, &pkt, &buffer);
+ TALLOC_FREE(subreq);
+
+ if (tevent_req_nterror(req, status)) {
+ DEBUG(0, ("%s: Error receiving PDU\n", __func__));
+ return;
+ }
+
+ /*
+ * Check if it is a CONN/A3 (2.2.4.4) packet and get the connection
+ * timeout
+ */
+ rts = pkt->u.rts;
+ if (rts.NumberOfCommands != 1) {
+ DEBUG(0, ("%s: Invalid number of commands received\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return;
+ }
+
+ if (rts.Commands[0].CommandType != ROH_CMD_TYPE_CONNECTION_TIMEOUT) {
+ DEBUG(0, ("%s: Invalid command type received\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return;
+ }
+
+ /* Extract connection timeout */
+ state->connection_timeout = rts.Commands[0].Command.ConnectionTimeout.ConnectionTimeout;
+
+ DEBUG(8, ("%s: CONN/A3 received, connection timeout is %u\n",
+ __func__, state->connection_timeout));
+ tevent_req_done(req);
+}
+
+NTSTATUS roh_recv_CONN_A3_recv(struct tevent_req *req,
+ unsigned int *connection_timeout)
+{
+ NTSTATUS status;
+ struct roh_recv_pdu_state *state;
+
+ state = tevent_req_data(req, struct roh_recv_pdu_state);
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ *connection_timeout = state->connection_timeout;
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
+
+static void roh_recv_CONN_C2_done(struct tevent_req *subreq);
+struct tevent_req *roh_recv_CONN_C2_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct roh_connection *roh)
+{
+ struct tevent_req *req;
+ struct tevent_req *subreq;
+ struct roh_recv_pdu_state *state;
+ struct tstream_context *stream = NULL;
+
+ req = tevent_req_create(mem_ctx, &state, struct roh_recv_pdu_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ DEBUG(8, ("%s: Waiting for CONN/C2\n", __func__));
+ stream = http_conn_tstream(roh->default_channel_out->http_conn);
+
+ subreq = dcerpc_read_ncacn_packet_send(state, ev, stream);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, roh_recv_CONN_C2_done, req);
+
+ return req;
+}
+
+static void roh_recv_CONN_C2_done(struct tevent_req *subreq)
+{
+ NTSTATUS status;
+ struct tevent_req *req;
+ struct roh_recv_pdu_state *state;
+ struct ncacn_packet *pkt;
+ DATA_BLOB buffer;
+ struct dcerpc_rts rts;
+
+ req = tevent_req_callback_data(subreq, struct tevent_req);
+ state = tevent_req_data(req, struct roh_recv_pdu_state);
+
+ status = dcerpc_read_ncacn_packet_recv(subreq, state, &pkt, &buffer);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ DEBUG(0, ("%s: Error receiving PDU\n", __func__));
+ return;
+ }
+
+ /*
+ * Check if it is a CONN/C2 packet (2.2.4.9), and get the version, the
+ * receive windows size and the connection timeout for the IN channel
+ */
+ rts = pkt->u.rts;
+ if (rts.NumberOfCommands != 3) {
+ DEBUG(0, ("%s: Invalid number of commands received\n",
+ __func__));
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return;
+ }
+ if (rts.Commands[0].CommandType != ROH_CMD_TYPE_VERSION) {
+ DEBUG(0, ("%s: Invalid command type received\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return;
+ }
+ if (rts.Commands[1].CommandType != ROH_CMD_TYPE_RECV_WINDOWS_SIZE) {
+ DEBUG(0, ("%s: Invalid command type received\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return;
+ }
+ if (rts.Commands[2].CommandType != ROH_CMD_TYPE_CONNECTION_TIMEOUT) {
+ DEBUG(0, ("%s: Invalid command type received\n", __func__));
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return;
+ }
+
+ /* Extract data */
+ state->version = rts.Commands[0].Command.Version.Version;
+ state->recv_window_size = rts.Commands[1].Command.ReceiveWindowSize.ReceiveWindowSize;
+ state->connection_timeout = rts.Commands[2].Command.ConnectionTimeout.ConnectionTimeout;
+
+ DEBUG(8, ("%s: CONN/C2 received, version is %u, receive windows size is %u, connection timeout is %u\n",
+ __func__, state->version, state->recv_window_size,
+ state->connection_timeout));
+ tevent_req_done(req);
+}
+
+NTSTATUS roh_recv_CONN_C2_recv(struct tevent_req *req,
+ unsigned int *version,
+ unsigned int *recv_window_size,
+ unsigned int *connection_timeout)
+{
+ NTSTATUS status;
+ struct roh_recv_pdu_state *state;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ tevent_req_received(req);
+ return status;
+ }
+
+ state = tevent_req_data(req, struct roh_recv_pdu_state);
+ *version = state->version;
+ *recv_window_size = state->recv_window_size;
+ *connection_timeout = state->connection_timeout;
+
+ tevent_req_received(req);
+ return NT_STATUS_OK;
+}
diff --git a/source4/librpc/rpc/dcerpc_schannel.c b/source4/librpc/rpc/dcerpc_schannel.c
new file mode 100644
index 0000000..ebc7a5e
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_schannel.c
@@ -0,0 +1,623 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ dcerpc schannel operations
+
+ Copyright (C) Andrew Tridgell 2004
+ Copyright (C) Andrew Bartlett <abartlet@samba.org> 2004-2005
+ Copyright (C) Rafal Szczesniak 2006
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include <tevent.h>
+#include "auth/auth.h"
+#include "libcli/composite/composite.h"
+#include "libcli/auth/libcli_auth.h"
+#include "librpc/gen_ndr/ndr_netlogon.h"
+#include "librpc/gen_ndr/ndr_netlogon_c.h"
+#include "auth/credentials/credentials.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "param/param.h"
+#include "lib/param/loadparm.h"
+
+struct schannel_key_state {
+ struct dcerpc_pipe *pipe;
+ struct dcerpc_pipe *pipe2;
+ struct dcerpc_binding *binding;
+ bool dcerpc_schannel_auto;
+ struct cli_credentials *credentials;
+ struct netlogon_creds_CredentialState *creds;
+ uint32_t local_negotiate_flags;
+ uint32_t remote_negotiate_flags;
+ struct netr_Credential credentials1;
+ struct netr_Credential credentials2;
+ struct netr_Credential credentials3;
+ struct netr_ServerReqChallenge r;
+ struct netr_ServerAuthenticate2 a;
+ const struct samr_Password *mach_pwd;
+};
+
+
+static void continue_secondary_connection(struct composite_context *ctx);
+static void continue_bind_auth_none(struct composite_context *ctx);
+static void continue_srv_challenge(struct tevent_req *subreq);
+static void continue_srv_auth2(struct tevent_req *subreq);
+static void continue_get_capabilities(struct tevent_req *subreq);
+
+
+/*
+ Stage 2 of schannel_key: Receive endpoint mapping and request secondary
+ rpc connection
+*/
+static void continue_epm_map_binding(struct composite_context *ctx)
+{
+ struct composite_context *c;
+ struct schannel_key_state *s;
+ struct composite_context *sec_conn_req;
+
+ c = talloc_get_type(ctx->async.private_data, struct composite_context);
+ s = talloc_get_type(c->private_data, struct schannel_key_state);
+
+ /* receive endpoint mapping */
+ c->status = dcerpc_epm_map_binding_recv(ctx);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(0,("Failed to map DCERPC/TCP NCACN_NP pipe for '%s' - %s\n",
+ NDR_NETLOGON_UUID, nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return;
+ }
+
+ /* send a request for secondary rpc connection */
+ sec_conn_req = dcerpc_secondary_connection_send(s->pipe,
+ s->binding);
+ if (composite_nomem(sec_conn_req, c)) return;
+
+ composite_continue(c, sec_conn_req, continue_secondary_connection, c);
+}
+
+
+/*
+ Stage 3 of schannel_key: Receive secondary rpc connection and perform
+ non-authenticated bind request
+*/
+static void continue_secondary_connection(struct composite_context *ctx)
+{
+ struct composite_context *c;
+ struct schannel_key_state *s;
+ struct composite_context *auth_none_req;
+
+ c = talloc_get_type(ctx->async.private_data, struct composite_context);
+ s = talloc_get_type(c->private_data, struct schannel_key_state);
+
+ /* receive secondary rpc connection */
+ c->status = dcerpc_secondary_connection_recv(ctx, &s->pipe2);
+ if (!composite_is_ok(c)) return;
+
+ talloc_steal(s, s->pipe2);
+
+ /* initiate a non-authenticated bind */
+ auth_none_req = dcerpc_bind_auth_none_send(c, s->pipe2, &ndr_table_netlogon);
+ if (composite_nomem(auth_none_req, c)) return;
+
+ composite_continue(c, auth_none_req, continue_bind_auth_none, c);
+}
+
+
+/*
+ Stage 4 of schannel_key: Receive non-authenticated bind and get
+ a netlogon challenge
+*/
+static void continue_bind_auth_none(struct composite_context *ctx)
+{
+ struct composite_context *c;
+ struct schannel_key_state *s;
+ struct tevent_req *subreq;
+
+ c = talloc_get_type(ctx->async.private_data, struct composite_context);
+ s = talloc_get_type(c->private_data, struct schannel_key_state);
+
+ /* receive result of non-authenticated bind request */
+ c->status = dcerpc_bind_auth_none_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ /* prepare a challenge request */
+ s->r.in.server_name = talloc_asprintf(c, "\\\\%s", dcerpc_server_name(s->pipe));
+ if (composite_nomem(s->r.in.server_name, c)) return;
+ s->r.in.computer_name = cli_credentials_get_workstation(s->credentials);
+ s->r.in.credentials = &s->credentials1;
+ s->r.out.return_credentials = &s->credentials2;
+
+ generate_random_buffer(s->credentials1.data, sizeof(s->credentials1.data));
+
+ /*
+ request a netlogon challenge - a rpc request over opened secondary pipe
+ */
+ subreq = dcerpc_netr_ServerReqChallenge_r_send(s, c->event_ctx,
+ s->pipe2->binding_handle,
+ &s->r);
+ if (composite_nomem(subreq, c)) return;
+
+ tevent_req_set_callback(subreq, continue_srv_challenge, c);
+}
+
+
+/*
+ Stage 5 of schannel_key: Receive a challenge and perform authentication
+ on the netlogon pipe
+*/
+static void continue_srv_challenge(struct tevent_req *subreq)
+{
+ struct composite_context *c;
+ struct schannel_key_state *s;
+
+ c = tevent_req_callback_data(subreq, struct composite_context);
+ s = talloc_get_type(c->private_data, struct schannel_key_state);
+
+ /* receive rpc request result - netlogon challenge */
+ c->status = dcerpc_netr_ServerReqChallenge_r_recv(subreq, s);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ /* prepare credentials for auth2 request */
+ s->mach_pwd = cli_credentials_get_nt_hash(s->credentials, c);
+ if (s->mach_pwd == NULL) {
+ return composite_error(c, NT_STATUS_INTERNAL_ERROR);
+ }
+
+ /* auth2 request arguments */
+ s->a.in.server_name = s->r.in.server_name;
+ s->a.in.account_name = cli_credentials_get_username(s->credentials);
+ s->a.in.secure_channel_type =
+ cli_credentials_get_secure_channel_type(s->credentials);
+ s->a.in.computer_name = cli_credentials_get_workstation(s->credentials);
+ s->a.in.negotiate_flags = &s->local_negotiate_flags;
+ s->a.in.credentials = &s->credentials3;
+ s->a.out.negotiate_flags = &s->remote_negotiate_flags;
+ s->a.out.return_credentials = &s->credentials3;
+
+ s->creds = netlogon_creds_client_init(s,
+ s->a.in.account_name,
+ s->a.in.computer_name,
+ s->a.in.secure_channel_type,
+ &s->credentials1, &s->credentials2,
+ s->mach_pwd, &s->credentials3,
+ s->local_negotiate_flags);
+ if (composite_nomem(s->creds, c)) {
+ return;
+ }
+ /*
+ authenticate on the netlogon pipe - a rpc request over secondary pipe
+ */
+ subreq = dcerpc_netr_ServerAuthenticate2_r_send(s, c->event_ctx,
+ s->pipe2->binding_handle,
+ &s->a);
+ if (composite_nomem(subreq, c)) return;
+
+ tevent_req_set_callback(subreq, continue_srv_auth2, c);
+}
+
+
+/*
+ Stage 6 of schannel_key: Receive authentication request result and verify
+ received credentials
+*/
+static void continue_srv_auth2(struct tevent_req *subreq)
+{
+ struct composite_context *c;
+ struct schannel_key_state *s;
+
+ c = tevent_req_callback_data(subreq, struct composite_context);
+ s = talloc_get_type(c->private_data, struct schannel_key_state);
+
+ /* receive rpc request result - auth2 credentials */
+ c->status = dcerpc_netr_ServerAuthenticate2_r_recv(subreq, s);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ if (!NT_STATUS_EQUAL(s->a.out.result, NT_STATUS_ACCESS_DENIED) &&
+ !NT_STATUS_IS_OK(s->a.out.result)) {
+ composite_error(c, s->a.out.result);
+ return;
+ }
+
+ /*
+ * Strong keys could be unsupported (NT4) or disabled. So retry with the
+ * flags returned by the server. - asn
+ */
+ if (NT_STATUS_EQUAL(s->a.out.result, NT_STATUS_ACCESS_DENIED)) {
+ uint32_t lf = s->local_negotiate_flags;
+ const char *ln = NULL;
+ uint32_t rf = s->remote_negotiate_flags;
+ const char *rn = NULL;
+
+ if (!s->dcerpc_schannel_auto) {
+ composite_error(c, s->a.out.result);
+ return;
+ }
+ s->dcerpc_schannel_auto = false;
+
+ if (lf & NETLOGON_NEG_SUPPORTS_AES) {
+ ln = "aes";
+ if (rf & NETLOGON_NEG_SUPPORTS_AES) {
+ composite_error(c, s->a.out.result);
+ return;
+ }
+ } else if (lf & NETLOGON_NEG_STRONG_KEYS) {
+ ln = "strong";
+ if (rf & NETLOGON_NEG_STRONG_KEYS) {
+ composite_error(c, s->a.out.result);
+ return;
+ }
+ } else {
+ ln = "des";
+ }
+
+ if (rf & NETLOGON_NEG_SUPPORTS_AES) {
+ rn = "aes";
+ } else if (rf & NETLOGON_NEG_STRONG_KEYS) {
+ rn = "strong";
+ } else {
+ rn = "des";
+ }
+
+ DEBUG(3, ("Server doesn't support %s keys, downgrade to %s"
+ "and retry! local[0x%08X] remote[0x%08X]\n",
+ ln, rn, lf, rf));
+
+ s->local_negotiate_flags = s->remote_negotiate_flags;
+
+ generate_random_buffer(s->credentials1.data,
+ sizeof(s->credentials1.data));
+
+ subreq = dcerpc_netr_ServerReqChallenge_r_send(s,
+ c->event_ctx,
+ s->pipe2->binding_handle,
+ &s->r);
+ if (composite_nomem(subreq, c)) return;
+
+ tevent_req_set_callback(subreq, continue_srv_challenge, c);
+ return;
+ }
+
+ s->creds->negotiate_flags = s->remote_negotiate_flags;
+
+ /* verify credentials */
+ if (!netlogon_creds_client_check(s->creds, s->a.out.return_credentials)) {
+ composite_error(c, NT_STATUS_UNSUCCESSFUL);
+ return;
+ }
+
+ composite_done(c);
+}
+
+/*
+ Initiate establishing a schannel key using netlogon challenge
+ on a secondary pipe
+*/
+static struct composite_context *dcerpc_schannel_key_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe *p,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct schannel_key_state *s;
+ struct composite_context *epm_map_req;
+ enum netr_SchannelType schannel_type = cli_credentials_get_secure_channel_type(credentials);
+ struct cli_credentials *epm_creds = NULL;
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, p->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct schannel_key_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store parameters in the state structure */
+ s->pipe = p;
+ s->credentials = credentials;
+ s->local_negotiate_flags = NETLOGON_NEG_AUTH2_FLAGS;
+
+ /* allocate credentials */
+ if (s->pipe->conn->flags & DCERPC_SCHANNEL_128) {
+ s->local_negotiate_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
+ }
+ if (s->pipe->conn->flags & DCERPC_SCHANNEL_AES) {
+ s->local_negotiate_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
+ s->local_negotiate_flags |= NETLOGON_NEG_SUPPORTS_AES;
+ }
+ if (s->pipe->conn->flags & DCERPC_SCHANNEL_AUTO) {
+ s->local_negotiate_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
+ s->local_negotiate_flags |= NETLOGON_NEG_SUPPORTS_AES;
+ s->dcerpc_schannel_auto = true;
+ }
+
+ /* type of authentication depends on schannel type */
+ if (schannel_type == SEC_CHAN_RODC) {
+ s->local_negotiate_flags |= NETLOGON_NEG_RODC_PASSTHROUGH;
+ }
+
+ if (lpcfg_weak_crypto(lp_ctx) == SAMBA_WEAK_CRYPTO_DISALLOWED) {
+ s->local_negotiate_flags &= ~NETLOGON_NEG_ARCFOUR;
+ }
+
+ epm_creds = cli_credentials_init_anon(s);
+ if (composite_nomem(epm_creds, c)) return c;
+
+ /* allocate binding structure */
+ s->binding = dcerpc_binding_dup(s, s->pipe->binding);
+ if (composite_nomem(s->binding, c)) return c;
+
+ /* request the netlogon endpoint mapping */
+ epm_map_req = dcerpc_epm_map_binding_send(c, s->binding,
+ &ndr_table_netlogon,
+ epm_creds,
+ s->pipe->conn->event_ctx,
+ lp_ctx);
+ if (composite_nomem(epm_map_req, c)) return c;
+
+ composite_continue(c, epm_map_req, continue_epm_map_binding, c);
+ return c;
+}
+
+
+/*
+ Receive result of schannel key request
+ */
+static NTSTATUS dcerpc_schannel_key_recv(struct composite_context *c,
+ TALLOC_CTX *mem_ctx,
+ struct netlogon_creds_CredentialState **creds)
+{
+ NTSTATUS status = composite_wait(c);
+
+ if (NT_STATUS_IS_OK(status)) {
+ struct schannel_key_state *s =
+ talloc_get_type_abort(c->private_data,
+ struct schannel_key_state);
+ *creds = talloc_move(mem_ctx, &s->creds);
+ }
+
+ talloc_free(c);
+ return status;
+}
+
+
+struct auth_schannel_state {
+ struct dcerpc_pipe *pipe;
+ struct cli_credentials *credentials;
+ const struct ndr_interface_table *table;
+ struct loadparm_context *lp_ctx;
+ uint8_t auth_level;
+ struct netlogon_creds_CredentialState *creds_state;
+ struct netlogon_creds_CredentialState save_creds_state;
+ struct netr_Authenticator auth;
+ struct netr_Authenticator return_auth;
+ union netr_Capabilities capabilities;
+ struct netr_LogonGetCapabilities c;
+};
+
+
+static void continue_bind_auth(struct composite_context *ctx);
+
+
+/*
+ Stage 2 of auth_schannel: Receive schannel key and initiate an
+ authenticated bind using received credentials
+ */
+static void continue_schannel_key(struct composite_context *ctx)
+{
+ struct composite_context *auth_req;
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct auth_schannel_state *s = talloc_get_type(c->private_data,
+ struct auth_schannel_state);
+ NTSTATUS status;
+
+ /* receive schannel key */
+ status = c->status = dcerpc_schannel_key_recv(ctx, s, &s->creds_state);
+ if (!composite_is_ok(c)) {
+ DEBUG(1, ("Failed to setup credentials: %s\n", nt_errstr(status)));
+ return;
+ }
+
+ /* send bind auth request with received creds */
+ cli_credentials_set_netlogon_creds(s->credentials, s->creds_state);
+
+ auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table, s->credentials,
+ lpcfg_gensec_settings(c, s->lp_ctx),
+ DCERPC_AUTH_TYPE_SCHANNEL, s->auth_level,
+ NULL);
+ if (composite_nomem(auth_req, c)) return;
+
+ composite_continue(c, auth_req, continue_bind_auth, c);
+}
+
+
+/*
+ Stage 3 of auth_schannel: Receive result of authenticated bind
+ and say if we're done ok.
+*/
+static void continue_bind_auth(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct auth_schannel_state *s = talloc_get_type(c->private_data,
+ struct auth_schannel_state);
+ struct tevent_req *subreq;
+
+ c->status = dcerpc_bind_auth_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ /* if we have a AES encrypted connection, verify the capabilities */
+ if (ndr_syntax_id_equal(&s->table->syntax_id,
+ &ndr_table_netlogon.syntax_id)) {
+ NTSTATUS status;
+ ZERO_STRUCT(s->return_auth);
+
+ s->save_creds_state = *s->creds_state;
+ status = netlogon_creds_client_authenticator(&s->save_creds_state,
+ &s->auth);
+ if (!NT_STATUS_IS_OK(status)) {
+ composite_error(c, status);
+ return;
+ }
+
+ s->c.in.server_name = talloc_asprintf(c,
+ "\\\\%s",
+ dcerpc_server_name(s->pipe));
+ if (composite_nomem(s->c.in.server_name, c)) return;
+ s->c.in.computer_name = cli_credentials_get_workstation(s->credentials);
+ s->c.in.credential = &s->auth;
+ s->c.in.return_authenticator = &s->return_auth;
+ s->c.in.query_level = 1;
+
+ s->c.out.capabilities = &s->capabilities;
+ s->c.out.return_authenticator = &s->return_auth;
+
+ DEBUG(5, ("We established a AES connection, verifying logon "
+ "capabilities\n"));
+
+ subreq = dcerpc_netr_LogonGetCapabilities_r_send(s,
+ c->event_ctx,
+ s->pipe->binding_handle,
+ &s->c);
+ if (composite_nomem(subreq, c)) return;
+
+ tevent_req_set_callback(subreq, continue_get_capabilities, c);
+ return;
+ }
+
+ composite_done(c);
+}
+
+/*
+ Stage 4 of auth_schannel: Get the Logon Capabilities and verify them.
+*/
+static void continue_get_capabilities(struct tevent_req *subreq)
+{
+ struct composite_context *c;
+ struct auth_schannel_state *s;
+
+ c = tevent_req_callback_data(subreq, struct composite_context);
+ s = talloc_get_type(c->private_data, struct auth_schannel_state);
+
+ /* receive rpc request result */
+ c->status = dcerpc_netr_LogonGetCapabilities_r_recv(subreq, s);
+ TALLOC_FREE(subreq);
+ if (NT_STATUS_EQUAL(c->status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) {
+ if (s->creds_state->negotiate_flags & NETLOGON_NEG_SUPPORTS_AES) {
+ composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
+ return;
+ } else {
+ /* This is probably NT */
+ composite_done(c);
+ return;
+ }
+ } else if (!composite_is_ok(c)) {
+ return;
+ }
+
+ if (NT_STATUS_EQUAL(s->c.out.result, NT_STATUS_NOT_IMPLEMENTED)) {
+ if (s->creds_state->negotiate_flags & NETLOGON_NEG_SUPPORTS_AES) {
+ /* This means AES isn't supported. */
+ composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
+ return;
+ }
+
+ /* This is probably an old Samba version */
+ composite_done(c);
+ return;
+ }
+
+ /* verify credentials */
+ if (!netlogon_creds_client_check(&s->save_creds_state,
+ &s->c.out.return_authenticator->cred)) {
+ composite_error(c, NT_STATUS_UNSUCCESSFUL);
+ return;
+ }
+
+ *s->creds_state = s->save_creds_state;
+ cli_credentials_set_netlogon_creds(s->credentials, s->creds_state);
+
+ if (!NT_STATUS_IS_OK(s->c.out.result)) {
+ composite_error(c, s->c.out.result);
+ return;
+ }
+
+ /* compare capabilities */
+ if (s->creds_state->negotiate_flags != s->capabilities.server_capabilities) {
+ DEBUG(2, ("The client capabilities don't match the server "
+ "capabilities: local[0x%08X] remote[0x%08X]\n",
+ s->creds_state->negotiate_flags,
+ s->capabilities.server_capabilities));
+ composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
+ return;
+ }
+
+ /* TODO: Add downgrade detection. */
+
+ composite_done(c);
+}
+
+
+/*
+ Initiate schannel authentication request
+*/
+struct composite_context *dcerpc_bind_auth_schannel_send(TALLOC_CTX *tmp_ctx,
+ struct dcerpc_pipe *p,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx,
+ uint8_t auth_level)
+{
+ struct composite_context *c;
+ struct auth_schannel_state *s;
+ struct composite_context *schan_key_req;
+
+ /* composite context allocation and setup */
+ c = composite_create(tmp_ctx, p->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct auth_schannel_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store parameters in the state structure */
+ s->pipe = p;
+ s->credentials = credentials;
+ s->table = table;
+ s->auth_level = auth_level;
+ s->lp_ctx = lp_ctx;
+
+ /* start getting schannel key first */
+ schan_key_req = dcerpc_schannel_key_send(c, p, credentials, lp_ctx);
+ if (composite_nomem(schan_key_req, c)) return c;
+
+ composite_continue(c, schan_key_req, continue_schannel_key, c);
+ return c;
+}
+
+
+/*
+ Receive result of schannel authentication request
+*/
+NTSTATUS dcerpc_bind_auth_schannel_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
diff --git a/source4/librpc/rpc/dcerpc_secondary.c b/source4/librpc/rpc/dcerpc_secondary.c
new file mode 100644
index 0000000..55068dc
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_secondary.c
@@ -0,0 +1,431 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ dcerpc connect functions
+
+ Copyright (C) Andrew Tridgell 2003
+ Copyright (C) Jelmer Vernooij 2004
+ Copyright (C) Andrew Bartlett <abartlet@samba.org> 2005-2007
+ Copyright (C) Rafal Szczesniak 2005
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include "includes.h"
+#include "libcli/composite/composite.h"
+#include "lib/events/events.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "auth/credentials/credentials.h"
+#include "param/param.h"
+#include "libcli/resolve/resolve.h"
+#include "lib/util/util_net.h"
+
+struct sec_conn_state {
+ struct dcerpc_pipe *pipe;
+ struct dcerpc_pipe *pipe2;
+ struct dcerpc_binding *binding;
+};
+
+
+static void continue_open_smb(struct composite_context *ctx);
+static void continue_open_tcp(struct composite_context *ctx);
+static void continue_open_ncalrpc(struct composite_context *ctx);
+static void continue_open_ncacn_unix(struct composite_context *ctx);
+static void continue_pipe_open(struct composite_context *c);
+
+
+/*
+ Send request to create a secondary dcerpc connection from a primary
+ connection
+*/
+_PUBLIC_ struct composite_context* dcerpc_secondary_connection_send(struct dcerpc_pipe *p,
+ const struct dcerpc_binding *b)
+{
+ struct composite_context *c;
+ struct sec_conn_state *s;
+ struct composite_context *pipe_smb_req;
+ struct composite_context *pipe_tcp_req;
+ const char *localaddress = NULL;
+ struct composite_context *pipe_ncalrpc_req;
+ const char *ncalrpc_dir = NULL;
+ struct composite_context *pipe_unix_req;
+ const char *host;
+ const char *target_hostname;
+ const char *endpoint;
+
+ /* composite context allocation and setup */
+ c = composite_create(p, p->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct sec_conn_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ s->pipe = p;
+ s->binding = dcerpc_binding_dup(s, b);
+ if (composite_nomem(s->binding, c)) return c;
+
+ /* initialise second dcerpc pipe based on primary pipe's event context */
+ s->pipe2 = dcerpc_pipe_init(c, s->pipe->conn->event_ctx);
+ if (composite_nomem(s->pipe2, c)) return c;
+
+ if (DEBUGLEVEL >= 10)
+ s->pipe2->conn->packet_log_dir = s->pipe->conn->packet_log_dir;
+
+ host = dcerpc_binding_get_string_option(s->binding, "host");
+ if (host == NULL) {
+ /*
+ * We may fallback to the host of the given connection
+ */
+ host = dcerpc_binding_get_string_option(s->pipe->binding,
+ "host");
+ }
+ target_hostname = dcerpc_binding_get_string_option(s->binding, "target_hostname");
+ if (target_hostname == NULL) {
+ /*
+ * We may fallback to the target_hostname of the given connection
+ */
+ target_hostname = dcerpc_binding_get_string_option(s->pipe->binding,
+ "target_hostname");
+ }
+ endpoint = dcerpc_binding_get_string_option(s->binding, "endpoint");
+ if (endpoint == NULL) {
+ /*
+ * We may fallback to the endpoint of the given connection
+ */
+ endpoint = dcerpc_binding_get_string_option(s->pipe->binding, "endpoint");
+ }
+ if (endpoint == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ /* open second dcerpc pipe using the same transport as for primary pipe */
+ switch (s->pipe->conn->transport.transport) {
+ case NCACN_NP:
+ pipe_smb_req = dcerpc_secondary_smb_send(s->pipe->conn,
+ s->pipe2->conn,
+ endpoint);
+ composite_continue(c, pipe_smb_req, continue_open_smb, c);
+ return c;
+
+ case NCACN_IP_TCP:
+ if (host == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ if (!is_ipaddress(host)) {
+ /*
+ * We may fallback to the host of the given connection
+ */
+ host = dcerpc_binding_get_string_option(s->pipe->binding,
+ "host");
+ if (host == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+ if (!is_ipaddress(host)) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+ }
+
+ localaddress = dcerpc_binding_get_string_option(s->binding,
+ "localaddress");
+ if (localaddress == NULL) {
+ /*
+ * We may fallback to the localaddress of the given connection
+ */
+ localaddress = dcerpc_binding_get_string_option(s->pipe->binding,
+ "localaddress");
+ }
+
+ pipe_tcp_req = dcerpc_pipe_open_tcp_send(s->pipe2->conn,
+ localaddress,
+ host,
+ target_hostname,
+ atoi(endpoint),
+ resolve_context_init(s));
+ composite_continue(c, pipe_tcp_req, continue_open_tcp, c);
+ return c;
+
+ case NCALRPC:
+ ncalrpc_dir = dcerpc_binding_get_string_option(s->binding,
+ "ncalrpc_dir");
+ if (ncalrpc_dir == NULL) {
+ ncalrpc_dir = dcerpc_binding_get_string_option(s->pipe->binding,
+ "ncalrpc_dir");
+ }
+ if (ncalrpc_dir == NULL) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ pipe_ncalrpc_req = dcerpc_pipe_open_pipe_send(s->pipe2->conn,
+ ncalrpc_dir,
+ endpoint);
+ composite_continue(c, pipe_ncalrpc_req, continue_open_ncalrpc, c);
+ return c;
+
+ case NCACN_UNIX_STREAM:
+ pipe_unix_req = dcerpc_pipe_open_unix_stream_send(s->pipe2->conn,
+ endpoint);
+ composite_continue(c, pipe_unix_req, continue_open_ncacn_unix, c);
+ return c;
+
+ default:
+ /* looks like a transport we don't support */
+ composite_error(c, NT_STATUS_NOT_SUPPORTED);
+ }
+
+ return c;
+}
+
+
+/*
+ Stage 2 of secondary_connection: Receive result of pipe open request on smb
+*/
+static void continue_open_smb(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ c->status = dcerpc_secondary_smb_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_open(c);
+}
+
+
+/*
+ Stage 2 of secondary_connection: Receive result of pipe open request on tcp/ip
+*/
+static void continue_open_tcp(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct sec_conn_state *s = talloc_get_type_abort(c->private_data,
+ struct sec_conn_state);
+ char *localaddr = NULL;
+ char *remoteaddr = NULL;
+
+ c->status = dcerpc_pipe_open_tcp_recv(ctx, s, &localaddr, &remoteaddr);
+ if (!composite_is_ok(c)) return;
+
+ c->status = dcerpc_binding_set_string_option(s->binding,
+ "localaddress",
+ localaddr);
+ if (!composite_is_ok(c)) return;
+
+ c->status = dcerpc_binding_set_string_option(s->binding,
+ "host",
+ remoteaddr);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_open(c);
+}
+
+/*
+ Stage 2 of secondary_connection: Receive result of pipe open request on ncalrpc
+*/
+static void continue_open_ncalrpc(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ c->status = dcerpc_pipe_open_pipe_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_open(c);
+}
+
+/*
+ Stage 2 of secondary_connection: Receive result of pipe open request on ncacn_unix
+*/
+static void continue_open_ncacn_unix(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ c->status = dcerpc_pipe_open_unix_stream_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ continue_pipe_open(c);
+}
+
+
+/*
+ Stage 3 of secondary_connection: Get binding data and flags from primary pipe
+ and say if we're done ok.
+*/
+static void continue_pipe_open(struct composite_context *c)
+{
+ struct sec_conn_state *s;
+
+ s = talloc_get_type(c->private_data, struct sec_conn_state);
+
+ s->pipe2->conn->flags = s->pipe->conn->flags;
+ s->pipe2->binding = dcerpc_binding_dup(s->pipe2, s->binding);
+ if (composite_nomem(s->pipe2->binding, c)) {
+ return;
+ }
+
+ composite_done(c);
+}
+
+
+/*
+ Receive result of secondary rpc connection request and return
+ second dcerpc pipe.
+*/
+_PUBLIC_ NTSTATUS dcerpc_secondary_connection_recv(struct composite_context *c,
+ struct dcerpc_pipe **p2)
+{
+ NTSTATUS status = composite_wait(c);
+ struct sec_conn_state *s;
+
+ s = talloc_get_type(c->private_data, struct sec_conn_state);
+
+ if (NT_STATUS_IS_OK(status)) {
+ *p2 = talloc_steal(s->pipe, s->pipe2);
+ }
+
+ talloc_free(c);
+ return status;
+}
+
+/*
+ Create a secondary DCERPC connection, then bind (and possibly
+ authenticate) using the supplied credentials.
+
+ This creates a second connection, to the same host (and on ncacn_np on the same connection) as the first
+*/
+struct sec_auth_conn_state {
+ struct dcerpc_pipe *pipe2;
+ const struct dcerpc_binding *binding;
+ const struct ndr_interface_table *table;
+ struct cli_credentials *credentials;
+ struct composite_context *ctx;
+ struct loadparm_context *lp_ctx;
+};
+
+static void dcerpc_secondary_auth_connection_bind(struct composite_context *ctx);
+static void dcerpc_secondary_auth_connection_continue(struct composite_context *ctx);
+
+_PUBLIC_ struct composite_context* dcerpc_secondary_auth_connection_send(struct dcerpc_pipe *p,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx)
+{
+
+ struct composite_context *c, *secondary_conn_ctx;
+ struct sec_auth_conn_state *s;
+
+ /* composite context allocation and setup */
+ c = composite_create(p, p->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct sec_auth_conn_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+ s->ctx = c;
+
+ s->binding = binding;
+ s->table = table;
+ s->credentials = credentials;
+ s->lp_ctx = lp_ctx;
+
+ secondary_conn_ctx = dcerpc_secondary_connection_send(p, binding);
+
+ if (composite_nomem(secondary_conn_ctx, s->ctx)) {
+ talloc_free(c);
+ return NULL;
+ }
+
+ composite_continue(s->ctx, secondary_conn_ctx, dcerpc_secondary_auth_connection_bind,
+ s);
+ return c;
+}
+
+/*
+ Stage 2 of secondary_auth_connection:
+ Having made the secondary connection, we will need to do an (authenticated) bind
+*/
+static void dcerpc_secondary_auth_connection_bind(struct composite_context *ctx)
+{
+ struct composite_context *secondary_auth_ctx;
+ struct sec_auth_conn_state *s = talloc_get_type(ctx->async.private_data,
+ struct sec_auth_conn_state);
+
+ s->ctx->status = dcerpc_secondary_connection_recv(ctx, &s->pipe2);
+ if (!composite_is_ok(s->ctx)) return;
+
+ secondary_auth_ctx = dcerpc_pipe_auth_send(s->pipe2, s->binding, s->table, s->credentials,
+ s->lp_ctx);
+ composite_continue(s->ctx, secondary_auth_ctx, dcerpc_secondary_auth_connection_continue, s);
+
+}
+
+/*
+ Stage 3 of secondary_auth_connection: Receive result of authenticated bind request
+*/
+static void dcerpc_secondary_auth_connection_continue(struct composite_context *ctx)
+{
+ struct sec_auth_conn_state *s = talloc_get_type(ctx->async.private_data,
+ struct sec_auth_conn_state);
+
+ s->ctx->status = dcerpc_pipe_auth_recv(ctx, s, &s->pipe2);
+ if (!composite_is_ok(s->ctx)) return;
+
+ composite_done(s->ctx);
+}
+
+/*
+ Receive an authenticated pipe, created as a secondary connection
+*/
+_PUBLIC_ NTSTATUS dcerpc_secondary_auth_connection_recv(struct composite_context *c,
+ TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p)
+{
+ NTSTATUS status = composite_wait(c);
+ struct sec_auth_conn_state *s;
+
+ s = talloc_get_type(c->private_data, struct sec_auth_conn_state);
+
+ if (NT_STATUS_IS_OK(status)) {
+ *p = talloc_steal(mem_ctx, s->pipe2);
+ }
+
+ talloc_free(c);
+ return status;
+}
+
+_PUBLIC_ NTSTATUS dcerpc_secondary_auth_connection(struct dcerpc_pipe *p,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx,
+ TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p2)
+{
+ struct composite_context *c;
+
+ c = dcerpc_secondary_auth_connection_send(p, binding, table,
+ credentials, lp_ctx);
+ return dcerpc_secondary_auth_connection_recv(c, mem_ctx, p2);
+}
diff --git a/source4/librpc/rpc/dcerpc_smb.c b/source4/librpc/rpc/dcerpc_smb.c
new file mode 100644
index 0000000..259de71
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_smb.c
@@ -0,0 +1,310 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ dcerpc over SMB transport
+
+ Copyright (C) Tim Potter 2003
+ Copyright (C) Andrew Tridgell 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "system/filesys.h"
+#include <tevent.h>
+#include "lib/tsocket/tsocket.h"
+#include "libcli/smb/smb_constants.h"
+#include "libcli/smb/smbXcli_base.h"
+#include "libcli/smb/tstream_smbXcli_np.h"
+#include "libcli/raw/libcliraw.h"
+#include "libcli/smb2/smb2.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "libcli/composite/composite.h"
+
+#undef strncasecmp
+
+/* transport private information used by SMB pipe transport */
+struct smb_private {
+ DATA_BLOB session_key;
+
+ /*
+ * these are needed to open a secondary connection
+ */
+ struct smbXcli_conn *conn;
+ struct smbXcli_session *session;
+ struct smbXcli_tcon *tcon;
+ uint32_t timeout_msec;
+};
+
+/*
+ fetch the user session key
+*/
+static NTSTATUS smb_session_key(struct dcecli_connection *c, DATA_BLOB *session_key)
+{
+ struct smb_private *smb = talloc_get_type_abort(
+ c->transport.private_data, struct smb_private);
+
+ if (smb == NULL) return NT_STATUS_CONNECTION_DISCONNECTED;
+
+ if (smb->session_key.length == 0) {
+ return NT_STATUS_NO_USER_SESSION_KEY;
+ }
+
+ *session_key = smb->session_key;
+ return NT_STATUS_OK;
+}
+
+struct dcerpc_pipe_open_smb_state {
+ struct dcecli_connection *c;
+ struct composite_context *ctx;
+
+ const char *fname;
+
+ struct smb_private *smb;
+};
+
+static void dcerpc_pipe_open_smb_done(struct tevent_req *subreq);
+
+struct composite_context *dcerpc_pipe_open_smb_send(struct dcecli_connection *c,
+ struct smbXcli_conn *conn,
+ struct smbXcli_session *session,
+ struct smbXcli_tcon *tcon,
+ uint32_t timeout_msec,
+ const char *pipe_name)
+{
+ struct composite_context *ctx;
+ struct dcerpc_pipe_open_smb_state *state;
+ uint16_t pid = 0;
+ struct tevent_req *subreq;
+
+ ctx = composite_create(c, c->event_ctx);
+ if (ctx == NULL) return NULL;
+
+ state = talloc(ctx, struct dcerpc_pipe_open_smb_state);
+ if (composite_nomem(state, ctx)) return ctx;
+ ctx->private_data = state;
+
+ state->c = c;
+ state->ctx = ctx;
+
+ if ((strncasecmp(pipe_name, "/pipe/", 6) == 0) ||
+ (strncasecmp(pipe_name, "\\pipe\\", 6) == 0)) {
+ pipe_name += 6;
+ }
+ if ((strncasecmp(pipe_name, "/", 1) == 0) ||
+ (strncasecmp(pipe_name, "\\", 1) == 0)) {
+ pipe_name += 1;
+ }
+ state->fname = talloc_strdup(state, pipe_name);
+ if (composite_nomem(state->fname, ctx)) return ctx;
+
+ state->smb = talloc_zero(state, struct smb_private);
+ if (composite_nomem(state->smb, ctx)) return ctx;
+
+ state->smb->conn = conn;
+ state->smb->session = session;
+ state->smb->tcon = tcon;
+ state->smb->timeout_msec = timeout_msec;
+
+ state->c->server_name = strupper_talloc(state->c,
+ smbXcli_conn_remote_name(conn));
+ if (composite_nomem(state->c->server_name, ctx)) return ctx;
+
+ ctx->status = smbXcli_session_application_key(session,
+ state->smb,
+ &state->smb->session_key);
+ if (NT_STATUS_EQUAL(ctx->status, NT_STATUS_NO_USER_SESSION_KEY)) {
+ state->smb->session_key = data_blob_null;
+ ctx->status = NT_STATUS_OK;
+ }
+ if (!composite_is_ok(ctx)) return ctx;
+
+ subreq = tstream_smbXcli_np_open_send(state, c->event_ctx,
+ conn, session, tcon, pid,
+ timeout_msec, state->fname);
+ if (composite_nomem(subreq, ctx)) return ctx;
+ tevent_req_set_callback(subreq, dcerpc_pipe_open_smb_done, state);
+
+ return ctx;
+}
+
+static void dcerpc_pipe_open_smb_done(struct tevent_req *subreq)
+{
+ struct dcerpc_pipe_open_smb_state *state =
+ tevent_req_callback_data(subreq,
+ struct dcerpc_pipe_open_smb_state);
+ struct composite_context *ctx = state->ctx;
+ struct dcecli_connection *c = state->c;
+ uint16_t enc_cipher;
+
+ ctx->status = tstream_smbXcli_np_open_recv(subreq,
+ state->smb,
+ &state->c->transport.stream);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(ctx)) return;
+
+ state->c->transport.write_queue =
+ tevent_queue_create(state->c, "dcerpc_smb write queue");
+ if (composite_nomem(state->c->transport.write_queue, ctx)) return;
+
+ /*
+ fill in the transport methods
+ */
+ c->transport.transport = NCACN_NP;
+ c->transport.private_data = NULL;
+
+ /*
+ * Windows uses 4280 for ncacn_np,
+ * so we also use it, this is what our
+ * tstream_smbXcli_np code relies on.
+ */
+ c->srv_max_xmit_frag = 4280;
+ c->srv_max_recv_frag = 4280;
+
+ /* Over-ride the default session key with the SMB session key */
+ c->security_state.session_key = smb_session_key;
+
+ enc_cipher = smb2cli_session_get_encryption_cipher(state->smb->session);
+ switch (enc_cipher) {
+ case SMB2_ENCRYPTION_AES128_CCM:
+ case SMB2_ENCRYPTION_AES128_GCM:
+ c->transport.encrypted = true;
+ break;
+ default:
+ c->transport.encrypted = false;
+ }
+
+ c->transport.private_data = talloc_move(c, &state->smb);
+
+ composite_done(ctx);
+}
+
+NTSTATUS dcerpc_pipe_open_smb_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+ talloc_free(c);
+ return status;
+}
+
+_PUBLIC_ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe *p,
+ struct smbcli_tree *t,
+ const char *pipe_name)
+{
+ struct smbXcli_conn *conn;
+ struct smbXcli_session *session;
+ struct smbXcli_tcon *tcon;
+ struct composite_context *ctx;
+
+ conn = t->session->transport->conn;
+ session = t->session->smbXcli;
+ tcon = t->smbXcli;
+ smb1cli_tcon_set_id(tcon, t->tid);
+
+ /* if we don't have a binding on this pipe yet, then create one */
+ if (p->binding == NULL) {
+ struct dcerpc_binding *b;
+ NTSTATUS status;
+ const char *r = smbXcli_conn_remote_name(conn);
+ char *str;
+ SMB_ASSERT(r != NULL);
+ str = talloc_asprintf(p, "ncacn_np:%s", r);
+ if (str == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ status = dcerpc_parse_binding(p, str, &b);
+ talloc_free(str);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+ p->binding = b;
+ }
+
+ ctx = dcerpc_pipe_open_smb_send(p->conn,
+ conn, session, tcon,
+ DCERPC_REQUEST_TIMEOUT * 1000,
+ pipe_name);
+ if (ctx == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ return dcerpc_pipe_open_smb_recv(ctx);
+}
+
+_PUBLIC_ NTSTATUS dcerpc_pipe_open_smb2(struct dcerpc_pipe *p,
+ struct smb2_tree *t,
+ const char *pipe_name)
+{
+ struct smbXcli_conn *conn;
+ struct smbXcli_session *session;
+ struct smbXcli_tcon *tcon;
+ struct composite_context *ctx;
+
+ conn = t->session->transport->conn;
+ session = t->session->smbXcli;
+ tcon = t->smbXcli;
+
+ /* if we don't have a binding on this pipe yet, then create one */
+ if (p->binding == NULL) {
+ struct dcerpc_binding *b;
+ NTSTATUS status;
+ const char *r = smbXcli_conn_remote_name(conn);
+ char *str;
+ SMB_ASSERT(r != NULL);
+ str = talloc_asprintf(p, "ncacn_np:%s", r);
+ if (str == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ status = dcerpc_parse_binding(p, str, &b);
+ talloc_free(str);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+ p->binding = b;
+ }
+
+ ctx = dcerpc_pipe_open_smb_send(p->conn,
+ conn, session, tcon,
+ DCERPC_REQUEST_TIMEOUT * 1000,
+ pipe_name);
+ if (ctx == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ return dcerpc_pipe_open_smb_recv(ctx);
+}
+
+struct composite_context *dcerpc_secondary_smb_send(struct dcecli_connection *c1,
+ struct dcecli_connection *c2,
+ const char *pipe_name)
+{
+ struct smb_private *smb;
+
+ if (c1->transport.transport != NCACN_NP) return NULL;
+
+ smb = talloc_get_type(c1->transport.private_data, struct smb_private);
+ if (!smb) return NULL;
+
+ return dcerpc_pipe_open_smb_send(c2,
+ smb->conn,
+ smb->session,
+ smb->tcon,
+ smb->timeout_msec,
+ pipe_name);
+}
+
+NTSTATUS dcerpc_secondary_smb_recv(struct composite_context *c)
+{
+ return dcerpc_pipe_open_smb_recv(c);
+}
diff --git a/source4/librpc/rpc/dcerpc_sock.c b/source4/librpc/rpc/dcerpc_sock.c
new file mode 100644
index 0000000..ec5a5ca
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_sock.c
@@ -0,0 +1,499 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ dcerpc over standard sockets transport
+
+ Copyright (C) Andrew Tridgell 2003
+ Copyright (C) Jelmer Vernooij 2004
+ Copyright (C) Rafal Szczesniak 2006
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "system/filesys.h"
+#include "lib/events/events.h"
+#include "lib/socket/socket.h"
+#include "lib/tsocket/tsocket.h"
+#include "libcli/composite/composite.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "libcli/resolve/resolve.h"
+#include "librpc/rpc/rpc_common.h"
+
+struct pipe_open_socket_state {
+ struct dcecli_connection *conn;
+ struct socket_context *socket_ctx;
+ struct socket_address *localaddr;
+ struct socket_address *server;
+ const char *target_hostname;
+ enum dcerpc_transport_t transport;
+ struct socket_address *client;
+};
+
+
+static void continue_socket_connect(struct composite_context *ctx)
+{
+ struct dcecli_connection *conn;
+ struct composite_context *c = talloc_get_type_abort(
+ ctx->async.private_data, struct composite_context);
+ struct pipe_open_socket_state *s = talloc_get_type_abort(
+ c->private_data, struct pipe_open_socket_state);
+ int rc;
+ int sock_fd;
+
+ /* make it easier to write a function calls */
+ conn = s->conn;
+
+ c->status = socket_connect_recv(ctx);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DBG_NOTICE("Failed to connect host %s on port %d - %s\n",
+ s->server->addr, s->server->port,
+ nt_errstr(c->status));
+ composite_error(c, c->status);
+ return;
+ }
+
+ s->client = socket_get_my_addr(s->socket_ctx, s);
+ if (s->client == NULL) {
+ TALLOC_FREE(s->socket_ctx);
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ return;
+ }
+ sock_fd = socket_get_fd(s->socket_ctx);
+ if (sock_fd == -1) {
+ TALLOC_FREE(s->socket_ctx);
+ composite_error(c, NT_STATUS_INVALID_HANDLE);
+ return;
+ }
+ socket_set_flags(s->socket_ctx, SOCKET_FLAG_NOCLOSE);
+ TALLOC_FREE(s->socket_ctx);
+
+ /*
+ fill in the transport methods
+ */
+ conn->transport.transport = s->transport;
+ conn->transport.private_data = NULL;
+
+ /*
+ * Windows uses 5840 for ncacn_ip_tcp,
+ * so we also use it (for every transport which uses bsd sockets)
+ */
+ conn->srv_max_xmit_frag = 5840;
+ conn->srv_max_recv_frag = 5840;
+
+ conn->transport.pending_reads = 0;
+ conn->server_name = strupper_talloc(conn, s->target_hostname);
+
+ rc = tstream_bsd_existing_socket(conn, sock_fd,
+ &conn->transport.stream);
+ if (rc < 0) {
+ close(sock_fd);
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ return;
+ }
+
+ conn->transport.write_queue =
+ tevent_queue_create(conn, "dcerpc sock write queue");
+ if (conn->transport.write_queue == NULL) {
+ TALLOC_FREE(conn->transport.stream);
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ return;
+ }
+
+ /* ensure we don't get SIGPIPE */
+ BlockSignals(true, SIGPIPE);
+
+ composite_done(c);
+}
+
+
+static struct composite_context *dcerpc_pipe_open_socket_send(TALLOC_CTX *mem_ctx,
+ struct dcecli_connection *cn,
+ struct socket_address *localaddr,
+ struct socket_address *server,
+ const char *target_hostname,
+ const char *full_path,
+ enum dcerpc_transport_t transport)
+{
+ struct composite_context *c;
+ struct pipe_open_socket_state *s;
+ struct composite_context *conn_req;
+
+ c = composite_create(mem_ctx, cn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_open_socket_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ s->conn = cn;
+ s->transport = transport;
+ if (localaddr) {
+ s->localaddr = socket_address_copy(s, localaddr);
+ if (composite_nomem(s->localaddr, c)) return c;
+ }
+ s->server = socket_address_copy(s, server);
+ if (composite_nomem(s->server, c)) return c;
+ if (target_hostname) {
+ s->target_hostname = talloc_strdup(s, target_hostname);
+ if (composite_nomem(s->target_hostname, c)) return c;
+ }
+
+ c->status = socket_create(s, server->family, SOCKET_TYPE_STREAM,
+ &s->socket_ctx, 0);
+ if (!composite_is_ok(c)) return c;
+
+ conn_req = socket_connect_send(s->socket_ctx, s->localaddr, s->server, 0,
+ c->event_ctx);
+ composite_continue(c, conn_req, continue_socket_connect, c);
+ return c;
+}
+
+static NTSTATUS dcerpc_pipe_open_socket_recv(struct composite_context *c,
+ TALLOC_CTX *mem_ctx,
+ struct socket_address **localaddr)
+{
+ NTSTATUS status = composite_wait(c);
+
+ if (NT_STATUS_IS_OK(status)) {
+ struct pipe_open_socket_state *s =
+ talloc_get_type_abort(c->private_data,
+ struct pipe_open_socket_state);
+
+ if (localaddr != NULL) {
+ *localaddr = talloc_move(mem_ctx, &s->client);
+ }
+ }
+
+ talloc_free(c);
+ return status;
+}
+
+struct pipe_tcp_state {
+ const char *server;
+ const char *target_hostname;
+ const char **addresses;
+ uint32_t index;
+ uint32_t port;
+ struct socket_address *localaddr;
+ struct socket_address *srvaddr;
+ struct resolve_context *resolve_ctx;
+ struct dcecli_connection *conn;
+ struct nbt_name name;
+ char *local_address;
+ char *remote_address;
+};
+
+
+static void continue_ip_open_socket(struct composite_context *ctx);
+static void continue_ip_resolve_name(struct composite_context *ctx);
+
+static void continue_ip_resolve_name(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type_abort(
+ ctx->async.private_data, struct composite_context);
+ struct pipe_tcp_state *s = talloc_get_type_abort(
+ c->private_data, struct pipe_tcp_state);
+ struct composite_context *sock_ip_req;
+
+ c->status = resolve_name_multiple_recv(ctx, s, &s->addresses);
+ if (!composite_is_ok(c)) return;
+
+ /* prepare server address using host ip:port and transport name */
+ s->srvaddr = socket_address_from_strings(s->conn, "ip", s->addresses[s->index], s->port);
+ s->index++;
+ if (composite_nomem(s->srvaddr, c)) return;
+
+ sock_ip_req = dcerpc_pipe_open_socket_send(c, s->conn, s->localaddr,
+ s->srvaddr, s->target_hostname,
+ NULL,
+ NCACN_IP_TCP);
+ composite_continue(c, sock_ip_req, continue_ip_open_socket, c);
+}
+
+
+/*
+ Stage 2 of dcerpc_pipe_open_tcp_send: receive result of pipe open request
+ on IP transport.
+*/
+static void continue_ip_open_socket(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type_abort(
+ ctx->async.private_data, struct composite_context);
+ struct pipe_tcp_state *s = talloc_get_type_abort(
+ c->private_data, struct pipe_tcp_state);
+ struct socket_address *localaddr = NULL;
+
+ /* receive result socket open request */
+ c->status = dcerpc_pipe_open_socket_recv(ctx, s, &localaddr);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ /* something went wrong... */
+ DBG_NOTICE("Failed to connect host %s (%s) on port %d - %s.\n",
+ s->addresses[s->index - 1], s->target_hostname,
+ s->port, nt_errstr(c->status));
+ if (s->addresses[s->index]) {
+ struct composite_context *sock_ip_req;
+ talloc_free(s->srvaddr);
+ /* prepare server address using host ip:port and transport name */
+ s->srvaddr = socket_address_from_strings(s->conn, "ip", s->addresses[s->index], s->port);
+ s->index++;
+ if (composite_nomem(s->srvaddr, c)) return;
+
+ sock_ip_req = dcerpc_pipe_open_socket_send(c, s->conn, s->localaddr,
+ s->srvaddr, s->target_hostname,
+ NULL,
+ NCACN_IP_TCP);
+ composite_continue(c, sock_ip_req, continue_ip_open_socket, c);
+
+ return;
+ } else {
+ composite_error(c, c->status);
+ return;
+ }
+ }
+
+ s->local_address = talloc_strdup(s, localaddr->addr);
+ if (composite_nomem(s->local_address, c)) return;
+ s->remote_address = talloc_strdup(s, s->addresses[s->index - 1]);
+ if (composite_nomem(s->remote_address, c)) return;
+
+ composite_done(c);
+}
+
+/*
+ Send rpc pipe open request to given host:port using
+ tcp/ip transport
+*/
+struct composite_context* dcerpc_pipe_open_tcp_send(struct dcecli_connection *conn,
+ const char *localaddr,
+ const char *server,
+ const char *target_hostname,
+ uint32_t port,
+ struct resolve_context *resolve_ctx)
+{
+ struct composite_context *c;
+ struct pipe_tcp_state *s;
+ struct composite_context *resolve_req;
+
+ /* composite context allocation and setup */
+ c = composite_create(conn, conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_tcp_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store input parameters in state structure */
+ s->server = talloc_strdup(c, server);
+ if (composite_nomem(s->server, c)) return c;
+ if (target_hostname) {
+ s->target_hostname = talloc_strdup(c, target_hostname);
+ if (composite_nomem(s->target_hostname, c)) return c;
+ }
+ s->port = port;
+ s->conn = conn;
+ s->resolve_ctx = resolve_ctx;
+ if (localaddr) {
+ s->localaddr = socket_address_from_strings(s, "ip", localaddr, 0);
+ /* if there is no localaddr, we pass NULL for
+ s->localaddr, which is handled by the socket libraries as
+ meaning no local binding address specified */
+ }
+
+ make_nbt_name_server(&s->name, s->server);
+ resolve_req = resolve_name_send(resolve_ctx, s, &s->name, c->event_ctx);
+ composite_continue(c, resolve_req, continue_ip_resolve_name, c);
+ return c;
+}
+
+/*
+ Receive result of pipe open request on tcp/ip
+*/
+NTSTATUS dcerpc_pipe_open_tcp_recv(struct composite_context *c,
+ TALLOC_CTX *mem_ctx,
+ char **localaddr,
+ char **remoteaddr)
+{
+ NTSTATUS status;
+ status = composite_wait(c);
+
+ if (NT_STATUS_IS_OK(status)) {
+ struct pipe_tcp_state *s = talloc_get_type_abort(
+ c->private_data, struct pipe_tcp_state);
+
+ if (localaddr != NULL) {
+ *localaddr = talloc_move(mem_ctx, &s->local_address);
+ }
+ if (remoteaddr != NULL) {
+ *remoteaddr = talloc_move(mem_ctx, &s->remote_address);
+ }
+ }
+
+ talloc_free(c);
+ return status;
+}
+
+
+struct pipe_unix_state {
+ const char *path;
+ struct socket_address *srvaddr;
+ struct dcecli_connection *conn;
+};
+
+
+/*
+ Stage 2 of dcerpc_pipe_open_unix_stream_send: receive result of pipe open
+ request on unix socket.
+*/
+static void continue_unix_open_socket(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type_abort(
+ ctx->async.private_data, struct composite_context);
+
+ c->status = dcerpc_pipe_open_socket_recv(ctx, NULL, NULL);
+ if (NT_STATUS_IS_OK(c->status)) {
+ composite_done(c);
+ return;
+ }
+
+ composite_error(c, c->status);
+}
+
+
+/*
+ Send pipe open request on unix socket
+*/
+struct composite_context *dcerpc_pipe_open_unix_stream_send(struct dcecli_connection *conn,
+ const char *path)
+{
+ struct composite_context *c;
+ struct composite_context *sock_unix_req;
+ struct pipe_unix_state *s;
+
+ /* composite context allocation and setup */
+ c = composite_create(conn, conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_unix_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store parameters in state structure */
+ s->path = talloc_strdup(c, path);
+ if (composite_nomem(s->path, c)) return c;
+ s->conn = conn;
+
+ /* prepare server address using socket path and transport name */
+ s->srvaddr = socket_address_from_strings(conn, "unix", s->path, 0);
+ if (composite_nomem(s->srvaddr, c)) return c;
+
+ /* send socket open request */
+ sock_unix_req = dcerpc_pipe_open_socket_send(c, s->conn, NULL,
+ s->srvaddr, NULL,
+ s->path,
+ NCALRPC);
+ composite_continue(c, sock_unix_req, continue_unix_open_socket, c);
+ return c;
+}
+
+
+/*
+ Receive result of pipe open request on unix socket
+*/
+NTSTATUS dcerpc_pipe_open_unix_stream_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+/*
+ Stage 2 of dcerpc_pipe_open_pipe_send: receive socket open request
+*/
+static void continue_np_open_socket(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type_abort(
+ ctx->async.private_data, struct composite_context);
+
+ c->status = dcerpc_pipe_open_socket_recv(ctx, NULL, NULL);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ Send pipe open request on ncalrpc
+*/
+struct composite_context* dcerpc_pipe_open_pipe_send(struct dcecli_connection *conn,
+ const char *ncalrpc_dir,
+ const char *identifier)
+{
+ char *canon = NULL;
+
+ struct composite_context *c;
+ struct composite_context *sock_np_req;
+ struct pipe_unix_state *s;
+
+ /* composite context allocation and setup */
+ c = composite_create(conn, conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_unix_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store parameters in state structure */
+ canon = talloc_strdup(s, identifier);
+ if (composite_nomem(canon, c)) return c;
+ s->conn = conn;
+
+ string_replace(canon, '/', '\\');
+ s->path = talloc_asprintf(canon, "%s/%s", ncalrpc_dir, canon);
+ if (composite_nomem(s->path, c)) return c;
+
+ /* prepare server address using path and transport name */
+ s->srvaddr = socket_address_from_strings(conn, "unix", s->path, 0);
+ if (composite_nomem(s->srvaddr, c)) return c;
+
+ /* send socket open request */
+ sock_np_req = dcerpc_pipe_open_socket_send(c, s->conn, NULL, s->srvaddr, NULL, s->path, NCALRPC);
+ composite_continue(c, sock_np_req, continue_np_open_socket, c);
+ return c;
+}
+
+
+/*
+ Receive result of pipe open request on ncalrpc
+*/
+NTSTATUS dcerpc_pipe_open_pipe_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+/*
+ Open a rpc pipe on a named pipe - sync version
+*/
+NTSTATUS dcerpc_pipe_open_pipe(struct dcecli_connection *conn, const char *ncalrpc_dir, const char *identifier)
+{
+ struct composite_context *c = dcerpc_pipe_open_pipe_send(conn, ncalrpc_dir, identifier);
+ return dcerpc_pipe_open_pipe_recv(c);
+}
diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c
new file mode 100644
index 0000000..0ebc52a
--- /dev/null
+++ b/source4/librpc/rpc/dcerpc_util.c
@@ -0,0 +1,811 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ dcerpc utility functions
+
+ Copyright (C) Andrew Tridgell 2003
+ Copyright (C) Jelmer Vernooij 2004
+ Copyright (C) Andrew Bartlett <abartlet@samba.org> 2005
+ Copyright (C) Rafal Szczesniak 2006
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "lib/events/events.h"
+#include "libcli/composite/composite.h"
+#include "librpc/gen_ndr/ndr_epmapper_c.h"
+#include "librpc/gen_ndr/ndr_dcerpc.h"
+#include "librpc/gen_ndr/ndr_misc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "auth/credentials/credentials.h"
+#include "auth/gensec/gensec.h"
+#include "param/param.h"
+#include "librpc/rpc/rpc_common.h"
+
+/*
+ find a dcerpc call on an interface by name
+*/
+const struct ndr_interface_call *dcerpc_iface_find_call(const struct ndr_interface_table *iface,
+ const char *name)
+{
+ uint32_t i;
+ for (i=0;i<iface->num_calls;i++) {
+ if (strcmp(iface->calls[i].name, name) == 0) {
+ return &iface->calls[i];
+ }
+ }
+ return NULL;
+}
+
+struct epm_map_binding_state {
+ struct dcerpc_binding *binding;
+ const struct ndr_interface_table *table;
+ struct dcerpc_pipe *pipe;
+ struct policy_handle handle;
+ struct GUID object;
+ struct epm_twr_t twr;
+ struct epm_twr_t *twr_r;
+ uint32_t num_towers;
+ struct epm_Map r;
+};
+
+
+static void continue_epm_recv_binding(struct composite_context *ctx);
+static void continue_epm_map(struct tevent_req *subreq);
+
+
+/*
+ Stage 2 of epm_map_binding: Receive connected rpc pipe and send endpoint
+ mapping rpc request
+*/
+static void continue_epm_recv_binding(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct epm_map_binding_state *s = talloc_get_type(c->private_data,
+ struct epm_map_binding_state);
+ struct tevent_req *subreq;
+
+ /* receive result of rpc pipe connect request */
+ c->status = dcerpc_pipe_connect_b_recv(ctx, c, &s->pipe);
+ if (!composite_is_ok(c)) return;
+
+ c->status = dcerpc_binding_build_tower(s->pipe, s->binding, &s->twr.tower);
+ if (!composite_is_ok(c)) return;
+
+ /* with some nice pretty paper around it of course */
+ s->r.in.object = &s->object;
+ s->r.in.map_tower = &s->twr;
+ s->r.in.entry_handle = &s->handle;
+ s->r.in.max_towers = 1;
+ s->r.out.entry_handle = &s->handle;
+ s->r.out.num_towers = &s->num_towers;
+
+ /* send request for an endpoint mapping - a rpc request on connected pipe */
+ subreq = dcerpc_epm_Map_r_send(s, c->event_ctx,
+ s->pipe->binding_handle,
+ &s->r);
+ if (composite_nomem(subreq, c)) return;
+
+ tevent_req_set_callback(subreq, continue_epm_map, c);
+}
+
+
+/*
+ Stage 3 of epm_map_binding: Receive endpoint mapping and provide binding details
+*/
+static void continue_epm_map(struct tevent_req *subreq)
+{
+ struct composite_context *c = tevent_req_callback_data(subreq,
+ struct composite_context);
+ struct epm_map_binding_state *s = talloc_get_type(c->private_data,
+ struct epm_map_binding_state);
+ const char *endpoint;
+
+ /* receive result of a rpc request */
+ c->status = dcerpc_epm_Map_r_recv(subreq, s);
+ TALLOC_FREE(subreq);
+ if (!composite_is_ok(c)) return;
+
+ /* check the details */
+ if (s->r.out.result != 0 || *s->r.out.num_towers != 1) {
+ composite_error(c, NT_STATUS_PORT_UNREACHABLE);
+ return;
+ }
+
+ s->twr_r = s->r.out.towers[0].twr;
+ if (s->twr_r == NULL) {
+ composite_error(c, NT_STATUS_PORT_UNREACHABLE);
+ return;
+ }
+
+ if (s->twr_r->tower.num_floors != s->twr.tower.num_floors ||
+ s->twr_r->tower.floors[3].lhs.protocol != s->twr.tower.floors[3].lhs.protocol) {
+ composite_error(c, NT_STATUS_PORT_UNREACHABLE);
+ return;
+ }
+
+ /* get received endpoint */
+ endpoint = dcerpc_floor_get_rhs_data(s, &s->twr_r->tower.floors[3]);
+ if (composite_nomem(endpoint, c)) return;
+
+ c->status = dcerpc_binding_set_string_option(s->binding,
+ "endpoint",
+ endpoint);
+ if (!composite_is_ok(c)) {
+ return;
+ }
+
+ composite_done(c);
+}
+
+
+/*
+ Request for endpoint mapping of dcerpc binding - try to request for endpoint
+ unless there is default one.
+*/
+struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *creds,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct epm_map_binding_state *s;
+ struct composite_context *pipe_connect_req;
+ NTSTATUS status;
+ struct dcerpc_binding *epmapper_binding;
+ uint32_t i;
+
+ if (ev == NULL) {
+ return NULL;
+ }
+
+ /* composite context allocation and setup */
+ c = composite_create(mem_ctx, ev);
+ if (c == NULL) {
+ return NULL;
+ }
+
+ s = talloc_zero(c, struct epm_map_binding_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ s->binding = binding;
+ s->object = dcerpc_binding_get_object(binding);
+ s->table = table;
+
+ c->status = dcerpc_binding_set_abstract_syntax(binding,
+ &table->syntax_id);
+ if (!composite_is_ok(c)) {
+ return c;
+ }
+
+ /*
+ First, check if there is a default endpoint specified in the IDL
+ */
+ for (i = 0; i < table->endpoints->count; i++) {
+ struct dcerpc_binding *default_binding;
+ enum dcerpc_transport_t transport;
+ enum dcerpc_transport_t dtransport;
+ const char *dendpoint = NULL;
+
+ status = dcerpc_parse_binding(s,
+ table->endpoints->names[i],
+ &default_binding);
+ if (!NT_STATUS_IS_OK(status)) {
+ continue;
+ }
+
+ transport = dcerpc_binding_get_transport(binding);
+ dtransport = dcerpc_binding_get_transport(default_binding);
+ if (transport == NCA_UNKNOWN) {
+ c->status = dcerpc_binding_set_transport(binding,
+ dtransport);
+ if (!composite_is_ok(c)) {
+ return c;
+ }
+ transport = dtransport;
+ }
+
+ if (transport != dtransport) {
+ TALLOC_FREE(default_binding);
+ continue;
+ }
+
+ dendpoint = dcerpc_binding_get_string_option(default_binding,
+ "endpoint");
+ if (dendpoint == NULL) {
+ TALLOC_FREE(default_binding);
+ continue;
+ }
+
+ c->status = dcerpc_binding_set_string_option(binding,
+ "endpoint",
+ dendpoint);
+ if (!composite_is_ok(c)) {
+ return c;
+ }
+
+ TALLOC_FREE(default_binding);
+ composite_done(c);
+ return c;
+ }
+
+ epmapper_binding = dcerpc_binding_dup(s, binding);
+ if (composite_nomem(epmapper_binding, c)) return c;
+
+ /* basic endpoint mapping data */
+ c->status = dcerpc_binding_set_string_option(epmapper_binding,
+ "endpoint", NULL);
+ if (!composite_is_ok(c)) {
+ return c;
+ }
+ c->status = dcerpc_binding_set_flags(epmapper_binding, 0, UINT32_MAX);
+ if (!composite_is_ok(c)) {
+ return c;
+ }
+ c->status = dcerpc_binding_set_assoc_group_id(epmapper_binding, 0);
+ if (!composite_is_ok(c)) {
+ return c;
+ }
+ c->status = dcerpc_binding_set_object(epmapper_binding, GUID_zero());
+ if (!composite_is_ok(c)) {
+ return c;
+ }
+
+ /* initiate rpc pipe connection */
+ pipe_connect_req = dcerpc_pipe_connect_b_send(s, epmapper_binding,
+ &ndr_table_epmapper,
+ creds, c->event_ctx,
+ lp_ctx);
+ if (composite_nomem(pipe_connect_req, c)) return c;
+
+ composite_continue(c, pipe_connect_req, continue_epm_recv_binding, c);
+ return c;
+}
+
+
+/*
+ Receive result of endpoint mapping request
+ */
+NTSTATUS dcerpc_epm_map_binding_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+/*
+ Get endpoint mapping for rpc connection
+*/
+_PUBLIC_ NTSTATUS dcerpc_epm_map_binding(TALLOC_CTX *mem_ctx, struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table, struct tevent_context *ev,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct cli_credentials *epm_creds;
+
+ epm_creds = cli_credentials_init_anon(mem_ctx);
+ if (epm_creds == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ c = dcerpc_epm_map_binding_send(mem_ctx, binding, table, epm_creds, ev, lp_ctx);
+ if (c == NULL) {
+ talloc_free(epm_creds);
+ return NT_STATUS_NO_MEMORY;
+ }
+ talloc_steal(c, epm_creds);
+ return dcerpc_epm_map_binding_recv(c);
+}
+
+
+struct pipe_auth_state {
+ struct dcerpc_pipe *pipe;
+ const struct dcerpc_binding *binding;
+ const struct ndr_interface_table *table;
+ struct loadparm_context *lp_ctx;
+ struct cli_credentials *credentials;
+ unsigned int logon_retries;
+};
+
+
+static void continue_auth_schannel(struct composite_context *ctx);
+static void continue_auth(struct composite_context *ctx);
+static void continue_auth_none(struct composite_context *ctx);
+static void continue_ntlmssp_connection(struct composite_context *ctx);
+static void continue_spnego_after_wrong_pass(struct composite_context *ctx);
+
+
+/*
+ Stage 2 of pipe_auth: Receive result of schannel bind request
+*/
+static void continue_auth_schannel(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ c->status = dcerpc_bind_auth_schannel_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ Stage 2 of pipe_auth: Receive result of authenticated bind request
+*/
+static void continue_auth(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ c->status = dcerpc_bind_auth_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+/*
+ Stage 2 of pipe_auth: Receive result of authenticated bind request, but handle fallbacks:
+ SPNEGO -> NTLMSSP
+*/
+static void continue_auth_auto(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_auth_state *s = talloc_get_type(c->private_data, struct pipe_auth_state);
+ struct composite_context *sec_conn_req;
+
+ c->status = dcerpc_bind_auth_recv(ctx);
+ if (NT_STATUS_EQUAL(c->status, NT_STATUS_INVALID_PARAMETER)) {
+ /*
+ * Retry with NTLMSSP auth as fallback
+ * send a request for secondary rpc connection
+ */
+ sec_conn_req = dcerpc_secondary_connection_send(s->pipe,
+ s->binding);
+ composite_continue(c, sec_conn_req, continue_ntlmssp_connection, c);
+ return;
+ } else if (NT_STATUS_EQUAL(c->status, NT_STATUS_LOGON_FAILURE) ||
+ NT_STATUS_EQUAL(c->status, NT_STATUS_UNSUCCESSFUL)) {
+ /*
+ try a second time on any error. We don't just do it
+ on LOGON_FAILURE as some servers will give a
+ NT_STATUS_UNSUCCESSFUL on a authentication error on RPC
+ */
+ const char *principal;
+ const char *endpoint;
+
+ principal = gensec_get_target_principal(s->pipe->conn->security_state.generic_state);
+ if (principal == NULL) {
+ const char *hostname = gensec_get_target_hostname(s->pipe->conn->security_state.generic_state);
+ const char *service = gensec_get_target_service(s->pipe->conn->security_state.generic_state);
+ if (hostname != NULL && service != NULL) {
+ principal = talloc_asprintf(c, "%s/%s", service, hostname);
+ }
+ }
+
+ endpoint = dcerpc_binding_get_string_option(s->binding, "endpoint");
+
+ if ((cli_credentials_failed_kerberos_login(s->credentials, principal, &s->logon_retries) ||
+ cli_credentials_wrong_password(s->credentials)) &&
+ endpoint != NULL) {
+ /*
+ * Retry SPNEGO with a better password
+ * send a request for secondary rpc connection
+ */
+ sec_conn_req = dcerpc_secondary_connection_send(s->pipe,
+ s->binding);
+ composite_continue(c, sec_conn_req, continue_spnego_after_wrong_pass, c);
+ return;
+ }
+ }
+
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+/*
+ Stage 3 of pipe_auth (fallback to NTLMSSP case): Receive secondary
+ rpc connection (the first one can't be used any more, due to the
+ bind nak) and perform authenticated bind request
+*/
+static void continue_ntlmssp_connection(struct composite_context *ctx)
+{
+ struct composite_context *c;
+ struct pipe_auth_state *s;
+ struct composite_context *auth_req;
+ struct dcerpc_pipe *p2;
+ void *pp;
+
+ c = talloc_get_type(ctx->async.private_data, struct composite_context);
+ s = talloc_get_type(c->private_data, struct pipe_auth_state);
+
+ /* receive secondary rpc connection */
+ c->status = dcerpc_secondary_connection_recv(ctx, &p2);
+ if (!composite_is_ok(c)) return;
+
+
+ /* this is a rather strange situation. When
+ we come into the routine, s is a child of s->pipe, and
+ when we created p2 above, it also became a child of
+ s->pipe.
+
+ Now we want p2 to be a parent of s->pipe, and we want s to
+ be a parent of both of them! If we don't do this very
+ carefully we end up creating a talloc loop
+ */
+
+ /* we need the new contexts to hang off the same context
+ that s->pipe is on, but the only way to get that is
+ via talloc_parent() */
+ pp = talloc_parent(s->pipe);
+
+ /* promote s to be at the top */
+ talloc_steal(pp, s);
+
+ /* and put p2 under s */
+ talloc_steal(s, p2);
+
+ /* now put s->pipe under p2 */
+ talloc_steal(p2, s->pipe);
+
+ s->pipe = p2;
+
+ /* initiate a authenticated bind */
+ auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
+ s->credentials,
+ lpcfg_gensec_settings(c, s->lp_ctx),
+ DCERPC_AUTH_TYPE_NTLMSSP,
+ dcerpc_auth_level(s->pipe->conn),
+ s->table->authservices->names[0]);
+ composite_continue(c, auth_req, continue_auth, c);
+}
+
+/*
+ Stage 3 of pipe_auth (retry on wrong password): Receive secondary
+ rpc connection (the first one can't be used any more, due to the
+ bind nak) and perform authenticated bind request
+*/
+static void continue_spnego_after_wrong_pass(struct composite_context *ctx)
+{
+ struct composite_context *c;
+ struct pipe_auth_state *s;
+ struct composite_context *auth_req;
+ struct dcerpc_pipe *p2;
+
+ c = talloc_get_type(ctx->async.private_data, struct composite_context);
+ s = talloc_get_type(c->private_data, struct pipe_auth_state);
+
+ /* receive secondary rpc connection */
+ c->status = dcerpc_secondary_connection_recv(ctx, &p2);
+ if (!composite_is_ok(c)) return;
+
+ talloc_steal(s, p2);
+ talloc_steal(p2, s->pipe);
+ s->pipe = p2;
+
+ /* initiate a authenticated bind */
+ auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
+ s->credentials,
+ lpcfg_gensec_settings(c, s->lp_ctx),
+ DCERPC_AUTH_TYPE_SPNEGO,
+ dcerpc_auth_level(s->pipe->conn),
+ s->table->authservices->names[0]);
+ composite_continue(c, auth_req, continue_auth, c);
+}
+
+
+/*
+ Stage 2 of pipe_auth: Receive result of non-authenticated bind request
+*/
+static void continue_auth_none(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+
+ c->status = dcerpc_bind_auth_none_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ composite_done(c);
+}
+
+
+/*
+ Request to perform an authenticated bind if required. Authentication
+ is determined using credentials passed and binding flags.
+*/
+struct composite_context *dcerpc_pipe_auth_send(struct dcerpc_pipe *p,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+ struct pipe_auth_state *s;
+ struct composite_context *auth_schannel_req;
+ struct composite_context *auth_req;
+ struct composite_context *auth_none_req;
+ struct dcecli_connection *conn;
+ uint8_t auth_type;
+
+ /* composite context allocation and setup */
+ c = composite_create(p, p->conn->event_ctx);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_auth_state);
+ if (composite_nomem(s, c)) return c;
+ c->private_data = s;
+
+ /* store parameters in state structure */
+ s->binding = binding;
+ s->table = table;
+ s->credentials = credentials;
+ s->pipe = p;
+ s->lp_ctx = lp_ctx;
+
+ conn = s->pipe->conn;
+ conn->flags = dcerpc_binding_get_flags(binding);
+
+ if (DEBUGLVL(100)) {
+ conn->flags |= DCERPC_DEBUG_PRINT_BOTH;
+ }
+
+ if (conn->transport.transport == NCALRPC) {
+ const char *v = dcerpc_binding_get_string_option(binding,
+ "auth_type");
+
+ if (v != NULL && strcmp(v, "ncalrpc_as_system") == 0) {
+ auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
+ s->credentials,
+ lpcfg_gensec_settings(c, s->lp_ctx),
+ DCERPC_AUTH_TYPE_NCALRPC_AS_SYSTEM,
+ DCERPC_AUTH_LEVEL_CONNECT,
+ s->table->authservices->names[0]);
+ composite_continue(c, auth_req, continue_auth, c);
+ return c;
+ }
+ }
+
+ if (cli_credentials_is_anonymous(s->credentials)) {
+ auth_none_req = dcerpc_bind_auth_none_send(c, s->pipe, s->table);
+ composite_continue(c, auth_none_req, continue_auth_none, c);
+ return c;
+ }
+
+ if ((conn->flags & DCERPC_SCHANNEL) &&
+ !cli_credentials_get_netlogon_creds(s->credentials)) {
+ /* If we don't already have netlogon credentials for
+ * the schannel bind, then we have to get these
+ * first */
+ auth_schannel_req = dcerpc_bind_auth_schannel_send(c, s->pipe, s->table,
+ s->credentials, s->lp_ctx,
+ dcerpc_auth_level(conn));
+ composite_continue(c, auth_schannel_req, continue_auth_schannel, c);
+ return c;
+ }
+
+ /*
+ * we rely on the already authenticated CIFS connection
+ * if not doing sign or seal
+ */
+ if (conn->transport.transport == NCACN_NP &&
+ !(conn->flags & (DCERPC_PACKET|DCERPC_SIGN|DCERPC_SEAL))) {
+ auth_none_req = dcerpc_bind_auth_none_send(c, s->pipe, s->table);
+ composite_continue(c, auth_none_req, continue_auth_none, c);
+ return c;
+ }
+
+
+ /* Perform an authenticated DCE-RPC bind
+ */
+ if (!(conn->flags & (DCERPC_CONNECT|DCERPC_SEAL|DCERPC_PACKET))) {
+ /*
+ we are doing an authenticated connection,
+ which needs to use [connect], [sign] or [seal].
+ If nothing is specified, we default to [sign] now.
+ This give roughly the same protection as
+ ncacn_np with smb signing.
+ */
+ conn->flags |= DCERPC_SIGN;
+ }
+
+ if (conn->flags & DCERPC_AUTH_SPNEGO) {
+ auth_type = DCERPC_AUTH_TYPE_SPNEGO;
+
+ } else if (conn->flags & DCERPC_AUTH_KRB5) {
+ auth_type = DCERPC_AUTH_TYPE_KRB5;
+
+ } else if (conn->flags & DCERPC_SCHANNEL) {
+ auth_type = DCERPC_AUTH_TYPE_SCHANNEL;
+
+ } else if (conn->flags & DCERPC_AUTH_NTLM) {
+ auth_type = DCERPC_AUTH_TYPE_NTLMSSP;
+
+ } else {
+ /* try SPNEGO with fallback to NTLMSSP */
+ auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
+ s->credentials,
+ lpcfg_gensec_settings(c, s->lp_ctx),
+ DCERPC_AUTH_TYPE_SPNEGO,
+ dcerpc_auth_level(conn),
+ s->table->authservices->names[0]);
+ composite_continue(c, auth_req, continue_auth_auto, c);
+ return c;
+ }
+
+ auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
+ s->credentials,
+ lpcfg_gensec_settings(c, s->lp_ctx),
+ auth_type,
+ dcerpc_auth_level(conn),
+ s->table->authservices->names[0]);
+ composite_continue(c, auth_req, continue_auth, c);
+ return c;
+}
+
+
+/*
+ Receive result of authenticated bind request on dcerpc pipe
+
+ This returns *p, which may be different to the one originally
+ supplied, as it rebinds to a new pipe due to authentication fallback
+
+*/
+NTSTATUS dcerpc_pipe_auth_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p)
+{
+ NTSTATUS status;
+
+ struct pipe_auth_state *s = talloc_get_type(c->private_data,
+ struct pipe_auth_state);
+ status = composite_wait(c);
+ if (!NT_STATUS_IS_OK(status)) {
+ char *uuid_str = GUID_string(s->pipe, &s->table->syntax_id.uuid);
+ DEBUG(0, ("Failed to bind to uuid %s for %s %s\n", uuid_str,
+ dcerpc_binding_string(uuid_str, s->binding), nt_errstr(status)));
+ talloc_free(uuid_str);
+ } else {
+ talloc_steal(mem_ctx, s->pipe);
+ *p = s->pipe;
+ }
+
+ talloc_free(c);
+ return status;
+}
+
+
+/*
+ Perform an authenticated bind if needed - sync version
+
+ This may change *p, as it rebinds to a new pipe due to authentication fallback
+*/
+_PUBLIC_ NTSTATUS dcerpc_pipe_auth(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe **p,
+ const struct dcerpc_binding *binding,
+ const struct ndr_interface_table *table,
+ struct cli_credentials *credentials,
+ struct loadparm_context *lp_ctx)
+{
+ struct composite_context *c;
+
+ c = dcerpc_pipe_auth_send(*p, binding, table, credentials, lp_ctx);
+ return dcerpc_pipe_auth_recv(c, mem_ctx, p);
+}
+
+
+NTSTATUS dcecli_generic_session_key(struct dcecli_connection *c,
+ DATA_BLOB *session_key)
+{
+ if (c != NULL) {
+ if (c->transport.transport != NCALRPC &&
+ c->transport.transport != NCACN_UNIX_STREAM)
+ {
+ return NT_STATUS_LOCAL_USER_SESSION_KEY;
+ }
+ }
+
+ return dcerpc_generic_session_key(session_key);
+}
+
+/*
+ fetch the user session key - may be default (above) or the SMB session key
+
+ The key is always truncated to 16 bytes
+*/
+_PUBLIC_ NTSTATUS dcerpc_fetch_session_key(struct dcerpc_pipe *p,
+ DATA_BLOB *session_key)
+{
+ NTSTATUS status;
+ status = p->conn->security_state.session_key(p->conn, session_key);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ session_key->length = MIN(session_key->length, 16);
+
+ return NT_STATUS_OK;
+}
+
+_PUBLIC_ bool dcerpc_transport_encrypted(struct dcerpc_pipe *p)
+{
+ if (p == NULL) {
+ return false;
+ }
+
+ if (p->conn == NULL) {
+ return false;
+ }
+
+ return p->conn->transport.encrypted;
+}
+
+/*
+ create a secondary context from a primary connection
+
+ this uses dcerpc_alter_context() to create a new dcerpc context_id
+*/
+_PUBLIC_ NTSTATUS dcerpc_secondary_context(struct dcerpc_pipe *p,
+ struct dcerpc_pipe **pp2,
+ const struct ndr_interface_table *table)
+{
+ NTSTATUS status;
+ struct dcerpc_pipe *p2;
+ struct GUID *object = NULL;
+
+ p2 = talloc_zero(p, struct dcerpc_pipe);
+ if (p2 == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ p2->conn = talloc_reference(p2, p->conn);
+ p2->request_timeout = p->request_timeout;
+
+ p2->context_id = ++p->conn->next_context_id;
+
+ p2->syntax = table->syntax_id;
+
+ p2->transfer_syntax = p->transfer_syntax;
+
+ p2->binding = dcerpc_binding_dup(p2, p->binding);
+ if (p2->binding == NULL) {
+ talloc_free(p2);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ p2->object = dcerpc_binding_get_object(p2->binding);
+ if (!GUID_all_zero(&p2->object)) {
+ object = &p2->object;
+ }
+
+ p2->binding_handle = dcerpc_pipe_binding_handle(p2, object, table);
+ if (p2->binding_handle == NULL) {
+ talloc_free(p2);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ status = dcerpc_alter_context(p2, p2, &p2->syntax, &p2->transfer_syntax);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(p2);
+ return status;
+ }
+
+ *pp2 = p2;
+
+ return NT_STATUS_OK;
+}
diff --git a/source4/librpc/rpc/pyrpc.c b/source4/librpc/rpc/pyrpc.c
new file mode 100644
index 0000000..3f1a867
--- /dev/null
+++ b/source4/librpc/rpc/pyrpc.c
@@ -0,0 +1,651 @@
+/*
+ Unix SMB/CIFS implementation.
+ Samba utility functions
+ Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "lib/replace/system/python.h"
+#include "python/py3compat.h"
+#include "includes.h"
+#include "python/modules.h"
+#include <structmember.h>
+#include "librpc/rpc/pyrpc.h"
+#include "lib/events/events.h"
+#include "param/pyparam.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/pyrpc_util.h"
+#include "auth/credentials/pycredentials.h"
+#include "auth/gensec/gensec.h"
+
+void initbase(void);
+
+static PyTypeObject dcerpc_InterfaceType;
+
+static PyTypeObject *BaseObject_Type;
+
+static PyTypeObject *ndr_syntax_id_Type;
+
+static bool PyString_AsGUID(PyObject *object, struct GUID *uuid)
+{
+ NTSTATUS status;
+ status = GUID_from_string(PyUnicode_AsUTF8(object), uuid);
+ if (NT_STATUS_IS_ERR(status)) {
+ PyErr_SetNTSTATUS(status);
+ return false;
+ }
+ return true;
+}
+
+static bool ndr_syntax_from_py_object(PyObject *object, struct ndr_syntax_id *syntax_id)
+{
+ ZERO_STRUCTP(syntax_id);
+
+ if (PyUnicode_Check(object)) {
+ return PyString_AsGUID(object, &syntax_id->uuid);
+ }
+
+ if (PyTuple_Check(object)) {
+ PyObject *item = NULL;
+ if (PyTuple_Size(object) < 1 || PyTuple_Size(object) > 2) {
+ PyErr_SetString(PyExc_ValueError, "Syntax ID tuple has invalid size");
+ return false;
+ }
+
+ item = PyTuple_GetItem(object, 0);
+ if (!PyUnicode_Check(item)) {
+ PyErr_SetString(PyExc_ValueError, "Expected GUID as first element in tuple");
+ return false;
+ }
+
+ if (!PyString_AsGUID(item, &syntax_id->uuid)) {
+ return false;
+ }
+
+ item = PyTuple_GetItem(object, 1);
+ if (!PyLong_Check(item)) {
+ PyErr_SetString(PyExc_ValueError, "Expected version as second element in tuple");
+ return false;
+ }
+
+ syntax_id->if_version = PyLong_AsLong(item);
+ return true;
+ }
+
+ PyErr_SetString(PyExc_TypeError, "Expected UUID or syntax id tuple");
+ return false;
+}
+
+static PyObject *py_iface_server_name(PyObject *obj, void *closure)
+{
+ const char *server_name;
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
+
+ server_name = dcerpc_server_name(iface->pipe);
+ if (server_name == NULL)
+ Py_RETURN_NONE;
+
+ return PyUnicode_FromString(server_name);
+}
+
+static PyObject *py_ndr_syntax_id(struct ndr_syntax_id *syntax_id)
+{
+ PyObject *ret;
+ struct GUID_txt_buf buf;
+
+ ret = Py_BuildValue(
+ "(s,i)",
+ GUID_buf_string(&syntax_id->uuid, &buf),
+ syntax_id->if_version);
+
+ return ret;
+}
+
+static PyObject *py_iface_abstract_syntax(PyObject *obj, void *closure)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
+
+ return py_ndr_syntax_id(&iface->pipe->syntax);
+}
+
+static PyObject *py_iface_transfer_syntax(PyObject *obj, void *closure)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
+
+ return py_ndr_syntax_id(&iface->pipe->transfer_syntax);
+}
+
+static PyObject *py_iface_session_key(PyObject *obj, void *closure)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
+ DATA_BLOB session_key;
+
+ NTSTATUS status = dcerpc_fetch_session_key(iface->pipe, &session_key);
+ PyErr_NTSTATUS_IS_ERR_RAISE(status);
+
+ return PyBytes_FromStringAndSize((const char *)session_key.data, session_key.length);
+}
+
+static PyObject *py_iface_user_session_key(PyObject *obj, void *closure)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
+ TALLOC_CTX *mem_ctx;
+ NTSTATUS status;
+ struct gensec_security *security = NULL;
+ DATA_BLOB session_key = data_blob_null;
+ static PyObject *session_key_obj = NULL;
+
+ if (iface->pipe == NULL) {
+ PyErr_SetNTSTATUS(NT_STATUS_NO_USER_SESSION_KEY);
+ return NULL;
+ }
+
+ if (iface->pipe->conn == NULL) {
+ PyErr_SetNTSTATUS(NT_STATUS_NO_USER_SESSION_KEY);
+ return NULL;
+ }
+
+ if (iface->pipe->conn->security_state.generic_state == NULL) {
+ PyErr_SetNTSTATUS(NT_STATUS_NO_USER_SESSION_KEY);
+ return NULL;
+ }
+
+ security = iface->pipe->conn->security_state.generic_state;
+
+ mem_ctx = talloc_new(NULL);
+
+ status = gensec_session_key(security, mem_ctx, &session_key);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(mem_ctx);
+ PyErr_SetNTSTATUS(status);
+ return NULL;
+ }
+
+ session_key_obj = PyBytes_FromStringAndSize((const char *)session_key.data,
+ session_key.length);
+ talloc_free(mem_ctx);
+ return session_key_obj;
+}
+
+static PyObject *py_iface_get_timeout(PyObject *obj, void *closure)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
+ uint32_t timeout;
+
+ timeout = dcerpc_binding_handle_set_timeout(iface->binding_handle, 0);
+ dcerpc_binding_handle_set_timeout(iface->binding_handle, timeout);
+
+ return PyLong_FromUnsignedLong(timeout);
+}
+
+static int py_iface_set_timeout(PyObject *obj, PyObject *value, void *closure)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
+ uint32_t timeout;
+
+ timeout = PyLong_AsUnsignedLong(value);
+ if (PyErr_Occurred() != NULL) {
+ return -1;
+ }
+
+ dcerpc_binding_handle_set_timeout(iface->binding_handle, timeout);
+ return 0;
+}
+
+static PyGetSetDef dcerpc_interface_getsetters[] = {
+ {
+ .name = discard_const_p(char, "server_name"),
+ .get = py_iface_server_name,
+ .doc = discard_const_p(char, "name of the server, if connected over SMB"),
+ },
+ {
+ .name = discard_const_p(char, "abstract_syntax"),
+ .get = py_iface_abstract_syntax,
+ .doc = discard_const_p(char, "syntax id of the abstract syntax"),
+ },
+ {
+ .name = discard_const_p(char, "transfer_syntax"),
+ .get = py_iface_transfer_syntax,
+ .doc = discard_const_p(char, "syntax id of the transfer syntax"),
+ },
+ {
+ .name = discard_const_p(char, "session_key"),
+ .get = py_iface_session_key,
+ .doc = discard_const_p(char, "session key (as used for blob encryption on LSA and SAMR)"),
+ },
+ {
+ .name = discard_const_p(char, "user_session_key"),
+ .get = py_iface_user_session_key,
+ .doc = discard_const_p(char, "user_session key (as used for blob encryption on DRSUAPI)"),
+ },
+ {
+ .name = discard_const_p(char, "request_timeout"),
+ .get = py_iface_get_timeout,
+ .set = py_iface_set_timeout,
+ .doc = discard_const_p(char, "request timeout, in seconds"),
+ },
+ { .name = NULL }
+};
+
+static PyObject *py_iface_request(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)self;
+ int opnum;
+ DATA_BLOB data_in, data_out;
+ NTSTATUS status;
+ char *in_data;
+ Py_ssize_t in_length;
+ PyObject *ret;
+ PyObject *object = NULL;
+ struct GUID object_guid;
+ TALLOC_CTX *mem_ctx = talloc_new(NULL);
+ uint32_t out_flags = 0;
+ const char *kwnames[] = { "opnum", "data", "object", NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "is#|O:request",
+ discard_const_p(char *, kwnames), &opnum, &in_data, &in_length, &object)) {
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ data_in.data = (uint8_t *)talloc_memdup(mem_ctx, in_data, in_length);
+ data_in.length = in_length;
+
+ ZERO_STRUCT(data_out);
+
+ if (object != NULL && !PyString_AsGUID(object, &object_guid)) {
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ status = dcerpc_binding_handle_raw_call(iface->binding_handle,
+ object?&object_guid:NULL,
+ opnum,
+ 0, /* in_flags */
+ data_in.data,
+ data_in.length,
+ mem_ctx,
+ &data_out.data,
+ &data_out.length,
+ &out_flags);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetDCERPCStatus(iface->pipe, status);
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ ret = PyBytes_FromStringAndSize((char *)data_out.data, data_out.length);
+
+ talloc_free(mem_ctx);
+ return ret;
+}
+
+static PyObject *py_iface_transport_encrypted(PyObject *self)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)self;
+
+ if (dcerpc_transport_encrypted(iface->pipe)) {
+ Py_RETURN_TRUE;
+ }
+
+ Py_RETURN_FALSE;
+}
+
+static PyMethodDef dcerpc_interface_methods[] = {
+ { "request", PY_DISCARD_FUNC_SIG(PyCFunction, py_iface_request),
+ METH_VARARGS|METH_KEYWORDS,
+ "S.request(opnum, data, object=None) -> data\n"
+ "Make a raw request" },
+ { "transport_encrypted", PY_DISCARD_FUNC_SIG(PyCFunction, py_iface_transport_encrypted),
+ METH_NOARGS,
+ "Check if the DCE transport is encrypted" },
+ { NULL, NULL, 0, NULL },
+};
+
+static void dcerpc_interface_dealloc(PyObject* self)
+{
+ dcerpc_InterfaceObject *interface = (dcerpc_InterfaceObject *)self;
+
+ struct tevent_context *ev_save = talloc_reparent(
+ interface->mem_ctx, NULL, interface->ev);
+ SMB_ASSERT(ev_save != NULL);
+
+ interface->binding_handle = NULL;
+ interface->pipe = NULL;
+
+ /*
+ * Free everything *except* the event context, which must go
+ * away last
+ */
+ TALLOC_FREE(interface->mem_ctx);
+
+ /*
+ * Now wish a fond goodbye to the event context itself
+ */
+ talloc_unlink(NULL, ev_save);
+ self->ob_type->tp_free(self);
+}
+
+static PyObject *dcerpc_interface_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *ret;
+ const char *binding_string = NULL;
+ PyObject *py_lp_ctx = Py_None;
+ PyObject *py_credentials = Py_None;
+ PyObject *syntax = Py_None;
+ PyObject *py_basis = Py_None;
+ const char *kwnames[] = {
+ "binding", "syntax", "lp_ctx", "credentials", "basis_connection", NULL
+ };
+ static struct ndr_interface_table dummy_table;
+ static struct ndr_interface_string_array dummy_endpoints;
+ PyObject *args2 = Py_None;
+ PyObject *kwargs2 = Py_None;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sO|OOO:connect", discard_const_p(char *, kwnames), &binding_string, &syntax, &py_lp_ctx, &py_credentials, &py_basis)) {
+ return NULL;
+ }
+
+ if (strncmp(binding_string, "irpc:", 5) == 0) {
+ PyErr_SetString(PyExc_ValueError, "irpc: transport not supported");
+ return NULL;
+ }
+
+ /*
+ * Fill a dummy interface table struct. TODO: In the future, we should
+ * rather just allow connecting without requiring an interface table.
+ *
+ * We just fill the syntax during the connect, but keep the memory valid
+ * the whole time.
+ */
+ if (!ndr_syntax_from_py_object(syntax, &dummy_table.syntax_id)) {
+ return NULL;
+ }
+
+ /*
+ * Initialise the endpoints list in dummy_table if required
+ */
+ if (dummy_table.endpoints == NULL) {
+ dummy_table.endpoints = &dummy_endpoints;
+ }
+
+ args2 = Py_BuildValue("(s)", binding_string);
+ if (args2 == NULL) {
+ return NULL;
+ }
+
+ kwargs2 = Py_BuildValue("{s:O,s:O,s:O}",
+ "lp_ctx", py_lp_ctx,
+ "credentials", py_credentials,
+ "basis_connection", py_basis);
+ if (kwargs2 == NULL) {
+ Py_DECREF(args2);
+ return NULL;
+ }
+
+ ret = py_dcerpc_interface_init_helper(type, args2, kwargs2, &dummy_table);
+ ZERO_STRUCT(dummy_table.syntax_id);
+ Py_DECREF(args2);
+ Py_DECREF(kwargs2);
+ return ret;
+}
+
+static PyTypeObject dcerpc_InterfaceType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "dcerpc.ClientConnection",
+ .tp_basicsize = sizeof(dcerpc_InterfaceObject),
+ .tp_dealloc = dcerpc_interface_dealloc,
+ .tp_getset = dcerpc_interface_getsetters,
+ .tp_methods = dcerpc_interface_methods,
+ .tp_doc = "ClientConnection(binding, syntax, lp_ctx=None, credentials=None) -> connection\n"
+"\n"
+"binding should be a DCE/RPC binding string (for example: ncacn_ip_tcp:127.0.0.1)\n"
+"syntax should be a tuple with a GUID and version number of an interface\n"
+"lp_ctx should be a path to a smb.conf file or a param.LoadParm object\n"
+"credentials should be a credentials.Credentials object.\n\n",
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = dcerpc_interface_new,
+};
+
+static PyObject *py_transfer_syntax_ndr_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_transfer_syntax_ndr);
+}
+
+static PyTypeObject py_transfer_syntax_ndr_SyntaxType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "base.transfer_syntax_ndr",
+ .tp_doc = "transfer_syntax_ndr()\n",
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = py_transfer_syntax_ndr_new,
+};
+
+static PyObject *py_transfer_syntax_ndr64_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_transfer_syntax_ndr64);
+}
+
+static PyTypeObject py_transfer_syntax_ndr64_SyntaxType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "base.transfer_syntax_ndr64",
+ .tp_doc = "transfer_syntax_ndr64()\n",
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = py_transfer_syntax_ndr64_new,
+};
+
+static PyObject *py_bind_time_features_syntax_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ const char *kwnames[] = {
+ "features", NULL
+ };
+ unsigned long long features = 0;
+ struct ndr_syntax_id syntax;
+ PyObject *args2 = Py_None;
+ PyObject *kwargs2 = Py_None;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "K:features", discard_const_p(char *, kwnames), &features)) {
+ return NULL;
+ }
+
+ args2 = Py_BuildValue("()");
+ if (args2 == NULL) {
+ return NULL;
+ }
+
+ kwargs2 = Py_BuildValue("{}");
+ if (kwargs2 == NULL) {
+ Py_DECREF(args2);
+ return NULL;
+ }
+
+ syntax = dcerpc_construct_bind_time_features(features);
+
+ return py_dcerpc_syntax_init_helper(type, args2, kwargs2, &syntax);
+}
+
+static PyTypeObject py_bind_time_features_syntax_SyntaxType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "base.bind_time_features_syntax",
+ .tp_doc = "bind_time_features_syntax(features)\n",
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = py_bind_time_features_syntax_new,
+};
+
+struct py_dcerpc_ndr_pointer {
+ PyObject *value;
+};
+
+static void py_dcerpc_ndr_pointer_dealloc(PyObject* self)
+{
+ struct py_dcerpc_ndr_pointer *obj =
+ pytalloc_get_type(self, struct py_dcerpc_ndr_pointer);
+
+ Py_CLEAR(obj->value);
+
+ self->ob_type->tp_free(self);
+}
+
+static PyObject *py_dcerpc_ndr_pointer_get_value(PyObject *self, void *closure)
+{
+ struct py_dcerpc_ndr_pointer *obj =
+ pytalloc_get_type(self, struct py_dcerpc_ndr_pointer);
+
+ Py_INCREF(obj->value);
+ return obj->value;
+}
+
+static int py_dcerpc_ndr_pointer_set_value(PyObject *self, PyObject *value, void *closure)
+{
+ struct py_dcerpc_ndr_pointer *obj =
+ pytalloc_get_type(self, struct py_dcerpc_ndr_pointer);
+
+ Py_CLEAR(obj->value);
+ obj->value = value;
+ Py_INCREF(obj->value);
+ return 0;
+}
+
+static PyGetSetDef py_dcerpc_ndr_pointer_getsetters[] = {
+ {
+ .name = discard_const_p(char, "value"),
+ .get = py_dcerpc_ndr_pointer_get_value,
+ .set = py_dcerpc_ndr_pointer_set_value,
+ .doc = discard_const_p(char, "the value store by the pointer"),
+ },
+ {
+ .name = NULL,
+ },
+};
+
+static PyObject *py_dcerpc_ndr_pointer_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *ret = NULL;
+ struct py_dcerpc_ndr_pointer *obj = NULL;
+ const char *kwnames[] = { "value", NULL };
+ PyObject *value = NULL;
+ bool ok;
+
+ ok = PyArg_ParseTupleAndKeywords(args, kwargs, "O:value",
+ discard_const_p(char *, kwnames),
+ &value);
+ if (!ok) {
+ return NULL;
+ }
+
+ ret = pytalloc_new(struct py_dcerpc_ndr_pointer, type);
+ if (ret == NULL) {
+ return NULL;
+ }
+
+ obj = pytalloc_get_type(ret, struct py_dcerpc_ndr_pointer);
+ *obj = (struct py_dcerpc_ndr_pointer) {
+ .value = value,
+ };
+
+ Py_INCREF(obj->value);
+ return ret;
+}
+
+static PyTypeObject py_dcerpc_ndr_pointer_type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "base.ndr_pointer",
+ .tp_dealloc = py_dcerpc_ndr_pointer_dealloc,
+ .tp_getset = py_dcerpc_ndr_pointer_getsetters,
+ .tp_doc = "ndr_pointer(value)\n",
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_new = py_dcerpc_ndr_pointer_new,
+};
+
+static struct PyModuleDef moduledef = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "base",
+ .m_doc = "DCE/RPC protocol implementation",
+ .m_size = -1,
+};
+
+MODULE_INIT_FUNC(base)
+{
+ PyObject *m;
+ PyObject *dep_talloc;
+ PyObject *dep_samba_dcerpc_misc;
+
+ dep_talloc = PyImport_ImportModule("talloc");
+ if (dep_talloc == NULL)
+ return NULL;
+
+ BaseObject_Type = (PyTypeObject *)PyObject_GetAttrString(dep_talloc, "BaseObject");
+ if (BaseObject_Type == NULL) {
+ Py_CLEAR(dep_talloc);
+ return NULL;
+ }
+
+ Py_CLEAR(dep_talloc);
+ dep_samba_dcerpc_misc = PyImport_ImportModule("samba.dcerpc.misc");
+ if (dep_samba_dcerpc_misc == NULL) {
+ return NULL;
+ }
+
+ ndr_syntax_id_Type = (PyTypeObject *)PyObject_GetAttrString(dep_samba_dcerpc_misc, "ndr_syntax_id");
+ Py_CLEAR(dep_samba_dcerpc_misc);
+ if (ndr_syntax_id_Type == NULL) {
+ return NULL;
+ }
+
+ py_transfer_syntax_ndr_SyntaxType.tp_base = ndr_syntax_id_Type;
+ py_transfer_syntax_ndr_SyntaxType.tp_basicsize = pytalloc_BaseObject_size();
+ py_transfer_syntax_ndr64_SyntaxType.tp_base = ndr_syntax_id_Type;
+ py_transfer_syntax_ndr64_SyntaxType.tp_basicsize = pytalloc_BaseObject_size();
+ py_bind_time_features_syntax_SyntaxType.tp_base = ndr_syntax_id_Type;
+ py_bind_time_features_syntax_SyntaxType.tp_basicsize = pytalloc_BaseObject_size();
+
+ py_dcerpc_ndr_pointer_type.tp_base = BaseObject_Type;
+ py_dcerpc_ndr_pointer_type.tp_basicsize = pytalloc_BaseObject_size();
+
+ if (PyType_Ready(&dcerpc_InterfaceType) < 0) {
+ return NULL;
+ }
+
+ if (PyType_Ready(&py_transfer_syntax_ndr_SyntaxType) < 0) {
+ return NULL;
+ }
+ if (PyType_Ready(&py_transfer_syntax_ndr64_SyntaxType) < 0) {
+ return NULL;
+ }
+ if (PyType_Ready(&py_bind_time_features_syntax_SyntaxType) < 0) {
+ return NULL;
+ }
+
+ if (PyType_Ready(&py_dcerpc_ndr_pointer_type) < 0) {
+ return NULL;
+ }
+
+ m = PyModule_Create(&moduledef);
+ if (m == NULL) {
+ return NULL;
+ }
+
+ Py_INCREF((PyObject *)&dcerpc_InterfaceType);
+ PyModule_AddObject(m, "ClientConnection", (PyObject *)&dcerpc_InterfaceType);
+
+ Py_INCREF((PyObject *)(void *)&py_transfer_syntax_ndr_SyntaxType);
+ PyModule_AddObject(m, "transfer_syntax_ndr", (PyObject *)(void *)&py_transfer_syntax_ndr_SyntaxType);
+ Py_INCREF((PyObject *)(void *)&py_transfer_syntax_ndr64_SyntaxType);
+ PyModule_AddObject(m, "transfer_syntax_ndr64", (PyObject *)(void *)&py_transfer_syntax_ndr64_SyntaxType);
+ Py_INCREF((PyObject *)(void *)&py_bind_time_features_syntax_SyntaxType);
+ PyModule_AddObject(m, "bind_time_features_syntax", (PyObject *)(void *)&py_bind_time_features_syntax_SyntaxType);
+ Py_INCREF((PyObject *)(void *)&py_dcerpc_ndr_pointer_type);
+ PyModule_AddObject(m, "ndr_pointer", (PyObject *)(void *)&py_dcerpc_ndr_pointer_type);
+ return m;
+}
diff --git a/source4/librpc/rpc/pyrpc.h b/source4/librpc/rpc/pyrpc.h
new file mode 100644
index 0000000..390e01a
--- /dev/null
+++ b/source4/librpc/rpc/pyrpc.h
@@ -0,0 +1,60 @@
+/*
+ Unix SMB/CIFS implementation.
+ Samba utility functions
+ Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _PYRPC_H_
+#define _PYRPC_H_
+
+#include "libcli/util/pyerrors.h"
+
+#define PY_CHECK_TYPE(type, var, fail) \
+ if (var == NULL) { \
+ PyErr_Format(PyExc_TypeError, \
+ __location__ \
+ ": Expected type '%s' for '%s', got NULL", \
+ (type)->tp_name, #var); \
+ fail; \
+ } else if (!PyObject_TypeCheck(var, type)) { \
+ PyErr_Format(PyExc_TypeError, \
+ __location__ \
+ ": Expected type '%s' for '%s' of type '%s'", \
+ (type)->tp_name, #var, Py_TYPE(var)->tp_name); \
+ fail; \
+ }
+
+#define dom_sid0_Type dom_sid_Type
+#define dom_sid2_Type dom_sid_Type
+#define dom_sid28_Type dom_sid_Type
+#define dom_sid0_Check dom_sid_Check
+#define dom_sid2_Check dom_sid_Check
+#define dom_sid28_Check dom_sid_Check
+
+typedef struct {
+ PyObject_HEAD
+ TALLOC_CTX *mem_ctx;
+ struct dcerpc_pipe *pipe;
+ struct dcerpc_binding_handle *binding_handle;
+ struct tevent_context *ev;
+} dcerpc_InterfaceObject;
+
+
+#ifndef NDR_DCERPC_REQUEST_OBJECT_PRESENT
+#define NDR_DCERPC_REQUEST_OBJECT_PRESENT true
+#endif /* NDR_DCERPC_REQUEST_OBJECT_PRESENT */
+
+#endif /* _PYRPC_H_ */
diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c
new file mode 100644
index 0000000..43c29af
--- /dev/null
+++ b/source4/librpc/rpc/pyrpc_util.c
@@ -0,0 +1,555 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Python interface to DCE/RPC library - utility functions.
+
+ Copyright (C) 2010 Jelmer Vernooij <jelmer@samba.org>
+ Copyright (C) 2010 Andrew Tridgell <tridge@samba.org>
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "lib/replace/system/python.h"
+#include "python/py3compat.h"
+#include "includes.h"
+#include "python/modules.h"
+#include "librpc/rpc/pyrpc_util.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/pyrpc.h"
+#include "param/pyparam.h"
+#include "auth/credentials/pycredentials.h"
+#include "lib/events/events.h"
+#include "lib/messaging/messaging.h"
+#include "lib/messaging/irpc.h"
+
+bool py_check_dcerpc_type(PyObject *obj, const char *module, const char *type_name)
+{
+ PyObject *mod;
+ PyTypeObject *type;
+ bool ret;
+
+ mod = PyImport_ImportModule(module);
+
+ if (mod == NULL) {
+ PyErr_Format(PyExc_RuntimeError, "Unable to import %s to check type %s",
+ module, type_name);
+ return false;
+ }
+
+ type = (PyTypeObject *)PyObject_GetAttrString(mod, type_name);
+ Py_DECREF(mod);
+ if (type == NULL) {
+ PyErr_Format(PyExc_RuntimeError, "Unable to find type %s in module %s",
+ module, type_name);
+ return false;
+ }
+
+ ret = PyObject_TypeCheck(obj, type);
+ Py_DECREF(type);
+
+ if (!ret)
+ PyErr_Format(PyExc_TypeError, "Expected type %s.%s, got %s",
+ module, type_name, Py_TYPE(obj)->tp_name);
+
+ return ret;
+}
+
+/*
+ connect to a IRPC pipe from python
+ */
+static NTSTATUS pyrpc_irpc_connect(TALLOC_CTX *mem_ctx, const char *irpc_server,
+ const struct ndr_interface_table *table,
+ struct tevent_context *event_ctx,
+ struct loadparm_context *lp_ctx,
+ struct dcerpc_binding_handle **binding_handle)
+{
+ struct imessaging_context *msg;
+
+ msg = imessaging_client_init(mem_ctx, lp_ctx, event_ctx);
+ NT_STATUS_HAVE_NO_MEMORY(msg);
+
+ *binding_handle = irpc_binding_handle_by_name(mem_ctx, msg, irpc_server, table);
+ if (*binding_handle == NULL) {
+ talloc_free(msg);
+ return NT_STATUS_INVALID_PIPE_STATE;
+ }
+
+ /*
+ * Note: this allows nested event loops to happen,
+ * but as there's no top level event loop it's not that critical.
+ */
+ dcerpc_binding_handle_set_sync_ev(*binding_handle, event_ctx);
+
+ return NT_STATUS_OK;
+}
+
+PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs,
+ const struct ndr_interface_table *table)
+{
+ dcerpc_InterfaceObject *ret;
+ const char *binding_string;
+ PyObject *py_lp_ctx = Py_None, *py_credentials = Py_None, *py_basis = Py_None;
+ NTSTATUS status;
+ unsigned int timeout = (unsigned int)-1;
+ const char *kwnames[] = {
+ "binding", "lp_ctx", "credentials", "timeout", "basis_connection", NULL
+ };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|OOIO:samr", discard_const_p(char *, kwnames), &binding_string, &py_lp_ctx, &py_credentials, &timeout, &py_basis)) {
+ return NULL;
+ }
+
+ status = dcerpc_init();
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ return NULL;
+ }
+
+ ret = PyObject_New(dcerpc_InterfaceObject, type);
+ if (ret == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ ret->pipe = NULL;
+ ret->binding_handle = NULL;
+ ret->ev = NULL;
+ ret->mem_ctx = talloc_new(NULL);
+ if (ret->mem_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ if (strncmp(binding_string, "irpc:", 5) == 0) {
+ struct loadparm_context *lp_ctx;
+
+ ret->ev = s4_event_context_init(ret->mem_ctx);
+ if (ret->ev == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "Unable to initialise event context");
+ Py_DECREF(ret);
+ return NULL;
+ }
+
+ lp_ctx = lpcfg_from_py_object(ret->ev, py_lp_ctx);
+ if (lp_ctx == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
+ Py_DECREF(ret);
+ return NULL;
+ }
+
+ status = pyrpc_irpc_connect(ret->mem_ctx, binding_string+5, table,
+ ret->ev, lp_ctx, &ret->binding_handle);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ Py_DECREF(ret);
+ return NULL;
+ }
+ } else if (py_basis != Py_None) {
+ struct dcerpc_pipe *base_pipe;
+ PyObject *py_base;
+ PyTypeObject *ClientConnection_Type;
+
+ py_base = PyImport_ImportModule("samba.dcerpc.base");
+ if (py_base == NULL) {
+ Py_DECREF(ret);
+ return NULL;
+ }
+
+ ClientConnection_Type = (PyTypeObject *)PyObject_GetAttrString(py_base, "ClientConnection");
+ if (ClientConnection_Type == NULL) {
+ PyErr_SetNone(PyExc_TypeError);
+ Py_DECREF(ret);
+ Py_DECREF(py_base);
+ return NULL;
+ }
+
+ if (!PyObject_TypeCheck(py_basis, ClientConnection_Type)) {
+ PyErr_SetString(PyExc_TypeError, "basis_connection must be a DCE/RPC connection");
+ Py_DECREF(ret);
+ Py_DECREF(py_base);
+ Py_DECREF(ClientConnection_Type);
+ return NULL;
+ }
+
+ base_pipe = talloc_reference(ret->mem_ctx,
+ ((dcerpc_InterfaceObject *)py_basis)->pipe);
+ if (base_pipe == NULL) {
+ PyErr_NoMemory();
+ Py_DECREF(ret);
+ Py_DECREF(py_base);
+ Py_DECREF(ClientConnection_Type);
+ return NULL;
+ }
+
+ ret->ev = talloc_reference(
+ ret->mem_ctx,
+ ((dcerpc_InterfaceObject *)py_basis)->ev);
+ if (ret->ev == NULL) {
+ PyErr_NoMemory();
+ Py_DECREF(ret);
+ Py_DECREF(py_base);
+ Py_DECREF(ClientConnection_Type);
+ return NULL;
+ }
+
+ status = dcerpc_secondary_context(base_pipe, &ret->pipe, table);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ Py_DECREF(ret);
+ Py_DECREF(py_base);
+ Py_DECREF(ClientConnection_Type);
+ return NULL;
+ }
+
+ ret->pipe = talloc_steal(ret->mem_ctx, ret->pipe);
+ Py_XDECREF(ClientConnection_Type);
+ Py_XDECREF(py_base);
+ } else {
+ struct loadparm_context *lp_ctx;
+ struct cli_credentials *credentials;
+
+ ret->ev = s4_event_context_init(ret->mem_ctx);
+ if (ret->ev == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
+ Py_DECREF(ret);
+ return NULL;
+ }
+
+ lp_ctx = lpcfg_from_py_object(ret->ev, py_lp_ctx);
+ if (lp_ctx == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
+ Py_DECREF(ret);
+ return NULL;
+ }
+
+ credentials = cli_credentials_from_py_object(py_credentials);
+ if (credentials == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Expected credentials");
+ Py_DECREF(ret);
+ return NULL;
+ }
+ status = dcerpc_pipe_connect(ret->mem_ctx, &ret->pipe, binding_string,
+ table, credentials, ret->ev, lp_ctx);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ Py_DECREF(ret);
+ return NULL;
+ }
+ }
+
+ if (ret->pipe) {
+ ret->pipe->conn->flags |= DCERPC_NDR_REF_ALLOC;
+ ret->binding_handle = ret->pipe->binding_handle;
+ }
+
+ /* reset timeout for the handle */
+ if ((timeout != ((unsigned int)-1)) && (ret->binding_handle != NULL)) {
+ dcerpc_binding_handle_set_timeout(ret->binding_handle, timeout);
+ }
+
+ return (PyObject *)ret;
+}
+
+static PyObject *py_dcerpc_run_function(dcerpc_InterfaceObject *iface,
+ const struct PyNdrRpcMethodDef *md,
+ PyObject *args, PyObject *kwargs)
+{
+ TALLOC_CTX *mem_ctx;
+ NTSTATUS status;
+ void *r;
+ PyObject *result = Py_None;
+
+ if (md->pack_in_data == NULL || md->unpack_out_data == NULL) {
+ PyErr_SetString(PyExc_NotImplementedError, "No marshalling code available yet");
+ return NULL;
+ }
+
+ mem_ctx = talloc_new(NULL);
+ if (mem_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ r = talloc_zero_size(mem_ctx, md->table->calls[md->opnum].struct_size);
+ if (r == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ if (!md->pack_in_data(args, kwargs, r)) {
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ status = md->call(iface->binding_handle, mem_ctx, r);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetDCERPCStatus(iface->pipe, status);
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ result = md->unpack_out_data(r);
+
+ talloc_free(mem_ctx);
+ return result;
+}
+
+static PyObject *py_dcerpc_call_wrapper(PyObject *self, PyObject *args, void *wrapped, PyObject *kwargs)
+{
+ dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)self;
+ const struct PyNdrRpcMethodDef *md = (const struct PyNdrRpcMethodDef *)wrapped;
+
+ return py_dcerpc_run_function(iface, md, args, kwargs);
+}
+
+bool PyInterface_AddNdrRpcMethods(PyTypeObject *ifacetype, const struct PyNdrRpcMethodDef *mds)
+{
+ int i;
+ for (i = 0; mds[i].name; i++) {
+ PyObject *ret;
+ struct wrapperbase *wb = (struct wrapperbase *)calloc(sizeof(struct wrapperbase), 1);
+
+ if (wb == NULL) {
+ return false;
+ }
+ wb->name = discard_const_p(char, mds[i].name);
+ wb->flags = PyWrapperFlag_KEYWORDS;
+ wb->wrapper = PY_DISCARD_FUNC_SIG(wrapperfunc,
+ py_dcerpc_call_wrapper);
+ wb->doc = discard_const_p(char, mds[i].doc);
+
+ ret = PyDescr_NewWrapper(ifacetype, wb, discard_const_p(void, &mds[i]));
+
+ PyDict_SetItemString(ifacetype->tp_dict, mds[i].name,
+ (PyObject *)ret);
+ Py_CLEAR(ret);
+ }
+
+ return true;
+}
+
+PyObject *py_dcerpc_syntax_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs,
+ const struct ndr_syntax_id *syntax)
+{
+ PyObject *ret;
+ struct ndr_syntax_id *obj;
+ const char *kwnames[] = { NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":abstract_syntax", discard_const_p(char *, kwnames))) {
+ return NULL;
+ }
+
+ ret = pytalloc_new(struct ndr_syntax_id, type);
+ if (ret == NULL) {
+ return NULL;
+ }
+
+ obj = pytalloc_get_type(ret, struct ndr_syntax_id);
+ *obj = *syntax;
+
+ return ret;
+}
+
+void PyErr_SetDCERPCStatus(struct dcerpc_pipe *p, NTSTATUS status)
+{
+ if (p && NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
+ status = dcerpc_fault_to_nt_status(p->last_fault_code);
+ }
+ PyErr_SetNTSTATUS(status);
+}
+
+
+/*
+ take a NDR structure that has a type in a python module and return
+ it as a python object
+
+ r is the NDR structure pointer (a C structure)
+
+ r_ctx is the context that is a parent of r. It will be referenced by
+ the resulting python object
+
+ This MUST only be used by objects that are based on pytalloc_Object
+ otherwise the pytalloc_reference_ex() will fail.
+ */
+PyObject *py_return_ndr_struct(const char *module_name, const char *type_name,
+ TALLOC_CTX *r_ctx, void *r)
+{
+ PyTypeObject *py_type;
+ PyObject *module;
+ PyObject *result = NULL;
+
+ if (r == NULL) {
+ Py_RETURN_NONE;
+ }
+
+ module = PyImport_ImportModule(module_name);
+ if (module == NULL) {
+ return NULL;
+ }
+
+ py_type = (PyTypeObject *)PyObject_GetAttrString(module, type_name);
+ if (py_type == NULL) {
+ Py_DECREF(module);
+ return NULL;
+ }
+
+ result = pytalloc_reference_ex(py_type, r_ctx, r);
+ Py_CLEAR(module);
+ Py_CLEAR(py_type);
+ return result;
+}
+
+PyObject *PyString_FromStringOrNULL(const char *str)
+{
+ if (str == NULL) {
+ Py_RETURN_NONE;
+ }
+ return PyUnicode_FromString(str);
+}
+
+PyObject *PyBytes_FromUtf16StringOrNULL(const unsigned char *str)
+{
+ size_t len;
+
+ if (str == NULL) {
+ Py_RETURN_NONE;
+ }
+
+ len = utf16_len(str);
+ return PyBytes_FromStringAndSize((const char *)str, len);
+}
+
+unsigned char *PyUtf16String_FromBytes(TALLOC_CTX *mem_ctx, PyObject *value)
+{
+ char *bytes = NULL;
+ Py_ssize_t len = 0;
+ unsigned char *utf16_string = NULL;
+ int ret;
+
+ ret = PyBytes_AsStringAndSize(value, &bytes, &len);
+ if (ret) {
+ return NULL;
+ }
+
+ if (len < 0) {
+ PyErr_SetString(PyExc_ValueError, "bytes length is negative");
+ return NULL;
+ }
+ if (len & 1) {
+ PyErr_SetString(PyExc_ValueError, "bytes length is odd");
+ return NULL;
+ }
+
+ /* Ensure that the bytes object contains no embedded null terminator. */
+ if ((size_t)len != utf16_len_n(bytes, len)) {
+ PyErr_SetString(PyExc_ValueError,
+ "value contains an embedded null terminator");
+ return NULL;
+ }
+
+ utf16_string = talloc_utf16_strlendup(mem_ctx, bytes, len);
+ if (utf16_string == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ return utf16_string;
+}
+
+PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+ const void *in, const char *typename)
+{
+ PyObject *mem_ctx_obj = NULL;
+ PyObject *in_obj = NULL;
+ PyObject *ret = NULL;
+
+ mem_ctx_obj = pytalloc_GenericObject_reference(mem_ctx);
+ if (mem_ctx_obj == NULL) {
+ return NULL;
+ }
+
+ in_obj = pytalloc_GenericObject_reference_ex(mem_ctx, discard_const(in));
+ if (in_obj == NULL) {
+ Py_XDECREF(mem_ctx_obj);
+ return NULL;
+ }
+
+ ret = PyObject_CallMethod((PyObject *)type,
+ discard_const_p(char, "__import__"),
+ discard_const_p(char, "OiO"),
+ mem_ctx_obj, level, in_obj);
+ Py_XDECREF(mem_ctx_obj);
+ Py_XDECREF(in_obj);
+ if (ret == NULL) {
+ return NULL;
+ }
+
+ return ret;
+}
+
+void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+ PyObject *in, const char *typename)
+{
+ PyObject *mem_ctx_obj = NULL;
+ PyObject *ret_obj = NULL;
+ void *ret = NULL;
+
+ mem_ctx_obj = pytalloc_GenericObject_reference(mem_ctx);
+ if (mem_ctx_obj == NULL) {
+ return NULL;
+ }
+
+ ret_obj = PyObject_CallMethod((PyObject *)type,
+ discard_const_p(char, "__export__"),
+ discard_const_p(char, "OiO"),
+ mem_ctx_obj, level, in);
+ Py_XDECREF(mem_ctx_obj);
+ if (ret_obj == NULL) {
+ return NULL;
+ }
+
+ ret = _pytalloc_get_type(ret_obj, typename);
+ Py_XDECREF(ret_obj);
+ return ret;
+}
+
+PyObject *py_dcerpc_ndr_pointer_deref(PyTypeObject *type, PyObject *obj)
+{
+ if (!PyObject_TypeCheck(obj, type)) {
+ PyErr_Format(PyExc_TypeError,
+ "Expected type '%s' but got type '%s'",
+ (type)->tp_name, Py_TYPE(obj)->tp_name);
+ return NULL;
+ }
+
+ return PyObject_GetAttrString(obj, discard_const_p(char, "value"));
+}
+
+PyObject *py_dcerpc_ndr_pointer_wrap(PyTypeObject *type, PyObject *obj)
+{
+ PyObject *args = NULL;
+ PyObject *ret_obj = NULL;
+
+ args = PyTuple_New(1);
+ if (args == NULL) {
+ return NULL;
+ }
+ Py_XINCREF(obj);
+ PyTuple_SetItem(args, 0, obj);
+
+ ret_obj = PyObject_Call((PyObject *)type, args, NULL);
+ Py_XDECREF(args);
+ return ret_obj;
+}
diff --git a/source4/librpc/rpc/pyrpc_util.h b/source4/librpc/rpc/pyrpc_util.h
new file mode 100644
index 0000000..73157fc
--- /dev/null
+++ b/source4/librpc/rpc/pyrpc_util.h
@@ -0,0 +1,74 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Python interface to DCE/RPC library - utility functions.
+
+ Copyright (C) 2010 Jelmer Vernooij <jelmer@samba.org>
+ Copyright (C) 2010 Andrew Tridgell <tridge@samba.org>
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __PYRPC_UTIL_H__
+#define __PYRPC_UTIL_H__
+
+#include "librpc/rpc/pyrpc.h"
+
+#define PyErr_FromNdrError(err) Py_BuildValue("(is)", err, ndr_map_error2string(err))
+
+#define PyErr_SetNdrError(err) \
+ PyErr_SetObject(PyExc_RuntimeError, PyErr_FromNdrError(err))
+
+void PyErr_SetDCERPCStatus(struct dcerpc_pipe *p, NTSTATUS status);
+
+typedef NTSTATUS (*py_dcerpc_call_fn) (struct dcerpc_binding_handle *, TALLOC_CTX *, void *);
+typedef bool (*py_data_pack_fn) (PyObject *args, PyObject *kwargs, void *r);
+typedef PyObject *(*py_data_unpack_fn) (void *r);
+
+struct PyNdrRpcMethodDef {
+ const char *name;
+ const char *doc;
+ py_dcerpc_call_fn call;
+ py_data_pack_fn pack_in_data;
+ py_data_unpack_fn unpack_out_data;
+ uint32_t opnum;
+ const struct ndr_interface_table *table;
+};
+
+bool py_check_dcerpc_type(PyObject *obj, const char *module, const char *type_name);
+bool PyInterface_AddNdrRpcMethods(PyTypeObject *object, const struct PyNdrRpcMethodDef *mds);
+PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, const struct ndr_interface_table *table);
+
+struct ndr_syntax_id;
+PyObject *py_dcerpc_syntax_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs,
+ const struct ndr_syntax_id *syntax);
+
+PyObject *py_return_ndr_struct(const char *module_name, const char *type_name,
+ TALLOC_CTX *r_ctx, void *r);
+
+PyObject *PyString_FromStringOrNULL(const char *str);
+
+PyObject *PyBytes_FromUtf16StringOrNULL(const unsigned char *str);
+
+unsigned char *PyUtf16String_FromBytes(TALLOC_CTX *mem_ctx, PyObject *value);
+
+PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+ const void *in, const char *typename);
+void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
+ PyObject *in, const char *typename);
+
+PyObject *py_dcerpc_ndr_pointer_deref(PyTypeObject *type, PyObject *obj);
+PyObject *py_dcerpc_ndr_pointer_wrap(PyTypeObject *type, PyObject *obj);
+
+#endif /* __PYRPC_UTIL_H__ */
diff --git a/source4/librpc/scripts/build_idl.sh b/source4/librpc/scripts/build_idl.sh
new file mode 100755
index 0000000..dde80f7
--- /dev/null
+++ b/source4/librpc/scripts/build_idl.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+FULLBUILD=$1
+OUTDIR=$2
+shift 2
+IDL_FILES="$*"
+
+[ -d $OUTDIR ] || mkdir -p $OUTDIR || exit 1
+
+PIDL="$PIDL --outputdir $OUTDIR --header --ndr-parser --server --client --python --dcom-proxy --com-header --includedir ../librpc/idl -- "
+
+if [ x$FULLBUILD = xFULL ]; then
+ echo Rebuilding all idl files in $IDLDIR
+ $PIDL $IDL_FILES || exit 1
+ exit 0
+fi
+
+list=""
+
+for f in $IDL_FILES; do
+ basename=$(basename $f .idl)
+ ndr="$OUTDIR/ndr_$basename.c"
+ # blergh - most shells don't have the -nt function
+ if [ -f $ndr ]; then
+ if [ x$(find $f -newer $ndr -print) = x$f ]; then
+ list="$list $f"
+ fi
+ else
+ list="$list $f"
+ fi
+done
+
+if [ "x$list" != x ]; then
+ $PIDL $list || exit 1
+fi
+
+exit 0
diff --git a/source4/librpc/tests/binding_string.c b/source4/librpc/tests/binding_string.c
new file mode 100644
index 0000000..3ef7b7d
--- /dev/null
+++ b/source4/librpc/tests/binding_string.c
@@ -0,0 +1,327 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ local testing of RPC binding string parsing
+
+ Copyright (C) Jelmer Vernooij 2004
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "librpc/gen_ndr/epmapper.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
+#include "torture/torture.h"
+#include "torture/local/proto.h"
+#include "lib/util/util_net.h"
+
+static bool test_BindingString(struct torture_context *tctx,
+ const void *test_data)
+{
+ const char *binding = test_data;
+ struct dcerpc_binding *b, *b2;
+ char *s, *s2, *p;
+ struct epm_tower tower;
+ TALLOC_CTX *mem_ctx = tctx;
+ const char *host;
+ struct GUID object;
+
+ /* Parse */
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(mem_ctx, binding, &b),
+ "Error parsing binding string");
+
+ object = dcerpc_binding_get_object(b);
+
+ s = dcerpc_binding_string(mem_ctx, b);
+ torture_assert(tctx, s != NULL, "Error converting binding back to string");
+
+ torture_assert_casestr_equal(tctx, binding, s,
+ "Mismatch while comparing original and regenerated binding strings");
+
+ /* Generate protocol towers */
+ torture_assert_ntstatus_ok(tctx, dcerpc_binding_build_tower(mem_ctx, b, &tower),
+ "Error generating protocol tower");
+
+ /* Convert back to binding and then back to string and compare */
+
+ torture_assert_ntstatus_ok(tctx, dcerpc_binding_from_tower(mem_ctx, &tower, &b2),
+ "Error generating binding from tower for original binding");
+
+ /* The tower doesn't contain the object */
+ torture_assert_ntstatus_ok(tctx, dcerpc_binding_set_object(b2, object),
+ "set object on tower binding");
+
+ s = dcerpc_binding_string(mem_ctx, b);
+ torture_assert(tctx, s != NULL, "Error converting binding back to string for (stripped down)");
+
+ /*
+ * Compare to a stripped down version of the binding string because
+ * the protocol tower doesn't contain the extra option data
+ *
+ * We remove all options except of the endpoint.
+ */
+ p = strchr(s, '[');
+ if (p != NULL) {
+ char *p2;
+
+ p2 = strchr(p + 1, ',');
+ if (p2 != NULL) {
+ /*
+ * We only look at the first option,
+ * which might be the endpoint.
+ */
+ p2[0] = ']';
+ p2[1] = '\0';
+ }
+
+ p2 = strchr(p + 1, '=');
+ if (p2 != NULL) {
+ /*
+ * It's not the endpoint, so remove the
+ * whole option section.
+ */
+ *p = '\0';
+ }
+ }
+
+ s2 = dcerpc_binding_string(mem_ctx, b2);
+ torture_assert(tctx, s != NULL, "Error converting binding back to string");
+
+ host = dcerpc_binding_get_string_option(b, "host");
+ if (host && is_ipaddress_v4(host)) {
+ torture_assert_casestr_equal(tctx, s, s2, "Mismatch while comparing original and from protocol tower generated binding strings");
+ }
+
+ return true;
+}
+
+static const char *test_strings[] = {
+ "ncacn_np:",
+ "ncalrpc:",
+ "ncalrpc:[,Security=Sane]",
+ "ncacn_np:[rpcecho]",
+ "ncacn_np:127.0.0.1[rpcecho]",
+ "ncacn_ip_tcp:127.0.0.1",
+ "ncacn_ip_tcp:127.0.0.1[20]",
+ "ncacn_ip_tcp:127.0.0.1[20,sign]",
+ "ncacn_ip_tcp:127.0.0.1[20,sign,Security=Foobar]",
+ "ncacn_http:127.0.0.1",
+ "ncacn_http:127.0.0.1[78]",
+ "ncacn_http:127.0.0.1[78,ProxyServer=myproxy:3128]",
+ "ncacn_np:localhost[rpcecho]",
+ "ncacn_np:[/pipe/rpcecho]",
+ "ncacn_np:localhost[/pipe/rpcecho,sign,seal]",
+ "ncacn_np:[,sign]",
+ "ncadg_ip_udp:",
+ "308FB580-1EB2-11CA-923B-08002B1075A7@ncacn_np:localhost",
+ "308FB580-1EB2-11CA-923B-08002B1075A7@ncacn_ip_tcp:127.0.0.1",
+ "ncacn_unix_stream:[/tmp/epmapper]",
+ "ncalrpc:[IDENTIFIER]",
+ "ncacn_unix_stream:[/tmp/epmapper,sign]",
+ "ncacn_ip_tcp:127.0.0.1[75,target_hostname=port75.example.com,target_principal=host/port75.example.com]",
+ "ncacn_ip_tcp:127.0.0.1[75,connect,target_hostname=port75.example.com,target_principal=host/port75.example.com,assoc_group_id=0x01234567]",
+ "ncacn_ip_tcp:127.0.0.1[75,packet,target_hostname=port75.example.com,target_principal=host/port75.example.com,assoc_group_id=0x01234567]",
+ "ncacn_ip_tcp:::",
+ "ncacn_ip_tcp:::[75]",
+ "ncacn_ip_tcp:FD00::5357:5F00",
+ "ncacn_ip_tcp:FD00::5357:5F00[75]",
+ "ncacn_ip_tcp:FD00::5357:5F00[,target_hostname=port75.example.com]",
+ "ncacn_ip_tcp:FD00::5357:5F00[75,target_hostname=port75.example.com]",
+ "ncacn_ip_tcp:fe80::5357:5F00%75",
+ "ncacn_ip_tcp:fe80::5357:5F00%75[75]",
+ "ncacn_ip_tcp:fe80::5357:5F00%75[,target_hostname=port75.example.com]",
+ "ncacn_ip_tcp:fe80::5357:5F00%75[75,target_hostname=port75.example.com]",
+};
+
+static bool test_parse_check_results(struct torture_context *tctx)
+{
+ struct dcerpc_binding *b;
+ struct GUID uuid;
+ struct GUID object;
+ struct ndr_syntax_id abstract;
+ enum dcerpc_transport_t transport;
+ const char *endpoint;
+ uint32_t flags;
+
+ torture_assert_ntstatus_ok(tctx,
+ GUID_from_string("308FB580-1EB2-11CA-923B-08002B1075A7", &uuid),
+ "parsing uuid");
+
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER", &b), "parse");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCACN_NP, "ncacn_np expected");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_ip_tcp:$SERVER", &b), "parse");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCACN_IP_TCP, "ncacn_ip_tcp expected");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[rpcecho]", &b), "parse");
+ endpoint = dcerpc_binding_get_string_option(b, "endpoint");
+ torture_assert_str_equal(tctx, endpoint, "rpcecho", "endpoint");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[/pipe/rpcecho]", &b), "parse");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[/pipe/rpcecho,sign,seal]", &b), "parse");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_SIGN+DCERPC_SEAL, "sign+seal flags");
+ endpoint = dcerpc_binding_get_string_option(b, "endpoint");
+ torture_assert_str_equal(tctx, endpoint, "/pipe/rpcecho", "endpoint");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[,sign]", &b), "parse");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_ip_tcp:$SERVER[,sign]", &b), "parse");
+ endpoint = dcerpc_binding_get_string_option(b, "endpoint");
+ torture_assert(tctx, endpoint == NULL, "endpoint");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_SIGN, "sign flag");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncalrpc:", &b), "parse");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCALRPC, "ncalrpc expected");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
+ "308FB580-1EB2-11CA-923B-08002B1075A7@ncacn_np:$SERVER", &b), "parse");
+ object = dcerpc_binding_get_object(b);
+ abstract = dcerpc_binding_get_abstract_syntax(b);
+ torture_assert(tctx, GUID_equal(&object, &uuid), "object uuid");
+ torture_assert(tctx, ndr_syntax_id_equal(&abstract, &ndr_syntax_id_null),
+ "null abstract syntax");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
+ "308FB580-1EB2-11CA-923B-08002B1075A7@ncacn_ip_tcp:$SERVER", &b), "parse");
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_ip_tcp:$SERVER[,sign,localaddress=192.168.1.1]", &b), "parse");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCACN_IP_TCP, "ncacn_ip_tcp expected");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_SIGN, "sign flag");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "localaddress"),
+ "192.168.1.1", "localaddress");
+ torture_assert_str_equal(tctx, "ncacn_ip_tcp:$SERVER[,sign,localaddress=192.168.1.1]",
+ dcerpc_binding_string(tctx, b), "back to string");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "host"),
+ "$SERVER", "host");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "target_hostname"),
+ "$SERVER", "target_hostname");
+
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
+ "ncacn_ip_tcp:$HOST[,target_hostname=$HOSTNAME,target_principal=$PRINCIPAL]",
+ &b), "parse");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "host"),
+ "$HOST", "host");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "target_hostname"),
+ "$HOSTNAME", "target_hostname");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "target_principal"),
+ "$PRINCIPAL", "target_principal");
+ torture_assert_str_equal(tctx,
+ dcerpc_binding_string(tctx, b),
+ "ncacn_ip_tcp:$HOST[,target_hostname=$HOSTNAME,target_principal=$PRINCIPAL]",
+ "back to string");
+
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
+ "ncacn_ip_tcp:$HOST[,connect,target_hostname=$HOSTNAME,target_principal=$PRINCIPAL,assoc_group_id=0x01234567]",
+ &b), "parse");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_CONNECT, "connect flag");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "host"),
+ "$HOST", "host");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "target_hostname"),
+ "$HOSTNAME", "target_hostname");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "target_principal"),
+ "$PRINCIPAL", "target_principal");
+ torture_assert_int_equal(tctx, dcerpc_binding_get_assoc_group_id(b), 0x01234567,
+ "assoc_group_id");
+ torture_assert_str_equal(tctx,
+ dcerpc_binding_string(tctx, b),
+ "ncacn_ip_tcp:$HOST[,connect,target_hostname=$HOSTNAME,target_principal=$PRINCIPAL,assoc_group_id=0x01234567]",
+ "back to string");
+
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
+ "ncacn_ip_tcp:$HOST[,packet,target_hostname=$HOSTNAME,target_principal=$PRINCIPAL,assoc_group_id=0x01234567]",
+ &b), "parse");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_PACKET, "packet flag");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "host"),
+ "$HOST", "host");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "target_hostname"),
+ "$HOSTNAME", "target_hostname");
+ torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "target_principal"),
+ "$PRINCIPAL", "target_principal");
+ torture_assert_int_equal(tctx, dcerpc_binding_get_assoc_group_id(b), 0x01234567,
+ "assoc_group_id");
+ torture_assert_str_equal(tctx,
+ dcerpc_binding_string(tctx, b),
+ "ncacn_ip_tcp:$HOST[,packet,target_hostname=$HOSTNAME,target_principal=$PRINCIPAL,assoc_group_id=0x01234567]",
+ "back to string");
+
+ return true;
+}
+
+static bool test_no_transport(struct torture_context *tctx, const void *test_data)
+{
+ const char *binding = test_data;
+ struct dcerpc_binding *b;
+ enum dcerpc_transport_t transport;
+ const char *s;
+
+ /* Parse */
+ torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, binding, &b),
+ "Error parsing binding string");
+
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCA_UNKNOWN, "invalid transport");
+
+ s = dcerpc_binding_string(tctx, b);
+ torture_assert(tctx, s != NULL, "Error converting binding back to string");
+
+ torture_assert_casestr_equal(tctx, binding, s,
+ "Mismatch while comparing original and regenerated binding strings");
+
+ return true;
+}
+
+static const char *test_no_strings[] = {
+ "port75.example.com",
+ "port75.example.com[75]",
+ "127.0.0.1",
+ "127.0.0.1[75]",
+ "127.0.0.1[,target_hostname=port75.example.com]",
+ "127.0.0.1[75,target_hostname=port75.example.com]",
+ "::",
+ "::[75]",
+ "::[,target_hostname=port75.example.com]",
+ "::[75,target_hostname=port75.example.com]",
+ "FD00::5357:5F00",
+ "FD00::5357:5F00[75]",
+ "FD00::5357:5F00[,target_hostname=port75.example.com]",
+ "FD00::5357:5F00[75,target_hostname=port75.example.com]",
+ "fe80::5357:5F00%75",
+ "fe80::5357:5F00%75[75]",
+ "fe80::5357:5F00%75[,target_hostname=port75.example.com]",
+ "fe80::5357:5F00%75[75,target_hostname=port75.example.com]",
+};
+
+struct torture_suite *torture_local_binding_string(TALLOC_CTX *mem_ctx)
+{
+ int i;
+ struct torture_suite *suite = torture_suite_create(mem_ctx, "binding");
+
+ for (i = 0; i < ARRAY_SIZE(test_strings); i++) {
+ torture_suite_add_simple_tcase_const(suite, test_strings[i],
+ test_BindingString,
+ test_strings[i]);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(test_no_strings); i++) {
+ torture_suite_add_simple_tcase_const(suite, test_no_strings[i],
+ test_no_transport,
+ test_no_strings[i]);
+ }
+
+ torture_suite_add_simple_test(suite, "parsing results",
+ test_parse_check_results);
+
+ return suite;
+}
diff --git a/source4/librpc/tests/claims_CLAIMS_SET_NDR.dat b/source4/librpc/tests/claims_CLAIMS_SET_NDR.dat
new file mode 100644
index 0000000..07627b8
--- /dev/null
+++ b/source4/librpc/tests/claims_CLAIMS_SET_NDR.dat
@@ -0,0 +1,23 @@
+[0000] 01 10 08 00 CC CC CC CC 48 01 00 00 00 00 00 00 ........ H.......
+[0010] 00 00 02 00 01 00 00 00 04 00 02 00 00 00 00 00 ........ ........
+[0020] 00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 ........ ........
+[0030] 03 00 00 00 08 00 02 00 03 00 00 00 0C 00 02 00 ........ ........
+[0040] 06 00 06 00 01 00 00 00 10 00 02 00 14 00 02 00 ........ ........
+[0050] 03 00 03 00 03 00 00 00 18 00 02 00 28 00 02 00 ........ ....(...
+[0060] 02 00 02 00 04 00 00 00 2C 00 02 00 0B 00 00 00 ........ ,.......
+[0070] 00 00 00 00 0B 00 00 00 37 00 32 00 30 00 66 00 ........ 7.2.0.f.
+[0080] 64 00 33 00 63 00 33 00 5F 00 39 00 00 00 00 00 d.3.c.3. _.9.....
+[0090] 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ........ ........
+[00A0] 0B 00 00 00 00 00 00 00 0B 00 00 00 37 00 32 00 ........ ....7.2.
+[00B0] 30 00 66 00 64 00 33 00 63 00 33 00 5F 00 37 00 0.f.d.3. c.3._.7.
+[00C0] 00 00 00 00 03 00 00 00 1C 00 02 00 20 00 02 00 ........ .... ...
+[00D0] 24 00 02 00 04 00 00 00 00 00 00 00 04 00 00 00 $....... ........
+[00E0] 66 00 6F 00 6F 00 00 00 04 00 00 00 00 00 00 00 f.o.o... ........
+[00F0] 04 00 00 00 62 00 61 00 72 00 00 00 04 00 00 00 ....b.a. r.......
+[0100] 00 00 00 00 04 00 00 00 62 00 61 00 7A 00 00 00 ........ b.a.z...
+[0110] 0B 00 00 00 00 00 00 00 0B 00 00 00 37 00 32 00 ........ ....7.2.
+[0120] 30 00 66 00 64 00 33 00 63 00 33 00 5F 00 38 00 0.f.d.3. c.3._.8.
+[0130] 00 00 00 00 04 00 00 00 09 00 0A 00 00 00 00 00 ........ ........
+[0140] 07 00 01 00 00 00 00 00 06 00 01 00 00 00 00 00 ........ ........
+[0150] 00 00 01 00 00 00 00 00 ........
+
diff --git a/source4/librpc/tests/claims_CLAIMS_SET_NDR.txt b/source4/librpc/tests/claims_CLAIMS_SET_NDR.txt
new file mode 100644
index 0000000..7865325
--- /dev/null
+++ b/source4/librpc/tests/claims_CLAIMS_SET_NDR.txt
@@ -0,0 +1,55 @@
+pull returned Success
+ CLAIMS_SET_NDR: struct CLAIMS_SET_NDR
+ claims: struct CLAIMS_SET_CTR
+ claims : *
+ claims: struct CLAIMS_SET
+ claims_array_count : 0x00000001 (1)
+ claims_arrays : *
+ claims_arrays: ARRAY(1)
+ claims_arrays: struct CLAIMS_ARRAY
+ claims_source_type : CLAIMS_SOURCE_TYPE_AD (1)
+ claims_count : 0x00000003 (3)
+ claim_entries : *
+ claim_entries: ARRAY(3)
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_9'
+ type : CLAIM_TYPE_BOOLEAN (6)
+ values : union CLAIM_ENTRY_VALUES(case 6)
+ claim_boolean: struct CLAIM_UINT64
+ value_count : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values : 0x0000000000000001 (1)
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_7'
+ type : CLAIM_TYPE_STRING (3)
+ values : union CLAIM_ENTRY_VALUES(case 3)
+ claim_string: struct CLAIM_STRING
+ value_count : 0x00000003 (3)
+ values : *
+ values: ARRAY(3)
+ values : *
+ values : 'foo'
+ values : *
+ values : 'bar'
+ values : *
+ values : 'baz'
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_8'
+ type : CLAIM_TYPE_UINT64 (2)
+ values : union CLAIM_ENTRY_VALUES(case 2)
+ claim_uint64: struct CLAIM_UINT64
+ value_count : 0x00000004 (4)
+ values : *
+ values: ARRAY(4)
+ values : 0x00000000000a0009 (655369)
+ values : 0x0000000000010007 (65543)
+ values : 0x0000000000010006 (65542)
+ values : 0x0000000000010000 (65536)
+ reserved_type : 0x0000 (0)
+ reserved_field_size : 0x00000000 (0)
+ reserved_field : NULL
+dump OK
diff --git a/source4/librpc/tests/compressed_claims.txt b/source4/librpc/tests/compressed_claims.txt
new file mode 100644
index 0000000..fe4ed20
--- /dev/null
+++ b/source4/librpc/tests/compressed_claims.txt
@@ -0,0 +1,96 @@
+pull returned Success
+ CLAIMS_SET_METADATA_NDR: struct CLAIMS_SET_METADATA_NDR
+ claims: struct CLAIMS_SET_METADATA_CTR
+ metadata : *
+ metadata: struct CLAIMS_SET_METADATA
+ claims_set_size : 0x00000229 (553)
+ claims_set : *
+ claims_set: struct CLAIMS_SET_NDR
+ claims: struct CLAIMS_SET_CTR
+ claims : *
+ claims: struct CLAIMS_SET
+ claims_array_count : 0x00000001 (1)
+ claims_arrays : *
+ claims_arrays: ARRAY(1)
+ claims_arrays: struct CLAIMS_ARRAY
+ claims_source_type : CLAIMS_SOURCE_TYPE_AD (1)
+ claims_count : 0x00000005 (5)
+ claim_entries : *
+ claim_entries: ARRAY(5)
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_4'
+ type : CLAIM_TYPE_BOOLEAN (6)
+ values : union CLAIM_ENTRY_VALUES(case 6)
+ claim_boolean: struct CLAIM_UINT64
+ value_count : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values : 0x0000000000000001 (1)
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_0'
+ type : CLAIM_TYPE_STRING (3)
+ values : union CLAIM_ENTRY_VALUES(case 3)
+ claim_string: struct CLAIM_STRING
+ value_count : 0x00000004 (4)
+ values : *
+ values: ARRAY(4)
+ values : *
+ values : 'A first value.'
+ values : *
+ values : 'A second value.'
+ values : *
+ values : 'A third value.'
+ values : *
+ values : 'A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed. A very long attribute value to ensure that this claim will be compressed.'
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_1'
+ type : CLAIM_TYPE_STRING (3)
+ values : union CLAIM_ENTRY_VALUES(case 3)
+ claim_string: struct CLAIM_STRING
+ value_count : 0x00000003 (3)
+ values : *
+ values: ARRAY(3)
+ values : *
+ values : 'DC=win22,DC=example,DC=com'
+ values : *
+ values : 'CN=Users,DC=win22,DC=example,DC=com'
+ values : *
+ values : 'CN=Computers,DC=win22,DC=example,DC=com'
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_2'
+ type : CLAIM_TYPE_UINT64 (2)
+ values : union CLAIM_ENTRY_VALUES(case 2)
+ claim_uint64: struct CLAIM_UINT64
+ value_count : 0x00000004 (4)
+ values : *
+ values: ARRAY(4)
+ values : 0x00000000000a0009 (655369)
+ values : 0x0000000000010007 (65543)
+ values : 0x0000000000010006 (65542)
+ values : 0x0000000000010000 (65536)
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_3'
+ type : CLAIM_TYPE_UINT64 (2)
+ values : union CLAIM_ENTRY_VALUES(case 2)
+ claim_uint64: struct CLAIM_UINT64
+ value_count : 0x00000004 (4)
+ values : *
+ values: ARRAY(4)
+ values : 0x00000000000a0009 (655369)
+ values : 0x0000000000010007 (65543)
+ values : 0x0000000000010006 (65542)
+ values : 0x0000000000010000 (65536)
+ reserved_type : 0x0000 (0)
+ reserved_field_size : 0x00000000 (0)
+ reserved_field : NULL
+ compression_format : CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF (4)
+ uncompressed_claims_set_size: 0x00002028 (8232)
+ reserved_type : 0x0000 (0)
+ reserved_field_size : 0x00000000 (0)
+ reserved_field : NULL
+dump OK
diff --git a/source4/librpc/tests/dns-decode_dns_name_packet-hex.dat b/source4/librpc/tests/dns-decode_dns_name_packet-hex.dat
new file mode 100644
index 0000000..c095bcc
--- /dev/null
+++ b/source4/librpc/tests/dns-decode_dns_name_packet-hex.dat
@@ -0,0 +1,7 @@
+[0000] EC EF 28 00 00 01 00 00 00 01 00 00 09 73 61 6D ..(..... .....sam
+[0010] 62 61 32 30 30 33 07 65 78 61 6D 70 6C 65 03 63 ba2003.e xample.c
+[0020] 6F 6D 00 00 06 00 01 0F 63 6E 61 6D 65 64 6F 74 om...... cnamedot
+[0030] 70 72 65 66 69 78 30 C0 0C 00 05 00 01 00 00 03 prefix0. ........
+[0040] 84 00 13 00 0F 62 6E 61 6D 65 64 6F 74 70 72 65 .....bna medotpre
+[0050] 66 69 78 32 C0 0C fix2..
+
diff --git a/source4/librpc/tests/dns-decode_dns_name_packet-hex.txt b/source4/librpc/tests/dns-decode_dns_name_packet-hex.txt
new file mode 100644
index 0000000..84b55f2
--- /dev/null
+++ b/source4/librpc/tests/dns-decode_dns_name_packet-hex.txt
@@ -0,0 +1,35 @@
+pull returned Success
+ dns_name_packet: struct dns_name_packet
+ id : 0xecef (60655)
+ operation : 0x2800 (10240)
+ 0x00: DNS_RCODE (0)
+ 0: DNS_FLAG_RECURSION_AVAIL
+ 0: DNS_FLAG_RECURSION_DESIRED
+ 0: DNS_FLAG_TRUNCATION
+ 0: DNS_FLAG_AUTHORITATIVE
+ 0x05: DNS_OPCODE (5)
+ 0: DNS_FLAG_REPLY
+ qdcount : 0x0001 (1)
+ ancount : 0x0000 (0)
+ nscount : 0x0001 (1)
+ arcount : 0x0000 (0)
+ questions: ARRAY(1)
+ questions: struct dns_name_question
+ name : 'samba2003.example.com'
+ question_type : DNS_QTYPE_SOA (0x6)
+ question_class : DNS_QCLASS_IN (0x1)
+ answers: ARRAY(0)
+ nsrecs: ARRAY(1)
+ nsrecs: struct dns_res_rec
+ name : 'cnamedotprefix0.samba2003.example.com'
+ rr_type : DNS_QTYPE_CNAME (0x5)
+ rr_class : DNS_QCLASS_IN (0x1)
+ ttl : 0x00000384 (900)
+ length : 0x0013 (19)
+ rdata : union dns_rdata(case 0x5)
+ cname_record : ''
+ unexpected : DATA_BLOB length=18
+[0000] 0F 62 6E 61 6D 65 64 6F 74 70 72 65 66 69 78 32 .bnamedo tprefix2
+[0010] C0 0C ..
+ additional: ARRAY(0)
+dump OK
diff --git a/source4/librpc/tests/dnsp-DnssrvRpcRecord.txt b/source4/librpc/tests/dnsp-DnssrvRpcRecord.txt
new file mode 100644
index 0000000..fd16922
--- /dev/null
+++ b/source4/librpc/tests/dnsp-DnssrvRpcRecord.txt
@@ -0,0 +1,32 @@
+pull returned Success
+ dnsp_DnssrvRpcRecord: struct dnsp_DnssrvRpcRecord
+ wDataLength : 0x0005 (5)
+ wType : DNS_TYPE_MX (15)
+ version : 0x05 (5)
+ rank : DNS_RANK_ZONE (240)
+ flags : 0x0000 (0)
+ dwSerial : 0x000000b7 (183)
+ dwTtlSeconds : 0x00000384 (900)
+ dwReserved : 0x00000000 (0)
+ dwTimeStamp : 0x00000000 (0)
+ data : union dnsRecordData(case 15)
+ mx: struct dnsp_mx
+ wPriority : 0x000a (10)
+ nameTarget :
+push returned Success
+pull returned Success
+ dnsp_DnssrvRpcRecord: struct dnsp_DnssrvRpcRecord
+ wDataLength : 0x0005 (5)
+ wType : DNS_TYPE_MX (15)
+ version : 0x05 (5)
+ rank : DNS_RANK_ZONE (240)
+ flags : 0x0000 (0)
+ dwSerial : 0x000000b7 (183)
+ dwTtlSeconds : 0x00000384 (900)
+ dwReserved : 0x00000000 (0)
+ dwTimeStamp : 0x00000000 (0)
+ data : union dnsRecordData(case 15)
+ mx: struct dnsp_mx
+ wPriority : 0x000a (10)
+ nameTarget :
+dump OK
diff --git a/source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.b64.txt b/source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.b64.txt
new file mode 100644
index 0000000..2004462
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.b64.txt
@@ -0,0 +1 @@
+AAAAAG38HKtrYtJKu7r2SJ3wBjACAAAAAgAAAAAAAAAAAAIAAAAAAAsAAAAEAAIAggAAADwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAQwBOAD0ATgBUAEQAUwAgAFMAZQB0AHQAaQBuAGcAcwAsAEMATgA9AHMAbQBiAHQAbwByAHQAdQByAGUAZABjACwAQwBOAD0AUwBlAHIAdgBlAHIAcwAsAEMATgA9AEQAZQBmAGEAdQBsAHQALQBGAGkAcgBzAHQALQBTAGkAdABlAC0ATgBhAG0AZQAsAEMATgA9AFMAaQB0AGUAcwAsAEMATgA9AEMAbwBuAGYAaQBnAHUAcgBhAHQAaQBvAG4ALABE/0MAPQBzAGEAbQBiAGEAMgAwADAAOAByADIALABEAEMAPQBlAHgAYQBtAHAAbABlACwARABDAD3+AAAAAAAAAAALAAAAGQECAAEAAAAIAAIAAAAAAAEAAAAMAAIADgMJAAEAAAAQAAIAcwACAAEAAAAUAAIADgACAAMAAAAYAAIALAcJAAMAAAAcAAIAJAACAAEAAAAgAAIAHAcJAAEAAAAkAAIAswUJAAEAAACDAAIAdwEJAAEAAAAsAAIAAwAJAAEAAAAwAAIAAQAAAKAAAAA0AAIAoAAAAAEABIAUAAAAMAAAAAAAAABMAAAAAQUAAAAAAAUVAAAAS31jTHRMr+ateOGxAAIAAAEFAAAAAAAFFQAAAEt9Y0x0TK/mrXjhsQACAAACAFQAAwAAAAAAFACUAAIAAQEAAAAAAAULAAAAAAAkAP0BDwABBQAAAAAABRUAAABLfWNMdEyv5q144bEAAgAAAAAUAP8BDwABAQAAAAAABRIAAAABAAAABAAAADgAAgADAAAALwAXAAEAAADIAAAAPAACAMgAAADIAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAEMATgA9AE4AVABEAFMALQBEAFMAQQWaAEMATgA9AFMAYwBoAGUAbQBhACwAQwBOAD0AQwBvAG4AZgBpAGcAdQByAGEAdABpAG8AbgAsAEQAQwA9AHMAYQBtAGIAYQAyADAAMAA4AHIAMgAsAEQAQwA9AGUAeABhAG0AcABsAGUALABEAEMAPQBjAG8AbQAAAAEAAAAQAAAAQAACABAAAAAbcOooBthZR6nsXn3lUhbcAwAAAJwAAABEAAIAegAAAEgAAgCwAAAATAACAJwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQAAAEMATgA9AEMAbwBuAGYAaQBnAHUAcgBhAHQAaQBvAG4ALABEAEMAPQBzAGEAbQBiAGEAMgAwADAAOAByADIALABEAEMAPQBlAHgAYQBtAHAAbABlACwARABDAD0AYwBvAG0AAAB6AAAAegAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABEAEMAPQBzAGEAbQBiAGEAMgAwADAAOAByADIALABEAEMAPQBlAHgAYQBtAHAAbABlACwARABDAD0AYwBvAG0AAAAAALAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAEMATgA9AFMAYwBoAGUAbQBhACwAQwBOAD0AQwBvAG4AZgBpAGcAdQByAGEAdABpAG8AbgAsAEQAQwA9AHMAYQBtAGIAYQAyADAAMAA4AHIAMgAsAEQAQwA9AGUAeABhAG0AcABsAGUALABEAEMAPQBjAG8AbQAAAAMAAACcAAAAUAACAHoAAABUAAIAsAAAAFgAAgCcAAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAABDAE4APQBDAG8AbgBmAGkAZwB1AHIAYQB0AGkAbwBuACwARABDAD0AcwBhAG0AYgBhADIAMAAwADgAcgAyACwARABDAD0AZQB4AGEAbQBwAGwAZQAsAEQAQwA9AGMAbwBtAAAAegAAAHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAARABDAD0AcwBhAG0AYgBhADIAMAAwADgAcgAyACwARABDAD0AZQB4AGEAbQBwAGwAZQAsAEQAQwA9AGMAbwBtAAAAAACwAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsAAABDAE4APQBTAGMAaABkAG0AYQAsAEMATgA9AEMAbwBuAGYAaQBnAHUAcgBhAHQAaQBvAG4ALABEAEMAPQBzAGEAbQBiAGEAMgAwADAAOAByADIALABEAEMAPQBlAHgAYQBtAHAAbABlACwARABDAD0AYwBvAG0AAAABAAAAsAAAAFwAAgCwAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAADsAAABDAE4APQBTAGMAaABlAG0ABYSZza4ATv89AEMAbwBuAGYAaQBnAHUAcgBhAHQAaQBvAG4ALABEAEMAPQBzAGEAbQBiAGEAMgAwADAAOAByADIALABEAEMAPQBlAHgAYQBtAHAAbABlACwARABDAD0AYwBvAG0AAAABAAAAegAAAGAAAgB6AAAAegAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABEAEMAPQBzAGEAbQBiAGEAMgAwADAAOAByADIALABEAEMAPQBlAHgAYQBtAHAAbABlACwARABDAD0AYwBvAG0AAAAAAAEAAAAEAAAAZAACAAQAAAAEAAAAAQAAAAQAAABoAAIABAAAAAAAAAIBAAAAtAAAAGwAAgC0AAAAtAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AAABDAE4APQBzAG0AYgB0AG8AcgB0AHUAcgBlAGQAYwAsAEMATgA9AEMAbwBtAHAAdQB0AGUAcgBzACwARABDAD0AcwBhAG0AYgBhADIAMAAwADgAcgAyACwARABDAD0AZQB4AGEAbQBwAGwAZQAsAEQAQwA9AGMAbwBtAOsAAT0BsQFpOxKN7SeSaRtLcWeFbQVEWmptqhYpN0lAzfUGr3aRSJAkOIGKonAOV2g=
diff --git a/source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.txt b/source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.txt
new file mode 100644
index 0000000..365be43
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_drsuapi_DsAddEntry_1.txt
@@ -0,0 +1,785 @@
+pull returned Success
+WARNING! 47 unread bytes
+[0000] 01 3D 01 B1 01 69 3B 12 8D ED 27 92 69 1B 4B 71 .=...i;. ..'.i.Kq
+[0010] 67 85 6D 05 44 5A 6A 6D AA 16 29 37 49 40 CD F5 g.m.DZjm ..)7I@..
+[0020] 06 AF 76 91 48 90 24 38 81 8A A2 70 0E 57 68 ..v.H.$8 ...p.Wh
+ drsuapi_DsAddEntry: struct drsuapi_DsAddEntry
+ in: struct drsuapi_DsAddEntry
+ bind_handle : *
+ bind_handle: struct policy_handle
+ handle_type : 0x00000000 (0)
+ uuid : ab1cfc6d-626b-4ad2-bbba-f6489df00630
+ level : 0x00000002 (2)
+ req : *
+ req : union drsuapi_DsAddEntryRequest(case 2)
+ req2: struct drsuapi_DsAddEntryRequest2
+ first_object: struct drsuapi_DsReplicaObjectListItem
+ next_object : NULL
+ object: struct drsuapi_DsReplicaObject
+ identifier : *
+ identifier: struct drsuapi_DsReplicaObjectIdentifier
+ __ndr_size : 0x0000013c (316)
+ __ndr_size_sid : 0x00000000 (0)
+ guid : 00000000-0000-0000-0000-000000000000
+ sid : S-0-0
+ __ndr_size_dn : 0x00000081 (129)
+ dn : 'CN=NTDS Settings,CN=smbtorturedc,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,dC=samba2008r2,DC=example,DC︽'
+ flags : 0x00000000 (0)
+ 0: DRSUAPI_DS_REPLICA_OBJECT_FROM_MASTER
+ 0: DRSUAPI_DS_REPLICA_OBJECT_DYNAMIC
+ 0: DRSUAPI_DS_REPLICA_OBJECT_REMOTE_MODIFY
+ attribute_ctr: struct drsuapi_DsReplicaAttributeCtr
+ num_attributes : 0x0000000b (11)
+ attributes : *
+ attributes: ARRAY(11)
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_ntSecurityDescriptor (0x20119)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000a0 (160)
+ blob : *
+ blob : DATA_BLOB length=160
+[0000] 01 00 04 80 14 00 00 00 30 00 00 00 00 00 00 00 ........ 0.......
+[0010] 4C 00 00 00 01 05 00 00 00 00 00 05 15 00 00 00 L....... ........
+[0020] 4B 7D 63 4C 74 4C AF E6 AD 78 E1 B1 00 02 00 00 K}cLtL.. .x......
+[0030] 01 05 00 00 00 00 00 05 15 00 00 00 4B 7D 63 4C ........ ....K}cL
+[0040] 74 4C AF E6 AD 78 E1 B1 00 02 00 00 02 00 54 00 tL...x.. ......T.
+[0050] 03 00 00 00 00 00 14 00 94 00 02 00 01 01 00 00 ........ ........
+[0060] 00 00 00 05 0B 00 00 00 00 00 24 00 FD 01 0F 00 ........ ..$.....
+[0070] 01 05 00 00 00 00 00 05 15 00 00 00 4B 7D 63 4C ........ ....K}cL
+[0080] 74 4C AF E6 AD 78 E1 B1 00 02 00 00 00 00 14 00 tL...x.. ........
+[0090] FF 01 0F 00 01 01 00 00 00 00 00 05 12 00 00 00 ........ ........
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_objectClass (0x0)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ attid : DATA_BLOB length=3
+[0000] 2F 00 17 /..
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_objectCategory (0x9030E)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000c8 (200)
+ blob : *
+ blob : DATA_BLOB length=200
+[0000] C8 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 47 00 00 00 43 00 4E 00 3D 00 4E 00 ....G... C.N.=.N.
+[0040] 54 00 44 00 53 00 2D 00 44 00 53 00 41 05 9A 00 T.D.S.-. D.S.A...
+[0050] 43 00 4E 00 3D 00 53 00 63 00 68 00 65 00 6D 00 C.N.=.S. c.h.e.m.
+[0060] 61 00 2C 00 43 00 4E 00 3D 00 43 00 6F 00 6E 00 a.,.C.N. =.C.o.n.
+[0070] 66 00 69 00 67 00 75 00 72 00 61 00 74 00 69 00 f.i.g.u. r.a.t.i.
+[0080] 6F 00 6E 00 2C 00 44 00 43 00 3D 00 73 00 61 00 o.n.,.D. C.=.s.a.
+[0090] 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 72 00 m.b.a.2. 0.0.8.r.
+[00A0] 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 61 00 2.,.D.C. =.e.x.a.
+[00B0] 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 3D 00 m.p.l.e. ,.D.C.=.
+[00C0] 63 00 6F 00 6D 00 00 00 c.o.m...
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_invocationId (0x20073)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x00000010 (16)
+ blob : *
+ blob : DATA_BLOB length=16
+[0000] 1B 70 EA 28 06 D8 59 47 A9 EC 5E 7D E5 52 16 DC .p.(..YG ..^}.R..
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_hasMasterNCs (0x2000E)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000003 (3)
+ values : *
+ values: ARRAY(3)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000009c (156)
+ blob : *
+ blob : DATA_BLOB length=156
+[0000] 9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 31 00 00 00 43 00 4E 00 3D 00 43 00 ....1... C.N.=.C.
+[0040] 6F 00 6E 00 66 00 69 00 67 00 75 00 72 00 61 00 o.n.f.i. g.u.r.a.
+[0050] 74 00 69 00 6F 00 6E 00 2C 00 44 00 43 00 3D 00 t.i.o.n. ,.D.C.=.
+[0060] 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 s.a.m.b. a.2.0.0.
+[0070] 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 8.r.2.,. D.C.=.e.
+[0080] 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 x.a.m.p. l.e.,.D.
+[0090] 43 00 3D 00 63 00 6F 00 6D 00 00 00 C.=.c.o. m...
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000007a (122)
+ blob : *
+ blob : DATA_BLOB length=122
+[0000] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+[0040] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+[0050] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+[0060] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+[0070] 3D 00 63 00 6F 00 6D 00 00 00 =.c.o.m. ..
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000b0 (176)
+ blob : *
+ blob : DATA_BLOB length=176
+[0000] B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+[0010] 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 3B 00 00 00 43 00 4E 00 3D 00 53 00 ....;... C.N.=.S.
+[0040] 63 00 68 00 65 00 6D 00 61 00 2C 00 43 00 4E 00 c.h.e.m. a.,.C.N.
+[0050] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+[0060] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+[0070] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+[0080] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+[0090] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+[00A0] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_msDS_hasMasterNCs (0x9072C)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000003 (3)
+ values : *
+ values: ARRAY(3)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000009c (156)
+ blob : *
+ blob : DATA_BLOB length=156
+[0000] 9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 31 00 00 00 43 00 4E 00 3D 00 43 00 ....1... C.N.=.C.
+[0040] 6F 00 6E 00 66 00 69 00 67 00 75 00 72 00 61 00 o.n.f.i. g.u.r.a.
+[0050] 74 00 69 00 6F 00 6E 00 2C 00 44 00 43 00 3D 00 t.i.o.n. ,.D.C.=.
+[0060] 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 s.a.m.b. a.2.0.0.
+[0070] 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 8.r.2.,. D.C.=.e.
+[0080] 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 x.a.m.p. l.e.,.D.
+[0090] 43 00 3D 00 63 00 6F 00 6D 00 00 00 C.=.c.o. m...
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000007a (122)
+ blob : *
+ blob : DATA_BLOB length=122
+[0000] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+[0040] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+[0050] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+[0060] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+[0070] 3D 00 63 00 6F 00 6D 00 00 00 =.c.o.m. ..
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000b0 (176)
+ blob : *
+ blob : DATA_BLOB length=176
+[0000] B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 3B 00 00 00 43 00 4E 00 3D 00 53 00 ....;... C.N.=.S.
+[0040] 63 00 68 00 64 00 6D 00 61 00 2C 00 43 00 4E 00 c.h.d.m. a.,.C.N.
+[0050] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+[0060] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+[0070] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+[0080] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+[0090] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+[00A0] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_dMDLocation (0x20024)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ string : '°'
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_msDS_HasDomainNCs (0x9071C)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000007a (122)
+ blob : *
+ blob : DATA_BLOB length=122
+[0000] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+[0040] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+[0050] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+[0060] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+[0070] 3D 00 63 00 6F 00 6D 00 00 00 =.c.o.m. ..
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_msDS_Behavior_Version (0x905B3)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x00000004 (4)
+ blob : *
+ blob : DATA_BLOB length=4
+[0000] 04 00 00 00 ....
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_systemFlags (0x90177)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x00000004 (4)
+ blob : *
+ blob : DATA_BLOB length=4
+[0000] 00 00 00 02 ....
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_replPropertyMetaData (0x90003)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000b4 (180)
+ blob : *
+ blob : DATA_BLOB length=180
+[0000] B4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 3D 00 00 00 43 00 4E 00 3D 00 73 00 ....=... C.N.=.s.
+[0040] 6D 00 62 00 74 00 6F 00 72 00 74 00 75 00 72 00 m.b.t.o. r.t.u.r.
+[0050] 65 00 64 00 63 00 2C 00 43 00 4E 00 3D 00 43 00 e.d.c.,. C.N.=.C.
+[0060] 6F 00 6D 00 70 00 75 00 74 00 65 00 72 00 73 00 o.m.p.u. t.e.r.s.
+[0070] 2C 00 44 00 43 00 3D 00 73 00 61 00 6D 00 62 00 ,.D.C.=. s.a.m.b.
+[0080] 61 00 32 00 30 00 30 00 38 00 72 00 32 00 2C 00 a.2.0.0. 8.r.2.,.
+[0090] 44 00 43 00 3D 00 65 00 78 00 61 00 6D 00 70 00 D.C.=.e. x.a.m.p.
+[00A0] 6C 00 65 00 2C 00 44 00 43 00 3D 00 63 00 6F 00 l.e.,.D. C.=.c.o.
+[00B0] 6D 00 EB 00 m...
+push returned Success
+pull returned Success
+ drsuapi_DsAddEntry: struct drsuapi_DsAddEntry
+ in: struct drsuapi_DsAddEntry
+ bind_handle : *
+ bind_handle: struct policy_handle
+ handle_type : 0x00000000 (0)
+ uuid : ab1cfc6d-626b-4ad2-bbba-f6489df00630
+ level : 0x00000002 (2)
+ req : *
+ req : union drsuapi_DsAddEntryRequest(case 2)
+ req2: struct drsuapi_DsAddEntryRequest2
+ first_object: struct drsuapi_DsReplicaObjectListItem
+ next_object : NULL
+ object: struct drsuapi_DsReplicaObject
+ identifier : *
+ identifier: struct drsuapi_DsReplicaObjectIdentifier
+ __ndr_size : 0x00000136 (310)
+ __ndr_size_sid : 0x00000000 (0)
+ guid : 00000000-0000-0000-0000-000000000000
+ sid : S-0-0
+ __ndr_size_dn : 0x0000007e (126)
+ dn : 'CN=NTDS Settings,CN=smbtorturedc,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,dC=samba2008r2,DC=example,DC︽'
+ flags : 0x00000000 (0)
+ 0: DRSUAPI_DS_REPLICA_OBJECT_FROM_MASTER
+ 0: DRSUAPI_DS_REPLICA_OBJECT_DYNAMIC
+ 0: DRSUAPI_DS_REPLICA_OBJECT_REMOTE_MODIFY
+ attribute_ctr: struct drsuapi_DsReplicaAttributeCtr
+ num_attributes : 0x0000000b (11)
+ attributes : *
+ attributes: ARRAY(11)
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_ntSecurityDescriptor (0x20119)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000a0 (160)
+ blob : *
+ blob : DATA_BLOB length=160
+[0000] 01 00 04 80 14 00 00 00 30 00 00 00 00 00 00 00 ........ 0.......
+[0010] 4C 00 00 00 01 05 00 00 00 00 00 05 15 00 00 00 L....... ........
+[0020] 4B 7D 63 4C 74 4C AF E6 AD 78 E1 B1 00 02 00 00 K}cLtL.. .x......
+[0030] 01 05 00 00 00 00 00 05 15 00 00 00 4B 7D 63 4C ........ ....K}cL
+[0040] 74 4C AF E6 AD 78 E1 B1 00 02 00 00 02 00 54 00 tL...x.. ......T.
+[0050] 03 00 00 00 00 00 14 00 94 00 02 00 01 01 00 00 ........ ........
+[0060] 00 00 00 05 0B 00 00 00 00 00 24 00 FD 01 0F 00 ........ ..$.....
+[0070] 01 05 00 00 00 00 00 05 15 00 00 00 4B 7D 63 4C ........ ....K}cL
+[0080] 74 4C AF E6 AD 78 E1 B1 00 02 00 00 00 00 14 00 tL...x.. ........
+[0090] FF 01 0F 00 01 01 00 00 00 00 00 05 12 00 00 00 ........ ........
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_objectClass (0x0)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ attid : DATA_BLOB length=3
+[0000] 2F 00 17 /..
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_objectCategory (0x9030E)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000c8 (200)
+ blob : *
+ blob : DATA_BLOB length=200
+[0000] C8 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 47 00 00 00 43 00 4E 00 3D 00 4E 00 ....G... C.N.=.N.
+[0040] 54 00 44 00 53 00 2D 00 44 00 53 00 41 05 9A 00 T.D.S.-. D.S.A...
+[0050] 43 00 4E 00 3D 00 53 00 63 00 68 00 65 00 6D 00 C.N.=.S. c.h.e.m.
+[0060] 61 00 2C 00 43 00 4E 00 3D 00 43 00 6F 00 6E 00 a.,.C.N. =.C.o.n.
+[0070] 66 00 69 00 67 00 75 00 72 00 61 00 74 00 69 00 f.i.g.u. r.a.t.i.
+[0080] 6F 00 6E 00 2C 00 44 00 43 00 3D 00 73 00 61 00 o.n.,.D. C.=.s.a.
+[0090] 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 72 00 m.b.a.2. 0.0.8.r.
+[00A0] 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 61 00 2.,.D.C. =.e.x.a.
+[00B0] 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 3D 00 m.p.l.e. ,.D.C.=.
+[00C0] 63 00 6F 00 6D 00 00 00 c.o.m...
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_invocationId (0x20073)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x00000010 (16)
+ blob : *
+ blob : DATA_BLOB length=16
+[0000] 1B 70 EA 28 06 D8 59 47 A9 EC 5E 7D E5 52 16 DC .p.(..YG ..^}.R..
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_hasMasterNCs (0x2000E)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000003 (3)
+ values : *
+ values: ARRAY(3)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000009c (156)
+ blob : *
+ blob : DATA_BLOB length=156
+[0000] 9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 31 00 00 00 43 00 4E 00 3D 00 43 00 ....1... C.N.=.C.
+[0040] 6F 00 6E 00 66 00 69 00 67 00 75 00 72 00 61 00 o.n.f.i. g.u.r.a.
+[0050] 74 00 69 00 6F 00 6E 00 2C 00 44 00 43 00 3D 00 t.i.o.n. ,.D.C.=.
+[0060] 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 s.a.m.b. a.2.0.0.
+[0070] 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 8.r.2.,. D.C.=.e.
+[0080] 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 x.a.m.p. l.e.,.D.
+[0090] 43 00 3D 00 63 00 6F 00 6D 00 00 00 C.=.c.o. m...
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000007a (122)
+ blob : *
+ blob : DATA_BLOB length=122
+[0000] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+[0040] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+[0050] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+[0060] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+[0070] 3D 00 63 00 6F 00 6D 00 00 00 =.c.o.m. ..
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000b0 (176)
+ blob : *
+ blob : DATA_BLOB length=176
+[0000] B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+[0010] 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 3B 00 00 00 43 00 4E 00 3D 00 53 00 ....;... C.N.=.S.
+[0040] 63 00 68 00 65 00 6D 00 61 00 2C 00 43 00 4E 00 c.h.e.m. a.,.C.N.
+[0050] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+[0060] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+[0070] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+[0080] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+[0090] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+[00A0] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_msDS_hasMasterNCs (0x9072C)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000003 (3)
+ values : *
+ values: ARRAY(3)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000009c (156)
+ blob : *
+ blob : DATA_BLOB length=156
+[0000] 9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 31 00 00 00 43 00 4E 00 3D 00 43 00 ....1... C.N.=.C.
+[0040] 6F 00 6E 00 66 00 69 00 67 00 75 00 72 00 61 00 o.n.f.i. g.u.r.a.
+[0050] 74 00 69 00 6F 00 6E 00 2C 00 44 00 43 00 3D 00 t.i.o.n. ,.D.C.=.
+[0060] 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 s.a.m.b. a.2.0.0.
+[0070] 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 8.r.2.,. D.C.=.e.
+[0080] 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 x.a.m.p. l.e.,.D.
+[0090] 43 00 3D 00 63 00 6F 00 6D 00 00 00 C.=.c.o. m...
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000007a (122)
+ blob : *
+ blob : DATA_BLOB length=122
+[0000] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+[0040] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+[0050] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+[0060] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+[0070] 3D 00 63 00 6F 00 6D 00 00 00 =.c.o.m. ..
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000b0 (176)
+ blob : *
+ blob : DATA_BLOB length=176
+[0000] B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 3B 00 00 00 43 00 4E 00 3D 00 53 00 ....;... C.N.=.S.
+[0040] 63 00 68 00 64 00 6D 00 61 00 2C 00 43 00 4E 00 c.h.d.m. a.,.C.N.
+[0050] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+[0060] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+[0070] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+[0080] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+[0090] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+[00A0] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_dMDLocation (0x20024)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ string : '°'
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_msDS_HasDomainNCs (0x9071C)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x0000007a (122)
+ blob : *
+ blob : DATA_BLOB length=122
+[0000] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+[0040] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+[0050] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+[0060] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+[0070] 3D 00 63 00 6F 00 6D 00 00 00 =.c.o.m. ..
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_msDS_Behavior_Version (0x905B3)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x00000004 (4)
+ blob : *
+ blob : DATA_BLOB length=4
+[0000] 04 00 00 00 ....
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_systemFlags (0x90177)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x00000004 (4)
+ blob : *
+ blob : DATA_BLOB length=4
+[0000] 00 00 00 02 ....
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_replPropertyMetaData (0x90003)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ __ndr_size : 0x000000b4 (180)
+ blob : *
+ blob : DATA_BLOB length=180
+[0000] B4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ........ ........
+skipping zero buffer bytes
+[0030] 00 00 00 00 3D 00 00 00 43 00 4E 00 3D 00 73 00 ....=... C.N.=.s.
+[0040] 6D 00 62 00 74 00 6F 00 72 00 74 00 75 00 72 00 m.b.t.o. r.t.u.r.
+[0050] 65 00 64 00 63 00 2C 00 43 00 4E 00 3D 00 43 00 e.d.c.,. C.N.=.C.
+[0060] 6F 00 6D 00 70 00 75 00 74 00 65 00 72 00 73 00 o.m.p.u. t.e.r.s.
+[0070] 2C 00 44 00 43 00 3D 00 73 00 61 00 6D 00 62 00 ,.D.C.=. s.a.m.b.
+[0080] 61 00 32 00 30 00 30 00 38 00 72 00 32 00 2C 00 a.2.0.0. 8.r.2.,.
+[0090] 44 00 43 00 3D 00 65 00 78 00 61 00 6D 00 70 00 D.C.=.e. x.a.m.p.
+[00A0] 6C 00 65 00 2C 00 44 00 43 00 3D 00 63 00 6F 00 l.e.,.D. C.=.c.o.
+[00B0] 6D 00 EB 00 m...
+WARNING! orig bytes:2555 validated pushed bytes:2504
+WARNING! orig pulled bytes:2508 validated pulled bytes:2504
+WARNING! orig and validated differ at byte 0x30 (48)
+WARNING! orig byte[0x30] = 0x82 validated byte[0x30] = 0x7F
+ [0000] 00 00 00 00 6D FC 1C AB 6B 62 D2 4A BB BA F6 48 ....m... kb.J...H
+ [0010] 9D F0 06 30 02 00 00 00 02 00 00 00 00 00 00 00 ...0.... ........
+ [0020] 00 00 02 00 00 00 00 00 0B 00 00 00 04 00 02 00 ........ ........
+-[0030] 82 00 00 00 3C 01 00 00 00 00 00 00 00 00 00 00 ....<... ........
++[0030] 7F 00 00 00 36 01 00 00 00 00 00 00 00 00 00 00 ....6... ........
+skipping zero buffer bytes
+-[0060] 00 00 00 00 00 00 00 00 81 00 00 00 43 00 4E 00 ........ ....C.N.
++[0060] 00 00 00 00 00 00 00 00 7E 00 00 00 43 00 4E 00 ........ ~...C.N.
+ [0070] 3D 00 4E 00 54 00 44 00 53 00 20 00 53 00 65 00 =.N.T.D. S. .S.e.
+ [0080] 74 00 74 00 69 00 6E 00 67 00 73 00 2C 00 43 00 t.t.i.n. g.s.,.C.
+ [0090] 4E 00 3D 00 73 00 6D 00 62 00 74 00 6F 00 72 00 N.=.s.m. b.t.o.r.
+ [00A0] 74 00 75 00 72 00 65 00 64 00 63 00 2C 00 43 00 t.u.r.e. d.c.,.C.
+ [00B0] 4E 00 3D 00 53 00 65 00 72 00 76 00 65 00 72 00 N.=.S.e. r.v.e.r.
+ [00C0] 73 00 2C 00 43 00 4E 00 3D 00 44 00 65 00 66 00 s.,.C.N. =.D.e.f.
+ [00D0] 61 00 75 00 6C 00 74 00 2D 00 46 00 69 00 72 00 a.u.l.t. -.F.i.r.
+ [00E0] 73 00 74 00 2D 00 53 00 69 00 74 00 65 00 2D 00 s.t.-.S. i.t.e.-.
+ [00F0] 4E 00 61 00 6D 00 65 00 2C 00 43 00 4E 00 3D 00 N.a.m.e. ,.C.N.=.
+ [0100] 53 00 69 00 74 00 65 00 73 00 2C 00 43 00 4E 00 S.i.t.e. s.,.C.N.
+ [0110] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+ [0120] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 FF r.a.t.i. o.n.,.D.
+ [0130] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+ [0140] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+ [0150] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+-[0160] 2C 00 44 00 43 00 3D FE 00 00 00 00 00 00 00 00 ,.D.C.=. ........
++[0160] 2C 00 44 00 43 00 3D FE 00 00 00 00 0B 00 00 00 ,.D.C.=. ........
+-[0170] 0B 00 00 00 19 01 02 00 01 00 00 00 08 00 02 00 ........ ........
++[0170] 19 01 02 00 01 00 00 00 08 00 02 00 00 00 00 00 ........ ........
+-[0180] 00 00 00 00 01 00 00 00 0C 00 02 00 0E 03 09 00 ........ ........
++[0180] 01 00 00 00 0C 00 02 00 0E 03 09 00 01 00 00 00 ........ ........
+-[0190] 01 00 00 00 10 00 02 00 73 00 02 00 01 00 00 00 ........ s.......
++[0190] 10 00 02 00 73 00 02 00 01 00 00 00 14 00 02 00 ....s... ........
+-[01A0] 14 00 02 00 0E 00 02 00 03 00 00 00 18 00 02 00 ........ ........
++[01A0] 0E 00 02 00 03 00 00 00 18 00 02 00 2C 07 09 00 ........ ....,...
+-[01B0] 2C 07 09 00 03 00 00 00 1C 00 02 00 24 00 02 00 ,....... ....$...
++[01B0] 03 00 00 00 1C 00 02 00 24 00 02 00 01 00 00 00 ........ $.......
+-[01C0] 01 00 00 00 20 00 02 00 1C 07 09 00 01 00 00 00 .... ... ........
++[01C0] 20 00 02 00 1C 07 09 00 01 00 00 00 24 00 02 00 ....... ....$...
+-[01D0] 24 00 02 00 B3 05 09 00 01 00 00 00 83 00 02 00 $....... ........
++[01D0] B3 05 09 00 01 00 00 00 28 00 02 00 77 01 09 00 ........ (...w...
+-[01E0] 77 01 09 00 01 00 00 00 2C 00 02 00 03 00 09 00 w....... ,.......
++[01E0] 01 00 00 00 2C 00 02 00 03 00 09 00 01 00 00 00 ....,... ........
+-[01F0] 01 00 00 00 30 00 02 00 01 00 00 00 A0 00 00 00 ....0... ........
++[01F0] 30 00 02 00 01 00 00 00 A0 00 00 00 34 00 02 00 0....... ....4...
+-[0200] 34 00 02 00 A0 00 00 00 01 00 04 80 14 00 00 00 4....... ........
++[0200] A0 00 00 00 01 00 04 80 14 00 00 00 30 00 00 00 ........ ....0...
+-[0210] 30 00 00 00 00 00 00 00 4C 00 00 00 01 05 00 00 0....... L.......
++[0210] 00 00 00 00 4C 00 00 00 01 05 00 00 00 00 00 05 ....L... ........
+-[0220] 00 00 00 05 15 00 00 00 4B 7D 63 4C 74 4C AF E6 ........ K}cLtL..
++[0220] 15 00 00 00 4B 7D 63 4C 74 4C AF E6 AD 78 E1 B1 ....K}cL tL...x..
+-[0230] AD 78 E1 B1 00 02 00 00 01 05 00 00 00 00 00 05 .x...... ........
++[0230] 00 02 00 00 01 05 00 00 00 00 00 05 15 00 00 00 ........ ........
+-[0240] 15 00 00 00 4B 7D 63 4C 74 4C AF E6 AD 78 E1 B1 ....K}cL tL...x..
++[0240] 4B 7D 63 4C 74 4C AF E6 AD 78 E1 B1 00 02 00 00 K}cLtL.. .x......
+-[0250] 00 02 00 00 02 00 54 00 03 00 00 00 00 00 14 00 ......T. ........
++[0250] 02 00 54 00 03 00 00 00 00 00 14 00 94 00 02 00 ..T..... ........
+-[0260] 94 00 02 00 01 01 00 00 00 00 00 05 0B 00 00 00 ........ ........
++[0260] 01 01 00 00 00 00 00 05 0B 00 00 00 00 00 24 00 ........ ......$.
+-[0270] 00 00 24 00 FD 01 0F 00 01 05 00 00 00 00 00 05 ..$..... ........
++[0270] FD 01 0F 00 01 05 00 00 00 00 00 05 15 00 00 00 ........ ........
+-[0280] 15 00 00 00 4B 7D 63 4C 74 4C AF E6 AD 78 E1 B1 ....K}cL tL...x..
++[0280] 4B 7D 63 4C 74 4C AF E6 AD 78 E1 B1 00 02 00 00 K}cLtL.. .x......
+-[0290] 00 02 00 00 00 00 14 00 FF 01 0F 00 01 01 00 00 ........ ........
++[0290] 00 00 14 00 FF 01 0F 00 01 01 00 00 00 00 00 05 ........ ........
+-[02A0] 00 00 00 05 12 00 00 00 01 00 00 00 04 00 00 00 ........ ........
++[02A0] 12 00 00 00 01 00 00 00 03 00 00 00 38 00 02 00 ........ ....8...
+-[02B0] 38 00 02 00 03 00 00 00 2F 00 17 00 01 00 00 00 8....... /.......
++[02B0] 03 00 00 00 2F 00 17 00 01 00 00 00 C8 00 00 00 ..../... ........
+-[02C0] C8 00 00 00 3C 00 02 00 C8 00 00 00 C8 00 00 00 ....<... ........
++[02C0] 3C 00 02 00 C8 00 00 00 C8 00 00 00 00 00 00 00 <....... ........
+-[02D0] 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 ........ ........
++[02D0] 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+-[02F0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[02F0] 00 00 00 00 00 00 00 00 00 00 00 00 47 00 00 00 ........ ....G...
+-[0300] 47 00 00 00 43 00 4E 00 3D 00 4E 00 54 00 44 00 G...C.N. =.N.T.D.
++[0300] 43 00 4E 00 3D 00 4E 00 54 00 44 00 53 00 2D 00 C.N.=.N. T.D.S.-.
+-[0310] 53 00 2D 00 44 00 53 00 41 05 9A 00 43 00 4E 00 S.-.D.S. A...C.N.
++[0310] 44 00 53 00 41 05 9A 00 43 00 4E 00 3D 00 53 00 D.S.A... C.N.=.S.
+-[0320] 3D 00 53 00 63 00 68 00 65 00 6D 00 61 00 2C 00 =.S.c.h. e.m.a.,.
++[0320] 63 00 68 00 65 00 6D 00 61 00 2C 00 43 00 4E 00 c.h.e.m. a.,.C.N.
+-[0330] 43 00 4E 00 3D 00 43 00 6F 00 6E 00 66 00 69 00 C.N.=.C. o.n.f.i.
++[0330] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+-[0340] 67 00 75 00 72 00 61 00 74 00 69 00 6F 00 6E 00 g.u.r.a. t.i.o.n.
++[0340] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+-[0350] 2C 00 44 00 43 00 3D 00 73 00 61 00 6D 00 62 00 ,.D.C.=. s.a.m.b.
++[0350] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+-[0360] 61 00 32 00 30 00 30 00 38 00 72 00 32 00 2C 00 a.2.0.0. 8.r.2.,.
++[0360] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+-[0370] 44 00 43 00 3D 00 65 00 78 00 61 00 6D 00 70 00 D.C.=.e. x.a.m.p.
++[0370] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+-[0380] 6C 00 65 00 2C 00 44 00 43 00 3D 00 63 00 6F 00 l.e.,.D. C.=.c.o.
++[0380] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+-[0390] 6D 00 00 00 01 00 00 00 10 00 00 00 40 00 02 00 m....... ....@...
++[0390] 01 00 00 00 10 00 00 00 40 00 02 00 10 00 00 00 ........ @.......
+-[03A0] 10 00 00 00 1B 70 EA 28 06 D8 59 47 A9 EC 5E 7D .....p.( ..YG..^}
++[03A0] 1B 70 EA 28 06 D8 59 47 A9 EC 5E 7D E5 52 16 DC .p.(..YG ..^}.R..
+-[03B0] E5 52 16 DC 03 00 00 00 9C 00 00 00 44 00 02 00 .R...... ....D...
++[03B0] 03 00 00 00 9C 00 00 00 44 00 02 00 7A 00 00 00 ........ D...z...
+-[03C0] 7A 00 00 00 48 00 02 00 B0 00 00 00 4C 00 02 00 z...H... ....L...
++[03C0] 48 00 02 00 B0 00 00 00 4C 00 02 00 9C 00 00 00 H....... L.......
+-[03D0] 9C 00 00 00 9C 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[03D0] 9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+-[0400] 00 00 00 00 00 00 00 00 31 00 00 00 43 00 4E 00 ........ 1...C.N.
++[0400] 00 00 00 00 31 00 00 00 43 00 4E 00 3D 00 43 00 ....1... C.N.=.C.
+-[0410] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
++[0410] 6F 00 6E 00 66 00 69 00 67 00 75 00 72 00 61 00 o.n.f.i. g.u.r.a.
+-[0420] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
++[0420] 74 00 69 00 6F 00 6E 00 2C 00 44 00 43 00 3D 00 t.i.o.n. ,.D.C.=.
+-[0430] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
++[0430] 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 s.a.m.b. a.2.0.0.
+-[0440] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
++[0440] 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 8.r.2.,. D.C.=.e.
+-[0450] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
++[0450] 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 x.a.m.p. l.e.,.D.
+-[0460] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
++[0460] 43 00 3D 00 63 00 6F 00 6D 00 00 00 7A 00 00 00 C.=.c.o. m...z...
+-[0470] 7A 00 00 00 7A 00 00 00 00 00 00 00 00 00 00 00 z...z... ........
++[0470] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+-[04A0] 00 00 00 00 00 00 00 00 20 00 00 00 44 00 43 00 ........ ...D.C.
++[04A0] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+-[04B0] 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 =.s.a.m. b.a.2.0.
++[04B0] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+-[04C0] 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 0.8.r.2. ,.D.C.=.
++[04C0] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+-[04D0] 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 e.x.a.m. p.l.e.,.
++[04D0] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+-[04E0] 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 00 00 D.C.=.c. o.m.....
++[04E0] 3D 00 63 00 6F 00 6D 00 00 00 00 00 B0 00 00 00 =.c.o.m. ........
+-[04F0] B0 00 00 00 B0 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[04F0] B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+-[0500] 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 ........ ........
++[0500] 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+-[0520] 00 00 00 00 00 00 00 00 3B 00 00 00 43 00 4E 00 ........ ;...C.N.
++[0520] 00 00 00 00 3B 00 00 00 43 00 4E 00 3D 00 53 00 ....;... C.N.=.S.
+-[0530] 3D 00 53 00 63 00 68 00 65 00 6D 00 61 00 2C 00 =.S.c.h. e.m.a.,.
++[0530] 63 00 68 00 65 00 6D 00 61 00 2C 00 43 00 4E 00 c.h.e.m. a.,.C.N.
+-[0540] 43 00 4E 00 3D 00 43 00 6F 00 6E 00 66 00 69 00 C.N.=.C. o.n.f.i.
++[0540] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+-[0550] 67 00 75 00 72 00 61 00 74 00 69 00 6F 00 6E 00 g.u.r.a. t.i.o.n.
++[0550] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+-[0560] 2C 00 44 00 43 00 3D 00 73 00 61 00 6D 00 62 00 ,.D.C.=. s.a.m.b.
++[0560] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+-[0570] 61 00 32 00 30 00 30 00 38 00 72 00 32 00 2C 00 a.2.0.0. 8.r.2.,.
++[0570] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+-[0580] 44 00 43 00 3D 00 65 00 78 00 61 00 6D 00 70 00 D.C.=.e. x.a.m.p.
++[0580] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+-[0590] 6C 00 65 00 2C 00 44 00 43 00 3D 00 63 00 6F 00 l.e.,.D. C.=.c.o.
++[0590] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+-[05A0] 6D 00 00 00 03 00 00 00 9C 00 00 00 50 00 02 00 m....... ....P...
++[05A0] 03 00 00 00 9C 00 00 00 50 00 02 00 7A 00 00 00 ........ P...z...
+-[05B0] 7A 00 00 00 54 00 02 00 B0 00 00 00 58 00 02 00 z...T... ....X...
++[05B0] 54 00 02 00 B0 00 00 00 58 00 02 00 9C 00 00 00 T....... X.......
+-[05C0] 9C 00 00 00 9C 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[05C0] 9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+-[05F0] 00 00 00 00 00 00 00 00 31 00 00 00 43 00 4E 00 ........ 1...C.N.
++[05F0] 00 00 00 00 31 00 00 00 43 00 4E 00 3D 00 43 00 ....1... C.N.=.C.
+-[0600] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
++[0600] 6F 00 6E 00 66 00 69 00 67 00 75 00 72 00 61 00 o.n.f.i. g.u.r.a.
+-[0610] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
++[0610] 74 00 69 00 6F 00 6E 00 2C 00 44 00 43 00 3D 00 t.i.o.n. ,.D.C.=.
+-[0620] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
++[0620] 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 s.a.m.b. a.2.0.0.
+-[0630] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
++[0630] 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 8.r.2.,. D.C.=.e.
+-[0640] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
++[0640] 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 x.a.m.p. l.e.,.D.
+-[0650] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
++[0650] 43 00 3D 00 63 00 6F 00 6D 00 00 00 7A 00 00 00 C.=.c.o. m...z...
+-[0660] 7A 00 00 00 7A 00 00 00 00 00 00 00 00 00 00 00 z...z... ........
++[0660] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+-[0690] 00 00 00 00 00 00 00 00 20 00 00 00 44 00 43 00 ........ ...D.C.
++[0690] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+-[06A0] 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 =.s.a.m. b.a.2.0.
++[06A0] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+-[06B0] 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 0.8.r.2. ,.D.C.=.
++[06B0] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+-[06C0] 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 e.x.a.m. p.l.e.,.
++[06C0] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+-[06D0] 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 00 00 D.C.=.c. o.m.....
++[06D0] 3D 00 63 00 6F 00 6D 00 00 00 00 00 B0 00 00 00 =.c.o.m. ........
+-[06E0] B0 00 00 00 B0 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[06E0] B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+-[0710] 00 00 00 00 00 00 00 00 3B 00 00 00 43 00 4E 00 ........ ;...C.N.
++[0710] 00 00 00 00 3B 00 00 00 43 00 4E 00 3D 00 53 00 ....;... C.N.=.S.
+-[0720] 3D 00 53 00 63 00 68 00 64 00 6D 00 61 00 2C 00 =.S.c.h. d.m.a.,.
++[0720] 63 00 68 00 64 00 6D 00 61 00 2C 00 43 00 4E 00 c.h.d.m. a.,.C.N.
+-[0730] 43 00 4E 00 3D 00 43 00 6F 00 6E 00 66 00 69 00 C.N.=.C. o.n.f.i.
++[0730] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+-[0740] 67 00 75 00 72 00 61 00 74 00 69 00 6F 00 6E 00 g.u.r.a. t.i.o.n.
++[0740] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+-[0750] 2C 00 44 00 43 00 3D 00 73 00 61 00 6D 00 62 00 ,.D.C.=. s.a.m.b.
++[0750] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+-[0760] 61 00 32 00 30 00 30 00 38 00 72 00 32 00 2C 00 a.2.0.0. 8.r.2.,.
++[0760] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+-[0770] 44 00 43 00 3D 00 65 00 78 00 61 00 6D 00 70 00 D.C.=.e. x.a.m.p.
++[0770] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+-[0780] 6C 00 65 00 2C 00 44 00 43 00 3D 00 63 00 6F 00 l.e.,.D. C.=.c.o.
++[0780] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+-[0790] 6D 00 00 00 01 00 00 00 B0 00 00 00 5C 00 02 00 m....... ....\...
++[0790] 01 00 00 00 B0 00 00 00 5C 00 02 00 B0 00 00 00 ........ \.......
+-[07A0] B0 00 00 00 B0 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[07A0] B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+-[07C0] 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 ........ ........
++[07C0] 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 ........ ........
+-[07D0] 00 00 00 00 00 00 00 00 3B 00 00 00 43 00 4E 00 ........ ;...C.N.
++[07D0] 00 00 00 00 3B 00 00 00 43 00 4E 00 3D 00 53 00 ....;... C.N.=.S.
+-[07E0] 3D 00 53 00 63 00 68 00 65 00 6D 00 05 84 99 CD =.S.c.h. e.m.....
++[07E0] 63 00 68 00 65 00 6D 00 05 84 99 CD AE 00 4E FF c.h.e.m. ......N.
+-[07F0] AE 00 4E FF 3D 00 43 00 6F 00 6E 00 66 00 69 00 ..N.=.C. o.n.f.i.
++[07F0] 3D 00 43 00 6F 00 6E 00 66 00 69 00 67 00 75 00 =.C.o.n. f.i.g.u.
+-[0800] 67 00 75 00 72 00 61 00 74 00 69 00 6F 00 6E 00 g.u.r.a. t.i.o.n.
++[0800] 72 00 61 00 74 00 69 00 6F 00 6E 00 2C 00 44 00 r.a.t.i. o.n.,.D.
+-[0810] 2C 00 44 00 43 00 3D 00 73 00 61 00 6D 00 62 00 ,.D.C.=. s.a.m.b.
++[0810] 43 00 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 C.=.s.a. m.b.a.2.
+-[0820] 61 00 32 00 30 00 30 00 38 00 72 00 32 00 2C 00 a.2.0.0. 8.r.2.,.
++[0820] 30 00 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 0.0.8.r. 2.,.D.C.
+-[0830] 44 00 43 00 3D 00 65 00 78 00 61 00 6D 00 70 00 D.C.=.e. x.a.m.p.
++[0830] 3D 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 =.e.x.a. m.p.l.e.
+-[0840] 6C 00 65 00 2C 00 44 00 43 00 3D 00 63 00 6F 00 l.e.,.D. C.=.c.o.
++[0840] 2C 00 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 ,.D.C.=. c.o.m...
+-[0850] 6D 00 00 00 01 00 00 00 7A 00 00 00 60 00 02 00 m....... z...`...
++[0850] 01 00 00 00 7A 00 00 00 60 00 02 00 7A 00 00 00 ....z... `...z...
+-[0860] 7A 00 00 00 7A 00 00 00 00 00 00 00 00 00 00 00 z...z... ........
++[0860] 7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 z....... ........
+skipping zero buffer bytes
+-[0890] 00 00 00 00 00 00 00 00 20 00 00 00 44 00 43 00 ........ ...D.C.
++[0890] 00 00 00 00 20 00 00 00 44 00 43 00 3D 00 73 00 .... ... D.C.=.s.
+-[08A0] 3D 00 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 =.s.a.m. b.a.2.0.
++[08A0] 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 a.m.b.a. 2.0.0.8.
+-[08B0] 30 00 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 0.8.r.2. ,.D.C.=.
++[08B0] 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 r.2.,.D. C.=.e.x.
+-[08C0] 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 e.x.a.m. p.l.e.,.
++[08C0] 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 a.m.p.l. e.,.D.C.
+-[08D0] 44 00 43 00 3D 00 63 00 6F 00 6D 00 00 00 00 00 D.C.=.c. o.m.....
++[08D0] 3D 00 63 00 6F 00 6D 00 00 00 00 00 01 00 00 00 =.c.o.m. ........
+-[08E0] 01 00 00 00 04 00 00 00 64 00 02 00 04 00 00 00 ........ d.......
++[08E0] 04 00 00 00 64 00 02 00 04 00 00 00 04 00 00 00 ....d... ........
+-[08F0] 04 00 00 00 01 00 00 00 04 00 00 00 68 00 02 00 ........ ....h...
++[08F0] 01 00 00 00 04 00 00 00 68 00 02 00 04 00 00 00 ........ h.......
+-[0900] 04 00 00 00 00 00 00 02 01 00 00 00 B4 00 00 00 ........ ........
++[0900] 00 00 00 02 01 00 00 00 B4 00 00 00 6C 00 02 00 ........ ....l...
+-[0910] 6C 00 02 00 B4 00 00 00 B4 00 00 00 00 00 00 00 l....... ........
++[0910] B4 00 00 00 B4 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+-[0920] 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 ........ ........
++[0920] 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+-[0940] 00 00 00 00 00 00 00 00 00 00 00 00 3D 00 00 00 ........ ....=...
++[0940] 00 00 00 00 00 00 00 00 3D 00 00 00 43 00 4E 00 ........ =...C.N.
+-[0950] 43 00 4E 00 3D 00 73 00 6D 00 62 00 74 00 6F 00 C.N.=.s. m.b.t.o.
++[0950] 3D 00 73 00 6D 00 62 00 74 00 6F 00 72 00 74 00 =.s.m.b. t.o.r.t.
+-[0960] 72 00 74 00 75 00 72 00 65 00 64 00 63 00 2C 00 r.t.u.r. e.d.c.,.
++[0960] 75 00 72 00 65 00 64 00 63 00 2C 00 43 00 4E 00 u.r.e.d. c.,.C.N.
+-[0970] 43 00 4E 00 3D 00 43 00 6F 00 6D 00 70 00 75 00 C.N.=.C. o.m.p.u.
++[0970] 3D 00 43 00 6F 00 6D 00 70 00 75 00 74 00 65 00 =.C.o.m. p.u.t.e.
+-[0980] 74 00 65 00 72 00 73 00 2C 00 44 00 43 00 3D 00 t.e.r.s. ,.D.C.=.
++[0980] 72 00 73 00 2C 00 44 00 43 00 3D 00 73 00 61 00 r.s.,.D. C.=.s.a.
+-[0990] 73 00 61 00 6D 00 62 00 61 00 32 00 30 00 30 00 s.a.m.b. a.2.0.0.
++[0990] 6D 00 62 00 61 00 32 00 30 00 30 00 38 00 72 00 m.b.a.2. 0.0.8.r.
+-[09A0] 38 00 72 00 32 00 2C 00 44 00 43 00 3D 00 65 00 8.r.2.,. D.C.=.e.
++[09A0] 32 00 2C 00 44 00 43 00 3D 00 65 00 78 00 61 00 2.,.D.C. =.e.x.a.
+-[09B0] 78 00 61 00 6D 00 70 00 6C 00 65 00 2C 00 44 00 x.a.m.p. l.e.,.D.
++[09B0] 6D 00 70 00 6C 00 65 00 2C 00 44 00 43 00 3D 00 m.p.l.e. ,.D.C.=.
+-[09C0] 43 00 3D 00 63 00 6F 00 6D 00 EB 00 01 3D 01 B1 C.=.c.o. m....=..
++[09C0] 63 00 6F 00 6D 00 EB 00 c.o.m...
+-[09D0] 01 69 3B 12 8D ED 27 92 69 1B 4B 71 67 85 6D 05 .i;...'. i.Kqg.m.
++[09D0] EMPTY BLOCK
+-[09E0] 44 5A 6A 6D AA 16 29 37 49 40 CD F5 06 AF 76 91 DZjm..)7 I@....v.
++[09E0] EMPTY BLOCK
+-[09F0] 48 90 24 38 81 8A A2 70 0E 57 68 H.$8...p .Wh
++[09F0] EMPTY BLOCK
+dump OK
diff --git a/source4/librpc/tests/fuzzed_drsuapi_DsGetNCChanges.txt b/source4/librpc/tests/fuzzed_drsuapi_DsGetNCChanges.txt
new file mode 100644
index 0000000..1e26364
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_drsuapi_DsGetNCChanges.txt
@@ -0,0 +1,76 @@
+pull returned Success
+WARNING! 4 unread bytes
+[0000] 00 00 00 00 ....
+ drsuapi_DsGetNCChanges: struct drsuapi_DsGetNCChanges
+ out: struct drsuapi_DsGetNCChanges
+ level_out : *
+ level_out : 0x00000001 (1)
+ ctr : *
+ ctr : union drsuapi_DsGetNCChangesCtr(case 1)
+ ctr1: struct drsuapi_DsGetNCChangesCtr1
+ source_dsa_guid : 00aa0006-0000-0006-aa06-000300010000
+ source_dsa_invocation_id : 13000600-0000-0000-0000-0000ff000000
+ naming_context : NULL
+ old_highwatermark: struct drsuapi_DsReplicaHighWaterMark
+ tmp_highest_usn : 0x0000000000000000 (0)
+ reserved_usn : 0x005b000000000000 (25614222880669696)
+ highest_usn : 0x0000000000000000 (0)
+ new_highwatermark: struct drsuapi_DsReplicaHighWaterMark
+ tmp_highest_usn : 0x0000010000110900 (1099512744192)
+ reserved_usn : 0x0000000000000100 (256)
+ highest_usn : 0x0000000000000000 (0)
+ uptodateness_vector : NULL
+ mapping_ctr: struct drsuapi_DsReplicaOIDMapping_Ctr
+ num_mappings : 0x00000000 (0)
+ mappings : NULL
+ extended_ret : UNKNOWN_ENUM_VALUE (0xF900)
+ object_count : 0x00000000 (0)
+ __ndr_size : 0xf8000001 (4160749569)
+ first_object : *
+ first_object: struct drsuapi_DsReplicaObjectListItemEx
+ next_object : *
+ object: struct drsuapi_DsReplicaObject
+ identifier : NULL
+ flags : 0x3f000000 (1056964608)
+ 0: DRSUAPI_DS_REPLICA_OBJECT_FROM_MASTER
+ 0: DRSUAPI_DS_REPLICA_OBJECT_DYNAMIC
+ 0: DRSUAPI_DS_REPLICA_OBJECT_REMOTE_MODIFY
+ attribute_ctr: struct drsuapi_DsReplicaAttributeCtr
+ num_attributes : 0x00000000 (0)
+ attributes : NULL
+ is_nc_prefix : 0x00000000 (0)
+ parent_object_guid : NULL
+ meta_data_ctr : *
+ meta_data_ctr: struct drsuapi_DsReplicaMetaDataCtr
+ count : 0x00000000 (0)
+ meta_data: ARRAY(0)
+ next_object: struct drsuapi_DsReplicaObjectListItemEx
+ next_object : NULL
+ object: struct drsuapi_DsReplicaObject
+ identifier : NULL
+ flags : 0x00100006 (1048582)
+ 0: DRSUAPI_DS_REPLICA_OBJECT_FROM_MASTER
+ 1: DRSUAPI_DS_REPLICA_OBJECT_DYNAMIC
+ 0: DRSUAPI_DS_REPLICA_OBJECT_REMOTE_MODIFY
+ attribute_ctr: struct drsuapi_DsReplicaAttributeCtr
+ num_attributes : 0x00000001 (1)
+ attributes : *
+ attributes: ARRAY(1)
+ attributes: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_cn (0x3)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ string : 'NULL'
+ is_nc_prefix : 0x00000001 (1)
+ parent_object_guid : *
+ parent_object_guid : 00100006-0001-0008-0100-000000000000
+ meta_data_ctr : *
+ meta_data_ctr: struct drsuapi_DsReplicaMetaDataCtr
+ count : 0x00000000 (0)
+ meta_data: ARRAY(0)
+ more_data : 0x00000000 (0)
+ result : DOS code 0x00000100
+dump OK
diff --git a/source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.b64.txt b/source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.b64.txt
new file mode 100644
index 0000000..783d063
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.b64.txt
@@ -0,0 +1 @@
+AAAAAAEAAAABAACAAQAAAAEAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.txt b/source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.txt
new file mode 100644
index 0000000..f32efee
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_drsuapi_DsReplicaAttribute.txt
@@ -0,0 +1,60 @@
+pull returned Success
+WARNING! 179 unread bytes
+[0000] 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+[0040] 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 ........ .@......
+skipping zero buffer bytes
+[0060] 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@.... ........
+skipping zero buffer bytes
+[0080] 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@.... ........
+[0090] 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 ........ .....@..
+skipping zero buffer bytes
+[00B0] 00 00 00 ...
+ drsuapi_DsReplicaAttribute: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_objectClass (0x0)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ attid : 'NULL'
+push returned Success
+pull returned Success
+ drsuapi_DsReplicaAttribute: struct drsuapi_DsReplicaAttribute
+ attid : DRSUAPI_ATTID_objectClass (0x0)
+ value_ctr: struct drsuapi_DsAttributeValueCtr
+ num_values : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values: struct drsuapi_DsAttributeValue
+ attid : 'NULL'
+WARNING! orig bytes:203 validated pushed bytes:24
+WARNING! orig and validated differ at byte 0x08 (8)
+WARNING! orig byte[0x08] = 0x01 validated byte[0x08] = 0x00
+-[0000] 00 00 00 00 01 00 00 00 01 00 00 80 01 00 00 00 ........ ........
++[0000] 00 00 00 00 01 00 00 00 00 00 02 00 01 00 00 00 ........ ........
+-[0010] 01 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 ........ ........
++[0010] 00 00 00 00 00 00 00 00 ........
+-[0020] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[0020] EMPTY BLOCK
+-[0030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[0030] EMPTY BLOCK
+-[0040] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[0040] EMPTY BLOCK
+-[0050] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[0050] EMPTY BLOCK
+-[0060] 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .@...... ........
++[0060] EMPTY BLOCK
+-[0070] 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 ........ ...@....
++[0070] EMPTY BLOCK
+-[0080] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[0080] EMPTY BLOCK
+-[0090] 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 ........ ...@....
++[0090] EMPTY BLOCK
+-[00A0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
++[00A0] EMPTY BLOCK
+-[00B0] 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 .....@.. ........
++[00B0] EMPTY BLOCK
+-[00C0] 00 00 00 00 00 00 00 00 00 00 00 ........ ...
++[00C0] EMPTY BLOCK
+dump OK
diff --git a/source4/librpc/tests/fuzzed_drsuapi_DsaAddressListItem_V1-in.b64.txt b/source4/librpc/tests/fuzzed_drsuapi_DsaAddressListItem_V1-in.b64.txt
new file mode 100755
index 0000000..7d9f6f2
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_drsuapi_DsaAddressListItem_V1-in.b64.txt
@@ -0,0 +1 @@
+AwAAAAMAAAAAAAAAAQAAAAYAFQABAAAAAAAVAAEAAAAGAAAVAwAAAAMAAAADAAAAAP4AAAMQP3uHAAAAAQAAAAYAFQABAAAAAQAVAAEAAAAGAAAVAwAAAAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYUxhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYU6hYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYUAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhTqFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwM/QwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/T09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAkAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDFZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7YAAAAAAAAAB7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYX//////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAD///////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT0/wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3s2ACwse3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAA/////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAP///////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT/AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ezYALCx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAD/////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3ure3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP////////////////////////////////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3ure3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAP///////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT/AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ezYALCx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9P///////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYUAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhTqFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/T09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAkAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDFZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7YAAAAAAAAAB7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYX//////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAD///////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT0/wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3s2ACwse3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAA/////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF//////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAA////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09P8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7NgAsLHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAP////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAkAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDFZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7YAAAAAAAAAB7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYX//////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAD///////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT0/wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3s2ACwse3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAA/////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e417e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAkAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDFZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7YAAAAAAAAAB7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7q3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYX//////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD/////////////////////////////////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAkAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDFZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7YAAAAAAAAAB7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7q3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYX//////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAD///////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT0/wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3s2ACwse3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT///////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////39PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYU6hYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX///////8N/////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF//////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAA////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09P8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7NgAsLHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAP////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDCEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF//////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAA////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09P8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7NwAsLHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAP////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhTqFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/T09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhQAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFOoWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAz9DAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////39PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAP///////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT/AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ezYALCx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAD/////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF//////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAA////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09P8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7NgAsLHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAP////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e6t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF//////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw/////////////////////////////////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAkAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDFZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7YAAAAAAAAAB7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e6t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF//////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAA////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09P8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7NgAsLHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX0////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/T09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhQAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFOoWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////39PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAP///////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT/AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ezYALCx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAD/////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAkAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDFZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7YAAAAAAAAAB7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYX//////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAD///////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT0/wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3s2ACwse3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAA/////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAP///////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT/AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ezYALCx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAD/////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7jXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3ure3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP////////////////////////////////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAJAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAxWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e2AAAAAAAAAAe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL///9RAAAA///3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////AAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF//////////////////////////////8MDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f///////3/DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf//////////////////////////////DAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAACQAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3tgAAAAAAAAAHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////UQAAAP//9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3ure3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhf//////////////////////////Av///1EAAAD///f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlVVVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFAAYAAACFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIFhYX///////////////8UAAZV/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9/////////8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAP///////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT/AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ezYALCx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9P///////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3///////9/wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYUAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////wAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhTqFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3////////ARz//////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////8AAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX/////////////l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eX////////////////////////////////////////////Av////////////f/////////////////cHBwcHBwcP//////////cHBw////////////////////////////////////////////AAYAFQD0AQAAAAEAFQABAAD+BfT09PT0W/T09PT09PT09PT09PT09PT09PT09PT09PT09AAAAAAAAQAAAAYAFQD0AQAAAAEAFQABAAD+BfT09PT09PT09PT/hYWFVlV+VVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFe3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7hYWFggWFhf///////////////xQABlX///8GAAMAAgAAAAIAAAAGAAMAJgAA/////////////////////////////////////wL////////////3/////////wwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM////////cHBwcHBwcP+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYKFhYX//////////////////////////////wwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVX5VVVVVVVOFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYUMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////+Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5f///////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYWFhYWFhYWFhYWFp4WFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////////////////////8C////////////9////////f8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD/hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFp4UMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWChYWF/////////////5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl////////////////////////////////////////////wL////////////3/////////////////3BwcHBwcHD//////////3BwcP///////////////////////////////////////////wAGABUA9AEAAAABABUAAQAA/gX09PT09Fv09PT09PT09PT09PT09PT09PT09PT09PT09PQAAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVflVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e4WFhYIFhYX///////////////8UAAZV////BgADAAIAAAACAAAABgADACYAAP////////////////////8AAAAAAAEAAAAGABUA9AEAAAABABUAAQAA/gX09PT09PT09PT0/4WFhVZVVVVVVVVThYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhQAGAAAAhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCBYWF////////////////FAAGVf+FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3uFhYWCBYWF////////////////FAAGVf///wYAAwACAAAAAgAAAAYAAwAmAAD/////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz///////9wcHBwcHBw/4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgoWFhf////////////////////////////////////////////////////////8C////////////9/////////////////9wcHBwcHBw//////////9wcHD///////////////////////////////////////////8ABgAVAPQBAAAAAQAVAAEAAP4F9PT09PRb9PT09PT09PT09PT09PT09PT09PT09PT09PT0AAAAAAABAAAABgAVAPQBAAAAAQAVAAEAAP4F9PT09PT09PT09P+FhYVWVVVVVVVVU4WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWnhYWFhYWFhYUABgAAAIWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggWFhf///////////////xQABlX/////////////////////////////////////////Av////////////f/////////DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP///////3BwcHBwcHD//////////3BwcP//////////////AED/////////////////////////////9P//////9ABUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVAAAAABUVFRUVFRUVFRUVFRUVFRUVFRUVAIAAAAAAAAAdAAAAAAAAPT//////////////3BwcP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////T///////QAAgAAAAAAAAAAAAB0AAAAAAAA9P//////9AACAAAAAAAAAHQAAAAAAAD09PT09PT09Pss9PT09PT09AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQf///6qqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAA= --ndr64
diff --git a/source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.b64.txt b/source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.b64.txt
new file mode 100644
index 0000000..0a10ab0
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.b64.txt
@@ -0,0 +1 @@
+AA4AAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAzOQAAAAAAAAABAAAAAAAAAAD//gAAAAAAAAAABDMyMTUyMTE1MDI2MzE0Njg3/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+5+T2dekB8vfW3brf3WrDRDczOQAAAAA=
diff --git a/source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.txt b/source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.txt
new file mode 100644
index 0000000..7ce507c
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_ntlmssp-AUTHENTICATE_MESSAGE.txt
@@ -0,0 +1,167 @@
+pull returned Success
+WARNING! 188 unread bytes
+[0000] 04 33 32 31 35 32 31 31 35 30 32 36 33 31 34 36 .3215211 50263146
+[0010] 38 37 FE FE FE FE FE FE FE FE FE FE FE FE FE FE 87...... ........
+[0020] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[0030] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[0040] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[0050] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[0060] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[0070] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[0080] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[0090] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
+[00A0] FE FE FE FE FE E7 E4 F6 75 E9 01 F2 F7 D6 DD BA ........ u.......
+[00B0] DF DD 6A C3 44 37 33 39 00 00 00 00 ..j.D739 ....
+ AUTHENTICATE_MESSAGE: struct AUTHENTICATE_MESSAGE
+ Signature : ''
+ MessageType : UNKNOWN_ENUM_VALUE (0)
+ LmChallengeResponseLen : 0x0000 (0)
+ LmChallengeResponseMaxLen: 0x0000 (0)
+ LmChallengeResponse : NULL
+ NtChallengeResponseLen : 0x0000 (0)
+ NtChallengeResponseMaxLen: 0x0000 (0)
+ NtChallengeResponse : NULL
+ DomainNameLen : 0x0000 (0)
+ DomainNameMaxLen : 0x0000 (0)
+ DomainName : NULL
+ UserNameLen : 0x0000 (0)
+ UserNameMaxLen : 0x0001 (1)
+ UserName : NULL
+ WorkstationLen : 0x3933 (14643)
+ WorkstationMaxLen : 0x0000 (0)
+ Workstation : NULL
+ EncryptedRandomSessionKeyLen: 0x0100 (256)
+ EncryptedRandomSessionKeyMaxLen: 0x0000 (0)
+ EncryptedRandomSessionKey: NULL
+ NegotiateFlags : 0xfeff0000 (4278124544)
+ 0: NTLMSSP_NEGOTIATE_UNICODE
+ 0: NTLMSSP_NEGOTIATE_OEM
+ 0: NTLMSSP_REQUEST_TARGET
+ 0: NTLMSSP_NEGOTIATE_SIGN
+ 0: NTLMSSP_NEGOTIATE_SEAL
+ 0: NTLMSSP_NEGOTIATE_DATAGRAM
+ 0: NTLMSSP_NEGOTIATE_LM_KEY
+ 0: NTLMSSP_NEGOTIATE_NETWARE
+ 0: NTLMSSP_NEGOTIATE_NTLM
+ 0: NTLMSSP_NEGOTIATE_NT_ONLY
+ 0: NTLMSSP_ANONYMOUS
+ 0: NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL
+ 0: NTLMSSP_NEGOTIATE_ALWAYS_SIGN
+ 1: NTLMSSP_TARGET_TYPE_DOMAIN
+ 1: NTLMSSP_TARGET_TYPE_SERVER
+ 1: NTLMSSP_TARGET_TYPE_SHARE
+ 1: NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+ 1: NTLMSSP_NEGOTIATE_IDENTIFY
+ 1: NTLMSSP_REQUEST_NON_NT_SESSION_KEY
+ 1: NTLMSSP_NEGOTIATE_TARGET_INFO
+ 1: NTLMSSP_NEGOTIATE_VERSION
+ 1: NTLMSSP_NEGOTIATE_128
+ 1: NTLMSSP_NEGOTIATE_KEY_EXCH
+ 1: NTLMSSP_NEGOTIATE_56
+ Version: struct ntlmssp_VERSION
+ ProductMajorVersion : UNKNOWN_ENUM_VALUE (0)
+ ProductMinorVersion : NTLMSSP_WINDOWS_MINOR_VERSION_0 (0)
+ ProductBuild : 0x0000 (0)
+ Reserved: ARRAY(3)
+ [0] : 0x00 (0)
+ [1] : 0x00 (0)
+ [2] : 0x00 (0)
+ NTLMRevisionCurrent : UNKNOWN_ENUM_VALUE (0)
+push returned Success
+pull returned Success
+ AUTHENTICATE_MESSAGE: struct AUTHENTICATE_MESSAGE
+ Signature : 'NTLMSSP'
+ MessageType : NtLmAuthenticate (3)
+ LmChallengeResponseLen : 0x0000 (0)
+ LmChallengeResponseMaxLen: 0x0000 (0)
+ LmChallengeResponse : NULL
+ NtChallengeResponseLen : 0x0000 (0)
+ NtChallengeResponseMaxLen: 0x0000 (0)
+ NtChallengeResponse : NULL
+ DomainNameLen : 0x0000 (0)
+ DomainNameMaxLen : 0x0000 (0)
+ DomainName : NULL
+ UserNameLen : 0x0000 (0)
+ UserNameMaxLen : 0x0000 (0)
+ UserName : NULL
+ WorkstationLen : 0x0000 (0)
+ WorkstationMaxLen : 0x0000 (0)
+ Workstation : NULL
+ EncryptedRandomSessionKeyLen: 0x0000 (0)
+ EncryptedRandomSessionKeyMaxLen: 0x0000 (0)
+ EncryptedRandomSessionKey: NULL
+ NegotiateFlags : 0xfeff0000 (4278124544)
+ 0: NTLMSSP_NEGOTIATE_UNICODE
+ 0: NTLMSSP_NEGOTIATE_OEM
+ 0: NTLMSSP_REQUEST_TARGET
+ 0: NTLMSSP_NEGOTIATE_SIGN
+ 0: NTLMSSP_NEGOTIATE_SEAL
+ 0: NTLMSSP_NEGOTIATE_DATAGRAM
+ 0: NTLMSSP_NEGOTIATE_LM_KEY
+ 0: NTLMSSP_NEGOTIATE_NETWARE
+ 0: NTLMSSP_NEGOTIATE_NTLM
+ 0: NTLMSSP_NEGOTIATE_NT_ONLY
+ 0: NTLMSSP_ANONYMOUS
+ 0: NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL
+ 0: NTLMSSP_NEGOTIATE_ALWAYS_SIGN
+ 1: NTLMSSP_TARGET_TYPE_DOMAIN
+ 1: NTLMSSP_TARGET_TYPE_SERVER
+ 1: NTLMSSP_TARGET_TYPE_SHARE
+ 1: NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+ 1: NTLMSSP_NEGOTIATE_IDENTIFY
+ 1: NTLMSSP_REQUEST_NON_NT_SESSION_KEY
+ 1: NTLMSSP_NEGOTIATE_TARGET_INFO
+ 1: NTLMSSP_NEGOTIATE_VERSION
+ 1: NTLMSSP_NEGOTIATE_128
+ 1: NTLMSSP_NEGOTIATE_KEY_EXCH
+ 1: NTLMSSP_NEGOTIATE_56
+ Version: struct ntlmssp_VERSION
+ ProductMajorVersion : UNKNOWN_ENUM_VALUE (0)
+ ProductMinorVersion : NTLMSSP_WINDOWS_MINOR_VERSION_0 (0)
+ ProductBuild : 0x0000 (0)
+ Reserved: ARRAY(3)
+ [0] : 0x00 (0)
+ [1] : 0x00 (0)
+ [2] : 0x00 (0)
+ NTLMRevisionCurrent : UNKNOWN_ENUM_VALUE (0)
+WARNING! orig bytes:260 validated pushed bytes:72
+WARNING! orig and validated differ at byte 0x00 (0)
+WARNING! orig byte[0x00] = 0x00 validated byte[0x00] = 0x4E
+-[0000] 00 0E 00 00 00 00 04 00 00 00 00 00 00 00 00 00 ........ ........
++[0000] 4E 54 4C 4D 53 53 50 00 03 00 00 00 00 00 00 00 NTLMSSP. ........
+skipping zero buffer bytes
+-[0020] 00 00 00 00 00 00 01 00 00 00 00 00 33 39 00 00 ........ ....39..
++[0020] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+-[0030] 00 00 00 00 00 01 00 00 00 00 00 00 00 00 FF FE ........ ........
++[0030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FE ........ ........
+-[0040] 00 00 00 00 00 00 00 00 04 33 32 31 35 32 31 31 ........ .3215211
++[0040] 00 00 00 00 00 00 00 00 ........
+-[0050] 35 30 32 36 33 31 34 36 38 37 FE FE FE FE FE FE 50263146 87......
++[0050] EMPTY BLOCK
+-[0060] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[0060] EMPTY BLOCK
+-[0070] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[0070] EMPTY BLOCK
+-[0080] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[0080] EMPTY BLOCK
+-[0090] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[0090] EMPTY BLOCK
+-[00A0] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[00A0] EMPTY BLOCK
+-[00B0] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[00B0] EMPTY BLOCK
+-[00C0] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[00C0] EMPTY BLOCK
+-[00D0] FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ........ ........
++[00D0] EMPTY BLOCK
+-[00E0] FE FE FE FE FE FE FE FE FE FE FE FE FE E7 E4 F6 ........ ........
++[00E0] EMPTY BLOCK
+-[00F0] 75 E9 01 F2 F7 D6 DD BA DF DD 6A C3 44 37 33 39 u....... ..j.D739
++[00F0] EMPTY BLOCK
+-[0100] 00 00 00 00 ....
++[0100] EMPTY BLOCK
+dump OK
diff --git a/source4/librpc/tests/fuzzed_ntlmssp-CHALLENGE_MESSAGE.txt b/source4/librpc/tests/fuzzed_ntlmssp-CHALLENGE_MESSAGE.txt
new file mode 100644
index 0000000..450c653
--- /dev/null
+++ b/source4/librpc/tests/fuzzed_ntlmssp-CHALLENGE_MESSAGE.txt
@@ -0,0 +1,89 @@
+pull returned Success
+ CHALLENGE_MESSAGE: struct CHALLENGE_MESSAGE
+ Signature : ''
+ MessageType : UNKNOWN_ENUM_VALUE (0x22700)
+ TargetNameLen : 0x0000 (0)
+ TargetNameMaxLen : 0x0000 (0)
+ TargetName : *
+ TargetName : ''
+ NegotiateFlags : 0x00000000 (0)
+ 0: NTLMSSP_NEGOTIATE_UNICODE
+ 0: NTLMSSP_NEGOTIATE_OEM
+ 0: NTLMSSP_REQUEST_TARGET
+ 0: NTLMSSP_NEGOTIATE_SIGN
+ 0: NTLMSSP_NEGOTIATE_SEAL
+ 0: NTLMSSP_NEGOTIATE_DATAGRAM
+ 0: NTLMSSP_NEGOTIATE_LM_KEY
+ 0: NTLMSSP_NEGOTIATE_NETWARE
+ 0: NTLMSSP_NEGOTIATE_NTLM
+ 0: NTLMSSP_NEGOTIATE_NT_ONLY
+ 0: NTLMSSP_ANONYMOUS
+ 0: NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL
+ 0: NTLMSSP_NEGOTIATE_ALWAYS_SIGN
+ 0: NTLMSSP_TARGET_TYPE_DOMAIN
+ 0: NTLMSSP_TARGET_TYPE_SERVER
+ 0: NTLMSSP_TARGET_TYPE_SHARE
+ 0: NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+ 0: NTLMSSP_NEGOTIATE_IDENTIFY
+ 0: NTLMSSP_REQUEST_NON_NT_SESSION_KEY
+ 0: NTLMSSP_NEGOTIATE_TARGET_INFO
+ 0: NTLMSSP_NEGOTIATE_VERSION
+ 0: NTLMSSP_NEGOTIATE_128
+ 0: NTLMSSP_NEGOTIATE_KEY_EXCH
+ 0: NTLMSSP_NEGOTIATE_56
+ ServerChallenge : 00801b846f2eca4f
+ Reserved : 5d00bd26404ef730
+ TargetInfoLen : 0x0000 (0)
+ TargetInfoMaxLen : 0x0000 (0)
+ TargetInfo : NULL
+push returned Success
+pull returned Success
+ CHALLENGE_MESSAGE: struct CHALLENGE_MESSAGE
+ Signature : 'NTLMSSP'
+ MessageType : NtLmChallenge (0x2)
+ TargetNameLen : 0x0000 (0)
+ TargetNameMaxLen : 0x0000 (0)
+ TargetName : *
+ TargetName : ''
+ NegotiateFlags : 0x00000000 (0)
+ 0: NTLMSSP_NEGOTIATE_UNICODE
+ 0: NTLMSSP_NEGOTIATE_OEM
+ 0: NTLMSSP_REQUEST_TARGET
+ 0: NTLMSSP_NEGOTIATE_SIGN
+ 0: NTLMSSP_NEGOTIATE_SEAL
+ 0: NTLMSSP_NEGOTIATE_DATAGRAM
+ 0: NTLMSSP_NEGOTIATE_LM_KEY
+ 0: NTLMSSP_NEGOTIATE_NETWARE
+ 0: NTLMSSP_NEGOTIATE_NTLM
+ 0: NTLMSSP_NEGOTIATE_NT_ONLY
+ 0: NTLMSSP_ANONYMOUS
+ 0: NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
+ 0: NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL
+ 0: NTLMSSP_NEGOTIATE_ALWAYS_SIGN
+ 0: NTLMSSP_TARGET_TYPE_DOMAIN
+ 0: NTLMSSP_TARGET_TYPE_SERVER
+ 0: NTLMSSP_TARGET_TYPE_SHARE
+ 0: NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+ 0: NTLMSSP_NEGOTIATE_IDENTIFY
+ 0: NTLMSSP_REQUEST_NON_NT_SESSION_KEY
+ 0: NTLMSSP_NEGOTIATE_TARGET_INFO
+ 0: NTLMSSP_NEGOTIATE_VERSION
+ 0: NTLMSSP_NEGOTIATE_128
+ 0: NTLMSSP_NEGOTIATE_KEY_EXCH
+ 0: NTLMSSP_NEGOTIATE_56
+ ServerChallenge : 00801b846f2eca4f
+ Reserved : 5d00bd26404ef730
+ TargetInfoLen : 0x0000 (0)
+ TargetInfoMaxLen : 0x0000 (0)
+ TargetInfo : NULL
+WARNING! orig and validated differ at byte 0x00 (0)
+WARNING! orig byte[0x00] = 0x00 validated byte[0x00] = 0x4E
+-[0000] 00 00 00 0B 02 00 00 00 00 27 02 00 00 00 00 00 ........ .'......
++[0000] 4E 54 4C 4D 53 53 50 00 02 00 00 00 00 00 00 00 NTLMSSP. ........
+-[0010] 07 00 00 00 00 00 00 00 00 80 1B 84 6F 2E CA 4F ........ ....o..O
++[0010] 30 00 00 00 00 00 00 00 00 80 1B 84 6F 2E CA 4F 0....... ....o..O
+ [0020] 5D 00 BD 26 40 4E F7 30 00 00 00 00 00 00 00 00 ]..&@N.0 ........
+dump OK
diff --git a/source4/librpc/tests/gmsa_MANAGEDPASSWORD_BLOB.txt b/source4/librpc/tests/gmsa_MANAGEDPASSWORD_BLOB.txt
new file mode 100644
index 0000000..b77d0e3
--- /dev/null
+++ b/source4/librpc/tests/gmsa_MANAGEDPASSWORD_BLOB.txt
@@ -0,0 +1,28 @@
+pull returned Success
+ MANAGEDPASSWORD_BLOB: struct MANAGEDPASSWORD_BLOB
+ version : 0x0001 (1)
+ reserved : 0x0000 (0)
+ length : 0x00000122 (290)
+ passwords: struct MANAGEDPASSWORD_BLOB_PASSWORDS
+ current : *
+ current: ARRAY(256): <REDACTED SECRET VALUES>
+ previous : NULL
+ query_interval : *
+ query_interval : 0x0000178069019574 (25840284964212)
+ unchanged_interval : *
+ unchanged_interval : 0x0000177fb6313774 (25837284964212)
+push returned Success
+pull returned Success
+ MANAGEDPASSWORD_BLOB: struct MANAGEDPASSWORD_BLOB
+ version : 0x0001 (1)
+ reserved : 0x0000 (0)
+ length : 0x00000122 (290)
+ passwords: struct MANAGEDPASSWORD_BLOB_PASSWORDS
+ current : *
+ current: ARRAY(256): <REDACTED SECRET VALUES>
+ previous : NULL
+ query_interval : *
+ query_interval : 0x0000178069019574 (25840284964212)
+ unchanged_interval : *
+ unchanged_interval : 0x0000177fb6313774 (25837284964212)
+dump OK
diff --git a/source4/librpc/tests/krb5pac-PAC_DATA.dat b/source4/librpc/tests/krb5pac-PAC_DATA.dat
new file mode 100644
index 0000000..71b48d9
--- /dev/null
+++ b/source4/librpc/tests/krb5pac-PAC_DATA.dat
Binary files differ
diff --git a/source4/librpc/tests/krb5pac_upn_dns_info_ex.b64.txt b/source4/librpc/tests/krb5pac_upn_dns_info_ex.b64.txt
new file mode 100644
index 0000000..02b5706
--- /dev/null
+++ b/source4/librpc/tests/krb5pac_upn_dns_info_ex.b64.txt
@@ -0,0 +1 @@
+BgAAAAAAAAABAAAA0AEAAGgAAAAAAAAACgAAABwAAAA4AgAAAAAAAAwAAACoAAAAWAIAAAAAAAAGAAAAFAAAAAADAAAAAAAABwAAABAAAAAYAwAAAAAAABAAAAAQAAAAKAMAAAAAAAABEAgAzMzMzMABAAAAAAAAAAACAAAAAAAAAAAA/////////3//////////f7pMcCzXv9cBugzaVqDA1wG6zMkh2ODXARIAEgAEAAIAAAAAAAgAAgAAAAAADAACAAAAAAAQAAIAAAAAABQAAgAAAAAAGAACAAAAAACOBAAAAQIAAAEAAAAcAAIAIAAAAAAAAAAAAAAAAAAAAAAAAAAOABAAIAACABYAGAAkAAIAKAACAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAALAACAAAAAAAAAAAAAAAAAAkAAAAAAAAACQAAAHQAcwB0AHQAawB0AHUAcwByAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAECAAAHAAAACAAAAAAAAAAHAAAATABPAEMAQQBMAEQAQwAAAAwAAAAAAAAACwAAAFMAQQBNAEIAQQBEAE8ATQBBAEkATgAAAAQAAAABBAAAAAAABRUAAAC2fvX0wDGiOufKt1QBAAAAMAACAAcAAAABAAAAAQEAAAAAABIBAAAAAAAAAIC3ISzXv9cBEgB0AHMAdAB0AGsAdAB1AHMAcgAAAAAANgAYACIAUAADAAAAEgB4ABwAigAAAAAAdABzAHQAdABrAHQAdQBzAHIAQABzAGEAbQBiAGEALgBlAHgAYQBtAHAAbABlAC4AYwBvAG0AAABTAEEATQBCAEEALgBFAFgAQQBNAFAATABFAC4AQwBPAE0AAAAAAAAAdABzAHQAdABrAHQAdQBzAHIAAQUAAAAAAAUVAAAAtn719MAxojrnyrdUjgQAAAAAdv///ys5aox2KdqNY8CVVxkQbs4AAAAAEAAAAFrUeP0b8Pbct0VlVhAAAAB4SC+IGKoLP+0030o=
diff --git a/source4/librpc/tests/krb5pac_upn_dns_info_ex.txt b/source4/librpc/tests/krb5pac_upn_dns_info_ex.txt
new file mode 100644
index 0000000..5deec54
--- /dev/null
+++ b/source4/librpc/tests/krb5pac_upn_dns_info_ex.txt
@@ -0,0 +1,281 @@
+pull returned Success
+ PAC_DATA: struct PAC_DATA
+ num_buffers : 0x00000006 (6)
+ version : 0x00000000 (0)
+ buffers: ARRAY(6)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_LOGON_INFO (1)
+ _ndr_size : 0x000001d0 (464)
+ info : *
+ info : union PAC_INFO(case 1)
+ logon_info: struct PAC_LOGON_INFO_CTR
+ info : *
+ info: struct PAC_LOGON_INFO
+ info3: struct netr_SamInfo3
+ base: struct netr_SamBaseInfo
+ logon_time : NTTIME(0)
+ logoff_time : Thu Sep 14 02:48:05 AM 30828 UTC
+ kickoff_time : Thu Sep 14 02:48:05 AM 30828 UTC
+ last_password_change : Wed Oct 13 02:08:12 AM 2021 UTC
+ allow_password_change : Thu Oct 14 02:08:12 AM 2021 UTC
+ force_password_change : Wed Nov 24 02:08:12 AM 2021 UTC
+ account_name: struct lsa_String
+ length : 0x0012 (18)
+ size : 0x0012 (18)
+ string : *
+ string : 'tsttktusr'
+ full_name: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ logon_script: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ profile_path: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ home_directory: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ home_drive: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ logon_count : 0x0000 (0)
+ bad_password_count : 0x0000 (0)
+ rid : 0x0000048e (1166)
+ primary_gid : 0x00000201 (513)
+ groups: struct samr_RidWithAttributeArray
+ count : 0x00000001 (1)
+ rids : *
+ rids: ARRAY(1)
+ rids: struct samr_RidWithAttribute
+ rid : 0x00000201 (513)
+ attributes : 0x00000007 (7)
+ 1: SE_GROUP_MANDATORY
+ 1: SE_GROUP_ENABLED_BY_DEFAULT
+ 1: SE_GROUP_ENABLED
+ 0: SE_GROUP_OWNER
+ 0: SE_GROUP_USE_FOR_DENY_ONLY
+ 0: SE_GROUP_INTEGRITY
+ 0: SE_GROUP_INTEGRITY_ENABLED
+ 0: SE_GROUP_RESOURCE
+ 0x00: SE_GROUP_LOGON_ID (0)
+ user_flags : 0x00000020 (32)
+ 0: NETLOGON_GUEST
+ 0: NETLOGON_NOENCRYPTION
+ 0: NETLOGON_CACHED_ACCOUNT
+ 0: NETLOGON_USED_LM_PASSWORD
+ 1: NETLOGON_EXTRA_SIDS
+ 0: NETLOGON_SUBAUTH_SESSION_KEY
+ 0: NETLOGON_SERVER_TRUST_ACCOUNT
+ 0: NETLOGON_NTLMV2_ENABLED
+ 0: NETLOGON_RESOURCE_GROUPS
+ 0: NETLOGON_PROFILE_PATH_RETURNED
+ 0: NETLOGON_GRACE_LOGON
+ key: struct netr_UserSessionKey
+ key: ARRAY(16): <REDACTED SECRET VALUES>
+ logon_server: struct lsa_StringLarge
+ length : 0x000e (14)
+ size : 0x0010 (16)
+ string : *
+ string : 'LOCALDC'
+ logon_domain: struct lsa_StringLarge
+ length : 0x0016 (22)
+ size : 0x0018 (24)
+ string : *
+ string : 'SAMBADOMAIN'
+ domain_sid : *
+ domain_sid : S-1-5-21-4109729462-983708096-1421331175
+ LMSessKey: struct netr_LMSessionKey
+ key: ARRAY(8): <REDACTED SECRET VALUES>
+ acct_flags : 0x00000010 (16)
+ 0: ACB_DISABLED
+ 0: ACB_HOMDIRREQ
+ 0: ACB_PWNOTREQ
+ 0: ACB_TEMPDUP
+ 1: ACB_NORMAL
+ 0: ACB_MNS
+ 0: ACB_DOMTRUST
+ 0: ACB_WSTRUST
+ 0: ACB_SVRTRUST
+ 0: ACB_PWNOEXP
+ 0: ACB_AUTOLOCK
+ 0: ACB_ENC_TXT_PWD_ALLOWED
+ 0: ACB_SMARTCARD_REQUIRED
+ 0: ACB_TRUSTED_FOR_DELEGATION
+ 0: ACB_NOT_DELEGATED
+ 0: ACB_USE_DES_KEY_ONLY
+ 0: ACB_DONT_REQUIRE_PREAUTH
+ 0: ACB_PW_EXPIRED
+ 0: ACB_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION
+ 0: ACB_NO_AUTH_DATA_REQD
+ 0: ACB_PARTIAL_SECRETS_ACCOUNT
+ 0: ACB_USE_AES_KEYS
+ sub_auth_status : 0x00000000 (0)
+ last_successful_logon : NTTIME(0)
+ last_failed_logon : NTTIME(0)
+ failed_logon_count : 0x00000000 (0)
+ reserved : 0x00000000 (0)
+ sidcount : 0x00000001 (1)
+ sids : *
+ sids: ARRAY(1)
+ sids: struct netr_SidAttr
+ sid : *
+ sid : S-1-18-1
+ attributes : 0x00000007 (7)
+ 1: SE_GROUP_MANDATORY
+ 1: SE_GROUP_ENABLED_BY_DEFAULT
+ 1: SE_GROUP_ENABLED
+ 0: SE_GROUP_OWNER
+ 0: SE_GROUP_USE_FOR_DENY_ONLY
+ 0: SE_GROUP_INTEGRITY
+ 0: SE_GROUP_INTEGRITY_ENABLED
+ 0: SE_GROUP_RESOURCE
+ 0x00: SE_GROUP_LOGON_ID (0)
+ resource_groups: struct PAC_DOMAIN_GROUP_MEMBERSHIP
+ domain_sid : NULL
+ groups: struct samr_RidWithAttributeArray
+ count : 0x00000000 (0)
+ rids : NULL
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_LOGON_NAME (10)
+ _ndr_size : 0x0000001c (28)
+ info : *
+ info : union PAC_INFO(case 10)
+ logon_name: struct PAC_LOGON_NAME
+ logon_time : Wed Oct 13 02:08:11 AM 2021 UTC
+ size : 0x0012 (18)
+ account_name : 'tsttktusr'
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_UPN_DNS_INFO (12)
+ _ndr_size : 0x000000a8 (168)
+ info : *
+ info : union PAC_INFO(case 12)
+ upn_dns_info: struct PAC_UPN_DNS_INFO
+ upn_name_size : 0x0036 (54)
+ upn_name : *
+ upn_name : 'tsttktusr@samba.example.com'
+ dns_domain_name_size : 0x0022 (34)
+ dns_domain_name : *
+ dns_domain_name : 'SAMBA.EXAMPLE.COM'
+ flags : 0x00000003 (3)
+ 1: PAC_UPN_DNS_FLAG_CONSTRUCTED
+ 1: PAC_UPN_DNS_FLAG_HAS_SAM_NAME_AND_SID
+ ex : union PAC_UPN_DNS_INFO_EX(case 2)
+ sam_name_and_sid: struct PAC_UPN_DNS_INFO_SAM_NAME_AND_SID
+ samaccountname_size : 0x0012 (18)
+ samaccountname : *
+ samaccountname : 'tsttktusr'
+ objectsid_size : 0x001c (28)
+ objectsid : *
+ objectsid : S-1-5-21-4109729462-983708096-1421331175-1166
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_SRV_CHECKSUM (6)
+ _ndr_size : 0x00000014 (20)
+ info : *
+ info : union PAC_INFO(case 6)
+ srv_cksum: struct PAC_SIGNATURE_DATA
+ type : 0xffffff76 (4294967158)
+ signature : DATA_BLOB length=16
+[0000] 2B 39 6A 8C 76 29 DA 8D 63 C0 95 57 19 10 6E CE +9j.v).. c..W..n.
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_KDC_CHECKSUM (7)
+ _ndr_size : 0x00000010 (16)
+ info : *
+ info : union PAC_INFO(case 7)
+ kdc_cksum: struct PAC_SIGNATURE_DATA
+ type : 0x00000010 (16)
+ signature : DATA_BLOB length=12
+[0000] 5A D4 78 FD 1B F0 F6 DC B7 45 65 56 Z.x..... .EeV
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_TICKET_CHECKSUM (16)
+ _ndr_size : 0x00000010 (16)
+ info : *
+ info : union PAC_INFO(case 16)
+ ticket_checksum: struct PAC_SIGNATURE_DATA
+ type : 0x00000010 (16)
+ signature : DATA_BLOB length=12
+[0000] 78 48 2F 88 18 AA 0B 3F ED 34 DF 4A xH/....? .4.J
+ _pad : 0x00000000 (0)
+push returned Success
+pull returned Success
+WARNING! orig bytes:824 validated pushed bytes:832
+WARNING! orig pulled bytes:824 validated pulled bytes:832
+WARNING! orig and validated differ at byte 0x2C (44)
+WARNING! orig byte[0x2C] = 0xA8 validated byte[0x2C] = 0xB0
+ [0000] 06 00 00 00 00 00 00 00 01 00 00 00 D0 01 00 00 ........ ........
+ [0010] 68 00 00 00 00 00 00 00 0A 00 00 00 1C 00 00 00 h....... ........
+-[0020] 38 02 00 00 00 00 00 00 0C 00 00 00 A8 00 00 00 8....... ........
++[0020] 38 02 00 00 00 00 00 00 0C 00 00 00 B0 00 00 00 8....... ........
+ [0030] 58 02 00 00 00 00 00 00 06 00 00 00 14 00 00 00 X....... ........
+-[0040] 00 03 00 00 00 00 00 00 07 00 00 00 10 00 00 00 ........ ........
++[0040] 08 03 00 00 00 00 00 00 07 00 00 00 10 00 00 00 ........ ........
+-[0050] 18 03 00 00 00 00 00 00 10 00 00 00 10 00 00 00 ........ ........
++[0050] 20 03 00 00 00 00 00 00 10 00 00 00 10 00 00 00 ....... ........
+-[0060] 28 03 00 00 00 00 00 00 01 10 08 00 CC CC CC CC (....... ........
++[0060] 30 03 00 00 00 00 00 00 01 10 08 00 CC CC CC CC 0....... ........
+ [0070] C0 01 00 00 00 00 00 00 00 00 02 00 00 00 00 00 ........ ........
+ [0080] 00 00 00 00 FF FF FF FF FF FF FF 7F FF FF FF FF ........ ........
+ [0090] FF FF FF 7F BA 4C 70 2C D7 BF D7 01 BA 0C DA 56 .....Lp, .......V
+ [00A0] A0 C0 D7 01 BA CC C9 21 D8 E0 D7 01 12 00 12 00 .......! ........
+ [00B0] 04 00 02 00 00 00 00 00 08 00 02 00 00 00 00 00 ........ ........
+ [00C0] 0C 00 02 00 00 00 00 00 10 00 02 00 00 00 00 00 ........ ........
+ [00D0] 14 00 02 00 00 00 00 00 18 00 02 00 00 00 00 00 ........ ........
+ [00E0] 8E 04 00 00 01 02 00 00 01 00 00 00 1C 00 02 00 ........ ........
+ [00F0] 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ....... ........
+ [0100] 00 00 00 00 0E 00 10 00 20 00 02 00 16 00 18 00 ........ .......
+ [0110] 24 00 02 00 28 00 02 00 00 00 00 00 00 00 00 00 $...(... ........
+ [0120] 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+ [0140] 01 00 00 00 2C 00 02 00 00 00 00 00 00 00 00 00 ....,... ........
+ [0150] 00 00 00 00 09 00 00 00 00 00 00 00 09 00 00 00 ........ ........
+ [0160] 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 73 00 t.s.t.t. k.t.u.s.
+ [0170] 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r....... ........
+skipping zero buffer bytes
+ [01B0] 01 00 00 00 01 02 00 00 07 00 00 00 08 00 00 00 ........ ........
+ [01C0] 00 00 00 00 07 00 00 00 4C 00 4F 00 43 00 41 00 ........ L.O.C.A.
+ [01D0] 4C 00 44 00 43 00 00 00 0C 00 00 00 00 00 00 00 L.D.C... ........
+ [01E0] 0B 00 00 00 53 00 41 00 4D 00 42 00 41 00 44 00 ....S.A. M.B.A.D.
+ [01F0] 4F 00 4D 00 41 00 49 00 4E 00 00 00 04 00 00 00 O.M.A.I. N.......
+ [0200] 01 04 00 00 00 00 00 05 15 00 00 00 B6 7E F5 F4 ........ .....~..
+ [0210] C0 31 A2 3A E7 CA B7 54 01 00 00 00 30 00 02 00 .1.:...T ....0...
+ [0220] 07 00 00 00 01 00 00 00 01 01 00 00 00 00 00 12 ........ ........
+ [0230] 01 00 00 00 00 00 00 00 80 B7 21 2C D7 BF D7 01 ........ ..!,....
+ [0240] 12 00 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 ..t.s.t. t.k.t.u.
+ [0250] 73 00 72 00 00 00 00 00 36 00 18 00 22 00 50 00 s.r..... 6...".P.
+-[0260] 03 00 00 00 12 00 78 00 1C 00 8A 00 00 00 00 00 ......x. ........
++[0260] 03 00 00 00 12 00 78 00 1C 00 90 00 00 00 00 00 ......x. ........
+ [0270] 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 73 00 t.s.t.t. k.t.u.s.
+ [0280] 72 00 40 00 73 00 61 00 6D 00 62 00 61 00 2E 00 r.@.s.a. m.b.a...
+ [0290] 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2E 00 e.x.a.m. p.l.e...
+ [02A0] 63 00 6F 00 6D 00 00 00 53 00 41 00 4D 00 42 00 c.o.m... S.A.M.B.
+ [02B0] 41 00 2E 00 45 00 58 00 41 00 4D 00 50 00 4C 00 A...E.X. A.M.P.L.
+ [02C0] 45 00 2E 00 43 00 4F 00 4D 00 00 00 00 00 00 00 E...C.O. M.......
+ [02D0] 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 73 00 t.s.t.t. k.t.u.s.
+-[02E0] 72 00 01 05 00 00 00 00 00 05 15 00 00 00 B6 7E r....... .......~
++[02E0] 72 00 00 00 00 00 00 00 01 05 00 00 00 00 00 05 r....... ........
+-[02F0] F5 F4 C0 31 A2 3A E7 CA B7 54 8E 04 00 00 00 00 ...1.:.. .T......
++[02F0] 15 00 00 00 B6 7E F5 F4 C0 31 A2 3A E7 CA B7 54 .....~.. .1.:...T
+-[0300] 76 FF FF FF 2B 39 6A 8C 76 29 DA 8D 63 C0 95 57 v...+9j. v)..c..W
++[0300] 8E 04 00 00 00 00 00 00 76 FF FF FF 2B 39 6A 8C ........ v...+9j.
+-[0310] 19 10 6E CE 00 00 00 00 10 00 00 00 5A D4 78 FD ..n..... ....Z.x.
++[0310] 76 29 DA 8D 63 C0 95 57 19 10 6E CE 00 00 00 00 v)..c..W ..n.....
+-[0320] 1B F0 F6 DC B7 45 65 56 10 00 00 00 78 48 2F 88 .....EeV ....xH/.
++[0320] 10 00 00 00 5A D4 78 FD 1B F0 F6 DC B7 45 65 56 ....Z.x. .....EeV
+-[0330] 18 AA 0B 3F ED 34 DF 4A ...?.4.J
++[0330] 10 00 00 00 78 48 2F 88 18 AA 0B 3F ED 34 DF 4A ....xH/. ...?.4.J
+dump OK
diff --git a/source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.b64.txt b/source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.b64.txt
new file mode 100644
index 0000000..cd99b9d
--- /dev/null
+++ b/source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.b64.txt
@@ -0,0 +1 @@
+BgAAAAAAAAABAAAA0AEAAGgAAAAAAAAACgAAABwAAAA4AgAAAAAAAAwAAACoAAAAWAIAAAAAAAAGAAAAFAAAAAADAAAAAAAABwAAABAAAAAYAwAAAAAAABAAAAAQAAAAKAMAAAAAAAABEAgAzMzMzMABAAAAAAAAAAACAAAAAAAAAAAA/////////3//////////f7pMcCzXv9cBugzaVqDA1wG6zMkh2ODXARIAEgAEAAIAAAAAAAgAAgAAAAAADAACAAAAAAAQAAIAAAAAABQAAgAAAAAAGAACAAAAAACOBAAAAQIAAAEAAAAcAAIAIAAAAAAAAAAAAAAAAAAAAAAAAAAOABAAIAACABYAGAAkAAIAKAACAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAALAACAAAAAAAAAAAAAAAAAAkAAAAAAAAACQAAAHQAcwB0AHQAawB0AHUAcwByAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAECAAAHAAAACAAAAAAAAAAHAAAATABPAEMAQQBMAEQAQwAAAAwAAAAAAAAACwAAAFMAQQBNAEIAQQBEAE8ATQBBAEkATgAAAAQAAAABBAAAAAAABRUAAAC2fvX0wDGiOufKt1QBAAAAMAACAAcAAAABAAAAAQEAAAAAABIBAAAAAAAAAIC3ISzXv9cBEgB0AHMAdAB0AGsAdAB1AHMAcgAAAAAANgAYACIAUAABAAAAEgB4ABwAigAAAAAAdABzAHQAdABrAHQAdQBzAHIAQABzAGEAbQBiAGEALgBlAHgAYQBtAHAAbABlAC4AYwBvAG0AAABTAEEATQBCAEEALgBFAFgAQQBNAFAATABFAC4AQwBPAE0AAAAAAAAAdABzAHQAdABrAHQAdQBzAHIAAQUAAAAAAAUVAAAAtn719MAxojrnyrdUjgQAAAAAdv///ys5aox2KdqNY8CVVxkQbs4AAAAAEAAAAFrUeP0b8Pbct0VlVhAAAAB4SC+IGKoLP+0030o=
diff --git a/source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.txt b/source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.txt
new file mode 100644
index 0000000..088f48b
--- /dev/null
+++ b/source4/librpc/tests/krb5pac_upn_dns_info_ex_not_supported.txt
@@ -0,0 +1,282 @@
+pull returned Success
+ PAC_DATA: struct PAC_DATA
+ num_buffers : 0x00000006 (6)
+ version : 0x00000000 (0)
+ buffers: ARRAY(6)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_LOGON_INFO (1)
+ _ndr_size : 0x000001d0 (464)
+ info : *
+ info : union PAC_INFO(case 1)
+ logon_info: struct PAC_LOGON_INFO_CTR
+ info : *
+ info: struct PAC_LOGON_INFO
+ info3: struct netr_SamInfo3
+ base: struct netr_SamBaseInfo
+ logon_time : NTTIME(0)
+ logoff_time : Thu Sep 14 02:48:05 AM 30828 UTC
+ kickoff_time : Thu Sep 14 02:48:05 AM 30828 UTC
+ last_password_change : Wed Oct 13 02:08:12 AM 2021 UTC
+ allow_password_change : Thu Oct 14 02:08:12 AM 2021 UTC
+ force_password_change : Wed Nov 24 02:08:12 AM 2021 UTC
+ account_name: struct lsa_String
+ length : 0x0012 (18)
+ size : 0x0012 (18)
+ string : *
+ string : 'tsttktusr'
+ full_name: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ logon_script: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ profile_path: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ home_directory: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ home_drive: struct lsa_String
+ length : 0x0000 (0)
+ size : 0x0000 (0)
+ string : *
+ string : ''
+ logon_count : 0x0000 (0)
+ bad_password_count : 0x0000 (0)
+ rid : 0x0000048e (1166)
+ primary_gid : 0x00000201 (513)
+ groups: struct samr_RidWithAttributeArray
+ count : 0x00000001 (1)
+ rids : *
+ rids: ARRAY(1)
+ rids: struct samr_RidWithAttribute
+ rid : 0x00000201 (513)
+ attributes : 0x00000007 (7)
+ 1: SE_GROUP_MANDATORY
+ 1: SE_GROUP_ENABLED_BY_DEFAULT
+ 1: SE_GROUP_ENABLED
+ 0: SE_GROUP_OWNER
+ 0: SE_GROUP_USE_FOR_DENY_ONLY
+ 0: SE_GROUP_INTEGRITY
+ 0: SE_GROUP_INTEGRITY_ENABLED
+ 0: SE_GROUP_RESOURCE
+ 0x00: SE_GROUP_LOGON_ID (0)
+ user_flags : 0x00000020 (32)
+ 0: NETLOGON_GUEST
+ 0: NETLOGON_NOENCRYPTION
+ 0: NETLOGON_CACHED_ACCOUNT
+ 0: NETLOGON_USED_LM_PASSWORD
+ 1: NETLOGON_EXTRA_SIDS
+ 0: NETLOGON_SUBAUTH_SESSION_KEY
+ 0: NETLOGON_SERVER_TRUST_ACCOUNT
+ 0: NETLOGON_NTLMV2_ENABLED
+ 0: NETLOGON_RESOURCE_GROUPS
+ 0: NETLOGON_PROFILE_PATH_RETURNED
+ 0: NETLOGON_GRACE_LOGON
+ key: struct netr_UserSessionKey
+ key: ARRAY(16): <REDACTED SECRET VALUES>
+ logon_server: struct lsa_StringLarge
+ length : 0x000e (14)
+ size : 0x0010 (16)
+ string : *
+ string : 'LOCALDC'
+ logon_domain: struct lsa_StringLarge
+ length : 0x0016 (22)
+ size : 0x0018 (24)
+ string : *
+ string : 'SAMBADOMAIN'
+ domain_sid : *
+ domain_sid : S-1-5-21-4109729462-983708096-1421331175
+ LMSessKey: struct netr_LMSessionKey
+ key: ARRAY(8): <REDACTED SECRET VALUES>
+ acct_flags : 0x00000010 (16)
+ 0: ACB_DISABLED
+ 0: ACB_HOMDIRREQ
+ 0: ACB_PWNOTREQ
+ 0: ACB_TEMPDUP
+ 1: ACB_NORMAL
+ 0: ACB_MNS
+ 0: ACB_DOMTRUST
+ 0: ACB_WSTRUST
+ 0: ACB_SVRTRUST
+ 0: ACB_PWNOEXP
+ 0: ACB_AUTOLOCK
+ 0: ACB_ENC_TXT_PWD_ALLOWED
+ 0: ACB_SMARTCARD_REQUIRED
+ 0: ACB_TRUSTED_FOR_DELEGATION
+ 0: ACB_NOT_DELEGATED
+ 0: ACB_USE_DES_KEY_ONLY
+ 0: ACB_DONT_REQUIRE_PREAUTH
+ 0: ACB_PW_EXPIRED
+ 0: ACB_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION
+ 0: ACB_NO_AUTH_DATA_REQD
+ 0: ACB_PARTIAL_SECRETS_ACCOUNT
+ 0: ACB_USE_AES_KEYS
+ sub_auth_status : 0x00000000 (0)
+ last_successful_logon : NTTIME(0)
+ last_failed_logon : NTTIME(0)
+ failed_logon_count : 0x00000000 (0)
+ reserved : 0x00000000 (0)
+ sidcount : 0x00000001 (1)
+ sids : *
+ sids: ARRAY(1)
+ sids: struct netr_SidAttr
+ sid : *
+ sid : S-1-18-1
+ attributes : 0x00000007 (7)
+ 1: SE_GROUP_MANDATORY
+ 1: SE_GROUP_ENABLED_BY_DEFAULT
+ 1: SE_GROUP_ENABLED
+ 0: SE_GROUP_OWNER
+ 0: SE_GROUP_USE_FOR_DENY_ONLY
+ 0: SE_GROUP_INTEGRITY
+ 0: SE_GROUP_INTEGRITY_ENABLED
+ 0: SE_GROUP_RESOURCE
+ 0x00: SE_GROUP_LOGON_ID (0)
+ resource_groups: struct PAC_DOMAIN_GROUP_MEMBERSHIP
+ domain_sid : NULL
+ groups: struct samr_RidWithAttributeArray
+ count : 0x00000000 (0)
+ rids : NULL
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_LOGON_NAME (10)
+ _ndr_size : 0x0000001c (28)
+ info : *
+ info : union PAC_INFO(case 10)
+ logon_name: struct PAC_LOGON_NAME
+ logon_time : Wed Oct 13 02:08:11 AM 2021 UTC
+ size : 0x0012 (18)
+ account_name : 'tsttktusr'
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_UPN_DNS_INFO (12)
+ _ndr_size : 0x000000a8 (168)
+ info : *
+ info : union PAC_INFO(case 12)
+ upn_dns_info: struct PAC_UPN_DNS_INFO
+ upn_name_size : 0x0036 (54)
+ upn_name : *
+ upn_name : 'tsttktusr@samba.example.com'
+ dns_domain_name_size : 0x0022 (34)
+ dns_domain_name : *
+ dns_domain_name : 'SAMBA.EXAMPLE.COM'
+ flags : 0x00000001 (1)
+ 1: PAC_UPN_DNS_FLAG_CONSTRUCTED
+ 0: PAC_UPN_DNS_FLAG_HAS_SAM_NAME_AND_SID
+ ex : union PAC_UPN_DNS_INFO_EX(case 0)
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_SRV_CHECKSUM (6)
+ _ndr_size : 0x00000014 (20)
+ info : *
+ info : union PAC_INFO(case 6)
+ srv_cksum: struct PAC_SIGNATURE_DATA
+ type : 0xffffff76 (4294967158)
+ signature : DATA_BLOB length=16
+[0000] 2B 39 6A 8C 76 29 DA 8D 63 C0 95 57 19 10 6E CE +9j.v).. c..W..n.
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_KDC_CHECKSUM (7)
+ _ndr_size : 0x00000010 (16)
+ info : *
+ info : union PAC_INFO(case 7)
+ kdc_cksum: struct PAC_SIGNATURE_DATA
+ type : 0x00000010 (16)
+ signature : DATA_BLOB length=12
+[0000] 5A D4 78 FD 1B F0 F6 DC B7 45 65 56 Z.x..... .EeV
+ _pad : 0x00000000 (0)
+ buffers: struct PAC_BUFFER
+ type : PAC_TYPE_TICKET_CHECKSUM (16)
+ _ndr_size : 0x00000010 (16)
+ info : *
+ info : union PAC_INFO(case 16)
+ ticket_checksum: struct PAC_SIGNATURE_DATA
+ type : 0x00000010 (16)
+ signature : DATA_BLOB length=12
+[0000] 78 48 2F 88 18 AA 0B 3F ED 34 DF 4A xH/....? .4.J
+ _pad : 0x00000000 (0)
+push returned Success
+pull returned Success
+WARNING! orig bytes:824 validated pushed bytes:768
+WARNING! orig pulled bytes:824 validated pulled bytes:768
+WARNING! orig and validated differ at byte 0x2C (44)
+WARNING! orig byte[0x2C] = 0xA8 validated byte[0x2C] = 0x70
+ [0000] 06 00 00 00 00 00 00 00 01 00 00 00 D0 01 00 00 ........ ........
+ [0010] 68 00 00 00 00 00 00 00 0A 00 00 00 1C 00 00 00 h....... ........
+-[0020] 38 02 00 00 00 00 00 00 0C 00 00 00 A8 00 00 00 8....... ........
++[0020] 38 02 00 00 00 00 00 00 0C 00 00 00 70 00 00 00 8....... ....p...
+ [0030] 58 02 00 00 00 00 00 00 06 00 00 00 14 00 00 00 X....... ........
+-[0040] 00 03 00 00 00 00 00 00 07 00 00 00 10 00 00 00 ........ ........
++[0040] C8 02 00 00 00 00 00 00 07 00 00 00 10 00 00 00 ........ ........
+-[0050] 18 03 00 00 00 00 00 00 10 00 00 00 10 00 00 00 ........ ........
++[0050] E0 02 00 00 00 00 00 00 10 00 00 00 10 00 00 00 ........ ........
+-[0060] 28 03 00 00 00 00 00 00 01 10 08 00 CC CC CC CC (....... ........
++[0060] F0 02 00 00 00 00 00 00 01 10 08 00 CC CC CC CC ........ ........
+ [0070] C0 01 00 00 00 00 00 00 00 00 02 00 00 00 00 00 ........ ........
+ [0080] 00 00 00 00 FF FF FF FF FF FF FF 7F FF FF FF FF ........ ........
+ [0090] FF FF FF 7F BA 4C 70 2C D7 BF D7 01 BA 0C DA 56 .....Lp, .......V
+ [00A0] A0 C0 D7 01 BA CC C9 21 D8 E0 D7 01 12 00 12 00 .......! ........
+ [00B0] 04 00 02 00 00 00 00 00 08 00 02 00 00 00 00 00 ........ ........
+ [00C0] 0C 00 02 00 00 00 00 00 10 00 02 00 00 00 00 00 ........ ........
+ [00D0] 14 00 02 00 00 00 00 00 18 00 02 00 00 00 00 00 ........ ........
+ [00E0] 8E 04 00 00 01 02 00 00 01 00 00 00 1C 00 02 00 ........ ........
+ [00F0] 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ....... ........
+ [0100] 00 00 00 00 0E 00 10 00 20 00 02 00 16 00 18 00 ........ .......
+ [0110] 24 00 02 00 28 00 02 00 00 00 00 00 00 00 00 00 $...(... ........
+ [0120] 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+skipping zero buffer bytes
+ [0140] 01 00 00 00 2C 00 02 00 00 00 00 00 00 00 00 00 ....,... ........
+ [0150] 00 00 00 00 09 00 00 00 00 00 00 00 09 00 00 00 ........ ........
+ [0160] 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 73 00 t.s.t.t. k.t.u.s.
+ [0170] 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r....... ........
+skipping zero buffer bytes
+ [01B0] 01 00 00 00 01 02 00 00 07 00 00 00 08 00 00 00 ........ ........
+ [01C0] 00 00 00 00 07 00 00 00 4C 00 4F 00 43 00 41 00 ........ L.O.C.A.
+ [01D0] 4C 00 44 00 43 00 00 00 0C 00 00 00 00 00 00 00 L.D.C... ........
+ [01E0] 0B 00 00 00 53 00 41 00 4D 00 42 00 41 00 44 00 ....S.A. M.B.A.D.
+ [01F0] 4F 00 4D 00 41 00 49 00 4E 00 00 00 04 00 00 00 O.M.A.I. N.......
+ [0200] 01 04 00 00 00 00 00 05 15 00 00 00 B6 7E F5 F4 ........ .....~..
+ [0210] C0 31 A2 3A E7 CA B7 54 01 00 00 00 30 00 02 00 .1.:...T ....0...
+ [0220] 07 00 00 00 01 00 00 00 01 01 00 00 00 00 00 12 ........ ........
+ [0230] 01 00 00 00 00 00 00 00 80 B7 21 2C D7 BF D7 01 ........ ..!,....
+ [0240] 12 00 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 ..t.s.t. t.k.t.u.
+-[0250] 73 00 72 00 00 00 00 00 36 00 18 00 22 00 50 00 s.r..... 6...".P.
++[0250] 73 00 72 00 00 00 00 00 36 00 10 00 22 00 48 00 s.r..... 6...".H.
+-[0260] 01 00 00 00 12 00 78 00 1C 00 8A 00 00 00 00 00 ......x. ........
++[0260] 01 00 00 00 00 00 00 00 74 00 73 00 74 00 74 00 ........ t.s.t.t.
+-[0270] 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 73 00 t.s.t.t. k.t.u.s.
++[0270] 6B 00 74 00 75 00 73 00 72 00 40 00 73 00 61 00 k.t.u.s. r.@.s.a.
+-[0280] 72 00 40 00 73 00 61 00 6D 00 62 00 61 00 2E 00 r.@.s.a. m.b.a...
++[0280] 6D 00 62 00 61 00 2E 00 65 00 78 00 61 00 6D 00 m.b.a... e.x.a.m.
+-[0290] 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2E 00 e.x.a.m. p.l.e...
++[0290] 70 00 6C 00 65 00 2E 00 63 00 6F 00 6D 00 00 00 p.l.e... c.o.m...
+-[02A0] 63 00 6F 00 6D 00 00 00 53 00 41 00 4D 00 42 00 c.o.m... S.A.M.B.
++[02A0] 53 00 41 00 4D 00 42 00 41 00 2E 00 45 00 58 00 S.A.M.B. A...E.X.
+-[02B0] 41 00 2E 00 45 00 58 00 41 00 4D 00 50 00 4C 00 A...E.X. A.M.P.L.
++[02B0] 41 00 4D 00 50 00 4C 00 45 00 2E 00 43 00 4F 00 A.M.P.L. E...C.O.
+-[02C0] 45 00 2E 00 43 00 4F 00 4D 00 00 00 00 00 00 00 E...C.O. M.......
++[02C0] 4D 00 00 00 00 00 00 00 76 FF FF FF 2B 39 6A 8C M....... v...+9j.
+-[02D0] 74 00 73 00 74 00 74 00 6B 00 74 00 75 00 73 00 t.s.t.t. k.t.u.s.
++[02D0] 76 29 DA 8D 63 C0 95 57 19 10 6E CE 00 00 00 00 v)..c..W ..n.....
+-[02E0] 72 00 01 05 00 00 00 00 00 05 15 00 00 00 B6 7E r....... .......~
++[02E0] 10 00 00 00 5A D4 78 FD 1B F0 F6 DC B7 45 65 56 ....Z.x. .....EeV
+-[02F0] F5 F4 C0 31 A2 3A E7 CA B7 54 8E 04 00 00 00 00 ...1.:.. .T......
++[02F0] 10 00 00 00 78 48 2F 88 18 AA 0B 3F ED 34 DF 4A ....xH/. ...?.4.J
+-[0300] 76 FF FF FF 2B 39 6A 8C 76 29 DA 8D 63 C0 95 57 v...+9j. v)..c..W
++[0300] EMPTY BLOCK
+-[0310] 19 10 6E CE 00 00 00 00 10 00 00 00 5A D4 78 FD ..n..... ....Z.x.
++[0310] EMPTY BLOCK
+-[0320] 1B F0 F6 DC B7 45 65 56 10 00 00 00 78 48 2F 88 .....EeV ....xH/.
++[0320] EMPTY BLOCK
+-[0330] 18 AA 0B 3F ED 34 DF 4A ...?.4.J
++[0330] EMPTY BLOCK
+dump OK
diff --git a/source4/librpc/tests/misc-GUID.dat b/source4/librpc/tests/misc-GUID.dat
new file mode 100644
index 0000000..454f6b3
--- /dev/null
+++ b/source4/librpc/tests/misc-GUID.dat
@@ -0,0 +1 @@
+0123456789abcdef \ No newline at end of file
diff --git a/source4/librpc/tests/samr-CreateUser-in.dat b/source4/librpc/tests/samr-CreateUser-in.dat
new file mode 100644
index 0000000..a5840e1
--- /dev/null
+++ b/source4/librpc/tests/samr-CreateUser-in.dat
Binary files differ
diff --git a/source4/librpc/tests/samr-CreateUser-out.dat b/source4/librpc/tests/samr-CreateUser-out.dat
new file mode 100644
index 0000000..cf9131d
--- /dev/null
+++ b/source4/librpc/tests/samr-CreateUser-out.dat
Binary files differ
diff --git a/source4/librpc/tests/uncompressed_claims.txt b/source4/librpc/tests/uncompressed_claims.txt
new file mode 100644
index 0000000..1cca8ae
--- /dev/null
+++ b/source4/librpc/tests/uncompressed_claims.txt
@@ -0,0 +1,66 @@
+pull returned Success
+ CLAIMS_SET_METADATA_NDR: struct CLAIMS_SET_METADATA_NDR
+ claims: struct CLAIMS_SET_METADATA_CTR
+ metadata : *
+ metadata: struct CLAIMS_SET_METADATA
+ claims_set_size : 0x00000158 (344)
+ claims_set : *
+ claims_set: struct CLAIMS_SET_NDR
+ claims: struct CLAIMS_SET_CTR
+ claims : *
+ claims: struct CLAIMS_SET
+ claims_array_count : 0x00000001 (1)
+ claims_arrays : *
+ claims_arrays: ARRAY(1)
+ claims_arrays: struct CLAIMS_ARRAY
+ claims_source_type : CLAIMS_SOURCE_TYPE_AD (1)
+ claims_count : 0x00000003 (3)
+ claim_entries : *
+ claim_entries: ARRAY(3)
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_9'
+ type : CLAIM_TYPE_BOOLEAN (6)
+ values : union CLAIM_ENTRY_VALUES(case 6)
+ claim_boolean: struct CLAIM_UINT64
+ value_count : 0x00000001 (1)
+ values : *
+ values: ARRAY(1)
+ values : 0x0000000000000001 (1)
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_7'
+ type : CLAIM_TYPE_STRING (3)
+ values : union CLAIM_ENTRY_VALUES(case 3)
+ claim_string: struct CLAIM_STRING
+ value_count : 0x00000003 (3)
+ values : *
+ values: ARRAY(3)
+ values : *
+ values : 'foo'
+ values : *
+ values : 'bar'
+ values : *
+ values : 'baz'
+ claim_entries: struct CLAIM_ENTRY
+ id : *
+ id : '720fd3c3_8'
+ type : CLAIM_TYPE_UINT64 (2)
+ values : union CLAIM_ENTRY_VALUES(case 2)
+ claim_uint64: struct CLAIM_UINT64
+ value_count : 0x00000004 (4)
+ values : *
+ values: ARRAY(4)
+ values : 0x00000000000a0009 (655369)
+ values : 0x0000000000010007 (65543)
+ values : 0x0000000000010006 (65542)
+ values : 0x0000000000010000 (65536)
+ reserved_type : 0x0000 (0)
+ reserved_field_size : 0x00000000 (0)
+ reserved_field : NULL
+ compression_format : CLAIMS_COMPRESSION_FORMAT_NONE (0)
+ uncompressed_claims_set_size: 0x00000158 (344)
+ reserved_type : 0x0000 (0)
+ reserved_field_size : 0x00000000 (0)
+ reserved_field : NULL
+dump OK
diff --git a/source4/librpc/tests/xattr_NTACL.dat b/source4/librpc/tests/xattr_NTACL.dat
new file mode 100644
index 0000000..8ec2eda
--- /dev/null
+++ b/source4/librpc/tests/xattr_NTACL.dat
@@ -0,0 +1,20 @@
+[0000] 04 00 04 00 00 00 02 00 04 00 02 00 01 00 04 07 ........ ........
+[0010] 8B 57 A0 0C F3 F7 9D 64 DF 3E 91 46 09 B8 07 A5 .W.....d .>.F....
+[0020] F1 6C BE 38 DC 55 5B 1F 38 0C 23 A8 4A 85 00 00 .l.8.U[. 8.#.J...
+[0030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+[0040] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70 6F ........ ......po
+[0050] 73 69 78 5F 61 63 6C 00 62 A2 D8 8C 4B AA D5 01 six_acl. b...K...
+[0060] 5D 60 E7 56 A5 D4 54 92 1A 77 A5 E1 DC E2 A9 28 ]`.V..T. .w.....(
+[0070] A9 5D 3B 97 71 6C F7 59 F4 92 FF E3 42 A5 E9 B5 .];.ql.Y ....B...
+[0080] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+[0090] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
+[00A0] 01 00 14 90 B4 00 00 00 D0 00 00 00 00 00 00 00 ........ ........
+[00B0] E0 00 00 00 01 05 00 00 00 00 00 05 15 00 00 00 ........ ........
+[00C0] 70 CB 8E 6B F1 F8 4E 7C 31 87 57 84 F4 01 00 00 p..k..N| 1.W.....
+[00D0] 01 02 00 00 00 00 00 05 20 00 00 00 20 02 00 00 ........ ... ...
+[00E0] 04 00 60 00 04 00 00 00 00 03 18 00 FF 01 1F 00 ..`..... ........
+[00F0] 01 02 00 00 00 00 00 05 20 00 00 00 20 02 00 00 ........ ... ...
+[0100] 00 03 18 00 A9 00 12 00 01 02 00 00 00 00 00 05 ........ ........
+[0110] 20 00 00 00 25 02 00 00 00 03 14 00 FF 01 1F 00 ...%... ........
+[0120] 01 01 00 00 00 00 00 05 12 00 00 00 00 03 14 00 ........ ........
+[0130] A9 00 12 00 01 01 00 00 00 00 00 05 0B 00 00 00 ........ ........
diff --git a/source4/librpc/tests/xattr_NTACL.txt b/source4/librpc/tests/xattr_NTACL.txt
new file mode 100644
index 0000000..86f2f66
--- /dev/null
+++ b/source4/librpc/tests/xattr_NTACL.txt
@@ -0,0 +1,107 @@
+pull returned Success
+ xattr_NTACL: struct xattr_NTACL
+ version : 0x0004 (4)
+ info : union xattr_NTACL_Info(case 4)
+ sd_hs4 : *
+ sd_hs4: struct security_descriptor_hash_v4
+ sd : *
+ sd: struct security_descriptor
+ revision : SECURITY_DESCRIPTOR_REVISION_1 (1)
+ type : 0x9014 (36884)
+ 0: SEC_DESC_OWNER_DEFAULTED
+ 0: SEC_DESC_GROUP_DEFAULTED
+ 1: SEC_DESC_DACL_PRESENT
+ 0: SEC_DESC_DACL_DEFAULTED
+ 1: SEC_DESC_SACL_PRESENT
+ 0: SEC_DESC_SACL_DEFAULTED
+ 0: SEC_DESC_DACL_TRUSTED
+ 0: SEC_DESC_SERVER_SECURITY
+ 0: SEC_DESC_DACL_AUTO_INHERIT_REQ
+ 0: SEC_DESC_SACL_AUTO_INHERIT_REQ
+ 0: SEC_DESC_DACL_AUTO_INHERITED
+ 0: SEC_DESC_SACL_AUTO_INHERITED
+ 1: SEC_DESC_DACL_PROTECTED
+ 0: SEC_DESC_SACL_PROTECTED
+ 0: SEC_DESC_RM_CONTROL_VALID
+ 1: SEC_DESC_SELF_RELATIVE
+ owner_sid : *
+ owner_sid : S-1-5-21-1804520304-2085550321-2220328753-500
+ group_sid : *
+ group_sid : S-1-5-32-544
+ sacl : NULL
+ dacl : *
+ dacl: struct security_acl
+ revision : SECURITY_ACL_REVISION_ADS (4)
+ size : 0x0060 (96)
+ num_aces : 0x00000004 (4)
+ aces: ARRAY(4)
+ aces: struct security_ace
+ type : SEC_ACE_TYPE_ACCESS_ALLOWED (0)
+ flags : 0x03 (3)
+ 1: SEC_ACE_FLAG_OBJECT_INHERIT
+ 1: SEC_ACE_FLAG_CONTAINER_INHERIT
+ 0: SEC_ACE_FLAG_NO_PROPAGATE_INHERIT
+ 0: SEC_ACE_FLAG_INHERIT_ONLY
+ 0: SEC_ACE_FLAG_INHERITED_ACE
+ 0x03: SEC_ACE_FLAG_VALID_INHERIT (3)
+ 0: SEC_ACE_FLAG_SUCCESSFUL_ACCESS
+ 0: SEC_ACE_FLAG_FAILED_ACCESS
+ size : 0x0018 (24)
+ access_mask : 0x001f01ff (2032127)
+ object : union security_ace_object_ctr(case 0)
+ trustee : S-1-5-32-544
+ coda : union security_ace_coda(case 0)
+ ignored : DATA_BLOB length=0
+ aces: struct security_ace
+ type : SEC_ACE_TYPE_ACCESS_ALLOWED (0)
+ flags : 0x03 (3)
+ 1: SEC_ACE_FLAG_OBJECT_INHERIT
+ 1: SEC_ACE_FLAG_CONTAINER_INHERIT
+ 0: SEC_ACE_FLAG_NO_PROPAGATE_INHERIT
+ 0: SEC_ACE_FLAG_INHERIT_ONLY
+ 0: SEC_ACE_FLAG_INHERITED_ACE
+ 0x03: SEC_ACE_FLAG_VALID_INHERIT (3)
+ 0: SEC_ACE_FLAG_SUCCESSFUL_ACCESS
+ 0: SEC_ACE_FLAG_FAILED_ACCESS
+ size : 0x0018 (24)
+ access_mask : 0x001200a9 (1179817)
+ object : union security_ace_object_ctr(case 0)
+ trustee : S-1-5-32-549
+ coda : union security_ace_coda(case 0)
+ ignored : DATA_BLOB length=0
+ aces: struct security_ace
+ type : SEC_ACE_TYPE_ACCESS_ALLOWED (0)
+ flags : 0x03 (3)
+ 1: SEC_ACE_FLAG_OBJECT_INHERIT
+ 1: SEC_ACE_FLAG_CONTAINER_INHERIT
+ 0: SEC_ACE_FLAG_NO_PROPAGATE_INHERIT
+ 0: SEC_ACE_FLAG_INHERIT_ONLY
+ 0: SEC_ACE_FLAG_INHERITED_ACE
+ 0x03: SEC_ACE_FLAG_VALID_INHERIT (3)
+ 0: SEC_ACE_FLAG_SUCCESSFUL_ACCESS
+ 0: SEC_ACE_FLAG_FAILED_ACCESS
+ size : 0x0014 (20)
+ access_mask : 0x001f01ff (2032127)
+ object : union security_ace_object_ctr(case 0)
+ trustee : S-1-5-18
+ coda : union security_ace_coda(case 0)
+ ignored : DATA_BLOB length=0
+ aces: struct security_ace
+ type : SEC_ACE_TYPE_ACCESS_ALLOWED (0)
+ flags : 0x03 (3)
+ 1: SEC_ACE_FLAG_OBJECT_INHERIT
+ 1: SEC_ACE_FLAG_CONTAINER_INHERIT
+ 0: SEC_ACE_FLAG_NO_PROPAGATE_INHERIT
+ 0: SEC_ACE_FLAG_INHERIT_ONLY
+ 0: SEC_ACE_FLAG_INHERITED_ACE
+ 0x03: SEC_ACE_FLAG_VALID_INHERIT (3)
+ 0: SEC_ACE_FLAG_SUCCESSFUL_ACCESS
+ 0: SEC_ACE_FLAG_FAILED_ACCESS
+ size : 0x0014 (20)
+ access_mask : 0x001200a9 (1179817)
+ object : union security_ace_object_ctr(case 0)
+ trustee : S-1-5-11
+ coda : union security_ace_coda(case 0)
+ ignored : DATA_BLOB length=0
+ hash_type : 0x0001 (1)
+ hash: ARRAY(64)
diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build
new file mode 100644
index 0000000..7cc12cf
--- /dev/null
+++ b/source4/librpc/wscript_build
@@ -0,0 +1,554 @@
+#!/usr/bin/env python
+
+bld.RECURSE('../../librpc/idl')
+bld.RECURSE('../../librpc/tools')
+bld.RECURSE('idl')
+
+
+bld.SAMBA_SUBSYSTEM('NDR_IRPC',
+ source='gen_ndr/ndr_irpc.c',
+ public_deps='ndr NDR_SECURITY ndr_nbt'
+ )
+
+
+bld.SAMBA_SUBSYSTEM('NDR_SASL_HELPERS',
+ source='gen_ndr/ndr_sasl_helpers.c',
+ public_deps='ndr'
+ )
+
+
+
+bld.SAMBA_SUBSYSTEM('NDR_WINSIF',
+ source='gen_ndr/ndr_winsif.c',
+ public_deps='ndr NDR_WINSREPL'
+ )
+
+
+bld.SAMBA_SUBSYSTEM('NDR_OPENDB',
+ source='gen_ndr/ndr_opendb.c',
+ public_deps='ndr'
+ )
+
+
+bld.SAMBA_SUBSYSTEM('NDR_NTP_SIGND',
+ source='gen_ndr/ndr_ntp_signd.c',
+ public_deps='ndr'
+ )
+
+
+bld.SAMBA_SUBSYSTEM('NDR_WINSREPL',
+ source='gen_ndr/ndr_winsrepl.c',
+ public_deps='ndr ndr_nbt'
+ )
+
+
+# create a grouping library to consolidate our samba4 specific NDR code
+bld.SAMBA_LIBRARY('ndr-samba4',
+ source=[],
+ deps='NDR_WINBIND NDR_IRPC NDR_NFS4ACL NDR_OPENDB ndr-table',
+ private_library=True,
+ grouping_library=True
+ )
+
+# a grouping library for RPC_NDR subsystems that may be used by more than one target
+bld.SAMBA_LIBRARY('dcerpc-samba4',
+ source=[],
+ deps='RPC_NDR_WINBIND',
+ private_library=True,
+ grouping_library=True
+ )
+
+
+bld.SAMBA_PIDL_TABLES('GEN_NDR_TABLES', 'gen_ndr/tables.c')
+
+bld.SAMBA_SUBSYSTEM('ndr-table',
+ source='../../librpc/ndr/ndr_table.c gen_ndr/tables.c',
+ public_deps='''
+ ndr-standard
+ NDR_AUDIOSRV
+ NDR_DSBACKUP
+ NDR_EFS
+ NDR_DRSUAPI
+ NDR_POLICYAGENT
+ NDR_UNIXINFO
+ NDR_SPOOLSS
+ NDR_EPMAPPER
+ NDR_DBGIDL
+ NDR_DSSETUP
+ NDR_MSGSVC
+ NDR_WINSIF
+ NDR_MGMT
+ NDR_WZCSVC
+ NDR_BROWSER
+ NDR_W32TIME
+ NDR_SCERPC
+ NDR_TRKWKS
+ NDR_KEYSVC
+ ndr-krb5pac
+ NDR_SCHANNEL
+ NDR_ROT
+ NDR_DRSBLOBS
+ ndr_nbt
+ NDR_WINSREPL
+ NDR_SECURITY
+ NDR_DNSSERVER
+ NDR_WINSTATION
+ NDR_IRPC
+ NDR_OPENDB
+ NDR_SASL_HELPERS
+ NDR_NOTIFY
+ NDR_WINBIND
+ NDR_FRSRPC
+ NDR_FRSAPI
+ NDR_FRSTRANS
+ NDR_NTP_SIGND
+ NDR_NAMED_PIPE_AUTH
+ NDR_NTLMSSP
+ NDR_DFSBLOBS
+ NDR_DNSP
+ NDR_NTPRINTING
+ NDR_DNS
+ NDR_BACKUPKEY
+ NDR_PREG
+ NDR_BKUPBLOBS
+ NDR_FSCC
+ NDR_CLUSAPI
+ NDR_WINSPOOL
+ NDR_CAB
+ NDR_FSRVP_STATE
+ NDR_IOCTL
+ NDR_COMPRESSION
+ NDR_PRINTCAP
+ NDR_QUOTA
+ NDR_RAP
+ NDR_DCERPC
+ NDR_MESSAGING
+ NDR_SMB_ACL
+ NDR_PERFCOUNT
+ NDR_SECRETS
+ NDR_LEASES_DB
+ NDR_ODJ
+ NDR_ADS
+ ''',
+ depends_on='GEN_NDR_TABLES'
+ )
+
+
+bld.SAMBA_SUBSYSTEM('RPC_NDR_IRPC',
+ source='gen_ndr/ndr_irpc_c.c',
+ public_deps='dcerpc NDR_IRPC'
+ )
+
+bld.SAMBA_LIBRARY('dcerpc-samr',
+ source='',
+ pc_files='dcerpc_samr.pc',
+ vnum='0.0.1',
+ public_deps='dcerpc ndr-standard RPC_NDR_SAMR',
+ public_headers='../../librpc/gen_ndr/ndr_samr_c.h',
+ header_path='gen_ndr'
+ )
+
+
+bld.SAMBA_LIBRARY('dcerpc',
+ source='''rpc/dcerpc.c rpc/dcerpc_auth.c rpc/dcerpc_schannel.c
+ rpc/dcerpc_util.c rpc/dcerpc_smb.c rpc/dcerpc_sock.c
+ rpc/dcerpc_roh_channel_in.c rpc/dcerpc_roh_channel_out.c rpc/dcerpc_roh.c
+ rpc/dcerpc_connect.c rpc/dcerpc_secondary.c''',
+ pc_files='dcerpc.pc',
+ deps='''
+ samba_socket
+ LIBCLI_RESOLVE
+ LIBCLI_SMB
+ LIBCLI_SMB2
+ ndr
+ NDR_DCERPC
+ RPC_NDR_EPMAPPER
+ NDR_SCHANNEL
+ RPC_NDR_NETLOGON
+ RPC_NDR_MGMT
+ gensec
+ LIBCLI_AUTH
+ smbclient-raw
+ LP_RESOLVE
+ tevent-util
+ dcerpc-binding
+ dcerpc-pkt-auth
+ param_options
+ http''',
+ autoproto='rpc/dcerpc_proto.h',
+ public_deps='samba-credentials tevent talloc',
+ public_headers='''rpc/dcerpc.h''',
+ # It's very important to keep this form of construction
+ # it force the sambawaf extension to put everything that match the first element
+ # (*gen_ndr*) into the dir named by the second element (gen_ndr).
+ # If we just put header_path = 'gen_ndr' then all the public_headers will go
+ # in 'gen_ndr' and for dcerpc.h (at least) it will cause a problem as
+ # we have already a dcerpc.h installed by librpc/wscript_build
+ # and one will overwrite the other which is not what we expect.
+ header_path=[ ('*gen_ndr*', 'gen_ndr') ],
+ vnum='0.0.1'
+ )
+
+gen_cflags = ''
+if bld.CONFIG_SET('HAVE_WNO_UNUSED_FUNCTION'):
+ gen_cflags = '-Wno-unused-function'
+
+pyrpc_util = bld.pyembed_libname('pyrpc_util')
+pytalloc_util = bld.pyembed_libname('pytalloc-util')
+pyparam_util = bld.pyembed_libname('pyparam_util')
+
+bld.SAMBA_SUBSYSTEM(pyrpc_util,
+ source='rpc/pyrpc_util.c',
+ public_deps='%s %s dcerpc MESSAGING' % (pytalloc_util, pyparam_util),
+ pyext=True,
+ enabled=bld.PYTHON_BUILD_IS_ENABLED(),
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc',
+ source='rpc/pyrpc.c',
+ public_deps='LIBCLI_SMB samba-util samba-hostconfig dcerpc-samr RPC_NDR_LSA DYNCONFIG %s gensec' % pyrpc_util,
+ realname='samba/dcerpc/base.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_misc',
+ source='../../librpc/gen_ndr/py_misc.c',
+ deps='%s %s ndr-krb5pac' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/misc.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_auth',
+ source='../../librpc/gen_ndr/py_auth.c',
+ deps='NDR_AUTH %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/auth.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_security',
+ source='../../librpc/gen_ndr/py_security.c',
+ deps='%s %s NDR_SECURITY' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/security.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_conditional_ace',
+ source=('../../librpc/gen_ndr/py_conditional_ace.c '
+ '../../librpc/gen_ndr/ndr_conditional_ace.c'),
+ deps='%s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/conditional_ace.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_lsa',
+ source='../../librpc/gen_ndr/py_lsa.c',
+ deps='RPC_NDR_LSA %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/lsa.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_krb5pac',
+ source='../../librpc/gen_ndr/py_krb5pac.c',
+ deps='ndr-krb5pac %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/krb5pac.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_krb5ccache',
+ source='../../librpc/gen_ndr/py_krb5ccache.c',
+ deps='NDR_KRB5CCACHE %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/krb5ccache.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_claims',
+ source='../../librpc/gen_ndr/py_claims.c',
+ deps='NDR_CLAIMS %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/claims.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_gkdi',
+ source='../../librpc/gen_ndr/py_gkdi.c',
+ deps='RPC_NDR_GKDI %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/gkdi.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_gmsa',
+ source='../../librpc/gen_ndr/py_gmsa.c',
+ deps='NDR_GMSA %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/gmsa.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_netlogon',
+ source='../../librpc/gen_ndr/py_netlogon.c',
+ deps='RPC_NDR_NETLOGON %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/netlogon.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_samr',
+ source='../../librpc/gen_ndr/py_samr.c',
+ deps='dcerpc-samr %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/samr.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_spoolss',
+ source='../../librpc/gen_ndr/py_spoolss.c',
+ deps='RPC_NDR_SPOOLSS %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/spoolss.so'
+ )
+
+bld.SAMBA_PYTHON('python_winspool',
+ source='../../librpc/gen_ndr/py_winspool.c',
+ deps='RPC_NDR_WINSPOOL %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/winspool.so'
+ )
+
+bld.SAMBA_PYTHON('python_witness',
+ source='../../librpc/gen_ndr/py_witness.c',
+ deps='RPC_NDR_WITNESS %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/witness.so'
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_nbt',
+ source='../../librpc/gen_ndr/py_nbt.c',
+ deps='ndr_nbt %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/nbt.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_drsblobs',
+ source='../../librpc/gen_ndr/py_drsblobs.c',
+ deps='%s %s NDR_SECURITY NDR_DRSBLOBS' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/drsblobs.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_ntlmssp',
+ source='../../librpc/gen_ndr/py_ntlmssp.c',
+ deps='%s %s NDR_NTLMSSP' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/ntlmssp.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_srvsvc',
+ source='../../librpc/gen_ndr/py_srvsvc.c',
+ deps='RPC_NDR_SRVSVC %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/srvsvc.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_echo',
+ source='../../librpc/gen_ndr/py_echo.c',
+ deps='RPC_NDR_ECHO %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/echo.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dns',
+ source='../../librpc/gen_ndr/py_dns.c',
+ deps='NDR_DNS %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/dns.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_winreg',
+ source='../../librpc/gen_ndr/py_winreg.c',
+ deps='RPC_NDR_WINREG %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/winreg.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_preg',
+ source='../../librpc/gen_ndr/py_preg.c',
+ deps='NDR_PREG %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/preg.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_initshutdown',
+ source='../../librpc/gen_ndr/py_initshutdown.c',
+ deps='RPC_NDR_INITSHUTDOWN %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/initshutdown.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_epmapper',
+ source='../../librpc/gen_ndr/py_epmapper.c',
+ deps='dcerpc %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/epmapper.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_mgmt',
+ source='../../librpc/gen_ndr/py_mgmt.c',
+ deps='dcerpc %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/mgmt.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_atsvc',
+ source='../../librpc/gen_ndr/py_atsvc.c',
+ deps='RPC_NDR_ATSVC %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/atsvc.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_svcctl',
+ source='../../librpc/gen_ndr/py_svcctl.c',
+ deps='RPC_NDR_SVCCTL %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/svcctl.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_wkssvc',
+ source='../../librpc/gen_ndr/py_wkssvc.c',
+ deps='RPC_NDR_WKSSVC %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/wkssvc.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_dfs',
+ source='../../librpc/gen_ndr/py_dfs.c',
+ deps='RPC_NDR_DFS %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/dfs.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_dcerpc',
+ source='../../librpc/gen_ndr/py_dcerpc.c',
+ deps='NDR_DCERPC %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/dcerpc.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_unixinfo',
+ source='../../librpc/gen_ndr/py_unixinfo.c',
+ deps='RPC_NDR_UNIXINFO %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/unixinfo.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_irpc',
+ source='gen_ndr/py_irpc.c',
+ deps='RPC_NDR_IRPC %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/irpc.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_server_id',
+ source='../../librpc/gen_ndr/py_server_id.c',
+ deps='NDR_SERVER_ID %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/server_id.so',
+ cflags_end=gen_cflags
+ )
+
+python_netlogon = 'python_netlogon'
+bld.SAMBA_PYTHON('python_winbind',
+ source='../../librpc/gen_ndr/py_winbind.c',
+ deps='RPC_NDR_WINBIND %s %s %s' % (pytalloc_util, pyrpc_util, python_netlogon),
+ realname='samba/dcerpc/winbind.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_drsuapi',
+ source='../../librpc/gen_ndr/py_drsuapi.c',
+ deps='RPC_NDR_DRSUAPI %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/drsuapi.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_dnsp',
+ source='../../librpc/gen_ndr/py_dnsp.c',
+ deps='%s %s NDR_SECURITY NDR_DNSP' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/dnsp.so',
+ cflags_end=gen_cflags
+ )
+
+
+bld.SAMBA_PYTHON('python_dcerpc_xattr',
+ source='../../librpc/gen_ndr/py_xattr.c',
+ deps='%s %s NDR_XATTR' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/xattr.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_smb3posix',
+ source='../../librpc/gen_ndr/py_smb3posix.c',
+ deps='%s %s NDR_SMB3POSIX' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/smb3posix.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_idmap',
+ source='../../librpc/gen_ndr/py_idmap.c',
+ deps='%s %s NDR_IDMAP' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/idmap.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dnsserver',
+ source='../../librpc/gen_ndr/py_dnsserver.c',
+ deps='RPC_NDR_DNSSERVER %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/dnsserver.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_dcerpc_smb_acl',
+ source='../../librpc/gen_ndr/py_smb_acl.c',
+ deps='%s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/smb_acl.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('dcerpc_python_messaging',
+ source='../../librpc/gen_ndr/py_messaging.c',
+ deps='%s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/messaging.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('dcerpc_windows_event_ids',
+ source='../../librpc/gen_ndr/py_windows_event_ids.c',
+ deps='%s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/windows_event_ids.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_PYTHON('python_mdssvc',
+ source='../../librpc/gen_ndr/py_mdssvc.c',
+ deps='RPC_NDR_MDSSVC %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/mdssvc.so',
+ cflags_end=gen_cflags
+ )
+
+bld.SAMBA_SUBSYSTEM('RPC_NDR_SMBXSRV',
+ source='../../source3/librpc/gen_ndr/ndr_smbXsrv_c.c',
+ public_deps='dcerpc-binding NDR_SMBXSRV'
+ )
+
+bld.SAMBA_PYTHON('python_smbXsrv',
+ source='../../source3/librpc/gen_ndr/py_smbXsrv.c',
+ deps='RPC_NDR_SMBXSRV %s %s' % (pytalloc_util, pyrpc_util),
+ realname='samba/dcerpc/smbXsrv.so',
+ cflags_end=gen_cflags
+ )
+
+if bld.PYTHON_BUILD_IS_ENABLED():
+ bld.SAMBA_SCRIPT('python_dcerpc_init',
+ pattern='rpc/dcerpc.py',
+ installdir='python/samba/dcerpc',
+ installname='__init__.py')
+
+ bld.INSTALL_FILES('${PYTHONARCHDIR}/samba/dcerpc', 'rpc/dcerpc.py', destname='__init__.py')