Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
August 2018
- 62 participants
- 701 discussions
27 Aug '18
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
What was called CSS attributes in old IEs is now called properties in
recent IEs and the spec.
dlls/mshtml/htmlstyle.c | 72
++++++++++++++++++++++++-------------------------
1 file changed, 36 insertions(+), 36 deletions(-)
1
0
27 Aug '18
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/mshtml/htmlstyle.c | 133
++++++++++++++++++++++++------------------------
1 file changed, 66 insertions(+), 67 deletions(-)
1
0
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/mshtml/htmlstyle.c | 76
+++++++++++++++++++++++++------------------------
1 file changed, 39 insertions(+), 37 deletions(-)
1
0
[PATCH 1/8] mshtml: Store style property flags in an array and use it in set_nsstyle_attr and get_nsstyle_attr_var.
by Jacek Caban 27 Aug '18
by Jacek Caban 27 Aug '18
27 Aug '18
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/mshtml/htmlstyle.c | 343
++++++++++++++++++++++++------------------------
1 file changed, 173 insertions(+), 170 deletions(-)
1
0
Signed-off-by: Guillaume Charifi <guillaume.charifi(a)sfr.fr>
---
dlls/iphlpapi/iphlpapi.spec | 2 +-
dlls/iphlpapi/iphlpapi_main.c | 30 ++++-
dlls/iphlpapi/ipstats.c | 244 ++++++++++++++++++++++++++++++++++
dlls/iphlpapi/ipstats.h | 1 +
include/iphlpapi.h | 2 +
include/udpmib.h | 53 ++++++++
include/ws2ipdef.h | 17 +++
7 files changed, 342 insertions(+), 7 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec
index 1686644de0..fd00cc093a 100644
--- a/dlls/iphlpapi/iphlpapi.spec
+++ b/dlls/iphlpapi/iphlpapi.spec
@@ -141,7 +141,7 @@
@ stdcall GetTcpTable2( ptr ptr long )
@ stub GetTcpTableFromStack
#@ stub GetTeredoPort
-#@ stub GetUdp6Table
+@ stdcall GetUdp6Table( ptr ptr long )
@ stdcall GetUdpStatisticsEx( ptr long )
@ stdcall GetUdpStatistics( ptr )
@ stub GetUdpStatsFromStack
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 7de70c9ef4..c7140cd974 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -2442,6 +2442,14 @@ DWORD WINAPI GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder)
return GetExtendedUdpTable(pUdpTable, pdwSize, bOrder, WS_AF_INET, UDP_TABLE_BASIC, 0);
}
+/******************************************************************
+ * GetUdp6Table (IPHLPAPI.@)
+ */
+DWORD WINAPI GetUdp6Table(PMIB_UDP6TABLE pUdpTable, PDWORD pdwSize, BOOL bOrder)
+{
+ return GetExtendedUdpTable(pUdpTable, pdwSize, bOrder, WS_AF_INET6, UDP_TABLE_BASIC, 0);
+}
+
/******************************************************************
* GetExtendedUdpTable (IPHLPAPI.@)
*/
@@ -2456,15 +2464,25 @@ DWORD WINAPI GetExtendedUdpTable(PVOID pUdpTable, PDWORD pdwSize, BOOL bOrder,
if (!pdwSize) return ERROR_INVALID_PARAMETER;
- if (ulAf != WS_AF_INET)
- {
- FIXME("ulAf = %u not supported\n", ulAf);
- return ERROR_NOT_SUPPORTED;
- }
if (TableClass == UDP_TABLE_OWNER_MODULE)
FIXME("UDP_TABLE_OWNER_MODULE not fully supported\n");
- if ((ret = build_udp_table(TableClass, &table, bOrder, GetProcessHeap(), 0, &size)))
+ switch (ulAf)
+ {
+ case WS_AF_INET:
+ ret = build_udp_table(TableClass, &table, bOrder, GetProcessHeap(), 0, &size);
+ break;
+
+ case WS_AF_INET6:
+ ret = build_udp6_table(TableClass, &table, bOrder, GetProcessHeap(), 0, &size);
+ break;
+
+ default:
+ FIXME("ulAf = %u not supported\n", ulAf);
+ ret = ERROR_NOT_SUPPORTED;
+ }
+
+ if (ret)
return ret;
if (!pUdpTable || *pdwSize < size)
diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c
index 799d03d574..994e1fe127 100644
--- a/dlls/iphlpapi/ipstats.c
+++ b/dlls/iphlpapi/ipstats.c
@@ -151,6 +151,9 @@
#include "ntstatus.h"
#define WIN32_NO_STATUS
#define NONAMELESSUNION
+#define USE_WS_PREFIX
+#include "winsock2.h"
+#include "ws2ipdef.h"
#include "ifenum.h"
#include "ipstats.h"
#include "iphlpapi.h"
@@ -2565,6 +2568,247 @@ DWORD build_udp_table( UDP_TABLE_CLASS class, void **tablep, BOOL order, HANDLE
return ret;
}
+static DWORD get_udp6_table_sizes( UDP_TABLE_CLASS class, DWORD row_count, DWORD *row_size )
+{
+ DWORD table_size;
+
+ switch (class)
+ {
+ case UDP_TABLE_BASIC:
+ {
+ table_size = FIELD_OFFSET(MIB_UDP6TABLE, table[row_count]);
+ if (row_size) *row_size = sizeof(MIB_UDP6ROW);
+ break;
+ }
+ case UDP_TABLE_OWNER_PID:
+ {
+ table_size = FIELD_OFFSET(MIB_UDP6TABLE_OWNER_PID, table[row_count]);
+ if (row_size) *row_size = sizeof(MIB_UDP6ROW_OWNER_PID);
+ break;
+ }
+ case UDP_TABLE_OWNER_MODULE:
+ {
+ table_size = FIELD_OFFSET(MIB_UDP6TABLE_OWNER_MODULE, table[row_count]);
+ if (row_size) *row_size = sizeof(MIB_UDP6ROW_OWNER_MODULE);
+ break;
+ }
+ default:
+ ERR("unhandled class %u\n", class);
+ return 0;
+ }
+ return table_size;
+}
+
+static MIB_UDP6TABLE *append_udp6_row( UDP_TABLE_CLASS class, HANDLE heap, DWORD flags,
+ MIB_UDP6TABLE *table, DWORD *count,
+ const MIB_UDP6ROW_OWNER_MODULE *row, DWORD row_size )
+{
+ if (table->dwNumEntries >= *count)
+ {
+ MIB_UDP6TABLE *new_table;
+ DWORD new_count = table->dwNumEntries * 2, new_table_size;
+
+ new_table_size = get_udp6_table_sizes( class, new_count, NULL );
+ if (!(new_table = HeapReAlloc( heap, flags, table, new_table_size )))
+ {
+ HeapFree( heap, 0, table );
+ return NULL;
+ }
+ *count = new_count;
+ table = new_table;
+ }
+ memcpy( (char *)table->table + (table->dwNumEntries * row_size), row, row_size );
+ table->dwNumEntries++;
+ return table;
+}
+
+static int compare_udp6_rows(const void *a, const void *b)
+{
+ const MIB_UDP6ROW *rowA = a;
+ const MIB_UDP6ROW *rowB = b;
+ int ret;
+
+ if ((ret = memcmp(&rowA->dwLocalAddr, &rowB->dwLocalAddr, sizeof(rowA->dwLocalAddr)) != 0)) return ret;
+ if ((ret = rowA->dwLocalScopeId - rowB->dwLocalScopeId) != 0) return ret;
+ return rowA->dwLocalPort - rowB->dwLocalPort;
+}
+
+struct ipv6_addr_scope
+{
+ IN6_ADDR addr;
+ DWORD scope;
+};
+
+static struct ipv6_addr_scope *get_ipv6_addr_scope_table(unsigned int *size)
+{
+ struct ipv6_addr_scope *table = NULL;
+ unsigned int table_size = 0;
+
+ if (!(table = HeapAlloc( GetProcessHeap(), 0, sizeof(table[0]) )))
+ return NULL;
+
+#ifdef __linux__
+ {
+ FILE *fp;
+ char buf[512], *ptr;
+
+ if (!(fp = fopen( "/proc/net/if_inet6", "r" )))
+ goto failed;
+
+ while ((ptr = fgets( buf, sizeof(buf), fp )))
+ {
+ WORD a[8];
+ DWORD scope;
+ struct ipv6_addr_scope *new_table;
+ struct ipv6_addr_scope *entry;
+ unsigned int i;
+
+ if (sscanf( ptr, "%4hx%4hx%4hx%4hx%4hx%4hx%4hx%4hx %*s %*s %x",
+ &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &scope ) != 9)
+ continue;
+
+ table_size++;
+ if (!(new_table = HeapReAlloc( GetProcessHeap(), 0, table, table_size * sizeof(table[0]) )))
+ {
+ fclose(fp);
+ goto failed;
+ }
+
+ table = new_table;
+ entry = &table[table_size - 1];
+
+ i = 0;
+ while (i < 8)
+ {
+ entry->addr.u.Word[i] = htons(a[i]);
+ i++;
+ }
+
+ entry->scope = htons(scope);
+ }
+ }
+#else
+ FIXME( "not implemented\n" );
+ goto failed;
+#endif
+
+ *size = table_size;
+ return table;
+
+failed:
+ HeapFree( GetProcessHeap(), 0, table );
+ return NULL;
+}
+
+static DWORD find_ipv6_addr_scope(const IN6_ADDR *addr, const struct ipv6_addr_scope *table, unsigned int size)
+{
+ const BYTE multicast_scope_mask = 0x0F;
+ const BYTE multicast_scope_shift = 0;
+ unsigned int i = 0;
+
+ if (WS_IN6_IS_ADDR_UNSPECIFIED(addr))
+ return 0;
+
+ if (WS_IN6_IS_ADDR_MULTICAST(addr))
+ return htons((addr->u.Byte[1] & multicast_scope_mask) >> multicast_scope_shift);
+
+ if (!table)
+ return -1;
+
+ while (i < size)
+ {
+ if (memcmp(&table[i].addr, addr, sizeof(table[i].addr)) == 0)
+ return table[i].scope;
+ i++;
+ }
+
+ return -1;
+}
+
+DWORD build_udp6_table( UDP_TABLE_CLASS class, void **tablep, BOOL order, HANDLE heap, DWORD flags,
+ DWORD *size )
+{
+ MIB_UDP6TABLE *table;
+ MIB_UDP6ROW_OWNER_MODULE row;
+ DWORD ret = NO_ERROR, count = 16, table_size, row_size;
+
+ if (!(table_size = get_udp6_table_sizes( class, count, &row_size )))
+ return ERROR_INVALID_PARAMETER;
+
+ if (!(table = HeapAlloc( heap, flags, table_size )))
+ return ERROR_OUTOFMEMORY;
+
+ table->dwNumEntries = 0;
+ memset( &row, 0, sizeof(row) );
+
+#ifdef __linux__
+ {
+ FILE *fp;
+
+ if ((fp = fopen( "/proc/net/udp6", "r" )))
+ {
+ char buf[512], *ptr;
+ struct pid_map *map = NULL;
+ unsigned int num_entries = 0;
+ struct ipv6_addr_scope *addr_scopes;
+ unsigned int addr_scopes_size = 0;
+ unsigned int dummy;
+ int inode;
+
+ addr_scopes = get_ipv6_addr_scope_table(&addr_scopes_size);
+
+ if (class >= UDP_TABLE_OWNER_PID) map = get_pid_map( &num_entries );
+
+ /* skip header line */
+ ptr = fgets( buf, sizeof(buf), fp );
+ while ((ptr = fgets( buf, sizeof(buf), fp )))
+ {
+ DWORD in6_addr32[4];
+
+ if (sscanf( ptr, "%u: %8x%8x%8x%8x:%x %*s %*s %*s %*s %*s %*s %*s %d", &dummy,
+ &in6_addr32[0], &in6_addr32[1], &in6_addr32[2], &in6_addr32[3],
+ &row.dwLocalPort, &inode ) != 7)
+ continue;
+ memcpy(&row.ucLocalAddr, in6_addr32, sizeof(row.ucLocalAddr));
+ row.dwLocalScopeId = find_ipv6_addr_scope((const IN6_ADDR *)&row.ucLocalAddr, addr_scopes, addr_scopes_size);
+ row.dwLocalPort = htons( row.dwLocalPort );
+
+ if (class >= UDP_TABLE_OWNER_PID)
+ row.dwOwningPid = find_owning_pid( map, num_entries, inode );
+ if (class >= UDP_TABLE_OWNER_MODULE)
+ {
+ row.liCreateTimestamp.QuadPart = 0; /* FIXME */
+ row.u.dwFlags = 0;
+ memset( &row.OwningModuleInfo, 0, sizeof(row.OwningModuleInfo) );
+ }
+ if (!(table = append_udp6_row( class, heap, flags, table, &count, &row, row_size )))
+ break;
+ }
+ HeapFree( GetProcessHeap(), 0, map );
+ if (addr_scopes)
+ HeapFree( GetProcessHeap(), 0, addr_scopes );
+ fclose( fp );
+ }
+ else ret = ERROR_NOT_SUPPORTED;
+ }
+#else
+ FIXME( "not implemented\n" );
+ ret = ERROR_NOT_SUPPORTED;
+#endif
+
+ if (!table) return ERROR_OUTOFMEMORY;
+ if (!ret)
+ {
+ if (order && table->dwNumEntries)
+ qsort( table->table, table->dwNumEntries, row_size, compare_udp6_rows );
+ *tablep = table;
+ }
+ else HeapFree( heap, flags, table );
+ if (size) *size = get_udp6_table_sizes( class, count, NULL );
+ TRACE( "returning ret %u table %p\n", ret, table );
+ return ret;
+}
+
/******************************************************************
* AllocateAndGetUdpTableFromStack (IPHLPAPI.@)
*
diff --git a/dlls/iphlpapi/ipstats.h b/dlls/iphlpapi/ipstats.h
index d742d6380a..acf43ee27c 100644
--- a/dlls/iphlpapi/ipstats.h
+++ b/dlls/iphlpapi/ipstats.h
@@ -34,5 +34,6 @@ DWORD getInterfaceStatsByName(const char *name, PMIB_IFROW entry) DECLSPEC_HIDDE
DWORD build_tcp_table(TCP_TABLE_CLASS, void **, BOOL, HANDLE, DWORD, DWORD *) DECLSPEC_HIDDEN;
DWORD build_udp_table(UDP_TABLE_CLASS, void **, BOOL, HANDLE, DWORD, DWORD *) DECLSPEC_HIDDEN;
+DWORD build_udp6_table(UDP_TABLE_CLASS, void **, BOOL, HANDLE, DWORD, DWORD *) DECLSPEC_HIDDEN;
#endif /* ndef WINE_IPSTATS_H_ */
diff --git a/include/iphlpapi.h b/include/iphlpapi.h
index 54d93d1c9c..86507dfd4d 100644
--- a/include/iphlpapi.h
+++ b/include/iphlpapi.h
@@ -51,6 +51,8 @@ DWORD WINAPI GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder);
DWORD WINAPI GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder);
+DWORD WINAPI GetUdp6Table(PMIB_UDP6TABLE pUdpTable, PDWORD pdwSize, BOOL bOrder);
+
DWORD WINAPI GetIpStatistics(PMIB_IPSTATS pStats);
DWORD WINAPI GetIpStatisticsEx(PMIB_IPSTATS pStats, DWORD dwFamily);
diff --git a/include/udpmib.h b/include/udpmib.h
index 6b3f51cf2f..3d1bba5ee5 100644
--- a/include/udpmib.h
+++ b/include/udpmib.h
@@ -18,6 +18,8 @@
#ifndef __WINE_UDPMIB_H
#define __WINE_UDPMIB_H
+#include <in6addr.h>
+
#define TCPIP_OWNING_MODULE_SIZE 16
@@ -71,6 +73,57 @@ typedef struct _MIB_UDPTABLE_OWNER_MODULE
MIB_UDPROW_OWNER_MODULE table[1];
} MIB_UDPTABLE_OWNER_MODULE, *PMIB_UDPTABLE_OWNER_MODULE;
+typedef struct _MIB_UDP6ROW
+{
+ IN6_ADDR dwLocalAddr;
+ DWORD dwLocalScopeId;
+ DWORD dwLocalPort;
+} MIB_UDP6ROW, *PMIB_UDP6ROW;
+
+typedef struct _MIB_UDP6TABLE
+{
+ DWORD dwNumEntries;
+ MIB_UDP6ROW table[1];
+} MIB_UDP6TABLE, *PMIB_UDP6TABLE;
+
+typedef struct _MIB_UDP6ROW_OWNER_PID
+{
+ UCHAR ucLocalAddr[16];
+ DWORD dwLocalScopeId;
+ DWORD dwLocalPort;
+ DWORD dwOwningPid;
+} MIB_UDP6ROW_OWNER_PID, *PMIB_UDP6ROW_OWNER_PID;
+
+typedef struct _MIB_UDP6TABLE_OWNER_PID
+{
+ DWORD dwNumEntries;
+ MIB_UDP6ROW_OWNER_PID table[1];
+} MIB_UDP6TABLE_OWNER_PID, *PMIB_UDP6TABLE_OWNER_PID;
+
+typedef struct _MIB_UDP6ROW_OWNER_MODULE
+{
+ UCHAR ucLocalAddr[16];
+ DWORD dwLocalScopeId;
+ DWORD dwLocalPort;
+ DWORD dwOwningPid;
+ LARGE_INTEGER liCreateTimestamp;
+ __C89_NAMELESS union
+ {
+ __C89_NAMELESS struct
+ {
+ int SpecificPortBind:1;
+ } __C89_NAMELESSSTRUCTNAME;
+ int dwFlags;
+ } __C89_NAMELESSUNIONNAME;
+ ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
+} MIB_UDP6ROW_OWNER_MODULE, *PMIB_UDP6ROW_OWNER_MODULE;
+
+typedef struct _MIB_UDP6TABLE_OWNER_MODULE
+{
+ DWORD dwNumEntries;
+ MIB_UDP6ROW_OWNER_MODULE table[1];
+} MIB_UDP6TABLE_OWNER_MODULE, *PMIB_UDP6TABLE_OWNER_MODULE;
+
/* UDP statistics */
typedef struct _MIB_UDPSTATS
diff --git a/include/ws2ipdef.h b/include/ws2ipdef.h
index e4cbce1a86..d2d1548ccb 100644
--- a/include/ws2ipdef.h
+++ b/include/ws2ipdef.h
@@ -296,6 +296,23 @@ static inline BOOL WS(IN6_IS_ADDR_LOOPBACK) ( const IN6_ADDR *a )
(a->s6_words[7] == 0x0100));
}
+static inline BOOL WS(IN6_IS_ADDR_MULTICAST) ( const IN6_ADDR *a )
+{
+ return (BOOL)(a->s6_bytes[0] == 0xff);
+}
+
+static inline BOOL WS(IN6_IS_ADDR_UNSPECIFIED) ( const IN6_ADDR *a )
+{
+ return (BOOL)((a->s6_words[0] == 0) &&
+ (a->s6_words[1] == 0) &&
+ (a->s6_words[2] == 0) &&
+ (a->s6_words[3] == 0) &&
+ (a->s6_words[4] == 0) &&
+ (a->s6_words[5] == 0) &&
+ (a->s6_words[6] == 0) &&
+ (a->s6_words[7] == 0));
+}
+
#ifdef __cplusplus
}
#endif
--
Guillaume Charifi <guillaume.charifi(a)sfr.fr>
1
1
[v3 resend PATCH 1/2] user32: When registering redirected class use correct base class name.
by Nikolay Sivov 27 Aug '18
by Nikolay Sivov 27 Aug '18
27 Aug '18
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45689
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/user32/class.c | 31 +++++++++++++++++++++----------
dlls/user32/user_private.h | 2 +-
dlls/user32/win.c | 2 +-
3 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 07d36f05d7..5383b6771f 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -320,7 +320,7 @@ static void CLASS_FreeClass( CLASS *classPtr )
USER_Unlock();
}
-const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_offset, BOOL register_class )
+const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_offset, WCHAR *combined, BOOL register_class )
{
ACTCTX_SECTION_KEYED_DATA data;
struct wndclass_redirect_data
@@ -335,9 +335,12 @@ const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_offset, B
const WCHAR *module, *ret;
UNICODE_STRING name_us;
HMODULE hmod;
+ UINT offset;
- if (basename_offset)
- *basename_offset = 0;
+ if (!basename_offset)
+ basename_offset = &offset;
+
+ *basename_offset = 0;
if (IS_INTRESOURCE( name ))
return name;
@@ -352,14 +355,21 @@ const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_offset, B
return name;
wndclass = (struct wndclass_redirect_data *)data.lpData;
- if (basename_offset)
- *basename_offset = wndclass->name_len / sizeof(WCHAR) - strlenW(name);
+ *basename_offset = wndclass->name_len / sizeof(WCHAR) - strlenW(name);
module = (const WCHAR *)((BYTE *)data.lpSectionBase + wndclass->module_offset);
if (!(hmod = GetModuleHandleW( module )))
hmod = LoadLibraryW( module );
+ /* Combined name is used to register versioned class name. Base name part will match exactly
+ original class name and won't be reused from context data. */
ret = (const WCHAR *)((BYTE *)wndclass + wndclass->name_offset);
+ if (combined)
+ {
+ memcpy(combined, ret, *basename_offset * sizeof(WCHAR));
+ strcpyW(&combined[*basename_offset], name);
+ ret = combined;
+ }
if (register_class && hmod)
{
@@ -409,7 +419,7 @@ static CLASS *CLASS_FindClass( LPCWSTR name, HINSTANCE hinstance )
if (!name) return NULL;
- name = CLASS_GetVersionedName( name, NULL, TRUE );
+ name = CLASS_GetVersionedName( name, NULL, NULL, TRUE );
for (;;)
{
@@ -662,8 +672,8 @@ ATOM WINAPI RegisterClassW( const WNDCLASSW* wc )
*/
ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
{
+ WCHAR name[MAX_ATOM_LEN + 1], combined[MAX_ATOM_LEN + 1];
const WCHAR *classname = NULL;
- WCHAR name[MAX_ATOM_LEN + 1];
ATOM atom;
CLASS *classPtr;
HINSTANCE instance;
@@ -682,7 +692,7 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
{
UINT basename_offset;
if (!MultiByteToWideChar( CP_ACP, 0, wc->lpszClassName, -1, name, MAX_ATOM_LEN + 1 )) return 0;
- classname = CLASS_GetVersionedName( name, &basename_offset, FALSE );
+ classname = CLASS_GetVersionedName( name, &basename_offset, combined, FALSE );
classPtr = CLASS_RegisterClass( classname, basename_offset, instance, !(wc->style & CS_GLOBALCLASS),
wc->style, wc->cbClsExtra, wc->cbWndExtra );
}
@@ -720,6 +730,7 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
*/
ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
{
+ WCHAR name[MAX_ATOM_LEN + 1];
const WCHAR *classname;
UINT basename_offset;
ATOM atom;
@@ -736,7 +747,7 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
}
if (!(instance = wc->hInstance)) instance = GetModuleHandleW( NULL );
- classname = CLASS_GetVersionedName( wc->lpszClassName, &basename_offset, FALSE );
+ classname = CLASS_GetVersionedName( wc->lpszClassName, &basename_offset, name, FALSE );
if (!(classPtr = CLASS_RegisterClass( classname, basename_offset, instance, !(wc->style & CS_GLOBALCLASS),
wc->style, wc->cbClsExtra, wc->cbWndExtra )))
return 0;
@@ -789,7 +800,7 @@ BOOL WINAPI UnregisterClassW( LPCWSTR className, HINSTANCE hInstance )
GetDesktopWindow(); /* create the desktop window to trigger builtin class registration */
- className = CLASS_GetVersionedName( className, NULL, FALSE );
+ className = CLASS_GetVersionedName( className, NULL, NULL, FALSE );
SERVER_START_REQ( destroy_class )
{
req->instance = wine_server_client_ptr( hInstance );
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 73a2badc7d..0ee7dbeece 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -273,7 +273,7 @@ extern BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
LRESULT *result, BOOL unicode, enum wm_char_mapping mapping ) DECLSPEC_HIDDEN;
extern const WCHAR *CLASS_GetVersionedName(const WCHAR *classname, UINT *basename_offset,
- BOOL register_class) DECLSPEC_HIDDEN;
+ WCHAR *combined, BOOL register_class) DECLSPEC_HIDDEN;
/* message spy definitions */
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index e7bbc4eb90..2a55ab4ce6 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1349,7 +1349,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
CBT_CREATEWNDW cbtc;
CREATESTRUCTW cbcs;
- className = CLASS_GetVersionedName(className, NULL, TRUE);
+ className = CLASS_GetVersionedName(className, NULL, NULL, TRUE);
TRACE("%s %s%s%s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
unicode ? debugstr_w(cs->lpszName) : debugstr_a((LPCSTR)cs->lpszName),
--
2.18.0
1
1
Adapted from emblem-favorite in the Tango Icon Library.
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/shell32/Makefile.in | 1 +
dlls/shell32/resources/favorites.ico | Bin 0 -> 49876 bytes
dlls/shell32/resources/favorites.svg | 548 +++++++++++++++++++++++++++
dlls/shell32/shell32.rc | 11 +-
dlls/shell32/shresdef.h | 4 +-
5 files changed, 560 insertions(+), 4 deletions(-)
create mode 100644 dlls/shell32/resources/favorites.ico
create mode 100644 dlls/shell32/resources/favorites.svg
diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index 8bac5903e9..5d76218d9a 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -69,6 +69,7 @@ SVG_SRCS = \
resources/document.svg \
resources/drive.svg \
resources/eject.svg \
+ resources/favorites.svg \
resources/floppy.svg \
resources/folder.svg \
resources/folder_open.svg \
diff --git a/dlls/shell32/resources/favorites.ico b/dlls/shell32/resources/favorites.ico
new file mode 100644
index 0000000000000000000000000000000000000000..e976000d032900c0b4a414ffc023cdd260137941
GIT binary patch
literal 49876
zcmeEv1zc9k*7pYK2I-WN79^y*ySuwYr8}fUKu|zX5D*0e5Kur`Q0Y!-1O)^E0cm)?
zdGvbjx##N9<2m=<^L{@!v-doE(a)7Xi|S<`FHT0js2gaN(a)11n2~W!VN)pz;7<DPxl3k
z5cB{%`*cqV6;MKuj={g)A9z5}i4*?_j|V|{NuTf0paL`qQpx?-`^|e0ga^XG({n(A
zpc`eM(a)6jL!WC%j4{MY-lwGb4ep(c-wK(a)JCst*9WQ1^*g;qM-oK#I3*%cu4k=s*(^?
zl8AX=38H~cSSx6$LXh7{2nq>@pgr&?WC4OaLDt?{K#<Ti2qL*~qe(a)c*yg;#1mY0EG
z(a)W1TZ{43xIs)wSgEb1#XQp}SGvFJYS;1Qm+rJ5H6A^L!n0e%SN4MO8YxuXN<v7#s=
zspB*HZo=^z<*@I_ey~d|Cr?<QIeG|0av2E$uiauM_jv-b^7~|gy2K6UVP_8)wpb3U
z-soJqc_B5*#TPNNGO1Q93Afo;wo*7^UT{y>Auvc12qR!|?OWJY`TN~3y63(Uh0<`B
z3=avF$5fPOep|L%8`-PYG{bLyKyXzMl~7jmuXAMLMm-1v)x=yEQ^?tm5j#B`889qV
z?vqeiFp?qRX1@;;DV9`oniG+%59ud2xq5*Xi3A3fN(SHb8$hf=U<+YHBzAb%(qm|;
z(a)FvF^LsF}sPx^|3meT%P(YjaYD2yfq7t9)wrvor;LXX6*#3(`Zj~d*tsn2+pFD9!N
z*%&GeFBe=SIsHhZV<1;kx*tomsYhb?9>3->5%eM?eI*eDS^ZI2_0+hmfwQ#qLRgM#
z8T5h=p0*R$a8q58!hFz|V>tZstil=J3sE_aY7hJp;|p?R=_BpJH{agOzg(a)pS)pmb-
z1fM`%>g5%+rzy9SnQRSP3Q)>%noV125jYinZX^4J9d&(h8f6M0Msr-FRi3}1wXTVs
z%+pkL7H#o;-rb}}9+zCJlo{2NJsDocUO-{XHQ2O~2`iIYA3k+(NHW8RZPT-DQ*&sn
zpm$I4!>rUgPnBGNoI;wTav~E)eBNE_w-v!ukg<Z>p#L(qo=i|n3O<!k_*@jh(NM&^
zaRc^V)<B$NI>g{$ez9;N0Hrnm_?<VM(a)uaO}mZr+r9#=DJHHOeHuwhnLu(K9jMT}qd
z4TV+Fn4#~9O(d*_x{{08I2}ZyCg!P3WKs2MKdx(r4COD}W*^TgWljy}^^B(x4299n
zC}2isuj*dDql>shA3e5qKjXzLt*J8mC9;wy_!H5W-ZPn%v2R{L;w{|cHD@#>u}lkW
zJ}29H#Um};|H(p%C<{;4T)od)A+ZDQ-sHqR&L-|-LGlg<G_KP9#4j$*jYsFi4|5*8
zD~-s(a)XL$BHSN~zegA==Vjs=e*&W9y%p!L%sJZd<5TrBZLF(a)J<d>hpLR>4l*qx_BFm
zGDj3U?)W4%>y!NpB?5i|;hQ4iF8VYc?<S1zlAQ$i4_#!QT+%0PY`1geIaV1KRw-?W
z#}Aun6$<Uj)ql&5*%@*yYfjmJW-xp8wZAXoN;z*G!*mm-b>tH+Cxa5)J>}x1YcYg!
ztP#`+*|KyCIb24};ddNcEVotsPUV`&U5y=tb<VqPJlU=-ZhCF1Xy1DO5s7Hd(|)P-
z*R^YBd$vnc?|2|OTntAJKEW5{9rUax?c^ne&A^~{9}I4+g~}R~&EsW=l0f<OxSVNC
zowjSGWHnL<nkDCtn(r(v%%J%(geECi-Jv*50bEAUEzKK8YyuOeI(|Z~D0@>IWg_VB
zWYtaBeHdw9JIeRb&8!-|&0E|<I$O$nq~UbdgqXi6&MMMX8JpF#*(u{9pZ}?$4#R7U
za+^Msn#|L0N~7J-9mk?$;~%-?U3J*2Ry5{O-E_bbC6L6G=SpVTG{EA#+1ze>0cFqC
zuiAC5xaPdp8iPlwh%fCbkqFBeRcrkb-9fPA)R(a)t=Wc2B``}4(1<mTyQLxsZ0cFT6S
zbx8^YW;IvWav4cu7*Z12bwDJ3{%h;fv(z{33=PWO;AIFW_T1PdjY0BiwrwNn)?Qqx
znW1(a)r<kuFu;p^S9Wpk5$_Z??rVpvtPdLy0m>{7-Z(Na3gXT&nts{S|YPl^&VmHM#c
zAjdtl>v%>%-nh7Qr*Aket#w?hec=sB&uMM!YuMP=RC&-kv!areW;V(a)p`X*um7wIN7
zRzzX$=q4<fT{usCjax8_=FC^3=p`p+jjp+&Por0k4eZ>nyvzB7$K_=5>LAu2uha%H
zp0OvBUBAk5J4p#=h34YBx?1tZ(>?T>jd5uNhNW2aDKF~A<#rDYZ?FaOA8ZHOK3$~c
zUq$oPQV8<rtTDN7V0^-^ky>@uJN22Wv*Y-~b6au6^42n`?DRD(a)WO8&d6G7<vZWL<f
zoPBpyd}@Z1U3{KOHO8gVwb?E!ldx1|26x+B;CtD|BUrJZxLd`vOR_(0Q(a)G;Fp_-1g
z#)mdPjcz(yp?|xhCA7e`DJ`IrEBb+f>~dE%o>zKb`jrtElFL~noBB}Ek<uwcIgi&)
z;o3PKdq}U#G5J-Ls2J6=sN9sb`dAt2pOB26<SyrYDz6e>e}k;=)_pBdl9~CS+Q{e^
zGxDBCNZC(a)pI(AB9aq*t7+lOA>2Zm+noJLYMtr+7^gOu#mExpU@?e8zS^&X#(G%;2<
z8VEb&(7;;3RB7Nq7YcdbgUHrIF0K@{DeK&C$Npey+Idl^m*{@<lqYAGg!uCcv*J3M
zq5IApSNWE>D9Bkd#T4Inpy$o*9Hn2rP%{051oIqnJhA*5jnNC=8`a1Jsa?U`Jz}2f
zVPxk6ig9#Q=}T?MO8C5U42f(a)-<ulj1+v#+Ckl?|B7m?``a{8n^pSLamB<)0RMHg{$
zzhT9QKE5x@?qJ~Bwq&#Txoz47=-lw}wYbO^H>Z+#t>ditj|Oo$4P>mE>}t+NHeN3t
z+ztyqW_R!6i0L+7Ms>)mnAt(`0ep_sTqa+(Sz?T$g$s-(a)8*xgiL}zjIF^~Aw&e(-T
zVeKJ*uiN1y>~wWO$4afVef9-XiV|=|u*eC^a$<HSwyiodl;3ZTUG2J2W7$VufHv7y
ziHy1ni$t#f;LD6ewf`>T5&Cqs#f`yTZOnH!i_SlKrRcn=fBF?V0mT{1JLIH(uYFl3
zOeLcNjXON(-+$P)KGT(b;efA=q$}R9rAjGFB*k4>YnC%Pv^$V^xy0l?vIl0?fag)M
zrz6`Lwt!jlK<6z=f+ha!bmHA%^V(a)xbj!MLGWLXZF&54?R^Bo2IONs(Xo=Sn`q-zW}
zZ!9AlU*SeLz<)*+U$1y=@6CS3gPr)j-CQ>P<MrD?O8IIU0=sq(SF>h2G6dtE1>)wC
zoqUpZvx#b9JJUOSPG*P$M(a)J@~X?FzmU4zp_9feuc)7oPJ=C_D&C#F-Ba3d5&9^yN1
znP7ml>wJRx4qnyM03tn$R0UnHw7mJV#YO55=l$BH>QX$F9G0i(cV(a)G#sqZVMK}Hru
zw_P2)49u&Fp2j8|Ao>YNxozlOa=5X)A;0FP?Omj5v#Ug~M3XnZg%dGb9Pd=_bydVy
zXg)P!&V7Gce5%d9yn$7D_O35};8w=w!agRRVbzUihZLac<*&Ucp{V0mN1l1EtT?`X
zLhU(a)iba5T8(?IUBVgj}h^4Jye1cjj2+u4L39W(=ZN)X4xo<1K($MGAFMJx^IyN%22
zu1uE4tw(sb(1(a)S89rR%;jvC`iB~0?clMOPz-Ca%9wOlq|`q{bmtN^_$2Uj>7ru_ql
z2F;FEi<Ht!BKS#VdvBfAx?Y~!{A$iDz)q*#nzc{m%CkTUG)@z#mD}@j6Xvutg%7mf
zR>)qzEK*K#3YBUDbuUN~^}>B43rmIB+pp2xw~{L(a)6GVdF4RdWDBsrb#<hAb1l75?G
z$C{beO5^{0Sdp3G2ASKtu4MjcMd}IM^N9zmH^YPPIUfw~Uw>dQN`6>JlOcR_Ak|LE
zUQJWLHNc2rc;<niyQ0ga+U@&c2fb->o{eU#J}XaZu6r^F8&4Nz&(`W*0ps(a)g^2{(V
zs9ktwmDf6wj%io5!h(3&WZY(@!8qjBP4%>MFL=3HIV(VTJ~eMHZR_cjnedVA4z~3C
zl;{XyY<$Mue8*?2M(Q4~SxdWVp3Lm8d4T5Ks%m`tI7?|aHMK6|s44Nf%uuU;a^iB-
zd}zY99;qbiT98pTZQlD=>*0bhIo#m4IqygpQA(qNVwu(UG}FiEMV8xL6uKE7+oJY)
zx}r`}t*aPRouPkVTw8vy(?tFTp|zhjlk-}}*4!PkoROAE9Z^c!+FATdKA{~s`D>-=
z+4YtW!yD>6(a)Ug-Mq&q8LUMkMuvUD<H&5PP^dqv{a_`d1F$%V^P>ZTQt(FwvnA3w7J
zgZh)Uk%3H}nVUmY4v~smFPpT>>75>2vWeX+H?0gioHGlW9JZ+tZS9rJ*VwYTe%D!<
z|BT_SdwZ93G9oh*wa!&b%<Pn~^f!r{JxDK8I6tL2^KSNP*AA+oTf*GnMWx=90HKy$
z@`~JZ#t^|H65b<yX(a)x1T;g-oDQ>NNLe(0q=j&$bL_d~}GOIXYU@{Q6f-m0-?z8k)h
zch{Lcnw(ahd!y(P8AhVdPGNeP!^j8H=ltgRK5l(AT|-xyiA%;flYA_W%Zbb^d1FwJ
zt6EOHWr<T?2}v`$zeF^2yGj+J&Fq%Pe#e8$8}W)hDn}dFMV`l_w7Xobx~l+p&gsfv
zG?Ri(a)C0Tw2g=SHLjw5*o+ET`8D-3g=87nPguVnxChRe#H``*SRHn&3q-;0zy_QuZ;
z#;rc=`{0f*ed~0dajot9yHsl(mX#h9X&GFe=}=Zkl*i7C7i2k=e6JSOLASv(A+fb6
z{Wc9oELb}ct(CM{o_TB1I4Z8lK=#!UYAfX~>W#^)?4~Tjym`xtOr|O;qMTh!dB%$#
z3b-FqpXYl&#l?}Hh`&B$3g&Akm1kd8lRt<|YSJv>TSDVBliTXi_7r(a)Ym*x8s3$*`5
zmukG*bmv}(OW_&TB|od(=JA<szE`#ymQ1j}E}PrFN}7U{8!0!^^Wb9aPBU&3Ou)dt
z41LMwcDc79Im}tIL!p~m)Bjv&y7Jj~6E?=MoGS9f^^1as`Yn_P=rQ}$41UcSOU?Ak
zX;%#DFFp+uf3g@#*5-dDOMYuH4D^I|RgDAZ-^gPJT6Q={%`%yXt&wt`rhR)4c(a)62n
z>RC_F(j*F-(7~Wi;&aFGLrXVKmBhDYF$~MxUi*y66crXS)($y%t*B>`1b4J+OinJW
zo#baJ85(a)h9@FkIBPw3x2*D0fIz+al6VxMQ?r?Ad18Re%s!4MLBjE6Tqf5jQ=c7U{2
zm0D9#GxJSx<IKZ5<7W)-T9{WU1RNfdA?9RsU%0C&E8RwlE_r*FyA_q6J`-bQ8q%OT
zf0O9+gRW$Q$I^XXXp>k%It90o)}mi{ziGbo7&G_C>gG<Be=j|Lq?s(a)60$x7hqR<FQ
zw{?YiV<#38Ro7KI(=;W0)I|<q*P=}`PK|y(2du(a)MqS9>xo&(P%)i<^SN~W6#BIw4v
zs{YFf;q(a)cUXC3IO_SD=sRb%h9Daz}d{jjEv$C<{seSqIL=9MF#JDix$9-pGfL*BPD
zmio5t%0&zj1ce^ncyaSgZtFUHaZ{$px6=<w(sW~rxmk3pgjq7h<(-tv&QC=@Ki#BY
zw5O##Z;nc3JzWeDACz6Yd)SvruM}wQJd_jFG-qBsR?9{BIuO)EnbcyL#1|L#CJPH4
zFcx#Raw~3=)lFesEYu`%z?|-GkeZz;R=uuhu93tHYCVs~1H1dCY;DgjCy#HaA2+VW
z;hFF`yzs2YAc;#l^@VvGG(U%w0r^ee<TLQ|v3aWgst)_=l%Q~7{uZlt6f+S^jq9U5
zR<5(&w-{ZUqDe<HIGZ?;iHt4a6Nqc%=4MG;0rf|A*2i;vF_~))<ur0w+A7&<-BB#l
zVhYWcgzHYZoWzP3cf6>8=Zc&PsWs-`icF<^qG*4x(a)_|sj=B`p;3XA<h3Q2Tf?HE7n
z<#G>lX}|Hl-H8)c80-iJ<oo(34_A-us_>oPoK>1vLnTVhRUtjkEWg_*_-cE6Ubv3c
z(a)kQR;`(mkCQgOcyL`8_>LgF1qW&4DJ?Zm0FtXHiS1FxvtuIl=1U^il>S)AcD6({EB
zdlT*{y%117^d2c0QpxN-l|Ys=(|pMX(YZ?mOy-dBlXC~cJy;3VDVc)0{ifc(M(1H=
ztlwUx6)IP!zMcWr<<XAG<|cT9fw~$=Dfd~-1(a)eOqQ&@^UR(OXx1nVrHUc1}tu;_;$
z^f<L-Km=i7t&Bx^yOI9nfsFoxTo1k4eKzfz9;Qn9>UhTfX{$Ty;YmGwTLY!1vfrRL
z^zEeVYKrn57=V6kd^wwZTmMe{tMn`3#OzXu&x>iC(H0G=QV%fB*2X6uNjPOdbtsm&
zUWwxl++d>m8gq4kn@|@0s>eO;(p&9%dkLJE$Xuo8`JIX6RgX&$i(Td7v)>U4&Tu3E
zL$8v*X;FFs^YJ?eU1W4@`nw68iEqI&Kn9b+313?Ecu3Ahj4yuhYj}rxqt5JcM;iA#
zfkXYv31NKpD<7<BO>aHzqoNWsiX(LzLp|a9$n}|7KYZcDSux0qC3~0THRgOYyV)Dz
zGyJ*vQsng-aZAJO(a)I^N|&+*jyFdkm}qetT%+L{n6)w^(#Q(IKm(a)rPVzN>+y~s)9NR
zLU5`n*lW2D-t$vrTvkIazFe$J8mpy0Zi2E{RoB)KorB-Y=ZZpoV*ws1sgSUJr03Lr
zu)~T7tElN?3`xzm$rHZmJ)seG);vvqI*m=o1K*84h8V6NPYtGFbsjo9)z=!!O(j?>
zYQST^pTHOH(cU-0*E?Kfh`46)x}|o$^97lJQ)aMjhI`SbW#^68!l|XaB9+0p#imz~
z))?6PBq_w8Y(ru{-g{oTns-DsSwrziW4xy>--?VxNg}=`o-|yf2%>Ts9|&LzxE8NE
zc(^!Fw-Fo4a{;;RX+5Px$G}<al^ZQfLktKD4|(mJhSsd(a)xC_tZ=v=*Db8xvB8N%b|
z#WWB~8ZJ~s#CynWw@}B|z3GF<SsV!?M3x}LSa(a)H#YS1xoONgCfR(>)$gCXQ{*S&``
z^{M!Yvv;w(a)36Y`V%QS<C(WDD^UW}d&n&Y^uh}e@?&hV-jl1qF(m>?eOmcpFY({vPZ
zQMxJ;#r@=Z6`vwR(a)X{e(1?nZu)w%clHPP)A#bMcv)wsB#i#^e*bDqw+sCZQG4{oKO
z?9){aX2XE8BzO+d8+s(JPxB!<52BOu$(@9nG?rj2ZMuE#PuIE+d-<^Eo}DArx}^^_
zzG*?SFuaGH%{;sygm(Jvnv8zyz+0k*frEbN9tYHYzZWD}=eV~pFR7=G%ApRD8${F~
ze0`F)zn~5UYgYHZ4O1{;kHn>WJ4B5Y+V^r*>@$d@^jPbx%^o9j<ygOdtPIhQB4{be
z)e$qddEA!26<r!^Fpf`<Z7)@9d~20St`?<$I3(93Up^OYY-+R^4KFzXz4n}H9pzPd
zJ7}@WLC(a)hVO#!p^CF*#(SlOwP*vmzz?~eOT7zGGoW2{8u<7nQ^zCJV}rlEO<ls=vM
z(a)fo?+6h?&ORaWN;<q*~<qs=51g&b&8AVTB(a)g*$6*M(a)SlLdHGMD#MGQCG;8GPYSD+r
z<S-+gJ$z;FT34B6QW=x3Q=RhVwo;2h%I-BJ>qVa?!Xz!(Ar%J+;FRUypLb}{N1M}W
z?wp(L;Rn^JGua{(vwWTgmGCx!pNABa5KCL0Md!5$;S0~b+2(a)t8RE6R7chDv~p_D1`
zIxNNtK~yN`cqXB(7T0yT;)G1^ysJ`T{O};m68WNZ2tK>CmvpL#)AX-a5oZX~<d4-$
zs@<VmKUKr~F-(Invie(a)z(YOh*HX~%4!IR9w+tko$8_<kOX^H0Jm0N6n1qm<0z5H_T
zOeU0TAi<-mi<PJ1obzPkuE%cNAx4pm5(dWw*N@@We3>0CSBSzCLaw)4o#7pzLz2C#
zJR__8aEx;|0b2(t<Hb`WlX|b~VY!)|)${}s!8Ajc46P4jWYfntHAtObbZByfWF(a)x<
zhSCf$L>dJes<+L%C2SHQ2_GI_<FOlJ1<|pA=n6c%_flWDGuoKqCp4&oK8%AOHSn}H
zeqE--I2)*WD&|Q<-Wp=7oSW5Fm>xdww=Eqm(d=IwU`KGc;L$=<r;9sbg3|d&&LujV
zSvxb`sUe!_q443AL!r3I%WS)Hg|7+>5l1lRMPu~Id+`kx7a4f%%?cYeu2$hau_n5`
zF&}V!RxjM92mem?nN^s^7;(tJ^y0<XV6zLi?;m%b3||R(!0aho#!lC+rzNyhy!nn9
z-O}M88`-Jc(M~mO&Xpl}>^$ZaxqV6zj+FcS{lSY(a)9qIj=$-#`euJAp>g(uTQR8NPU
z$&^)Z3Q^%~j!A73A*ICnyj0;sXKo|RCqpS2bY{u&Y4@(_Cic-Pe^)HIyLy37722Oh
z?78B8P>k?enIwkY%&1+1kP)v}cxW2S<Y_0?PQuOZYUzYI<;My6Z{D3#U(d`+UMmbf
zYkrRY(S`Q~wY`M4ti9}UBcuMzHSaT4eTML_niwXpH5oPQY#^PO(a)i(;%M#OuLxRN5)
zc#kMs#j<2(a)sbJG1Vef-@=Ei!FjXLH)Kv(a)SEFb~%vFS~K^Sn+0qF|s%1zB5$<7-Fg8
zj++KDMerx=CgAEJA?stI(a)7SGiMRwJs-3=a%%Q}y3Q(Z<ypVe^I0fUY~HeDm;1FnXU
zKRM?r=bCV)`$o|mt`XwSho}&O5X`CNl8BZ2=meo)tb8^!NhG5X%We7Kr8`<@y8QcR
zu2b(<O0ySQPa#a<u$D^@NMLThy^!ZDV`#D1p$Ir}7SE1LPT<Ot>1Q}5k3Nde(KlOD
z-NPqPn;#FodH@)8)^!ao7!USdqy+2+OtN8hLw&AbqAI`K<tZ6)n|YSC<OtygTkWkk
z2Y{Lhm)F-O$sg>w^IT*E`M$wqYkc#adeHOZ=LyWJq*U>=PKts72r%N3#rH~AeR(a)+&
zSpB?Y*C`~MNgWOgnH&Yh=l1+$!%gpaydivFy(a)I{f#oXr7qjCi-3$bd~5p&m9{3;22
zcxLDBdL5`P)CE`2jUYkd%)aYw1$qsw6=<F2;pt9j+#<4MWne*nVb4#F?{F+Gi`i$r
z<`_(Hfs}R{sRyw!DPUzeS}z1lawdbq05jy`B&94_T+jF}7>g|zbb}3pTd&-pa8s6A
z-{3&-I>08`A*?xEt9McN+Po(a)Hh>|H7L!D6YR>D(a)R*V+{<w=Vn7kmYThdwL(qjK%{a
z%cfgQfXd^>@GQ0vgq_E>`=MX3VtPzWLn$($PT|#2yhG}!tU)@GN9N|1DWQ6;?Cr7o
z``f!U^H)W7UzqI}^;qKAj~~g8*ERKQah=^_XusaL_u-mMPDuK>6TJ4PQo0)Ul?h+p
zNv1e+>@rR7=4vq-C(a)ES7;SA?TLsNwqHOLp(a)nRW}6WxL6q*ccp*w1df$-V!piCr7D=
zAn2i5Yo}?3IQ^4n!_<1O1X$sE#J`_qQZao5K{%4<DiX2^TjDXTUQ~}EqhCyGPady~
zSl=x>@iuo=Mze^AB16GtLUL<Od`E8=pCAE8Ko&J?oGFZLyEeVb5do?U6{mE2{yHIf
z-oK44^PNtWP!WF#;cYXp!diSYF_%~uew}JFQ#jrIT{6>6f0MN+$>!ax_o!427dWPc
zlFdb~xVM*+9<o|=U6ZwW8JpdtLzrDvqwm+;H1f{nDreSq<`S!KY5ub5T?Mg1T~vg(
zS`#&hCjA(q)gHNI#$sISx($o(Xdio`0`7O7OX4A2EH{ppamLdPQomi_srNN-o)95b
zYZq}PrN<3^ZGDaqXFYVI^&)|Oy|n=MyonA7G{&UKI%8~X){C)I`;eT7<Vu8nfb;&C
zl$%Ebi&AU7!^MghK(a)p<`?MQ1I)4B{a{!FW>rCkdtVW0uzQIAr4Tx;VcGA)U1>3eN+
zQ;gRscC`c{f0`ENz<HqC<2o5z<&Ru>hsdpZW}L`4$U|}fZE>`E{>F-0E_|8OC=ggH
z8Ff#E9xNsl&iO=l<lH=gadapQcw)~(nPA)0Pwm4JHuMHv5Fr61rVPdnR5rKFVsQy2
z)=a9rGcM2B=H9!#%$C-(a)g8*239ve+IHwB}G7tBXCY=$_t^`E_uojYDQjZC#vcy9>_
zdUz~rJ(a)4QeQ@Uu4l7<jYO4g}9WA7Q0#SiiItZhDE#3QFU!UG(_yuQI1VegV(a)-*>Xb
z(rIVMFrS|`qr>xjiOOYyS*f+2c#5dj<orwVGYdF4mjhS07T;A54p`bY0_hQUwYbbo
z=Wq$9>1O5<2d1ysDh@{LmUxKbFk#_7G1NfI%-f`WSibZ6&O_>0(p4|CXenw<*5vUT
z?CN)+#oBV3=hCPXde&Oxnd{vn`xcMaxu?fYf4HQ5fl+v?=}ERVRh%LacN^vSqf#z$
z#Hn{Bkmk(PhMu#-o4`n_oDXVqnb&>tkoy#1j?J#%T7u>Ddly)2ouIs%M-M2<<~krh
zrdl#k%|L>BFjkjClmSO1$5&I-#$oj&0^qBZl_V|14qgT5<2zZ~P;aN7#IB}(PPIS}
z+tZwSQo|-Fq`~5wY(9!AjxIDbcKR*>)L<!4r%bR^_WW=|9t&5mN*EpRIeeZrYAT;*
zX)6RQ#?3DI_il!fX76E(a)B%-Zs$5L{cc00s&f_h3OivY_N!g-oQb)nfpwkU&yPiojb
z<f_i-SoEp-u$~%ZR&-{X8%6yO1Nn1JtQKz12jsV9&AkrFU%&`DZ!Tf%8^1q{Efi9c
zLA&$#27N+ihtTbr=G*g0fp75q7?hkg&X8_pWHa-7ddkwUh`4cz3Ez9R{Td;Efp&W(
zOdL~az;(Y(5|vA(a)9wmWxH+`klXWpZW16Q2MG;O&b_5M<s%jmu2koBV?u>&;8t(SV{
z@}=|)#hb#iw69^cKzb00;|XRkJqY6oQ&F_?rM0)_Oa(;e_U(a)o64Kw=BL4I_1lSACx
zn`n;a6LzSB^c&cYsXcu^cQZ(G?RK^_)p_k#cXwEMbKf@}Tr2U=?Zeuyn|_RwnPcKP
zdWW1!BeJ(a)+X%)@KGh2%teV4=^sh-NC;JBrh7h-}3UfbBr7_xrQXi}aX78{uy8sI`c
z8+y>>lyUmrCGGS&-lpuFT}!-4?BHE<s)9M?qJtOIt(a)T(!L+I70AiG(081Y)O&!3;R
zUX0BnBM(w5WA78DmIN|L!SQ<r4o3Z0VVheMXv4JI2mQCGkJ3<CcT3q|`_wy`+18mo
z`*<GE?7OK3c3v|R0)CQH>ZC^u7NmLQ?+{OHo7`um$hvcGYt8)K8rw+L!AA3pcUXdF
z<Em^Af=YOC10}DS83F%%p#tgA?J$qbfj2Ioy}YDHy_|5|qf!am(a)s48Eu4T9>^&r6m
zlfa$!tb;wX9jTs(a)p~kBV$4D3P2&p6M+XP=-DL)~`^Wgfhx>8Kw6YR2*m}jQjmgeWA
z{q8YxQJDl|v!~sgJ)j4`_cC*5TVa)`)VM-JM(N4u&^<*9;ehIew!}B4=~+~#AIx-S
z0$z}jfXb_jsw3~xbd)V(`=u?(y~HEa$SC>9ZQ`6FZqmP|Sxs8T1TkckqC?q4ZJlfH
zN}0UvsRW(RJ$o3Lc1$2p6awAQ?Y_YrJ(a)TyFO@*tGQR0{S`(=*`g2#%SU)NHvPp#lT
zLZWgmR9%EOIyIgHb@>+T+Hw;C?`KGK6)=oGSB3MAFBad)T|GG%da7-|$J&*gW*5zC
z3>gS8cDqt)-U`>p9rRH@)elSHL(>*RfF6Z<Lq~gfZkp<b<AO}DZYnL~;7o(AXtIui
zGwnG=8!}ZXHxA%4zmOM`S{!$bWjff{#XR(a)8d<uWvdt0fF+T(#_Ix#vlt=vG{I`t0m
zRvE*Yu9yW{cLVK)cHEgwuPdWf#}|Do5A{QF44+`jv8vAAqPY#1dgV`UWwr|@>!Y&D
z((ZN!uEl3tWA{B$goY`viqvXLd!;^;E^DmfI|!7x8at9Urf_cL5`J9b=&WfvWk=*m
z(7AH$@+WACd5?OZdq^j6W`R)F^K{}W3YBxu9aGT1Gx&N{=iRTK6CEY(E1Yr0YEweq
zf8}env_i{kPYuR5zF-T261&bjmh-o;YWL{2q7V1>T%InG<u53Sl?Nvm&+(Yuv7zlL
z+~Zyz;yZfN^@!*uNpIk`6c1MN^@<#MYnwz$8KIQyCf!MSz&H5FGM-t~bQdcck)rMv
z05ZHaGoPSKY1iED*kVp+G+oFcJ1UwYh8Ya=-lyd~OVIl`G)L!H%>EgT#k2Z~*$ELO
zr%pb8lD^D?>grb&I1hwm0m4gfC|ipT*W5t8z2cY&Wmi$S@*E6arWZ5ZitdcXx=)^0
z)s<~Wns?^>t-k&U=Cl_+jJCOeM?~ie3$wuyj}V?-t*JHHtm&6t$-aE{kgkTz<G}~J
zQ6{KhMY(a)uzPIG-OK~laegNm$#WF|$dMk;G_$kaz#@G+4gRZNlDM(a)BHtAtC4W_nFm~
zw{N)nZpRu2?sS9dC#r=$eNV68Y}9#wt)j(KaYXda$TcRZO8QK9IXV~g(DEz%mr1l=
z$ex`Lg~M(a)QV~RewygI&k!`YnGkE+PV9rF<~m2<5Yy2Uj;JX8j85e5aXv}b{3bbc-5
zVk!owEGtY;xNZjm<_eJB-p3COVW1vS(a)R@9U+a$jHSOxLC?F}t;!y9f4#zxtk3kFLs
zA5kM$rWZHZ^Txv}>w07PA`g_AobD((E#dI?(`|QH%E)%o7NlQSnI|TgY!P_=G}dP@
zDIm`_*=2wXX%Nu|H)?w1luuPPyO`}_MoQ_XcUcJDNZKi|)=aKkefn00E(Pi24Z959
zvs2hrk}K)bb;zb7=*=iMq`L6C85qSk_BHC_l~pNN5yqd<RzAY4<2S&+S&H0CW;wB@
z&a#5kO%J3xT(a)6Gsv@{+q+NpLCK$zj+c?z~6->^}1v${OUT(f0WpP_zjKbzR6QuZy;
zG_i(a)P^I9{Da{c_I9Gg=@rSmX`#(HtR)b2svI74~SVlOEeNpJN{NFI%_)wypyWUSdz
z3uCN#aoq`FJTy$>$ahCiu8mLBwj(a)B$XHF(pBqhNMaM^X{@isk>sn)MrGHCOPt>Xi6
ztfs(G#;VEF+A3X=^>+XKmr~TTvWy|doAh|7jN%R`y(a)u=Myb)MzBFhmHBeu(!t9Yhm
zsV&K`2L+KDtK->N?W&SqM2V}sFXU&=6a$kSPdW3}lmIUw_4!&;R)heFD2DEpt2L9l
zTVm9wJ=q-VjM-0!Cc2IJc6b~E%zmxK6`lK7(a)kxCCYMxr%y(BE=KF!`MZ!gs)Up{CP
z+fnN&QL|%3xb)OgU<^x~`r-3@#*9G$D;&w&)yKn6e9+)ou(a)E;i^TY|ln?a6)&#G5;
z>2-uo?RR}hjS$Il#n4*s4O|1l*vw(a)eMABP&3qhoHnV!$Ov7T(a)XvMrmR@1a^~UR<TG
z^<-Mu`|trZ<$4^uv7}p*G?;aU^e@%hgKaD~I-VG+ms;P<7~nZIz}(=nM;^W*6ihbs
zIB{~y;W>RIEcGpzqzO|$U0k(Z7$g}?km1KStxX-t(a)C2=o&#CVD^P2fO?F*=RHe+G}
z6dn(>BS87wp$YTWSg)nB(a)V;8(a*LSMl(a)iReV%W_UmlOB~9iKbN=W4$4o|3oOrQ(0E
zB%b2_u3fg+RO!rWSe#_DP)Y$3ml}?unL}#LkTx+5CPhZdrYapC*iFIp3LUIxW<0!U
z&*~PSgxpCQuS9n4GATt3_G_v-nk(a)A(PCFZDGWa1;I0bs4$#%mza(a)C&o)%;mWn>TBw
zu{l-CK2K!)melwPuif|GbeYgBTsnV<YV&#mSziRb7)+l*n>kJAySb6=r^OVa1kFAm
z+N)@)P%0W9G*42cA0`I-gjgq>j7sbb^RCmNu*eO5s76e{(OH+yIuMp$Z{-XziggSH
z=n;%^9#PdX=G}OyNwD2P`DAYmWcq#e(a)Nqat*?#}gTgsX`RsAzOPKjd13TE%T*BRA=
z_FY?xS3(!vtr4^35KfMy%?tyHKwU*|EPwnBy|bhY{O6tm(Te*VU?ialjicK?JI=d&
zgtztj3}`cNh566sXBDsD2QV%e<R2SEyk-$Kvw$PeXG|<E|JY$+g8c-e*Z%Fddx+O7
zW;Q>lEEcwQ=p4gN47k?!Qk!tnZ^HZ3yn(a)+c@l})7)#a1}MNlb8SP=#qEGx&crpVl$
ziL?50pRtzdz3hG)mp_fM)`cY31jvU_sMagX>^kx+x1*SATrYvR>fDd%^DkW<?3+A~
zO10#XOCS;dNRNd2(C+0Giv2dLmE|O79Guq$9-hhLkBI2WuWRvONW0G`O&)PQA-Vaq
z&ZF16sF;23IvLZduCo829Tndl0txKLQm>(dZauEiI4f;!h3#%;_OyqbSxkQOLXC06
z>M>nU!7>Vv=YHx|f<ZCN?eQc2c?GW^&6F(^DNjU{IrJT0>Dl_Jl=4?)^2<u$MOVfj
zk^w<UsXEOw3QaP8Lzz_r>4PHwR!Tn%{-xl;CtwtaL$0W&dpU{dM3fRzKrA7F(=;YL
zvsygzsy~5YfH&aDX_otC)4cHm(qpcB`*;zpd{TJk-kiO<-pPVH$7^VVpY|`_Fs?J%
z6k>I1U1_+BgqPhkXc}{ryU-?ImT>kO(dkGMyxA(a)DyIsuV<<43zhFM@&0$_Gr7TnaH
z5{i*(d=GXNaKs(2vRN{_MrrPVp^bjRqEO>NAb^eOb;e4v!5Ow!=I2xhF~B5DLF6HN
zSx!mSqHXPpY_=l<zsqy517tb+!=5O5vA(judGx)$$*LRz393q=TWkBmyfX5wW88l2
zZr9f%+<}mcq3Qq!NEZ}}>ryGI&4y{>b(i*{T=L$c`PgP_wfL_`c`Jw=lIe~b^XniM
z(1X5?PdUNMJX7-;x!|p}K3UMo#h`)~={eMSNve}qan)xo((`aw?;VH#Iwwt9z?)Ox
zQ~d#E2`Z<He5o%kB5PW|d3%+N+E)y)8DjSNPjB{>4L+AYmKW8S=Pep5++%LKW;3#+
zSYkA4ym?t2)M&mQi4+Pgju4>%4E>CmdLq*&ACzRfvW{<cGkfraf!SnUId7OHQu+8b
z>iFKZwJ6sr;Z~Xr+}U~4)^@OTqTd-80}v_zdhJ3B7<oW-{}mo#<yR}|mZEdlH4WIc
z>O7L3iEdkWrW<pR-?N<0PEybtUJ?&Z1^bTnyKJeR_JXCk($Q|vj$Y5UmhbtuL>2(a)-
zh)3$uv+6634|92%_^)YJ`ceQU01$)MWo^fReS?l8hooS)3)shVY1QN=2Vg`InznWa
z;s=p$)@q+qdkmet*mS{z>Cx89)zi1u+$cURzF2|$yzdz!0(a)xQs?j_pRbDvYIZo#~`
zzM6e*%rO51W8%B0q3qS`>qk0>*BFXAnL7ku*<)s1>ZTOD^{^PV*x*F1Et45-Vp``V
ze=HzlS3EzVxbmcT=|csH=(bH)XI1i>!?m}hoH+y6l%OjLY;zei*SGvZG<NXzI9lT}
zZciwedWvaxI+dbmIGA=-aDL-l{bi9&SpmKm%FGBF=oZP2wa>{S;JXB}>Mxks5z6UL
zD89<tZ>0>v(a)Xns{UeW1#JQio>FI&1BcY$SL|5gCkz2g(a)Ms$YVt!KEO!g9kS9mCEBx
z6TQ&$r7-r!1w77H$~~4zjV|w%!b{q3%bq`pwXw&<LJAbWiVLSwNz<Aa&q3uB(a)l7{|
z95PE7bp#Nl^EQETapRgDp&ru*c1HK<<~l`Dtwu1X6)?c()MuzRKCyjK%-}AVsi?RW
z>Tfesy1kYMLiL0jnhPe2O`TZDlU2tp$11}r)}#v^!L;&zIW^AFfWF(ZqK{_-%N&(!
zw&Hq8FtXGBtfC5I2+K6yoH))@i{g`_YWCDljHRJ9vIw&vwCY*zyQnmcDz^dg>gMeo
zBPIRD)I8W^wptMKW=+JsUBKk6rM{f8{-8L!&W?eF=Gxn1*R1MtHw2H>Jp$9We2(DW
z%V0m!XdPzwiT$(p&%dBHnRsBme=gkg<aQ%ZT~|{nldo?BOI6lEndq9oWU#tzKml<B
zp}WF*BTj3{O6iWwNKeO%KcQ0ht#L1EunS}TV!Te3aFW+!WbuHqgq*ajjT9mh6Tm-E
zYn2u&kuMcrSS`3jlLFnzZld2}zH!>^Ny&;DUMPGgP1xayocFznT8qo1e0Q1V6~LIL
zB(?rhG`Se{aN_Fw+hz!N9uhlXI36%NE^a>nJK^3$!zv2FKBV&#$P$2a91CCO&^$mh
ztFAJGnE_74lss85pua1Jg^>`fweOL6P<C(Zb2%FX`t-)LXUS{L>N!9!pU=#2a|9JN
z^oY9c8K_+uJ_JFg!#m#mqqi>P6(uvN&5hR-sJ-=NSr|!)xkb>xyUuX7pEu|cx8q6T
z=1UY?FcVgv$tN|!Cm6=IpDt!w>zzzhg8Ef3*(-Q)I^q}HS5=IAXM!P;b+gx2Pv7AW
zGFFF~I;-482PDWLRtV<}BIS9^vCU^xa=FNrb$-;8aTPK7O>++C0%^*qMpH<?2AfWK
zlefv!j-upB|7^NvM8=f-3}f|>_IYQk*P?fkxKtm9iXe$kusks#=AKgs^5P^6OHlp`
zxA^~PRIj}bVCPO-HH#m*yZ{;yj2^NE9yXR9wnEl!w!nk9xlRjka0zg5^Xi=D7vd2R
z;yTU2bw-Gb>qACY-oJd{a^A+#&iCsdgg1MUf)5}?Sv8p=DT`2M(a)Ed4vKo;PHYma<9
z7(RJFuRkg9lL9{}@RI_6cM9A)1{Cp5{M}K08DA7Wgb>km3(a)PFR1ck#D2mcQpVJwKp
zBIksq9_<=fbilB1;y(a)n4)c$W|;G!ZbTJ(Droo7d?hQlyksa}|=Z7+=Ac>Fd5MZlFm
z|Go!eggYKV;s<@pZkVLn01TbH8HP&Q3}X(a)KhM7AK!pO+4!pkB2(a)0WoPG*H*?)6ivX
znL7(a)_*oC(a)3;)Y}Ye4gOy1bG;O(a>gqJVXHDVF=>iBOl=u0Q(TPz=It#hnFx)_KsgL
zf5!gVr(o-VSvZcsnAvl-z&8&dC>^dm{69Rxg^nRbt;i_V?(12;gdL}E`zrR&c_2C2
z4l}hMft}_p*oF`y>p(fcHKqRtN2m=ZR_q5Y<93*w_8<(CvgMoDKj#6TwiTvtH3Ab9
zE#3in=z<{7*Z$WI7*HpVj3*^a`Cw*00OOJD{chZ!@xy&wnpT*O#RyDXwqg$fF?t-7
z!^ic(a)e>NNNb{bhs&zSYW9Mofa?#>^={y865R4p(yqhXkwO5Fh%FMz^)$bWE!1s_i%
z`?v)PcTDX^VPwqhe+v8OJYZ0?z!dd{V9Huehe*g#%ODS|e|;H55<v)2qe2po_u%am
zUVlHQ|5y0%aY9CO5T>F3;s_ZfdJW{^)L)l}2r(a)wTDN*Ssd)nqBFdXW?7W=RBFRnTO
z(=cfLM;<~s{(K%l--Zx5EGF~hK+|*t2CuKbPVYbQTLPX3{g%(=!2aWT0R0R?WZ5a6
z2Rr&!FaImpKhpy~_fXS)aRl1*TQF9W{8%2s&QsD{2mQ<_jF92m<I?A}{|X<CtQn(a)H
zKLnGItJ(uJ?17+U)IXMoD15|Y5$lFleK5Myf3A=G(fq*cD!kk|xbJR5h~XK341dIB
zPTry&Wk7=;P5-a>4qomSPN44M#Dh6sD9`uh0hAR&_@=4-APhcN`73bznK<~Qdtr*2
z&yGMn8u&i^7o~~G(%u_bzx<zLhvyqUHkdkqHb|7T3CiH~xAPF@%O~<^Us$34Z-F14
z2SK?$n4m=Y0qBb^e-l4qc$%bQ-51v&f2JP%nQ!596+^2Y7=!?y=Y8Wqh%N^84aUIJ
z^|zrve2!#uZUo>D-}nZ42s#$k0LE|_^{KC~qy7vnfAm`mr!g2hder_m#{z_?5+$wY
ze|m2Gqd33zorUul3=J*v5Q5-5vEMtwV??B%9RBFK<ZJ2wndk7ej+OHe3;_{7zy8({
zrgoA!2k7Gu|843&t6(=wLA?<^1{8h^Jp{#JA|Xd^SvrsW<@5X>Ed%&E^8{T6=>IRu
zej7gsff#iQ^tb!)dEk$x`B#0%A>0GgG-y5ob!P;E;A`*iIl`#`5AcI2Sf9iBPCtr;
zU#1TxB;WVL-;=Ypf8==q-s2V+d-=Zy`7dD*BU~w{Gd{rQPh>2AY#sz3^WkNuYuXCa
zHS2<jDD}hObK*Zj2P%#ZfPDl;OMm?X1o)D_;QH<#psWxh3+NcKx8QkT=KsF&3{EpR
zZ%09`dJh>jW(i)7>Uu3l8YaWvwT^&~Rq%2%cNl<CpST9*o#9d64f)>!g1#0pB9n;Z
z$_G93E*KmGBX1WBp2n|f3FlqGc`5KUhpBBBjEUvO2hdkkgLOCoeBO(I7`e>FSF~g4
z{PN>Eofg!|U&jG28&anBkGSDHNO{$|15E5V_<YUg-yr?agHS!tewLWoayQlWnm>-^
z(a)cF5(#Y>ox?I_IV>>x}{r}2pW)XmLf$k8)^$E@<N$%NnlI$TFVjov<e=HZTpVLQz3
z!WhgPjHzahV<5g!n1LmzXVR5>ghYveHyT;_*Ykn^?+UtT4EQMZ$B-g72?#Fj6A~xv
z;^D;|97Bqp19c79j=U)O`+Wr9Wgv!yfH-;)5W(a)B`Fk|*Gv0`?SkRtZMvmsDd;s9=7
z1oFReB%pudTmBh7cnB7-cZvPqK>IU|pA`82kpi%f2k13^*gpz}!QkH?h=1~TXg>LC
zsGt0XW1svGgik&^EI5xKC>ZYVK#(}x2V7ekxIYa+xNyG#*p-F*Az(=b_W|({zy*Bv
z@#do+3_)N~3?hIa5Y0b*nt$AX_HiKyL=PhVw*N665bmS@`Fr4hPUmyFpM9_>1Q~<l
zMFklJ{u<5NNBl7O0q(!y|LZ<2QaDNoqWI+fy#A!XPYV2`!2drKK=3(+^mp05fq3kq
zuw)t7--Cr613~itQzC;cJCR_=4%n~*`0Zf34n9FV1nK{8AR*e~62yZoIA8(a)07Sdpy
z2e#jU)g&2t5`<{~--d+XOGB3q_RWATH2}#k4sbQVLmJw22=e&vK|;95#e2`hZUpRu
z`31=@Kfpt<H-?!l8$t;9FF*qO>cnNMfK-=&uJsoTzxe^=M_{W97f(KfaPdD12^}Lw
zS-Ta8e!;5#HyD0%3q=2by8$+?KnP*~8AuU?M9G(a)QJ%Dfao20*X3%Ij(a)K?wGt05-*6
z3<)8E>cn+*<9;9v_*&{;d=7-4>c+!hTM3Xr|7DO6BAM6=l=KFPPquwA(cgavN*1tp
zz%CK6N#rkpgb=}g`XT6H0P%l6-QRf&dMB{!18n*Ldp`aYB!ozI?h?Qx1Z4l6<i7J2
z*u(+kKR*r$A(HiU8Ibq^rrLL=_|0H&Nct^50tq3ChVhQ5`XDY-J0@)#26Zc7)qOL$
z?+E}Psc1j{qt%;;Izz^6giN^SIA1pbZw~=4xOU(a)mbYju9qkSBzz9;D~h5`AK*BKO(
zsRF#a(a)2pEGIB}B3eT*^##DYCU0{?J?0zHKM-Gpa)j`Mb7Gj;qKRG>D34M%L81z`Kb
zHzA>7#k0yj7BUzi73l?zL>Rap5~1Etj##i4fFu^^CFJkH`l06kiD+O$gOSZJCKlil
ze&fKUxhicjKr7czF40FW{@IE3k%{$^i2~OLzkY-Y&>lbCh5n<pom-+;TDkF?rABk6
zK*C~_O1dBJr1~kP`Y0v)D5d%-r1~f%`za*BwGR&UGg^QRo9;*YNzf^Q(S+dmHw5)u
zO0{PUM^4BOoRI53AqTDlG_t_;14k_bcmII;YqXO6_+OfMe6c?N`XLa7atl5Jn+LvH
zW{BZ(a)T20(~!wkxUz|kuKH$bQO*(nUressT}rTG<FBJS=#+9!YkNJXy`YzFu$9)xHi
z{T6Qh5hk(a)kxKkZEsX7Q8qslLCfI%6!&uD)Il}=%RLb&G-RVR3nnGXQr{#WrFixM~K
z;4vIw(;8;e8e#=b6Yf}m(->q?A7cLK{srwnpbmV*JU}NmK)~Ml{e%L$O3~21KF%UU
zi5Rr<n~rkojR1E_Z}^nn&?(&^4&7l6ondz1w1?QW0n~4xrIQ^X<m|+x{`L^8YB+>~
z^7Z-yh4HA?N!X6^7>)244TCGU;Rv_E$Z3ONxYHlu(ud>x=m6Ajqh*lmrx5HW;_AX<
zYR9H+`%P(LQ?)4T^#Fm+SIY~67`XEl&W;P1zXXoo?ByBLku#>?`jXG&B`<KszyYZL
zM0@%(S^)J+Xor78TNbq;df5RAfo>dzcCZ*ZBUbbKT(a)VUJjOv9kQQMcoR=|yZazd7)
zf|g@~7Ndd|aGY?c|Be<8^%Gh^*iW>5`7dbyL0CZEf6!LbX`GDm+V2nt{t7XQTcJwX
zbwb>JOxzCc#OwgPF;SaQ;6!Z3gsn$~t^WeFa*h+a=XwxPey^}TK}E%gRzE+Ycwth;
zd0fVMOxk%|%4uB6aZD08hfxWKF$st9-=I}>oltX|_yw)VFNC!k{YYCt*ngp|q}`Zh
z&^R$=@;8X{`86r+4PBo}71v3iUafF$Tpl==aXGk~kaZacPUh^yC$!+I<1?jf-JyPV
zK-+8Li)epCTREq3tKi8KELopZ`wky5lA86FzTc#_&xES`go^v5irWNm%C3`2t`op1
zUKj^Z)!Zjdf~JJkYk*)71wC5Hy2~VZTJgffFKDF!VShziKw%x9X>-4qRE%Js<=4Bx
zF9Jl2Af!l9b?P&_IISNrrR6iJ={=?41>B^D_oS}hlxgs^_PKsahU@=qAc&D%l4a(>
zQvj8g*ObzQkF<4x(-!2#z<=5%Y(~!T85-udrx{;F1RjFUfr0C`qD{NS#R;qM8LRMD
z))BL20i*IJFKAh_zR-0bMxda@@JN?yyY$&b&NxKBvX7p1jF~p_7!*>e#wAGjC-|==
z`904Oq7aTnVB^K%lO$qd$G~Cy{*n_h42Wfcq!t}31`9Xt*s*YM`-cnYdw~56^OFL9
zZwh=%j`r>MzsM<RKFQ^PnC_!|Zu+O3@~52g?_K$SqWejKpA`5nQsAeY^2@~jDX080
zU7(+G%C8XSr=0RDg!w6_{0d=y$|=7>7{G)0DX080ZGOrrzf2eS)1Pw6uhRzlDX07$
z;(%8_<&;0=l)siG|K|5kIpt3|<v*mVKjoA^<&?jSB|qhqzmVd0fBckF{w{fbzWhmn
z|6>&Rwj2^3;`j6df66KUtUl!lP-i5-`HS6qJaF^#_(_4klma0re`$2z9a#tpGD=hq
z4sJZK*8uEl{#TC(5^UVK9xc6!9W(2u17ecPZ-Bjs6aO6uAzY+nNpH=ppX~|A_I|WO
zVqx2QNKKOrRJ%jC{<9cD4H%iyKA72d9>MLOfJN}f6K*Tn)TZ-(a)fiV?st3>p##{fe>
zLW+zM5WKYox5fA+dw_7eDJHhvFpg6hKxI8#_piecgN=?E^Hfdi(YA_yKMZWT{UzU@
z^Z(h0+c|{WcjG;iy$x)qSpRtp;WR)4a?-%GZdXLH(a)4IaG;GF>Wgw6V3!XmjlKw;v-
zk7Ed9AtAfGYHrhV2)DiTIgj7t!)c^t+7A<#xU-Fj6yg8JF@&5Vr%ZZpZr5(a)6qjopp
zb~Ay-8B9vLU>gxJ>U))00MrmtVv(a)vVGuw_M8qPmwyAEy-NX4KZCM$OzV2Jn*3@`)?
z%-Bv7%cg^qeE)1;-$V1Sg(a)M}_QZpKW2?^%`+f(7jzh4$%I${!cw?viyTAPn>Tfy*l
zOG|eZU<jf98U{?POMMm&-M`z$zLw8#J%`(|GPQbkfQlCT_{-@>;WM*b+m+KA{6ls9
zTj~D#y`t^_jF}}3^iN+Juflo7#0xgK#Qs=Y`*r-^`VFsB%Ic3m836l9|8|7Q$to0Y
z!2id<x8nKH_dwwVW?<R~Y!`-op-;FdEg^k><CMsMF8(a)G97-nMm9GEN#3;nn3L*X<W
zoHw(a)r>bn1HTEWLmRn4!_AA;}+5(a)t;8y8n<3{9niat=}5PeK5w8DeyK3?2&!x2(?mB
zF4=<HP5V|{@b~ck(a)q6v+!OK<G(a)X0PBV&w1W&xD|0VPEPuv3z#$t$GNz#b{yMd}wah
ze)O%rl2fz?wEd<%JpA}RkoRx=pMwxmLZXDXhGq?WvYG=hc%A)B3!u03F~2JMATI`$
zJ4D2nN8n?Hq1n>|1sz~#4%j+{hk=KO_q%ZWZt6yTFm1hxZGz(oBj5l338L^(P-BaD
z&*W^u`z$aP!3-(a)sVO9=pFdhAhEf%)4EhLnPK#&(O_l_U|VM|Yex~pSYcVOe(34`~c
zR*vm3O}(le(5J!2;E*5t9~E#r!J!e(a)xbY1@ldl;KJthy_o4{>b{(J2SV**$Lkx*hP
z(J|s$fDdeBhB*R^g#RA)=aat+1wQd<eshJhUf^b|c4%NQ`1bGyur)jcZoUcuZmtRj
zY(R;FL5v10IN&GlG%!*1oAcP`d+;6=9tIx%;8=(_4EH_k*9YA0(+O}&fD-{i16Ob$
zeeynD5&rpG*L4KKVd{YN-3K9RmfMh)*Cd3)+5rJwGKgMz0Ft$6gY<kSAyIG-RLmek
zt`5jBU=lhb*#aQ|3j%O8>tm=f5Gq+S#Hl+Bp;I<PKrs&z(`kfA=<h&4_Z0%_u#l?T
zID|vr27&*h0u;nR6-MxZ(a)VPocoTHE!I0=ZZK|sk75|C;F;G#g>Q4p)<Ac#K-0`>|Z
z5}_Ul^otM(a)YAgi$01!qI0&_t~R0+f{+5_1}zJh?>9Y|*a0(x5zP;-UQaZ(`~;GZ!Y
zfz&-GAb#KrfiSf4{Sa91Ks*Z75DoW3$RJ=E;0c8gz$tA5x)j6+pyd+*F>^iy=|@9A
zV+=Z_IRtU&3_)5T4nnE|$SQOi(gD8}&W%Ap-x%Ogg7hp$AaaRbh+VWC2>)9la+U(<
z4EQZ%`4SQaC!_oTq@>#eiP*e^^!+D6n!rv4(9(e$hX8#z1lD|z0(eJ6aSH<d9i-qq
z4q1lIKwSF6kbzY{r0hBl0X;nk9WxOE1~DKi=|0E^gr^2RCT=ohY7f3;Y=eM0D<ok*
z3i1;U0VPt1gd1qY0)-$Rl~zc_t_uSC+7O5KAVf-;1?U+Mp;NR#lp;M41~u?c<UpvH
zmqC7XAvKQ)2#c{D#C-(<y2KEjA~>1zAu#R$++Gk9xCi#PL0B;KBLJF#^Eh7(a)q-r<_
znFdZkc$7CGGvFg40~$JwK|pmBLIS^KUB)0ea01Oz2q;5CWa7P$2#AXu_!K8{AvDY+
z2$QxI0&`pl4JQdQwjG3kX%q+;_<+O>`a#;Zkep@@1XLR#ZSP5dYXH*o8iRmRA;h2p
ze)~;AjKDt$PGjFOfDh0a=-wlM^Ei11M8ww($=bbyfUQeN+oTgZh8zO{4M)f_d<If*
z8HZ5OFG0!|#vyLQVThFe7Q`f03jv#+5S3IPB%|IAQG;h-T?!fcyo6Nrx*&18QAkj#
z0b*7k1nGdf3r=8e2a<Fgg(a)E=x$a5@&f*uc13HLx?4F!R<90W9eAtA$Vh}UEUl2q%1
z_<*nOJ^^Wf6DVp!7`UmBfH|nE3jL6bX)8p)3a4`f1Z=oMhJn){ooG-uBOnsqE=W+d
z4g$Kv5HZC~NcJqCtL_j4)cYa%^J5SSS{wuv;~@;HRtVUMg}_=C5;2CipZ{}*b~5Mh
zVJ>PgT>BkOP?~ej?N2kmx=xbW^f+aI;QS)-%SressCL`i+q2(um;O=!>;Cgx;I+N|
zyZiK4{w=`rXlKI5x8UOG8Zz{o0M&Pj*+0Lww|}4$@vkvd&%YA?=WBa={q3%rU&SCN
zaGL7ZukGz8S>vz%Gr+~duoEcx$A2AUV)%CT=KxFrm)U}XUZ%wSIz)j+?C1B_M0N9W
z_q4Qf>cW2&#k*elPXP$plm+?SE_9HSlj$P<D!?tfPw(-jnbFWnFD)*L#l3lh{m(RP
z7(XHKkq!187+_%Vs;GGU7>%3ga}<ZBpNL>lKSh|mrJ{0UV}qI5ccAk9{-+R=sZ}2n
zusTAWo#Az9X(1+dYJ!KnVKVNwL>Zcd3z{N0<RqUzGBz(a)L_;5i)Xm)nS<sTupY}G73
zzK0rL-yHGw?xUkMGwVBp`8lKm!smYqVo8d(a)r>S`}>w{8r*}D1lk0G(<p4|QPHMm+C
z;7B10N0+Ri|G)OmEjFqu3ZT0$r}hCe&?%J)t+qld#R9cOOX&mJY9B&h7D^w|BDP3T
zD+r1jlA)AViXTk~`r(%*ra!1Z_(a)fbwCi+pRVWvEa+JwYJKh#7il_1-7?l5IaOE59=
zbtgG9_nv#sxp&UlduPu&lfC~M2!Ho@;zZ{s+urP1G<jWoqlLp?9i8_%Gv-(a)bAC|TL
zmv3)OUZ9OH-Bsp)Txos1t?jo!{r~+L>@!RrUoXH<Ny1OTM=@bG$M8{3_`_(a)Br|b*(
zDfk|<jSoU`jQNZ4Po(a)-e&9pIXuZ7^JIL0P#V-9RT#r9KdKgIS_Y(GVAzHC1w-~+VV
zev0j<7{!?4Gz3oWvY+DQIg%-p|N98$Db(Nj<tgNMX#1Vp&D3IlD;#7zJfe(a)hvfX=U
zYB6)2hdhS|dLtZ%E>~|lrM1oEQ;qCrj02PY{mlJLt%qE3Js(BS8W^u(a)Iin_bh}ny+
zWgis&V8(cdHbEpQcqC68Oyl(2g!itL)qB+$l#|oNenD-ES7V(6CP(gvj1d;xlk;TQ
z%TEhZ2CwFlC(SV504olB&LZbgP1A_F+()l)AHt7$BK%``Ld|^_rX9PMN$%Ll`P2Ib
z#xQ%Cl^cB;m%!e3NYDGGKLJ#BM$I`gp5J&*<8z1Ay>eKc8AD2psA<n&#)+Z6s>!Qn
zetCwP(1^a_jI}2<z0#*JFHJ1;7Z``e+$Mjp+2_wI`BDj*G|Kn>BOkV%wr)gI%YB+s
z=2h5+5+Y3rcc<<Zr>1=;!^W!{M@;^(tFXA=^P0ZXY(a)VNBT}qrTg$pR*#FThqN+>Z+
zWh{5*kP?B;;_7BUwW8jqu$u{(+u-8W$F+3(MI~C4=CqvG?B??dS5p|4uG)M-mp7bK
zf><fMM2TCaMXeWfS>YEZ{}jJ#J=Kor!{Zg?qk_X}N#{i^VXUfMKWM>*ueFqX=hYk+
zwU25sxlPP*UDt?4#=LFz_IFro7}CAR5#4_|x8|glwV&4FCi3~lADQ60{mlCOnVNO%
z(a)7gY}mTw)>obu0@`?tp7AaD5BKk&Z4f#>;@d(a)DbOh9A7db8VrZv7Ths`UA%Lm22OJ
zhWCC<U3s9_fBiK7y}Q1T`2I=c0wB)+m_y`57_=TOG3C~msWaCv9W*vh#QYw*X=iS5
z+u(jd$A$qKmV}%Lb0DmNkzZj=gf$cN3$E2G%#k3|v^gZmnIJ0`TQuAj{S@>Q#^e=b
z6;9VD=p4MNPmmK~U4%79F}el06zqq^Sdn=_#)P#M<Xw;#i`N=fi<}GkBgmAXyY%&Q
zLDmxfcUG_`7HdPE;j%EbltDp{g*CM}DeEe%y&xa-?Ge^n&~-ru1X&ksiJ%{XehV^f
zu|LC?k#Rvb1)UM(Pmnc1HsN9LyvTk*js!Ur<Ux=-7-v7M`Wrzm1sSwhGWu+BJ;PxQ
z|Han9e9u~p5}P9EwO|hf-C&$v#yBj<vY=0b-dXG!dqUqH!A8M{&j(a)x`uz9e-5jZY<
z7=DLc5%f&3F&4K&uVI>SLkhN0&`rU13HIq$k+IM18MxgHEJ_HzvLtr<!pbF+HMyD3
zzqnyjNT8x)&fEg0vvbeAxmJsYta%SRd2P#kw1bL{=AzfksnZ#{x1AO-X)nL(a)OpR4h
zpByXkDJ{irchh34V&kk=8Wt3WJ+U@!`7YBbfA;;Ztq(Llva(a)8(j{BZ{HUH`KjEA~X
zH?N3H%1JDJVVR>mVz;zC`CP?=>uSrYwme={H=i3;KeqI#)vkM1Wv`6(`&GN6)>ED9
iifXl<Z|a+EXKg!c+u5l)VV~W#8L;gve(1mPXa50NR_iwa
literal 0
HcmV?d00001
diff --git a/dlls/shell32/resources/favorites.svg b/dlls/shell32/resources/favorites.svg
new file mode 100644
index 0000000000..f4b4352516
--- /dev/null
+++ b/dlls/shell32/resources/favorites.svg
@@ -0,0 +1,548 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ height="272"
+ width="632"
+ id="svg1">
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient3111">
+ <stop
+ id="stop3113"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3115"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3101">
+ <stop
+ id="stop3103"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop3105"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient118">
+ <stop
+ id="stop119"
+ offset="0.0000000"
+ style="stop-color:#f5a108;stop-opacity:0.0000000;" />
+ <stop
+ id="stop120"
+ offset="1.0000000"
+ style="stop-color:#fefdc3;stop-opacity:0.74251497;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6621">
+ <stop
+ id="stop6622"
+ offset="0.0000000"
+ style="stop-color:#f5a108;stop-opacity:0.0000000;" />
+ <stop
+ id="stop6623"
+ offset="1.0000000"
+ style="stop-color:#fefdc3;stop-opacity:0.74251497;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.94697898,0,0,0.487322,3.734953,4.0497072)"
+ y2="12.239423"
+ x2="12.849945"
+ y1="28.829224"
+ x1="22.819513"
+ id="linearGradient7881"
+ xlink:href="#linearGradient6621" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.012297,0,0,1.079974,0.83512302,-1.3406628)"
+ y2="6.1003184"
+ x2="6.3578372"
+ y1="32.756931"
+ x1="11.355036"
+ id="linearGradient1697"
+ xlink:href="#linearGradient6621" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.182912,0,0,0.76754023,-13.527047,18.845937)"
+ r="9.6875"
+ fy="25.53125"
+ fx="17.3125"
+ cy="25.53125"
+ cx="17.3125"
+ id="radialGradient3107"
+ xlink:href="#linearGradient3101" />
+ <linearGradient
+ gradientTransform="matrix(0.90340098,0,0,0.903401,2.335433,2.1777372)"
+ gradientUnits="userSpaceOnUse"
+ y2="-6.8890476"
+ x2="17.444614"
+ y1="29.173397"
+ x1="34.797703"
+ id="linearGradient3117"
+ xlink:href="#linearGradient3111" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.182912,0,0,0.76754024,-13.527041,18.845928)"
+ r="9.6875"
+ fy="25.53125"
+ fx="17.3125"
+ cy="25.53125"
+ cx="17.3125"
+ id="radialGradient3107-3"
+ xlink:href="#linearGradient3101" />
+ <linearGradient
+ y2="12.239423"
+ x2="12.849945"
+ y1="28.829224"
+ x1="22.819513"
+ gradientTransform="matrix(0.946979,0,0,0.487322,3.7349493,4.0497076)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient906"
+ xlink:href="#linearGradient6621" />
+ <linearGradient
+ y2="6.1003184"
+ x2="6.3578372"
+ y1="32.756931"
+ x1="11.355036"
+ gradientTransform="matrix(2.012297,0,0,1.079974,0.8351293,-1.3406624)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient908"
+ xlink:href="#linearGradient6621" />
+ <linearGradient
+ y2="-6.8890476"
+ x2="17.444614"
+ y1="29.173397"
+ x1="34.797703"
+ gradientTransform="matrix(0.903401,0,0,0.903401,2.3354393,2.1777376)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient910"
+ xlink:href="#linearGradient3111" />
+ <linearGradient
+ y2="-6.8890476"
+ x2="17.444614"
+ y1="29.173397"
+ x1="34.797703"
+ gradientTransform="matrix(0.90340098,0,0,0.90340099,2.3354294,2.1777415)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient910-9"
+ xlink:href="#linearGradient3111" />
+ <linearGradient
+ y2="6.1003184"
+ x2="6.3578372"
+ y1="32.756931"
+ x1="11.355036"
+ gradientTransform="matrix(2.012297,0,0,1.079974,0.83511544,-1.3406581)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient908-0"
+ xlink:href="#linearGradient118" />
+ <linearGradient
+ y2="12.239423"
+ x2="12.849945"
+ y1="28.829224"
+ x1="22.819513"
+ gradientTransform="matrix(0.946979,0,0,0.487322,3.7349364,4.0497121)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient906-6"
+ xlink:href="#linearGradient118" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.182912,0,0,0.76754027,-13.527057,18.845931)"
+ r="9.6875"
+ fy="25.53125"
+ fx="17.3125"
+ cy="25.53125"
+ cx="17.3125"
+ id="radialGradient3107-3-1"
+ xlink:href="#linearGradient3101" />
+ </defs>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:date>2005-02-01</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz/</dc:source>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson <nisses.mail(a)home.se></dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <ellipse
+ ry="40.048054"
+ rx="112.78371"
+ cy="212.63495"
+ cx="137.4127"
+ id="path3099"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.40909095;fill:url(#radialGradient3107);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.41285896;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
+ <path
+ id="path5378"
+ d="m 126.73192,201.14524 c 0.30704,-0.46476 5.31612,5.98814 5.31612,5.98814 21.96303,-24.1331 78.02088,-69.2246 93.31318,-106.83095 -30.92557,34.63818 -81.45413,90.3636 -98.6293,100.84281 z"
+ style="fill:#d4572d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path7876"
+ d="m 88.884799,45.895357 c -25.590843,-1.27207 -37.512887,15.32992 -43.961788,31.12321 -6.399725,20.79769 2.646791,60.079643 46.979002,57.091243 25.286877,0 35.337507,-26.18825 48.645857,-32.98657 12.09479,-4.618303 13.0467,-5.031643 25.82504,-5.031643 17.75792,0 49.871,-12.97851 49.87101,-25.8562 -5.45836,-10.33357 -19.9496,-28.73605 -46.57817,-25.59957 -16.95017,1.99227 -32.98604,14.2281 -37.17483,20.31669 -10.26116,-9.13988 -23.36309,-19.05716 -43.606121,-19.05716 z"
+ style="fill:url(#linearGradient7881);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path920"
+ d="M 135.60111,54.075757 C 179.88387,9.3554272 240.73877,50.574337 240.33847,92.985927 239.97253,131.75749 210.71218,150.32568 137.20228,219.28869 60.259562,155.13336 33.14988,140.33889 33.550176,94.337717 33.950472,46.719537 86.047393,10.981877 135.60111,54.075757 Z"
+ style="fill:#c71807;fill-opacity:1;fill-rule:evenodd;stroke:#820000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path922"
+ d="M 35.085143,92.776547 C 33.922531,131.4479 39.323228,125.32083 49.081261,137.57227 58.674256,149.61652 100.50476,142.036 138.05319,106.28315 176.05011,70.103247 214.78157,90.581497 233.55651,70.437007 219.56988,46.216937 175.91589,16.871337 135.72623,57.536227 84.222135,10.531457 36.247755,53.675117 35.085143,92.776547 Z"
+ style="opacity:0.625;fill:url(#linearGradient1697);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="opacity:0.39204544;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3117);stroke-width:1.00000072;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 136.11884,60.786357 c 42.1045,-45.96114 99.6472,-7.56258 99.27429,31.94703 C 235.05223,128.85205 205.66466,148.73018 137.1846,212.97447 65.506606,153.20889 38.122543,137.27635 38.495449,94.422767 38.868356,50.062807 89.955796,15.050157 136.11884,60.786357 Z"
+ id="path3109" />
+ <rect
+ id="icon:256-32"
+ height="256"
+ width="256"
+ y="8"
+ x="8"
+ style="fill:none" />
+ <ellipse
+ id="path3099-2"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.40909095;fill:url(#radialGradient3107-3);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.41285896;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+ cx="296.26495"
+ cy="258.44244"
+ rx="21.146959"
+ ry="7.435544" />
+ <path
+ id="path5378-9"
+ d="m 294.26231,256.30921 c 0.0576,-0.0863 0.99677,1.11179 0.99677,1.11179 4.11807,-4.48069 14.62893,-12.85262 17.49624,-19.83483 -5.79855,6.43112 -15.27266,16.77741 -18.49301,18.72304 z"
+ style="fill:#d4572d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path7876-1"
+ d="m 287.16597,227.48465 c -4.79829,-0.23618 -7.03367,2.84624 -8.24284,5.77851 -1.19995,3.86141 0.49627,11.15472 8.80857,10.59988 4.74129,0 6.62579,-4.86226 9.1211,-6.12447 2.26778,-0.85746 2.44626,-0.93421 4.8422,-0.93421 3.32961,0 9.35082,-2.40966 9.35082,-4.8006 -1.02344,-1.91859 -3.74055,-5.3353 -8.73341,-4.75296 -3.17816,0.3699 -6.18489,2.64167 -6.97029,3.77211 -1.92396,-1.69696 -4.38058,-3.53826 -8.17615,-3.53826 z"
+ style="fill:url(#linearGradient906);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path920-2"
+ d="m 295.92528,229.00347 c 8.30303,-8.30303 19.71333,-0.65009 19.63827,7.22428 -0.0686,7.19854 -5.55493,10.64602 -19.33805,23.45007 -14.42677,-11.91143 -19.50983,-14.65826 -19.43478,-23.19909 0.0751,-8.84106 9.84324,-15.47631 19.13456,-7.47526 z"
+ style="fill:#c71807;fill-opacity:1;fill-rule:evenodd;stroke:#820000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path922-7"
+ d="m 277.07853,236.18887 c -0.21799,7.17994 0.79464,6.04236 2.62427,8.31703 1.79869,2.2362 9.64191,0.82876 16.68225,-5.80932 7.12443,-6.71736 14.38658,-2.91525 17.90688,-6.65539 -2.62249,-4.49683 -10.80762,-9.9453 -18.34319,-2.39523 -9.65702,-8.72717 -18.65222,-0.71687 -18.87021,6.54291 z"
+ style="opacity:0.625;fill:url(#linearGradient908);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="opacity:0.39204544;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient910);stroke-width:1.00000072;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 296.02236,230.2494 c 7.8946,-8.5334 18.68386,-1.40411 18.61394,5.93146 -0.0639,6.70599 -5.57409,10.39668 -18.41411,22.32463 -13.43963,-11.09641 -18.57415,-14.05454 -18.50423,-22.01097 0.0699,-8.23612 9.64882,-14.73676 18.3044,-6.24512 z"
+ id="path3109-0" />
+ <rect
+ id="icon:48-32"
+ height="48"
+ width="48"
+ y="220"
+ x="272"
+ style="fill:none" />
+ <image
+ width="48"
+ height="48"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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
+7FPIs1/bypZtmxj/+O94iaGSfa1Fi4m376PzdCc9V7v5vaCGZxl/1gIAGoGfKGTN2mZ2fns3Ttc/
+ydy8XtQnunwF1dt3cebDk1y/dZvfgqrEzqkiAkK8ZiAtCxrY+8pLWIkBkuc7QWuq1qzD2voNjr/7
+N64+6OePunJxKyoA4GWQnVUx2r+zj0WWwh14AOta+Ojw+3w2PMJfKhyz4gIANgHfMw3Z1r6dFc1N
+HD/8PieS4xybg3hzIgBgCfAjhcRNkw/9QJ2dq0BziRjQ+r8mMY95zGMe85gO/wEEGFhCsflliQAA
+ABR0RVh0QXV0aG9yAEpha3ViIFN0ZWluZXLm+/cvAAAAWHRFWHRDb3B5cmlnaHQAQ0MwIFB1Ymxp
+YyBEb21haW4gRGVkaWNhdGlvbiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21h
+aW4vemVyby8xLjAvxuO9+QAAABh0RVh0Q3JlYXRpb24gVGltZQAyMDA1LTAyLTAxhIsTNAAAACV0
+RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wOC0yNFQxNzoyNjozMC0wNjowMAIlLYAAAAAldEVYdGRhdGU6
+bW9kaWZ5ADIwMTgtMDgtMjRUMTc6MjY6MzAtMDY6MDBzeJU8AAAAGXRFWHRTb2Z0d2FyZQB3d3cu
+aW5rc2NhcGUub3Jnm+48GgAAACJ0RVh0U291cmNlAGh0dHA6Ly9qaW1tYWMubXVzaWNoYWxsLmN6
+L/VpyMQAAAAZdEVYdFRpdGxlAEZhdm91cml0ZXMgKGVtYmxlbSmyreP+AAAAAElFTkSuQmCC
+"
+ id="icon:48-8"
+ x="328"
+ y="220" />
+ <image
+ width="48"
+ height="48"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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
+7FPIs1/bypZtmxj/+O94iaGSfa1Fi4m376PzdCc9V7v5vaCGZxl/1gIAGoGfKGTN2mZ2fns3Ttc/
+ydy8XtQnunwF1dt3cebDk1y/dZvfgqrEzqkiAkK8ZiAtCxrY+8pLWIkBkuc7QWuq1qzD2voNjr/7
+N64+6OePunJxKyoA4GWQnVUx2r+zj0WWwh14AOta+Ojw+3w2PMJfKhyz4gIANgHfMw3Z1r6dFc1N
+HD/8PieS4xybg3hzIgBgCfAjhcRNkw/9QJ2dq0BziRjQ+r8mMY95zGMe85gO/wEEGFhCsflliQAA
+ABR0RVh0QXV0aG9yAEpha3ViIFN0ZWluZXLm+/cvAAAAWHRFWHRDb3B5cmlnaHQAQ0MwIFB1Ymxp
+YyBEb21haW4gRGVkaWNhdGlvbiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21h
+aW4vemVyby8xLjAvxuO9+QAAABh0RVh0Q3JlYXRpb24gVGltZQAyMDA1LTAyLTAxhIsTNAAAACV0
+RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wOC0yNFQxNzoyNjozMS0wNjowMKRSJjQAAAAldEVYdGRhdGU6
+bW9kaWZ5ADIwMTgtMDgtMjRUMTc6MjY6MzEtMDY6MDDVD56IAAAAGXRFWHRTb2Z0d2FyZQB3d3cu
+aW5rc2NhcGUub3Jnm+48GgAAACJ0RVh0U291cmNlAGh0dHA6Ly9qaW1tYWMubXVzaWNoYWxsLmN6
+L/VpyMQAAAAZdEVYdFRpdGxlAEZhdm91cml0ZXMgKGVtYmxlbSmyreP+AAAAAElFTkSuQmCC
+"
+ id="icon:48-4"
+ x="384"
+ y="220" />
+ <ellipse
+ id="path3099-2-9"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.40909095;fill:url(#radialGradient3107-3-1);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.41285896;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
+ cx="456.17703"
+ cy="261.65808"
+ rx="14.098043"
+ ry="4.9269128" />
+ <path
+ id="path5378-9-2"
+ d="m 454.84193,260.24458 c 0.0384,-0.0572 0.66452,0.73669 0.66452,0.73669 2.7454,-2.96898 9.75267,-8.51636 11.66422,-13.14289 -3.86572,4.26137 -10.18182,11.11699 -12.32874,12.4062 z"
+ style="fill:#d4572d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path7876-1-0"
+ d="m 450.11102,241.14495 c -3.19888,-0.15649 -4.68914,1.88597 -5.49526,3.82894 -0.79997,2.55863 0.33085,7.3913 5.87241,7.02365 3.16088,0 4.41722,-3.22181 6.08077,-4.05817 1.51186,-0.56817 1.63085,-0.61903 3.22815,-0.61903 2.21975,0 6.23391,-1.59668 6.23391,-3.18095 -0.6823,-1.27129 -2.49371,-3.53526 -5.8223,-3.14939 -2.11879,0.2451 -4.12329,1.75041 -4.64689,2.49946 -1.28264,-1.12443 -2.9204,-2.34451 -5.45079,-2.34451 z"
+ style="fill:url(#linearGradient906-6);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path920-2-2"
+ d="m 455.95059,242.15135 c 5.53538,-5.50173 13.14228,-0.43076 13.09224,4.78692 -0.0457,4.76987 -3.7033,7.05423 -12.8921,15.5384 -9.61789,-7.89271 -13.00661,-9.7128 -12.95658,-15.37209 0.0501,-5.85823 6.56219,-10.25486 12.75644,-4.95323 z"
+ style="fill:#c71807;fill-opacity:1;fill-rule:evenodd;stroke:#820000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path922-7-3"
+ d="m 443.38602,246.91251 c -0.14532,4.75755 0.52977,4.00377 1.74953,5.511 1.19913,1.48174 6.42797,0.54915 11.12155,-3.84935 4.74965,-4.45103 9.5911,-1.93169 11.93798,-4.40997 -1.74833,-2.97967 -7.20511,-6.58992 -12.22885,-1.58712 -6.43805,-5.78276 -12.43488,-0.47501 -12.58021,4.33544 z"
+ style="opacity:0.625;fill:url(#linearGradient908-0);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000003pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="opacity:0.39204544;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient910-9);stroke-width:1.00000072;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 456.01531,242.97692 c 5.26309,-5.65437 12.45597,-0.93039 12.40935,3.93028 -0.0426,4.4435 -3.71608,6.88901 -12.27613,14.79267 -8.9598,-7.35267 -12.38283,-9.31277 -12.33622,-14.58483 0.0466,-5.45739 6.43258,-9.76482 12.203,-4.13812 z"
+ id="path3109-0-7" />
+ <rect
+ id="icon:32-32"
+ height="32"
+ width="32"
+ y="236"
+ x="440"
+ style="fill:none" />
+ <image
+ width="32"
+ height="32"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAA
+B3RJTUUH1gYMFyca8+vhYAAABIpJREFUWMPtls9vVFUUxz/3zcybaTvTklZtIRZaVH4IVBIVEQwt
+KJgQjQsJrvUPYGHCAmNMdcFeo3FvYlQMATagafwBQhHEFI0EQULTX7TTX7Sdmc689+69x8W005lS
+SgcXJIaTvMzk3nO/388957zJwMN4wKEW2/wQcBWC4yCAA4i1aEHFgINFuR8BYQdRKGRmzRHBKJSy
+8F45AO1AVCFuzKWldRMrN68hFo+hPc3A1R7+7rzCyNA4xopyAVFIyA2zccs6Vm3ZQKKuGqsNyX96
+ud75F73dScSKen8pAJ8AaUfJ6rXL2fJmKw6C9X1EDIigQhEc12W4b5TTX58mm/N5Yv1Ktu5rQ5kc
+NpdFjI9ywjhujFBVNWP9I5z5soNsxuPQPM87AA47SFNzPVv3tyJeFquD/IZYQEDIg0SiiFtF39U+
+mlpWYm6PIUaDSP5BEBFQinB1LdaNc/Kzo0ync+qQvQtAO1ARCcm+A69j/WlEB2BnOjpfGFBOiFC8
+Bj1xG8TM5UE+ZyYfK4Rr6tBuguOfHkUCqw7NeIaLASIOsnbT44ifw05nwJIXuIuwWMFOTxe+F+eV
+fIrgD98iVLOCpoZabg6MCjZ/+RIAhaJxfSMmk0J8v1DyOdM7hREQNdcaRLBpD53OYbI+Nhcgnsbm
+AkKJEZqeXE13/2jBswTAiBCvqkBS44jWpcIlbaDQhtk1MRZ/aJIgmcIGZsFXzmTSJBrq0cLCAAqF
+WIvxfZgdqHm3LhgXtUZPeWS7x0BbFgsVChFog6PmjpcAOA5kM1lca5DAzy9ayecWIEor4Y1kCJKp
+guBiEYrHSY2Nl0x+CUAo7DA+MMbyuijWy+SHS6D49ZulEBGCwTTBpHdv55mINjZx9c9rGJljcIoT
+fI3qvZnEqYxjdYANNKIDJND5RxskMJi0T/bmRFnm4do6gsQyegdHKZ6Q0iE0hqHBSSYnPSorEpjJ
+iZL+W2MxEx46HSyp5IVbulESz22j48QpBFHtxXvFie1AYESd7fgDahrAiWCyAXoyh5ecxutPo1Pl
+matIhOrtrVw8c57UVIY18+bUmX/gAyAXaH45eRGnuhmTcgjGPWxWl2WcN3ep2fEyl7uu0NdzC19Q
+++dXZ6GDT1nURCrL2XO/E9vQQrh6WXnOgBONsWzXHi792kX3tW4cKS19AfJuAkeAGwqpqozRumcH
+pvs6/tDg0swrKqlp282Fnzrp7+knEBY0XxQA8hU/DBKJhNm5t43I2DDZG9cWNQ8lqqlp3c25734k
+OZAkLKIOLpK/KMBs5P/tOLKt7QUeqYqS7voN0fqOvHBtHYmXdvHzsZOMjY5TIah376G9JACAA8Bj
+SsnGlrWse+ZppjrPYNKpwr7bsJzY89v54chxJqYyfCGoG0vQXTIAwE5gp1LSuOJRtr32KukLZ/GH
+bhFd1Uxkw2a+/+oYw57Hxxa11J+osgAA6oG3FVJfWcErb72BqyDtBXR8c4Ieo/nclqdZNgBACHjH
+QZqdEJtffJauzktcNpZv70PvvgBmYy/IVuA8cOo/at13JB6I68P4P8W/3Fhxee98CpgAAAAldEVY
+dGRhdGU6Y3JlYXRlADIwMTgtMDgtMjNUMjI6MTQ6NTctMDY6MDAATcIIAAAAJXRFWHRkYXRlOm1v
+ZGlmeQAyMDA2LTA2LTEzVDA1OjM5OjI2LTA2OjAwewtT2wAAAABJRU5ErkJggg==
+"
+ id="icon:32-8"
+ x="480"
+ y="236" />
+ <image
+ width="32"
+ height="32"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAA
+B3RJTUUH1gYMFyca8+vhYAAABIpJREFUWMPtls9vVFUUxz/3zcybaTvTklZtIRZaVH4IVBIVEQwt
+KJgQjQsJrvUPYGHCAmNMdcFeo3FvYlQMATagafwBQhHEFI0EQULTX7TTX7Sdmc689+69x8W005lS
+SgcXJIaTvMzk3nO/388957zJwMN4wKEW2/wQcBWC4yCAA4i1aEHFgINFuR8BYQdRKGRmzRHBKJSy
+8F45AO1AVCFuzKWldRMrN68hFo+hPc3A1R7+7rzCyNA4xopyAVFIyA2zccs6Vm3ZQKKuGqsNyX96
+ud75F73dScSKen8pAJ8AaUfJ6rXL2fJmKw6C9X1EDIigQhEc12W4b5TTX58mm/N5Yv1Ktu5rQ5kc
+NpdFjI9ywjhujFBVNWP9I5z5soNsxuPQPM87AA47SFNzPVv3tyJeFquD/IZYQEDIg0SiiFtF39U+
+mlpWYm6PIUaDSP5BEBFQinB1LdaNc/Kzo0ync+qQvQtAO1ARCcm+A69j/WlEB2BnOjpfGFBOiFC8
+Bj1xG8TM5UE+ZyYfK4Rr6tBuguOfHkUCqw7NeIaLASIOsnbT44ifw05nwJIXuIuwWMFOTxe+F+eV
+fIrgD98iVLOCpoZabg6MCjZ/+RIAhaJxfSMmk0J8v1DyOdM7hREQNdcaRLBpD53OYbI+Nhcgnsbm
+AkKJEZqeXE13/2jBswTAiBCvqkBS44jWpcIlbaDQhtk1MRZ/aJIgmcIGZsFXzmTSJBrq0cLCAAqF
+WIvxfZgdqHm3LhgXtUZPeWS7x0BbFgsVChFog6PmjpcAOA5kM1lca5DAzy9ayecWIEor4Y1kCJKp
+guBiEYrHSY2Nl0x+CUAo7DA+MMbyuijWy+SHS6D49ZulEBGCwTTBpHdv55mINjZx9c9rGJljcIoT
+fI3qvZnEqYxjdYANNKIDJND5RxskMJi0T/bmRFnm4do6gsQyegdHKZ6Q0iE0hqHBSSYnPSorEpjJ
+iZL+W2MxEx46HSyp5IVbulESz22j48QpBFHtxXvFie1AYESd7fgDahrAiWCyAXoyh5ecxutPo1Pl
+matIhOrtrVw8c57UVIY18+bUmX/gAyAXaH45eRGnuhmTcgjGPWxWl2WcN3ep2fEyl7uu0NdzC19Q
+++dXZ6GDT1nURCrL2XO/E9vQQrh6WXnOgBONsWzXHi792kX3tW4cKS19AfJuAkeAGwqpqozRumcH
+pvs6/tDg0swrKqlp282Fnzrp7+knEBY0XxQA8hU/DBKJhNm5t43I2DDZG9cWNQ8lqqlp3c25734k
+OZAkLKIOLpK/KMBs5P/tOLKt7QUeqYqS7voN0fqOvHBtHYmXdvHzsZOMjY5TIah376G9JACAA8Bj
+SsnGlrWse+ZppjrPYNKpwr7bsJzY89v54chxJqYyfCGoG0vQXTIAwE5gp1LSuOJRtr32KukLZ/GH
+bhFd1Uxkw2a+/+oYw57Hxxa11J+osgAA6oG3FVJfWcErb72BqyDtBXR8c4Ieo/nclqdZNgBACHjH
+QZqdEJtffJauzktcNpZv70PvvgBmYy/IVuA8cOo/at13JB6I68P4P8W/3Fhxee98CpgAAAAldEVY
+dGRhdGU6Y3JlYXRlADIwMTgtMDgtMjNUMjI6MTQ6NTctMDY6MDAATcIIAAAAJXRFWHRkYXRlOm1v
+ZGlmeQAyMDA2LTA2LTEzVDA1OjM5OjI2LTA2OjAwewtT2wAAAABJRU5ErkJggg==
+"
+ id="icon:32-4"
+ x="520"
+ y="236" />
+ <image
+ width="16"
+ height="16"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
+AAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKRSURB
+VDiNpZNLSJRRFMf/595v/GbmS4XyQRQUCWEQJT1BRO2BYrQoWgUR1SZatC0oJirNli2iTa0kgiCS
+CJGwbCFliD2IohcUpZSpozPTNzPf6957Wthba9OBA2fx//05nAcxM/4nrO9FB9FuS9BekqKWma1I
+mZMAugAstggdEGKbEJQB87NQmYsp5l4AIGbGGUFH40n7xPrWtcmyynL4hQiP+4aD3JSbY7Czoq4m
+sbxxtQjyHjIf03jc/8SLlO48pnQHnQZ2Oo59pW3f1oRtC3DoAwyIhIOx0QzshI35FQ60mwWEhHRK
+4WuJW5d6/ELePyJbJJ1auaGmrqq6FDo3DQ58cOBDu1/gxAlxRFCZSbDnwRQL0NkpWIbgJOdZn0bG
+l1oMal20pBIqmwEHPsAMZgaYgWIBMAwTKARjOWjXh/YikHyHqvpmGH66zGJmSUbA5F2wUjMwZgzY
+AFE6j/CzCzY/t8Vag2IlYLCwLElvM+PTqysSBO3NdAAArAyCMRe6EM1aXWxBBdITk5CED0IZvvz8
+yTtPllfCBCGMFyJKF+C9z84JkxVDvG4dhgaGipHBUaE1n8tlvdcvHr3XZC+EP+oiTHtgZWbDsRhK
+G5oxeOdeEIVRd4q5W6SYjTK88+Wb0YlXI9ORs2oNSMpZsLBtlDW1YKD/vp+emLqjGAd+HBIAtBNV
+WIJuV1fNr93YuCFeGH4A43kzcDIJp2Ez7t7s8/M594Zi7Ekx698MvpnYFuHqvFKnddOOtoT/cBAc
+hojXN6H/eq9fLHpdmnEo9QtEfz5TOxFJwtmSktjhLbu2J6UUuH2txw+C4Pwxw0dmzeVv39hBtN+S
+4oIQgiKl2o8b7pxTyN8ub648DTS3Awf/pfkKvceKsypI9XkAAAAASUVORK5CYII=
+"
+ id="icon:16-32"
+ x="560"
+ y="252" />
+ <image
+ width="16"
+ height="16"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABg1BMVEX///+DAACCAACEAQCF
+AwKFAwGHAgGIBQOHBAKGAQCGAwKIBAKMCwfBUjrPZ0nHXESVFg+FAwGuMyTUcVPNZUq8SjaKBwWN
+CwfWa0vdck3cbEXca0XedFDFVz/MYEbedFHbZ0HbaUTWcVSODAiHAwG2PSfca0bZXzfZXjbZXTXY
+WzTZYTraYDvYWTHYVzDXVi/XVS3aYUG/QDDRXDzYWzXXVC3XUyzWUivWUSrWUSnWTyjUSCTNLxXK
+Ig3HGQjIHAvVVkuFAQGFAgHSWj7WTijVSiTUSSPUSSLUSCHTRiHOMhXIGgjHGAfWW1GEAQCJBQLB
+QyzVTCnSQRzSQBvRPBnKIwzMLBzCRTyHAgCVEgrYWz7QOhbQNxXNLBDIHAnIHAzUXFCLBwWGAgGu
+KB7RQS/IHQzVWEyaGBSpIx3TSDrIGwrJHw7WXFKXFRGdGBPUVknJIRDJIhHUXlOSEA2SDgvTXlTL
+KhrKJBTSXlOPCwmFAQDOWlHRXVOMCAeHAwKJBQQAAAAkgy4/AAAABnRSTlMAAAAAAABupgeRAAAA
+AWJLR0SAZb2eaAAAAAlwSFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB9cEAgsBLcz3aqkAAADRSURB
+VBjTY2DABIxs7BxMTEycXOzcTCA+Mw8vH78Al6CQsIioGAsDA5O4hKSUtIysnLyCorySMiODiqqa
+uoamlraOrp6+gaERGwOXsYmpmbmFpZW1ja2dvYMjg5Ozi6ubu4enl7ePj4+drx+Df0BgUHBwSKgP
+CISFRzCwRkZFx8TGgfnxCYlMDExJySneYK5Palo6J9AdTE4ZmVkgfnZObhLYZUxJefkFPj6FRcWc
+TBC3M3GWlJaVV1RWMcF8w1SVWF1TW4Xiwbp6ZlQvMzFCGQCmliqV/01FkgAAACV0RVh0ZGF0ZTpj
+cmVhdGUAMjAxOC0wOC0yM1QyMjoxNDo1Ny0wNjowMABNwggAAAAldEVYdGRhdGU6bW9kaWZ5ADIw
+MDctMDQtMDJUMTc6MDE6NDUtMDY6MDCxuArqAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUu
+b3Jnm+48GgAAAABJRU5ErkJggg==
+"
+ id="icon:16-8"
+ x="584"
+ y="252" />
+ <image
+ width="16"
+ height="16"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABg1BMVEX///+DAACCAACEAQCF
+AwKFAwGHAgGIBQOHBAKGAQCGAwKIBAKMCwfBUjrPZ0nHXESVFg+FAwGuMyTUcVPNZUq8SjaKBwWN
+CwfWa0vdck3cbEXca0XedFDFVz/MYEbedFHbZ0HbaUTWcVSODAiHAwG2PSfca0bZXzfZXjbZXTXY
+WzTZYTraYDvYWTHYVzDXVi/XVS3aYUG/QDDRXDzYWzXXVC3XUyzWUivWUSrWUSnWTyjUSCTNLxXK
+Ig3HGQjIHAvVVkuFAQGFAgHSWj7WTijVSiTUSSPUSSLUSCHTRiHOMhXIGgjHGAfWW1GEAQCJBQLB
+QyzVTCnSQRzSQBvRPBnKIwzMLBzCRTyHAgCVEgrYWz7QOhbQNxXNLBDIHAnIHAzUXFCLBwWGAgGu
+KB7RQS/IHQzVWEyaGBSpIx3TSDrIGwrJHw7WXFKXFRGdGBPUVknJIRDJIhHUXlOSEA2SDgvTXlTL
+KhrKJBTSXlOPCwmFAQDOWlHRXVOMCAeHAwKJBQQAAAAkgy4/AAAABnRSTlMAAAAAAABupgeRAAAA
+AWJLR0SAZb2eaAAAAAlwSFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB9cEAgsBLcz3aqkAAADRSURB
+VBjTY2DABIxs7BxMTEycXOzcTCA+Mw8vH78Al6CQsIioGAsDA5O4hKSUtIysnLyCorySMiODiqqa
+uoamlraOrp6+gaERGwOXsYmpmbmFpZW1ja2dvYMjg5Ozi6ubu4enl7ePj4+drx+Df0BgUHBwSKgP
+CISFRzCwRkZFx8TGgfnxCYlMDExJySneYK5Palo6J9AdTE4ZmVkgfnZObhLYZUxJefkFPj6FRcWc
+TBC3M3GWlJaVV1RWMcF8w1SVWF1TW4Xiwbp6ZlQvMzFCGQCmliqV/01FkgAAACV0RVh0ZGF0ZTpj
+cmVhdGUAMjAxOC0wOC0yM1QyMjoxNDo1Ny0wNjowMABNwggAAAAldEVYdGRhdGU6bW9kaWZ5ADIw
+MDctMDQtMDJUMTc6MDE6NDUtMDY6MDCxuArqAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUu
+b3Jnm+48GgAAAABJRU5ErkJggg==
+"
+ id="icon:16-4"
+ x="608"
+ y="252" />
+</svg>
diff --git a/dlls/shell32/shell32.rc b/dlls/shell32/shell32.rc
index 2333e397f1..2192327a76 100644
--- a/dlls/shell32/shell32.rc
+++ b/dlls/shell32/shell32.rc
@@ -553,21 +553,26 @@ IDI_SHELL_TREE ICON resources/menu.ico
/* @makedep: resources/folder.ico */
IDI_SHELL_REMOTE_FOLDER ICON resources/folder.ico
+/* @makedep: resources/favorites.ico */
+IDI_SHELL_FAVORITES ICON resources/favorites.ico
+
/* @makedep: resources/trash_file.ico */
IDI_SHELL_TRASH_FILE ICON resources/trash_file.ico
/* @makedep: resources/delete.ico */
IDI_SHELL_CONFIRM_DELETE ICON resources/delete.ico
+/* @makedep: resources/favorites.ico */
+IDI_SHELL_FAVORITES_FOLDER ICON resources/favorites.ico
+
/* @makedep: resources/mydocs.ico */
IDI_SHELL_MY_DOCUMENTS ICON resources/mydocs.ico
/* @makedep: resources/optical_disc.ico */
IDI_SHELL_OPTICAL_DISC ICON resources/optical_disc.ico
-/* FIXME: Following resource is not yet added */
-/* @makedep: resources/mydocs.ico */
-IDI_SHELL_FAVORITES ICON resources/mydocs.ico
+/* @makedep: resources/favorites.ico */
+IDI_SHELL_FAVORITES_SMALL ICON resources/favorites.ico
/* @makedep: resources/idb_tb_large.bmp */
IDB_TB_LARGE_LIGHT BITMAP resources/idb_tb_large.bmp
diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h
index 651d52ea37..174f76076f 100644
--- a/dlls/shell32/shresdef.h
+++ b/dlls/shell32/shresdef.h
@@ -212,6 +212,7 @@
#define IDI_SHELL_MUSIC_CD 41
#define IDI_SHELL_TREE 42
#define IDI_SHELL_REMOTE_FOLDER 43
+#define IDI_SHELL_FAVORITES 44
#define IDI_SHELL_REMOTE_PRINTER 140
#define IDI_SHELL_TO_FILE_PRINTER 141
#define IDI_SHELL_TRASH_FILE 142
@@ -219,9 +220,10 @@
#define IDI_SHELL_DEFAULT_PRINTER 168
#define IDI_SHELL_DEFAULT_REMOTE_PRINTER 169
#define IDI_SHELL_DEFAULT_TO_FILE_PRINTER 170
+#define IDI_SHELL_FAVORITES_FOLDER 173
#define IDI_SHELL_MY_DOCUMENTS 235
#define IDI_SHELL_OPTICAL_DISC 302
-#define IDI_SHELL_FAVORITES 319
+#define IDI_SHELL_FAVORITES_SMALL 322
/*
AVI resources, windows shell32 has 14 of them: 150-152 and 160-170
--
2.18.0
1
19
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
include/Makefile.in | 1 +
include/sal.h | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 96 insertions(+)
create mode 100644 include/sal.h
diff --git a/include/Makefile.in b/include/Makefile.in
index fec158d..a89fef6 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -549,6 +549,7 @@ SOURCES = \
rstloc.idl \
rstnot.idl \
rtutils.h \
+ sal.h \
sapi.idl \
sapiddk.idl \
scarderr.h \
diff --git a/include/sal.h b/include/sal.h
new file mode 100644
index 0000000..3c4d419
--- /dev/null
+++ b/include/sal.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 Alistair Leslie-Hughes
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_SAL_H__
+#define __WINE_SAL_H__
+
+#define _Check_return_
+
+#define _Deref_out_
+#define _Deref_out_opt_
+#define _Deref_out_opt_z_
+#define _Deref_post_opt_cap_(count)
+#define _Deref_post_opt_valid_
+
+#define _In_
+#define _In_bytecount_(count)
+#define _In_count_(count)
+#define _In_opt_
+#define _In_opt_count_(count)
+#define _In_opt_z_
+#define _In_reads_(count)
+#define _In_reads_bytes_(count)
+#define _In_reads_opt_z_(count)
+#define _In_reads_z_(count)
+#define _In_z_
+
+#define _Inout_
+#define _Inout_cap_(count)
+#define _Inout_opt_
+#define _Inout_updates_z_(count)
+#define _Inout_z_
+#define _Inout_z_bytecap_(count)
+#define _Inout_z_cap_(count)
+#define _Inout_z_cap_c_(count)
+
+#define _Null_terminated_
+
+#define _Out_
+#define _Out_bytecap_(count)
+#define _Out_bytecapcount_(count)
+#define _Out_bytecap_post_bytecount_(count1, count2)
+#define _Out_cap_(count)
+#define _Out_cap_post_count_(count1, count2)
+#define _Out_opt_
+#define _Out_opt_z_cap_(count)
+#define _Out_opt_z_cap_post_count_(count1, count2)
+#define _Out_writes_(count)
+#define _Out_writes_bytes_to_(count1, count2)
+#define _Out_writes_opt_(count)
+#define _Out_writes_opt_z_(count)
+#define _Out_writes_to_(count1, count2)
+#define _Out_writes_z_(count)
+#define _Out_z_cap_(count)
+#define _Out_z_cap_c_(count)
+#define _Out_z_cap_post_count_(count1, count2)
+
+#define _Outptr_result_buffer_(count)
+#define _Outptr_result_maybenull_z_
+
+#define _Post_invalid_
+#define _Post_writable_byte_size_(count)
+#define _Post_z_
+
+#define _Pre_maybenull_
+#define _Pre_notnull_
+#define _Pre_writable_size_(count)
+
+#define _Printf_format_string_
+
+#define _Ret_maybenull_
+#define _Ret_maybenull_z_
+#define _Ret_opt_
+#define _Ret_opt_z_cap_(count)
+#define _Ret_writes_bytes_maybenull_(count)
+#define _Ret_z_
+
+#define _Success_(exp)
+
+#endif
+
--
1.9.1
1
0
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/dpnet/peer.c | 12 ++++++++++--
dlls/dpnet/tests/client.c | 25 +++++++++++++++++++++++++
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/dlls/dpnet/peer.c b/dlls/dpnet/peer.c
index e8a60c3..3e3cd9b 100644
--- a/dlls/dpnet/peer.c
+++ b/dlls/dpnet/peer.c
@@ -526,9 +526,17 @@ static HRESULT WINAPI IDirectPlay8PeerImpl_SetCaps(IDirectPlay8Peer *iface, cons
static HRESULT WINAPI IDirectPlay8PeerImpl_SetSPCaps(IDirectPlay8Peer *iface, const GUID * const pguidSP,
const DPN_SP_CAPS * const pdpspCaps, const DWORD dwFlags )
{
- FIXME("(%p)->(%p,%p,%x): stub\n", iface, pguidSP, pdpspCaps, dwFlags);
+ IDirectPlay8PeerImpl* This = impl_from_IDirectPlay8Peer(iface);
- return DPNERR_GENERIC;
+ TRACE("(%p)->(%p,%p,%x): stub\n", iface, pguidSP, pdpspCaps, dwFlags);
+
+ if(!This->msghandler || pdpspCaps->dwSize != sizeof(DPN_SP_CAPS))
+ return DPNERR_INVALIDPARAM;
+
+ /* Only dwSystemBufferSize is set by this call. */
+ This->spcaps.dwSystemBufferSize = pdpspCaps->dwSystemBufferSize;
+
+ return DPN_OK;
}
static HRESULT WINAPI IDirectPlay8PeerImpl_GetSPCaps(IDirectPlay8Peer *iface, const GUID * const pguidSP,
diff --git a/dlls/dpnet/tests/client.c b/dlls/dpnet/tests/client.c
index 431203b..47d8b01 100644
--- a/dlls/dpnet/tests/client.c
+++ b/dlls/dpnet/tests/client.c
@@ -561,6 +561,9 @@ static void test_init_dp_peer(void)
memset(&caps, 0, sizeof(DPN_SP_CAPS));
caps.dwSize = sizeof(DPN_SP_CAPS);
+ hr = IDirectPlay8Peer_SetSPCaps(peer, &CLSID_DP8SP_TCPIP, &caps, 0);
+ ok(hr == DPNERR_INVALIDPARAM, "SetSPCaps failed with %x\n", hr);
+
hr = IDirectPlay8Peer_GetSPCaps(peer, &CLSID_DP8SP_TCPIP, &caps, 0);
ok(hr == DPNERR_UNINITIALIZED, "GetSPCaps failed with %x\n", hr);
@@ -815,6 +818,28 @@ static void test_get_sp_caps_peer(void)
ok(caps.dwBuffersPerThread == 1, "expected 1, got %d\n", caps.dwBuffersPerThread);
ok(caps.dwSystemBufferSize == 0x10000 || broken(caps.dwSystemBufferSize == 0x2000 /* before Win8 */),
"expected 0x10000, got 0x%x\n", caps.dwSystemBufferSize);
+
+ caps.dwNumThreads = 2;
+ caps.dwDefaultEnumCount = 3;
+ caps.dwDefaultEnumRetryInterval = 1400;
+ caps.dwDefaultEnumTimeout = 1400;
+ caps.dwMaxEnumPayloadSize = 900;
+ caps.dwBuffersPerThread = 2;
+ caps.dwSystemBufferSize = 0x0ffff;
+ hr = IDirectPlay8Peer_SetSPCaps(peer, &CLSID_DP8SP_TCPIP, &caps, 0);
+ ok(hr == DPN_OK, "SetSPCaps failed with %x\n", hr);
+
+ hr = IDirectPlay8Peer_GetSPCaps(peer, &CLSID_DP8SP_TCPIP, &caps, 0);
+ ok(hr == DPN_OK, "GetSPCaps failed with %x\n", hr);
+
+ ok(caps.dwSize == sizeof(DPN_SP_CAPS), "got %d\n", caps.dwSize);
+ ok(caps.dwNumThreads >= 3, "got %d\n", caps.dwNumThreads);
+ ok(caps.dwDefaultEnumCount == 5, "expected 5, got %d\n", caps.dwDefaultEnumCount);
+ ok(caps.dwDefaultEnumRetryInterval == 1500, "expected 1500, got %d\n", caps.dwDefaultEnumRetryInterval);
+ ok(caps.dwDefaultEnumTimeout == 1500, "expected 1500, got %d\n", caps.dwDefaultEnumTimeout);
+ ok(caps.dwMaxEnumPayloadSize == 983, "expected 983, got %d\n", caps.dwMaxEnumPayloadSize);
+ ok(caps.dwBuffersPerThread == 1, "expected 1, got %d\n", caps.dwBuffersPerThread);
+ ok(caps.dwSystemBufferSize == 0x0ffff, "expected 0x0ffff, got 0x%x\n", caps.dwSystemBufferSize);
}
static void test_player_info_peer(void)
--
1.9.1
1
0
[PATCH] explorer: Replace the desktop window procedure instead of wrapping it.
by Fabian Maurer 26 Aug '18
by Fabian Maurer 26 Aug '18
26 Aug '18
This reverts commit fc14753dc0188a52a05243d5d82c4062b93daaff.
According to Alexandre, we should be passing all messages to DefWindowProc.
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
programs/explorer/desktop.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index ff58204530..49d3ee6928 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -599,8 +599,6 @@ static BOOL start_screensaver( void )
return FALSE;
}
-static WNDPROC desktop_orig_wndproc;
-
/* window procedure for the desktop window */
static LRESULT WINAPI desktop_wnd_proc( HWND hwnd, UINT message, WPARAM wp, LPARAM lp )
{
@@ -662,9 +660,10 @@ static LRESULT WINAPI desktop_wnd_proc( HWND hwnd, UINT message, WPARAM wp, LPAR
EndPaint( hwnd, &ps );
}
return 0;
- }
- return desktop_orig_wndproc( hwnd, message, wp, lp );
+ default:
+ return DefWindowProcW( hwnd, message, wp, lp );
+ }
}
/* create the desktop and the associated driver window, and make it the current desktop */
@@ -979,8 +978,7 @@ void manage_desktop( WCHAR *arg )
CreateWindowExW( 0, messageW, NULL, WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0, 0, 100, 100, 0, 0, 0, NULL );
- desktop_orig_wndproc = (WNDPROC)SetWindowLongPtrW( hwnd, GWLP_WNDPROC,
- (LONG_PTR)desktop_wnd_proc );
+ SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)desktop_wnd_proc );
using_root = !desktop || !create_desktop( graphics_driver, name, width, height );
SendMessageW( hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIconW( 0, MAKEINTRESOURCEW(OIC_WINLOGO)));
if (name) set_desktop_window_title( hwnd, name );
--
2.18.0
1
1