aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2010-08-20 11:15:30 -0400
committerLarry Finger <Larry.Finger@lwfinger.net>2010-08-20 11:15:30 -0400
commit2865d42c78a9121caad52cb02d1fbb7f5cdbc4ef (patch)
tree430b79f753b0e1cec6379b9a4208a716c914ac65 /drivers/staging
parent763008c4357b73c8d18396dfd8d79dc58fa3f99d (diff)
staging: r8712u: Add the new driver to the mainline kernel
This code is for a completely new version of the Realtek 8192 USB devices such as the D-Link DWA-130. The Realtek code, which was originally for Linux, Windows XP and Windows CE, has been stripped of all code not needed for Linux. In addition, only one additional configuration variable, which enables AP mode, remains. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: Florian Schilhabel <florian.c.schilhabel@googlemail.com> Tested-by: Frederic Leroy <fredo@starox.org>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/Kconfig2
-rw-r--r--drivers/staging/Makefile1
-rw-r--r--drivers/staging/rtl8712/Kconfig18
-rw-r--r--drivers/staging/rtl8712/Makefile34
-rw-r--r--drivers/staging/rtl8712/basic_types.h23
-rw-r--r--drivers/staging/rtl8712/big_endian.h69
-rw-r--r--drivers/staging/rtl8712/drv_types.h164
-rw-r--r--drivers/staging/rtl8712/ethernet.h23
-rw-r--r--drivers/staging/rtl8712/farray.h10197
-rw-r--r--drivers/staging/rtl8712/generic.h153
-rw-r--r--drivers/staging/rtl8712/hal_init.c356
-rw-r--r--drivers/staging/rtl8712/ieee80211.c454
-rw-r--r--drivers/staging/rtl8712/ieee80211.h770
-rw-r--r--drivers/staging/rtl8712/if_ether.h116
-rw-r--r--drivers/staging/rtl8712/ip.h137
-rw-r--r--drivers/staging/rtl8712/little_endian.h69
-rw-r--r--drivers/staging/rtl8712/mlme_linux.c170
-rw-r--r--drivers/staging/rtl8712/mlme_osdep.h18
-rw-r--r--drivers/staging/rtl8712/mp_custom_oid.h274
-rw-r--r--drivers/staging/rtl8712/os_intfs.c458
-rw-r--r--drivers/staging/rtl8712/osdep_intf.h19
-rw-r--r--drivers/staging/rtl8712/osdep_service.h260
-rw-r--r--drivers/staging/rtl8712/recv_linux.c169
-rw-r--r--drivers/staging/rtl8712/recv_osdep.h27
-rw-r--r--drivers/staging/rtl8712/rtl8712_bitdef.h19
-rw-r--r--drivers/staging/rtl8712/rtl8712_cmd.c465
-rw-r--r--drivers/staging/rtl8712/rtl8712_cmd.h157
-rw-r--r--drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h89
-rw-r--r--drivers/staging/rtl8712/rtl8712_cmdctrl_regdef.h15
-rw-r--r--drivers/staging/rtl8712/rtl8712_debugctrl_bitdef.h36
-rw-r--r--drivers/staging/rtl8712/rtl8712_debugctrl_regdef.h28
-rw-r--r--drivers/staging/rtl8712/rtl8712_edcasetting_bitdef.h52
-rw-r--r--drivers/staging/rtl8712/rtl8712_edcasetting_regdef.h18
-rw-r--r--drivers/staging/rtl8712/rtl8712_efuse.c568
-rw-r--r--drivers/staging/rtl8712/rtl8712_efuse.h43
-rw-r--r--drivers/staging/rtl8712/rtl8712_event.h73
-rw-r--r--drivers/staging/rtl8712/rtl8712_fifoctrl_bitdef.h126
-rw-r--r--drivers/staging/rtl8712/rtl8712_fifoctrl_regdef.h57
-rw-r--r--drivers/staging/rtl8712/rtl8712_gp_bitdef.h54
-rw-r--r--drivers/staging/rtl8712/rtl8712_gp_regdef.h17
-rw-r--r--drivers/staging/rtl8712/rtl8712_hal.h124
-rw-r--r--drivers/staging/rtl8712/rtl8712_interrupt_bitdef.h39
-rw-r--r--drivers/staging/rtl8712/rtl8712_io.c151
-rw-r--r--drivers/staging/rtl8712/rtl8712_led.c1815
-rw-r--r--drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h28
-rw-r--r--drivers/staging/rtl8712/rtl8712_macsetting_regdef.h16
-rw-r--r--drivers/staging/rtl8712/rtl8712_powersave_bitdef.h33
-rw-r--r--drivers/staging/rtl8712/rtl8712_powersave_regdef.h20
-rw-r--r--drivers/staging/rtl8712/rtl8712_ratectrl_bitdef.h30
-rw-r--r--drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h31
-rw-r--r--drivers/staging/rtl8712/rtl8712_recv.c1145
-rw-r--r--drivers/staging/rtl8712/rtl8712_recv.h128
-rw-r--r--drivers/staging/rtl8712/rtl8712_regdef.h19
-rw-r--r--drivers/staging/rtl8712/rtl8712_security_bitdef.h29
-rw-r--r--drivers/staging/rtl8712/rtl8712_spec.h110
-rw-r--r--drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h145
-rw-r--r--drivers/staging/rtl8712/rtl8712_syscfg_regdef.h31
-rw-r--r--drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h44
-rw-r--r--drivers/staging/rtl8712/rtl8712_timectrl_regdef.h20
-rw-r--r--drivers/staging/rtl8712/rtl8712_wmac_bitdef.h37
-rw-r--r--drivers/staging/rtl8712/rtl8712_wmac_regdef.h24
-rw-r--r--drivers/staging/rtl8712/rtl8712_xmit.c509
-rw-r--r--drivers/staging/rtl8712/rtl8712_xmit.h95
-rw-r--r--drivers/staging/rtl8712/rtl871x_byteorder.h13
-rw-r--r--drivers/staging/rtl8712/rtl871x_cmd.c918
-rw-r--r--drivers/staging/rtl8712/rtl871x_cmd.h719
-rw-r--r--drivers/staging/rtl8712/rtl871x_debug.h142
-rw-r--r--drivers/staging/rtl8712/rtl871x_eeprom.c233
-rw-r--r--drivers/staging/rtl8712/rtl871x_eeprom.h82
-rw-r--r--drivers/staging/rtl8712/rtl871x_event.h95
-rw-r--r--drivers/staging/rtl8712/rtl871x_ht.h19
-rw-r--r--drivers/staging/rtl8712/rtl871x_io.c163
-rw-r--r--drivers/staging/rtl8712/rtl871x_io.h233
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl.h97
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl_linux.c2256
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl_rtl.c535
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl_rtl.h96
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl_set.c379
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl_set.h24
-rw-r--r--drivers/staging/rtl8712/rtl871x_led.h99
-rw-r--r--drivers/staging/rtl8712/rtl871x_mlme.c1842
-rw-r--r--drivers/staging/rtl8712/rtl871x_mlme.h208
-rw-r--r--drivers/staging/rtl8712/rtl871x_mp.c736
-rw-r--r--drivers/staging/rtl8712/rtl871x_mp.h318
-rw-r--r--drivers/staging/rtl8712/rtl871x_mp_ioctl.c1475
-rw-r--r--drivers/staging/rtl8712/rtl871x_mp_ioctl.h457
-rw-r--r--drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h1025
-rw-r--r--drivers/staging/rtl8712/rtl871x_pwrctrl.c250
-rw-r--r--drivers/staging/rtl8712/rtl871x_pwrctrl.h127
-rw-r--r--drivers/staging/rtl8712/rtl871x_recv.c715
-rw-r--r--drivers/staging/rtl8712/rtl871x_recv.h330
-rw-r--r--drivers/staging/rtl8712/rtl871x_rf.h43
-rw-r--r--drivers/staging/rtl8712/rtl871x_security.c1389
-rw-r--r--drivers/staging/rtl8712/rtl871x_security.h196
-rw-r--r--drivers/staging/rtl8712/rtl871x_sta_mgt.c299
-rw-r--r--drivers/staging/rtl8712/rtl871x_wlan_sme.h22
-rw-r--r--drivers/staging/rtl8712/rtl871x_xmit.c1052
-rw-r--r--drivers/staging/rtl8712/rtl871x_xmit.h260
-rw-r--r--drivers/staging/rtl8712/sta_info.h125
-rw-r--r--drivers/staging/rtl8712/swab.h106
-rw-r--r--drivers/staging/rtl8712/usb_halinit.c317
-rw-r--r--drivers/staging/rtl8712/usb_intf.c571
-rw-r--r--drivers/staging/rtl8712/usb_ops.c201
-rw-r--r--drivers/staging/rtl8712/usb_ops.h25
-rw-r--r--drivers/staging/rtl8712/usb_ops_linux.c529
-rw-r--r--drivers/staging/rtl8712/usb_osintf.h24
-rw-r--r--drivers/staging/rtl8712/usb_vendor_req.h33
-rw-r--r--drivers/staging/rtl8712/wifi.h622
-rw-r--r--drivers/staging/rtl8712/wlan_bssdef.h242
-rw-r--r--drivers/staging/rtl8712/xmit_linux.c182
-rw-r--r--drivers/staging/rtl8712/xmit_osdep.h38
111 files changed, 40283 insertions, 0 deletions
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
index 4a7a7a7f11b..d57150e0a49 100644
--- a/drivers/staging/Kconfig
+++ b/drivers/staging/Kconfig
@@ -79,6 +79,8 @@ source "drivers/staging/rtl8192u/Kconfig"
79 79
80source "drivers/staging/rtl8192e/Kconfig" 80source "drivers/staging/rtl8192e/Kconfig"
81 81
82source "drivers/staging/rtl8712/Kconfig"
83
82source "drivers/staging/frontier/Kconfig" 84source "drivers/staging/frontier/Kconfig"
83 85
84source "drivers/staging/dream/Kconfig" 86source "drivers/staging/dream/Kconfig"
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
index ca5c03eb3ce..af88a5cdf69 100644
--- a/drivers/staging/Makefile
+++ b/drivers/staging/Makefile
@@ -23,6 +23,7 @@ obj-$(CONFIG_R8187SE) += rtl8187se/
23obj-$(CONFIG_RTL8192SU) += rtl8192su/ 23obj-$(CONFIG_RTL8192SU) += rtl8192su/
24obj-$(CONFIG_RTL8192U) += rtl8192u/ 24obj-$(CONFIG_RTL8192U) += rtl8192u/
25obj-$(CONFIG_RTL8192E) += rtl8192e/ 25obj-$(CONFIG_RTL8192E) += rtl8192e/
26obj-$(CONFIG_R8712U) += rtl8712/
26obj-$(CONFIG_SPECTRA) += spectra/ 27obj-$(CONFIG_SPECTRA) += spectra/
27obj-$(CONFIG_TRANZPORT) += frontier/ 28obj-$(CONFIG_TRANZPORT) += frontier/
28obj-$(CONFIG_DREAM) += dream/ 29obj-$(CONFIG_DREAM) += dream/
diff --git a/drivers/staging/rtl8712/Kconfig b/drivers/staging/rtl8712/Kconfig
new file mode 100644
index 00000000000..1e9a230a4db
--- /dev/null
+++ b/drivers/staging/rtl8712/Kconfig
@@ -0,0 +1,18 @@
1config R8712U
2 tristate "RealTek RTL8712U (RTL8192SU) Wireless LAN NIC driver"
3 depends on WLAN && USB
4 select WIRELESS_EXT
5 select WEXT_PRIV
6 default N
7 ---help---
8 This option adds the Realtek RTL8712 USB device such as the D-Link DWA-130.
9 If built as a module, it will be called r8712u.
10
11config R8712_AP
12 bool "Realtek RTL8712U AP code"
13 depends on R8712U
14 default N
15 ---help---
16 This option allows the Realtek RTL8712 USB device to be an Access Point.
17
18
diff --git a/drivers/staging/rtl8712/Makefile b/drivers/staging/rtl8712/Makefile
new file mode 100644
index 00000000000..1ccd251fde4
--- /dev/null
+++ b/drivers/staging/rtl8712/Makefile
@@ -0,0 +1,34 @@
1r8712u-objs := \
2 rtl871x_cmd.o \
3 rtl8712_cmd.o \
4 rtl871x_security.o \
5 rtl871x_eeprom.o \
6 rtl8712_efuse.o \
7 hal_init.o \
8 usb_halinit.o \
9 usb_ops.o \
10 usb_ops_linux.o \
11 rtl871x_io.o \
12 rtl8712_io.o \
13 rtl871x_ioctl_linux.o \
14 rtl871x_ioctl_rtl.o \
15 rtl871x_ioctl_set.o \
16 rtl8712_led.o \
17 rtl871x_mlme.o \
18 ieee80211.o \
19 rtl871x_mp_ioctl.o \
20 rtl871x_mp.o \
21 mlme_linux.o \
22 recv_linux.o \
23 xmit_linux.o \
24 usb_intf.o \
25 os_intfs.o \
26 rtl871x_pwrctrl.o \
27 rtl8712_recv.o \
28 rtl871x_recv.o \
29 rtl871x_sta_mgt.o \
30 rtl871x_xmit.o \
31 rtl8712_xmit.o
32
33obj-$(CONFIG_R8712U) := r8712u.o
34
diff --git a/drivers/staging/rtl8712/basic_types.h b/drivers/staging/rtl8712/basic_types.h
new file mode 100644
index 00000000000..a0538a8a670
--- /dev/null
+++ b/drivers/staging/rtl8712/basic_types.h
@@ -0,0 +1,23 @@
1#ifndef __BASIC_TYPES_H__
2#define __BASIC_TYPES_H__
3
4#define SUCCESS 0
5#define FAIL (-1)
6
7#include <linux/types.h>
8
9#define SIZE_T __kernel_size_t
10#define sint signed int
11#define FIELD_OFFSET(s, field) ((addr_t)&((s *)(0))->field)
12
13/* Should we extend this to be host_addr_t and target_addr_t for case:
14 * host : x86_64
15 * target : mips64
16 */
17#define addr_t unsigned long
18
19#define MEM_ALIGNMENT_OFFSET (sizeof(SIZE_T))
20#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1)
21
22#endif /*__BASIC_TYPES_H__*/
23
diff --git a/drivers/staging/rtl8712/big_endian.h b/drivers/staging/rtl8712/big_endian.h
new file mode 100644
index 00000000000..8512d1b5919
--- /dev/null
+++ b/drivers/staging/rtl8712/big_endian.h
@@ -0,0 +1,69 @@
1#ifndef _LINUX_BYTEORDER_BIG_ENDIAN_H
2#define _LINUX_BYTEORDER_BIG_ENDIAN_H
3
4#ifndef __BIG_ENDIAN
5#define __BIG_ENDIAN 4321
6#endif
7#ifndef __BIG_ENDIAN_BITFIELD
8#define __BIG_ENDIAN_BITFIELD
9#endif
10
11#include "swab.h"
12
13#define __constant_htonl(x) ((__u32)(x))
14#define __constant_ntohl(x) ((__u32)(x))
15#define __constant_htons(x) ((__u16)(x))
16#define __constant_ntohs(x) ((__u16)(x))
17#define __constant_cpu_to_le64(x) ___constant_swab64((x))
18#define __constant_le64_to_cpu(x) ___constant_swab64((x))
19#define __constant_cpu_to_le32(x) ___constant_swab32((x))
20#define __constant_le32_to_cpu(x) ___constant_swab32((x))
21#define __constant_cpu_to_le16(x) ___constant_swab16((x))
22#define __constant_le16_to_cpu(x) ___constant_swab16((x))
23#define __constant_cpu_to_be64(x) ((__u64)(x))
24#define __constant_be64_to_cpu(x) ((__u64)(x))
25#define __constant_cpu_to_be32(x) ((__u32)(x))
26#define __constant_be32_to_cpu(x) ((__u32)(x))
27#define __constant_cpu_to_be16(x) ((__u16)(x))
28#define __constant_be16_to_cpu(x) ((__u16)(x))
29#define __cpu_to_le64(x) __swab64((x))
30#define __le64_to_cpu(x) __swab64((x))
31#define __cpu_to_le32(x) __swab32((x))
32#define __le32_to_cpu(x) __swab32((x))
33#define __cpu_to_le16(x) __swab16((x))
34#define __le16_to_cpu(x) __swab16((x))
35#define __cpu_to_be64(x) ((__u64)(x))
36#define __be64_to_cpu(x) ((__u64)(x))
37#define __cpu_to_be32(x) ((__u32)(x))
38#define __be32_to_cpu(x) ((__u32)(x))
39#define __cpu_to_be16(x) ((__u16)(x))
40#define __be16_to_cpu(x) ((__u16)(x))
41#define __cpu_to_le64p(x) __swab64p((x))
42#define __le64_to_cpup(x) __swab64p((x))
43#define __cpu_to_le32p(x) __swab32p((x))
44#define __le32_to_cpup(x) __swab32p((x))
45#define __cpu_to_le16p(x) __swab16p((x))
46#define __le16_to_cpup(x) __swab16p((x))
47#define __cpu_to_be64p(x) (*(__u64 *)(x))
48#define __be64_to_cpup(x) (*(__u64 *)(x))
49#define __cpu_to_be32p(x) (*(__u32 *)(x))
50#define __be32_to_cpup(x) (*(__u32 *)(x))
51#define __cpu_to_be16p(x) (*(__u16 *)(x))
52#define __be16_to_cpup(x) (*(__u16 *)(x))
53#define __cpu_to_le64s(x) __swab64s((x))
54#define __le64_to_cpus(x) __swab64s((x))
55#define __cpu_to_le32s(x) __swab32s((x))
56#define __le32_to_cpus(x) __swab32s((x))
57#define __cpu_to_le16s(x) __swab16s((x))
58#define __le16_to_cpus(x) __swab16s((x))
59#define __cpu_to_be64s(x) do {} while (0)
60#define __be64_to_cpus(x) do {} while (0)
61#define __cpu_to_be32s(x) do {} while (0)
62#define __be32_to_cpus(x) do {} while (0)
63#define __cpu_to_be16s(x) do {} while (0)
64#define __be16_to_cpus(x) do {} while (0)
65
66#include "generic.h"
67
68#endif /* _LINUX_BYTEORDER_BIG_ENDIAN_H */
69
diff --git a/drivers/staging/rtl8712/drv_types.h b/drivers/staging/rtl8712/drv_types.h
new file mode 100644
index 00000000000..6147786d655
--- /dev/null
+++ b/drivers/staging/rtl8712/drv_types.h
@@ -0,0 +1,164 @@
1/*---------------------------------------------------------------------
2
3 For type defines and data structure defines
4
5-----------------------------------------------------------------------*/
6#ifndef __DRV_TYPES_H__
7#define __DRV_TYPES_H__
8
9struct _adapter;
10
11#include "osdep_service.h"
12#include "wlan_bssdef.h"
13#include "rtl8712_spec.h"
14#include "rtl8712_hal.h"
15
16enum _NIC_VERSION {
17 RTL8711_NIC,
18 RTL8712_NIC,
19 RTL8713_NIC,
20 RTL8716_NIC
21};
22
23struct _adapter;
24
25struct qos_priv {
26 /* bit mask option: u-apsd, s-apsd, ts, block ack... */
27 unsigned int qos_option;
28};
29
30#include "rtl871x_ht.h"
31#include "rtl871x_cmd.h"
32#include "wlan_bssdef.h"
33#include "rtl871x_xmit.h"
34#include "rtl871x_recv.h"
35#include "rtl871x_security.h"
36#include "rtl871x_pwrctrl.h"
37#include "rtl871x_io.h"
38#include "rtl871x_eeprom.h"
39#include "sta_info.h"
40#include "rtl871x_mlme.h"
41#include "rtl871x_mp.h"
42#include "rtl871x_debug.h"
43#include "rtl871x_rf.h"
44#include "rtl871x_event.h"
45#include "rtl871x_led.h"
46
47#define SPEC_DEV_ID_NONE BIT(0)
48#define SPEC_DEV_ID_DISABLE_HT BIT(1)
49#define SPEC_DEV_ID_ENABLE_PS BIT(2)
50
51struct specific_device_id {
52 u32 flags;
53 u16 idVendor;
54 u16 idProduct;
55
56};
57
58struct registry_priv {
59 u8 chip_version;
60 u8 rfintfs;
61 u8 lbkmode;
62 u8 hci;
63 u8 network_mode; /*infra, ad-hoc, auto*/
64 struct ndis_802_11_ssid ssid;
65 u8 channel;/* ad-hoc support requirement */
66 u8 wireless_mode;/* A, B, G, auto */
67 u8 vrtl_carrier_sense; /*Enable, Disable, Auto*/
68 u8 vcs_type;/*RTS/CTS, CTS-to-self*/
69 u16 rts_thresh;
70 u16 frag_thresh;
71 u8 preamble;/*long, short, auto*/
72 u8 scan_mode;/*active, passive*/
73 u8 adhoc_tx_pwr;
74 u8 soft_ap;
75 u8 smart_ps;
76 u8 power_mgnt;
77 u8 radio_enable;
78 u8 long_retry_lmt;
79 u8 short_retry_lmt;
80 u16 busy_thresh;
81 u8 ack_policy;
82 u8 mp_mode;
83 u8 software_encrypt;
84 u8 software_decrypt;
85 /* UAPSD */
86 u8 wmm_enable;
87 u8 uapsd_enable;
88 u8 uapsd_max_sp;
89 u8 uapsd_acbk_en;
90 u8 uapsd_acbe_en;
91 u8 uapsd_acvi_en;
92 u8 uapsd_acvo_en;
93
94 struct wlan_bssid_ex dev_network;
95
96 u8 ht_enable;
97 u8 cbw40_enable;
98 u8 ampdu_enable;/*for tx*/
99 u8 rf_config ;
100 u8 low_power ;
101};
102
103/* For registry parameters */
104#define RGTRY_OFT(field) ((addr_t)FIELD_OFFSET(struct registry_priv, field))
105#define RGTRY_SZ(field) sizeof(((struct registry_priv *)0)->field)
106#define BSSID_OFT(field) ((addr_t)FIELD_OFFSET(struct ndis_wlan_bssid_ex, \
107 field))
108#define BSSID_SZ(field) sizeof(((struct ndis_wlan_bssid_ex *)0)->field)
109
110struct dvobj_priv {
111 struct _adapter *padapter;
112 u32 nr_endpoint;
113 u8 ishighspeed;
114 uint(*inirp_init)(struct _adapter *adapter);
115 uint(*inirp_deinit)(struct _adapter *adapter);
116 struct semaphore usb_suspend_sema;
117 struct usb_device *pusbdev;
118};
119
120struct _adapter {
121 struct dvobj_priv dvobjpriv;
122 struct mlme_priv mlmepriv;
123 struct cmd_priv cmdpriv;
124 struct evt_priv evtpriv;
125 struct io_queue *pio_queue;
126 struct xmit_priv xmitpriv;
127 struct recv_priv recvpriv;
128 struct sta_priv stapriv;
129 struct security_priv securitypriv;
130 struct registry_priv registrypriv;
131 struct wlan_acl_pool acl_list;
132 struct pwrctrl_priv pwrctrlpriv;
133 struct eeprom_priv eeprompriv;
134 struct hal_priv halpriv;
135 struct led_priv ledpriv;
136 struct mp_priv mppriv;
137 s32 bDriverStopped;
138 s32 bSurpriseRemoved;
139 u32 IsrContent;
140 u32 ImrContent;
141 u8 EepromAddressSize;
142 u8 hw_init_completed;
143 struct task_struct *cmdThread;
144 pid_t evtThread;
145 struct task_struct *xmitThread;
146 pid_t recvThread;
147 uint(*dvobj_init)(struct _adapter *adapter);
148 void (*dvobj_deinit)(struct _adapter *adapter);
149 struct net_device *pnetdev;
150 int bup;
151 struct net_device_stats stats;
152 struct iw_statistics iwstats;
153 int pid; /*process id from UI*/
154};
155
156static inline u8 *myid(struct eeprom_priv *peepriv)
157{
158 return peepriv->mac_addr;
159}
160
161u8 r8712_usb_hal_bus_init(struct _adapter *adapter);
162
163#endif /*__DRV_TYPES_H__*/
164
diff --git a/drivers/staging/rtl8712/ethernet.h b/drivers/staging/rtl8712/ethernet.h
new file mode 100644
index 00000000000..ba8d777d8e1
--- /dev/null
+++ b/drivers/staging/rtl8712/ethernet.h
@@ -0,0 +1,23 @@
1#ifndef __INC_ETHERNET_H
2#define __INC_ETHERNET_H
3
4#define ETHERNET_ADDRESS_LENGTH 6 /*!< Ethernet Address Length*/
5#define ETHERNET_HEADER_SIZE 14 /*!< Ethernet Header Length*/
6#define LLC_HEADER_SIZE 6 /*!< LLC Header Length*/
7#define TYPE_LENGTH_FIELD_SIZE 2 /*!< Type/Length Size*/
8#define MINIMUM_ETHERNET_PACKET_SIZE 60 /*!< Min Ethernet Packet Size*/
9#define MAXIMUM_ETHERNET_PACKET_SIZE 1514 /*!< Max Ethernet Packet Size*/
10
11/*!< Is Multicast Address? */
12#define RT_ETH_IS_MULTICAST(_pAddr) ((((u8 *)(_pAddr))[0]&0x01) != 0)
13/*!< Is Broadcast Address? */
14#define RT_ETH_IS_BROADCAST(_pAddr) ( \
15 ((u8 *)(_pAddr))[0] == 0xff && \
16 ((u8 *)(_pAddr))[1] == 0xff && \
17 ((u8 *)(_pAddr))[2] == 0xff && \
18 ((u8 *)(_pAddr))[3] == 0xff && \
19 ((u8 *)(_pAddr))[4] == 0xff && \
20 ((u8 *)(_pAddr))[5] == 0xff)
21
22#endif /* #ifndef __INC_ETHERNET_H */
23
diff --git a/drivers/staging/rtl8712/farray.h b/drivers/staging/rtl8712/farray.h
new file mode 100644
index 00000000000..92177726970
--- /dev/null
+++ b/drivers/staging/rtl8712/farray.h
@@ -0,0 +1,10197 @@
1/* Firmware */
2static const unsigned char f_array[122328] = {
30x12, 0x87, 0xEC, 0x11, 0x30, 0x00, 0x00, 0x00, 0x08, 0xE8, 0x00, 0x00,
40x50, 0xF5, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x98, 0xF3, 0x00, 0x00,
50xF2, 0x00, 0x00, 0x00, 0x05, 0x30, 0x16, 0x53, 0x87, 0x12, 0x12, 0x01,
60x00, 0x00, 0x12, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
70x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01,
80x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01,
90x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x10,
100x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
210x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310x25, 0xB0, 0x1A, 0x3C, 0x80, 0x03, 0x5A, 0x37, 0x00, 0x80, 0x1B, 0x3C,
320x80, 0x00, 0x7B, 0x37, 0x00, 0x00, 0x5B, 0xAF, 0x25, 0xB0, 0x1A, 0x3C,
330x18, 0x03, 0x5A, 0x37, 0x00, 0x80, 0x1B, 0x3C, 0x80, 0x00, 0x7B, 0x37,
340x00, 0x00, 0x5B, 0xAF, 0x01, 0x80, 0x1A, 0x3C, 0x24, 0xE2, 0x5A, 0x27,
350x08, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
440x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
510x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
520x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xA1, 0xAF, 0x08, 0x00, 0xA2, 0xAF,
530x0C, 0x00, 0xA3, 0xAF, 0x10, 0x00, 0xA4, 0xAF, 0x14, 0x00, 0xA5, 0xAF,
540x18, 0x00, 0xA6, 0xAF, 0x1C, 0x00, 0xA7, 0xAF, 0x20, 0x00, 0xA8, 0xAF,
550x24, 0x00, 0xA9, 0xAF, 0x28, 0x00, 0xAA, 0xAF, 0x2C, 0x00, 0xAB, 0xAF,
560x30, 0x00, 0xAC, 0xAF, 0x34, 0x00, 0xAD, 0xAF, 0x38, 0x00, 0xAE, 0xAF,
570x3C, 0x00, 0xAF, 0xAF, 0x12, 0x40, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00,
580x00, 0x70, 0x0A, 0x40, 0x40, 0x00, 0xB0, 0xAF, 0x44, 0x00, 0xB1, 0xAF,
590x48, 0x00, 0xB2, 0xAF, 0x4C, 0x00, 0xB3, 0xAF, 0x50, 0x00, 0xB4, 0xAF,
600x54, 0x00, 0xB5, 0xAF, 0x58, 0x00, 0xB6, 0xAF, 0x5C, 0x00, 0xB7, 0xAF,
610x60, 0x00, 0xB8, 0xAF, 0x64, 0x00, 0xB9, 0xAF, 0x68, 0x00, 0xBC, 0xAF,
620x6C, 0x00, 0xBD, 0xAF, 0x70, 0x00, 0xBE, 0xAF, 0x74, 0x00, 0xBF, 0xAF,
630x78, 0x00, 0xA8, 0xAF, 0x7C, 0x00, 0xA9, 0xAF, 0x80, 0x00, 0xAA, 0xAF,
640x17, 0x38, 0x00, 0x08, 0x21, 0x20, 0xA0, 0x03, 0x00, 0x00, 0x00, 0x00,
650x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
670x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
690x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
710x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
720x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xBD, 0x27,
740x14, 0x00, 0xB1, 0xAF, 0x00, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x11, 0x3C,
750x18, 0x03, 0x23, 0x36, 0x00, 0x03, 0x42, 0x24, 0x00, 0x00, 0x62, 0xAC,
760x18, 0x00, 0xB2, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x1C, 0x00, 0xBF, 0xAF,
770x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x42, 0xB0, 0x02, 0x3C,
780x03, 0x00, 0x47, 0x34, 0x00, 0x00, 0xE3, 0x90, 0x02, 0x80, 0x0A, 0x3C,
790x02, 0x80, 0x0B, 0x3C, 0xFF, 0x00, 0x70, 0x30, 0x00, 0x36, 0x10, 0x00,
800x10, 0x00, 0x02, 0x32, 0x03, 0x36, 0x06, 0x00, 0x17, 0x00, 0x40, 0x10,
810x02, 0x80, 0x12, 0x3C, 0xFC, 0x5C, 0x42, 0x8D, 0x60, 0x1B, 0x44, 0x26,
820x64, 0x37, 0x83, 0x94, 0x01, 0x00, 0x45, 0x24, 0x10, 0x00, 0x02, 0x24,
830xB0, 0x03, 0x29, 0x36, 0x1C, 0x03, 0x28, 0x36, 0x00, 0x00, 0xE2, 0xA0,
840x07, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x68, 0x37, 0x82, 0x94,
850x64, 0x37, 0x80, 0xA4, 0x68, 0x37, 0x80, 0xA4, 0x00, 0x00, 0x03, 0x24,
860x00, 0x00, 0x02, 0xAD, 0x00, 0x00, 0x20, 0xAD, 0x10, 0x5E, 0x62, 0x8D,
870x01, 0x00, 0x63, 0x24, 0xFC, 0x5C, 0x45, 0xAD, 0x01, 0x00, 0x42, 0x24,
880x10, 0x5E, 0x62, 0xAD, 0x64, 0x37, 0x83, 0xA4, 0x29, 0x00, 0xC0, 0x04,
890x42, 0xB0, 0x02, 0x3C, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
900x40, 0x00, 0x02, 0x32, 0x0F, 0x00, 0x40, 0x14, 0x60, 0x1B, 0x44, 0x26,
910xE0, 0x1B, 0x83, 0x94, 0xDC, 0x1B, 0x85, 0x94, 0x1C, 0x00, 0xBF, 0x8F,
920x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
930x80, 0x00, 0x63, 0x30, 0x41, 0xB0, 0x02, 0x3C, 0x25, 0x18, 0x65, 0x00,
940x08, 0x00, 0x42, 0x34, 0x20, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x43, 0xA4,
950x08, 0x00, 0xE0, 0x03, 0xDC, 0x1B, 0x83, 0xA4, 0x42, 0xB0, 0x02, 0x3C,
960x40, 0x00, 0x03, 0x24, 0x03, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA0,
970x25, 0x62, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x44, 0x26,
980xE0, 0x1B, 0x83, 0x94, 0xDC, 0x1B, 0x85, 0x94, 0x1C, 0x00, 0xBF, 0x8F,
990x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
1000x80, 0x00, 0x63, 0x30, 0x41, 0xB0, 0x02, 0x3C, 0x25, 0x18, 0x65, 0x00,
1010x08, 0x00, 0x42, 0x34, 0x20, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x43, 0xA4,
1020x08, 0x00, 0xE0, 0x03, 0xDC, 0x1B, 0x83, 0xA4, 0x80, 0xFF, 0x03, 0x24,
1030x03, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA0, 0x44, 0x22, 0x00, 0x74,
1040x00, 0x00, 0x00, 0x00, 0xEF, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
1050xFF, 0x00, 0x84, 0x30, 0x0B, 0x00, 0x82, 0x2C, 0xFF, 0xFF, 0xE7, 0x30,
1060x10, 0x00, 0xA8, 0x93, 0x19, 0x00, 0x40, 0x10, 0x21, 0x18, 0x00, 0x00,
1070x02, 0x80, 0x03, 0x3C, 0x80, 0x10, 0x04, 0x00, 0x88, 0xE6, 0x63, 0x24,
1080x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x00, 0x00,
1090x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xB0, 0x02, 0x3C,
1100x78, 0x00, 0x44, 0x34, 0x07, 0x00, 0xE2, 0x30, 0x00, 0x00, 0x85, 0xAC,
1110x04, 0x00, 0x86, 0xAC, 0x04, 0x00, 0x40, 0x18, 0x00, 0x00, 0x00, 0x00,
1120xF8, 0xFF, 0xE2, 0x30, 0x08, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x47, 0x30,
1130x21, 0x10, 0xE8, 0x00, 0x00, 0x80, 0x03, 0x3C, 0x08, 0x00, 0x82, 0xAC,
1140x25, 0x10, 0x43, 0x00, 0x08, 0x00, 0x82, 0xAC, 0x01, 0x00, 0x03, 0x24,
1150x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00, 0x43, 0xB0, 0x02, 0x3C,
1160x2E, 0x01, 0x00, 0x08, 0x6C, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1170x2E, 0x01, 0x00, 0x08, 0x60, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1180x2E, 0x01, 0x00, 0x08, 0x54, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1190x2E, 0x01, 0x00, 0x08, 0x48, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1200x2E, 0x01, 0x00, 0x08, 0x3C, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1210x2E, 0x01, 0x00, 0x08, 0x30, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1220x2E, 0x01, 0x00, 0x08, 0x24, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1230x2E, 0x01, 0x00, 0x08, 0x18, 0x00, 0x44, 0x34, 0x43, 0xB0, 0x02, 0x3C,
1240x2E, 0x01, 0x00, 0x08, 0x0C, 0x00, 0x44, 0x34, 0x2E, 0x01, 0x00, 0x08,
1250x43, 0xB0, 0x04, 0x3C, 0x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
1260x18, 0x03, 0x42, 0x34, 0x6C, 0x05, 0x63, 0x24, 0x00, 0x00, 0x43, 0xAC,
1270x01, 0x00, 0x05, 0x24, 0x43, 0xB0, 0x02, 0x3C, 0x04, 0x28, 0x85, 0x00,
1280x88, 0x00, 0x44, 0x34, 0x21, 0x10, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24,
1290xFF, 0xFF, 0x42, 0x30, 0x05, 0x00, 0x43, 0x2C, 0xFD, 0xFF, 0x60, 0x14,
1300x01, 0x00, 0x42, 0x24, 0x00, 0x00, 0x82, 0x94, 0x00, 0x00, 0x00, 0x00,
1310xFF, 0xFF, 0x42, 0x30, 0x24, 0x10, 0x45, 0x00, 0xF5, 0xFF, 0x40, 0x1C,
1320x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
1330x25, 0xB0, 0x08, 0x3C, 0x00, 0x80, 0x02, 0x3C, 0xC8, 0xFF, 0xBD, 0x27,
1340x18, 0x03, 0x03, 0x35, 0xC8, 0x05, 0x42, 0x24, 0x00, 0x00, 0x62, 0xAC,
1350x30, 0x00, 0xB6, 0xAF, 0x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF,
1360x1C, 0x00, 0xB1, 0xAF, 0x34, 0x00, 0xBF, 0xAF, 0x2C, 0x00, 0xB5, 0xAF,
1370x20, 0x00, 0xB2, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x0C, 0x00, 0xF2, 0x84,
1380x08, 0x00, 0xF5, 0x8C, 0xFF, 0x00, 0xC6, 0x30, 0x00, 0x01, 0x02, 0x24,
1390x23, 0x10, 0x46, 0x00, 0xFF, 0xFF, 0x51, 0x30, 0xD0, 0x03, 0x08, 0x35,
1400xFF, 0x00, 0x96, 0x30, 0x00, 0x00, 0x12, 0xAD, 0x21, 0xA0, 0xA0, 0x00,
1410x21, 0x30, 0xC5, 0x00, 0x00, 0x00, 0x15, 0xAD, 0x21, 0x20, 0xC0, 0x02,
1420x21, 0x28, 0xA0, 0x02, 0x21, 0x38, 0x20, 0x02, 0x1E, 0x01, 0x00, 0x0C,
1430x10, 0x00, 0xA0, 0xAF, 0x23, 0x18, 0x51, 0x02, 0xFF, 0xFF, 0x82, 0x32,
1440x00, 0x94, 0x03, 0x00, 0x03, 0x94, 0x12, 0x00, 0xB4, 0x01, 0x00, 0x08,
1450x02, 0x9A, 0x02, 0x00, 0x28, 0xB0, 0x03, 0x3C, 0xC0, 0x10, 0x13, 0x00,
1460x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x90, 0x25, 0xB0, 0x10, 0x3C,
1470x20, 0x10, 0x02, 0x3C, 0xFF, 0x00, 0x93, 0x30, 0x00, 0x22, 0x13, 0x00,
1480xFF, 0xFF, 0x43, 0x32, 0x01, 0x01, 0x45, 0x2A, 0x21, 0xA0, 0x82, 0x00,
1490x21, 0xA8, 0xB1, 0x02, 0xD0, 0x03, 0x02, 0x36, 0x00, 0x01, 0x11, 0x24,
1500x0B, 0x88, 0x65, 0x00, 0x21, 0x20, 0xC0, 0x02, 0x00, 0x00, 0x53, 0xAC,
1510x5B, 0x01, 0x00, 0x0C, 0xB0, 0x03, 0x10, 0x36, 0x21, 0x30, 0x80, 0x02,
1520x21, 0x20, 0xC0, 0x02, 0x21, 0x28, 0xA0, 0x02, 0x21, 0x38, 0x20, 0x02,
1530x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0x23, 0x18, 0x51, 0x02,
1540x00, 0x94, 0x03, 0x00, 0x03, 0x94, 0x12, 0x00, 0x00, 0x00, 0x12, 0xAE,
1550xE2, 0xFF, 0x40, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xBF, 0x8F,
1560x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
1570x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
1580x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27,
1590x21, 0x50, 0x80, 0x00, 0x04, 0x00, 0x8D, 0x8C, 0x0C, 0x00, 0x4B, 0x8D,
1600x08, 0x00, 0x84, 0x8C, 0xFF, 0xE0, 0x02, 0x3C, 0x10, 0x00, 0x47, 0x8D,
1610xFF, 0xFF, 0x42, 0x34, 0x1F, 0x00, 0xA9, 0x31, 0x24, 0x20, 0x82, 0x00,
1620x00, 0x1E, 0x09, 0x00, 0x02, 0x14, 0x0B, 0x00, 0x25, 0x40, 0x83, 0x00,
1630x21, 0x78, 0xA0, 0x00, 0xB7, 0x00, 0xE0, 0x04, 0x07, 0x00, 0x44, 0x30,
1640x00, 0x00, 0x42, 0x95, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0F, 0x42, 0x28,
1650xB9, 0x00, 0x40, 0x10, 0xFF, 0xDF, 0x02, 0x3C, 0x02, 0x80, 0x0E, 0x3C,
1660x08, 0x00, 0x48, 0xAD, 0x60, 0x1B, 0xC3, 0x25, 0xC6, 0x3D, 0x62, 0x90,
1670x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x40, 0x14, 0xC0, 0x30, 0x09, 0x00,
1680xC6, 0x40, 0x62, 0x90, 0xFF, 0xDF, 0x03, 0x3C, 0xFF, 0xFF, 0x63, 0x34,
1690x07, 0x10, 0x82, 0x00, 0x01, 0x00, 0x42, 0x30, 0x24, 0x18, 0x03, 0x01,
1700x40, 0x17, 0x02, 0x00, 0x25, 0x40, 0x62, 0x00, 0x08, 0x00, 0x48, 0xAD,
1710xC0, 0x30, 0x09, 0x00, 0x21, 0x10, 0xC9, 0x00, 0x80, 0x10, 0x02, 0x00,
1720x21, 0x10, 0x49, 0x00, 0x80, 0x10, 0x02, 0x00, 0x60, 0x1B, 0xC9, 0x25,
1730x21, 0x28, 0x49, 0x00, 0x08, 0x25, 0xA3, 0x8C, 0x01, 0x00, 0x0C, 0x24,
1740x02, 0x13, 0x03, 0x00, 0x01, 0x00, 0x42, 0x30, 0xB5, 0x00, 0x4C, 0x10,
1750x42, 0x18, 0x03, 0x00, 0x82, 0x11, 0x08, 0x00, 0x01, 0x00, 0x42, 0x30,
1760x06, 0x00, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0xC0, 0xFF, 0x02, 0x24,
1770x24, 0x10, 0x02, 0x01, 0x04, 0x00, 0x48, 0x34, 0x08, 0x00, 0x48, 0xAD,
1780x02, 0x80, 0x02, 0x3C, 0xD1, 0x5C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
1790x6A, 0x00, 0x60, 0x14, 0x21, 0x20, 0xC9, 0x00, 0xD4, 0x23, 0x83, 0x8C,
1800xBF, 0xFF, 0x02, 0x24, 0x24, 0x10, 0xE2, 0x00, 0x40, 0x00, 0x63, 0x30,
1810x25, 0x38, 0x43, 0x00, 0x10, 0x00, 0x47, 0xAD, 0xD4, 0x23, 0x83, 0x8C,
1820x7F, 0xF8, 0x02, 0x24, 0x24, 0x10, 0xE2, 0x00, 0x80, 0x07, 0x63, 0x30,
1830x25, 0x38, 0x43, 0x00, 0x10, 0x00, 0x47, 0xAD, 0xC6, 0x3D, 0x22, 0x91,
1840x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x40, 0x14, 0x42, 0x17, 0x08, 0x00,
1850x01, 0x00, 0x44, 0x30, 0xB1, 0x00, 0x8C, 0x10, 0x02, 0x80, 0x02, 0x3C,
1860x60, 0x1B, 0xC4, 0x25, 0x21, 0x20, 0xC4, 0x00, 0xD4, 0x23, 0x83, 0x8C,
1870xFF, 0xF7, 0x02, 0x24, 0x24, 0x10, 0xE2, 0x00, 0x00, 0x08, 0x63, 0x30,
1880x25, 0x38, 0x43, 0x00, 0x10, 0x00, 0x47, 0xAD, 0xD4, 0x23, 0x83, 0x8C,
1890xFF, 0xEF, 0x02, 0x24, 0x24, 0x10, 0xE2, 0x00, 0x00, 0x10, 0x63, 0x30,
1900x25, 0x38, 0x43, 0x00, 0x10, 0x00, 0x47, 0xAD, 0x60, 0x1B, 0xC5, 0x25,
1910x21, 0x30, 0xC5, 0x00, 0xD4, 0x23, 0xC4, 0x8C, 0xFD, 0xFF, 0x02, 0x3C,
1920x02, 0x00, 0x03, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x83, 0x00,
1930x24, 0x10, 0xE2, 0x00, 0x25, 0x38, 0x44, 0x00, 0x10, 0x00, 0x47, 0xAD,
1940xB0, 0x1B, 0xA3, 0x94, 0xFB, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
1950xC2, 0x1B, 0x03, 0x00, 0x24, 0x10, 0xE2, 0x00, 0x80, 0x1C, 0x03, 0x00,
1960x25, 0x38, 0x43, 0x00, 0x10, 0x00, 0x47, 0xAD, 0x3B, 0x41, 0xA3, 0x90,
1970xE7, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0x03, 0x00, 0x63, 0x30,
1980x24, 0x10, 0xE2, 0x00, 0xC0, 0x1C, 0x03, 0x00, 0x25, 0x38, 0x43, 0x00,
1990x10, 0x00, 0x47, 0xAD, 0xD4, 0x23, 0xC4, 0x8C, 0xFF, 0xFD, 0x02, 0x3C,
2000x00, 0x02, 0x03, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x83, 0x00,
2010x24, 0x10, 0xE2, 0x00, 0x25, 0x38, 0x44, 0x00, 0x10, 0x00, 0x47, 0xAD,
2020xB0, 0x1B, 0xA3, 0x94, 0xFF, 0xFB, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
2030xC2, 0x1B, 0x03, 0x00, 0x24, 0x10, 0xE2, 0x00, 0x80, 0x1E, 0x03, 0x00,
2040x25, 0x38, 0x43, 0x00, 0x10, 0x00, 0x47, 0xAD, 0x3B, 0x41, 0xA3, 0x90,
2050xFF, 0xE7, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0x03, 0x00, 0x63, 0x30,
2060x24, 0x10, 0xE2, 0x00, 0xC0, 0x1E, 0x03, 0x00, 0x25, 0x38, 0x43, 0x00,
2070x10, 0x00, 0x47, 0xAD, 0xD4, 0x23, 0xC3, 0x8C, 0xC0, 0xFF, 0x02, 0x24,
2080x24, 0x10, 0xE2, 0x00, 0x3F, 0x00, 0x63, 0x30, 0x25, 0x10, 0x43, 0x00,
2090x10, 0x00, 0x42, 0xAD, 0xD8, 0x23, 0xC4, 0x8C, 0x14, 0x00, 0x43, 0x8D,
2100xFF, 0xFF, 0x02, 0x3C, 0xFF, 0x7F, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00,
2110x00, 0x80, 0x84, 0x30, 0x25, 0x18, 0x64, 0x00, 0x14, 0x00, 0x43, 0xAD,
2120xDA, 0x23, 0xC4, 0x94, 0xE0, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
2130x1F, 0x00, 0x84, 0x30, 0x24, 0x18, 0x62, 0x00, 0x00, 0x24, 0x04, 0x00,
2140x25, 0x18, 0x64, 0x00, 0x14, 0x00, 0x43, 0xAD, 0x02, 0x00, 0x43, 0x91,
2150x02, 0x14, 0x0D, 0x00, 0x01, 0x00, 0x42, 0x30, 0x27, 0x00, 0x40, 0x10,
2160x21, 0x30, 0x6F, 0x00, 0x60, 0x1B, 0xC4, 0x25, 0xE4, 0x1D, 0x85, 0x94,
2170x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA2, 0x24, 0xE4, 0x1D, 0x82, 0xA4,
2180x0C, 0x00, 0x43, 0x8D, 0x00, 0xF0, 0x02, 0x3C, 0xFF, 0x0F, 0xA5, 0x30,
2190xFF, 0xFF, 0x42, 0x34, 0x00, 0x24, 0x05, 0x00, 0x24, 0x18, 0x62, 0x00,
2200x25, 0x58, 0x83, 0x00, 0x0C, 0x00, 0x4B, 0xAD, 0x16, 0x00, 0xC2, 0x94,
2210x00, 0x19, 0x05, 0x00, 0x60, 0x1B, 0xC4, 0x25, 0x0F, 0x00, 0x42, 0x30,
2220x25, 0x10, 0x43, 0x00, 0x16, 0x00, 0xC2, 0xA4, 0x00, 0x00, 0x43, 0x95,
2230x40, 0x41, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x43, 0x00,
2240x08, 0x00, 0xE0, 0x03, 0x40, 0x41, 0x82, 0xAC, 0x14, 0x00, 0x42, 0x8D,
2250x00, 0x00, 0x00, 0x00, 0x42, 0x12, 0x02, 0x00, 0x3F, 0x00, 0x42, 0x30,
2260x0C, 0x00, 0x42, 0x28, 0x44, 0xFF, 0x40, 0x10, 0xFF, 0xDF, 0x02, 0x3C,
2270xFF, 0xFF, 0x42, 0x34, 0x24, 0x40, 0x02, 0x01, 0x00, 0x40, 0x03, 0x3C,
2280x25, 0x40, 0x03, 0x01, 0xE3, 0x01, 0x00, 0x08, 0x02, 0x80, 0x0E, 0x3C,
2290x60, 0x1B, 0xC3, 0x25, 0xC6, 0x3D, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
2300x1D, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x13, 0x0B, 0x00,
2310x0E, 0x00, 0x42, 0x30, 0x21, 0x10, 0x43, 0x00, 0xD4, 0x1D, 0x45, 0x94,
2320x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA3, 0x24, 0xD4, 0x1D, 0x43, 0xA4,
2330x0C, 0x00, 0x44, 0x8D, 0x00, 0xF0, 0x02, 0x3C, 0xFF, 0x0F, 0xA5, 0x30,
2340xFF, 0xFF, 0x42, 0x34, 0x00, 0x1C, 0x05, 0x00, 0x77, 0x02, 0x00, 0x08,
2350x24, 0x20, 0x82, 0x00, 0x7F, 0xFF, 0x02, 0x24, 0x24, 0x10, 0x02, 0x01,
2360x80, 0x00, 0x63, 0x30, 0x25, 0x40, 0x43, 0x00, 0x08, 0x00, 0x48, 0xAD,
2370x08, 0x25, 0xA3, 0x8C, 0xFF, 0xFF, 0x02, 0x3C, 0xFF, 0x1F, 0x42, 0x34,
2380x07, 0x00, 0x63, 0x30, 0x24, 0x10, 0xE2, 0x00, 0x40, 0x1B, 0x03, 0x00,
2390x25, 0x38, 0x43, 0x00, 0xF1, 0x01, 0x00, 0x08, 0x10, 0x00, 0x47, 0xAD,
2400x02, 0x14, 0x0B, 0x00, 0xFF, 0x0F, 0x45, 0x30, 0x16, 0x00, 0xC2, 0x94,
2410x00, 0x19, 0x05, 0x00, 0x60, 0x1B, 0xC4, 0x25, 0x0F, 0x00, 0x42, 0x30,
2420x25, 0x10, 0x43, 0x00, 0x16, 0x00, 0xC2, 0xA4, 0x00, 0x00, 0x43, 0x95,
2430x40, 0x41, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x43, 0x00,
2440x08, 0x00, 0xE0, 0x03, 0x40, 0x41, 0x82, 0xAC, 0xCE, 0x5C, 0x43, 0x90,
2450x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0x64, 0x14, 0x60, 0x1B, 0xC4, 0x25,
2460x3C, 0x41, 0x22, 0x91, 0xFF, 0xF7, 0x03, 0x24, 0x24, 0x18, 0xE3, 0x00,
2470x01, 0x00, 0x42, 0x30, 0xC0, 0x12, 0x02, 0x00, 0x25, 0x38, 0x62, 0x00,
2480x10, 0x00, 0x47, 0xAD, 0x3D, 0x41, 0x22, 0x91, 0xFF, 0xEF, 0x03, 0x24,
2490x24, 0x18, 0xE3, 0x00, 0x01, 0x00, 0x42, 0x30, 0x00, 0x13, 0x02, 0x00,
2500x25, 0x38, 0x43, 0x00, 0x1F, 0x02, 0x00, 0x08, 0x10, 0x00, 0x47, 0xAD,
2510xD8, 0xFF, 0xBD, 0x27, 0x20, 0x00, 0xB2, 0xAF, 0x18, 0x00, 0xB0, 0xAF,
2520x24, 0x00, 0xBF, 0xAF, 0x1C, 0x00, 0xB1, 0xAF, 0x04, 0x00, 0x8B, 0x8C,
2530x21, 0x80, 0x80, 0x00, 0x08, 0x00, 0x84, 0x8C, 0x0E, 0x00, 0x07, 0x96,
2540xFF, 0xE0, 0x02, 0x3C, 0x10, 0x00, 0x08, 0x8E, 0x1F, 0x00, 0x6A, 0x31,
2550xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x82, 0x00, 0x00, 0x1E, 0x0A, 0x00,
2560x25, 0x48, 0x83, 0x00, 0x21, 0x90, 0xA0, 0x00, 0x21, 0x60, 0xC0, 0x00,
2570xCF, 0x00, 0x00, 0x05, 0x07, 0x00, 0xE7, 0x30, 0x00, 0x00, 0x02, 0x96,
2580x00, 0x00, 0x00, 0x00, 0xFD, 0x0F, 0x42, 0x28, 0xD1, 0x00, 0x40, 0x10,
2590xFF, 0xDF, 0x02, 0x3C, 0x02, 0x80, 0x11, 0x3C, 0x08, 0x00, 0x09, 0xAE,
2600x60, 0x1B, 0x23, 0x26, 0xC6, 0x3D, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
2610x0A, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x40, 0x62, 0x90,
2620xFF, 0xDF, 0x03, 0x3C, 0xFF, 0xFF, 0x63, 0x34, 0x07, 0x10, 0xE2, 0x00,
2630x01, 0x00, 0x42, 0x30, 0x24, 0x18, 0x23, 0x01, 0x40, 0x17, 0x02, 0x00,
2640x25, 0x48, 0x62, 0x00, 0x08, 0x00, 0x09, 0xAE, 0x1C, 0x00, 0x02, 0x8E,
2650x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x40, 0x04, 0x04, 0x00, 0x03, 0x24,
2660xC0, 0x30, 0x0A, 0x00, 0x21, 0x10, 0xCA, 0x00, 0x80, 0x10, 0x02, 0x00,
2670x21, 0x10, 0x4A, 0x00, 0x80, 0x10, 0x02, 0x00, 0x60, 0x1B, 0x27, 0x26,
2680x21, 0x28, 0x47, 0x00, 0x08, 0x25, 0xA3, 0x8C, 0x01, 0x00, 0x0A, 0x24,
2690x02, 0x13, 0x03, 0x00, 0x01, 0x00, 0x42, 0x30, 0xE7, 0x00, 0x4A, 0x10,
2700x42, 0x18, 0x03, 0x00, 0x82, 0x11, 0x09, 0x00, 0x01, 0x00, 0x42, 0x30,
2710x06, 0x00, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0xC0, 0xFF, 0x02, 0x24,
2720x24, 0x10, 0x22, 0x01, 0x04, 0x00, 0x49, 0x34, 0x08, 0x00, 0x09, 0xAE,
2730x02, 0x80, 0x02, 0x3C, 0xD1, 0x5C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
2740x6C, 0x00, 0x60, 0x14, 0x21, 0x28, 0xC7, 0x00, 0xD4, 0x23, 0xA4, 0x8C,
2750x10, 0x00, 0x02, 0x8E, 0xBF, 0xFF, 0x03, 0x24, 0x40, 0x00, 0x84, 0x30,
2760x24, 0x10, 0x43, 0x00, 0x25, 0x40, 0x44, 0x00, 0x10, 0x00, 0x08, 0xAE,
2770xD4, 0x23, 0xA3, 0x8C, 0x7F, 0xF8, 0x02, 0x24, 0x24, 0x10, 0x02, 0x01,
2780x80, 0x07, 0x63, 0x30, 0x25, 0x40, 0x43, 0x00, 0x10, 0x00, 0x08, 0xAE,
2790xC6, 0x3D, 0xE2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x40, 0x14,
2800x60, 0x1B, 0x25, 0x26, 0x42, 0x17, 0x09, 0x00, 0x01, 0x00, 0x44, 0x30,
2810x08, 0x01, 0x8A, 0x10, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x24, 0x26,
2820x21, 0x20, 0xC4, 0x00, 0xD4, 0x23, 0x83, 0x8C, 0xFF, 0xF7, 0x02, 0x24,
2830x24, 0x10, 0x02, 0x01, 0x00, 0x08, 0x63, 0x30, 0x25, 0x40, 0x43, 0x00,
2840x10, 0x00, 0x08, 0xAE, 0xD4, 0x23, 0x83, 0x8C, 0xFF, 0xEF, 0x02, 0x24,
2850x24, 0x10, 0x02, 0x01, 0x00, 0x10, 0x63, 0x30, 0x25, 0x40, 0x43, 0x00,
2860x10, 0x00, 0x08, 0xAE, 0x60, 0x1B, 0x25, 0x26, 0x21, 0x30, 0xC5, 0x00,
2870xD4, 0x23, 0xC4, 0x8C, 0xFD, 0xFF, 0x02, 0x3C, 0x02, 0x00, 0x03, 0x3C,
2880xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x83, 0x00, 0x24, 0x10, 0x02, 0x01,
2890x25, 0x40, 0x44, 0x00, 0x10, 0x00, 0x08, 0xAE, 0xB0, 0x1B, 0xA3, 0x94,
2900xFB, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0xC2, 0x1B, 0x03, 0x00,
2910x24, 0x10, 0x02, 0x01, 0x80, 0x1C, 0x03, 0x00, 0x25, 0x40, 0x43, 0x00,
2920x10, 0x00, 0x08, 0xAE, 0x3B, 0x41, 0xA3, 0x90, 0xE7, 0xFF, 0x02, 0x3C,
2930xFF, 0xFF, 0x42, 0x34, 0x03, 0x00, 0x63, 0x30, 0x24, 0x10, 0x02, 0x01,
2940xC0, 0x1C, 0x03, 0x00, 0x25, 0x40, 0x43, 0x00, 0x10, 0x00, 0x08, 0xAE,
2950xD4, 0x23, 0xC4, 0x8C, 0xFF, 0xFD, 0x02, 0x3C, 0x00, 0x02, 0x03, 0x3C,
2960xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x83, 0x00, 0x24, 0x10, 0x02, 0x01,
2970x25, 0x40, 0x44, 0x00, 0x10, 0x00, 0x08, 0xAE, 0xB0, 0x1B, 0xA3, 0x94,
2980xFF, 0xFB, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0xC2, 0x1B, 0x03, 0x00,
2990x24, 0x10, 0x02, 0x01, 0x80, 0x1E, 0x03, 0x00, 0x25, 0x40, 0x43, 0x00,
3000x10, 0x00, 0x08, 0xAE, 0x3B, 0x41, 0xA3, 0x90, 0xFF, 0xE7, 0x02, 0x3C,
3010xFF, 0xFF, 0x42, 0x34, 0x03, 0x00, 0x63, 0x30, 0x24, 0x10, 0x02, 0x01,
3020xC0, 0x1E, 0x03, 0x00, 0x25, 0x40, 0x43, 0x00, 0x10, 0x00, 0x08, 0xAE,
3030xD4, 0x23, 0xC3, 0x8C, 0xC0, 0xFF, 0x02, 0x24, 0x24, 0x10, 0x02, 0x01,
3040x3F, 0x00, 0x63, 0x30, 0x25, 0x10, 0x43, 0x00, 0x10, 0x00, 0x02, 0xAE,
3050xD8, 0x23, 0xC4, 0x8C, 0x14, 0x00, 0x03, 0x8E, 0xFF, 0xFF, 0x02, 0x3C,
3060xFF, 0x7F, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00, 0x00, 0x80, 0x84, 0x30,
3070x25, 0x18, 0x64, 0x00, 0x14, 0x00, 0x03, 0xAE, 0xDA, 0x23, 0xC4, 0x94,
3080xE0, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0x1F, 0x00, 0x84, 0x30,
3090x24, 0x18, 0x62, 0x00, 0x00, 0x24, 0x04, 0x00, 0x25, 0x18, 0x64, 0x00,
3100x14, 0x00, 0x03, 0xAE, 0x02, 0x00, 0x02, 0x92, 0x02, 0x24, 0x0B, 0x00,
3110x02, 0x80, 0x03, 0x3C, 0x21, 0x10, 0x4C, 0x00, 0xFF, 0xFF, 0x42, 0x30,
3120x01, 0x00, 0x84, 0x30, 0x36, 0x00, 0x80, 0x10, 0x25, 0x30, 0x43, 0x00,
3130x60, 0x1B, 0x24, 0x26, 0xE4, 0x1D, 0x85, 0x94, 0x80, 0x00, 0x07, 0x24,
3140x01, 0x00, 0xA2, 0x24, 0xE4, 0x1D, 0x82, 0xA4, 0x0C, 0x00, 0x03, 0x8E,
3150x00, 0xF0, 0x02, 0x3C, 0xFF, 0x0F, 0xA5, 0x30, 0xFF, 0xFF, 0x42, 0x34,
3160x00, 0x24, 0x05, 0x00, 0x24, 0x18, 0x62, 0x00, 0x25, 0x18, 0x64, 0x00,
3170x0C, 0x00, 0x03, 0xAE, 0x16, 0x00, 0xC2, 0x94, 0x00, 0x19, 0x05, 0x00,
3180x02, 0x00, 0x04, 0x24, 0x0F, 0x00, 0x42, 0x30, 0x25, 0x10, 0x43, 0x00,
3190x16, 0x00, 0xC2, 0xA4, 0x21, 0x28, 0x80, 0x01, 0x21, 0x30, 0x40, 0x02,
3200x01, 0x00, 0x02, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF,
3210x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x52, 0xAC,
3220x5B, 0x01, 0x00, 0x0C, 0x02, 0x00, 0x04, 0x24, 0x60, 0x1B, 0x24, 0x26,
3230x00, 0x00, 0x03, 0x96, 0x40, 0x41, 0x82, 0x8C, 0x24, 0x00, 0xBF, 0x8F,
3240x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
3250x21, 0x10, 0x43, 0x00, 0x28, 0x00, 0xBD, 0x27, 0x08, 0x00, 0xE0, 0x03,
3260x40, 0x41, 0x82, 0xAC, 0x14, 0x00, 0x02, 0x8E, 0x00, 0x00, 0x00, 0x00,
3270x42, 0x12, 0x02, 0x00, 0x3F, 0x00, 0x42, 0x30, 0x0C, 0x00, 0x42, 0x28,
3280x2C, 0xFF, 0x40, 0x10, 0xFF, 0xDF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
3290x24, 0x48, 0x22, 0x01, 0x00, 0x40, 0x03, 0x3C, 0x25, 0x48, 0x23, 0x01,
3300xFC, 0x02, 0x00, 0x08, 0x02, 0x80, 0x11, 0x3C, 0x60, 0x1B, 0x23, 0x26,
3310xC6, 0x3D, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x40, 0x14,
3320x80, 0x00, 0x07, 0x24, 0x0E, 0x00, 0x02, 0x96, 0x00, 0x00, 0x00, 0x00,
3330x07, 0x00, 0x42, 0x30, 0x40, 0x10, 0x02, 0x00, 0x21, 0x10, 0x43, 0x00,
3340xD4, 0x1D, 0x45, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA3, 0x24,
3350xD4, 0x1D, 0x43, 0xA4, 0x0C, 0x00, 0x04, 0x8E, 0x00, 0xF0, 0x02, 0x3C,
3360xFF, 0x0F, 0xA5, 0x30, 0xFF, 0xFF, 0x42, 0x34, 0x00, 0x1C, 0x05, 0x00,
3370x24, 0x20, 0x82, 0x00, 0x25, 0x20, 0x83, 0x00, 0x0C, 0x00, 0x04, 0xAE,
3380x16, 0x00, 0xC2, 0x94, 0x00, 0x19, 0x05, 0x00, 0x02, 0x00, 0x04, 0x24,
3390x0F, 0x00, 0x42, 0x30, 0x25, 0x10, 0x43, 0x00, 0x16, 0x00, 0xC2, 0xA4,
3400x21, 0x28, 0x80, 0x01, 0x21, 0x30, 0x40, 0x02, 0x01, 0x00, 0x02, 0x24,
3410x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF, 0x25, 0xB0, 0x02, 0x3C,
3420xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x52, 0xAC, 0x5B, 0x01, 0x00, 0x0C,
3430x02, 0x00, 0x04, 0x24, 0x60, 0x1B, 0x24, 0x26, 0x00, 0x00, 0x03, 0x96,
3440x40, 0x41, 0x82, 0x8C, 0x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
3450x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x43, 0x00,
3460x28, 0x00, 0xBD, 0x27, 0x08, 0x00, 0xE0, 0x03, 0x40, 0x41, 0x82, 0xAC,
3470x7F, 0xFF, 0x02, 0x24, 0x24, 0x10, 0x22, 0x01, 0x80, 0x00, 0x63, 0x30,
3480x25, 0x48, 0x43, 0x00, 0x08, 0x00, 0x09, 0xAE, 0x08, 0x25, 0xA3, 0x8C,
3490x10, 0x00, 0x04, 0x8E, 0xFF, 0xFF, 0x02, 0x3C, 0x07, 0x00, 0x63, 0x30,
3500xFF, 0x1F, 0x42, 0x34, 0x24, 0x20, 0x82, 0x00, 0x40, 0x1B, 0x03, 0x00,
3510x25, 0x40, 0x83, 0x00, 0x0E, 0x03, 0x00, 0x08, 0x10, 0x00, 0x08, 0xAE,
3520x1E, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0x21, 0x30, 0x50, 0x00,
3530x00, 0x00, 0xC4, 0x90, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x82, 0x30,
3540x02, 0x29, 0x02, 0x00, 0x3F, 0x00, 0xA3, 0x10, 0x06, 0x00, 0x02, 0x24,
3550xF4, 0xFE, 0xA2, 0x14, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x02, 0x96,
3560x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0xC2, 0xA0, 0x1E, 0x00, 0x03, 0x92,
3570x1A, 0x00, 0x02, 0x96, 0x21, 0x18, 0x70, 0x00, 0x03, 0x12, 0x02, 0x00,
3580x38, 0x00, 0x62, 0xA0, 0x04, 0x00, 0x0B, 0x8E, 0x08, 0x00, 0x09, 0x8E,
3590x02, 0x03, 0x00, 0x08, 0xC0, 0x30, 0x0A, 0x00, 0x0E, 0x00, 0x02, 0x96,
3600x02, 0x00, 0x04, 0x24, 0xFF, 0x0F, 0x45, 0x30, 0x16, 0x00, 0xC2, 0x94,
3610x00, 0x19, 0x05, 0x00, 0x21, 0x28, 0x80, 0x01, 0x0F, 0x00, 0x42, 0x30,
3620x25, 0x10, 0x43, 0x00, 0x16, 0x00, 0xC2, 0xA4, 0x21, 0x30, 0x40, 0x02,
3630x01, 0x00, 0x02, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF,
3640x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x52, 0xAC,
3650x5B, 0x01, 0x00, 0x0C, 0x02, 0x00, 0x04, 0x24, 0x60, 0x1B, 0x24, 0x26,
3660x00, 0x00, 0x03, 0x96, 0x40, 0x41, 0x82, 0x8C, 0x24, 0x00, 0xBF, 0x8F,
3670x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
3680x21, 0x10, 0x43, 0x00, 0x28, 0x00, 0xBD, 0x27, 0x08, 0x00, 0xE0, 0x03,
3690x40, 0x41, 0x82, 0xAC, 0xCE, 0x5C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
3700xF7, 0xFE, 0x64, 0x14, 0x60, 0x1B, 0x24, 0x26, 0x3C, 0x41, 0xE2, 0x90,
3710xFF, 0xF7, 0x03, 0x24, 0x24, 0x18, 0x03, 0x01, 0x01, 0x00, 0x42, 0x30,
3720xC0, 0x12, 0x02, 0x00, 0x25, 0x40, 0x62, 0x00, 0x10, 0x00, 0x08, 0xAE,
3730x3D, 0x41, 0xE2, 0x90, 0xFF, 0xEF, 0x03, 0x24, 0x24, 0x18, 0x03, 0x01,
3740x01, 0x00, 0x42, 0x30, 0x00, 0x13, 0x02, 0x00, 0x25, 0x40, 0x43, 0x00,
3750x3E, 0x03, 0x00, 0x08, 0x10, 0x00, 0x08, 0xAE, 0x1A, 0x00, 0x05, 0x96,
3760x0F, 0x00, 0x84, 0x30, 0x80, 0x20, 0x04, 0x00, 0x21, 0x18, 0xC4, 0x00,
3770x11, 0x00, 0x65, 0xA0, 0x1E, 0x00, 0x02, 0x92, 0x1A, 0x00, 0x03, 0x96,
3780x21, 0x10, 0x50, 0x00, 0x21, 0x10, 0x44, 0x00, 0x03, 0x1A, 0x03, 0x00,
3790x10, 0x00, 0x43, 0xA0, 0x04, 0x00, 0x0B, 0x8E, 0x08, 0x00, 0x09, 0x8E,
3800x02, 0x03, 0x00, 0x08, 0xC0, 0x30, 0x0A, 0x00, 0x00, 0x80, 0x03, 0x3C,
3810x25, 0xB0, 0x02, 0x3C, 0x64, 0x11, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34,
3820x00, 0x00, 0x43, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
3830xC0, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x2C, 0x00, 0xB5, 0xAF,
3840x25, 0xB0, 0x03, 0x3C, 0x60, 0x1B, 0x55, 0x24, 0x00, 0x80, 0x02, 0x3C,
3850x38, 0x00, 0xBE, 0xAF, 0x80, 0x11, 0x42, 0x24, 0xB0, 0x03, 0x7E, 0x34,
3860x18, 0x03, 0x63, 0x34, 0x00, 0x00, 0x62, 0xAC, 0x3C, 0x00, 0xBF, 0xAF,
3870x34, 0x00, 0xB7, 0xAF, 0x30, 0x00, 0xB6, 0xAF, 0x28, 0x00, 0xB4, 0xAF,
3880x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
3890x96, 0x40, 0x00, 0x0C, 0x18, 0x00, 0xB0, 0xAF, 0x8E, 0x04, 0x00, 0x08,
3900x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0xAE, 0x08, 0x38, 0x46, 0x8E,
3910x21, 0x28, 0x60, 0x02, 0x80, 0x00, 0x07, 0x24, 0x01, 0x00, 0x04, 0x24,
3920x01, 0x00, 0x14, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xB4, 0xAF,
3930x08, 0x38, 0x43, 0x8E, 0x01, 0x00, 0x04, 0x24, 0x00, 0x00, 0xC3, 0xAE,
3940x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x1C, 0x42, 0x92,
3950x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x40, 0x10, 0x2A, 0xB0, 0x02, 0x3C,
3960x09, 0x00, 0x42, 0x34, 0x02, 0x00, 0x03, 0x24, 0x00, 0x00, 0x54, 0xA0,
3970x00, 0x00, 0x43, 0xA0, 0xFF, 0x00, 0x03, 0x24, 0x71, 0x00, 0x23, 0x12,
3980x00, 0x00, 0x00, 0x00, 0x04, 0x38, 0xA2, 0x8E, 0x70, 0x38, 0xB3, 0x8E,
3990x01, 0x00, 0x04, 0x24, 0x00, 0x00, 0xC2, 0xAF, 0x08, 0x38, 0xA2, 0xAE,
4000x00, 0x00, 0xD3, 0xAF, 0x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
4010x70, 0x38, 0xA4, 0x8E, 0x74, 0x38, 0xA3, 0x8E, 0x02, 0x80, 0x02, 0x3C,
4020xB4, 0xE6, 0x42, 0x24, 0x00, 0x00, 0x52, 0x8C, 0x80, 0x00, 0x84, 0x24,
4030xFF, 0x00, 0x62, 0x24, 0x2B, 0x10, 0x44, 0x00, 0x0A, 0x18, 0x82, 0x00,
4040x70, 0x38, 0xA3, 0xAE, 0x02, 0x80, 0x03, 0x3C, 0xB8, 0xE6, 0x63, 0x24,
4050x70, 0x38, 0x42, 0x8E, 0x00, 0x00, 0x76, 0x8C, 0x00, 0x00, 0x00, 0x00,
4060x00, 0x00, 0xC2, 0xAE, 0x02, 0x80, 0x17, 0x3C, 0xFF, 0xFF, 0x62, 0x32,
4070x25, 0x80, 0x57, 0x00, 0x00, 0x00, 0xD0, 0xAE, 0x0C, 0x00, 0x02, 0x92,
4080x21, 0x28, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xAE, 0x02, 0x00, 0x04, 0x92,
4090x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x93, 0x00, 0xFF, 0xFF, 0x84, 0x30,
4100xE0, 0x61, 0x00, 0x0C, 0x25, 0x20, 0x97, 0x00, 0x0C, 0x00, 0x11, 0x92,
4110x20, 0x10, 0x02, 0x3C, 0x01, 0x00, 0x04, 0x24, 0x00, 0x1A, 0x11, 0x00,
4120x21, 0x18, 0x62, 0x00, 0xFF, 0x00, 0x02, 0x24, 0x21, 0x30, 0x60, 0x00,
4130x06, 0x00, 0x22, 0x12, 0x80, 0x00, 0x07, 0x24, 0x70, 0x38, 0x45, 0x8E,
4140x04, 0x38, 0x43, 0xAE, 0xA8, 0x37, 0x51, 0xA2, 0x1E, 0x01, 0x00, 0x0C,
4150x10, 0x00, 0xA0, 0xAF, 0x04, 0x00, 0x04, 0x8E, 0x08, 0x00, 0x03, 0x8E,
4160xFF, 0xE0, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0x1F, 0x00, 0x84, 0x30,
4170x24, 0x18, 0x62, 0x00, 0x00, 0x26, 0x04, 0x00, 0xFF, 0xDF, 0x02, 0x3C,
4180x25, 0x18, 0x64, 0x00, 0xFF, 0xFF, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00,
4190x00, 0x40, 0x04, 0x3C, 0x25, 0x18, 0x64, 0x00, 0xC0, 0xFF, 0x05, 0x24,
4200x82, 0x11, 0x03, 0x00, 0x24, 0x20, 0x65, 0x00, 0x01, 0x00, 0x42, 0x30,
4210xA3, 0xFF, 0x40, 0x10, 0x04, 0x00, 0x84, 0x34, 0x08, 0x00, 0x03, 0xAE,
4220x08, 0x38, 0x46, 0x8E, 0x21, 0x28, 0x60, 0x02, 0x80, 0x00, 0x07, 0x24,
4230x01, 0x00, 0x04, 0x24, 0x01, 0x00, 0x14, 0x24, 0x1E, 0x01, 0x00, 0x0C,
4240x10, 0x00, 0xB4, 0xAF, 0x08, 0x38, 0x43, 0x8E, 0x01, 0x00, 0x04, 0x24,
4250x00, 0x00, 0xC3, 0xAE, 0x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
4260x2A, 0x1C, 0x42, 0x92, 0x00, 0x00, 0x00, 0x00, 0xA3, 0xFF, 0x40, 0x14,
4270x2A, 0xB0, 0x02, 0x3C, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
4280x2A, 0x1C, 0x54, 0xA2, 0x02, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00,
4290x21, 0x10, 0x53, 0x00, 0xFF, 0xFF, 0x42, 0x30, 0x25, 0x10, 0x57, 0x00,
4300x02, 0x00, 0x43, 0x94, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x64, 0x30,
4310x00, 0xC0, 0x84, 0x24, 0x2B, 0x1C, 0x43, 0xA2, 0xA3, 0x31, 0x00, 0x0C,
4320xFF, 0xFF, 0x84, 0x30, 0x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
4330x2A, 0xB0, 0x02, 0x3C, 0x09, 0x00, 0x42, 0x34, 0x02, 0x00, 0x03, 0x24,
4340x00, 0x00, 0x54, 0xA0, 0x00, 0x00, 0x43, 0xA0, 0xFF, 0x00, 0x03, 0x24,
4350x91, 0xFF, 0x23, 0x16, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C,
4360x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x62, 0x24,
4370xD0, 0x1B, 0x43, 0x8C, 0x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F,
4380x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F,
4390x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
4400x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x00, 0x38, 0x63, 0x34,
4410x41, 0xB0, 0x04, 0x3C, 0x40, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x83, 0xAC,
4420x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0x43, 0xAC, 0x00, 0x80, 0x03, 0x3C,
4430x25, 0xB0, 0x02, 0x3C, 0x4C, 0x14, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34,
4440x00, 0x00, 0x43, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
4450xC0, 0xFF, 0xBD, 0x27, 0x34, 0x00, 0xB7, 0xAF, 0x3C, 0x00, 0xBF, 0xAF,
4460x38, 0x00, 0xBE, 0xAF, 0x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF,
4470x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
4480x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x06, 0x3C,
4490xC0, 0x5D, 0xC5, 0x90, 0x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
4500x18, 0x03, 0x42, 0x34, 0x68, 0x14, 0x63, 0x24, 0x40, 0x00, 0xA4, 0x30,
4510x00, 0x00, 0x43, 0xAC, 0x21, 0xB8, 0x00, 0x00, 0x03, 0x00, 0x80, 0x10,
4520x7F, 0x00, 0xA2, 0x30, 0xBF, 0x00, 0xA2, 0x30, 0x01, 0x00, 0x17, 0x24,
4530xC0, 0x5D, 0xC2, 0xA0, 0x96, 0x40, 0x00, 0x0C, 0x02, 0x80, 0x1E, 0x3C,
4540x25, 0xB0, 0x02, 0x3C, 0x60, 0x1B, 0xD3, 0x27, 0xB0, 0x03, 0x55, 0x34,
4550x59, 0x05, 0x00, 0x08, 0x02, 0x80, 0x16, 0x3C, 0x84, 0x37, 0x91, 0xA2,
4560x60, 0x1B, 0xC2, 0x27, 0xBC, 0x37, 0x46, 0x8C, 0x28, 0x38, 0x45, 0x8C,
4570x03, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
4580x10, 0x00, 0xA0, 0xAF, 0x60, 0x1B, 0xD4, 0x27, 0xC0, 0x37, 0x85, 0x8E,
4590x21, 0x20, 0x00, 0x02, 0xD4, 0x02, 0x00, 0x0C, 0x21, 0x30, 0x40, 0x02,
4600x2A, 0xB0, 0x07, 0x3C, 0x0D, 0x00, 0xE2, 0x34, 0x04, 0x00, 0x43, 0x24,
4610x0B, 0x10, 0x77, 0x00, 0x01, 0x00, 0x04, 0x24, 0x02, 0x00, 0x03, 0x24,
4620x00, 0x00, 0x44, 0xA0, 0x00, 0x00, 0x43, 0xA0, 0x0C, 0x5D, 0xC4, 0x96,
4630x25, 0xB0, 0x06, 0x3C, 0x66, 0x03, 0xC5, 0x34, 0x01, 0x00, 0x84, 0x24,
4640x0C, 0x5D, 0xC4, 0xA6, 0x0C, 0x5D, 0xC2, 0x96, 0xFF, 0x00, 0x03, 0x24,
4650x00, 0x00, 0xA2, 0xA4, 0x2F, 0x00, 0x23, 0x12, 0x00, 0x00, 0x00, 0x00,
4660xBC, 0x37, 0x62, 0x8E, 0x28, 0x38, 0x72, 0x8E, 0x03, 0x00, 0x04, 0x24,
4670x00, 0x00, 0xA2, 0xAE, 0xC0, 0x37, 0x62, 0xAE, 0x00, 0x00, 0xB2, 0xAE,
4680x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x28, 0x38, 0x64, 0x8E,
4690x2C, 0x38, 0x63, 0x8E, 0x02, 0x80, 0x02, 0x3C, 0xBC, 0xE6, 0x42, 0x24,
4700x00, 0x00, 0x54, 0x8C, 0x80, 0x00, 0x84, 0x24, 0xFF, 0x00, 0x62, 0x24,
4710x2B, 0x10, 0x44, 0x00, 0x0A, 0x18, 0x82, 0x00, 0x28, 0x38, 0x63, 0xAE,
4720x28, 0x38, 0x82, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xAE,
4730x02, 0x80, 0x03, 0x3C, 0xFF, 0xFF, 0x42, 0x32, 0x25, 0x80, 0x43, 0x00,
4740x00, 0x00, 0xB0, 0xAE, 0x0C, 0x00, 0x02, 0x92, 0x01, 0x00, 0x05, 0x24,
4750x00, 0x00, 0xA2, 0xAE, 0x02, 0x00, 0x04, 0x92, 0x00, 0x00, 0x00, 0x00,
4760x21, 0x20, 0x92, 0x00, 0xFF, 0xFF, 0x84, 0x30, 0xE0, 0x61, 0x00, 0x0C,
4770x25, 0x20, 0x83, 0x00, 0x0C, 0x00, 0x11, 0x92, 0x20, 0x10, 0x02, 0x3C,
4780xFF, 0x00, 0x03, 0x24, 0x00, 0x22, 0x11, 0x00, 0xC2, 0xFF, 0x23, 0x12,
4790x21, 0x20, 0x82, 0x00, 0xB8, 0xFF, 0xE0, 0x16, 0xBC, 0x37, 0x84, 0xAE,
4800x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24, 0x3B, 0x05, 0x00, 0x08,
4810x80, 0x37, 0x51, 0xA0, 0x1E, 0x00, 0xE0, 0x12, 0x40, 0x00, 0xE4, 0x34,
4820x84, 0x37, 0x83, 0x92, 0x41, 0x00, 0xE4, 0x34, 0xB0, 0x03, 0xC5, 0x34,
4830x00, 0x00, 0x83, 0xA0, 0x00, 0x00, 0xA3, 0xAC, 0x96, 0x40, 0x00, 0x0C,
4840x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
4850x60, 0x1B, 0xC5, 0x27, 0xD0, 0x1B, 0xA4, 0x8C, 0x01, 0x00, 0x02, 0x3C,
4860x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F, 0x34, 0x00, 0xB7, 0x8F,
4870x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
4880x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
4890x18, 0x00, 0xB0, 0x8F, 0x00, 0x80, 0x42, 0x34, 0x25, 0x20, 0x82, 0x00,
4900x41, 0xB0, 0x03, 0x3C, 0x40, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x64, 0xAC,
4910x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0xA4, 0xAC, 0x80, 0x37, 0x83, 0x92,
4920xB0, 0x03, 0xC5, 0x34, 0x00, 0x00, 0x83, 0xA0, 0x00, 0x00, 0xA3, 0xAC,
4930x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C,
4940x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0xC5, 0x27, 0xD0, 0x1B, 0xA4, 0x8C,
4950x01, 0x00, 0x02, 0x3C, 0x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F,
4960x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F,
4970x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
4980x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x00, 0x80, 0x42, 0x34,
4990x25, 0x20, 0x82, 0x00, 0x41, 0xB0, 0x03, 0x3C, 0x40, 0x00, 0xBD, 0x27,
5000x00, 0x00, 0x64, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0xA4, 0xAC,
5010xC0, 0xFF, 0xBD, 0x27, 0x34, 0x00, 0xB7, 0xAF, 0x3C, 0x00, 0xBF, 0xAF,
5020x38, 0x00, 0xBE, 0xAF, 0x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF,
5030x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
5040x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x06, 0x3C,
5050xC0, 0x5D, 0xC5, 0x90, 0x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
5060x18, 0x03, 0x42, 0x34, 0x08, 0x17, 0x63, 0x24, 0x10, 0x00, 0xA4, 0x30,
5070x00, 0x00, 0x43, 0xAC, 0x21, 0xB8, 0x00, 0x00, 0x03, 0x00, 0x80, 0x10,
5080xDF, 0x00, 0xA2, 0x30, 0xEF, 0x00, 0xA2, 0x30, 0x01, 0x00, 0x17, 0x24,
5090xC0, 0x5D, 0xC2, 0xA0, 0xC0, 0x5D, 0xC3, 0x90, 0x25, 0xB0, 0x02, 0x3C,
5100xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0x02, 0x80, 0x1E, 0x3C,
5110x00, 0x00, 0x43, 0xAC, 0x21, 0xA8, 0x40, 0x00, 0x96, 0x40, 0x00, 0x0C,
5120x60, 0x1B, 0xD3, 0x27, 0x05, 0x06, 0x00, 0x08, 0x02, 0x80, 0x16, 0x3C,
5130x8C, 0x37, 0x91, 0xA2, 0x60, 0x1B, 0xC2, 0x27, 0xC8, 0x37, 0x46, 0x8C,
5140x34, 0x38, 0x45, 0x8C, 0x04, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24,
5150x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0x60, 0x1B, 0xD4, 0x27,
5160xCC, 0x37, 0x85, 0x8E, 0x21, 0x20, 0x00, 0x02, 0xD4, 0x02, 0x00, 0x0C,
5170x21, 0x30, 0x40, 0x02, 0x2A, 0xB0, 0x07, 0x3C, 0x15, 0x00, 0xE2, 0x34,
5180x04, 0x00, 0x43, 0x24, 0x0B, 0x10, 0x77, 0x00, 0x01, 0x00, 0x04, 0x24,
5190x02, 0x00, 0x03, 0x24, 0x00, 0x00, 0x44, 0xA0, 0x00, 0x00, 0x43, 0xA0,
5200x0C, 0x5D, 0xC4, 0x96, 0x25, 0xB0, 0x06, 0x3C, 0x66, 0x03, 0xC5, 0x34,
5210x01, 0x00, 0x84, 0x24, 0x0C, 0x5D, 0xC4, 0xA6, 0x0C, 0x5D, 0xC2, 0x96,
5220xFF, 0x00, 0x03, 0x24, 0x00, 0x00, 0xA2, 0xA4, 0x2F, 0x00, 0x23, 0x12,
5230x00, 0x00, 0x00, 0x00, 0xC8, 0x37, 0x62, 0x8E, 0x34, 0x38, 0x72, 0x8E,
5240x04, 0x00, 0x04, 0x24, 0x00, 0x00, 0xA2, 0xAE, 0xCC, 0x37, 0x62, 0xAE,
5250x00, 0x00, 0xB2, 0xAE, 0x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
5260x34, 0x38, 0x64, 0x8E, 0x38, 0x38, 0x63, 0x8E, 0x02, 0x80, 0x02, 0x3C,
5270xC0, 0xE6, 0x42, 0x24, 0x00, 0x00, 0x54, 0x8C, 0x80, 0x00, 0x84, 0x24,
5280xFF, 0x00, 0x62, 0x24, 0x2B, 0x10, 0x44, 0x00, 0x0A, 0x18, 0x82, 0x00,
5290x34, 0x38, 0x63, 0xAE, 0x34, 0x38, 0x82, 0x8E, 0x00, 0x00, 0x00, 0x00,
5300x00, 0x00, 0xA2, 0xAE, 0x02, 0x80, 0x03, 0x3C, 0xFF, 0xFF, 0x42, 0x32,
5310x25, 0x80, 0x43, 0x00, 0x00, 0x00, 0xB0, 0xAE, 0x0C, 0x00, 0x02, 0x92,
5320x02, 0x00, 0x05, 0x24, 0x00, 0x00, 0xA2, 0xAE, 0x02, 0x00, 0x04, 0x92,
5330x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x92, 0x00, 0xFF, 0xFF, 0x84, 0x30,
5340xE0, 0x61, 0x00, 0x0C, 0x25, 0x20, 0x83, 0x00, 0x0C, 0x00, 0x11, 0x92,
5350x20, 0x10, 0x02, 0x3C, 0xFF, 0x00, 0x03, 0x24, 0x00, 0x22, 0x11, 0x00,
5360xC2, 0xFF, 0x23, 0x12, 0x21, 0x20, 0x82, 0x00, 0xB8, 0xFF, 0xE0, 0x16,
5370xC8, 0x37, 0x84, 0xAE, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
5380xE7, 0x05, 0x00, 0x08, 0x88, 0x37, 0x51, 0xA0, 0x1D, 0x00, 0xE0, 0x12,
5390x42, 0x00, 0xE4, 0x34, 0x8C, 0x37, 0x83, 0x92, 0x43, 0x00, 0xE4, 0x34,
5400xB0, 0x03, 0xC5, 0x34, 0x00, 0x00, 0x83, 0xA0, 0x00, 0x00, 0xA3, 0xAC,
5410x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C,
5420x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0xC5, 0x27, 0xD0, 0x1B, 0xA2, 0x8C,
5430x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F, 0x34, 0x00, 0xB7, 0x8F,
5440x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
5450x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
5460x18, 0x00, 0xB0, 0x8F, 0x06, 0x00, 0x03, 0x3C, 0x25, 0x10, 0x43, 0x00,
5470x41, 0xB0, 0x04, 0x3C, 0x40, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x82, 0xAC,
5480x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0xA2, 0xAC, 0x88, 0x37, 0x83, 0x92,
5490xB0, 0x03, 0xC5, 0x34, 0x00, 0x00, 0x83, 0xA0, 0x00, 0x00, 0xA3, 0xAC,
5500x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C,
5510x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0xC5, 0x27, 0xD0, 0x1B, 0xA2, 0x8C,
5520x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F, 0x34, 0x00, 0xB7, 0x8F,
5530x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
5540x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
5550x18, 0x00, 0xB0, 0x8F, 0x06, 0x00, 0x03, 0x3C, 0x25, 0x10, 0x43, 0x00,
5560x41, 0xB0, 0x04, 0x3C, 0x40, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x82, 0xAC,
5570x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0xA2, 0xAC, 0xC0, 0xFF, 0xBD, 0x27,
5580x34, 0x00, 0xB7, 0xAF, 0x3C, 0x00, 0xBF, 0xAF, 0x38, 0x00, 0xBE, 0xAF,
5590x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF, 0x28, 0x00, 0xB4, 0xAF,
5600x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
5610x18, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x06, 0x3C, 0xC0, 0x5D, 0xC5, 0x90,
5620x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C, 0x18, 0x03, 0x42, 0x34,
5630xB0, 0x19, 0x63, 0x24, 0x01, 0x00, 0xA4, 0x30, 0x00, 0x00, 0x43, 0xAC,
5640x21, 0xB8, 0x00, 0x00, 0x03, 0x00, 0x80, 0x10, 0xF7, 0x00, 0xA2, 0x30,
5650xFE, 0x00, 0xA2, 0x30, 0x01, 0x00, 0x17, 0x24, 0xC0, 0x5D, 0xC2, 0xA0,
5660xC0, 0x5D, 0xC3, 0x90, 0x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34,
5670x02, 0x80, 0x1E, 0x3C, 0x00, 0x00, 0x43, 0xAC, 0x21, 0xA8, 0x40, 0x00,
5680x96, 0x40, 0x00, 0x0C, 0x60, 0x1B, 0xD3, 0x27, 0xAE, 0x06, 0x00, 0x08,
5690x02, 0x80, 0x16, 0x3C, 0x9C, 0x37, 0x91, 0xA2, 0x60, 0x1B, 0xC2, 0x27,
5700xD4, 0x37, 0x46, 0x8C, 0x40, 0x38, 0x45, 0x8C, 0x05, 0x00, 0x04, 0x24,
5710x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF,
5720x60, 0x1B, 0xD4, 0x27, 0xD8, 0x37, 0x85, 0x8E, 0x21, 0x20, 0x00, 0x02,
5730xD4, 0x02, 0x00, 0x0C, 0x21, 0x30, 0x40, 0x02, 0x2A, 0xB0, 0x07, 0x3C,
5740x1D, 0x00, 0xE2, 0x34, 0x04, 0x00, 0x43, 0x24, 0x0B, 0x10, 0x77, 0x00,
5750x01, 0x00, 0x04, 0x24, 0x02, 0x00, 0x03, 0x24, 0x00, 0x00, 0x44, 0xA0,
5760x00, 0x00, 0x43, 0xA0, 0x0C, 0x5D, 0xC4, 0x96, 0x25, 0xB0, 0x06, 0x3C,
5770x66, 0x03, 0xC5, 0x34, 0x01, 0x00, 0x84, 0x24, 0x0C, 0x5D, 0xC4, 0xA6,
5780x0C, 0x5D, 0xC2, 0x96, 0xFF, 0x00, 0x03, 0x24, 0x00, 0x00, 0xA2, 0xA4,
5790x2F, 0x00, 0x23, 0x12, 0x00, 0x00, 0x00, 0x00, 0xD4, 0x37, 0x62, 0x8E,
5800x40, 0x38, 0x72, 0x8E, 0x05, 0x00, 0x04, 0x24, 0x00, 0x00, 0xA2, 0xAE,
5810xD8, 0x37, 0x62, 0xAE, 0x00, 0x00, 0xB2, 0xAE, 0x5B, 0x01, 0x00, 0x0C,
5820x00, 0x00, 0x00, 0x00, 0x40, 0x38, 0x64, 0x8E, 0x44, 0x38, 0x63, 0x8E,
5830x02, 0x80, 0x02, 0x3C, 0xC4, 0xE6, 0x42, 0x24, 0x00, 0x00, 0x54, 0x8C,
5840x80, 0x00, 0x84, 0x24, 0xFF, 0x00, 0x62, 0x24, 0x2B, 0x10, 0x44, 0x00,
5850x0A, 0x18, 0x82, 0x00, 0x40, 0x38, 0x63, 0xAE, 0x40, 0x38, 0x82, 0x8E,
5860x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xAE, 0x02, 0x80, 0x03, 0x3C,
5870xFF, 0xFF, 0x42, 0x32, 0x25, 0x80, 0x43, 0x00, 0x00, 0x00, 0xB0, 0xAE,
5880x0C, 0x00, 0x02, 0x92, 0x08, 0x00, 0x05, 0x24, 0x00, 0x00, 0xA2, 0xAE,
5890x02, 0x00, 0x04, 0x92, 0x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x92, 0x00,
5900xFF, 0xFF, 0x84, 0x30, 0xE0, 0x61, 0x00, 0x0C, 0x25, 0x20, 0x83, 0x00,
5910x0C, 0x00, 0x11, 0x92, 0x20, 0x10, 0x02, 0x3C, 0xFF, 0x00, 0x03, 0x24,
5920x00, 0x22, 0x11, 0x00, 0xC2, 0xFF, 0x23, 0x12, 0x21, 0x20, 0x82, 0x00,
5930xB8, 0xFF, 0xE0, 0x16, 0xD4, 0x37, 0x84, 0xAE, 0x02, 0x80, 0x02, 0x3C,
5940x60, 0x1B, 0x42, 0x24, 0x90, 0x06, 0x00, 0x08, 0x90, 0x37, 0x51, 0xA0,
5950x1D, 0x00, 0xE0, 0x12, 0x44, 0x00, 0xE4, 0x34, 0x9C, 0x37, 0x83, 0x92,
5960x45, 0x00, 0xE4, 0x34, 0xB0, 0x03, 0xC5, 0x34, 0x00, 0x00, 0x83, 0xA0,
5970x00, 0x00, 0xA3, 0xAC, 0x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
5980x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0xC5, 0x27,
5990xD0, 0x1B, 0xA2, 0x8C, 0x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F,
6000x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F,
6010x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
6020x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x18, 0x00, 0x03, 0x3C,
6030x25, 0x10, 0x43, 0x00, 0x41, 0xB0, 0x04, 0x3C, 0x40, 0x00, 0xBD, 0x27,
6040x00, 0x00, 0x82, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0xA2, 0xAC,
6050x90, 0x37, 0x83, 0x92, 0xB0, 0x03, 0xC5, 0x34, 0x00, 0x00, 0x83, 0xA0,
6060x00, 0x00, 0xA3, 0xAC, 0x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
6070x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0xC5, 0x27,
6080xD0, 0x1B, 0xA2, 0x8C, 0x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F,
6090x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F,
6100x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
6110x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x18, 0x00, 0x03, 0x3C,
6120x25, 0x10, 0x43, 0x00, 0x41, 0xB0, 0x04, 0x3C, 0x40, 0x00, 0xBD, 0x27,
6130x00, 0x00, 0x82, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0xA2, 0xAC,
6140xC0, 0xFF, 0xBD, 0x27, 0x34, 0x00, 0xB7, 0xAF, 0x3C, 0x00, 0xBF, 0xAF,
6150x38, 0x00, 0xBE, 0xAF, 0x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF,
6160x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
6170x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x06, 0x3C,
6180xC0, 0x5D, 0xC5, 0x90, 0x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
6190x18, 0x03, 0x42, 0x34, 0x54, 0x1C, 0x63, 0x24, 0x02, 0x00, 0xA4, 0x30,
6200x00, 0x00, 0x43, 0xAC, 0x21, 0xB8, 0x00, 0x00, 0x03, 0x00, 0x80, 0x10,
6210xFB, 0x00, 0xA2, 0x30, 0xFD, 0x00, 0xA2, 0x30, 0x01, 0x00, 0x17, 0x24,
6220xC0, 0x5D, 0xC2, 0xA0, 0xC0, 0x5D, 0xC3, 0x90, 0x25, 0xB0, 0x02, 0x3C,
6230xB0, 0x03, 0x42, 0x34, 0x02, 0x80, 0x1E, 0x3C, 0x00, 0x00, 0x43, 0xAC,
6240x21, 0xA8, 0x40, 0x00, 0x96, 0x40, 0x00, 0x0C, 0x60, 0x1B, 0xD3, 0x27,
6250x57, 0x07, 0x00, 0x08, 0x02, 0x80, 0x16, 0x3C, 0x98, 0x37, 0x91, 0xA2,
6260x60, 0x1B, 0xC2, 0x27, 0xE0, 0x37, 0x46, 0x8C, 0x4C, 0x38, 0x45, 0x8C,
6270x06, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
6280x10, 0x00, 0xA0, 0xAF, 0x60, 0x1B, 0xD4, 0x27, 0xE4, 0x37, 0x85, 0x8E,
6290x21, 0x20, 0x00, 0x02, 0xD4, 0x02, 0x00, 0x0C, 0x21, 0x30, 0x40, 0x02,
6300x2A, 0xB0, 0x07, 0x3C, 0x25, 0x00, 0xE2, 0x34, 0x04, 0x00, 0x43, 0x24,
6310x0B, 0x10, 0x77, 0x00, 0x01, 0x00, 0x04, 0x24, 0x02, 0x00, 0x03, 0x24,
6320x00, 0x00, 0x44, 0xA0, 0x00, 0x00, 0x43, 0xA0, 0x0C, 0x5D, 0xC4, 0x96,
6330x25, 0xB0, 0x06, 0x3C, 0x66, 0x03, 0xC5, 0x34, 0x01, 0x00, 0x84, 0x24,
6340x0C, 0x5D, 0xC4, 0xA6, 0x0C, 0x5D, 0xC2, 0x96, 0xFF, 0x00, 0x03, 0x24,
6350x00, 0x00, 0xA2, 0xA4, 0x2F, 0x00, 0x23, 0x12, 0x00, 0x00, 0x00, 0x00,
6360xE0, 0x37, 0x62, 0x8E, 0x4C, 0x38, 0x72, 0x8E, 0x06, 0x00, 0x04, 0x24,
6370x00, 0x00, 0xA2, 0xAE, 0xE4, 0x37, 0x62, 0xAE, 0x00, 0x00, 0xB2, 0xAE,
6380x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x38, 0x64, 0x8E,
6390x50, 0x38, 0x63, 0x8E, 0x02, 0x80, 0x02, 0x3C, 0xC8, 0xE6, 0x42, 0x24,
6400x00, 0x00, 0x54, 0x8C, 0x80, 0x00, 0x84, 0x24, 0xFF, 0x00, 0x62, 0x24,
6410x2B, 0x10, 0x44, 0x00, 0x0A, 0x18, 0x82, 0x00, 0x4C, 0x38, 0x63, 0xAE,
6420x4C, 0x38, 0x82, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xAE,
6430x02, 0x80, 0x03, 0x3C, 0xFF, 0xFF, 0x42, 0x32, 0x25, 0x80, 0x43, 0x00,
6440x00, 0x00, 0xB0, 0xAE, 0x0C, 0x00, 0x02, 0x92, 0x04, 0x00, 0x05, 0x24,
6450x00, 0x00, 0xA2, 0xAE, 0x02, 0x00, 0x04, 0x92, 0x00, 0x00, 0x00, 0x00,
6460x21, 0x20, 0x92, 0x00, 0xFF, 0xFF, 0x84, 0x30, 0xE0, 0x61, 0x00, 0x0C,
6470x25, 0x20, 0x83, 0x00, 0x0C, 0x00, 0x11, 0x92, 0x20, 0x10, 0x02, 0x3C,
6480xFF, 0x00, 0x03, 0x24, 0x00, 0x22, 0x11, 0x00, 0xC2, 0xFF, 0x23, 0x12,
6490x21, 0x20, 0x82, 0x00, 0xB8, 0xFF, 0xE0, 0x16, 0xE0, 0x37, 0x84, 0xAE,
6500x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24, 0x39, 0x07, 0x00, 0x08,
6510x94, 0x37, 0x51, 0xA0, 0x1D, 0x00, 0xE0, 0x12, 0x46, 0x00, 0xE4, 0x34,
6520x98, 0x37, 0x83, 0x92, 0x47, 0x00, 0xE4, 0x34, 0xB0, 0x03, 0xC5, 0x34,
6530x00, 0x00, 0x83, 0xA0, 0x00, 0x00, 0xA3, 0xAC, 0x96, 0x40, 0x00, 0x0C,
6540x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
6550x60, 0x1B, 0xC5, 0x27, 0xD0, 0x1B, 0xA2, 0x8C, 0x3C, 0x00, 0xBF, 0x8F,
6560x38, 0x00, 0xBE, 0x8F, 0x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F,
6570x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
6580x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
6590x60, 0x00, 0x03, 0x3C, 0x25, 0x10, 0x43, 0x00, 0x41, 0xB0, 0x04, 0x3C,
6600x40, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x82, 0xAC, 0x08, 0x00, 0xE0, 0x03,
6610xD0, 0x1B, 0xA2, 0xAC, 0x94, 0x37, 0x83, 0x92, 0xB0, 0x03, 0xC5, 0x34,
6620x00, 0x00, 0x83, 0xA0, 0x00, 0x00, 0xA3, 0xAC, 0x96, 0x40, 0x00, 0x0C,
6630x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
6640x60, 0x1B, 0xC5, 0x27, 0xD0, 0x1B, 0xA2, 0x8C, 0x3C, 0x00, 0xBF, 0x8F,
6650x38, 0x00, 0xBE, 0x8F, 0x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F,
6660x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
6670x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
6680x60, 0x00, 0x03, 0x3C, 0x25, 0x10, 0x43, 0x00, 0x41, 0xB0, 0x04, 0x3C,
6690x40, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x82, 0xAC, 0x08, 0x00, 0xE0, 0x03,
6700xD0, 0x1B, 0xA2, 0xAC, 0x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
6710xF8, 0x1E, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34, 0xE8, 0xFF, 0xBD, 0x27,
6720x00, 0x00, 0x43, 0xAC, 0x10, 0x00, 0xBF, 0xAF, 0x96, 0x40, 0x00, 0x0C,
6730x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
6740x02, 0x80, 0x05, 0x3C, 0x60, 0x1B, 0xA5, 0x24, 0xD8, 0x1B, 0xA2, 0x8C,
6750xD0, 0x1B, 0xA4, 0x8C, 0x00, 0x08, 0x03, 0x3C, 0x10, 0x00, 0xBF, 0x8F,
6760x24, 0x10, 0x43, 0x00, 0x25, 0x20, 0x82, 0x00, 0x41, 0xB0, 0x03, 0x3C,
6770x18, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x64, 0xAC, 0x08, 0x00, 0xE0, 0x03,
6780xD0, 0x1B, 0xA4, 0xAC, 0xC0, 0xFF, 0xBD, 0x27, 0x20, 0x00, 0xB0, 0xAF,
6790x00, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x10, 0x3C, 0x18, 0x03, 0x03, 0x36,
6800x58, 0x1F, 0x42, 0x24, 0x00, 0x00, 0x62, 0xAC, 0x34, 0x00, 0xB5, 0xAF,
6810x02, 0x80, 0x15, 0x3C, 0x38, 0x00, 0xBF, 0xAF, 0x2C, 0x00, 0xB3, 0xAF,
6820x28, 0x00, 0xB2, 0xAF, 0x60, 0x1B, 0xB3, 0x26, 0x24, 0x00, 0xB1, 0xAF,
6830x96, 0x40, 0x00, 0x0C, 0x30, 0x00, 0xB4, 0xAF, 0xFC, 0x00, 0x02, 0x36,
6840x00, 0x00, 0x45, 0x8C, 0xAC, 0x1B, 0x64, 0x96, 0xCC, 0x38, 0x63, 0x96,
6850xC4, 0x38, 0x66, 0x8E, 0x23, 0x28, 0xA4, 0x00, 0x21, 0x10, 0xA3, 0x00,
6860x23, 0x88, 0x46, 0x00, 0x23, 0x20, 0x23, 0x02, 0xB0, 0x03, 0x10, 0x36,
6870x2B, 0x10, 0x71, 0x00, 0x00, 0x00, 0x03, 0xAE, 0x00, 0x00, 0x11, 0xAE,
6880x0B, 0x88, 0x82, 0x00, 0x21, 0x20, 0x20, 0x02, 0x53, 0x21, 0x00, 0x0C,
6890xC8, 0x38, 0x65, 0xAE, 0x21, 0x90, 0x40, 0x00, 0x4D, 0x00, 0x40, 0x10,
6900x18, 0x00, 0xA4, 0x27, 0x0C, 0x00, 0x51, 0xAC, 0xC4, 0x38, 0x68, 0x8E,
6910xC8, 0x38, 0x62, 0x8E, 0x08, 0x00, 0x45, 0x8E, 0x20, 0xBD, 0x03, 0x3C,
6920x88, 0x03, 0x63, 0x34, 0x2B, 0x10, 0x48, 0x00, 0x40, 0x10, 0x14, 0x3C,
6930x21, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0x27, 0x32, 0x00, 0x00, 0x65, 0xAC,
6940x2A, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x1B, 0x66, 0x96,
6950x08, 0x00, 0x42, 0x96, 0x40, 0x10, 0x05, 0x3C, 0x21, 0x20, 0x00, 0x00,
6960x21, 0x30, 0x06, 0x01, 0x25, 0x28, 0x45, 0x00, 0x1E, 0x01, 0x00, 0x0C,
6970x10, 0x00, 0xA0, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0x18, 0x00, 0xA4, 0x27,
6980x02, 0x80, 0x02, 0x3C, 0x88, 0x54, 0x42, 0x24, 0x04, 0x00, 0x43, 0x8C,
6990x00, 0x00, 0x42, 0xAE, 0x04, 0x00, 0x52, 0xAC, 0x21, 0x20, 0x00, 0x00,
7000x00, 0x00, 0x72, 0xAC, 0x5B, 0x01, 0x00, 0x0C, 0x04, 0x00, 0x43, 0xAE,
7010x60, 0x1B, 0xA5, 0x26, 0xC8, 0x38, 0xA6, 0x8C, 0xAC, 0x1B, 0xA3, 0x94,
7020x25, 0xB0, 0x02, 0x3C, 0xF8, 0x00, 0x42, 0x34, 0x21, 0x18, 0xC3, 0x00,
7030x00, 0x00, 0x43, 0xAC, 0x18, 0x00, 0xA4, 0x27, 0xC4, 0x38, 0xA6, 0xAC,
7040x90, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C,
7050x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xBF, 0x8F, 0x34, 0x00, 0xB5, 0x8F,
7060x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F, 0x28, 0x00, 0xB2, 0x8F,
7070x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
7080x40, 0x00, 0xBD, 0x27, 0xCC, 0x38, 0x70, 0x8E, 0x08, 0x00, 0x45, 0x96,
7090xAC, 0x1B, 0x66, 0x96, 0x23, 0x80, 0x08, 0x02, 0xFF, 0xFF, 0x10, 0x32,
7100x21, 0x30, 0x06, 0x01, 0x25, 0x28, 0xB4, 0x00, 0x21, 0x38, 0x00, 0x02,
7110x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0x5B, 0x01, 0x00, 0x0C,
7120x21, 0x20, 0x00, 0x00, 0x08, 0x00, 0x45, 0x96, 0xAC, 0x1B, 0x62, 0x96,
7130x23, 0x38, 0x30, 0x02, 0x25, 0x28, 0xB4, 0x00, 0x21, 0x10, 0x06, 0x3C,
7140x21, 0x28, 0xB0, 0x00, 0x21, 0x30, 0x46, 0x00, 0xFF, 0xFF, 0xE7, 0x30,
7150x0D, 0x08, 0x00, 0x08, 0x21, 0x20, 0x00, 0x00, 0x8A, 0x40, 0x00, 0x0C,
7160x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C, 0xC4, 0x5D, 0x62, 0x8C,
7170x18, 0x00, 0xA4, 0x27, 0x08, 0x00, 0x42, 0x34, 0x23, 0x08, 0x00, 0x08,
7180xC4, 0x5D, 0x62, 0xAC, 0x25, 0xB0, 0x05, 0x3C, 0x00, 0x80, 0x02, 0x3C,
7190xC0, 0xFF, 0xBD, 0x27, 0x18, 0x03, 0xA4, 0x34, 0x38, 0x21, 0x42, 0x24,
7200x2A, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x82, 0xAC, 0x3C, 0x00, 0xBF, 0xAF,
7210x38, 0x00, 0xBE, 0xAF, 0x34, 0x00, 0xB7, 0xAF, 0x30, 0x00, 0xB6, 0xAF,
7220x2C, 0x00, 0xB5, 0xAF, 0x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF,
7230x20, 0x00, 0xB2, 0xAF, 0x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF,
7240x2C, 0x00, 0x63, 0x34, 0x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x02, 0x24,
7250xFF, 0x00, 0x24, 0x31, 0x48, 0x00, 0x82, 0x10, 0x00, 0x80, 0x22, 0x31,
7260x37, 0x00, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C, 0x00, 0x80, 0x02, 0x3C,
7270x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24, 0x14, 0x00, 0x82, 0x10,
7280x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x70, 0x24, 0xFF, 0x00, 0x23, 0x31,
7290x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
7300x7C, 0x38, 0x05, 0x8E, 0x25, 0xB0, 0x02, 0x3C, 0xFF, 0x00, 0x28, 0x31,
7310x7C, 0x03, 0x42, 0x34, 0x00, 0x00, 0x48, 0xA4, 0x21, 0x30, 0x60, 0x00,
7320x10, 0x38, 0x03, 0xAE, 0xAC, 0x37, 0x09, 0xA2, 0x0A, 0x00, 0x04, 0x24,
7330x00, 0x01, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF,
7340x01, 0x00, 0x03, 0x24, 0x84, 0x38, 0x03, 0xA2, 0x02, 0x80, 0x02, 0x3C,
7350x60, 0x1B, 0x50, 0x24, 0x84, 0x38, 0x03, 0x92, 0x01, 0x00, 0x02, 0x24,
7360x31, 0x00, 0x62, 0x10, 0x02, 0x80, 0x04, 0x3C, 0x60, 0x1B, 0x90, 0x24,
7370x85, 0x38, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x10,
7380x00, 0x04, 0x03, 0x3C, 0xD8, 0x1B, 0x02, 0x8E, 0xD0, 0x1B, 0x04, 0x8E,
7390x24, 0x10, 0x43, 0x00, 0x25, 0x20, 0x82, 0x00, 0x41, 0xB0, 0x03, 0x3C,
7400x00, 0x00, 0x64, 0xAC, 0xD0, 0x1B, 0x04, 0xAE, 0x3C, 0x00, 0xBF, 0x8F,
7410x38, 0x00, 0xBE, 0x8F, 0x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F,
7420x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
7430x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
7440x08, 0x00, 0xE0, 0x03, 0x40, 0x00, 0xBD, 0x27, 0x24, 0x10, 0x22, 0x01,
7450xCB, 0xFF, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24, 0x02, 0x80, 0x02, 0x3C,
7460x60, 0x1B, 0x43, 0x24, 0xAC, 0x37, 0x62, 0x90, 0x20, 0xB0, 0x03, 0x3C,
7470xB0, 0x03, 0xA4, 0x34, 0x00, 0x12, 0x02, 0x00, 0x21, 0x10, 0x43, 0x00,
7480x0C, 0x00, 0x49, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0xAC,
7490x69, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x24, 0x31, 0x02, 0x80, 0x04, 0x3C,
7500x60, 0x1B, 0x82, 0x24, 0x84, 0x38, 0x40, 0xA0, 0x02, 0x80, 0x02, 0x3C,
7510x60, 0x1B, 0x50, 0x24, 0x84, 0x38, 0x03, 0x92, 0x01, 0x00, 0x02, 0x24,
7520xD1, 0xFF, 0x62, 0x14, 0x00, 0x00, 0x00, 0x00, 0x96, 0x40, 0x00, 0x0C,
7530x21, 0x88, 0x00, 0x02, 0x25, 0xB0, 0x02, 0x3C, 0x2A, 0xB0, 0x03, 0x3C,
7540x2C, 0x00, 0x7E, 0x34, 0x02, 0x80, 0x17, 0x3C, 0xB0, 0x03, 0x56, 0x34,
7550x01, 0x00, 0x13, 0x24, 0x21, 0xA0, 0x00, 0x02, 0x21, 0xA8, 0x00, 0x02,
7560x7C, 0x38, 0x30, 0x8E, 0x0A, 0x00, 0x04, 0x24, 0x00, 0x00, 0xD0, 0xAE,
7570x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C,
7580xFF, 0xFF, 0x08, 0x32, 0x25, 0x80, 0x02, 0x01, 0xC2, 0x5C, 0xE3, 0x92,
7590x02, 0x00, 0x04, 0x92, 0x02, 0x00, 0x02, 0x24, 0x0F, 0x00, 0x63, 0x30,
7600x52, 0x00, 0x62, 0x10, 0x21, 0x38, 0x04, 0x02, 0x20, 0x00, 0x02, 0x24,
7610x54, 0x00, 0x82, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x54, 0xF5, 0x47, 0xAC,
7620x02, 0x00, 0xE2, 0x90, 0x85, 0x38, 0x84, 0x92, 0x03, 0x00, 0xE3, 0x90,
7630xFF, 0x00, 0x52, 0x30, 0x01, 0x00, 0x02, 0x24, 0x21, 0x28, 0xE0, 0x00,
7640x7F, 0x00, 0x66, 0x30, 0x08, 0x00, 0xE7, 0x24, 0x57, 0x00, 0x82, 0x10,
7650x02, 0x80, 0x09, 0x3C, 0x0E, 0x00, 0x02, 0x24, 0x51, 0x00, 0x42, 0x12,
7660x37, 0x00, 0x02, 0x24, 0x4F, 0x00, 0x42, 0x12, 0x10, 0x00, 0x02, 0x24,
7670x4E, 0x00, 0x42, 0x12, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x02, 0x3C,
7680x38, 0xD7, 0x42, 0x24, 0xC0, 0x18, 0x12, 0x00, 0x21, 0x18, 0x62, 0x00,
7690x34, 0xD7, 0x26, 0xA1, 0x04, 0x00, 0x62, 0x8C, 0x02, 0x80, 0x03, 0x3C,
7700x21, 0x20, 0xE0, 0x00, 0x09, 0xF8, 0x40, 0x00, 0x4C, 0xF5, 0x62, 0xAC,
7710x03, 0x00, 0x40, 0x10, 0x39, 0x00, 0x02, 0x24, 0x3B, 0x00, 0x42, 0x12,
7720x00, 0x00, 0x00, 0x00, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
7730x85, 0x38, 0x33, 0xA2, 0x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
7740x39, 0x00, 0x02, 0x24, 0x03, 0x00, 0x42, 0x12, 0x02, 0x00, 0x02, 0x24,
7750x01, 0x00, 0xD3, 0xA3, 0x01, 0x00, 0xC2, 0xA3, 0x85, 0x38, 0xA3, 0x92,
7760x01, 0x00, 0x02, 0x24, 0x42, 0x00, 0x62, 0x14, 0xFF, 0x00, 0x02, 0x24,
7770x0C, 0x00, 0x03, 0x92, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x68, 0x30,
7780x3E, 0x00, 0x02, 0x11, 0x02, 0x80, 0x02, 0x3C, 0xAC, 0x37, 0xA3, 0xA2,
7790xAC, 0x37, 0x22, 0x92, 0x7C, 0x38, 0x25, 0x8E, 0x20, 0x10, 0x03, 0x3C,
7800x00, 0x12, 0x02, 0x00, 0x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0xC8, 0xAE,
7810x21, 0x30, 0x40, 0x00, 0x10, 0x38, 0x22, 0xAE, 0x0A, 0x00, 0x04, 0x24,
7820x00, 0x01, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF,
7830x7C, 0x38, 0x30, 0x8E, 0x0A, 0x00, 0x04, 0x24, 0x00, 0x00, 0xD0, 0xAE,
7840x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C,
7850xFF, 0xFF, 0x08, 0x32, 0x25, 0x80, 0x02, 0x01, 0xC2, 0x5C, 0xE3, 0x92,
7860x02, 0x00, 0x04, 0x92, 0x02, 0x00, 0x02, 0x24, 0x0F, 0x00, 0x63, 0x30,
7870xB0, 0xFF, 0x62, 0x14, 0x21, 0x38, 0x04, 0x02, 0x00, 0x00, 0x02, 0x8E,
7880x00, 0x0C, 0x03, 0x3C, 0x24, 0x10, 0x43, 0x00, 0xAE, 0xFF, 0x43, 0x10,
7890x02, 0x80, 0x02, 0x3C, 0x95, 0x58, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24,
7900x7A, 0x37, 0x22, 0x96, 0x85, 0x38, 0x33, 0xA2, 0x01, 0x00, 0x42, 0x24,
7910xF5, 0x08, 0x00, 0x08, 0x7A, 0x37, 0x22, 0xA6, 0x9B, 0x40, 0x00, 0x0C,
7920x00, 0x00, 0x00, 0x00, 0xF3, 0x08, 0x00, 0x08, 0x85, 0x38, 0x20, 0xA2,
7930x02, 0x80, 0x02, 0x3C, 0xE2, 0x08, 0x00, 0x08, 0x25, 0x38, 0x02, 0x01,
7940x34, 0xD7, 0x22, 0x91, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x42, 0x30,
7950x13, 0x00, 0xC2, 0x10, 0x25, 0xB0, 0x04, 0x3C, 0x6A, 0x37, 0x82, 0x96,
7960x1E, 0x03, 0x84, 0x34, 0x10, 0x00, 0x42, 0x34, 0x3B, 0x00, 0x43, 0x2E,
7970x00, 0x00, 0x82, 0xA4, 0x9F, 0xFF, 0x60, 0x14, 0x6A, 0x37, 0x82, 0xA6,
7980xF6, 0x08, 0x00, 0x08, 0x39, 0x00, 0x02, 0x24, 0x02, 0x80, 0x02, 0x3C,
7990xB0, 0x5D, 0x44, 0x8C, 0x25, 0xB0, 0x03, 0x3C, 0xB0, 0x03, 0x63, 0x34,
8000x00, 0x00, 0x64, 0xAC, 0x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
8010x85, 0x08, 0x00, 0x08, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x00, 0xA5, 0x90,
8020x34, 0xD7, 0x27, 0x91, 0x02, 0x80, 0x04, 0x3C, 0xCC, 0xE6, 0x84, 0x24,
8030xFF, 0x00, 0xA5, 0x30, 0x13, 0x58, 0x00, 0x0C, 0xFF, 0x00, 0xE7, 0x30,
8040xF6, 0x08, 0x00, 0x08, 0x39, 0x00, 0x02, 0x24, 0xC0, 0xFF, 0xBD, 0x27,
8050x34, 0x00, 0xB7, 0xAF, 0x02, 0x80, 0x02, 0x3C, 0x21, 0xB8, 0xA0, 0x00,
8060xFF, 0xFF, 0xA5, 0x30, 0x25, 0x40, 0xA2, 0x00, 0x20, 0x00, 0xB2, 0xAF,
8070x38, 0x00, 0xBF, 0xAF, 0x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF,
8080x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
8090x18, 0x00, 0xB0, 0xAF, 0x00, 0x00, 0x03, 0x8D, 0xFF, 0xFF, 0xD2, 0x30,
8100x08, 0x00, 0x45, 0x26, 0x00, 0xC0, 0x02, 0x24, 0x04, 0x00, 0x06, 0x8D,
8110x24, 0x18, 0x62, 0x00, 0xFF, 0x3F, 0xA5, 0x30, 0xF0, 0xFF, 0x02, 0x3C,
8120x25, 0x18, 0x65, 0x00, 0xFF, 0xFF, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00,
8130x00, 0x80, 0x05, 0x3C, 0x25, 0x18, 0x65, 0x00, 0xFF, 0x01, 0xC6, 0x34,
8140x00, 0x00, 0x03, 0xAD, 0x04, 0x00, 0x06, 0xAD, 0x21, 0x48, 0x80, 0x00,
8150xFF, 0xFF, 0xE7, 0x30, 0x18, 0x00, 0x06, 0x25, 0x18, 0x00, 0x12, 0xA5,
8160x02, 0x00, 0xC7, 0xA0, 0x18, 0x00, 0x03, 0x8D, 0xFF, 0x7F, 0x02, 0x3C,
8170xFF, 0xFF, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00, 0x02, 0x80, 0x16, 0x3C,
8180x18, 0x00, 0x03, 0xAD, 0x60, 0x1B, 0xC5, 0x26, 0x66, 0x37, 0xA4, 0x90,
8190x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x82, 0x24, 0x66, 0x37, 0xA2, 0xA0,
8200x18, 0x00, 0x03, 0x8D, 0xFF, 0x80, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
8210x7F, 0x00, 0x84, 0x30, 0x00, 0x26, 0x04, 0x00, 0x24, 0x18, 0x62, 0x00,
8220x25, 0x18, 0x64, 0x00, 0x18, 0x00, 0x03, 0xAD, 0x02, 0x80, 0x02, 0x3C,
8230xC2, 0x5C, 0x44, 0x90, 0x20, 0x00, 0x43, 0x26, 0xFF, 0xFF, 0x72, 0x30,
8240x02, 0x00, 0x84, 0x30, 0x04, 0x00, 0x80, 0x10, 0x21, 0x18, 0x40, 0x02,
8250x1F, 0x00, 0x42, 0x32, 0x5C, 0x00, 0x40, 0x10, 0x08, 0x00, 0x42, 0x26,
8260xFF, 0xFF, 0x63, 0x30, 0x5D, 0x00, 0x43, 0x12, 0x00, 0x00, 0x00, 0x00,
8270x04, 0x00, 0xC2, 0x8C, 0x21, 0x90, 0x60, 0x00, 0x00, 0xC0, 0x04, 0x24,
8280x01, 0x00, 0x42, 0x34, 0x04, 0x00, 0xC2, 0xAC, 0x00, 0x00, 0x03, 0x8D,
8290x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x62, 0x30, 0x08, 0x00, 0x42, 0x24,
8300x24, 0x18, 0x64, 0x00, 0xFF, 0x3F, 0x42, 0x30, 0x25, 0x18, 0x62, 0x00,
8310x00, 0x00, 0x03, 0xAD, 0x25, 0xB0, 0x02, 0x3C, 0xC0, 0x00, 0x42, 0x34,
8320x07, 0x00, 0x43, 0x32, 0x00, 0x00, 0x52, 0xA4, 0x03, 0x00, 0x60, 0x10,
8330xF8, 0xFF, 0x53, 0x32, 0x08, 0x00, 0x42, 0x26, 0xF8, 0xFF, 0x53, 0x30,
8340x60, 0x1B, 0xD5, 0x26, 0xEC, 0x38, 0xA6, 0x8E, 0xF0, 0x38, 0xB0, 0x8E,
8350x21, 0x10, 0xD3, 0x00, 0x2B, 0x10, 0x02, 0x02, 0x32, 0x00, 0x40, 0x10,
8360xFF, 0x00, 0x34, 0x31, 0x23, 0x80, 0x06, 0x02, 0x21, 0x28, 0xE0, 0x02,
8370xFF, 0xFF, 0x07, 0x32, 0x01, 0x00, 0x11, 0x24, 0x21, 0x20, 0x80, 0x02,
8380x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xB1, 0xAF, 0x23, 0x18, 0x70, 0x02,
8390xFF, 0xFF, 0x72, 0x30, 0x22, 0x10, 0x02, 0x3C, 0x21, 0x10, 0x42, 0x02,
8400x21, 0x20, 0x80, 0x02, 0x5B, 0x01, 0x00, 0x0C, 0xEC, 0x38, 0xA2, 0xAE,
8410x21, 0x28, 0xF0, 0x02, 0x21, 0x38, 0x40, 0x02, 0x21, 0x20, 0x80, 0x02,
8420x22, 0x10, 0x06, 0x3C, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xB1, 0xAF,
8430x60, 0x1B, 0xD1, 0x26, 0xEC, 0x38, 0x23, 0x8E, 0x25, 0xB0, 0x10, 0x3C,
8440xB0, 0x03, 0x02, 0x36, 0x21, 0x20, 0x80, 0x02, 0x00, 0x00, 0x43, 0xAC,
8450x5B, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xEC, 0x38, 0x25, 0x8E,
8460xEC, 0x00, 0x02, 0x36, 0xBD, 0x00, 0x04, 0x36, 0x00, 0x00, 0x45, 0xAC,
8470x00, 0x00, 0x83, 0x90, 0xC2, 0x00, 0x10, 0x36, 0x38, 0x00, 0xBF, 0x8F,
8480x10, 0x00, 0x63, 0x34, 0x00, 0x00, 0x83, 0xA0, 0x34, 0x00, 0xB7, 0x8F,
8490x00, 0x00, 0x05, 0xA6, 0x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F,
8500x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
8510x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x02, 0x24,
8520x08, 0x00, 0xE0, 0x03, 0x40, 0x00, 0xBD, 0x27, 0x01, 0x00, 0x02, 0x24,
8530x21, 0x28, 0xE0, 0x02, 0x21, 0x20, 0x80, 0x02, 0x21, 0x38, 0x60, 0x02,
8540x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF, 0xEC, 0x38, 0xA3, 0x8E,
8550x00, 0x00, 0x00, 0x00, 0x21, 0x18, 0x73, 0x00, 0xC4, 0x09, 0x00, 0x08,
8560xEC, 0x38, 0xA3, 0xAE, 0xFF, 0xFF, 0x43, 0x30, 0xFF, 0xFF, 0x63, 0x30,
8570xA5, 0xFF, 0x43, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xC2, 0x8C,
8580xFE, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00, 0xA1, 0x09, 0x00, 0x08,
8590x04, 0x00, 0xC2, 0xAC, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
8600x21, 0x80, 0x80, 0x00, 0x1C, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
8610x10, 0x00, 0xA4, 0x27, 0x14, 0x00, 0x03, 0x8E, 0x16, 0x00, 0x02, 0x24,
8620x21, 0x28, 0x00, 0x00, 0x0A, 0x00, 0x62, 0x10, 0x08, 0x00, 0x06, 0x24,
8630x08, 0x00, 0x02, 0x96, 0x02, 0x80, 0x04, 0x3C, 0xEC, 0x54, 0x00, 0x0C,
8640x25, 0x20, 0x44, 0x00, 0x08, 0x00, 0x05, 0x8E, 0x0C, 0x00, 0x06, 0x96,
8650x14, 0x00, 0x07, 0x96, 0x51, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x04, 0x24,
8660x04, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x02, 0x8E, 0x21, 0x20, 0x00, 0x02,
8670x00, 0x00, 0x62, 0xAC, 0x04, 0x00, 0x43, 0xAC, 0x00, 0x00, 0x10, 0xAE,
8680x74, 0x21, 0x00, 0x0C, 0x04, 0x00, 0x10, 0xAE, 0x90, 0x40, 0x00, 0x0C,
8690x10, 0x00, 0xA4, 0x27, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
8700x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27,
8710x18, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x1C, 0x00, 0xBF, 0xAF,
8720x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x25, 0xB0, 0x02, 0x3C,
8730xBF, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
8740x04, 0x00, 0x63, 0x2C, 0x05, 0x00, 0x60, 0x10, 0x02, 0x80, 0x05, 0x3C,
8750x90, 0x54, 0xA3, 0x8C, 0x90, 0x54, 0xA2, 0x24, 0x0D, 0x00, 0x62, 0x10,
8760x21, 0x20, 0x00, 0x02, 0x90, 0x54, 0xA2, 0x24, 0x04, 0x00, 0x43, 0x8C,
8770x00, 0x00, 0x02, 0xAE, 0x04, 0x00, 0x50, 0xAC, 0x00, 0x00, 0x70, 0xAC,
8780x04, 0x00, 0x03, 0xAE, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
8790x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
8800x20, 0x00, 0xBD, 0x27, 0xF5, 0x09, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
8810x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x1C, 0x00, 0xBF, 0x8F,
8820x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
8830xD8, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00,
8840x02, 0x80, 0x04, 0x3C, 0x08, 0xE7, 0x84, 0x24, 0x24, 0x00, 0xBF, 0xAF,
8850x20, 0x00, 0xB2, 0xAF, 0x13, 0x58, 0x00, 0x0C, 0x1C, 0x00, 0xB1, 0xAF,
8860x00, 0x00, 0x04, 0x96, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x83, 0x24,
8870x07, 0x00, 0x62, 0x30, 0x6A, 0x00, 0x40, 0x10, 0xC2, 0x10, 0x03, 0x00,
8880x28, 0x00, 0x82, 0x24, 0xC2, 0x10, 0x02, 0x00, 0x53, 0x21, 0x00, 0x0C,
8890xC0, 0x20, 0x02, 0x00, 0x68, 0x00, 0x40, 0x10, 0x21, 0x88, 0x40, 0x00,
8900x02, 0x80, 0x12, 0x3C, 0x02, 0x00, 0x06, 0x92, 0x60, 0x1B, 0x50, 0x26,
8910x10, 0x38, 0x05, 0x8E, 0x08, 0x00, 0xC6, 0x24, 0x0A, 0x00, 0x04, 0x24,
8920x72, 0x01, 0x00, 0x0C, 0x21, 0x38, 0x40, 0x00, 0xB0, 0x1B, 0x03, 0x96,
8930x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62, 0x30, 0x67, 0x00, 0x40, 0x14,
8940x01, 0x00, 0x62, 0x30, 0x02, 0x80, 0x02, 0x3C, 0x4B, 0xF5, 0x43, 0x90,
8950x60, 0x1B, 0x50, 0x26, 0x10, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x02, 0x3C,
8960xE8, 0x39, 0x00, 0xAE, 0x04, 0x3A, 0x00, 0xAE, 0xFC, 0x40, 0x00, 0xAE,
8970xBC, 0x40, 0x00, 0xAE, 0xC6, 0x40, 0x00, 0xA2, 0x8A, 0x40, 0x00, 0x0C,
8980xC6, 0x5C, 0x43, 0xA0, 0xA3, 0x6A, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
8990x87, 0x6B, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x90, 0x40, 0x00, 0x0C,
9000x10, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x02, 0x3C, 0xD2, 0x5C, 0x48, 0x90,
9010x25, 0xB0, 0x04, 0x3C, 0x2F, 0x00, 0x02, 0x3C, 0xD0, 0x01, 0x85, 0x34,
9020x17, 0x32, 0x42, 0x34, 0x00, 0x00, 0xA2, 0xAC, 0x5E, 0x00, 0x03, 0x3C,
9030x10, 0x00, 0x02, 0x3C, 0xDC, 0x01, 0x87, 0x34, 0xD4, 0x01, 0x86, 0x34,
9040x17, 0x43, 0x63, 0x34, 0x20, 0x53, 0x42, 0x34, 0xD8, 0x01, 0x84, 0x34,
9050x00, 0x00, 0xC3, 0xAC, 0x00, 0x00, 0x82, 0xAC, 0x44, 0xA4, 0x03, 0x34,
9060x01, 0x00, 0x02, 0x24, 0x00, 0x00, 0xE3, 0xAC, 0x52, 0x00, 0x02, 0x11,
9070xFF, 0xF7, 0x03, 0x24, 0xFC, 0x23, 0x02, 0x8E, 0xFF, 0xEF, 0x04, 0x24,
9080x24, 0x10, 0x43, 0x00, 0x24, 0x10, 0x44, 0x00, 0xFC, 0x23, 0x02, 0xAE,
9090x60, 0x1B, 0x42, 0x8E, 0xDF, 0xFF, 0x03, 0x24, 0xFB, 0xFF, 0x04, 0x24,
9100x24, 0x10, 0x43, 0x00, 0x24, 0x10, 0x44, 0x00, 0xFE, 0xFF, 0x03, 0x24,
9110x24, 0x10, 0x43, 0x00, 0x50, 0x0C, 0x04, 0x24, 0x60, 0x1B, 0x50, 0x26,
9120x30, 0x5C, 0x00, 0x0C, 0x60, 0x1B, 0x42, 0xAE, 0x38, 0x3E, 0x02, 0xA2,
9130x30, 0x5C, 0x00, 0x0C, 0x58, 0x0C, 0x04, 0x24, 0x39, 0x3E, 0x02, 0xA2,
9140x50, 0x0C, 0x04, 0x24, 0x1A, 0x5C, 0x00, 0x0C, 0x17, 0x00, 0x05, 0x24,
9150x17, 0x00, 0x05, 0x24, 0x1A, 0x5C, 0x00, 0x0C, 0x58, 0x0C, 0x04, 0x24,
9160x5B, 0x01, 0x00, 0x0C, 0x0A, 0x00, 0x04, 0x24, 0x08, 0x00, 0x22, 0x96,
9170x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x04, 0x3C, 0x25, 0x28, 0x45, 0x00,
9180x74, 0x03, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0xB0, 0x55, 0x84, 0x24,
9190x74, 0x21, 0x00, 0x0C, 0x21, 0x20, 0x20, 0x02, 0x98, 0x3A, 0x02, 0x8E,
9200x49, 0x4B, 0x00, 0x0C, 0xC4, 0x3D, 0x02, 0xA2, 0x24, 0x00, 0xBF, 0x8F,
9210x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
9220x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
9230x53, 0x21, 0x00, 0x0C, 0xC0, 0x20, 0x02, 0x00, 0x9A, 0xFF, 0x40, 0x14,
9240x21, 0x88, 0x40, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
9250x18, 0xE7, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C, 0xFC, 0xE6, 0xA5, 0x24,
9260x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
9270x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
9280x28, 0x00, 0xBD, 0x27, 0x20, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
9290x87, 0x54, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x05, 0x3C,
9300x4C, 0x00, 0xA2, 0x34, 0x00, 0x00, 0x40, 0xA0, 0x48, 0x00, 0xA5, 0x34,
9310xB0, 0x1B, 0x03, 0x96, 0x00, 0x00, 0xA4, 0x8C, 0x7B, 0xFF, 0x02, 0x3C,
9320xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x82, 0x00, 0xFF, 0xFE, 0x63, 0x30,
9330xB0, 0x1B, 0x03, 0xA6, 0x00, 0x00, 0xA4, 0xAC, 0x5F, 0x0A, 0x00, 0x08,
9340x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0xD3, 0x5C, 0x44, 0x90,
9350x02, 0x00, 0x03, 0x24, 0x06, 0x00, 0x83, 0x10, 0xFF, 0xF7, 0x03, 0x24,
9360xFC, 0x23, 0x02, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x43, 0x00,
9370x89, 0x0A, 0x00, 0x08, 0x00, 0x10, 0x42, 0x34, 0xFC, 0x23, 0x02, 0x8E,
9380xFF, 0xEF, 0x03, 0x24, 0x00, 0x08, 0x42, 0x34, 0x89, 0x0A, 0x00, 0x08,
9390x24, 0x10, 0x43, 0x00, 0x02, 0x80, 0x04, 0x3C, 0xB4, 0x55, 0x84, 0x24,
9400x1C, 0x4F, 0x00, 0x0C, 0x03, 0x00, 0x05, 0x24, 0xC6, 0x0A, 0x00, 0x08,
9410x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
9420x00, 0x00, 0x84, 0x90, 0x02, 0x80, 0x06, 0x3C, 0x01, 0x00, 0x02, 0x24,
9430xFF, 0x00, 0x83, 0x30, 0x0C, 0x00, 0x62, 0x10, 0x60, 0x1B, 0xC5, 0x24,
9440x04, 0x00, 0x02, 0x24, 0x13, 0x00, 0x62, 0x10, 0x60, 0x1B, 0xC2, 0x24,
9450xC6, 0x3D, 0x45, 0x90, 0x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C,
9460x24, 0xE7, 0x84, 0x24, 0x10, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0x00, 0x00,
9470x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xC6, 0x3D, 0xA4, 0xA0,
9480x60, 0x1B, 0xC2, 0x24, 0xC6, 0x3D, 0x45, 0x90, 0x02, 0x80, 0x04, 0x3C,
9490x13, 0x58, 0x00, 0x0C, 0x24, 0xE7, 0x84, 0x24, 0x10, 0x00, 0xBF, 0x8F,
9500x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
9510x60, 0x1B, 0xC3, 0x24, 0xB0, 0x1B, 0x62, 0x94, 0xC6, 0x3D, 0x64, 0xA0,
9520x02, 0x80, 0x04, 0x3C, 0x04, 0x00, 0x42, 0x34, 0xB0, 0x1B, 0x62, 0xA4,
9530x60, 0x1B, 0xC2, 0x24, 0xC6, 0x3D, 0x45, 0x90, 0x13, 0x58, 0x00, 0x0C,
9540x24, 0xE7, 0x84, 0x24, 0x10, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0x00, 0x00,
9550x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xD0, 0xFF, 0xBD, 0x27,
9560x20, 0x00, 0xB2, 0xAF, 0x02, 0x80, 0x12, 0x3C, 0x24, 0x00, 0xB3, 0xAF,
9570x1C, 0x00, 0xB1, 0xAF, 0x2C, 0x00, 0xBF, 0xAF, 0x28, 0x00, 0xB4, 0xAF,
9580x18, 0x00, 0xB0, 0xAF, 0x60, 0x1B, 0x51, 0x26, 0xB0, 0x1B, 0x22, 0x96,
9590x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x42, 0x30, 0x0A, 0x00, 0x40, 0x10,
9600x21, 0x98, 0x80, 0x00, 0x2C, 0x00, 0xBF, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
9610x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
9620x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
9630x30, 0x00, 0xBD, 0x27, 0x10, 0x00, 0xA4, 0x27, 0x8A, 0x40, 0x00, 0x0C,
9640x02, 0x80, 0x14, 0x3C, 0xEE, 0x5D, 0x82, 0x92, 0x00, 0x00, 0x00, 0x00,
9650x0F, 0x00, 0x42, 0x30, 0x04, 0x00, 0x42, 0x28, 0x89, 0x00, 0x40, 0x14,
9660x00, 0x00, 0x00, 0x00, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
9670x60, 0x1B, 0x42, 0x8E, 0xDF, 0xFF, 0x03, 0x24, 0xFB, 0xFF, 0x04, 0x24,
9680x24, 0x10, 0x43, 0x00, 0x24, 0x10, 0x44, 0x00, 0xFE, 0xFF, 0x03, 0x24,
9690x24, 0x10, 0x43, 0x00, 0x50, 0x0C, 0x04, 0x24, 0x30, 0x5C, 0x00, 0x0C,
9700x60, 0x1B, 0x42, 0xAE, 0x38, 0x3E, 0x22, 0xA2, 0x30, 0x5C, 0x00, 0x0C,
9710x58, 0x0C, 0x04, 0x24, 0x39, 0x3E, 0x22, 0xA2, 0x50, 0x0C, 0x04, 0x24,
9720x1A, 0x5C, 0x00, 0x0C, 0x17, 0x00, 0x05, 0x24, 0x17, 0x00, 0x05, 0x24,
9730x1A, 0x5C, 0x00, 0x0C, 0x58, 0x0C, 0x04, 0x24, 0xB0, 0x1B, 0x22, 0x96,
9740x02, 0x80, 0x04, 0x3C, 0x34, 0xE7, 0x84, 0x24, 0x00, 0x10, 0x42, 0x34,
9750x13, 0x58, 0x00, 0x0C, 0xB0, 0x1B, 0x22, 0xA6, 0x01, 0x00, 0x02, 0x24,
9760x25, 0xB0, 0x03, 0x3C, 0x04, 0x3E, 0x22, 0xAE, 0x4C, 0x00, 0x63, 0x34,
9770xB0, 0x1B, 0x22, 0x96, 0x00, 0x00, 0x66, 0x90, 0x08, 0x00, 0x65, 0x8E,
9780xC4, 0x3D, 0x27, 0x92, 0xC5, 0x3D, 0x28, 0x92, 0x3B, 0x41, 0x29, 0x92,
9790xD0, 0x3D, 0x2A, 0x92, 0xFF, 0x3D, 0x2B, 0x92, 0x00, 0x80, 0x42, 0x30,
9800x37, 0x3E, 0x26, 0xA2, 0x0C, 0x3E, 0x25, 0xAE, 0x10, 0x00, 0xA4, 0x27,
9810x00, 0x00, 0x60, 0xA0, 0x31, 0x3E, 0x27, 0xA2, 0x32, 0x3E, 0x28, 0xA2,
9820x34, 0x3E, 0x22, 0xA6, 0x36, 0x3E, 0x29, 0xA2, 0xC4, 0x3D, 0x2A, 0xA2,
9830xC5, 0x3D, 0x2B, 0xA2, 0x3C, 0x3E, 0x20, 0xAE, 0x40, 0x3E, 0x20, 0xAE,
9840x8A, 0x40, 0x00, 0x0C, 0x33, 0x3E, 0x20, 0xA2, 0x10, 0x00, 0xA4, 0x27,
9850x90, 0x40, 0x00, 0x0C, 0x52, 0x41, 0x20, 0xA2, 0x21, 0x20, 0x00, 0x00,
9860x95, 0x0E, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0x08, 0x00, 0x66, 0x8E,
9870x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0xC0, 0x14, 0x0C, 0x00, 0x70, 0x26,
9880x00, 0x00, 0x62, 0x8E, 0x21, 0x20, 0x20, 0x02, 0x44, 0x3E, 0x23, 0x26,
9890x08, 0x3E, 0x22, 0xAE, 0x3F, 0x00, 0x02, 0x24, 0xFF, 0xFF, 0x42, 0x24,
9900x00, 0x00, 0x60, 0xA0, 0xFD, 0xFF, 0x41, 0x04, 0x07, 0x00, 0x63, 0x24,
9910xB0, 0x1B, 0x83, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62, 0x30,
9920x09, 0x00, 0x40, 0x10, 0x60, 0x1B, 0x50, 0x26, 0x01, 0x00, 0x62, 0x30,
9930x06, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x5D, 0x82, 0x92,
9940x0C, 0x00, 0x03, 0x24, 0x0F, 0x00, 0x42, 0x30, 0x37, 0x00, 0x43, 0x10,
9950x00, 0x00, 0x00, 0x00, 0xC4, 0x3D, 0x04, 0x92, 0x75, 0x0D, 0x00, 0x0C,
9960x00, 0x00, 0x00, 0x00, 0xC4, 0x3D, 0x04, 0x92, 0x38, 0x0D, 0x00, 0x0C,
9970x01, 0x00, 0x05, 0x24, 0x25, 0xB0, 0x04, 0x3C, 0x48, 0x00, 0x84, 0x34,
9980x00, 0x00, 0x83, 0x8C, 0x08, 0x3E, 0x05, 0x8E, 0x7B, 0xFF, 0x02, 0x3C,
9990xFF, 0xFF, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00, 0x01, 0x00, 0x02, 0x24,
10000x00, 0x00, 0x83, 0xAC, 0x0C, 0x00, 0xA2, 0x10, 0x60, 0x1B, 0x43, 0x26,
10010x3C, 0x00, 0x02, 0x24, 0x94, 0x39, 0x62, 0xAC, 0x2C, 0x00, 0xBF, 0x8F,
10020x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
10030x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00,
10040x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27, 0xC4, 0x3D, 0x02, 0x92,
10050x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x42, 0x2C, 0xF1, 0xFF, 0x40, 0x10,
10060x00, 0x00, 0x00, 0x00, 0x12, 0x49, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
10070x60, 0x1B, 0x43, 0x26, 0x3C, 0x00, 0x02, 0x24, 0xA0, 0x0B, 0x00, 0x08,
10080x94, 0x39, 0x62, 0xAC, 0x02, 0x80, 0x04, 0x3C, 0x21, 0x28, 0x00, 0x02,
10090xF4, 0x54, 0x00, 0x0C, 0x70, 0x59, 0x84, 0x24, 0x02, 0x80, 0x04, 0x3C,
10100x44, 0xE7, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x02,
10110x77, 0x0B, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x24,
10120x4B, 0x2E, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24, 0x36, 0x0B, 0x00, 0x08,
10130x00, 0x00, 0x00, 0x00, 0x0E, 0x51, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24,
10140x8D, 0x0B, 0x00, 0x08, 0x60, 0x1B, 0x50, 0x26, 0xE8, 0xFF, 0xBD, 0x27,
10150x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF, 0x21, 0x80, 0x80, 0x00,
10160x00, 0x00, 0x02, 0x92, 0x02, 0x80, 0x04, 0x3C, 0x21, 0x28, 0x40, 0x00,
10170x04, 0x00, 0x42, 0x2C, 0x06, 0x00, 0x40, 0x14, 0x50, 0xE7, 0x84, 0x24,
10180x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00,
10190x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x13, 0x58, 0x00, 0x0C,
10200x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x92, 0x14, 0x00, 0xBF, 0x8F,
10210x10, 0x00, 0xB0, 0x8F, 0x02, 0x80, 0x02, 0x3C, 0x84, 0x5B, 0x43, 0xAC,
10220x18, 0x00, 0xBD, 0x27, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
10230x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C, 0xD0, 0xFF, 0xBD, 0x27,
10240x18, 0x03, 0x42, 0x34, 0x80, 0x2F, 0x63, 0x24, 0x24, 0x00, 0xB3, 0xAF,
10250x28, 0x00, 0xBF, 0xAF, 0x20, 0x00, 0xB2, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
10260x18, 0x00, 0xB0, 0xAF, 0x00, 0x00, 0x43, 0xAC, 0x02, 0x80, 0x04, 0x3C,
10270xEC, 0x5D, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x40, 0x10,
10280x02, 0x80, 0x13, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0x06, 0x5E, 0x43, 0x90,
10290x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x60, 0x14, 0x01, 0x00, 0x04, 0x24,
10300x02, 0x80, 0x02, 0x3C, 0x0F, 0x5E, 0x44, 0xA0, 0x02, 0x80, 0x03, 0x3C,
10310xED, 0x5D, 0x64, 0x90, 0x01, 0x00, 0x05, 0x24, 0x4B, 0x2E, 0x00, 0x0C,
10320xFF, 0x00, 0x84, 0x30, 0x02, 0x80, 0x02, 0x3C, 0x98, 0x54, 0x43, 0x8C,
10330x98, 0x54, 0x42, 0x24, 0xA2, 0x00, 0x62, 0x10, 0x02, 0x80, 0x13, 0x3C,
10340x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xB0, 0x02, 0x3C,
10350x36, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0x90, 0x60, 0x1B, 0x66, 0x26,
10360xF4, 0x38, 0xC5, 0x8C, 0xC0, 0x18, 0x03, 0x00, 0x23, 0xB0, 0x04, 0x3C,
10370xF0, 0x07, 0x63, 0x30, 0xFF, 0x1F, 0x02, 0x3C, 0x21, 0x18, 0x64, 0x00,
10380xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x62, 0x00, 0x23, 0x88, 0x85, 0x00,
10390x00, 0x04, 0x22, 0x26, 0x2B, 0x28, 0x85, 0x00, 0x98, 0x38, 0xC3, 0x8C,
10400x0B, 0x88, 0x45, 0x00, 0xE1, 0x01, 0x22, 0x2E, 0x94, 0x38, 0xC3, 0xAC,
10410xF8, 0x38, 0xC4, 0xAC, 0x9E, 0x38, 0xC0, 0xA4, 0x14, 0x00, 0x40, 0x14,
10420x9D, 0x38, 0xC0, 0xA0, 0x20, 0xFE, 0x82, 0x24, 0x20, 0x02, 0x83, 0x24,
10430x0A, 0x18, 0x45, 0x00, 0x23, 0x10, 0x02, 0x3C, 0xFF, 0x03, 0x42, 0x34,
10440x2B, 0x10, 0x43, 0x00, 0x21, 0x28, 0x60, 0x00, 0x32, 0x00, 0x40, 0x14,
10450xF4, 0x38, 0xC3, 0xAC, 0xF8, 0x38, 0xC2, 0x8C, 0x00, 0x00, 0x00, 0x00,
10460x2B, 0x18, 0x45, 0x00, 0x23, 0x88, 0x45, 0x00, 0x03, 0x00, 0x60, 0x10,
10470xE1, 0x01, 0x22, 0x2E, 0x00, 0x04, 0x31, 0x26, 0xE1, 0x01, 0x22, 0x2E,
10480x0E, 0x00, 0x40, 0x10, 0x60, 0x1B, 0x70, 0x26, 0x60, 0x1B, 0x70, 0x26,
10490xF8, 0x38, 0x03, 0x8E, 0xF4, 0x38, 0x04, 0x8E, 0x00, 0x00, 0x00, 0x00,
10500x2B, 0x10, 0x83, 0x00, 0x2C, 0x00, 0x40, 0x14, 0x2B, 0x10, 0x64, 0x00,
10510x56, 0x00, 0x40, 0x14, 0x25, 0xB0, 0x02, 0x3C, 0x80, 0x00, 0x03, 0x24,
10520xD0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0x60, 0x1B, 0x70, 0x26,
10530xF4, 0x38, 0x03, 0x96, 0x2A, 0xB0, 0x02, 0x3C, 0x35, 0x00, 0x42, 0x34,
10540xC2, 0x88, 0x03, 0x00, 0x00, 0x00, 0x51, 0xA0, 0x73, 0x23, 0x00, 0x74,
10550x00, 0x00, 0x00, 0x00, 0x9E, 0x38, 0x03, 0x96, 0x25, 0xB0, 0x02, 0x3C,
10560xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0x9B, 0x40, 0x00, 0x0C,
10570x00, 0x00, 0x00, 0x00, 0xD0, 0x1B, 0x02, 0x8E, 0x80, 0x00, 0x03, 0x3C,
10580x41, 0xB0, 0x04, 0x3C, 0x25, 0x10, 0x43, 0x00, 0x00, 0x00, 0x82, 0xAC,
10590x28, 0x00, 0xBF, 0x8F, 0xD0, 0x1B, 0x02, 0xAE, 0x24, 0x00, 0xB3, 0x8F,
10600x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
10610x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27, 0x00, 0xFC, 0xA5, 0x24,
10620x23, 0x0C, 0x00, 0x08, 0xF4, 0x38, 0xC5, 0xAC, 0x24, 0x2D, 0x00, 0x0C,
10630x00, 0x00, 0x00, 0x00, 0xA2, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
10640xE2, 0x2C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0B, 0x00, 0x08,
10650x02, 0x80, 0x02, 0x3C, 0x94, 0x38, 0x05, 0x8E, 0x21, 0x30, 0x80, 0x00,
10660xFF, 0xFF, 0x27, 0x32, 0x09, 0x00, 0x04, 0x24, 0x1E, 0x01, 0x00, 0x0C,
10670x10, 0x00, 0xA0, 0xAF, 0x94, 0x38, 0x03, 0x8E, 0x9E, 0x38, 0x05, 0x96,
10680xF4, 0x38, 0x02, 0x8E, 0x21, 0x18, 0x71, 0x00, 0x21, 0x28, 0x25, 0x02,
10690x21, 0x10, 0x51, 0x00, 0x09, 0x00, 0x04, 0x24, 0xF4, 0x38, 0x02, 0xAE,
10700x94, 0x38, 0x03, 0xAE, 0x5B, 0x01, 0x00, 0x0C, 0x9E, 0x38, 0x05, 0xA6,
10710x60, 0x1B, 0x70, 0x26, 0xF4, 0x38, 0x03, 0x96, 0x2A, 0xB0, 0x02, 0x3C,
10720x35, 0x00, 0x42, 0x34, 0xC2, 0x88, 0x03, 0x00, 0x00, 0x00, 0x51, 0xA0,
10730x73, 0x23, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x38, 0x03, 0x96,
10740x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
10750x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x1B, 0x02, 0x8E,
10760x80, 0x00, 0x03, 0x3C, 0x41, 0xB0, 0x04, 0x3C, 0x25, 0x10, 0x43, 0x00,
10770x00, 0x00, 0x82, 0xAC, 0x28, 0x00, 0xBF, 0x8F, 0xD0, 0x1B, 0x02, 0xAE,
10780x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
10790x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
10800xFC, 0x38, 0x02, 0x8E, 0x94, 0x38, 0x05, 0x8E, 0x21, 0x30, 0x80, 0x00,
10810x23, 0x88, 0x44, 0x00, 0xFF, 0xFF, 0x27, 0x32, 0x09, 0x00, 0x04, 0x24,
10820x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0x94, 0x38, 0x03, 0x8E,
10830x9E, 0x38, 0x02, 0x96, 0xF8, 0x38, 0x12, 0x96, 0x21, 0x18, 0x71, 0x00,
10840x21, 0x10, 0x22, 0x02, 0x23, 0x10, 0x11, 0x3C, 0x94, 0x38, 0x03, 0xAE,
10850x9E, 0x38, 0x02, 0xA6, 0x15, 0x00, 0x40, 0x16, 0xF4, 0x38, 0x11, 0xAE,
10860x09, 0x00, 0x04, 0x24, 0x5B, 0x01, 0x00, 0x0C, 0x60, 0x1B, 0x70, 0x26,
10870x71, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2D, 0x00, 0x0C,
10880x00, 0x00, 0x00, 0x00, 0x5C, 0xFF, 0x40, 0x10, 0x60, 0x1B, 0x63, 0x26,
10890x2A, 0x1C, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0xFF, 0x40, 0x10,
10900x00, 0x00, 0x00, 0x00, 0x4C, 0x3A, 0x64, 0x94, 0x2A, 0x1C, 0x60, 0xA0,
10910x00, 0xC0, 0x84, 0x24, 0xA3, 0x31, 0x00, 0x0C, 0xFF, 0xFF, 0x84, 0x30,
10920x01, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x01, 0x00, 0x0C,
10930x09, 0x00, 0x04, 0x24, 0x94, 0x38, 0x05, 0x8E, 0x09, 0x00, 0x04, 0x24,
10940x23, 0x10, 0x06, 0x3C, 0x21, 0x38, 0x40, 0x02, 0x1E, 0x01, 0x00, 0x0C,
10950x10, 0x00, 0xA0, 0xAF, 0x94, 0x38, 0x03, 0x8E, 0x9E, 0x38, 0x02, 0x96,
10960x21, 0x20, 0x51, 0x02, 0x21, 0x18, 0x72, 0x00, 0x21, 0x10, 0x42, 0x02,
10970xF4, 0x38, 0x04, 0xAE, 0x09, 0x00, 0x04, 0x24, 0x94, 0x38, 0x03, 0xAE,
10980x9E, 0x0C, 0x00, 0x08, 0x9E, 0x38, 0x02, 0xA6, 0x08, 0x00, 0xE0, 0x03,
10990x09, 0x00, 0x02, 0x24, 0xFF, 0x00, 0x86, 0x30, 0x02, 0x80, 0x02, 0x3C,
11000x40, 0x00, 0xC3, 0x2C, 0x4A, 0xF5, 0x47, 0x90, 0x00, 0x00, 0x63, 0x38,
11010x3F, 0x00, 0x02, 0x24, 0x0A, 0x30, 0x43, 0x00, 0x01, 0x00, 0x02, 0x24,
11020x08, 0x0E, 0x04, 0x24, 0x00, 0x7F, 0x05, 0x24, 0x03, 0x00, 0xE2, 0x10,
11030x31, 0x00, 0xC3, 0x2C, 0xC1, 0x43, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
11040x30, 0x00, 0x02, 0x24, 0xC1, 0x43, 0x00, 0x08, 0x0A, 0x30, 0x43, 0x00,
11050xC0, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x03, 0x3C, 0x38, 0x00, 0xB4, 0xAF,
11060x34, 0x00, 0xB3, 0xAF, 0x30, 0x00, 0xB2, 0xAF, 0x2C, 0x00, 0xB1, 0xAF,
11070x28, 0x00, 0xB0, 0xAF, 0xA4, 0xE7, 0x62, 0x24, 0x3C, 0x00, 0xBF, 0xAF,
11080x0A, 0x00, 0x4A, 0x94, 0x02, 0x00, 0x48, 0x94, 0x06, 0x00, 0x49, 0x94,
11090xFF, 0x00, 0x84, 0x30, 0xFF, 0x00, 0xA5, 0x30, 0xA4, 0xE7, 0x6B, 0x94,
11100x04, 0x00, 0x4C, 0x94, 0x08, 0x00, 0x4D, 0x94, 0x00, 0x1C, 0x05, 0x00,
11110x00, 0x14, 0x04, 0x00, 0x00, 0x3E, 0x05, 0x00, 0x00, 0x36, 0x04, 0x00,
11120x25, 0x38, 0xE3, 0x00, 0x25, 0x30, 0xC2, 0x00, 0x00, 0x44, 0x08, 0x00,
11130x00, 0x12, 0x05, 0x00, 0x00, 0x4C, 0x09, 0x00, 0x00, 0x54, 0x0A, 0x00,
11140x00, 0x1A, 0x04, 0x00, 0x25, 0x38, 0xE2, 0x00, 0x25, 0x40, 0x0B, 0x01,
11150x25, 0x48, 0x2C, 0x01, 0x25, 0x50, 0x4D, 0x01, 0x25, 0x30, 0xC3, 0x00,
11160x02, 0x80, 0x02, 0x3C, 0x10, 0x00, 0xA8, 0xAF, 0x14, 0x00, 0xA9, 0xAF,
11170x18, 0x00, 0xAA, 0xAF, 0x25, 0x98, 0xE5, 0x00, 0x25, 0x90, 0xC4, 0x00,
11180x60, 0x1B, 0x54, 0x24, 0x21, 0x80, 0x00, 0x00, 0x10, 0x00, 0xB1, 0x27,
11190x02, 0x00, 0x02, 0x2E, 0x32, 0x00, 0x40, 0x10, 0x80, 0x10, 0x10, 0x00,
11200x21, 0x10, 0x54, 0x00, 0xF0, 0x1C, 0x43, 0x8C, 0x00, 0x00, 0x00, 0x00,
11210x21, 0x40, 0x73, 0x00, 0x21, 0x38, 0x00, 0x00, 0x7F, 0x00, 0x09, 0x24,
11220xC0, 0x20, 0x07, 0x00, 0x04, 0x10, 0x89, 0x00, 0x24, 0x10, 0x48, 0x00,
11230x06, 0x10, 0x82, 0x00, 0x01, 0x00, 0xE5, 0x24, 0xFF, 0x00, 0x43, 0x30,
11240x21, 0x30, 0x27, 0x02, 0x40, 0x00, 0x63, 0x2C, 0xFF, 0x00, 0xA7, 0x30,
11250x02, 0x00, 0x60, 0x14, 0x04, 0x00, 0xE4, 0x2C, 0x3F, 0x00, 0x02, 0x24,
11260xF3, 0xFF, 0x80, 0x14, 0x10, 0x00, 0xC2, 0xA0, 0x23, 0x00, 0xA6, 0x93,
11270x22, 0x00, 0xA2, 0x93, 0x21, 0x00, 0xA5, 0x93, 0x40, 0x18, 0x10, 0x00,
11280x00, 0x14, 0x02, 0x00, 0x21, 0x18, 0x71, 0x00, 0x20, 0x00, 0xA7, 0x93,
11290x00, 0x36, 0x06, 0x00, 0x25, 0x30, 0xC2, 0x00, 0x00, 0x2A, 0x05, 0x00,
11300x00, 0x00, 0x64, 0x94, 0x25, 0x30, 0xC5, 0x00, 0x7F, 0x7F, 0x05, 0x3C,
11310x25, 0x30, 0xC7, 0x00, 0xC1, 0x43, 0x00, 0x0C, 0x7F, 0x7F, 0xA5, 0x34,
11320x01, 0x00, 0x02, 0x26, 0xFF, 0x00, 0x50, 0x30, 0x06, 0x00, 0x03, 0x2E,
11330xD5, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xBF, 0x8F,
11340x38, 0x00, 0xB4, 0x8F, 0x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F,
11350x2C, 0x00, 0xB1, 0x8F, 0x28, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
11360x40, 0x00, 0xBD, 0x27, 0x21, 0x10, 0x54, 0x00, 0xF0, 0x1C, 0x43, 0x8C,
11370x07, 0x0D, 0x00, 0x08, 0x21, 0x40, 0x72, 0x00, 0xD8, 0xFF, 0xBD, 0x27,
11380x14, 0x00, 0xB1, 0xAF, 0x20, 0x00, 0xBF, 0xAF, 0x1C, 0x00, 0xB3, 0xAF,
11390x18, 0x00, 0xB2, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x02, 0x3C,
11400xC6, 0x5C, 0x43, 0x90, 0x02, 0x80, 0x07, 0x3C, 0x60, 0x1B, 0xE2, 0x24,
11410xFF, 0x00, 0x91, 0x30, 0x21, 0x20, 0x22, 0x02, 0x20, 0x00, 0x62, 0x30,
11420x10, 0x00, 0x63, 0x30, 0x63, 0x1D, 0x93, 0x90, 0x27, 0x00, 0x60, 0x10,
11430x00, 0x00, 0x00, 0x00, 0x8D, 0x1D, 0x82, 0x90, 0x7F, 0x1D, 0x83, 0x90,
11440x00, 0x00, 0x00, 0x00, 0x23, 0x10, 0x43, 0x00, 0x00, 0x36, 0x02, 0x00,
11450x03, 0x36, 0x06, 0x00, 0xFF, 0x00, 0x70, 0x30, 0x60, 0x1B, 0xE7, 0x24,
11460x21, 0x40, 0x27, 0x02, 0xB7, 0x1D, 0x02, 0x91, 0xB0, 0x1B, 0xE3, 0x84,
11470x0F, 0x00, 0x05, 0x3C, 0x0F, 0x00, 0x42, 0x30, 0x21, 0x10, 0x50, 0x00,
11480x0C, 0x08, 0x04, 0x24, 0x0F, 0x00, 0xC6, 0x30, 0x00, 0xFF, 0xA5, 0x34,
11490x06, 0x00, 0x60, 0x04, 0xFF, 0x00, 0x52, 0x30, 0xC5, 0x1D, 0x02, 0x91,
11500x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x42, 0x30, 0x21, 0x10, 0x50, 0x00,
11510xFF, 0x00, 0x50, 0x30, 0xC1, 0x43, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
11520xC5, 0x0C, 0x00, 0x0C, 0x21, 0x20, 0x60, 0x02, 0x21, 0x20, 0x00, 0x02,
11530x21, 0x28, 0x40, 0x02, 0x21, 0x30, 0x20, 0x02, 0x20, 0x00, 0xBF, 0x8F,
11540x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
11550x10, 0x00, 0xB0, 0x8F, 0xD6, 0x0C, 0x00, 0x08, 0x28, 0x00, 0xBD, 0x27,
11560xE0, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0xA9, 0x1D, 0x82, 0x90,
11570x9B, 0x1D, 0x83, 0x90, 0x4D, 0x0D, 0x00, 0x08, 0x23, 0x10, 0x43, 0x00,
11580xE0, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x02, 0x3C,
11590x18, 0x00, 0xBF, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0xD1, 0x5C, 0x43, 0x90,
11600x01, 0x00, 0x02, 0x24, 0x09, 0x00, 0x62, 0x10, 0xFF, 0x00, 0x90, 0x30,
11610x21, 0x30, 0x00, 0x02, 0x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
11620x10, 0x00, 0xB0, 0x8F, 0x18, 0x00, 0x04, 0x24, 0xFF, 0x03, 0x05, 0x24,
11630x83, 0x45, 0x00, 0x08, 0x20, 0x00, 0xBD, 0x27, 0x0F, 0x00, 0x05, 0x3C,
11640xFF, 0xFF, 0xA5, 0x34, 0x15, 0x00, 0x04, 0x24, 0x0A, 0x00, 0x03, 0x12,
11650xF4, 0xA8, 0x06, 0x34, 0x0F, 0x00, 0x05, 0x3C, 0x0B, 0x00, 0x02, 0x24,
11660xFF, 0xFF, 0xA5, 0x34, 0x05, 0x00, 0x02, 0x12, 0xF5, 0xF8, 0x06, 0x34,
11670x0F, 0x00, 0x05, 0x3C, 0xF4, 0xF8, 0x06, 0x34, 0x15, 0x00, 0x04, 0x24,
11680xFF, 0xFF, 0xA5, 0x34, 0x83, 0x45, 0x00, 0x0C, 0x0F, 0x00, 0x11, 0x3C,
11690x02, 0x80, 0x02, 0x3C, 0x48, 0xF5, 0x46, 0x90, 0xFE, 0x00, 0x03, 0x24,
11700x15, 0x00, 0x04, 0x24, 0xE3, 0xFF, 0xC3, 0x14, 0xFF, 0xFF, 0x25, 0x36,
11710xAC, 0x45, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x46, 0x30,
11720x00, 0xFF, 0x23, 0x36, 0x24, 0x10, 0x43, 0x00, 0x01, 0x00, 0xC6, 0x24,
11730x25, 0x30, 0x46, 0x00, 0xFF, 0xFF, 0x25, 0x36, 0x83, 0x45, 0x00, 0x0C,
11740x15, 0x00, 0x04, 0x24, 0x7F, 0x0D, 0x00, 0x08, 0x21, 0x30, 0x00, 0x02,
11750xFC, 0x00, 0x84, 0x30, 0x80, 0x00, 0x02, 0x24, 0x11, 0x00, 0x82, 0x10,
11760x06, 0x00, 0x03, 0x24, 0x81, 0x00, 0x82, 0x28, 0x10, 0x00, 0x40, 0x10,
11770xB0, 0x00, 0x02, 0x24, 0x20, 0x00, 0x02, 0x24, 0x0B, 0x00, 0x82, 0x10,
11780x02, 0x00, 0x03, 0x24, 0x21, 0x00, 0x82, 0x28, 0x15, 0x00, 0x40, 0x10,
11790x40, 0x00, 0x02, 0x24, 0x06, 0x00, 0x80, 0x10, 0x21, 0x18, 0x00, 0x00,
11800x01, 0x00, 0x03, 0x24, 0x10, 0x00, 0x02, 0x24, 0x02, 0x00, 0x82, 0x10,
11810x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03,
11820x21, 0x10, 0x60, 0x00, 0xFD, 0xFF, 0x82, 0x10, 0x09, 0x00, 0x03, 0x24,
11830xB1, 0x00, 0x82, 0x28, 0x0F, 0x00, 0x40, 0x10, 0xC8, 0x00, 0x02, 0x24,
11840x90, 0x00, 0x02, 0x24, 0xF7, 0xFF, 0x82, 0x10, 0x07, 0x00, 0x03, 0x24,
11850x08, 0x00, 0x03, 0x24, 0xB9, 0x0D, 0x00, 0x08, 0xA0, 0x00, 0x02, 0x24,
11860xF2, 0xFF, 0x82, 0x10, 0x04, 0x00, 0x03, 0x24, 0x41, 0x00, 0x82, 0x28,
11870x0F, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x24,
11880xB9, 0x0D, 0x00, 0x08, 0x30, 0x00, 0x02, 0x24, 0xEA, 0xFF, 0x82, 0x10,
11890x0C, 0x00, 0x03, 0x24, 0xC9, 0x00, 0x82, 0x28, 0x04, 0x00, 0x40, 0x10,
11900x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x03, 0x24, 0xB9, 0x0D, 0x00, 0x08,
11910xC0, 0x00, 0x02, 0x24, 0x0B, 0x00, 0x03, 0x24, 0xB9, 0x0D, 0x00, 0x08,
11920xD0, 0x00, 0x02, 0x24, 0x05, 0x00, 0x03, 0x24, 0xB9, 0x0D, 0x00, 0x08,
11930x50, 0x00, 0x02, 0x24, 0xD0, 0xFF, 0xBD, 0x27, 0x2C, 0x00, 0xBF, 0xAF,
11940x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
11950x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x08, 0x00, 0x83, 0x8C,
11960x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
11970x08, 0x00, 0x90, 0x94, 0x02, 0x80, 0x02, 0x3C, 0x21, 0x90, 0x80, 0x00,
11980x25, 0x80, 0x02, 0x02, 0xFF, 0x00, 0xB4, 0x30, 0x21, 0x20, 0x00, 0x02,
11990xFF, 0x00, 0xD1, 0x30, 0x21, 0x28, 0x00, 0x00, 0x08, 0x00, 0x06, 0x24,
12000xEC, 0x54, 0x00, 0x0C, 0xFF, 0x00, 0xF3, 0x30, 0x04, 0x00, 0x06, 0x8E,
12010x08, 0x00, 0x05, 0x8E, 0xFF, 0xDF, 0x02, 0x3C, 0xFF, 0xE0, 0x03, 0x24,
12020xFF, 0xFF, 0x42, 0x34, 0x24, 0x30, 0xC3, 0x00, 0x24, 0x28, 0xA2, 0x00,
12030x3F, 0xFF, 0x02, 0x3C, 0x10, 0x00, 0x08, 0x8E, 0xFF, 0xFF, 0x42, 0x34,
12040x00, 0x12, 0xC6, 0x34, 0x00, 0x40, 0x03, 0x3C, 0x24, 0x30, 0xC2, 0x00,
12050x05, 0x00, 0x07, 0x24, 0x04, 0x00, 0x02, 0x24, 0x0B, 0x38, 0x54, 0x00,
12060x25, 0x28, 0xA3, 0x00, 0x01, 0x00, 0x84, 0x32, 0x7F, 0xFF, 0x03, 0x24,
12070x00, 0x80, 0x02, 0x3C, 0x14, 0x00, 0x09, 0x8E, 0x24, 0x28, 0xA3, 0x00,
12080xC0, 0x21, 0x04, 0x00, 0x25, 0x40, 0x02, 0x01, 0x03, 0x00, 0x31, 0x32,
12090xFF, 0xE0, 0x02, 0x3C, 0x80, 0x8D, 0x11, 0x00, 0x25, 0x28, 0xA4, 0x00,
12100xFF, 0xFF, 0x42, 0x34, 0x0C, 0x00, 0x4A, 0x8E, 0x25, 0x30, 0xD1, 0x00,
12110xFF, 0x81, 0x03, 0x24, 0xE0, 0xFF, 0x04, 0x24, 0x24, 0x28, 0xA2, 0x00,
12120x3F, 0x00, 0x73, 0x32, 0xFB, 0xFF, 0x02, 0x3C, 0x24, 0x48, 0x23, 0x01,
12130x24, 0x30, 0xC4, 0x00, 0x00, 0x1E, 0x07, 0x00, 0x40, 0x9A, 0x13, 0x00,
12140xFF, 0xFF, 0x42, 0x34, 0x24, 0x40, 0x02, 0x01, 0x25, 0x48, 0x33, 0x01,
12150x25, 0x28, 0xA3, 0x00, 0x25, 0x30, 0xC7, 0x00, 0x20, 0x00, 0x02, 0x24,
12160x08, 0x00, 0x05, 0xAE, 0x00, 0x00, 0x0A, 0xA6, 0x02, 0x00, 0x02, 0xA2,
12170x10, 0x00, 0x08, 0xAE, 0x14, 0x00, 0x09, 0xAE, 0x04, 0x00, 0x06, 0xAE,
12180x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x02, 0x3C,
12190x98, 0x54, 0x42, 0x24, 0x04, 0x00, 0x43, 0x8C, 0x00, 0x00, 0x42, 0xAE,
12200x04, 0x00, 0x52, 0xAC, 0x00, 0x00, 0x72, 0xAC, 0x04, 0x00, 0x43, 0xAE,
12210x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x2C, 0x00, 0xBF, 0x8F,
12220x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
12230x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
12240x30, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
12250xFF, 0xFF, 0x90, 0x30, 0x10, 0x00, 0xA4, 0x27, 0x20, 0x00, 0xB2, 0xAF,
12260x1C, 0x00, 0xB1, 0xAF, 0x24, 0x00, 0xBF, 0xAF, 0xFF, 0x00, 0xB1, 0x30,
12270x8A, 0x40, 0x00, 0x0C, 0xFF, 0x00, 0xD2, 0x30, 0x00, 0x80, 0x02, 0x34,
12280x20, 0x00, 0x02, 0x12, 0x21, 0x20, 0x20, 0x02, 0x75, 0x0D, 0x00, 0x0C,
12290x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x03, 0x3C, 0x03, 0x02, 0x63, 0x34,
12300x00, 0x00, 0x62, 0x90, 0x00, 0x08, 0x04, 0x24, 0x01, 0x00, 0x05, 0x24,
12310x04, 0x00, 0x42, 0x34, 0x00, 0x00, 0x62, 0xA0, 0x35, 0x45, 0x00, 0x0C,
12320x21, 0x30, 0x00, 0x00, 0x00, 0x09, 0x04, 0x24, 0x01, 0x00, 0x05, 0x24,
12330x35, 0x45, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00, 0x84, 0x08, 0x04, 0x24,
12340xFF, 0xFF, 0x05, 0x24, 0x35, 0x45, 0x00, 0x0C, 0x58, 0x00, 0x06, 0x24,
12350x18, 0x00, 0x04, 0x24, 0x00, 0x0C, 0x05, 0x24, 0x83, 0x45, 0x00, 0x0C,
12360x01, 0x00, 0x06, 0x24, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
12370x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
12380x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
12390x01, 0x00, 0x02, 0x24, 0x02, 0x00, 0x42, 0x12, 0x02, 0x00, 0x24, 0x26,
12400xFE, 0xFF, 0x24, 0x26, 0x75, 0x0D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
12410x25, 0xB0, 0x07, 0x3C, 0x03, 0x02, 0xE7, 0x34, 0x00, 0x00, 0xE3, 0x90,
12420xFB, 0xFF, 0x02, 0x24, 0x00, 0x08, 0x04, 0x24, 0x24, 0x18, 0x62, 0x00,
12430x00, 0x00, 0xE3, 0xA0, 0x01, 0x00, 0x05, 0x24, 0x35, 0x45, 0x00, 0x0C,
12440x01, 0x00, 0x06, 0x24, 0x03, 0x00, 0x50, 0x32, 0x00, 0x09, 0x04, 0x24,
12450x01, 0x00, 0x05, 0x24, 0x35, 0x45, 0x00, 0x0C, 0x01, 0x00, 0x06, 0x24,
12460x42, 0x30, 0x10, 0x00, 0x00, 0x0A, 0x04, 0x24, 0x35, 0x45, 0x00, 0x0C,
12470x10, 0x00, 0x05, 0x24, 0x21, 0x30, 0x00, 0x02, 0x00, 0x0D, 0x04, 0x24,
12480x35, 0x45, 0x00, 0x0C, 0x00, 0x0C, 0x05, 0x24, 0x84, 0x08, 0x04, 0x24,
12490xFF, 0xFF, 0x05, 0x24, 0x35, 0x45, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x24,
12500x18, 0x00, 0x04, 0x24, 0x00, 0x0C, 0x05, 0x24, 0x83, 0x45, 0x00, 0x0C,
12510x21, 0x30, 0x00, 0x00, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
12520x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
12530x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
12540xD0, 0xFF, 0xBD, 0x27, 0x24, 0x00, 0xB3, 0xAF, 0x02, 0x80, 0x13, 0x3C,
12550x20, 0x00, 0xB2, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x60, 0x1B, 0x72, 0x26,
12560xFF, 0xFF, 0x90, 0x30, 0x10, 0x00, 0xA4, 0x27, 0x1C, 0x00, 0xB1, 0xAF,
12570x28, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0xFF, 0x00, 0xB1, 0x30,
12580xB0, 0x1B, 0x42, 0x96, 0x10, 0x00, 0xA4, 0x27, 0x00, 0x80, 0x42, 0x30,
12590x11, 0x00, 0x50, 0x10, 0x21, 0x30, 0x20, 0x02, 0xC4, 0x3D, 0x45, 0x92,
12600x3C, 0x0E, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x02, 0x00, 0x80, 0x02, 0x34,
12610x14, 0x00, 0x02, 0x12, 0x00, 0x80, 0x02, 0x24, 0xB0, 0x1B, 0x42, 0x96,
12620x3B, 0x41, 0x51, 0xA2, 0xFF, 0x7F, 0x42, 0x30, 0xB0, 0x1B, 0x42, 0xA6,
12630x60, 0x1B, 0x62, 0x26, 0xB0, 0x1B, 0x45, 0x94, 0xC4, 0x3D, 0x44, 0x90,
12640x38, 0x0D, 0x00, 0x0C, 0x00, 0x10, 0xA5, 0x30, 0x10, 0x00, 0xA4, 0x27,
12650x90, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0xBF, 0x8F,
12660x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
12670x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
12680xB0, 0x1B, 0x43, 0x96, 0x3B, 0x41, 0x51, 0xA2, 0x25, 0x18, 0x62, 0x00,
12690xB0, 0x0E, 0x00, 0x08, 0xB0, 0x1B, 0x43, 0xA6, 0xE0, 0xFF, 0xBD, 0x27,
12700x10, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x14, 0x00, 0xB1, 0xAF,
12710x18, 0x00, 0xBF, 0xAF, 0x53, 0x21, 0x00, 0x0C, 0x28, 0x00, 0x04, 0x24,
12720x02, 0x80, 0x04, 0x3C, 0x21, 0x88, 0x40, 0x00, 0x21, 0x28, 0x00, 0x02,
12730x06, 0x00, 0x06, 0x24, 0x15, 0x00, 0x40, 0x10, 0xAC, 0xE8, 0x84, 0x24,
12740x08, 0x00, 0x44, 0x94, 0x08, 0x00, 0x02, 0x24, 0x0C, 0x00, 0x22, 0xAE,
12750x02, 0x80, 0x02, 0x3C, 0x0C, 0x00, 0x03, 0x24, 0x25, 0x20, 0x82, 0x00,
12760x14, 0x00, 0x23, 0xAE, 0xF4, 0x54, 0x00, 0x0C, 0x20, 0x00, 0x84, 0x24,
12770x17, 0x0A, 0x00, 0x0C, 0x21, 0x20, 0x20, 0x02, 0x02, 0x80, 0x04, 0x3C,
12780x13, 0x58, 0x00, 0x0C, 0x04, 0xE9, 0x84, 0x24, 0x21, 0x10, 0x00, 0x00,
12790x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
12800x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x05, 0x3C,
12810x13, 0x58, 0x00, 0x0C, 0xEC, 0xE8, 0xA5, 0x24, 0xE0, 0x0E, 0x00, 0x08,
12820xFF, 0xFF, 0x02, 0x24, 0xD8, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB3, 0xAF,
12830x21, 0x98, 0x80, 0x00, 0x2C, 0x00, 0x04, 0x24, 0x18, 0x00, 0xB2, 0xAF,
12840x14, 0x00, 0xB1, 0xAF, 0x21, 0x90, 0xA0, 0x00, 0x20, 0x00, 0xBF, 0xAF,
12850x53, 0x21, 0x00, 0x0C, 0x10, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x04, 0x3C,
12860x02, 0x80, 0x05, 0x3C, 0x21, 0x88, 0x40, 0x00, 0x28, 0xE9, 0x84, 0x24,
12870x21, 0x30, 0x40, 0x02, 0x19, 0x00, 0x40, 0x10, 0x10, 0xE9, 0xA5, 0x24,
12880x05, 0x00, 0x65, 0x92, 0x13, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
12890x08, 0x00, 0x30, 0x96, 0x02, 0x80, 0x02, 0x3C, 0x0B, 0x00, 0x03, 0x24,
12900x25, 0x80, 0x02, 0x02, 0x20, 0x00, 0x10, 0x26, 0x0C, 0x00, 0x02, 0x24,
12910x21, 0x20, 0x00, 0x02, 0x0C, 0x00, 0x22, 0xAE, 0x14, 0x00, 0x23, 0xAE,
12920x21, 0x28, 0x60, 0x02, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
12930x08, 0x00, 0x12, 0xAE, 0x21, 0x20, 0x20, 0x02, 0x20, 0x00, 0xBF, 0x8F,
12940x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
12950x10, 0x00, 0xB0, 0x8F, 0x17, 0x0A, 0x00, 0x08, 0x28, 0x00, 0xBD, 0x27,
12960x02, 0x80, 0x04, 0x3C, 0x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
12970x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
12980xAC, 0xE8, 0x84, 0x24, 0x13, 0x58, 0x00, 0x08, 0x28, 0x00, 0xBD, 0x27,
12990xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xBF, 0xAF,
13000x10, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x02, 0x3C, 0xEE, 0x5D, 0x43, 0x90,
13010x02, 0x80, 0x11, 0x3C, 0x04, 0x00, 0x04, 0x24, 0x0F, 0x00, 0x63, 0x30,
13020x04, 0x00, 0x63, 0x28, 0x3A, 0x00, 0x60, 0x14, 0x01, 0x00, 0x05, 0x24,
13030x40, 0xDF, 0x23, 0x8E, 0x0F, 0x00, 0x05, 0x3C, 0x02, 0x80, 0x02, 0x3C,
13040xFF, 0xFF, 0xA5, 0x34, 0x24, 0x00, 0x04, 0x24, 0x60, 0x00, 0x06, 0x24,
13050x12, 0x00, 0x60, 0x14, 0x60, 0x1B, 0x50, 0x24, 0x83, 0x45, 0x00, 0x0C,
13060x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x05, 0x92, 0xD0, 0x07, 0x02, 0x24,
13070x01, 0x00, 0x03, 0x24, 0x0A, 0x10, 0x05, 0x00, 0x3C, 0x3A, 0x02, 0xAE,
13080x02, 0x80, 0x02, 0x3C, 0xED, 0x5D, 0x44, 0x90, 0x40, 0xDF, 0x23, 0xAE,
13090x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
13100x01, 0x00, 0x05, 0x24, 0xFF, 0x00, 0x84, 0x30, 0x4B, 0x2E, 0x00, 0x08,
13110x20, 0x00, 0xBD, 0x27, 0x0F, 0x00, 0x05, 0x3C, 0xFF, 0xFF, 0xA5, 0x34,
13120xAC, 0x45, 0x00, 0x0C, 0x24, 0x00, 0x04, 0x24, 0x49, 0x41, 0x04, 0x92,
13130xFF, 0x00, 0x43, 0x30, 0x00, 0x2C, 0x03, 0x00, 0x0A, 0x00, 0x64, 0x10,
13140x4A, 0x41, 0x02, 0xA2, 0x02, 0x80, 0x02, 0x3C, 0x49, 0xF5, 0x44, 0x90,
13150x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x04, 0x00, 0x12, 0x27, 0x00, 0x74,
13160x25, 0x20, 0xA4, 0x00, 0x4A, 0x41, 0x03, 0x92, 0x00, 0x00, 0x00, 0x00,
13170x49, 0x41, 0x03, 0xA2, 0x48, 0x41, 0x03, 0x92, 0x10, 0x27, 0x02, 0x24,
13180x40, 0xDF, 0x20, 0xAE, 0x0A, 0x10, 0x03, 0x00, 0x3C, 0x3A, 0x02, 0xAE,
13190x02, 0x80, 0x02, 0x3C, 0xED, 0x5D, 0x44, 0x90, 0x18, 0x00, 0xBF, 0x8F,
13200x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x05, 0x24,
13210xFF, 0x00, 0x84, 0x30, 0x4B, 0x2E, 0x00, 0x08, 0x20, 0x00, 0xBD, 0x27,
13220x4B, 0x2E, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x28, 0x0F, 0x00, 0x08,
13230x00, 0x00, 0x00, 0x00, 0xC8, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB2, 0xAF,
13240x10, 0x00, 0xB0, 0xAF, 0x34, 0x00, 0xBF, 0xAF, 0x30, 0x00, 0xBE, 0xAF,
13250x2C, 0x00, 0xB7, 0xAF, 0x28, 0x00, 0xB6, 0xAF, 0x24, 0x00, 0xB5, 0xAF,
13260x20, 0x00, 0xB4, 0xAF, 0x1C, 0x00, 0xB3, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
13270x21, 0x80, 0x80, 0x00, 0x45, 0x00, 0xA0, 0x14, 0x21, 0x90, 0x00, 0x00,
13280x08, 0x00, 0x82, 0x90, 0x02, 0x80, 0x13, 0x3C, 0x60, 0x1B, 0x63, 0x26,
13290x0F, 0x00, 0x42, 0x30, 0xC0, 0x40, 0x62, 0xAC, 0x25, 0xB0, 0x02, 0x3C,
13300x0A, 0x00, 0x10, 0x26, 0xD0, 0x01, 0x57, 0x34, 0x02, 0x80, 0x14, 0x3C,
13310xD8, 0x01, 0x5E, 0x34, 0xDC, 0x01, 0x55, 0x34, 0xD4, 0x01, 0x56, 0x34,
13320x03, 0x00, 0x11, 0x24, 0x00, 0x00, 0x06, 0x92, 0x60, 0x1B, 0x62, 0x26,
13330xB8, 0x40, 0x47, 0x90, 0x0F, 0x00, 0xC3, 0x30, 0x01, 0x00, 0x05, 0x92,
13340x18, 0x00, 0x67, 0x00, 0x03, 0x00, 0x04, 0x92, 0x02, 0x00, 0x02, 0x92,
13350x0F, 0x00, 0xA7, 0x30, 0x00, 0x3A, 0x07, 0x00, 0x02, 0x29, 0x05, 0x00,
13360x00, 0x22, 0x04, 0x00, 0x25, 0x20, 0x82, 0x00, 0x00, 0x2B, 0x05, 0x00,
13370x42, 0x11, 0x06, 0x00, 0x00, 0x24, 0x04, 0x00, 0x03, 0x00, 0x49, 0x30,
13380x02, 0x31, 0x06, 0x00, 0x01, 0x00, 0x02, 0x24, 0x01, 0x00, 0xC6, 0x30,
13390x12, 0x18, 0x00, 0x00, 0x0A, 0x00, 0x63, 0x24, 0xFF, 0x00, 0x63, 0x30,
13400x25, 0x18, 0x67, 0x00, 0x25, 0x18, 0x65, 0x00, 0x30, 0x00, 0x22, 0x11,
13410x25, 0x38, 0x64, 0x00, 0x02, 0x00, 0x22, 0x29, 0x3E, 0x00, 0x40, 0x14,
13420x02, 0x00, 0x02, 0x24, 0x38, 0x00, 0x22, 0x11, 0x03, 0x00, 0x02, 0x24,
13430x40, 0x00, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x20, 0x01,
13440x64, 0xE9, 0x84, 0x26, 0x13, 0x58, 0x00, 0x0C, 0xFF, 0xFF, 0x31, 0x26,
13450xD9, 0xFF, 0x21, 0x06, 0x04, 0x00, 0x10, 0x26, 0x25, 0xB0, 0x02, 0x3C,
13460xE7, 0x01, 0x42, 0x34, 0x00, 0x00, 0x52, 0xA0, 0x34, 0x00, 0xBF, 0x8F,
13470x30, 0x00, 0xBE, 0x8F, 0x2C, 0x00, 0xB7, 0x8F, 0x28, 0x00, 0xB6, 0x8F,
13480x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
13490x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
13500x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x13, 0x3C,
13510x08, 0x00, 0x83, 0x90, 0x60, 0x1B, 0x62, 0x26, 0xC0, 0x40, 0x44, 0x8C,
13520x0F, 0x00, 0x63, 0x30, 0xBB, 0xFF, 0x83, 0x14, 0x00, 0x00, 0x00, 0x00,
13530x34, 0x00, 0xBF, 0x8F, 0x30, 0x00, 0xBE, 0x8F, 0x2C, 0x00, 0xB7, 0x8F,
13540x28, 0x00, 0xB6, 0x8F, 0x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F,
13550x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
13560x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27,
13570x00, 0x00, 0xA7, 0xAE, 0x21, 0x20, 0x00, 0x00, 0x25, 0xB0, 0x08, 0x3C,
13580x07, 0x10, 0x92, 0x00, 0x01, 0x00, 0x42, 0x30, 0x01, 0x00, 0x84, 0x24,
13590x02, 0x00, 0x40, 0x10, 0x03, 0x00, 0x85, 0x2C, 0xD0, 0x01, 0x07, 0xAD,
13600xF9, 0xFF, 0xA0, 0x14, 0x04, 0x00, 0x08, 0x25, 0xA3, 0x0F, 0x00, 0x08,
13610x21, 0x28, 0x20, 0x01, 0x0D, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00,
13620xA2, 0x0F, 0x00, 0x08, 0x02, 0x00, 0x52, 0x36, 0xC7, 0xFF, 0x20, 0x15,
13630x21, 0x28, 0x20, 0x01, 0x0D, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00,
13640xA3, 0x0F, 0x00, 0x08, 0x04, 0x00, 0x52, 0x36, 0x06, 0x00, 0xC0, 0x10,
13650x00, 0x00, 0x00, 0x00, 0xA2, 0x0F, 0x00, 0x08, 0x01, 0x00, 0x52, 0x36,
13660x00, 0x00, 0xC7, 0xAE, 0xA3, 0x0F, 0x00, 0x08, 0x21, 0x28, 0x20, 0x01,
13670x00, 0x00, 0xE7, 0xAE, 0xA3, 0x0F, 0x00, 0x08, 0x21, 0x28, 0x20, 0x01,
13680x00, 0x00, 0xC7, 0xAF, 0xA3, 0x0F, 0x00, 0x08, 0x21, 0x28, 0x20, 0x01,
13690xB8, 0xFF, 0xBD, 0x27, 0x24, 0x00, 0xB1, 0xAF, 0x21, 0x88, 0x80, 0x00,
13700x00, 0x01, 0x04, 0x24, 0x2C, 0x00, 0xB3, 0xAF, 0x44, 0x00, 0xBF, 0xAF,
13710x40, 0x00, 0xBE, 0xAF, 0x3C, 0x00, 0xB7, 0xAF, 0x38, 0x00, 0xB6, 0xAF,
13720x34, 0x00, 0xB5, 0xAF, 0x30, 0x00, 0xB4, 0xAF, 0x28, 0x00, 0xB2, 0xAF,
13730x53, 0x21, 0x00, 0x0C, 0x20, 0x00, 0xB0, 0xAF, 0xAC, 0x00, 0x40, 0x10,
13740x21, 0x98, 0x40, 0x00, 0x08, 0x00, 0x50, 0x94, 0x02, 0x80, 0x02, 0x3C,
13750x21, 0x28, 0x20, 0x02, 0x25, 0x80, 0x02, 0x02, 0x24, 0x00, 0x04, 0x26,
13760x20, 0x00, 0x00, 0xA6, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
13770x02, 0x80, 0x05, 0x3C, 0x2A, 0x00, 0x04, 0x26, 0x48, 0x37, 0xA5, 0x24,
13780xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C,
13790xB4, 0x55, 0xA5, 0x24, 0x06, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C,
13800x30, 0x00, 0x04, 0x26, 0x20, 0x00, 0x03, 0x96, 0x02, 0x80, 0x02, 0x3C,
13810x60, 0x1B, 0x54, 0x24, 0x03, 0xFF, 0x63, 0x30, 0x50, 0x00, 0x63, 0x34,
13820x20, 0x00, 0x03, 0xA6, 0xE4, 0x1D, 0x82, 0x96, 0x02, 0x80, 0x03, 0x3C,
13830xB0, 0x55, 0x63, 0x24, 0x74, 0x00, 0x72, 0x24, 0xFF, 0x0F, 0x43, 0x30,
13840x00, 0x19, 0x03, 0x00, 0x01, 0x00, 0x42, 0x24, 0x02, 0x22, 0x03, 0x00,
13850xE4, 0x1D, 0x82, 0xA6, 0x20, 0x00, 0x11, 0x26, 0x20, 0x00, 0x02, 0x24,
13860x16, 0x00, 0x23, 0xA2, 0x17, 0x00, 0x24, 0xA2, 0x21, 0x20, 0x40, 0x02,
13870xFB, 0x51, 0x00, 0x0C, 0x0C, 0x00, 0x62, 0xAE, 0x40, 0x00, 0x11, 0x26,
13880x21, 0x20, 0x20, 0x02, 0x21, 0x28, 0x40, 0x00, 0xF4, 0x54, 0x00, 0x0C,
13890x02, 0x00, 0x06, 0x24, 0x0C, 0x00, 0x63, 0x8E, 0x21, 0x20, 0x40, 0x02,
13900x42, 0x00, 0x11, 0x26, 0x02, 0x00, 0x63, 0x24, 0x16, 0x52, 0x00, 0x0C,
13910x0C, 0x00, 0x63, 0xAE, 0x21, 0x28, 0x40, 0x00, 0x21, 0x20, 0x20, 0x02,
13920xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x24, 0x0C, 0x00, 0x63, 0x8E,
13930x02, 0x80, 0x02, 0x3C, 0xB0, 0x55, 0x42, 0x24, 0x02, 0x00, 0x63, 0x24,
13940x0C, 0x00, 0x63, 0xAE, 0x0C, 0x00, 0x46, 0x8C, 0x44, 0x00, 0x04, 0x26,
13950x0C, 0x00, 0x76, 0x26, 0x60, 0x00, 0x50, 0x24, 0x21, 0x28, 0x00, 0x00,
13960x10, 0x00, 0x47, 0x24, 0x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB6, 0xAF,
13970x21, 0x20, 0x00, 0x02, 0x1B, 0x53, 0x00, 0x0C, 0x21, 0x88, 0x40, 0x00,
13980x09, 0x00, 0x43, 0x2C, 0x08, 0x00, 0x06, 0x24, 0x21, 0x20, 0x20, 0x02,
13990x0B, 0x30, 0x43, 0x00, 0x21, 0x38, 0x00, 0x02, 0x01, 0x00, 0x05, 0x24,
14000x18, 0x00, 0xA3, 0xAF, 0x21, 0xB8, 0x40, 0x00, 0x25, 0x52, 0x00, 0x0C,
14010x10, 0x00, 0xB6, 0xAF, 0x21, 0x20, 0x40, 0x00, 0x02, 0x80, 0x02, 0x3C,
14020xB0, 0x55, 0x42, 0x24, 0x03, 0x00, 0x05, 0x24, 0x01, 0x00, 0x06, 0x24,
14030x48, 0x00, 0x47, 0x24, 0x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB6, 0xAF,
14040x21, 0x88, 0x40, 0x00, 0xC0, 0x3A, 0x82, 0x8E, 0x0C, 0x00, 0x10, 0x24,
14050x2B, 0x10, 0x02, 0x02, 0x3A, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
14060x26, 0x56, 0x5E, 0x24, 0x68, 0x10, 0x00, 0x08, 0x21, 0xA8, 0x80, 0x02,
14070x21, 0x10, 0x12, 0x02, 0x01, 0x00, 0x43, 0x90, 0xC0, 0x3A, 0xA4, 0x8E,
14080x21, 0x18, 0x70, 0x00, 0x02, 0x00, 0x70, 0x24, 0x2B, 0x20, 0x04, 0x02,
14090x2F, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x12, 0x02,
14100x00, 0x00, 0x47, 0x90, 0x02, 0x80, 0x14, 0x3C, 0x2D, 0x00, 0x03, 0x24,
14110x21, 0x28, 0x1E, 0x02, 0x64, 0x5C, 0x84, 0x26, 0xF1, 0xFF, 0xE3, 0x14,
14120x20, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
14130x04, 0x41, 0xA3, 0x96, 0x02, 0x80, 0x02, 0x3C, 0xC6, 0x5C, 0x47, 0x90,
14140xBD, 0xFF, 0x63, 0x30, 0x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x02, 0x3C,
14150x0C, 0x00, 0x63, 0x34, 0x01, 0x00, 0xE7, 0x30, 0x44, 0xDF, 0xA5, 0x24,
14160x67, 0x5C, 0x44, 0x24, 0x10, 0x00, 0x06, 0x24, 0x06, 0x00, 0xE0, 0x14,
14170x04, 0x41, 0xA3, 0xA6, 0x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x03, 0x3C,
14180x54, 0xDF, 0xA5, 0x24, 0x67, 0x5C, 0x64, 0x24, 0x10, 0x00, 0x06, 0x24,
14190xF4, 0x54, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x12, 0x02,
14200x01, 0x00, 0x46, 0x90, 0x21, 0x20, 0x20, 0x02, 0x64, 0x5C, 0x87, 0x26,
14210x2D, 0x00, 0x05, 0x24, 0x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB6, 0xAF,
14220x21, 0x88, 0x40, 0x00, 0x21, 0x10, 0x12, 0x02, 0x01, 0x00, 0x43, 0x90,
14230xC0, 0x3A, 0xA4, 0x8E, 0x21, 0x18, 0x70, 0x00, 0x02, 0x00, 0x70, 0x24,
14240x2B, 0x20, 0x04, 0x02, 0xD4, 0xFF, 0x80, 0x14, 0x21, 0x10, 0x12, 0x02,
14250x18, 0x00, 0xA2, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
14260x21, 0x20, 0x60, 0x02, 0x44, 0x00, 0xBF, 0x8F, 0x40, 0x00, 0xBE, 0x8F,
14270x3C, 0x00, 0xB7, 0x8F, 0x38, 0x00, 0xB6, 0x8F, 0x34, 0x00, 0xB5, 0x8F,
14280x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F, 0x28, 0x00, 0xB2, 0x8F,
14290x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x05, 0x24,
14300x21, 0x30, 0x00, 0x00, 0x21, 0x38, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x08,
14310x48, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
14320x44, 0x00, 0xBF, 0x8F, 0x40, 0x00, 0xBE, 0x8F, 0x3C, 0x00, 0xB7, 0x8F,
14330x38, 0x00, 0xB6, 0x8F, 0x34, 0x00, 0xB5, 0x8F, 0x30, 0x00, 0xB4, 0x8F,
14340x2C, 0x00, 0xB3, 0x8F, 0x28, 0x00, 0xB2, 0x8F, 0x24, 0x00, 0xB1, 0x8F,
14350x20, 0x00, 0xB0, 0x8F, 0x58, 0xE9, 0x84, 0x24, 0xAC, 0xE9, 0xA5, 0x24,
14360x13, 0x58, 0x00, 0x08, 0x48, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x03, 0x3C,
14370xB0, 0x55, 0x63, 0x24, 0x21, 0x20, 0x20, 0x02, 0xF8, 0xFF, 0xE6, 0x26,
14380x68, 0x00, 0x67, 0x24, 0x32, 0x00, 0x05, 0x24, 0x25, 0x52, 0x00, 0x0C,
14390x10, 0x00, 0xB6, 0xAF, 0x21, 0x20, 0x60, 0x02, 0x44, 0x00, 0xBF, 0x8F,
14400x40, 0x00, 0xBE, 0x8F, 0x3C, 0x00, 0xB7, 0x8F, 0x38, 0x00, 0xB6, 0x8F,
14410x34, 0x00, 0xB5, 0x8F, 0x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F,
14420x28, 0x00, 0xB2, 0x8F, 0x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F,
14430x01, 0x00, 0x05, 0x24, 0x21, 0x30, 0x00, 0x00, 0x21, 0x38, 0x00, 0x00,
14440xDF, 0x0D, 0x00, 0x08, 0x48, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27,
14450x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x20, 0x00, 0xBF, 0xAF,
14460x02, 0x00, 0x82, 0x90, 0x02, 0x80, 0x03, 0x3C, 0x10, 0x37, 0x65, 0x94,
14470x0F, 0x00, 0x42, 0x30, 0x00, 0x00, 0x83, 0x8C, 0xC0, 0x10, 0x02, 0x00,
14480x21, 0x20, 0x44, 0x00, 0x00, 0x10, 0xA8, 0x30, 0x02, 0x80, 0x02, 0x3C,
14490x00, 0x08, 0xA5, 0x30, 0xB0, 0x55, 0x51, 0x24, 0xFF, 0x3F, 0x63, 0x30,
14500x06, 0x00, 0xA0, 0x10, 0x18, 0x00, 0x90, 0x24, 0xE8, 0xFF, 0x67, 0x24,
14510x30, 0x00, 0x84, 0x24, 0x21, 0x28, 0x00, 0x00, 0x07, 0x00, 0x00, 0x11,
14520x10, 0x00, 0xA6, 0x27, 0x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
14530x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
14540x28, 0x00, 0xBD, 0x27, 0xAB, 0x1A, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
14550xF7, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x44, 0x24,
14560x10, 0x00, 0xA2, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x10,
14570x10, 0x00, 0x25, 0x26, 0x0C, 0x00, 0x26, 0x8E, 0x1D, 0x55, 0x00, 0x0C,
14580x00, 0x00, 0x00, 0x00, 0xED, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
14590x26, 0x53, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x02, 0xEE, 0x0F, 0x00, 0x0C,
14600x21, 0x20, 0x40, 0x00, 0xE8, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
14610xA0, 0xFF, 0xBD, 0x27, 0x58, 0x00, 0xBE, 0xAF, 0x5C, 0x00, 0xBF, 0xAF,
14620x54, 0x00, 0xB7, 0xAF, 0x50, 0x00, 0xB6, 0xAF, 0x4C, 0x00, 0xB5, 0xAF,
14630x48, 0x00, 0xB4, 0xAF, 0x44, 0x00, 0xB3, 0xAF, 0x40, 0x00, 0xB2, 0xAF,
14640x3C, 0x00, 0xB1, 0xAF, 0x38, 0x00, 0xB0, 0xAF, 0x00, 0x00, 0x82, 0x8C,
14650x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x46, 0x30, 0xE8, 0xFF, 0xC5, 0x24,
14660x01, 0x03, 0xA2, 0x2C, 0x16, 0x00, 0x40, 0x14, 0x21, 0xF0, 0x80, 0x00,
14670x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x63, 0x24, 0x40, 0x3E, 0x62, 0x8C,
14680x02, 0x80, 0x04, 0x3C, 0xD0, 0xE9, 0x84, 0x24, 0x01, 0x00, 0x42, 0x24,
14690x40, 0x3E, 0x62, 0xAC, 0x13, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
14700x5C, 0x00, 0xBF, 0x8F, 0x58, 0x00, 0xBE, 0x8F, 0x54, 0x00, 0xB7, 0x8F,
14710x50, 0x00, 0xB6, 0x8F, 0x4C, 0x00, 0xB5, 0x8F, 0x48, 0x00, 0xB4, 0x8F,
14720x44, 0x00, 0xB3, 0x8F, 0x40, 0x00, 0xB2, 0x8F, 0x3C, 0x00, 0xB1, 0x8F,
14730x38, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x60, 0x00, 0xBD, 0x27,
14740x7C, 0x00, 0xC4, 0x24, 0x5C, 0x00, 0xC6, 0x24, 0x53, 0x21, 0x00, 0x0C,
14750x24, 0x00, 0xA6, 0xAF, 0x74, 0x00, 0x40, 0x10, 0x20, 0x00, 0xA2, 0xAF,
14760x20, 0x00, 0xA3, 0x8F, 0x24, 0x00, 0xA6, 0x8F, 0x21, 0x28, 0x00, 0x00,
14770x08, 0x00, 0x62, 0x94, 0x02, 0x80, 0x03, 0x3C, 0x25, 0x10, 0x43, 0x00,
14780x20, 0x00, 0x57, 0x24, 0xE3, 0x54, 0x00, 0x0C, 0x21, 0x20, 0xE0, 0x02,
14790x02, 0x80, 0x03, 0x3C, 0xE8, 0xE9, 0x62, 0x24, 0xE8, 0xE9, 0x67, 0x90,
14800x01, 0x00, 0x44, 0x90, 0x02, 0x00, 0xC3, 0x93, 0x02, 0x00, 0x45, 0x90,
14810x03, 0x00, 0x46, 0x90, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x50, 0x24,
14820x00, 0x00, 0xC2, 0x8F, 0x00, 0x22, 0x04, 0x00, 0x0F, 0x00, 0x63, 0x30,
14830x25, 0x20, 0x87, 0x00, 0x00, 0x2C, 0x05, 0x00, 0xC0, 0x18, 0x03, 0x00,
14840x4B, 0x41, 0x07, 0x92, 0x21, 0x18, 0x7E, 0x00, 0x25, 0x28, 0xA4, 0x00,
14850xFF, 0x3F, 0x42, 0x30, 0x00, 0x36, 0x06, 0x00, 0x25, 0x30, 0xC5, 0x00,
14860x30, 0x00, 0xA2, 0xAF, 0x22, 0x00, 0x64, 0x24, 0x18, 0x00, 0x62, 0x24,
14870x10, 0x00, 0xA6, 0xAF, 0x2C, 0x00, 0xA4, 0xAF, 0x28, 0x00, 0xA2, 0xAF,
14880x53, 0x00, 0xE0, 0x14, 0x28, 0x00, 0x76, 0x24, 0x02, 0x80, 0x02, 0x3C,
14890x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x54, 0x24, 0xA5, 0x59, 0x73, 0x24,
14900x21, 0x90, 0x00, 0x00, 0x01, 0x00, 0x15, 0x24, 0x64, 0x11, 0x00, 0x08,
14910x21, 0x80, 0x00, 0x00, 0x1D, 0x55, 0x00, 0x0C, 0x01, 0x00, 0x52, 0x26,
14920x07, 0x00, 0x10, 0x26, 0x32, 0x00, 0x40, 0x10, 0x40, 0x00, 0x43, 0x2A,
14930x0C, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x88, 0x14, 0x02,
14940x44, 0x3E, 0x22, 0x92, 0x21, 0x20, 0x13, 0x02, 0x21, 0x28, 0xC0, 0x02,
14950xF4, 0xFF, 0x55, 0x10, 0x06, 0x00, 0x06, 0x24, 0x21, 0x20, 0x13, 0x02,
14960x21, 0x28, 0xC0, 0x02, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
14970x44, 0x3E, 0x35, 0xA2, 0x30, 0x00, 0xA4, 0x8F, 0x74, 0x00, 0xF4, 0x26,
14980x80, 0x00, 0xF3, 0x26, 0x5C, 0x00, 0x83, 0x24, 0xE8, 0xFF, 0x82, 0x24,
14990x1C, 0x00, 0xA2, 0xAF, 0x00, 0x00, 0xE3, 0xAE, 0x28, 0x00, 0xA3, 0x8F,
15000x1C, 0x00, 0xA2, 0x8F, 0x21, 0x20, 0x80, 0x02, 0x18, 0x00, 0x65, 0x24,
15010x21, 0x30, 0x40, 0x00, 0xF4, 0x54, 0x00, 0x0C, 0x70, 0x00, 0xE2, 0xAE,
15020x70, 0x00, 0xE7, 0x8E, 0x21, 0x20, 0x60, 0x02, 0x21, 0x28, 0x00, 0x00,
15030xF4, 0xFF, 0xE7, 0x24, 0xAB, 0x1A, 0x00, 0x0C, 0x1C, 0x00, 0xA6, 0x27,
15040x0F, 0x00, 0x40, 0x10, 0x21, 0x80, 0x40, 0x00, 0x02, 0x80, 0x04, 0x3C,
15050x60, 0x1B, 0x91, 0x24, 0x0C, 0x3E, 0x26, 0x8E, 0x00, 0x00, 0x00, 0x00,
15060x32, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xA2, 0x8F,
15070x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xC2, 0x10, 0x02, 0x80, 0x04, 0x3C,
15080xC0, 0x10, 0x12, 0x00, 0x23, 0x10, 0x52, 0x00, 0x21, 0x10, 0x51, 0x00,
15090x44, 0x3E, 0x40, 0xA0, 0x20, 0x00, 0xA4, 0x8F, 0x74, 0x21, 0x00, 0x0C,
15100x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0xBF, 0x8F, 0x58, 0x00, 0xBE, 0x8F,
15110x54, 0x00, 0xB7, 0x8F, 0x50, 0x00, 0xB6, 0x8F, 0x4C, 0x00, 0xB5, 0x8F,
15120x48, 0x00, 0xB4, 0x8F, 0x44, 0x00, 0xB3, 0x8F, 0x40, 0x00, 0xB2, 0x8F,
15130x3C, 0x00, 0xB1, 0x8F, 0x38, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
15140x60, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
15150xAC, 0xE8, 0x84, 0x24, 0x1B, 0x11, 0x00, 0x08, 0xBC, 0xE9, 0xA5, 0x24,
15160x02, 0x80, 0x04, 0x3C, 0xAC, 0x5C, 0x84, 0x24, 0x21, 0x28, 0xC0, 0x02,
15170x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0xA8, 0xFF, 0x40, 0x14,
15180x00, 0x00, 0x00, 0x00, 0x8A, 0x40, 0x00, 0x0C, 0x18, 0x00, 0xA4, 0x27,
15190x52, 0x41, 0x02, 0x92, 0x18, 0x00, 0xA4, 0x27, 0x01, 0x00, 0x42, 0x24,
15200x90, 0x40, 0x00, 0x0C, 0x52, 0x41, 0x02, 0xA2, 0x56, 0x11, 0x00, 0x08,
15210x02, 0x80, 0x02, 0x3C, 0x70, 0x59, 0x84, 0x24, 0x1D, 0x55, 0x00, 0x0C,
15220x02, 0x00, 0x05, 0x26, 0xD5, 0xFF, 0x40, 0x14, 0xC0, 0x10, 0x12, 0x00,
15230x01, 0x00, 0x06, 0x92, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0xC0, 0x14,
15240x10, 0x00, 0xE4, 0x26, 0x0C, 0x00, 0xE0, 0xAE, 0x02, 0x00, 0xC2, 0x97,
15250x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x42, 0x30, 0x04, 0x00, 0x42, 0x28,
15260x5E, 0x00, 0x40, 0x10, 0x21, 0x20, 0xC0, 0x03, 0x34, 0x00, 0xE0, 0xAE,
15270x60, 0x00, 0xF1, 0x26, 0x21, 0x20, 0x20, 0x02, 0x21, 0x28, 0x00, 0x00,
15280xE3, 0x54, 0x00, 0x0C, 0x10, 0x00, 0x06, 0x24, 0x70, 0x00, 0xE7, 0x8E,
15290x21, 0x20, 0x60, 0x02, 0x01, 0x00, 0x05, 0x24, 0xF4, 0xFF, 0xE7, 0x24,
15300xAB, 0x1A, 0x00, 0x0C, 0x1C, 0x00, 0xA6, 0x27, 0x06, 0x00, 0x40, 0x10,
15310x21, 0x90, 0x00, 0x00, 0x1C, 0x00, 0xA6, 0x8F, 0x02, 0x00, 0x45, 0x24,
15320xF4, 0x54, 0x00, 0x0C, 0x21, 0x20, 0x20, 0x02, 0x1C, 0x00, 0xB2, 0x8F,
15330x70, 0x00, 0xE7, 0x8E, 0x21, 0x20, 0x60, 0x02, 0x32, 0x00, 0x05, 0x24,
15340xF4, 0xFF, 0xE7, 0x24, 0xAB, 0x1A, 0x00, 0x0C, 0x1C, 0x00, 0xA6, 0x27,
15350x05, 0x00, 0x40, 0x10, 0x21, 0x20, 0xF2, 0x02, 0x1C, 0x00, 0xA6, 0x8F,
15360x60, 0x00, 0x84, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x45, 0x24,
15370x1C, 0x00, 0xA5, 0x8F, 0x21, 0x20, 0x20, 0x02, 0x61, 0x53, 0x00, 0x0C,
15380x21, 0x28, 0xB2, 0x00, 0x21, 0x18, 0x40, 0x00, 0x01, 0x00, 0x02, 0x24,
15390x40, 0x00, 0x62, 0x10, 0x03, 0x00, 0x02, 0x24, 0x38, 0x00, 0xE2, 0xAE,
15400x70, 0x00, 0xE7, 0x8E, 0x21, 0x20, 0x60, 0x02, 0x03, 0x00, 0x05, 0x24,
15410xF4, 0xFF, 0xE7, 0x24, 0xAB, 0x1A, 0x00, 0x0C, 0x1C, 0x00, 0xA6, 0x27,
15420x48, 0x00, 0xE0, 0xAE, 0x04, 0x00, 0x40, 0x10, 0x3C, 0x00, 0xE0, 0xAE,
15430x02, 0x00, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xE2, 0xAE,
15440xFB, 0x51, 0x00, 0x0C, 0x21, 0x20, 0x80, 0x02, 0x21, 0x28, 0x40, 0x00,
15450x40, 0x00, 0xE4, 0x26, 0xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x24,
15460x18, 0x52, 0x00, 0x0C, 0x21, 0x20, 0xE0, 0x02, 0xFF, 0xFF, 0x50, 0x30,
15470x01, 0x00, 0x02, 0x32, 0x1A, 0x00, 0x40, 0x10, 0x21, 0x28, 0xC0, 0x02,
15480x01, 0x00, 0x02, 0x24, 0x5C, 0x00, 0xE2, 0xAE, 0x2C, 0x00, 0xA5, 0x8F,
15490x04, 0x00, 0xE4, 0x26, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
15500x10, 0x00, 0x02, 0x32, 0x13, 0x00, 0x40, 0x10, 0x01, 0x00, 0x02, 0x24,
15510x30, 0x00, 0xE2, 0xAE, 0x02, 0x80, 0x03, 0x3C, 0x44, 0x00, 0xE0, 0xAE,
15520x60, 0x1B, 0x62, 0x24, 0x3C, 0x3E, 0x43, 0x8C, 0x20, 0x00, 0xA4, 0x8F,
15530x01, 0x00, 0x63, 0x24, 0x3C, 0x3E, 0x43, 0xAC, 0x24, 0x00, 0xA3, 0x8F,
15540x08, 0x00, 0x02, 0x24, 0x0C, 0x00, 0x83, 0xAC, 0x20, 0x00, 0xA3, 0x8F,
15550x17, 0x0A, 0x00, 0x0C, 0x14, 0x00, 0x62, 0xAC, 0x1D, 0x11, 0x00, 0x08,
15560x00, 0x00, 0x00, 0x00, 0x0A, 0x12, 0x00, 0x08, 0x5C, 0x00, 0xE0, 0xAE,
15570x11, 0x12, 0x00, 0x08, 0x30, 0x00, 0xE0, 0xAE, 0xE3, 0x17, 0x00, 0x0C,
15580x18, 0x00, 0xC5, 0x27, 0xC8, 0x11, 0x00, 0x08, 0x34, 0x00, 0xE2, 0xAE,
15590xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x05, 0x26, 0x01, 0x00, 0x03, 0x92,
15600xC1, 0x11, 0x00, 0x08, 0x0C, 0x00, 0xE3, 0xAE, 0xEF, 0x11, 0x00, 0x08,
15610x38, 0x00, 0xE3, 0xAE, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x44, 0x24,
15620xFC, 0x40, 0x83, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x60, 0x10,
15630x01, 0x00, 0x05, 0x24, 0xB6, 0x40, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00,
15640x08, 0x00, 0x42, 0x2C, 0x07, 0x00, 0x40, 0x10, 0x21, 0x28, 0x00, 0x00,
15650xC7, 0x3D, 0x83, 0x90, 0x01, 0x00, 0x02, 0x24, 0x03, 0x00, 0x62, 0x10,
15660x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
15670x01, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
15680x02, 0x80, 0x04, 0x3C, 0x60, 0x1B, 0x82, 0x24, 0x44, 0x41, 0x45, 0x8C,
15690x40, 0x41, 0x46, 0x8C, 0x21, 0x20, 0x40, 0x00, 0x40, 0x18, 0x05, 0x00,
15700x40, 0x10, 0x06, 0x00, 0x2B, 0x18, 0x66, 0x00, 0x2B, 0x38, 0x45, 0x00,
15710x04, 0x00, 0x60, 0x14, 0x21, 0x28, 0x00, 0x00, 0x01, 0x00, 0x05, 0x24,
15720x02, 0x00, 0x02, 0x24, 0x0A, 0x28, 0x47, 0x00, 0x21, 0x10, 0xA0, 0x00,
15730x40, 0x41, 0x80, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x44, 0x41, 0x80, 0xAC,
15740xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF,
15750x43, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0x40, 0x00,
15760x02, 0x80, 0x02, 0x3C, 0xCE, 0x5C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
15770x12, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x12, 0x00, 0x0C,
15780x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x24, 0x0D, 0x00, 0x43, 0x10,
15790x02, 0x80, 0x02, 0x3C, 0x16, 0x5C, 0x44, 0x90, 0x02, 0x80, 0x02, 0x3C,
15800xD4, 0xDD, 0x42, 0x24, 0x40, 0x18, 0x04, 0x00, 0x21, 0x18, 0x64, 0x00,
15810x21, 0x18, 0x70, 0x00, 0x80, 0x18, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
15820x00, 0x00, 0x64, 0x8C, 0x25, 0xB0, 0x02, 0x3C, 0xD8, 0x01, 0x42, 0x34,
15830x00, 0x00, 0x44, 0xAC, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
15840x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xE8, 0xFF, 0xBD, 0x27,
15850x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF, 0x21, 0x80, 0x80, 0x00,
15860x02, 0x00, 0x84, 0x90, 0x02, 0x80, 0x05, 0x3C, 0x48, 0x37, 0xA5, 0x24,
15870x0F, 0x00, 0x84, 0x30, 0xC0, 0x20, 0x04, 0x00, 0x21, 0x20, 0x90, 0x00,
15880x1C, 0x00, 0x84, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
15890x06, 0x00, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x10, 0x37, 0x43, 0x94,
15900x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x63, 0x30, 0x06, 0x00, 0x60, 0x14,
15910x21, 0x20, 0x00, 0x02, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
15920x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
15930x02, 0x11, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xBF, 0x8F,
15940x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
15950x18, 0x00, 0xBD, 0x27, 0x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
15960xE0, 0xFF, 0xBD, 0x27, 0x54, 0x4A, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34,
15970x18, 0x00, 0xB0, 0xAF, 0x1C, 0x00, 0xBF, 0xAF, 0x00, 0x00, 0x43, 0xAC,
15980x02, 0x00, 0x82, 0x90, 0x02, 0x80, 0x05, 0x3C, 0xB4, 0x55, 0xA5, 0x24,
15990x0F, 0x00, 0x42, 0x30, 0xC0, 0x10, 0x02, 0x00, 0x21, 0x10, 0x44, 0x00,
16000x28, 0x00, 0x44, 0x24, 0x06, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C,
16010x18, 0x00, 0x50, 0x24, 0x06, 0x00, 0x40, 0x10, 0x21, 0x20, 0x00, 0x02,
16020x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00,
16030x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0x39, 0x53, 0x00, 0x0C,
16040x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x48, 0x37, 0x84, 0x24,
16050x21, 0x28, 0x40, 0x00, 0x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
16060xF3, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x92,
16070x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x42, 0x30, 0xEE, 0xFF, 0x40, 0x10,
16080x10, 0x00, 0xA4, 0x27, 0x8A, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
16090x02, 0x80, 0x02, 0x3C, 0xEC, 0x5D, 0x43, 0x90, 0x05, 0x00, 0x02, 0x24,
16100xFF, 0x00, 0x63, 0x30, 0x05, 0x00, 0x62, 0x10, 0x02, 0x80, 0x02, 0x3C,
16110x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0xA9, 0x12, 0x00, 0x08,
16120x00, 0x00, 0x00, 0x00, 0x10, 0x37, 0x43, 0x94, 0x02, 0x80, 0x04, 0x3C,
16130x00, 0x01, 0x63, 0x30, 0xF8, 0xFF, 0x60, 0x10, 0x01, 0x00, 0x05, 0x24,
16140x07, 0x5E, 0x83, 0x90, 0xFB, 0xFF, 0x02, 0x24, 0x24, 0x18, 0x62, 0x00,
16150x07, 0x5E, 0x83, 0xA0, 0x02, 0x80, 0x02, 0x3C, 0xED, 0x5D, 0x44, 0x90,
16160x4B, 0x2E, 0x00, 0x0C, 0xFF, 0x00, 0x84, 0x30, 0x90, 0x40, 0x00, 0x0C,
16170x10, 0x00, 0xA4, 0x27, 0xA9, 0x12, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
16180xD8, 0xFF, 0xBD, 0x27, 0x28, 0x00, 0xA4, 0xA3, 0x00, 0x01, 0x04, 0x24,
16190x18, 0x00, 0xB2, 0xAF, 0x24, 0x00, 0xBF, 0xAF, 0x20, 0x00, 0xB4, 0xAF,
16200x1C, 0x00, 0xB3, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
16210x2C, 0x00, 0xA5, 0xA3, 0x53, 0x21, 0x00, 0x0C, 0x30, 0x00, 0xA6, 0xA7,
16220xA4, 0x00, 0x40, 0x10, 0x21, 0x90, 0x40, 0x00, 0x30, 0x00, 0xA7, 0x97,
16230x28, 0x00, 0xA5, 0x93, 0x2C, 0x00, 0xA6, 0x93, 0x02, 0x80, 0x04, 0x3C,
16240x13, 0x58, 0x00, 0x0C, 0xB0, 0xEA, 0x84, 0x24, 0x08, 0x00, 0x50, 0x96,
16250x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x11, 0x3C, 0x25, 0x80, 0x02, 0x02,
16260xB4, 0x55, 0x31, 0x26, 0x21, 0x28, 0x20, 0x02, 0x24, 0x00, 0x04, 0x26,
16270x06, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x20, 0x00, 0x00, 0xA6,
16280x02, 0x80, 0x05, 0x3C, 0x48, 0x37, 0xA5, 0x24, 0x2A, 0x00, 0x04, 0x26,
16290xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x21, 0x28, 0x20, 0x02,
16300x30, 0x00, 0x04, 0x26, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
16310x20, 0x00, 0x03, 0x96, 0x18, 0x00, 0x02, 0x24, 0x02, 0x80, 0x14, 0x3C,
16320x03, 0xFF, 0x63, 0x30, 0xD0, 0x00, 0x63, 0x34, 0x20, 0x00, 0x03, 0xA6,
16330x60, 0x1B, 0x93, 0x26, 0x0C, 0x00, 0x42, 0xAE, 0xE4, 0x1D, 0x62, 0x96,
16340x20, 0x00, 0x05, 0x26, 0x0C, 0x00, 0x51, 0x26, 0xFF, 0x0F, 0x43, 0x30,
16350x00, 0x19, 0x03, 0x00, 0x02, 0x22, 0x03, 0x00, 0x01, 0x00, 0x42, 0x24,
16360xE4, 0x1D, 0x62, 0xA6, 0x28, 0x00, 0xA6, 0x27, 0x16, 0x00, 0xA3, 0xA0,
16370x17, 0x00, 0xA4, 0xA0, 0x21, 0x38, 0x20, 0x02, 0x38, 0x00, 0x04, 0x26,
16380x4C, 0x52, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24, 0x21, 0x20, 0x40, 0x00,
16390x01, 0x00, 0x05, 0x24, 0x2C, 0x00, 0xA6, 0x27, 0x4C, 0x52, 0x00, 0x0C,
16400x21, 0x38, 0x20, 0x02, 0x28, 0x00, 0xA3, 0x93, 0x21, 0x20, 0x40, 0x00,
16410x03, 0x00, 0x02, 0x24, 0x12, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
16420x60, 0x1B, 0x82, 0x26, 0xB6, 0x40, 0x43, 0x90, 0x04, 0x00, 0x07, 0x24,
16430x21, 0x20, 0x40, 0x02, 0x01, 0x00, 0x63, 0x38, 0x0B, 0x38, 0x03, 0x00,
16440x21, 0x28, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00,
16450x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
16460x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
16470x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27, 0x2C, 0x00, 0xA3, 0x93,
16480x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x60, 0x14, 0x01, 0x00, 0x02, 0x24,
16490xC5, 0x40, 0x63, 0x92, 0x21, 0x80, 0x60, 0x02, 0x01, 0x00, 0x68, 0x24,
16500xFF, 0x00, 0x02, 0x31, 0xFD, 0xFF, 0x40, 0x10, 0x21, 0x18, 0x00, 0x01,
16510x02, 0x80, 0x06, 0x3C, 0x21, 0x38, 0x20, 0x02, 0xC5, 0x40, 0x08, 0xA2,
16520x25, 0x5C, 0xC6, 0x24, 0x4C, 0x52, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24,
16530xC8, 0x40, 0x08, 0x8E, 0x30, 0x00, 0xA4, 0x97, 0xC3, 0xFF, 0x03, 0x24,
16540x02, 0x00, 0x08, 0x35, 0x0F, 0x00, 0x84, 0x30, 0x24, 0x40, 0x03, 0x01,
16550x80, 0x20, 0x04, 0x00, 0xFF, 0xFF, 0x03, 0x3C, 0x3F, 0x00, 0x63, 0x34,
16560x25, 0x40, 0x04, 0x01, 0x24, 0x40, 0x03, 0x01, 0x00, 0x08, 0x08, 0x35,
16570x02, 0x80, 0x06, 0x3C, 0x21, 0x38, 0x20, 0x02, 0xC8, 0x40, 0x08, 0xAE,
16580x28, 0x5C, 0xC6, 0x24, 0x21, 0x20, 0x40, 0x00, 0x4C, 0x52, 0x00, 0x0C,
16590x02, 0x00, 0x05, 0x24, 0x02, 0x80, 0x06, 0x3C, 0x21, 0x38, 0x20, 0x02,
16600x2A, 0x5C, 0xC6, 0x24, 0x21, 0x20, 0x40, 0x00, 0x02, 0x00, 0x05, 0x24,
16610x4C, 0x52, 0x00, 0x0C, 0xCA, 0x40, 0x00, 0xA6, 0x30, 0x00, 0xA3, 0x97,
16620x21, 0x20, 0x40, 0x00, 0x02, 0x80, 0x06, 0x3C, 0x07, 0x00, 0x63, 0x30,
16630x40, 0x18, 0x03, 0x00, 0x21, 0x18, 0x70, 0x00, 0xD4, 0x1D, 0x62, 0x94,
16640x2C, 0x5C, 0xC6, 0x24, 0x21, 0x38, 0x20, 0x02, 0x00, 0x11, 0x02, 0x00,
16650x02, 0x00, 0x05, 0x24, 0x4C, 0x52, 0x00, 0x0C, 0xCC, 0x40, 0x02, 0xA6,
16660x22, 0x13, 0x00, 0x08, 0x60, 0x1B, 0x82, 0x26, 0xB5, 0xFF, 0x62, 0x14,
16670x02, 0x80, 0x06, 0x3C, 0x21, 0x38, 0x20, 0x02, 0x24, 0x5C, 0xC6, 0x24,
16680x4C, 0x52, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24, 0x21, 0x20, 0x40, 0x00,
16690x30, 0x00, 0xA6, 0x27, 0x21, 0x38, 0x20, 0x02, 0x4C, 0x52, 0x00, 0x0C,
16700x02, 0x00, 0x05, 0x24, 0xC8, 0x40, 0x68, 0x8E, 0xFF, 0xFF, 0x03, 0x3C,
16710x3F, 0x00, 0x63, 0x34, 0x24, 0x40, 0x03, 0x01, 0x00, 0x08, 0x08, 0x35,
16720x02, 0x80, 0x06, 0x3C, 0x21, 0x38, 0x20, 0x02, 0x21, 0x20, 0x40, 0x00,
16730x28, 0x5C, 0xC6, 0x24, 0x02, 0x00, 0x05, 0x24, 0x4C, 0x52, 0x00, 0x0C,
16740xC8, 0x40, 0x68, 0xAE, 0x02, 0x80, 0x06, 0x3C, 0x21, 0x20, 0x40, 0x00,
16750x2A, 0x5C, 0xC6, 0x24, 0x21, 0x38, 0x20, 0x02, 0x4C, 0x52, 0x00, 0x0C,
16760x02, 0x00, 0x05, 0x24, 0x22, 0x13, 0x00, 0x08, 0x60, 0x1B, 0x82, 0x26,
16770x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0xAC, 0xE8, 0x84, 0x24,
16780x13, 0x58, 0x00, 0x0C, 0xA0, 0xEA, 0xA5, 0x24, 0x24, 0x00, 0xBF, 0x8F,
16790x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
16800x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
16810x28, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xBF, 0xAF,
16820x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x00, 0x00, 0x82, 0x90,
16830x02, 0x80, 0x11, 0x3C, 0x21, 0x80, 0x80, 0x00, 0x60, 0x1B, 0x31, 0x26,
16840x02, 0x80, 0x04, 0x3C, 0x02, 0x00, 0x06, 0x24, 0x01, 0x00, 0x05, 0x26,
16850x28, 0x5C, 0x84, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0xC4, 0x40, 0x22, 0xA2,
16860x04, 0x00, 0x03, 0x92, 0x03, 0x00, 0x02, 0x92, 0x00, 0x1A, 0x03, 0x00,
16870x25, 0x18, 0x62, 0x00, 0xCA, 0x40, 0x23, 0xA6, 0x06, 0x00, 0x02, 0x92,
16880x05, 0x00, 0x03, 0x92, 0x00, 0x12, 0x02, 0x00, 0x25, 0x10, 0x43, 0x00,
16890xCC, 0x40, 0x22, 0xA6, 0x01, 0x00, 0x05, 0x92, 0x06, 0x00, 0x04, 0x92,
16900x05, 0x00, 0x02, 0x92, 0x82, 0x28, 0x05, 0x00, 0x00, 0x22, 0x04, 0x00,
16910x25, 0x20, 0x82, 0x00, 0x6A, 0x48, 0x00, 0x0C, 0x0F, 0x00, 0xA5, 0x30,
16920x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
16930x03, 0x00, 0x04, 0x24, 0x01, 0x00, 0x05, 0x24, 0x21, 0x30, 0x00, 0x00,
16940xD9, 0x12, 0x00, 0x08, 0x20, 0x00, 0xBD, 0x27, 0x00, 0x80, 0x03, 0x3C,
16950x25, 0xB0, 0x02, 0x3C, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x03, 0x42, 0x34,
16960xFC, 0x4E, 0x63, 0x24, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
16970x1C, 0x00, 0xBF, 0xAF, 0x18, 0x00, 0xB2, 0xAF, 0x00, 0x00, 0x43, 0xAC,
16980x02, 0x00, 0x82, 0x90, 0x02, 0x80, 0x05, 0x3C, 0xB4, 0x55, 0xA5, 0x24,
16990x0F, 0x00, 0x42, 0x30, 0xC0, 0x10, 0x02, 0x00, 0x21, 0x88, 0x44, 0x00,
17000x28, 0x00, 0x24, 0x26, 0x06, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C,
17010x18, 0x00, 0x30, 0x26, 0x08, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
17020x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
17030x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
17040x20, 0x00, 0xBD, 0x27, 0x39, 0x53, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x02,
17050x02, 0x80, 0x04, 0x3C, 0x48, 0x37, 0x84, 0x24, 0x21, 0x28, 0x40, 0x00,
17060x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0xF1, 0xFF, 0x40, 0x14,
17070x03, 0x00, 0x02, 0x24, 0x30, 0x00, 0x23, 0x92, 0x00, 0x00, 0x00, 0x00,
17080xED, 0xFF, 0x62, 0x14, 0x30, 0x00, 0x24, 0x26, 0x02, 0x80, 0x07, 0x3C,
17090x60, 0x1B, 0xE5, 0x24, 0xFC, 0x40, 0xA2, 0x8C, 0x00, 0x00, 0x00, 0x00,
17100xE7, 0xFF, 0x40, 0x10, 0x01, 0x00, 0x06, 0x24, 0x01, 0x00, 0x83, 0x90,
17110x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x66, 0x10, 0x02, 0x00, 0x62, 0x28,
17120x2E, 0x00, 0x40, 0x14, 0x02, 0x00, 0x02, 0x24, 0xDF, 0xFF, 0x62, 0x14,
17130x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00,
17140x08, 0x00, 0x62, 0x30, 0x0A, 0x00, 0x40, 0x14, 0x02, 0x11, 0x03, 0x00,
17150xC6, 0x40, 0xA3, 0x90, 0x04, 0x10, 0x46, 0x00, 0x27, 0x10, 0x02, 0x00,
17160x24, 0x10, 0x43, 0x00, 0xC6, 0x40, 0xA2, 0xA0, 0x05, 0x00, 0x83, 0x90,
17170x04, 0x00, 0x82, 0x90, 0x00, 0x1A, 0x03, 0x00, 0x25, 0x90, 0x62, 0x00,
17180xC6, 0x40, 0xA5, 0x90, 0x02, 0x80, 0x04, 0x3C, 0xCC, 0xEA, 0x84, 0x24,
17190x13, 0x58, 0x00, 0x0C, 0x21, 0x30, 0x40, 0x02, 0xD5, 0x13, 0x00, 0x08,
17200x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x82, 0x90, 0x05, 0x00, 0x83, 0x90,
17210x03, 0x00, 0x84, 0x90, 0x00, 0x12, 0x02, 0x00, 0x82, 0x18, 0x03, 0x00,
17220x25, 0x10, 0x44, 0x00, 0x15, 0x00, 0x40, 0x14, 0x07, 0x00, 0x64, 0x30,
17230xC6, 0x40, 0xA3, 0x90, 0x04, 0x10, 0x86, 0x00, 0x25, 0x10, 0x43, 0x00,
17240xC6, 0x40, 0xA2, 0xA0, 0x60, 0x1B, 0xE2, 0x24, 0xF8, 0x40, 0x43, 0x90,
17250xC6, 0x40, 0x45, 0x90, 0x02, 0x80, 0x04, 0x3C, 0x21, 0x18, 0x62, 0x00,
17260xDC, 0xEA, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C, 0xF0, 0x40, 0x60, 0xA0,
17270xD5, 0x13, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xB2, 0xFF, 0x60, 0x14,
17280x00, 0x00, 0x00, 0x00, 0x97, 0x13, 0x00, 0x0C, 0x32, 0x00, 0x24, 0x26,
17290xD5, 0x13, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x40, 0xA3, 0x90,
17300x04, 0x10, 0x86, 0x00, 0x27, 0x10, 0x02, 0x00, 0x17, 0x14, 0x00, 0x08,
17310x24, 0x10, 0x43, 0x00, 0xB8, 0xFF, 0xBD, 0x27, 0x38, 0x00, 0xB6, 0xAF,
17320xFF, 0xFF, 0x96, 0x30, 0x00, 0x01, 0x04, 0x24, 0x3C, 0x00, 0xB7, 0xAF,
17330x28, 0x00, 0xB2, 0xAF, 0x40, 0x00, 0xBF, 0xAF, 0x34, 0x00, 0xB5, 0xAF,
17340x30, 0x00, 0xB4, 0xAF, 0x2C, 0x00, 0xB3, 0xAF, 0x24, 0x00, 0xB1, 0xAF,
17350x53, 0x21, 0x00, 0x0C, 0x20, 0x00, 0xB0, 0xAF, 0x21, 0x90, 0x40, 0x00,
17360x81, 0x00, 0x40, 0x10, 0x21, 0xB8, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
17370x13, 0x58, 0x00, 0x0C, 0xF8, 0xEA, 0x84, 0x24, 0x08, 0x00, 0x50, 0x96,
17380x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x11, 0x3C, 0x25, 0x80, 0x02, 0x02,
17390xB4, 0x55, 0x31, 0x26, 0x24, 0x00, 0x04, 0x26, 0x21, 0x28, 0x20, 0x02,
17400x20, 0x00, 0x00, 0xA6, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
17410x02, 0x80, 0x05, 0x3C, 0x2A, 0x00, 0x04, 0x26, 0x48, 0x37, 0xA5, 0x24,
17420xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x30, 0x00, 0x04, 0x26,
17430x21, 0x28, 0x20, 0x02, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
17440x20, 0x00, 0x03, 0x96, 0x18, 0x00, 0x02, 0x24, 0x02, 0x80, 0x15, 0x3C,
17450x03, 0xFF, 0x63, 0x30, 0xB0, 0x00, 0x63, 0x34, 0x20, 0x00, 0x03, 0xA6,
17460x60, 0x1B, 0xA8, 0x26, 0x0C, 0x00, 0x42, 0xAE, 0xE4, 0x1D, 0x02, 0x95,
17470x20, 0x00, 0x14, 0x26, 0x0C, 0x00, 0x51, 0x26, 0xFF, 0x0F, 0x43, 0x30,
17480x00, 0x19, 0x03, 0x00, 0x02, 0x22, 0x03, 0x00, 0x01, 0x00, 0x42, 0x24,
17490xE4, 0x1D, 0x02, 0xA5, 0x17, 0x00, 0x84, 0xA2, 0x16, 0x00, 0x83, 0xA2,
17500x20, 0x40, 0x04, 0x8D, 0x03, 0x00, 0x02, 0x24, 0x31, 0x00, 0x82, 0x10,
17510x38, 0x00, 0x10, 0x26, 0x60, 0x1B, 0xB3, 0x26, 0x24, 0x40, 0x62, 0x8E,
17520x21, 0x20, 0x00, 0x02, 0x02, 0x00, 0x05, 0x24, 0x01, 0x00, 0x42, 0x38,
17530x01, 0x00, 0x42, 0x2C, 0x18, 0x00, 0xA6, 0x27, 0x21, 0x38, 0x20, 0x02,
17540x4C, 0x52, 0x00, 0x0C, 0x18, 0x00, 0xA2, 0xA7, 0x20, 0x40, 0x63, 0x8E,
17550x21, 0x20, 0x40, 0x00, 0x02, 0x00, 0x05, 0x24, 0x18, 0x00, 0xA6, 0x27,
17560x21, 0x38, 0x20, 0x02, 0x4C, 0x52, 0x00, 0x0C, 0x18, 0x00, 0xA3, 0xA7,
17570x21, 0x20, 0x40, 0x00, 0x02, 0x00, 0x05, 0x24, 0x18, 0x00, 0xA6, 0x27,
17580x21, 0x38, 0x20, 0x02, 0x4C, 0x52, 0x00, 0x0C, 0x18, 0x00, 0xB6, 0xA7,
17590x20, 0x40, 0x63, 0x8E, 0x21, 0x80, 0x40, 0x00, 0x03, 0x00, 0x02, 0x24,
17600x28, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0xA2, 0x26,
17610xB6, 0x40, 0x43, 0x90, 0x04, 0x00, 0x07, 0x24, 0x21, 0x20, 0x40, 0x02,
17620x01, 0x00, 0x63, 0x38, 0x21, 0x30, 0xE0, 0x02, 0x0B, 0x38, 0x03, 0x00,
17630xDF, 0x0D, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0x40, 0x00, 0xBF, 0x8F,
17640x3C, 0x00, 0xB7, 0x8F, 0x38, 0x00, 0xB6, 0x8F, 0x34, 0x00, 0xB5, 0x8F,
17650x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F, 0x28, 0x00, 0xB2, 0x8F,
17660x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
17670x48, 0x00, 0xBD, 0x27, 0xB0, 0x1B, 0x02, 0x95, 0x00, 0x00, 0x00, 0x00,
17680x40, 0x00, 0x42, 0x30, 0xCD, 0xFF, 0x40, 0x10, 0x60, 0x1B, 0xB3, 0x26,
17690x2C, 0x40, 0x03, 0x8D, 0x30, 0x40, 0x02, 0x8D, 0x21, 0x20, 0x00, 0x02,
17700x80, 0x1F, 0x03, 0x00, 0x25, 0x18, 0x43, 0x00, 0x04, 0x00, 0x05, 0x24,
17710x01, 0x00, 0x42, 0x24, 0x1C, 0x00, 0xA6, 0x27, 0x21, 0x38, 0x20, 0x02,
17720x30, 0x40, 0x02, 0xAD, 0x4C, 0x52, 0x00, 0x0C, 0x1C, 0x00, 0xA3, 0xAF,
17730x69, 0x14, 0x00, 0x08, 0x21, 0x80, 0x40, 0x00, 0xB0, 0x1B, 0x62, 0x96,
17740x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x42, 0x30, 0xD6, 0xFF, 0x40, 0x10,
17750x60, 0x1B, 0xA2, 0x26, 0x02, 0x80, 0x07, 0x3C, 0x21, 0x20, 0x00, 0x02,
17760x94, 0x5B, 0xE7, 0x24, 0x10, 0x00, 0x05, 0x24, 0x80, 0x00, 0x06, 0x24,
17770x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB1, 0xAF, 0x00, 0x00, 0x83, 0x96,
17780x01, 0x00, 0x17, 0x24, 0x00, 0x40, 0x63, 0x34, 0x85, 0x14, 0x00, 0x08,
17790x00, 0x00, 0x83, 0xA6, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
17800xAC, 0xE8, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C, 0xEC, 0xEA, 0xA5, 0x24,
17810x40, 0x00, 0xBF, 0x8F, 0x3C, 0x00, 0xB7, 0x8F, 0x38, 0x00, 0xB6, 0x8F,
17820x34, 0x00, 0xB5, 0x8F, 0x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F,
17830x28, 0x00, 0xB2, 0x8F, 0x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F,
17840x08, 0x00, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x27, 0xB0, 0xFF, 0xBD, 0x27,
17850x38, 0x00, 0xB4, 0xAF, 0x34, 0x00, 0xB3, 0xAF, 0x30, 0x00, 0xB2, 0xAF,
17860x2C, 0x00, 0xB1, 0xAF, 0x28, 0x00, 0xB0, 0xAF, 0x48, 0x00, 0xBF, 0xAF,
17870x44, 0x00, 0xB7, 0xAF, 0x40, 0x00, 0xB6, 0xAF, 0x3C, 0x00, 0xB5, 0xAF,
17880x02, 0x00, 0x82, 0x90, 0x02, 0x80, 0x12, 0x3C, 0x21, 0xA0, 0x80, 0x00,
17890x0F, 0x00, 0x42, 0x30, 0xC0, 0x10, 0x02, 0x00, 0x21, 0x80, 0x44, 0x00,
17900x28, 0x00, 0x11, 0x26, 0xB4, 0x55, 0x45, 0x26, 0x21, 0x20, 0x20, 0x02,
17910x06, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x18, 0x00, 0x13, 0x26,
17920x9F, 0x00, 0x40, 0x10, 0x21, 0x20, 0x60, 0x02, 0x02, 0x80, 0x15, 0x3C,
17930x60, 0x1B, 0xA2, 0x26, 0x4B, 0x41, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
17940x82, 0x00, 0x60, 0x10, 0x3C, 0x00, 0x04, 0x26, 0x60, 0x1B, 0xB0, 0x26,
17950xB0, 0x1B, 0x03, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x62, 0x30,
17960x6D, 0x00, 0x40, 0x14, 0x10, 0x00, 0x62, 0x30, 0x13, 0x00, 0x40, 0x14,
17970x10, 0x00, 0x76, 0x26, 0x60, 0x1B, 0xB0, 0x26, 0xB0, 0x1B, 0x02, 0x96,
17980x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x30, 0x8F, 0x00, 0x40, 0x14,
17990x21, 0x18, 0x00, 0x00, 0x48, 0x00, 0xBF, 0x8F, 0x44, 0x00, 0xB7, 0x8F,
18000x40, 0x00, 0xB6, 0x8F, 0x3C, 0x00, 0xB5, 0x8F, 0x38, 0x00, 0xB4, 0x8F,
18010x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F, 0x2C, 0x00, 0xB1, 0x8F,
18020x28, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
18030x50, 0x00, 0xBD, 0x27, 0x21, 0x20, 0xC0, 0x02, 0xB4, 0x55, 0x45, 0x26,
18040x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0xE9, 0xFF, 0x40, 0x14,
18050x07, 0x00, 0x02, 0x24, 0xB6, 0x40, 0x02, 0xA2, 0xE8, 0x39, 0x00, 0xAE,
18060x00, 0x00, 0x84, 0x8E, 0x0C, 0x00, 0x12, 0x24, 0xFF, 0x3F, 0x82, 0x30,
18070xE8, 0xFF, 0x42, 0x24, 0x2A, 0x10, 0x42, 0x02, 0x9C, 0x00, 0x40, 0x10,
18080x21, 0xB8, 0x00, 0x02, 0x1F, 0x15, 0x00, 0x08, 0x21, 0x80, 0x72, 0x02,
18090x19, 0x00, 0x03, 0x92, 0xFF, 0x3F, 0x82, 0x30, 0xE8, 0xFF, 0x42, 0x24,
18100x21, 0x18, 0x72, 0x00, 0x02, 0x00, 0x72, 0x24, 0x2A, 0x10, 0x42, 0x02,
18110x93, 0x00, 0x40, 0x10, 0x60, 0x1B, 0xB0, 0x26, 0x21, 0x80, 0x72, 0x02,
18120x18, 0x00, 0x03, 0x92, 0xDD, 0x00, 0x02, 0x24, 0xF4, 0xFF, 0x62, 0x14,
18130x1A, 0x00, 0x11, 0x26, 0x02, 0x80, 0x05, 0x3C, 0x64, 0xDE, 0xA5, 0x24,
18140x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18150x55, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x60, 0xDE, 0xA5, 0x24,
18160x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18170x4F, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x54, 0xDE, 0xA5, 0x24,
18180x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18190x44, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x50, 0xDE, 0xA5, 0x24,
18200x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18210x3E, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x4C, 0xDE, 0xA5, 0x24,
18220x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18230x38, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x44, 0xDE, 0xA5, 0x24,
18240x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18250x3B, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x40, 0xDE, 0xA5, 0x24,
18260x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18270x53, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x48, 0xDE, 0xA5, 0x24,
18280x21, 0x20, 0x20, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
18290x47, 0x01, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x21, 0x20, 0x20, 0x02,
18300x34, 0xDE, 0xA5, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x04, 0x00, 0x06, 0x24,
18310x2F, 0x01, 0x40, 0x10, 0x02, 0x00, 0x02, 0x24, 0x00, 0x00, 0x84, 0x8E,
18320x16, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x11, 0x00, 0x0C,
18330x21, 0x20, 0x80, 0x02, 0x21, 0x18, 0x00, 0x00, 0x48, 0x00, 0xBF, 0x8F,
18340x44, 0x00, 0xB7, 0x8F, 0x40, 0x00, 0xB6, 0x8F, 0x3C, 0x00, 0xB5, 0x8F,
18350x38, 0x00, 0xB4, 0x8F, 0x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F,
18360x2C, 0x00, 0xB1, 0x8F, 0x28, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00,
18370x08, 0x00, 0xE0, 0x03, 0x50, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x87, 0x8E,
18380x07, 0x00, 0x05, 0x24, 0xFF, 0x3F, 0xE7, 0x30, 0xDC, 0xFF, 0xE7, 0x24,
18390xAB, 0x1A, 0x00, 0x0C, 0x20, 0x00, 0xA6, 0x27, 0x78, 0xFF, 0x40, 0x10,
18400x21, 0x38, 0x40, 0x00, 0x20, 0x00, 0xA5, 0x8F, 0x00, 0x00, 0x00, 0x00,
18410x06, 0x00, 0xA2, 0x28, 0x73, 0xFF, 0x40, 0x14, 0xFD, 0xFF, 0xA5, 0x24,
18420x05, 0x00, 0xE4, 0x24, 0xE5, 0x4B, 0x00, 0x0C, 0xFF, 0x00, 0xA5, 0x30,
18430x02, 0x80, 0x04, 0x3C, 0xAC, 0x5C, 0x84, 0x24, 0x21, 0x28, 0x20, 0x02,
18440xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0xEC, 0x14, 0x00, 0x08,
18450x60, 0x1B, 0xB0, 0x26, 0xB9, 0x2B, 0x00, 0x0C, 0x21, 0x28, 0x80, 0x02,
18460xE6, 0x14, 0x00, 0x08, 0x02, 0x80, 0x15, 0x3C, 0xB4, 0x55, 0x45, 0x26,
18470x10, 0x00, 0x64, 0x26, 0x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
18480xD4, 0xFF, 0x40, 0x14, 0x21, 0x18, 0x00, 0x00, 0x21, 0x20, 0x80, 0x02,
18490xE3, 0x17, 0x00, 0x0C, 0x18, 0x00, 0x85, 0x26, 0x21, 0x20, 0x40, 0x00,
18500x8D, 0x17, 0x00, 0x0C, 0x05, 0x00, 0x05, 0x24, 0xB0, 0x1B, 0x03, 0x96,
18510x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x62, 0x30, 0x0C, 0x00, 0x40, 0x14,
18520x04, 0x00, 0x62, 0x30, 0x4B, 0x00, 0x40, 0x14, 0x60, 0x1B, 0xB0, 0x26,
18530xB7, 0x40, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x24,
18540xFF, 0x00, 0x83, 0x30, 0x15, 0x00, 0x02, 0x24, 0x5D, 0x00, 0x62, 0x10,
18550x21, 0x18, 0x00, 0x00, 0xF9, 0x14, 0x00, 0x08, 0xB7, 0x40, 0x04, 0xA2,
18560x8A, 0x40, 0x00, 0x0C, 0x24, 0x00, 0xA4, 0x27, 0xE8, 0x1E, 0x03, 0x8E,
18570xEC, 0x1E, 0x02, 0x8E, 0x24, 0x00, 0xA4, 0x27, 0x01, 0x00, 0x63, 0x24,
18580x01, 0x00, 0x42, 0x24, 0xEC, 0x1E, 0x02, 0xAE, 0x90, 0x40, 0x00, 0x0C,
18590xE8, 0x1E, 0x03, 0xAE, 0x9A, 0x15, 0x00, 0x08, 0x60, 0x1B, 0xB0, 0x26,
18600x60, 0x1B, 0xB0, 0x26, 0xB6, 0x40, 0x03, 0x92, 0x07, 0x00, 0x02, 0x24,
18610x21, 0x00, 0x62, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x04, 0x3C,
18620x5C, 0xEB, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
18630x02, 0x80, 0x02, 0x3C, 0xCE, 0x5C, 0x46, 0x90, 0x01, 0x00, 0x03, 0x24,
18640x0F, 0x00, 0xC3, 0x10, 0x60, 0x1B, 0xA4, 0x26, 0xD5, 0x4E, 0x00, 0x0C,
18650x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xBF, 0x8F, 0x44, 0x00, 0xB7, 0x8F,
18660x40, 0x00, 0xB6, 0x8F, 0x3C, 0x00, 0xB5, 0x8F, 0x38, 0x00, 0xB4, 0x8F,
18670x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F, 0x2C, 0x00, 0xB1, 0x8F,
18680x28, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
18690x50, 0x00, 0xBD, 0x27, 0xB6, 0x40, 0x83, 0x90, 0x03, 0x00, 0x02, 0x24,
18700x2A, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x41, 0x86, 0xA0,
18710xD5, 0x4E, 0x00, 0x0C, 0x3C, 0x41, 0x80, 0xA0, 0xBF, 0x15, 0x00, 0x08,
18720x00, 0x00, 0x00, 0x00, 0x5C, 0xDE, 0xA5, 0x24, 0x21, 0x20, 0xC0, 0x02,
18730x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24, 0x07, 0x00, 0x40, 0x10,
18740x02, 0x80, 0x05, 0x3C, 0x21, 0x20, 0xC0, 0x02, 0x58, 0xDE, 0xA5, 0x24,
18750x1D, 0x55, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24, 0xD5, 0xFF, 0x40, 0x14,
18760x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x70, 0xEB, 0x84, 0x24,
18770xB6, 0x15, 0x00, 0x08, 0xB6, 0x40, 0x00, 0xA2, 0x0A, 0x00, 0x76, 0x26,
18780x1F, 0x54, 0x00, 0x0C, 0x21, 0x20, 0xC0, 0x02, 0x20, 0x00, 0x10, 0x24,
18790x37, 0x00, 0x50, 0x10, 0x21, 0x88, 0x40, 0x00, 0x8A, 0x40, 0x00, 0x0C,
18800x24, 0x00, 0xA4, 0x27, 0x40, 0x10, 0x11, 0x00, 0x21, 0x10, 0x51, 0x00,
18810x60, 0x1B, 0xA4, 0x26, 0x00, 0x11, 0x02, 0x00, 0x21, 0x10, 0x44, 0x00,
18820xF8, 0x1D, 0x43, 0x8C, 0x24, 0x00, 0xA4, 0x27, 0x01, 0x00, 0x63, 0x24,
18830x90, 0x40, 0x00, 0x0C, 0xF8, 0x1D, 0x43, 0xAC, 0x60, 0x15, 0x00, 0x08,
18840x21, 0x18, 0x00, 0x00, 0x3C, 0x41, 0x86, 0xA0, 0xD5, 0x4E, 0x00, 0x0C,
18850x3D, 0x41, 0x80, 0xA0, 0xBF, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
18860x55, 0x12, 0x00, 0x0C, 0xB7, 0x40, 0x00, 0xA2, 0x02, 0x80, 0x02, 0x3C,
18870xD2, 0x5C, 0x44, 0x90, 0x02, 0x00, 0x03, 0x24, 0x5D, 0xFF, 0x83, 0x14,
18880x21, 0x18, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8E, 0x24, 0x00, 0x64, 0x26,
18890x2A, 0x00, 0x05, 0x24, 0xFF, 0x3F, 0xE7, 0x30, 0xDC, 0xFF, 0xE7, 0x24,
18900xAB, 0x1A, 0x00, 0x0C, 0x20, 0x00, 0xA6, 0x27, 0x54, 0xFF, 0x40, 0x10,
18910x21, 0x18, 0x00, 0x00, 0x02, 0x00, 0x44, 0x90, 0x00, 0x00, 0x00, 0x00,
18920x02, 0x00, 0x82, 0x30, 0x95, 0x00, 0x40, 0x10, 0x60, 0x1B, 0xA5, 0x26,
18930x01, 0x00, 0x82, 0x30, 0x92, 0x00, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C,
18940xD3, 0x5C, 0x44, 0x90, 0x01, 0x00, 0x03, 0x24, 0x9F, 0x00, 0x83, 0x10,
18950x00, 0x00, 0x00, 0x00, 0xFC, 0x23, 0x02, 0x8E, 0xFF, 0xEF, 0x03, 0x24,
18960x00, 0x08, 0x42, 0x34, 0x24, 0x10, 0x43, 0x00, 0xFC, 0x23, 0x02, 0xAE,
18970x60, 0x15, 0x00, 0x08, 0x21, 0x18, 0x00, 0x00, 0xFF, 0xFF, 0x04, 0x24,
18980xC7, 0x53, 0x00, 0x0C, 0x21, 0x28, 0xC0, 0x02, 0xC6, 0xFF, 0x50, 0x10,
18990x21, 0x88, 0x40, 0x00, 0x00, 0x00, 0x87, 0x8E, 0x24, 0x00, 0x77, 0x26,
19000x21, 0x20, 0xE0, 0x02, 0xFF, 0x3F, 0xE7, 0x30, 0xDC, 0xFF, 0xE7, 0x24,
19010x01, 0x00, 0x05, 0x24, 0xAB, 0x1A, 0x00, 0x0C, 0x20, 0x00, 0xA6, 0x27,
19020xCB, 0xFE, 0x40, 0x10, 0x21, 0x18, 0x00, 0x00, 0x20, 0x00, 0xA6, 0x8F,
19030x02, 0x00, 0x45, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
19040x00, 0x00, 0x87, 0x8E, 0x21, 0x20, 0xE0, 0x02, 0x32, 0x00, 0x05, 0x24,
19050xFF, 0x3F, 0xE7, 0x30, 0xDC, 0xFF, 0xE7, 0x24, 0x20, 0x00, 0xB0, 0x8F,
19060xAB, 0x1A, 0x00, 0x0C, 0x20, 0x00, 0xA6, 0x27, 0x08, 0x00, 0x40, 0x10,
19070x10, 0x00, 0xA4, 0x27, 0x20, 0x00, 0xA6, 0x8F, 0x21, 0x20, 0x90, 0x00,
19080xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x45, 0x24, 0x20, 0x00, 0xA3, 0x8F,
19090x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0x03, 0x02, 0x10, 0x00, 0xA4, 0x27,
19100x61, 0x53, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x02, 0x21, 0x28, 0x00, 0x02,
19110x10, 0x00, 0xA4, 0x27, 0xA6, 0x53, 0x00, 0x0C, 0x0F, 0x00, 0x53, 0x30,
19120x00, 0x00, 0x87, 0x8E, 0x21, 0x20, 0xE0, 0x02, 0x2D, 0x00, 0x05, 0x24,
19130xFF, 0x3F, 0xE7, 0x30, 0xDC, 0xFF, 0xE7, 0x24, 0x20, 0x00, 0xA6, 0x27,
19140xAB, 0x1A, 0x00, 0x0C, 0x21, 0x90, 0x40, 0x00, 0x11, 0x00, 0x40, 0x10,
19150x00, 0x81, 0x11, 0x00, 0x06, 0x00, 0x44, 0x90, 0x05, 0x00, 0x43, 0x90,
19160x02, 0x80, 0x02, 0x3C, 0xC6, 0x5C, 0x45, 0x90, 0x00, 0x1B, 0x03, 0x00,
19170x00, 0x25, 0x04, 0x00, 0x25, 0x18, 0x64, 0x00, 0x10, 0x00, 0xA5, 0x30,
19180x25, 0x90, 0x43, 0x02, 0x02, 0x00, 0xA0, 0x14, 0x0F, 0x00, 0x02, 0x3C,
19190xFF, 0x0F, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34, 0x24, 0x90, 0x42, 0x02,
19200x08, 0x00, 0x73, 0x36, 0x00, 0x81, 0x11, 0x00, 0x25, 0x80, 0x13, 0x02,
19210xFF, 0xFF, 0x10, 0x32, 0x02, 0x80, 0x04, 0x3C, 0x21, 0x28, 0x20, 0x02,
19220x21, 0x30, 0x00, 0x02, 0x21, 0x38, 0x40, 0x02, 0x13, 0x58, 0x00, 0x0C,
19230x8C, 0xEB, 0x84, 0x24, 0x21, 0x20, 0x00, 0x02, 0x63, 0x5E, 0x00, 0x74,
19240x21, 0x28, 0x40, 0x02, 0x60, 0x1B, 0xA3, 0x26, 0x3A, 0x41, 0x62, 0x90,
19250x21, 0x20, 0xC0, 0x02, 0x21, 0x28, 0x20, 0x02, 0x01, 0x00, 0x42, 0x24,
19260xEA, 0x0E, 0x00, 0x0C, 0x3A, 0x41, 0x62, 0xA0, 0xEA, 0x15, 0x00, 0x08,
19270x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x01, 0x00, 0x02, 0x24,
19280xA0, 0xEB, 0x84, 0x24, 0xB6, 0x15, 0x00, 0x08, 0xB6, 0x40, 0xE2, 0xA2,
19290x02, 0x80, 0x04, 0x3C, 0xB8, 0xEB, 0x84, 0x24, 0xB6, 0x15, 0x00, 0x08,
19300xB6, 0x40, 0xE0, 0xA2, 0x02, 0x80, 0x04, 0x3C, 0x60, 0x1B, 0xA3, 0x26,
19310x03, 0x00, 0x02, 0x24, 0xCC, 0xEB, 0x84, 0x24, 0xB6, 0x15, 0x00, 0x08,
19320xB6, 0x40, 0x62, 0xA0, 0x1E, 0x00, 0x03, 0x92, 0x00, 0x00, 0x00, 0x00,
19330x0A, 0x00, 0x62, 0x14, 0x02, 0x80, 0x04, 0x3C, 0x20, 0x00, 0x02, 0x92,
19340x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x30, 0x05, 0x00, 0x40, 0x10,
19350x02, 0x80, 0x02, 0x3C, 0xC8, 0xDF, 0x43, 0x8C, 0x00, 0x00, 0x00, 0x00,
19360x1A, 0x00, 0x60, 0x14, 0x11, 0x00, 0x03, 0x24, 0x13, 0x58, 0x00, 0x0C,
19370xE0, 0xEB, 0x84, 0x24, 0x05, 0x00, 0x02, 0x24, 0xB8, 0x15, 0x00, 0x08,
19380xB6, 0x40, 0xE2, 0xA2, 0x02, 0x80, 0x04, 0x3C, 0x60, 0x1B, 0xA3, 0x26,
19390x02, 0x00, 0x02, 0x24, 0xF8, 0xEB, 0x84, 0x24, 0xB6, 0x15, 0x00, 0x08,
19400xB6, 0x40, 0x62, 0xA0, 0x02, 0x80, 0x04, 0x3C, 0x60, 0x1B, 0xA3, 0x26,
19410x04, 0x00, 0x02, 0x24, 0x0C, 0xEC, 0x84, 0x24, 0xB6, 0x15, 0x00, 0x08,
19420xB6, 0x40, 0x62, 0xA0, 0xFC, 0x23, 0xA2, 0x8C, 0xFF, 0xEF, 0x03, 0x24,
19430xFF, 0xF7, 0x04, 0x24, 0x24, 0x10, 0x43, 0x00, 0x24, 0x10, 0x44, 0x00,
19440x21, 0x18, 0x00, 0x00, 0x60, 0x15, 0x00, 0x08, 0xFC, 0x23, 0xA2, 0xAC,
19450x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0x20, 0xEC, 0x84, 0x24,
19460x13, 0x58, 0x00, 0x0C, 0xC6, 0x5C, 0x43, 0xA0, 0x60, 0x1B, 0xA3, 0x26,
19470x06, 0x00, 0x02, 0x24, 0xB8, 0x15, 0x00, 0x08, 0xB6, 0x40, 0x62, 0xA0,
19480xFC, 0x23, 0x02, 0x8E, 0xFF, 0xF7, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00,
19490x00, 0x10, 0x42, 0x34, 0x1E, 0x16, 0x00, 0x08, 0xFC, 0x23, 0x02, 0xAE,
19500x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27,
19510x10, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x10, 0x3C, 0x60, 0x1B, 0x02, 0x26,
19520x14, 0x00, 0xBF, 0xAF, 0xB0, 0x1B, 0x43, 0x94, 0x21, 0x28, 0x00, 0x00,
19530x00, 0x01, 0x62, 0x30, 0x03, 0x00, 0x40, 0x10, 0x01, 0x00, 0x64, 0x30,
19540x06, 0x00, 0x80, 0x14, 0x00, 0x10, 0x62, 0x30, 0x14, 0x00, 0xBF, 0x8F,
19550x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0xA0, 0x00, 0x08, 0x00, 0xE0, 0x03,
19560x18, 0x00, 0xBD, 0x27, 0x08, 0x00, 0x40, 0x14, 0x60, 0x1B, 0x04, 0x26,
19570x02, 0x80, 0x02, 0x3C, 0xEE, 0x5D, 0x43, 0x90, 0x0C, 0x00, 0x02, 0x24,
19580x0F, 0x00, 0x63, 0x30, 0x09, 0x00, 0x62, 0x10, 0x21, 0x20, 0x00, 0x00,
19590x60, 0x1B, 0x04, 0x26, 0x60, 0xEA, 0x03, 0x34, 0x04, 0x3A, 0x83, 0xAC,
19600x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0xA0, 0x00,
19610x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x0E, 0x51, 0x00, 0x0C,
19620x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x04, 0x26, 0x60, 0xEA, 0x03, 0x34,
19630xDB, 0x16, 0x00, 0x08, 0x04, 0x3A, 0x83, 0xAC, 0xD8, 0xFF, 0xBD, 0x27,
19640x1C, 0x00, 0xB1, 0xAF, 0x02, 0x80, 0x11, 0x3C, 0x18, 0x00, 0xB0, 0xAF,
19650x20, 0x00, 0xBF, 0xAF, 0x60, 0x1B, 0x30, 0x26, 0x04, 0x3E, 0x02, 0x8E,
19660x00, 0x10, 0x03, 0x3C, 0x24, 0x10, 0x43, 0x00, 0x12, 0x00, 0x40, 0x10,
19670x00, 0x00, 0x00, 0x00, 0x33, 0x3E, 0x03, 0x92, 0x00, 0x00, 0x00, 0x00,
19680x01, 0x00, 0x63, 0x24, 0xFF, 0x00, 0x62, 0x30, 0x21, 0x10, 0x50, 0x00,
19690xD0, 0x3D, 0x45, 0x90, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xA4, 0x30,
19700x18, 0x00, 0x80, 0x10, 0x33, 0x3E, 0x03, 0xA2, 0xFF, 0x3D, 0x02, 0x92,
19710xC4, 0x3D, 0x05, 0xA2, 0x75, 0x0D, 0x00, 0x0C, 0xC5, 0x3D, 0x02, 0xA2,
19720xC4, 0x3D, 0x04, 0x92, 0x38, 0x0D, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24,
19730x08, 0x3E, 0x03, 0x8E, 0x01, 0x00, 0x02, 0x24, 0x52, 0x00, 0x62, 0x10,
19740x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x25, 0x26, 0x04, 0x3E, 0xA4, 0x8C,
19750x00, 0x10, 0x02, 0x3C, 0x3C, 0x00, 0x03, 0x24, 0x26, 0x20, 0x82, 0x00,
19760x94, 0x39, 0xA3, 0xAC, 0x04, 0x3E, 0xA4, 0xAC, 0x20, 0x00, 0xBF, 0x8F,
19770x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
19780x28, 0x00, 0xBD, 0x27, 0xB0, 0x1B, 0x02, 0x96, 0x00, 0x00, 0x00, 0x00,
19790xFF, 0xEF, 0x42, 0x30, 0x00, 0x01, 0x43, 0x30, 0x49, 0x00, 0x60, 0x14,
19800xB0, 0x1B, 0x02, 0xA6, 0x31, 0x3E, 0x06, 0x92, 0x37, 0x3E, 0x03, 0x92,
19810x32, 0x3E, 0x05, 0x92, 0x25, 0xB0, 0x02, 0x3C, 0x4C, 0x00, 0x42, 0x34,
19820x00, 0x00, 0x43, 0xA0, 0xFF, 0x00, 0xC4, 0x30, 0xC5, 0x3D, 0x05, 0xA2,
19830x75, 0x0D, 0x00, 0x0C, 0xC4, 0x3D, 0x06, 0xA2, 0xC4, 0x3D, 0x04, 0x92,
19840x38, 0x0D, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0xB0, 0x1B, 0x03, 0x96,
19850x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62, 0x30, 0x09, 0x00, 0x40, 0x10,
19860x01, 0x00, 0x62, 0x30, 0x08, 0x00, 0x40, 0x10, 0x60, 0x1B, 0x30, 0x26,
19870x02, 0x80, 0x02, 0x3C, 0xEE, 0x5D, 0x43, 0x90, 0x0C, 0x00, 0x02, 0x24,
19880x0F, 0x00, 0x63, 0x30, 0x58, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
19890x60, 0x1B, 0x30, 0x26, 0x34, 0x3E, 0x04, 0x96, 0x36, 0x3E, 0x05, 0x92,
19900x95, 0x0E, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x00, 0x0C,
19910x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xA4, 0x27, 0x8A, 0x40, 0x00, 0x0C,
19920x04, 0x3E, 0x00, 0xAE, 0xB0, 0x1B, 0x02, 0x96, 0x00, 0x00, 0x00, 0x00,
19930x00, 0x01, 0x42, 0x30, 0x2A, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
19940xEC, 0x5D, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x60, 0x10,
19950x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0xEE, 0x5D, 0x62, 0x90,
19960x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x42, 0x30, 0x04, 0x00, 0x42, 0x28,
19970x3A, 0x00, 0x40, 0x14, 0x04, 0x00, 0x04, 0x24, 0x02, 0x80, 0x03, 0x3C,
19980x0E, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x40, 0x14,
19990x00, 0x00, 0x00, 0x00, 0x0E, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
20000x01, 0x00, 0x42, 0x24, 0x0E, 0x5E, 0x62, 0xA0, 0x72, 0x17, 0x00, 0x08,
20010x60, 0x1B, 0x30, 0x26, 0xC4, 0x3D, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00,
20020x0C, 0x00, 0x42, 0x2C, 0xAB, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
20030x12, 0x49, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x17, 0x00, 0x08,
20040x60, 0x1B, 0x25, 0x26, 0x25, 0xB0, 0x05, 0x3C, 0x48, 0x00, 0xA5, 0x34,
20050x00, 0x00, 0xA3, 0x8C, 0x60, 0x1B, 0x24, 0x8E, 0x84, 0x00, 0x02, 0x3C,
20060x25, 0x18, 0x62, 0x00, 0x25, 0x00, 0x84, 0x34, 0x00, 0x00, 0xA3, 0xAC,
20070x18, 0x17, 0x00, 0x08, 0x60, 0x1B, 0x24, 0xAE, 0x02, 0x80, 0x02, 0x3C,
20080x0E, 0x5E, 0x40, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x64, 0x90,
20090x01, 0x00, 0x05, 0x24, 0x4B, 0x2E, 0x00, 0x0C, 0xFF, 0x00, 0x84, 0x30,
20100x60, 0x1B, 0x30, 0x26, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
20110x52, 0x41, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0x40, 0x14,
20120x00, 0x00, 0x00, 0x00, 0x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
20130x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0x2C, 0x59, 0x84, 0x24,
20140xA0, 0xDD, 0xA5, 0x24, 0x34, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C,
20150x4B, 0x41, 0x00, 0xA2, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
20160x0D, 0x17, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x2E, 0x00, 0x0C,
20170x01, 0x00, 0x05, 0x24, 0x4D, 0x17, 0x00, 0x08, 0x02, 0x80, 0x03, 0x3C,
20180x0E, 0x51, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00, 0x33, 0x17, 0x00, 0x08,
20190x60, 0x1B, 0x30, 0x26, 0x02, 0x80, 0x09, 0x3C, 0x60, 0x1B, 0x28, 0x25,
20200x6C, 0x37, 0x06, 0x8D, 0xFF, 0xFF, 0x02, 0x34, 0x44, 0x00, 0xC2, 0x10,
20210x21, 0x38, 0x80, 0x00, 0x2B, 0x10, 0xC7, 0x00, 0x34, 0x00, 0x40, 0x10,
20220x02, 0x19, 0x06, 0x00, 0x21, 0x10, 0xC7, 0x00, 0x23, 0x10, 0x43, 0x00,
20230x10, 0x00, 0x46, 0x24, 0x6C, 0x37, 0x06, 0xAD, 0x70, 0x37, 0x02, 0xAD,
20240x60, 0x1B, 0x26, 0x25, 0x05, 0x00, 0xC4, 0x90, 0xFF, 0xFF, 0x02, 0x34,
20250xFF, 0x00, 0x83, 0x30, 0x33, 0x00, 0x62, 0x10, 0x00, 0x11, 0x07, 0x00,
20260xFF, 0x00, 0x84, 0x30, 0x2B, 0x10, 0x87, 0x00, 0x20, 0x00, 0x40, 0x10,
20270x03, 0x19, 0x04, 0x00, 0x03, 0x11, 0x04, 0x00, 0x21, 0x18, 0x87, 0x00,
20280x23, 0x18, 0x62, 0x00, 0x10, 0x00, 0x64, 0x24, 0x05, 0x00, 0xC4, 0xA0,
20290x70, 0x37, 0xC3, 0xAC, 0xC0, 0x10, 0x05, 0x00, 0x21, 0x10, 0x45, 0x00,
20300x80, 0x10, 0x02, 0x00, 0x21, 0x10, 0x45, 0x00, 0x60, 0x1B, 0x23, 0x25,
20310x80, 0x10, 0x02, 0x00, 0x21, 0x28, 0x43, 0x00, 0xF8, 0x24, 0xA6, 0x8C,
20320x00, 0x21, 0x07, 0x00, 0xFF, 0xFF, 0xC2, 0x38, 0x0A, 0x30, 0x82, 0x00,
20330x2B, 0x18, 0xC7, 0x00, 0x07, 0x00, 0x60, 0x10, 0x21, 0x10, 0xC7, 0x00,
20340x02, 0x19, 0x06, 0x00, 0x23, 0x10, 0x43, 0x00, 0x10, 0x00, 0x46, 0x24,
20350xF8, 0x24, 0xA6, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0xFC, 0x24, 0xA2, 0xAC,
20360x02, 0x19, 0x06, 0x00, 0x23, 0x10, 0x43, 0x00, 0xF8, 0x24, 0xA2, 0xAC,
20370x08, 0x00, 0xE0, 0x03, 0xFC, 0x24, 0xA2, 0xAC, 0x21, 0x10, 0x87, 0x00,
20380x23, 0x10, 0x43, 0x00, 0x05, 0x00, 0xC2, 0xA0, 0xAB, 0x17, 0x00, 0x08,
20390x70, 0x37, 0xC2, 0xAC, 0x21, 0x10, 0xC7, 0x00, 0x23, 0x10, 0x43, 0x00,
20400x6C, 0x37, 0x02, 0xAD, 0x70, 0x37, 0x02, 0xAD, 0x60, 0x1B, 0x26, 0x25,
20410x05, 0x00, 0xC4, 0x90, 0xFF, 0xFF, 0x02, 0x34, 0xFF, 0x00, 0x83, 0x30,
20420xCF, 0xFF, 0x62, 0x14, 0x00, 0x11, 0x07, 0x00, 0x21, 0x20, 0x40, 0x00,
20430xA1, 0x17, 0x00, 0x08, 0x05, 0x00, 0xC2, 0xA0, 0x00, 0x31, 0x04, 0x00,
20440x93, 0x17, 0x00, 0x08, 0x6C, 0x37, 0x06, 0xAD, 0x63, 0x00, 0x82, 0x24,
20450x77, 0x00, 0x42, 0x2C, 0x00, 0x00, 0x85, 0x28, 0x04, 0x00, 0x40, 0x10,
20460x21, 0x18, 0x00, 0x00, 0x64, 0x00, 0x82, 0x24, 0x64, 0x00, 0x03, 0x24,
20470x0B, 0x18, 0x45, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
20480xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF, 0x0C, 0x00, 0x82, 0x8C,
20490x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x42, 0x30, 0x04, 0x00, 0x42, 0x28,
20500x08, 0x00, 0x40, 0x14, 0x25, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0xA4, 0x8C,
20510x10, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xBD, 0x27, 0x3F, 0x00, 0x84, 0x30,
20520x40, 0x20, 0x04, 0x00, 0xD9, 0x17, 0x00, 0x08, 0x96, 0xFF, 0x84, 0x24,
20530x24, 0x08, 0x42, 0x34, 0x00, 0x00, 0x43, 0x8C, 0x00, 0x00, 0x00, 0x00,
20540x00, 0x02, 0x63, 0x30, 0x1B, 0x00, 0x60, 0x14, 0x01, 0x00, 0x02, 0x24,
20550x05, 0x00, 0xA3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x82, 0x31, 0x03, 0x00,
20560x3C, 0x00, 0xC2, 0x10, 0x02, 0x00, 0xC2, 0x28, 0x57, 0x00, 0x40, 0x14,
20570x02, 0x00, 0x02, 0x24, 0x46, 0x00, 0xC2, 0x10, 0x03, 0x00, 0x02, 0x24,
20580x2E, 0x00, 0xC2, 0x10, 0x3E, 0x00, 0x63, 0x30, 0xD9, 0x17, 0x00, 0x0C,
20590x21, 0x20, 0xE0, 0x00, 0x06, 0x00, 0x45, 0x24, 0x65, 0x00, 0xA4, 0x2C,
20600x64, 0x00, 0x03, 0x24, 0x0A, 0x28, 0x64, 0x00, 0xDD, 0xFF, 0xA2, 0x24,
20610x08, 0x00, 0x42, 0x2C, 0x1F, 0x00, 0x40, 0x10, 0xE5, 0xFF, 0xA2, 0x24,
20620xFE, 0xFF, 0xA5, 0x24, 0x10, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0xA0, 0x00,
20630x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x05, 0x00, 0xA3, 0x90,
20640x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x66, 0x30, 0x42, 0x31, 0x06, 0x00,
20650x25, 0x00, 0xC2, 0x10, 0x02, 0x00, 0xC2, 0x28, 0x36, 0x00, 0x40, 0x14,
20660x02, 0x00, 0x02, 0x24, 0x2F, 0x00, 0xC2, 0x10, 0x03, 0x00, 0x02, 0x24,
20670xE6, 0xFF, 0xC2, 0x14, 0x1F, 0x00, 0x62, 0x30, 0x40, 0x10, 0x02, 0x00,
20680xD8, 0xFF, 0x03, 0x24, 0x23, 0x38, 0x62, 0x00, 0xD9, 0x17, 0x00, 0x0C,
20690x21, 0x20, 0xE0, 0x00, 0x06, 0x00, 0x45, 0x24, 0x65, 0x00, 0xA4, 0x2C,
20700x64, 0x00, 0x03, 0x24, 0x0A, 0x28, 0x64, 0x00, 0xDD, 0xFF, 0xA2, 0x24,
20710x08, 0x00, 0x42, 0x2C, 0xE3, 0xFF, 0x40, 0x14, 0xE5, 0xFF, 0xA2, 0x24,
20720x08, 0x00, 0x42, 0x2C, 0x06, 0x00, 0x40, 0x10, 0xF1, 0xFF, 0xA2, 0x24,
20730x0E, 0x18, 0x00, 0x08, 0xFA, 0xFF, 0xA5, 0x24, 0xD8, 0xFF, 0x02, 0x24,
20740x03, 0x18, 0x00, 0x08, 0x23, 0x38, 0x43, 0x00, 0x0C, 0x00, 0x42, 0x2C,
20750x0C, 0x00, 0x40, 0x10, 0xFB, 0xFF, 0xA2, 0x24, 0x0E, 0x18, 0x00, 0x08,
20760xF8, 0xFF, 0xA5, 0x24, 0x3E, 0x00, 0x63, 0x30, 0xFE, 0xFF, 0x02, 0x24,
20770x03, 0x18, 0x00, 0x08, 0x23, 0x38, 0x43, 0x00, 0x1F, 0x00, 0x62, 0x30,
20780x40, 0x10, 0x02, 0x00, 0xFE, 0xFF, 0x03, 0x24, 0x21, 0x18, 0x00, 0x08,
20790x23, 0x38, 0x62, 0x00, 0x0A, 0x00, 0x42, 0x2C, 0xCB, 0xFF, 0x40, 0x10,
20800x00, 0x00, 0x00, 0x00, 0x0E, 0x18, 0x00, 0x08, 0xFC, 0xFF, 0xA5, 0x24,
20810x3E, 0x00, 0x63, 0x30, 0xEC, 0xFF, 0x02, 0x24, 0x03, 0x18, 0x00, 0x08,
20820x23, 0x38, 0x43, 0x00, 0x1F, 0x00, 0x62, 0x30, 0x40, 0x10, 0x02, 0x00,
20830xEC, 0xFF, 0x03, 0x24, 0x21, 0x18, 0x00, 0x08, 0x23, 0x38, 0x62, 0x00,
20840xB3, 0xFF, 0xC0, 0x14, 0x1F, 0x00, 0x62, 0x30, 0x40, 0x10, 0x02, 0x00,
20850x0E, 0x00, 0x03, 0x24, 0x21, 0x18, 0x00, 0x08, 0x23, 0x38, 0x62, 0x00,
20860xAD, 0xFF, 0xC0, 0x14, 0x3E, 0x00, 0x63, 0x30, 0x0E, 0x00, 0x02, 0x24,
20870x03, 0x18, 0x00, 0x08, 0x23, 0x38, 0x43, 0x00, 0x98, 0xFF, 0xBD, 0x27,
20880x64, 0x00, 0xBF, 0xAF, 0x60, 0x00, 0xBE, 0xAF, 0x5C, 0x00, 0xB7, 0xAF,
20890x58, 0x00, 0xB6, 0xAF, 0x54, 0x00, 0xB5, 0xAF, 0x50, 0x00, 0xB4, 0xAF,
20900x4C, 0x00, 0xB3, 0xAF, 0x48, 0x00, 0xB2, 0xAF, 0x44, 0x00, 0xB1, 0xAF,
20910x40, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x02, 0x3C, 0x88, 0x54, 0x45, 0x8C,
20920x00, 0x80, 0x04, 0x3C, 0x68, 0x61, 0x83, 0x24, 0x88, 0x54, 0x44, 0x24,
20930x25, 0xB0, 0x02, 0x3C, 0x18, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
20940x81, 0x00, 0xA4, 0x10, 0x02, 0x80, 0x02, 0x3C, 0xE8, 0xEC, 0x42, 0x24,
20950x00, 0x00, 0x5E, 0x8C, 0x02, 0x80, 0x03, 0x3C, 0xEC, 0xEC, 0x63, 0x24,
20960x00, 0x00, 0x75, 0x8C, 0x28, 0x39, 0xD6, 0x8F, 0x21, 0xB8, 0x00, 0x00,
20970x08, 0x00, 0xC2, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xAE,
20980x08, 0x00, 0xC3, 0x96, 0x02, 0x80, 0x02, 0x3C, 0x9E, 0x18, 0x00, 0x08,
20990x25, 0xA0, 0x62, 0x00, 0x17, 0x00, 0x25, 0x92, 0x16, 0x00, 0x26, 0x92,
21000xC8, 0x3D, 0xC2, 0x97, 0xFF, 0x00, 0xA3, 0x30, 0x00, 0x1A, 0x03, 0x00,
21010xFF, 0x00, 0xC4, 0x30, 0x25, 0x18, 0x64, 0x00, 0x14, 0x00, 0x43, 0x10,
21020xFF, 0x00, 0xA2, 0x30, 0xFF, 0x00, 0xC3, 0x30, 0x00, 0x12, 0x02, 0x00,
21030x25, 0x10, 0x43, 0x00, 0xC8, 0x3D, 0xC2, 0xA7, 0x01, 0x00, 0x24, 0x92,
21040x18, 0x00, 0x42, 0x92, 0x00, 0x22, 0x04, 0x00, 0xA8, 0x0D, 0x00, 0x0C,
21050x25, 0x20, 0x82, 0x00, 0x40, 0x18, 0x02, 0x00, 0x21, 0x18, 0x62, 0x00,
21060x02, 0x80, 0x04, 0x3C, 0x98, 0xDE, 0x82, 0x24, 0x80, 0x18, 0x03, 0x00,
21070x21, 0x18, 0x62, 0x00, 0x08, 0x00, 0x62, 0x8C, 0x00, 0x00, 0x00, 0x00,
21080x09, 0xF8, 0x40, 0x00, 0x21, 0x20, 0x60, 0x02, 0x0C, 0x00, 0xC2, 0x8E,
21090x00, 0x00, 0x00, 0x00, 0x2B, 0x10, 0xE2, 0x02, 0x41, 0x00, 0x40, 0x10,
21100x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x8E, 0x02, 0x80, 0x03, 0x3C,
21110x48, 0x37, 0x64, 0x24, 0x42, 0x1B, 0x02, 0x00, 0x78, 0x00, 0x63, 0x30,
21120x02, 0x2E, 0x02, 0x00, 0xFF, 0x3F, 0x42, 0x30, 0x21, 0x10, 0x43, 0x00,
21130x03, 0x00, 0xA5, 0x30, 0x21, 0x10, 0x45, 0x00, 0x18, 0x00, 0x42, 0x24,
21140xFF, 0xFF, 0x50, 0x30, 0x7F, 0x00, 0x02, 0x32, 0x21, 0x98, 0x80, 0x02,
21150x06, 0x00, 0x06, 0x24, 0x80, 0x00, 0x03, 0x26, 0x00, 0x00, 0xB0, 0xAE,
21160x02, 0x00, 0x40, 0x10, 0x80, 0xFF, 0x05, 0x32, 0x80, 0xFF, 0x65, 0x30,
21170x00, 0x00, 0xA5, 0xAE, 0x02, 0x00, 0x62, 0x96, 0x21, 0x18, 0xE5, 0x02,
21180xFF, 0xFF, 0x77, 0x30, 0x0F, 0x00, 0x42, 0x30, 0x00, 0x00, 0xA2, 0xAE,
21190x00, 0x00, 0x63, 0x8E, 0x21, 0xA0, 0x85, 0x02, 0x42, 0x13, 0x03, 0x00,
21200x78, 0x00, 0x42, 0x30, 0x02, 0x1E, 0x03, 0x00, 0x03, 0x00, 0x63, 0x30,
21210x21, 0x10, 0x53, 0x00, 0x21, 0x90, 0x43, 0x00, 0x1C, 0x00, 0x50, 0x26,
21220x18, 0x00, 0x51, 0x26, 0x21, 0x28, 0x00, 0x02, 0x00, 0x00, 0xB1, 0xAE,
21230x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C,
21240x21, 0x28, 0x00, 0x02, 0x06, 0x00, 0x06, 0x24, 0x0B, 0x00, 0x40, 0x14,
21250x90, 0xDE, 0x64, 0x24, 0x01, 0x00, 0x22, 0x92, 0x00, 0x00, 0x00, 0x00,
21260x00, 0x12, 0x02, 0x00, 0x00, 0x08, 0x42, 0x30, 0xAD, 0xFF, 0x40, 0x14,
21270x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x26, 0x92, 0x17, 0x00, 0x25, 0x92,
21280x86, 0x18, 0x00, 0x08, 0xFF, 0x00, 0xA2, 0x30, 0x1D, 0x55, 0x00, 0x0C,
21290x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
21300x0C, 0x00, 0xC2, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x10, 0xE2, 0x02,
21310xC1, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x40, 0x00, 0x0C,
21320x38, 0x00, 0xA4, 0x27, 0x04, 0x00, 0xC3, 0x8E, 0x00, 0x00, 0xC2, 0x8E,
21330x21, 0x20, 0xC0, 0x02, 0x00, 0x00, 0x62, 0xAC, 0x04, 0x00, 0x43, 0xAC,
21340x00, 0x00, 0xD6, 0xAE, 0x74, 0x21, 0x00, 0x0C, 0x04, 0x00, 0xD6, 0xAE,
21350x90, 0x40, 0x00, 0x0C, 0x38, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x02, 0x3C,
21360x88, 0x54, 0x43, 0x8C, 0x88, 0x54, 0x42, 0x24, 0x86, 0xFF, 0x62, 0x14,
21370x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C, 0xE8, 0xEC, 0x63, 0x24,
21380x00, 0x00, 0x71, 0x8C, 0x25, 0xB0, 0x10, 0x3C, 0x04, 0x01, 0x02, 0x36,
21390x00, 0x00, 0x43, 0x8C, 0xDC, 0x38, 0x27, 0x8E, 0x00, 0x00, 0x00, 0x00,
21400x77, 0x00, 0xE3, 0x10, 0xE0, 0x38, 0x23, 0xAE, 0x2B, 0x10, 0x67, 0x00,
21410x81, 0x00, 0x40, 0x14, 0x2B, 0x10, 0xE3, 0x00, 0xA9, 0x00, 0x40, 0x14,
21420x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x44, 0x24, 0xB0, 0x38, 0x83, 0x94,
21430x02, 0x80, 0x02, 0x3C, 0x21, 0x80, 0x00, 0x00, 0x34, 0x00, 0xE0, 0x1A,
21440x25, 0x90, 0x62, 0x00, 0x21, 0x88, 0x80, 0x00, 0x21, 0x18, 0x00, 0x00,
21450x01, 0x00, 0x14, 0x24, 0x00, 0xC0, 0x15, 0x3C, 0x0E, 0x19, 0x00, 0x08,
21460x03, 0x00, 0x1E, 0x24, 0x80, 0x18, 0x10, 0x00, 0x2A, 0x10, 0x77, 0x00,
21470x2A, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x98, 0x72, 0x00,
21480x00, 0x00, 0x62, 0x8E, 0x44, 0x41, 0x23, 0x8E, 0x38, 0x00, 0xA4, 0x27,
21490xFF, 0x3F, 0x42, 0x30, 0x21, 0x18, 0x62, 0x00, 0x8A, 0x40, 0x00, 0x0C,
21500x44, 0x41, 0x23, 0xAE, 0xE8, 0x1E, 0x22, 0x8E, 0xF0, 0x1E, 0x23, 0x8E,
21510x38, 0x00, 0xA4, 0x27, 0x01, 0x00, 0x42, 0x24, 0x01, 0x00, 0x63, 0x24,
21520xE8, 0x1E, 0x22, 0xAE, 0x90, 0x40, 0x00, 0x0C, 0xF0, 0x1E, 0x23, 0xAE,
21530xEC, 0x2C, 0x00, 0x0C, 0x21, 0x20, 0x60, 0x02, 0x00, 0x00, 0x63, 0x8E,
21540x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x14, 0x06, 0x00, 0x02, 0x26,
21550x01, 0x00, 0x02, 0x26, 0xFF, 0xFF, 0x50, 0x30, 0x82, 0x16, 0x03, 0x00,
21560x01, 0x00, 0x42, 0x30, 0xE1, 0xFF, 0x54, 0x14, 0x02, 0x80, 0x04, 0x3C,
21570x60, 0x1B, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x42, 0x11, 0x02, 0x00,
21580x01, 0x00, 0x42, 0x30, 0x0C, 0x00, 0x54, 0x10, 0xC2, 0x13, 0x03, 0x00,
21590x1E, 0x00, 0x42, 0x30, 0x21, 0x10, 0x50, 0x00, 0xFF, 0xFF, 0x50, 0x30,
21600x80, 0x18, 0x10, 0x00, 0x2A, 0x10, 0x77, 0x00, 0xD8, 0xFF, 0x40, 0x14,
21610x00, 0x00, 0x00, 0x00, 0x74, 0x21, 0x00, 0x0C, 0x21, 0x20, 0xC0, 0x02,
21620x75, 0x19, 0x00, 0x08, 0x02, 0x80, 0x03, 0x3C, 0x01, 0x00, 0x22, 0x92,
21630x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
21640x04, 0x00, 0x63, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x03, 0x00,
21650x0F, 0x00, 0x42, 0x30, 0x11, 0x00, 0x40, 0x14, 0x02, 0x17, 0x03, 0x00,
21660x03, 0x00, 0x44, 0x30, 0x07, 0x00, 0x80, 0x10, 0x24, 0x10, 0x75, 0x00,
21670x0C, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x9E, 0x10,
21680x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00,
21690x80, 0x28, 0x10, 0x00, 0x21, 0x28, 0xB2, 0x00, 0xE3, 0x17, 0x00, 0x0C,
21700x21, 0x20, 0x60, 0x02, 0x21, 0x20, 0x40, 0x00, 0x8D, 0x17, 0x00, 0x0C,
21710x21, 0x28, 0x00, 0x00, 0x01, 0x00, 0x22, 0x92, 0x00, 0x00, 0x00, 0x00,
21720x7B, 0x00, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x23, 0x92,
21730x02, 0x00, 0x02, 0x24, 0x63, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
21740x25, 0xB0, 0x02, 0x3C, 0x4C, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0x90,
21750x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x63, 0x30, 0x08, 0x00, 0x74, 0x10,
21760xD0, 0x02, 0x02, 0x24, 0x00, 0x00, 0x63, 0x8E, 0x00, 0x00, 0x00, 0x00,
21770xC2, 0x13, 0x03, 0x00, 0x1E, 0x00, 0x42, 0x30, 0x21, 0x10, 0x50, 0x00,
21780x33, 0x19, 0x00, 0x08, 0xFF, 0xFF, 0x50, 0x30, 0x6C, 0x37, 0x22, 0xAE,
21790x00, 0x00, 0x63, 0x8E, 0x67, 0x19, 0x00, 0x08, 0xC2, 0x13, 0x03, 0x00,
21800x00, 0x01, 0x02, 0x36, 0x00, 0x00, 0x47, 0xAC, 0x02, 0x80, 0x02, 0x3C,
21810x60, 0x1B, 0x42, 0x24, 0xDC, 0x38, 0x47, 0xAC, 0x02, 0x80, 0x03, 0x3C,
21820x08, 0x04, 0x64, 0x24, 0x21, 0x28, 0x00, 0x00, 0x21, 0x30, 0x00, 0x00,
21830x76, 0x39, 0x00, 0x0C, 0x21, 0x38, 0x00, 0x00, 0x66, 0x18, 0x00, 0x08,
21840x02, 0x80, 0x02, 0x3C, 0xE4, 0x38, 0x22, 0x8E, 0xFF, 0xFF, 0x73, 0x30,
21850x23, 0x10, 0x47, 0x00, 0xFF, 0xFF, 0x52, 0x30, 0x21, 0x18, 0x53, 0x02,
21860xFF, 0xFF, 0x77, 0x30, 0x53, 0x21, 0x00, 0x0C, 0x21, 0x20, 0xE0, 0x02,
21870xEF, 0xFF, 0x40, 0x10, 0x21, 0xB0, 0x40, 0x00, 0x08, 0x00, 0x42, 0x8C,
21880xDC, 0x38, 0x26, 0x8E, 0x21, 0x38, 0x40, 0x02, 0x21, 0x18, 0x57, 0x00,
21890xAC, 0x38, 0x23, 0xAE, 0x21, 0x28, 0x40, 0x00, 0x08, 0x00, 0x04, 0x24,
21900xB0, 0x38, 0x22, 0xAE, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF,
21910x5B, 0x01, 0x00, 0x0C, 0x08, 0x00, 0x04, 0x24, 0xB0, 0x38, 0x25, 0x8E,
21920x24, 0x10, 0x02, 0x3C, 0x00, 0x01, 0x10, 0x36, 0x00, 0x00, 0x02, 0xAE,
21930x21, 0x38, 0x60, 0x02, 0x21, 0x28, 0xB2, 0x00, 0x08, 0x00, 0x04, 0x24,
21940x24, 0x10, 0x06, 0x3C, 0xDC, 0x38, 0x22, 0xAE, 0x1E, 0x01, 0x00, 0x0C,
21950x10, 0x00, 0xA0, 0xAF, 0xE0, 0x38, 0x23, 0x8E, 0x08, 0x00, 0x04, 0x24,
21960x5B, 0x01, 0x00, 0x0C, 0xDC, 0x38, 0x23, 0xAE, 0xDC, 0x38, 0x22, 0x8E,
21970x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xAE, 0xFE, 0x18, 0x00, 0x08,
21980x02, 0x80, 0x02, 0x3C, 0x23, 0x10, 0x67, 0x00, 0xFF, 0xFF, 0x57, 0x30,
21990x53, 0x21, 0x00, 0x0C, 0x21, 0x20, 0xE0, 0x02, 0x44, 0x00, 0x40, 0x10,
22000x21, 0xB0, 0x40, 0x00, 0x08, 0x00, 0x42, 0x8C, 0xDC, 0x38, 0x26, 0x8E,
22010x08, 0x00, 0x04, 0x24, 0x21, 0x18, 0x57, 0x00, 0xAC, 0x38, 0x23, 0xAE,
22020x21, 0x28, 0x40, 0x00, 0x21, 0x38, 0xE0, 0x02, 0xB0, 0x38, 0x22, 0xAE,
22030x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0xE0, 0x38, 0x23, 0x8E,
22040x08, 0x00, 0x04, 0x24, 0x5B, 0x01, 0x00, 0x0C, 0xDC, 0x38, 0x23, 0xAE,
22050xDC, 0x38, 0x23, 0x8E, 0x00, 0x01, 0x02, 0x36, 0x00, 0x00, 0x43, 0xAC,
22060xFE, 0x18, 0x00, 0x08, 0x02, 0x80, 0x02, 0x3C, 0x04, 0x00, 0x63, 0x8E,
22070x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x03, 0x00, 0x0F, 0x00, 0x42, 0x30,
22080x08, 0x00, 0x42, 0x28, 0x99, 0xFF, 0x40, 0x10, 0x25, 0xB0, 0x02, 0x3C,
22090x02, 0x17, 0x03, 0x00, 0x03, 0x00, 0x42, 0x30, 0x94, 0xFF, 0x40, 0x14,
22100x00, 0x00, 0x00, 0x00, 0x80, 0x28, 0x10, 0x00, 0x21, 0x28, 0xB2, 0x00,
22110xE3, 0x17, 0x00, 0x0C, 0x21, 0x20, 0x60, 0x02, 0x21, 0x20, 0x40, 0x00,
22120x8D, 0x17, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0x5E, 0x19, 0x00, 0x08,
22130x25, 0xB0, 0x02, 0x3C, 0x04, 0x00, 0x63, 0x8E, 0x00, 0x00, 0x00, 0x00,
22140x02, 0x14, 0x03, 0x00, 0x0F, 0x00, 0x42, 0x30, 0x08, 0x00, 0x42, 0x28,
22150x06, 0x00, 0x40, 0x10, 0x24, 0x10, 0x75, 0x00, 0x02, 0x17, 0x03, 0x00,
22160x03, 0x00, 0x42, 0x30, 0x0A, 0x00, 0x40, 0x10, 0x80, 0x28, 0x10, 0x00,
22170x24, 0x10, 0x75, 0x00, 0x79, 0xFF, 0x40, 0x14, 0x02, 0x17, 0x03, 0x00,
22180x03, 0x00, 0x42, 0x30, 0x76, 0xFF, 0x5E, 0x10, 0x00, 0x00, 0x00, 0x00,
22190x74, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x28, 0x10, 0x00,
22200x21, 0x28, 0xB2, 0x00, 0xE3, 0x17, 0x00, 0x0C, 0x21, 0x20, 0x60, 0x02,
22210x21, 0x20, 0x40, 0x00, 0x8D, 0x17, 0x00, 0x0C, 0x05, 0x00, 0x05, 0x24,
22220x59, 0x19, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x23, 0x8E,
22230x00, 0x01, 0x02, 0x36, 0x00, 0x00, 0x43, 0xAC, 0x74, 0x19, 0x00, 0x08,
22240xDC, 0x38, 0x23, 0xAE, 0xB8, 0xFF, 0xBD, 0x27, 0x25, 0xB0, 0x03, 0x3C,
22250x44, 0x00, 0xBF, 0xAF, 0x40, 0x00, 0xBE, 0xAF, 0x3C, 0x00, 0xB7, 0xAF,
22260x38, 0x00, 0xB6, 0xAF, 0x34, 0x00, 0xB5, 0xAF, 0x30, 0x00, 0xB4, 0xAF,
22270x2C, 0x00, 0xB3, 0xAF, 0x28, 0x00, 0xB2, 0xAF, 0x24, 0x00, 0xB1, 0xAF,
22280x20, 0x00, 0xB0, 0xAF, 0x44, 0x00, 0x63, 0x34, 0x00, 0x00, 0x62, 0x90,
22290x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00, 0x03, 0x16, 0x02, 0x00,
22300x0E, 0x00, 0x40, 0x04, 0x1C, 0x00, 0xA0, 0xAF, 0x21, 0x20, 0x60, 0x00,
22310x21, 0x10, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x42, 0x30,
22320x64, 0x00, 0x43, 0x2C, 0xFD, 0xFF, 0x60, 0x14, 0x01, 0x00, 0x42, 0x24,
22330x00, 0x00, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00,
22340x03, 0x16, 0x02, 0x00, 0xF6, 0xFF, 0x41, 0x04, 0x21, 0x10, 0x00, 0x00,
22350x02, 0x80, 0x02, 0x3C, 0x98, 0x54, 0x43, 0x8C, 0x00, 0x80, 0x06, 0x3C,
22360xD0, 0x67, 0xC2, 0x24, 0x25, 0xB0, 0x05, 0x3C, 0x02, 0x80, 0x06, 0x3C,
22370x18, 0x03, 0xA4, 0x34, 0x98, 0x54, 0xD1, 0x24, 0x00, 0x00, 0x82, 0xAC,
22380x4B, 0x00, 0x71, 0x10, 0x01, 0x00, 0x15, 0x24, 0x11, 0x11, 0x02, 0x3C,
22390x2A, 0xB0, 0x03, 0x3C, 0x22, 0x22, 0x57, 0x34, 0x02, 0x80, 0x02, 0x3C,
22400x21, 0xB0, 0x80, 0x00, 0x06, 0x00, 0x7E, 0x34, 0x05, 0x00, 0x73, 0x34,
22410x60, 0x1B, 0x54, 0x24, 0x01, 0x00, 0x12, 0x24, 0x00, 0x00, 0xD7, 0xAE,
22420x05, 0x00, 0xA0, 0x12, 0x02, 0x80, 0x03, 0x3C, 0xEC, 0x5D, 0x62, 0x90,
22430x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x40, 0x14, 0x21, 0xA8, 0x00, 0x00,
22440x00, 0x00, 0xC2, 0x97, 0x38, 0x39, 0x90, 0x8E, 0x25, 0xB0, 0x03, 0x3C,
22450xB0, 0x03, 0x63, 0x34, 0x00, 0xFF, 0x42, 0x30, 0x00, 0x00, 0x70, 0xAC,
22460x0F, 0x00, 0x40, 0x18, 0x02, 0x80, 0x06, 0x3C, 0x02, 0x80, 0x02, 0x3C,
22470xF0, 0xEC, 0xC6, 0x24, 0xF4, 0xEC, 0x42, 0x24, 0x00, 0x00, 0xC5, 0x8C,
22480x00, 0x00, 0x44, 0x8C, 0x02, 0x80, 0x06, 0x3C, 0xF8, 0xEC, 0xC6, 0x24,
22490x00, 0x00, 0xC3, 0x8C, 0x00, 0x00, 0xA4, 0xAC, 0x00, 0x00, 0x62, 0x94,
22500x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x42, 0x30, 0xFB, 0xFF, 0x40, 0x1C,
22510x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x00, 0x00,
22520x07, 0x00, 0x62, 0x30, 0x60, 0x00, 0x40, 0x14, 0x08, 0x00, 0x62, 0x24,
22530xC2, 0x10, 0x03, 0x00, 0x08, 0x00, 0x05, 0x8E, 0xF8, 0x37, 0x86, 0x8E,
22540xC0, 0x10, 0x02, 0x00, 0x20, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x47, 0x30,
22550x01, 0x00, 0x04, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xB2, 0xAF,
22560x5B, 0x01, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24, 0x02, 0x00, 0x02, 0x24,
22570x18, 0x00, 0xA4, 0x27, 0x00, 0x00, 0x72, 0xA2, 0x00, 0x00, 0x62, 0xA2,
22580x8A, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8E,
22590x04, 0x00, 0x03, 0x8E, 0x21, 0x20, 0x00, 0x02, 0x00, 0x00, 0x62, 0xAC,
22600x04, 0x00, 0x43, 0xAC, 0x00, 0x00, 0x10, 0xAE, 0x74, 0x21, 0x00, 0x0C,
22610x04, 0x00, 0x10, 0xAE, 0x90, 0x40, 0x00, 0x0C, 0x18, 0x00, 0xA4, 0x27,
22620x00, 0x00, 0x22, 0x8E, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x51, 0x14,
22630x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xA2, 0x8F, 0x00, 0x00, 0x00, 0x00,
22640x07, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
22650xEC, 0x5D, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x40, 0x14,
22660x1C, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x02, 0x3C, 0x08, 0x08, 0x44, 0x24,
22670x21, 0x28, 0x00, 0x00, 0x21, 0x30, 0x00, 0x00, 0x76, 0x39, 0x00, 0x0C,
22680x21, 0x38, 0x00, 0x00, 0x15, 0x1A, 0x00, 0x08, 0x02, 0x80, 0x02, 0x3C,
22690x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x06, 0x3C,
22700xEE, 0x5D, 0xC2, 0x90, 0x01, 0x00, 0x03, 0x24, 0x0F, 0x00, 0x42, 0x30,
22710x04, 0x00, 0x42, 0x28, 0x0F, 0x00, 0x40, 0x14, 0x1C, 0x00, 0xA3, 0xAF,
22720x02, 0x80, 0x06, 0x3C, 0xC6, 0x5C, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00,
22730x02, 0x00, 0x42, 0x30, 0x12, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
22740x00, 0x08, 0x04, 0x24, 0x00, 0x02, 0x05, 0x3C, 0xC1, 0x43, 0x00, 0x0C,
22750x01, 0x00, 0x06, 0x24, 0x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
22760x2F, 0x1A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x24,
22770x4B, 0x2E, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24, 0x02, 0x80, 0x06, 0x3C,
22780xC6, 0x5C, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0x30,
22790xF0, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x2D, 0x00, 0x0C,
22800x01, 0x00, 0x04, 0x24, 0x8A, 0x1A, 0x00, 0x08, 0x00, 0x08, 0x04, 0x24,
22810x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x06, 0x3C,
22820xED, 0x5D, 0xC4, 0x90, 0x01, 0x00, 0x05, 0x24, 0x4B, 0x2E, 0x00, 0x0C,
22830xFF, 0x00, 0x84, 0x30, 0x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
22840x73, 0x1A, 0x00, 0x08, 0x02, 0x80, 0x02, 0x3C, 0x4B, 0x1A, 0x00, 0x08,
22850xC2, 0x10, 0x02, 0x00, 0x10, 0x00, 0xE0, 0x18, 0x21, 0x18, 0x00, 0x00,
22860x00, 0x00, 0xC0, 0xAC, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x82, 0x90,
22870x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x45, 0x10, 0x21, 0x18, 0x80, 0x00,
22880x01, 0x00, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x18, 0x48, 0x00,
22890x02, 0x00, 0x68, 0x24, 0x21, 0x10, 0x82, 0x00, 0x2B, 0x18, 0x07, 0x01,
22900xF5, 0xFF, 0x60, 0x14, 0x02, 0x00, 0x44, 0x24, 0x21, 0x18, 0x00, 0x00,
22910x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00, 0x01, 0x00, 0x82, 0x90,
22920x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xAC, 0x08, 0x00, 0xE0, 0x03,
22930x21, 0x10, 0x60, 0x00, 0x02, 0x80, 0x07, 0x3C, 0x60, 0x1B, 0xE5, 0x24,
22940xCE, 0x40, 0xA3, 0x90, 0xFF, 0x00, 0x84, 0x30, 0x80, 0x10, 0x04, 0x00,
22950x0C, 0x00, 0x60, 0x14, 0x21, 0x30, 0x45, 0x00, 0xC8, 0x00, 0x02, 0x24,
22960x20, 0x3A, 0xA2, 0xAC, 0x01, 0x00, 0x03, 0x24, 0x60, 0x1B, 0xE2, 0x24,
22970x04, 0x18, 0x83, 0x00, 0xF8, 0x40, 0xA4, 0xA0, 0xCE, 0x40, 0x44, 0x90,
22980x00, 0x00, 0x00, 0x00, 0x25, 0x18, 0x64, 0x00, 0x08, 0x00, 0xE0, 0x03,
22990xCE, 0x40, 0x43, 0xA0, 0x20, 0x3A, 0xA3, 0x8C, 0xC8, 0x00, 0x02, 0x24,
23000x23, 0x10, 0x43, 0x00, 0xD0, 0x40, 0xC2, 0xAC, 0x01, 0x00, 0x03, 0x24,
23010x60, 0x1B, 0xE2, 0x24, 0x04, 0x18, 0x83, 0x00, 0xCE, 0x40, 0x44, 0x90,
23020x00, 0x00, 0x00, 0x00, 0x25, 0x18, 0x64, 0x00, 0x08, 0x00, 0xE0, 0x03,
23030xCE, 0x40, 0x43, 0xA0, 0xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF,
23040x02, 0x80, 0x11, 0x3C, 0x10, 0x00, 0xB0, 0xAF, 0x18, 0x00, 0xBF, 0xAF,
23050x60, 0x1B, 0x25, 0x26, 0xF8, 0x40, 0xA6, 0x90, 0x01, 0x00, 0x02, 0x24,
23060x04, 0x10, 0xC2, 0x00, 0x06, 0x00, 0x40, 0x14, 0xC9, 0x00, 0x10, 0x24,
23070xC6, 0x40, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x30,
23080x23, 0x00, 0x40, 0x14, 0x21, 0x20, 0xC5, 0x00, 0x02, 0x80, 0x02, 0x3C,
23090x60, 0x1B, 0x46, 0x24, 0x21, 0x20, 0x00, 0x00, 0xD0, 0x40, 0xC5, 0x24,
23100x00, 0x00, 0xA2, 0x8C, 0x04, 0x00, 0xA5, 0x24, 0x05, 0x00, 0x40, 0x10,
23110x2B, 0x18, 0x50, 0x00, 0x03, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00,
23120x21, 0x80, 0x40, 0x00, 0xF8, 0x40, 0xC4, 0xA0, 0x01, 0x00, 0x84, 0x24,
23130x08, 0x00, 0x82, 0x2C, 0xF5, 0xFF, 0x40, 0x14, 0xC9, 0x00, 0x02, 0x24,
23140x21, 0x00, 0x02, 0x12, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x45, 0x24,
23150x07, 0x00, 0x04, 0x24, 0xD0, 0x40, 0xA2, 0x8C, 0xFF, 0xFF, 0x84, 0x24,
23160x02, 0x00, 0x40, 0x10, 0x23, 0x18, 0x50, 0x00, 0xD0, 0x40, 0xA3, 0xAC,
23170xFA, 0xFF, 0x81, 0x04, 0x04, 0x00, 0xA5, 0x24, 0x60, 0x1B, 0x22, 0x26,
23180x20, 0x3A, 0x50, 0xAC, 0x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
23190x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
23200xF0, 0x40, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x24,
23210xFF, 0x00, 0x62, 0x30, 0x03, 0x00, 0x42, 0x2C, 0xD8, 0xFF, 0x40, 0x10,
23220xF0, 0x40, 0x83, 0xA0, 0x80, 0x18, 0x06, 0x00, 0x21, 0x18, 0x65, 0x00,
23230xC8, 0x00, 0x02, 0x24, 0x03, 0x00, 0x04, 0x24, 0x21, 0x28, 0x00, 0x00,
23240xD9, 0x12, 0x00, 0x0C, 0xD0, 0x40, 0x62, 0xAC, 0xF2, 0x1A, 0x00, 0x08,
23250x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x22, 0x26, 0x18, 0x00, 0xBF, 0x8F,
23260x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x20, 0x00, 0xBD, 0x27,
23270xCE, 0x40, 0x40, 0xA0, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x3A, 0x40, 0xAC,
23280xB8, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x08, 0x3C, 0x02, 0x80, 0x0B, 0x3C,
23290x02, 0x80, 0x0C, 0x3C, 0x40, 0x00, 0xBF, 0xAF, 0x3C, 0x00, 0xB5, 0xAF,
23300x38, 0x00, 0xB4, 0xAF, 0x34, 0x00, 0xB3, 0xAF, 0x30, 0x00, 0xB2, 0xAF,
23310x2C, 0x00, 0xB1, 0xAF, 0x28, 0x00, 0xB0, 0xAF, 0xE4, 0xEE, 0x63, 0x25,
23320xE0, 0xEE, 0x02, 0x25, 0xE8, 0xEE, 0x84, 0x25, 0x01, 0x00, 0x45, 0x90,
23330x01, 0x00, 0x66, 0x90, 0x01, 0x00, 0x87, 0x90, 0xE0, 0xEE, 0x0F, 0x91,
23340x02, 0x00, 0x4A, 0x90, 0xE4, 0xEE, 0x6E, 0x91, 0x02, 0x00, 0x69, 0x90,
23350xE8, 0xEE, 0x8D, 0x91, 0x02, 0x00, 0x88, 0x90, 0x03, 0x00, 0x4B, 0x90,
23360x03, 0x00, 0x6C, 0x90, 0x03, 0x00, 0x82, 0x90, 0x00, 0x2A, 0x05, 0x00,
23370x00, 0x32, 0x06, 0x00, 0x00, 0x3A, 0x07, 0x00, 0x25, 0x28, 0xAF, 0x00,
23380x25, 0x30, 0xCE, 0x00, 0x25, 0x38, 0xED, 0x00, 0x00, 0x54, 0x0A, 0x00,
23390x00, 0x4C, 0x09, 0x00, 0x00, 0x44, 0x08, 0x00, 0x25, 0x50, 0x45, 0x01,
23400x25, 0x48, 0x26, 0x01, 0x25, 0x40, 0x07, 0x01, 0x00, 0x5E, 0x0B, 0x00,
23410x00, 0x66, 0x0C, 0x00, 0x00, 0x16, 0x02, 0x00, 0x02, 0x80, 0x04, 0x3C,
23420x25, 0x58, 0x6A, 0x01, 0x25, 0x60, 0x89, 0x01, 0x25, 0x10, 0x48, 0x00,
23430xB0, 0x55, 0x84, 0x24, 0x10, 0x00, 0xAB, 0xAF, 0x18, 0x00, 0xAC, 0xAF,
23440x18, 0x52, 0x00, 0x0C, 0x20, 0x00, 0xA2, 0xAF, 0x10, 0x00, 0x42, 0x30,
23450x29, 0x00, 0x40, 0x10, 0x21, 0x18, 0x00, 0x00, 0x02, 0x80, 0x13, 0x3C,
23460x60, 0x1B, 0x63, 0x26, 0xC0, 0x3A, 0x62, 0x8C, 0x0C, 0x00, 0x10, 0x24,
23470x2B, 0x10, 0x02, 0x02, 0x2C, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
23480x02, 0x80, 0x03, 0x3C, 0x24, 0x56, 0x51, 0x24, 0x2E, 0x56, 0x72, 0x24,
23490x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0x26, 0x56, 0x54, 0x24,
23500x7C, 0x1B, 0x00, 0x08, 0x32, 0x56, 0x75, 0x24, 0xDD, 0x00, 0x02, 0x24,
23510x21, 0x20, 0x14, 0x02, 0x2B, 0x00, 0x62, 0x10, 0x10, 0x00, 0xA5, 0x27,
23520x21, 0x10, 0x11, 0x02, 0x01, 0x00, 0x43, 0x90, 0x60, 0x1B, 0x64, 0x26,
23530xC0, 0x3A, 0x82, 0x8C, 0x21, 0x18, 0x70, 0x00, 0x02, 0x00, 0x70, 0x24,
23540x2B, 0x10, 0x02, 0x02, 0x17, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
23550x21, 0x10, 0x11, 0x02, 0x00, 0x00, 0x43, 0x90, 0x30, 0x00, 0x02, 0x24,
23560x21, 0x20, 0x12, 0x02, 0x20, 0x00, 0xA5, 0x27, 0xED, 0xFF, 0x62, 0x14,
23570x04, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
23580xEE, 0xFF, 0x40, 0x14, 0x21, 0x10, 0x11, 0x02, 0x01, 0x00, 0x03, 0x24,
23590x40, 0x00, 0xBF, 0x8F, 0x3C, 0x00, 0xB5, 0x8F, 0x38, 0x00, 0xB4, 0x8F,
23600x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F, 0x2C, 0x00, 0xB1, 0x8F,
23610x28, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
23620x48, 0x00, 0xBD, 0x27, 0x40, 0x00, 0xBF, 0x8F, 0x3C, 0x00, 0xB5, 0x8F,
23630x38, 0x00, 0xB4, 0x8F, 0x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F,
23640x2C, 0x00, 0xB1, 0x8F, 0x28, 0x00, 0xB0, 0x8F, 0x21, 0x18, 0x00, 0x00,
23650x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x27,
23660x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x15, 0x02,
23670x18, 0x00, 0xA5, 0x27, 0xD1, 0xFF, 0x40, 0x14, 0x04, 0x00, 0x06, 0x24,
23680x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xFF, 0x40, 0x14,
23690x21, 0x10, 0x11, 0x02, 0x88, 0x1B, 0x00, 0x08, 0x01, 0x00, 0x03, 0x24,
23700x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x65, 0x24, 0xB0, 0x1B, 0xA2, 0x94,
23710x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x34, 0x08, 0x00, 0x40, 0x10,
23720x70, 0x17, 0x04, 0x24, 0xB6, 0x40, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00,
23730xFB, 0xFF, 0x42, 0x24, 0xFF, 0x00, 0x42, 0x30, 0x02, 0x00, 0x42, 0x2C,
23740x0A, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x40, 0xA3, 0x94,
23750x00, 0x00, 0x00, 0x00, 0x80, 0x18, 0x03, 0x00, 0x70, 0x17, 0x62, 0x28,
23760x04, 0x00, 0x40, 0x14, 0x70, 0x17, 0x04, 0x24, 0x21, 0x4E, 0x62, 0x28,
23770x20, 0x4E, 0x04, 0x24, 0x0B, 0x20, 0x62, 0x00, 0x08, 0x00, 0xE0, 0x03,
23780x21, 0x10, 0x80, 0x00, 0x21, 0x38, 0x80, 0x00, 0x08, 0x00, 0xC0, 0x10,
23790xFF, 0xFF, 0xC3, 0x24, 0xFF, 0xFF, 0x06, 0x24, 0x00, 0x00, 0xA2, 0x8C,
23800xFF, 0xFF, 0x63, 0x24, 0x04, 0x00, 0xA5, 0x24, 0x00, 0x00, 0xE2, 0xAC,
23810xFB, 0xFF, 0x66, 0x14, 0x04, 0x00, 0xE7, 0x24, 0x08, 0x00, 0xE0, 0x03,
23820x21, 0x10, 0x80, 0x00, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32,
23830x40, 0x32, 0x10, 0xF0, 0x00, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x00, 0xF3,
23840x18, 0x4A, 0x2D, 0xF7, 0x19, 0x4B, 0xF9, 0x63, 0x60, 0xDA, 0x00, 0x6A,
23850x0C, 0x62, 0x0B, 0xD1, 0x0A, 0xD0, 0x07, 0xD2, 0xC9, 0xF7, 0x1B, 0x6A,
23860x4B, 0xEA, 0x40, 0x31, 0x20, 0x31, 0x10, 0xF0, 0x00, 0x6A, 0x00, 0xF4,
23870x40, 0x32, 0x10, 0xF3, 0x68, 0x41, 0x2D, 0xF7, 0x19, 0x4A, 0x40, 0xDB,
23880x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B,
23890x66, 0xF7, 0x48, 0xAB, 0x01, 0x4A, 0x66, 0xF7, 0x48, 0xCB, 0x00, 0x1C,
23900x9B, 0x40, 0x00, 0x65, 0xC0, 0xF0, 0x46, 0x41, 0x40, 0xAA, 0x11, 0x5A,
23910x12, 0x61, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x10, 0xF0,
23920x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35, 0xAB, 0xF5, 0x50, 0x9C, 0xCB, 0xF5,
23930x68, 0x9D, 0x6D, 0xEA, 0xAB, 0xF5, 0x50, 0xDC, 0x00, 0x6A, 0xCB, 0xF5,
23940x48, 0xDD, 0x00, 0x1C, 0x96, 0x40, 0x00, 0x65, 0x70, 0xF3, 0x60, 0x41,
23950xE0, 0x9B, 0x06, 0x27, 0x07, 0x92, 0xFF, 0xF7, 0x1F, 0x6C, 0x01, 0x4A,
23960x8C, 0xEA, 0x07, 0xD2, 0xFF, 0x6D, 0x01, 0x4D, 0xA0, 0x36, 0xC0, 0x30,
23970x4F, 0x40, 0xE3, 0xEA, 0x0D, 0x65, 0x80, 0xF0, 0x1E, 0x60, 0xFF, 0x6A,
23980x01, 0x4A, 0x4B, 0xEA, 0x40, 0x35, 0xA0, 0x35, 0xF0, 0xF0, 0x4F, 0x45,
23990x62, 0x67, 0x2A, 0x65, 0x00, 0xF3, 0x00, 0x6A, 0x4B, 0xEA, 0x40, 0x34,
24000x80, 0x34, 0x47, 0x44, 0xEC, 0xEB, 0x11, 0x4A, 0x4A, 0xEB, 0x80, 0xF0,
24010x17, 0x60, 0x63, 0xEA, 0xA0, 0xF0, 0x04, 0x61, 0x01, 0xF6, 0x00, 0x6A,
24020x4B, 0xEA, 0x40, 0x35, 0xA0, 0x35, 0x41, 0x45, 0x4A, 0xEB, 0xC0, 0xF0,
24030x04, 0x60, 0x63, 0xEA, 0x00, 0xF1, 0x09, 0x61, 0x02, 0xF0, 0x00, 0x6A,
24040x4B, 0xEA, 0x40, 0x34, 0x80, 0x34, 0x43, 0x44, 0x4A, 0xEB, 0x40, 0xF1,
24050x17, 0x60, 0x63, 0xEA, 0xC0, 0xF1, 0x18, 0x61, 0x8A, 0xEB, 0x00, 0xF3,
24060x12, 0x60, 0x63, 0xEC, 0x80, 0xF3, 0x08, 0x61, 0x04, 0xF0, 0x00, 0x6A,
24070x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x6E, 0xEA, 0xE0, 0xF3, 0x12, 0x22,
24080xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x00, 0x6B,
24090x60, 0xF3, 0x10, 0x4A, 0x60, 0xDA, 0x07, 0xD3, 0xC9, 0xF7, 0x1B, 0x68,
24100x0B, 0xE8, 0x00, 0x30, 0x00, 0x30, 0x10, 0xF0, 0x00, 0x6A, 0x00, 0xF4,
24110x40, 0x32, 0x10, 0xF3, 0x68, 0x40, 0x2E, 0xF0, 0x19, 0x4A, 0x40, 0xDB,
24120x10, 0xF0, 0x02, 0x68, 0x00, 0xF4, 0x00, 0x30, 0x00, 0x1C, 0x9B, 0x40,
24130xFF, 0x69, 0x63, 0xF3, 0x00, 0x48, 0x10, 0x10, 0xC9, 0xF7, 0x1B, 0x6D,
24140xAB, 0xED, 0xA0, 0x35, 0xA0, 0x35, 0x7F, 0x4D, 0x40, 0x4D, 0x40, 0xA5,
24150x2C, 0xEA, 0x04, 0x5A, 0x0F, 0x60, 0x27, 0xF1, 0x90, 0x98, 0x00, 0x1C,
24160xF5, 0x09, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34,
24170x8A, 0xF4, 0x10, 0x4C, 0x00, 0x1C, 0x6A, 0x58, 0x00, 0x65, 0xE6, 0x22,
24180x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xEB, 0xF5, 0x4E, 0xA3,
24190x0F, 0x6B, 0xFF, 0x6C, 0x6C, 0xEA, 0x02, 0x72, 0x0B, 0x61, 0x10, 0xF0,
24200x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35, 0xEB, 0xF5, 0x4D, 0xA5, 0x8C, 0xEA,
24210x6C, 0xEA, 0x01, 0x72, 0x40, 0xF4, 0x00, 0x60, 0x00, 0x1C, 0x96, 0x40,
24220x00, 0x65, 0x00, 0x6D, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34,
24230x02, 0xF0, 0x08, 0x4C, 0xC5, 0x67, 0x00, 0x1C, 0x76, 0x39, 0xE5, 0x67,
24240x19, 0x17, 0x07, 0x94, 0x0A, 0xF0, 0x00, 0x5C, 0xA5, 0x61, 0x00, 0x6A,
24250x40, 0xDB, 0x07, 0xD2, 0x01, 0x6A, 0x70, 0xF3, 0x64, 0x41, 0x4B, 0xEA,
24260x40, 0xDB, 0x9C, 0x17, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
24270x0C, 0xF0, 0x00, 0x6A, 0x63, 0xF3, 0x00, 0x4D, 0x4B, 0xEA, 0x62, 0x9D,
24280x40, 0x32, 0x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB, 0x62, 0xDD, 0x82, 0x17,
24290xA0, 0xF0, 0x4C, 0x44, 0x4A, 0xEB, 0x00, 0xF4, 0x17, 0x60, 0x63, 0xEA,
24300x39, 0x61, 0xA0, 0xF0, 0x42, 0x44, 0x4A, 0xEB, 0x20, 0xF4, 0x0D, 0x60,
24310x63, 0xEA, 0xE0, 0xF0, 0x02, 0x61, 0x47, 0x44, 0x21, 0x4A, 0x4A, 0xEB,
24320x40, 0xF4, 0x11, 0x60, 0x63, 0xEA, 0xC0, 0xF1, 0x1D, 0x61, 0x47, 0x44,
24330x12, 0x4A, 0x6E, 0xEA, 0x7F, 0xF7, 0x06, 0x2A, 0xC9, 0xF7, 0x1B, 0x6A,
24340x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, 0x60, 0xF3, 0x10, 0x4A,
24350x60, 0xDA, 0x00, 0x18, 0x12, 0x27, 0x87, 0x67, 0x59, 0x17, 0x70, 0xF3,
24360x44, 0x41, 0xE0, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x40, 0x32, 0x40, 0x32,
24370xFF, 0x4A, 0x4C, 0xEF, 0xE3, 0xEE, 0x5F, 0xF7, 0x0D, 0x60, 0x0A, 0xF0,
24380x00, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x4D, 0xEF, 0x70, 0xF3,
24390x48, 0x41, 0xC0, 0x9A, 0xC0, 0xDF, 0x42, 0x17, 0x00, 0xF2, 0x00, 0x6A,
24400x4B, 0xEA, 0x40, 0x36, 0xC0, 0x36, 0x47, 0x46, 0x0B, 0x4A, 0x4A, 0xEB,
24410xC0, 0xF3, 0x17, 0x60, 0x63, 0xEA, 0xC0, 0xF0, 0x01, 0x61, 0xA0, 0xF0,
24420x4F, 0x44, 0x4A, 0xEB, 0x20, 0xF4, 0x15, 0x60, 0x63, 0xEA, 0x60, 0xF1,
24430x18, 0x61, 0xA0, 0xF0, 0x4D, 0x44, 0x6E, 0xEA, 0x60, 0xF4, 0x09, 0x22,
24440xA0, 0xF0, 0x4E, 0x44, 0x6E, 0xEA, 0x3F, 0xF7, 0x03, 0x2A, 0x1F, 0xF7,
24450x00, 0x6A, 0xE2, 0x34, 0x4C, 0xEC, 0x4C, 0xEF, 0x82, 0x34, 0x00, 0x18,
24460x3B, 0x5D, 0xE2, 0x35, 0xC9, 0xF7, 0x1B, 0x6B, 0x6B, 0xEB, 0x60, 0x33,
24470x60, 0x33, 0x60, 0xF3, 0x14, 0x4B, 0x40, 0xC3, 0x11, 0x17, 0x01, 0xF0,
24480x00, 0x6A, 0x4B, 0xEA, 0x40, 0x35, 0xA0, 0x35, 0x47, 0x45, 0x0F, 0x4A,
24490x4A, 0xEB, 0xC0, 0xF3, 0x1A, 0x60, 0x63, 0xEA, 0xA0, 0xF0, 0x19, 0x61,
24500x01, 0xF4, 0x00, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x4A, 0xEB,
24510x00, 0xF4, 0x06, 0x60, 0x63, 0xEA, 0xE0, 0xF1, 0x13, 0x61, 0x01, 0xF5,
24520x00, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x6E, 0xEA, 0xFF, 0xF6,
24530x11, 0x2A, 0x1F, 0xF7, 0x00, 0x6A, 0xEC, 0xEA, 0x42, 0x30, 0x01, 0xF7,
24540x00, 0x6B, 0xE2, 0x32, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
24550x6C, 0xEA, 0x63, 0xF3, 0x00, 0x4D, 0x42, 0x36, 0x28, 0xF1, 0xDB, 0xC5,
24560x20, 0xF3, 0x06, 0x26, 0xA3, 0xF3, 0x50, 0xAD, 0x10, 0xF0, 0x00, 0x6B,
24570x6B, 0xEB, 0x10, 0xF0, 0x00, 0x6C, 0x6D, 0xEA, 0xA3, 0xF3, 0x50, 0xCD,
24580x1E, 0xF0, 0x00, 0x6A, 0x40, 0x32, 0x4C, 0xEF, 0xFF, 0x6A, 0x4C, 0xE8,
24590x00, 0xF5, 0xE2, 0x31, 0x4C, 0xEE, 0x00, 0x1C, 0x3C, 0x0E, 0xB0, 0x67,
24600x90, 0x67, 0x00, 0x1C, 0x38, 0x0D, 0xB1, 0x67, 0xC9, 0xF7, 0x1B, 0x6A,
24610x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF3, 0x10, 0x4A, 0x00, 0x6B,
24620x60, 0xDA, 0xBA, 0x16, 0x1F, 0xF7, 0x00, 0x6B, 0xE2, 0x32, 0x6C, 0xEA,
24630x42, 0x32, 0xEC, 0xEB, 0x06, 0xD2, 0x62, 0x37, 0x80, 0xF3, 0x08, 0x22,
24640x01, 0x72, 0x01, 0x6C, 0x01, 0x60, 0x00, 0x6C, 0x00, 0x1C, 0xF0, 0x42,
24650x09, 0xD7, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32,
24660x09, 0x97, 0x70, 0xF3, 0x24, 0x42, 0xC0, 0x99, 0x02, 0xF0, 0x00, 0x68,
24670x00, 0x30, 0x87, 0x67, 0xAF, 0x40, 0x00, 0x1C, 0x83, 0x45, 0x09, 0xD7,
24680x09, 0x97, 0xAF, 0x40, 0x00, 0x1C, 0xAC, 0x45, 0x87, 0x67, 0x40, 0xD9,
24690x91, 0x16, 0xA0, 0xF0, 0x45, 0x44, 0x4A, 0xEB, 0x60, 0xF3, 0x06, 0x60,
24700x63, 0xEA, 0x00, 0xF1, 0x0D, 0x61, 0xA0, 0xF0, 0x43, 0x44, 0x6E, 0xEA,
24710x40, 0xF1, 0x02, 0x22, 0xA0, 0xF0, 0x44, 0x44, 0x6E, 0xEA, 0x7F, 0xF6,
24720x1F, 0x2A, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
24730x00, 0x4B, 0xFF, 0xF7, 0x1F, 0x6A, 0x27, 0xF1, 0x44, 0xDB, 0x74, 0x16,
24740x47, 0x46, 0x13, 0x4A, 0x4A, 0xEB, 0x80, 0xF0, 0x16, 0x60, 0x63, 0xEA,
24750x00, 0xF1, 0x1B, 0x61, 0x47, 0x46, 0x11, 0x4A, 0x6E, 0xEA, 0xE0, 0xF3,
24760x05, 0x22, 0x47, 0x46, 0x12, 0x4A, 0x6E, 0xEA, 0x7F, 0xF6, 0x02, 0x2A,
24770x00, 0x1C, 0x9B, 0x40, 0x00, 0x65, 0xC9, 0xF7, 0x1B, 0x6A, 0x10, 0xF0,
24780x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x4B, 0xEA, 0x63, 0xF3, 0x00, 0x4B,
24790x40, 0x32, 0x23, 0xF4, 0x6A, 0xA3, 0x40, 0x32, 0x60, 0xF3, 0x14, 0x4A,
24800x60, 0xDA, 0x00, 0x1C, 0x96, 0x40, 0x00, 0x65, 0x4B, 0x16, 0x47, 0x44,
24810x4A, 0xEB, 0x80, 0xF3, 0x03, 0x60, 0x63, 0xEA, 0x00, 0xF1, 0x0C, 0x61,
24820x47, 0x45, 0x10, 0x4A, 0x6E, 0xEA, 0xC0, 0xF3, 0x11, 0x22, 0x47, 0x45,
24830x11, 0x4A, 0x6E, 0xEA, 0x3F, 0xF6, 0x1A, 0x2A, 0x00, 0x1C, 0x2B, 0x20,
24840x00, 0x65, 0x36, 0x16, 0x01, 0xF7, 0x00, 0x6A, 0x4B, 0xEA, 0x40, 0x36,
24850xC0, 0x36, 0x42, 0x46, 0x4A, 0xEB, 0x3F, 0xF6, 0x0D, 0x60, 0x63, 0xEA,
24860x80, 0xF1, 0x04, 0x61, 0x47, 0x44, 0x01, 0x4A, 0x6E, 0xEA, 0xE0, 0xF1,
24870x01, 0x22, 0x43, 0x67, 0xCE, 0xEA, 0x3F, 0xF6, 0x01, 0x2A, 0xFF, 0x6A,
24880x01, 0x4A, 0x40, 0x32, 0x40, 0x32, 0x80, 0x4A, 0x80, 0x4A, 0x4C, 0xEF,
24890x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0xE2, 0x33, 0x63, 0xF3,
24900x00, 0x4C, 0xA3, 0xF3, 0x7A, 0xCC, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC,
24910x80, 0x34, 0x80, 0x34, 0x90, 0xF0, 0x44, 0x44, 0x60, 0xCA, 0x90, 0xF0,
24920xAA, 0x44, 0x00, 0xF4, 0x00, 0x6A, 0x40, 0xCD, 0x90, 0xF0, 0xA8, 0x44,
24930xA0, 0x6A, 0x40, 0xCD, 0xC9, 0xF7, 0x1A, 0x6D, 0xAB, 0xED, 0xA0, 0x35,
24940x04, 0x6E, 0x90, 0xF0, 0x46, 0x44, 0xA0, 0x35, 0xC0, 0xCA, 0x47, 0x45,
24950x73, 0x4A, 0xC0, 0xC2, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x74, 0x33,
24960xC8, 0x43, 0xC8, 0x4E, 0xB0, 0xF3, 0x40, 0x44, 0xC0, 0xDA, 0x60, 0xF0,
24970xDC, 0xCD, 0x40, 0xF0, 0x64, 0xAC, 0x00, 0xF2, 0x01, 0x6A, 0x4B, 0xEA,
24980x6C, 0xEA, 0x40, 0xF0, 0x44, 0xCC, 0x40, 0xF0, 0x64, 0xAC, 0x00, 0xF2,
24990x00, 0x6A, 0x6D, 0xEA, 0x40, 0xF0, 0x44, 0xCC, 0xD9, 0x15, 0x0F, 0xF7,
25000x40, 0x40, 0x4C, 0xEF, 0xE2, 0x37, 0x87, 0x67, 0xFF, 0xF7, 0x1F, 0x6D,
25010xAC, 0xEC, 0x01, 0x74, 0x06, 0xD4, 0xA0, 0xF0, 0x18, 0x60, 0x02, 0x54,
25020x20, 0xF3, 0x13, 0x61, 0x06, 0x92, 0x03, 0x72, 0xE0, 0xF1, 0x19, 0x60,
25030xC9, 0xF7, 0x1B, 0x6A, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33,
25040x4B, 0xEA, 0x63, 0xF3, 0x00, 0x4B, 0x40, 0x32, 0x23, 0xF4, 0x64, 0xAB,
25050x40, 0x32, 0x60, 0xF3, 0x14, 0x4A, 0x60, 0xDA, 0xB5, 0x15, 0x47, 0x46,
25060x09, 0x4A, 0x6E, 0xEA, 0xE0, 0xF2, 0x16, 0x22, 0x47, 0x46, 0x0A, 0x4A,
25070x6E, 0xEA, 0xBF, 0xF5, 0x0B, 0x2A, 0x00, 0x1C, 0x9B, 0x40, 0x09, 0xD7,
25080x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x00, 0x6A, 0x63, 0xF3,
25090x00, 0x4B, 0x23, 0xF4, 0x4A, 0xC3, 0xFF, 0x6A, 0x01, 0x4A, 0x40, 0x32,
25100x40, 0x32, 0x09, 0x97, 0x80, 0x4A, 0x80, 0x4A, 0x4C, 0xEF, 0xE0, 0x34,
25110x82, 0x34, 0x00, 0x1C, 0xA3, 0x31, 0x82, 0x34, 0x00, 0x1C, 0x96, 0x40,
25120x00, 0x65, 0x8E, 0x15, 0xA0, 0xF0, 0x40, 0x44, 0x6E, 0xEA, 0x80, 0xF0,
25130x1B, 0x22, 0xA0, 0xF0, 0x41, 0x44, 0x6E, 0xEA, 0x9F, 0xF5, 0x04, 0x2A,
25140xE2, 0x34, 0x1F, 0xF7, 0x00, 0x6A, 0x4C, 0xEC, 0x00, 0x18, 0x11, 0x22,
25150x82, 0x34, 0x7C, 0x15, 0xA0, 0xF0, 0x46, 0x44, 0x6E, 0xEA, 0xC0, 0xF2,
25160x1B, 0x22, 0xA0, 0xF0, 0x47, 0x44, 0x6E, 0xEA, 0x7F, 0xF5, 0x12, 0x2A,
25170x1F, 0xF7, 0x00, 0x6A, 0xE2, 0x33, 0x4C, 0xEF, 0xE2, 0x36, 0x4C, 0xEB,
25180x01, 0x76, 0x62, 0x35, 0xA0, 0xF1, 0x17, 0x61, 0xAC, 0x32, 0xA9, 0xE2,
25190x48, 0x32, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0xA9, 0xE2,
25200xC9, 0xF7, 0x1B, 0x6B, 0x63, 0xF3, 0x00, 0x4C, 0x48, 0x32, 0x6B, 0xEB,
25210x89, 0xE2, 0x60, 0x33, 0x04, 0xF5, 0x40, 0x9A, 0x60, 0x33, 0x60, 0xF3,
25220x14, 0x4B, 0x40, 0xDB, 0x51, 0x15, 0x47, 0x45, 0x08, 0x4A, 0x6E, 0xEA,
25230x71, 0x22, 0x47, 0x45, 0x09, 0x4A, 0x6E, 0xEA, 0x5F, 0xF5, 0x08, 0x2A,
25240x1F, 0xF7, 0x00, 0x6A, 0x4C, 0xEF, 0x4A, 0xEF, 0xDF, 0xF6, 0x03, 0x60,
25250x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B,
25260x00, 0x6A, 0x27, 0xF1, 0x44, 0xDB, 0x38, 0x15, 0x47, 0x44, 0x0D, 0x4A,
25270x6E, 0xEA, 0x69, 0x22, 0x47, 0x44, 0x10, 0x4A, 0x6E, 0xEA, 0x3F, 0xF5,
25280x0F, 0x2A, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34,
25290x60, 0xF3, 0xA8, 0x44, 0x60, 0x9D, 0xFF, 0xF7, 0x1F, 0x6A, 0x60, 0xF3,
25300x04, 0x4C, 0x4C, 0xEB, 0x1F, 0xF7, 0x00, 0x6A, 0x4C, 0xEF, 0xE0, 0x32,
25310x6D, 0xEA, 0x40, 0xDD, 0x60, 0xA4, 0xFF, 0x6A, 0x6C, 0xEA, 0x40, 0x6B,
25320x6D, 0xEA, 0x40, 0xC4, 0x15, 0x15, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
25330x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0x23, 0xF4, 0x42, 0xAA, 0xFF, 0xF7,
25340x1F, 0x6D, 0x70, 0xF3, 0x64, 0x41, 0xAC, 0xEA, 0x40, 0xDB, 0x06, 0x15,
25350x01, 0x4A, 0x6E, 0xEA, 0xA0, 0xF0, 0x0D, 0x22, 0x47, 0x45, 0x0E, 0x4A,
25360x6E, 0xEA, 0xFF, 0xF4, 0x1D, 0x2A, 0x00, 0x1C, 0xAE, 0x1F, 0x00, 0x65,
25370xF9, 0x14, 0x0F, 0xF7, 0x40, 0x40, 0xEC, 0xEA, 0x42, 0x37, 0x2D, 0xE7,
25380xC0, 0x9B, 0x70, 0xF3, 0x44, 0x41, 0xC0, 0xDA, 0xC0, 0x9B, 0xEE, 0x14,
25390x01, 0xF7, 0x00, 0x6A, 0x4C, 0xEF, 0xE2, 0x32, 0x01, 0x72, 0x01, 0x6C,
25400x07, 0x60, 0x02, 0x72, 0x02, 0x6C, 0x04, 0x60, 0x03, 0x72, 0x03, 0x6C,
25410x01, 0x60, 0x00, 0x6C, 0x00, 0x18, 0x92, 0x5D, 0x00, 0x65, 0xDC, 0x14,
25420xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF1,
25430x16, 0x4A, 0xFF, 0x6B, 0x60, 0xCA, 0x01, 0x6A, 0x10, 0xF0, 0x02, 0x6B,
25440x00, 0xF4, 0x60, 0x33, 0xEB, 0xF4, 0x50, 0xC3, 0xCB, 0x14, 0x0F, 0xF7,
25450x40, 0x40, 0xEC, 0xEA, 0xDF, 0xF4, 0x06, 0x22, 0x10, 0xF0, 0x02, 0x6B,
25460x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x00, 0xF3, 0x44, 0x9B,
25470xA9, 0x67, 0x88, 0x67, 0xAC, 0xEA, 0x8D, 0xEA, 0x00, 0xF3, 0x44, 0xDB,
25480x1F, 0xF7, 0x00, 0x6C, 0xE2, 0x32, 0x8C, 0xEA, 0x42, 0x32, 0x00, 0xF3,
25490x5C, 0xC3, 0x8C, 0xEF, 0xFB, 0x4A, 0x00, 0xF3, 0x5D, 0xC3, 0xE2, 0x32,
25500x00, 0xF3, 0x5E, 0xC3, 0xFB, 0x4A, 0x00, 0xF3, 0x5F, 0xC3, 0xA6, 0x14,
25510x44, 0x46, 0x6E, 0xEA, 0x6D, 0x22, 0x43, 0x67, 0xAE, 0xEA, 0x9F, 0xF4,
25520x1F, 0x2A, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x33, 0x60, 0x33,
25530x70, 0xF3, 0x44, 0x43, 0xE0, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x40, 0x32,
25540x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEF, 0xFF, 0x6A, 0x01, 0x4A, 0x40, 0x32,
25550xE3, 0xEA, 0x9F, 0xF4, 0x0B, 0x60, 0x0A, 0xF0, 0x00, 0x6A, 0x4B, 0xEA,
25560x40, 0x32, 0x40, 0x32, 0x4D, 0xEF, 0xC0, 0x9F, 0x70, 0xF3, 0x48, 0x43,
25570xC0, 0xDA, 0x80, 0x14, 0x41, 0x44, 0x6E, 0xEA, 0x5E, 0x22, 0x42, 0x44,
25580x6E, 0xEA, 0x7F, 0xF4, 0x19, 0x2A, 0x1F, 0xF7, 0x00, 0x6B, 0xE2, 0x32,
25590x6C, 0xEA, 0x42, 0x32, 0xEC, 0xEB, 0x06, 0xD2, 0x62, 0x37, 0x20, 0xF2,
25600x0C, 0x22, 0x01, 0x72, 0x01, 0x6C, 0x01, 0x60, 0x00, 0x6C, 0x00, 0x1C,
25610xF0, 0x42, 0x09, 0xD7, 0x09, 0x97, 0x02, 0xF0, 0x00, 0x68, 0x00, 0x30,
25620xAF, 0x40, 0x00, 0x1C, 0xAC, 0x45, 0x87, 0x67, 0xFF, 0x48, 0x4C, 0xE8,
25630xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF3,
25640x14, 0x4A, 0x00, 0xDA, 0x55, 0x14, 0xC9, 0xF7, 0x1B, 0x6A, 0x10, 0xF0,
25650x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x4B, 0xEA, 0x63, 0xF3, 0x00, 0x4B,
25660x40, 0x32, 0xC4, 0xF7, 0x7C, 0xAB, 0x40, 0x32, 0x60, 0xF3, 0x14, 0x4A,
25670x60, 0xDA, 0x44, 0x14, 0x1F, 0xF7, 0x00, 0x6A, 0xEC, 0xEA, 0x42, 0x37,
25680x87, 0x67, 0x04, 0x27, 0x01, 0x77, 0x01, 0x6C, 0x01, 0x60, 0x00, 0x6C,
25690x00, 0x1C, 0xF0, 0x42, 0x00, 0x65, 0x36, 0x14, 0x1F, 0xF7, 0x00, 0x6B,
25700x47, 0x67, 0x6C, 0xEA, 0x42, 0x32, 0x06, 0xD2, 0xE2, 0x32, 0x6C, 0xEA,
25710x42, 0x36, 0x07, 0x5E, 0x3F, 0xF4, 0x0A, 0x60, 0x10, 0xF0, 0x02, 0x6B,
25720x00, 0xF4, 0x60, 0x33, 0xC8, 0x32, 0x1D, 0xF7, 0x14, 0x4B, 0x69, 0xE2,
25730x40, 0x9A, 0x00, 0xEA, 0x00, 0x65, 0x0F, 0xF7, 0x40, 0x40, 0xEC, 0xEA,
25740x42, 0x37, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32,
25750x70, 0xF3, 0x64, 0x42, 0xC0, 0x9B, 0x49, 0xE7, 0xC0, 0xDA, 0xC0, 0x9A,
25760xC0, 0xDB, 0x0E, 0x14, 0x1F, 0xF7, 0x00, 0x6A, 0xEC, 0xEA, 0x42, 0x32,
25770xFF, 0x72, 0x71, 0x61, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32,
25780x40, 0x32, 0x60, 0xF3, 0x04, 0x4A, 0x60, 0xAA, 0x88, 0x67, 0x6D, 0xEC,
25790x80, 0xCA, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x06, 0xF0,
25800x00, 0x6A, 0x63, 0xF3, 0x00, 0x4C, 0x4B, 0xEA, 0xE0, 0xF2, 0x64, 0x9C,
25810x40, 0x32, 0x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB, 0xE0, 0xF2, 0x64, 0xDC,
25820x1F, 0xF7, 0x00, 0x6A, 0x4C, 0xEF, 0x19, 0xF4, 0x00, 0x77, 0xFF, 0xF3,
25830x05, 0x61, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x06, 0xF0,
25840x00, 0x6A, 0x63, 0xF3, 0x00, 0x4C, 0x4B, 0xEA, 0xE0, 0xF2, 0x64, 0x9C,
25850x40, 0x32, 0x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB, 0x02, 0xF0, 0x00, 0x6A,
25860x40, 0x32, 0x40, 0x32, 0x4D, 0xEB, 0xE0, 0xF2, 0x64, 0xDC, 0xDF, 0xF3,
25870x0D, 0x10, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xC9, 0xF7,
25880x1B, 0x6A, 0x63, 0xF3, 0x00, 0x4B, 0x4B, 0xEA, 0x23, 0xF4, 0x66, 0xAB,
25890x40, 0x32, 0x40, 0x32, 0xFF, 0xF7, 0x1F, 0x6C, 0x60, 0xF3, 0x14, 0x4A,
25900x8C, 0xEB, 0x60, 0xDA, 0xBF, 0xF3, 0x18, 0x10, 0xA3, 0xF3, 0x50, 0xAD,
25910xEF, 0xF7, 0x1F, 0x6B, 0x86, 0x67, 0x6C, 0xEA, 0xDB, 0x14, 0x02, 0x76,
25920x27, 0x61, 0xAC, 0x32, 0xA9, 0xE2, 0x48, 0x32, 0x10, 0xF0, 0x02, 0x6C,
25930x00, 0xF4, 0x80, 0x34, 0xA9, 0xE2, 0xC9, 0xF7, 0x1B, 0x6B, 0x63, 0xF3,
25940x00, 0x4C, 0x48, 0x32, 0x6B, 0xEB, 0x89, 0xE2, 0x60, 0x33, 0x04, 0xF5,
25950x44, 0x9A, 0x60, 0x33, 0x60, 0xF3, 0x14, 0x4B, 0x40, 0xDB, 0x9F, 0xF3,
25960x17, 0x10, 0xAA, 0x2A, 0xC9, 0xF7, 0x1B, 0x6B, 0x6B, 0xEB, 0x60, 0x33,
25970x60, 0x33, 0x60, 0xF3, 0x04, 0x4B, 0x80, 0xAB, 0xFF, 0x6A, 0x02, 0x4A,
25980x4B, 0xEA, 0x8C, 0xEA, 0x40, 0xCB, 0x8B, 0x17, 0x03, 0x76, 0x9F, 0xF3,
25990x05, 0x61, 0xAC, 0x32, 0xA9, 0xE2, 0x48, 0x32, 0xA9, 0xE2, 0x10, 0xF0,
26000x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xC9, 0xF7, 0x1B, 0x6C, 0x48, 0x32,
26010x68, 0xF0, 0x08, 0x4B, 0x8B, 0xEC, 0x69, 0xE2, 0x80, 0x34, 0x40, 0x9A,
26020x80, 0x34, 0x60, 0xF3, 0x14, 0x4C, 0x40, 0xDC, 0x7F, 0xF3, 0x0E, 0x10,
26030xEB, 0xF5, 0x4D, 0xA5, 0x01, 0x6D, 0x00, 0x1C, 0x4B, 0x2E, 0x4C, 0xEC,
26040xBF, 0xF3, 0x18, 0x10, 0x00, 0x18, 0x84, 0x5C, 0x87, 0x67, 0x7F, 0xF3,
26050x01, 0x10, 0x00, 0x1C, 0x9B, 0x40, 0x09, 0xD7, 0x09, 0x97, 0x0F, 0xF7,
26060x40, 0x40, 0xFF, 0xF7, 0x1F, 0x6D, 0x4C, 0xEF, 0xE2, 0x32, 0x10, 0xF0,
26070x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xAC, 0xEA, 0x63, 0xF3, 0x00, 0x4B,
26080x23, 0xF4, 0x4B, 0xC3, 0x00, 0x1C, 0x96, 0x40, 0x00, 0x65, 0x5F, 0xF3,
26090x09, 0x10, 0x0F, 0xF7, 0x40, 0x40, 0x4C, 0xEF, 0xE2, 0x37, 0x87, 0x67,
26100xFF, 0xF7, 0x1F, 0x6D, 0xAC, 0xEC, 0x06, 0xD4, 0x70, 0xF3, 0x04, 0x41,
26110xA0, 0x98, 0x00, 0x18, 0x63, 0x5E, 0x00, 0x65, 0xC0, 0x98, 0x06, 0x95,
26120x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x3D, 0xF7, 0x10, 0x4C,
26130x00, 0x1C, 0x13, 0x58, 0x00, 0x65, 0x3F, 0xF3, 0x0D, 0x10, 0x00, 0x1C,
26140xFA, 0x1F, 0x00, 0x65, 0x3F, 0xF3, 0x08, 0x10, 0x06, 0x94, 0x7A, 0x14,
26150xE2, 0x34, 0x1F, 0xF7, 0x00, 0x6A, 0x4C, 0xEC, 0x00, 0x18, 0x8F, 0x5E,
26160x82, 0x34, 0x1F, 0xF3, 0x1D, 0x10, 0x02, 0xF0, 0x00, 0x68, 0x00, 0x30,
26170x60, 0x6E, 0xAF, 0x40, 0x00, 0x1C, 0x83, 0x45, 0x24, 0x6C, 0xE0, 0xF3,
26180x08, 0x6C, 0x00, 0x1C, 0x2C, 0x1F, 0x00, 0x65, 0x00, 0x1C, 0x9B, 0x40,
26190x00, 0x65, 0x24, 0x6C, 0x00, 0x1C, 0xAC, 0x45, 0xAF, 0x40, 0x1F, 0x6E,
26200x4C, 0xEE, 0x00, 0x1C, 0x96, 0x40, 0x08, 0xD6, 0x00, 0x1C, 0x5B, 0x1F,
26210x64, 0x6C, 0x08, 0x96, 0x70, 0xF3, 0x44, 0x41, 0xC0, 0xC2, 0xFF, 0xF2,
26220x1B, 0x10, 0x00, 0x18, 0x75, 0x5D, 0x00, 0x65, 0xFF, 0xF2, 0x16, 0x10,
26230x0F, 0xF7, 0x40, 0x40, 0x4C, 0xEF, 0xE2, 0x32, 0x01, 0x6B, 0xA2, 0x67,
26240x6C, 0xED, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x46, 0x36,
26250x6C, 0xEE, 0xDB, 0xF7, 0xA8, 0xDC, 0x4A, 0x37, 0x10, 0xF0, 0x02, 0x6C,
26260x00, 0xF4, 0x80, 0x34, 0x4E, 0x32, 0x6C, 0xEA, 0x6C, 0xEF, 0xCB, 0xF4,
26270xD9, 0xC4, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x10, 0xF0,
26280x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0xDB, 0xF7, 0xE4, 0xDC, 0x63, 0xF3,
26290x00, 0x4B, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0xC7, 0xF5,
26300x47, 0xC3, 0x5D, 0xF7, 0x0C, 0x4C, 0x00, 0x1C, 0x13, 0x58, 0x04, 0xD2,
26310xDF, 0xF2, 0x04, 0x10, 0x00, 0x18, 0xED, 0x60, 0x87, 0x67, 0xBF, 0xF2,
26320x1F, 0x10, 0x00, 0x18, 0x92, 0x5C, 0x87, 0x67, 0xBF, 0xF2, 0x1A, 0x10,
26330x00, 0x1C, 0x9B, 0x40, 0x09, 0xD7, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
26340x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x23, 0xF4, 0x4A, 0xA3, 0x09, 0x97,
26350x5F, 0xF4, 0x1D, 0x2A, 0x01, 0x6A, 0x23, 0xF4, 0x4A, 0xC3, 0x0F, 0xF7,
26360x40, 0x40, 0x4C, 0xEF, 0xE0, 0x32, 0x42, 0x32, 0x42, 0x32, 0x23, 0xF4,
26370x4B, 0xC3, 0x82, 0x67, 0x00, 0x1C, 0xA3, 0x31, 0x06, 0xD2, 0x0A, 0x15,
26380x00, 0x18, 0x94, 0x5E, 0x00, 0x65, 0x9F, 0xF2, 0x17, 0x10, 0xDF, 0xF4,
26390x0F, 0x2C, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xC9, 0xF7,
26400x1B, 0x6A, 0x63, 0xF3, 0x00, 0x4B, 0x4B, 0xEA, 0x23, 0xF4, 0x60, 0xAB,
26410x40, 0x32, 0x40, 0x32, 0xFF, 0xF7, 0x1F, 0x6C, 0x60, 0xF3, 0x14, 0x4A,
26420x8C, 0xEB, 0xC7, 0x16, 0x00, 0x1C, 0x9B, 0x40, 0x00, 0x65, 0xC9, 0xF7,
26430x1B, 0x6A, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x4B, 0xEA,
26440x63, 0xF3, 0x00, 0x4B, 0x40, 0x32, 0x23, 0xF4, 0x6B, 0xA3, 0x40, 0x32,
26450x60, 0xF3, 0x14, 0x4A, 0x60, 0xDA, 0x1F, 0x14, 0x00, 0x1C, 0x5C, 0x20,
26460x00, 0x65, 0x7F, 0xF2, 0x09, 0x10, 0x06, 0x95, 0x10, 0xF0, 0x02, 0x6B,
26470x00, 0xF4, 0x60, 0x33, 0xC9, 0xF7, 0x1B, 0x6C, 0xB0, 0x32, 0x63, 0xF3,
26480x00, 0x4B, 0x8B, 0xEC, 0x69, 0xE2, 0x80, 0x34, 0x20, 0xF3, 0x55, 0xA2,
26490x80, 0x34, 0x60, 0xF3, 0x14, 0x4C, 0xE5, 0x16, 0x06, 0x93, 0xC9, 0xF7,
26500x1B, 0x6C, 0x8B, 0xEC, 0x70, 0x32, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
26510x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x69, 0xE2, 0x80, 0x34, 0x20, 0xF3,
26520x54, 0xA2, 0x80, 0x34, 0x60, 0xF3, 0x14, 0x4C, 0xD2, 0x16, 0x06, 0x94,
26530xD6, 0x15, 0x06, 0x93, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x70, 0x32,
26540x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B,
26550x69, 0xE2, 0x80, 0x34, 0x20, 0xF3, 0x56, 0xAA, 0x80, 0x34, 0x60, 0xF3,
26560x14, 0x4C, 0xBD, 0x16, 0x06, 0x95, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
26570x60, 0x33, 0xC9, 0xF7, 0x1B, 0x6C, 0xB0, 0x32, 0x63, 0xF3, 0x00, 0x4B,
26580x8B, 0xEC, 0x69, 0xE2, 0x80, 0x34, 0x20, 0xF3, 0x52, 0xAA, 0x80, 0x34,
26590x60, 0xF3, 0x14, 0x4C, 0xAA, 0x16, 0x06, 0x93, 0xC9, 0xF7, 0x1B, 0x6C,
26600x8B, 0xEC, 0x70, 0x32, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33,
26610x63, 0xF3, 0x00, 0x4B, 0x69, 0xE2, 0x80, 0x34, 0x20, 0xF3, 0x50, 0xAA,
26620x80, 0x34, 0x60, 0xF3, 0x14, 0x4C, 0x97, 0x16, 0x06, 0x95, 0x10, 0xF0,
26630x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0xB0, 0x32,
26640xC9, 0xF7, 0x1B, 0x6C, 0x69, 0xE2, 0x8B, 0xEC, 0x20, 0xF3, 0x4C, 0x9A,
26650x80, 0x34, 0x80, 0x34, 0x60, 0xF3, 0x14, 0x4C, 0x40, 0xF6, 0x42, 0x32,
26660x82, 0x16, 0x06, 0x93, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x70, 0x32,
26670x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B,
26680x69, 0xE2, 0x20, 0xF3, 0x4F, 0xA2, 0x80, 0x34, 0x80, 0x34, 0x01, 0x6B,
26690x60, 0xF3, 0x14, 0x4C, 0x6C, 0xEA, 0x6D, 0x16, 0x00, 0x80, 0x03, 0x3C,
26700x25, 0xB0, 0x02, 0x3C, 0x18, 0x03, 0x42, 0x34, 0xB0, 0x7C, 0x63, 0x24,
26710x00, 0x00, 0x43, 0xAC, 0x02, 0x80, 0x05, 0x3C, 0xCC, 0x5D, 0xA5, 0x8C,
26720x04, 0x00, 0x02, 0x24, 0x1E, 0x00, 0xA2, 0x10, 0x05, 0x00, 0xA2, 0x2C,
26730x10, 0x00, 0x40, 0x10, 0x05, 0x00, 0x02, 0x24, 0x03, 0x00, 0x02, 0x24,
26740x08, 0x00, 0xA2, 0x10, 0x00, 0x19, 0x04, 0x00, 0x80, 0x10, 0x04, 0x00,
26750x21, 0x10, 0x44, 0x00, 0xC0, 0x10, 0x02, 0x00, 0x23, 0x10, 0x44, 0x00,
26760x00, 0x11, 0x02, 0x00, 0x21, 0x10, 0x44, 0x00, 0x40, 0x19, 0x02, 0x00,
26770xFF, 0xFF, 0x63, 0x24, 0xFE, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00,
26780x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0xA2, 0x10,
26790x06, 0x00, 0x02, 0x24, 0xF2, 0xFF, 0xA2, 0x14, 0x80, 0x10, 0x04, 0x00,
26800x40, 0x11, 0x04, 0x00, 0x23, 0x10, 0x44, 0x00, 0x80, 0x10, 0x02, 0x00,
26810x21, 0x10, 0x44, 0x00, 0x00, 0x19, 0x02, 0x00, 0x23, 0x18, 0x62, 0x00,
26820x42, 0x1F, 0x00, 0x08, 0x00, 0x19, 0x03, 0x00, 0x80, 0x10, 0x04, 0x00,
26830x21, 0x10, 0x44, 0x00, 0xC0, 0x10, 0x02, 0x00, 0x23, 0x10, 0x44, 0x00,
26840x00, 0x11, 0x02, 0x00, 0x21, 0x10, 0x44, 0x00, 0x42, 0x1F, 0x00, 0x08,
26850x00, 0x19, 0x02, 0x00, 0x00, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
26860x6C, 0x7D, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
26870x02, 0x80, 0x05, 0x3C, 0xCC, 0x5D, 0xA3, 0x8C, 0x05, 0x00, 0x02, 0x24,
26880x06, 0x00, 0x62, 0x10, 0x06, 0x00, 0x62, 0x2C, 0x0C, 0x00, 0x40, 0x10,
26890x06, 0x00, 0x02, 0x24, 0x04, 0x00, 0x02, 0x24, 0x0E, 0x00, 0x62, 0x10,
26900x80, 0x10, 0x04, 0x00, 0x80, 0x10, 0x04, 0x00, 0x21, 0x10, 0x44, 0x00,
26910x80, 0x10, 0x02, 0x00, 0xFF, 0xFF, 0x42, 0x24, 0xFE, 0xFF, 0x40, 0x14,
26920x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
26930xF7, 0xFF, 0x62, 0x14, 0x00, 0x11, 0x04, 0x00, 0x23, 0x10, 0x44, 0x00,
26940x6D, 0x1F, 0x00, 0x08, 0x40, 0x10, 0x02, 0x00, 0x21, 0x10, 0x44, 0x00,
26950x6D, 0x1F, 0x00, 0x08, 0x40, 0x10, 0x02, 0x00, 0xFF, 0xFF, 0x85, 0x30,
26960x21, 0x30, 0x00, 0x00, 0x25, 0xB0, 0x03, 0x3C, 0x2A, 0xB0, 0x04, 0x3C,
26970xB4, 0x00, 0x63, 0x34, 0x01, 0x00, 0xA2, 0x24, 0x31, 0x00, 0x84, 0x34,
26980x00, 0x00, 0x65, 0xA0, 0x00, 0x00, 0x85, 0xA0, 0xFF, 0xFF, 0x45, 0x30,
26990x12, 0x00, 0xA0, 0x10, 0x01, 0x00, 0x03, 0x24, 0x28, 0xB0, 0x07, 0x3C,
27000x8F, 0x1F, 0x00, 0x08, 0xFF, 0xFF, 0x08, 0x24, 0x00, 0x00, 0x83, 0xA0,
27010x01, 0x00, 0x63, 0x24, 0xFF, 0xFF, 0x63, 0x30, 0x2B, 0x10, 0xA3, 0x00,
27020x09, 0x00, 0x40, 0x14, 0x08, 0x00, 0xC6, 0x24, 0xF9, 0xFF, 0x65, 0x14,
27030x21, 0x20, 0xC7, 0x00, 0x01, 0x00, 0x63, 0x24, 0xFF, 0xFF, 0x63, 0x30,
27040x2B, 0x10, 0xA3, 0x00, 0x00, 0x00, 0x88, 0xA0, 0xF9, 0xFF, 0x40, 0x10,
27050x08, 0x00, 0xC6, 0x24, 0x00, 0x01, 0xA2, 0x2C, 0x13, 0x00, 0x40, 0x10,
27060x21, 0x18, 0xA0, 0x00, 0xFF, 0x00, 0x08, 0x24, 0x28, 0xB0, 0x07, 0x3C,
27070xA3, 0x1F, 0x00, 0x08, 0xFF, 0xFF, 0x09, 0x24, 0xFF, 0xFF, 0x43, 0x30,
27080x00, 0x00, 0xA2, 0xA0, 0x00, 0x01, 0x62, 0x2C, 0x0A, 0x00, 0x40, 0x10,
27090x08, 0x00, 0xC6, 0x24, 0x01, 0x00, 0x62, 0x24, 0xF9, 0xFF, 0x68, 0x14,
27100x21, 0x28, 0xC7, 0x00, 0x00, 0x01, 0x02, 0x24, 0xFF, 0xFF, 0x43, 0x30,
27110x00, 0x01, 0x62, 0x2C, 0x00, 0x00, 0xA9, 0xA0, 0xF8, 0xFF, 0x40, 0x14,
27120x08, 0x00, 0xC6, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
27130xD0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB2, 0xAF, 0x25, 0xB0, 0x12, 0x3C,
27140xFF, 0xFF, 0x02, 0x24, 0x28, 0x00, 0xB6, 0xAF, 0x1C, 0x00, 0xB3, 0xAF,
27150x42, 0x00, 0x56, 0x36, 0x14, 0x00, 0xB1, 0xAF, 0xFC, 0x77, 0x13, 0x24,
27160x40, 0x00, 0x51, 0x36, 0x00, 0x00, 0xC2, 0xA2, 0x10, 0x00, 0xB0, 0xAF,
27170x00, 0x00, 0x33, 0xA6, 0xFC, 0x57, 0x10, 0x24, 0x32, 0x00, 0x04, 0x24,
27180x2C, 0x00, 0xBF, 0xAF, 0x24, 0x00, 0xB5, 0xAF, 0x5B, 0x1F, 0x00, 0x0C,
27190x20, 0x00, 0xB4, 0xAF, 0x00, 0x00, 0x30, 0xA6, 0x5B, 0x1F, 0x00, 0x0C,
27200x32, 0x00, 0x04, 0x24, 0xFC, 0x37, 0x02, 0x24, 0x00, 0x00, 0x22, 0xA6,
27210x5B, 0x1F, 0x00, 0x0C, 0x32, 0x00, 0x04, 0x24, 0x00, 0x00, 0x33, 0xA6,
27220x5B, 0x1F, 0x00, 0x0C, 0x32, 0x00, 0x04, 0x24, 0x00, 0x00, 0x30, 0xA6,
27230x5B, 0x1F, 0x00, 0x0C, 0x32, 0x00, 0x04, 0x24, 0x00, 0x10, 0x02, 0x24,
27240x00, 0x00, 0x22, 0xA6, 0xD8, 0x00, 0x45, 0x36, 0x00, 0x00, 0xA2, 0x90,
27250xA0, 0x00, 0x54, 0x36, 0xA4, 0x00, 0x55, 0x36, 0x7F, 0x00, 0x42, 0x30,
27260x00, 0x00, 0xA2, 0xA0, 0xA8, 0x00, 0x53, 0x36, 0x00, 0x80, 0x02, 0x3C,
27270xFC, 0x17, 0x03, 0x24, 0x00, 0x00, 0x80, 0xAE, 0x00, 0x00, 0xA0, 0xAE,
27280x00, 0x00, 0x62, 0xAE, 0x00, 0x00, 0x23, 0xA6, 0x00, 0x00, 0xA3, 0x90,
27290x02, 0x80, 0x10, 0x3C, 0x60, 0x1B, 0x10, 0x26, 0xAA, 0x1B, 0x04, 0x92,
27300x80, 0xFF, 0x02, 0x24, 0x25, 0x18, 0x62, 0x00, 0x56, 0x01, 0x52, 0x36,
27310xFF, 0x0F, 0x02, 0x24, 0x00, 0x00, 0xA3, 0xA0, 0x00, 0x00, 0x42, 0xA6,
27320x7A, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x04, 0x8E,
27330x14, 0x1C, 0x02, 0x8E, 0x18, 0x1C, 0x03, 0x8E, 0x2C, 0x00, 0xBF, 0x8F,
27340x00, 0x00, 0x82, 0xAE, 0x18, 0x00, 0xB2, 0x8F, 0x00, 0x00, 0xA3, 0xAE,
27350x20, 0x00, 0xB4, 0x8F, 0x00, 0x00, 0x64, 0xAE, 0x24, 0x00, 0xB5, 0x8F,
27360x00, 0x00, 0xC0, 0xA2, 0x1C, 0x00, 0xB3, 0x8F, 0x28, 0x00, 0xB6, 0x8F,
27370x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
27380x30, 0x00, 0xBD, 0x27, 0xC8, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
27390x10, 0x00, 0xA4, 0x27, 0x25, 0xB0, 0x10, 0x3C, 0x34, 0x00, 0xBF, 0xAF,
27400x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF, 0x28, 0x00, 0xB4, 0xAF,
27410x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
27420x1C, 0x00, 0xB1, 0xAF, 0x40, 0x00, 0x05, 0x36, 0x00, 0x00, 0xA2, 0x94,
27430x24, 0xFA, 0x03, 0x24, 0xA8, 0x00, 0x13, 0x36, 0x24, 0x10, 0x43, 0x00,
27440x00, 0x00, 0xA2, 0xA4, 0xA0, 0x00, 0x12, 0x36, 0xA4, 0x00, 0x10, 0x36,
27450x00, 0x00, 0x55, 0x8E, 0x00, 0x00, 0x16, 0x8E, 0x00, 0x00, 0x71, 0x8E,
27460x00, 0x80, 0x14, 0x3C, 0xFC, 0x37, 0x02, 0x24, 0x00, 0x00, 0x40, 0xAE,
27470x21, 0x88, 0x34, 0x02, 0x00, 0x00, 0x00, 0xAE, 0xFD, 0x00, 0x04, 0x24,
27480x00, 0x00, 0x74, 0xAE, 0x00, 0x00, 0xA2, 0xA4, 0x7A, 0x1F, 0x00, 0x0C,
27490x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAE, 0x10, 0x00, 0xA4, 0x27,
27500x00, 0x00, 0x16, 0xAE, 0x00, 0x00, 0x71, 0xAE, 0x90, 0x40, 0x00, 0x0C,
27510x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xBF, 0x8F, 0x30, 0x00, 0xB6, 0x8F,
27520x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
27530x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
27540x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27, 0xC8, 0xFF, 0xBD, 0x27,
27550x18, 0x00, 0xB0, 0xAF, 0x10, 0x00, 0xA4, 0x27, 0x25, 0xB0, 0x10, 0x3C,
27560x34, 0x00, 0xBF, 0xAF, 0x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF,
27570x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
27580x8A, 0x40, 0x00, 0x0C, 0x1C, 0x00, 0xB1, 0xAF, 0x40, 0x00, 0x05, 0x36,
27590x00, 0x00, 0xA2, 0x94, 0xAF, 0xFF, 0x03, 0x24, 0xA8, 0x00, 0x13, 0x36,
27600x24, 0x10, 0x43, 0x00, 0x00, 0x00, 0xA2, 0xA4, 0xA0, 0x00, 0x12, 0x36,
27610xA4, 0x00, 0x10, 0x36, 0x00, 0x00, 0x55, 0x8E, 0x00, 0x00, 0x16, 0x8E,
27620x00, 0x00, 0x71, 0x8E, 0x00, 0x80, 0x14, 0x3C, 0xFC, 0x37, 0x02, 0x24,
27630x00, 0x00, 0x40, 0xAE, 0x21, 0x88, 0x34, 0x02, 0x00, 0x00, 0x00, 0xAE,
27640xFD, 0x00, 0x04, 0x24, 0x00, 0x00, 0x74, 0xAE, 0x00, 0x00, 0xA2, 0xA4,
27650x7A, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAE,
27660x10, 0x00, 0xA4, 0x27, 0x00, 0x00, 0x16, 0xAE, 0x00, 0x00, 0x71, 0xAE,
27670x90, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xBF, 0x8F,
27680x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
27690x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
27700x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27,
27710xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
27720x10, 0x00, 0xA4, 0x27, 0x25, 0xB0, 0x05, 0x3C, 0x40, 0x00, 0xA5, 0x34,
27730x00, 0x00, 0xA2, 0x94, 0xD8, 0xFD, 0x03, 0x24, 0x10, 0x00, 0xA4, 0x27,
27740x24, 0x10, 0x43, 0x00, 0xFC, 0x37, 0x03, 0x24, 0x00, 0x00, 0xA2, 0xA4,
27750x00, 0x00, 0xA3, 0xA4, 0x90, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
27760x18, 0x00, 0xBF, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
27770x20, 0x00, 0xBD, 0x27, 0xD0, 0xFF, 0xBD, 0x27, 0xFF, 0x00, 0x82, 0x30,
27780x10, 0x00, 0xA4, 0x27, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
27790x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x21, 0x88, 0xC0, 0x00,
27800x21, 0x80, 0xE0, 0x00, 0xC0, 0x90, 0x02, 0x00, 0x28, 0x00, 0xBF, 0xAF,
27810x8A, 0x40, 0x00, 0x0C, 0xFF, 0xFF, 0xB3, 0x30, 0x25, 0xB0, 0x02, 0x3C,
27820x40, 0x02, 0x49, 0x34, 0xF8, 0xFF, 0x10, 0x26, 0x21, 0x30, 0x00, 0x00,
27830x01, 0x00, 0x0A, 0x24, 0x44, 0x02, 0x48, 0x34, 0x99, 0x20, 0x00, 0x08,
27840x01, 0x80, 0x07, 0x3C, 0x2E, 0x00, 0xCA, 0x10, 0x00, 0x00, 0x00, 0x00,
27850x01, 0x00, 0x02, 0x92, 0x00, 0x00, 0x04, 0x92, 0x02, 0x00, 0x03, 0x92,
27860x03, 0x00, 0x05, 0x92, 0x00, 0x12, 0x02, 0x00, 0x25, 0x20, 0x82, 0x00,
27870x00, 0x1C, 0x03, 0x00, 0x25, 0x20, 0x83, 0x00, 0x21, 0x10, 0x46, 0x02,
27880x00, 0x2E, 0x05, 0x00, 0x01, 0x00, 0xC6, 0x24, 0x25, 0x20, 0x85, 0x00,
27890x25, 0x10, 0x47, 0x00, 0x06, 0x00, 0xC3, 0x2C, 0x00, 0x00, 0x04, 0xAD,
27900x04, 0x00, 0x10, 0x26, 0x00, 0x00, 0x22, 0xAD, 0x12, 0x00, 0x60, 0x10,
27910x00, 0x00, 0x00, 0x00, 0xEA, 0xFF, 0xC0, 0x14, 0x00, 0x00, 0x00, 0x00,
27920x00, 0x00, 0x22, 0x92, 0x01, 0x00, 0x23, 0x92, 0x04, 0x00, 0x10, 0x26,
27930x00, 0x14, 0x02, 0x00, 0x25, 0x10, 0x62, 0x02, 0x00, 0x1E, 0x03, 0x00,
27940x25, 0x20, 0x43, 0x00, 0x21, 0x10, 0x46, 0x02, 0x01, 0x00, 0xC6, 0x24,
27950x25, 0x10, 0x47, 0x00, 0x06, 0x00, 0xC3, 0x2C, 0x00, 0x00, 0x04, 0xAD,
27960x00, 0x00, 0x22, 0xAD, 0xF0, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00,
27970x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x28, 0x00, 0xBF, 0x8F,
27980x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
27990x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
28000x03, 0x00, 0x22, 0x92, 0x02, 0x00, 0x24, 0x92, 0x04, 0x00, 0x23, 0x92,
28010x05, 0x00, 0x25, 0x92, 0x8B, 0x20, 0x00, 0x08, 0x00, 0x12, 0x02, 0x00,
28020xFF, 0xFF, 0x84, 0x30, 0x42, 0xB0, 0x08, 0x3C, 0x80, 0x10, 0x04, 0x00,
28030x21, 0x10, 0x48, 0x00, 0x04, 0x00, 0x46, 0xAC, 0x00, 0x00, 0x07, 0x91,
28040x40, 0x18, 0x04, 0x00, 0x03, 0x00, 0x06, 0x24, 0xFF, 0x00, 0xE7, 0x30,
28050x04, 0x30, 0x66, 0x00, 0x01, 0x00, 0x02, 0x24, 0x04, 0x10, 0x62, 0x00,
28060x25, 0x30, 0xC7, 0x00, 0xFF, 0xFF, 0xA5, 0x30, 0x25, 0x10, 0x47, 0x00,
28070x02, 0x00, 0xA0, 0x14, 0xFF, 0x00, 0xC7, 0x30, 0xFF, 0x00, 0x47, 0x30,
28080x42, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0x47, 0xA0, 0x08, 0x00, 0xE0, 0x03,
28090x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x83, 0x90, 0x01, 0x00, 0x02, 0x24,
28100x08, 0x00, 0x86, 0xAC, 0x18, 0x00, 0x85, 0xAC, 0x00, 0x00, 0x84, 0xAC,
28110x03, 0x00, 0x62, 0x10, 0x04, 0x00, 0x84, 0xAC, 0x5F, 0x5C, 0x00, 0x08,
28120x0C, 0x00, 0x80, 0xAC, 0x0C, 0x00, 0x82, 0x8C, 0x5F, 0x5C, 0x00, 0x08,
28130x10, 0x00, 0x82, 0xAC, 0xC8, 0xFF, 0xBD, 0x27, 0x28, 0x00, 0xB6, 0xAF,
28140x25, 0xB0, 0x02, 0x3C, 0x02, 0x80, 0x16, 0x3C, 0x2C, 0x00, 0xB7, 0xAF,
28150x24, 0x00, 0xB5, 0xAF, 0x20, 0x00, 0xB4, 0xAF, 0x1C, 0x00, 0xB3, 0xAF,
28160x18, 0x00, 0xB2, 0xAF, 0x30, 0x00, 0xBF, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
28170x10, 0x00, 0xB0, 0xAF, 0x18, 0x03, 0x55, 0x34, 0x01, 0x80, 0x17, 0x3C,
28180x02, 0x80, 0x13, 0x3C, 0x02, 0x80, 0x14, 0x3C, 0xD0, 0xDF, 0xD2, 0x26,
28190x6C, 0x83, 0xE2, 0x26, 0x00, 0x00, 0xA2, 0xAE, 0xD0, 0xDF, 0xD0, 0x8E,
28200x9B, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x5C, 0x71, 0x8E,
28210x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x20, 0x12, 0x00, 0x00, 0x00, 0x00,
28220x96, 0x40, 0x00, 0x0C, 0xFC, 0x5C, 0x60, 0xAE, 0x22, 0x00, 0x12, 0x12,
28230x08, 0x0C, 0x84, 0x26, 0x14, 0x00, 0x03, 0x92, 0x01, 0x00, 0x02, 0x24,
28240x2A, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x60, 0x14,
28250x02, 0x00, 0x02, 0x24, 0x0C, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x00, 0x00,
28260x2B, 0x10, 0x23, 0x02, 0x1D, 0x00, 0x40, 0x10, 0x23, 0x10, 0x71, 0x00,
28270x0C, 0x00, 0x02, 0xAE, 0x00, 0x00, 0x10, 0x8E, 0xF7, 0x20, 0x00, 0x08,
28280x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x62, 0x14, 0x00, 0x00, 0x00, 0x00,
28290x0C, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x60, 0x10,
28300x2B, 0x10, 0x23, 0x02, 0xF5, 0xFF, 0x40, 0x14, 0x23, 0x10, 0x71, 0x00,
28310x08, 0x00, 0x02, 0x8E, 0x18, 0x00, 0x04, 0x8E, 0x09, 0xF8, 0x40, 0x00,
28320x0C, 0x00, 0x00, 0xAE, 0x00, 0x00, 0x10, 0x8E, 0xF7, 0x20, 0x00, 0x08,
28330x00, 0x00, 0x00, 0x00, 0x96, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
28340x08, 0x0C, 0x84, 0x26, 0x21, 0x28, 0x00, 0x00, 0x21, 0x30, 0x00, 0x00,
28350x76, 0x39, 0x00, 0x0C, 0x21, 0x38, 0x00, 0x00, 0xED, 0x20, 0x00, 0x08,
28360x6C, 0x83, 0xE2, 0x26, 0x08, 0x00, 0x02, 0x8E, 0x18, 0x00, 0x04, 0x8E,
28370x09, 0xF8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x21, 0x00, 0x08,
28380x0C, 0x00, 0x02, 0xAE, 0x0C, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x00, 0x00,
28390x2B, 0x10, 0x23, 0x02, 0xDA, 0xFF, 0x40, 0x14, 0x23, 0x10, 0x71, 0x00,
28400x08, 0x00, 0x02, 0x8E, 0x18, 0x00, 0x04, 0x8E, 0x09, 0xF8, 0x40, 0x00,
28410x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x00, 0x00,
28420x0C, 0x00, 0x03, 0xAE, 0x00, 0x00, 0x10, 0x8E, 0xF7, 0x20, 0x00, 0x08,
28430x00, 0x00, 0x00, 0x00, 0xD8, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C,
28440xC0, 0x54, 0x42, 0x24, 0x18, 0x00, 0xB0, 0xAF, 0xC0, 0x80, 0x04, 0x00,
28450x21, 0x80, 0x02, 0x02, 0x1C, 0x00, 0xB1, 0xAF, 0x20, 0x00, 0xBF, 0xAF,
28460x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x00, 0x00, 0x02, 0x8E,
28470x10, 0x00, 0xA4, 0x27, 0x09, 0x00, 0x50, 0x10, 0x21, 0x88, 0x00, 0x00,
28480x04, 0x00, 0x43, 0x8C, 0x21, 0x88, 0x40, 0x00, 0x00, 0x00, 0x42, 0x8C,
28490x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xAC, 0x04, 0x00, 0x43, 0xAC,
28500x00, 0x00, 0x31, 0xAE, 0x04, 0x00, 0x31, 0xAE, 0x90, 0x40, 0x00, 0x0C,
28510x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x20, 0x02, 0x20, 0x00, 0xBF, 0x8F,
28520x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
28530x28, 0x00, 0xBD, 0x27, 0xE8, 0xFF, 0xBD, 0x27, 0x01, 0x01, 0x82, 0x2C,
28540x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF, 0x21, 0x80, 0x80, 0x00,
28550x21, 0x18, 0x00, 0x00, 0x10, 0x00, 0x40, 0x14, 0x01, 0x00, 0x04, 0x24,
28560x01, 0x02, 0x02, 0x2E, 0x0D, 0x00, 0x40, 0x14, 0x02, 0x00, 0x04, 0x24,
28570x01, 0x08, 0x02, 0x2E, 0x0A, 0x00, 0x40, 0x14, 0x03, 0x00, 0x04, 0x24,
28580x01, 0x10, 0x02, 0x2E, 0x06, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
28590x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00,
28600x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x04, 0x00, 0x04, 0x24,
28610x35, 0x21, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x40, 0x10,
28620x21, 0x18, 0x40, 0x00, 0x0C, 0x00, 0x50, 0xAC, 0x14, 0x00, 0xBF, 0x8F,
28630x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
28640x18, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
28650x21, 0x80, 0x80, 0x00, 0x1C, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
28660x10, 0x00, 0xA4, 0x27, 0x10, 0x00, 0x03, 0x8E, 0x02, 0x80, 0x02, 0x3C,
28670xC0, 0x54, 0x42, 0x24, 0xC0, 0x18, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
28680x00, 0x00, 0x64, 0x8C, 0x02, 0x80, 0x06, 0x3C, 0x02, 0x80, 0x07, 0x3C,
28690x00, 0x00, 0x04, 0xAE, 0x04, 0x00, 0x90, 0xAC, 0x04, 0x00, 0x03, 0xAE,
28700xC4, 0x5D, 0xC5, 0x8C, 0x10, 0x00, 0xA4, 0x27, 0x05, 0x00, 0xA0, 0x10,
28710x00, 0x00, 0x70, 0xAC, 0xB0, 0x5D, 0xE2, 0x8C, 0xC4, 0x5D, 0xC0, 0xAC,
28720x25, 0x10, 0x45, 0x00, 0xB0, 0x5D, 0xE2, 0xAC, 0x90, 0x40, 0x00, 0x0C,
28730x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
28740x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xC9, 0xF7, 0x1B, 0x6B,
28750x6B, 0xEB, 0x60, 0x33, 0xFF, 0x6A, 0x60, 0x33, 0x4C, 0xEC, 0x60, 0xF1,
28760x00, 0x4B, 0xAC, 0xEA, 0x69, 0xE2, 0x80, 0xC2, 0x20, 0xE8, 0x00, 0x65,
28770xFF, 0x6A, 0x8C, 0xEA, 0x15, 0x5A, 0x0E, 0x60, 0x01, 0x6B, 0x83, 0x67,
28780x84, 0xEA, 0x02, 0xF0, 0x00, 0x6A, 0x40, 0x32, 0xEE, 0xF0, 0x10, 0x4A,
28790x8C, 0xEA, 0x05, 0x2A, 0x0F, 0x6A, 0x8C, 0xEA, 0x02, 0x6B, 0x01, 0x2A,
28800x00, 0x6B, 0x20, 0xE8, 0x43, 0x67, 0x00, 0x00, 0xFF, 0x63, 0x00, 0xD0,
28810x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x8C, 0x30, 0x0A, 0x65,
28820x89, 0xE0, 0x48, 0x32, 0x89, 0xE2, 0x68, 0x67, 0x63, 0xF3, 0x00, 0x4B,
28830x48, 0x32, 0x69, 0xE2, 0x01, 0xD1, 0x00, 0x6B, 0x04, 0xF5, 0x6A, 0xC2,
28840x04, 0xF5, 0x6B, 0xC2, 0x04, 0xF5, 0x64, 0x9A, 0x1C, 0x6D, 0x22, 0x67,
28850x01, 0x6F, 0xFF, 0x6E, 0x02, 0x10, 0xFF, 0x4D, 0xCC, 0xED, 0x47, 0x67,
28860x44, 0xED, 0x6C, 0xEA, 0xFA, 0x22, 0x04, 0xF5, 0xAA, 0xC1, 0x00, 0x6D,
28870x1D, 0x5D, 0x13, 0x60, 0x89, 0xE0, 0x48, 0x32, 0x68, 0x67, 0x89, 0xE2,
28880x63, 0xF3, 0x00, 0x4B, 0x48, 0x32, 0x79, 0xE2, 0x04, 0xF5, 0x44, 0x9E,
28890x01, 0x6B, 0x64, 0xED, 0x6C, 0xEA, 0x09, 0x2A, 0x01, 0x4D, 0xFF, 0x6A,
28900x4C, 0xED, 0x1D, 0x5D, 0xED, 0x61, 0x01, 0x91, 0x00, 0x90, 0x20, 0xE8,
28910x01, 0x63, 0x01, 0x91, 0x00, 0x90, 0x04, 0xF5, 0xAB, 0xC6, 0x20, 0xE8,
28920x01, 0x63, 0x00, 0x00, 0xFB, 0x63, 0x07, 0xD1, 0x10, 0xF0, 0x02, 0x69,
28930x00, 0xF4, 0x20, 0x31, 0x00, 0x6A, 0x63, 0xF3, 0x00, 0x49, 0x08, 0x62,
28940x06, 0xD0, 0x04, 0xD2, 0x34, 0x10, 0x03, 0x54, 0x62, 0x60, 0x01, 0x74,
28950x6E, 0x60, 0x04, 0xF5, 0x88, 0x99, 0x07, 0x6A, 0xFF, 0x6B, 0x82, 0x34,
28960x86, 0x34, 0x4C, 0xEC, 0x04, 0x58, 0x6C, 0xEC, 0x12, 0x60, 0x00, 0x18,
28970xA1, 0x5C, 0xB0, 0x67, 0xC9, 0xF7, 0x1B, 0x6C, 0x04, 0xF5, 0x60, 0x99,
28980x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x4C, 0xEB, 0x80, 0xF1, 0x04, 0x4C,
28990x08, 0x32, 0x89, 0xE2, 0x04, 0xF5, 0x64, 0xD9, 0x60, 0xDA, 0x00, 0x18,
29000xA5, 0x21, 0x04, 0x94, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x04, 0x93,
29010x80, 0x34, 0x80, 0x34, 0x60, 0xF1, 0x00, 0x4C, 0x89, 0xE3, 0x40, 0xA2,
29020x04, 0x92, 0x7F, 0x49, 0x15, 0x49, 0x01, 0x4A, 0x20, 0x5A, 0x04, 0xD2,
29030x48, 0x60, 0x04, 0xF5, 0xA8, 0x99, 0x01, 0x6B, 0xA2, 0x34, 0x92, 0x32,
29040x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, 0xF0, 0x22, 0xE4, 0xF4, 0x78, 0x99,
29050xFF, 0x6A, 0x86, 0x34, 0x72, 0x33, 0x4C, 0xEB, 0x7F, 0x6A, 0x4C, 0xEB,
29060x07, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x07, 0x68, 0xAC, 0xE8,
29070x02, 0x74, 0x4C, 0xE8, 0xB2, 0x61, 0x38, 0x5B, 0x0A, 0x61, 0x01, 0xF6,
29080x01, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x00, 0xF2, 0x00, 0x6B, 0x6D, 0xEA,
29090x04, 0xF5, 0x48, 0xD9, 0xAA, 0x17, 0x14, 0x5B, 0xA8, 0x60, 0x01, 0xF6,
29100x01, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x00, 0xF6, 0x00, 0x6B, 0x6D, 0xEA,
29110xF3, 0x17, 0x03, 0x74, 0x9E, 0x61, 0x1A, 0x5B, 0x9C, 0x61, 0x01, 0xF6,
29120x01, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x00, 0xF4, 0x00, 0x6C, 0x8D, 0xEA,
29130x04, 0xF5, 0x48, 0xD9, 0x92, 0x17, 0x32, 0x5B, 0x90, 0x60, 0x01, 0xF6,
29140x01, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x00, 0xF4, 0x00, 0x6B, 0x6D, 0xEA,
29150xDB, 0x17, 0x08, 0x97, 0x07, 0x91, 0x06, 0x90, 0x00, 0x6A, 0x00, 0xEF,
29160x05, 0x63, 0x00, 0x00, 0x20, 0xE8, 0x00, 0x65, 0xA4, 0x67, 0xC9, 0xF7,
29170x1B, 0x6C, 0xFC, 0x63, 0x8B, 0xEC, 0x06, 0xD0, 0x80, 0x34, 0xAC, 0x30,
29180xA1, 0xE0, 0x80, 0x34, 0x07, 0x62, 0x80, 0xF1, 0x40, 0x44, 0x08, 0x30,
29190x40, 0xA2, 0xA1, 0xE0, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
29200x63, 0xF3, 0x00, 0x4A, 0x08, 0x30, 0x41, 0xE0, 0x04, 0xF5, 0x48, 0x98,
29210x07, 0x6B, 0x80, 0xF1, 0x04, 0x4C, 0x6C, 0xEA, 0x48, 0x32, 0x89, 0xE2,
29220x04, 0xF5, 0x60, 0x98, 0x40, 0x9A, 0x85, 0x67, 0x6C, 0xEA, 0x04, 0xF5,
29230x44, 0xD8, 0x00, 0x18, 0xA5, 0x21, 0x04, 0xD5, 0x04, 0x95, 0x04, 0xF5,
29240x8A, 0xA0, 0xFF, 0x6A, 0x00, 0x18, 0x93, 0x21, 0x4C, 0xED, 0x07, 0x97,
29250x06, 0x90, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x00, 0xFF, 0xF7, 0x1F, 0x6B,
29260x8C, 0xEB, 0x00, 0xF2, 0x00, 0x6A, 0x0B, 0x6C, 0x6C, 0xEA, 0x6C, 0xEC,
29270x07, 0x6B, 0x0E, 0x2A, 0x0C, 0x5C, 0x0B, 0x60, 0x10, 0xF0, 0x02, 0x6B,
29280x00, 0xF4, 0x60, 0x33, 0x88, 0x32, 0x7D, 0xF7, 0x08, 0x4B, 0x69, 0xE2,
29290x40, 0x9A, 0x00, 0xEA, 0x00, 0x65, 0x07, 0x6B, 0x20, 0xE8, 0x43, 0x67,
29300x06, 0x6B, 0x20, 0xE8, 0x43, 0x67, 0x05, 0x6B, 0x20, 0xE8, 0x43, 0x67,
29310x04, 0x6B, 0x20, 0xE8, 0x43, 0x67, 0x03, 0x6B, 0x20, 0xE8, 0x43, 0x67,
29320x02, 0x6B, 0x20, 0xE8, 0x43, 0x67, 0x01, 0x6B, 0x20, 0xE8, 0x43, 0x67,
29330x00, 0x6B, 0x20, 0xE8, 0x43, 0x67, 0x00, 0x00, 0x10, 0xF0, 0x02, 0x6B,
29340x00, 0xF4, 0x60, 0x33, 0xF7, 0x63, 0x63, 0xF3, 0x00, 0x4B, 0x00, 0x6A,
29350x0F, 0xD1, 0x23, 0x67, 0x10, 0x62, 0x0E, 0xD0, 0x04, 0xD2, 0x05, 0xD3,
29360x06, 0xD3, 0x07, 0xD3, 0x08, 0xD2, 0x09, 0xD2, 0x0A, 0xD2, 0x0B, 0xD2,
29370x0C, 0xD2, 0xE4, 0xF4, 0x08, 0x49, 0x48, 0x99, 0x01, 0x6B, 0xFF, 0x6C,
29380x42, 0x32, 0x52, 0x32, 0x6C, 0xEA, 0x8C, 0xEA, 0x80, 0xF0, 0x11, 0x22,
29390xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x04, 0x96, 0x40, 0x32,
29400x60, 0xF1, 0x00, 0x4A, 0x49, 0xE6, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEC,
29410x05, 0x92, 0x0C, 0x65, 0x51, 0xE4, 0xC0, 0xF4, 0x4A, 0xA4, 0x6C, 0xEA,
29420x61, 0x99, 0x58, 0xEB, 0xE0, 0xF4, 0x47, 0xA4, 0xFF, 0x6B, 0x6C, 0xEA,
29430x62, 0x99, 0x12, 0xED, 0x00, 0x65, 0x00, 0x65, 0x58, 0xEB, 0x12, 0xEA,
29440x55, 0xE5, 0xFF, 0xF7, 0x4C, 0x99, 0xA3, 0xEA, 0x40, 0xF1, 0x0F, 0x61,
29450xAB, 0xE2, 0xFF, 0xF7, 0x4C, 0xD9, 0x61, 0x99, 0x42, 0x99, 0xC8, 0x67,
29460xFF, 0xF7, 0xEC, 0x99, 0x55, 0xE3, 0xFF, 0xF7, 0x70, 0x99, 0xFF, 0xF7,
29470x54, 0x99, 0x51, 0xE3, 0xFF, 0xF7, 0x7C, 0x99, 0x40, 0x99, 0x41, 0xE3,
29480x05, 0x93, 0x69, 0xE6, 0x20, 0xF5, 0x5E, 0xA2, 0xFF, 0x6E, 0xCC, 0xEA,
29490xC5, 0x67, 0x0F, 0x25, 0xA3, 0xEA, 0xD8, 0x67, 0x0D, 0x2E, 0x48, 0x67,
29500x07, 0x5A, 0x04, 0x61, 0x0C, 0x72, 0x02, 0x60, 0x0D, 0x72, 0x05, 0x61,
29510xAC, 0x32, 0xAB, 0xE2, 0x4E, 0x32, 0x83, 0xEA, 0x10, 0x61, 0x79, 0x26,
29520x05, 0x92, 0x68, 0x67, 0x68, 0x34, 0x51, 0xE4, 0x06, 0x92, 0x69, 0xE2,
29530x44, 0xF5, 0x66, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x60, 0xF5, 0x40, 0x9C,
29540x44, 0xEB, 0xE3, 0xEA, 0x6A, 0x60, 0x01, 0x68, 0x5F, 0x99, 0x70, 0x67,
29550x88, 0x67, 0x64, 0xEC, 0x6C, 0xEA, 0x00, 0xF1, 0x1C, 0x22, 0x06, 0x96,
29560x95, 0xE6, 0x44, 0xF5, 0x66, 0xA5, 0x04, 0xF5, 0xEC, 0xA5, 0xFF, 0x6E,
29570x46, 0x67, 0xCC, 0xEB, 0x0A, 0x6C, 0xEC, 0xEA, 0x84, 0xEB, 0x82, 0xEA,
29580x00, 0xF1, 0x0D, 0x60, 0x41, 0x47, 0x04, 0xF5, 0x4C, 0xC5, 0xCC, 0xEA,
29590x8E, 0xEA, 0x02, 0x2A, 0x24, 0xF5, 0x09, 0xC5, 0x05, 0x94, 0x68, 0x67,
29600x68, 0x32, 0x89, 0xE2, 0xC0, 0xF5, 0x94, 0x9A, 0x60, 0xF5, 0x40, 0x9A,
29610x84, 0x33, 0x8D, 0xE3, 0x69, 0xE2, 0x4A, 0x37, 0xFF, 0xF7, 0xEC, 0xD9,
29620x05, 0x96, 0x27, 0xF1, 0x44, 0x9E, 0xFF, 0xF7, 0x1F, 0x72, 0xC0, 0xF0,
29630x1B, 0x61, 0x00, 0x6B, 0x61, 0xD9, 0x62, 0xD9, 0xFF, 0xF7, 0x70, 0xD9,
29640xFF, 0xF7, 0x74, 0xD9, 0xFF, 0xF7, 0x78, 0xD9, 0xFF, 0xF7, 0x7C, 0xD9,
29650x60, 0xD9, 0x04, 0x94, 0x0C, 0x96, 0x0B, 0x92, 0x01, 0x4C, 0x0A, 0x93,
29660x04, 0xD4, 0x09, 0x94, 0x7F, 0x4E, 0x7F, 0x4A, 0x7F, 0x4B, 0x15, 0x4E,
29670x15, 0x4A, 0x15, 0x4B, 0x7F, 0x4C, 0x15, 0x4C, 0x0C, 0xD6, 0x0B, 0xD2,
29680x08, 0x96, 0x07, 0x92, 0x0A, 0xD3, 0x06, 0x93, 0x09, 0xD4, 0x04, 0x94,
29690x7F, 0x4E, 0x7F, 0x4A, 0x7F, 0x4B, 0x15, 0x4E, 0x15, 0x4A, 0x15, 0x4B,
29700x7F, 0x49, 0x20, 0x54, 0x08, 0xD6, 0x07, 0xD2, 0x06, 0xD3, 0x15, 0x49,
29710x3F, 0xF7, 0x15, 0x61, 0x10, 0x97, 0x0F, 0x91, 0x0E, 0x90, 0x00, 0xEF,
29720x09, 0x63, 0xA0, 0xF0, 0x0E, 0x25, 0xA0, 0xF0, 0x0E, 0x2E, 0xA4, 0x32,
29730xA9, 0xE2, 0x4A, 0x32, 0x03, 0xEA, 0xC1, 0x60, 0x06, 0x96, 0x48, 0x67,
29740x00, 0x6B, 0x51, 0xE6, 0x04, 0xF5, 0x6C, 0xC4, 0x01, 0x6B, 0x64, 0xEA,
29750x5F, 0x99, 0x6F, 0xEB, 0x6C, 0xEA, 0x5F, 0xD9, 0x24, 0xF5, 0x49, 0xA4,
29760xFF, 0x6C, 0x8C, 0xEA, 0x01, 0x72, 0x10, 0x60, 0x09, 0x96, 0x10, 0xF0,
29770x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x00, 0x6D, 0x63, 0xF3, 0x00, 0x4A,
29780x4D, 0xE6, 0x85, 0x67, 0xA9, 0xE3, 0x01, 0x4D, 0x1D, 0x55, 0x44, 0xF5,
29790x86, 0xC2, 0xFA, 0x61, 0x06, 0x93, 0x88, 0x67, 0x00, 0x6E, 0x89, 0xE3,
29800x24, 0xF5, 0xC9, 0xC2, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
29810x9D, 0xF7, 0x18, 0x4A, 0x00, 0x9A, 0x10, 0xF0, 0x02, 0x6F, 0x00, 0xF4,
29820xE0, 0x37, 0x10, 0xF0, 0x02, 0x6E, 0x00, 0xF4, 0xC0, 0x36, 0x00, 0x6D,
29830x5C, 0xF4, 0x00, 0x4F, 0xDC, 0xF3, 0x0C, 0x4E, 0xA8, 0x32, 0xED, 0xE2,
29840x60, 0x9B, 0x11, 0xE2, 0xC9, 0xE2, 0xC0, 0xF5, 0x74, 0xDC, 0x40, 0x9A,
29850x01, 0x4D, 0x1D, 0x55, 0x60, 0xF5, 0x40, 0xDC, 0xF3, 0x61, 0x68, 0x67,
29860x20, 0x23, 0x07, 0x94, 0xA8, 0x67, 0xFF, 0x4D, 0x04, 0xF5, 0x4B, 0xA4,
29870xFF, 0x68, 0x42, 0xED, 0x18, 0x61, 0x08, 0x96, 0x10, 0xF0, 0x02, 0x6B,
29880x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x69, 0xE6, 0x04, 0xF5,
29890x8B, 0xA2, 0x04, 0xF5, 0xC4, 0x9A, 0x01, 0x6F, 0x0C, 0xEC, 0x67, 0x67,
29900x64, 0xED, 0x46, 0x67, 0x6C, 0xEA, 0x6E, 0xEA, 0x00, 0xF1, 0x03, 0x22,
29910xFF, 0x4D, 0x82, 0xED, 0xF6, 0x60, 0x88, 0x67, 0x10, 0xF0, 0x02, 0x6E,
29920x00, 0xF4, 0xC0, 0x36, 0x88, 0x32, 0x63, 0xF3, 0x00, 0x4E, 0xC9, 0xE2,
29930xC0, 0xF5, 0x94, 0x9A, 0x60, 0xF5, 0x40, 0x9A, 0x84, 0x33, 0x8D, 0xE3,
29940x69, 0xE2, 0x4A, 0x37, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
29950xCB, 0xF4, 0x46, 0xA2, 0xFF, 0x6B, 0x6C, 0xEA, 0x22, 0x72, 0xC0, 0xF0,
29960x17, 0x61, 0x88, 0x67, 0x13, 0x74, 0x3F, 0xF7, 0x0D, 0x60, 0x07, 0x96,
29970x01, 0x6B, 0x64, 0xEC, 0x64, 0xF5, 0x44, 0x9E, 0xFF, 0xF7, 0xEC, 0xD9,
29980x6D, 0xEA, 0x64, 0xF5, 0x44, 0xDE, 0x05, 0x96, 0x27, 0xF1, 0x44, 0x9E,
29990xFF, 0xF7, 0x1F, 0x72, 0x3F, 0xF7, 0x05, 0x60, 0x04, 0x95, 0xFF, 0x6A,
30000x88, 0x67, 0x00, 0x18, 0x93, 0x21, 0x4C, 0xED, 0x1E, 0x17, 0x00, 0x6B,
30010xFF, 0xF7, 0x6C, 0xD9, 0xB0, 0x16, 0x1F, 0xF7, 0x18, 0x26, 0x05, 0x94,
30020x68, 0x67, 0x68, 0x32, 0x89, 0xE2, 0xC0, 0xF5, 0x54, 0x9A, 0x43, 0xEF,
30030x4E, 0x17, 0x48, 0x67, 0x1C, 0x5A, 0xFF, 0xF6, 0x17, 0x60, 0x06, 0x94,
30040x4D, 0xE4, 0x24, 0xF5, 0x49, 0xA3, 0xFF, 0x6C, 0x01, 0x72, 0x53, 0x60,
30050x0C, 0x96, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x00, 0x6D,
30060x63, 0xF3, 0x00, 0x4A, 0x4D, 0xE6, 0x85, 0x67, 0xA9, 0xE3, 0x01, 0x4D,
30070x1D, 0x55, 0x44, 0xF5, 0x86, 0xC2, 0xFA, 0x61, 0x06, 0x93, 0x88, 0x67,
30080x00, 0x6E, 0x89, 0xE3, 0x01, 0x6C, 0x04, 0xF5, 0xCC, 0xC2, 0x24, 0xF5,
30090xC9, 0xC2, 0x64, 0x67, 0x48, 0x67, 0x64, 0xEA, 0x5F, 0x99, 0x6F, 0xEB,
30100x6C, 0xEA, 0x68, 0x67, 0x5F, 0xD9, 0x4E, 0x23, 0x20, 0xF0, 0x42, 0xA1,
30110xA8, 0x67, 0x01, 0x4D, 0xA2, 0xEA, 0xFF, 0x68, 0x17, 0x61, 0x0A, 0x93,
30120x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x63, 0xF3, 0x00, 0x4C,
30130x89, 0xE3, 0x04, 0xF5, 0x8A, 0xA2, 0x04, 0xF5, 0xC4, 0x9A, 0x01, 0x6F,
30140x0C, 0xEC, 0x67, 0x67, 0x64, 0xED, 0x46, 0x67, 0x6C, 0xEA, 0x6E, 0xEA,
30150x6F, 0x22, 0x01, 0x4D, 0xA2, 0xEC, 0xF7, 0x60, 0x10, 0xF0, 0x02, 0x6A,
30160x00, 0xF4, 0x40, 0x32, 0xCB, 0xF4, 0x46, 0xA2, 0x22, 0x72, 0xBF, 0xF6,
30170x07, 0x61, 0x48, 0x67, 0xEE, 0x4A, 0xFF, 0x6B, 0x6C, 0xEA, 0x02, 0x5A,
30180xBF, 0xF6, 0x00, 0x60, 0x18, 0x6E, 0x0E, 0x65, 0x9D, 0x16, 0xC8, 0x67,
30190x18, 0x5E, 0x3F, 0x61, 0x44, 0xF5, 0x46, 0xA3, 0x4C, 0xEC, 0x05, 0x5C,
30200x03, 0x60, 0x01, 0x4A, 0x44, 0xF5, 0x46, 0xC3, 0x06, 0x93, 0x88, 0x67,
30210x00, 0x6E, 0x89, 0xE3, 0x01, 0x6C, 0x04, 0xF5, 0xCC, 0xC2, 0x24, 0xF5,
30220xC9, 0xC2, 0x64, 0x67, 0x48, 0x67, 0x64, 0xEA, 0x5F, 0x99, 0x6F, 0xEB,
30230x6C, 0xEA, 0x68, 0x67, 0x5F, 0xD9, 0xB2, 0x2B, 0x20, 0xF0, 0x42, 0xA1,
30240xA4, 0x67, 0xFF, 0x68, 0xAD, 0x22, 0x0B, 0x94, 0x10, 0xF0, 0x02, 0x6E,
30250x00, 0xF4, 0xC0, 0x36, 0x63, 0xF3, 0x00, 0x4E, 0xC9, 0xE4, 0x04, 0xF5,
30260x8A, 0xA2, 0xE5, 0x67, 0x04, 0xF5, 0xC4, 0x9A, 0x0C, 0xEC, 0x67, 0x67,
30270x64, 0xED, 0x46, 0x67, 0x6C, 0xEA, 0x6E, 0xEA, 0x09, 0x22, 0x01, 0x4D,
30280xA2, 0xEC, 0x96, 0x61, 0x67, 0x67, 0x64, 0xED, 0x46, 0x67, 0x6C, 0xEA,
30290x6E, 0xEA, 0xF7, 0x2A, 0x0C, 0xED, 0x0D, 0x65, 0x8D, 0x17, 0x48, 0x67,
30300x05, 0x5A, 0x05, 0x60, 0x44, 0xF5, 0x46, 0xA3, 0x4C, 0xEC, 0x03, 0x5C,
30310xBD, 0x17, 0x44, 0xF5, 0x46, 0xA3, 0x4C, 0xEC, 0x04, 0x5C, 0xB8, 0x17,
30320x07, 0x94, 0x48, 0x67, 0x01, 0x6B, 0x64, 0xEA, 0x64, 0xF5, 0x44, 0x9C,
30330x6D, 0xEA, 0x64, 0xF5, 0x44, 0xDC, 0x50, 0x16, 0x0C, 0xED, 0x0D, 0x65,
30340x91, 0x17, 0x0C, 0xED, 0x0D, 0x65, 0xFD, 0x16, 0xFC, 0x63, 0x10, 0xF0,
30350x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x05, 0xD1, 0x06, 0x62, 0x04, 0xD0,
30360x63, 0xF3, 0x00, 0x4C, 0x87, 0xF0, 0x58, 0x9C, 0x87, 0xF0, 0x7D, 0xA4,
30370x65, 0xE2, 0x87, 0xF0, 0x54, 0x9C, 0x43, 0xE9, 0xE0, 0xF0, 0x04, 0x60,
30380x04, 0x67, 0x0C, 0x10, 0x10, 0xF0, 0x02, 0x68, 0x00, 0xF4, 0x00, 0x30,
30390x63, 0xF3, 0x00, 0x48, 0x87, 0xF0, 0x54, 0x98, 0x10, 0x49, 0x43, 0xE9,
30400xC0, 0xF0, 0x16, 0x60, 0x87, 0xF0, 0x5D, 0xA0, 0xFF, 0xF7, 0x1F, 0x6D,
30410x2C, 0xED, 0x10, 0x4A, 0x87, 0xF0, 0x5D, 0xC0, 0xEF, 0xF7, 0x1E, 0x6A,
30420x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4,
30430x80, 0x34, 0xAA, 0xF2, 0x14, 0x4C, 0x4D, 0xED, 0x00, 0x1C, 0xF4, 0x54,
30440x10, 0x6E, 0x46, 0xF7, 0xB8, 0x98, 0x1F, 0x6B, 0x40, 0xF4, 0xA2, 0x34,
30450x6C, 0xEC, 0x8C, 0x32, 0x89, 0xE2, 0x48, 0x32, 0x89, 0xE2, 0x48, 0x32,
30460x19, 0xE2, 0x04, 0xF5, 0x48, 0x9E, 0x01, 0x6B, 0x42, 0x32, 0x52, 0x32,
30470x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, 0xC8, 0x22, 0xC9, 0xF7, 0x1B, 0x6B,
30480x6B, 0xEB, 0x60, 0x33, 0x60, 0x33, 0x60, 0xF1, 0x00, 0x4B, 0x69, 0xE4,
30490x40, 0xA2, 0xFF, 0x6B, 0xFF, 0x6F, 0x4C, 0xEB, 0x0B, 0x65, 0x46, 0xF7,
30500x74, 0x98, 0x3F, 0x68, 0x80, 0xF5, 0x62, 0x32, 0x0C, 0xEA, 0x05, 0x52,
30510x4C, 0xEF, 0x01, 0x61, 0x04, 0x6F, 0xC0, 0xF7, 0x62, 0x32, 0x0E, 0x2A,
30520xE4, 0xF4, 0x54, 0x9E, 0x04, 0x6F, 0x01, 0x4A, 0xE4, 0xF4, 0x54, 0xDE,
30530x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A,
30540x46, 0xF7, 0xB8, 0x9A, 0xA2, 0x32, 0x52, 0x32, 0x1F, 0x6B, 0x6C, 0xEA,
30550x08, 0x52, 0x52, 0x60, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
30560x63, 0xF3, 0x00, 0x4D, 0x46, 0xF7, 0x54, 0x9D, 0x0C, 0xEA, 0x08, 0x67,
30570x0E, 0xEA, 0x46, 0x2A, 0x74, 0x27, 0x01, 0x77, 0x05, 0x61, 0xC4, 0xF4,
30580x5C, 0x9E, 0x01, 0x4A, 0xC4, 0xF4, 0x5C, 0xDE, 0x02, 0x77, 0x05, 0x61,
30590xE4, 0xF4, 0x40, 0x9E, 0x01, 0x4A, 0xE4, 0xF4, 0x40, 0xDE, 0x03, 0x77,
30600x05, 0x61, 0xE4, 0xF4, 0x44, 0x9E, 0x01, 0x4A, 0xE4, 0xF4, 0x44, 0xDE,
30610x04, 0x77, 0x05, 0x61, 0xE4, 0xF4, 0x48, 0x9E, 0x01, 0x4A, 0xE4, 0xF4,
30620x48, 0xDE, 0x10, 0xF0, 0x02, 0x68, 0x00, 0xF4, 0x00, 0x30, 0xA8, 0x67,
30630x63, 0xF3, 0x00, 0x48, 0x09, 0xE5, 0xE4, 0xF4, 0x78, 0x9E, 0x00, 0xF5,
30640x44, 0xA2, 0xFF, 0x6D, 0x72, 0x33, 0xAC, 0xEA, 0x43, 0xEB, 0x4D, 0x61,
30650xE4, 0xF4, 0x4C, 0x9E, 0x08, 0x67, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
30660x60, 0x33, 0x01, 0x4A, 0xE4, 0xF4, 0x4C, 0xDE, 0x08, 0x32, 0x63, 0xF3,
30670x00, 0x4B, 0x09, 0xE2, 0x69, 0xE2, 0xE9, 0xE2, 0xA0, 0xF3, 0x68, 0xA2,
30680xAC, 0xEB, 0xC4, 0xF4, 0x54, 0x9E, 0x69, 0xE2, 0xC4, 0xF4, 0x54, 0xDE,
30690x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B,
30700x08, 0xF0, 0x54, 0x9B, 0x3F, 0xF7, 0x1E, 0x22, 0x05, 0x74, 0x3F, 0xF7,
30710x1B, 0x61, 0x46, 0xF7, 0x54, 0x9B, 0xC0, 0xF7, 0x42, 0x32, 0x3F, 0xF7,
30720x15, 0x22, 0x00, 0x6A, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34,
30730x10, 0xF0, 0x02, 0x68, 0x00, 0xF4, 0x00, 0x30, 0x08, 0xF0, 0x54, 0xDB,
30740x9D, 0xF7, 0x1C, 0x4C, 0x63, 0xF3, 0x00, 0x48, 0x00, 0x1C, 0x13, 0x58,
30750x10, 0x49, 0x87, 0xF0, 0x54, 0x98, 0x43, 0xE9, 0x3F, 0xF7, 0x0A, 0x61,
30760x06, 0x97, 0x05, 0x91, 0x04, 0x90, 0x00, 0xEF, 0x04, 0x63, 0xC4, 0xF4,
30770x58, 0x9E, 0x01, 0x4A, 0xC4, 0xF4, 0x58, 0xDE, 0x86, 0x17, 0xE4, 0xF4,
30780x50, 0x9E, 0xA8, 0x67, 0x10, 0xF0, 0x02, 0x68, 0x00, 0xF4, 0x00, 0x30,
30790x01, 0x4A, 0xE4, 0xF4, 0x50, 0xDE, 0xA8, 0x32, 0xA9, 0xE2, 0x63, 0xF3,
30800x00, 0x48, 0x09, 0xE2, 0xE9, 0xE2, 0x20, 0xF4, 0x79, 0xA2, 0xFF, 0x6A,
30810x4C, 0xEB, 0xB1, 0x17, 0xE0, 0x63, 0x00, 0x6A, 0x3E, 0x62, 0x3D, 0xD1,
30820x3C, 0xD0, 0xFC, 0x63, 0x1D, 0xD2, 0x62, 0x67, 0x1D, 0x94, 0x04, 0x05,
30830x07, 0x68, 0x94, 0x32, 0xA9, 0xE2, 0x1E, 0xD0, 0x60, 0xDA, 0x1E, 0x94,
30840x04, 0x4A, 0xFF, 0x4C, 0x00, 0x54, 0x1E, 0xD4, 0xF9, 0x60, 0x1D, 0x95,
30850x01, 0x4D, 0x03, 0x5D, 0x1D, 0xD5, 0xEE, 0x61, 0xC9, 0xF7, 0x1B, 0x6A,
30860x4B, 0xEA, 0x40, 0x31, 0x20, 0x31, 0xC0, 0xF2, 0x44, 0x41, 0x1D, 0xD3,
30870x60, 0xDA, 0x41, 0x99, 0x01, 0xF7, 0x00, 0x6B, 0x01, 0xF4, 0x84, 0x41,
30880x42, 0x32, 0x6C, 0xEA, 0x42, 0x32, 0x00, 0x1C, 0xFA, 0x5B, 0x33, 0xD2,
30890x01, 0xF4, 0x88, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x31, 0xD2, 0x9D, 0x67,
30900x70, 0x4C, 0x00, 0x1C, 0x8A, 0x40, 0x32, 0xD2, 0x1D, 0x94, 0x10, 0x6D,
30910xA4, 0xED, 0x00, 0x1C, 0xAC, 0x45, 0xFF, 0x4D, 0x9D, 0x67, 0x70, 0x4C,
30920x00, 0x1C, 0x90, 0x40, 0x1F, 0xD2, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C,
30930x00, 0x1C, 0xF0, 0x42, 0x01, 0x6C, 0x9D, 0x67, 0x00, 0x1C, 0x8A, 0x40,
30940x70, 0x4C, 0x1D, 0x94, 0x10, 0x6D, 0xA4, 0xED, 0x00, 0x1C, 0xAC, 0x45,
30950xFF, 0x4D, 0x9D, 0x67, 0x70, 0x4C, 0x00, 0x1C, 0x90, 0x40, 0x20, 0xD2,
30960x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x00, 0x1C, 0xF0, 0x42, 0x1D, 0x94,
30970xE1, 0xF6, 0x80, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xD1, 0xF6,
30980x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x21, 0xD2, 0x71, 0xF6, 0x80, 0x41,
30990x00, 0x1C, 0xFA, 0x5B, 0x22, 0xD2, 0x71, 0xF6, 0x84, 0x41, 0x00, 0x1C,
31000xFA, 0x5B, 0x23, 0xD2, 0x71, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xFA, 0x5B,
31010x24, 0xD2, 0x71, 0xF6, 0x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x25, 0xD2,
31020x81, 0xF6, 0x80, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x26, 0xD2, 0x81, 0xF6,
31030x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x27, 0xD2, 0x81, 0xF6, 0x88, 0x41,
31040x00, 0x1C, 0xFA, 0x5B, 0x28, 0xD2, 0x81, 0xF6, 0x8C, 0x41, 0x00, 0x1C,
31050xFA, 0x5B, 0x29, 0xD2, 0xD1, 0xF6, 0x80, 0x41, 0x00, 0x1C, 0xFA, 0x5B,
31060x2A, 0xD2, 0xD1, 0xF6, 0x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x2B, 0xD2,
31070xD1, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x2C, 0xD2, 0x2D, 0xD2,
31080xE7, 0xF7, 0x0E, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA2, 0x67, 0xE1, 0xF6,
31090x80, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x36, 0xD2,
31100x36, 0x95, 0xD1, 0xF6, 0x8C, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C,
31110xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0x71, 0xF6, 0x80, 0x41, 0xF2, 0xF2,
31120x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0x71, 0xF6,
31130x84, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
31140x36, 0x95, 0x71, 0xF6, 0x88, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C,
31150xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0x71, 0xF6, 0x8C, 0x41, 0xF2, 0xF2,
31160x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0x81, 0xF6,
31170x80, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
31180x36, 0x95, 0x81, 0xF6, 0x84, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C,
31190xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0x81, 0xF6, 0x88, 0x41, 0xF2, 0xF2,
31200x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0x81, 0xF6,
31210x8C, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
31220x36, 0x95, 0xD1, 0xF6, 0x80, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C,
31230xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0xD1, 0xF6, 0x84, 0x41, 0xF2, 0xF2,
31240x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x36, 0x95, 0xD1, 0xF6,
31250x88, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
31260x33, 0x93, 0x01, 0x6A, 0x1D, 0x90, 0x4E, 0xEB, 0x43, 0xEB, 0x58, 0x67,
31270x39, 0xD2, 0x0F, 0xF7, 0x00, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x10, 0xF0,
31280x00, 0x4A, 0x43, 0xD2, 0x00, 0xF5, 0x00, 0x6A, 0x4B, 0xEA, 0x40, 0x32,
31290x40, 0x32, 0x1E, 0xD0, 0x37, 0xD2, 0x11, 0x67, 0x01, 0xF0, 0x00, 0x6A,
31300x4B, 0xEA, 0x40, 0x32, 0x00, 0x6B, 0x40, 0x32, 0x1D, 0xD3, 0x38, 0xD2,
31310x33, 0x94, 0x60, 0xF1, 0x13, 0x24, 0x39, 0x95, 0xE0, 0xF1, 0x0C, 0x2D,
31320xA1, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x05, 0xF0,
31330x00, 0x6B, 0x6B, 0xEB, 0x60, 0x33, 0x60, 0x33, 0x4C, 0xEB, 0x01, 0x5B,
31340x58, 0x67, 0x91, 0xF6, 0x84, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x35, 0xD2,
31350xE0, 0xF3, 0x1F, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x6C, 0xEA, 0x42, 0x32,
31360x42, 0x32, 0xB1, 0xF6, 0x84, 0x40, 0x3D, 0xD3, 0x00, 0x1C, 0xFA, 0x5B,
31370x2E, 0xD2, 0x3D, 0x94, 0x8C, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x91, 0xF6,
31380x8C, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x2F, 0xD2, 0x3D, 0x95, 0xB1, 0xF6,
31390x8C, 0x40, 0xAC, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x00, 0x1C, 0xFA, 0x5B,
31400x30, 0xD2, 0x3D, 0x93, 0x2E, 0x94, 0x4C, 0xEB, 0x62, 0x32, 0x20, 0xF1,
31410x00, 0x74, 0x42, 0x32, 0xA0, 0xF2, 0x15, 0x60, 0x2F, 0x95, 0x20, 0xF1,
31420x00, 0x75, 0xA0, 0xF2, 0x10, 0x60, 0x30, 0x93, 0x20, 0x73, 0xA0, 0xF2,
31430x0C, 0x60, 0x20, 0x72, 0x01, 0x6B, 0xA0, 0xF2, 0x08, 0x60, 0x2E, 0x94,
31440x80, 0x74, 0xA0, 0xF2, 0x02, 0x60, 0x2F, 0x95, 0x80, 0x75, 0x80, 0xF2,
31450x1E, 0x60, 0x30, 0x94, 0xE0, 0xF3, 0x00, 0x74, 0x80, 0xF2, 0x19, 0x60,
31460xE0, 0xF3, 0x00, 0x72, 0x01, 0x6A, 0x80, 0xF2, 0x14, 0x60, 0x35, 0x95,
31470x03, 0x25, 0x02, 0x23, 0x20, 0xF4, 0x19, 0x2A, 0x1D, 0x95, 0x01, 0x4D,
31480x0A, 0x5D, 0x1D, 0xD5, 0x97, 0x61, 0x1E, 0x92, 0x01, 0x4A, 0x03, 0x5A,
31490x1E, 0xD2, 0x8A, 0x61, 0x04, 0x90, 0x20, 0xF4, 0x09, 0x28, 0x0C, 0x91,
31500x03, 0x29, 0x14, 0x92, 0xFF, 0x6C, 0x2B, 0x22, 0x90, 0x67, 0x00, 0x18,
31510xA1, 0x5E, 0xB1, 0x67, 0x03, 0x5A, 0x07, 0x60, 0x05, 0x94, 0x00, 0x18,
31520xA1, 0x5E, 0x0D, 0x95, 0x03, 0x5A, 0x00, 0x6C, 0x1E, 0x61, 0x14, 0x93,
31530x90, 0x67, 0xA3, 0x67, 0x00, 0x18, 0xA1, 0x5E, 0x40, 0xD3, 0x03, 0x5A,
31540x07, 0x60, 0x05, 0x94, 0x00, 0x18, 0xA1, 0x5E, 0x15, 0x95, 0x03, 0x5A,
31550x00, 0x6C, 0x0F, 0x61, 0x40, 0x95, 0x00, 0x18, 0xA1, 0x5E, 0x91, 0x67,
31560x03, 0x5A, 0x40, 0xF2, 0x1E, 0x60, 0x0D, 0x94, 0x00, 0x18, 0xA1, 0x5E,
31570x15, 0x95, 0x03, 0x5A, 0x01, 0x6C, 0x40, 0xF2, 0x16, 0x60, 0xFF, 0x74,
31580x40, 0xF2, 0x17, 0x60, 0x04, 0x05, 0x94, 0x34, 0x10, 0xF0, 0x02, 0x69,
31590x00, 0xF4, 0x20, 0x31, 0xB1, 0xE4, 0x63, 0xF3, 0x00, 0x49, 0x60, 0x9C,
31600x43, 0x99, 0x00, 0xF4, 0x00, 0x68, 0xE0, 0xF3, 0x1F, 0x6F, 0x0B, 0xE8,
31610xEC, 0xEB, 0x0C, 0xEA, 0x6D, 0xEA, 0x61, 0x9C, 0x02, 0xF0, 0x00, 0x6E,
31620xCB, 0xEE, 0xEC, 0xEB, 0xC0, 0x36, 0xE0, 0xF3, 0x1F, 0x4E, 0x60, 0x33,
31630x68, 0x33, 0xCC, 0xEA, 0xE7, 0xF7, 0x10, 0x6D, 0x6D, 0xEA, 0xAB, 0xED,
31640x62, 0x9C, 0xA0, 0x35, 0xA0, 0x35, 0xFF, 0x4D, 0xEC, 0xEB, 0x00, 0xF5,
31650x60, 0x33, 0xAC, 0xEA, 0x6D, 0xEA, 0x43, 0xD9, 0x63, 0x9C, 0x44, 0x99,
31660xEC, 0xEB, 0x0C, 0xEA, 0x6D, 0xEA, 0x64, 0x9C, 0xCC, 0xEA, 0xEC, 0xEB,
31670x60, 0x33, 0x68, 0x33, 0x6D, 0xEA, 0x65, 0x9C, 0xAC, 0xEA, 0xEC, 0xEB,
31680x00, 0xF5, 0x60, 0x33, 0x6D, 0xEA, 0x44, 0xD9, 0x46, 0x9C, 0x10, 0xF0,
31690x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x4A, 0xC9,
31700x47, 0x9C, 0x4B, 0xC9, 0x44, 0x9B, 0x80, 0xF7, 0x42, 0x32, 0x01, 0x72,
31710xC0, 0xF2, 0x1E, 0x61, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x31,
31720x20, 0x31, 0xE1, 0xF6, 0x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x21, 0x95,
31730xD1, 0xF6, 0x8C, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x22, 0x95, 0x71, 0xF6,
31740x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x23, 0x95, 0x71, 0xF6, 0x84, 0x41,
31750x00, 0x1C, 0xDD, 0x5B, 0x24, 0x95, 0x71, 0xF6, 0x88, 0x41, 0x00, 0x1C,
31760xDD, 0x5B, 0x25, 0x95, 0x71, 0xF6, 0x8C, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
31770x26, 0x95, 0x81, 0xF6, 0x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x27, 0x95,
31780x81, 0xF6, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x28, 0x95, 0x81, 0xF6,
31790x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x29, 0x95, 0x81, 0xF6, 0x8C, 0x41,
31800x00, 0x1C, 0xDD, 0x5B, 0x2A, 0x95, 0xD1, 0xF6, 0x80, 0x41, 0x00, 0x1C,
31810xDD, 0x5B, 0x2B, 0x95, 0xD1, 0xF6, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
31820x2C, 0x95, 0x81, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x2D, 0x95,
31830x1F, 0x96, 0x10, 0x6D, 0xA4, 0xED, 0xFF, 0x4D, 0x00, 0x1C, 0x83, 0x45,
31840x00, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x00, 0x1C, 0xF0, 0x42,
31850x01, 0x6C, 0x20, 0x96, 0x10, 0x6D, 0xA4, 0xED, 0xFF, 0x4D, 0x00, 0x1C,
31860x83, 0x45, 0x00, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x00, 0x1C,
31870xF0, 0x42, 0x00, 0x6C, 0x10, 0x6D, 0xA4, 0xED, 0x1E, 0x6C, 0x00, 0x1C,
31880xAC, 0x45, 0xFF, 0x4D, 0x01, 0x6E, 0x22, 0x67, 0x4D, 0xEE, 0x10, 0x6D,
31890x03, 0x6A, 0x4B, 0xEA, 0xA4, 0xED, 0x4C, 0xEE, 0xFF, 0x4D, 0x00, 0x1C,
31900x83, 0x45, 0x1E, 0x6C, 0x00, 0x1C, 0x2C, 0x1F, 0x03, 0x6C, 0x10, 0x6D,
31910x03, 0x6A, 0xD1, 0x67, 0xA4, 0xED, 0x1E, 0x6C, 0xFF, 0x4D, 0x00, 0x1C,
31920x83, 0x45, 0x4D, 0xEE, 0x04, 0x63, 0x3E, 0x97, 0x3D, 0x91, 0x3C, 0x90,
31930x00, 0xEF, 0x20, 0x63, 0xA0, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x01, 0xF4,
31940x84, 0x40, 0x2A, 0xF4, 0x10, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
31950x08, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x7F, 0x4D, 0x01, 0xF4, 0x88, 0x40,
31960x00, 0x1C, 0xDD, 0x5B, 0x65, 0x4D, 0x8F, 0xF7, 0x00, 0x6D, 0xAB, 0xED,
31970xA0, 0x35, 0x21, 0xF6, 0x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0xA0, 0x35,
31980x00, 0xF2, 0x14, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x41, 0xF6, 0x80, 0x40,
31990x40, 0xF1, 0x08, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x0D, 0xF0,
32000x16, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x41, 0xF6, 0x84, 0x40, 0xA0, 0xF4,
32010x02, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x41, 0xF6, 0x8C, 0x40,
32020xC5, 0xF0, 0x11, 0x6D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0xF2,
32030x14, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x61, 0xF6, 0x80, 0x40, 0x40, 0xF1,
32040x0D, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x05, 0xF0, 0x16, 0x6D,
32050xA0, 0x35, 0xA0, 0x35, 0x61, 0xF6, 0x84, 0x40, 0xA1, 0xF0, 0x1A, 0x4D,
32060x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x61, 0xF6, 0x8C, 0x40, 0xC5, 0xF0,
32070x11, 0x6D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x37, 0x95, 0x41, 0xF6,
32080x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x01, 0x4D, 0x38, 0x95, 0x41, 0xF6,
32090x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x01, 0x4D, 0x00, 0x1C, 0x2C, 0x1F,
32100x03, 0x6C, 0xA0, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x01, 0xF4, 0x84, 0x40,
32110x2A, 0xF4, 0x13, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x01, 0xF4,
32120x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0xE4, 0x6D, 0x21, 0xF6, 0x88, 0x40,
32130x00, 0x1C, 0xDD, 0x5B, 0x33, 0x95, 0x39, 0x95, 0x1F, 0xF6, 0x14, 0x25,
32140x21, 0xF0, 0x80, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xFF, 0x6D,
32150x01, 0x4D, 0xAC, 0xEA, 0x42, 0x32, 0x34, 0xD2, 0x02, 0x22, 0x01, 0x6A,
32160x34, 0xD2, 0xA0, 0x35, 0xA0, 0x35, 0x21, 0xF0, 0x80, 0x41, 0x3A, 0xD5,
32170x00, 0xF1, 0x00, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x3A, 0x95,
32180x21, 0xF0, 0x88, 0x41, 0x00, 0xF1, 0x00, 0x4D, 0x00, 0x1C, 0xDD, 0x5B,
32190x00, 0x65, 0xA0, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x01, 0xF4, 0x84, 0x41,
32200x2A, 0xF4, 0x10, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x08, 0x6D,
32210xA0, 0x35, 0xA0, 0x35, 0x7F, 0x4D, 0x01, 0xF4, 0x88, 0x41, 0x00, 0x1C,
32220xDD, 0x5B, 0x65, 0x4D, 0x43, 0x93, 0x21, 0xF6, 0x88, 0x41, 0x00, 0x1C,
32230xDD, 0x5B, 0x60, 0x35, 0x3A, 0x95, 0x31, 0xF6, 0x80, 0x41, 0x0F, 0xF4,
32240x00, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x3A, 0x95, 0x31, 0xF6,
32250x84, 0x41, 0x09, 0xF0, 0x00, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
32260x02, 0xF0, 0x01, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x31, 0xF6, 0x88, 0x41,
32270x3B, 0xD5, 0x1B, 0xF4, 0x1F, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
32280x3B, 0x95, 0x31, 0xF6, 0x8C, 0x41, 0x11, 0xF4, 0x1F, 0x4D, 0x00, 0x1C,
32290xDD, 0x5B, 0x00, 0x65, 0x00, 0xF2, 0x14, 0x6D, 0xA0, 0x35, 0xA0, 0x35,
32300x41, 0xF6, 0x80, 0x41, 0x00, 0xF1, 0x02, 0x4D, 0x00, 0x1C, 0xDD, 0x5B,
32310x00, 0x65, 0x0D, 0xF0, 0x16, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x41, 0xF6,
32320x84, 0x41, 0xC0, 0xF4, 0x07, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
32330x41, 0xF6, 0x8C, 0x41, 0xC5, 0xF0, 0x11, 0x6D, 0x00, 0x1C, 0xDD, 0x5B,
32340x00, 0x65, 0x61, 0xF6, 0x8C, 0x41, 0xC5, 0xF0, 0x11, 0x6D, 0x00, 0x1C,
32350xDD, 0x5B, 0x00, 0x65, 0x3A, 0x95, 0x51, 0xF6, 0x80, 0x41, 0x0F, 0xF4,
32360x00, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x3A, 0x95, 0x51, 0xF6,
32370x84, 0x41, 0x09, 0xF0, 0x00, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
32380x3B, 0x95, 0x51, 0xF6, 0x88, 0x41, 0x3B, 0xF4, 0x03, 0x4D, 0x00, 0x1C,
32390xDD, 0x5B, 0x00, 0x65, 0x3B, 0x95, 0x51, 0xF6, 0x8C, 0x41, 0x31, 0xF4,
32400x03, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0xF2, 0x14, 0x6D,
32410xA0, 0x35, 0xA0, 0x35, 0x61, 0xF6, 0x80, 0x41, 0x00, 0xF1, 0x02, 0x4D,
32420x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x05, 0xF0, 0x16, 0x6D, 0xA0, 0x35,
32430xA0, 0x35, 0x61, 0xF6, 0x84, 0x41, 0x01, 0xF5, 0x07, 0x4D, 0x00, 0x1C,
32440xDD, 0x5B, 0x00, 0x65, 0x41, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
32450x37, 0x95, 0x41, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x38, 0x95,
32460x00, 0x1C, 0x2C, 0x1F, 0x03, 0x6C, 0x00, 0xF2, 0x00, 0x6A, 0x40, 0x32,
32470x40, 0x32, 0xA2, 0x67, 0x41, 0xF6, 0x8C, 0x41, 0xC5, 0xF0, 0x11, 0x4D,
32480x00, 0x1C, 0xDD, 0x5B, 0x3C, 0xD2, 0x3C, 0x95, 0x61, 0xF6, 0x8C, 0x41,
32490xC5, 0xF0, 0x11, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x41, 0xF6,
32500x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x37, 0x95, 0x41, 0xF6, 0x88, 0x41,
32510x00, 0x1C, 0xDD, 0x5B, 0x38, 0x95, 0x00, 0x1C, 0x2C, 0x1F, 0x03, 0x6C,
32520x01, 0xF4, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x31, 0x95, 0x01, 0xF4,
32530x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x32, 0x95, 0x21, 0xF6, 0x88, 0x41,
32540x00, 0x1C, 0xDD, 0x5B, 0x00, 0x6D, 0x34, 0x93, 0x1F, 0xF5, 0x1E, 0x2B,
32550x21, 0xF0, 0x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x3A, 0x95, 0x21, 0xF0,
32560x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x3A, 0x95, 0x13, 0x15, 0x00, 0x6A,
32570x6A, 0x15, 0x00, 0x6B, 0x56, 0x15, 0xFF, 0x6C, 0xFF, 0x74, 0xBF, 0xF5,
32580x09, 0x61, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34,
32590x41, 0xD4, 0x81, 0xF6, 0x14, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
32600xE0, 0xF3, 0x1F, 0x6B, 0x60, 0x31, 0x20, 0x31, 0x2C, 0xEA, 0x42, 0x32,
32610x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x63, 0xF3, 0x00, 0x4C,
32620x42, 0x32, 0x6C, 0xEA, 0x63, 0x9C, 0x00, 0xF4, 0x00, 0x6D, 0xAB, 0xED,
32630xAC, 0xEB, 0x4D, 0xEB, 0x63, 0xDC, 0x41, 0x94, 0xE0, 0xF3, 0x1F, 0x68,
32640x81, 0xF6, 0x1C, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x2C, 0xEA,
32650x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x10, 0x6D, 0x63, 0xF3,
32660x00, 0x4C, 0x42, 0x32, 0xAB, 0xED, 0x63, 0x9C, 0x42, 0x32, 0xA0, 0x35,
32670x0C, 0xEA, 0xA0, 0x35, 0xE0, 0xF3, 0x1F, 0x4D, 0x40, 0x32, 0xAC, 0xEB,
32680x48, 0x32, 0x4D, 0xEB, 0x63, 0xDC, 0x41, 0x94, 0xA1, 0xF6, 0x04, 0x4C,
32690x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x2C, 0xEA, 0x42, 0x32, 0x42, 0x32,
32700x0C, 0xEA, 0xE7, 0xF7, 0x10, 0x6C, 0x10, 0xF0, 0x02, 0x68, 0x00, 0xF4,
32710x00, 0x30, 0x63, 0xF3, 0x00, 0x48, 0x8B, 0xEC, 0x63, 0x98, 0x80, 0x34,
32720x80, 0x34, 0xFF, 0x4C, 0x00, 0xF5, 0x40, 0x32, 0x8C, 0xEB, 0x4D, 0xEB,
32730x63, 0xD8, 0x41, 0x94, 0xA1, 0xF6, 0x0C, 0x4C, 0x00, 0x1C, 0xFA, 0x5B,
32740x00, 0x65, 0x2C, 0xEA, 0x64, 0x98, 0x42, 0x32, 0x00, 0xF4, 0x00, 0x68,
32750xE0, 0xF3, 0x1F, 0x6D, 0x0B, 0xE8, 0x42, 0x32, 0xAC, 0xEA, 0x0C, 0xEB,
32760x4D, 0xEB, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3,
32770x00, 0x4A, 0x64, 0xDA, 0x41, 0x94, 0xE0, 0xF3, 0x1F, 0x68, 0xA1, 0xF6,
32780x14, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x2C, 0xEA, 0x42, 0x32,
32790x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x10, 0x6D, 0x63, 0xF3,
32800x00, 0x4C, 0xE0, 0xF3, 0x1F, 0x6B, 0x42, 0x32, 0xAB, 0xED, 0x6C, 0xEA,
32810xA0, 0x35, 0x64, 0x9C, 0xA0, 0x35, 0xE0, 0xF3, 0x1F, 0x4D, 0x40, 0x32,
32820xAC, 0xEB, 0x48, 0x32, 0x4D, 0xEB, 0x64, 0xDC, 0x41, 0x94, 0xA1, 0xF6,
32830x1C, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6C,
32840x00, 0xF4, 0x80, 0x34, 0xE7, 0xF7, 0x10, 0x6D, 0x63, 0xF3, 0x00, 0x4C,
32850x2C, 0xEA, 0xAB, 0xED, 0x64, 0x9C, 0x42, 0x32, 0xA0, 0x35, 0x42, 0x32,
32860xA0, 0x35, 0xFF, 0x4D, 0x0C, 0xEA, 0xAC, 0xEB, 0x00, 0xF5, 0x40, 0x32,
32870x4D, 0xEB, 0x64, 0xDC, 0x41, 0x94, 0x10, 0xF0, 0x02, 0x68, 0x00, 0xF4,
32880x00, 0x30, 0x63, 0xF3, 0x00, 0x48, 0xC1, 0xF6, 0x04, 0x4C, 0x00, 0x1C,
32890xFA, 0x5B, 0x00, 0x65, 0x2C, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x4A, 0xC8,
32900x41, 0x94, 0xC1, 0xF6, 0x0C, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
32910x4C, 0xE9, 0x22, 0x32, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33,
32920x42, 0x32, 0x63, 0xF3, 0x00, 0x4B, 0x4B, 0xC8, 0x44, 0x9B, 0x80, 0xF7,
32930x42, 0x32, 0x01, 0x72, 0x3F, 0xF5, 0x02, 0x60, 0xC9, 0xF7, 0x1B, 0x6A,
32940x4B, 0xEA, 0x40, 0x31, 0x20, 0x31, 0x81, 0xF4, 0x80, 0x41, 0x00, 0x1C,
32950xFA, 0x5B, 0x00, 0x65, 0x82, 0x67, 0x10, 0xF0, 0x02, 0x68, 0x00, 0xF4,
32960x00, 0x30, 0x40, 0x6A, 0x4B, 0xEA, 0x63, 0xF3, 0x00, 0x48, 0x40, 0x32,
32970xC3, 0x98, 0x40, 0x32, 0x8C, 0xEA, 0xE0, 0xF3, 0x1F, 0x6B, 0x80, 0xF5,
32980x42, 0x35, 0xCC, 0xEB, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22,
32990x00, 0xF4, 0x00, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xB8, 0xEB, 0xE0, 0xF3,
33000x1F, 0x68, 0x12, 0xEA, 0x42, 0x33, 0x0C, 0xEB, 0xC2, 0x30, 0xE0, 0xF3,
33010x1F, 0x6A, 0x0A, 0x30, 0x4C, 0xE8, 0x00, 0xF2, 0x00, 0x6A, 0x0C, 0xEA,
33020x04, 0x22, 0x00, 0xF4, 0x00, 0x6A, 0x4B, 0xEA, 0x4D, 0xE8, 0xB8, 0xE8,
33030xE0, 0xF3, 0x1F, 0x6D, 0x12, 0xEA, 0x42, 0x30, 0x3F, 0x6A, 0x4B, 0xEA,
33040xAC, 0xE8, 0x40, 0x32, 0x3F, 0x6D, 0x42, 0xD5, 0x40, 0x32, 0x0C, 0xED,
33050x1F, 0xF4, 0x00, 0x4A, 0xA0, 0x35, 0x4C, 0xEC, 0xA0, 0x35, 0x8D, 0xED,
33060x81, 0xF4, 0x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x6D, 0xED, 0x91, 0xF4,
33070x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x02, 0xF0, 0x00, 0x6B,
33080x60, 0x33, 0x60, 0x33, 0xFF, 0x4B, 0xC0, 0xF3, 0x00, 0x6C, 0x6C, 0xEA,
33090x8C, 0xE8, 0x80, 0xF5, 0x00, 0x33, 0xA2, 0x67, 0x91, 0xF4, 0x84, 0x41,
33100x00, 0x1C, 0xDD, 0x5B, 0x6D, 0xED, 0x81, 0xF4, 0x88, 0x41, 0x00, 0x1C,
33110xFA, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
33120xBD, 0xF7, 0x10, 0x4D, 0x82, 0x67, 0x40, 0x9D, 0x8C, 0xEA, 0x80, 0xF5,
33130x42, 0x35, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3,
33140x00, 0x4A, 0x04, 0x9A, 0xE0, 0xF3, 0x1F, 0x6A, 0x02, 0x33, 0x6A, 0x33,
33150x4C, 0xEB, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0xF4,
33160x00, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xB8, 0xEB, 0x00, 0xF5, 0x02, 0x30,
33170x12, 0xEA, 0x42, 0x33, 0xE0, 0xF3, 0x1F, 0x6A, 0x4C, 0xE8, 0x4C, 0xEB,
33180x00, 0xF2, 0x00, 0x6A, 0x0C, 0xEA, 0x04, 0x22, 0x00, 0xF4, 0x00, 0x6A,
33190x4B, 0xEA, 0x4D, 0xE8, 0xB8, 0xE8, 0xE0, 0xF3, 0x1F, 0x6D, 0x12, 0xEA,
33200x42, 0x30, 0xAC, 0xE8, 0x3F, 0x6A, 0x42, 0x95, 0x4B, 0xEA, 0x40, 0x32,
33210x0C, 0xED, 0x40, 0x32, 0x1F, 0xF4, 0x00, 0x4A, 0x42, 0xD5, 0xA0, 0x35,
33220x4C, 0xEC, 0xA0, 0x35, 0x8D, 0xED, 0x81, 0xF4, 0x88, 0x41, 0x00, 0x1C,
33230xDD, 0x5B, 0x6D, 0xED, 0x91, 0xF4, 0x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B,
33240x00, 0x65, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xBD, 0xF7,
33250x14, 0x4B, 0xA0, 0x9B, 0xC0, 0xF3, 0x00, 0x6C, 0x8C, 0xE8, 0x4C, 0xED,
33260x80, 0xF5, 0x00, 0x32, 0x91, 0xF4, 0x8C, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
33270x4D, 0xED, 0x58, 0x14, 0x0C, 0x91, 0xDF, 0xF3, 0x19, 0x10, 0x1E, 0x93,
33280x04, 0x04, 0x74, 0x32, 0x91, 0xE2, 0x3E, 0xD4, 0x91, 0xF6, 0x84, 0x40,
33290x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF3, 0x1F, 0x6B, 0x60, 0x33,
33300x60, 0x33, 0x3E, 0x95, 0x6C, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x3F, 0xD3,
33310x91, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x40, 0xDD, 0x3F, 0x93,
33320x3E, 0x94, 0x6C, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x41, 0xDC, 0xA1, 0xF6,
33330x84, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x3F, 0x95, 0x3E, 0x93,
33340xA1, 0xF6, 0x8C, 0x40, 0xAC, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x00, 0x1C,
33350xFA, 0x5B, 0x42, 0xDB, 0x3F, 0x94, 0x3E, 0x95, 0x8C, 0xEA, 0x42, 0x32,
33360x42, 0x32, 0xB1, 0xF6, 0x84, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x43, 0xDD,
33370x3F, 0x93, 0x3E, 0x94, 0x6C, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x44, 0xDC,
33380xB1, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x3F, 0x95,
33390x3E, 0x93, 0xC1, 0xF6, 0x84, 0x40, 0xAC, 0xEA, 0x42, 0x32, 0x42, 0x32,
33400x00, 0x1C, 0xFA, 0x5B, 0x45, 0xDB, 0x3F, 0x94, 0x3E, 0x95, 0x8C, 0xEA,
33410x42, 0x32, 0x42, 0x32, 0xC1, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xFA, 0x5B,
33420x46, 0xDD, 0x3F, 0x93, 0x3E, 0x94, 0x4C, 0xEB, 0x62, 0x32, 0x42, 0x32,
33430x47, 0xDC, 0x7F, 0xF3, 0x0E, 0x10, 0x00, 0x00, 0xFB, 0x63, 0x07, 0xD1,
33440x0C, 0xF0, 0x00, 0x6A, 0x10, 0xF0, 0x02, 0x69, 0x00, 0xF4, 0x20, 0x31,
33450x63, 0xF3, 0x00, 0x49, 0x08, 0x62, 0x0A, 0xD4, 0x06, 0xD0, 0x4B, 0xEA,
33460x62, 0x99, 0x40, 0x32, 0x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB, 0xC9, 0xF7,
33470x1B, 0x6C, 0x04, 0xF0, 0x00, 0x6A, 0x40, 0x32, 0x8B, 0xEC, 0x40, 0x32,
33480x80, 0x34, 0x4D, 0xEB, 0x80, 0x34, 0x62, 0xD9, 0x04, 0xD4, 0x81, 0xF6,
33490x14, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF3, 0x1F, 0x6B,
33500x60, 0x30, 0x00, 0x30, 0x0C, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x6C, 0xEA,
33510x63, 0x99, 0x00, 0xF4, 0x00, 0x6C, 0x8B, 0xEC, 0x8C, 0xEB, 0x4D, 0xEB,
33520x63, 0xD9, 0x04, 0x94, 0x81, 0xF6, 0x1C, 0x4C, 0x00, 0x1C, 0xFA, 0x5B,
33530x00, 0x65, 0x0C, 0xEA, 0x42, 0x32, 0x10, 0x6C, 0xE0, 0xF3, 0x1F, 0x6B,
33540x42, 0x32, 0x8B, 0xEC, 0x6C, 0xEA, 0x80, 0x34, 0x63, 0x99, 0x80, 0x34,
33550xE0, 0xF3, 0x1F, 0x4C, 0x40, 0x32, 0x48, 0x32, 0x8C, 0xEB, 0x4D, 0xEB,
33560x63, 0xD9, 0x04, 0x94, 0xA1, 0xF6, 0x04, 0x4C, 0x00, 0x1C, 0xFA, 0x5B,
33570x00, 0x65, 0x0C, 0xEA, 0x42, 0x32, 0xE7, 0xF7, 0x10, 0x6C, 0xE0, 0xF3,
33580x1F, 0x6B, 0x42, 0x32, 0x8B, 0xEC, 0x6C, 0xEA, 0x80, 0x34, 0x63, 0x99,
33590x80, 0x34, 0xFF, 0x4C, 0x00, 0xF5, 0x40, 0x32, 0x8C, 0xEB, 0x4D, 0xEB,
33600x63, 0xD9, 0x04, 0x94, 0xA1, 0xF6, 0x0C, 0x4C, 0x00, 0x1C, 0xFA, 0x5B,
33610x00, 0x65, 0x0C, 0xEA, 0x42, 0x32, 0xE0, 0xF3, 0x1F, 0x6B, 0x42, 0x32,
33620x6C, 0xEA, 0x64, 0x99, 0x00, 0xF4, 0x00, 0x6C, 0x8B, 0xEC, 0x8C, 0xEB,
33630x4D, 0xEB, 0x64, 0xD9, 0x04, 0x94, 0xA1, 0xF6, 0x14, 0x4C, 0x00, 0x1C,
33640xFA, 0x5B, 0x00, 0x65, 0x0C, 0xEA, 0x42, 0x32, 0x10, 0x6C, 0xE0, 0xF3,
33650x1F, 0x6B, 0x42, 0x32, 0x8B, 0xEC, 0x6C, 0xEA, 0x80, 0x34, 0x64, 0x99,
33660x80, 0x34, 0xE0, 0xF3, 0x1F, 0x4C, 0x40, 0x32, 0x48, 0x32, 0x8C, 0xEB,
33670x4D, 0xEB, 0x64, 0xD9, 0x04, 0x94, 0xA1, 0xF6, 0x1C, 0x4C, 0x00, 0x1C,
33680xFA, 0x5B, 0x00, 0x65, 0x0C, 0xEA, 0x42, 0x32, 0xE7, 0xF7, 0x10, 0x6C,
33690xE0, 0xF3, 0x1F, 0x6B, 0x42, 0x32, 0x8B, 0xEC, 0x6C, 0xEA, 0x80, 0x34,
33700x64, 0x99, 0x80, 0x34, 0xFF, 0x4C, 0x00, 0xF5, 0x40, 0x32, 0x8C, 0xEB,
33710x4D, 0xEB, 0x64, 0xD9, 0x04, 0x94, 0xC1, 0xF6, 0x04, 0x4C, 0x00, 0x1C,
33720xFA, 0x5B, 0x00, 0x65, 0x0C, 0xEA, 0x42, 0x32, 0x42, 0x32, 0x4A, 0xC9,
33730x04, 0x94, 0xC1, 0xF6, 0x0C, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
33740x4C, 0xE8, 0xFF, 0x6A, 0x01, 0x4A, 0x40, 0x32, 0x40, 0x32, 0x0A, 0x93,
33750x80, 0x4A, 0x02, 0x30, 0x80, 0x4A, 0x02, 0x30, 0x6C, 0xEA, 0x0B, 0xC9,
33760x14, 0x22, 0x1F, 0xF7, 0x00, 0x6A, 0x0A, 0x94, 0x4C, 0xEB, 0x62, 0x33,
33770xC0, 0xF2, 0x63, 0xC1, 0x82, 0x33, 0x4C, 0xEB, 0x62, 0x33, 0xC0, 0xF2,
33780x67, 0xC1, 0x00, 0x18, 0x0A, 0x5F, 0x00, 0x65, 0x08, 0x97, 0x07, 0x91,
33790x06, 0x90, 0x00, 0xEF, 0x05, 0x63, 0x12, 0x6A, 0xC0, 0xF2, 0x43, 0xC1,
33800xC0, 0xF2, 0x47, 0xC1, 0x00, 0x18, 0x0A, 0x5F, 0x00, 0x65, 0x08, 0x97,
33810x07, 0x91, 0x06, 0x90, 0x00, 0xEF, 0x05, 0x63, 0xC9, 0xF7, 0x1B, 0x6A,
33820xFB, 0x63, 0x4B, 0xEA, 0x06, 0xD0, 0x40, 0x30, 0x07, 0xD1, 0x08, 0x62,
33830x00, 0x30, 0x40, 0xF0, 0x4C, 0xA0, 0x03, 0x69, 0x4C, 0xE9, 0x10, 0xF0,
33840x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x62, 0x67, 0x04, 0xD2, 0x63, 0xF3,
33850x00, 0x4B, 0xC3, 0xF3, 0x41, 0xA3, 0x2E, 0xEA, 0x1A, 0x22, 0x05, 0x29,
33860xE0, 0xF2, 0x66, 0xA3, 0xFF, 0x6A, 0x4C, 0xEB, 0x1A, 0x23, 0x04, 0x92,
33870xC9, 0xF7, 0x17, 0x6C, 0x8B, 0xEC, 0x63, 0xF3, 0x00, 0x4A, 0x04, 0xD2,
33880xC3, 0xF3, 0x21, 0xC2, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32,
33890x40, 0x32, 0x76, 0x9A, 0x80, 0x34, 0x80, 0x34, 0x60, 0xDC, 0x57, 0x9A,
33900x41, 0xDC, 0x08, 0x97, 0x07, 0x91, 0x06, 0x90, 0x00, 0x6A, 0x00, 0xEF,
33910x05, 0x63, 0x51, 0xF4, 0x80, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x1C, 0x6D,
33920x51, 0xF4, 0x88, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x1C, 0x6D, 0xDB, 0x17,
33930xF9, 0x63, 0x0A, 0xD0, 0xC9, 0xF7, 0x1B, 0x68, 0x0B, 0xE8, 0x00, 0x30,
33940x00, 0x30, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x0B, 0xD1,
33950xA1, 0xF5, 0x82, 0x40, 0x22, 0x67, 0x63, 0xF3, 0x00, 0x49, 0x0C, 0x62,
33960x00, 0x1C, 0xFD, 0x5B, 0x06, 0xD2, 0xC0, 0xF2, 0x58, 0xC9, 0xA1, 0xF5,
33970x84, 0x40, 0x00, 0x1C, 0xFD, 0x5B, 0x00, 0x65, 0xC0, 0xF2, 0x5A, 0xC9,
33980xA1, 0xF5, 0x86, 0x40, 0x00, 0x1C, 0xFD, 0x5B, 0x00, 0x65, 0xC0, 0xF2,
33990x5C, 0xC9, 0xA1, 0xF5, 0x88, 0x40, 0x00, 0x1C, 0xFD, 0x5B, 0x00, 0x65,
34000x82, 0x67, 0xC0, 0xF2, 0x7A, 0xA9, 0xC0, 0xF2, 0x5E, 0xC9, 0xC0, 0xF2,
34010x58, 0xA9, 0x69, 0xE2, 0xC0, 0xF2, 0x7C, 0xA9, 0x69, 0xE2, 0x51, 0xE4,
34020x04, 0xD4, 0x21, 0xF2, 0x8D, 0x40, 0x00, 0x1C, 0x00, 0x5C, 0x00, 0x65,
34030x00, 0xF6, 0x40, 0x35, 0x00, 0xF6, 0xA3, 0x35, 0x40, 0x6A, 0xFF, 0x6B,
34040x4D, 0xED, 0x6C, 0xED, 0x21, 0xF2, 0x8D, 0x40, 0x00, 0x1C, 0xF0, 0x5B,
34050x05, 0xD3, 0x51, 0xF2, 0x8B, 0x40, 0x00, 0x1C, 0x00, 0x5C, 0x00, 0x65,
34060x40, 0x32, 0x51, 0xF2, 0x8C, 0x40, 0xE0, 0xF2, 0x44, 0xC9, 0x00, 0x1C,
34070x00, 0x5C, 0x00, 0x65, 0xE0, 0xF2, 0x64, 0xA9, 0x61, 0xF4, 0x84, 0x40,
34080x75, 0xE2, 0x04, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0xE0, 0xF2, 0xA4, 0xC9,
34090x4C, 0xED, 0x69, 0xE5, 0xE0, 0xF2, 0x40, 0xD9, 0xFF, 0xF7, 0x1F, 0x6A,
34100x00, 0x1C, 0xE6, 0x5B, 0x4C, 0xED, 0x43, 0xA9, 0xFF, 0xF7, 0x1F, 0x6B,
34110x6C, 0xEA, 0x10, 0x52, 0x05, 0x60, 0xE0, 0xF2, 0x40, 0x99, 0x1F, 0x5A,
34120xA0, 0xF0, 0x1E, 0x61, 0x00, 0x6A, 0xC0, 0xF2, 0x54, 0xC1, 0xC0, 0xF2,
34130x55, 0xA1, 0x05, 0x93, 0x01, 0x4A, 0x4C, 0xEB, 0x03, 0x53, 0xA0, 0xF0,
34140x0B, 0x60, 0xC0, 0xF2, 0x55, 0xC1, 0x06, 0x94, 0x00, 0x6A, 0x11, 0x6B,
34150x63, 0xF3, 0x00, 0x4C, 0x43, 0xCC, 0xE0, 0xF2, 0x44, 0xCC, 0x40, 0x9C,
34160x6C, 0xEA, 0x01, 0x72, 0x80, 0xF0, 0x13, 0x61, 0xE0, 0xF2, 0x44, 0x9C,
34170x03, 0x6B, 0x00, 0xF7, 0x42, 0x32, 0x6C, 0xEA, 0x80, 0xF0, 0x0B, 0x2A,
34180xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF0,
34190x4C, 0xA2, 0x4C, 0xEB, 0x01, 0x73, 0xA0, 0xF0, 0x04, 0x60, 0x06, 0x94,
34200x63, 0xF3, 0x00, 0x4C, 0xE0, 0xF2, 0x46, 0xA4, 0xA0, 0xF0, 0x0B, 0x2A,
34210x40, 0x9C, 0x01, 0x6B, 0x56, 0x32, 0x6C, 0xEA, 0xA0, 0xF0, 0x05, 0x22,
34220x3E, 0x6A, 0xC0, 0xF2, 0x50, 0xC4, 0x1C, 0x6A, 0xC0, 0xF2, 0x51, 0xC4,
34230xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF0,
34240x6C, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6C, 0xEA, 0x61, 0x22,
34250x66, 0xF7, 0x4C, 0x9C, 0xFF, 0xF7, 0x1F, 0x72, 0x5C, 0x60, 0xE0, 0xF2,
34260x40, 0x9C, 0xE0, 0xF3, 0x09, 0x5A, 0x00, 0xF1, 0x03, 0x61, 0xC0, 0xF2,
34270x72, 0xA4, 0x00, 0xF6, 0x60, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xFE, 0x4A,
34280xFF, 0xF7, 0x1C, 0x52, 0x04, 0x6A, 0x4B, 0xEA, 0x01, 0x61, 0x4E, 0x43,
34290xC0, 0xF2, 0x52, 0xC4, 0x06, 0x96, 0x7F, 0x6B, 0x63, 0xF3, 0x00, 0x4E,
34300x66, 0xF7, 0x4C, 0x9E, 0xC0, 0xF2, 0x8E, 0xA6, 0x52, 0x32, 0x6C, 0xEA,
34310xA7, 0x42, 0xC0, 0xF2, 0x52, 0xA6, 0x03, 0x4D, 0xFF, 0x6B, 0x4B, 0xE5,
34320x00, 0xF6, 0x40, 0x35, 0x43, 0x67, 0x00, 0xF6, 0xA3, 0x35, 0x8C, 0xEA,
34330xA2, 0xEA, 0xE0, 0xF0, 0x0C, 0x60, 0x00, 0xF6, 0x80, 0x35, 0x00, 0xF6,
34340xA3, 0x35, 0x06, 0x92, 0x63, 0xF3, 0x00, 0x4A, 0x06, 0xD2, 0xE0, 0xF2,
34350x40, 0x9A, 0x04, 0xF7, 0x11, 0x5A, 0xC0, 0xF0, 0x01, 0x61, 0x32, 0x55,
34360xA0, 0xF0, 0x1E, 0x60, 0x32, 0x6D, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA,
34370x40, 0x32, 0x40, 0x32, 0x21, 0xF4, 0x10, 0x4A, 0x44, 0x6B, 0xC9, 0xF7,
34380x1B, 0x68, 0x0B, 0xE8, 0x60, 0xC2, 0x00, 0x30, 0xFF, 0x6A, 0xAC, 0xEA,
34390x00, 0x30, 0xA2, 0x67, 0x51, 0xF4, 0x80, 0x40, 0x00, 0x1C, 0xF0, 0x5B,
34400x08, 0xD2, 0x08, 0x92, 0x51, 0xF4, 0x88, 0x40, 0x00, 0x1C, 0xF0, 0x5B,
34410xA2, 0x67, 0x00, 0x18, 0x08, 0x61, 0x00, 0x65, 0x0C, 0x97, 0x0B, 0x91,
34420x0A, 0x90, 0x00, 0x6A, 0x00, 0xEF, 0x07, 0x63, 0x03, 0x6A, 0xC0, 0xF2,
34430x55, 0xC1, 0x40, 0x99, 0x08, 0x6B, 0x6D, 0xEA, 0x40, 0xD9, 0x4F, 0x17,
34440x00, 0x6A, 0xC0, 0xF2, 0x55, 0xC1, 0xC0, 0xF2, 0x54, 0xA1, 0x05, 0x93,
34450x01, 0x4A, 0x4C, 0xEB, 0x03, 0x53, 0x14, 0x61, 0x03, 0x6A, 0xC0, 0xF2,
34460x54, 0xC1, 0x40, 0x99, 0x09, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA, 0x40, 0xD9,
34470x3C, 0x17, 0xE0, 0xF2, 0x66, 0xA4, 0xFF, 0x6A, 0x4C, 0xEB, 0x5F, 0xF7,
34480x16, 0x2B, 0x01, 0x6A, 0x4B, 0xEA, 0xE0, 0xF2, 0x46, 0xC4, 0x51, 0x17,
34490xC0, 0xF2, 0x54, 0xC1, 0x2E, 0x17, 0x06, 0x90, 0xFF, 0x6D, 0x63, 0xF3,
34500x00, 0x48, 0xE0, 0xF2, 0x46, 0xA0, 0xAA, 0xEA, 0xC6, 0x61, 0xC9, 0xF7,
34510x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x41, 0xF4, 0x10, 0x4C,
34520x00, 0x1C, 0x00, 0x5C, 0x09, 0xD5, 0x09, 0x95, 0x00, 0xF6, 0x40, 0x31,
34530x00, 0xF6, 0x23, 0x31, 0x7F, 0x6A, 0xAC, 0xE9, 0x4C, 0xE9, 0xE0, 0xF2,
34540x60, 0x98, 0xC0, 0xF2, 0x48, 0xA8, 0xFF, 0xF7, 0x1F, 0x6C, 0x43, 0xEB,
34550x38, 0x61, 0xC0, 0xF2, 0x4A, 0xA8, 0x8C, 0xEA, 0x43, 0xEB, 0x07, 0x61,
34560xC0, 0xF2, 0x4C, 0xA8, 0x8C, 0xEA, 0x43, 0xEB, 0x69, 0x60, 0x01, 0x49,
34570xAC, 0xE9, 0x06, 0x93, 0x63, 0xF3, 0x00, 0x4B, 0xC0, 0xF2, 0x50, 0xA3,
34580x23, 0xEA, 0x32, 0x60, 0x22, 0x67, 0x06, 0x93, 0x63, 0xF3, 0x00, 0x4B,
34590x06, 0xD3, 0xE0, 0xF2, 0x40, 0x9B, 0x04, 0xF7, 0x11, 0x5A, 0x1D, 0x61,
34600x32, 0x69, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32,
34610x21, 0xF4, 0x10, 0x4A, 0x44, 0x6B, 0xC9, 0xF7, 0x1B, 0x68, 0x0B, 0xE8,
34620x00, 0x30, 0x00, 0x30, 0x51, 0xF4, 0x80, 0x40, 0xB1, 0x67, 0x60, 0xC2,
34630x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0x51, 0xF4, 0x88, 0x40, 0x00, 0x1C,
34640xF0, 0x5B, 0xB1, 0x67, 0x74, 0x17, 0xFF, 0x49, 0xD1, 0x17, 0x3A, 0x59,
34650xE2, 0x61, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32,
34660x21, 0xF4, 0x10, 0x4A, 0x48, 0x6B, 0xE1, 0x17, 0xC0, 0xF2, 0x71, 0xA3,
34670xFF, 0x6A, 0x4C, 0xEB, 0x63, 0xE9, 0xC9, 0x60, 0x23, 0x67, 0xC7, 0x17,
34680x3A, 0x55, 0x5F, 0xF7, 0x00, 0x61, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA,
34690x40, 0x32, 0x40, 0x32, 0x21, 0xF4, 0x10, 0x4A, 0x48, 0x6B, 0x3F, 0x17,
34700x80, 0xF1, 0x10, 0x5A, 0x1F, 0xF7, 0x08, 0x60, 0xC0, 0xF2, 0x72, 0xA4,
34710x00, 0xF6, 0x60, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x02, 0x4A, 0x0D, 0x52,
34720x0C, 0x6A, 0xFF, 0xF6, 0x1B, 0x60, 0x42, 0x43, 0xF9, 0x16, 0xC0, 0xF2,
34730x4F, 0xA6, 0x4C, 0xEB, 0x62, 0xED, 0x1F, 0xF7, 0x12, 0x60, 0x00, 0xF6,
34740x40, 0x35, 0x0D, 0x17, 0x02, 0x49, 0x96, 0x17, 0xFB, 0x63, 0x06, 0xD0,
34750x02, 0xF0, 0x00, 0x68, 0x00, 0x30, 0xAF, 0x40, 0xFF, 0xF0, 0x10, 0x6E,
34760x15, 0x6C, 0x08, 0x62, 0x00, 0x1C, 0x83, 0x45, 0x07, 0xD1, 0x00, 0x1C,
34770x5B, 0x1F, 0x64, 0x6C, 0x1A, 0x6C, 0x46, 0xF0, 0x16, 0x6E, 0x00, 0x1C,
34780x83, 0x45, 0xAF, 0x40, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x10, 0xF0,
34790x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x04, 0xD2, 0x63, 0xF3, 0x40, 0x9A,
34800x01, 0x6B, 0x4E, 0x32, 0x6C, 0xEA, 0x0A, 0x22, 0x10, 0xF0, 0x02, 0x6B,
34810x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x00, 0xF3, 0x47, 0xA3,
34820x01, 0x72, 0x1C, 0x61, 0x04, 0x92, 0x63, 0xF3, 0x20, 0x9A, 0x01, 0x6A,
34830x2E, 0x31, 0x4C, 0xE9, 0x09, 0x29, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
34840x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x00, 0xF3, 0x47, 0xA3, 0x5A, 0x2A,
34850x04, 0x93, 0x08, 0x97, 0x07, 0x91, 0x06, 0x90, 0x63, 0xF3, 0x00, 0x4B,
34860x04, 0xD3, 0x04, 0x6A, 0x00, 0xF3, 0x44, 0xC3, 0x00, 0xEF, 0x05, 0x63,
34870xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x31, 0x24, 0xF2, 0x02, 0x68,
34880x20, 0x31, 0x00, 0x30, 0x01, 0xF6, 0x88, 0x41, 0x24, 0xF2, 0x02, 0x6D,
34890x00, 0x1C, 0xDD, 0x5B, 0x00, 0x30, 0x01, 0xF6, 0x80, 0x41, 0x24, 0xF2,
34900xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x01, 0xF6, 0x84, 0x41,
34910x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x11, 0xF6,
34920x80, 0x41, 0x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
34930x11, 0xF6, 0x84, 0x41, 0x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
34940x00, 0x65, 0x11, 0xF6, 0x88, 0x41, 0x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C,
34950xDD, 0x5B, 0x00, 0x65, 0x11, 0xF6, 0x8C, 0x41, 0x24, 0xF2, 0xA2, 0x40,
34960x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
34970x40, 0x32, 0x01, 0x6B, 0x63, 0xF3, 0x00, 0x4A, 0x00, 0xF3, 0x67, 0xC2,
34980x04, 0x93, 0x08, 0x97, 0x07, 0x91, 0x06, 0x90, 0x63, 0xF3, 0x00, 0x4B,
34990x04, 0xD3, 0x04, 0x6A, 0x00, 0xF3, 0x44, 0xC3, 0x00, 0xEF, 0x05, 0x63,
35000xC9, 0xF7, 0x1B, 0x68, 0x0B, 0xE8, 0x00, 0xF3, 0xB4, 0x9B, 0x00, 0x30,
35010x00, 0x30, 0x01, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
35020x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A,
35030x00, 0xF3, 0xB4, 0x9A, 0x01, 0xF6, 0x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
35040x00, 0x65, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
35050x00, 0x4B, 0x00, 0xF3, 0xB8, 0x9B, 0x01, 0xF6, 0x88, 0x40, 0x00, 0x1C,
35060xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
35070x63, 0xF3, 0x00, 0x4A, 0x00, 0xF3, 0xB4, 0x9A, 0x11, 0xF6, 0x80, 0x40,
35080x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
35090x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x00, 0xF3, 0xB4, 0x9B, 0x11, 0xF6,
35100x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6A,
35110x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0x00, 0xF3, 0xB4, 0x9A,
35120x11, 0xF6, 0x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0,
35130x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x00, 0xF3,
35140xB4, 0x9B, 0x11, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
35150x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A,
35160x00, 0xF3, 0x27, 0xC2, 0x04, 0x93, 0x08, 0x97, 0x07, 0x91, 0x06, 0x90,
35170x63, 0xF3, 0x00, 0x4B, 0x04, 0xD3, 0x04, 0x6A, 0x00, 0xF3, 0x44, 0xC3,
35180x00, 0xEF, 0x05, 0x63, 0xFB, 0x63, 0x06, 0xD0, 0x02, 0xF0, 0x00, 0x68,
35190x00, 0x30, 0xAF, 0x40, 0xFF, 0xF0, 0x10, 0x6E, 0x15, 0x6C, 0x08, 0x62,
35200x00, 0x1C, 0x83, 0x45, 0x07, 0xD1, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C,
35210x1A, 0x6C, 0x46, 0xF0, 0x16, 0x6E, 0x00, 0x1C, 0x83, 0x45, 0xAF, 0x40,
35220x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
35230x40, 0x32, 0x05, 0xD2, 0x63, 0xF3, 0x40, 0x9A, 0x01, 0x6B, 0x4E, 0x32,
35240x6C, 0xEA, 0x0A, 0x22, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33,
35250x63, 0xF3, 0x00, 0x4B, 0x00, 0xF3, 0x47, 0xA3, 0x01, 0x72, 0x1D, 0x61,
35260x05, 0x92, 0x63, 0xF3, 0x20, 0x9A, 0x01, 0x6A, 0x2E, 0x31, 0x4C, 0xE9,
35270x09, 0x29, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
35280x00, 0x4B, 0x00, 0xF3, 0x47, 0xA3, 0x5C, 0x2A, 0x05, 0x92, 0x08, 0x97,
35290x07, 0x91, 0x63, 0xF3, 0x00, 0x4A, 0x05, 0xD2, 0x05, 0x93, 0x06, 0x90,
35300x01, 0x6A, 0x00, 0xF3, 0x44, 0xC3, 0x00, 0xEF, 0x05, 0x63, 0xC9, 0xF7,
35310x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x31, 0x24, 0xF2, 0x02, 0x68, 0x20, 0x31,
35320x00, 0x30, 0x01, 0xF6, 0x88, 0x41, 0x24, 0xF2, 0x02, 0x6D, 0x00, 0x1C,
35330xDD, 0x5B, 0x00, 0x30, 0x01, 0xF6, 0x80, 0x41, 0x24, 0xF2, 0xA2, 0x40,
35340x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x01, 0xF6, 0x84, 0x41, 0x24, 0xF2,
35350xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x11, 0xF6, 0x80, 0x41,
35360x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x11, 0xF6,
35370x84, 0x41, 0x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
35380x11, 0xF6, 0x88, 0x41, 0x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
35390x00, 0x65, 0x11, 0xF6, 0x8C, 0x41, 0x24, 0xF2, 0xA2, 0x40, 0x00, 0x1C,
35400xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
35410x01, 0x6B, 0x63, 0xF3, 0x00, 0x4A, 0x00, 0xF3, 0x67, 0xC2, 0x05, 0x92,
35420x08, 0x97, 0x07, 0x91, 0x63, 0xF3, 0x00, 0x4A, 0x05, 0xD2, 0x05, 0x93,
35430x06, 0x90, 0x01, 0x6A, 0x00, 0xF3, 0x44, 0xC3, 0x00, 0xEF, 0x05, 0x63,
35440xC9, 0xF7, 0x1B, 0x68, 0x02, 0xF0, 0x10, 0x6A, 0x0B, 0xE8, 0x40, 0x32,
35450x40, 0x32, 0x00, 0x30, 0xA2, 0x67, 0x00, 0x30, 0x01, 0xF6, 0x80, 0x40,
35460x02, 0xF0, 0x10, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x04, 0xD2, 0x04, 0x95,
35470x01, 0xF6, 0x84, 0x40, 0x02, 0xF0, 0x10, 0x4D, 0x00, 0x1C, 0xDD, 0x5B,
35480x00, 0x65, 0x01, 0xF6, 0x88, 0x40, 0x02, 0xF0, 0x10, 0x6D, 0x00, 0x1C,
35490xDD, 0x5B, 0x00, 0x65, 0x04, 0x95, 0x11, 0xF6, 0x80, 0x40, 0x02, 0xF0,
35500x10, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x04, 0x95, 0x11, 0xF6,
35510x84, 0x40, 0x02, 0xF0, 0x10, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
35520x04, 0x95, 0x11, 0xF6, 0x88, 0x40, 0x02, 0xF0, 0x10, 0x4D, 0x00, 0x1C,
35530xDD, 0x5B, 0x00, 0x65, 0x04, 0x95, 0x11, 0xF6, 0x8C, 0x40, 0x02, 0xF0,
35540x10, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6B,
35550x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x00, 0xF3, 0x27, 0xC3,
35560x05, 0x92, 0x08, 0x97, 0x07, 0x91, 0x63, 0xF3, 0x00, 0x4A, 0x05, 0xD2,
35570x05, 0x93, 0x06, 0x90, 0x01, 0x6A, 0x00, 0xF3, 0x44, 0xC3, 0x00, 0xEF,
35580x05, 0x63, 0x00, 0x00, 0xFC, 0x63, 0x05, 0xD1, 0x10, 0xF0, 0x02, 0x69,
35590x00, 0xF4, 0x20, 0x31, 0x06, 0x62, 0x04, 0xD0, 0x63, 0xF3, 0x00, 0x49,
35600x00, 0xF3, 0xCC, 0x99, 0x02, 0xF0, 0x00, 0x68, 0x00, 0x30, 0xAF, 0x40,
35610x00, 0x1C, 0x83, 0x45, 0x15, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C,
35620x00, 0xF3, 0xD0, 0x99, 0x1A, 0x6C, 0x00, 0x1C, 0x83, 0x45, 0xAF, 0x40,
35630x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x00, 0xF3, 0x44, 0xA1, 0x0E, 0x2A,
35640xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x01, 0xF6,
35650x00, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0x6C, 0x99,
35660x6E, 0xEA, 0x36, 0x22, 0xC9, 0xF7, 0x1B, 0x68, 0x0B, 0xE8, 0xE0, 0xF2,
35670xA8, 0x99, 0x00, 0x30, 0x00, 0x30, 0x01, 0xF6, 0x88, 0x40, 0x00, 0x1C,
35680xDD, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0xAC, 0x99, 0x01, 0xF6, 0x80, 0x40,
35690x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0xB0, 0x99, 0x01, 0xF6,
35700x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0xB4, 0x99,
35710x11, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xE0, 0xF2,
35720xB8, 0x99, 0x11, 0xF6, 0x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
35730xE0, 0xF2, 0xBC, 0x99, 0x11, 0xF6, 0x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
35740x00, 0x65, 0x00, 0xF3, 0xA0, 0x99, 0x11, 0xF6, 0x8C, 0x40, 0x00, 0x1C,
35750xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
35760x06, 0x97, 0x05, 0x91, 0x04, 0x90, 0x63, 0xF3, 0x00, 0x4A, 0x00, 0x6B,
35770x00, 0xF3, 0x64, 0xC2, 0x02, 0x6B, 0x00, 0xF3, 0x67, 0xC2, 0x00, 0xEF,
35780x04, 0x63, 0x00, 0x00, 0xFC, 0x63, 0x05, 0xD1, 0x10, 0xF0, 0x02, 0x69,
35790x00, 0xF4, 0x20, 0x31, 0x06, 0x62, 0x04, 0xD0, 0x63, 0xF3, 0x00, 0x49,
35800x00, 0xF3, 0xCC, 0x99, 0x02, 0xF0, 0x00, 0x68, 0x00, 0x30, 0xAF, 0x40,
35810x00, 0x1C, 0x83, 0x45, 0x15, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C,
35820x00, 0xF3, 0xD0, 0x99, 0x1A, 0x6C, 0x00, 0x1C, 0x83, 0x45, 0xAF, 0x40,
35830x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x00, 0xF3, 0x44, 0xA1, 0x03, 0x72,
35840x5B, 0x60, 0xE0, 0xF2, 0xAC, 0x99, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA,
35850x40, 0x30, 0x00, 0x30, 0x01, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
35860x00, 0x65, 0xE0, 0xF2, 0xB0, 0x99, 0x01, 0xF6, 0x84, 0x40, 0x00, 0x1C,
35870xDD, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0xB4, 0x99, 0x11, 0xF6, 0x80, 0x40,
35880x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0xB8, 0x99, 0x11, 0xF6,
35890x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0xBC, 0x99,
35900x11, 0xF6, 0x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0xF3,
35910xA0, 0x99, 0x11, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
35920x00, 0xF3, 0x48, 0x99, 0xE0, 0xF2, 0x68, 0x99, 0x55, 0xE3, 0x1F, 0xF7,
35930x00, 0x6A, 0xAC, 0xEA, 0x07, 0xF7, 0x01, 0x5A, 0x16, 0x60, 0x01, 0xF6,
35940x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6A,
35950x00, 0xF4, 0x40, 0x32, 0x06, 0x97, 0x05, 0x91, 0x04, 0x90, 0x63, 0xF3,
35960x00, 0x4A, 0x03, 0x6B, 0x00, 0xF3, 0x64, 0xC2, 0x02, 0x6B, 0x00, 0xF3,
35970x67, 0xC2, 0x00, 0xEF, 0x04, 0x63, 0xFF, 0x6A, 0x01, 0x4A, 0x4B, 0xEA,
35980x40, 0x32, 0xE0, 0xF0, 0x1F, 0x4A, 0x4C, 0xED, 0x07, 0xF7, 0x00, 0x6A,
35990x4D, 0xED, 0xDF, 0x17, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34,
36000x80, 0x34, 0x01, 0xF6, 0x00, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
36010xE0, 0xF2, 0xAC, 0x99, 0xAA, 0xEA, 0x99, 0x61, 0x10, 0xF0, 0x02, 0x6A,
36020x00, 0xF4, 0x40, 0x32, 0x06, 0x97, 0x05, 0x91, 0x04, 0x90, 0x63, 0xF3,
36030x00, 0x4A, 0x03, 0x6B, 0x00, 0xF3, 0x64, 0xC2, 0x02, 0x6B, 0x00, 0xF3,
36040x67, 0xC2, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x00, 0x10, 0xF0, 0x02, 0x6B,
36050x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x40, 0x9B, 0x10, 0x6B, 0xFB, 0x63,
36060x6D, 0xEA, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
36070x40, 0xDB, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x07, 0xD1, 0x40, 0x31,
36080x20, 0x31, 0x51, 0xF4, 0x80, 0x41, 0x08, 0x62, 0x00, 0x1C, 0x00, 0x5C,
36090x06, 0xD0, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x51, 0xF4,
36100x80, 0x41, 0x1A, 0x6D, 0x00, 0x1C, 0xF0, 0x5B, 0x04, 0xD2, 0xF1, 0xF0,
36110x88, 0x41, 0x00, 0x1C, 0x00, 0x5C, 0x00, 0x65, 0x04, 0x93, 0x00, 0xF6,
36120x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x49, 0xE3, 0x08, 0x42, 0x9A, 0x48,
36130xBF, 0xF7, 0x1B, 0x50, 0x09, 0x61, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
36140x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x43, 0xAB, 0x01, 0x4A, 0x43, 0xCB,
36150x04, 0x95, 0xFF, 0x6A, 0x51, 0xF4, 0x80, 0x41, 0x00, 0x1C, 0xF0, 0x5B,
36160x4C, 0xED, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
36170x40, 0x9B, 0x11, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA, 0x10, 0xF0, 0x02, 0x6B,
36180x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x40, 0xDB, 0x0B, 0xED, 0xFF, 0x6A,
36190x91, 0xF4, 0x82, 0x41, 0x00, 0x1C, 0xF0, 0x5B, 0x4C, 0xED, 0x08, 0x97,
36200x07, 0x91, 0x06, 0x90, 0x00, 0x6A, 0x00, 0xEF, 0x05, 0x63, 0x00, 0x00,
36210xF9, 0x63, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
36220x00, 0x4B, 0x0C, 0x62, 0x0B, 0xD1, 0x0A, 0xD0, 0x66, 0xF7, 0x4C, 0x9B,
36230x52, 0x32, 0x05, 0xD2, 0x05, 0x94, 0x7F, 0x6A, 0x4C, 0xEC, 0x05, 0xD4,
36240x00, 0xF3, 0x44, 0xA3, 0x06, 0xD2, 0x40, 0x9B, 0x84, 0x6B, 0x6C, 0xEA,
36250x80, 0x72, 0x2A, 0x61, 0x06, 0x93, 0x01, 0x73, 0x02, 0x60, 0x04, 0x73,
36260x1B, 0x61, 0x02, 0xF0, 0x00, 0x68, 0x00, 0xF2, 0x00, 0x6E, 0x00, 0x30,
36270xC0, 0x36, 0xAF, 0x40, 0xF3, 0xF0, 0x14, 0x4E, 0x00, 0x1C, 0x83, 0x45,
36280x15, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0xFF, 0x6E, 0x01, 0x4E,
36290xC0, 0x36, 0x1A, 0x6C, 0x46, 0xF0, 0x16, 0x4E, 0x00, 0x1C, 0x83, 0x45,
36300xAF, 0x40, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x10, 0xF0, 0x02, 0x6B,
36310x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x01, 0x6A, 0x4B, 0xEA,
36320x00, 0xF3, 0x44, 0xC3, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x30,
36330x00, 0x30, 0x40, 0xF0, 0x6C, 0xA0, 0x03, 0x6A, 0x6C, 0xEA, 0x0A, 0x22,
36340x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x63, 0xF3, 0x40, 0x9C,
36350x01, 0x6B, 0x5E, 0x32, 0x6C, 0xEA, 0x7C, 0x22, 0x10, 0xF0, 0x02, 0x6C,
36360x00, 0xF4, 0x80, 0x34, 0x63, 0xF3, 0x00, 0x4C, 0x00, 0xF3, 0x44, 0x9C,
36370xFF, 0xF7, 0x1F, 0x6B, 0x42, 0x32, 0x6C, 0xEA, 0x16, 0x2A, 0xC9, 0xF7,
36380x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF1, 0x04, 0x4A,
36390x40, 0x9A, 0x0D, 0x72, 0x58, 0x61, 0x46, 0x6A, 0x00, 0xF3, 0x5C, 0xC4,
36400x41, 0x6A, 0x00, 0xF3, 0x5D, 0xC4, 0x40, 0x6A, 0x00, 0xF3, 0x5E, 0xC4,
36410x3B, 0x6A, 0x00, 0xF3, 0x5F, 0xC4, 0x10, 0xF0, 0x02, 0x69, 0x00, 0xF4,
36420x20, 0x31, 0x63, 0xF3, 0x00, 0x49, 0xE4, 0xF4, 0xB8, 0x99, 0xC9, 0xF7,
36430x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x30, 0xFF, 0x6E, 0xB2, 0x35, 0x00, 0x30,
36440xCC, 0xED, 0x61, 0xF4, 0x80, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x08, 0xD6,
36450x60, 0x99, 0x84, 0x6A, 0x08, 0x96, 0x6C, 0xEA, 0x84, 0x72, 0x2B, 0x61,
36460xE4, 0xF4, 0x58, 0x99, 0xFF, 0xF7, 0x1F, 0x72, 0x26, 0x60, 0x76, 0x32,
36470x01, 0x6B, 0x6C, 0xEA, 0x22, 0x22, 0x40, 0xF0, 0x4C, 0xA0, 0x03, 0x6B,
36480xCC, 0xEA, 0x6C, 0xEA, 0x1C, 0x22, 0x06, 0x92, 0x6A, 0xEA, 0xA0, 0xF0,
36490x13, 0x60, 0x04, 0x52, 0xA0, 0xF0, 0x1B, 0x60, 0xC0, 0xF0, 0x18, 0x22,
36500x01, 0x72, 0x11, 0x61, 0x00, 0xF3, 0x5C, 0xA1, 0x05, 0x93, 0xCC, 0xEA,
36510x43, 0xEB, 0xC0, 0xF0, 0x0B, 0x60, 0x00, 0xF3, 0x5F, 0xA1, 0x05, 0x94,
36520xCC, 0xEA, 0x83, 0xEA, 0xA0, 0xF0, 0x1A, 0x61, 0x00, 0x18, 0x96, 0x29,
36530x00, 0x65, 0x0C, 0x97, 0x0B, 0x91, 0x0A, 0x90, 0x00, 0x6A, 0x00, 0xEF,
36540x07, 0x63, 0x4A, 0x6A, 0x00, 0xF3, 0x5C, 0xC4, 0x45, 0x6A, 0x00, 0xF3,
36550x5D, 0xC4, 0x46, 0x6A, 0x00, 0xF3, 0x5E, 0xC4, 0x40, 0x6A, 0x00, 0xF3,
36560x5F, 0xC4, 0xA7, 0x17, 0x01, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xFA, 0x5B,
36570x00, 0x65, 0x0E, 0x2A, 0x11, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xFA, 0x5B,
36580x00, 0x65, 0x27, 0xF7, 0x1F, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x27, 0xF7,
36590x1F, 0x4B, 0x6E, 0xEA, 0x7F, 0xF7, 0x10, 0x22, 0x9D, 0x67, 0x00, 0x1C,
36600x8A, 0x40, 0x10, 0x4C, 0x10, 0xF0, 0x02, 0x69, 0x00, 0xF4, 0x20, 0x31,
36610x01, 0xF6, 0x88, 0x40, 0x63, 0xF3, 0x00, 0x49, 0x00, 0x1C, 0xFA, 0x5B,
36620x00, 0x65, 0xE0, 0xF2, 0x48, 0xD9, 0x01, 0xF6, 0x80, 0x40, 0x00, 0x1C,
36630xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0x4C, 0xD9, 0x01, 0xF6, 0x84, 0x40,
36640x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0x50, 0xD9, 0x11, 0xF6,
36650x80, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF2, 0x54, 0xD9,
36660x11, 0xF6, 0x84, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF2,
36670x58, 0xD9, 0x11, 0xF6, 0x88, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
36680xE0, 0xF2, 0x5C, 0xD9, 0x11, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xFA, 0x5B,
36690x00, 0x65, 0x00, 0xF3, 0x40, 0xD9, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
36700x40, 0x32, 0xCB, 0xF4, 0x46, 0xA2, 0xFF, 0x6B, 0x6C, 0xEA, 0x22, 0x72,
36710x02, 0x60, 0x92, 0x72, 0x1A, 0x61, 0x01, 0xF0, 0x8D, 0x40, 0x00, 0x1C,
36720x00, 0x5C, 0x00, 0x65, 0x0F, 0x6B, 0x4C, 0xEB, 0x0F, 0x6A, 0x6E, 0xEA,
36730xFF, 0x6C, 0x8C, 0xEA, 0x08, 0x5B, 0xA1, 0x42, 0x0C, 0x61, 0xA0, 0x34,
36740x80, 0x33, 0x00, 0xF6, 0xA0, 0x32, 0x6D, 0xEA, 0x8D, 0xEA, 0xAD, 0xEA,
36750xAD, 0xEC, 0x00, 0xF3, 0x54, 0xD9, 0x00, 0xF3, 0x98, 0xD9, 0x9D, 0x67,
36760x00, 0x1C, 0x90, 0x40, 0x10, 0x4C, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
36770x60, 0x33, 0x63, 0xF3, 0x40, 0x9B, 0x80, 0x6B, 0x10, 0xF0, 0x02, 0x6C,
36780x00, 0xF4, 0x80, 0x34, 0x6D, 0xEA, 0x63, 0xF3, 0x40, 0xDC, 0xFC, 0x16,
36790x20, 0xF3, 0x40, 0xA1, 0x05, 0x93, 0xCC, 0xEA, 0x43, 0xEB, 0x5F, 0xF7,
36800x1B, 0x60, 0x00, 0x18, 0xD2, 0x29, 0x00, 0x65, 0x5A, 0x17, 0x06, 0x93,
36810x04, 0x73, 0x12, 0x60, 0xFF, 0x73, 0x5F, 0xF7, 0x14, 0x61, 0x00, 0xF3,
36820x5E, 0xA1, 0x05, 0x94, 0xCC, 0xEA, 0x43, 0xEC, 0x24, 0x61, 0x00, 0xF3,
36830x5C, 0xA1, 0xCC, 0xEA, 0x43, 0xEC, 0x0A, 0x60, 0x00, 0x18, 0x1E, 0x29,
36840x00, 0x65, 0x45, 0x17, 0x00, 0xF3, 0x5D, 0xA1, 0x05, 0x94, 0xCC, 0xEA,
36850x83, 0xEA, 0xF6, 0x60, 0x00, 0x18, 0x9B, 0x28, 0x00, 0x65, 0x3B, 0x17,
36860x00, 0xF3, 0x5E, 0xA1, 0x05, 0x93, 0xCC, 0xEA, 0x43, 0xEB, 0xEC, 0x60,
36870x20, 0xF3, 0x41, 0xA1, 0x05, 0x94, 0xCC, 0xEA, 0x83, 0xEA, 0x3F, 0xF7,
36880x0B, 0x61, 0x00, 0x18, 0xD2, 0x29, 0x00, 0x65, 0x2A, 0x17, 0x20, 0xF3,
36890x41, 0xA1, 0x05, 0x93, 0xCC, 0xEA, 0x63, 0xEA, 0xF6, 0x60, 0x20, 0x17,
36900xFB, 0x63, 0x10, 0xF0, 0x02, 0x6E, 0x00, 0xF4, 0xC0, 0x36, 0x07, 0xD1,
36910x26, 0x67, 0x06, 0xD0, 0x08, 0x62, 0x63, 0xF3, 0x00, 0x49, 0x66, 0xF7,
36920x8C, 0x99, 0x7F, 0x6A, 0x92, 0x30, 0x4C, 0xE8, 0xE0, 0xF2, 0x46, 0xA1,
36930x0F, 0x2A, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x35, 0xA0, 0x35,
36940x40, 0xF0, 0x4C, 0xA5, 0xFF, 0x6B, 0x6C, 0xEA, 0x03, 0x6B, 0x6C, 0xEA,
36950x03, 0x22, 0xFF, 0xF7, 0x1F, 0x74, 0x06, 0x61, 0x08, 0x97, 0x07, 0x91,
36960x06, 0x90, 0x00, 0x6A, 0x00, 0xEF, 0x05, 0x63, 0x01, 0xF0, 0x80, 0x45,
36970x04, 0xD5, 0x00, 0x1C, 0x00, 0x5C, 0x05, 0xD6, 0x01, 0x6B, 0x6C, 0xEA,
36980x04, 0x95, 0x05, 0x96, 0x2C, 0x22, 0x4B, 0x58, 0x06, 0x61, 0xC0, 0xF2,
36990x53, 0xA1, 0xFF, 0x6C, 0x8C, 0xEA, 0x6A, 0xEA, 0x74, 0x61, 0x48, 0x40,
37000xE0, 0x4A, 0xFF, 0x6B, 0x6C, 0xEA, 0x1E, 0x5A, 0x07, 0x60, 0x86, 0x67,
37010x63, 0xF3, 0x00, 0x4C, 0xC0, 0xF2, 0x53, 0xA4, 0x6C, 0xEA, 0x43, 0x2A,
37020x23, 0x58, 0xD8, 0x60, 0x66, 0x67, 0x63, 0xF3, 0x00, 0x4B, 0xC0, 0xF2,
37030x53, 0xA3, 0x02, 0x72, 0xD1, 0x60, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC,
37040x80, 0x34, 0x02, 0x6A, 0x80, 0x34, 0xC0, 0xF2, 0x53, 0xC3, 0x81, 0xF4,
37050x07, 0x4C, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x6D, 0xC3, 0x17, 0x4B, 0x58,
37060x06, 0x61, 0xC0, 0xF2, 0x53, 0xA1, 0xFF, 0x6C, 0x8C, 0xEA, 0x01, 0x72,
37070x40, 0x61, 0x48, 0x40, 0xE0, 0x4A, 0xFF, 0x6B, 0x6C, 0xEA, 0x1E, 0x5A,
37080x07, 0x60, 0x86, 0x67, 0x63, 0xF3, 0x00, 0x4C, 0xC0, 0xF2, 0x53, 0xA4,
37090x6C, 0xEA, 0x25, 0x2A, 0x23, 0x58, 0xAC, 0x60, 0x66, 0x67, 0x63, 0xF3,
37100x00, 0x4B, 0xC0, 0xF2, 0x53, 0xA3, 0x02, 0x72, 0xA5, 0x60, 0xC9, 0xF7,
37110x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x02, 0x6A, 0x80, 0x34, 0xC0, 0xF2,
37120x53, 0xC3, 0x21, 0xF4, 0x10, 0x4C, 0x00, 0x1C, 0xF0, 0x5B, 0x42, 0x6D,
37130x97, 0x17, 0x00, 0x6A, 0xC0, 0xF2, 0x53, 0xC4, 0xC9, 0xF7, 0x1B, 0x6C,
37140x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x81, 0xF4, 0x07, 0x4C, 0x00, 0x1C,
37150xF0, 0x5B, 0x20, 0x6D, 0x89, 0x17, 0x00, 0x6A, 0xC0, 0xF2, 0x53, 0xC4,
37160xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x21, 0xF4,
37170x10, 0x4C, 0x00, 0x1C, 0xF0, 0x5B, 0x44, 0x6D, 0x7B, 0x17, 0x31, 0xF4,
37180x80, 0x45, 0xC0, 0xF2, 0x73, 0xC1, 0x00, 0x1C, 0xF0, 0x5B, 0x43, 0x6D,
37190x73, 0x17, 0x81, 0xF4, 0x87, 0x45, 0xC0, 0xF2, 0x73, 0xC1, 0x00, 0x1C,
37200xF0, 0x5B, 0x10, 0x6D, 0x6B, 0x17, 0x00, 0x65, 0xE8, 0xFF, 0xBD, 0x27,
37210x10, 0x00, 0xBF, 0xAF, 0x24, 0x63, 0x00, 0x0C, 0x21, 0x38, 0x00, 0x00,
37220x10, 0x00, 0xBF, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
37230x18, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
37240x01, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x10, 0x3C, 0x14, 0xAE, 0x42, 0x24,
37250x1C, 0x00, 0xB1, 0xAF, 0x18, 0x03, 0x11, 0x36, 0x10, 0x00, 0xA4, 0x27,
37260x00, 0x00, 0x22, 0xAE, 0x20, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
37270x30, 0x03, 0x10, 0x36, 0x20, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x05, 0x3C,
37280x00, 0x00, 0x02, 0xAE, 0x01, 0x80, 0x02, 0x3C, 0x15, 0xAE, 0x44, 0x24,
37290x33, 0x03, 0xA3, 0x34, 0x00, 0x00, 0x24, 0xAE, 0x00, 0x00, 0x62, 0x90,
37300x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x42, 0x30, 0xFB, 0xFF, 0x40, 0x10,
37310x30, 0x03, 0xA2, 0x34, 0x00, 0x00, 0x46, 0x8C, 0x0F, 0x00, 0x03, 0x3C,
37320xFF, 0xFF, 0x63, 0x34, 0x24, 0x30, 0xC3, 0x00, 0x40, 0x11, 0x06, 0x00,
37330x23, 0x10, 0x46, 0x00, 0x80, 0x10, 0x02, 0x00, 0x21, 0x10, 0x46, 0x00,
37340xAF, 0x0F, 0x05, 0x3C, 0xC0, 0x10, 0x02, 0x00, 0x00, 0xA0, 0xA5, 0x34,
37350x1B, 0x00, 0xA2, 0x00, 0x02, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
37360x0D, 0x00, 0x07, 0x00, 0x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x63, 0x24,
37370xC2, 0x30, 0x06, 0x00, 0x10, 0x00, 0xA4, 0x27, 0x54, 0x41, 0x66, 0xAC,
37380x12, 0x28, 0x00, 0x00, 0x90, 0x40, 0x00, 0x0C, 0x58, 0x41, 0x65, 0xAC,
37390x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
37400x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27, 0xC0, 0xFF, 0xBD, 0x27,
37410x2C, 0x00, 0xB5, 0xAF, 0x20, 0x00, 0xB2, 0xAF, 0x21, 0xA8, 0x80, 0x00,
37420x02, 0x80, 0x12, 0x3C, 0x10, 0x00, 0xA4, 0x27, 0x38, 0x00, 0xBE, 0xAF,
37430x30, 0x00, 0xB6, 0xAF, 0x3C, 0x00, 0xBF, 0xAF, 0x34, 0x00, 0xB7, 0xAF,
37440x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
37450x18, 0x00, 0xB0, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0x44, 0x00, 0xA5, 0xAF,
37460xEC, 0x5D, 0x42, 0x92, 0x21, 0xF0, 0x00, 0x00, 0xC5, 0x00, 0x40, 0x10,
37470x21, 0xB0, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x43, 0x24,
37480xB0, 0x1B, 0x62, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x30,
37490xBE, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3E, 0x62, 0x8C,
37500x00, 0x00, 0x00, 0x00, 0xBA, 0x00, 0x40, 0x14, 0x02, 0x80, 0x17, 0x3C,
37510x0E, 0x5E, 0xE2, 0x92, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x10,
37520x02, 0x80, 0x02, 0x3C, 0x0E, 0x5E, 0xE2, 0x92, 0x00, 0x00, 0x00, 0x00,
37530xFF, 0xFF, 0x42, 0x24, 0x0E, 0x5E, 0xE2, 0xA2, 0x02, 0x80, 0x02, 0x3C,
37540x02, 0x80, 0x03, 0x3C, 0xF2, 0x5D, 0x40, 0xA0, 0x14, 0x5E, 0x60, 0xAC,
37550x02, 0x80, 0x03, 0x3C, 0x07, 0x5E, 0x62, 0x90, 0xFD, 0xFF, 0x03, 0x24,
37560x42, 0xB0, 0x13, 0x3C, 0x24, 0x10, 0x43, 0x00, 0x02, 0x80, 0x03, 0x3C,
37570x07, 0x5E, 0x62, 0xA0, 0x00, 0x00, 0x63, 0x92, 0xEF, 0xFF, 0x02, 0x24,
37580x03, 0x00, 0x64, 0x36, 0x24, 0x18, 0x62, 0x00, 0x40, 0x00, 0x02, 0x24,
37590x00, 0x00, 0x63, 0xA2, 0x00, 0x00, 0x82, 0xA0, 0x02, 0x80, 0x04, 0x3C,
37600xF4, 0x5D, 0x82, 0x94, 0x20, 0x00, 0xA3, 0x96, 0xFF, 0xFF, 0x42, 0x30,
37610x0A, 0x00, 0x43, 0x10, 0x02, 0x80, 0x14, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
37620x94, 0x00, 0x42, 0x34, 0xF4, 0x5D, 0x83, 0xA4, 0x00, 0x00, 0x43, 0xA4,
37630xF4, 0x5D, 0x83, 0x94, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x63, 0x30,
37640x80, 0x1A, 0x03, 0x00, 0xF8, 0x5D, 0x83, 0xAE, 0x25, 0xB0, 0x04, 0x3C,
37650x84, 0x00, 0x82, 0x34, 0x00, 0x00, 0x50, 0x8C, 0x80, 0x00, 0x84, 0x34,
37660x00, 0x00, 0x82, 0x8C, 0x21, 0x18, 0x00, 0x00, 0xF8, 0x5D, 0x86, 0x8E,
37670x00, 0x88, 0x10, 0x00, 0x21, 0x80, 0x00, 0x00, 0x25, 0x80, 0x02, 0x02,
37680x25, 0x88, 0x23, 0x02, 0x21, 0x20, 0x00, 0x02, 0x7D, 0x2B, 0x00, 0x0C,
37690x21, 0x28, 0x20, 0x02, 0xF8, 0x5D, 0x88, 0x8E, 0x02, 0x80, 0x0A, 0x3C,
37700xFC, 0x5D, 0x43, 0x95, 0x23, 0x48, 0x02, 0x01, 0x21, 0x20, 0x30, 0x01,
37710x21, 0x28, 0x00, 0x00, 0x2B, 0x10, 0x90, 0x00, 0xFF, 0xFF, 0x63, 0x30,
37720x21, 0x28, 0xB1, 0x00, 0x80, 0x1A, 0x03, 0x00, 0x21, 0x28, 0xA2, 0x00,
37730x21, 0x38, 0x00, 0x00, 0x2B, 0x40, 0x83, 0x00, 0x23, 0x28, 0xA7, 0x00,
37740x23, 0x20, 0x83, 0x00, 0x23, 0x28, 0xA8, 0x00, 0x02, 0x80, 0x03, 0x3C,
37750x18, 0x5E, 0x64, 0xAC, 0x1C, 0x5E, 0x65, 0xAC, 0xFC, 0x5D, 0x42, 0x95,
37760x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x42, 0x30, 0x80, 0x12, 0x02, 0x00,
37770x2B, 0x10, 0x49, 0x00, 0x97, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
37780xFC, 0x5D, 0x42, 0x95, 0x00, 0x00, 0x64, 0x92, 0xFB, 0xFF, 0x03, 0x24,
37790xFF, 0xFF, 0x42, 0x30, 0x80, 0x12, 0x02, 0x00, 0x24, 0x20, 0x83, 0x00,
37800x23, 0x48, 0x22, 0x01, 0x00, 0x00, 0x64, 0xA2, 0x01, 0x00, 0x06, 0x24,
37810x04, 0x00, 0x20, 0x11, 0x01, 0x00, 0x04, 0x24, 0x80, 0x10, 0x09, 0x00,
37820x21, 0x10, 0x49, 0x00, 0x80, 0x30, 0x02, 0x00, 0xB9, 0x20, 0x00, 0x0C,
37830x21, 0x28, 0x00, 0x00, 0x42, 0xB0, 0x02, 0x3C, 0x22, 0x00, 0x03, 0x24,
37840x03, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA0, 0x44, 0x00, 0xA2, 0x8F,
37850x05, 0x00, 0x05, 0x24, 0x24, 0x00, 0xA4, 0x26, 0x00, 0x00, 0x47, 0x8C,
37860x14, 0x00, 0xA6, 0x27, 0xFF, 0x3F, 0xE7, 0x30, 0xAB, 0x1A, 0x00, 0x0C,
37870xDC, 0xFF, 0xE7, 0x24, 0x2C, 0x00, 0x40, 0x10, 0x21, 0x28, 0x40, 0x00,
37880xEC, 0x5D, 0x42, 0x92, 0x02, 0x00, 0x03, 0x24, 0xFF, 0x00, 0x42, 0x30,
37890x83, 0x00, 0x43, 0x10, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x00, 0xA2, 0x90,
37900x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
37910x04, 0x00, 0xA3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x62, 0x30,
37920x04, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C, 0x01, 0x00, 0x16, 0x24,
37930x0B, 0x5E, 0x56, 0xA0, 0x04, 0x00, 0xA3, 0x90, 0x14, 0x00, 0xA7, 0x8F,
37940x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xE2, 0x28, 0x16, 0x00, 0x40, 0x14,
37950xFE, 0x00, 0x66, 0x30, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x43, 0x24,
37960x4C, 0x3A, 0x64, 0x94, 0xC0, 0x10, 0x06, 0x00, 0x2A, 0x10, 0x82, 0x00,
37970x10, 0x00, 0x40, 0x14, 0x02, 0x80, 0x03, 0x3C, 0x21, 0x10, 0xC7, 0x00,
37980xFD, 0xFF, 0x42, 0x24, 0xC0, 0x10, 0x02, 0x00, 0x2A, 0x10, 0x44, 0x00,
37990x0A, 0x00, 0x40, 0x14, 0xC2, 0x10, 0x04, 0x00, 0x23, 0x30, 0x46, 0x00,
38000x21, 0x18, 0xA6, 0x00, 0x05, 0x00, 0x62, 0x90, 0x07, 0x00, 0x84, 0x30,
38010x01, 0x00, 0x03, 0x24, 0x07, 0x10, 0x82, 0x00, 0x01, 0x00, 0x42, 0x30,
38020x0B, 0xF0, 0x62, 0x00, 0x02, 0x80, 0x03, 0x3C, 0x07, 0x5E, 0x62, 0x90,
38030xEF, 0xFF, 0x03, 0x24, 0x21, 0x20, 0xC0, 0x02, 0x24, 0x10, 0x43, 0x00,
38040x02, 0x80, 0x03, 0x3C, 0x07, 0x5E, 0x62, 0xA0, 0xEC, 0x5D, 0x43, 0x92,
38050x02, 0x80, 0x02, 0x3C, 0xE0, 0xE4, 0x42, 0x24, 0xFF, 0x00, 0x63, 0x30,
38060x80, 0x18, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00, 0x00, 0x00, 0x66, 0x8C,
38070x00, 0x00, 0x00, 0x00, 0x09, 0xF8, 0xC0, 0x00, 0x21, 0x28, 0xC0, 0x03,
38080x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x3C, 0x00, 0xBF, 0x8F,
38090x38, 0x00, 0xBE, 0x8F, 0x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F,
38100x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
38110x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
38120x08, 0x00, 0xE0, 0x03, 0x40, 0x00, 0xBD, 0x27, 0xEC, 0x5D, 0x42, 0x92,
38130x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x40, 0x14, 0x02, 0x80, 0x03, 0x3C,
38140x60, 0x1B, 0x70, 0x24, 0xB0, 0x1B, 0x02, 0x96, 0x00, 0x00, 0x00, 0x00,
38150x00, 0x01, 0x42, 0x30, 0xE9, 0xFF, 0x40, 0x10, 0x05, 0x00, 0x05, 0x24,
38160x44, 0x00, 0xA2, 0x8F, 0x24, 0x00, 0xA4, 0x26, 0x00, 0x00, 0x47, 0x8C,
38170x14, 0x00, 0xA6, 0x27, 0xFF, 0x3F, 0xE7, 0x30, 0xAB, 0x1A, 0x00, 0x0C,
38180xDC, 0xFF, 0xE7, 0x24, 0xE0, 0xFF, 0x40, 0x10, 0x21, 0x28, 0x40, 0x00,
38190x14, 0x00, 0xA7, 0x8F, 0x04, 0x00, 0x42, 0x90, 0x04, 0x00, 0xE3, 0x28,
38200xDB, 0xFF, 0x60, 0x14, 0xFE, 0x00, 0x46, 0x30, 0x4C, 0x3A, 0x04, 0x96,
38210xC0, 0x10, 0x06, 0x00, 0x2A, 0x10, 0x82, 0x00, 0xD6, 0xFF, 0x40, 0x14,
38220x21, 0x10, 0xC7, 0x00, 0xFD, 0xFF, 0x42, 0x24, 0xC0, 0x10, 0x02, 0x00,
38230x2A, 0x10, 0x44, 0x00, 0xD1, 0xFF, 0x40, 0x14, 0xC2, 0x10, 0x04, 0x00,
38240x23, 0x30, 0x46, 0x00, 0x21, 0x18, 0xA6, 0x00, 0x05, 0x00, 0x62, 0x90,
38250x07, 0x00, 0x84, 0x30, 0x07, 0x10, 0x82, 0x00, 0x01, 0x00, 0x42, 0x30,
38260xC9, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x51, 0x00, 0x0C,
38270x21, 0x20, 0x00, 0x00, 0x83, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
38280x0E, 0x5E, 0xE2, 0x92, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x40, 0x14,
38290x00, 0x00, 0x00, 0x00, 0x0E, 0x5E, 0xE2, 0x92, 0x00, 0x00, 0x00, 0x00,
38300x01, 0x00, 0x42, 0x24, 0x0E, 0x5E, 0xE2, 0xA2, 0x00, 0x00, 0x62, 0x92,
38310xFB, 0xFF, 0x03, 0x24, 0x01, 0x00, 0x06, 0x24, 0x24, 0x10, 0x43, 0x00,
38320x00, 0x00, 0x62, 0xA2, 0x32, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
38330x03, 0x00, 0xA2, 0x90, 0x02, 0x80, 0x07, 0x3C, 0x09, 0x5E, 0xE2, 0xA0,
38340x02, 0x00, 0xA3, 0x90, 0x21, 0x30, 0x80, 0x00, 0x0A, 0x5E, 0x83, 0xA0,
38350x0A, 0x5E, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x14,
38360x00, 0x00, 0x00, 0x00, 0x09, 0x5E, 0xE2, 0x90, 0x00, 0x00, 0x00, 0x00,
38370x0A, 0x5E, 0xC2, 0xA0, 0x4C, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
38380x0A, 0x5E, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x5E, 0xC2, 0xA0,
38390x4C, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x24,
38400x02, 0x80, 0x02, 0x3C, 0x0D, 0x5E, 0x43, 0xA0, 0xD0, 0x07, 0x04, 0x24,
38410x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0xDC, 0x5D, 0x44, 0xAC,
38420x0C, 0x5E, 0x60, 0xA0, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
38430xD8, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF,
38440x20, 0x00, 0xBF, 0xAF, 0x04, 0x00, 0x82, 0x8C, 0x02, 0x00, 0x03, 0x24,
38450x21, 0x80, 0x80, 0x00, 0x02, 0x17, 0x02, 0x00, 0x03, 0x00, 0x42, 0x30,
38460x06, 0x00, 0x43, 0x10, 0x02, 0x80, 0x11, 0x3C, 0x20, 0x00, 0xBF, 0x8F,
38470x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
38480x28, 0x00, 0xBD, 0x27, 0xEC, 0x5D, 0x22, 0x92, 0x00, 0x00, 0x00, 0x00,
38490xF8, 0xFF, 0x40, 0x10, 0x10, 0x00, 0xA4, 0x27, 0x8A, 0x40, 0x00, 0x0C,
38500x00, 0x00, 0x00, 0x00, 0xEC, 0x5D, 0x23, 0x92, 0x02, 0x80, 0x02, 0x3C,
38510xB4, 0xE4, 0x42, 0x24, 0xFF, 0x00, 0x63, 0x30, 0x80, 0x18, 0x03, 0x00,
38520x21, 0x18, 0x62, 0x00, 0x00, 0x00, 0x66, 0x8C, 0x00, 0x00, 0x04, 0x8E,
38530x04, 0x00, 0x05, 0x8E, 0x09, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
38540x02, 0x80, 0x02, 0x3C, 0xEE, 0x5D, 0x43, 0x90, 0x0C, 0x00, 0x02, 0x24,
38550xFF, 0x00, 0x63, 0x30, 0x05, 0x00, 0x62, 0x10, 0x10, 0x00, 0xA4, 0x27,
38560x90, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x2C, 0x00, 0x08,
38570x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x06, 0x5E, 0x43, 0x90,
38580x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x60, 0x10, 0x02, 0x80, 0x05, 0x3C,
38590x0C, 0x5E, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24,
38600x0C, 0x5E, 0xA2, 0xA0, 0x90, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
38610xF7, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xB0, 0x04, 0x3C,
38620x28, 0x00, 0x85, 0x34, 0x02, 0x00, 0x82, 0x94, 0x04, 0x00, 0x84, 0x24,
38630x05, 0x00, 0x40, 0x14, 0x2B, 0x18, 0xA4, 0x00, 0xFB, 0xFF, 0x60, 0x10,
38640x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
38650x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x25, 0xB0, 0x03, 0x3C,
38660xBE, 0x00, 0x63, 0x34, 0x00, 0x00, 0x62, 0x94, 0x08, 0x00, 0xE0, 0x03,
38670x01, 0x00, 0x42, 0x2C, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
38680x24, 0x2D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C,
38690x19, 0x00, 0x40, 0x10, 0x98, 0x54, 0x64, 0x24, 0x98, 0x54, 0x62, 0x8C,
38700x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x44, 0x14, 0x02, 0x80, 0x02, 0x3C,
38710x0D, 0x5E, 0x43, 0x90, 0x01, 0x00, 0x02, 0x24, 0xFF, 0x00, 0x63, 0x30,
38720x10, 0x00, 0x62, 0x10, 0x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x62, 0x90,
38730x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x42, 0x30, 0x05, 0x00, 0x42, 0x28,
38740x0A, 0x00, 0x40, 0x10, 0x01, 0x00, 0x04, 0x24, 0x02, 0x80, 0x02, 0x3C,
38750x64, 0x59, 0x43, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x60, 0x14,
38760x21, 0x10, 0x80, 0x00, 0x10, 0x00, 0xBF, 0x8F, 0x00, 0x00, 0x00, 0x00,
38770x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0x8F,
38780x21, 0x20, 0x00, 0x00, 0x21, 0x10, 0x80, 0x00, 0x08, 0x00, 0xE0, 0x03,
38790x18, 0x00, 0xBD, 0x27, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
38800x24, 0x2D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x40, 0x10,
38810x02, 0x80, 0x02, 0x3C, 0x98, 0x54, 0x43, 0x8C, 0x98, 0x54, 0x42, 0x24,
38820x28, 0x00, 0x62, 0x14, 0x02, 0x80, 0x03, 0x3C, 0x05, 0x5E, 0x62, 0x90,
38830x01, 0x00, 0x04, 0x24, 0xFF, 0x00, 0x42, 0x30, 0x23, 0x00, 0x44, 0x10,
38840x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
38850x0F, 0x00, 0x42, 0x30, 0x03, 0x00, 0x42, 0x28, 0x1D, 0x00, 0x40, 0x10,
38860x02, 0x80, 0x03, 0x3C, 0x07, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
38870x04, 0x00, 0x42, 0x30, 0x18, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
38880x07, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x42, 0x30,
38890x13, 0x00, 0x40, 0x14, 0x02, 0x80, 0x03, 0x3C, 0x0D, 0x5E, 0x62, 0x90,
38900x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x42, 0x30, 0x0E, 0x00, 0x44, 0x10,
38910x02, 0x80, 0x02, 0x3C, 0x0E, 0x5E, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
38920x0A, 0x00, 0x60, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
38930x04, 0x3E, 0x43, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x14,
38940x21, 0x18, 0x00, 0x00, 0x3C, 0x3A, 0x42, 0x8C, 0x00, 0x00, 0x00, 0x00,
38950x02, 0x00, 0x40, 0x14, 0x01, 0x00, 0x03, 0x24, 0x21, 0x18, 0x00, 0x00,
38960x10, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
38970x18, 0x00, 0xBD, 0x27, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
38980x30, 0x2D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C,
38990x0E, 0x00, 0x40, 0x10, 0x90, 0x54, 0x65, 0x24, 0x90, 0x54, 0x62, 0x8C,
39000x02, 0x80, 0x04, 0x3C, 0x88, 0x54, 0x86, 0x24, 0x09, 0x00, 0x45, 0x14,
39010x01, 0x00, 0x03, 0x24, 0x88, 0x54, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00,
39020x05, 0x00, 0x46, 0x14, 0x21, 0x10, 0x60, 0x00, 0x10, 0x00, 0xBF, 0x8F,
39030x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
39040x10, 0x00, 0xBF, 0x8F, 0x21, 0x18, 0x00, 0x00, 0x21, 0x10, 0x60, 0x00,
39050x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27,
39060x18, 0x00, 0xB0, 0xAF, 0xFF, 0x00, 0x90, 0x30, 0x10, 0x00, 0xA4, 0x27,
39070x20, 0x00, 0xB2, 0xAF, 0x24, 0x00, 0xBF, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
39080x8A, 0x40, 0x00, 0x0C, 0x02, 0x80, 0x12, 0x3C, 0x0F, 0x00, 0x00, 0x12,
39090x00, 0x00, 0x00, 0x00, 0x3C, 0x5E, 0x43, 0x92, 0x01, 0x00, 0x02, 0x24,
39100x04, 0x0C, 0x04, 0x24, 0xFF, 0x00, 0x63, 0x30, 0x2A, 0x00, 0x62, 0x10,
39110x80, 0x01, 0x10, 0x3C, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
39120x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
39130x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
39140x3C, 0x5E, 0x43, 0x92, 0x02, 0x00, 0x02, 0x24, 0x21, 0x28, 0x00, 0x00,
39150xFF, 0x00, 0x63, 0x30, 0xF3, 0xFF, 0x62, 0x14, 0x44, 0x08, 0x04, 0x24,
39160x03, 0x5C, 0x00, 0x0C, 0x7F, 0xFE, 0x10, 0x3C, 0x30, 0x5C, 0x00, 0x0C,
39170x04, 0x0C, 0x04, 0x24, 0xFD, 0x00, 0x45, 0x30, 0x1A, 0x5C, 0x00, 0x0C,
39180x04, 0x0C, 0x04, 0x24, 0x30, 0x5C, 0x00, 0x0C, 0x04, 0x0D, 0x04, 0x24,
39190xFD, 0x00, 0x45, 0x30, 0x1A, 0x5C, 0x00, 0x0C, 0x04, 0x0D, 0x04, 0x24,
39200x26, 0x5C, 0x00, 0x0C, 0x70, 0x0E, 0x04, 0x24, 0xFF, 0xFF, 0x10, 0x36,
39210x24, 0x28, 0x50, 0x00, 0x03, 0x5C, 0x00, 0x0C, 0x70, 0x0E, 0x04, 0x24,
39220x26, 0x5C, 0x00, 0x0C, 0x8C, 0x0E, 0x04, 0x24, 0x24, 0x28, 0x50, 0x00,
39230x03, 0x5C, 0x00, 0x0C, 0x8C, 0x0E, 0x04, 0x24, 0x01, 0x00, 0x02, 0x24,
39240x3C, 0x5E, 0x42, 0xA2, 0xB9, 0x2D, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
39250x30, 0x5C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0x34,
39260xFF, 0x00, 0x45, 0x30, 0x1A, 0x5C, 0x00, 0x0C, 0x04, 0x0C, 0x04, 0x24,
39270x30, 0x5C, 0x00, 0x0C, 0x04, 0x0D, 0x04, 0x24, 0x02, 0x00, 0x42, 0x34,
39280xFF, 0x00, 0x45, 0x30, 0x1A, 0x5C, 0x00, 0x0C, 0x04, 0x0D, 0x04, 0x24,
39290x26, 0x5C, 0x00, 0x0C, 0x70, 0x0E, 0x04, 0x24, 0x25, 0x28, 0x50, 0x00,
39300x03, 0x5C, 0x00, 0x0C, 0x70, 0x0E, 0x04, 0x24, 0x26, 0x5C, 0x00, 0x0C,
39310x8C, 0x0E, 0x04, 0x24, 0x25, 0x28, 0x50, 0x00, 0x03, 0x5C, 0x00, 0x0C,
39320x8C, 0x0E, 0x04, 0x24, 0x03, 0x00, 0x05, 0x3C, 0x59, 0x01, 0xA5, 0x34,
39330x03, 0x5C, 0x00, 0x0C, 0x44, 0x08, 0x04, 0x24, 0x02, 0x00, 0x02, 0x24,
39340x3C, 0x5E, 0x42, 0xA2, 0xB9, 0x2D, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
39350x25, 0xB0, 0x02, 0x3C, 0x42, 0x00, 0x46, 0x34, 0xFC, 0x37, 0x03, 0x24,
39360x40, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA4, 0x03, 0x08, 0x04, 0x24,
39370x03, 0x00, 0x05, 0x24, 0x00, 0x00, 0xC0, 0xA0, 0x1A, 0x5C, 0x00, 0x08,
39380x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB2, 0xAF,
39390x14, 0x00, 0xB1, 0xAF, 0x1C, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
39400x02, 0x80, 0x02, 0x3C, 0xEC, 0x5D, 0x43, 0x90, 0xFC, 0x57, 0x12, 0x24,
39410x0B, 0x00, 0x60, 0x10, 0xFC, 0x77, 0x11, 0x24, 0x02, 0x80, 0x02, 0x3C,
39420xC6, 0x5C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0x30,
39430x2A, 0x00, 0x60, 0x14, 0x21, 0x20, 0x00, 0x00, 0x21, 0x30, 0x00, 0x00,
39440x00, 0x02, 0x05, 0x3C, 0xC1, 0x43, 0x00, 0x0C, 0x00, 0x08, 0x04, 0x24,
39450x25, 0xB0, 0x03, 0x3C, 0x21, 0x00, 0x65, 0x34, 0x00, 0x00, 0xA2, 0x90,
39460x18, 0x00, 0x66, 0x34, 0x40, 0x00, 0x70, 0x34, 0x01, 0x00, 0x42, 0x34,
39470x42, 0x00, 0x63, 0x34, 0x00, 0x00, 0xA2, 0xA0, 0xFF, 0xFF, 0x02, 0x24,
39480x00, 0x00, 0xC0, 0xA0, 0x64, 0x00, 0x04, 0x24, 0x00, 0x00, 0x62, 0xA0,
39490x00, 0x00, 0x12, 0xA6, 0x5B, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
39500x00, 0x00, 0x11, 0xA6, 0x5B, 0x1F, 0x00, 0x0C, 0x0A, 0x00, 0x04, 0x24,
39510x21, 0x28, 0x00, 0x00, 0x1A, 0x5C, 0x00, 0x0C, 0x03, 0x08, 0x04, 0x24,
39520x5B, 0x1F, 0x00, 0x0C, 0x0A, 0x00, 0x04, 0x24, 0xFC, 0x37, 0x02, 0x24,
39530x00, 0x00, 0x02, 0xA6, 0x5B, 0x1F, 0x00, 0x0C, 0x0A, 0x00, 0x04, 0x24,
39540x00, 0x00, 0x11, 0xA6, 0x5B, 0x1F, 0x00, 0x0C, 0x0A, 0x00, 0x04, 0x24,
39550x00, 0x00, 0x12, 0xA6, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
39560x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
39570x20, 0x00, 0xBD, 0x27, 0xA8, 0x2D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
39580x21, 0x30, 0x00, 0x00, 0x00, 0x02, 0x05, 0x3C, 0xC1, 0x43, 0x00, 0x0C,
39590x00, 0x08, 0x04, 0x24, 0x1F, 0x2E, 0x00, 0x08, 0x25, 0xB0, 0x03, 0x3C,
39600xB8, 0xFF, 0xBD, 0x27, 0x2C, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB0, 0xAF,
39610x02, 0x80, 0x13, 0x3C, 0xFF, 0x00, 0x90, 0x30, 0x18, 0x00, 0xA4, 0x27,
39620x30, 0x00, 0xB4, 0xAF, 0x28, 0x00, 0xB2, 0xAF, 0x24, 0x00, 0xB1, 0xAF,
39630x40, 0x00, 0xBF, 0xAF, 0x3C, 0x00, 0xB7, 0xAF, 0x38, 0x00, 0xB6, 0xAF,
39640x34, 0x00, 0xB5, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0xFF, 0x00, 0xB2, 0x30,
39650xEE, 0x5D, 0x62, 0x92, 0x0F, 0x00, 0x11, 0x32, 0x0F, 0x00, 0x42, 0x30,
39660x13, 0x00, 0x51, 0x10, 0x21, 0xA0, 0x00, 0x00, 0x04, 0x00, 0x02, 0x32,
39670x40, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x5D, 0x62, 0x92,
39680x0C, 0x00, 0x03, 0x24, 0x0F, 0x00, 0x42, 0x30, 0x8F, 0x00, 0x43, 0x10,
39690x08, 0x00, 0x02, 0x32, 0xEE, 0x5D, 0x62, 0x92, 0x04, 0x00, 0x03, 0x24,
39700x0F, 0x00, 0x42, 0x30, 0xD2, 0x01, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00,
39710xEE, 0x5D, 0x62, 0x92, 0x02, 0x00, 0x03, 0x24, 0x0F, 0x00, 0x42, 0x30,
39720x9B, 0x00, 0x43, 0x10, 0x06, 0x00, 0x02, 0x32, 0x02, 0x80, 0x10, 0x3C,
39730xED, 0x5D, 0x03, 0x92, 0xEE, 0x5D, 0x62, 0x92, 0x0F, 0x00, 0x63, 0x30,
39740x0F, 0x00, 0x42, 0x30, 0x2A, 0x10, 0x43, 0x00, 0x1C, 0x00, 0x40, 0x14,
39750x02, 0x80, 0x12, 0x3C, 0xED, 0x5D, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00,
39760x40, 0x00, 0x42, 0x30, 0x17, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
39770xC2, 0x5C, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x43, 0x30,
39780x52, 0x00, 0x60, 0x14, 0x04, 0x00, 0x42, 0x30, 0x10, 0x00, 0x40, 0x10,
39790x00, 0x00, 0x00, 0x00, 0xEE, 0x5D, 0x43, 0x92, 0x02, 0x80, 0x06, 0x3C,
39800x14, 0xE5, 0xC5, 0x90, 0x0F, 0x00, 0x63, 0x30, 0x25, 0xB0, 0x02, 0x3C,
39810x25, 0x18, 0x65, 0x00, 0xDD, 0x02, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA0,
39820xED, 0x5D, 0x04, 0x92, 0x80, 0xFF, 0x02, 0x24, 0xBF, 0xFF, 0x03, 0x24,
39830x26, 0x28, 0xA2, 0x00, 0x24, 0x20, 0x83, 0x00, 0x14, 0xE5, 0xC5, 0xA0,
39840xED, 0x5D, 0x04, 0xA2, 0x90, 0x40, 0x00, 0x0C, 0x18, 0x00, 0xA4, 0x27,
39850x40, 0x00, 0xBF, 0x8F, 0x3C, 0x00, 0xB7, 0x8F, 0x38, 0x00, 0xB6, 0x8F,
39860x34, 0x00, 0xB5, 0x8F, 0x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F,
39870x28, 0x00, 0xB2, 0x8F, 0x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F,
39880x08, 0x00, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x27, 0xEE, 0x5D, 0x62, 0x92,
39890x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x42, 0x30, 0x4C, 0x00, 0x40, 0x10,
39900x00, 0x00, 0x00, 0x00, 0xEE, 0x5D, 0x62, 0x92, 0x00, 0x00, 0x00, 0x00,
39910x08, 0x00, 0x42, 0x30, 0x03, 0x00, 0x40, 0x10, 0x08, 0x00, 0x02, 0x32,
39920x1B, 0x00, 0x40, 0x10, 0x02, 0x80, 0x03, 0x3C, 0xEE, 0x5D, 0x62, 0x92,
39930x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x42, 0x30, 0x0C, 0x00, 0x40, 0x14,
39940x08, 0x00, 0x02, 0x32, 0x0A, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
39950x08, 0x00, 0x40, 0x12, 0x02, 0x80, 0x03, 0x3C, 0x10, 0x37, 0x62, 0x94,
39960x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x30, 0x03, 0x00, 0x40, 0x10,
39970x00, 0x00, 0x00, 0x00, 0x0E, 0x51, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00,
39980xEE, 0x5D, 0x62, 0x92, 0xF0, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00,
39990xEE, 0x5D, 0x62, 0xA2, 0xEE, 0x5D, 0x63, 0x92, 0x00, 0x00, 0x00, 0x00,
40000x25, 0x18, 0x23, 0x02, 0xEE, 0x5D, 0x63, 0xA2, 0x72, 0x2E, 0x00, 0x08,
40010x02, 0x80, 0x10, 0x3C, 0x10, 0x37, 0x62, 0x94, 0x00, 0x00, 0x00, 0x00,
40020x00, 0x01, 0x42, 0x30, 0xF2, 0xFF, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
40030x0D, 0x5E, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xFF, 0x60, 0x14,
40040x01, 0x00, 0x04, 0x24, 0x0E, 0x51, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
40050xBD, 0x2E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x53, 0x21, 0x00, 0x0C,
40060x24, 0x00, 0x04, 0x24, 0x76, 0x01, 0x40, 0x10, 0x21, 0x88, 0x40, 0x00,
40070x02, 0x80, 0x02, 0x3C, 0xEC, 0x5D, 0x45, 0x90, 0xEE, 0x5D, 0x44, 0x92,
40080xED, 0x5D, 0x02, 0x92, 0xBF, 0xFF, 0x03, 0x24, 0x0F, 0x00, 0x84, 0x30,
40090x24, 0x10, 0x43, 0x00, 0xED, 0x5D, 0x02, 0xA2, 0x10, 0x00, 0xA5, 0xA3,
40100x11, 0x00, 0xA4, 0xA3, 0x08, 0x00, 0x24, 0x96, 0x02, 0x80, 0x02, 0x3C,
40110x10, 0x00, 0xA5, 0x27, 0x25, 0x20, 0x82, 0x00, 0x20, 0x00, 0x84, 0x24,
40120xC2, 0x1B, 0x00, 0x0C, 0x01, 0x00, 0x06, 0x24, 0x04, 0x00, 0x03, 0x24,
40130x17, 0x00, 0x02, 0x24, 0x0C, 0x00, 0x23, 0xAE, 0x14, 0x00, 0x22, 0xAE,
40140x17, 0x0A, 0x00, 0x0C, 0x21, 0x20, 0x20, 0x02, 0x94, 0x2E, 0x00, 0x08,
40150x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
40160xA6, 0x2E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x71, 0xFF, 0x40, 0x14,
40170x00, 0x00, 0x00, 0x00, 0x35, 0x2D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
40180x77, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x5D, 0x62, 0x92,
40190xF0, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00, 0xEE, 0x5D, 0x62, 0xA2,
40200x02, 0x80, 0x03, 0x3C, 0xEE, 0x5D, 0x62, 0x92, 0x10, 0x37, 0x64, 0x94,
40210x04, 0x00, 0x42, 0x34, 0x00, 0x01, 0x84, 0x30, 0xEE, 0x5D, 0x62, 0xA2,
40220x61, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x51, 0x00, 0x0C,
40230x01, 0x00, 0x04, 0x24, 0x67, 0x2E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
40240x65, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x2D, 0x00, 0x0C,
40250x00, 0x00, 0x00, 0x00, 0x61, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
40260xEE, 0x5D, 0x62, 0x92, 0xF0, 0xFF, 0x03, 0x24, 0x41, 0xB0, 0x04, 0x3C,
40270x24, 0x10, 0x43, 0x00, 0xEE, 0x5D, 0x62, 0xA2, 0xEE, 0x5D, 0x63, 0x92,
40280x08, 0x00, 0x85, 0x34, 0x82, 0x00, 0x02, 0x24, 0x01, 0x00, 0x63, 0x34,
40290x02, 0x80, 0x17, 0x3C, 0xEE, 0x5D, 0x63, 0xA2, 0x00, 0x00, 0x80, 0xAC,
40300x00, 0x00, 0xA2, 0xA4, 0x42, 0xB0, 0x04, 0x3C, 0x60, 0x1B, 0xE2, 0x26,
40310xB0, 0x1B, 0x45, 0x94, 0x00, 0x00, 0x83, 0x90, 0xBE, 0xFF, 0x02, 0x24,
40320x03, 0x00, 0x86, 0x34, 0x24, 0x18, 0x62, 0x00, 0x00, 0x01, 0xA5, 0x30,
40330x90, 0xFF, 0x02, 0x24, 0x00, 0x00, 0x83, 0xA0, 0x00, 0x00, 0xC2, 0xA0,
40340x38, 0x00, 0xA0, 0x10, 0x25, 0xB0, 0x06, 0x3C, 0x25, 0xB0, 0x04, 0x3C,
40350x84, 0x00, 0x82, 0x34, 0x00, 0x00, 0x46, 0x8C, 0x80, 0x00, 0x84, 0x34,
40360x00, 0x00, 0x82, 0x8C, 0x02, 0x80, 0x0B, 0x3C, 0x14, 0x5E, 0x64, 0x8D,
40370x00, 0x38, 0x06, 0x00, 0x21, 0x30, 0x00, 0x00, 0x25, 0xA0, 0xC2, 0x00,
40380x21, 0x18, 0x00, 0x00, 0x02, 0x80, 0x0A, 0x3C, 0x25, 0xA8, 0xE3, 0x00,
40390x21, 0x28, 0x00, 0x00, 0x1C, 0x5E, 0x42, 0x8D, 0x21, 0x20, 0x94, 0x00,
40400x2B, 0x18, 0x94, 0x00, 0x21, 0x28, 0xB5, 0x00, 0x21, 0x28, 0xA3, 0x00,
40410x2B, 0x10, 0xA2, 0x00, 0x24, 0x01, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
40420x1C, 0x5E, 0x42, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x45, 0x10,
40430x01, 0x00, 0x05, 0x24, 0x60, 0x1B, 0xE2, 0x26, 0x58, 0x41, 0x43, 0x8C,
40440x42, 0xB0, 0x07, 0x3C, 0x00, 0x00, 0xE6, 0x90, 0x18, 0x00, 0x65, 0x00,
40450xFB, 0xFF, 0x02, 0x24, 0x24, 0x30, 0xC2, 0x00, 0x00, 0x00, 0xE6, 0xA0,
40460x67, 0x46, 0x06, 0x3C, 0xCF, 0xAC, 0xC6, 0x34, 0x01, 0x00, 0x04, 0x24,
40470x21, 0x28, 0x00, 0x00, 0x12, 0x18, 0x00, 0x00, 0x82, 0x1A, 0x03, 0x00,
40480x40, 0x10, 0x03, 0x00, 0x21, 0x10, 0x43, 0x00, 0xC0, 0x10, 0x02, 0x00,
40490x21, 0x10, 0x43, 0x00, 0x80, 0x10, 0x02, 0x00, 0x19, 0x00, 0x46, 0x00,
40500x10, 0x30, 0x00, 0x00, 0x23, 0x10, 0x46, 0x00, 0x42, 0x10, 0x02, 0x00,
40510x21, 0x30, 0xC2, 0x00, 0x02, 0x33, 0x06, 0x00, 0x01, 0x00, 0x02, 0x24,
40520xB9, 0x20, 0x00, 0x0C, 0x0A, 0x30, 0x46, 0x00, 0x25, 0xB0, 0x06, 0x3C,
40530xF2, 0x02, 0xC3, 0x34, 0x88, 0xFF, 0x02, 0x24, 0x00, 0x00, 0x62, 0xA0,
40540x11, 0x00, 0xC7, 0x34, 0x00, 0x00, 0xE2, 0x90, 0x08, 0x00, 0xC5, 0x34,
40550x60, 0x1B, 0xE4, 0x26, 0x01, 0x00, 0x42, 0x34, 0x00, 0x00, 0xE2, 0xA0,
40560x00, 0x00, 0xA3, 0x94, 0xB0, 0x1B, 0x82, 0x94, 0xFF, 0xFF, 0x64, 0x30,
40570x10, 0x00, 0x84, 0x34, 0x00, 0x00, 0xA4, 0xA4, 0xFB, 0xFF, 0x84, 0x30,
40580x00, 0x00, 0xA4, 0xA4, 0x00, 0x01, 0x42, 0x30, 0x02, 0x00, 0x84, 0x34,
40590x00, 0x00, 0xA4, 0xA4, 0x04, 0x00, 0x40, 0x10, 0x42, 0xB0, 0x02, 0x3C,
40600x22, 0x00, 0x03, 0x24, 0x03, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA0,
40610xFF, 0xF7, 0x84, 0x30, 0x00, 0x00, 0xA4, 0xA4, 0x28, 0x00, 0xC4, 0x34,
40620x00, 0x00, 0x83, 0x94, 0xEF, 0xFE, 0x02, 0x24, 0xFE, 0xFF, 0x08, 0x24,
40630x24, 0x18, 0x62, 0x00, 0x00, 0x00, 0x83, 0xA4, 0x00, 0x00, 0x82, 0x94,
40640x26, 0x00, 0xC5, 0x34, 0x02, 0x80, 0x03, 0x3C, 0x24, 0x10, 0x48, 0x00,
40650x00, 0x00, 0x82, 0xA4, 0xC2, 0x5C, 0x64, 0x90, 0x00, 0x00, 0xA2, 0x94,
40660x04, 0x00, 0x84, 0x30, 0x00, 0x24, 0x42, 0x34, 0x00, 0x00, 0xA2, 0xA4,
40670x09, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x94,
40680x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x48, 0x00, 0x00, 0x00, 0xA2, 0xA4,
40690x00, 0x00, 0xE3, 0x90, 0xFD, 0xFF, 0x02, 0x24, 0x24, 0x18, 0x62, 0x00,
40700x00, 0x00, 0xE3, 0xA0, 0x00, 0x68, 0x02, 0x40, 0x00, 0x08, 0x42, 0x30,
40710xFD, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x12, 0x3C,
40720x11, 0x00, 0x43, 0x36, 0x00, 0x00, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
40730x02, 0x00, 0x42, 0x34, 0x00, 0x00, 0x62, 0xA0, 0x00, 0x00, 0x00, 0x00,
40740x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40750x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x44, 0x36, 0x00, 0x00, 0x82, 0x94,
40760x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x34, 0x00, 0x00, 0x82, 0xA4,
40770x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40780x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40790x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x94,
40800xFF, 0xDB, 0x02, 0x24, 0x28, 0x00, 0x45, 0x36, 0x24, 0x18, 0x62, 0x00,
40810x00, 0x00, 0x83, 0xA4, 0x00, 0x00, 0xA2, 0x94, 0x00, 0x00, 0x00, 0x00,
40820x01, 0x00, 0x42, 0x34, 0x00, 0x00, 0xA2, 0xA4, 0x00, 0x00, 0x00, 0x00,
40830x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40840x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40850x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x94, 0x00, 0x00, 0x00, 0x00,
40860x10, 0x01, 0x42, 0x34, 0x00, 0x00, 0xA2, 0xA4, 0x08, 0x00, 0x51, 0x36,
40870x00, 0x00, 0x23, 0x96, 0x60, 0x1B, 0xF6, 0x26, 0xB0, 0x1B, 0xC2, 0x96,
40880xFF, 0xFF, 0x70, 0x30, 0x00, 0x18, 0x10, 0x36, 0x00, 0x00, 0x30, 0xA6,
40890x00, 0x01, 0x42, 0x30, 0xFD, 0xFF, 0x10, 0x32, 0x00, 0x00, 0x30, 0xA6,
40900x05, 0x00, 0x40, 0x10, 0x42, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0x43, 0x90,
40910xFB, 0xFF, 0x04, 0x24, 0x24, 0x18, 0x64, 0x00, 0x00, 0x00, 0x43, 0xA0,
40920x04, 0x00, 0x10, 0x36, 0x5B, 0x1F, 0x00, 0x0C, 0x32, 0x00, 0x04, 0x24,
40930x00, 0x00, 0x30, 0xA6, 0x22, 0x00, 0x02, 0x24, 0xF2, 0x02, 0x43, 0x36,
40940xEF, 0xFF, 0x10, 0x32, 0x00, 0x00, 0x30, 0xA6, 0xC8, 0x00, 0x04, 0x24,
40950x00, 0x00, 0x62, 0xA0, 0x5B, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
40960xB0, 0x1B, 0xC2, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x30,
40970x41, 0x00, 0x40, 0x10, 0x42, 0xB0, 0x06, 0x3C, 0x84, 0x00, 0x42, 0x36,
40980x00, 0x00, 0x44, 0x8C, 0x80, 0x00, 0x46, 0x36, 0x00, 0x00, 0xC2, 0x8C,
40990x00, 0x28, 0x04, 0x00, 0x21, 0x18, 0x00, 0x00, 0x21, 0x20, 0x00, 0x00,
41000x25, 0x30, 0x82, 0x00, 0x25, 0x38, 0xA3, 0x00, 0x58, 0x41, 0xC3, 0x8E,
41010x23, 0x28, 0xD4, 0x00, 0x80, 0x12, 0x05, 0x00, 0x1B, 0x00, 0x43, 0x00,
41020x02, 0x00, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00,
41030x02, 0x80, 0x0B, 0x3C, 0x14, 0x5E, 0x63, 0x8D, 0x12, 0x10, 0x00, 0x00,
41040x23, 0x10, 0x45, 0x00, 0x21, 0x10, 0x43, 0x00, 0x14, 0x5E, 0x62, 0xAD,
41050x14, 0x5E, 0x63, 0x8D, 0x42, 0xB0, 0x02, 0x3C, 0x03, 0x00, 0x42, 0x34,
41060x58, 0x1B, 0x63, 0x24, 0x14, 0x5E, 0x63, 0xAD, 0x00, 0x00, 0x43, 0x90,
41070x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x63, 0x30, 0x20, 0x00, 0x60, 0x14,
41080x00, 0x00, 0x00, 0x00, 0x14, 0x5E, 0x62, 0x8D, 0x02, 0x80, 0x0A, 0x3C,
41090x1C, 0x5E, 0x44, 0x8D, 0x21, 0x40, 0x46, 0x00, 0x2B, 0x28, 0x06, 0x01,
41100x21, 0x48, 0x67, 0x00, 0x21, 0x48, 0x25, 0x01, 0x2B, 0x20, 0x24, 0x01,
41110x59, 0x00, 0x80, 0x14, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x5E, 0x42, 0x8D,
41120x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x49, 0x10, 0x01, 0x00, 0x05, 0x24,
41130x42, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0x43, 0x90, 0xFB, 0xFF, 0x04, 0x24,
41140x01, 0x00, 0x06, 0x24, 0x24, 0x18, 0x64, 0x00, 0x00, 0x00, 0x43, 0xA0,
41150x04, 0x00, 0xA0, 0x10, 0x01, 0x00, 0x04, 0x24, 0x80, 0x10, 0x05, 0x00,
41160x21, 0x10, 0x45, 0x00, 0x80, 0x30, 0x02, 0x00, 0xB9, 0x20, 0x00, 0x0C,
41170x21, 0x28, 0x00, 0x00, 0x42, 0xB0, 0x02, 0x3C, 0x22, 0x00, 0x03, 0x24,
41180x03, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA0, 0x42, 0xB0, 0x06, 0x3C,
41190x00, 0x00, 0xC2, 0x90, 0x60, 0x1B, 0xE5, 0x26, 0xD0, 0x1B, 0xA8, 0x8C,
41200xDC, 0x1B, 0xA7, 0x94, 0x41, 0xB0, 0x03, 0x3C, 0x41, 0x00, 0x42, 0x34,
41210x08, 0x00, 0x64, 0x34, 0x00, 0x00, 0xC2, 0xA0, 0x00, 0x00, 0x68, 0xAC,
41220x00, 0x00, 0x87, 0xA4, 0xEE, 0x5D, 0x63, 0x92, 0xF0, 0xFF, 0x02, 0x24,
41230xDC, 0x1B, 0xA7, 0xA4, 0x24, 0x18, 0x62, 0x00, 0xEE, 0x5D, 0x63, 0xA2,
41240xEE, 0x5D, 0x62, 0x92, 0xD0, 0x1B, 0xA8, 0xAC, 0x02, 0x00, 0x42, 0x34,
41250xEE, 0x5D, 0x62, 0xA2, 0x72, 0x2E, 0x00, 0x08, 0x02, 0x80, 0x10, 0x3C,
41260x59, 0x2D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x40, 0x10,
41270x00, 0x00, 0x00, 0x00, 0x0A, 0x2E, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
41280xEE, 0x5D, 0x62, 0x92, 0xF0, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00,
41290xEE, 0x5D, 0x62, 0xA2, 0xEE, 0x5D, 0x63, 0x92, 0x00, 0x00, 0x00, 0x00,
41300x02, 0x00, 0x63, 0x34, 0xEE, 0x5D, 0x63, 0xA2, 0x6C, 0x2E, 0x00, 0x08,
41310x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
41320x97, 0x99, 0x63, 0x34, 0x18, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
41330x94, 0x2E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x18, 0x5E, 0x42, 0x8D,
41340x00, 0x00, 0x00, 0x00, 0x2B, 0x10, 0x82, 0x00, 0x0C, 0x00, 0x40, 0x14,
41350x00, 0x00, 0x00, 0x00, 0x18, 0x5E, 0x42, 0x8D, 0x45, 0x2F, 0x00, 0x08,
41360x01, 0x00, 0x05, 0x24, 0x18, 0x5E, 0x42, 0x8D, 0x00, 0x00, 0x00, 0x00,
41370x2B, 0x10, 0x02, 0x01, 0x0A, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
41380x18, 0x5E, 0x42, 0x8D, 0x16, 0x30, 0x00, 0x08, 0x01, 0x00, 0x05, 0x24,
41390x18, 0x5E, 0x42, 0x8D, 0x1C, 0x5E, 0x43, 0x8D, 0x14, 0x5E, 0x64, 0x8D,
41400x23, 0x10, 0x54, 0x00, 0x45, 0x2F, 0x00, 0x08, 0x23, 0x28, 0x44, 0x00,
41410x18, 0x5E, 0x42, 0x8D, 0x1C, 0x5E, 0x43, 0x8D, 0x14, 0x5E, 0x64, 0x8D,
41420x23, 0x10, 0x46, 0x00, 0x16, 0x30, 0x00, 0x08, 0x23, 0x28, 0x44, 0x00,
41430x02, 0x80, 0x02, 0x3C, 0xEC, 0x5D, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
41440x07, 0x00, 0x60, 0x10, 0x02, 0x80, 0x02, 0x3C, 0xEE, 0x5D, 0x43, 0x90,
41450x04, 0x00, 0x04, 0x24, 0x0F, 0x00, 0x63, 0x30, 0x04, 0x00, 0x63, 0x28,
41460x03, 0x00, 0x60, 0x14, 0x01, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03,
41470x00, 0x00, 0x00, 0x00, 0x4B, 0x2E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
41480x01, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x03, 0x3C, 0xE0, 0xFF, 0xBD, 0x27,
41490xFC, 0xC1, 0x42, 0x24, 0x18, 0x03, 0x63, 0x34, 0x10, 0x00, 0xA4, 0x27,
41500x00, 0x00, 0x62, 0xAC, 0x18, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
41510x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x0C, 0x5E, 0x82, 0x90,
41520x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x40, 0x10, 0x01, 0x00, 0x05, 0x24,
41530x02, 0x80, 0x02, 0x3C, 0xD0, 0x07, 0x03, 0x24, 0x0C, 0x5E, 0x80, 0xA0,
41540x10, 0x00, 0xA4, 0x27, 0x90, 0x40, 0x00, 0x0C, 0xDC, 0x5D, 0x43, 0xAC,
41550x18, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
41560x20, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x03, 0x3C, 0x01, 0x00, 0x04, 0x24,
41570x02, 0x80, 0x02, 0x3C, 0x0F, 0x5E, 0x44, 0xA0, 0x02, 0x80, 0x02, 0x3C,
41580x0D, 0x5E, 0x60, 0xA0, 0xED, 0x5D, 0x44, 0x90, 0x4B, 0x2E, 0x00, 0x0C,
41590xFF, 0x00, 0x84, 0x30, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
41600x18, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
41610x20, 0x00, 0xBD, 0x27, 0x42, 0x11, 0x05, 0x00, 0x0F, 0x00, 0x46, 0x30,
41620xE8, 0xFF, 0xBD, 0x27, 0x09, 0x00, 0xC3, 0x28, 0x14, 0x00, 0xBF, 0xAF,
41630x14, 0x00, 0x60, 0x10, 0x10, 0x00, 0xB0, 0xAF, 0x82, 0x16, 0x05, 0x00,
41640x01, 0x00, 0x42, 0x30, 0x14, 0x00, 0x40, 0x10, 0x00, 0xC0, 0x02, 0x3C,
41650x24, 0x10, 0xA2, 0x00, 0x43, 0x00, 0x40, 0x14, 0xC2, 0x15, 0x04, 0x00,
41660x01, 0x00, 0x42, 0x30, 0x50, 0x00, 0x40, 0x10, 0x02, 0x80, 0x03, 0x3C,
41670x0C, 0xE5, 0x63, 0x24, 0x21, 0x18, 0xC3, 0x00, 0x02, 0x80, 0x04, 0x3C,
41680x08, 0x5E, 0x85, 0x90, 0x00, 0x00, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
41690x24, 0x10, 0x45, 0x00, 0x47, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
41700x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
41710x18, 0x00, 0xBD, 0x27, 0x24, 0x10, 0xA2, 0x00, 0x1E, 0x00, 0x40, 0x10,
41720xC2, 0x15, 0x04, 0x00, 0x02, 0x80, 0x06, 0x3C, 0x07, 0x5E, 0xC2, 0x90,
41730xFD, 0xFF, 0x03, 0x24, 0x42, 0xB0, 0x04, 0x3C, 0x24, 0x10, 0x43, 0x00,
41740x02, 0x80, 0x03, 0x3C, 0x07, 0x5E, 0xC2, 0xA0, 0x0B, 0x5E, 0x60, 0xA0,
41750x00, 0x00, 0x82, 0x90, 0xEF, 0xFF, 0x03, 0x24, 0x03, 0x00, 0x85, 0x34,
41760x24, 0x10, 0x43, 0x00, 0x40, 0x00, 0x03, 0x24, 0x00, 0x00, 0x82, 0xA0,
41770x00, 0x00, 0xA3, 0xA0, 0x07, 0x5E, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00,
41780x07, 0x00, 0x42, 0x30, 0xE6, 0xFF, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C,
41790x05, 0x5E, 0x40, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x64, 0x90,
41800x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x05, 0x24,
41810xFF, 0x00, 0x84, 0x30, 0x4B, 0x2E, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
41820x01, 0x00, 0x42, 0x30, 0x25, 0x00, 0x40, 0x10, 0x02, 0x80, 0x03, 0x3C,
41830x0C, 0xE5, 0x63, 0x24, 0x21, 0x18, 0xC3, 0x00, 0x02, 0x80, 0x04, 0x3C,
41840x08, 0x5E, 0x85, 0x90, 0x00, 0x00, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
41850x24, 0x10, 0x45, 0x00, 0xE7, 0xFF, 0x40, 0x14, 0x02, 0x80, 0x06, 0x3C,
41860x07, 0x5E, 0xC2, 0x90, 0xFE, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00,
41870x07, 0x5E, 0xC2, 0xA0, 0xD7, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
41880x42, 0xB0, 0x07, 0x3C, 0x00, 0x00, 0xE3, 0x90, 0xEF, 0xFF, 0x02, 0x24,
41890x03, 0x00, 0xF0, 0x34, 0x24, 0x18, 0x62, 0x00, 0x40, 0x00, 0x02, 0x24,
41900x00, 0x00, 0xE3, 0xA0, 0x02, 0x00, 0x04, 0x24, 0x00, 0x00, 0x02, 0xA2,
41910x21, 0x28, 0x00, 0x00, 0xB9, 0x20, 0x00, 0x0C, 0x00, 0xF0, 0x06, 0x34,
41920x44, 0x00, 0x02, 0x24, 0x00, 0x00, 0x02, 0xA2, 0xC1, 0x30, 0x00, 0x08,
41930x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
41940x01, 0x00, 0x04, 0x24, 0xE1, 0x51, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
41950x02, 0x80, 0x06, 0x3C, 0x07, 0x5E, 0xC2, 0x90, 0xFE, 0xFF, 0x03, 0x24,
41960x24, 0x10, 0x43, 0x00, 0x07, 0x5E, 0xC2, 0xA0, 0xD7, 0x30, 0x00, 0x08,
41970x00, 0x00, 0x00, 0x00, 0x82, 0x16, 0x05, 0x00, 0xE8, 0xFF, 0xBD, 0x27,
41980x01, 0x00, 0x42, 0x30, 0x14, 0x00, 0xBF, 0xAF, 0x0E, 0x00, 0x40, 0x10,
41990x10, 0x00, 0xB0, 0xAF, 0x00, 0xC0, 0x02, 0x3C, 0x24, 0x10, 0xA2, 0x00,
42000x37, 0x00, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x06, 0x5E, 0x43, 0x90,
42010x02, 0x00, 0x02, 0x24, 0xFF, 0x00, 0x63, 0x30, 0x44, 0x00, 0x62, 0x10,
42020x01, 0x00, 0x04, 0x24, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
42030xE1, 0x51, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27, 0x00, 0xC0, 0x02, 0x3C,
42040x24, 0x10, 0xA2, 0x00, 0x0E, 0x00, 0x40, 0x14, 0x02, 0x80, 0x06, 0x3C,
42050x07, 0x5E, 0xC2, 0x90, 0xFE, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00,
42060x07, 0x5E, 0xC2, 0xA0, 0x07, 0x5E, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00,
42070x07, 0x00, 0x42, 0x30, 0x18, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
42080x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
42090x18, 0x00, 0xBD, 0x27, 0x07, 0x5E, 0xC2, 0x90, 0xFD, 0xFF, 0x03, 0x24,
42100x42, 0xB0, 0x04, 0x3C, 0x24, 0x10, 0x43, 0x00, 0x02, 0x80, 0x03, 0x3C,
42110x07, 0x5E, 0xC2, 0xA0, 0x0B, 0x5E, 0x60, 0xA0, 0x00, 0x00, 0x82, 0x90,
42120xEF, 0xFF, 0x03, 0x24, 0x03, 0x00, 0x85, 0x34, 0x24, 0x10, 0x43, 0x00,
42130x40, 0x00, 0x03, 0x24, 0x00, 0x00, 0x82, 0xA0, 0x00, 0x00, 0xA3, 0xA0,
42140x07, 0x5E, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x42, 0x30,
42150xEA, 0xFF, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x05, 0x5E, 0x40, 0xA0,
42160x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x64, 0x90, 0x14, 0x00, 0xBF, 0x8F,
42170x10, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x05, 0x24, 0xFF, 0x00, 0x84, 0x30,
42180x4B, 0x2E, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27, 0x42, 0xB0, 0x07, 0x3C,
42190x00, 0x00, 0xE3, 0x90, 0xEF, 0xFF, 0x02, 0x24, 0x03, 0x00, 0xF0, 0x34,
42200x24, 0x18, 0x62, 0x00, 0x40, 0x00, 0x02, 0x24, 0x00, 0x00, 0xE3, 0xA0,
42210x02, 0x00, 0x04, 0x24, 0x00, 0x00, 0x02, 0xA2, 0x21, 0x28, 0x00, 0x00,
42220xB9, 0x20, 0x00, 0x0C, 0x00, 0xF0, 0x06, 0x34, 0x44, 0x00, 0x02, 0x24,
42230x00, 0x00, 0x02, 0xA2, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
42240x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xE2, 0x2C, 0x00, 0x0C,
42250x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
42260x0C, 0x00, 0x04, 0x24, 0x01, 0x00, 0x05, 0x24, 0x4B, 0x2E, 0x00, 0x08,
42270x18, 0x00, 0xBD, 0x27, 0x01, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x03, 0x3C,
42280xE8, 0xFF, 0xBD, 0x27, 0xB4, 0xC5, 0x42, 0x24, 0x18, 0x03, 0x63, 0x34,
42290x10, 0x00, 0xB0, 0xAF, 0x00, 0x00, 0x62, 0xAC, 0x02, 0x80, 0x10, 0x3C,
42300xED, 0x5D, 0x02, 0x92, 0x14, 0x00, 0xBF, 0xAF, 0x0F, 0x00, 0x42, 0x30,
42310x03, 0x00, 0x42, 0x28, 0x05, 0x00, 0x40, 0x10, 0x01, 0x00, 0x05, 0x24,
42320x59, 0x2D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x10,
42330x01, 0x00, 0x05, 0x24, 0xED, 0x5D, 0x04, 0x92, 0x4B, 0x2E, 0x00, 0x0C,
42340xFF, 0x00, 0x84, 0x30, 0x02, 0x80, 0x04, 0x3C, 0x60, 0x1B, 0x84, 0x24,
42350xE0, 0x1B, 0x83, 0x94, 0xDC, 0x1B, 0x85, 0x94, 0x14, 0x00, 0xBF, 0x8F,
42360x10, 0x00, 0xB0, 0x8F, 0x02, 0x00, 0x63, 0x30, 0x41, 0xB0, 0x02, 0x3C,
42370x25, 0x18, 0x65, 0x00, 0x08, 0x00, 0x42, 0x34, 0x18, 0x00, 0xBD, 0x27,
42380x00, 0x00, 0x43, 0xA4, 0x08, 0x00, 0xE0, 0x03, 0xDC, 0x1B, 0x83, 0xA4,
42390xE0, 0xFF, 0xBD, 0x27, 0x25, 0xB0, 0x02, 0x3C, 0x01, 0x80, 0x03, 0x3C,
42400x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
42410x1C, 0x00, 0xBF, 0xAF, 0x18, 0x03, 0x52, 0x34, 0x40, 0xC6, 0x71, 0x24,
42420x02, 0x80, 0x10, 0x3C, 0x08, 0x14, 0x04, 0x26, 0x21, 0x28, 0x00, 0x00,
42430x21, 0x30, 0x00, 0x00, 0x21, 0x38, 0x00, 0x00, 0x00, 0x00, 0x51, 0xAE,
42440x76, 0x39, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x31, 0x00, 0x08,
42450x08, 0x14, 0x04, 0x26, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
42460xFF, 0xFF, 0x90, 0x30, 0x1C, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
42470x10, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x06, 0x3C, 0x60, 0x1B, 0xCD, 0x24,
42480x2A, 0x1C, 0xA2, 0x91, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x40, 0x10,
42490x2A, 0xB0, 0x02, 0x3C, 0x25, 0xB0, 0x03, 0x3C, 0x38, 0x02, 0x64, 0x34,
42500x80, 0xFF, 0x02, 0x24, 0x00, 0x00, 0x82, 0xA0, 0x34, 0x02, 0x6A, 0x34,
42510xD2, 0x01, 0x65, 0x34, 0xD6, 0x01, 0x66, 0x34, 0xDA, 0x01, 0x67, 0x34,
42520xDE, 0x01, 0x63, 0x34, 0x00, 0x00, 0xA8, 0x94, 0x00, 0x00, 0xC9, 0x94,
42530x00, 0x00, 0xEB, 0x94, 0x00, 0x00, 0x6C, 0x94, 0x00, 0x00, 0x44, 0x95,
42540xB0, 0xFE, 0x02, 0x26, 0xFF, 0xFF, 0x50, 0x30, 0x28, 0x1C, 0xA4, 0xA5,
42550x00, 0x00, 0xA0, 0xA4, 0x10, 0x00, 0xA4, 0x27, 0x20, 0x1C, 0xA8, 0xA5,
42560x00, 0x00, 0xC0, 0xA4, 0x22, 0x1C, 0xA9, 0xA5, 0x00, 0x00, 0xE0, 0xA4,
42570x24, 0x1C, 0xAB, 0xA5, 0x00, 0x00, 0x60, 0xA4, 0x00, 0x00, 0x50, 0xA5,
42580x90, 0x40, 0x00, 0x0C, 0x26, 0x1C, 0xAC, 0xA5, 0x1C, 0x00, 0xBF, 0x8F,
42590x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
42600x0A, 0x00, 0x45, 0x34, 0x63, 0x00, 0x03, 0x24, 0xFF, 0xFF, 0x04, 0x34,
42610x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x40, 0x10,
42620x64, 0x00, 0x02, 0x24, 0xFF, 0xFF, 0x42, 0x24, 0xFF, 0xFF, 0x42, 0x30,
42630xFE, 0xFF, 0x40, 0x14, 0xFF, 0xFF, 0x42, 0x24, 0xFF, 0xFF, 0x62, 0x24,
42640xFF, 0xFF, 0x43, 0x30, 0xF5, 0xFF, 0x64, 0x14, 0x00, 0x00, 0x00, 0x00,
42650x60, 0x1B, 0xC2, 0x24, 0x28, 0x1C, 0x48, 0x94, 0x26, 0x1C, 0x47, 0x94,
42660x20, 0x1C, 0x49, 0x94, 0x22, 0x1C, 0x4A, 0x94, 0x24, 0x1C, 0x4B, 0x94,
42670x25, 0xB0, 0x03, 0x3C, 0x38, 0x02, 0x6C, 0x34, 0x34, 0x02, 0x62, 0x34,
42680xD2, 0x01, 0x64, 0x34, 0xD6, 0x01, 0x65, 0x34, 0xDA, 0x01, 0x66, 0x34,
42690xDE, 0x01, 0x63, 0x34, 0x00, 0x00, 0x48, 0xA4, 0x00, 0x00, 0x89, 0xA4,
42700x00, 0x00, 0xAA, 0xA4, 0x10, 0x00, 0xA4, 0x27, 0x00, 0x00, 0xCB, 0xA4,
42710x00, 0x00, 0x67, 0xA4, 0x00, 0x00, 0x80, 0xA1, 0x90, 0x40, 0x00, 0x0C,
42720x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
42730x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xD0, 0xFF, 0xBD, 0x27,
42740x28, 0x00, 0xB4, 0xAF, 0x2C, 0x00, 0xBF, 0xAF, 0x24, 0x00, 0xB3, 0xAF,
42750x20, 0x00, 0xB2, 0xAF, 0x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF,
42760xFF, 0xFF, 0x14, 0x24, 0x02, 0x80, 0x13, 0x3C, 0x41, 0xB0, 0x02, 0x3C,
42770x60, 0x1B, 0x63, 0x26, 0x04, 0x00, 0x42, 0x34, 0x00, 0x00, 0x45, 0x8C,
42780xD4, 0x1B, 0x64, 0x8C, 0xD0, 0x1B, 0x66, 0x8C, 0x02, 0x80, 0x02, 0x3C,
42790xF0, 0x5C, 0x47, 0x90, 0x25, 0xB0, 0x08, 0x3C, 0xB0, 0x03, 0x02, 0x35,
42800x25, 0x90, 0x85, 0x00, 0x00, 0x00, 0x52, 0xAC, 0x00, 0x00, 0x46, 0xAC,
42810x01, 0x00, 0x02, 0x24, 0x89, 0x03, 0xE2, 0x10, 0xD4, 0x1B, 0x72, 0xAC,
42820x60, 0x1B, 0x64, 0x26, 0xD0, 0x1B, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00,
42830x24, 0x10, 0x52, 0x00, 0x01, 0x00, 0x42, 0x30, 0x0E, 0x00, 0x40, 0x10,
42840x60, 0x1B, 0x67, 0x26, 0x25, 0xB0, 0x10, 0x3C, 0xB0, 0x03, 0x02, 0x36,
42850x01, 0x00, 0x05, 0x24, 0x00, 0x00, 0x45, 0xAC, 0x04, 0x00, 0x0B, 0x36,
42860xD4, 0x1B, 0x83, 0x8C, 0x00, 0x00, 0x69, 0x8D, 0x40, 0x00, 0x02, 0x3C,
42870x01, 0x00, 0x63, 0x38, 0x24, 0x10, 0x22, 0x01, 0x26, 0x01, 0x40, 0x10,
42880xD4, 0x1B, 0x83, 0xAC, 0x60, 0x1B, 0x67, 0x26, 0xD0, 0x1B, 0xE2, 0x8C,
42890x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x52, 0x00, 0x04, 0x00, 0x42, 0x30,
42900x14, 0x00, 0x40, 0x10, 0x60, 0x1B, 0x71, 0x26, 0x25, 0xB0, 0x03, 0x3C,
42910xB0, 0x03, 0x64, 0x34, 0x04, 0x00, 0x02, 0x24, 0x00, 0x00, 0x82, 0xAC,
42920xD4, 0x1B, 0xE2, 0x8C, 0xC4, 0x38, 0xE6, 0x8C, 0xFC, 0x00, 0x63, 0x34,
42930xAC, 0x1B, 0xE4, 0x94, 0x00, 0x00, 0x65, 0x8C, 0x04, 0x00, 0x42, 0x38,
42940x21, 0x48, 0xC4, 0x00, 0x06, 0x00, 0xA9, 0x10, 0xD4, 0x1B, 0xE2, 0xAC,
42950x02, 0x80, 0x03, 0x3C, 0xB0, 0x5D, 0x62, 0x8C, 0x00, 0x00, 0x00, 0x00,
42960x08, 0x00, 0x42, 0x34, 0xB0, 0x5D, 0x62, 0xAC, 0x60, 0x1B, 0x71, 0x26,
42970xD0, 0x1B, 0x22, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x52, 0x00,
42980x08, 0x00, 0x42, 0x30, 0x0A, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
42990xB0, 0x1B, 0x22, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x42, 0x30,
43000x5D, 0x03, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0xD4, 0x1B, 0x22, 0x8E,
43010x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x42, 0x38, 0xD4, 0x1B, 0x22, 0xAE,
43020x60, 0x1B, 0x70, 0x26, 0xD0, 0x1B, 0x02, 0x8E, 0x00, 0x00, 0x00, 0x00,
43030x24, 0x20, 0x52, 0x00, 0x00, 0x08, 0x83, 0x30, 0x06, 0x00, 0x60, 0x10,
43040x00, 0x10, 0x82, 0x30, 0xD4, 0x1B, 0x02, 0x8E, 0x00, 0x00, 0x00, 0x00,
43050x00, 0x08, 0x42, 0x38, 0xD4, 0x1B, 0x02, 0xAE, 0x00, 0x10, 0x82, 0x30,
43060x05, 0x03, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x70, 0x26,
43070xD0, 0x1B, 0x03, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x72, 0x00,
43080x00, 0x20, 0x42, 0x30, 0xF7, 0x02, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
43090x24, 0x10, 0x72, 0x00, 0x00, 0x80, 0x42, 0x30, 0xB9, 0x01, 0x40, 0x14,
43100x01, 0x00, 0x03, 0x3C, 0x60, 0x1B, 0x70, 0x26, 0xD0, 0x1B, 0x02, 0x8E,
43110x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x52, 0x00, 0x24, 0x10, 0x54, 0x00,
43120x24, 0x10, 0x43, 0x00, 0xF1, 0x01, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
43130xD0, 0x1B, 0x02, 0x8E, 0x02, 0x00, 0x03, 0x3C, 0x24, 0x10, 0x52, 0x00,
43140x24, 0x10, 0x43, 0x00, 0x28, 0x02, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
43150x60, 0x1B, 0x70, 0x26, 0xD0, 0x1B, 0x02, 0x8E, 0x04, 0x00, 0x03, 0x3C,
43160x24, 0x10, 0x52, 0x00, 0x24, 0x10, 0x54, 0x00, 0x24, 0x10, 0x43, 0x00,
43170x62, 0x02, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x70, 0x26,
43180xD0, 0x1B, 0x02, 0x8E, 0x08, 0x00, 0x03, 0x3C, 0x24, 0x10, 0x52, 0x00,
43190x24, 0x10, 0x43, 0x00, 0x9B, 0x02, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
43200x60, 0x1B, 0x70, 0x26, 0xD0, 0x1B, 0x02, 0x8E, 0x10, 0x00, 0x03, 0x3C,
43210x24, 0x10, 0x52, 0x00, 0x24, 0x10, 0x54, 0x00, 0x24, 0x10, 0x43, 0x00,
43220x5A, 0x01, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x70, 0x26,
43230xD0, 0x1B, 0x02, 0x8E, 0x20, 0x00, 0x03, 0x3C, 0x24, 0x10, 0x52, 0x00,
43240x24, 0x10, 0x43, 0x00, 0x18, 0x01, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
43250x60, 0x1B, 0x70, 0x26, 0xD0, 0x1B, 0x02, 0x8E, 0x40, 0x00, 0x03, 0x3C,
43260x24, 0x10, 0x52, 0x00, 0x24, 0x10, 0x54, 0x00, 0x24, 0x10, 0x43, 0x00,
43270xD6, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x65, 0x26,
43280xD0, 0x1B, 0xA2, 0x8C, 0x00, 0x04, 0x03, 0x3C, 0x24, 0x10, 0x52, 0x00,
43290x24, 0x10, 0x43, 0x00, 0x3D, 0x00, 0x40, 0x10, 0x60, 0x1B, 0x66, 0x26,
43300x2A, 0xB0, 0x02, 0x3C, 0x2C, 0x00, 0x43, 0x34, 0x00, 0x00, 0x69, 0x8C,
43310xFF, 0x00, 0x02, 0x24, 0xFF, 0x00, 0x24, 0x31, 0x29, 0x03, 0x82, 0x10,
43320x00, 0x80, 0x22, 0x31, 0xF9, 0x02, 0x40, 0x14, 0x00, 0x80, 0x02, 0x3C,
43330x00, 0xFF, 0x02, 0x3C, 0x24, 0x10, 0x22, 0x01, 0x0B, 0x00, 0x40, 0x10,
43340xFF, 0x00, 0x02, 0x24, 0xAC, 0x37, 0xA2, 0x90, 0x20, 0xB0, 0x03, 0x3C,
43350x00, 0x12, 0x02, 0x00, 0x21, 0x10, 0x43, 0x00, 0x0C, 0x00, 0x49, 0x8C,
43360x25, 0xB0, 0x03, 0x3C, 0xB0, 0x03, 0x63, 0x34, 0x00, 0x00, 0x69, 0xAC,
43370xFF, 0x00, 0x24, 0x31, 0xFF, 0x00, 0x02, 0x24, 0x1B, 0x00, 0x82, 0x10,
43380x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31, 0x7C, 0x38, 0x05, 0x8E,
43390x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
43400x21, 0x30, 0x60, 0x00, 0x10, 0x38, 0x03, 0xAE, 0x0A, 0x00, 0x04, 0x24,
43410xAC, 0x37, 0x09, 0xA2, 0x00, 0x01, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
43420x10, 0x00, 0xA0, 0xAF, 0xD0, 0x1B, 0x05, 0x8E, 0x02, 0x80, 0x06, 0x3C,
43430xB0, 0x5D, 0xC4, 0x8C, 0x00, 0x04, 0x02, 0x3C, 0x27, 0x10, 0x02, 0x00,
43440x24, 0x28, 0xA2, 0x00, 0x25, 0xB0, 0x02, 0x3C, 0x00, 0x80, 0x84, 0x34,
43450xB0, 0x03, 0x42, 0x34, 0x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x44, 0xAC,
43460x00, 0x00, 0x65, 0xAC, 0xB0, 0x5D, 0xC4, 0xAC, 0xD0, 0x1B, 0x05, 0xAE,
43470x60, 0x1B, 0x65, 0x26, 0xD4, 0x1B, 0xA4, 0x8C, 0x00, 0x04, 0x03, 0x3C,
43480x25, 0xB0, 0x02, 0x3C, 0x26, 0x20, 0x83, 0x00, 0xB0, 0x03, 0x42, 0x34,
43490x00, 0x00, 0x44, 0xAC, 0xD4, 0x1B, 0xA4, 0xAC, 0x60, 0x1B, 0x66, 0x26,
43500xD0, 0x1B, 0xC7, 0x8C, 0x00, 0x08, 0x04, 0x3C, 0x24, 0x28, 0xF2, 0x00,
43510x24, 0x10, 0xA4, 0x00, 0x08, 0x00, 0x40, 0x10, 0x80, 0x00, 0x08, 0x3C,
43520xD4, 0x1B, 0xC3, 0x8C, 0x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34,
43530x26, 0x18, 0x64, 0x00, 0x00, 0x00, 0x44, 0xAC, 0xD4, 0x1B, 0xC3, 0xAC,
43540x80, 0x00, 0x08, 0x3C, 0x24, 0x10, 0xA8, 0x00, 0x21, 0x00, 0x40, 0x10,
43550x00, 0x00, 0x00, 0x00, 0xD4, 0x1B, 0xC3, 0x8C, 0x25, 0xB0, 0x09, 0x3C,
43560xB0, 0x03, 0x2A, 0x35, 0x2A, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0x43, 0xAD,
43570x36, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0x90, 0x23, 0xB0, 0x04, 0x3C,
43580xFF, 0x1F, 0x02, 0x3C, 0xC0, 0x18, 0x03, 0x00, 0xF0, 0x07, 0x63, 0x30,
43590xF4, 0x38, 0xC5, 0x8C, 0x21, 0x18, 0x64, 0x00, 0xFF, 0xFF, 0x42, 0x34,
43600x24, 0x18, 0x62, 0x00, 0xCE, 0x02, 0x65, 0x10, 0xF8, 0x38, 0xC3, 0xAC,
43610x02, 0x80, 0x05, 0x3C, 0xB0, 0x5D, 0xA3, 0x8C, 0x27, 0x20, 0x08, 0x00,
43620x24, 0x20, 0xE4, 0x00, 0x00, 0x10, 0x63, 0x34, 0x41, 0xB0, 0x02, 0x3C,
43630x00, 0x00, 0x43, 0xAD, 0x00, 0x00, 0x44, 0xAC, 0xB0, 0x5D, 0xA3, 0xAC,
43640xD0, 0x1B, 0xC4, 0xAC, 0x60, 0x1B, 0x62, 0x26, 0xD4, 0x1B, 0x43, 0x8C,
43650x80, 0x00, 0x04, 0x3C, 0x26, 0x18, 0x64, 0x00, 0xD4, 0x1B, 0x43, 0xAC,
43660x60, 0x1B, 0x66, 0x26, 0xD0, 0x1B, 0xC3, 0x8C, 0x00, 0x01, 0x05, 0x3C,
43670x24, 0x20, 0x72, 0x00, 0x24, 0x10, 0x85, 0x00, 0x06, 0x00, 0x40, 0x10,
43680x25, 0xB0, 0x02, 0x3C, 0xD4, 0x1B, 0xC3, 0x8C, 0xB0, 0x03, 0x42, 0x34,
43690x26, 0x18, 0x65, 0x00, 0x00, 0x00, 0x45, 0xAC, 0xD4, 0x1B, 0xC3, 0xAC,
43700x00, 0x02, 0x05, 0x3C, 0x24, 0x10, 0x85, 0x00, 0x06, 0x00, 0x40, 0x10,
43710x25, 0xB0, 0x02, 0x3C, 0xD4, 0x1B, 0xC3, 0x8C, 0xB0, 0x03, 0x42, 0x34,
43720x26, 0x18, 0x65, 0x00, 0x00, 0x00, 0x45, 0xAC, 0xD4, 0x1B, 0xC3, 0xAC,
43730x00, 0x10, 0x05, 0x3C, 0x24, 0x10, 0x85, 0x00, 0x0C, 0x00, 0x40, 0x10,
43740x60, 0x1B, 0x63, 0x26, 0xB0, 0x1B, 0xC3, 0x94, 0x00, 0x00, 0x00, 0x00,
43750x04, 0x00, 0x62, 0x30, 0x02, 0x00, 0x40, 0x10, 0x00, 0x08, 0x62, 0x34,
43760xB0, 0x1B, 0xC2, 0xA4, 0xD4, 0x1B, 0xC2, 0x8C, 0x00, 0x00, 0x00, 0x00,
43770x26, 0x10, 0x45, 0x00, 0xD4, 0x1B, 0xC2, 0xAC, 0x60, 0x1B, 0x63, 0x26,
43780xD0, 0x1B, 0x62, 0x8C, 0x00, 0x20, 0x05, 0x3C, 0x24, 0x10, 0x52, 0x00,
43790x24, 0x10, 0x45, 0x00, 0x0B, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
43800xB0, 0x1B, 0x64, 0x94, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x82, 0x30,
43810x02, 0x00, 0x40, 0x10, 0xFF, 0xF7, 0x82, 0x30, 0xB0, 0x1B, 0x62, 0xA4,
43820xD4, 0x1B, 0x62, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x26, 0x10, 0x45, 0x00,
43830xD4, 0x1B, 0x62, 0xAC, 0x2C, 0x00, 0xBF, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
43840x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
43850x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
43860x20, 0xBD, 0x02, 0x3C, 0xEC, 0x02, 0x03, 0x36, 0x4D, 0x00, 0x07, 0x36,
43870xF1, 0x02, 0x08, 0x36, 0x08, 0x00, 0x06, 0x24, 0x78, 0x02, 0x42, 0x34,
43880x00, 0x00, 0x45, 0xA4, 0x00, 0x00, 0xE0, 0xA0, 0x00, 0x00, 0x06, 0xA1,
43890x00, 0x00, 0x60, 0xAC, 0x00, 0x00, 0x62, 0x8C, 0xFF, 0x00, 0x04, 0x3C,
43900x00, 0x00, 0xE0, 0xA0, 0xFF, 0x00, 0x49, 0x30, 0x25, 0x48, 0x24, 0x01,
43910x00, 0x00, 0x06, 0xA1, 0xF2, 0x02, 0x05, 0x36, 0x00, 0x00, 0x64, 0xAC,
43920x0A, 0x00, 0x0A, 0x36, 0x00, 0x00, 0x69, 0xAC, 0x80, 0xFF, 0x03, 0x24,
43930x00, 0x00, 0xA0, 0xA0, 0x00, 0x00, 0x43, 0xA1, 0x00, 0x00, 0x62, 0x8D,
43940x80, 0x00, 0x03, 0x3C, 0x24, 0x10, 0x43, 0x00, 0x02, 0x00, 0x40, 0x10,
43950x84, 0xFF, 0x02, 0x24, 0x00, 0x00, 0x42, 0xA1, 0x2C, 0x1F, 0x00, 0x0C,
43960x01, 0x00, 0x04, 0x24, 0x02, 0x00, 0x02, 0x36, 0x00, 0x00, 0x43, 0x94,
43970xFF, 0xBF, 0x04, 0x24, 0x24, 0x18, 0x64, 0x00, 0x00, 0x00, 0x43, 0xA4,
43980x25, 0x32, 0x00, 0x08, 0x60, 0x1B, 0x67, 0x26, 0x70, 0x30, 0x00, 0x0C,
43990x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x02, 0x3C, 0x2A, 0xB0, 0x06, 0x3C,
44000xB0, 0x03, 0x42, 0x34, 0x00, 0x00, 0x54, 0xAC, 0x28, 0x00, 0xC3, 0x34,
44010x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x05, 0x24, 0xFF, 0x00, 0x24, 0x31,
44020x6D, 0x03, 0x85, 0x10, 0x25, 0xBD, 0x02, 0x3C, 0x00, 0x80, 0x22, 0x31,
44030x59, 0x02, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C, 0x00, 0x80, 0x02, 0x3C,
44040x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24, 0x21, 0x00, 0x82, 0x10,
44050xFF, 0x00, 0x23, 0x31, 0x60, 0x1B, 0x70, 0x26, 0x4C, 0x38, 0x05, 0x8E,
44060x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
44070x21, 0x30, 0x60, 0x00, 0x98, 0x37, 0x09, 0xA2, 0xE0, 0x37, 0x03, 0xAE,
44080x06, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
44090x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x09, 0x3C, 0xC0, 0x5D, 0x27, 0x91,
44100x02, 0x80, 0x08, 0x3C, 0xB0, 0x5D, 0x05, 0x8D, 0xD0, 0x1B, 0x06, 0x8E,
44110x60, 0x00, 0x02, 0x3C, 0x02, 0x00, 0xE7, 0x34, 0x27, 0x10, 0x02, 0x00,
44120x24, 0x30, 0xC2, 0x00, 0x00, 0x08, 0xA5, 0x34, 0x00, 0x26, 0x07, 0x00,
44130x25, 0xB0, 0x02, 0x3C, 0x25, 0x20, 0x85, 0x00, 0x80, 0x03, 0x42, 0x34,
44140x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x66, 0xAC,
44150xB0, 0x5D, 0x05, 0xAD, 0xC0, 0x5D, 0x27, 0xA1, 0xD0, 0x1B, 0x06, 0xAE,
44160x60, 0x1B, 0x62, 0x26, 0xD4, 0x1B, 0x43, 0x8C, 0x40, 0x00, 0x04, 0x3C,
44170x26, 0x18, 0x64, 0x00, 0x9A, 0x32, 0x00, 0x08, 0xD4, 0x1B, 0x43, 0xAC,
44180x70, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xB0, 0x05, 0x3C,
44190x24, 0x00, 0xA3, 0x34, 0x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x06, 0x24,
44200xFF, 0x00, 0x24, 0x31, 0x48, 0x03, 0x86, 0x10, 0x25, 0xB0, 0x02, 0x3C,
44210x00, 0x80, 0x22, 0x31, 0x64, 0x02, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C,
44220x00, 0x80, 0x02, 0x3C, 0x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24,
44230x25, 0x00, 0x82, 0x10, 0x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31,
44240x4C, 0x38, 0x05, 0x8E, 0x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00,
44250x21, 0x18, 0x62, 0x00, 0x21, 0x30, 0x60, 0x00, 0x94, 0x37, 0x09, 0xA2,
44260xE0, 0x37, 0x03, 0xAE, 0x06, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24,
44270x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x0A, 0x3C,
44280xC0, 0x5D, 0x47, 0x91, 0x02, 0x80, 0x09, 0x3C, 0xB0, 0x5D, 0x25, 0x8D,
44290xD0, 0x1B, 0x06, 0x8E, 0x60, 0x00, 0x02, 0x3C, 0x04, 0x00, 0xE7, 0x34,
44300x27, 0x10, 0x02, 0x00, 0x24, 0x30, 0xC2, 0x00, 0x00, 0x08, 0xA5, 0x34,
44310x25, 0xB0, 0x03, 0x3C, 0x40, 0x00, 0x02, 0x3C, 0x00, 0x26, 0x07, 0x00,
44320x26, 0xA0, 0x82, 0x02, 0xB0, 0x03, 0x68, 0x34, 0x25, 0x20, 0x85, 0x00,
44330x80, 0x03, 0x63, 0x34, 0x41, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0x64, 0xAC,
44340x00, 0x00, 0x46, 0xAC, 0xB0, 0x5D, 0x25, 0xAD, 0xC0, 0x5D, 0x47, 0xA1,
44350xD0, 0x1B, 0x06, 0xAE, 0x00, 0x00, 0x14, 0xAD, 0x60, 0x1B, 0x62, 0x26,
44360xD4, 0x1B, 0x43, 0x8C, 0x20, 0x00, 0x04, 0x3C, 0x26, 0x18, 0x64, 0x00,
44370x92, 0x32, 0x00, 0x08, 0xD4, 0x1B, 0x43, 0xAC, 0x70, 0x30, 0x00, 0x0C,
44380x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x05, 0x3C, 0xB0, 0x03, 0xA2, 0x34,
44390x2A, 0xB0, 0x07, 0x3C, 0x00, 0x00, 0x54, 0xAC, 0x20, 0x00, 0xE3, 0x34,
44400x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x06, 0x24, 0xFF, 0x00, 0x24, 0x31,
44410x07, 0x03, 0x86, 0x10, 0x90, 0x03, 0xA2, 0x34, 0x00, 0x80, 0x22, 0x31,
44420x05, 0x02, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C, 0x00, 0x80, 0x02, 0x3C,
44430x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24, 0x21, 0x00, 0x82, 0x10,
44440x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31, 0x40, 0x38, 0x05, 0x8E,
44450x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
44460x21, 0x30, 0x60, 0x00, 0x9C, 0x37, 0x09, 0xA2, 0xD4, 0x37, 0x03, 0xAE,
44470x05, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
44480x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x09, 0x3C, 0xC0, 0x5D, 0x27, 0x91,
44490x02, 0x80, 0x08, 0x3C, 0xB0, 0x5D, 0x05, 0x8D, 0xD0, 0x1B, 0x06, 0x8E,
44500x18, 0x00, 0x02, 0x3C, 0x01, 0x00, 0xE7, 0x34, 0x27, 0x10, 0x02, 0x00,
44510x24, 0x30, 0xC2, 0x00, 0x00, 0x04, 0xA5, 0x34, 0x00, 0x26, 0x07, 0x00,
44520x25, 0xB0, 0x02, 0x3C, 0x25, 0x20, 0x85, 0x00, 0x80, 0x03, 0x42, 0x34,
44530x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x66, 0xAC,
44540xB0, 0x5D, 0x05, 0xAD, 0xC0, 0x5D, 0x27, 0xA1, 0xD0, 0x1B, 0x06, 0xAE,
44550x60, 0x1B, 0x62, 0x26, 0xD4, 0x1B, 0x43, 0x8C, 0x10, 0x00, 0x04, 0x3C,
44560x26, 0x18, 0x64, 0x00, 0x8B, 0x32, 0x00, 0x08, 0xD4, 0x1B, 0x43, 0xAC,
44570x70, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xB0, 0x05, 0x3C,
44580x0C, 0x00, 0xA3, 0x34, 0x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x06, 0x24,
44590xFF, 0x00, 0x24, 0x31, 0xC6, 0x02, 0x86, 0x10, 0x00, 0x80, 0x22, 0x31,
44600x54, 0x02, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C, 0x00, 0x80, 0x02, 0x3C,
44610x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24, 0x24, 0x00, 0x82, 0x10,
44620x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31, 0x28, 0x38, 0x05, 0x8E,
44630x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
44640x21, 0x30, 0x60, 0x00, 0x80, 0x37, 0x09, 0xA2, 0xBC, 0x37, 0x03, 0xAE,
44650x03, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
44660x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x0A, 0x3C, 0xC0, 0x5D, 0x47, 0x91,
44670x02, 0x80, 0x09, 0x3C, 0xB0, 0x5D, 0x25, 0x8D, 0xD0, 0x1B, 0x06, 0x8E,
44680x01, 0x00, 0x08, 0x3C, 0x80, 0xFF, 0x02, 0x24, 0x25, 0x38, 0xE2, 0x00,
44690x00, 0x80, 0x03, 0x35, 0x00, 0x01, 0xA5, 0x34, 0x27, 0x18, 0x03, 0x00,
44700x00, 0x26, 0x07, 0x00, 0x25, 0xB0, 0x02, 0x3C, 0x24, 0x30, 0xC3, 0x00,
44710x25, 0x20, 0x85, 0x00, 0x80, 0x03, 0x42, 0x34, 0x41, 0xB0, 0x03, 0x3C,
44720x00, 0x00, 0x44, 0xAC, 0x27, 0xA0, 0x08, 0x00, 0x00, 0x00, 0x66, 0xAC,
44730xB0, 0x5D, 0x25, 0xAD, 0xC0, 0x5D, 0x47, 0xA1, 0xD0, 0x1B, 0x06, 0xAE,
44740x60, 0x1B, 0x63, 0x26, 0xD4, 0x1B, 0x62, 0x8C, 0x00, 0x00, 0x00, 0x00,
44750x00, 0x80, 0x42, 0x38, 0xD4, 0x1B, 0x62, 0xAC, 0x60, 0x1B, 0x70, 0x26,
44760xD0, 0x1B, 0x02, 0x8E, 0x01, 0x00, 0x03, 0x3C, 0x24, 0x10, 0x52, 0x00,
44770x24, 0x10, 0x54, 0x00, 0x24, 0x10, 0x43, 0x00, 0x11, 0xFE, 0x40, 0x10,
44780x00, 0x00, 0x00, 0x00, 0x70, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
44790x2A, 0xB0, 0x05, 0x3C, 0x10, 0x00, 0xA3, 0x34, 0x00, 0x00, 0x69, 0x8C,
44800xFF, 0x00, 0x06, 0x24, 0xFF, 0x00, 0x24, 0x31, 0x7C, 0x02, 0x86, 0x10,
44810x25, 0xB0, 0x02, 0x3C, 0x00, 0x80, 0x22, 0x31, 0xD0, 0x01, 0x40, 0x10,
44820x00, 0x80, 0x02, 0x3C, 0x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24,
44830x22, 0x00, 0x82, 0x10, 0x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31,
44840x28, 0x38, 0x05, 0x8E, 0x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00,
44850x21, 0x18, 0x62, 0x00, 0x21, 0x30, 0x60, 0x00, 0x84, 0x37, 0x09, 0xA2,
44860xBC, 0x37, 0x03, 0xAE, 0x03, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24,
44870x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x09, 0x3C,
44880xC0, 0x5D, 0x27, 0x91, 0x02, 0x80, 0x08, 0x3C, 0xB0, 0x5D, 0x05, 0x8D,
44890xD0, 0x1B, 0x06, 0x8E, 0x01, 0x00, 0x02, 0x3C, 0x00, 0x80, 0x42, 0x34,
44900x40, 0x00, 0xE7, 0x34, 0x27, 0x10, 0x02, 0x00, 0x24, 0x30, 0xC2, 0x00,
44910x00, 0x01, 0xA5, 0x34, 0x00, 0x26, 0x07, 0x00, 0x25, 0xB0, 0x02, 0x3C,
44920x25, 0x20, 0x85, 0x00, 0x80, 0x03, 0x42, 0x34, 0x41, 0xB0, 0x03, 0x3C,
44930x00, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x66, 0xAC, 0xB0, 0x5D, 0x05, 0xAD,
44940xC0, 0x5D, 0x27, 0xA1, 0xD0, 0x1B, 0x06, 0xAE, 0x60, 0x1B, 0x62, 0x26,
44950xD4, 0x1B, 0x43, 0x8C, 0x01, 0x00, 0x04, 0x3C, 0x60, 0x1B, 0x70, 0x26,
44960x26, 0x18, 0x64, 0x00, 0xD4, 0x1B, 0x43, 0xAC, 0xD0, 0x1B, 0x02, 0x8E,
44970x02, 0x00, 0x03, 0x3C, 0x24, 0x10, 0x52, 0x00, 0x24, 0x10, 0x43, 0x00,
44980xDB, 0xFD, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x70, 0x30, 0x00, 0x0C,
44990x00, 0x00, 0x00, 0x00, 0x2A, 0xB0, 0x05, 0x3C, 0x14, 0x00, 0xA3, 0x34,
45000x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x06, 0x24, 0xFF, 0x00, 0x24, 0x31,
45010x64, 0x02, 0x86, 0x10, 0x25, 0xB0, 0x02, 0x3C, 0x00, 0x80, 0x22, 0x31,
45020xFA, 0x01, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C, 0x00, 0x80, 0x02, 0x3C,
45030x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24, 0x25, 0x00, 0x82, 0x10,
45040x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31, 0x34, 0x38, 0x05, 0x8E,
45050x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
45060x21, 0x30, 0x60, 0x00, 0x88, 0x37, 0x09, 0xA2, 0xC8, 0x37, 0x03, 0xAE,
45070x04, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
45080x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x0A, 0x3C, 0xC0, 0x5D, 0x47, 0x91,
45090x02, 0x80, 0x09, 0x3C, 0xB0, 0x5D, 0x25, 0x8D, 0xD0, 0x1B, 0x06, 0x8E,
45100x06, 0x00, 0x02, 0x3C, 0x20, 0x00, 0xE7, 0x34, 0x27, 0x10, 0x02, 0x00,
45110x24, 0x30, 0xC2, 0x00, 0x00, 0x02, 0xA5, 0x34, 0x25, 0xB0, 0x03, 0x3C,
45120x04, 0x00, 0x02, 0x3C, 0x00, 0x26, 0x07, 0x00, 0x26, 0xA0, 0x82, 0x02,
45130xB0, 0x03, 0x68, 0x34, 0x25, 0x20, 0x85, 0x00, 0x80, 0x03, 0x63, 0x34,
45140x41, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0x64, 0xAC, 0x00, 0x00, 0x46, 0xAC,
45150xB0, 0x5D, 0x25, 0xAD, 0xC0, 0x5D, 0x47, 0xA1, 0xD0, 0x1B, 0x06, 0xAE,
45160x00, 0x00, 0x14, 0xAD, 0x60, 0x1B, 0x62, 0x26, 0xD4, 0x1B, 0x43, 0x8C,
45170x02, 0x00, 0x04, 0x3C, 0x60, 0x1B, 0x70, 0x26, 0x26, 0x18, 0x64, 0x00,
45180xD4, 0x1B, 0x43, 0xAC, 0xD0, 0x1B, 0x02, 0x8E, 0x04, 0x00, 0x03, 0x3C,
45190x24, 0x10, 0x52, 0x00, 0x24, 0x10, 0x54, 0x00, 0x24, 0x10, 0x43, 0x00,
45200xA1, 0xFD, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x70, 0x30, 0x00, 0x0C,
45210x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x03, 0x3C, 0xB0, 0x03, 0x62, 0x34,
45220x2A, 0xB0, 0x07, 0x3C, 0x00, 0x00, 0x54, 0xAC, 0x18, 0x00, 0xE5, 0x34,
45230x00, 0x00, 0xA9, 0x8C, 0xFF, 0x00, 0x06, 0x24, 0xFF, 0x00, 0x24, 0x31,
45240x16, 0x02, 0x86, 0x10, 0x04, 0x00, 0x02, 0x24, 0x00, 0x80, 0x22, 0x31,
45250xD6, 0x01, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C, 0x00, 0x80, 0x02, 0x3C,
45260x00, 0x00, 0xA2, 0xAC, 0xFF, 0x00, 0x02, 0x24, 0x21, 0x00, 0x82, 0x10,
45270x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31, 0x34, 0x38, 0x05, 0x8E,
45280x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00,
45290x21, 0x30, 0x60, 0x00, 0x8C, 0x37, 0x09, 0xA2, 0xC8, 0x37, 0x03, 0xAE,
45300x04, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C,
45310x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x09, 0x3C, 0xC0, 0x5D, 0x27, 0x91,
45320x02, 0x80, 0x08, 0x3C, 0xB0, 0x5D, 0x05, 0x8D, 0xD0, 0x1B, 0x06, 0x8E,
45330x06, 0x00, 0x02, 0x3C, 0x10, 0x00, 0xE7, 0x34, 0x27, 0x10, 0x02, 0x00,
45340x24, 0x30, 0xC2, 0x00, 0x00, 0x02, 0xA5, 0x34, 0x00, 0x26, 0x07, 0x00,
45350x25, 0xB0, 0x02, 0x3C, 0x25, 0x20, 0x85, 0x00, 0x80, 0x03, 0x42, 0x34,
45360x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x66, 0xAC,
45370xB0, 0x5D, 0x05, 0xAD, 0xC0, 0x5D, 0x27, 0xA1, 0xD0, 0x1B, 0x06, 0xAE,
45380x60, 0x1B, 0x62, 0x26, 0xD4, 0x1B, 0x43, 0x8C, 0x04, 0x00, 0x04, 0x3C,
45390x60, 0x1B, 0x70, 0x26, 0x26, 0x18, 0x64, 0x00, 0xD4, 0x1B, 0x43, 0xAC,
45400xD0, 0x1B, 0x02, 0x8E, 0x08, 0x00, 0x03, 0x3C, 0x24, 0x10, 0x52, 0x00,
45410x24, 0x10, 0x43, 0x00, 0x68, 0xFD, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
45420x70, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xB0, 0x05, 0x3C,
45430x1C, 0x00, 0xA3, 0x34, 0x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x06, 0x24,
45440xFF, 0x00, 0x24, 0x31, 0xDD, 0x01, 0x86, 0x10, 0x25, 0xB0, 0x02, 0x3C,
45450x00, 0x80, 0x22, 0x31, 0x33, 0x01, 0x40, 0x10, 0x00, 0xFF, 0x02, 0x3C,
45460x00, 0x80, 0x02, 0x3C, 0x00, 0x00, 0x62, 0xAC, 0xFF, 0x00, 0x02, 0x24,
45470x25, 0x00, 0x82, 0x10, 0x60, 0x1B, 0x70, 0x26, 0xFF, 0x00, 0x23, 0x31,
45480x40, 0x38, 0x05, 0x8E, 0x20, 0x10, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00,
45490x21, 0x18, 0x62, 0x00, 0x21, 0x30, 0x60, 0x00, 0x90, 0x37, 0x09, 0xA2,
45500xD4, 0x37, 0x03, 0xAE, 0x05, 0x00, 0x04, 0x24, 0x80, 0x00, 0x07, 0x24,
45510x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF, 0x02, 0x80, 0x0A, 0x3C,
45520xC0, 0x5D, 0x47, 0x91, 0x02, 0x80, 0x09, 0x3C, 0xB0, 0x5D, 0x25, 0x8D,
45530xD0, 0x1B, 0x06, 0x8E, 0x18, 0x00, 0x02, 0x3C, 0x08, 0x00, 0xE7, 0x34,
45540x27, 0x10, 0x02, 0x00, 0x24, 0x30, 0xC2, 0x00, 0x00, 0x04, 0xA5, 0x34,
45550x25, 0xB0, 0x03, 0x3C, 0x10, 0x00, 0x02, 0x3C, 0x00, 0x26, 0x07, 0x00,
45560x26, 0xA0, 0x82, 0x02, 0xB0, 0x03, 0x68, 0x34, 0x25, 0x20, 0x85, 0x00,
45570x80, 0x03, 0x63, 0x34, 0x41, 0xB0, 0x02, 0x3C, 0x00, 0x00, 0x64, 0xAC,
45580x00, 0x00, 0x46, 0xAC, 0xB0, 0x5D, 0x25, 0xAD, 0xC0, 0x5D, 0x47, 0xA1,
45590xD0, 0x1B, 0x06, 0xAE, 0x00, 0x00, 0x14, 0xAD, 0x60, 0x1B, 0x62, 0x26,
45600xD4, 0x1B, 0x43, 0x8C, 0x08, 0x00, 0x04, 0x3C, 0x26, 0x18, 0x64, 0x00,
45610x83, 0x32, 0x00, 0x08, 0xD4, 0x1B, 0x43, 0xAC, 0x70, 0x30, 0x00, 0x0C,
45620x00, 0x00, 0x00, 0x00, 0xD4, 0x1B, 0x02, 0x8E, 0xD0, 0x1B, 0x03, 0x8E,
45630x00, 0x20, 0x42, 0x38, 0x62, 0x32, 0x00, 0x08, 0xD4, 0x1B, 0x02, 0xAE,
45640x70, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xB0, 0x02, 0x3C,
45650x08, 0x00, 0x43, 0x34, 0x00, 0x00, 0x69, 0x8C, 0xFF, 0x00, 0x02, 0x24,
45660xFF, 0x00, 0x24, 0x31, 0x2C, 0x00, 0x82, 0x10, 0x00, 0x80, 0x22, 0x31,
45670x34, 0x01, 0x40, 0x14, 0x00, 0x80, 0x02, 0x3C, 0x00, 0xFF, 0x02, 0x3C,
45680x24, 0x10, 0x22, 0x01, 0x0B, 0x00, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24,
45690xA8, 0x37, 0x02, 0x92, 0x20, 0xB0, 0x03, 0x3C, 0x00, 0x12, 0x02, 0x00,
45700x21, 0x10, 0x43, 0x00, 0x0C, 0x00, 0x49, 0x8C, 0x25, 0xB0, 0x03, 0x3C,
45710xB0, 0x03, 0x63, 0x34, 0x00, 0x00, 0x69, 0xAC, 0xFF, 0x00, 0x24, 0x31,
45720xFF, 0x00, 0x02, 0x24, 0x1A, 0x00, 0x82, 0x10, 0x60, 0x1B, 0x70, 0x26,
45730xFF, 0x00, 0x23, 0x31, 0x70, 0x38, 0x05, 0x8E, 0x20, 0x10, 0x02, 0x3C,
45740x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00, 0x21, 0x30, 0x60, 0x00,
45750x04, 0x38, 0x03, 0xAE, 0x01, 0x00, 0x04, 0x24, 0xA8, 0x37, 0x09, 0xA2,
45760x80, 0x00, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA0, 0xAF,
45770xD0, 0x1B, 0x05, 0x8E, 0x02, 0x80, 0x06, 0x3C, 0xB0, 0x5D, 0xC4, 0x8C,
45780xFF, 0xC7, 0x02, 0x24, 0x24, 0x28, 0xA2, 0x00, 0x25, 0xB0, 0x02, 0x3C,
45790x10, 0x00, 0x84, 0x34, 0x80, 0x03, 0x42, 0x34, 0x41, 0xB0, 0x03, 0x3C,
45800x00, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x65, 0xAC, 0xB0, 0x5D, 0xC4, 0xAC,
45810xD0, 0x1B, 0x05, 0xAE, 0x60, 0x1B, 0x63, 0x26, 0xD4, 0x1B, 0x62, 0x8C,
45820x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x42, 0x38, 0x5B, 0x32, 0x00, 0x08,
45830xD4, 0x1B, 0x62, 0xAC, 0x56, 0x01, 0x02, 0x35, 0x00, 0x00, 0x43, 0x94,
45840x00, 0x00, 0x00, 0x00, 0x74, 0xFC, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00,
45850x7E, 0x58, 0x00, 0x0C, 0x07, 0x00, 0x04, 0x24, 0x12, 0x32, 0x00, 0x08,
45860x60, 0x1B, 0x64, 0x26, 0x00, 0x00, 0x62, 0xAC, 0xB8, 0x32, 0x00, 0x08,
45870xFF, 0x00, 0x02, 0x24, 0xE4, 0x1D, 0x24, 0x96, 0x58, 0x38, 0x26, 0x96,
45880x01, 0x00, 0x84, 0x24, 0x00, 0x19, 0x04, 0x00, 0x25, 0x30, 0xC2, 0x00,
45890xF0, 0xFF, 0x63, 0x30, 0x20, 0x00, 0xC5, 0x24, 0x02, 0x12, 0x03, 0x00,
45900xE4, 0x1D, 0x24, 0xA6, 0x17, 0x00, 0xA2, 0xA0, 0x16, 0x00, 0xA3, 0xA0,
45910x0C, 0x00, 0xC4, 0x8C, 0x00, 0xF0, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
45920xFF, 0x0F, 0x63, 0x30, 0x00, 0x1C, 0x03, 0x00, 0x24, 0x20, 0x82, 0x00,
45930x25, 0x20, 0x83, 0x00, 0x0C, 0x00, 0xC4, 0xAC, 0x58, 0x38, 0x25, 0x8E,
45940x01, 0x00, 0x10, 0x24, 0x01, 0x00, 0x04, 0x24, 0x31, 0x10, 0x06, 0x3C,
45950x00, 0x01, 0x07, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xB0, 0xAF,
45960x5B, 0x01, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24, 0x2A, 0xB0, 0x02, 0x3C,
45970x01, 0x00, 0x42, 0x34, 0x02, 0x00, 0x03, 0x24, 0x00, 0x00, 0x50, 0xA0,
45980x00, 0x00, 0x43, 0xA0, 0xD4, 0x1B, 0x22, 0x8E, 0x00, 0x00, 0x00, 0x00,
45990x08, 0x00, 0x42, 0x38, 0x4D, 0x32, 0x00, 0x08, 0xD4, 0x1B, 0x22, 0xAE,
46000xD0, 0x03, 0x23, 0x35, 0x80, 0x00, 0x02, 0x24, 0x00, 0x00, 0x62, 0xAC,
46010x09, 0x33, 0x00, 0x08, 0x60, 0x1B, 0x62, 0x26, 0x25, 0xB0, 0x02, 0x3C,
46020x01, 0x00, 0x03, 0x24, 0x90, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
46030xD5, 0x32, 0x00, 0x08, 0x60, 0x1B, 0x65, 0x26, 0x24, 0x10, 0x22, 0x01,
46040xA9, 0xFD, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24, 0x47, 0x00, 0xC6, 0x34,
46050x00, 0x00, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x44, 0x30,
46060x0E, 0x00, 0x85, 0x10, 0x60, 0x1B, 0x62, 0x26, 0x98, 0x37, 0x04, 0xA2,
46070x00, 0x00, 0xC2, 0x90, 0xFF, 0x00, 0x83, 0x30, 0xFF, 0x00, 0x44, 0x30,
46080x07, 0x00, 0x83, 0x10, 0x21, 0x38, 0x00, 0x02, 0x21, 0x28, 0xC0, 0x00,
46090x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00, 0xFD, 0xFF, 0x62, 0x14,
46100xFF, 0x00, 0x44, 0x30, 0x98, 0x37, 0xE3, 0xA0, 0x60, 0x1B, 0x62, 0x26,
46110x98, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00,
46120x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C, 0x25, 0xB0, 0x02, 0x3C,
46130xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31, 0x00, 0x00, 0x49, 0xAC,
46140x81, 0x33, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24, 0x24, 0x10, 0x22, 0x01,
46150xFD, 0xFD, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24, 0x45, 0x00, 0xE5, 0x34,
46160x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x44, 0x30,
46170x0E, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x62, 0x26, 0x9C, 0x37, 0x04, 0xA2,
46180x00, 0x00, 0xA2, 0x90, 0xFF, 0x00, 0x83, 0x30, 0xFF, 0x00, 0x44, 0x30,
46190x08, 0x00, 0x83, 0x10, 0x60, 0x1B, 0x62, 0x26, 0x21, 0x30, 0x00, 0x02,
46200x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00, 0xFD, 0xFF, 0x62, 0x14,
46210xFF, 0x00, 0x44, 0x30, 0x9C, 0x37, 0xC3, 0xA0, 0x60, 0x1B, 0x62, 0x26,
46220x9C, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00,
46230x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C, 0x25, 0xB0, 0x02, 0x3C,
46240xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31, 0x00, 0x00, 0x49, 0xAC,
46250xF6, 0x33, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24, 0x24, 0x10, 0x22, 0x01,
46260x9E, 0xFD, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24, 0x46, 0x00, 0xA5, 0x34,
46270x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x44, 0x30,
46280x0E, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x62, 0x26, 0x94, 0x37, 0x04, 0xA2,
46290x00, 0x00, 0xA2, 0x90, 0xFF, 0x00, 0x83, 0x30, 0xFF, 0x00, 0x44, 0x30,
46300x08, 0x00, 0x83, 0x10, 0x60, 0x1B, 0x62, 0x26, 0x21, 0x30, 0x00, 0x02,
46310x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00, 0xFD, 0xFF, 0x62, 0x14,
46320xFF, 0x00, 0x44, 0x30, 0x94, 0x37, 0xC3, 0xA0, 0x60, 0x1B, 0x62, 0x26,
46330x94, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C, 0x00, 0x1A, 0x03, 0x00,
46340x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C, 0x25, 0xB0, 0x02, 0x3C,
46350xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31, 0x00, 0x00, 0x49, 0xAC,
46360xB8, 0x33, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24, 0x00, 0xFF, 0x02, 0x3C,
46370x24, 0x10, 0x22, 0x01, 0x30, 0xFE, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24,
46380x41, 0x00, 0xA5, 0x34, 0x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00,
46390xFF, 0x00, 0x44, 0x30, 0x0E, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x62, 0x26,
46400x84, 0x37, 0x04, 0xA2, 0x00, 0x00, 0xA2, 0x90, 0xFF, 0x00, 0x83, 0x30,
46410xFF, 0x00, 0x44, 0x30, 0x08, 0x00, 0x83, 0x10, 0x60, 0x1B, 0x62, 0x26,
46420x21, 0x30, 0x00, 0x02, 0x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00,
46430xFD, 0xFF, 0x62, 0x14, 0xFF, 0x00, 0x44, 0x30, 0x84, 0x37, 0xC3, 0xA0,
46440x60, 0x1B, 0x62, 0x26, 0x84, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C,
46450x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C,
46460x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31,
46470x00, 0x00, 0x49, 0xAC, 0x6C, 0x34, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24,
46480x24, 0x10, 0x22, 0x01, 0xCF, 0xFE, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24,
46490x44, 0x00, 0xA5, 0x34, 0x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00,
46500xFF, 0x00, 0x44, 0x30, 0x0E, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x62, 0x26,
46510x90, 0x37, 0x04, 0xA2, 0x00, 0x00, 0xA2, 0x90, 0xFF, 0x00, 0x83, 0x30,
46520xFF, 0x00, 0x44, 0x30, 0x08, 0x00, 0x83, 0x10, 0x60, 0x1B, 0x62, 0x26,
46530x21, 0x30, 0x00, 0x02, 0x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00,
46540xFD, 0xFF, 0x62, 0x14, 0xFF, 0x00, 0x44, 0x30, 0x90, 0x37, 0xC3, 0xA0,
46550x60, 0x1B, 0x62, 0x26, 0x90, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C,
46560x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C,
46570x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31,
46580x00, 0x00, 0x49, 0xAC, 0x2C, 0x35, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24,
46590x24, 0x10, 0x22, 0x01, 0xAE, 0xFD, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24,
46600x40, 0x00, 0xA5, 0x34, 0x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00,
46610xFF, 0x00, 0x44, 0x30, 0x0E, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x62, 0x26,
46620x80, 0x37, 0x04, 0xA2, 0x00, 0x00, 0xA2, 0x90, 0xFF, 0x00, 0x83, 0x30,
46630xFF, 0x00, 0x44, 0x30, 0x08, 0x00, 0x83, 0x10, 0x60, 0x1B, 0x62, 0x26,
46640x21, 0x30, 0x00, 0x02, 0x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00,
46650xFD, 0xFF, 0x62, 0x14, 0xFF, 0x00, 0x44, 0x30, 0x80, 0x37, 0xC3, 0xA0,
46660x60, 0x1B, 0x62, 0x26, 0x80, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C,
46670x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C,
46680x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31,
46690x00, 0x00, 0x49, 0xAC, 0x2C, 0x34, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24,
46700x00, 0x00, 0x62, 0xAC, 0x78, 0x35, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24,
46710x24, 0x10, 0x22, 0x01, 0x08, 0xFE, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24,
46720x42, 0x00, 0xA5, 0x34, 0x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00,
46730xFF, 0x00, 0x44, 0x30, 0x0E, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x62, 0x26,
46740x88, 0x37, 0x04, 0xA2, 0x00, 0x00, 0xA2, 0x90, 0xFF, 0x00, 0x83, 0x30,
46750xFF, 0x00, 0x44, 0x30, 0x08, 0x00, 0x83, 0x10, 0x60, 0x1B, 0x62, 0x26,
46760x21, 0x30, 0x00, 0x02, 0x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00,
46770xFD, 0xFF, 0x62, 0x14, 0xFF, 0x00, 0x44, 0x30, 0x88, 0x37, 0xC3, 0xA0,
46780x60, 0x1B, 0x62, 0x26, 0x88, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C,
46790x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C,
46800x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31,
46810x00, 0x00, 0x49, 0xAC, 0xAA, 0x34, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24,
46820x24, 0x10, 0x22, 0x01, 0x2C, 0xFE, 0x40, 0x10, 0xFF, 0x00, 0x02, 0x24,
46830x43, 0x00, 0xE5, 0x34, 0x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00,
46840xFF, 0x00, 0x44, 0x30, 0x0E, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x62, 0x26,
46850x8C, 0x37, 0x04, 0xA2, 0x00, 0x00, 0xA2, 0x90, 0xFF, 0x00, 0x83, 0x30,
46860xFF, 0x00, 0x44, 0x30, 0x08, 0x00, 0x83, 0x10, 0x60, 0x1B, 0x62, 0x26,
46870x21, 0x30, 0x00, 0x02, 0x00, 0x00, 0xA2, 0x90, 0x21, 0x18, 0x80, 0x00,
46880xFD, 0xFF, 0x62, 0x14, 0xFF, 0x00, 0x44, 0x30, 0x8C, 0x37, 0xC3, 0xA0,
46890x60, 0x1B, 0x62, 0x26, 0x8C, 0x37, 0x43, 0x90, 0x20, 0xB0, 0x02, 0x3C,
46900x00, 0x1A, 0x03, 0x00, 0x21, 0x18, 0x62, 0x00, 0x0C, 0x00, 0x69, 0x8C,
46910x25, 0xB0, 0x02, 0x3C, 0xB0, 0x03, 0x42, 0x34, 0xFF, 0x00, 0x24, 0x31,
46920x00, 0x00, 0x49, 0xAC, 0xEF, 0x34, 0x00, 0x08, 0xFF, 0x00, 0x02, 0x24,
46930x06, 0x00, 0x03, 0x24, 0x90, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
46940x90, 0x34, 0x00, 0x08, 0x60, 0x1B, 0x62, 0x26, 0x01, 0x00, 0x03, 0x24,
46950x90, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0xA4, 0x33, 0x00, 0x08,
46960x60, 0x1B, 0x62, 0x26, 0x25, 0xB0, 0x02, 0x3C, 0x07, 0x00, 0x03, 0x24,
46970x90, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0x60, 0x1B, 0x63, 0x26,
46980xD4, 0x1B, 0x62, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, 0x38,
46990x56, 0x34, 0x00, 0x08, 0xD4, 0x1B, 0x62, 0xAC, 0x00, 0x00, 0x40, 0xAC,
47000x19, 0x34, 0x00, 0x08, 0x60, 0x1B, 0x62, 0x26, 0x02, 0x00, 0x03, 0x24,
47010x90, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0xDF, 0x33, 0x00, 0x08,
47020x60, 0x1B, 0x62, 0x26, 0x90, 0x03, 0x63, 0x34, 0x00, 0x00, 0x62, 0xAC,
47030x12, 0x35, 0x00, 0x08, 0x60, 0x1B, 0x62, 0x26, 0x03, 0x00, 0x03, 0x24,
47040x90, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0x53, 0x35, 0x00, 0x08,
47050x60, 0x1B, 0x62, 0x26, 0x05, 0x00, 0x03, 0x24, 0x90, 0x03, 0x42, 0x34,
47060x00, 0x00, 0x43, 0xAC, 0xD1, 0x34, 0x00, 0x08, 0x60, 0x1B, 0x62, 0x26,
47070xE0, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xBF, 0xAF, 0x18, 0x00, 0xB2, 0xAF,
47080x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x25, 0xB0, 0x0C, 0x3C,
47090x01, 0x80, 0x02, 0x3C, 0x18, 0x03, 0x83, 0x35, 0x30, 0xDC, 0x42, 0x24,
47100x02, 0x80, 0x12, 0x3C, 0x41, 0xB0, 0x0B, 0x3C, 0x00, 0x00, 0x62, 0xAC,
47110x60, 0x1B, 0x4A, 0x26, 0x0A, 0x00, 0x62, 0x35, 0x00, 0x00, 0x44, 0x94,
47120xDE, 0x1B, 0x43, 0x95, 0xDC, 0x1B, 0x49, 0x95, 0x25, 0x30, 0x64, 0x00,
47130xFF, 0xFF, 0xD0, 0x30, 0x24, 0x10, 0x09, 0x02, 0x02, 0x00, 0x42, 0x30,
47140xC2, 0x00, 0x40, 0x10, 0xC0, 0x03, 0x83, 0x35, 0x02, 0x00, 0x02, 0x24,
47150x00, 0x00, 0x62, 0xAC, 0x02, 0x80, 0x08, 0x3C, 0xB0, 0x5D, 0x04, 0x8D,
47160xDC, 0x02, 0x82, 0x35, 0x00, 0x00, 0x47, 0x90, 0xFD, 0xFF, 0x03, 0x24,
47170x00, 0x80, 0x02, 0x3C, 0x24, 0x18, 0x23, 0x01, 0x25, 0x20, 0x82, 0x00,
47180x02, 0x00, 0xC6, 0x38, 0x08, 0x00, 0x65, 0x35, 0x02, 0x80, 0x02, 0x3C,
47190xED, 0x5D, 0x47, 0xA0, 0xB0, 0x5D, 0x04, 0xAD, 0xDE, 0x1B, 0x46, 0xA5,
47200x21, 0x48, 0x60, 0x00, 0x00, 0x00, 0xA3, 0xA4, 0xDC, 0x1B, 0x43, 0xA5,
47210x24, 0x38, 0x09, 0x02, 0x04, 0x00, 0xE2, 0x30, 0x0A, 0x00, 0x40, 0x10,
47220x08, 0x00, 0xE2, 0x30, 0xDE, 0x1B, 0x43, 0x95, 0x0C, 0x00, 0x64, 0x35,
47230xC0, 0x03, 0x85, 0x35, 0x04, 0x00, 0x63, 0x38, 0x04, 0x00, 0x02, 0x24,
47240x00, 0x00, 0x86, 0x90, 0x00, 0x00, 0xA2, 0xAC, 0xDE, 0x1B, 0x43, 0xA5,
47250x08, 0x00, 0xE2, 0x30, 0x08, 0x00, 0x40, 0x10, 0x10, 0x00, 0xE2, 0x30,
47260xDE, 0x1B, 0x42, 0x95, 0xC0, 0x03, 0x84, 0x35, 0x08, 0x00, 0x03, 0x24,
47270x08, 0x00, 0x42, 0x38, 0x00, 0x00, 0x83, 0xAC, 0xDE, 0x1B, 0x42, 0xA5,
47280x10, 0x00, 0xE2, 0x30, 0x08, 0x00, 0x40, 0x10, 0x20, 0x00, 0xE2, 0x30,
47290xDE, 0x1B, 0x42, 0x95, 0xC0, 0x03, 0x84, 0x35, 0x10, 0x00, 0x03, 0x24,
47300x10, 0x00, 0x42, 0x38, 0x00, 0x00, 0x83, 0xAC, 0xDE, 0x1B, 0x42, 0xA5,
47310x20, 0x00, 0xE2, 0x30, 0x08, 0x00, 0x40, 0x10, 0x80, 0x00, 0xE2, 0x30,
47320xDE, 0x1B, 0x42, 0x95, 0xC0, 0x03, 0x84, 0x35, 0x20, 0x00, 0x03, 0x24,
47330x20, 0x00, 0x42, 0x38, 0x00, 0x00, 0x83, 0xAC, 0xDE, 0x1B, 0x42, 0xA5,
47340x80, 0x00, 0xE2, 0x30, 0x74, 0x00, 0x40, 0x10, 0x60, 0x1B, 0x47, 0x26,
47350xC0, 0x03, 0x83, 0x35, 0x80, 0x00, 0x02, 0x24, 0x42, 0xB0, 0x0B, 0x3C,
47360x00, 0x00, 0x62, 0xAC, 0x03, 0x00, 0x71, 0x35, 0xDE, 0x1B, 0x42, 0x95,
47370x00, 0x00, 0x23, 0x92, 0x80, 0x00, 0x42, 0x38, 0x20, 0x00, 0x63, 0x30,
47380x59, 0x00, 0x60, 0x10, 0xDE, 0x1B, 0x42, 0xA5, 0x20, 0x00, 0x02, 0x24,
47390x00, 0x00, 0x22, 0xA2, 0x02, 0x80, 0x03, 0x3C, 0x0F, 0x5E, 0x62, 0x90,
47400x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x40, 0x14, 0x21, 0x40, 0x00, 0x00,
47410xB0, 0x1B, 0x42, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x30,
47420x4E, 0x00, 0x40, 0x10, 0x02, 0x80, 0x06, 0x3C, 0x02, 0x80, 0x07, 0x3C,
47430xEC, 0x5D, 0xE2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x40, 0x10,
47440x02, 0x80, 0x09, 0x3C, 0x02, 0x80, 0x04, 0x3C, 0xF8, 0x5D, 0x82, 0x8C,
47450x18, 0x5E, 0x24, 0x8D, 0x1C, 0x5E, 0x25, 0x8D, 0x21, 0x18, 0x00, 0x00,
47460x21, 0x10, 0x44, 0x00, 0x2B, 0x30, 0x44, 0x00, 0x21, 0x18, 0x65, 0x00,
47470x21, 0x18, 0x66, 0x00, 0x18, 0x5E, 0x22, 0xAD, 0x1C, 0x5E, 0x23, 0xAD,
47480xEC, 0x5D, 0xE4, 0x90, 0x02, 0x00, 0x02, 0x24, 0xFF, 0x00, 0x84, 0x30,
47490x07, 0x00, 0x82, 0x10, 0x02, 0x80, 0x04, 0x3C, 0xEC, 0x5D, 0xE2, 0x90,
47500x03, 0x00, 0x03, 0x24, 0xFF, 0x00, 0x42, 0x30, 0x5A, 0x00, 0x43, 0x14,
47510x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x04, 0x3C, 0x0A, 0x5E, 0x82, 0x90,
47520x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x42, 0x24, 0x0A, 0x5E, 0x82, 0xA0,
47530x0A, 0x5E, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x60, 0x10,
47540x02, 0x80, 0x02, 0x3C, 0xF2, 0x5D, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
47550x03, 0x00, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x11,
47560x80, 0x00, 0x86, 0x35, 0x0A, 0x5E, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00,
47570x06, 0x00, 0x40, 0x14, 0x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x02, 0x3C,
47580x09, 0x5E, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x5E, 0x83, 0xA0,
47590x02, 0x80, 0x05, 0x3C, 0x07, 0x5E, 0xA2, 0x90, 0x02, 0x80, 0x03, 0x3C,
47600x02, 0x00, 0x04, 0x24, 0x10, 0x00, 0x42, 0x34, 0x07, 0x5E, 0xA2, 0xA0,
47610xF1, 0x5D, 0x62, 0x90, 0x21, 0x28, 0x00, 0x00, 0xFF, 0x00, 0x42, 0x30,
47620x80, 0x30, 0x02, 0x00, 0x21, 0x30, 0xC2, 0x00, 0xB9, 0x20, 0x00, 0x0C,
47630x00, 0x33, 0x06, 0x00, 0x42, 0xB0, 0x02, 0x3C, 0x44, 0x00, 0x04, 0x24,
47640x03, 0x00, 0x42, 0x34, 0x00, 0x00, 0x44, 0xA0, 0x02, 0x80, 0x03, 0x3C,
47650xEE, 0x5D, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x42, 0x30,
47660x04, 0x00, 0x42, 0x28, 0x05, 0x00, 0x40, 0x10, 0x02, 0x80, 0x06, 0x3C,
47670x04, 0x00, 0x04, 0x24, 0x4B, 0x2E, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24,
47680x02, 0x80, 0x06, 0x3C, 0xB0, 0x5D, 0xC4, 0x8C, 0x60, 0x1B, 0x47, 0x26,
47690xDC, 0x1B, 0xE5, 0x94, 0x10, 0x00, 0x02, 0x3C, 0x25, 0x20, 0x82, 0x00,
47700x41, 0xB0, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C, 0x7F, 0xFF, 0xA5, 0x30,
47710xB0, 0x03, 0x42, 0x34, 0x08, 0x00, 0x63, 0x34, 0x00, 0x00, 0x44, 0xAC,
47720x00, 0x00, 0x65, 0xA4, 0xB0, 0x5D, 0xC4, 0xAC, 0xDC, 0x1B, 0xE5, 0xA4,
47730x60, 0x1B, 0x47, 0x26, 0xDC, 0x1B, 0xE2, 0x94, 0x00, 0x00, 0x00, 0x00,
47740x24, 0x10, 0x50, 0x00, 0x00, 0x30, 0x42, 0x30, 0x06, 0x00, 0x40, 0x10,
47750x00, 0x00, 0x00, 0x00, 0xDE, 0x1B, 0xE2, 0x94, 0x00, 0x00, 0x00, 0x00,
47760x00, 0x10, 0x42, 0x38, 0x00, 0x20, 0x42, 0x34, 0xDE, 0x1B, 0xE2, 0xA4,
47770x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
47780x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
47790x36, 0x37, 0x00, 0x08, 0xDE, 0x1B, 0x46, 0xA5, 0x01, 0x00, 0x08, 0x24,
47800x0F, 0x5E, 0x60, 0xA0, 0x72, 0x37, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
47810x07, 0x5E, 0xA2, 0x90, 0x02, 0x80, 0x03, 0x3C, 0x02, 0x00, 0x04, 0x24,
47820x10, 0x00, 0x42, 0x34, 0x07, 0x5E, 0xA2, 0xA0, 0xF1, 0x5D, 0x62, 0x90,
47830x21, 0x28, 0x00, 0x00, 0xFF, 0x00, 0x42, 0x30, 0x80, 0x30, 0x02, 0x00,
47840x21, 0x30, 0xC2, 0x00, 0xB9, 0x20, 0x00, 0x0C, 0x00, 0x33, 0x06, 0x00,
47850x44, 0x00, 0x02, 0x24, 0x00, 0x00, 0x22, 0xA2, 0xBA, 0x37, 0x00, 0x08,
47860x02, 0x80, 0x03, 0x3C, 0x84, 0x00, 0x84, 0x35, 0x00, 0x00, 0x82, 0x8C,
47870x02, 0x80, 0x08, 0x3C, 0x00, 0x00, 0xC4, 0x8C, 0x14, 0x5E, 0x06, 0x8D,
47880x21, 0x10, 0x00, 0x00, 0x18, 0x5E, 0x28, 0x8D, 0x1C, 0x5E, 0x29, 0x8D,
47890x00, 0x00, 0x65, 0x91, 0x25, 0x10, 0x44, 0x00, 0x21, 0x10, 0x46, 0x00,
47900xFB, 0xFF, 0x04, 0x24, 0x24, 0x28, 0xA4, 0x00, 0x23, 0x40, 0x02, 0x01,
47910x00, 0x00, 0x65, 0xA1, 0x04, 0x00, 0x00, 0x11, 0x01, 0x00, 0x06, 0x24,
47920x80, 0x10, 0x08, 0x00, 0x21, 0x10, 0x48, 0x00, 0x80, 0x30, 0x02, 0x00,
47930x01, 0x00, 0x04, 0x24, 0xB9, 0x20, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00,
47940x42, 0xB0, 0x02, 0x3C, 0x22, 0x00, 0x03, 0x24, 0x03, 0x00, 0x42, 0x34,
47950x00, 0x00, 0x43, 0xA0, 0xC4, 0x37, 0x00, 0x08, 0x02, 0x80, 0x06, 0x3C,
47960xF0, 0xFF, 0xBD, 0x27, 0x08, 0x00, 0xB2, 0xAF, 0x04, 0x00, 0xB1, 0xAF,
47970x00, 0x00, 0xB0, 0xAF, 0x00, 0x40, 0x09, 0x40, 0x00, 0x68, 0x0A, 0x40,
47980x00, 0x70, 0x02, 0x40, 0x00, 0x60, 0x0B, 0x40, 0x25, 0xB0, 0x05, 0x3C,
47990x18, 0x03, 0xA7, 0x34, 0x00, 0x00, 0xE6, 0x8C, 0x01, 0x80, 0x02, 0x3C,
48000x1C, 0x03, 0xA3, 0x34, 0x5C, 0xE0, 0x42, 0x24, 0x00, 0x00, 0x66, 0xAC,
48010x00, 0x00, 0xE2, 0xAC, 0x80, 0x00, 0x83, 0x8C, 0x7C, 0x02, 0xA2, 0x34,
48020x80, 0x02, 0xA6, 0x34, 0x84, 0x02, 0xA7, 0x34, 0x88, 0x02, 0xA8, 0x34,
48030x00, 0x00, 0x43, 0xAC, 0x00, 0x00, 0xC9, 0xAC, 0x00, 0x00, 0xEA, 0xAC,
48040x00, 0x00, 0x0B, 0xAD, 0x74, 0x00, 0x83, 0x8C, 0x8C, 0x02, 0xA2, 0x34,
48050x90, 0x02, 0xA7, 0x34, 0x00, 0x00, 0x43, 0xAC, 0x08, 0x00, 0x86, 0x8C,
48060x94, 0x02, 0xA8, 0x34, 0x98, 0x02, 0xA9, 0x34, 0x00, 0x00, 0xE6, 0xAC,
48070x0C, 0x00, 0x82, 0x8C, 0x9C, 0x02, 0xA6, 0x34, 0xA0, 0x02, 0xA7, 0x34,
48080x00, 0x00, 0x02, 0xAD, 0x10, 0x00, 0x83, 0x8C, 0xA4, 0x02, 0xA8, 0x34,
48090xA8, 0x02, 0xAA, 0x34, 0x00, 0x00, 0x23, 0xAD, 0x14, 0x00, 0x82, 0x8C,
48100xAC, 0x02, 0xA9, 0x34, 0xB0, 0x02, 0xAB, 0x34, 0x00, 0x00, 0xC2, 0xAC,
48110x18, 0x00, 0x83, 0x8C, 0xB4, 0x02, 0xAC, 0x34, 0xB8, 0x02, 0xAD, 0x34,
48120x00, 0x00, 0xE3, 0xAC, 0x1C, 0x00, 0x82, 0x8C, 0xBC, 0x02, 0xA7, 0x34,
48130xC0, 0x02, 0xAE, 0x34, 0x00, 0x00, 0x02, 0xAD, 0x20, 0x00, 0x83, 0x8C,
48140xC4, 0x02, 0xA8, 0x34, 0xC8, 0x02, 0xAF, 0x34, 0x00, 0x00, 0x43, 0xAD,
48150x24, 0x00, 0x82, 0x8C, 0xCC, 0x02, 0xAA, 0x34, 0xD0, 0x02, 0xB0, 0x34,
48160x00, 0x00, 0x22, 0xAD, 0x28, 0x00, 0x83, 0x8C, 0xD4, 0x02, 0xA9, 0x34,
48170xD8, 0x02, 0xB1, 0x34, 0x00, 0x00, 0x63, 0xAD, 0x2C, 0x00, 0x86, 0x8C,
48180x70, 0x02, 0xAB, 0x34, 0x74, 0x02, 0xB2, 0x34, 0x00, 0x00, 0x86, 0xAD,
48190x30, 0x00, 0x82, 0x8C, 0x78, 0x02, 0xA6, 0x34, 0x6C, 0x03, 0xAC, 0x34,
48200x00, 0x00, 0xA2, 0xAD, 0x34, 0x00, 0x83, 0x8C, 0x02, 0x80, 0x02, 0x3C,
48210x00, 0x00, 0xE3, 0xAC, 0x38, 0x00, 0x85, 0x8C, 0xE0, 0xC8, 0x47, 0x8C,
48220x00, 0x00, 0xC5, 0xAD, 0x3C, 0x00, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00,
48230x00, 0x00, 0x02, 0xAD, 0x40, 0x00, 0x83, 0x8C, 0x00, 0x00, 0x00, 0x00,
48240x00, 0x00, 0xE3, 0xAD, 0x44, 0x00, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00,
48250x00, 0x00, 0x42, 0xAD, 0x48, 0x00, 0x83, 0x8C, 0x00, 0x00, 0x00, 0x00,
48260x00, 0x00, 0x03, 0xAE, 0x4C, 0x00, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00,
48270x00, 0x00, 0x22, 0xAD, 0x50, 0x00, 0x83, 0x8C, 0x00, 0x00, 0x00, 0x00,
48280x00, 0x00, 0x23, 0xAE, 0x54, 0x00, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00,
48290x00, 0x00, 0x62, 0xAD, 0x58, 0x00, 0x83, 0x8C, 0x00, 0x00, 0x00, 0x00,
48300x00, 0x00, 0x43, 0xAE, 0x5C, 0x00, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00,
48310x00, 0x00, 0xC2, 0xAC, 0x21, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x82, 0xAD,
48320x01, 0x00, 0xE7, 0x24, 0x21, 0x10, 0xE0, 0x00, 0x01, 0x00, 0xE7, 0x24,
48330x00, 0x00, 0x82, 0xAD, 0x82, 0x38, 0x00, 0x08, 0x21, 0x10, 0xE0, 0x00,
48340x01, 0x80, 0x1B, 0x3C, 0x24, 0xE2, 0x7B, 0x27, 0x25, 0xB0, 0x1A, 0x3C,
48350x18, 0x03, 0x5A, 0x27, 0x00, 0x00, 0x5B, 0xAF, 0x21, 0xD8, 0xA0, 0x03,
48360x82, 0xDA, 0x1B, 0x00, 0x80, 0xDA, 0x1B, 0x00, 0x08, 0x00, 0x7B, 0x27,
48370x04, 0x00, 0x61, 0xAF, 0x08, 0x00, 0x62, 0xAF, 0x0C, 0x00, 0x63, 0xAF,
48380x10, 0x00, 0x64, 0xAF, 0x14, 0x00, 0x65, 0xAF, 0x18, 0x00, 0x66, 0xAF,
48390x1C, 0x00, 0x67, 0xAF, 0x20, 0x00, 0x68, 0xAF, 0x24, 0x00, 0x69, 0xAF,
48400x28, 0x00, 0x6A, 0xAF, 0x2C, 0x00, 0x6B, 0xAF, 0x30, 0x00, 0x6C, 0xAF,
48410x34, 0x00, 0x6D, 0xAF, 0x38, 0x00, 0x6E, 0xAF, 0x3C, 0x00, 0x6F, 0xAF,
48420x12, 0x40, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00, 0x00, 0x70, 0x0A, 0x40,
48430x40, 0x00, 0x70, 0xAF, 0x44, 0x00, 0x71, 0xAF, 0x48, 0x00, 0x72, 0xAF,
48440x4C, 0x00, 0x73, 0xAF, 0x50, 0x00, 0x74, 0xAF, 0x54, 0x00, 0x75, 0xAF,
48450x58, 0x00, 0x76, 0xAF, 0x5C, 0x00, 0x77, 0xAF, 0x60, 0x00, 0x78, 0xAF,
48460x64, 0x00, 0x79, 0xAF, 0x68, 0x00, 0x7C, 0xAF, 0x6C, 0x00, 0x7D, 0xAF,
48470x70, 0x00, 0x7E, 0xAF, 0x74, 0x00, 0x7F, 0xAF, 0x78, 0x00, 0x68, 0xAF,
48480x7C, 0x00, 0x69, 0xAF, 0x80, 0x00, 0x6A, 0xAF, 0x00, 0x68, 0x1A, 0x40,
48490x25, 0xB0, 0x1B, 0x3C, 0x1C, 0x03, 0x7B, 0x37, 0x00, 0x00, 0x00, 0x00,
48500x00, 0x00, 0x7A, 0xAF, 0x7F, 0x00, 0x5B, 0x33, 0x30, 0x00, 0x60, 0x13,
48510x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x1B, 0x3C, 0x30, 0x03, 0x7B, 0x37,
48520x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xAF, 0x00, 0x00, 0x00, 0x00,
48530x21, 0xD8, 0xA0, 0x03, 0x82, 0xDA, 0x1B, 0x00, 0x80, 0xDA, 0x1B, 0x00,
48540x08, 0x00, 0x7B, 0x27, 0x04, 0x00, 0x61, 0xAF, 0x08, 0x00, 0x62, 0xAF,
48550x0C, 0x00, 0x63, 0xAF, 0x10, 0x00, 0x64, 0xAF, 0x14, 0x00, 0x65, 0xAF,
48560x18, 0x00, 0x66, 0xAF, 0x1C, 0x00, 0x67, 0xAF, 0x20, 0x00, 0x68, 0xAF,
48570x24, 0x00, 0x69, 0xAF, 0x28, 0x00, 0x6A, 0xAF, 0x2C, 0x00, 0x6B, 0xAF,
48580x30, 0x00, 0x6C, 0xAF, 0x34, 0x00, 0x6D, 0xAF, 0x38, 0x00, 0x6E, 0xAF,
48590x3C, 0x00, 0x6F, 0xAF, 0x12, 0x40, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00,
48600x00, 0x70, 0x0A, 0x40, 0x40, 0x00, 0x70, 0xAF, 0x44, 0x00, 0x71, 0xAF,
48610x48, 0x00, 0x72, 0xAF, 0x4C, 0x00, 0x73, 0xAF, 0x50, 0x00, 0x74, 0xAF,
48620x54, 0x00, 0x75, 0xAF, 0x58, 0x00, 0x76, 0xAF, 0x5C, 0x00, 0x77, 0xAF,
48630x60, 0x00, 0x78, 0xAF, 0x64, 0x00, 0x79, 0xAF, 0x68, 0x00, 0x7C, 0xAF,
48640x6C, 0x00, 0x7D, 0xAF, 0x70, 0x00, 0x7E, 0xAF, 0x74, 0x00, 0x7F, 0xAF,
48650x78, 0x00, 0x68, 0xAF, 0x7C, 0x00, 0x69, 0xAF, 0x80, 0x00, 0x6A, 0xAF,
48660x17, 0x38, 0x00, 0x08, 0x21, 0x20, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00,
48670x25, 0xB0, 0x08, 0x3C, 0x20, 0x03, 0x08, 0x35, 0x00, 0x00, 0x00, 0x00,
48680x00, 0x00, 0x1A, 0xAD, 0x00, 0x04, 0x5B, 0x33, 0x0A, 0x00, 0x60, 0x13,
48690x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x08, 0x3C, 0xE0, 0xC7, 0x08, 0x25,
48700x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x1B, 0x3C, 0x24, 0x03, 0x7B, 0x37,
48710x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xAF, 0x09, 0xF8, 0x00, 0x01,
48720x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x5B, 0x33, 0x25, 0xB0, 0x08, 0x3C,
48730x28, 0x03, 0x08, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xAD,
48740x06, 0x00, 0x60, 0x13, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x08, 0x3C,
48750x30, 0xDC, 0x08, 0x25, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF8, 0x00, 0x01,
48760x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x1A, 0x3C, 0xB0, 0x5D, 0x5A, 0x27,
48770x04, 0x00, 0x5B, 0x97, 0x25, 0xB0, 0x08, 0x3C, 0x30, 0x03, 0x08, 0x35,
48780x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xAD, 0x18, 0x00, 0x60, 0x13,
48790x00, 0x00, 0x00, 0x00, 0x08, 0xE8, 0x9B, 0x27, 0x00, 0x00, 0x00, 0x00,
48800x04, 0x00, 0x61, 0x8F, 0xFC, 0x03, 0x70, 0x7B, 0x7C, 0x00, 0x62, 0x7B,
48810xBC, 0x00, 0x64, 0x7B, 0xFC, 0x00, 0x66, 0x7B, 0x3C, 0x01, 0x68, 0x7B,
48820x13, 0x00, 0x00, 0x02, 0x11, 0x00, 0x20, 0x02, 0x7C, 0x01, 0x6A, 0x7B,
48830xBC, 0x01, 0x6C, 0x7B, 0xFC, 0x01, 0x6E, 0x7B, 0x3C, 0x02, 0x70, 0x7B,
48840x7C, 0x02, 0x72, 0x7B, 0xBC, 0x02, 0x74, 0x7B, 0xFC, 0x02, 0x76, 0x7B,
48850x3C, 0x03, 0x78, 0x7B, 0x7C, 0x03, 0x7C, 0x7B, 0xBC, 0x03, 0x7E, 0x7B,
48860x80, 0x00, 0x7B, 0x8F, 0x74, 0x39, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
48870x21, 0xD8, 0xA0, 0x03, 0x82, 0xDA, 0x1B, 0x00, 0x80, 0xDA, 0x1B, 0x00,
48880x08, 0x00, 0x7B, 0x27, 0x08, 0x00, 0x5B, 0xAF, 0xFC, 0xEB, 0x9D, 0x27,
48890x00, 0x00, 0x4A, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x40, 0x11,
48900x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x08, 0x3C, 0x10, 0x5D, 0x08, 0x25,
48910x21, 0x48, 0x00, 0x00, 0x21, 0x58, 0x00, 0x00, 0x01, 0x00, 0x6B, 0x25,
48920x1A, 0x00, 0x40, 0x11, 0x24, 0x70, 0x4B, 0x01, 0x14, 0x00, 0xC0, 0x11,
48930x01, 0x00, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0xA3,
48940x26, 0x50, 0x4B, 0x01, 0x00, 0x00, 0x4A, 0xAF, 0x80, 0x80, 0x09, 0x00,
48950x21, 0x80, 0x08, 0x02, 0x00, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00,
48960x09, 0xF8, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x1B, 0x3C,
48970xFC, 0xE4, 0x7B, 0x27, 0x25, 0xB0, 0x1A, 0x3C, 0x18, 0x03, 0x5A, 0x27,
48980x00, 0x00, 0x5B, 0xAF, 0x02, 0x80, 0x1A, 0x3C, 0xB0, 0x5D, 0x5A, 0x27,
48990xE1, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x25,
49000x40, 0x58, 0x0B, 0x00, 0x37, 0x39, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
49010x02, 0x80, 0x1B, 0x3C, 0xB0, 0x5D, 0x7B, 0x27, 0x21, 0x60, 0x00, 0x00,
49020x04, 0x00, 0x6C, 0xA7, 0x08, 0x00, 0x7A, 0x8F, 0x00, 0x00, 0x00, 0x00,
49030xF8, 0xFF, 0x5A, 0x27, 0x00, 0x00, 0x5A, 0x8F, 0x00, 0x00, 0x00, 0x00,
49040x08, 0x00, 0x5A, 0x27, 0x84, 0x00, 0x44, 0x8F, 0x00, 0x00, 0x00, 0x00,
49050xF9, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x41, 0x8F,
49060xFC, 0x03, 0x50, 0x7B, 0x7C, 0x00, 0x42, 0x7B, 0xBC, 0x00, 0x44, 0x7B,
49070xFC, 0x00, 0x46, 0x7B, 0x3C, 0x01, 0x48, 0x7B, 0x13, 0x00, 0x00, 0x02,
49080x11, 0x00, 0x20, 0x02, 0x7C, 0x01, 0x4A, 0x7B, 0xBC, 0x01, 0x4C, 0x7B,
49090xFC, 0x01, 0x4E, 0x7B, 0x3C, 0x02, 0x50, 0x7B, 0x7C, 0x02, 0x52, 0x7B,
49100xBC, 0x02, 0x54, 0x7B, 0xFC, 0x02, 0x56, 0x7B, 0x3C, 0x03, 0x58, 0x7B,
49110x7C, 0x03, 0x5C, 0x7B, 0xBC, 0x03, 0x5E, 0x7B, 0x80, 0x00, 0x5B, 0x8F,
49120x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x60, 0x03, 0x10, 0x00, 0x00, 0x42,
49130x00, 0x60, 0x05, 0x40, 0x42, 0x28, 0x05, 0x00, 0x40, 0x28, 0x05, 0x00,
49140x00, 0x60, 0x85, 0x40, 0x04, 0x00, 0x81, 0xAC, 0x08, 0x00, 0x82, 0xAC,
49150x0C, 0x00, 0x83, 0xAC, 0x20, 0x00, 0x88, 0xAC, 0x24, 0x00, 0x89, 0xAC,
49160x28, 0x00, 0x8A, 0xAC, 0x2C, 0x00, 0x8B, 0xAC, 0x30, 0x00, 0x8C, 0xAC,
49170x34, 0x00, 0x8D, 0xAC, 0x38, 0x00, 0x8E, 0xAC, 0x3C, 0x00, 0x8F, 0xAC,
49180x12, 0x40, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00, 0x40, 0x00, 0x90, 0xAC,
49190x44, 0x00, 0x91, 0xAC, 0x48, 0x00, 0x92, 0xAC, 0x4C, 0x00, 0x93, 0xAC,
49200x50, 0x00, 0x94, 0xAC, 0x54, 0x00, 0x95, 0xAC, 0x58, 0x00, 0x96, 0xAC,
49210x5C, 0x00, 0x97, 0xAC, 0x60, 0x00, 0x98, 0xAC, 0x64, 0x00, 0x99, 0xAC,
49220x68, 0x00, 0x9C, 0xAC, 0x6C, 0x00, 0x9D, 0xAC, 0x70, 0x00, 0x9E, 0xAC,
49230x74, 0x00, 0x9F, 0xAC, 0x78, 0x00, 0x88, 0xAC, 0x7C, 0x00, 0x89, 0xAC,
49240x80, 0x00, 0x9F, 0xAC, 0xF8, 0xFF, 0x84, 0x24, 0x00, 0x00, 0x84, 0x8C,
49250x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x84, 0x24, 0x84, 0x00, 0x86, 0x8C,
49260x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00,
49270x21, 0xD8, 0x80, 0x00, 0x01, 0x00, 0xBA, 0x34, 0x04, 0x00, 0x61, 0x8F,
49280xFC, 0x03, 0x70, 0x7B, 0x7C, 0x00, 0x62, 0x7B, 0xBC, 0x00, 0x64, 0x7B,
49290xFC, 0x00, 0x66, 0x7B, 0x3C, 0x01, 0x68, 0x7B, 0x13, 0x00, 0x00, 0x02,
49300x11, 0x00, 0x20, 0x02, 0x7C, 0x01, 0x6A, 0x7B, 0xBC, 0x01, 0x6C, 0x7B,
49310xFC, 0x01, 0x6E, 0x7B, 0x3C, 0x02, 0x70, 0x7B, 0x7C, 0x02, 0x72, 0x7B,
49320xBC, 0x02, 0x74, 0x7B, 0xFC, 0x02, 0x76, 0x7B, 0x3C, 0x03, 0x78, 0x7B,
49330x7C, 0x03, 0x7C, 0x7B, 0xBC, 0x03, 0x7E, 0x7B, 0x80, 0x00, 0x7B, 0x8F,
49340x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x60, 0x03, 0x00, 0x60, 0x9A, 0x40,
49350x00, 0x60, 0x05, 0x40, 0x42, 0x28, 0x05, 0x00, 0x40, 0x28, 0x05, 0x00,
49360x00, 0x60, 0x85, 0x40, 0x04, 0x00, 0x81, 0xAC, 0x08, 0x00, 0x82, 0xAC,
49370x0C, 0x00, 0x83, 0xAC, 0x20, 0x00, 0x88, 0xAC, 0x24, 0x00, 0x89, 0xAC,
49380x28, 0x00, 0x8A, 0xAC, 0x2C, 0x00, 0x8B, 0xAC, 0x30, 0x00, 0x8C, 0xAC,
49390x34, 0x00, 0x8D, 0xAC, 0x38, 0x00, 0x8E, 0xAC, 0x3C, 0x00, 0x8F, 0xAC,
49400x12, 0x40, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00, 0x40, 0x00, 0x90, 0xAC,
49410x44, 0x00, 0x91, 0xAC, 0x48, 0x00, 0x92, 0xAC, 0x4C, 0x00, 0x93, 0xAC,
49420x50, 0x00, 0x94, 0xAC, 0x54, 0x00, 0x94, 0xAC, 0x58, 0x00, 0x96, 0xAC,
49430x5C, 0x00, 0x96, 0xAC, 0x60, 0x00, 0x98, 0xAC, 0x64, 0x00, 0x99, 0xAC,
49440x68, 0x00, 0x9C, 0xAC, 0x6C, 0x00, 0x9D, 0xAC, 0x70, 0x00, 0x9E, 0xAC,
49450x78, 0x00, 0x88, 0xAC, 0x7C, 0x00, 0x89, 0xAC, 0x80, 0x00, 0x9F, 0xAC,
49460x84, 0x00, 0x80, 0xAC, 0xF8, 0xFF, 0x84, 0x24, 0x00, 0x00, 0x84, 0x8C,
49470x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x84, 0x24, 0x84, 0x00, 0x86, 0x8C,
49480xFA, 0xFF, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0xD8, 0x80, 0x00,
49490x01, 0x00, 0xBA, 0x24, 0x04, 0x00, 0x61, 0x8F, 0xFC, 0x03, 0x70, 0x7B,
49500x7C, 0x00, 0x62, 0x7B, 0xBC, 0x00, 0x64, 0x7B, 0xFC, 0x00, 0x66, 0x7B,
49510x3C, 0x01, 0x68, 0x7B, 0x13, 0x00, 0x00, 0x02, 0x11, 0x00, 0x20, 0x02,
49520x7C, 0x01, 0x6A, 0x7B, 0xBC, 0x01, 0x6C, 0x7B, 0xFC, 0x01, 0x6E, 0x7B,
49530x3C, 0x02, 0x70, 0x7B, 0x7C, 0x02, 0x72, 0x7B, 0xBC, 0x02, 0x74, 0x7B,
49540xFC, 0x02, 0x76, 0x7B, 0x3C, 0x03, 0x78, 0x7B, 0x7C, 0x03, 0x7C, 0x7B,
49550xBC, 0x03, 0x7E, 0x7B, 0x80, 0x00, 0x7B, 0x8F, 0x08, 0x00, 0x60, 0x03,
49560x00, 0x60, 0x9A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49570x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49590x23, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x1B, 0x3C,
49600x00, 0x00, 0x7B, 0x27, 0x25, 0xB0, 0x1A, 0x3C, 0x18, 0x03, 0x5A, 0x27,
49610x00, 0x00, 0x5B, 0xAF, 0x00, 0x00, 0x05, 0x24, 0x03, 0x00, 0xA4, 0x24,
49620x00, 0xA0, 0x80, 0x40, 0x00, 0xA0, 0x84, 0x40, 0x01, 0x80, 0x04, 0x3C,
49630x40, 0x00, 0x84, 0x24, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
49640x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49650x01, 0x80, 0x1B, 0x3C, 0x40, 0x00, 0x7B, 0x27, 0x25, 0xB0, 0x1A, 0x3C,
49660x18, 0x03, 0x5A, 0x27, 0x00, 0x00, 0x5B, 0xAF, 0x02, 0x80, 0x1A, 0x3C,
49670x00, 0x00, 0x5A, 0x27, 0xFC, 0x03, 0x5D, 0x27, 0x02, 0x80, 0x1C, 0x3C,
49680x00, 0x18, 0x9C, 0x27, 0x00, 0xF0, 0x08, 0x3C, 0x00, 0x0C, 0x08, 0x35,
49690x00, 0x60, 0x88, 0x40, 0x02, 0x80, 0x04, 0x3C, 0x00, 0x00, 0x84, 0x24,
49700xFF, 0x7F, 0x05, 0x3C, 0xFF, 0xFF, 0xA5, 0x34, 0x24, 0x20, 0x85, 0x00,
49710x00, 0x20, 0x84, 0x4C, 0xFF, 0xFF, 0x05, 0x34, 0x21, 0x28, 0xA4, 0x00,
49720x00, 0x28, 0x85, 0x4C, 0x02, 0x80, 0x08, 0x3C, 0x00, 0x00, 0x08, 0x25,
49730x00, 0x00, 0x00, 0xAD, 0x03, 0x80, 0x09, 0x3C, 0x04, 0xDD, 0x29, 0x25,
49740x04, 0x00, 0x08, 0x25, 0xFE, 0xFF, 0x09, 0x15, 0x00, 0x00, 0x00, 0xAD,
49750x00, 0x80, 0x04, 0x3C, 0x00, 0x00, 0x84, 0x24, 0xFF, 0x7F, 0x05, 0x3C,
49760xFF, 0xFF, 0xA5, 0x34, 0x24, 0x20, 0x85, 0x00, 0x00, 0x00, 0x84, 0x4C,
49770xFF, 0xFF, 0x06, 0x34, 0x21, 0x30, 0xC4, 0x00, 0x24, 0x30, 0xC5, 0x00,
49780x00, 0x08, 0x86, 0x4C, 0x00, 0xA0, 0x04, 0x40, 0x10, 0x00, 0x84, 0x34,
49790x00, 0xA0, 0x84, 0x40, 0x01, 0x80, 0x1B, 0x3C, 0xEC, 0x00, 0x7B, 0x27,
49800x25, 0xB0, 0x1A, 0x3C, 0x18, 0x03, 0x5A, 0x27, 0x00, 0x00, 0x5B, 0xAF,
49810x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x04, 0x3C, 0x44, 0x00, 0x84, 0x34,
49820x00, 0x00, 0x85, 0x84, 0x20, 0x00, 0x06, 0x24, 0x25, 0x28, 0xA6, 0x00,
49830x00, 0x00, 0x85, 0xA4, 0x01, 0x80, 0x1B, 0x3C, 0x1C, 0x01, 0x7B, 0x27,
49840x25, 0xB0, 0x1A, 0x3C, 0x18, 0x03, 0x5A, 0x27, 0x00, 0x00, 0x5B, 0xAF,
49850x25, 0xB0, 0x04, 0x3C, 0x44, 0x00, 0x84, 0x34, 0x00, 0x00, 0x85, 0x8C,
49860x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xA5, 0x30, 0xFC, 0xFF, 0xA0, 0x10,
49870x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x07, 0x3C, 0xFF, 0xFF, 0xE7, 0x34,
49880x02, 0x80, 0x05, 0x3C, 0xC0, 0x5C, 0xA5, 0x24, 0xFF, 0xFF, 0xA5, 0x30,
49890x40, 0xB0, 0x04, 0x3C, 0x25, 0x28, 0xA4, 0x00, 0x24, 0x28, 0xA7, 0x00,
49900x21, 0x30, 0x00, 0x00, 0x43, 0xB0, 0x02, 0x3C, 0x00, 0x80, 0x04, 0x3C,
49910x40, 0x00, 0x84, 0x34, 0x00, 0x00, 0x45, 0xAC, 0x04, 0x00, 0x46, 0xAC,
49920x08, 0x00, 0x44, 0xAC, 0x5F, 0x67, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
49930x25, 0xB0, 0x02, 0x3C, 0x04, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0x8C,
49940x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x64, 0x30, 0x02, 0x1C, 0x03, 0x00,
49950x08, 0x00, 0x80, 0x10, 0x0F, 0x00, 0x63, 0x30, 0x01, 0x00, 0x02, 0x24,
49960x0C, 0x00, 0x62, 0x10, 0x03, 0x00, 0x02, 0x24, 0x0E, 0x00, 0x62, 0x10,
49970x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
49980x03, 0x00, 0x60, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x08, 0x00, 0xE0, 0x03,
49990xC3, 0x5C, 0x40, 0xA0, 0x01, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03,
50000xC3, 0x5C, 0x43, 0xA0, 0x02, 0x00, 0x03, 0x24, 0x02, 0x80, 0x02, 0x3C,
50010x08, 0x00, 0xE0, 0x03, 0xC3, 0x5C, 0x43, 0xA0, 0x04, 0x00, 0x03, 0x24,
50020x02, 0x80, 0x02, 0x3C, 0x08, 0x00, 0xE0, 0x03, 0xC3, 0x5C, 0x43, 0xA0,
50030x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x24,
50040xFF, 0xFF, 0x42, 0x24, 0xFF, 0xFF, 0x41, 0x04, 0xFF, 0xFF, 0x42, 0x24,
50050x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x42, 0x24, 0x00, 0x60, 0x02, 0x40,
50060x01, 0x00, 0x41, 0x34, 0x01, 0x00, 0x21, 0x38, 0x00, 0x60, 0x81, 0x40,
50070x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x82, 0xAC, 0x00, 0x00, 0x82, 0x8C,
50080x00, 0x00, 0x00, 0x00, 0x21, 0x18, 0x40, 0x00, 0x00, 0x60, 0x83, 0x40,
50090x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x82, 0xAC, 0x00, 0x60, 0x01, 0x40,
50100x01, 0x00, 0x21, 0x34, 0x00, 0x60, 0x81, 0x40, 0x08, 0x00, 0xE0, 0x03,
50110x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x40, 0x01, 0x00, 0x21, 0x34,
50120x01, 0x00, 0x21, 0x38, 0x00, 0x60, 0x81, 0x40, 0x08, 0x00, 0xE0, 0x03,
50130x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
50140x84, 0x02, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
50150x04, 0x00, 0x85, 0x8C, 0x00, 0xA0, 0x03, 0x3C, 0x01, 0x00, 0x02, 0x24,
50160x25, 0x28, 0xA3, 0x00, 0x00, 0x00, 0xA4, 0x8C, 0x08, 0x00, 0xE0, 0x03,
50170x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
50180xB4, 0x02, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
50190x04, 0x00, 0x82, 0x8C, 0x02, 0x00, 0x83, 0x94, 0x00, 0xA0, 0x07, 0x3C,
50200x25, 0x28, 0x47, 0x00, 0x00, 0x00, 0xA2, 0x8C, 0x10, 0x00, 0x02, 0x24,
50210x13, 0x00, 0x62, 0x10, 0x11, 0x00, 0x66, 0x28, 0x06, 0x00, 0xC0, 0x10,
50220x20, 0x00, 0x02, 0x24, 0x08, 0x00, 0x02, 0x24, 0x17, 0x00, 0x62, 0x10,
50230x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24,
50240xFD, 0xFF, 0x62, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x83, 0x8C,
50250x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0xAC, 0x04, 0x00, 0x82, 0x8C,
50260x00, 0x00, 0x00, 0x00, 0x25, 0x10, 0x47, 0x00, 0x00, 0x00, 0x42, 0x8C,
50270x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0x82, 0x8C,
50280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xA4, 0x04, 0x00, 0x83, 0x8C,
50290x00, 0x00, 0x00, 0x00, 0x25, 0x18, 0x67, 0x00, 0x00, 0x00, 0x62, 0x94,
50300x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0x82, 0x8C,
50310x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xA0, 0x04, 0x00, 0x83, 0x8C,
50320x00, 0x00, 0x00, 0x00, 0x25, 0x18, 0x67, 0x00, 0x00, 0x00, 0x62, 0x90,
50330x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24, 0x02, 0x80, 0x02, 0x3C,
50340x60, 0x1B, 0x47, 0x24, 0x24, 0x38, 0xE3, 0x90, 0xFF, 0xFF, 0xA5, 0x30,
50350x09, 0x00, 0xA3, 0x10, 0x21, 0x20, 0xC0, 0x00, 0x94, 0x38, 0xE2, 0x8C,
50360x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xC2, 0xAC, 0x9E, 0x38, 0xE3, 0x94,
50370x0E, 0x00, 0x02, 0x24, 0x14, 0x00, 0xC2, 0xAC, 0x17, 0x0A, 0x00, 0x08,
50380x0C, 0x00, 0xC3, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
50390xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF, 0x02, 0x80, 0x11, 0x3C,
50400x1C, 0x00, 0xBF, 0xAF, 0x18, 0x00, 0xB2, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
50410x60, 0x1B, 0x31, 0x26, 0x7C, 0x38, 0x30, 0x96, 0x02, 0x80, 0x02, 0x3C,
50420x01, 0x80, 0x03, 0x3C, 0x25, 0x80, 0x02, 0x02, 0x25, 0xB0, 0x02, 0x3C,
50430xB8, 0x03, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34, 0x60, 0x00, 0x04, 0x26,
50440x80, 0x00, 0x05, 0x26, 0x00, 0x00, 0x43, 0xAC, 0xC2, 0x1B, 0x00, 0x0C,
50450x03, 0x00, 0x06, 0x24, 0x21, 0x20, 0x00, 0x02, 0x21, 0x28, 0x00, 0x00,
50460xEC, 0x54, 0x00, 0x0C, 0x08, 0x00, 0x06, 0x24, 0x7C, 0x38, 0x22, 0x8E,
50470x0C, 0x00, 0x03, 0x24, 0x0C, 0x00, 0x43, 0xAE, 0x08, 0x00, 0x42, 0xAE,
50480x12, 0x00, 0x02, 0x24, 0x14, 0x00, 0x42, 0xAE, 0x21, 0x20, 0x40, 0x02,
50490x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
50500x10, 0x00, 0xB0, 0x8F, 0x17, 0x0A, 0x00, 0x08, 0x20, 0x00, 0xBD, 0x27,
50510x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
50520x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
50530x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0xD8, 0xFF, 0xBD, 0x27,
50540x18, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x1C, 0x00, 0xB1, 0xAF,
50550x20, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
50560x0D, 0x00, 0x03, 0x92, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x14,
50570x21, 0x88, 0x00, 0x00, 0x01, 0x00, 0x03, 0x24, 0x02, 0x80, 0x02, 0x3C,
50580xF0, 0x5D, 0x43, 0xA0, 0x0C, 0x00, 0x02, 0x92, 0x02, 0x80, 0x05, 0x3C,
50590x06, 0x5E, 0xA2, 0xA0, 0x00, 0x00, 0x04, 0x92, 0x05, 0x00, 0x02, 0x24,
50600xFF, 0x00, 0x83, 0x30, 0x41, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
50610x03, 0x00, 0x02, 0x24, 0x31, 0x00, 0x62, 0x10, 0xFF, 0x00, 0x84, 0x30,
50620x09, 0x00, 0x82, 0x2C, 0x25, 0x00, 0x40, 0x10, 0x02, 0x80, 0x10, 0x3C,
50630xEC, 0x5D, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x42, 0x30,
50640x21, 0x00, 0x82, 0x10, 0x00, 0x00, 0x00, 0x00, 0x99, 0x61, 0x00, 0x0C,
50650x00, 0x00, 0x00, 0x00, 0xEC, 0x5D, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00,
50660x37, 0x00, 0x40, 0x10, 0x02, 0x80, 0x03, 0x3C, 0x10, 0x37, 0x62, 0x94,
50670x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x30, 0x54, 0x00, 0x40, 0x10,
50680x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0x0E, 0x5E, 0x62, 0x90,
50690x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
50700x0E, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24,
50710x0E, 0x5E, 0x62, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0xEE, 0x5D, 0x62, 0x90,
50720x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x42, 0x30, 0x04, 0x00, 0x42, 0x28,
50730x06, 0x00, 0x40, 0x10, 0x04, 0x00, 0x04, 0x24, 0x4B, 0x2E, 0x00, 0x0C,
50740x01, 0x00, 0x05, 0x24, 0x5B, 0x41, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
50750x04, 0x00, 0x11, 0x24, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
50760x21, 0x10, 0x20, 0x02, 0x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
50770x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
50780x0B, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, 0x14,
50790x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0x01, 0x00, 0x02, 0x24,
50800x09, 0x5E, 0x62, 0xA0, 0x09, 0x5E, 0x63, 0x90, 0x02, 0x80, 0x02, 0x3C,
50810x0A, 0x5E, 0x43, 0xA0, 0x00, 0x00, 0x04, 0x92, 0x33, 0x41, 0x00, 0x08,
50820xFF, 0x00, 0x84, 0x30, 0x06, 0x5E, 0xA0, 0xA0, 0x0C, 0x00, 0x03, 0x92,
50830x02, 0x80, 0x02, 0x3C, 0x04, 0x5E, 0x43, 0xA0, 0x00, 0x00, 0x04, 0x92,
50840x30, 0x41, 0x00, 0x08, 0xFF, 0x00, 0x83, 0x30, 0x42, 0xB0, 0x06, 0x3C,
50850x00, 0x00, 0xC3, 0x90, 0xEF, 0xFF, 0x02, 0x24, 0x03, 0x00, 0xC7, 0x34,
50860x24, 0x18, 0x62, 0x00, 0x40, 0x00, 0x02, 0x24, 0x00, 0x00, 0xC3, 0xA0,
50870x0C, 0x00, 0x04, 0x24, 0x00, 0x00, 0xE2, 0xA0, 0x4B, 0x2E, 0x00, 0x0C,
50880x01, 0x00, 0x05, 0x24, 0x02, 0x80, 0x03, 0x3C, 0xC6, 0x5C, 0x62, 0x90,
50890x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0x30, 0x15, 0x00, 0x40, 0x14,
50900x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x24, 0x00, 0x02, 0x05, 0x3C,
50910xC1, 0x43, 0x00, 0x0C, 0x01, 0x00, 0x06, 0x24, 0x02, 0x80, 0x02, 0x3C,
50920x60, 0x1B, 0x42, 0x24, 0x2A, 0x1C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
50930xCA, 0xFF, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x3A, 0x44, 0x94,
50940x2A, 0x1C, 0x40, 0xA0, 0x00, 0xC0, 0x84, 0x24, 0xA3, 0x31, 0x00, 0x0C,
50950xFF, 0xFF, 0x84, 0x30, 0x5B, 0x41, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
50960x0E, 0x5E, 0x40, 0xA0, 0x5B, 0x41, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
50970xA8, 0x2D, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24, 0x89, 0x41, 0x00, 0x08,
50980x00, 0x08, 0x04, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
50990xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF, 0x02, 0x80, 0x11, 0x3C,
51000x10, 0x00, 0xB0, 0xAF, 0x60, 0x1B, 0x30, 0x26, 0xB0, 0x1B, 0x07, 0x96,
51010x18, 0x00, 0xBF, 0xAF, 0xFF, 0xFF, 0xE3, 0x30, 0x00, 0x01, 0x62, 0x30,
51020x0E, 0x00, 0x40, 0x10, 0x01, 0x00, 0x66, 0x30, 0x02, 0x80, 0x04, 0x3C,
51030xB4, 0x55, 0x84, 0x24, 0x03, 0x00, 0x05, 0x24, 0x1E, 0x00, 0xC0, 0x14,
51040x04, 0x00, 0x62, 0x30, 0x02, 0x00, 0x40, 0x10, 0xFB, 0xF6, 0xE3, 0x30,
51050xB0, 0x1B, 0x03, 0xA6, 0x87, 0x54, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
51060x25, 0xB0, 0x02, 0x3C, 0x4C, 0x00, 0x42, 0x34, 0x00, 0x00, 0x40, 0xA0,
51070x21, 0x20, 0x00, 0x00, 0x95, 0x0E, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00,
51080x25, 0xB0, 0x06, 0x3C, 0x48, 0x00, 0xC6, 0x34, 0x00, 0x00, 0xC5, 0x8C,
51090x60, 0x1B, 0x24, 0x26, 0x7B, 0xFF, 0x03, 0x3C, 0x18, 0x00, 0xBF, 0x8F,
51100x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0xFF, 0xFF, 0x63, 0x34,
51110x21, 0x10, 0x00, 0x00, 0x24, 0x28, 0xA3, 0x00, 0x20, 0x00, 0xBD, 0x27,
51120x00, 0x00, 0xC5, 0xAC, 0xBC, 0x40, 0x80, 0xAC, 0xE8, 0x39, 0x80, 0xAC,
51130x04, 0x3A, 0x80, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0xFC, 0x40, 0x80, 0xAC,
51140x1C, 0x4F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x1B, 0x02, 0x96,
51150x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x42, 0x30, 0x87, 0x54, 0x00, 0x0C,
51160xB0, 0x1B, 0x02, 0xA6, 0x25, 0xB0, 0x02, 0x3C, 0x4C, 0x00, 0x42, 0x34,
51170x00, 0x00, 0x40, 0xA0, 0xBB, 0x41, 0x00, 0x08, 0x21, 0x20, 0x00, 0x00,
51180x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51190x21, 0x10, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
51200x01, 0x00, 0x83, 0x90, 0x02, 0x80, 0x02, 0x3C, 0x21, 0x38, 0x80, 0x00,
51210x8C, 0x5B, 0x43, 0xAC, 0x01, 0x00, 0x84, 0x90, 0x00, 0x00, 0xE2, 0x90,
51220x02, 0x80, 0x06, 0x3C, 0xFF, 0x00, 0x85, 0x30, 0x80, 0x10, 0x02, 0x00,
51230x25, 0x28, 0xA2, 0x00, 0x88, 0xDE, 0xC6, 0x24, 0xFF, 0x00, 0x84, 0x30,
51240x00, 0x80, 0xA5, 0x34, 0x6F, 0x20, 0x00, 0x0C, 0x03, 0x00, 0xE7, 0x24,
51250x10, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51260x18, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
51270x02, 0x80, 0x03, 0x3C, 0x1C, 0x00, 0xBF, 0xAF, 0x10, 0x37, 0x62, 0x94,
51280x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x30, 0x00, 0x01, 0x42, 0x30,
51290x04, 0x00, 0x40, 0x10, 0x21, 0x80, 0x80, 0x00, 0x02, 0x80, 0x04, 0x3C,
51300x06, 0x00, 0x60, 0x14, 0x60, 0xE7, 0x84, 0x24, 0x1C, 0x00, 0xBF, 0x8F,
51310x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51320x20, 0x00, 0xBD, 0x27, 0x13, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
51330x06, 0x00, 0x07, 0x92, 0x07, 0x00, 0x02, 0x26, 0x21, 0x20, 0x00, 0x02,
51340x80, 0x38, 0x07, 0x00, 0x00, 0x80, 0xE7, 0x34, 0x05, 0x00, 0x05, 0x24,
51350x21, 0x30, 0x00, 0x00, 0x02, 0x54, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF,
51360x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00,
51370x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0x08, 0x00, 0xE0, 0x03,
51380x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
51390x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51400x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
51410x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51420x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
51430x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03,
51440x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24,
51450x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51460x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24,
51470x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51480x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
51490x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51500x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24,
51510x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51520x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
51530x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51540x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
51550x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51560x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
51570x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27,
51580x02, 0x80, 0x02, 0x3C, 0x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF,
51590x60, 0x1B, 0x45, 0x24, 0xFC, 0x40, 0xA3, 0x8C, 0x00, 0x00, 0x00, 0x00,
51600x06, 0x00, 0x60, 0x14, 0x21, 0x80, 0x80, 0x00, 0x14, 0x00, 0xBF, 0x8F,
51610x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51620x18, 0x00, 0xBD, 0x27, 0xF8, 0x40, 0xA2, 0x90, 0x00, 0x00, 0x00, 0x00,
51630x21, 0x10, 0x45, 0x00, 0xF0, 0x40, 0x40, 0xA0, 0x00, 0x00, 0x84, 0x8C,
51640xC3, 0x1A, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8E,
51650x03, 0x00, 0x04, 0x24, 0xD9, 0x12, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00,
51660x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00,
51670x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x84, 0x90,
51680x75, 0x0D, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51690x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
51700x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51710x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
51720x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51730x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
51740xD8, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x10, 0x3C,
51750x20, 0x00, 0xB2, 0xAF, 0x60, 0x1B, 0x02, 0x26, 0x24, 0x00, 0xBF, 0xAF,
51760x1C, 0x00, 0xB1, 0xAF, 0xB0, 0x1B, 0x45, 0x94, 0x21, 0x90, 0x80, 0x00,
51770x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C, 0x80, 0xE7, 0x84, 0x24,
51780x00, 0x00, 0x42, 0x96, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x43, 0x24,
51790x20, 0x00, 0x42, 0x24, 0xC2, 0x18, 0x03, 0x00, 0xC2, 0x28, 0x02, 0x00,
51800x07, 0x00, 0x42, 0x30, 0x02, 0x00, 0x40, 0x14, 0xC0, 0x20, 0x03, 0x00,
51810xC0, 0x20, 0x05, 0x00, 0x53, 0x21, 0x00, 0x0C, 0x60, 0x1B, 0x11, 0x26,
51820x02, 0x80, 0x05, 0x3C, 0x21, 0x38, 0x40, 0x00, 0x21, 0x80, 0x40, 0x00,
51830x0A, 0x00, 0x04, 0x24, 0x22, 0x00, 0x40, 0x10, 0x70, 0xE7, 0xA5, 0x24,
51840x02, 0x00, 0x46, 0x92, 0x10, 0x38, 0x25, 0x8E, 0x72, 0x01, 0x00, 0x0C,
51850x08, 0x00, 0xC6, 0x24, 0x5B, 0x01, 0x00, 0x0C, 0x0A, 0x00, 0x04, 0x24,
51860x08, 0x00, 0x02, 0x96, 0x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x04, 0x3C,
51870x25, 0x28, 0x45, 0x00, 0x74, 0x03, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C,
51880xB0, 0x55, 0x84, 0x24, 0x74, 0x21, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x02,
51890x31, 0x46, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xEC, 0x37, 0x26, 0x8E,
51900x58, 0x38, 0x25, 0x8E, 0x01, 0x00, 0x04, 0x24, 0x00, 0x01, 0x07, 0x24,
51910x01, 0x00, 0x02, 0x24, 0x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF,
51920x5B, 0x01, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24, 0x24, 0x00, 0xBF, 0x8F,
51930x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
51940x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
51950x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C, 0x18, 0xE7, 0x84, 0x24,
51960x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
51970x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
51980x28, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x82, 0x90, 0x02, 0x80, 0x03, 0x3C,
51990x60, 0x1B, 0x63, 0x24, 0x07, 0x00, 0x40, 0x10, 0x21, 0x20, 0x60, 0x00,
52000xD0, 0x07, 0x02, 0x24, 0x3C, 0x3A, 0x62, 0xAC, 0x01, 0x00, 0x03, 0x24,
52010x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x48, 0x41, 0x83, 0xA0,
52020x21, 0x10, 0x00, 0x00, 0x3C, 0x3A, 0x60, 0xAC, 0x08, 0x00, 0xE0, 0x03,
52030x48, 0x41, 0x60, 0xA0, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF,
52040x25, 0xB0, 0x10, 0x3C, 0x21, 0x28, 0x80, 0x00, 0x06, 0x00, 0x06, 0x24,
52050x14, 0x00, 0xBF, 0xAF, 0xF4, 0x54, 0x00, 0x0C, 0x50, 0x00, 0x04, 0x36,
52060x02, 0x80, 0x04, 0x3C, 0x50, 0x00, 0x05, 0x36, 0x48, 0x37, 0x84, 0x24,
52070xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x04, 0x3C,
52080x13, 0x58, 0x00, 0x0C, 0x94, 0xE7, 0x84, 0x24, 0x14, 0x00, 0xBF, 0x8F,
52090x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
52100x18, 0x00, 0xBD, 0x27, 0x25, 0xB0, 0x05, 0x3C, 0x01, 0x80, 0x03, 0x3C,
52110xE8, 0xFF, 0xBD, 0x27, 0x21, 0x30, 0x80, 0x00, 0x18, 0x03, 0xA2, 0x34,
52120xC0, 0x0B, 0x63, 0x24, 0x01, 0x00, 0x04, 0x24, 0x14, 0x00, 0xBF, 0xAF,
52130x10, 0x00, 0xB0, 0xAF, 0x00, 0x00, 0x43, 0xAC, 0x66, 0x00, 0xC4, 0x10,
52140x02, 0x80, 0x02, 0x3C, 0x09, 0x00, 0xC0, 0x10, 0x02, 0x00, 0x02, 0x24,
52150x36, 0x00, 0xC2, 0x10, 0x03, 0x00, 0x02, 0x24, 0x8B, 0x00, 0xC2, 0x10,
52160x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
52170x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C,
52180x60, 0x1B, 0x50, 0x24, 0x70, 0x08, 0x02, 0x24, 0x34, 0x1C, 0x02, 0xAE,
52190xE0, 0x08, 0x03, 0x24, 0x40, 0x08, 0x02, 0x24, 0x38, 0x1C, 0x03, 0xAE,
52200x44, 0x1C, 0x02, 0xAE, 0x78, 0x08, 0x03, 0x24, 0x0C, 0x08, 0x02, 0x24,
52210x48, 0x1C, 0x03, 0xAE, 0x4C, 0x1C, 0x02, 0xAE, 0x10, 0x08, 0x03, 0x24,
52220x20, 0x08, 0x02, 0x24, 0x50, 0x1C, 0x03, 0xAE, 0x54, 0x1C, 0x02, 0xAE,
52230x24, 0x08, 0x03, 0x24, 0x58, 0x08, 0x02, 0x24, 0x58, 0x1C, 0x03, 0xAE,
52240x5C, 0x1C, 0x02, 0xAE, 0x50, 0x0C, 0x03, 0x24, 0x54, 0x0C, 0x02, 0x24,
52250x60, 0x1C, 0x03, 0xAE, 0x64, 0x1C, 0x02, 0xAE, 0x14, 0x0C, 0x03, 0x24,
52260x10, 0x0C, 0x02, 0x24, 0x20, 0x08, 0xA4, 0x34, 0x68, 0x1C, 0x03, 0xAE,
52270x60, 0x08, 0x05, 0x24, 0x6C, 0x1C, 0x02, 0xAE, 0x80, 0x0C, 0x03, 0x24,
52280x84, 0x0C, 0x02, 0x24, 0x40, 0x1C, 0x05, 0xAE, 0x70, 0x1C, 0x03, 0xAE,
52290x74, 0x1C, 0x02, 0xAE, 0x31, 0x1C, 0x00, 0xA2, 0xFA, 0x5B, 0x00, 0x0C,
52300x3C, 0x1C, 0x05, 0xAE, 0x00, 0x01, 0x42, 0x30, 0x31, 0x00, 0x40, 0x14,
52310xB8, 0x08, 0x02, 0x24, 0xA0, 0x08, 0x02, 0x24, 0x78, 0x1C, 0x02, 0xAE,
52320x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
52330x18, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
52340xA8, 0x08, 0x03, 0x24, 0x78, 0x1C, 0x43, 0xAC, 0x74, 0x08, 0x03, 0x24,
52350xE4, 0x08, 0x04, 0x24, 0x34, 0x1C, 0x43, 0xAC, 0x48, 0x08, 0x03, 0x24,
52360x38, 0x1C, 0x44, 0xAC, 0x44, 0x1C, 0x43, 0xAC, 0x7C, 0x08, 0x04, 0x24,
52370x0C, 0x08, 0x03, 0x24, 0x48, 0x1C, 0x44, 0xAC, 0x4C, 0x1C, 0x43, 0xAC,
52380x18, 0x08, 0x04, 0x24, 0x30, 0x08, 0x03, 0x24, 0x50, 0x1C, 0x44, 0xAC,
52390x54, 0x1C, 0x43, 0xAC, 0x34, 0x08, 0x04, 0x24, 0x5C, 0x08, 0x03, 0x24,
52400x58, 0x1C, 0x44, 0xAC, 0x5C, 0x1C, 0x43, 0xAC, 0x60, 0x0C, 0x04, 0x24,
52410x64, 0x0C, 0x03, 0x24, 0x60, 0x1C, 0x44, 0xAC, 0x64, 0x1C, 0x43, 0xAC,
52420x24, 0x0C, 0x04, 0x24, 0x20, 0x0C, 0x03, 0x24, 0x68, 0x08, 0x05, 0x24,
52430x68, 0x1C, 0x44, 0xAC, 0x6C, 0x1C, 0x43, 0xAC, 0x90, 0x0C, 0x04, 0x24,
52440x94, 0x0C, 0x03, 0x24, 0x31, 0x1C, 0x46, 0xA0, 0x40, 0x1C, 0x45, 0xAC,
52450x70, 0x1C, 0x44, 0xAC, 0x74, 0x1C, 0x43, 0xAC, 0x3C, 0x1C, 0x45, 0xAC,
52460x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
52470x18, 0x00, 0xBD, 0x27, 0x31, 0x43, 0x00, 0x08, 0x78, 0x1C, 0x02, 0xAE,
52480x60, 0x1B, 0x50, 0x24, 0x70, 0x08, 0x02, 0x24, 0x34, 0x1C, 0x02, 0xAE,
52490xE0, 0x08, 0x03, 0x24, 0x44, 0x08, 0x02, 0x24, 0x38, 0x1C, 0x03, 0xAE,
52500x44, 0x1C, 0x02, 0xAE, 0x78, 0x08, 0x03, 0x24, 0x0C, 0x08, 0x02, 0x24,
52510x48, 0x1C, 0x03, 0xAE, 0x4C, 0x1C, 0x02, 0xAE, 0x14, 0x08, 0x03, 0x24,
52520x28, 0x08, 0x02, 0x24, 0x50, 0x1C, 0x03, 0xAE, 0x54, 0x1C, 0x02, 0xAE,
52530x2C, 0x08, 0x03, 0x24, 0x58, 0x08, 0x02, 0x24, 0x58, 0x1C, 0x03, 0xAE,
52540x5C, 0x1C, 0x02, 0xAE, 0x58, 0x0C, 0x03, 0x24, 0x5C, 0x0C, 0x02, 0x24,
52550x60, 0x1C, 0x03, 0xAE, 0x64, 0x1C, 0x02, 0xAE, 0x1C, 0x0C, 0x03, 0x24,
52560x18, 0x0C, 0x02, 0x24, 0x28, 0x08, 0xA4, 0x34, 0x68, 0x1C, 0x03, 0xAE,
52570x64, 0x08, 0x05, 0x24, 0x6C, 0x1C, 0x02, 0xAE, 0x88, 0x0C, 0x03, 0x24,
52580x8C, 0x0C, 0x02, 0x24, 0x31, 0x1C, 0x06, 0xA2, 0x40, 0x1C, 0x05, 0xAE,
52590x70, 0x1C, 0x03, 0xAE, 0x74, 0x1C, 0x02, 0xAE, 0xFA, 0x5B, 0x00, 0x0C,
52600x3C, 0x1C, 0x05, 0xAE, 0x00, 0x01, 0x42, 0x30, 0x2B, 0x00, 0x40, 0x14,
52610xBC, 0x08, 0x02, 0x24, 0xA4, 0x08, 0x02, 0x24, 0x31, 0x43, 0x00, 0x08,
52620x78, 0x1C, 0x02, 0xAE, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
52630xAC, 0x08, 0x03, 0x24, 0x78, 0x1C, 0x43, 0xAC, 0x74, 0x08, 0x03, 0x24,
52640xE4, 0x08, 0x04, 0x24, 0x34, 0x1C, 0x43, 0xAC, 0x4C, 0x08, 0x03, 0x24,
52650x38, 0x1C, 0x44, 0xAC, 0x44, 0x1C, 0x43, 0xAC, 0x7C, 0x08, 0x04, 0x24,
52660x0C, 0x08, 0x03, 0x24, 0x48, 0x1C, 0x44, 0xAC, 0x4C, 0x1C, 0x43, 0xAC,
52670x1C, 0x08, 0x04, 0x24, 0x38, 0x08, 0x03, 0x24, 0x50, 0x1C, 0x44, 0xAC,
52680x54, 0x1C, 0x43, 0xAC, 0x3C, 0x08, 0x04, 0x24, 0x5C, 0x08, 0x03, 0x24,
52690x58, 0x1C, 0x44, 0xAC, 0x5C, 0x1C, 0x43, 0xAC, 0x68, 0x0C, 0x04, 0x24,
52700x6C, 0x0C, 0x03, 0x24, 0x60, 0x1C, 0x44, 0xAC, 0x64, 0x1C, 0x43, 0xAC,
52710x2C, 0x0C, 0x04, 0x24, 0x28, 0x0C, 0x03, 0x24, 0x6C, 0x08, 0x05, 0x24,
52720x68, 0x1C, 0x44, 0xAC, 0x6C, 0x1C, 0x43, 0xAC, 0x98, 0x0C, 0x04, 0x24,
52730x9C, 0x0C, 0x03, 0x24, 0x31, 0x1C, 0x46, 0xA0, 0x40, 0x1C, 0x45, 0xAC,
52740x70, 0x1C, 0x44, 0xAC, 0x74, 0x1C, 0x43, 0xAC, 0x5B, 0x43, 0x00, 0x08,
52750x3C, 0x1C, 0x45, 0xAC, 0x31, 0x43, 0x00, 0x08, 0x78, 0x1C, 0x02, 0xAE,
52760xBA, 0x43, 0x00, 0x08, 0x21, 0x18, 0x00, 0x00, 0x20, 0x00, 0x62, 0x2C,
52770x06, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x64, 0x00,
52780x01, 0x00, 0x42, 0x30, 0xFA, 0xFF, 0x40, 0x10, 0x01, 0x00, 0x63, 0x24,
52790xFF, 0xFF, 0x63, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
52800xD8, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF, 0xFF, 0xFF, 0x02, 0x24,
52810x21, 0x88, 0xA0, 0x00, 0x1C, 0x00, 0xB3, 0xAF, 0x18, 0x00, 0xB2, 0xAF,
52820x20, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0x90, 0xC0, 0x00,
52830x21, 0x28, 0xC0, 0x00, 0x0B, 0x00, 0x22, 0x12, 0x21, 0x98, 0x80, 0x00,
52840x26, 0x5C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x20, 0x02,
52850xB5, 0x43, 0x00, 0x0C, 0x21, 0x80, 0x40, 0x00, 0x27, 0x28, 0x11, 0x00,
52860x24, 0x28, 0xB0, 0x00, 0x04, 0x10, 0x52, 0x00, 0x25, 0x28, 0xA2, 0x00,
52870x21, 0x20, 0x60, 0x02, 0x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
52880x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
52890x03, 0x5C, 0x00, 0x08, 0x28, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C,
52900x21, 0x30, 0x80, 0x00, 0xA4, 0x37, 0x44, 0x8C, 0xC1, 0x43, 0x00, 0x08,
52910xFF, 0xFF, 0x05, 0x24, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xBF, 0xAF,
52920x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x26, 0x5C, 0x00, 0x0C,
52930x21, 0x88, 0xA0, 0x00, 0x21, 0x80, 0x40, 0x00, 0xB5, 0x43, 0x00, 0x0C,
52940x21, 0x20, 0x20, 0x02, 0x24, 0x80, 0x11, 0x02, 0x06, 0x10, 0x50, 0x00,
52950x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
52960x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27,
52970x18, 0x00, 0xB2, 0xAF, 0x02, 0x80, 0x12, 0x3C, 0x60, 0x1B, 0x52, 0x26,
52980x14, 0x00, 0xB1, 0xAF, 0x21, 0x88, 0x80, 0x00, 0x24, 0x08, 0x04, 0x24,
52990x24, 0x00, 0xBF, 0xAF, 0x20, 0x00, 0xB4, 0xAF, 0x1C, 0x00, 0xB3, 0xAF,
53000x26, 0x5C, 0x00, 0x0C, 0x10, 0x00, 0xB0, 0xAF, 0x58, 0x1C, 0x44, 0x8E,
53010x21, 0xA0, 0x40, 0x00, 0x26, 0x5C, 0x00, 0x0C, 0xC0, 0x8D, 0x11, 0x00,
53020xFF, 0x7F, 0x05, 0x3C, 0x7F, 0x80, 0x03, 0x3C, 0xFF, 0xFF, 0xA5, 0x34,
53030xFF, 0xFF, 0x63, 0x34, 0x24, 0x28, 0x85, 0x02, 0x24, 0x08, 0x04, 0x24,
53040x03, 0x5C, 0x00, 0x0C, 0x24, 0x80, 0x43, 0x00, 0x2C, 0x1F, 0x00, 0x0C,
53050x01, 0x00, 0x04, 0x24, 0x00, 0x80, 0x13, 0x3C, 0x58, 0x1C, 0x44, 0x8E,
53060x25, 0x80, 0x11, 0x02, 0x25, 0x80, 0x13, 0x02, 0x03, 0x5C, 0x00, 0x0C,
53070x21, 0x28, 0x00, 0x02, 0x2C, 0x1F, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24,
53080x25, 0x28, 0x93, 0x02, 0x03, 0x5C, 0x00, 0x0C, 0x24, 0x08, 0x04, 0x24,
53090x2C, 0x1F, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24, 0x78, 0x1C, 0x44, 0x8E,
53100x0F, 0x00, 0x05, 0x3C, 0x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB4, 0x8F,
53110x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
53120x10, 0x00, 0xB0, 0x8F, 0xFF, 0xFF, 0xA5, 0x34, 0xE3, 0x43, 0x00, 0x08,
53130x28, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF,
53140x02, 0x80, 0x11, 0x3C, 0x10, 0x00, 0xB0, 0xAF, 0x18, 0x00, 0xBF, 0xAF,
53150x60, 0x1B, 0x27, 0x26, 0x33, 0x1C, 0xE5, 0x90, 0x01, 0x80, 0x03, 0x3C,
53160x25, 0xB0, 0x02, 0x3C, 0x94, 0x10, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34,
53170x02, 0x00, 0x06, 0x24, 0x00, 0x00, 0x43, 0xAC, 0x34, 0x00, 0xA6, 0x10,
53180x21, 0x80, 0x80, 0x00, 0x03, 0x00, 0x03, 0x24, 0x3A, 0x00, 0xA3, 0x10,
53190x2E, 0x00, 0x02, 0x2E, 0x10, 0x00, 0x02, 0x2E, 0x07, 0x00, 0x40, 0x10,
53200x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x04, 0x32, 0x18, 0x00, 0xBF, 0x8F,
53210x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0xF3, 0x43, 0x00, 0x08,
53220x20, 0x00, 0xBD, 0x27, 0xFA, 0xFF, 0xA6, 0x14, 0xFF, 0x00, 0x04, 0x32,
53230x31, 0x1C, 0xE4, 0x90, 0x01, 0x00, 0x02, 0x24, 0x33, 0x00, 0x82, 0x10,
53240x02, 0x00, 0x82, 0x28, 0x38, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
53250x38, 0x00, 0x85, 0x10, 0x60, 0x1B, 0x22, 0x26, 0x2E, 0x00, 0x83, 0x10,
53260x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x24, 0xE3, 0x43, 0x00, 0x0C,
53270xFF, 0xFF, 0x05, 0x24, 0xFF, 0xFC, 0x06, 0x3C, 0xFF, 0xFF, 0xC6, 0x34,
53280x24, 0x30, 0x46, 0x00, 0x00, 0x08, 0x04, 0x24, 0xC1, 0x43, 0x00, 0x0C,
53290xFF, 0xFF, 0x05, 0x24, 0x60, 0x1B, 0x22, 0x26, 0x31, 0x1C, 0x44, 0x90,
53300x01, 0x00, 0x03, 0x24, 0x07, 0x00, 0x83, 0x10, 0x02, 0x00, 0x82, 0x28,
53310x2C, 0x00, 0x40, 0x14, 0x02, 0x00, 0x02, 0x24, 0x2C, 0x00, 0x82, 0x10,
53320x03, 0x00, 0x02, 0x24, 0xDB, 0xFF, 0x82, 0x14, 0x00, 0x00, 0x00, 0x00,
53330x60, 0x1B, 0x22, 0x26, 0x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x3C,
53340xC1, 0x43, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00, 0x3B, 0x44, 0x00, 0x08,
53350xFF, 0x00, 0x04, 0x32, 0x25, 0x00, 0x82, 0x2C, 0xCC, 0xFF, 0x40, 0x14,
53360x03, 0x00, 0x03, 0x24, 0x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
53370x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
53380x20, 0x00, 0xBD, 0x27, 0xC7, 0xFF, 0x40, 0x14, 0x10, 0x00, 0x02, 0x2E,
53390x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
53400x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
53410x60, 0x1B, 0x22, 0x26, 0x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x3C,
53420xC1, 0x43, 0x00, 0x0C, 0x0F, 0x00, 0x06, 0x24, 0x4D, 0x44, 0x00, 0x08,
53430x00, 0x08, 0x04, 0x24, 0xCC, 0xFF, 0x80, 0x14, 0x60, 0x1B, 0x22, 0x26,
53440x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C,
53450x0F, 0x00, 0x06, 0x24, 0x4D, 0x44, 0x00, 0x08, 0x00, 0x08, 0x04, 0x24,
53460xB2, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x22, 0x26,
53470x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C,
53480x21, 0x30, 0x00, 0x00, 0x3B, 0x44, 0x00, 0x08, 0xFF, 0x00, 0x04, 0x32,
53490xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF, 0x02, 0x80, 0x11, 0x3C,
53500x60, 0x1B, 0x28, 0x26, 0x33, 0x1C, 0x06, 0x91, 0x01, 0x80, 0x03, 0x3C,
53510x25, 0xB0, 0x02, 0x3C, 0x40, 0x12, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34,
53520x02, 0x00, 0x07, 0x24, 0x18, 0x00, 0xB2, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
53530x1C, 0x00, 0xBF, 0xAF, 0x00, 0x00, 0x43, 0xAC, 0x21, 0x90, 0xA0, 0x00,
53540x39, 0x00, 0xC7, 0x10, 0xFF, 0x00, 0x90, 0x30, 0x03, 0x00, 0x03, 0x24,
53550x3F, 0x00, 0xC3, 0x10, 0x2E, 0x00, 0x02, 0x2E, 0x10, 0x00, 0x02, 0x2E,
53560x0C, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x04, 0x3C,
53570xFF, 0xFF, 0x84, 0x34, 0x24, 0x20, 0x44, 0x02, 0x00, 0x15, 0x10, 0x00,
53580x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
53590x10, 0x00, 0xB0, 0x8F, 0x25, 0x20, 0x44, 0x00, 0xDE, 0x43, 0x00, 0x08,
53600x20, 0x00, 0xBD, 0x27, 0xF5, 0xFF, 0xC7, 0x14, 0x0F, 0x00, 0x04, 0x3C,
53610x31, 0x1C, 0x04, 0x91, 0x01, 0x00, 0x02, 0x24, 0x33, 0x00, 0x82, 0x10,
53620x02, 0x00, 0x82, 0x28, 0x38, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
53630x38, 0x00, 0x86, 0x10, 0x60, 0x1B, 0x22, 0x26, 0x2E, 0x00, 0x83, 0x10,
53640x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x24, 0xE3, 0x43, 0x00, 0x0C,
53650xFF, 0xFF, 0x05, 0x24, 0xFF, 0xFC, 0x06, 0x3C, 0xFF, 0xFF, 0xC6, 0x34,
53660x24, 0x30, 0x46, 0x00, 0x00, 0x08, 0x04, 0x24, 0xC1, 0x43, 0x00, 0x0C,
53670xFF, 0xFF, 0x05, 0x24, 0x60, 0x1B, 0x22, 0x26, 0x31, 0x1C, 0x44, 0x90,
53680x01, 0x00, 0x03, 0x24, 0x07, 0x00, 0x83, 0x10, 0x02, 0x00, 0x82, 0x28,
53690x2C, 0x00, 0x40, 0x14, 0x02, 0x00, 0x02, 0x24, 0x2C, 0x00, 0x82, 0x10,
53700x03, 0x00, 0x02, 0x24, 0xD6, 0xFF, 0x82, 0x14, 0x00, 0x00, 0x00, 0x00,
53710x60, 0x1B, 0x22, 0x26, 0x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x3C,
53720xC1, 0x43, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00, 0xA8, 0x44, 0x00, 0x08,
53730x0F, 0x00, 0x04, 0x3C, 0x25, 0x00, 0x02, 0x2E, 0xC7, 0xFF, 0x40, 0x14,
53740x03, 0x00, 0x03, 0x24, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
53750x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
53760x20, 0x00, 0xBD, 0x27, 0xC1, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
53770x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
53780x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
53790x60, 0x1B, 0x22, 0x26, 0x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x3C,
53800xC1, 0x43, 0x00, 0x0C, 0x0F, 0x00, 0x06, 0x24, 0xBF, 0x44, 0x00, 0x08,
53810x00, 0x08, 0x04, 0x24, 0xCC, 0xFF, 0x80, 0x14, 0x60, 0x1B, 0x22, 0x26,
53820x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C,
53830x0F, 0x00, 0x06, 0x24, 0xBF, 0x44, 0x00, 0x08, 0x00, 0x08, 0x04, 0x24,
53840xAD, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x22, 0x26,
53850x34, 0x1C, 0x44, 0x8C, 0x0F, 0x00, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C,
53860x21, 0x30, 0x00, 0x00, 0xA8, 0x44, 0x00, 0x08, 0x0F, 0x00, 0x04, 0x3C,
53870xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00,
53880x14, 0x00, 0xBF, 0xAF, 0xF3, 0x43, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00,
53890x40, 0x01, 0x44, 0x34, 0x21, 0x18, 0x40, 0x00, 0x1F, 0x00, 0x02, 0x2E,
53900x00, 0x23, 0x04, 0x00, 0x10, 0x00, 0x40, 0x10, 0x10, 0x00, 0x05, 0x2E,
53910x00, 0x01, 0x64, 0x34, 0x06, 0x00, 0xA0, 0x10, 0x00, 0x23, 0x04, 0x00,
53920x21, 0x10, 0x00, 0x02, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
53930x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xDE, 0x43, 0x00, 0x0C,
53940xF1, 0xFF, 0x10, 0x26, 0x21, 0x10, 0x00, 0x02, 0x14, 0x00, 0xBF, 0x8F,
53950x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
53960xDE, 0x43, 0x00, 0x0C, 0xE2, 0xFF, 0x10, 0x26, 0x21, 0x10, 0x00, 0x02,
53970x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
53980x18, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27, 0x25, 0xB0, 0x02, 0x3C,
53990x18, 0x00, 0xBF, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
54000x21, 0x20, 0x82, 0x00, 0x00, 0x00, 0x90, 0x8C, 0x21, 0x88, 0xA0, 0x00,
54010xB5, 0x43, 0x00, 0x0C, 0x21, 0x20, 0xA0, 0x00, 0x24, 0x80, 0x11, 0x02,
54020x06, 0x10, 0x50, 0x00, 0x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
54030x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
54040xD8, 0xFF, 0xBD, 0x27, 0x25, 0xB0, 0x02, 0x3C, 0x18, 0x00, 0xB2, 0xAF,
54050x21, 0x90, 0x82, 0x00, 0xFF, 0xFF, 0x02, 0x24, 0x1C, 0x00, 0xB3, 0xAF,
54060x14, 0x00, 0xB1, 0xAF, 0x20, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
54070x21, 0x88, 0xA0, 0x00, 0x21, 0x20, 0xA0, 0x00, 0x21, 0x18, 0x40, 0x02,
54080x10, 0x00, 0xA2, 0x10, 0x21, 0x98, 0xC0, 0x00, 0x00, 0x00, 0x50, 0x8E,
54090xB5, 0x43, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x27, 0x18, 0x11, 0x00,
54100x24, 0x18, 0x70, 0x00, 0x04, 0x10, 0x53, 0x00, 0x25, 0x18, 0x62, 0x00,
54110x00, 0x00, 0x43, 0xAE, 0x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
54120x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
54130x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27, 0x20, 0x00, 0xBF, 0x8F,
54140x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
54150x10, 0x00, 0xB0, 0x8F, 0x28, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x66, 0xAC,
54160x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x02, 0x3C,
54170x21, 0x38, 0x82, 0x00, 0xFF, 0xFF, 0x02, 0x24, 0x27, 0x40, 0x05, 0x00,
54180x08, 0x00, 0xA2, 0x10, 0x24, 0x18, 0xC5, 0x00, 0x00, 0x00, 0xE2, 0x8C,
54190x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x02, 0x01, 0x25, 0x10, 0x43, 0x00,
54200x00, 0x00, 0xE2, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
54210x00, 0x00, 0xE6, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
54220xE0, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF, 0xFF, 0xFF, 0x02, 0x24,
54230x21, 0x80, 0xA0, 0x00, 0x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
54240x1C, 0x00, 0xBF, 0xAF, 0x21, 0x88, 0xC0, 0x00, 0x21, 0x28, 0xC0, 0x00,
54250x08, 0x00, 0x02, 0x12, 0x21, 0x90, 0x80, 0x00, 0x26, 0x5C, 0x00, 0x0C,
54260x00, 0x00, 0x00, 0x00, 0x27, 0x28, 0x10, 0x00, 0x24, 0x28, 0xA2, 0x00,
54270x24, 0x10, 0x30, 0x02, 0x25, 0x28, 0xA2, 0x00, 0x21, 0x20, 0x40, 0x02,
54280x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
54290x10, 0x00, 0xB0, 0x8F, 0x03, 0x5C, 0x00, 0x08, 0x20, 0x00, 0xBD, 0x27,
54300x01, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x03, 0x3C, 0xD0, 0xFF, 0xBD, 0x27,
54310x0C, 0x16, 0x42, 0x24, 0x18, 0x03, 0x63, 0x34, 0x20, 0x00, 0xB2, 0xAF,
54320x00, 0x00, 0x62, 0xAC, 0x21, 0x90, 0x80, 0x00, 0x10, 0x00, 0xA4, 0x27,
54330x24, 0x00, 0xB3, 0xAF, 0x1C, 0x00, 0xB1, 0xAF, 0x21, 0x98, 0xC0, 0x00,
54340x21, 0x88, 0xA0, 0x00, 0x28, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
54350x18, 0x00, 0xB0, 0xAF, 0x0F, 0x00, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
54360x21, 0x20, 0x40, 0x02, 0x0A, 0x00, 0x22, 0x12, 0x21, 0x28, 0x60, 0x02,
54370x25, 0x44, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x20, 0x02,
54380xB5, 0x43, 0x00, 0x0C, 0x21, 0x80, 0x40, 0x00, 0x27, 0x28, 0x11, 0x00,
54390x24, 0x28, 0xB0, 0x00, 0x04, 0x10, 0x53, 0x00, 0x25, 0x28, 0xA2, 0x00,
54400x90, 0x44, 0x00, 0x0C, 0xFF, 0x00, 0x44, 0x32, 0x90, 0x40, 0x00, 0x0C,
54410x10, 0x00, 0xA4, 0x27, 0x28, 0x00, 0xBF, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
54420x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
54430x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27, 0x01, 0x80, 0x03, 0x3C,
54440x25, 0xB0, 0x02, 0x3C, 0xB0, 0x16, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34,
54450xE0, 0xFF, 0xBD, 0x27, 0x00, 0x00, 0x43, 0xAC, 0x18, 0x00, 0xBF, 0xAF,
54460x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x25, 0x44, 0x00, 0x0C,
54470x21, 0x88, 0xA0, 0x00, 0x21, 0x80, 0x40, 0x00, 0xB5, 0x43, 0x00, 0x0C,
54480x21, 0x20, 0x20, 0x02, 0x24, 0x80, 0x11, 0x02, 0x06, 0x10, 0x50, 0x00,
54490x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
54500x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xD0, 0xFF, 0xBD, 0x27,
54510x24, 0x00, 0xB5, 0xAF, 0xFF, 0x00, 0x84, 0x30, 0x21, 0xA8, 0xC0, 0x00,
54520x28, 0x00, 0xB6, 0xAF, 0x1C, 0x00, 0xB3, 0xAF, 0x2C, 0x00, 0xBF, 0xAF,
54530x20, 0x00, 0xB4, 0xAF, 0x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
54540x10, 0x00, 0xB0, 0xAF, 0x21, 0xB0, 0xA0, 0x00, 0xF0, 0x42, 0x00, 0x0C,
54550x21, 0x98, 0x00, 0x00, 0x21, 0x00, 0xA0, 0x16, 0x80, 0x10, 0x13, 0x00,
54560xFF, 0x45, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x02, 0x24,
54570x23, 0x00, 0x02, 0x12, 0x05, 0x00, 0x04, 0x24, 0xFC, 0x00, 0x02, 0x24,
54580x37, 0x00, 0x02, 0x12, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x00, 0x02, 0x24,
54590x30, 0x00, 0x02, 0x12, 0x32, 0x00, 0x04, 0x24, 0xFA, 0x00, 0x02, 0x24,
54600x2D, 0x00, 0x02, 0x12, 0x05, 0x00, 0x04, 0x24, 0xF9, 0x00, 0x02, 0x24,
54610x29, 0x00, 0x02, 0x12, 0x0F, 0x00, 0x05, 0x3C, 0x04, 0x00, 0xD1, 0x8C,
54620xFF, 0xFF, 0xA5, 0x34, 0x21, 0x20, 0x00, 0x02, 0x83, 0x45, 0x00, 0x0C,
54630x21, 0x30, 0x20, 0x02, 0x2C, 0x1F, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24,
54640x19, 0x00, 0x02, 0x24, 0x28, 0x00, 0x02, 0x12, 0x21, 0x90, 0x00, 0x00,
54650x02, 0x00, 0x62, 0x26, 0xFF, 0x00, 0x53, 0x30, 0x2B, 0x18, 0x75, 0x02,
54660x0F, 0x00, 0x60, 0x10, 0x80, 0x10, 0x13, 0x00, 0x21, 0x30, 0x56, 0x00,
54670x00, 0x00, 0xD0, 0x8C, 0xFF, 0x00, 0x02, 0x24, 0x0A, 0x00, 0x02, 0x12,
54680xFE, 0x00, 0x02, 0x24, 0xDC, 0xFF, 0x02, 0x16, 0x32, 0x00, 0x04, 0x24,
54690x2C, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x26,
54700xFF, 0x00, 0x53, 0x30, 0x2B, 0x18, 0x75, 0x02, 0xF3, 0xFF, 0x60, 0x14,
54710x80, 0x10, 0x13, 0x00, 0x2C, 0x00, 0xBF, 0x8F, 0x28, 0x00, 0xB6, 0x8F,
54720x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
54730x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
54740x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
54750x01, 0x00, 0x04, 0x24, 0x5B, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
54760xED, 0x45, 0x00, 0x08, 0x02, 0x00, 0x62, 0x26, 0x2C, 0x1F, 0x00, 0x0C,
54770x01, 0x00, 0x04, 0x24, 0xFB, 0x45, 0x00, 0x08, 0x02, 0x00, 0x62, 0x26,
54780x0F, 0x00, 0x14, 0x3C, 0x21, 0x20, 0x00, 0x02, 0xAC, 0x45, 0x00, 0x0C,
54790xFF, 0xFF, 0x85, 0x36, 0x21, 0x20, 0x00, 0x02, 0xFF, 0xFF, 0x85, 0x36,
54800xD2, 0xFF, 0x51, 0x10, 0x21, 0x30, 0x20, 0x02, 0x83, 0x45, 0x00, 0x0C,
54810x00, 0x00, 0x00, 0x00, 0x2C, 0x1F, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24,
54820x01, 0x00, 0x42, 0x26, 0xFF, 0x00, 0x52, 0x30, 0x0A, 0x00, 0x43, 0x2E,
54830xF2, 0xFF, 0x60, 0x14, 0x21, 0x20, 0x00, 0x02, 0xF0, 0x42, 0x00, 0x0C,
54840x21, 0x20, 0x00, 0x00, 0x2C, 0x00, 0xBF, 0x8F, 0x28, 0x00, 0xB6, 0x8F,
54850x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
54860x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
54870x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
54880xB0, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x4C, 0x00, 0xBF, 0xAF,
54890x48, 0x00, 0xBE, 0xAF, 0x40, 0x00, 0xB6, 0xAF, 0x3C, 0x00, 0xB5, 0xAF,
54900x38, 0x00, 0xB4, 0xAF, 0x34, 0x00, 0xB3, 0xAF, 0x30, 0x00, 0xB2, 0xAF,
54910x2C, 0x00, 0xB1, 0xAF, 0x28, 0x00, 0xB0, 0xAF, 0x60, 0x1B, 0x55, 0x24,
54920x44, 0x00, 0xB7, 0xAF, 0x58, 0x38, 0xA3, 0x96, 0x02, 0x80, 0x02, 0x3C,
54930x02, 0x80, 0x05, 0x3C, 0x25, 0x98, 0x62, 0x00, 0x90, 0xDE, 0xA5, 0x24,
54940x24, 0x00, 0x64, 0x26, 0x06, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C,
54950x20, 0x00, 0x60, 0xA6, 0x02, 0x80, 0x05, 0x3C, 0x48, 0x37, 0xA5, 0x24,
54960x2A, 0x00, 0x64, 0x26, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
54970x02, 0x80, 0x05, 0x3C, 0xB4, 0x55, 0xA5, 0x24, 0x06, 0x00, 0x06, 0x24,
54980xF4, 0x54, 0x00, 0x0C, 0x30, 0x00, 0x64, 0x26, 0x20, 0x00, 0x63, 0x96,
54990x02, 0x80, 0x02, 0x3C, 0xB0, 0x55, 0x42, 0x24, 0x03, 0xFF, 0x63, 0x30,
55000x80, 0x00, 0x63, 0x34, 0x74, 0x00, 0x54, 0x24, 0x20, 0x00, 0x63, 0xA6,
55010x21, 0x20, 0x80, 0x02, 0x20, 0x00, 0x02, 0x24, 0x40, 0x00, 0x72, 0x26,
55020xFB, 0x51, 0x00, 0x0C, 0x1C, 0x00, 0xA2, 0xAF, 0x21, 0x28, 0x40, 0x00,
55030x21, 0x20, 0x40, 0x02, 0xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x24,
55040x1C, 0x00, 0xA2, 0x8F, 0x21, 0x20, 0x80, 0x02, 0x42, 0x00, 0x72, 0x26,
55050x02, 0x00, 0x42, 0x24, 0x16, 0x52, 0x00, 0x0C, 0x1C, 0x00, 0xA2, 0xAF,
55060x21, 0x28, 0x40, 0x00, 0x21, 0x20, 0x40, 0x02, 0xF4, 0x54, 0x00, 0x0C,
55070x02, 0x00, 0x06, 0x24, 0x02, 0x80, 0x03, 0x3C, 0xB0, 0x55, 0x63, 0x24,
55080x1C, 0x00, 0xA2, 0x8F, 0x0C, 0x00, 0x66, 0x8C, 0x60, 0x00, 0x71, 0x24,
55090x1C, 0x00, 0xB0, 0x27, 0x10, 0x00, 0x67, 0x24, 0x21, 0x28, 0x00, 0x00,
55100x02, 0x00, 0x42, 0x24, 0x44, 0x00, 0x64, 0x26, 0x1C, 0x00, 0xA2, 0xAF,
55110x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0x20, 0x20, 0x02,
55120x1B, 0x53, 0x00, 0x0C, 0x21, 0x90, 0x40, 0x00, 0x21, 0xB0, 0x40, 0x00,
55130x08, 0x00, 0x06, 0x24, 0x09, 0x00, 0x42, 0x2C, 0x21, 0x20, 0x40, 0x02,
55140x21, 0x38, 0x20, 0x02, 0x0B, 0x30, 0xC2, 0x02, 0x01, 0x00, 0x05, 0x24,
55150x20, 0x00, 0xA2, 0xAF, 0x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB0, 0xAF,
55160x02, 0x80, 0x03, 0x3C, 0xB0, 0x55, 0x63, 0x24, 0x48, 0x00, 0x67, 0x24,
55170x21, 0x20, 0x40, 0x00, 0x03, 0x00, 0x05, 0x24, 0x01, 0x00, 0x06, 0x24,
55180x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0x20, 0x40, 0x00,
55190x06, 0x00, 0x05, 0x24, 0x02, 0x00, 0x06, 0x24, 0x18, 0x00, 0xA7, 0x27,
55200x18, 0x00, 0xA0, 0xA7, 0x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB0, 0xAF,
55210x18, 0x00, 0xA5, 0x97, 0x02, 0x80, 0x04, 0x3C, 0x58, 0xE8, 0x84, 0x24,
55220x13, 0x58, 0x00, 0x0C, 0x21, 0x90, 0x40, 0x00, 0xC0, 0x3A, 0xA2, 0x8E,
55230x0C, 0x00, 0x11, 0x24, 0x2B, 0x10, 0x22, 0x02, 0x3B, 0x00, 0x40, 0x10,
55240x21, 0xF0, 0x00, 0x02, 0x02, 0x80, 0x02, 0x3C, 0x21, 0x80, 0x80, 0x02,
55250xAA, 0x46, 0x00, 0x08, 0x26, 0x56, 0x57, 0x24, 0x21, 0x10, 0x30, 0x02,
55260x01, 0x00, 0x43, 0x90, 0xC0, 0x3A, 0xA4, 0x8E, 0x21, 0x18, 0x71, 0x00,
55270x02, 0x00, 0x71, 0x24, 0x2B, 0x20, 0x24, 0x02, 0x2F, 0x00, 0x80, 0x10,
55280x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x30, 0x02, 0x00, 0x00, 0x47, 0x90,
55290x02, 0x80, 0x14, 0x3C, 0x2D, 0x00, 0x03, 0x24, 0x21, 0x28, 0x37, 0x02,
55300x64, 0x5C, 0x84, 0x26, 0xF1, 0xFF, 0xE3, 0x14, 0x20, 0x00, 0x06, 0x24,
55310xF4, 0x54, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x41, 0xA3, 0x96,
55320x02, 0x80, 0x02, 0x3C, 0xC6, 0x5C, 0x47, 0x90, 0xBD, 0xFF, 0x63, 0x30,
55330x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0x0C, 0x00, 0x63, 0x34,
55340x01, 0x00, 0xE7, 0x30, 0x44, 0xDF, 0xA5, 0x24, 0x67, 0x5C, 0x44, 0x24,
55350x10, 0x00, 0x06, 0x24, 0x06, 0x00, 0xE0, 0x14, 0x04, 0x41, 0xA3, 0xA6,
55360x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0x54, 0xDF, 0xA5, 0x24,
55370x67, 0x5C, 0x64, 0x24, 0x10, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C,
55380x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x30, 0x02, 0x01, 0x00, 0x46, 0x90,
55390x21, 0x20, 0x40, 0x02, 0x64, 0x5C, 0x87, 0x26, 0x2D, 0x00, 0x05, 0x24,
55400x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xBE, 0xAF, 0x21, 0x90, 0x40, 0x00,
55410x21, 0x10, 0x30, 0x02, 0x01, 0x00, 0x43, 0x90, 0xC0, 0x3A, 0xA4, 0x8E,
55420x21, 0x18, 0x71, 0x00, 0x02, 0x00, 0x71, 0x24, 0x2B, 0x20, 0x24, 0x02,
55430xD4, 0xFF, 0x80, 0x14, 0x21, 0x10, 0x30, 0x02, 0x20, 0x00, 0xA2, 0x8F,
55440x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x40, 0x10, 0x02, 0x80, 0x03, 0x3C,
55450x1C, 0x00, 0xA2, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x42, 0x24,
55460x01, 0x01, 0x42, 0x2C, 0x1A, 0x00, 0x40, 0x14, 0x21, 0x20, 0x60, 0x02,
55470x4C, 0x00, 0xBF, 0x8F, 0x48, 0x00, 0xBE, 0x8F, 0x44, 0x00, 0xB7, 0x8F,
55480x40, 0x00, 0xB6, 0x8F, 0x3C, 0x00, 0xB5, 0x8F, 0x38, 0x00, 0xB4, 0x8F,
55490x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F, 0x2C, 0x00, 0xB1, 0x8F,
55500x28, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x50, 0x00, 0xBD, 0x27,
55510xB0, 0x55, 0x63, 0x24, 0x21, 0x20, 0x40, 0x02, 0xF8, 0xFF, 0xC6, 0x26,
55520x68, 0x00, 0x67, 0x24, 0x32, 0x00, 0x05, 0x24, 0x25, 0x52, 0x00, 0x0C,
55530x10, 0x00, 0xBE, 0xAF, 0x1C, 0x00, 0xA2, 0x8F, 0x00, 0x00, 0x00, 0x00,
55540x20, 0x00, 0x42, 0x24, 0x01, 0x01, 0x42, 0x2C, 0xE8, 0xFF, 0x40, 0x10,
55550x21, 0x20, 0x60, 0x02, 0x21, 0x28, 0x00, 0x00, 0xEC, 0x54, 0x00, 0x0C,
55560x08, 0x00, 0x06, 0x24, 0x08, 0x00, 0x64, 0x8E, 0x04, 0x00, 0x65, 0x8E,
55570xFF, 0xDF, 0x02, 0x3C, 0x10, 0x00, 0x66, 0x8E, 0x14, 0x00, 0x67, 0x8E,
55580xFF, 0xFF, 0x42, 0x34, 0x1C, 0x00, 0xA8, 0x8F, 0x24, 0x20, 0x82, 0x00,
55590x00, 0x40, 0x03, 0x3C, 0xFF, 0xE0, 0x02, 0x24, 0x24, 0x28, 0xA2, 0x00,
55600x25, 0x20, 0x83, 0x00, 0x00, 0x80, 0x02, 0x3C, 0xFF, 0x81, 0x03, 0x24,
55610x25, 0x30, 0xC2, 0x00, 0x24, 0x38, 0xE3, 0x00, 0x00, 0x10, 0xA5, 0x34,
55620x02, 0x80, 0x03, 0x3C, 0x80, 0x00, 0x84, 0x34, 0x20, 0x00, 0x02, 0x24,
55630x08, 0x00, 0x64, 0xAE, 0x00, 0x00, 0x68, 0xA6, 0x02, 0x00, 0x62, 0xA2,
55640x14, 0x00, 0x67, 0xAE, 0x04, 0x00, 0x65, 0xAE, 0x10, 0x00, 0x66, 0xAE,
55650x60, 0x1B, 0x62, 0x24, 0xEC, 0x37, 0x46, 0x8C, 0x58, 0x38, 0x45, 0x8C,
55660x01, 0x00, 0x04, 0x24, 0x00, 0x01, 0x07, 0x24, 0x01, 0x00, 0x02, 0x24,
55670x1E, 0x01, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF, 0x5B, 0x01, 0x00, 0x0C,
55680x01, 0x00, 0x04, 0x24, 0x4C, 0x00, 0xBF, 0x8F, 0x48, 0x00, 0xBE, 0x8F,
55690x44, 0x00, 0xB7, 0x8F, 0x40, 0x00, 0xB6, 0x8F, 0x3C, 0x00, 0xB5, 0x8F,
55700x38, 0x00, 0xB4, 0x8F, 0x34, 0x00, 0xB3, 0x8F, 0x30, 0x00, 0xB2, 0x8F,
55710x2C, 0x00, 0xB1, 0x8F, 0x28, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
55720x50, 0x00, 0xBD, 0x27, 0xA0, 0xFF, 0xBD, 0x27, 0x5C, 0x00, 0xBF, 0xAF,
55730x58, 0x00, 0xBE, 0xAF, 0x54, 0x00, 0xB7, 0xAF, 0x50, 0x00, 0xB6, 0xAF,
55740x4C, 0x00, 0xB5, 0xAF, 0x48, 0x00, 0xB4, 0xAF, 0x44, 0x00, 0xB3, 0xAF,
55750x40, 0x00, 0xB2, 0xAF, 0x3C, 0x00, 0xB1, 0xAF, 0x38, 0x00, 0xB0, 0xAF,
55760x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x0B, 0x3C, 0x64, 0xE8, 0x82, 0x24,
55770x78, 0xE8, 0x63, 0x25, 0x78, 0xE8, 0x6B, 0x91, 0x01, 0x00, 0x45, 0x90,
55780x0D, 0x00, 0x48, 0x90, 0x0C, 0x00, 0x58, 0x90, 0x64, 0xE8, 0x97, 0x90,
55790x02, 0x00, 0x54, 0x90, 0x0E, 0x00, 0x50, 0x90, 0x01, 0x00, 0x69, 0x90,
55800x30, 0x00, 0xAB, 0xAF, 0x03, 0x00, 0x4B, 0x90, 0x04, 0x00, 0x76, 0x90,
55810x05, 0x00, 0x6A, 0x90, 0x02, 0x00, 0x6F, 0x90, 0x06, 0x00, 0x64, 0x90,
55820x07, 0x00, 0x75, 0x90, 0x03, 0x00, 0x71, 0x90, 0x00, 0x2A, 0x05, 0x00,
55830x30, 0x00, 0xA3, 0x8F, 0x00, 0x42, 0x08, 0x00, 0x25, 0x40, 0x18, 0x01,
55840x25, 0x28, 0xB7, 0x00, 0x00, 0xA4, 0x14, 0x00, 0x00, 0x84, 0x10, 0x00,
55850x25, 0xA0, 0x85, 0x02, 0x25, 0x80, 0x08, 0x02, 0x00, 0x4A, 0x09, 0x00,
55860x00, 0x5E, 0x0B, 0x00, 0x02, 0x80, 0x08, 0x3C, 0x05, 0x00, 0x46, 0x90,
55870x09, 0x00, 0x47, 0x90, 0x25, 0x48, 0x23, 0x01, 0x00, 0x52, 0x0A, 0x00,
55880x60, 0x1B, 0x03, 0x25, 0x25, 0x58, 0x74, 0x01, 0x04, 0x00, 0x5E, 0x90,
55890x06, 0x00, 0x53, 0x90, 0x08, 0x00, 0x59, 0x90, 0x0A, 0x00, 0x52, 0x90,
55900x07, 0x00, 0x4C, 0x90, 0x0B, 0x00, 0x4D, 0x90, 0x0F, 0x00, 0x4E, 0x90,
55910x11, 0x00, 0x58, 0x90, 0x25, 0x50, 0x56, 0x01, 0x10, 0x00, 0x56, 0x90,
55920x10, 0x00, 0xAB, 0xAF, 0x06, 0x41, 0x62, 0x90, 0x00, 0x32, 0x06, 0x00,
55930x00, 0x3A, 0x07, 0x00, 0x00, 0x7C, 0x0F, 0x00, 0x00, 0x24, 0x04, 0x00,
55940x25, 0x30, 0xDE, 0x00, 0x25, 0x38, 0xF9, 0x00, 0x25, 0x20, 0x8A, 0x00,
55950x1C, 0x00, 0x43, 0x30, 0x00, 0x9C, 0x13, 0x00, 0x00, 0x94, 0x12, 0x00,
55960x25, 0x78, 0xE9, 0x01, 0x00, 0x8E, 0x11, 0x00, 0x00, 0xAE, 0x15, 0x00,
55970x25, 0x98, 0x66, 0x02, 0x25, 0x90, 0x47, 0x02, 0x03, 0x00, 0x46, 0x30,
55980x25, 0xA8, 0xA4, 0x02, 0x25, 0x88, 0x2F, 0x02, 0x10, 0x00, 0xA7, 0x27,
55990x83, 0x18, 0x03, 0x00, 0x02, 0x00, 0xC4, 0x24, 0x28, 0x00, 0xB1, 0xAF,
56000x2C, 0x00, 0xB5, 0xAF, 0x21, 0x18, 0xE3, 0x00, 0x01, 0x00, 0x02, 0x24,
56010x04, 0x10, 0x82, 0x00, 0x18, 0x00, 0x65, 0x90, 0xFF, 0x00, 0x46, 0x30,
56020x00, 0x66, 0x0C, 0x00, 0x00, 0x6E, 0x0D, 0x00, 0x00, 0x76, 0x0E, 0x00,
56030x25, 0xB0, 0x02, 0x3C, 0x25, 0x60, 0x93, 0x01, 0x25, 0x68, 0xB2, 0x01,
56040x25, 0x70, 0xD0, 0x01, 0x10, 0x00, 0xC4, 0x2C, 0x37, 0x02, 0x42, 0x34,
56050x0F, 0x00, 0x03, 0x24, 0x14, 0x00, 0xAC, 0xAF, 0x18, 0x00, 0xAD, 0xAF,
56060x1C, 0x00, 0xAE, 0xAF, 0x20, 0x00, 0xB6, 0xA3, 0x21, 0x00, 0xB8, 0xA3,
56070x0A, 0x30, 0x64, 0x00, 0x00, 0x00, 0x45, 0xA0, 0x21, 0x28, 0x00, 0x00,
56080x21, 0x20, 0xE5, 0x00, 0x00, 0x00, 0x82, 0x90, 0x01, 0x00, 0xA5, 0x24,
56090x2B, 0x10, 0xC2, 0x00, 0x02, 0x00, 0x40, 0x10, 0x11, 0x00, 0xA3, 0x2C,
56100x00, 0x00, 0x86, 0xA0, 0xF9, 0xFF, 0x60, 0x14, 0x21, 0x20, 0xE5, 0x00,
56110x21, 0x30, 0xE0, 0x00, 0x21, 0x28, 0x00, 0x00, 0x25, 0xB0, 0x07, 0x3C,
56120x01, 0x00, 0xC2, 0x90, 0x00, 0x00, 0xC3, 0x90, 0x21, 0x20, 0xA7, 0x00,
56130x00, 0x11, 0x02, 0x00, 0x25, 0x10, 0x43, 0x00, 0x01, 0x00, 0xA5, 0x24,
56140xFF, 0x00, 0x42, 0x30, 0x08, 0x00, 0xA3, 0x2C, 0xA8, 0x01, 0x82, 0xA0,
56150xF6, 0xFF, 0x60, 0x14, 0x02, 0x00, 0xC6, 0x24, 0x21, 0x00, 0xA2, 0x93,
56160x20, 0x00, 0xA4, 0x93, 0x02, 0x80, 0x03, 0x3C, 0x00, 0x11, 0x02, 0x00,
56170xD9, 0x5C, 0x66, 0x90, 0x25, 0x10, 0x44, 0x00, 0xFF, 0x00, 0x42, 0x30,
56180xA7, 0x01, 0xE3, 0x34, 0x00, 0x00, 0x62, 0xA0, 0x01, 0x00, 0x02, 0x24,
56190x0F, 0x00, 0xC2, 0x10, 0x60, 0x1B, 0x07, 0x25, 0x60, 0x1B, 0x02, 0x25,
56200x00, 0x41, 0x40, 0xAC, 0x5C, 0x00, 0xBF, 0x8F, 0x58, 0x00, 0xBE, 0x8F,
56210x54, 0x00, 0xB7, 0x8F, 0x50, 0x00, 0xB6, 0x8F, 0x4C, 0x00, 0xB5, 0x8F,
56220x48, 0x00, 0xB4, 0x8F, 0x44, 0x00, 0xB3, 0x8F, 0x40, 0x00, 0xB2, 0x8F,
56230x3C, 0x00, 0xB1, 0x8F, 0x38, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
56240x60, 0x00, 0xBD, 0x27, 0x04, 0x41, 0xE2, 0x94, 0x00, 0x00, 0x00, 0x00,
56250x02, 0x00, 0x42, 0x30, 0xEF, 0xFF, 0x40, 0x10, 0x60, 0x1B, 0x02, 0x25,
56260x25, 0x41, 0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x62, 0x30,
56270xEA, 0xFF, 0x40, 0x10, 0x60, 0x1B, 0x02, 0x25, 0x03, 0x00, 0x63, 0x30,
56280x10, 0x00, 0x66, 0x10, 0x03, 0x00, 0x02, 0x24, 0x07, 0x00, 0x62, 0x10,
56290x60, 0x1B, 0x02, 0x25, 0x00, 0x41, 0x40, 0xAC, 0x21, 0x20, 0x00, 0x00,
56300x95, 0x0E, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0xBE, 0x47, 0x00, 0x08,
56310x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x34, 0x02, 0x00, 0x05, 0x24,
56320x00, 0x41, 0xE6, 0xAC, 0x95, 0x0E, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
56330xBE, 0x47, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x34,
56340x01, 0x00, 0x05, 0x24, 0xE2, 0x47, 0x00, 0x08, 0x00, 0x41, 0xE6, 0xAC,
56350xE8, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x06, 0x3C, 0x14, 0x00, 0xBF, 0xAF,
56360x10, 0x00, 0xB0, 0xAF, 0xB4, 0x55, 0xC2, 0x24, 0x01, 0x00, 0x44, 0x90,
56370xB4, 0x55, 0xC3, 0x90, 0x02, 0x00, 0x45, 0x90, 0x03, 0x00, 0x46, 0x90,
56380x05, 0x00, 0x47, 0x90, 0x04, 0x00, 0x48, 0x90, 0x00, 0x22, 0x04, 0x00,
56390x25, 0x18, 0x64, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x25, 0xB0, 0x10, 0x3C,
56400x25, 0x18, 0x65, 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x3A, 0x07, 0x00,
56410x25, 0x18, 0x66, 0x00, 0x58, 0x00, 0x02, 0x36, 0x5C, 0x00, 0x05, 0x36,
56420x25, 0x40, 0x07, 0x01, 0x02, 0x80, 0x04, 0x3C, 0x00, 0x00, 0x43, 0xAC,
56430xB0, 0x55, 0x84, 0x24, 0x00, 0x00, 0xA8, 0xAC, 0xFD, 0x51, 0x00, 0x0C,
56440x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x03, 0x36, 0x00, 0x00, 0x62, 0xA4,
56450x48, 0x00, 0x10, 0x36, 0x00, 0x00, 0x02, 0x8E, 0x84, 0x00, 0x03, 0x3C,
56460x14, 0x00, 0xBF, 0x8F, 0x25, 0x10, 0x43, 0x00, 0x00, 0x00, 0x02, 0xAE,
56470x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
56480xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF,
56490x53, 0x21, 0x00, 0x0C, 0x24, 0x00, 0x04, 0x24, 0x21, 0x30, 0x40, 0x00,
56500x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x50, 0x24,
56510x21, 0x20, 0xC0, 0x00, 0x13, 0x00, 0xC0, 0x10, 0x80, 0xE8, 0xA5, 0x24,
56520x04, 0x00, 0x02, 0x24, 0x09, 0x00, 0x03, 0x24, 0x0C, 0x00, 0xC2, 0xAC,
56530x14, 0x00, 0xC3, 0xAC, 0x08, 0x00, 0xC5, 0x94, 0x3C, 0x3E, 0x03, 0x8E,
56540x02, 0x80, 0x02, 0x3C, 0x25, 0x28, 0xA2, 0x00, 0x17, 0x0A, 0x00, 0x0C,
56550x20, 0x00, 0xA3, 0xAC, 0x40, 0x3E, 0x06, 0x8E, 0x3C, 0x3E, 0x05, 0x8E,
56560x02, 0x80, 0x04, 0x3C, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
56570x94, 0xE8, 0x84, 0x24, 0x13, 0x58, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
56580x02, 0x80, 0x04, 0x3C, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
56590xAC, 0xE8, 0x84, 0x24, 0x13, 0x58, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
56600xD8, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB3, 0xAF, 0x18, 0x00, 0xB2, 0xAF,
56610x14, 0x00, 0xB1, 0xAF, 0x20, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
56620x02, 0x80, 0x02, 0x3C, 0xB0, 0x55, 0x43, 0x8C, 0x21, 0x90, 0x80, 0x00,
56630x3C, 0x00, 0x64, 0x24, 0x53, 0x21, 0x00, 0x0C, 0x1C, 0x00, 0x73, 0x24,
56640x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x04, 0x3C, 0x21, 0x88, 0x40, 0x00,
56650xB0, 0x55, 0xA5, 0x24, 0x74, 0x03, 0x06, 0x24, 0x19, 0x00, 0x40, 0x10,
56660xC8, 0xE8, 0x84, 0x24, 0x08, 0x00, 0x50, 0x94, 0x0A, 0x00, 0x02, 0x24,
56670x14, 0x00, 0x22, 0xAE, 0x02, 0x80, 0x02, 0x3C, 0x25, 0x80, 0x02, 0x02,
56680x0C, 0x00, 0x33, 0xAE, 0x3C, 0x00, 0x04, 0x26, 0xF4, 0x54, 0x00, 0x0C,
56690x20, 0x00, 0x10, 0x26, 0x18, 0x00, 0x12, 0xAE, 0x21, 0x20, 0x20, 0x02,
56700x17, 0x0A, 0x00, 0x0C, 0x14, 0x00, 0x12, 0xAE, 0x02, 0x80, 0x04, 0x3C,
56710x21, 0x28, 0x40, 0x02, 0x21, 0x30, 0x60, 0x02, 0x20, 0x00, 0xBF, 0x8F,
56720x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
56730x10, 0x00, 0xB0, 0x8F, 0xD8, 0xE8, 0x84, 0x24, 0x13, 0x58, 0x00, 0x08,
56740x28, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x06, 0x3C, 0x21, 0x28, 0x60, 0x02,
56750x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
56760x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0xB8, 0xE8, 0xC6, 0x24,
56770x13, 0x58, 0x00, 0x08, 0x28, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27,
56780x18, 0x00, 0xB2, 0xAF, 0xFF, 0xFF, 0x92, 0x30, 0x2A, 0x00, 0x04, 0x24,
56790x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x1C, 0x00, 0xBF, 0xAF,
56800x53, 0x21, 0x00, 0x0C, 0xFF, 0x00, 0xB1, 0x30, 0x02, 0x80, 0x05, 0x3C,
56810x21, 0x80, 0x40, 0x00, 0xB4, 0x55, 0xA5, 0x24, 0x13, 0x00, 0x40, 0x10,
56820x06, 0x00, 0x06, 0x24, 0x08, 0x00, 0x44, 0x94, 0x0A, 0x00, 0x02, 0x24,
56830x0C, 0x00, 0x02, 0xAE, 0x02, 0x80, 0x02, 0x3C, 0x25, 0x20, 0x82, 0x00,
56840x20, 0x00, 0x84, 0x24, 0x19, 0x00, 0x03, 0x24, 0x14, 0x00, 0x03, 0xAE,
56850x06, 0x00, 0x92, 0xA4, 0xF4, 0x54, 0x00, 0x0C, 0x08, 0x00, 0x91, 0xA0,
56860x21, 0x20, 0x00, 0x02, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
56870x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x17, 0x0A, 0x00, 0x08,
56880x20, 0x00, 0xBD, 0x27, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
56890x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
56900x20, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB2, 0xAF,
56910x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x24, 0x00, 0xBF, 0xAF,
56920x20, 0x00, 0xB4, 0xAF, 0x1C, 0x00, 0xB3, 0xAF, 0x02, 0x00, 0x82, 0x90,
56930x02, 0x80, 0x12, 0x3C, 0x60, 0x1B, 0x51, 0x26, 0xB0, 0x1B, 0x25, 0x96,
56940x0F, 0x00, 0x42, 0x30, 0xC0, 0x10, 0x02, 0x00, 0x21, 0x80, 0x44, 0x00,
56950x00, 0x01, 0xA3, 0x30, 0x04, 0x00, 0x60, 0x10, 0x18, 0x00, 0x04, 0x26,
56960x00, 0x10, 0xA2, 0x30, 0x0B, 0x00, 0x40, 0x10, 0x04, 0x00, 0xA2, 0x30,
56970x21, 0x18, 0x00, 0x00, 0x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB4, 0x8F,
56980x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
56990x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
57000x28, 0x00, 0xBD, 0x27, 0xF5, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
57010x39, 0x53, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
57020x48, 0x37, 0x84, 0x24, 0x21, 0x28, 0x40, 0x00, 0x1D, 0x55, 0x00, 0x0C,
57030x06, 0x00, 0x06, 0x24, 0xED, 0xFF, 0x40, 0x14, 0x21, 0x18, 0x00, 0x00,
57040x02, 0x80, 0x02, 0x3C, 0xB4, 0x55, 0x53, 0x24, 0x22, 0x00, 0x14, 0x26,
57050x21, 0x20, 0x80, 0x02, 0x21, 0x28, 0x60, 0x02, 0x1D, 0x55, 0x00, 0x0C,
57060x06, 0x00, 0x06, 0x24, 0xE4, 0xFF, 0x40, 0x14, 0x21, 0x18, 0x00, 0x00,
57070x28, 0x00, 0x04, 0x26, 0x21, 0x28, 0x60, 0x02, 0x1D, 0x55, 0x00, 0x0C,
57080x06, 0x00, 0x06, 0x24, 0xDE, 0xFF, 0x40, 0x14, 0x21, 0x18, 0x00, 0x00,
57090x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C, 0x38, 0xE9, 0x84, 0x24,
57100xB0, 0x1B, 0x24, 0x96, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x83, 0x30,
57110x01, 0x00, 0x62, 0x30, 0x08, 0x00, 0x40, 0x10, 0x00, 0x20, 0x62, 0x30,
57120x1B, 0x00, 0x40, 0x10, 0xFF, 0xDE, 0x82, 0x30, 0xB0, 0x1B, 0x22, 0xA6,
57130xFE, 0xFF, 0x04, 0x24, 0xCC, 0x39, 0x20, 0xAE, 0x35, 0x48, 0x00, 0x0C,
57140xB0, 0x39, 0x20, 0xAE, 0x25, 0xB0, 0x10, 0x3C, 0x60, 0x1B, 0x51, 0x26,
57150x4C, 0x00, 0x02, 0x36, 0x00, 0x00, 0x40, 0xA0, 0x48, 0x00, 0x10, 0x36,
57160x21, 0x20, 0x00, 0x00, 0x21, 0x28, 0x00, 0x00, 0x95, 0x0E, 0x00, 0x0C,
57170x37, 0x3E, 0x20, 0xA2, 0x00, 0x00, 0x03, 0x8E, 0x7B, 0xFF, 0x02, 0x3C,
57180xFF, 0xFF, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00, 0x00, 0x00, 0x03, 0xAE,
57190xBC, 0x40, 0x20, 0xAE, 0xE8, 0x39, 0x20, 0xAE, 0x04, 0x3A, 0x20, 0xAE,
57200x87, 0x54, 0x00, 0x0C, 0xFC, 0x40, 0x20, 0xAE, 0xA5, 0x48, 0x00, 0x08,
57210x21, 0x18, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x0C, 0x21, 0x20, 0x80, 0x02,
57220xB5, 0xFF, 0x40, 0x14, 0xFF, 0xFF, 0x03, 0x24, 0xB0, 0x1B, 0x22, 0x96,
57230x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x42, 0x30, 0xD8, 0x48, 0x00, 0x08,
57240xB0, 0x1B, 0x22, 0xA6, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF,
57250x02, 0x80, 0x10, 0x3C, 0x60, 0x1B, 0x10, 0x26, 0x02, 0x00, 0x02, 0x24,
57260x02, 0x80, 0x04, 0x3C, 0x00, 0x80, 0x06, 0x3C, 0x44, 0x3A, 0x02, 0xA2,
57270x90, 0x55, 0x84, 0x24, 0x21, 0x28, 0x00, 0x00, 0x3C, 0x3A, 0x00, 0xAE,
57280x14, 0x00, 0xBF, 0xAF, 0xCF, 0x20, 0x00, 0x0C, 0x70, 0x3C, 0xC6, 0x24,
57290x02, 0x80, 0x02, 0x3C, 0xD1, 0x5C, 0x44, 0x90, 0x02, 0x80, 0x03, 0x3C,
57300x49, 0xF5, 0x65, 0x90, 0x10, 0x27, 0x02, 0x24, 0x0B, 0x10, 0x04, 0x00,
57310x01, 0x00, 0x84, 0x2C, 0x3C, 0x3A, 0x02, 0xAE, 0x49, 0x41, 0x05, 0xA2,
57320x48, 0x41, 0x04, 0xA2, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
57330x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xB8, 0xFF, 0xBD, 0x27,
57340x00, 0x01, 0x04, 0x24, 0x3C, 0x00, 0xB3, 0xAF, 0x38, 0x00, 0xB2, 0xAF,
57350x34, 0x00, 0xB1, 0xAF, 0x40, 0x00, 0xBF, 0xAF, 0x30, 0x00, 0xB0, 0xAF,
57360x53, 0x21, 0x00, 0x0C, 0x02, 0x80, 0x13, 0x3C, 0x02, 0x80, 0x04, 0x3C,
57370x21, 0x88, 0x40, 0x00, 0x90, 0xDE, 0x65, 0x26, 0x06, 0x00, 0x06, 0x24,
57380x0C, 0x00, 0x52, 0x24, 0x4D, 0x00, 0x40, 0x10, 0x58, 0xE9, 0x84, 0x24,
57390x08, 0x00, 0x50, 0x94, 0x02, 0x80, 0x02, 0x3C, 0x25, 0x80, 0x02, 0x02,
57400x24, 0x00, 0x04, 0x26, 0xF4, 0x54, 0x00, 0x0C, 0x20, 0x00, 0x00, 0xA6,
57410x02, 0x80, 0x05, 0x3C, 0x2A, 0x00, 0x04, 0x26, 0x48, 0x37, 0xA5, 0x24,
57420xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x30, 0x00, 0x04, 0x26,
57430x90, 0xDE, 0x65, 0x26, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
57440x20, 0x00, 0x03, 0x96, 0x18, 0x00, 0x02, 0x24, 0x02, 0x80, 0x04, 0x3C,
57450x03, 0xFF, 0x63, 0x30, 0x40, 0x00, 0x63, 0x34, 0x20, 0x00, 0x03, 0xA6,
57460x60, 0x1B, 0x84, 0x24, 0x0C, 0x00, 0x22, 0xAE, 0xE4, 0x1D, 0x82, 0x94,
57470x20, 0x00, 0x06, 0x26, 0x02, 0x80, 0x07, 0x3C, 0xFF, 0x0F, 0x43, 0x30,
57480x00, 0x19, 0x03, 0x00, 0x02, 0x2A, 0x03, 0x00, 0x01, 0x00, 0x42, 0x24,
57490xE4, 0x1D, 0x82, 0xA4, 0x16, 0x00, 0xC3, 0xA0, 0x17, 0x00, 0xC5, 0xA0,
57500x0C, 0x3E, 0x86, 0x8C, 0x70, 0x59, 0xE7, 0x24, 0x38, 0x00, 0x04, 0x26,
57510x21, 0x28, 0x00, 0x00, 0x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB2, 0xAF,
57520x18, 0x00, 0xA4, 0x27, 0x28, 0x00, 0xA5, 0x27, 0x05, 0x53, 0x00, 0x0C,
57530x21, 0x80, 0x40, 0x00, 0x28, 0x00, 0xA3, 0x8F, 0x21, 0x20, 0x00, 0x02,
57540x18, 0x00, 0xA7, 0x27, 0x09, 0x00, 0x62, 0x28, 0x01, 0x00, 0x05, 0x24,
57550x13, 0x00, 0x40, 0x10, 0x08, 0x00, 0x06, 0x24, 0x21, 0x20, 0x00, 0x02,
57560x21, 0x30, 0x60, 0x00, 0x01, 0x00, 0x05, 0x24, 0x18, 0x00, 0xA7, 0x27,
57570x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB2, 0xAF, 0x21, 0x20, 0x20, 0x02,
57580x01, 0x00, 0x05, 0x24, 0x21, 0x30, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x0C,
57590x21, 0x38, 0x00, 0x00, 0x40, 0x00, 0xBF, 0x8F, 0x3C, 0x00, 0xB3, 0x8F,
57600x38, 0x00, 0xB2, 0x8F, 0x34, 0x00, 0xB1, 0x8F, 0x30, 0x00, 0xB0, 0x8F,
57610x08, 0x00, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x27, 0x25, 0x52, 0x00, 0x0C,
57620x10, 0x00, 0xB2, 0xAF, 0x28, 0x00, 0xA6, 0x8F, 0x21, 0x20, 0x40, 0x00,
57630x32, 0x00, 0x05, 0x24, 0xF8, 0xFF, 0xC6, 0x24, 0x58, 0x49, 0x00, 0x08,
57640x20, 0x00, 0xA7, 0x27, 0x02, 0x80, 0x05, 0x3C, 0x13, 0x58, 0x00, 0x0C,
57650x48, 0xE9, 0xA5, 0x24, 0x40, 0x00, 0xBF, 0x8F, 0x3C, 0x00, 0xB3, 0x8F,
57660x38, 0x00, 0xB2, 0x8F, 0x34, 0x00, 0xB1, 0x8F, 0x30, 0x00, 0xB0, 0x8F,
57670x08, 0x00, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x27, 0x08, 0x00, 0xE0, 0x03,
57680x21, 0x10, 0x00, 0x00, 0xA8, 0xFF, 0xBD, 0x27, 0x48, 0x00, 0xB6, 0xAF,
57690x3C, 0x00, 0xB3, 0xAF, 0x38, 0x00, 0xB2, 0xAF, 0x30, 0x00, 0xB0, 0xAF,
57700x54, 0x00, 0xBF, 0xAF, 0x50, 0x00, 0xBE, 0xAF, 0x4C, 0x00, 0xB7, 0xAF,
57710x44, 0x00, 0xB5, 0xAF, 0x40, 0x00, 0xB4, 0xAF, 0x34, 0x00, 0xB1, 0xAF,
57720x02, 0x00, 0x82, 0x90, 0x00, 0x00, 0x83, 0x8C, 0x21, 0xB0, 0x00, 0x00,
57730x0F, 0x00, 0x42, 0x30, 0xC0, 0x10, 0x02, 0x00, 0x21, 0x80, 0x44, 0x00,
57740x18, 0x00, 0x12, 0x26, 0x21, 0x20, 0x40, 0x02, 0x39, 0x53, 0x00, 0x0C,
57750xFF, 0x3F, 0x73, 0x30, 0x02, 0x80, 0x04, 0x3C, 0x48, 0x37, 0x84, 0x24,
57760x21, 0x28, 0x40, 0x00, 0x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
57770x0B, 0x00, 0x40, 0x14, 0x02, 0x80, 0x15, 0x3C, 0x60, 0x1B, 0xB1, 0x26,
57780xB0, 0x1B, 0x23, 0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x62, 0x30,
57790x05, 0x00, 0x40, 0x10, 0x00, 0x10, 0x62, 0x30, 0x03, 0x00, 0x40, 0x14,
57800x00, 0x01, 0x62, 0x30, 0x0E, 0x00, 0x40, 0x10, 0x20, 0x00, 0xB4, 0x27,
57810x54, 0x00, 0xBF, 0x8F, 0x50, 0x00, 0xBE, 0x8F, 0x4C, 0x00, 0xB7, 0x8F,
57820x48, 0x00, 0xB6, 0x8F, 0x44, 0x00, 0xB5, 0x8F, 0x40, 0x00, 0xB4, 0x8F,
57830x3C, 0x00, 0xB3, 0x8F, 0x38, 0x00, 0xB2, 0x8F, 0x34, 0x00, 0xB1, 0x8F,
57840x30, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
57850x58, 0x00, 0xBD, 0x27, 0x32, 0x00, 0x05, 0x26, 0x21, 0x20, 0x80, 0x02,
57860xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x24, 0x20, 0x00, 0xA5, 0x97,
57870x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0xA0, 0x14, 0x02, 0x80, 0x04, 0x3C,
57880x21, 0x20, 0x80, 0x02, 0x34, 0x00, 0x05, 0x26, 0xF4, 0x54, 0x00, 0x0C,
57890x02, 0x00, 0x06, 0x24, 0x20, 0x00, 0xA2, 0x97, 0x21, 0x20, 0x80, 0x02,
57900x30, 0x00, 0x05, 0x26, 0xFF, 0x3F, 0x42, 0x30, 0x02, 0x00, 0x06, 0x24,
57910x4C, 0x3A, 0x22, 0xA6, 0xF4, 0x54, 0x00, 0x0C, 0x28, 0x00, 0xA2, 0xAF,
57920x20, 0x00, 0xA3, 0x97, 0x21, 0x40, 0x20, 0x02, 0x00, 0x04, 0x63, 0x30,
57930x02, 0x00, 0x60, 0x14, 0x09, 0x00, 0x02, 0x24, 0x14, 0x00, 0x02, 0x24,
57940x1E, 0x00, 0x5E, 0x26, 0xE2, 0xFF, 0x77, 0x26, 0x21, 0x20, 0xC0, 0x03,
57950x01, 0x00, 0x05, 0x24, 0x24, 0x00, 0xA6, 0x27, 0x21, 0x38, 0xE0, 0x02,
57960xAB, 0x1A, 0x00, 0x0C, 0xB8, 0x40, 0x02, 0xA1, 0x9E, 0x00, 0x40, 0x10,
57970x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xA6, 0x8F, 0x02, 0x00, 0x45, 0x24,
57980xF4, 0x54, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x21, 0x20, 0xC0, 0x03,
57990x32, 0x00, 0x05, 0x24, 0x24, 0x00, 0xA6, 0x27, 0x24, 0x00, 0xB4, 0x8F,
58000xAB, 0x1A, 0x00, 0x0C, 0x21, 0x38, 0xE0, 0x02, 0x08, 0x00, 0x40, 0x10,
58010x10, 0x00, 0xA4, 0x27, 0x24, 0x00, 0xA6, 0x8F, 0x21, 0x20, 0x94, 0x00,
58020xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x45, 0x24, 0x24, 0x00, 0xA3, 0x8F,
58030x00, 0x00, 0x00, 0x00, 0x21, 0xA0, 0x83, 0x02, 0x02, 0x80, 0x02, 0x3C,
58040xD2, 0x5C, 0x44, 0x90, 0x02, 0x00, 0x03, 0x24, 0xDA, 0x00, 0x83, 0x10,
58050x21, 0x20, 0xC0, 0x03, 0x60, 0x1B, 0xA4, 0x26, 0xBC, 0x40, 0x82, 0x8C,
58060x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x40, 0x10, 0x60, 0x1B, 0xB1, 0x26,
58070x02, 0x80, 0x02, 0x3C, 0xCE, 0x5C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
58080x1D, 0x00, 0x60, 0x14, 0x23, 0x10, 0xD2, 0x03, 0x2B, 0x10, 0x53, 0x00,
58090x1A, 0x00, 0x40, 0x10, 0x21, 0x80, 0xC0, 0x03, 0x02, 0x80, 0x11, 0x3C,
58100x21, 0x20, 0x00, 0x02, 0xDD, 0x00, 0x05, 0x24, 0x24, 0x00, 0xA6, 0x27,
58110xAB, 0x1A, 0x00, 0x0C, 0x21, 0x38, 0xE0, 0x02, 0x21, 0x80, 0x40, 0x00,
58120x02, 0x00, 0x44, 0x24, 0x68, 0xDE, 0x25, 0x26, 0x03, 0x01, 0x40, 0x10,
58130x06, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
58140x05, 0x01, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xA2, 0x8F,
58150x00, 0x00, 0x00, 0x00, 0x21, 0x18, 0x02, 0x02, 0x02, 0x00, 0x70, 0x24,
58160x23, 0x20, 0x12, 0x02, 0xF8, 0x00, 0x40, 0x10, 0x2B, 0x20, 0x93, 0x00,
58170xEB, 0xFF, 0x80, 0x14, 0x21, 0x20, 0x00, 0x02, 0x60, 0x1B, 0xB1, 0x26,
58180xFC, 0x40, 0x22, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x40, 0x14,
58190x24, 0x00, 0xA6, 0x27, 0xA9, 0x1B, 0x00, 0x0C, 0x60, 0x1B, 0xB2, 0x26,
58200xB0, 0x1B, 0x45, 0x96, 0x25, 0xB0, 0x17, 0x3C, 0x02, 0x00, 0x03, 0x24,
58210x4C, 0x00, 0xE4, 0x36, 0x00, 0x00, 0x83, 0xA0, 0x00, 0x01, 0xA5, 0x34,
58220xE8, 0x39, 0x42, 0xAE, 0x60, 0xEA, 0x02, 0x34, 0x04, 0x3A, 0x42, 0xAE,
58230xEA, 0x47, 0x00, 0x0C, 0xB0, 0x1B, 0x45, 0xA6, 0x10, 0x00, 0xA4, 0x27,
58240x61, 0x53, 0x00, 0x0C, 0x21, 0x28, 0x80, 0x02, 0x0F, 0x00, 0x50, 0x30,
58250x10, 0x00, 0xA4, 0x27, 0x7A, 0x53, 0x00, 0x0C, 0x21, 0x28, 0x80, 0x02,
58260x40, 0x02, 0x13, 0x36, 0x21, 0x20, 0x60, 0x02, 0x63, 0x5E, 0x00, 0x74,
58270x21, 0x28, 0x40, 0x00, 0x21, 0x28, 0x80, 0x02, 0xA6, 0x53, 0x00, 0x0C,
58280x10, 0x00, 0xA4, 0x27, 0x21, 0x88, 0x40, 0x00, 0xFC, 0x40, 0x42, 0x8E,
58290x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x40, 0x10, 0x50, 0x00, 0x13, 0x36,
58300x07, 0x41, 0x42, 0x92, 0x08, 0x41, 0x43, 0x92, 0xB6, 0x40, 0x44, 0x92,
58310x00, 0x13, 0x02, 0x00, 0x00, 0x1D, 0x03, 0x00, 0x25, 0x10, 0x43, 0x00,
58320x04, 0x00, 0x03, 0x24, 0x9C, 0x00, 0x83, 0x10, 0x25, 0x88, 0x22, 0x02,
58330x00, 0x41, 0x43, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x60, 0x14,
58340x01, 0x00, 0x02, 0x24, 0x04, 0x41, 0x42, 0x96, 0x00, 0x00, 0x00, 0x00,
58350x20, 0x00, 0x42, 0x30, 0x9D, 0x00, 0x40, 0x14, 0x00, 0x10, 0x02, 0x3C,
58360x01, 0x00, 0x02, 0x24, 0x94, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
58370x02, 0x80, 0x04, 0x3C, 0x94, 0xE9, 0x84, 0x24, 0x21, 0x28, 0x60, 0x02,
58380x21, 0x38, 0xC0, 0x02, 0x13, 0x58, 0x00, 0x0C, 0x21, 0x30, 0x20, 0x02,
58390x21, 0x20, 0x60, 0x02, 0x63, 0x5E, 0x00, 0x74, 0x21, 0x28, 0x20, 0x02,
58400x60, 0x1B, 0xA2, 0x26, 0xB6, 0x40, 0x43, 0x90, 0xB0, 0x1B, 0x44, 0x94,
58410x60, 0x1B, 0xA5, 0x8E, 0xFC, 0xFF, 0x63, 0x24, 0xFF, 0x00, 0x63, 0x30,
58420xFF, 0xDF, 0x84, 0x30, 0x03, 0x00, 0x63, 0x2C, 0xB0, 0x1B, 0x44, 0xA4,
58430xB0, 0x39, 0x40, 0xAC, 0xCC, 0x39, 0x40, 0xAC, 0x40, 0x41, 0x40, 0xAC,
58440x44, 0x41, 0x40, 0xAC, 0x08, 0x00, 0x60, 0x10, 0x25, 0x00, 0xA5, 0x34,
58450x28, 0x00, 0xA4, 0x8F, 0xFB, 0xFF, 0x02, 0x24, 0x24, 0x10, 0xA2, 0x00,
58460x35, 0x48, 0x00, 0x0C, 0x60, 0x1B, 0xA2, 0xAE, 0xA0, 0x49, 0x00, 0x08,
58470x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0xA4, 0x8F, 0x35, 0x48, 0x00, 0x0C,
58480x60, 0x1B, 0xA5, 0xAE, 0xA0, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
58490x13, 0x58, 0x00, 0x0C, 0x78, 0xE9, 0x84, 0x24, 0xFF, 0xFF, 0x02, 0x24,
58500x51, 0x4A, 0x00, 0x08, 0x28, 0x00, 0xA2, 0xAF, 0x21, 0x20, 0xC0, 0x03,
58510x2D, 0x00, 0x05, 0x24, 0xAB, 0x1A, 0x00, 0x0C, 0x21, 0x38, 0xE0, 0x02,
58520x91, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xAB, 0x8F,
58530x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x60, 0x19, 0x21, 0x40, 0x00, 0x00,
58540x02, 0x00, 0x49, 0x24, 0x21, 0x50, 0x20, 0x02, 0x02, 0x00, 0x0C, 0x24,
58550x89, 0x4A, 0x00, 0x08, 0x21, 0x68, 0x20, 0x01, 0x04, 0x41, 0x82, 0x90,
58560x00, 0x00, 0x23, 0x91, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x43, 0x00,
58570x04, 0x41, 0x82, 0xA0, 0x01, 0x00, 0x08, 0x25, 0x2A, 0x10, 0x0B, 0x01,
58580x11, 0x00, 0x40, 0x10, 0x01, 0x00, 0x29, 0x25, 0xF6, 0xFF, 0x0C, 0x15,
58590x21, 0x20, 0x0A, 0x01, 0x06, 0x41, 0x43, 0x91, 0x00, 0x00, 0x25, 0x91,
58600x02, 0x00, 0xA2, 0x91, 0x1C, 0x00, 0x64, 0x30, 0x1C, 0x00, 0xA5, 0x30,
58610x03, 0x00, 0x42, 0x30, 0x03, 0x00, 0x63, 0x30, 0x2A, 0x30, 0x43, 0x00,
58620x2A, 0x38, 0xA4, 0x00, 0x0A, 0x10, 0x66, 0x00, 0x0A, 0x20, 0xA7, 0x00,
58630x25, 0x10, 0x44, 0x00, 0x85, 0x4A, 0x00, 0x08, 0x06, 0x41, 0x42, 0xA1,
58640x02, 0x80, 0x02, 0x3C, 0xC6, 0x5C, 0x43, 0x90, 0x02, 0x80, 0x02, 0x3C,
58650x44, 0xDF, 0x47, 0x24, 0x10, 0x00, 0x65, 0x30, 0x02, 0x80, 0x02, 0x3C,
58660x02, 0x80, 0x03, 0x3C, 0x54, 0xDF, 0x66, 0x24, 0x60, 0x1B, 0x44, 0x24,
58670xAC, 0x4A, 0x00, 0x08, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x90,
58680x07, 0x41, 0x82, 0x90, 0x01, 0x00, 0x08, 0x25, 0x24, 0x10, 0x43, 0x00,
58690x07, 0x41, 0x82, 0xA0, 0x10, 0x00, 0x02, 0x29, 0x07, 0x00, 0x40, 0x10,
58700x01, 0x00, 0x84, 0x24, 0x21, 0x10, 0x07, 0x01, 0xF6, 0xFF, 0xA0, 0x14,
58710x21, 0x18, 0x06, 0x01, 0x00, 0x00, 0x63, 0x90, 0xA5, 0x4A, 0x00, 0x08,
58720x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0xC0, 0x03, 0x21, 0x38, 0xE0, 0x02,
58730x3D, 0x00, 0x05, 0x24, 0xAB, 0x1A, 0x00, 0x0C, 0x24, 0x00, 0xA6, 0x27,
58740x48, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xA6, 0x8F,
58750x02, 0x80, 0x04, 0x3C, 0x84, 0x5C, 0x84, 0x24, 0xF4, 0x54, 0x00, 0x0C,
58760x02, 0x00, 0x45, 0x24, 0x2E, 0x47, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
58770x13, 0x4A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x05, 0x24,
58780x24, 0x00, 0xA6, 0x27, 0xAB, 0x1A, 0x00, 0x0C, 0x21, 0x38, 0xE0, 0x02,
58790x30, 0x00, 0x40, 0x10, 0x60, 0x1B, 0xA5, 0x26, 0x02, 0x00, 0x42, 0x90,
58800x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0x30, 0x2B, 0x00, 0x40, 0x10,
58810x02, 0x80, 0x02, 0x3C, 0xD3, 0x5C, 0x44, 0x90, 0x01, 0x00, 0x03, 0x24,
58820x3E, 0x00, 0x83, 0x10, 0x60, 0x1B, 0xA2, 0x26, 0xFC, 0x23, 0x43, 0x8C,
58830xFF, 0xEF, 0x04, 0x24, 0x00, 0x08, 0x63, 0x34, 0x24, 0x18, 0x64, 0x00,
58840xE9, 0x49, 0x00, 0x08, 0xFC, 0x23, 0x43, 0xAC, 0xF6, 0x01, 0xE2, 0x36,
58850x00, 0x00, 0x40, 0xA4, 0x49, 0x4A, 0x00, 0x08, 0x02, 0x80, 0x04, 0x3C,
58860x04, 0x41, 0x42, 0x96, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x42, 0x30,
58870x6A, 0xFF, 0x40, 0x10, 0x02, 0x80, 0x04, 0x3C, 0x00, 0x10, 0x02, 0x3C,
58880x25, 0x88, 0x22, 0x02, 0x0F, 0x00, 0x08, 0x24, 0x01, 0x00, 0x03, 0x24,
58890x0C, 0x00, 0x02, 0x25, 0x04, 0x10, 0x43, 0x00, 0x24, 0x10, 0x51, 0x00,
58900x16, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x08, 0x25,
58910xFA, 0xFF, 0x01, 0x05, 0x0C, 0x00, 0x02, 0x25, 0x00, 0x12, 0x16, 0x00,
58920x00, 0x1B, 0x16, 0x00, 0x25, 0x18, 0x62, 0x00, 0x00, 0x21, 0x16, 0x00,
58930x25, 0x18, 0x64, 0x00, 0x25, 0xB0, 0x02, 0x3C, 0x25, 0x18, 0x76, 0x00,
58940xF6, 0x01, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA4, 0x49, 0x4A, 0x00, 0x08,
58950x02, 0x80, 0x04, 0x3C, 0xFC, 0x23, 0xA2, 0x8C, 0xFF, 0xF7, 0x03, 0x24,
58960xFF, 0xEF, 0x04, 0x24, 0x24, 0x10, 0x43, 0x00, 0x24, 0x10, 0x44, 0x00,
58970xE9, 0x49, 0x00, 0x08, 0xFC, 0x23, 0xA2, 0xAC, 0xEC, 0x4A, 0x00, 0x08,
58980xFF, 0x00, 0x16, 0x31, 0x60, 0x1B, 0xA2, 0x26, 0x13, 0x4A, 0x00, 0x08,
58990xFC, 0x40, 0x40, 0xAC, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
59000x0E, 0x4A, 0x00, 0x08, 0xBC, 0x40, 0x40, 0xAC, 0x13, 0x4A, 0x00, 0x08,
59010xFC, 0x40, 0x20, 0xAE, 0x21, 0x20, 0x00, 0x02, 0x65, 0x0F, 0x00, 0x0C,
59020x21, 0x28, 0x00, 0x00, 0x0F, 0x4A, 0x00, 0x08, 0x60, 0x1B, 0xB1, 0x26,
59030xFC, 0x23, 0x43, 0x8C, 0xFF, 0xF7, 0x04, 0x24, 0x24, 0x18, 0x64, 0x00,
59040x00, 0x10, 0x63, 0x34, 0xE9, 0x49, 0x00, 0x08, 0xFC, 0x23, 0x43, 0xAC,
59050x02, 0x80, 0x04, 0x3C, 0xB0, 0x55, 0x84, 0x24, 0xE0, 0xFF, 0xBD, 0x27,
59060x18, 0x00, 0xBF, 0xAF, 0xFB, 0x51, 0x00, 0x0C, 0x74, 0x00, 0x84, 0x24,
59070x21, 0x28, 0x40, 0x00, 0x10, 0x00, 0xA4, 0x27, 0xF4, 0x54, 0x00, 0x0C,
59080x02, 0x00, 0x06, 0x24, 0x10, 0x00, 0xA2, 0x97, 0x25, 0xB0, 0x04, 0x3C,
59090x94, 0x00, 0x85, 0x34, 0x9A, 0x00, 0x87, 0x34, 0x26, 0xB0, 0x06, 0x3C,
59100x00, 0x08, 0x03, 0x24, 0x00, 0x00, 0xA2, 0xA4, 0x0A, 0x00, 0x0B, 0x24,
59110x00, 0x00, 0xE3, 0xA4, 0x98, 0x00, 0x88, 0x34, 0x96, 0x00, 0x89, 0x34,
59120x7A, 0x00, 0xCA, 0x34, 0x50, 0x00, 0x02, 0x24, 0x04, 0x00, 0x03, 0x24,
59130x00, 0x00, 0x02, 0xA5, 0x00, 0x00, 0x2B, 0xA5, 0x00, 0x00, 0x43, 0xA1,
59140x10, 0x00, 0xA2, 0x97, 0x89, 0x00, 0x83, 0x34, 0x14, 0x00, 0x07, 0x24,
59150x40, 0x11, 0x02, 0x00, 0xA0, 0xFF, 0x42, 0x24, 0xFF, 0xFF, 0x42, 0x30,
59160x9C, 0x00, 0x85, 0x34, 0x7C, 0x00, 0xC6, 0x34, 0x00, 0x00, 0xC2, 0xA4,
59170x44, 0x00, 0x84, 0x34, 0x00, 0x00, 0x67, 0xA0, 0x00, 0x00, 0xAB, 0xA0,
59180x00, 0x00, 0x82, 0x94, 0xFF, 0xFD, 0x03, 0x24, 0x18, 0x00, 0xBF, 0x8F,
59190x24, 0x10, 0x43, 0x00, 0x00, 0x00, 0x82, 0xA4, 0x00, 0x00, 0x83, 0x94,
59200x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24, 0x00, 0x02, 0x63, 0x34,
59210x20, 0x00, 0xBD, 0x27, 0x3A, 0x41, 0x40, 0xA0, 0x00, 0x00, 0x83, 0xA4,
59220x08, 0x00, 0xE0, 0x03, 0xB8, 0x40, 0x47, 0xA0, 0xD0, 0xFF, 0xBD, 0x27,
59230x10, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x10, 0x3C, 0xB0, 0x55, 0x04, 0x26,
59240x28, 0x00, 0xBF, 0xAF, 0x24, 0x00, 0xB5, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
59250x20, 0x00, 0xB4, 0xAF, 0x1C, 0x00, 0xB3, 0xAF, 0x18, 0x52, 0x00, 0x0C,
59260x18, 0x00, 0xB2, 0xAF, 0xFF, 0xFF, 0x51, 0x30, 0xB0, 0x55, 0x04, 0x26,
59270xFD, 0x51, 0x00, 0x0C, 0x02, 0x80, 0x15, 0x3C, 0x60, 0x1B, 0xA3, 0x26,
59280x01, 0x00, 0x24, 0x32, 0xB4, 0x40, 0x62, 0xA4, 0x03, 0x00, 0x80, 0x14,
59290x02, 0x00, 0x05, 0x24, 0x40, 0x10, 0x11, 0x00, 0x04, 0x00, 0x45, 0x30,
59300x02, 0x00, 0x02, 0x24, 0x5F, 0x00, 0xA2, 0x10, 0x60, 0x1B, 0xA2, 0x26,
59310x10, 0x00, 0x80, 0x10, 0x02, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x24,
59320x12, 0x00, 0x62, 0x10, 0x60, 0x1B, 0xB3, 0x26, 0x02, 0x80, 0x04, 0x3C,
59330x21, 0x28, 0x20, 0x02, 0x28, 0x00, 0xBF, 0x8F, 0x24, 0x00, 0xB5, 0x8F,
59340x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
59350x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0xEC, 0xE9, 0x84, 0x24,
59360x13, 0x58, 0x00, 0x08, 0x30, 0x00, 0xBD, 0x27, 0x40, 0x10, 0x11, 0x00,
59370x04, 0x00, 0x43, 0x30, 0x04, 0x00, 0x02, 0x24, 0xF0, 0xFF, 0x62, 0x14,
59380x60, 0x1B, 0xB3, 0x26, 0xB4, 0x40, 0x66, 0x96, 0xC4, 0x3D, 0x65, 0x92,
59390x02, 0x80, 0x04, 0x3C, 0xB0, 0x1B, 0x63, 0xA6, 0xFC, 0xE9, 0x84, 0x24,
59400x13, 0x58, 0x00, 0x0C, 0x25, 0xB0, 0x10, 0x3C, 0x50, 0x02, 0x03, 0x36,
59410x0F, 0x00, 0x02, 0x24, 0x00, 0x00, 0x62, 0xA0, 0x21, 0x28, 0x00, 0x00,
59420x95, 0x0E, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00, 0xC4, 0x3D, 0x64, 0x92,
59430x01, 0x00, 0x14, 0x24, 0x75, 0x0D, 0x00, 0x0C, 0x4C, 0x00, 0x10, 0x36,
59440x02, 0x80, 0x11, 0x3C, 0x00, 0x00, 0x14, 0xA2, 0xEA, 0x47, 0x00, 0x0C,
59450x00, 0x00, 0x00, 0x00, 0x1B, 0x53, 0x00, 0x0C, 0x10, 0x56, 0x24, 0x26,
59460x21, 0x28, 0x40, 0x00, 0x10, 0x56, 0x24, 0x26, 0x61, 0x53, 0x00, 0x0C,
59470x21, 0x90, 0x40, 0x00, 0x0F, 0x00, 0x50, 0x30, 0x10, 0x56, 0x24, 0x26,
59480x7A, 0x53, 0x00, 0x0C, 0x21, 0x28, 0x40, 0x02, 0x40, 0x02, 0x10, 0x36,
59490x02, 0x80, 0x04, 0x3C, 0x21, 0x88, 0x40, 0x00, 0x21, 0x30, 0x40, 0x00,
59500x21, 0x28, 0x00, 0x02, 0x13, 0x58, 0x00, 0x0C, 0x2C, 0xEA, 0x84, 0x24,
59510x21, 0x20, 0x00, 0x02, 0x63, 0x5E, 0x00, 0x74, 0x21, 0x28, 0x20, 0x02,
59520x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0x37, 0x3A, 0x84, 0x24,
59530xB4, 0x55, 0xA5, 0x24, 0x06, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C,
59540xD6, 0x1E, 0x74, 0xA2, 0x31, 0x46, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
59550x14, 0x4B, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x1B, 0x62, 0x96,
59560x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x34, 0xA9, 0x1B, 0x00, 0x0C,
59570xB0, 0x1B, 0x62, 0xA6, 0xE8, 0x39, 0x62, 0xAE, 0x35, 0x48, 0x00, 0x0C,
59580x01, 0x00, 0x04, 0x24, 0x60, 0x1B, 0xA2, 0x8E, 0x28, 0x00, 0xBF, 0x8F,
59590x20, 0x00, 0xB4, 0x8F, 0x21, 0x00, 0x42, 0x34, 0x60, 0x1B, 0xA2, 0xAE,
59600x1C, 0x00, 0xB3, 0x8F, 0x24, 0x00, 0xB5, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
59610x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
59620x30, 0x00, 0xBD, 0x27, 0x24, 0x40, 0x44, 0x8C, 0x01, 0x20, 0x03, 0x24,
59630xB0, 0x1B, 0x43, 0xA4, 0x02, 0x00, 0x85, 0x10, 0x0C, 0x00, 0x03, 0x24,
59640x0F, 0x00, 0x03, 0x24, 0x25, 0xB0, 0x02, 0x3C, 0x50, 0x02, 0x42, 0x34,
59650x00, 0x00, 0x43, 0xA0, 0x60, 0x1B, 0xB0, 0x26, 0xB0, 0x1B, 0x02, 0x96,
59660xB4, 0x40, 0x06, 0x96, 0xC4, 0x3D, 0x05, 0x92, 0x10, 0x00, 0x42, 0x34,
59670x02, 0x80, 0x04, 0x3C, 0xB0, 0x1B, 0x02, 0xA6, 0x40, 0xEA, 0x84, 0x24,
59680x13, 0x58, 0x00, 0x0C, 0x14, 0x40, 0x00, 0xAE, 0x21, 0x28, 0x00, 0x00,
59690x95, 0x0E, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00, 0xC4, 0x3D, 0x04, 0x92,
59700x75, 0x0D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xA9, 0x1B, 0x00, 0x0C,
59710x00, 0x00, 0x00, 0x00, 0xE8, 0x39, 0x02, 0xAE, 0x28, 0x00, 0xBF, 0x8F,
59720x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
59730x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
59740x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27,
59750x20, 0x00, 0xB2, 0xAF, 0x21, 0x90, 0x80, 0x00, 0x10, 0x00, 0xA4, 0x27,
59760x24, 0x00, 0xBF, 0xAF, 0x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF,
59770x8A, 0x40, 0x00, 0x0C, 0xFF, 0x00, 0xB0, 0x30, 0x02, 0x80, 0x02, 0x3C,
59780x60, 0x1B, 0x51, 0x24, 0x10, 0x00, 0xA4, 0x27, 0x01, 0x00, 0x02, 0x24,
59790x90, 0x40, 0x00, 0x0C, 0x4B, 0x41, 0x22, 0xA2, 0x02, 0x80, 0x04, 0x3C,
59800x30, 0x59, 0x84, 0x24, 0x21, 0x28, 0x00, 0x00, 0xE3, 0x54, 0x00, 0x0C,
59810x0F, 0x00, 0x06, 0x24, 0x21, 0x40, 0x00, 0x00, 0x18, 0x00, 0x00, 0x12,
59820x21, 0x60, 0x00, 0x00, 0x21, 0x68, 0x20, 0x02, 0x21, 0x10, 0x92, 0x01,
59830x01, 0x00, 0x49, 0x90, 0x00, 0x00, 0x4A, 0x90, 0x0D, 0x00, 0x20, 0x11,
59840x21, 0x30, 0x00, 0x00, 0x21, 0x58, 0xA0, 0x01, 0x01, 0x00, 0xC2, 0x24,
59850x21, 0x38, 0x46, 0x01, 0x01, 0x00, 0x03, 0x25, 0xFF, 0x00, 0x46, 0x30,
59860x0E, 0x00, 0x02, 0x2D, 0x21, 0x28, 0x0B, 0x01, 0x2B, 0x20, 0xC9, 0x00,
59870x08, 0x00, 0x40, 0x10, 0xFF, 0x00, 0x68, 0x30, 0xF6, 0xFF, 0x80, 0x14,
59880xD0, 0x3D, 0xA7, 0xA0, 0x03, 0x00, 0x82, 0x25, 0xFF, 0x00, 0x4C, 0x30,
59890x2B, 0x18, 0x90, 0x01, 0xEC, 0xFF, 0x60, 0x14, 0x21, 0x10, 0x92, 0x01,
59900x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
59910x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
59920x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27,
59930x10, 0x00, 0xBF, 0xAF, 0x90, 0x48, 0x00, 0x0C, 0xFE, 0xFF, 0x05, 0x24,
59940x10, 0x00, 0xBF, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
59950x18, 0x00, 0xBD, 0x27, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
59960x90, 0x48, 0x00, 0x0C, 0xFF, 0xFF, 0x05, 0x24, 0x10, 0x00, 0xBF, 0x8F,
59970x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
59980x25, 0xB0, 0x03, 0x3C, 0x01, 0x80, 0x02, 0x3C, 0xB0, 0x03, 0x65, 0x34,
59990xAC, 0x30, 0x42, 0x24, 0x18, 0x03, 0x63, 0x34, 0x00, 0x00, 0x62, 0xAC,
60000x00, 0x00, 0xA4, 0xAC, 0x00, 0x00, 0x83, 0x8C, 0x21, 0x10, 0x00, 0x00,
60010xFF, 0x3F, 0x63, 0x30, 0x00, 0x00, 0xA3, 0xAC, 0x08, 0x00, 0xE0, 0x03,
60020x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x06, 0x3C,
60030x02, 0x80, 0x08, 0x3C, 0x78, 0x00, 0xBE, 0xAF, 0x7C, 0x00, 0xBF, 0xAF,
60040x74, 0x00, 0xB7, 0xAF, 0x70, 0x00, 0xB6, 0xAF, 0x6C, 0x00, 0xB5, 0xAF,
60050x68, 0x00, 0xB4, 0xAF, 0x64, 0x00, 0xB3, 0xAF, 0x60, 0x00, 0xB2, 0xAF,
60060x5C, 0x00, 0xB1, 0xAF, 0x58, 0x00, 0xB0, 0xAF, 0xE8, 0xE9, 0xC2, 0x24,
60070x74, 0xEA, 0x03, 0x25, 0x01, 0x00, 0x44, 0x90, 0x01, 0x00, 0x65, 0x90,
60080xE8, 0xE9, 0xCB, 0x90, 0x74, 0xEA, 0x0A, 0x91, 0x02, 0x00, 0x47, 0x90,
60090x02, 0x00, 0x66, 0x90, 0x03, 0x00, 0x48, 0x90, 0x03, 0x00, 0x69, 0x90,
60100x00, 0x22, 0x04, 0x00, 0x00, 0x2A, 0x05, 0x00, 0x25, 0x20, 0x8B, 0x00,
60110x25, 0x28, 0xAA, 0x00, 0x00, 0x3C, 0x07, 0x00, 0x00, 0x34, 0x06, 0x00,
60120x25, 0x38, 0xE4, 0x00, 0x25, 0x30, 0xC5, 0x00, 0x00, 0x46, 0x08, 0x00,
60130x00, 0x4E, 0x09, 0x00, 0x25, 0x40, 0x07, 0x01, 0x25, 0x48, 0x26, 0x01,
60140x00, 0x02, 0x04, 0x24, 0x40, 0x00, 0xA8, 0xAF, 0x53, 0x21, 0x00, 0x0C,
60150x48, 0x00, 0xA9, 0xAF, 0xCF, 0x01, 0x40, 0x10, 0x21, 0xF0, 0x40, 0x00,
60160x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x52, 0x24, 0xC0, 0x3A, 0x45, 0x8E,
60170x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C, 0x78, 0xEA, 0x84, 0x24,
60180x08, 0x00, 0xD1, 0x97, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x10, 0x3C,
60190x25, 0x88, 0x22, 0x02, 0xB4, 0x55, 0x10, 0x26, 0x24, 0x00, 0x24, 0x26,
60200x21, 0x28, 0x00, 0x02, 0x20, 0x00, 0x20, 0xA6, 0xF4, 0x54, 0x00, 0x0C,
60210x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C, 0x2A, 0x00, 0x24, 0x26,
60220x48, 0x37, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
60230x21, 0x28, 0x00, 0x02, 0x06, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x0C,
60240x30, 0x00, 0x24, 0x26, 0x18, 0x00, 0x03, 0x24, 0x0C, 0x00, 0xC3, 0xAF,
60250xE4, 0x1D, 0x42, 0x96, 0x20, 0x00, 0x25, 0x26, 0x38, 0x00, 0x37, 0x26,
60260xFF, 0x0F, 0x43, 0x30, 0x00, 0x19, 0x03, 0x00, 0x02, 0x22, 0x03, 0x00,
60270x01, 0x00, 0x42, 0x24, 0xE4, 0x1D, 0x42, 0xA6, 0x17, 0x00, 0xA4, 0xA0,
60280x02, 0x80, 0x04, 0x3C, 0x16, 0x00, 0xA3, 0xA0, 0x16, 0x52, 0x00, 0x0C,
60290x24, 0x56, 0x84, 0x24, 0x21, 0x28, 0x40, 0x00, 0x21, 0x20, 0xE0, 0x02,
60300xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x24, 0x3A, 0x00, 0x24, 0x26,
60310x18, 0x00, 0xA5, 0x27, 0x02, 0x00, 0x06, 0x24, 0x03, 0x00, 0x02, 0x24,
60320xF4, 0x54, 0x00, 0x0C, 0x18, 0x00, 0xA2, 0xA7, 0x0C, 0x00, 0xC3, 0x8F,
60330x02, 0x80, 0x07, 0x3C, 0x3C, 0x00, 0x24, 0x26, 0x04, 0x00, 0x63, 0x24,
60340x0C, 0x00, 0xC3, 0xAF, 0x5C, 0x3A, 0x46, 0x8E, 0x0C, 0x00, 0xC3, 0x27,
60350xC0, 0x55, 0xE7, 0x24, 0x21, 0x28, 0x00, 0x00, 0x54, 0x00, 0xA3, 0xAF,
60360x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA3, 0xAF, 0x20, 0x00, 0xA4, 0x27,
60370x50, 0x00, 0xA5, 0x27, 0x05, 0x53, 0x00, 0x0C, 0x21, 0xB8, 0x40, 0x00,
60380x50, 0x00, 0xA8, 0x8F, 0x21, 0x88, 0x00, 0x00, 0x52, 0x00, 0x00, 0x11,
60390x21, 0x80, 0x00, 0x00, 0x21, 0x38, 0x40, 0x02, 0x18, 0x00, 0xA9, 0x27,
60400x21, 0x10, 0x31, 0x01, 0x08, 0x00, 0x46, 0x90, 0x21, 0x20, 0x00, 0x00,
60410x7F, 0x00, 0xC5, 0x30, 0x21, 0x10, 0x87, 0x00, 0xB0, 0x3A, 0x43, 0x90,
60420x01, 0x00, 0x84, 0x24, 0x7F, 0x00, 0x63, 0x30, 0x3D, 0x00, 0xA3, 0x10,
60430x0D, 0x00, 0x82, 0x2C, 0xFA, 0xFF, 0x40, 0x14, 0x21, 0x10, 0x87, 0x00,
60440x01, 0x00, 0x31, 0x26, 0x2B, 0x10, 0x28, 0x02, 0xF2, 0xFF, 0x40, 0x14,
60450x21, 0x10, 0x31, 0x01, 0x09, 0x00, 0x02, 0x2E, 0x3D, 0x00, 0x40, 0x14,
60460x21, 0x20, 0xE0, 0x02, 0x54, 0x00, 0xA2, 0x8F, 0x01, 0x00, 0x05, 0x24,
60470x08, 0x00, 0x06, 0x24, 0x30, 0x00, 0xA7, 0x27, 0x25, 0x52, 0x00, 0x0C,
60480x10, 0x00, 0xA2, 0xAF, 0x54, 0x00, 0xA3, 0x8F, 0x21, 0x20, 0x40, 0x00,
60490xF8, 0xFF, 0x06, 0x26, 0x32, 0x00, 0x05, 0x24, 0x38, 0x00, 0xA7, 0x27,
60500x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA3, 0xAF, 0x21, 0xB8, 0x40, 0x00,
60510x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x44, 0x24, 0x24, 0x40, 0x83, 0x8C,
60520x02, 0x00, 0x02, 0x24, 0x37, 0x00, 0x62, 0x14, 0x00, 0x00, 0x00, 0x00,
60530xC0, 0x3A, 0x83, 0x8C, 0x0C, 0x00, 0x11, 0x24, 0x2B, 0x10, 0x23, 0x02,
60540x32, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C, 0x24, 0x56, 0x46, 0x24,
60550x21, 0x20, 0x60, 0x00, 0xE0, 0x4C, 0x00, 0x08, 0x30, 0x00, 0x05, 0x24,
60560x01, 0x00, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x51, 0x00,
60570x02, 0x00, 0x51, 0x24, 0x2B, 0x18, 0x24, 0x02, 0x27, 0x00, 0x60, 0x10,
60580x00, 0x00, 0x00, 0x00, 0x21, 0x18, 0x26, 0x02, 0x00, 0x00, 0x62, 0x90,
60590x00, 0x00, 0x00, 0x00, 0xF5, 0xFF, 0x45, 0x14, 0x02, 0x80, 0x07, 0x3C,
60600x01, 0x00, 0x66, 0x90, 0x54, 0x00, 0xA2, 0x8F, 0x26, 0x56, 0xE7, 0x24,
60610x21, 0x20, 0xE0, 0x02, 0x21, 0x38, 0x27, 0x02, 0x30, 0x00, 0x05, 0x24,
60620x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF, 0x06, 0x4D, 0x00, 0x08,
60630x21, 0xB8, 0x40, 0x00, 0x21, 0x10, 0x30, 0x01, 0x18, 0x00, 0x46, 0xA0,
60640x50, 0x00, 0xA8, 0x8F, 0x01, 0x00, 0x31, 0x26, 0x2B, 0x10, 0x28, 0x02,
60650xB4, 0xFF, 0x40, 0x14, 0x01, 0x00, 0x10, 0x26, 0xBA, 0x4C, 0x00, 0x08,
60660x09, 0x00, 0x02, 0x2E, 0x54, 0x00, 0xA3, 0x8F, 0x21, 0x20, 0xE0, 0x02,
60670x21, 0x30, 0x00, 0x02, 0x01, 0x00, 0x05, 0x24, 0x30, 0x00, 0xA7, 0x27,
60680x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA3, 0xAF, 0x21, 0xB8, 0x40, 0x00,
60690x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x44, 0x24, 0x24, 0x40, 0x83, 0x8C,
60700x02, 0x00, 0x02, 0x24, 0xCB, 0xFF, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
60710x2B, 0x1B, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x40, 0x14,
60720x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x43, 0x24, 0xC0, 0x3A, 0x62, 0x8C,
60730x0C, 0x00, 0x11, 0x24, 0x2B, 0x10, 0x22, 0x02, 0x11, 0x00, 0x40, 0x10,
60740x02, 0x80, 0x02, 0x3C, 0x21, 0x80, 0x60, 0x00, 0x24, 0x56, 0x52, 0x24,
60750x21, 0xA8, 0x60, 0x00, 0x02, 0x80, 0x13, 0x3C, 0x21, 0x20, 0x32, 0x02,
60760x00, 0x00, 0x83, 0x90, 0x2D, 0x00, 0x02, 0x24, 0xD6, 0x00, 0x62, 0x10,
60770x02, 0x80, 0x05, 0x3C, 0x01, 0x00, 0x82, 0x90, 0xC0, 0x3A, 0x03, 0x8E,
60780x21, 0x10, 0x51, 0x00, 0x02, 0x00, 0x51, 0x24, 0x2B, 0x18, 0x23, 0x02,
60790xF6, 0xFF, 0x60, 0x14, 0x21, 0x20, 0x32, 0x02, 0x02, 0x80, 0x02, 0x3C,
60800x60, 0x1B, 0x44, 0x24, 0x24, 0x40, 0x83, 0x8C, 0x02, 0x00, 0x02, 0x24,
60810x86, 0x00, 0x62, 0x10, 0x0C, 0x00, 0x11, 0x24, 0x02, 0x80, 0x02, 0x3C,
60820x60, 0x1B, 0x43, 0x24, 0xC0, 0x3A, 0x62, 0x8C, 0x0C, 0x00, 0x11, 0x24,
60830x2B, 0x10, 0x22, 0x02, 0x26, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
60840x24, 0x56, 0x56, 0x24, 0x21, 0xA8, 0x60, 0x00, 0xDD, 0x00, 0x14, 0x24,
60850x39, 0x4D, 0x00, 0x08, 0x02, 0x80, 0x13, 0x3C, 0x01, 0x00, 0x02, 0x92,
60860xC0, 0x3A, 0xA3, 0x8E, 0x21, 0x10, 0x51, 0x00, 0x02, 0x00, 0x51, 0x24,
60870x2B, 0x18, 0x23, 0x02, 0x1B, 0x00, 0x60, 0x10, 0x02, 0x80, 0x03, 0x3C,
60880x21, 0x80, 0x36, 0x02, 0x00, 0x00, 0x02, 0x92, 0x02, 0x00, 0x12, 0x26,
60890x21, 0x20, 0x40, 0x02, 0x70, 0xDE, 0x65, 0x26, 0xF3, 0xFF, 0x54, 0x14,
60900x06, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
60910xEF, 0xFF, 0x40, 0x14, 0x21, 0x20, 0xE0, 0x02, 0x54, 0x00, 0xA2, 0x8F,
60920xDD, 0x00, 0x05, 0x24, 0x21, 0x38, 0x40, 0x02, 0x07, 0x00, 0x06, 0x24,
60930x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF, 0x08, 0x00, 0x04, 0x92,
60940x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x65, 0x24, 0x21, 0xB8, 0x40, 0x00,
60950x01, 0x00, 0x03, 0x24, 0x02, 0x80, 0x02, 0x3C, 0x08, 0x5E, 0x44, 0xA0,
60960xBC, 0x40, 0xA3, 0xAC, 0x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x64, 0x24,
60970xC0, 0x3A, 0x82, 0x8C, 0x0C, 0x00, 0x11, 0x24, 0x2B, 0x10, 0x22, 0x02,
60980x20, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
60990x24, 0x56, 0x56, 0x24, 0x26, 0x56, 0x75, 0x24, 0x21, 0xA0, 0x80, 0x00,
61000x66, 0x4D, 0x00, 0x08, 0xDD, 0x00, 0x13, 0x24, 0x01, 0x00, 0x02, 0x92,
61010xC0, 0x3A, 0x83, 0x8E, 0x21, 0x10, 0x51, 0x00, 0x02, 0x00, 0x51, 0x24,
61020x2B, 0x18, 0x23, 0x02, 0x14, 0x00, 0x60, 0x10, 0x02, 0x80, 0x02, 0x3C,
61030x21, 0x80, 0x36, 0x02, 0x00, 0x00, 0x02, 0x92, 0x21, 0x90, 0x35, 0x02,
61040x21, 0x20, 0x40, 0x02, 0x48, 0x00, 0xA5, 0x27, 0xF3, 0xFF, 0x53, 0x14,
61050x04, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
61060xEF, 0xFF, 0x40, 0x14, 0x21, 0x20, 0xE0, 0x02, 0x01, 0x00, 0x06, 0x92,
61070x54, 0x00, 0xA2, 0x8F, 0x21, 0x38, 0x40, 0x02, 0xDD, 0x00, 0x05, 0x24,
61080x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF, 0x21, 0xB8, 0x40, 0x00,
61090x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x44, 0x24, 0xFC, 0x40, 0x83, 0x8C,
61100x01, 0x00, 0x02, 0x24, 0x61, 0x00, 0x62, 0x10, 0x06, 0x00, 0x02, 0x24,
61110x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x62, 0x24, 0xC0, 0x3A, 0x43, 0x8C,
61120x0C, 0x00, 0x11, 0x24, 0x2B, 0x10, 0x23, 0x02, 0x10, 0x00, 0x40, 0x10,
61130x02, 0x80, 0x02, 0x3C, 0x24, 0x56, 0x46, 0x24, 0x21, 0x20, 0x60, 0x00,
61140x44, 0x00, 0x05, 0x24, 0x21, 0x80, 0x26, 0x02, 0x00, 0x00, 0x02, 0x92,
61150x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00,
61160x01, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x51, 0x00,
61170x02, 0x00, 0x51, 0x24, 0x2B, 0x18, 0x24, 0x02, 0xF6, 0xFF, 0x60, 0x14,
61180x21, 0x80, 0x26, 0x02, 0x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x62, 0x24,
61190xB6, 0x40, 0x43, 0x90, 0x04, 0x00, 0x07, 0x24, 0x21, 0x20, 0xC0, 0x03,
61200x01, 0x00, 0x63, 0x38, 0x0B, 0x38, 0x03, 0x00, 0x21, 0x28, 0x00, 0x00,
61210xDF, 0x0D, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00, 0x21, 0x10, 0x00, 0x00,
61220x7C, 0x00, 0xBF, 0x8F, 0x78, 0x00, 0xBE, 0x8F, 0x74, 0x00, 0xB7, 0x8F,
61230x70, 0x00, 0xB6, 0x8F, 0x6C, 0x00, 0xB5, 0x8F, 0x68, 0x00, 0xB4, 0x8F,
61240x64, 0x00, 0xB3, 0x8F, 0x60, 0x00, 0xB2, 0x8F, 0x5C, 0x00, 0xB1, 0x8F,
61250x58, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x80, 0x00, 0xBD, 0x27,
61260xC0, 0x3A, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x10, 0x22, 0x02,
61270x77, 0xFF, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
61280x24, 0x56, 0x56, 0x24, 0x26, 0x56, 0x75, 0x24, 0x21, 0xA0, 0x80, 0x00,
61290xBD, 0x4D, 0x00, 0x08, 0xDD, 0x00, 0x13, 0x24, 0x01, 0x00, 0x02, 0x92,
61300xC0, 0x3A, 0x83, 0x8E, 0x21, 0x10, 0x51, 0x00, 0x02, 0x00, 0x51, 0x24,
61310x2B, 0x18, 0x23, 0x02, 0x6B, 0xFF, 0x60, 0x10, 0x02, 0x80, 0x02, 0x3C,
61320x21, 0x80, 0x36, 0x02, 0x00, 0x00, 0x02, 0x92, 0x21, 0x90, 0x35, 0x02,
61330x21, 0x20, 0x40, 0x02, 0x40, 0x00, 0xA5, 0x27, 0xF3, 0xFF, 0x53, 0x14,
61340x04, 0x00, 0x06, 0x24, 0x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
61350xEF, 0xFF, 0x40, 0x14, 0x21, 0x20, 0xE0, 0x02, 0x01, 0x00, 0x06, 0x92,
61360x54, 0x00, 0xA3, 0x8F, 0x21, 0x38, 0x40, 0x02, 0xDD, 0x00, 0x05, 0x24,
61370x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA3, 0xAF, 0x26, 0x4D, 0x00, 0x08,
61380x21, 0xB8, 0x40, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C,
61390x8C, 0xEA, 0x84, 0x24, 0x01, 0x00, 0x06, 0x92, 0x54, 0x00, 0xA2, 0x8F,
61400x02, 0x80, 0x07, 0x3C, 0x26, 0x56, 0xE7, 0x24, 0x21, 0x38, 0x27, 0x02,
61410x21, 0x20, 0xE0, 0x02, 0x44, 0x00, 0x05, 0x24, 0x25, 0x52, 0x00, 0x0C,
61420x10, 0x00, 0xA2, 0xAF, 0x95, 0x4D, 0x00, 0x08, 0x02, 0x80, 0x03, 0x3C,
61430xB6, 0x40, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x62, 0x10,
61440x05, 0x00, 0x02, 0x24, 0x9C, 0xFF, 0x62, 0x14, 0x02, 0x80, 0x03, 0x3C,
61450x02, 0x80, 0x07, 0x3C, 0x21, 0x20, 0xE0, 0x02, 0x34, 0xDE, 0xE7, 0x24,
61460xDD, 0x00, 0x05, 0x24, 0x06, 0x00, 0x06, 0x24, 0x54, 0x00, 0xA3, 0x8F,
61470x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA3, 0xAF, 0x7E, 0x4D, 0x00, 0x08,
61480x21, 0xB8, 0x40, 0x00, 0x02, 0x80, 0x14, 0x3C, 0x26, 0x56, 0xA5, 0x24,
61490x21, 0x28, 0x25, 0x02, 0x64, 0x5C, 0x84, 0x26, 0xF4, 0x54, 0x00, 0x0C,
61500x20, 0x00, 0x06, 0x24, 0x02, 0x80, 0x03, 0x3C, 0xD9, 0x5C, 0x62, 0x90,
61510x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
61520x04, 0x41, 0x02, 0x96, 0x00, 0x00, 0x00, 0x00, 0xBD, 0xFF, 0x42, 0x30,
61530x04, 0x41, 0x02, 0xA6, 0x02, 0x80, 0x02, 0x3C, 0xC4, 0xDF, 0x44, 0x8C,
61540x04, 0x41, 0xA3, 0x96, 0x20, 0x00, 0x80, 0x10, 0x0C, 0x00, 0x62, 0x34,
61550x00, 0x01, 0x42, 0x34, 0x04, 0x41, 0xA2, 0xA6, 0x02, 0x80, 0x03, 0x3C,
61560xC6, 0x5C, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x30,
61570x15, 0x00, 0x40, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x05, 0x3C,
61580x67, 0x5C, 0x64, 0x26, 0x44, 0xDF, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C,
61590x10, 0x00, 0x06, 0x24, 0x21, 0x10, 0x32, 0x02, 0x01, 0x00, 0x46, 0x90,
61600x54, 0x00, 0xA3, 0x8F, 0x21, 0x20, 0xE0, 0x02, 0x64, 0x5C, 0x87, 0x26,
61610x2D, 0x00, 0x05, 0x24, 0x25, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA3, 0xAF,
61620x21, 0xB8, 0x40, 0x00, 0x01, 0x00, 0x02, 0x24, 0x20, 0x4D, 0x00, 0x08,
61630xFC, 0x40, 0x02, 0xAE, 0x04, 0x41, 0x02, 0x96, 0xFC, 0x4D, 0x00, 0x08,
61640x02, 0x00, 0x42, 0x34, 0x67, 0x5C, 0x64, 0x26, 0x0D, 0x4E, 0x00, 0x08,
61650x54, 0xDF, 0xA5, 0x24, 0x04, 0x4E, 0x00, 0x08, 0x04, 0x41, 0xA2, 0xA6,
61660x02, 0x80, 0x02, 0x3C, 0x34, 0xDE, 0x42, 0x24, 0x06, 0x00, 0x48, 0x90,
61670x02, 0x00, 0x03, 0x24, 0x21, 0x20, 0xE0, 0x02, 0x01, 0x00, 0x08, 0x35,
61680x21, 0x38, 0x40, 0x00, 0xDD, 0x00, 0x05, 0x24, 0x07, 0x00, 0x06, 0x24,
61690x04, 0x00, 0x43, 0xA0, 0xE9, 0x4D, 0x00, 0x08, 0x06, 0x00, 0x48, 0xA0,
61700x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0xAC, 0xE8, 0x84, 0x24,
61710x13, 0x58, 0x00, 0x0C, 0x64, 0xEA, 0xA5, 0x24, 0x9F, 0x4D, 0x00, 0x08,
61720xFF, 0xFF, 0x02, 0x24, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
61730xB0, 0x1B, 0x43, 0x94, 0x32, 0x00, 0x04, 0x24, 0xCC, 0x39, 0x44, 0xAC,
61740x9F, 0xFE, 0x63, 0x30, 0x80, 0x00, 0x63, 0x34, 0xB0, 0x1B, 0x43, 0xA4,
61750x18, 0x40, 0x40, 0xAC, 0x1C, 0x40, 0x40, 0xAC, 0x38, 0x4C, 0x00, 0x08,
61760xB0, 0x39, 0x40, 0xAC, 0xE8, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C,
61770x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF, 0x60, 0x1B, 0x50, 0x24,
61780x1C, 0x40, 0x03, 0x8E, 0xFE, 0xFF, 0x04, 0x24, 0x01, 0x00, 0x63, 0x24,
61790x03, 0x00, 0x62, 0x2C, 0x12, 0x00, 0x40, 0x10, 0x1C, 0x40, 0x03, 0xAE,
61800xB0, 0x1B, 0x02, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x30,
61810x05, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xBF, 0x8F,
61820x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
61830x38, 0x4C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x03, 0x24,
61840xCC, 0x39, 0x03, 0xAE, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
61850x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xB0, 0x1B, 0x02, 0x96,
61860x00, 0x00, 0x00, 0x00, 0xFF, 0xDF, 0x42, 0x30, 0x35, 0x48, 0x00, 0x0C,
61870xB0, 0x1B, 0x02, 0xA6, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
61880x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xD0, 0xFF, 0xBD, 0x27,
61890x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
61900x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x2C, 0x00, 0xBF, 0xAF,
61910x02, 0x00, 0x82, 0x90, 0x02, 0x80, 0x14, 0x3C, 0x60, 0x1B, 0x92, 0x26,
61920xB0, 0x1B, 0x43, 0x96, 0x00, 0x00, 0x85, 0x8C, 0x0F, 0x00, 0x42, 0x30,
61930xC0, 0x10, 0x02, 0x00, 0x21, 0x80, 0x44, 0x00, 0x01, 0x00, 0x63, 0x30,
61940xFF, 0x3F, 0xB3, 0x30, 0x18, 0x00, 0x11, 0x26, 0x0A, 0x00, 0x60, 0x14,
61950x21, 0x20, 0x00, 0x00, 0x2C, 0x00, 0xBF, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
61960x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
61970x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x80, 0x00, 0x08, 0x00, 0xE0, 0x03,
61980x30, 0x00, 0xBD, 0x27, 0x39, 0x53, 0x00, 0x0C, 0x21, 0x20, 0x20, 0x02,
61990x02, 0x80, 0x04, 0x3C, 0x48, 0x37, 0x84, 0x24, 0x21, 0x28, 0x40, 0x00,
62000x1D, 0x55, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0xEF, 0xFF, 0x40, 0x14,
62010x21, 0x20, 0x00, 0x00, 0xB0, 0x1B, 0x42, 0x96, 0x00, 0x00, 0x00, 0x00,
62020x00, 0x10, 0x42, 0x30, 0xEA, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
62030x18, 0x00, 0x03, 0x96, 0x04, 0x00, 0x04, 0x24, 0x21, 0x10, 0x80, 0x00,
62040x00, 0x40, 0x63, 0x30, 0x0A, 0x10, 0x03, 0x00, 0x21, 0x10, 0x22, 0x02,
62050x1C, 0x00, 0x43, 0x94, 0x1A, 0x00, 0x45, 0x94, 0x2F, 0x00, 0x60, 0x14,
62060x02, 0x00, 0x02, 0x24, 0x14, 0x00, 0xA2, 0x10, 0x01, 0x00, 0x02, 0x24,
62070x0E, 0x00, 0xA4, 0x14, 0x02, 0x80, 0x04, 0x3C, 0x24, 0x40, 0x43, 0x8E,
62080x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x62, 0x10, 0x60, 0x1B, 0x83, 0x26,
62090xB0, 0x1B, 0x62, 0x94, 0xFF, 0xFF, 0x04, 0x24, 0xFF, 0xDF, 0x42, 0x30,
62100x7B, 0x4E, 0x00, 0x08, 0xB0, 0x1B, 0x62, 0xA4, 0x36, 0x4E, 0x00, 0x0C,
62110x00, 0x00, 0x00, 0x00, 0x7B, 0x4E, 0x00, 0x08, 0x21, 0x20, 0x00, 0x00,
62120x13, 0x58, 0x00, 0x0C, 0x04, 0xEB, 0x84, 0x24, 0xA4, 0x4E, 0x00, 0x08,
62130x60, 0x1B, 0x83, 0x26, 0x24, 0x40, 0x43, 0x8E, 0x00, 0x00, 0x00, 0x00,
62140xF5, 0xFF, 0x62, 0x14, 0xE2, 0xFF, 0x67, 0x26, 0x36, 0x00, 0x04, 0x26,
62150x10, 0x00, 0x05, 0x24, 0xAB, 0x1A, 0x00, 0x0C, 0x10, 0x00, 0xA6, 0x27,
62160x16, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xA6, 0x8F,
62170x02, 0x80, 0x04, 0x3C, 0x94, 0x5B, 0x84, 0x24, 0xF4, 0x54, 0x00, 0x0C,
62180x02, 0x00, 0x45, 0x24, 0xB0, 0x1B, 0x43, 0x96, 0x21, 0x20, 0x00, 0x00,
62190x03, 0x00, 0x02, 0x24, 0xDF, 0xFF, 0x63, 0x30, 0x40, 0x00, 0x63, 0x34,
62200xB0, 0x1B, 0x43, 0xA6, 0x2D, 0x14, 0x00, 0x0C, 0x20, 0x40, 0x42, 0xAE,
62210x7B, 0x4E, 0x00, 0x08, 0x21, 0x20, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
62220x2C, 0xEB, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C, 0x21, 0x28, 0x60, 0x00,
62230xA4, 0x4E, 0x00, 0x08, 0x60, 0x1B, 0x83, 0x26, 0x02, 0x80, 0x04, 0x3C,
62240x13, 0x58, 0x00, 0x0C, 0x48, 0xEB, 0x84, 0x24, 0xA4, 0x4E, 0x00, 0x08,
62250x60, 0x1B, 0x83, 0x26, 0x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x63, 0x24,
62260xB0, 0x1B, 0x62, 0x94, 0x01, 0x00, 0x05, 0x24, 0x21, 0x20, 0x00, 0x00,
62270xEF, 0xFF, 0x42, 0x30, 0x20, 0x00, 0x42, 0x34, 0xB0, 0x1B, 0x62, 0xA4,
62280x32, 0x00, 0x02, 0x24, 0x20, 0x40, 0x65, 0xAC, 0xB0, 0x39, 0x62, 0xAC,
62290xCC, 0x39, 0x60, 0xAC, 0x18, 0x40, 0x60, 0xAC, 0x2D, 0x14, 0x00, 0x08,
62300x1C, 0x40, 0x60, 0xAC, 0xE8, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x07, 0x3C,
62310x14, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x60, 0x1B, 0xE6, 0x24,
62320x18, 0x40, 0xC2, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x24,
62330x03, 0x00, 0xA3, 0x2C, 0x0E, 0x00, 0x60, 0x14, 0x60, 0x1B, 0xF0, 0x24,
62340x24, 0x40, 0xC3, 0x8C, 0x03, 0x00, 0x02, 0x24, 0x16, 0x00, 0x62, 0x10,
62350xFF, 0xFF, 0x04, 0x24, 0xB0, 0x1B, 0xC2, 0x94, 0x18, 0x40, 0xC5, 0xAC,
62360xFF, 0xDF, 0x42, 0x30, 0x35, 0x48, 0x00, 0x0C, 0xB0, 0x1B, 0xC2, 0xA4,
62370x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
62380x18, 0x00, 0xBD, 0x27, 0xB0, 0x1B, 0x03, 0x96, 0xBF, 0xFF, 0x02, 0x24,
62390x18, 0x40, 0xC5, 0xAC, 0x24, 0x10, 0x62, 0x00, 0x80, 0x00, 0x63, 0x30,
62400x21, 0x20, 0x00, 0x00, 0x0F, 0x00, 0x60, 0x10, 0x20, 0x00, 0x45, 0x34,
62410x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
62420x18, 0x00, 0xBD, 0x27, 0xB0, 0x1B, 0x03, 0x96, 0x01, 0x00, 0x02, 0x24,
62430x24, 0x40, 0xC2, 0xAC, 0xBF, 0xFF, 0x02, 0x24, 0x24, 0x10, 0x62, 0x00,
62440x80, 0x00, 0x63, 0x30, 0x18, 0x40, 0xC0, 0xAC, 0x21, 0x20, 0x00, 0x00,
62450xF3, 0xFF, 0x60, 0x14, 0x20, 0x00, 0x45, 0x34, 0x01, 0x00, 0x02, 0x24,
62460x20, 0x40, 0x02, 0xAE, 0x2D, 0x14, 0x00, 0x0C, 0xB0, 0x1B, 0x05, 0xA6,
62470x32, 0x00, 0x03, 0x24, 0xB0, 0x39, 0x03, 0xAE, 0x14, 0x00, 0xBF, 0x8F,
62480x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
62490xD0, 0xFF, 0xBD, 0x27, 0x20, 0x00, 0xB2, 0xAF, 0x21, 0x90, 0x80, 0x00,
62500x00, 0x01, 0x04, 0x24, 0x24, 0x00, 0xB3, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
62510x21, 0x98, 0xA0, 0x00, 0x28, 0x00, 0xBF, 0xAF, 0x53, 0x21, 0x00, 0x0C,
62520x18, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
62530x21, 0x88, 0x40, 0x00, 0x58, 0xEC, 0x84, 0x24, 0x38, 0x00, 0x40, 0x10,
62540x48, 0xEC, 0xA5, 0x24, 0x13, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
62550x08, 0x00, 0x30, 0x96, 0x02, 0x80, 0x02, 0x3C, 0x21, 0x28, 0x40, 0x02,
62560x25, 0x80, 0x02, 0x02, 0x24, 0x00, 0x04, 0x26, 0x20, 0x00, 0x00, 0xA6,
62570xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C,
62580x2A, 0x00, 0x04, 0x26, 0x48, 0x37, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C,
62590x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C, 0x30, 0x00, 0x04, 0x26,
62600xB4, 0x55, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
62610x20, 0x00, 0x03, 0x96, 0x18, 0x00, 0x02, 0x24, 0x02, 0x80, 0x05, 0x3C,
62620x03, 0xFF, 0x63, 0x30, 0xC0, 0x00, 0x63, 0x34, 0x20, 0x00, 0x03, 0xA6,
62630x60, 0x1B, 0xA5, 0x24, 0x0C, 0x00, 0x22, 0xAE, 0xE4, 0x1D, 0xA3, 0x94,
62640x20, 0x00, 0x07, 0x26, 0x38, 0x00, 0x04, 0x26, 0xFF, 0x0F, 0x62, 0x30,
62650x00, 0x11, 0x02, 0x00, 0x02, 0x32, 0x02, 0x00, 0x01, 0x00, 0x63, 0x24,
62660xE4, 0x1D, 0xA3, 0xA4, 0x17, 0x00, 0xE6, 0xA0, 0x16, 0x00, 0xE2, 0xA0,
62670x10, 0x00, 0xA6, 0x27, 0x0C, 0x00, 0x27, 0x26, 0x02, 0x00, 0x05, 0x24,
62680x4C, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB3, 0xA7, 0x21, 0x20, 0x20, 0x02,
62690x21, 0x28, 0x00, 0x00, 0x21, 0x30, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x0C,
62700x21, 0x38, 0x00, 0x00, 0x28, 0x00, 0xBF, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
62710x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
62720x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x04, 0x3C,
62730x13, 0x58, 0x00, 0x0C, 0xAC, 0xE8, 0x84, 0x24, 0x28, 0x00, 0xBF, 0x8F,
62740x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
62750x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
62760xD0, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB1, 0xAF, 0x21, 0x88, 0x80, 0x00,
62770x00, 0x01, 0x04, 0x24, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
62780x21, 0x98, 0xA0, 0x00, 0x28, 0x00, 0xBF, 0xAF, 0x53, 0x21, 0x00, 0x0C,
62790x18, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
62800x21, 0x90, 0x40, 0x00, 0x78, 0xEC, 0x84, 0x24, 0x3B, 0x00, 0x40, 0x10,
62810x68, 0xEC, 0xA5, 0x24, 0x13, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
62820x08, 0x00, 0x50, 0x96, 0x02, 0x80, 0x02, 0x3C, 0x21, 0x28, 0x20, 0x02,
62830x25, 0x80, 0x02, 0x02, 0x24, 0x00, 0x04, 0x26, 0x20, 0x00, 0x00, 0xA6,
62840xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C,
62850x2A, 0x00, 0x04, 0x26, 0x48, 0x37, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C,
62860x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C, 0x30, 0x00, 0x04, 0x26,
62870xB4, 0x55, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
62880x20, 0x00, 0x03, 0x96, 0x18, 0x00, 0x02, 0x24, 0x02, 0x80, 0x11, 0x3C,
62890x03, 0xFF, 0x63, 0x30, 0xA0, 0x00, 0x63, 0x34, 0x20, 0x00, 0x03, 0xA6,
62900x60, 0x1B, 0x31, 0x26, 0x0C, 0x00, 0x42, 0xAE, 0xE4, 0x1D, 0x23, 0x96,
62910x20, 0x00, 0x06, 0x26, 0x38, 0x00, 0x04, 0x26, 0xFF, 0x0F, 0x62, 0x30,
62920x00, 0x11, 0x02, 0x00, 0x02, 0x2A, 0x02, 0x00, 0x01, 0x00, 0x63, 0x24,
62930xE4, 0x1D, 0x23, 0xA6, 0x0C, 0x00, 0x47, 0x26, 0x17, 0x00, 0xC5, 0xA0,
62940x16, 0x00, 0xC2, 0xA0, 0x02, 0x00, 0x05, 0x24, 0x10, 0x00, 0xA6, 0x27,
62950x4C, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xB3, 0xA7, 0xB6, 0x40, 0x23, 0x92,
62960x04, 0x00, 0x07, 0x24, 0x21, 0x20, 0x40, 0x02, 0x01, 0x00, 0x63, 0x38,
62970x0B, 0x38, 0x03, 0x00, 0x21, 0x28, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x0C,
62980x21, 0x30, 0x00, 0x00, 0x28, 0x00, 0xBF, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
62990x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
63000x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x04, 0x3C,
63010x13, 0x58, 0x00, 0x0C, 0xAC, 0xE8, 0x84, 0x24, 0x28, 0x00, 0xBF, 0x8F,
63020x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
63030x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
63040xC8, 0xFF, 0xBD, 0x27, 0x2C, 0x00, 0xB1, 0xAF, 0xFF, 0xFF, 0x05, 0x24,
63050x21, 0x88, 0x80, 0x00, 0x02, 0x00, 0x06, 0x24, 0x10, 0x00, 0xA4, 0x27,
63060x34, 0x00, 0xBF, 0xAF, 0x30, 0x00, 0xB2, 0xAF, 0xEC, 0x54, 0x00, 0x0C,
63070x28, 0x00, 0xB0, 0xAF, 0x08, 0x00, 0x30, 0x96, 0x02, 0x80, 0x02, 0x3C,
63080x21, 0x28, 0x00, 0x00, 0x25, 0x80, 0x02, 0x02, 0x21, 0x20, 0x00, 0x02,
63090xEC, 0x54, 0x00, 0x0C, 0x10, 0x00, 0x06, 0x24, 0x20, 0x00, 0x02, 0x96,
63100x24, 0x00, 0x04, 0x26, 0x10, 0x00, 0xA5, 0x27, 0x03, 0xFF, 0x42, 0x30,
63110xC8, 0x00, 0x42, 0x34, 0x20, 0x00, 0x02, 0xA6, 0xF4, 0x54, 0x00, 0x0C,
63120x06, 0x00, 0x06, 0x24, 0x25, 0xB0, 0x03, 0x3C, 0x50, 0x00, 0x62, 0x34,
63130x00, 0x00, 0x44, 0x8C, 0x54, 0x00, 0x65, 0x34, 0x58, 0x00, 0x66, 0x34,
63140x18, 0x00, 0xA4, 0xAF, 0x00, 0x00, 0xA2, 0x8C, 0x5C, 0x00, 0x63, 0x34,
63150x2A, 0x00, 0x04, 0x26, 0x1C, 0x00, 0xA2, 0xAF, 0x00, 0x00, 0xC7, 0x8C,
63160x18, 0x00, 0xA5, 0x27, 0x06, 0x00, 0x06, 0x24, 0x20, 0x00, 0xA7, 0xAF,
63170x00, 0x00, 0x62, 0x8C, 0x1A, 0x00, 0x12, 0x24, 0xF4, 0x54, 0x00, 0x0C,
63180x24, 0x00, 0xA2, 0xAF, 0x30, 0x00, 0x04, 0x26, 0x20, 0x00, 0xA5, 0x27,
63190xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x13, 0x00, 0x03, 0x24,
63200x14, 0x00, 0x23, 0xAE, 0x0C, 0x00, 0x32, 0xAE, 0x08, 0x00, 0x05, 0x8E,
63210x04, 0x00, 0x04, 0x8E, 0xFF, 0xDF, 0x02, 0x3C, 0x14, 0x00, 0x06, 0x8E,
63220xFF, 0xFF, 0x42, 0x34, 0x10, 0x00, 0x07, 0x8E, 0xFF, 0xE0, 0x03, 0x24,
63230x24, 0x28, 0xA2, 0x00, 0x00, 0x40, 0x02, 0x3C, 0x24, 0x20, 0x83, 0x00,
63240x25, 0x28, 0xA2, 0x00, 0xFF, 0x81, 0x03, 0x24, 0xFE, 0xFF, 0x02, 0x3C,
63250x24, 0x30, 0xC3, 0x00, 0xFF, 0xFF, 0x42, 0x34, 0x00, 0x12, 0x84, 0x34,
63260x00, 0x80, 0x03, 0x3C, 0x24, 0x20, 0x82, 0x00, 0x25, 0x38, 0xE3, 0x00,
63270x00, 0x26, 0xC6, 0x34, 0x80, 0x00, 0xA5, 0x34, 0x20, 0x00, 0x02, 0x24,
63280x00, 0x00, 0x12, 0xA6, 0x10, 0x00, 0x07, 0xAE, 0x02, 0x00, 0x02, 0xA2,
63290x14, 0x00, 0x06, 0xAE, 0x04, 0x00, 0x04, 0xAE, 0x08, 0x00, 0x05, 0xAE,
63300x34, 0x00, 0xBF, 0x8F, 0x30, 0x00, 0xB2, 0x8F, 0x2C, 0x00, 0xB1, 0x8F,
63310x28, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27,
63320xB0, 0xFF, 0xBD, 0x27, 0x3C, 0x00, 0xB5, 0xAF, 0x34, 0x00, 0xB3, 0xAF,
63330xFF, 0xFF, 0xF5, 0x30, 0x25, 0xB0, 0x13, 0x3C, 0x01, 0x80, 0x02, 0x3C,
63340x2C, 0x00, 0xB1, 0xAF, 0x18, 0x03, 0x63, 0x36, 0x54, 0x40, 0x42, 0x24,
63350x20, 0x00, 0xB1, 0x26, 0x48, 0x00, 0xBE, 0xAF, 0x44, 0x00, 0xB7, 0xAF,
63360x38, 0x00, 0xB4, 0xAF, 0x64, 0x00, 0xB7, 0x93, 0x60, 0x00, 0xB4, 0x93,
63370x21, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x62, 0xAC, 0x21, 0x20, 0x20, 0x02,
63380x40, 0x00, 0xB6, 0xAF, 0x30, 0x00, 0xB2, 0xAF, 0x4C, 0x00, 0xBF, 0xAF,
63390x28, 0x00, 0xB0, 0xAF, 0xFF, 0x00, 0xB6, 0x30, 0x53, 0x21, 0x00, 0x0C,
63400xFF, 0x00, 0xD2, 0x30, 0x12, 0x00, 0x40, 0x14, 0x24, 0x00, 0xA2, 0xAF,
63410x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0xAC, 0xE8, 0x84, 0x24,
63420x13, 0x58, 0x00, 0x0C, 0x88, 0xEC, 0xA5, 0x24, 0x4C, 0x00, 0xBF, 0x8F,
63430x48, 0x00, 0xBE, 0x8F, 0x44, 0x00, 0xB7, 0x8F, 0x40, 0x00, 0xB6, 0x8F,
63440x3C, 0x00, 0xB5, 0x8F, 0x38, 0x00, 0xB4, 0x8F, 0x34, 0x00, 0xB3, 0x8F,
63450x30, 0x00, 0xB2, 0x8F, 0x2C, 0x00, 0xB1, 0x8F, 0x28, 0x00, 0xB0, 0x8F,
63460x08, 0x00, 0xE0, 0x03, 0x50, 0x00, 0xBD, 0x27, 0x08, 0x00, 0x43, 0x8C,
63470xB0, 0x03, 0x62, 0x36, 0x02, 0x80, 0x10, 0x3C, 0x00, 0x00, 0x43, 0xAC,
63480x24, 0x00, 0xA2, 0x8F, 0x21, 0x30, 0x20, 0x02, 0x21, 0x28, 0x00, 0x00,
63490x08, 0x00, 0x44, 0x94, 0xE3, 0x54, 0x00, 0x0C, 0x25, 0x20, 0x90, 0x00,
63500x24, 0x00, 0xA3, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x62, 0x94,
63510x00, 0x00, 0x00, 0x00, 0x25, 0x88, 0x50, 0x00, 0x5C, 0x00, 0x80, 0x16,
63520x20, 0x00, 0x30, 0x26, 0x20, 0x00, 0x32, 0xA6, 0x48, 0x00, 0x02, 0x24,
63530x7A, 0x00, 0x42, 0x12, 0xC8, 0x00, 0x02, 0x24, 0x79, 0x00, 0x42, 0x12,
63540x50, 0x00, 0x62, 0x36, 0x04, 0x00, 0x02, 0x24, 0x56, 0x00, 0xC2, 0x16,
63550x21, 0x28, 0xC0, 0x03, 0xA4, 0x00, 0x02, 0x24, 0x9F, 0x00, 0x42, 0x12,
63560x02, 0x80, 0x02, 0x3C, 0x24, 0x00, 0xA2, 0x8F, 0x25, 0xB0, 0x10, 0x3C,
63570xB0, 0x03, 0x10, 0x36, 0x0C, 0x00, 0x55, 0xAC, 0x24, 0x00, 0xA2, 0x8F,
63580x12, 0x00, 0x03, 0x24, 0x21, 0x28, 0x00, 0x00, 0x14, 0x00, 0x43, 0xAC,
63590x00, 0x00, 0x15, 0xAE, 0x24, 0x00, 0xA2, 0x8F, 0x08, 0x00, 0x06, 0x24,
63600x08, 0x00, 0x43, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xAE,
63610x24, 0x00, 0xA2, 0x8F, 0x02, 0x80, 0x03, 0x3C, 0x08, 0x00, 0x44, 0x94,
63620x00, 0x00, 0x00, 0x00, 0x25, 0x88, 0x83, 0x00, 0xEC, 0x54, 0x00, 0x0C,
63630x21, 0x20, 0x20, 0x02, 0x04, 0x00, 0x25, 0x8E, 0x08, 0x00, 0x24, 0x8E,
63640xFF, 0xDF, 0x02, 0x3C, 0xFF, 0xE0, 0x03, 0x24, 0xFF, 0xFF, 0x42, 0x34,
63650x14, 0x00, 0x26, 0x8E, 0x24, 0x28, 0xA3, 0x00, 0x24, 0x20, 0x82, 0x00,
63660x00, 0x40, 0x02, 0x3C, 0x10, 0x00, 0x27, 0x8E, 0x25, 0x20, 0x82, 0x00,
63670xE0, 0xFF, 0x03, 0x24, 0x00, 0x12, 0xA5, 0x34, 0xFF, 0xE0, 0x02, 0x3C,
63680x24, 0x28, 0xA3, 0x00, 0xFF, 0xFF, 0x42, 0x34, 0xFF, 0x81, 0x03, 0x24,
63690x24, 0x30, 0xC3, 0x00, 0x24, 0x20, 0x82, 0x00, 0x00, 0x05, 0x03, 0x3C,
63700x00, 0x80, 0x02, 0x3C, 0x25, 0x38, 0xE2, 0x00, 0x25, 0x20, 0x83, 0x00,
63710x05, 0x00, 0xA5, 0x34, 0x20, 0x00, 0x02, 0x24, 0x08, 0x00, 0x24, 0xAE,
63720x00, 0x00, 0x35, 0xA6, 0x02, 0x00, 0x22, 0xA2, 0x14, 0x00, 0x26, 0xAE,
63730x10, 0x00, 0x27, 0xAE, 0x04, 0x00, 0x25, 0xAE, 0x8A, 0x40, 0x00, 0x0C,
63740x20, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x24, 0x00, 0xA3, 0x8F,
63750x98, 0x54, 0x42, 0x24, 0x04, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x62, 0xAC,
63760x04, 0x00, 0x43, 0xAC, 0x24, 0x00, 0xA2, 0x27, 0x00, 0x00, 0x83, 0xAC,
63770x04, 0x00, 0x64, 0xAC, 0x20, 0x00, 0xA4, 0x27, 0x00, 0x00, 0x02, 0xAE,
63780x90, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0xBF, 0x8F,
63790x48, 0x00, 0xBE, 0x8F, 0x44, 0x00, 0xB7, 0x8F, 0x40, 0x00, 0xB6, 0x8F,
63800x3C, 0x00, 0xB5, 0x8F, 0x38, 0x00, 0xB4, 0x8F, 0x34, 0x00, 0xB3, 0x8F,
63810x30, 0x00, 0xB2, 0x8F, 0x2C, 0x00, 0xB1, 0x8F, 0x28, 0x00, 0xB0, 0x8F,
63820x08, 0x00, 0xE0, 0x03, 0x50, 0x00, 0xBD, 0x27, 0x00, 0x10, 0x42, 0x36,
63830x53, 0x50, 0x00, 0x08, 0x20, 0x00, 0x22, 0xA6, 0x04, 0x00, 0x04, 0x26,
63840xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C,
63850x48, 0x37, 0xA5, 0x24, 0x0A, 0x00, 0x04, 0x26, 0xF4, 0x54, 0x00, 0x0C,
63860x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C, 0xB4, 0x55, 0xA5, 0x24,
63870x10, 0x00, 0x04, 0x26, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
63880x00, 0x1E, 0x12, 0x00, 0x03, 0x1E, 0x03, 0x00, 0x28, 0x00, 0x60, 0x04,
63890x02, 0x80, 0x05, 0x3C, 0x60, 0x1B, 0xA5, 0x24, 0xE4, 0x1D, 0xA6, 0x94,
63900x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xC2, 0x24, 0x00, 0x21, 0x06, 0x00,
63910xFF, 0xFF, 0x46, 0x30, 0xFF, 0xFF, 0x84, 0x30, 0x00, 0x10, 0xC2, 0x2C,
63920x0A, 0x30, 0x02, 0x00, 0x02, 0x1A, 0x04, 0x00, 0x17, 0x00, 0x03, 0xA2,
63930x16, 0x00, 0x04, 0xA2, 0x5E, 0x50, 0x00, 0x08, 0xE4, 0x1D, 0xA6, 0xA4,
63940x50, 0x00, 0x62, 0x36, 0x00, 0x00, 0x43, 0x8C, 0x54, 0x00, 0x64, 0x36,
63950x58, 0x00, 0x65, 0x36, 0x10, 0x00, 0xA3, 0xAF, 0x00, 0x00, 0x82, 0x8C,
63960x5C, 0x00, 0x67, 0x36, 0x2A, 0x00, 0x24, 0x26, 0x14, 0x00, 0xA2, 0xAF,
63970x00, 0x00, 0xA3, 0x8C, 0x06, 0x00, 0x06, 0x24, 0x10, 0x00, 0xA5, 0x27,
63980x18, 0x00, 0xA3, 0xAF, 0x00, 0x00, 0xE2, 0x8C, 0xF4, 0x54, 0x00, 0x0C,
63990x1C, 0x00, 0xA2, 0xAF, 0x30, 0x00, 0x24, 0x26, 0x18, 0x00, 0xA5, 0x27,
64000xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x20, 0x00, 0x23, 0x96,
64010x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x63, 0x34, 0x58, 0x50, 0x00, 0x08,
64020x20, 0x00, 0x23, 0xA6, 0x02, 0x80, 0x02, 0x3C, 0xFF, 0xFF, 0xE3, 0x32,
64030x60, 0x1B, 0x42, 0x24, 0x40, 0x28, 0x17, 0x00, 0x18, 0x00, 0x03, 0xA2,
64040x21, 0x28, 0xA2, 0x00, 0x19, 0x00, 0x00, 0xA2, 0xD4, 0x1D, 0xA6, 0x94,
64050x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xC2, 0x24, 0x00, 0x21, 0x06, 0x00,
64060xFF, 0xFF, 0x46, 0x30, 0xFF, 0xFF, 0x84, 0x30, 0x00, 0x10, 0xC2, 0x2C,
64070x0A, 0x30, 0x02, 0x00, 0x02, 0x1A, 0x04, 0x00, 0x17, 0x00, 0x03, 0xA2,
64080x16, 0x00, 0x04, 0xA2, 0x5E, 0x50, 0x00, 0x08, 0xD4, 0x1D, 0xA6, 0xA4,
64090xAC, 0x55, 0x43, 0x94, 0x02, 0x80, 0x05, 0x3C, 0x04, 0x00, 0x04, 0x26,
64100x00, 0xC0, 0x63, 0x24, 0xFF, 0xFF, 0x63, 0x30, 0x02, 0x12, 0x03, 0x00,
64110xB4, 0x55, 0xA5, 0x24, 0x03, 0x00, 0x02, 0xA2, 0x02, 0x00, 0x03, 0xA2,
64120xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x02, 0x80, 0x05, 0x3C,
64130x0A, 0x00, 0x04, 0x26, 0x48, 0x37, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C,
64140x06, 0x00, 0x06, 0x24, 0x5E, 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
64150xFF, 0x00, 0x82, 0x30, 0x02, 0x80, 0x04, 0x3C, 0xE0, 0xFF, 0xBD, 0x27,
64160xB4, 0x55, 0x84, 0x24, 0x08, 0x00, 0x05, 0x24, 0x48, 0x00, 0x06, 0x24,
64170x18, 0x00, 0x07, 0x24, 0x18, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xA2, 0xAF,
64180x15, 0x50, 0x00, 0x0C, 0x14, 0x00, 0xA0, 0xAF, 0x18, 0x00, 0xBF, 0x8F,
64190x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
64200xC8, 0xFF, 0xBD, 0x27, 0x2C, 0x00, 0xB5, 0xAF, 0x02, 0x80, 0x15, 0x3C,
64210x1C, 0x00, 0xB1, 0xAF, 0x34, 0x00, 0xBF, 0xAF, 0x30, 0x00, 0xB6, 0xAF,
64220x28, 0x00, 0xB4, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF,
64230x18, 0x00, 0xB0, 0xAF, 0x60, 0x1B, 0xB1, 0x26, 0xB0, 0x1B, 0x23, 0x96,
64240x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x62, 0x30, 0x37, 0x00, 0x40, 0x14,
64250x00, 0x01, 0x62, 0x30, 0x2A, 0x00, 0x40, 0x10, 0x00, 0x10, 0x62, 0x30,
64260x25, 0x00, 0x40, 0x14, 0x01, 0x00, 0x62, 0x30, 0x45, 0x00, 0x40, 0x14,
64270x04, 0x00, 0x62, 0x30, 0x21, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
64280x21, 0x98, 0x20, 0x02, 0x47, 0x39, 0x56, 0x24, 0x01, 0x00, 0x14, 0x24,
64290x20, 0x01, 0x11, 0x24, 0x3E, 0x51, 0x00, 0x08, 0x19, 0x00, 0x12, 0x24,
64300xFF, 0xFF, 0x52, 0x26, 0x18, 0x00, 0x40, 0x06, 0x30, 0x00, 0x31, 0x26,
64310x21, 0x80, 0x33, 0x02, 0xE6, 0x1D, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00,
64320xF9, 0xFF, 0x54, 0x14, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1D, 0x02, 0x8E,
64330x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x40, 0x14, 0x10, 0x00, 0xA4, 0x27,
64340x3A, 0x41, 0x62, 0x92, 0x21, 0x20, 0x36, 0x02, 0xFF, 0xFF, 0x42, 0x24,
64350x3A, 0x41, 0x62, 0xA2, 0xC4, 0x0E, 0x00, 0x0C, 0xE6, 0x1D, 0x00, 0xA2,
64360x3C, 0x51, 0x00, 0x08, 0xFF, 0xFF, 0x52, 0x26, 0x8A, 0x40, 0x00, 0x0C,
64370x10, 0x00, 0xA4, 0x27, 0x10, 0x00, 0xA4, 0x27, 0x14, 0x40, 0x20, 0xAE,
64380x90, 0x40, 0x00, 0x0C, 0xE8, 0x1E, 0x20, 0xAE, 0xA9, 0x1B, 0x00, 0x0C,
64390x60, 0x1B, 0xB0, 0x26, 0xE8, 0x39, 0x02, 0xAE, 0x34, 0x00, 0xBF, 0x8F,
64400x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F,
64410x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
64420x18, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
64430x38, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C,
64440x98, 0xEC, 0x84, 0x24, 0xB0, 0x1B, 0x22, 0x96, 0xE8, 0x39, 0x20, 0xAE,
64450xFD, 0xFF, 0x04, 0x24, 0xEF, 0xDF, 0x42, 0x30, 0x35, 0x48, 0x00, 0x0C,
64460xB0, 0x1B, 0x22, 0xA6, 0x34, 0x00, 0xBF, 0x8F, 0x30, 0x00, 0xB6, 0x8F,
64470x2C, 0x00, 0xB5, 0x8F, 0x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F,
64480x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
64490x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27,
64500xE8, 0x1E, 0x22, 0x8E, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xFF, 0x40, 0x14,
64510x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0x22, 0x8E, 0x00, 0x00, 0x00, 0x00,
64520x18, 0x00, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0xEE, 0x5D, 0x43, 0x90,
64530x01, 0x00, 0x04, 0x24, 0x0F, 0x00, 0x63, 0x30, 0x05, 0x00, 0x63, 0x28,
64540x0E, 0x00, 0x60, 0x10, 0x14, 0x40, 0x24, 0xAE, 0x0E, 0x51, 0x00, 0x0C,
64550x00, 0x00, 0x00, 0x00, 0xA9, 0x1B, 0x00, 0x0C, 0x60, 0x1B, 0xB0, 0x26,
64560x58, 0x51, 0x00, 0x08, 0xE8, 0x39, 0x02, 0xAE, 0x8A, 0x40, 0x00, 0x0C,
64570xFF, 0xFF, 0x52, 0x26, 0x10, 0x00, 0xA4, 0x27, 0x90, 0x40, 0x00, 0x0C,
64580xF8, 0x1D, 0x00, 0xAE, 0x3C, 0x51, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
64590x0E, 0x51, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00, 0x87, 0x51, 0x00, 0x08,
64600x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C,
64610xB8, 0xEC, 0x84, 0x24, 0x25, 0xB0, 0x06, 0x3C, 0x4C, 0x00, 0xC2, 0x34,
64620x00, 0x00, 0x40, 0xA0, 0x48, 0x00, 0xC6, 0x34, 0x00, 0x00, 0xC3, 0x8C,
64630xB0, 0x1B, 0x27, 0x96, 0x7B, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
64640x24, 0x18, 0x62, 0x00, 0xFE, 0xFE, 0xE7, 0x30, 0x00, 0x00, 0xC3, 0xAC,
64650x21, 0x28, 0x00, 0x00, 0xB0, 0x1B, 0x27, 0xA6, 0x21, 0x20, 0x00, 0x00,
64660x37, 0x3E, 0x20, 0xA2, 0x95, 0x0E, 0x00, 0x0C, 0xD6, 0x1E, 0x20, 0xA2,
64670x02, 0x80, 0x04, 0x3C, 0xC4, 0x0E, 0x00, 0x0C, 0xB4, 0x55, 0x84, 0x24,
64680xA9, 0x1B, 0x00, 0x0C, 0x60, 0x1B, 0xB0, 0x26, 0x58, 0x51, 0x00, 0x08,
64690xE8, 0x39, 0x02, 0xAE, 0xFF, 0x00, 0x84, 0x30, 0x02, 0x00, 0x02, 0x24,
64700x03, 0x00, 0x83, 0x28, 0x0D, 0x00, 0x82, 0x10, 0x21, 0x28, 0x00, 0x00,
64710x06, 0x00, 0x60, 0x10, 0x04, 0x00, 0x02, 0x24, 0x01, 0x00, 0x02, 0x24,
64720x0B, 0x00, 0x82, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
64730x21, 0x10, 0xA0, 0x00, 0xFD, 0xFF, 0x82, 0x14, 0x00, 0x00, 0x00, 0x00,
64740x01, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
64750x04, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
64760x06, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
64770xD8, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB1, 0xAF, 0xFF, 0x00, 0x91, 0x30,
64780x02, 0x80, 0x04, 0x3C, 0x18, 0x00, 0xB0, 0xAF, 0xD4, 0xEC, 0x84, 0x24,
64790xFF, 0x00, 0xB0, 0x30, 0x20, 0x00, 0xBF, 0xAF, 0x13, 0x58, 0x00, 0x0C,
64800x21, 0x28, 0x20, 0x02, 0xB1, 0x51, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x02,
64810x02, 0x80, 0x04, 0x3C, 0xB4, 0x55, 0x84, 0x24, 0x08, 0x00, 0x05, 0x24,
64820xC8, 0x00, 0x06, 0x24, 0x1A, 0x00, 0x07, 0x24, 0x10, 0x00, 0xB1, 0xAF,
64830x15, 0x50, 0x00, 0x0C, 0x14, 0x00, 0xA2, 0xAF, 0x20, 0x00, 0xBF, 0x8F,
64840x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
64850x28, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x05, 0x3C,
64860x1C, 0x00, 0xBF, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x60, 0x1B, 0xA5, 0x24,
64870x4C, 0x3A, 0xA2, 0x94, 0x01, 0x00, 0x03, 0x24, 0xFF, 0x00, 0x90, 0x30,
64880x00, 0xC0, 0x42, 0x24, 0xFF, 0xFF, 0x44, 0x30, 0xA3, 0x31, 0x00, 0x0C,
64890x2A, 0x1C, 0xA3, 0xA0, 0x02, 0x80, 0x04, 0x3C, 0xB4, 0x55, 0x84, 0x24,
64900x04, 0x00, 0x05, 0x24, 0xA4, 0x00, 0x06, 0x24, 0x10, 0x00, 0x07, 0x24,
64910x10, 0x00, 0xB0, 0xAF, 0x15, 0x50, 0x00, 0x0C, 0x14, 0x00, 0xA0, 0xAF,
64920x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
64930x20, 0x00, 0xBD, 0x27, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x80, 0x00,
64940x08, 0x00, 0xE0, 0x03, 0x08, 0x00, 0x82, 0x24, 0xE0, 0xFF, 0xBD, 0x27,
64950x18, 0x00, 0xBF, 0xAF, 0xFB, 0x51, 0x00, 0x0C, 0x74, 0x00, 0x84, 0x24,
64960x21, 0x28, 0x40, 0x00, 0x10, 0x00, 0xA4, 0x27, 0xF4, 0x54, 0x00, 0x0C,
64970x02, 0x00, 0x06, 0x24, 0x10, 0x00, 0xA2, 0x97, 0x18, 0x00, 0xBF, 0x8F,
64980x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
64990xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xBF, 0xAF, 0xFB, 0x51, 0x00, 0x0C,
65000x10, 0x00, 0xA5, 0xA7, 0x21, 0x20, 0x40, 0x00, 0x10, 0x00, 0xA5, 0x27,
65010xF4, 0x54, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x24, 0x18, 0x00, 0xBF, 0x8F,
65020x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
65030x08, 0x00, 0xE0, 0x03, 0x0A, 0x00, 0x82, 0x24, 0xE0, 0xFF, 0xBD, 0x27,
65040x18, 0x00, 0xBF, 0xAF, 0x16, 0x52, 0x00, 0x0C, 0x74, 0x00, 0x84, 0x24,
65050x21, 0x28, 0x40, 0x00, 0x10, 0x00, 0xA4, 0x27, 0xF4, 0x54, 0x00, 0x0C,
65060x02, 0x00, 0x06, 0x24, 0x10, 0x00, 0xA2, 0x97, 0x18, 0x00, 0xBF, 0x8F,
65070x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
65080xE0, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00,
65090x00, 0x00, 0x05, 0xA2, 0x01, 0x00, 0x06, 0xA2, 0x18, 0x00, 0xB2, 0xAF,
65100x14, 0x00, 0xB1, 0xAF, 0x1C, 0x00, 0xBF, 0xAF, 0x21, 0x88, 0xC0, 0x00,
65110x02, 0x00, 0x84, 0x24, 0x30, 0x00, 0xB2, 0x8F, 0x0D, 0x00, 0xC0, 0x14,
65120x21, 0x28, 0xE0, 0x00, 0x00, 0x00, 0x43, 0x8E, 0x21, 0x10, 0x11, 0x02,
65130x1C, 0x00, 0xBF, 0x8F, 0x21, 0x18, 0x71, 0x00, 0x02, 0x00, 0x63, 0x24,
65140x00, 0x00, 0x43, 0xAE, 0x14, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
65150x10, 0x00, 0xB0, 0x8F, 0x02, 0x00, 0x42, 0x24, 0x08, 0x00, 0xE0, 0x03,
65160x20, 0x00, 0xBD, 0x27, 0xF4, 0x54, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
65170x00, 0x00, 0x43, 0x8E, 0x21, 0x10, 0x11, 0x02, 0x1C, 0x00, 0xBF, 0x8F,
65180x21, 0x18, 0x71, 0x00, 0x02, 0x00, 0x63, 0x24, 0x00, 0x00, 0x43, 0xAE,
65190x14, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
65200x02, 0x00, 0x42, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
65210xE0, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0xA0, 0x00,
65220x18, 0x00, 0xB2, 0xAF, 0x21, 0x28, 0xC0, 0x00, 0x21, 0x90, 0xE0, 0x00,
65230x21, 0x30, 0x00, 0x02, 0x1C, 0x00, 0xBF, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
65240xF4, 0x54, 0x00, 0x0C, 0x21, 0x88, 0x80, 0x00, 0x00, 0x00, 0x43, 0x8E,
65250x21, 0x10, 0x30, 0x02, 0x1C, 0x00, 0xBF, 0x8F, 0x21, 0x18, 0x70, 0x00,
65260x00, 0x00, 0x43, 0xAE, 0x14, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
65270x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
65280x7F, 0x00, 0x84, 0x30, 0x6D, 0x00, 0x82, 0x2C, 0x0A, 0x00, 0x40, 0x10,
65290x21, 0x28, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C, 0x80, 0x10, 0x04, 0x00,
65300xFC, 0xEC, 0x63, 0x24, 0x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x8C,
65310x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
65320x21, 0x28, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65330x0B, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65340x0A, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65350x09, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65360x08, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65370x07, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65380x06, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65390x03, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65400x05, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65410x04, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65420x02, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65430x01, 0x00, 0x05, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
65440x7F, 0x00, 0x84, 0x30, 0x0C, 0x00, 0x82, 0x2C, 0x0A, 0x00, 0x40, 0x10,
65450x21, 0x18, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C, 0x80, 0x10, 0x04, 0x00,
65460xB0, 0xEE, 0x63, 0x24, 0x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x8C,
65470x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
65480x6C, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65490x60, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65500x48, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65510x30, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65520x24, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65530x18, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65540x12, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65550x0C, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65560x16, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65570x0B, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65580x04, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65590x02, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
65600xC8, 0xFF, 0xBD, 0x27, 0x24, 0x00, 0xB5, 0xAF, 0x02, 0x80, 0x15, 0x3C,
65610x2C, 0x00, 0xB7, 0xAF, 0x28, 0x00, 0xB6, 0xAF, 0x20, 0x00, 0xB4, 0xAF,
65620x1C, 0x00, 0xB3, 0xAF, 0x30, 0x00, 0xBF, 0xAF, 0x18, 0x00, 0xB2, 0xAF,
65630x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0xB8, 0x80, 0x00,
65640x21, 0xA0, 0x00, 0x00, 0x21, 0x98, 0x00, 0x00, 0x60, 0x1B, 0xB6, 0x26,
65650x60, 0x1B, 0xA2, 0x26, 0x21, 0x10, 0x62, 0x02, 0xFB, 0x1B, 0x51, 0x90,
65660xFE, 0x00, 0x03, 0x24, 0x1E, 0x00, 0x23, 0x12, 0xFF, 0x00, 0x02, 0x24,
65670x21, 0x00, 0x22, 0x12, 0x21, 0x10, 0x80, 0x02, 0x91, 0x52, 0x00, 0x0C,
65680x21, 0x20, 0x20, 0x02, 0x21, 0x88, 0x40, 0x00, 0x21, 0x80, 0x00, 0x00,
65690x21, 0x90, 0xC0, 0x02, 0x21, 0x10, 0x12, 0x02, 0xEE, 0x1B, 0x44, 0x90,
65700x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0x24, 0xFF, 0x00, 0x42, 0x30,
65710x02, 0x00, 0x42, 0x2C, 0x05, 0x00, 0x40, 0x14, 0x01, 0x00, 0x10, 0x26,
65720x91, 0x52, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x51, 0x10,
65730x01, 0x00, 0x03, 0x24, 0x0D, 0x00, 0x02, 0x2A, 0xF3, 0xFF, 0x40, 0x14,
65740x21, 0x10, 0x12, 0x02, 0x21, 0x18, 0x00, 0x00, 0x01, 0x00, 0x02, 0x24,
65750x14, 0x00, 0x62, 0x10, 0xFF, 0x00, 0x22, 0x32, 0x21, 0x10, 0xF4, 0x02,
65760x00, 0x00, 0x51, 0xA0, 0x01, 0x00, 0x94, 0x26, 0x01, 0x00, 0x73, 0x26,
65770x0D, 0x00, 0x62, 0x2A, 0xDB, 0xFF, 0x40, 0x14, 0x60, 0x1B, 0xA2, 0x26,
65780x21, 0x10, 0x80, 0x02, 0x30, 0x00, 0xBF, 0x8F, 0x2C, 0x00, 0xB7, 0x8F,
65790x28, 0x00, 0xB6, 0x8F, 0x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F,
65800x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
65810x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27,
65820xF0, 0x52, 0x00, 0x08, 0x80, 0x00, 0x51, 0x34, 0xD0, 0xFF, 0xBD, 0x27,
65830x24, 0x00, 0xB1, 0xAF, 0x20, 0x00, 0xB0, 0xAF, 0x21, 0x88, 0x80, 0x00,
65840x21, 0x80, 0xA0, 0x00, 0x0D, 0x00, 0x06, 0x24, 0x21, 0x28, 0x00, 0x00,
65850x28, 0x00, 0xBF, 0xAF, 0xE3, 0x54, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
65860xC1, 0x52, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x00, 0x00, 0x02, 0xAE,
65870x21, 0x20, 0x20, 0x02, 0x10, 0x00, 0xA5, 0x27, 0xF4, 0x54, 0x00, 0x0C,
65880x21, 0x30, 0x40, 0x00, 0x28, 0x00, 0xBF, 0x8F, 0x24, 0x00, 0xB1, 0x8F,
65890x20, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
65900x21, 0x28, 0x00, 0x00, 0x21, 0x10, 0x85, 0x00, 0x00, 0x00, 0x43, 0x90,
65910x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x60, 0x10, 0x0D, 0x00, 0xA2, 0x2C,
65920xFA, 0xFF, 0x40, 0x14, 0x01, 0x00, 0xA5, 0x24, 0xFF, 0xFF, 0xA5, 0x24,
65930x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00, 0x00, 0x00, 0x82, 0x94,
65940x21, 0x30, 0x80, 0x00, 0x10, 0x00, 0x85, 0x24, 0x42, 0x1A, 0x02, 0x00,
65950xC2, 0x11, 0x02, 0x00, 0x02, 0x00, 0x42, 0x30, 0x01, 0x00, 0x63, 0x30,
65960x25, 0x18, 0x43, 0x00, 0x01, 0x00, 0x04, 0x24, 0x07, 0x00, 0x64, 0x10,
65970x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x60, 0x10, 0x0A, 0x00, 0xC5, 0x24,
65980x02, 0x00, 0x02, 0x24, 0x02, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
65990x18, 0x00, 0xC5, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xA0, 0x00,
66000x00, 0x00, 0x82, 0x94, 0x21, 0x30, 0x80, 0x00, 0x04, 0x00, 0x85, 0x24,
66010x42, 0x1A, 0x02, 0x00, 0xC2, 0x11, 0x02, 0x00, 0x02, 0x00, 0x42, 0x30,
66020x01, 0x00, 0x63, 0x30, 0x25, 0x18, 0x43, 0x00, 0x01, 0x00, 0x04, 0x24,
66030x04, 0x00, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x10,
66040x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xC5, 0x24, 0x08, 0x00, 0xE0, 0x03,
66050x21, 0x10, 0xA0, 0x00, 0x13, 0x00, 0xA0, 0x18, 0x21, 0x30, 0x00, 0x00,
66060x02, 0x00, 0x07, 0x24, 0x04, 0x00, 0x08, 0x24, 0x0B, 0x00, 0x09, 0x24,
66070x16, 0x00, 0x0A, 0x24, 0x21, 0x10, 0x86, 0x00, 0x00, 0x00, 0x43, 0x90,
66080x01, 0x00, 0xC6, 0x24, 0x7F, 0x00, 0x63, 0x30, 0x07, 0x00, 0x67, 0x10,
66090x2A, 0x10, 0xC5, 0x00, 0x05, 0x00, 0x68, 0x10, 0x00, 0x00, 0x00, 0x00,
66100x03, 0x00, 0x69, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x6A, 0x14,
66110x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
66120x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03,
66130x21, 0x10, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF,
66140x14, 0x00, 0xBF, 0xAF, 0x02, 0x80, 0x02, 0x3C, 0x5C, 0x5C, 0x43, 0x8C,
66150x08, 0x00, 0x10, 0x24, 0x06, 0x00, 0xA0, 0x14, 0x0A, 0x80, 0x03, 0x00,
66160x21, 0x10, 0x00, 0x02, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
66170x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x49, 0x53, 0x00, 0x0C,
66180x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x36, 0x01, 0x00, 0x42, 0x38,
66190x03, 0x00, 0x04, 0x36, 0x21, 0x80, 0x60, 0x00, 0x0B, 0x80, 0x82, 0x00,
66200x21, 0x10, 0x00, 0x02, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
66210x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27,
66220x14, 0x00, 0xB1, 0xAF, 0x0E, 0x00, 0xA3, 0x2C, 0x21, 0x88, 0xA0, 0x00,
66230x0D, 0x00, 0x02, 0x24, 0x0A, 0x88, 0x43, 0x00, 0x1C, 0x00, 0xB3, 0xAF,
66240x18, 0x00, 0xB2, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x24, 0x00, 0xBF, 0xAF,
66250x20, 0x00, 0xB4, 0xAF, 0x21, 0x98, 0x80, 0x00, 0x21, 0x90, 0x00, 0x00,
66260x15, 0x00, 0x20, 0x12, 0x21, 0x80, 0x00, 0x00, 0x8E, 0x53, 0x00, 0x08,
66270x01, 0x00, 0x14, 0x24, 0x2B, 0x10, 0x11, 0x02, 0x11, 0x00, 0x40, 0x10,
66280x21, 0x10, 0x40, 0x02, 0x21, 0x18, 0x70, 0x02, 0x00, 0x00, 0x62, 0x90,
66290x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x44, 0x30, 0x00, 0x16, 0x02, 0x00,
66300x03, 0x16, 0x02, 0x00, 0xF6, 0xFF, 0x41, 0x04, 0x01, 0x00, 0x10, 0x26,
66310x61, 0x52, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x54, 0x00,
66320x25, 0x90, 0x42, 0x02, 0x2B, 0x10, 0x11, 0x02, 0xF3, 0xFF, 0x40, 0x14,
66330x21, 0x18, 0x70, 0x02, 0x21, 0x10, 0x40, 0x02, 0x24, 0x00, 0xBF, 0x8F,
66340x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
66350x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
66360x28, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF,
66370x0E, 0x00, 0xA3, 0x2C, 0x21, 0x88, 0xA0, 0x00, 0x0D, 0x00, 0x02, 0x24,
66380x0A, 0x88, 0x43, 0x00, 0x20, 0x00, 0xB4, 0xAF, 0x18, 0x00, 0xB2, 0xAF,
66390x10, 0x00, 0xB0, 0xAF, 0x24, 0x00, 0xBF, 0xAF, 0x1C, 0x00, 0xB3, 0xAF,
66400x21, 0xA0, 0x80, 0x00, 0x21, 0x90, 0x00, 0x00, 0x0A, 0x00, 0x20, 0x12,
66410x21, 0x80, 0x00, 0x00, 0x01, 0x00, 0x13, 0x24, 0x21, 0x10, 0x90, 0x02,
66420x00, 0x00, 0x44, 0x90, 0x61, 0x52, 0x00, 0x0C, 0x01, 0x00, 0x10, 0x26,
66430x04, 0x10, 0x53, 0x00, 0x2B, 0x18, 0x11, 0x02, 0xF9, 0xFF, 0x60, 0x14,
66440x25, 0x90, 0x42, 0x02, 0x21, 0x10, 0x40, 0x02, 0x24, 0x00, 0xBF, 0x8F,
66450x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
66460x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
66470x28, 0x00, 0xBD, 0x27, 0xE8, 0xFF, 0xBD, 0x27, 0xFF, 0xFF, 0x02, 0x24,
66480x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF, 0x21, 0x30, 0xA0, 0x00,
66490x1B, 0x00, 0x82, 0x10, 0x20, 0x00, 0x10, 0x24, 0x20, 0x00, 0x82, 0x28,
66500x06, 0x00, 0x40, 0x14, 0x40, 0x18, 0x04, 0x00, 0x21, 0x10, 0x00, 0x02,
66510x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
66520x18, 0x00, 0xBD, 0x27, 0x21, 0x18, 0x64, 0x00, 0x21, 0x80, 0x80, 0x00,
66530x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x04, 0x3C, 0x00, 0x19, 0x03, 0x00,
66540x60, 0x1B, 0x42, 0x24, 0x47, 0x39, 0x84, 0x24, 0x21, 0x20, 0x64, 0x00,
66550x21, 0x18, 0x62, 0x00, 0x01, 0x00, 0x02, 0x24, 0x06, 0x00, 0x06, 0x24,
66560xF4, 0x54, 0x00, 0x0C, 0xE6, 0x1D, 0x62, 0xA0, 0x21, 0x10, 0x00, 0x02,
66570x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
66580x18, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
66590xF0, 0x00, 0x47, 0x24, 0x05, 0x00, 0x10, 0x24, 0xD6, 0x1E, 0x43, 0x24,
66600xF4, 0x53, 0x00, 0x08, 0xF0, 0x00, 0x05, 0x24, 0x01, 0x00, 0x10, 0x26,
66610x20, 0x00, 0x02, 0x2E, 0x30, 0x00, 0xA5, 0x24, 0xDE, 0xFF, 0x40, 0x10,
66620x30, 0x00, 0xE7, 0x24, 0x00, 0x00, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
66630xF8, 0xFF, 0x40, 0x14, 0x30, 0x00, 0x63, 0x24, 0x02, 0x80, 0x04, 0x3C,
66640x47, 0x39, 0x84, 0x24, 0x01, 0x00, 0x02, 0x24, 0x21, 0x20, 0xA4, 0x00,
66650xE6, 0x1D, 0xE2, 0xA0, 0x21, 0x28, 0xC0, 0x00, 0xF4, 0x54, 0x00, 0x0C,
66660x06, 0x00, 0x06, 0x24, 0xE4, 0x53, 0x00, 0x08, 0x21, 0x10, 0x00, 0x02,
66670xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
66680x30, 0x00, 0xB2, 0x8F, 0x21, 0x88, 0x80, 0x00, 0x21, 0x20, 0xA0, 0x00,
66690x21, 0x28, 0x20, 0x02, 0x10, 0x00, 0xB0, 0xAF, 0x1C, 0x00, 0xBF, 0xAF,
66700xC7, 0x53, 0x00, 0x0C, 0xFF, 0xFF, 0xF0, 0x30, 0x20, 0x00, 0x03, 0x24,
66710xFF, 0x00, 0x44, 0x30, 0x21, 0x28, 0x00, 0x02, 0x21, 0x30, 0x20, 0x02,
66720x07, 0x00, 0x43, 0x10, 0x21, 0x38, 0x40, 0x02, 0x1C, 0x00, 0xBF, 0x8F,
66730x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
66740x6F, 0x20, 0x00, 0x08, 0x20, 0x00, 0xBD, 0x27, 0x1C, 0x00, 0xBF, 0x8F,
66750x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
66760x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xD0, 0xFF, 0xBD, 0x27,
66770x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0x24, 0x00, 0xB5, 0xAF,
66780x20, 0x00, 0xB4, 0xAF, 0x1C, 0x00, 0xB3, 0xAF, 0x18, 0x00, 0xB2, 0xAF,
66790x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0x21, 0xA8, 0x80, 0x00,
66800x60, 0x1B, 0x54, 0x24, 0x47, 0x39, 0x73, 0x24, 0x05, 0x00, 0x11, 0x24,
66810x01, 0x00, 0x12, 0x24, 0xF0, 0x00, 0x10, 0x24, 0x34, 0x54, 0x00, 0x08,
66820x28, 0x00, 0xBF, 0xAF, 0x01, 0x00, 0x31, 0x26, 0x20, 0x00, 0x22, 0x2A,
66830x0E, 0x00, 0x40, 0x10, 0x21, 0x10, 0x20, 0x02, 0x21, 0x10, 0x14, 0x02,
66840xE6, 0x1D, 0x43, 0x90, 0x21, 0x20, 0x13, 0x02, 0x21, 0x28, 0xA0, 0x02,
66850x06, 0x00, 0x06, 0x24, 0xF6, 0xFF, 0x72, 0x14, 0x30, 0x00, 0x10, 0x26,
66860x1D, 0x55, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x40, 0x14,
66870x01, 0x00, 0x31, 0x26, 0xFF, 0xFF, 0x31, 0x26, 0x21, 0x10, 0x20, 0x02,
66880x28, 0x00, 0xBF, 0x8F, 0x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F,
66890x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
66900x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x30, 0x00, 0xBD, 0x27,
66910xD0, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
66920x28, 0x00, 0xB6, 0xAF, 0x24, 0x00, 0xB5, 0xAF, 0x20, 0x00, 0xB4, 0xAF,
66930x1C, 0x00, 0xB3, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
66940x21, 0x98, 0x80, 0x00, 0x60, 0x1B, 0x56, 0x24, 0x47, 0x39, 0x75, 0x24,
66950x21, 0x88, 0x00, 0x00, 0x01, 0x00, 0x14, 0x24, 0x21, 0x80, 0x00, 0x00,
66960x2C, 0x00, 0xBF, 0xAF, 0x60, 0x54, 0x00, 0x08, 0x18, 0x00, 0xB2, 0xAF,
66970x01, 0x00, 0x31, 0x26, 0x20, 0x00, 0x22, 0x2A, 0x1E, 0x00, 0x40, 0x10,
66980x00, 0x00, 0x00, 0x00, 0x21, 0x90, 0x16, 0x02, 0xE6, 0x1D, 0x42, 0x92,
66990x21, 0x20, 0x15, 0x02, 0x21, 0x28, 0x60, 0x02, 0x06, 0x00, 0x06, 0x24,
67000xF6, 0xFF, 0x54, 0x14, 0x30, 0x00, 0x10, 0x26, 0x1D, 0x55, 0x00, 0x0C,
67010x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x40, 0x14, 0x01, 0x00, 0x31, 0x26,
67020xFF, 0xFF, 0x31, 0x26, 0x02, 0x80, 0x06, 0x3C, 0x02, 0x80, 0x07, 0x3C,
67030xFF, 0x00, 0x24, 0x32, 0xE6, 0x1D, 0x40, 0xA2, 0x2C, 0x00, 0xBF, 0x8F,
67040x28, 0x00, 0xB6, 0x8F, 0x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F,
67050x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
67060x10, 0x00, 0xB0, 0x8F, 0x88, 0xDE, 0xC6, 0x24, 0x78, 0xDE, 0xE7, 0x24,
67070x21, 0x28, 0x00, 0x00, 0x6F, 0x20, 0x00, 0x08, 0x30, 0x00, 0xBD, 0x27,
67080x2C, 0x00, 0xBF, 0x8F, 0x28, 0x00, 0xB6, 0x8F, 0x24, 0x00, 0xB5, 0x8F,
67090x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
67100x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
67110x30, 0x00, 0xBD, 0x27, 0xC8, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C,
67120x18, 0x00, 0xB2, 0xAF, 0x60, 0x1B, 0x52, 0x24, 0x30, 0x00, 0xBE, 0xAF,
67130x2C, 0x00, 0xB7, 0xAF, 0x28, 0x00, 0xB6, 0xAF, 0x24, 0x00, 0xB5, 0xAF,
67140x20, 0x00, 0xB4, 0xAF, 0x1C, 0x00, 0xB3, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
67150x10, 0x00, 0xB0, 0xAF, 0x34, 0x00, 0xBF, 0xAF, 0x21, 0x80, 0x00, 0x00,
67160x02, 0x80, 0x1E, 0x3C, 0x02, 0x80, 0x17, 0x3C, 0x02, 0x80, 0x16, 0x3C,
67170x01, 0x00, 0x13, 0x24, 0xFF, 0xF7, 0x15, 0x24, 0xFF, 0xEF, 0x14, 0x24,
67180x21, 0x88, 0x40, 0x02, 0xE6, 0x1D, 0x22, 0x92, 0xC0, 0x48, 0x10, 0x00,
67190xD2, 0x5C, 0xC7, 0x93, 0x41, 0x00, 0x53, 0x10, 0x21, 0x30, 0x32, 0x01,
67200xD4, 0x23, 0xC2, 0x8C, 0xBF, 0xFF, 0x03, 0x24, 0x24, 0x28, 0x43, 0x00,
67210x80, 0x07, 0xA3, 0x34, 0x24, 0x10, 0x75, 0x00, 0x31, 0x00, 0xF3, 0x10,
67220x24, 0x10, 0x54, 0x00, 0xD4, 0x23, 0xC2, 0xAC, 0x21, 0x48, 0x32, 0x01,
67230xD4, 0x23, 0x23, 0x8D, 0xFD, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
67240x24, 0x18, 0x62, 0x00, 0xFB, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
67250x24, 0x18, 0x62, 0x00, 0xE7, 0xFF, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
67260x24, 0x18, 0x62, 0x00, 0xFF, 0xFD, 0x02, 0x3C, 0xFF, 0xFF, 0x42, 0x34,
67270xD8, 0x23, 0x28, 0x8D, 0x24, 0x18, 0x62, 0x00, 0xFF, 0xFB, 0x02, 0x3C,
67280xFF, 0xFF, 0x42, 0x34, 0x24, 0x18, 0x62, 0x00, 0xFF, 0xE7, 0x02, 0x3C,
67290xFF, 0xFF, 0x42, 0x34, 0x1F, 0x00, 0x06, 0x3C, 0x00, 0x80, 0x08, 0x35,
67300x24, 0x18, 0x62, 0x00, 0x25, 0x40, 0x06, 0x01, 0xFF, 0x00, 0x04, 0x32,
67310x21, 0x28, 0x00, 0x00, 0x01, 0x00, 0x10, 0x26, 0x88, 0xDE, 0xE6, 0x26,
67320x78, 0xDE, 0xC7, 0x26, 0xD8, 0x23, 0x28, 0xAD, 0x6F, 0x20, 0x00, 0x0C,
67330xD4, 0x23, 0x23, 0xAD, 0x20, 0x00, 0x02, 0x2A, 0xD1, 0xFF, 0x40, 0x14,
67340x30, 0x00, 0x31, 0x26, 0x34, 0x00, 0xBF, 0x8F, 0x30, 0x00, 0xBE, 0x8F,
67350x2C, 0x00, 0xB7, 0x8F, 0x28, 0x00, 0xB6, 0x8F, 0x24, 0x00, 0xB5, 0x8F,
67360x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
67370x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
67380x38, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0xD3, 0x5C, 0x44, 0x90,
67390x24, 0x18, 0x75, 0x00, 0x80, 0x0F, 0xA2, 0x34, 0x00, 0x10, 0x63, 0x34,
67400xCA, 0xFF, 0x87, 0x14, 0x24, 0x10, 0x54, 0x00, 0xA9, 0x54, 0x00, 0x08,
67410xD4, 0x23, 0xC3, 0xAC, 0xA1, 0x54, 0x00, 0x08, 0xE6, 0x1D, 0x20, 0xA2,
67420xE8, 0x54, 0x00, 0x08, 0xFF, 0x00, 0xA5, 0x30, 0x00, 0x00, 0x85, 0xA0,
67430xFF, 0xFF, 0xC6, 0x24, 0x01, 0x00, 0x84, 0x24, 0xFC, 0xFF, 0xC0, 0x14,
67440x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
67450x05, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xAC,
67460xFF, 0xFF, 0xC6, 0x24, 0xFD, 0xFF, 0xC0, 0x14, 0x04, 0x00, 0x84, 0x24,
67470x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x21, 0x38, 0x80, 0x00,
67480x08, 0x00, 0xC0, 0x10, 0xFF, 0xFF, 0xC3, 0x24, 0xFF, 0xFF, 0x06, 0x24,
67490x00, 0x00, 0xA2, 0x90, 0xFF, 0xFF, 0x63, 0x24, 0x01, 0x00, 0xA5, 0x24,
67500x00, 0x00, 0xE2, 0xA0, 0xFB, 0xFF, 0x66, 0x14, 0x01, 0x00, 0xE7, 0x24,
67510x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x80, 0x00, 0x2B, 0x10, 0xA4, 0x00,
67520x0D, 0x00, 0x40, 0x14, 0xFF, 0xFF, 0x02, 0x24, 0xFF, 0xFF, 0xC6, 0x24,
67530x08, 0x00, 0xC2, 0x10, 0x21, 0x18, 0x80, 0x00, 0xFF, 0xFF, 0x07, 0x24,
67540x00, 0x00, 0xA2, 0x90, 0xFF, 0xFF, 0xC6, 0x24, 0x01, 0x00, 0xA5, 0x24,
67550x00, 0x00, 0x62, 0xA0, 0xFB, 0xFF, 0xC7, 0x14, 0x01, 0x00, 0x63, 0x24,
67560x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x80, 0x00, 0x21, 0x28, 0xA6, 0x00,
67570x21, 0x18, 0x86, 0x00, 0xFF, 0xFF, 0xC6, 0x24, 0xFA, 0xFF, 0xC2, 0x10,
67580x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x24, 0xFF, 0xFF, 0xA5, 0x24,
67590x00, 0x00, 0xA2, 0x90, 0xFF, 0xFF, 0x63, 0x24, 0xFF, 0xFF, 0xC6, 0x24,
67600xFB, 0xFF, 0xC7, 0x14, 0x00, 0x00, 0x62, 0xA0, 0x08, 0x00, 0xE0, 0x03,
67610x21, 0x10, 0x80, 0x00, 0x0C, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00,
67620x00, 0x00, 0x82, 0x90, 0x00, 0x00, 0xA3, 0x90, 0x01, 0x00, 0x84, 0x24,
67630x23, 0x10, 0x43, 0x00, 0x00, 0x16, 0x02, 0x00, 0x03, 0x16, 0x02, 0x00,
67640x04, 0x00, 0x40, 0x14, 0x01, 0x00, 0xA5, 0x24, 0xFF, 0xFF, 0xC6, 0x24,
67650xF6, 0xFF, 0xC0, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
67660x21, 0x10, 0xC0, 0x00, 0x33, 0x55, 0x00, 0x08, 0x21, 0x18, 0x86, 0x00,
67670x00, 0x00, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x45, 0x10,
67680x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x84, 0x24, 0xFA, 0xFF, 0x83, 0x14,
67690x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x80, 0x00,
67700x09, 0x00, 0xC0, 0x10, 0xFF, 0xFF, 0xC3, 0x24, 0xFF, 0x00, 0xA5, 0x30,
67710xFF, 0xFF, 0x06, 0x24, 0x00, 0x00, 0x82, 0x90, 0xFF, 0xFF, 0x63, 0x24,
67720x05, 0x00, 0x45, 0x10, 0x01, 0x00, 0x84, 0x24, 0xFB, 0xFF, 0x66, 0x14,
67730x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
67740x08, 0x00, 0xE0, 0x03, 0xFF, 0xFF, 0x82, 0x24, 0x21, 0x38, 0x00, 0x00,
67750x1F, 0x00, 0xC0, 0x10, 0x21, 0x18, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C,
67760x40, 0xF4, 0x4B, 0x24, 0x00, 0x00, 0x87, 0x90, 0x00, 0x00, 0xA3, 0x90,
67770xFF, 0xFF, 0xC6, 0x24, 0x01, 0x00, 0x84, 0x24, 0x21, 0x10, 0xEB, 0x00,
67780x16, 0x00, 0xE0, 0x10, 0x01, 0x00, 0xA5, 0x24, 0x14, 0x00, 0x60, 0x10,
67790x21, 0x48, 0x6B, 0x00, 0x10, 0x00, 0xE3, 0x10, 0x20, 0x00, 0xE8, 0x24,
67800x00, 0x00, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x30,
67810x02, 0x00, 0x40, 0x10, 0x20, 0x00, 0x6A, 0x24, 0xFF, 0x00, 0x07, 0x31,
67820x00, 0x00, 0x22, 0x91, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x30,
67830x02, 0x00, 0x40, 0x10, 0xFF, 0x00, 0xE7, 0x30, 0xFF, 0x00, 0x43, 0x31,
67840xFF, 0x00, 0x63, 0x30, 0x03, 0x00, 0xE3, 0x14, 0x00, 0x00, 0x00, 0x00,
67850xE5, 0xFF, 0xC0, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
67860x23, 0x10, 0xE3, 0x00, 0x21, 0x18, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x90,
67870x01, 0x00, 0xA5, 0x24, 0x00, 0x00, 0x82, 0xA0, 0xFC, 0xFF, 0x40, 0x14,
67880x01, 0x00, 0x84, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
67890x21, 0x38, 0x80, 0x00, 0xFF, 0xFF, 0x03, 0x24, 0xFF, 0xFF, 0xC6, 0x24,
67900x06, 0x00, 0xC3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x90,
67910x01, 0x00, 0xA5, 0x24, 0x00, 0x00, 0x82, 0xA0, 0xF9, 0xFF, 0x40, 0x14,
67920x01, 0x00, 0x84, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xE0, 0x00,
67930x00, 0x00, 0x82, 0x80, 0x82, 0x55, 0x00, 0x08, 0x21, 0x18, 0x80, 0x00,
67940x01, 0x00, 0x84, 0x24, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00,
67950xFC, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x90,
67960x01, 0x00, 0xA5, 0x24, 0x00, 0x00, 0x82, 0xA0, 0xFC, 0xFF, 0x40, 0x14,
67970x01, 0x00, 0x84, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
67980x12, 0x00, 0xC0, 0x10, 0x21, 0x18, 0x80, 0x00, 0x00, 0x00, 0x82, 0x80,
67990x93, 0x55, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x84, 0x24,
68000x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x40, 0x14,
68010x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x90, 0x01, 0x00, 0xA5, 0x24,
68020x00, 0x00, 0x82, 0xA0, 0x05, 0x00, 0x40, 0x10, 0x01, 0x00, 0x84, 0x24,
68030xFF, 0xFF, 0xC6, 0x24, 0xF9, 0xFF, 0xC0, 0x14, 0x00, 0x00, 0x00, 0x00,
68040x00, 0x00, 0x80, 0xA0, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
68050x00, 0x00, 0x83, 0x90, 0x00, 0x00, 0xA2, 0x90, 0x01, 0x00, 0x84, 0x24,
68060x23, 0x10, 0x62, 0x00, 0x00, 0x16, 0x02, 0x00, 0x03, 0x16, 0x02, 0x00,
68070x03, 0x00, 0x40, 0x14, 0x01, 0x00, 0xA5, 0x24, 0xF7, 0xFF, 0x60, 0x14,
68080x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
68090x21, 0x10, 0x00, 0x00, 0x0B, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00,
68100x00, 0x00, 0xA2, 0x90, 0x00, 0x00, 0x83, 0x90, 0xFF, 0xFF, 0xC6, 0x24,
68110x23, 0x10, 0x62, 0x00, 0x00, 0x16, 0x02, 0x00, 0x03, 0x16, 0x02, 0x00,
68120x03, 0x00, 0x40, 0x14, 0x01, 0x00, 0xA5, 0x24, 0xF5, 0xFF, 0x60, 0x14,
68130x01, 0x00, 0x84, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
68140x00, 0x00, 0x83, 0x80, 0x00, 0x2E, 0x05, 0x00, 0x21, 0x10, 0x80, 0x00,
68150xC4, 0x55, 0x00, 0x08, 0x03, 0x2E, 0x05, 0x00, 0x07, 0x00, 0x60, 0x10,
68160x01, 0x00, 0x42, 0x24, 0x00, 0x00, 0x43, 0x80, 0x00, 0x00, 0x00, 0x00,
68170xFB, 0xFF, 0x65, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
68180x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
68190x00, 0x00, 0x82, 0x80, 0xD0, 0x55, 0x00, 0x08, 0x21, 0x18, 0x80, 0x00,
68200x01, 0x00, 0x63, 0x24, 0x00, 0x00, 0x62, 0x80, 0x00, 0x00, 0x00, 0x00,
68210xFC, 0xFF, 0x40, 0x14, 0x23, 0x10, 0x64, 0x00, 0x08, 0x00, 0xE0, 0x03,
68220x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF,
68230x21, 0x80, 0xA0, 0x00, 0x14, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xBF, 0xAF,
68240x21, 0x88, 0x80, 0x00, 0xCA, 0x55, 0x00, 0x0C, 0x00, 0x86, 0x10, 0x00,
68250x21, 0x18, 0x51, 0x00, 0x03, 0x86, 0x10, 0x00, 0x00, 0x00, 0x62, 0x80,
68260x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x50, 0x10, 0x21, 0x10, 0x60, 0x00,
68270xFF, 0xFF, 0x63, 0x24, 0x2B, 0x10, 0x71, 0x00, 0xF9, 0xFF, 0x40, 0x10,
68280x21, 0x10, 0x00, 0x00, 0x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
68290x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
68300x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
68310x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0x21, 0x30, 0x80, 0x00,
68320x0D, 0x00, 0xA0, 0x10, 0xFF, 0xFF, 0xA3, 0x24, 0x00, 0x00, 0x82, 0x80,
68330x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
68340xFF, 0xFF, 0x05, 0x24, 0xFF, 0xFF, 0x63, 0x24, 0x05, 0x00, 0x65, 0x10,
68350x01, 0x00, 0xC6, 0x24, 0x00, 0x00, 0xC2, 0x80, 0x00, 0x00, 0x00, 0x00,
68360xFA, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
68370x23, 0x10, 0xC4, 0x00, 0x00, 0x00, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00,
68380x19, 0x00, 0x40, 0x10, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0xA9, 0x80,
68390x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x20, 0x11, 0x21, 0x30, 0xA0, 0x00,
68400x00, 0x3E, 0x02, 0x00, 0x03, 0x3E, 0x07, 0x00, 0x21, 0x18, 0x20, 0x01,
68410x15, 0x00, 0xE3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xC6, 0x24,
68420x00, 0x00, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x02, 0x00,
68430x03, 0x1E, 0x03, 0x00, 0xF8, 0xFF, 0x60, 0x14, 0x00, 0x16, 0x02, 0x00,
68440x03, 0x16, 0x02, 0x00, 0x06, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
68450x01, 0x00, 0x84, 0x24, 0x00, 0x00, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00,
68460xEB, 0xFF, 0x40, 0x14, 0x01, 0x00, 0x08, 0x25, 0x08, 0x00, 0xE0, 0x03,
68470x21, 0x10, 0x00, 0x01, 0x00, 0x00, 0xA2, 0x90, 0x15, 0x56, 0x00, 0x08,
68480x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0xC2, 0x90, 0x15, 0x56, 0x00, 0x08,
68490x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x87, 0x90, 0x00, 0x00, 0x00, 0x00,
68500x14, 0x00, 0xE0, 0x10, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, 0xA4, 0x90,
68510x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x04, 0x00, 0x03, 0x1E, 0x03, 0x00,
68520x09, 0x00, 0x60, 0x10, 0x21, 0x30, 0xA0, 0x00, 0x00, 0x3E, 0x07, 0x00,
68530x03, 0x3E, 0x07, 0x00, 0x0B, 0x00, 0xE3, 0x10, 0x01, 0x00, 0xC6, 0x24,
68540x00, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFF, 0x60, 0x14,
68550x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24, 0x00, 0x00, 0x47, 0x90,
68560x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xE0, 0x14, 0x00, 0x00, 0x00, 0x00,
68570x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
68580xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
68590x18, 0x00, 0xBF, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x1D, 0x00, 0x80, 0x10,
68600x21, 0x88, 0xA0, 0x00, 0x01, 0x56, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x02,
68610x21, 0x80, 0x02, 0x02, 0x00, 0x00, 0x02, 0x82, 0x21, 0x28, 0x20, 0x02,
68620x21, 0x20, 0x00, 0x02, 0x22, 0x00, 0x40, 0x10, 0x21, 0x18, 0x00, 0x00,
68630x25, 0x56, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x40, 0x10,
68640x21, 0x18, 0x40, 0x00, 0x00, 0x00, 0x42, 0x80, 0x00, 0x00, 0x00, 0x00,
68650x0A, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C,
68660x58, 0xF5, 0x43, 0xAC, 0x21, 0x18, 0x00, 0x02, 0x18, 0x00, 0xBF, 0x8F,
68670x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00,
68680x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x60, 0xA0,
68690x56, 0x56, 0x00, 0x08, 0x01, 0x00, 0x63, 0x24, 0x02, 0x80, 0x02, 0x3C,
68700x58, 0xF5, 0x50, 0x8C, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x00, 0x12,
68710x21, 0x18, 0x00, 0x00, 0x01, 0x56, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x02,
68720x21, 0x80, 0x02, 0x02, 0x00, 0x00, 0x02, 0x82, 0x21, 0x28, 0x20, 0x02,
68730x21, 0x20, 0x00, 0x02, 0xE0, 0xFF, 0x40, 0x14, 0x21, 0x18, 0x00, 0x00,
68740x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
68750x02, 0x80, 0x02, 0x3C, 0x58, 0xF5, 0x40, 0xAC, 0x20, 0x00, 0xBD, 0x27,
68760x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00, 0xE0, 0xFF, 0xBD, 0x27,
68770x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x1C, 0x00, 0xBF, 0xAF,
68780x10, 0x00, 0xB0, 0xAF, 0x00, 0x00, 0x90, 0x8C, 0x21, 0x90, 0x80, 0x00,
68790x21, 0x88, 0xA0, 0x00, 0x21, 0x18, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x12,
68800x21, 0x20, 0x00, 0x02, 0x01, 0x56, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
68810x21, 0x80, 0x02, 0x02, 0x00, 0x00, 0x02, 0x82, 0x21, 0x28, 0x20, 0x02,
68820x21, 0x20, 0x00, 0x02, 0x07, 0x00, 0x40, 0x10, 0x21, 0x18, 0x00, 0x00,
68830x25, 0x56, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x18, 0x40, 0x00,
68840x09, 0x00, 0x40, 0x14, 0x00, 0x00, 0x42, 0xAE, 0x21, 0x18, 0x00, 0x02,
68850x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
68860x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
68870x20, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x42, 0x80, 0x00, 0x00, 0x00, 0x00,
68880xF5, 0xFF, 0x40, 0x10, 0x01, 0x00, 0x64, 0x24, 0x00, 0x00, 0x60, 0xA0,
68890x8F, 0x56, 0x00, 0x08, 0x00, 0x00, 0x44, 0xAE, 0xD8, 0xFF, 0xBD, 0x27,
68900x14, 0x00, 0xB1, 0xAF, 0x21, 0x88, 0x80, 0x00, 0x21, 0x20, 0xA0, 0x00,
68910x1C, 0x00, 0xB3, 0xAF, 0x18, 0x00, 0xB2, 0xAF, 0x20, 0x00, 0xBF, 0xAF,
68920x10, 0x00, 0xB0, 0xAF, 0xCA, 0x55, 0x00, 0x0C, 0x21, 0x98, 0xA0, 0x00,
68930x21, 0x90, 0x40, 0x00, 0x08, 0x00, 0x40, 0x16, 0x21, 0x10, 0x20, 0x02,
68940x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
68950x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
68960x28, 0x00, 0xBD, 0x27, 0xCA, 0x55, 0x00, 0x0C, 0x21, 0x20, 0x20, 0x02,
68970x21, 0x80, 0x40, 0x00, 0x2A, 0x10, 0x52, 0x00, 0x0A, 0x00, 0x40, 0x14,
68980x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x20, 0x02, 0x21, 0x28, 0x60, 0x02,
68990x21, 0x30, 0x40, 0x02, 0x1D, 0x55, 0x00, 0x0C, 0xFF, 0xFF, 0x10, 0x26,
69000x0B, 0x00, 0x40, 0x10, 0x2A, 0x18, 0x12, 0x02, 0xF8, 0xFF, 0x60, 0x10,
69010x01, 0x00, 0x31, 0x26, 0x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
69020x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
69030x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
69040xAB, 0x56, 0x00, 0x08, 0x21, 0x10, 0x20, 0x02, 0x00, 0x00, 0x87, 0x90,
69050x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0xE0, 0x10, 0x00, 0x00, 0x00, 0x00,
69060x00, 0x00, 0xA6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xC0, 0x10,
69070xDF, 0xFF, 0x02, 0x24, 0x24, 0x18, 0xC2, 0x00, 0x24, 0x10, 0xE2, 0x00,
69080x00, 0x16, 0x02, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x03, 0x16, 0x02, 0x00,
69090x03, 0x1E, 0x03, 0x00, 0x0A, 0x00, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00,
69100xDF, 0xFF, 0x02, 0x24, 0x24, 0x18, 0xC2, 0x00, 0x24, 0x10, 0xE2, 0x00,
69110x00, 0x16, 0x02, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x03, 0x1E, 0x03, 0x00,
69120x03, 0x16, 0x02, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x23, 0x10, 0x43, 0x00,
69130xEE, 0x56, 0x00, 0x08, 0xDF, 0xFF, 0x08, 0x24, 0x00, 0x00, 0xA6, 0x90,
69140x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x06, 0x01, 0x00, 0x16, 0x02, 0x00,
69150xF0, 0xFF, 0xC0, 0x10, 0x03, 0x16, 0x02, 0x00, 0xEF, 0xFF, 0x62, 0x14,
69160xDF, 0xFF, 0x02, 0x24, 0x01, 0x00, 0x84, 0x24, 0x00, 0x00, 0x87, 0x90,
69170x01, 0x00, 0xA5, 0x24, 0x24, 0x10, 0x07, 0x01, 0x00, 0x1E, 0x02, 0x00,
69180xF2, 0xFF, 0xE0, 0x14, 0x03, 0x1E, 0x03, 0x00, 0x00, 0x00, 0xA6, 0x90,
69190xDF, 0xFF, 0x02, 0x24, 0x24, 0x18, 0xC2, 0x00, 0x24, 0x10, 0xE2, 0x00,
69200x00, 0x16, 0x02, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x03, 0x1E, 0x03, 0x00,
69210x03, 0x16, 0x02, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x23, 0x10, 0x43, 0x00,
69220xA8, 0xFF, 0xBD, 0x27, 0x44, 0x00, 0xB5, 0xAF, 0x40, 0x00, 0xB4, 0xAF,
69230x38, 0x00, 0xB2, 0xAF, 0x34, 0x00, 0xB1, 0xAF, 0x54, 0x00, 0xBF, 0xAF,
69240x50, 0x00, 0xBE, 0xAF, 0x4C, 0x00, 0xB7, 0xAF, 0x48, 0x00, 0xB6, 0xAF,
69250x3C, 0x00, 0xB3, 0xAF, 0x30, 0x00, 0xB0, 0xAF, 0x21, 0x90, 0xA0, 0x00,
69260x00, 0x00, 0xA5, 0x90, 0x21, 0xA0, 0x80, 0x00, 0x21, 0xA8, 0xC0, 0x00,
69270x00, 0x26, 0x05, 0x00, 0x03, 0x26, 0x04, 0x00, 0x11, 0x00, 0x80, 0x10,
69280x21, 0x88, 0x80, 0x02, 0x25, 0x00, 0x02, 0x24, 0x29, 0x00, 0x82, 0x10,
69290x0A, 0x00, 0x02, 0x24, 0x1B, 0x00, 0x82, 0x10, 0x00, 0x00, 0x00, 0x00,
69300x1E, 0x00, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xA2,
69310x01, 0x00, 0x31, 0x26, 0x01, 0x00, 0x52, 0x26, 0x00, 0x00, 0x45, 0x92,
69320x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x05, 0x00, 0x03, 0x26, 0x04, 0x00,
69330xF2, 0xFF, 0x80, 0x14, 0x25, 0x00, 0x02, 0x24, 0x02, 0x00, 0x80, 0x12,
69340x23, 0x10, 0x34, 0x02, 0x00, 0x00, 0x20, 0xA2, 0x54, 0x00, 0xBF, 0x8F,
69350x50, 0x00, 0xBE, 0x8F, 0x4C, 0x00, 0xB7, 0x8F, 0x48, 0x00, 0xB6, 0x8F,
69360x44, 0x00, 0xB5, 0x8F, 0x40, 0x00, 0xB4, 0x8F, 0x3C, 0x00, 0xB3, 0x8F,
69370x38, 0x00, 0xB2, 0x8F, 0x34, 0x00, 0xB1, 0x8F, 0x30, 0x00, 0xB0, 0x8F,
69380x08, 0x00, 0xE0, 0x03, 0x58, 0x00, 0xBD, 0x27, 0xE7, 0xFF, 0x80, 0x16,
69390x00, 0x00, 0x00, 0x00, 0x57, 0x58, 0x00, 0x0C, 0x0D, 0x00, 0x04, 0x24,
69400x0A, 0x00, 0x04, 0x24, 0x57, 0x58, 0x00, 0x0C, 0x01, 0x00, 0x52, 0x26,
69410x00, 0x00, 0x45, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x05, 0x00,
69420x20, 0x57, 0x00, 0x08, 0x03, 0x26, 0x04, 0x00, 0x01, 0x00, 0x52, 0x26,
69430x00, 0x00, 0x45, 0x92, 0x73, 0x00, 0x02, 0x24, 0x00, 0x1E, 0x05, 0x00,
69440x03, 0x1E, 0x03, 0x00, 0x2C, 0x00, 0x62, 0x10, 0x10, 0x00, 0xB3, 0x27,
69450x23, 0x00, 0x02, 0x24, 0x21, 0xF0, 0x60, 0x02, 0x21, 0x38, 0x00, 0x00,
69460x34, 0x00, 0x62, 0x10, 0x1C, 0x00, 0x04, 0x24, 0x00, 0x16, 0x05, 0x00,
69470x03, 0x16, 0x02, 0x00, 0x68, 0x00, 0x03, 0x24, 0x36, 0x00, 0x43, 0x10,
69480x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x05, 0x00, 0x03, 0x16, 0x02, 0x00,
69490x39, 0x00, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA2, 0x34,
69500x00, 0x16, 0x02, 0x00, 0x03, 0x16, 0x02, 0x00, 0x78, 0x00, 0x03, 0x24,
69510x3C, 0x00, 0x43, 0x10, 0x20, 0x00, 0xA6, 0x30, 0x00, 0x1E, 0x05, 0x00,
69520x03, 0x1E, 0x03, 0x00, 0x64, 0x00, 0x02, 0x24, 0x49, 0x00, 0x62, 0x10,
69530x40, 0x00, 0x02, 0x24, 0x81, 0x00, 0x62, 0x10, 0x21, 0x00, 0x02, 0x24,
69540x92, 0x00, 0x62, 0x10, 0x63, 0x00, 0x02, 0x24, 0xA2, 0x00, 0x62, 0x10,
69550x11, 0x00, 0xB3, 0x27, 0x10, 0x00, 0xA5, 0xA3, 0x21, 0x80, 0xC0, 0x03,
69560x2B, 0x10, 0x13, 0x02, 0xB4, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
69570x6C, 0x00, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x92,
69580x01, 0x00, 0x10, 0x26, 0x00, 0x00, 0x22, 0xA2, 0x65, 0x57, 0x00, 0x08,
69590x01, 0x00, 0x31, 0x26, 0x00, 0x00, 0xA2, 0x8E, 0x04, 0x00, 0xB5, 0x26,
69600x21, 0x80, 0x40, 0x00, 0x00, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00,
69610xA6, 0xFF, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x80, 0x12,
69620x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xA2, 0x01, 0x00, 0x10, 0x26,
69630x72, 0x57, 0x00, 0x08, 0x01, 0x00, 0x31, 0x26, 0x01, 0x00, 0x52, 0x26,
69640x00, 0x00, 0x45, 0x92, 0x68, 0x00, 0x03, 0x24, 0x00, 0x16, 0x05, 0x00,
69650x03, 0x16, 0x02, 0x00, 0xCC, 0xFF, 0x43, 0x14, 0x01, 0x00, 0x07, 0x24,
69660x01, 0x00, 0x52, 0x26, 0x00, 0x00, 0x45, 0x92, 0x00, 0x00, 0x00, 0x00,
69670x00, 0x16, 0x05, 0x00, 0x03, 0x16, 0x02, 0x00, 0xC9, 0xFF, 0x43, 0x14,
69680x0C, 0x00, 0x04, 0x24, 0x01, 0x00, 0x52, 0x26, 0x00, 0x00, 0x45, 0x92,
69690x78, 0x00, 0x03, 0x24, 0x20, 0x00, 0xA2, 0x34, 0x00, 0x16, 0x02, 0x00,
69700x03, 0x16, 0x02, 0x00, 0xC7, 0xFF, 0x43, 0x14, 0x04, 0x00, 0x04, 0x24,
69710x20, 0x00, 0xA6, 0x30, 0x00, 0x00, 0xA5, 0x8E, 0x35, 0x00, 0xE0, 0x14,
69720x04, 0x00, 0xB5, 0x26, 0xCD, 0xFF, 0x80, 0x04, 0x02, 0x80, 0x02, 0x3C,
69730x0C, 0xEF, 0x42, 0x24, 0x00, 0x00, 0x47, 0x8C, 0x07, 0x10, 0x85, 0x00,
69740x0F, 0x00, 0x42, 0x30, 0x21, 0x10, 0x47, 0x00, 0x00, 0x00, 0x43, 0x90,
69750xFC, 0xFF, 0x84, 0x24, 0x25, 0x18, 0xC3, 0x00, 0x00, 0x00, 0x63, 0xA2,
69760xF8, 0xFF, 0x81, 0x04, 0x01, 0x00, 0x73, 0x26, 0x65, 0x57, 0x00, 0x08,
69770x21, 0x80, 0xC0, 0x03, 0x00, 0x00, 0xA2, 0x8E, 0x04, 0x00, 0xB5, 0x26,
69780x28, 0x00, 0x40, 0x04, 0x21, 0x28, 0x40, 0x00, 0x21, 0x80, 0x60, 0x02,
69790x02, 0x80, 0x02, 0x3C, 0x10, 0xEF, 0x42, 0x24, 0x00, 0x00, 0x46, 0x8C,
69800x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xA6, 0x00, 0xC3, 0x27, 0x05, 0x00,
69810x10, 0x10, 0x00, 0x00, 0x83, 0x10, 0x02, 0x00, 0x23, 0x10, 0x44, 0x00,
69820x80, 0x18, 0x02, 0x00, 0x21, 0x18, 0x62, 0x00, 0x40, 0x18, 0x03, 0x00,
69830x23, 0x18, 0xA3, 0x00, 0x30, 0x00, 0x63, 0x24, 0x00, 0x00, 0x63, 0xA2,
69840x21, 0x28, 0x40, 0x00, 0xF3, 0xFF, 0x40, 0x14, 0x01, 0x00, 0x73, 0x26,
69850xC5, 0x57, 0x00, 0x08, 0xFF, 0xFF, 0x63, 0x26, 0x00, 0x00, 0x65, 0x80,
69860x00, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xA0,
69870x00, 0x00, 0x05, 0xA2, 0xFF, 0xFF, 0x63, 0x24, 0x01, 0x00, 0x10, 0x26,
69880x2B, 0x10, 0x03, 0x02, 0xF7, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
69890x65, 0x57, 0x00, 0x08, 0x21, 0x80, 0xC0, 0x03, 0x58, 0x00, 0xC3, 0x34,
69900x30, 0x00, 0x02, 0x24, 0x12, 0x00, 0xB3, 0x27, 0x10, 0x00, 0xA2, 0xA3,
69910x96, 0x57, 0x00, 0x08, 0x11, 0x00, 0xA3, 0xA3, 0x2D, 0x00, 0x02, 0x24,
69920x23, 0x28, 0x05, 0x00, 0x11, 0x00, 0xB3, 0x27, 0xA9, 0x57, 0x00, 0x08,
69930x10, 0x00, 0xA2, 0xA3, 0x00, 0x00, 0x04, 0x82, 0x57, 0x58, 0x00, 0x0C,
69940x01, 0x00, 0x10, 0x26, 0x66, 0x57, 0x00, 0x08, 0x2B, 0x10, 0x13, 0x02,
69950x00, 0x00, 0x04, 0x82, 0x57, 0x58, 0x00, 0x0C, 0x01, 0x00, 0x10, 0x26,
69960x72, 0x57, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x8E,
69970x28, 0x00, 0xB0, 0x27, 0x2C, 0x00, 0xA4, 0x27, 0x2B, 0x10, 0x04, 0x02,
69980x28, 0x00, 0xA3, 0xAF, 0x0B, 0x00, 0x40, 0x10, 0x04, 0x00, 0xB5, 0x26,
69990x21, 0xB8, 0x80, 0x00, 0x02, 0x80, 0x16, 0x3C, 0x00, 0x00, 0x06, 0x92,
70000x21, 0x20, 0x60, 0x02, 0x01, 0x00, 0x10, 0x26, 0x08, 0x58, 0x00, 0x0C,
70010x00, 0xEF, 0xC5, 0x26, 0x2B, 0x18, 0x17, 0x02, 0xF9, 0xFF, 0x60, 0x14,
70020x21, 0x98, 0x62, 0x02, 0x64, 0x57, 0x00, 0x08, 0xFF, 0xFF, 0x73, 0x26,
70030x00, 0x00, 0xA2, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x56, 0x24,
70040x21, 0x80, 0x40, 0x00, 0x2B, 0x10, 0x56, 0x00, 0xF8, 0xFF, 0x40, 0x10,
70050x04, 0x00, 0xB5, 0x26, 0x02, 0x80, 0x17, 0x3C, 0x00, 0x00, 0x06, 0x82,
70060x21, 0x20, 0x60, 0x02, 0x01, 0x00, 0x10, 0x26, 0x08, 0x58, 0x00, 0x0C,
70070x04, 0xEF, 0xE5, 0x26, 0x2B, 0x18, 0x16, 0x02, 0xF9, 0xFF, 0x60, 0x14,
70080x21, 0x98, 0x62, 0x02, 0x64, 0x57, 0x00, 0x08, 0xFF, 0xFF, 0x73, 0x26,
70090x00, 0x00, 0xA2, 0x8E, 0x04, 0x00, 0xB5, 0x26, 0x64, 0x57, 0x00, 0x08,
70100x10, 0x00, 0xA2, 0xA3, 0xE8, 0xFF, 0xBD, 0x27, 0x20, 0x00, 0xA6, 0xAF,
70110x20, 0x00, 0xA6, 0x27, 0x10, 0x00, 0xBF, 0xAF, 0x24, 0x00, 0xA7, 0xAF,
70120xFF, 0x56, 0x00, 0x0C, 0x1C, 0x00, 0xA5, 0xAF, 0x10, 0x00, 0xBF, 0x8F,
70130x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27,
70140xE0, 0xFF, 0xBD, 0x27, 0x20, 0x00, 0xA4, 0xAF, 0x10, 0x00, 0xA4, 0x27,
70150x1C, 0x00, 0xBF, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x24, 0x00, 0xA5, 0xAF,
70160x28, 0x00, 0xA6, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0x2C, 0x00, 0xA7, 0xAF,
70170x53, 0x21, 0x00, 0x0C, 0xA0, 0x00, 0x04, 0x24, 0x1F, 0x00, 0x40, 0x10,
70180x21, 0x80, 0x40, 0x00, 0x08, 0x00, 0x44, 0x94, 0x20, 0x00, 0xA5, 0x8F,
70190x02, 0x80, 0x02, 0x3C, 0x25, 0x20, 0x82, 0x00, 0x20, 0x00, 0x84, 0x24,
70200xFF, 0x56, 0x00, 0x0C, 0x24, 0x00, 0xA6, 0x27, 0x01, 0x00, 0x42, 0x24,
70210x13, 0x00, 0x03, 0x24, 0x81, 0x00, 0x44, 0x2C, 0x14, 0x00, 0x03, 0xAE,
70220x0A, 0x00, 0x80, 0x14, 0x0C, 0x00, 0x02, 0xAE, 0x9B, 0x40, 0x00, 0x0C,
70230x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
70240x88, 0x88, 0x63, 0x34, 0x18, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
70250x34, 0x58, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x17, 0x0A, 0x00, 0x0C,
70260x21, 0x20, 0x00, 0x02, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
70270x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
70280x20, 0x00, 0xBD, 0x27, 0x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
70290x99, 0x99, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C, 0x99, 0x99, 0x63, 0x34,
70300x18, 0x03, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC, 0x3A, 0x58, 0x00, 0x08,
70310x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
70320x02, 0x80, 0x06, 0x3C, 0x5C, 0xF5, 0xC5, 0x8C, 0x02, 0x80, 0x02, 0x3C,
70330x40, 0xF5, 0x42, 0x24, 0x03, 0x00, 0xA3, 0x30, 0x21, 0x18, 0x62, 0x00,
70340x00, 0x00, 0x64, 0x80, 0x01, 0x00, 0xA5, 0x24, 0x57, 0x58, 0x00, 0x0C,
70350x5C, 0xF5, 0xC5, 0xAC, 0x10, 0x00, 0xBF, 0x8F, 0x08, 0x00, 0x04, 0x24,
70360x57, 0x58, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27, 0x00, 0x26, 0x04, 0x00,
70370x03, 0x26, 0x04, 0x00, 0x00, 0x00, 0x84, 0x48, 0x08, 0x00, 0xE0, 0x03,
70380x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x04, 0x00, 0x03, 0x26, 0x04, 0x00,
70390xF7, 0xFF, 0x82, 0x24, 0x05, 0x00, 0x42, 0x2C, 0x06, 0x00, 0x40, 0x14,
70400x21, 0x18, 0x00, 0x00, 0x20, 0x00, 0x02, 0x24, 0x03, 0x00, 0x82, 0x10,
70410x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
70420x01, 0x00, 0x03, 0x24, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x60, 0x00,
70430x00, 0x00, 0x82, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x26, 0x10, 0x44, 0x00,
70440x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x42, 0x2C, 0xE0, 0xFF, 0xBD, 0x27,
70450x18, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x1C, 0x00, 0xBF, 0xAF,
70460x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x10, 0x00, 0xA4, 0x27,
70470x02, 0x80, 0x02, 0x3C, 0xCC, 0x5D, 0x50, 0xAC, 0x90, 0x40, 0x00, 0x0C,
70480x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
70490x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0x25, 0xB0, 0x05, 0x3C,
70500x01, 0x00, 0x06, 0x24, 0x01, 0x80, 0x02, 0x3C, 0x04, 0x30, 0x86, 0x00,
70510xF1, 0x02, 0xA7, 0x34, 0xED, 0x02, 0xA4, 0x34, 0xF8, 0x61, 0x42, 0x24,
70520x18, 0x03, 0xA5, 0x34, 0x08, 0x00, 0x03, 0x24, 0x00, 0x00, 0xA2, 0xAC,
70530x00, 0x00, 0xE3, 0xA0, 0x00, 0x00, 0x80, 0xA0, 0x00, 0x00, 0x86, 0xA0,
70540x00, 0x00, 0x80, 0xA0, 0x00, 0x00, 0x86, 0xA0, 0x00, 0x00, 0x80, 0xA0,
70550x00, 0x00, 0x86, 0xA0, 0x00, 0x00, 0x80, 0xA0, 0x00, 0x00, 0x86, 0xA0,
70560x00, 0x00, 0x80, 0xA0, 0x00, 0x00, 0xE0, 0xA0, 0x08, 0x00, 0xE0, 0x03,
70570x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF,
70580xFF, 0xFF, 0x90, 0x30, 0x1C, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C,
70590x10, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x63, 0x24,
70600x6A, 0x37, 0x62, 0x94, 0x10, 0x00, 0xA4, 0x27, 0x25, 0x80, 0x02, 0x02,
70610x25, 0xB0, 0x02, 0x3C, 0x1E, 0x03, 0x42, 0x34, 0x00, 0x00, 0x50, 0xA4,
70620x90, 0x40, 0x00, 0x0C, 0x6A, 0x37, 0x70, 0xA4, 0x1C, 0x00, 0xBF, 0x8F,
70630x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
70640xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF, 0xFF, 0xFF, 0x90, 0x30,
70650x1C, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
70660x02, 0x80, 0x05, 0x3C, 0x60, 0x1B, 0xA5, 0x24, 0x6A, 0x37, 0xA2, 0x94,
70670x78, 0x37, 0xA3, 0x94, 0x27, 0x80, 0x10, 0x00, 0x10, 0x00, 0xA4, 0x27,
70680x24, 0x18, 0x03, 0x02, 0x24, 0x80, 0x02, 0x02, 0x25, 0xB0, 0x02, 0x3C,
70690x1E, 0x03, 0x42, 0x34, 0x78, 0x37, 0xA3, 0xA4, 0x00, 0x00, 0x50, 0xA4,
70700x90, 0x40, 0x00, 0x0C, 0x6A, 0x37, 0xB0, 0xA4, 0x1C, 0x00, 0xBF, 0x8F,
70710x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
70720xC8, 0xFF, 0xBD, 0x27, 0x25, 0xB0, 0x03, 0x3C, 0x1C, 0x00, 0xB3, 0xAF,
70730x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
70740x34, 0x00, 0xBF, 0xAF, 0x30, 0x00, 0xBE, 0xAF, 0x2C, 0x00, 0xB7, 0xAF,
70750x28, 0x00, 0xB6, 0xAF, 0x24, 0x00, 0xB5, 0xAF, 0x20, 0x00, 0xB4, 0xAF,
70760x0A, 0x00, 0x67, 0x34, 0x00, 0x00, 0xE2, 0x90, 0xFF, 0xFF, 0xB2, 0x30,
70770x21, 0x98, 0xC0, 0x00, 0xFF, 0x00, 0x91, 0x30, 0x20, 0x00, 0x40, 0x12,
70780xFF, 0x00, 0x50, 0x30, 0x21, 0xA0, 0xE0, 0x00, 0x0C, 0x00, 0x77, 0x34,
70790x0B, 0x00, 0x76, 0x34, 0x21, 0xF0, 0xE0, 0x00, 0xC0, 0xFF, 0x15, 0x24,
70800x25, 0x10, 0x15, 0x02, 0xFF, 0x00, 0x50, 0x30, 0x00, 0x00, 0xD1, 0xA2,
70810x00, 0x00, 0x90, 0xA2, 0x00, 0x00, 0x82, 0x92, 0x00, 0x00, 0x00, 0x00,
70820xFF, 0x00, 0x50, 0x30, 0xC0, 0x00, 0x03, 0x32, 0x07, 0x00, 0x60, 0x10,
70830x21, 0x20, 0xC0, 0x03, 0x00, 0x00, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00,
70840xFF, 0x00, 0x50, 0x30, 0xC0, 0x00, 0x03, 0x32, 0xFB, 0xFF, 0x60, 0x14,
70850x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0x8E, 0x04, 0x00, 0x23, 0x26,
70860x64, 0x00, 0x04, 0x24, 0x00, 0x00, 0x62, 0xAE, 0x2C, 0x1F, 0x00, 0x0C,
70870xFF, 0x00, 0x71, 0x30, 0xFC, 0xFF, 0x42, 0x26, 0xFF, 0xFF, 0x52, 0x30,
70880xE7, 0xFF, 0x40, 0x16, 0x04, 0x00, 0x73, 0x26, 0x34, 0x00, 0xBF, 0x8F,
70890x30, 0x00, 0xBE, 0x8F, 0x2C, 0x00, 0xB7, 0x8F, 0x28, 0x00, 0xB6, 0x8F,
70900x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
70910x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
70920x08, 0x00, 0xE0, 0x03, 0x38, 0x00, 0xBD, 0x27, 0x25, 0xB0, 0x06, 0x3C,
70930x31, 0x00, 0xC2, 0x34, 0xFF, 0xFF, 0x84, 0x30, 0x00, 0x00, 0x44, 0xA0,
70940x32, 0x00, 0xC7, 0x34, 0x00, 0x00, 0xE3, 0x90, 0xFC, 0xFF, 0x02, 0x24,
70950x02, 0x22, 0x04, 0x00, 0x24, 0x18, 0x62, 0x00, 0x03, 0x00, 0x84, 0x30,
70960x25, 0x20, 0x83, 0x00, 0x33, 0x00, 0xC6, 0x34, 0x72, 0x00, 0x02, 0x24,
70970x00, 0x00, 0xE4, 0xA0, 0x00, 0x00, 0xC2, 0xA0, 0x00, 0x00, 0xC3, 0x90,
70980x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x03, 0x1E, 0x03, 0x00,
70990x05, 0x00, 0x61, 0x04, 0x21, 0x10, 0x00, 0x00, 0x23, 0x59, 0x00, 0x08,
71000x25, 0xB0, 0x02, 0x3C, 0x11, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00,
71010x00, 0x00, 0xC3, 0x90, 0x01, 0x00, 0x42, 0x24, 0xFF, 0x00, 0x42, 0x30,
71020x00, 0x1E, 0x03, 0x00, 0x03, 0x1E, 0x03, 0x00, 0xF8, 0xFF, 0x61, 0x04,
71030x64, 0x00, 0x44, 0x2C, 0x64, 0x00, 0x44, 0x2C, 0x07, 0x00, 0x80, 0x10,
71040x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x02, 0x3C, 0x30, 0x00, 0x42, 0x34,
71050x00, 0x00, 0x43, 0x90, 0x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03,
71060x00, 0x00, 0xA3, 0xA0, 0xFF, 0xFF, 0x02, 0x24, 0x00, 0x00, 0xA2, 0xA0,
71070x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x25, 0xB0, 0x06, 0x3C,
71080x31, 0x00, 0xC2, 0x34, 0xFF, 0xFF, 0x84, 0x30, 0x00, 0x00, 0x44, 0xA0,
71090x32, 0x00, 0xC3, 0x34, 0x00, 0x00, 0x62, 0x90, 0x02, 0x22, 0x04, 0x00,
71100x03, 0x00, 0x84, 0x30, 0x25, 0x20, 0x82, 0x00, 0x00, 0x00, 0x64, 0xA0,
71110x33, 0x00, 0xC7, 0x34, 0xFF, 0x00, 0xA5, 0x30, 0x30, 0x00, 0xC6, 0x34,
71120xF2, 0xFF, 0x03, 0x24, 0x00, 0x00, 0xC5, 0xA0, 0x00, 0x00, 0xE3, 0xA0,
71130x00, 0x00, 0xE2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x02, 0x00,
71140x03, 0x16, 0x02, 0x00, 0x03, 0x00, 0x40, 0x04, 0x21, 0x20, 0x00, 0x00,
71150x08, 0x00, 0xE0, 0x03, 0x01, 0x00, 0x02, 0x24, 0x48, 0x59, 0x00, 0x08,
71160x21, 0x30, 0xE0, 0x00, 0x0B, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
71170x00, 0x00, 0xC3, 0x90, 0x01, 0x00, 0x82, 0x24, 0xFF, 0x00, 0x44, 0x30,
71180x00, 0x1E, 0x03, 0x00, 0x03, 0x1E, 0x03, 0x00, 0xF8, 0xFF, 0x60, 0x04,
71190x64, 0x00, 0x82, 0x2C, 0x64, 0x00, 0x82, 0x2C, 0xF1, 0xFF, 0x40, 0x14,
71200x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00,
71210xE0, 0xFF, 0xBD, 0x27, 0x25, 0xB0, 0x02, 0x3C, 0x18, 0x00, 0xB0, 0xAF,
71220xF8, 0x02, 0x45, 0x34, 0x25, 0xB0, 0x10, 0x3C, 0xFF, 0x00, 0x83, 0x30,
71230x01, 0x00, 0x02, 0x24, 0x1C, 0x00, 0xBF, 0xAF, 0x03, 0x00, 0x06, 0x36,
71240x0A, 0x00, 0x62, 0x10, 0x0A, 0x00, 0x04, 0x24, 0x00, 0x00, 0xA2, 0x90,
71250x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0xFE, 0xFF, 0x03, 0x24,
71260x24, 0x10, 0x43, 0x00, 0x20, 0x00, 0xBD, 0x27, 0x00, 0x00, 0xA2, 0xA0,
71270x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x90,
71280x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x42, 0x30, 0x20, 0x00, 0x43, 0x34,
71290x20, 0x00, 0x42, 0x30, 0x02, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
71300x00, 0x00, 0xC3, 0xA0, 0x2C, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
71310x01, 0x00, 0x04, 0x36, 0x00, 0x00, 0x82, 0x90, 0xFE, 0xFF, 0x03, 0x24,
71320xF8, 0x02, 0x06, 0x36, 0x24, 0x10, 0x43, 0x00, 0x00, 0x00, 0x82, 0xA0,
71330x00, 0x00, 0xC3, 0x90, 0x10, 0x00, 0xA5, 0x27, 0x21, 0x20, 0x00, 0x00,
71340x03, 0x00, 0x63, 0x34, 0x00, 0x00, 0xC3, 0xA0, 0xFF, 0x58, 0x00, 0x0C,
71350x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
71360x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xFF, 0x00, 0x84, 0x30,
71370x21, 0x38, 0x00, 0x00, 0x21, 0x28, 0x00, 0x00, 0x01, 0x00, 0xA3, 0x24,
71380x07, 0x10, 0xA4, 0x00, 0x01, 0x00, 0x42, 0x30, 0xFF, 0x00, 0x65, 0x30,
71390x01, 0x00, 0xE6, 0x24, 0x02, 0x00, 0x40, 0x14, 0x04, 0x00, 0xA3, 0x2C,
71400xFF, 0x00, 0xC7, 0x30, 0xF7, 0xFF, 0x60, 0x14, 0x21, 0x10, 0xE0, 0x00,
71410x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x8C, 0x30,
71420x21, 0x48, 0x00, 0x00, 0x21, 0x38, 0x00, 0x00, 0x40, 0x10, 0x07, 0x00,
71430xFF, 0x00, 0x42, 0x30, 0x21, 0x50, 0x46, 0x00, 0x01, 0x00, 0xE3, 0x24,
71440x07, 0x10, 0xEC, 0x00, 0x01, 0x00, 0x42, 0x30, 0xFF, 0x00, 0x67, 0x30,
71450x21, 0x58, 0x25, 0x01, 0x01, 0x00, 0x24, 0x25, 0x09, 0x00, 0x40, 0x14,
71460x04, 0x00, 0xE8, 0x2C, 0x00, 0x00, 0x63, 0x91, 0xFF, 0x00, 0x89, 0x30,
71470x21, 0x20, 0x25, 0x01, 0x00, 0x00, 0x43, 0xA1, 0x00, 0x00, 0x83, 0x90,
71480x01, 0x00, 0x22, 0x25, 0xFF, 0x00, 0x49, 0x30, 0x01, 0x00, 0x43, 0xA1,
71490xED, 0xFF, 0x00, 0x15, 0x40, 0x10, 0x07, 0x00, 0x08, 0x00, 0xE0, 0x03,
71500x00, 0x00, 0x00, 0x00, 0xD8, 0xFF, 0xBD, 0x27, 0x20, 0x00, 0xB2, 0xAF,
71510x1C, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xB0, 0xAF, 0x24, 0x00, 0xBF, 0xAF,
71520x01, 0x00, 0x12, 0x24, 0x21, 0x80, 0x00, 0x00, 0xC5, 0x59, 0x00, 0x08,
71530xFF, 0x00, 0x11, 0x24, 0xFF, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
71540x10, 0x00, 0x40, 0x10, 0x00, 0x02, 0x03, 0x2E, 0x0F, 0x00, 0x60, 0x10,
71550x21, 0x10, 0x00, 0x02, 0x10, 0x00, 0xA2, 0x93, 0x00, 0x00, 0x00, 0x00,
71560x0A, 0x00, 0x51, 0x10, 0x0F, 0x00, 0x44, 0x30, 0x83, 0x59, 0x00, 0x0C,
71570x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x02, 0x00, 0x21, 0x10, 0x50, 0x00,
71580x01, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x50, 0x30, 0x21, 0x20, 0x00, 0x02,
71590xEE, 0xFF, 0x40, 0x16, 0x10, 0x00, 0xA5, 0x27, 0x21, 0x10, 0x00, 0x02,
71600x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
71610x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
71620xB8, 0xFF, 0xBD, 0x27, 0x3C, 0x00, 0xB7, 0xAF, 0x38, 0x00, 0xB6, 0xAF,
71630x34, 0x00, 0xB5, 0xAF, 0x30, 0x00, 0xB4, 0xAF, 0x2C, 0x00, 0xB3, 0xAF,
71640x24, 0x00, 0xB1, 0xAF, 0x20, 0x00, 0xB0, 0xAF, 0x44, 0x00, 0xBF, 0xAF,
71650x40, 0x00, 0xBE, 0xAF, 0x28, 0x00, 0xB2, 0xAF, 0x21, 0x98, 0xA0, 0x00,
71660xFF, 0x00, 0x96, 0x30, 0x01, 0x00, 0x10, 0x24, 0x01, 0x00, 0x17, 0x24,
71670x21, 0xA0, 0x00, 0x00, 0x21, 0x88, 0x00, 0x00, 0x21, 0xA8, 0x00, 0x00,
71680x04, 0x00, 0xA0, 0x10, 0x21, 0x18, 0x00, 0x00, 0x10, 0x00, 0xC2, 0x2E,
71690x0E, 0x00, 0x40, 0x14, 0x21, 0x20, 0xA0, 0x00, 0x44, 0x00, 0xBF, 0x8F,
71700x40, 0x00, 0xBE, 0x8F, 0x3C, 0x00, 0xB7, 0x8F, 0x38, 0x00, 0xB6, 0x8F,
71710x34, 0x00, 0xB5, 0x8F, 0x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F,
71720x28, 0x00, 0xB2, 0x8F, 0x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F,
71730x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x27,
71740x08, 0x00, 0x06, 0x24, 0xE3, 0x54, 0x00, 0x0C, 0xFF, 0x00, 0x05, 0x24,
71750x18, 0x00, 0xA4, 0x27, 0xFF, 0x00, 0x05, 0x24, 0xE3, 0x54, 0x00, 0x0C,
71760x08, 0x00, 0x06, 0x24, 0x54, 0x59, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24,
71770x04, 0x5A, 0x00, 0x08, 0x10, 0x00, 0xBE, 0x27, 0x1C, 0x00, 0x40, 0x14,
71780x21, 0x20, 0xA0, 0x02, 0x37, 0x00, 0xE0, 0x12, 0x00, 0x02, 0x22, 0x2E,
71790x35, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x32,
71800xF8, 0xFF, 0x40, 0x10, 0x20, 0x00, 0x02, 0x32, 0x21, 0x20, 0x20, 0x02,
71810xFF, 0x58, 0x00, 0x0C, 0x10, 0x00, 0xA5, 0x27, 0x2D, 0x00, 0x40, 0x10,
71820xFF, 0x00, 0x02, 0x24, 0x10, 0x00, 0xB0, 0x93, 0x00, 0x00, 0x00, 0x00,
71830x29, 0x00, 0x02, 0x12, 0x0F, 0x00, 0x15, 0x32, 0x83, 0x59, 0x00, 0x0C,
71840x21, 0x20, 0xA0, 0x02, 0x02, 0x81, 0x10, 0x00, 0x10, 0x00, 0x16, 0x12,
71850x21, 0xA0, 0x40, 0x00, 0x40, 0x10, 0x14, 0x00, 0x21, 0x10, 0x51, 0x00,
71860x01, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x51, 0x30, 0x00, 0x5A, 0x00, 0x08,
71870x01, 0x00, 0x10, 0x24, 0x18, 0x00, 0xA5, 0x27, 0x92, 0x59, 0x00, 0x0C,
71880x21, 0x30, 0x60, 0x02, 0x40, 0x10, 0x14, 0x00, 0x21, 0x10, 0x51, 0x00,
71890x01, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x51, 0x30, 0x00, 0x5A, 0x00, 0x08,
71900x01, 0x00, 0x10, 0x24, 0x40, 0x90, 0x02, 0x00, 0x10, 0x00, 0x40, 0x1A,
71910x21, 0x80, 0x00, 0x00, 0x21, 0x20, 0x30, 0x02, 0x01, 0x00, 0x84, 0x24,
71920xFF, 0xFF, 0x84, 0x30, 0xFF, 0x58, 0x00, 0x0C, 0x10, 0x00, 0xA5, 0x27,
71930x01, 0x00, 0x03, 0x26, 0x21, 0x20, 0xD0, 0x03, 0xFF, 0x00, 0x70, 0x30,
71940x04, 0x00, 0x40, 0x10, 0x2A, 0x18, 0x12, 0x02, 0x10, 0x00, 0xA2, 0x93,
71950x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x82, 0xA0, 0xF3, 0xFF, 0x60, 0x14,
71960x21, 0x20, 0x30, 0x02, 0x00, 0x5A, 0x00, 0x08, 0x20, 0x00, 0x10, 0x24,
71970x54, 0x59, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x63, 0x92,
71980xFF, 0x00, 0x02, 0x24, 0x0F, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00,
71990x01, 0x00, 0x03, 0x24, 0x44, 0x00, 0xBF, 0x8F, 0x40, 0x00, 0xBE, 0x8F,
72000x3C, 0x00, 0xB7, 0x8F, 0x38, 0x00, 0xB6, 0x8F, 0x34, 0x00, 0xB5, 0x8F,
72010x30, 0x00, 0xB4, 0x8F, 0x2C, 0x00, 0xB3, 0x8F, 0x28, 0x00, 0xB2, 0x8F,
72020x24, 0x00, 0xB1, 0x8F, 0x20, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00,
72030x08, 0x00, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x27, 0x01, 0x00, 0x62, 0x92,
72040x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x43, 0x14, 0x01, 0x00, 0x03, 0x24,
72050x02, 0x00, 0x63, 0x92, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xFF, 0x62, 0x14,
72060x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x62, 0x92, 0x00, 0x00, 0x00, 0x00,
72070xE8, 0xFF, 0x43, 0x14, 0x01, 0x00, 0x03, 0x24, 0x04, 0x00, 0x63, 0x92,
72080x00, 0x00, 0x00, 0x00, 0xE3, 0xFF, 0x62, 0x14, 0x00, 0x00, 0x00, 0x00,
72090x05, 0x00, 0x62, 0x92, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0x43, 0x14,
72100x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x67, 0x92, 0x00, 0x00, 0x00, 0x00,
72110xDC, 0xFF, 0xE2, 0x14, 0x01, 0x00, 0x03, 0x24, 0x07, 0x00, 0x62, 0x92,
72120x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x47, 0x10, 0x21, 0x18, 0x00, 0x00,
72130x3F, 0x5A, 0x00, 0x08, 0x01, 0x00, 0x03, 0x24, 0xC0, 0xFF, 0xBD, 0x27,
72140x38, 0x00, 0xBE, 0xAF, 0x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF,
72150x21, 0xF0, 0xC0, 0x00, 0xFF, 0x00, 0xB6, 0x30, 0xFF, 0xFF, 0x95, 0x30,
72160xFF, 0x00, 0x05, 0x24, 0x10, 0x00, 0xA4, 0x27, 0x08, 0x00, 0x06, 0x24,
72170x34, 0x00, 0xB7, 0xAF, 0x24, 0x00, 0xB3, 0xAF, 0x3C, 0x00, 0xBF, 0xAF,
72180x28, 0x00, 0xB4, 0xAF, 0x20, 0x00, 0xB2, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
72190x18, 0x00, 0xB0, 0xAF, 0xE3, 0x54, 0x00, 0x0C, 0x0F, 0x00, 0x17, 0x24,
72200x21, 0x98, 0x00, 0x00, 0x40, 0x10, 0x13, 0x00, 0xFF, 0x00, 0x52, 0x30,
72210x07, 0x10, 0x76, 0x02, 0x01, 0x00, 0x42, 0x30, 0x21, 0xA0, 0x5E, 0x02,
72220x21, 0x88, 0xA0, 0x02, 0x21, 0x20, 0xA0, 0x02, 0x13, 0x00, 0x40, 0x10,
72230x01, 0x00, 0xA3, 0x26, 0x01, 0x00, 0x62, 0x26, 0xFF, 0x00, 0x53, 0x30,
72240x04, 0x00, 0x63, 0x2E, 0xF4, 0xFF, 0x60, 0x14, 0x40, 0x10, 0x13, 0x00,
72250x21, 0x10, 0xE0, 0x02, 0x3C, 0x00, 0xBF, 0x8F, 0x38, 0x00, 0xBE, 0x8F,
72260x34, 0x00, 0xB7, 0x8F, 0x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F,
72270x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
72280x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
72290x40, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x85, 0x92, 0xFF, 0xFF, 0x75, 0x30,
72300x2C, 0x59, 0x00, 0x0C, 0x21, 0x80, 0xA0, 0x02, 0x01, 0x00, 0x85, 0x92,
72310x21, 0x20, 0xA0, 0x02, 0x01, 0x00, 0xA2, 0x26, 0x2C, 0x59, 0x00, 0x0C,
72320xFF, 0xFF, 0x55, 0x30, 0x10, 0x00, 0xA3, 0x27, 0x21, 0x90, 0x72, 0x00,
72330x21, 0x20, 0x20, 0x02, 0xFF, 0x58, 0x00, 0x0C, 0x21, 0x28, 0x40, 0x02,
72340x21, 0x20, 0x00, 0x02, 0xFF, 0x58, 0x00, 0x0C, 0x01, 0x00, 0x45, 0x26,
72350x00, 0x00, 0x84, 0x92, 0x00, 0x00, 0x42, 0x92, 0x01, 0x00, 0x03, 0x24,
72360x04, 0x18, 0x63, 0x02, 0x03, 0x00, 0x82, 0x10, 0x27, 0x30, 0x03, 0x00,
72370x87, 0x5A, 0x00, 0x08, 0x24, 0xB8, 0xD7, 0x00, 0x01, 0x00, 0x83, 0x92,
72380x01, 0x00, 0x42, 0x92, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0x62, 0x10,
72390x01, 0x00, 0x62, 0x26, 0x88, 0x5A, 0x00, 0x08, 0x24, 0xB8, 0xD7, 0x00,
72400x98, 0xFF, 0xBD, 0x27, 0x50, 0x00, 0xB4, 0xAF, 0xFF, 0x00, 0x94, 0x30,
72410x01, 0x00, 0x04, 0x24, 0x64, 0x00, 0xBF, 0xAF, 0x60, 0x00, 0xBE, 0xAF,
72420x5C, 0x00, 0xB7, 0xAF, 0x58, 0x00, 0xB6, 0xAF, 0x4C, 0x00, 0xB3, 0xAF,
72430x48, 0x00, 0xB2, 0xAF, 0x44, 0x00, 0xB1, 0xAF, 0x21, 0x98, 0xC0, 0x00,
72440xFF, 0x00, 0xB1, 0x30, 0x54, 0x00, 0xB5, 0xAF, 0x54, 0x59, 0x00, 0x0C,
72450x40, 0x00, 0xB0, 0xAF, 0xAC, 0x59, 0x00, 0x0C, 0x01, 0x00, 0x16, 0x24,
72460x21, 0x18, 0x40, 0x00, 0xFF, 0x01, 0x42, 0x2C, 0x01, 0x00, 0x17, 0x24,
72470x01, 0x00, 0x1E, 0x24, 0x21, 0x90, 0x00, 0x00, 0x0E, 0x00, 0x40, 0x14,
72480x21, 0x20, 0x00, 0x00, 0x64, 0x00, 0xBF, 0x8F, 0x60, 0x00, 0xBE, 0x8F,
72490x5C, 0x00, 0xB7, 0x8F, 0x58, 0x00, 0xB6, 0x8F, 0x54, 0x00, 0xB5, 0x8F,
72500x50, 0x00, 0xB4, 0x8F, 0x4C, 0x00, 0xB3, 0x8F, 0x48, 0x00, 0xB2, 0x8F,
72510x44, 0x00, 0xB1, 0x8F, 0x40, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x80, 0x00,
72520x08, 0x00, 0xE0, 0x03, 0x68, 0x00, 0xBD, 0x27, 0xFF, 0x01, 0x02, 0x24,
72530x23, 0x10, 0x43, 0x00, 0x1A, 0x00, 0xA4, 0x27, 0xFF, 0x00, 0x05, 0x24,
72540x08, 0x00, 0x06, 0x24, 0xFF, 0xFF, 0x50, 0x30, 0x18, 0x00, 0xB4, 0xA3,
72550xE3, 0x54, 0x00, 0x0C, 0x19, 0x00, 0xB1, 0xA3, 0x21, 0x20, 0x20, 0x02,
72560x21, 0x28, 0x60, 0x02, 0x92, 0x59, 0x00, 0x0C, 0x1A, 0x00, 0xA6, 0x27,
72570x19, 0x00, 0xA4, 0x93, 0x83, 0x59, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
72580x21, 0xA8, 0x40, 0x00, 0xFF, 0xFF, 0x42, 0x30, 0x2B, 0x10, 0x02, 0x02,
72590xDF, 0xFF, 0x40, 0x14, 0x21, 0x20, 0x00, 0x00, 0x01, 0x00, 0x02, 0x24,
72600x09, 0x00, 0xC2, 0x12, 0x20, 0x00, 0x02, 0x24, 0x22, 0x00, 0xC2, 0x12,
72610x00, 0x00, 0x00, 0x00, 0x3B, 0x00, 0xE0, 0x12, 0x00, 0x02, 0x42, 0x2E,
72620x39, 0x00, 0x40, 0x10, 0x01, 0x00, 0x02, 0x24, 0xF9, 0xFF, 0xC2, 0x16,
72630x20, 0x00, 0x02, 0x24, 0x21, 0x20, 0x40, 0x02, 0x10, 0x00, 0xA5, 0x27,
72640xFF, 0x58, 0x00, 0x0C, 0x01, 0x00, 0x13, 0x24, 0x41, 0x00, 0x40, 0x10,
72650xFF, 0x00, 0x02, 0x24, 0x10, 0x00, 0xA5, 0x93, 0x00, 0x00, 0x00, 0x00,
72660xFF, 0x00, 0xA4, 0x30, 0x3C, 0x00, 0x82, 0x10, 0x0F, 0x00, 0xA3, 0x30,
72670x02, 0x11, 0x04, 0x00, 0x21, 0x20, 0x60, 0x00, 0x29, 0x00, 0xA3, 0xA3,
72680x28, 0x00, 0xA2, 0xA3, 0x83, 0x59, 0x00, 0x0C, 0x11, 0x00, 0xA5, 0xA3,
72690x21, 0x80, 0x40, 0x00, 0x28, 0x00, 0xA3, 0x93, 0x18, 0x00, 0xA2, 0x93,
72700x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x62, 0x10, 0x40, 0x10, 0x10, 0x00,
72710x21, 0x10, 0x52, 0x00, 0x01, 0x00, 0x42, 0x24, 0xF9, 0x5A, 0x00, 0x08,
72720xFF, 0xFF, 0x52, 0x30, 0x19, 0x00, 0xA5, 0x93, 0x01, 0x00, 0x44, 0x26,
72730xFF, 0xFF, 0x84, 0x30, 0x6A, 0x5A, 0x00, 0x0C, 0x1A, 0x00, 0xA6, 0x27,
72740x21, 0x28, 0x40, 0x00, 0x0F, 0x00, 0x43, 0x30, 0x0F, 0x00, 0x02, 0x24,
72750x12, 0x00, 0x62, 0x10, 0x40, 0x10, 0x15, 0x00, 0x21, 0x10, 0x52, 0x00,
72760x01, 0x00, 0x42, 0x24, 0x21, 0x20, 0xA0, 0x00, 0xFF, 0xFF, 0x52, 0x30,
72770x18, 0x00, 0xB4, 0xA3, 0x83, 0x59, 0x00, 0x0C, 0x19, 0x00, 0xA5, 0xA3,
72780x21, 0xA8, 0x40, 0x00, 0x02, 0x80, 0x03, 0x3C, 0xCC, 0xDF, 0x62, 0x8C,
72790x02, 0x80, 0x04, 0x3C, 0x01, 0x00, 0x16, 0x24, 0x01, 0x00, 0x42, 0x24,
72800x04, 0x00, 0x43, 0x28, 0xC6, 0xFF, 0x60, 0x14, 0xCC, 0xDF, 0x82, 0xAC,
72810x21, 0xF0, 0x00, 0x00, 0x54, 0x59, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00,
72820x21, 0x20, 0xC0, 0x03, 0x64, 0x00, 0xBF, 0x8F, 0x60, 0x00, 0xBE, 0x8F,
72830x5C, 0x00, 0xB7, 0x8F, 0x58, 0x00, 0xB6, 0x8F, 0x54, 0x00, 0xB5, 0x8F,
72840x50, 0x00, 0xB4, 0x8F, 0x4C, 0x00, 0xB3, 0x8F, 0x48, 0x00, 0xB2, 0x8F,
72850x44, 0x00, 0xB1, 0x8F, 0x40, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x80, 0x00,
72860x08, 0x00, 0xE0, 0x03, 0x68, 0x00, 0xBD, 0x27, 0xAC, 0x59, 0x00, 0x0C,
72870x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x03, 0x24, 0x23, 0x18, 0x62, 0x00,
72880xFF, 0xFF, 0x70, 0x30, 0xFF, 0xFF, 0xA2, 0x32, 0x2B, 0x10, 0x02, 0x02,
72890xE7, 0xFF, 0x40, 0x14, 0x21, 0x20, 0x40, 0x02, 0x18, 0x00, 0xB0, 0x93,
72900x19, 0x00, 0xA2, 0x93, 0x00, 0x81, 0x10, 0x00, 0x25, 0x80, 0x02, 0x02,
72910xFF, 0x00, 0x10, 0x32, 0x2C, 0x59, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x02,
72920x21, 0x20, 0x40, 0x02, 0xFF, 0x58, 0x00, 0x0C, 0x11, 0x00, 0xA5, 0x27,
72930x11, 0x00, 0xA3, 0x93, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x64, 0x30,
72940x9D, 0xFF, 0x90, 0x10, 0x20, 0x00, 0x16, 0x24, 0xFF, 0x00, 0x02, 0x24,
72950xCD, 0xFF, 0x82, 0x10, 0x0F, 0x00, 0x63, 0x30, 0x02, 0x11, 0x04, 0x00,
72960x21, 0x20, 0x60, 0x00, 0x29, 0x00, 0xA3, 0xA3, 0x83, 0x59, 0x00, 0x0C,
72970x28, 0x00, 0xA2, 0xA3, 0x38, 0x00, 0xA4, 0x27, 0xFF, 0x00, 0x05, 0x24,
72980x08, 0x00, 0x06, 0x24, 0xE3, 0x54, 0x00, 0x0C, 0x21, 0x80, 0x40, 0x00,
72990x28, 0x00, 0xA4, 0x93, 0xCF, 0x59, 0x00, 0x0C, 0x38, 0x00, 0xA5, 0x27,
73000x1F, 0x00, 0x40, 0x14, 0x01, 0x00, 0x44, 0x26, 0x40, 0x10, 0x10, 0x00,
73010x21, 0x10, 0x52, 0x00, 0x01, 0x00, 0x42, 0x24, 0x2C, 0x5B, 0x00, 0x08,
73020xFF, 0xFF, 0x52, 0x30, 0x40, 0x88, 0x10, 0x00, 0x27, 0x00, 0x20, 0x1A,
73030x21, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x16, 0x24, 0x21, 0x20, 0x50, 0x02,
73040x01, 0x00, 0x84, 0x24, 0xFF, 0xFF, 0x84, 0x30, 0xFF, 0x58, 0x00, 0x0C,
73050x10, 0x00, 0xA5, 0x27, 0x01, 0x00, 0x03, 0x26, 0xFF, 0x00, 0x70, 0x30,
73060x05, 0x00, 0x40, 0x10, 0x2A, 0x18, 0x11, 0x02, 0x10, 0x00, 0xA2, 0x93,
73070x00, 0x00, 0x00, 0x00, 0x26, 0x10, 0x56, 0x00, 0x0B, 0x98, 0x02, 0x00,
73080xF3, 0xFF, 0x60, 0x14, 0x21, 0x20, 0x50, 0x02, 0x15, 0x00, 0x60, 0x16,
73090x21, 0x10, 0x32, 0x02, 0x01, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x52, 0x30,
73100xF9, 0x5A, 0x00, 0x08, 0x01, 0x00, 0x16, 0x24, 0x29, 0x00, 0xA5, 0x93,
73110xFF, 0xFF, 0x84, 0x30, 0x6A, 0x5A, 0x00, 0x0C, 0x38, 0x00, 0xA6, 0x27,
73120x21, 0x28, 0x40, 0x00, 0x0F, 0x00, 0x43, 0x30, 0x0F, 0x00, 0x02, 0x24,
73130xDB, 0xFF, 0x62, 0x10, 0x40, 0x10, 0x10, 0x00, 0x28, 0x00, 0xA4, 0x93,
73140xB9, 0x5A, 0x00, 0x0C, 0x38, 0x00, 0xA6, 0x27, 0xAC, 0x59, 0x00, 0x0C,
73150x00, 0x00, 0x00, 0x00, 0x2C, 0x5B, 0x00, 0x08, 0x21, 0x90, 0x40, 0x00,
73160x19, 0x00, 0xA3, 0x93, 0x29, 0x00, 0xA6, 0x93, 0x0F, 0x00, 0x13, 0x24,
73170x0E, 0x00, 0x10, 0x24, 0x25, 0x18, 0x66, 0x00, 0x01, 0x00, 0x62, 0x30,
73180x0A, 0x98, 0x02, 0x02, 0x02, 0x00, 0x64, 0x30, 0xFD, 0x00, 0x62, 0x32,
73190x0A, 0x98, 0x44, 0x00, 0x04, 0x00, 0x65, 0x30, 0xFB, 0x00, 0x62, 0x32,
73200x0A, 0x98, 0x45, 0x00, 0x08, 0x00, 0x63, 0x30, 0xF7, 0x00, 0x62, 0x32,
73210x0A, 0x98, 0x43, 0x00, 0x0F, 0x00, 0x64, 0x32, 0x0F, 0x00, 0x16, 0x24,
73220x25, 0x00, 0x96, 0x10, 0x21, 0x28, 0xC0, 0x00, 0x01, 0x00, 0x44, 0x26,
73230xFF, 0xFF, 0x84, 0x30, 0x6A, 0x5A, 0x00, 0x0C, 0x1A, 0x00, 0xA6, 0x27,
73240x21, 0x28, 0x40, 0x00, 0x0F, 0x00, 0x42, 0x30, 0x03, 0x00, 0x56, 0x10,
73250x21, 0x20, 0x80, 0x02, 0xB9, 0x5A, 0x00, 0x0C, 0x38, 0x00, 0xA6, 0x27,
73260x19, 0x00, 0xA5, 0x93, 0x00, 0x00, 0x00, 0x00, 0x26, 0x10, 0x65, 0x02,
73270x01, 0x00, 0x42, 0x30, 0x0A, 0x80, 0xC2, 0x02, 0x26, 0x18, 0x65, 0x02,
73280x02, 0x00, 0x63, 0x30, 0xFD, 0x00, 0x04, 0x32, 0x0B, 0x80, 0x83, 0x00,
73290x26, 0x10, 0x65, 0x02, 0x04, 0x00, 0x42, 0x30, 0xFB, 0x00, 0x03, 0x32,
73300x0B, 0x80, 0x62, 0x00, 0x26, 0x28, 0x65, 0x02, 0x08, 0x00, 0xA5, 0x30,
73310xF7, 0x00, 0x02, 0x32, 0x0B, 0x80, 0x45, 0x00, 0x0F, 0x00, 0x03, 0x32,
73320x0D, 0x00, 0x76, 0x10, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x59, 0x00, 0x0C,
73330x00, 0x00, 0x00, 0x00, 0x21, 0x90, 0x40, 0x00, 0x19, 0x00, 0xB0, 0xA3,
73340x2C, 0x5B, 0x00, 0x08, 0x18, 0x00, 0xB4, 0xA3, 0x21, 0x10, 0x32, 0x02,
73350x01, 0x00, 0x42, 0x24, 0xFF, 0xFF, 0x52, 0x30, 0x01, 0x00, 0x16, 0x24,
73360xF9, 0x5A, 0x00, 0x08, 0x18, 0x00, 0xB4, 0xA3, 0x2C, 0x5B, 0x00, 0x08,
73370x21, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x85, 0xAC, 0x21, 0x10, 0x00, 0x00,
73380x01, 0x00, 0x42, 0x24, 0xFF, 0x00, 0x42, 0x30, 0x06, 0x00, 0x43, 0x2C,
73390xFC, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
73400x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA5, 0x30, 0x00, 0x00, 0x85, 0xA4,
73410x21, 0x10, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24, 0xFF, 0x00, 0x42, 0x30,
73420x06, 0x00, 0x43, 0x2C, 0xFC, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00,
73430x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xA5, 0x30,
73440x00, 0x00, 0x85, 0xA0, 0x21, 0x10, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24,
73450xFF, 0x00, 0x42, 0x30, 0x06, 0x00, 0x43, 0x2C, 0xFC, 0xFF, 0x60, 0x14,
73460x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
73470x00, 0x00, 0x82, 0x8C, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
73480x00, 0x00, 0x82, 0x94, 0x08, 0x00, 0xE0, 0x03, 0xFF, 0xFF, 0x42, 0x30,
73490x00, 0x00, 0x82, 0x90, 0x08, 0x00, 0xE0, 0x03, 0xFF, 0x00, 0x42, 0x30,
73500x25, 0xB0, 0x02, 0x3C, 0x21, 0x20, 0x82, 0x00, 0x00, 0x00, 0x85, 0xAC,
73510x21, 0x10, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24, 0xFF, 0x00, 0x42, 0x30,
73520x06, 0x00, 0x43, 0x2C, 0xFC, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00,
73530x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x02, 0x3C,
73540x21, 0x20, 0x82, 0x00, 0xFF, 0xFF, 0xA5, 0x30, 0x00, 0x00, 0x85, 0xA4,
73550x21, 0x10, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24, 0xFF, 0x00, 0x42, 0x30,
73560x06, 0x00, 0x43, 0x2C, 0xFC, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00,
73570x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x02, 0x3C,
73580x21, 0x20, 0x82, 0x00, 0xFF, 0x00, 0xA5, 0x30, 0x00, 0x00, 0x85, 0xA0,
73590x21, 0x10, 0x00, 0x00, 0x01, 0x00, 0x42, 0x24, 0xFF, 0x00, 0x42, 0x30,
73600x06, 0x00, 0x43, 0x2C, 0xFC, 0xFF, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00,
73610x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x02, 0x3C,
73620x21, 0x20, 0x82, 0x00, 0x00, 0x00, 0x82, 0x8C, 0x08, 0x00, 0xE0, 0x03,
73630x00, 0x00, 0x00, 0x00, 0x25, 0xB0, 0x02, 0x3C, 0x21, 0x20, 0x82, 0x00,
73640x00, 0x00, 0x82, 0x94, 0x08, 0x00, 0xE0, 0x03, 0xFF, 0xFF, 0x42, 0x30,
73650x25, 0xB0, 0x02, 0x3C, 0x21, 0x20, 0x82, 0x00, 0x00, 0x00, 0x82, 0x90,
73660x08, 0x00, 0xE0, 0x03, 0xFF, 0x00, 0x42, 0x30, 0x01, 0x80, 0x02, 0x3C,
73670x25, 0xB0, 0x03, 0x3C, 0xD4, 0x70, 0x42, 0x24, 0x18, 0x03, 0x63, 0x34,
73680x00, 0x00, 0x62, 0xAC, 0x00, 0x00, 0x83, 0x90, 0x30, 0x00, 0x02, 0x24,
73690x05, 0x00, 0x62, 0x10, 0x21, 0x20, 0x00, 0x00, 0x31, 0x00, 0x02, 0x24,
73700x02, 0x00, 0x62, 0x10, 0x01, 0x00, 0x04, 0x24, 0x07, 0x00, 0x04, 0x24,
73710x7E, 0x58, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x3C,
73720x25, 0xB0, 0x03, 0x3C, 0x10, 0x71, 0x42, 0x24, 0x18, 0x03, 0x63, 0x34,
73730x02, 0x80, 0x04, 0x3C, 0x00, 0x00, 0x62, 0xAC, 0x08, 0x00, 0xE0, 0x03,
73740xFC, 0x5C, 0x80, 0xAC, 0x42, 0xB0, 0x02, 0x3C, 0x03, 0x00, 0x47, 0x34,
73750x00, 0x00, 0xE3, 0x90, 0xFF, 0x00, 0x84, 0x30, 0x04, 0x00, 0x84, 0x24,
73760xFF, 0x00, 0x65, 0x30, 0x01, 0x00, 0x02, 0x24, 0x04, 0x30, 0x82, 0x00,
73770x07, 0x18, 0x85, 0x00, 0x25, 0xB0, 0x02, 0x3C, 0xE8, 0x03, 0x42, 0x34,
73780x01, 0x00, 0x63, 0x30, 0x21, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x45, 0xA0,
73790x02, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xA0,
73800x08, 0x00, 0xE0, 0x03, 0x24, 0x10, 0x85, 0x00, 0xE0, 0xFF, 0xBD, 0x27,
73810x18, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x1C, 0x00, 0xBF, 0xAF,
73820x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x02, 0x80, 0x02, 0x3C,
73830xD0, 0xDF, 0x42, 0x24, 0x04, 0x00, 0x43, 0x8C, 0x00, 0x00, 0x02, 0xAE,
73840x04, 0x00, 0x50, 0xAC, 0x00, 0x00, 0x70, 0xAC, 0x04, 0x00, 0x03, 0xAE,
73850x90, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27, 0x1C, 0x00, 0xBF, 0x8F,
73860x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
73870xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB0, 0xAF, 0x21, 0x80, 0x80, 0x00,
73880x1C, 0x00, 0xBF, 0xAF, 0x8A, 0x40, 0x00, 0x0C, 0x10, 0x00, 0xA4, 0x27,
73890x04, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x02, 0x8E, 0x10, 0x00, 0xA4, 0x27,
73900x00, 0x00, 0x62, 0xAC, 0x04, 0x00, 0x43, 0xAC, 0x00, 0x00, 0x10, 0xAE,
73910x90, 0x40, 0x00, 0x0C, 0x04, 0x00, 0x10, 0xAE, 0x1C, 0x00, 0xBF, 0x8F,
73920x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
73930x1F, 0xF7, 0x00, 0x6A, 0x82, 0x34, 0x4C, 0xEC, 0x82, 0x34, 0x8C, 0x32,
73940x89, 0xE2, 0x48, 0x32, 0x89, 0xE2, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
73950x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0x48, 0x32, 0x69, 0xE2, 0x04, 0xF5,
73960x68, 0x9A, 0x01, 0xF6, 0x01, 0x6C, 0x8B, 0xEC, 0x8C, 0xEB, 0x04, 0xF5,
73970x68, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x00, 0x1F, 0xF7, 0x00, 0x6A,
73980x82, 0x34, 0x4C, 0xEC, 0x82, 0x34, 0x8C, 0x32, 0x89, 0xE2, 0x48, 0x32,
73990x89, 0xE2, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
74000x00, 0x4B, 0x48, 0x32, 0x69, 0xE2, 0x04, 0xF5, 0x68, 0x9A, 0x01, 0xF6,
74010x01, 0x6C, 0x8B, 0xEC, 0x8C, 0xEB, 0x00, 0xF2, 0x00, 0x6C, 0x8D, 0xEB,
74020x04, 0xF5, 0x68, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x6B, 0x6C, 0xED,
74030x04, 0x5D, 0x6C, 0xEC, 0x69, 0x60, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
74040x40, 0x32, 0xCB, 0xF4, 0x46, 0xA2, 0xEF, 0x4A, 0x6C, 0xEA, 0x02, 0x5A,
74050x0C, 0x60, 0x02, 0x74, 0x38, 0x60, 0x03, 0x54, 0x1D, 0x61, 0x03, 0x74,
74060x2C, 0x60, 0x04, 0xF0, 0x00, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xE8,
74070xFF, 0x4A, 0x02, 0x74, 0x3D, 0x60, 0x03, 0x54, 0x18, 0x61, 0x03, 0x74,
74080xF4, 0x61, 0x01, 0x75, 0x43, 0x60, 0x02, 0x55, 0x31, 0x61, 0x02, 0x75,
74090x42, 0x60, 0x03, 0x75, 0xEC, 0x61, 0x02, 0xF0, 0x00, 0x6A, 0x40, 0x32,
74100x1E, 0xF0, 0x00, 0x4A, 0x20, 0xE8, 0x00, 0x65, 0x01, 0x74, 0xE3, 0x61,
74110x02, 0xF0, 0x0F, 0x6A, 0x40, 0x32, 0x20, 0xE8, 0x40, 0x32, 0x01, 0x74,
74120xDC, 0x61, 0x03, 0xF7, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x10, 0xF0,
74130x00, 0x4A, 0x20, 0xE8, 0x00, 0x65, 0x01, 0x75, 0x1B, 0x60, 0x02, 0x55,
74140x08, 0x61, 0x02, 0x75, 0x29, 0x60, 0x03, 0x75, 0xCC, 0x61, 0x02, 0xF0,
74150x10, 0x6A, 0x40, 0x32, 0xDE, 0x17, 0xC7, 0x2D, 0x02, 0xF0, 0x10, 0x6A,
74160x40, 0x32, 0x40, 0x32, 0x1E, 0xF0, 0x15, 0x4A, 0x20, 0xE8, 0x00, 0x65,
74170xBE, 0x2D, 0x02, 0xF0, 0x00, 0x6A, 0xF7, 0x17, 0x03, 0xF7, 0x10, 0x6A,
74180x40, 0x32, 0xCD, 0x17, 0x02, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32,
74190x1E, 0xF0, 0x10, 0x4A, 0x20, 0xE8, 0x00, 0x65, 0x02, 0xF0, 0x00, 0x6A,
74200xF8, 0x17, 0x02, 0xF0, 0x00, 0x6A, 0x40, 0x32, 0x1E, 0xF0, 0x05, 0x4A,
74210x20, 0xE8, 0x00, 0x65, 0x02, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0xF7, 0x17,
74220xFC, 0x63, 0x06, 0xD0, 0x8C, 0x30, 0x81, 0xE0, 0x08, 0x30, 0x81, 0xE0,
74230x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A,
74240x08, 0x30, 0x41, 0xE0, 0xC9, 0xF7, 0x1B, 0x6D, 0x04, 0xF0, 0x00, 0x6A,
74250x40, 0x32, 0xAB, 0xED, 0x40, 0x32, 0xA0, 0x35, 0xA0, 0x35, 0xFF, 0x4A,
74260x04, 0xF5, 0x40, 0xD8, 0x07, 0x62, 0x80, 0xF1, 0x44, 0x45, 0x40, 0x9A,
74270x08, 0x6B, 0x6B, 0xEB, 0x04, 0xF5, 0x44, 0xD8, 0x04, 0xF5, 0x48, 0x98,
74280xC4, 0x67, 0x6C, 0xEA, 0xFF, 0x6B, 0x02, 0x4B, 0x6B, 0xEB, 0x6C, 0xEA,
74290x02, 0xF0, 0x01, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA, 0x04, 0xF5, 0x48, 0xD8,
74300x04, 0xD5, 0x00, 0x18, 0xA5, 0x21, 0x05, 0xD6, 0x04, 0x95, 0x05, 0x96,
74310x04, 0xF5, 0x4A, 0xA0, 0x60, 0xF1, 0x00, 0x4D, 0xB9, 0xE6, 0x40, 0xC6,
74320x00, 0x6A, 0xC4, 0xF4, 0x58, 0xD8, 0xC4, 0xF4, 0x5C, 0xD8, 0xE4, 0xF4,
74330x40, 0xD8, 0xE4, 0xF4, 0x44, 0xD8, 0xE4, 0xF4, 0x48, 0xD8, 0xE4, 0xF4,
74340x4C, 0xD8, 0xE4, 0xF4, 0x50, 0xD8, 0xE4, 0xF4, 0x54, 0xD8, 0x07, 0x97,
74350x06, 0x90, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x00, 0xFF, 0x63, 0x00, 0xD0,
74360x04, 0x67, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0xFF, 0x6F,
74370x80, 0x34, 0xA0, 0xF1, 0x4F, 0x44, 0xEC, 0xEE, 0x01, 0xD1, 0x59, 0xE6,
74380x40, 0xA6, 0xEC, 0xED, 0xC7, 0x67, 0x4C, 0xEE, 0xAC, 0x32, 0xA9, 0xE2,
74390x48, 0x32, 0xA9, 0xE2, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33,
74400x63, 0xF3, 0x00, 0x4B, 0x48, 0x32, 0x69, 0xE2, 0x04, 0xF5, 0x48, 0x9A,
74410x07, 0x6B, 0x80, 0xF1, 0x04, 0x4C, 0x6C, 0xEA, 0xEC, 0xEA, 0x48, 0x32,
74420xEC, 0xE8, 0x89, 0xE2, 0x00, 0x6D, 0x80, 0x9A, 0x0D, 0x65, 0x70, 0x67,
74430x2E, 0x26, 0x32, 0x24, 0x65, 0x67, 0x01, 0x69, 0x51, 0x67, 0x44, 0xEB,
74440x8C, 0xEA, 0x36, 0x2A, 0x01, 0x4B, 0xEC, 0xEB, 0x1D, 0x5B, 0xF8, 0x61,
74450x6F, 0x40, 0xFF, 0x6A, 0x4C, 0xEB, 0xE8, 0x67, 0xE3, 0xEB, 0x10, 0x61,
74460x01, 0x69, 0xE2, 0x67, 0x51, 0x67, 0x44, 0xEB, 0x8C, 0xEA, 0x05, 0x22,
74470xCA, 0xED, 0x26, 0x60, 0x01, 0x4D, 0xEC, 0xED, 0x03, 0x67, 0xFF, 0x4B,
74480xEC, 0xEB, 0x48, 0x67, 0x43, 0xEB, 0xF2, 0x60, 0xC3, 0xED, 0x70, 0x67,
74490x0A, 0x60, 0x68, 0x67, 0xAB, 0xE6, 0x42, 0xEB, 0x00, 0x6B, 0x05, 0x61,
74500xE8, 0x67, 0xCB, 0xE7, 0xAD, 0xE2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x91,
74510x00, 0x90, 0x43, 0x67, 0x20, 0xE8, 0x01, 0x63, 0xC3, 0xE8, 0x65, 0x67,
74520xF8, 0x61, 0xCF, 0xE0, 0x01, 0x91, 0x00, 0x90, 0xEC, 0xEB, 0x43, 0x67,
74530x20, 0xE8, 0x01, 0x63, 0x0B, 0x65, 0xCC, 0x17, 0x70, 0x67, 0xED, 0x17,
74540xC9, 0xF7, 0x1B, 0x6E, 0xCB, 0xEE, 0xC0, 0x36, 0xFF, 0x6F, 0xC0, 0x36,
74550xEC, 0xEC, 0xFF, 0x63, 0x60, 0xF1, 0x40, 0x46, 0x01, 0xD1, 0x00, 0xD0,
74560x49, 0xE4, 0x40, 0xA2, 0x07, 0x67, 0xEC, 0xED, 0x4C, 0xE8, 0xA0, 0xF1,
74570x4F, 0x46, 0x55, 0xE5, 0x40, 0xA5, 0x27, 0x67, 0x10, 0xF0, 0x02, 0x6B,
74580x00, 0xF4, 0x60, 0x33, 0x4C, 0xE9, 0x8C, 0x32, 0x89, 0xE2, 0x48, 0x32,
74590x89, 0xE2, 0x63, 0xF3, 0x00, 0x4B, 0x48, 0x32, 0x69, 0xE2, 0x04, 0xF5,
74600x48, 0x9A, 0x07, 0x6B, 0x80, 0xF1, 0x04, 0x4E, 0x6C, 0xEA, 0xEC, 0xEA,
74610x48, 0x32, 0xC9, 0xE2, 0x00, 0x6D, 0x80, 0x9A, 0x2D, 0x65, 0x70, 0x67,
74620x30, 0x21, 0x34, 0x24, 0x01, 0x6A, 0x65, 0x67, 0x0A, 0x65, 0xC7, 0x67,
74630x48, 0x67, 0x44, 0xEB, 0x8C, 0xEA, 0x36, 0x2A, 0x01, 0x4B, 0xCC, 0xEB,
74640x1D, 0x5B, 0xF8, 0x61, 0x6F, 0x40, 0xFF, 0x6A, 0x4C, 0xEB, 0xC9, 0x67,
74650xC3, 0xEB, 0x10, 0x61, 0x01, 0x6F, 0xC2, 0x67, 0x47, 0x67, 0x44, 0xEB,
74660x8C, 0xEA, 0x05, 0x22, 0x2A, 0xED, 0x26, 0x60, 0x01, 0x4D, 0xCC, 0xED,
74670x03, 0x67, 0xFF, 0x4B, 0xCC, 0xEB, 0x49, 0x67, 0x43, 0xEB, 0xF2, 0x60,
74680x23, 0xED, 0x70, 0x67, 0x0A, 0x60, 0x69, 0x67, 0xAB, 0xE1, 0x42, 0xEB,
74690x00, 0x6B, 0x05, 0x61, 0xC9, 0x67, 0x2B, 0xE6, 0xAD, 0xE2, 0xFF, 0x6A,
74700x4C, 0xEB, 0x01, 0x91, 0x00, 0x90, 0x43, 0x67, 0x20, 0xE8, 0x01, 0x63,
74710x23, 0xE8, 0x65, 0x67, 0xF8, 0x61, 0x2F, 0xE0, 0x01, 0x91, 0x00, 0x90,
74720xEC, 0xEB, 0x43, 0x67, 0x20, 0xE8, 0x01, 0x63, 0x2B, 0x65, 0xCC, 0x17,
74730x70, 0x67, 0xED, 0x17, 0x10, 0xF0, 0x02, 0x6E, 0x00, 0xF4, 0xC0, 0x36,
74740xFB, 0x63, 0x00, 0x6D, 0x63, 0xF3, 0x00, 0x4E, 0x07, 0xD1, 0x06, 0xD0,
74750x08, 0x62, 0x05, 0x67, 0x26, 0x67, 0x85, 0x67, 0x04, 0xD5, 0x00, 0x18,
74760xDB, 0x5C, 0x05, 0xD6, 0x04, 0xF5, 0x4A, 0xA1, 0xFF, 0x6B, 0x05, 0x96,
74770x6C, 0xEA, 0x48, 0x32, 0xC9, 0xE2, 0xC0, 0xF5, 0x74, 0x9A, 0x60, 0xF5,
74780x40, 0x9A, 0x4D, 0xE3, 0x66, 0x33, 0xC4, 0xF4, 0x74, 0xD9, 0x04, 0x95,
74790x00, 0x6B, 0x69, 0xE1, 0x01, 0x4B, 0x1D, 0x53, 0x04, 0xF5, 0x0C, 0xC2,
74800x24, 0xF5, 0x09, 0xC2, 0x44, 0xF5, 0x06, 0xC2, 0xF6, 0x61, 0x00, 0x6A,
74810x01, 0x4D, 0x64, 0xF5, 0x44, 0xD9, 0x20, 0x55, 0x7F, 0x49, 0x15, 0x49,
74820xD8, 0x61, 0x08, 0x97, 0x07, 0x91, 0x06, 0x90, 0x00, 0xEF, 0x05, 0x63,
74830xF8, 0x63, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x07, 0xD2,
74840x0E, 0x62, 0x0D, 0xD1, 0x0C, 0xD0, 0x63, 0xF3, 0x00, 0x4A, 0x27, 0xF1,
74850x44, 0x9A, 0xFF, 0x6B, 0x6C, 0xEC, 0x6C, 0x65, 0xFF, 0xF7, 0x1F, 0x72,
74860x00, 0x6C, 0x05, 0xD4, 0x01, 0x61, 0x05, 0xD3, 0x07, 0x93, 0xFF, 0xF7,
74870x1F, 0x6A, 0x8B, 0x67, 0x63, 0xF3, 0x00, 0x4B, 0x27, 0xF1, 0x44, 0xDB,
74880x00, 0x6A, 0x04, 0xD2, 0x00, 0xF1, 0x18, 0x24, 0x10, 0xF0, 0x02, 0x6D,
74890x00, 0xF4, 0xA0, 0x35, 0x22, 0x67, 0xBC, 0xF3, 0x0C, 0x4D, 0xFF, 0x6E,
74900x00, 0xF5, 0x84, 0x43, 0x05, 0x10, 0x01, 0x49, 0x1D, 0x51, 0x60, 0xC4,
74910x01, 0x4C, 0x0B, 0x60, 0xA9, 0xE1, 0x60, 0xA2, 0x46, 0x67, 0x6C, 0xEA,
74920xF6, 0x22, 0x01, 0x49, 0x4D, 0x43, 0x1D, 0x51, 0x40, 0xC4, 0x01, 0x4C,
74930xF5, 0x61, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x10, 0xF0,
74940x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4,
74950x80, 0x34, 0x00, 0x69, 0x63, 0xF3, 0x00, 0x4A, 0x5C, 0xF1, 0x04, 0x4B,
74960xDC, 0xF0, 0x0C, 0x4C, 0x0A, 0x65, 0x4B, 0x65, 0x2C, 0x65, 0x11, 0x67,
74970x48, 0x67, 0x6A, 0x67, 0x00, 0x6D, 0x5D, 0xE0, 0x79, 0xE0, 0xAD, 0xE6,
74980x40, 0xA3, 0xB1, 0xE7, 0x01, 0x4D, 0xA0, 0xF3, 0x48, 0xC4, 0x80, 0xF0,
74990x51, 0xA3, 0x05, 0x55, 0x20, 0xF4, 0x59, 0xC4, 0xF4, 0x61, 0x48, 0x67,
75000x51, 0xE1, 0x49, 0x67, 0x4D, 0xE1, 0x40, 0xA3, 0x01, 0x49, 0x1D, 0x51,
75010xC0, 0xF4, 0x4A, 0xC4, 0x5D, 0xA3, 0x05, 0x48, 0xE0, 0xF4, 0x47, 0xC4,
75020xE1, 0x61, 0x6B, 0x67, 0x00, 0xF1, 0x0A, 0x23, 0x10, 0xF0, 0x02, 0x6E,
75030x00, 0xF4, 0xC0, 0x36, 0x10, 0xF0, 0x02, 0x6F, 0x00, 0xF4, 0xE0, 0x37,
75040x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35, 0x00, 0x69, 0x63, 0xF3,
75050x00, 0x4E, 0x5C, 0xF4, 0x00, 0x4F, 0xDC, 0xF3, 0x0C, 0x4D, 0x28, 0x32,
75060xED, 0xE2, 0x60, 0x9B, 0xD1, 0xE2, 0xA9, 0xE2, 0xC0, 0xF5, 0x74, 0xDC,
75070x40, 0x9A, 0x01, 0x49, 0x04, 0x51, 0x60, 0xF5, 0x40, 0xDC, 0xF3, 0x61,
75080x10, 0xF0, 0x02, 0x6F, 0x00, 0xF4, 0xE0, 0x37, 0x10, 0xF0, 0x02, 0x6E,
75090x00, 0xF4, 0xC0, 0x36, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
75100x04, 0x69, 0x63, 0xF3, 0x00, 0x4F, 0x5C, 0xF4, 0x00, 0x4E, 0xDC, 0xF3,
75110x0C, 0x4D, 0x28, 0x33, 0xC9, 0xE3, 0x40, 0x9A, 0xF1, 0xE3, 0xAD, 0xE3,
75120x4A, 0x32, 0xC0, 0xF5, 0x54, 0xDC, 0x40, 0x9B, 0x01, 0x49, 0x1D, 0x51,
75130x4A, 0x32, 0x60, 0xF5, 0x40, 0xDC, 0xF1, 0x61, 0x10, 0xF0, 0x02, 0x6C,
75140x00, 0xF4, 0x80, 0x34, 0x63, 0xF3, 0x00, 0x4C, 0x00, 0x69, 0x04, 0x67,
75150xD1, 0x67, 0xC4, 0xF4, 0x14, 0x48, 0x06, 0xD4, 0x08, 0xD1, 0x09, 0x10,
75160x08, 0x94, 0x01, 0x49, 0x7F, 0x48, 0x7F, 0x4C, 0x15, 0x4C, 0x20, 0x51,
75170x15, 0x48, 0x08, 0xD4, 0x5E, 0x60, 0x8D, 0x98, 0x01, 0x6B, 0x82, 0x32,
75180x52, 0x32, 0x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, 0xEF, 0x22, 0x07, 0x6A,
75190x4C, 0xEC, 0x6C, 0xEC, 0x88, 0x32, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC,
75200x80, 0x34, 0x80, 0x34, 0x80, 0xF1, 0x04, 0x4C, 0x89, 0xE2, 0x6B, 0x98,
75210x40, 0x9A, 0x91, 0x67, 0x6C, 0xEA, 0x4C, 0xD8, 0x00, 0x18, 0xA5, 0x21,
75220x0A, 0xD6, 0x20, 0xF0, 0x96, 0xA0, 0xFF, 0x6A, 0xA2, 0x67, 0x4C, 0xEC,
75230x00, 0x18, 0x93, 0x21, 0x2C, 0xED, 0x20, 0xF0, 0x56, 0xA0, 0x04, 0x94,
75240xFF, 0x6B, 0x6C, 0xEA, 0x43, 0xEC, 0x0A, 0x96, 0x01, 0x60, 0x04, 0xD2,
75250xC1, 0xD8, 0xC2, 0xD8, 0xC3, 0xD8, 0xC4, 0xD8, 0xC5, 0xD8, 0xC6, 0xD8,
75260xC7, 0xD8, 0xC8, 0xD8, 0x06, 0x93, 0x48, 0x32, 0xA6, 0x67, 0x69, 0xE2,
75270xC0, 0xF5, 0x74, 0x9A, 0x60, 0xF5, 0x40, 0x9A, 0x4D, 0xE3, 0x66, 0x33,
75280x60, 0xD8, 0x08, 0x92, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33,
75290x63, 0xF3, 0x00, 0x4B, 0x71, 0xE2, 0x66, 0x67, 0xA9, 0xE4, 0x01, 0x4D,
75300x1D, 0x55, 0x04, 0xF5, 0x6C, 0xC2, 0x24, 0xF5, 0x69, 0xC2, 0x44, 0xF5,
75310x66, 0xC2, 0xF6, 0x61, 0x64, 0xF5, 0xC4, 0xDC, 0x08, 0x94, 0x01, 0x49,
75320x7F, 0x48, 0x7F, 0x4C, 0x15, 0x4C, 0x20, 0x51, 0x15, 0x48, 0x08, 0xD4,
75330xA2, 0x61, 0x05, 0x92, 0x06, 0x2A, 0x07, 0x93, 0x63, 0xF3, 0x00, 0x4B,
75340x07, 0xD3, 0x27, 0xF1, 0x44, 0xDB, 0x0E, 0x97, 0x0D, 0x91, 0x0C, 0x90,
75350x00, 0xEF, 0x08, 0x63, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34,
75360x22, 0x67, 0xBC, 0xF3, 0x0C, 0x4C, 0x00, 0xF5, 0x04, 0x4B, 0x89, 0xE1,
75370x40, 0xA2, 0x01, 0x49, 0x1D, 0x51, 0x40, 0xC3, 0x01, 0x4B, 0xF9, 0x61,
75380x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x10, 0xF0, 0x02, 0x6C,
75390x00, 0xF4, 0x80, 0x34, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
75400x00, 0x69, 0x63, 0xF3, 0x00, 0x4B, 0x7C, 0xF2, 0x08, 0x4C, 0x1C, 0xF1,
75410x08, 0x4A, 0x0B, 0x65, 0x4C, 0x65, 0x2A, 0x65, 0x11, 0x67, 0x68, 0x67,
75420x8A, 0x67, 0x00, 0x6D, 0x7D, 0xE0, 0x99, 0xE0, 0xAD, 0xE6, 0x40, 0xA3,
75430xB1, 0xE7, 0x01, 0x4D, 0xA0, 0xF3, 0x48, 0xC4, 0x80, 0xF0, 0x51, 0xA3,
75440x05, 0x55, 0x20, 0xF4, 0x59, 0xC4, 0xF4, 0x61, 0x48, 0x67, 0x51, 0xE1,
75450x49, 0x67, 0x4D, 0xE1, 0x40, 0xA3, 0x01, 0x49, 0x1D, 0x51, 0xC0, 0xF4,
75460x4A, 0xC4, 0x5D, 0xA3, 0x05, 0x48, 0xE0, 0xF4, 0x47, 0xC4, 0xE1, 0x61,
75470x10, 0xF0, 0x02, 0x6F, 0x00, 0xF4, 0xE0, 0x37, 0x10, 0xF0, 0x02, 0x6E,
75480x00, 0xF4, 0xC0, 0x36, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
75490x2B, 0x67, 0x63, 0xF3, 0x00, 0x4F, 0x5C, 0xF4, 0x00, 0x4E, 0xDC, 0xF3,
75500x0C, 0x4D, 0x28, 0x32, 0xCD, 0xE2, 0x60, 0x9B, 0xF1, 0xE2, 0xA9, 0xE2,
75510xC0, 0xF5, 0x74, 0xDC, 0x40, 0x9A, 0x01, 0x49, 0x1D, 0x51, 0x60, 0xF5,
75520x40, 0xDC, 0xF3, 0x61, 0x17, 0x17, 0x00, 0x00, 0xFF, 0xF7, 0x1F, 0x6F,
75530x8C, 0xEF, 0xE0, 0xF1, 0x10, 0x6E, 0xEC, 0xEE, 0xFB, 0x63, 0xD2, 0x36,
75540x06, 0xD0, 0xCC, 0x30, 0xC1, 0xE0, 0x08, 0x30, 0xC1, 0xE0, 0x10, 0xF0,
75550x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0x08, 0x30,
75560x41, 0xE0, 0x08, 0x62, 0x07, 0xD1, 0x25, 0x67, 0x04, 0xF5, 0xA8, 0x98,
75570x02, 0xF0, 0x00, 0x6A, 0xFF, 0x6B, 0x4D, 0xED, 0x00, 0xF2, 0x00, 0x6A,
75580xEC, 0xEA, 0x43, 0x32, 0x02, 0x4B, 0x6B, 0xEB, 0x47, 0x32, 0x6C, 0xED,
75590x40, 0x32, 0x4D, 0xED, 0x04, 0xF5, 0x20, 0xD8, 0x04, 0xF5, 0xA8, 0xD8,
75600x87, 0x67, 0x04, 0xD5, 0x00, 0x18, 0x2C, 0x22, 0x05, 0xD6, 0x04, 0x95,
75610x08, 0x6B, 0x07, 0x6C, 0x6B, 0xEB, 0x8C, 0xEA, 0xAC, 0xEB, 0x4D, 0xEB,
75620xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x04, 0xF5, 0x68, 0xD8,
75630x40, 0x32, 0x8C, 0xEB, 0x80, 0xF1, 0x04, 0x4A, 0x68, 0x33, 0x4D, 0xE3,
75640x40, 0x9B, 0x2C, 0xEA, 0x04, 0xF5, 0x44, 0xD8, 0x05, 0x96, 0x00, 0x18,
75650xA5, 0x21, 0x86, 0x67, 0x05, 0x96, 0x04, 0xF5, 0x8A, 0xA0, 0x00, 0x18,
75660x93, 0x21, 0xA6, 0x67, 0x08, 0x97, 0x07, 0x91, 0x06, 0x90, 0x00, 0xEF,
75670x05, 0x63, 0x00, 0x00, 0xFF, 0x6A, 0xFD, 0x63, 0x04, 0x62, 0x00, 0x18,
75680xDB, 0x5C, 0x4C, 0xEC, 0x04, 0x97, 0x00, 0xEF, 0x03, 0x63, 0x00, 0x00,
75690x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x02, 0xF0, 0x00, 0x6D,
75700x63, 0xF3, 0x00, 0x4C, 0x1F, 0x6B, 0x04, 0xF5, 0x48, 0x9C, 0xFF, 0x4B,
75710x00, 0x53, 0xAD, 0xEA, 0x04, 0xF5, 0x48, 0xDC, 0x7F, 0x4C, 0x15, 0x4C,
75720xF6, 0x60, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x65, 0x00, 0x1C, 0xA1, 0x5E,
75730x00, 0x65, 0x00, 0x65, 0x83, 0xED, 0xAB, 0xE4, 0x01, 0x61, 0x8B, 0xE5,
75740x20, 0xE8, 0x00, 0x65, 0xC9, 0xF7, 0x1B, 0x6A, 0xF9, 0x63, 0x4B, 0xEA,
75750x0A, 0xD0, 0x40, 0x30, 0x00, 0x30, 0x01, 0xF5, 0x83, 0x40, 0x0C, 0x62,
75760x00, 0x1C, 0x00, 0x5C, 0x0B, 0xD1, 0x05, 0xD2, 0x05, 0x93, 0x70, 0x6A,
75770x6C, 0xEA, 0x3A, 0x2A, 0x67, 0x40, 0x3B, 0x4B, 0x01, 0x6A, 0x4B, 0xEA,
75780x40, 0xC3, 0x05, 0x93, 0x70, 0x6A, 0x4C, 0xEB, 0x08, 0xD3, 0x3C, 0x2B,
75790x9D, 0x67, 0x00, 0x1C, 0x8A, 0x40, 0x10, 0x4C, 0x02, 0xF0, 0x00, 0x6A,
75800x40, 0x31, 0xAF, 0x41, 0x00, 0x1C, 0xAC, 0x45, 0x18, 0x6C, 0x9D, 0x67,
75810x10, 0x4C, 0x00, 0x1C, 0x90, 0x40, 0x02, 0x67, 0x00, 0x1C, 0x5B, 0x1F,
75820x64, 0x6C, 0x10, 0xF0, 0x00, 0x6A, 0xD0, 0x67, 0x4D, 0xEE, 0x18, 0x6C,
75830x00, 0x1C, 0x83, 0x45, 0xAF, 0x41, 0x00, 0x1C, 0x2C, 0x1F, 0x03, 0x6C,
75840x08, 0x92, 0x6A, 0x2A, 0xC9, 0xF7, 0x1B, 0x6A, 0x7D, 0x67, 0x4B, 0xEA,
75850x40, 0x32, 0x20, 0xF0, 0x60, 0xA3, 0x0C, 0x97, 0x0B, 0x91, 0x0A, 0x90,
75860x40, 0x32, 0x42, 0x4A, 0x07, 0x63, 0x60, 0xC2, 0x00, 0xEF, 0x00, 0x65,
75870x8F, 0x6A, 0xA3, 0x67, 0x01, 0xF5, 0x83, 0x40, 0x00, 0x1C, 0xF0, 0x5B,
75880x4C, 0xED, 0x05, 0x93, 0x70, 0x6A, 0x4C, 0xEB, 0x08, 0xD3, 0xC4, 0x23,
75890x9D, 0x67, 0x00, 0x1C, 0x8A, 0x40, 0x10, 0x4C, 0x02, 0xF0, 0x00, 0x6D,
75900xA0, 0x31, 0xAF, 0x41, 0x00, 0x1C, 0xAC, 0x45, 0x00, 0x6C, 0x9D, 0x67,
75910x10, 0x4C, 0x00, 0x1C, 0x90, 0x40, 0x06, 0xD2, 0x00, 0x1C, 0x5B, 0x1F,
75920x64, 0x6C, 0x00, 0x1C, 0xF0, 0x42, 0x01, 0x6C, 0x9D, 0x67, 0x00, 0x1C,
75930x8A, 0x40, 0x10, 0x4C, 0xAF, 0x41, 0x00, 0x1C, 0xAC, 0x45, 0x00, 0x6C,
75940x9D, 0x67, 0x10, 0x4C, 0x00, 0x1C, 0x90, 0x40, 0x07, 0xD2, 0x00, 0x1C,
75950x5B, 0x1F, 0x64, 0x6C, 0x00, 0x1C, 0xF0, 0x42, 0x00, 0x6C, 0x01, 0xF1,
75960x00, 0x68, 0x06, 0x96, 0x00, 0x30, 0x01, 0x6A, 0xFF, 0x48, 0x40, 0x32,
75970x40, 0x32, 0x0C, 0xEE, 0x4D, 0xEE, 0xAF, 0x41, 0x00, 0x1C, 0x83, 0x45,
75980x00, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x00, 0x1C, 0xF0, 0x42,
75990x01, 0x6C, 0x07, 0x93, 0x01, 0x6E, 0xC0, 0x36, 0x6C, 0xE8, 0xC0, 0x36,
76000xAF, 0x41, 0x0D, 0xEE, 0x00, 0x1C, 0x83, 0x45, 0x00, 0x6C, 0x00, 0x1C,
76010x5B, 0x1F, 0x64, 0x6C, 0x00, 0x1C, 0xF0, 0x42, 0x00, 0x6C, 0x76, 0x17,
76020xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x01, 0xF5,
76030x03, 0x4C, 0x00, 0x1C, 0xF0, 0x5B, 0x05, 0x95, 0x06, 0x96, 0xAF, 0x41,
76040x00, 0x1C, 0x83, 0x45, 0x00, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C,
76050x00, 0x1C, 0xF0, 0x42, 0x01, 0x6C, 0x07, 0x96, 0xAF, 0x41, 0x00, 0x1C,
76060x83, 0x45, 0x00, 0x6C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C, 0x00, 0x1C,
76070xF0, 0x42, 0x00, 0x6C, 0x0C, 0x97, 0x0B, 0x91, 0x0A, 0x90, 0x00, 0xEF,
76080x07, 0x63, 0x00, 0x00, 0xF8, 0x63, 0x0D, 0xD1, 0x10, 0xF0, 0x02, 0x69,
76090x00, 0xF4, 0x20, 0x31, 0x0E, 0x62, 0x0C, 0xD0, 0x63, 0xF3, 0x00, 0x49,
76100x03, 0x99, 0x01, 0x6A, 0x80, 0xF7, 0x02, 0x30, 0x4C, 0xE8, 0x08, 0x28,
76110x42, 0x99, 0x03, 0x6B, 0x40, 0xF7, 0x42, 0x32, 0x6C, 0xEA, 0x01, 0x72,
76120x00, 0xF2, 0x07, 0x60, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
76130x63, 0xF3, 0x00, 0x4D, 0x43, 0x9D, 0x01, 0x6B, 0x80, 0xF7, 0x42, 0x32,
76140x6C, 0xEA, 0xE0, 0xF1, 0x14, 0x22, 0x42, 0x9D, 0x03, 0x6B, 0x40, 0xF7,
76150x42, 0x32, 0x6C, 0xEA, 0x01, 0x72, 0xE0, 0xF1, 0x0C, 0x61, 0x44, 0x9D,
76160x80, 0xF7, 0x42, 0x32, 0x01, 0x72, 0xA0, 0xF2, 0x00, 0x60, 0xC9, 0xF7,
76170x1B, 0x6C, 0x8B, 0xEC, 0xC0, 0xF2, 0xA7, 0xA5, 0x80, 0x34, 0x80, 0x34,
76180x61, 0xF4, 0x02, 0x4C, 0x00, 0x1C, 0xF0, 0x5B, 0x06, 0xD5, 0x10, 0xF0,
76190x02, 0x69, 0x00, 0xF4, 0x20, 0x31, 0x63, 0xF3, 0x00, 0x49, 0xC0, 0xF2,
76200x46, 0xA1, 0x07, 0x2A, 0xBD, 0x67, 0xAC, 0xAD, 0x01, 0x6A, 0xC0, 0xF2,
76210x46, 0xC1, 0xC0, 0xF2, 0xA4, 0xC9, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA,
76220x40, 0x30, 0x00, 0x30, 0x01, 0xF5, 0x83, 0x40, 0x00, 0x1C, 0x00, 0x5C,
76230x00, 0x65, 0x70, 0x6B, 0x4C, 0xEB, 0x80, 0xF2, 0x16, 0x2B, 0xC0, 0xF2,
76240x44, 0xA9, 0x06, 0x93, 0x53, 0xE3, 0x63, 0xEA, 0x07, 0xD4, 0x02, 0x61,
76250x6B, 0xE2, 0x07, 0xD2, 0x07, 0x95, 0x03, 0x5D, 0x80, 0xF2, 0x0D, 0x60,
76260x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0xC9, 0xF7, 0x1B, 0x6C,
76270x63, 0xF3, 0x00, 0x4A, 0x8B, 0xEC, 0x80, 0x34, 0xC0, 0xF2, 0xA4, 0xA2,
76280x80, 0x34, 0x61, 0xF4, 0x03, 0x4C, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65,
76290x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35, 0x63, 0xF3, 0x00, 0x4D,
76300x9D, 0x67, 0x62, 0x9D, 0x98, 0xA4, 0x3F, 0x6E, 0x24, 0x6A, 0xC0, 0xF2,
76310x82, 0xC5, 0x83, 0x67, 0x62, 0x33, 0xCC, 0xEC, 0x62, 0x33, 0xCC, 0xEB,
76320x93, 0xE2, 0x20, 0x6A, 0x7B, 0xE2, 0xC0, 0xF2, 0x43, 0xA5, 0x06, 0x95,
76330x4F, 0xE5, 0x43, 0xED, 0x07, 0xD3, 0x02, 0x60, 0xAB, 0xE2, 0x07, 0xD2,
76340x07, 0x95, 0x60, 0xF1, 0x1C, 0x25, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
76350x60, 0x33, 0x63, 0xF3, 0x00, 0x4B, 0xC0, 0xF2, 0x43, 0xA3, 0x06, 0x95,
76360x43, 0xED, 0x16, 0x60, 0x07, 0x92, 0x24, 0x68, 0x83, 0xEA, 0x40, 0xF2,
76370x18, 0x61, 0x07, 0x94, 0x20, 0x6D, 0x08, 0xD5, 0xC3, 0xEC, 0x24, 0x60,
76380x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A,
76390x45, 0xAA, 0x3F, 0x6B, 0x6C, 0xEA, 0x89, 0xE2, 0x08, 0xD2, 0x18, 0x10,
76400x42, 0x9B, 0x3F, 0x6B, 0x6C, 0xEA, 0x07, 0x93, 0x43, 0xEB, 0x63, 0xE2,
76410x01, 0x61, 0x00, 0x68, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
76420x63, 0xF3, 0x00, 0x4A, 0x45, 0xAA, 0x07, 0x94, 0x3F, 0x6B, 0x6C, 0xEA,
76430x43, 0xEC, 0x8B, 0xE2, 0x08, 0xD2, 0x02, 0x61, 0x00, 0x6D, 0x08, 0xD5,
76440x06, 0x6A, 0x03, 0xEA, 0x80, 0xF2, 0x06, 0x60, 0x10, 0xF0, 0x02, 0x6B,
76450x00, 0xF4, 0x60, 0x33, 0x08, 0x32, 0x63, 0xF3, 0x00, 0x4B, 0x69, 0xE2,
76460xA6, 0x9A, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3,
76470x00, 0x4B, 0xC3, 0x9B, 0xE0, 0xF3, 0x1F, 0x6F, 0x80, 0xF5, 0xA2, 0x35,
76480x86, 0x67, 0xEC, 0xEC, 0x40, 0xF2, 0x17, 0x24, 0x00, 0xF2, 0x00, 0x68,
76490x44, 0x67, 0x0C, 0xEA, 0x04, 0x22, 0x00, 0xF4, 0x00, 0x6A, 0x4B, 0xEA,
76500x4D, 0xEC, 0xB8, 0xEC, 0xC2, 0x33, 0x6A, 0x33, 0xEC, 0xEB, 0x12, 0xEA,
76510x42, 0x34, 0x43, 0x67, 0x0C, 0xEA, 0xEC, 0xEC, 0x04, 0x22, 0x00, 0xF4,
76520x00, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xB8, 0xEB, 0xC9, 0xF7, 0x1B, 0x68,
76530x0B, 0xE8, 0x80, 0xF5, 0xA0, 0x35, 0x00, 0x30, 0x00, 0x30, 0x12, 0xEA,
76540x42, 0x31, 0xEC, 0xE9, 0x3F, 0x6A, 0x2C, 0xEA, 0x40, 0x32, 0x40, 0x32,
76550x4D, 0xED, 0x8D, 0xED, 0x81, 0xF4, 0x80, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
76560x04, 0xD5, 0x91, 0xF4, 0x84, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
76570x02, 0xF0, 0x00, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0xFF, 0x4D, 0x4C, 0xED,
76580xC0, 0xF3, 0x00, 0x6A, 0x4C, 0xE9, 0x80, 0xF5, 0x20, 0x32, 0x4D, 0xED,
76590x04, 0xD5, 0x91, 0xF4, 0x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
76600x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B,
76610x42, 0x9B, 0xC0, 0xF7, 0x42, 0x32, 0xC0, 0xF1, 0x0A, 0x2A, 0x08, 0x94,
76620xC9, 0xF7, 0x1B, 0x68, 0x0B, 0xE8, 0x8C, 0x32, 0x65, 0xE2, 0xA0, 0xF0,
76630xAC, 0xA1, 0x00, 0x30, 0x00, 0x30, 0x21, 0xF2, 0x82, 0x40, 0x00, 0x1C,
76640xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF0, 0xAD, 0xA1, 0x21, 0xF2, 0x83, 0x40,
76650x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF0, 0xAE, 0xA1, 0x21, 0xF2,
76660x84, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF0, 0xAF, 0xA1,
76670x21, 0xF2, 0x85, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF0,
76680xB0, 0xA1, 0x21, 0xF2, 0x86, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65,
76690xA0, 0xF0, 0xB1, 0xA1, 0x21, 0xF2, 0x87, 0x40, 0x00, 0x1C, 0xF0, 0x5B,
76700x00, 0x65, 0xA0, 0xF0, 0xB2, 0xA1, 0x21, 0xF2, 0x88, 0x40, 0x00, 0x1C,
76710xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF0, 0xB3, 0xA1, 0x21, 0xF2, 0x89, 0x40,
76720x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
76730x40, 0x32, 0xCB, 0xF4, 0x46, 0xA2, 0x22, 0x72, 0x03, 0x60, 0x92, 0x72,
76740x80, 0xF0, 0x0D, 0x61, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
76750x63, 0xF3, 0x00, 0x4A, 0x42, 0x9A, 0x3F, 0x6B, 0x42, 0x32, 0x6C, 0xEA,
76760x24, 0x6B, 0x53, 0xE3, 0x07, 0x92, 0x01, 0x6B, 0x6E, 0xEA, 0x6C, 0xEA,
76770x00, 0xF2, 0x0F, 0x22, 0x07, 0x95, 0xA6, 0x33, 0x64, 0x32, 0x69, 0xE2,
76780x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x07, 0xD2, 0x63, 0xF3,
76790x00, 0x4B, 0xC0, 0xF2, 0x43, 0xA3, 0x06, 0x95, 0x43, 0xED, 0xA0, 0xF1,
76800x19, 0x60, 0x07, 0x92, 0x24, 0x68, 0x83, 0xEA, 0x06, 0x60, 0x42, 0x9B,
76810x3F, 0x6B, 0x42, 0x32, 0x6C, 0xEA, 0x07, 0x93, 0x61, 0xE2, 0x06, 0x6D,
76820x03, 0xED, 0xA0, 0xF1, 0x16, 0x60, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
76830x60, 0x33, 0x08, 0x32, 0x63, 0xF3, 0x00, 0x4B, 0x69, 0xE2, 0xA6, 0x9A,
76840x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x63, 0xF3, 0x00, 0x4B,
76850xC4, 0x9B, 0xE0, 0xF3, 0x1F, 0x6F, 0x80, 0xF5, 0xA2, 0x35, 0xC2, 0x34,
76860x8A, 0x34, 0xEC, 0xEC, 0xA0, 0xF1, 0x1E, 0x24, 0x00, 0xF2, 0x00, 0x68,
76870x44, 0x67, 0x0C, 0xEA, 0x04, 0x22, 0x00, 0xF4, 0x00, 0x6A, 0x4B, 0xEA,
76880x4D, 0xEC, 0xB8, 0xEC, 0x00, 0xF5, 0xC2, 0x33, 0xEC, 0xEB, 0x12, 0xEA,
76890x42, 0x34, 0x43, 0x67, 0x0C, 0xEA, 0xEC, 0xEC, 0x04, 0x22, 0x00, 0xF4,
76900x00, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xB8, 0xEB, 0xC9, 0xF7, 0x1B, 0x68,
76910x0B, 0xE8, 0x80, 0xF5, 0xA0, 0x35, 0x00, 0x30, 0x00, 0x30, 0x12, 0xEA,
76920x42, 0x31, 0xEC, 0xE9, 0x3F, 0x6A, 0x2C, 0xEA, 0x40, 0x32, 0x40, 0x32,
76930x4D, 0xED, 0x8D, 0xED, 0x81, 0xF4, 0x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
76940x04, 0xD5, 0x91, 0xF4, 0x8C, 0x40, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
76950x02, 0xF0, 0x00, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0xFF, 0x4D, 0x4C, 0xED,
76960xC0, 0xF3, 0x00, 0x6A, 0x4C, 0xE9, 0x80, 0xF5, 0x20, 0x32, 0x4D, 0xED,
76970x91, 0xF4, 0x8C, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x04, 0xD5, 0x0E, 0x97,
76980x0D, 0x91, 0x0C, 0x90, 0x00, 0x6A, 0x00, 0xEF, 0x08, 0x63, 0xC9, 0xF7,
76990x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x81, 0xF4, 0x00, 0x4C,
77000x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x08, 0xF0, 0x00, 0x6B, 0x6B, 0xEB,
77010x60, 0x33, 0xA2, 0x67, 0x6C, 0xED, 0xD1, 0x67, 0x03, 0x10, 0x01, 0x48,
77020x25, 0x58, 0x0E, 0x60, 0x08, 0x32, 0xC9, 0xE2, 0x46, 0x9A, 0x6C, 0xEA,
77030xAE, 0xEA, 0xF7, 0x2A, 0x62, 0x9E, 0x40, 0x6C, 0x3F, 0x6A, 0x8B, 0xEC,
77040x0C, 0xEA, 0x8C, 0xEB, 0x4D, 0xEB, 0x62, 0xDE, 0x10, 0xF0, 0x02, 0x6A,
77050x00, 0xF4, 0x40, 0x32, 0xCB, 0xF4, 0x46, 0xA2, 0x22, 0x72, 0x02, 0x60,
77060x92, 0x72, 0x2A, 0x61, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34,
77070x80, 0x34, 0x81, 0xF4, 0x08, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x68,
77080x08, 0xF0, 0x00, 0x6B, 0x6B, 0xEB, 0x60, 0x33, 0xA2, 0x67, 0x10, 0xF0,
77090x02, 0x6E, 0x00, 0xF4, 0xC0, 0x36, 0x6C, 0xED, 0x63, 0xF3, 0x00, 0x4E,
77100x03, 0x10, 0x01, 0x48, 0x25, 0x58, 0x10, 0x60, 0x08, 0x32, 0xC9, 0xE2,
77110x46, 0x9A, 0x6C, 0xEA, 0xAE, 0xEA, 0xF7, 0x2A, 0x62, 0x9E, 0x3F, 0x6A,
77120x07, 0xF7, 0x01, 0x6C, 0x0C, 0xEA, 0x8B, 0xEC, 0x40, 0x32, 0x8C, 0xEB,
77130x4D, 0xEB, 0x62, 0xDE, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34,
77140x80, 0x34, 0x21, 0xF2, 0x04, 0x4C, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x68,
77150x27, 0xF7, 0x1F, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x27, 0xF7, 0x1F, 0x4B,
77160x4C, 0xEB, 0x04, 0xD3, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
77170x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x03, 0xF4, 0x0E, 0x4A,
77180x03, 0xF5, 0x16, 0x4B, 0x09, 0xD2, 0x0A, 0xD3, 0x0C, 0x10, 0x0A, 0x93,
77190x9D, 0x67, 0x10, 0x4C, 0x75, 0xE1, 0x00, 0x1C, 0x1D, 0x55, 0x04, 0x6E,
77200xC0, 0xF0, 0x1B, 0x22, 0x01, 0x48, 0x21, 0x58, 0x22, 0x60, 0x09, 0x92,
77210x0C, 0x31, 0x9D, 0x67, 0x10, 0x4C, 0x55, 0xE1, 0x00, 0x1C, 0x1D, 0x55,
77220x04, 0x6E, 0xEB, 0x2A, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35,
77230x63, 0xF3, 0x00, 0x4D, 0x07, 0xF7, 0x00, 0x6A, 0x62, 0x9D, 0x4B, 0xEA,
77240x40, 0x32, 0xFF, 0x4A, 0x3F, 0x6C, 0x4C, 0xEB, 0x0C, 0xEC, 0x10, 0xF0,
77250x00, 0x6A, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x40, 0x32, 0x8D, 0xEB,
77260xFF, 0x4A, 0x4C, 0xEB, 0x62, 0xDD, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4,
77270x80, 0x34, 0x63, 0xF3, 0x00, 0x4C, 0x63, 0x9C, 0x08, 0xF0, 0x00, 0x6A,
77280x40, 0x32, 0x40, 0x32, 0x4D, 0xEB, 0x63, 0xDC, 0x45, 0x15, 0x02, 0xF0,
77290x00, 0x68, 0x00, 0x30, 0x60, 0x6E, 0xAF, 0x40, 0x00, 0x1C, 0x83, 0x45,
77300x24, 0x6C, 0xE0, 0xF3, 0x08, 0x6C, 0x00, 0x1C, 0x2C, 0x1F, 0x00, 0x65,
77310x9D, 0x67, 0x00, 0x1C, 0x8A, 0x40, 0x14, 0x4C, 0xAF, 0x40, 0x00, 0x1C,
77320xAC, 0x45, 0x24, 0x6C, 0x1F, 0x6C, 0x4C, 0xEC, 0x06, 0xD4, 0x9D, 0x67,
77330x00, 0x1C, 0x90, 0x40, 0x14, 0x4C, 0x00, 0x1C, 0x5B, 0x1F, 0x64, 0x6C,
77340x4C, 0x15, 0x61, 0xF4, 0x83, 0x40, 0xCC, 0x6D, 0x82, 0x15, 0x00, 0x18,
77350xA4, 0x5E, 0x00, 0x65, 0x7D, 0x67, 0x6C, 0xAB, 0x10, 0xF0, 0x02, 0x6A,
77360x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0xC0, 0xF2, 0x64, 0xCA,
77370x65, 0x15, 0x42, 0x9B, 0x3F, 0x6B, 0x6C, 0xEA, 0x07, 0x93, 0x61, 0xE2,
77380xA2, 0x15, 0x08, 0x95, 0xC9, 0xF7, 0x1B, 0x68, 0x0B, 0xE8, 0xAC, 0x32,
77390x65, 0xE2, 0xA0, 0xF1, 0xB4, 0xA1, 0x00, 0x30, 0x00, 0x30, 0x21, 0xF2,
77400x82, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF1, 0xB5, 0xA1,
77410x21, 0xF2, 0x83, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF1,
77420xB6, 0xA1, 0x21, 0xF2, 0x84, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65,
77430xA0, 0xF1, 0xB7, 0xA1, 0x21, 0xF2, 0x85, 0x40, 0x00, 0x1C, 0xF0, 0x5B,
77440x00, 0x65, 0xA0, 0xF1, 0xB8, 0xA1, 0x21, 0xF2, 0x86, 0x40, 0x00, 0x1C,
77450xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF1, 0xB9, 0xA1, 0x21, 0xF2, 0x87, 0x40,
77460x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF1, 0xBA, 0xA1, 0x21, 0xF2,
77470x88, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x00, 0x65, 0xA0, 0xF1, 0xBB, 0xA1,
77480x21, 0xF2, 0x89, 0x40, 0x35, 0x16, 0x6A, 0x60, 0x08, 0x32, 0xC9, 0xF7,
77490x1B, 0x6C, 0x69, 0xE2, 0x8B, 0xEC, 0x80, 0x34, 0xA6, 0x9A, 0x80, 0x34,
77500x81, 0xF4, 0x00, 0x4C, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xC9, 0xF7,
77510x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x81, 0xF4, 0x14, 0x4C,
77520x00, 0x6D, 0xD3, 0x15, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
77530x63, 0xF3, 0x00, 0x4A, 0xAC, 0x9A, 0x7B, 0x15, 0x42, 0x9B, 0x07, 0x94,
77540x3F, 0x6B, 0x42, 0x32, 0x6C, 0xEA, 0x43, 0xEC, 0x83, 0xE2, 0x5F, 0xF6,
77550x08, 0x61, 0x00, 0x68, 0x18, 0x65, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
77560x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0xAC, 0x9A, 0x4B, 0x16, 0x10, 0xF0,
77570x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35, 0x63, 0xF3, 0x00, 0x4D, 0x07, 0xF7,
77580x00, 0x6A, 0x62, 0x9D, 0x4B, 0xEA, 0x3F, 0x6C, 0x40, 0x32, 0xFF, 0x4A,
77590x0C, 0xEC, 0x4C, 0xEB, 0x80, 0x34, 0x10, 0xF0, 0x00, 0x6A, 0x4B, 0xEA,
77600x80, 0x34, 0x40, 0x32, 0x8D, 0xEB, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0x17,
77610x28, 0x60, 0x08, 0x32, 0xC9, 0xF7, 0x1B, 0x6C, 0x69, 0xE2, 0x8B, 0xEC,
77620x80, 0x34, 0xA6, 0x9A, 0x80, 0x34, 0x81, 0xF4, 0x08, 0x4C, 0x00, 0x1C,
77630xDD, 0x5B, 0x00, 0x65, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34,
77640x80, 0x34, 0x81, 0xF4, 0x1C, 0x4C, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x6D,
77650x6C, 0x16, 0x07, 0x93, 0xFF, 0x4B, 0x66, 0x33, 0x64, 0x32, 0x69, 0xE2,
77660x01, 0x4A, 0xEE, 0x15, 0xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34,
77670xAC, 0x9B, 0x80, 0x34, 0x81, 0xF4, 0x00, 0x4C, 0x97, 0x17, 0xC9, 0xF7,
77680x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0xAC, 0x9B, 0x80, 0x34, 0x81, 0xF4,
77690x08, 0x4C, 0xD9, 0x17, 0x82, 0x34, 0x1F, 0xF7, 0x00, 0x6A, 0x4C, 0xEC,
77700x82, 0x35, 0x20, 0x5D, 0x1B, 0x60, 0xAC, 0x32, 0xA9, 0xE2, 0x48, 0x32,
77710x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xA9, 0xE2, 0x63, 0xF3,
77720x00, 0x4B, 0x48, 0x32, 0x69, 0xE2, 0xE4, 0xF4, 0x58, 0x9A, 0xC9, 0xF7,
77730x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x52, 0x32, 0x7F, 0x6B,
77740x60, 0xF3, 0x14, 0x4C, 0x6C, 0xEA, 0x40, 0xDC, 0x20, 0xE8, 0x00, 0x65,
77750x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0xCA, 0xF2, 0x4C, 0x9A,
77760xC9, 0xF7, 0x1B, 0x6C, 0x8B, 0xEC, 0x80, 0x34, 0x80, 0x34, 0x52, 0x32,
77770x7F, 0x6B, 0x60, 0xF3, 0x14, 0x4C, 0x6C, 0xEA, 0x40, 0xDC, 0x20, 0xE8,
77780x00, 0x65, 0x00, 0x00, 0xFC, 0x63, 0x04, 0xD0, 0xC9, 0xF7, 0x1B, 0x68,
77790x0B, 0xE8, 0x00, 0x30, 0x00, 0x30, 0x01, 0xF5, 0x83, 0x40, 0x06, 0x62,
77800x00, 0x1C, 0x00, 0x5C, 0x05, 0xD1, 0x08, 0x6D, 0x4D, 0xED, 0xFF, 0x69,
77810x01, 0xF5, 0x83, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x2C, 0xED, 0x01, 0xF5,
77820x83, 0x40, 0x00, 0x1C, 0x00, 0x5C, 0x00, 0x65, 0xA2, 0x67, 0xF7, 0x6B,
77830x01, 0xF5, 0x83, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x6C, 0xED, 0x21, 0xF2,
77840x8D, 0x40, 0x00, 0x1C, 0x00, 0x5C, 0x00, 0x65, 0xA2, 0x67, 0x3F, 0x6B,
77850x21, 0xF2, 0x8D, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x6C, 0xED, 0x21, 0xF2,
77860x8D, 0x40, 0x00, 0x1C, 0x00, 0x5C, 0x00, 0x65, 0x80, 0x6D, 0xAB, 0xED,
77870x4D, 0xED, 0x21, 0xF2, 0x8D, 0x40, 0x00, 0x1C, 0xF0, 0x5B, 0x2C, 0xED,
77880x06, 0x97, 0x05, 0x91, 0x04, 0x90, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x65,
77890x00, 0x1C, 0x2A, 0x61, 0x00, 0x65, 0x00, 0x65, 0x00, 0x1C, 0x2C, 0x61,
77900x00, 0x65, 0x00, 0x65, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0x40, 0x32,
77910x40, 0x32, 0x30, 0xF2, 0x63, 0x42, 0x90, 0x34, 0x80, 0xC3, 0x20, 0xF2,
77920x10, 0x4A, 0x40, 0x9A, 0x02, 0xF0, 0x00, 0x6B, 0x60, 0x33, 0xFF, 0x4B,
77930x20, 0xE8, 0x6C, 0xEA, 0xC9, 0xF7, 0x1B, 0x6A, 0x4B, 0xEA, 0xFF, 0x6D,
77940x40, 0x32, 0x8C, 0xED, 0x40, 0x32, 0x30, 0xF2, 0x83, 0x42, 0xB0, 0x33,
77950x60, 0xC4, 0x20, 0xF2, 0x10, 0x4A, 0x60, 0x9A, 0x02, 0xF0, 0x00, 0x6A,
77960x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB, 0x83, 0x67, 0x05, 0x23, 0x01, 0x6C,
77970x84, 0xED, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEC, 0x20, 0xE8, 0x44, 0x67,
77980xC9, 0xF7, 0x1B, 0x6A, 0xFB, 0x63, 0x4B, 0xEA, 0x07, 0xD1, 0x40, 0x31,
77990x08, 0x62, 0x06, 0xD0, 0x20, 0x31, 0x40, 0xF0, 0x4C, 0xA1, 0xFF, 0x6C,
78000x8C, 0xEA, 0x02, 0x72, 0x14, 0x61, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
78010x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0x04, 0xD2, 0x66, 0xF7, 0x56, 0xAA,
78020x01, 0x72, 0x09, 0x61, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
78030xEB, 0xF5, 0x4C, 0xA2, 0x04, 0x67, 0x4C, 0xE8, 0x05, 0x20, 0x08, 0x97,
78040x07, 0x91, 0x06, 0x90, 0x00, 0xEF, 0x05, 0x63, 0x00, 0x18, 0x2C, 0x61,
78050x04, 0x6C, 0x04, 0x94, 0x08, 0xF0, 0x64, 0x9C, 0x4D, 0xE3, 0x08, 0xF0,
78060x64, 0xDC, 0x00, 0x18, 0x2C, 0x61, 0x06, 0x6C, 0x04, 0x94, 0x08, 0xF0,
78070x68, 0x9C, 0x4D, 0xE3, 0x08, 0xF0, 0x68, 0xDC, 0x00, 0x18, 0x2C, 0x61,
78080x07, 0x6C, 0x04, 0x94, 0x08, 0xF0, 0x6C, 0x9C, 0x4D, 0xE3, 0x08, 0xF0,
78090x6C, 0xDC, 0x00, 0x18, 0x2C, 0x61, 0x05, 0x6C, 0x04, 0x94, 0x08, 0xF0,
78100x70, 0x9C, 0x4D, 0xE3, 0x08, 0xF0, 0x70, 0xDC, 0x00, 0x18, 0x35, 0x61,
78110x90, 0x67, 0x04, 0x6C, 0x00, 0x18, 0x35, 0x61, 0x02, 0x67, 0x4D, 0xE8,
78120xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xE8, 0x30, 0xF2, 0x63, 0x41, 0x08, 0x6A,
78130x40, 0xC3, 0xC7, 0x28, 0x40, 0xF0, 0x40, 0xA9, 0xFF, 0xF7, 0x1F, 0x6B,
78140x6C, 0xEA, 0xFB, 0xF7, 0x1F, 0x6B, 0x6C, 0xEA, 0x04, 0xF0, 0x00, 0x6B,
78150x40, 0xF0, 0x40, 0xC9, 0x6D, 0xEA, 0x40, 0xF0, 0x40, 0xC9, 0x04, 0x94,
78160xFF, 0xF7, 0x1F, 0x6A, 0x66, 0xF7, 0xB4, 0xAC, 0x01, 0x4D, 0x66, 0xF7,
78170xB4, 0xCC, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x7E, 0xF2,
78180x08, 0x4C, 0x00, 0x1C, 0x13, 0x58, 0x4C, 0xED, 0xA6, 0x17, 0x00, 0x65,
78190xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF, 0x85, 0x2B, 0x00, 0x0C,
78200x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xBF, 0x8F, 0x02, 0x80, 0x02, 0x3C,
78210xE8, 0x03, 0x03, 0x24, 0x2C, 0x5E, 0x43, 0xAC, 0x18, 0x00, 0xBD, 0x27,
78220x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
78230x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
78240x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
78250x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
78260x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C,
78270x02, 0x80, 0x03, 0x3C, 0x0B, 0x5E, 0x40, 0xA0, 0xFF, 0x00, 0x85, 0x30,
78280xF2, 0x5D, 0x60, 0xA0, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
78290x05, 0x5E, 0x40, 0xA0, 0x08, 0x00, 0xA4, 0x2C, 0x07, 0x5E, 0x60, 0xA0,
78300x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0x0F, 0x5E, 0x40, 0xA0,
78310xEC, 0x5D, 0x65, 0xA0, 0x2C, 0x00, 0x80, 0x10, 0x02, 0x80, 0x03, 0x3C,
78320x80, 0x10, 0x05, 0x00, 0x78, 0xF2, 0x63, 0x24, 0x21, 0x10, 0x43, 0x00,
78330x00, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00,
78340x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x05, 0x3C, 0x60, 0x1B, 0xA5, 0x24,
78350xD0, 0x1B, 0xA4, 0x8C, 0x00, 0x70, 0x02, 0x3C, 0x02, 0x00, 0x42, 0x34,
78360x25, 0x20, 0x82, 0x00, 0x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x64, 0xAC,
78370x08, 0x00, 0xE0, 0x03, 0xD0, 0x1B, 0xA4, 0xAC, 0x02, 0x80, 0x05, 0x3C,
78380x60, 0x1B, 0xA5, 0x24, 0xD0, 0x1B, 0xA4, 0x8C, 0x00, 0x70, 0x02, 0x3C,
78390x02, 0x00, 0x42, 0x34, 0x27, 0x10, 0x02, 0x00, 0x24, 0x20, 0x82, 0x00,
78400x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x64, 0xAC, 0x08, 0x00, 0xE0, 0x03,
78410xD0, 0x1B, 0xA4, 0xAC, 0x02, 0x80, 0x05, 0x3C, 0x60, 0x1B, 0xA5, 0x24,
78420xD0, 0x1B, 0xA4, 0x8C, 0x00, 0x70, 0x02, 0x3C, 0x27, 0x10, 0x02, 0x00,
78430x24, 0x20, 0x82, 0x00, 0x02, 0x80, 0x07, 0x3C, 0x41, 0xB0, 0x02, 0x3C,
78440x01, 0x00, 0x03, 0x24, 0x00, 0x00, 0x44, 0xAC, 0x09, 0x5E, 0xE3, 0xA0,
78450x09, 0x5E, 0xE6, 0x90, 0x02, 0x80, 0x02, 0x3C, 0xD0, 0x1B, 0xA4, 0xAC,
78460x0A, 0x5E, 0x46, 0xA0, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
78470x02, 0x80, 0x05, 0x3C, 0x60, 0x1B, 0xA5, 0x24, 0xD0, 0x1B, 0xA4, 0x8C,
78480x00, 0x70, 0x02, 0x3C, 0x27, 0x10, 0x02, 0x00, 0x24, 0x20, 0x82, 0x00,
78490x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x64, 0xAC, 0x08, 0x00, 0xE0, 0x03,
78500xD0, 0x1B, 0xA4, 0xAC, 0xE0, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF,
78510x02, 0x80, 0x10, 0x3C, 0xEC, 0x5D, 0x02, 0x92, 0x18, 0x00, 0xB2, 0xAF,
78520x14, 0x00, 0xB1, 0xAF, 0x1C, 0x00, 0xBF, 0xAF, 0x21, 0x90, 0x80, 0x00,
78530x1C, 0x00, 0x40, 0x10, 0xFF, 0x00, 0xB1, 0x30, 0x02, 0x80, 0x03, 0x3C,
78540xC6, 0x5C, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0x30,
78550x1C, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x24,
78560x00, 0x02, 0x05, 0x3C, 0xC1, 0x43, 0x00, 0x0C, 0x01, 0x00, 0x06, 0x24,
78570x02, 0x80, 0x03, 0x3C, 0xEE, 0x5D, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
78580x0F, 0x00, 0x42, 0x30, 0x0C, 0x00, 0x42, 0x28, 0x06, 0x00, 0x40, 0x10,
78590x08, 0x00, 0x02, 0x24, 0x00, 0x00, 0x44, 0x96, 0x00, 0x00, 0x00, 0x00,
78600x0C, 0x00, 0x83, 0x30, 0x1B, 0x00, 0x62, 0x10, 0x02, 0x80, 0x02, 0x3C,
78610xEC, 0x5D, 0x02, 0x92, 0x05, 0x00, 0x03, 0x24, 0xFF, 0x00, 0x42, 0x30,
78620x0B, 0x00, 0x43, 0x10, 0x02, 0x80, 0x03, 0x3C, 0x1C, 0x00, 0xBF, 0x8F,
78630x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
78640x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27, 0xA8, 0x2D, 0x00, 0x0C,
78650x01, 0x00, 0x04, 0x24, 0xF1, 0x61, 0x00, 0x08, 0x00, 0x08, 0x04, 0x24,
78660x08, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x22, 0x02,
78670xF2, 0xFF, 0x40, 0x10, 0x02, 0x80, 0x03, 0x3C, 0x07, 0x5E, 0x62, 0x90,
78680x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x42, 0x34, 0x07, 0x5E, 0x62, 0xA0,
78690x05, 0x62, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x5E, 0x43, 0x90,
78700x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x60, 0x14, 0x00, 0x10, 0x82, 0x34,
78710x00, 0x62, 0x00, 0x08, 0x00, 0x00, 0x42, 0xA6, 0x0C, 0x00, 0x04, 0x24,
78720x4B, 0x2E, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0x00, 0x62, 0x00, 0x08,
78730x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
78740x02, 0x80, 0x03, 0x3C, 0x0B, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
78750x10, 0x00, 0x40, 0x10, 0x02, 0x80, 0x04, 0x3C, 0x0B, 0x5E, 0x60, 0xA0,
78760x02, 0x80, 0x04, 0x3C, 0x07, 0x5E, 0x83, 0x90, 0xFD, 0xFF, 0x02, 0x24,
78770x24, 0x18, 0x62, 0x00, 0x07, 0x5E, 0x83, 0xA0, 0x07, 0x5E, 0x82, 0x90,
78780x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x42, 0x30, 0x49, 0x00, 0x40, 0x10,
78790x02, 0x80, 0x02, 0x3C, 0x10, 0x00, 0xBF, 0x8F, 0x00, 0x00, 0x00, 0x00,
78800x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0xF2, 0x5D, 0x82, 0x90,
78810x02, 0x80, 0x05, 0x3C, 0x01, 0x00, 0x42, 0x24, 0xF2, 0x5D, 0x82, 0xA0,
78820x07, 0x5E, 0xA3, 0x90, 0xEF, 0xFF, 0x02, 0x24, 0x24, 0x18, 0x62, 0x00,
78830x07, 0x5E, 0xA3, 0xA0, 0xF2, 0x5D, 0x82, 0x90, 0x00, 0x00, 0x00, 0x00,
78840x02, 0x00, 0x42, 0x2C, 0x13, 0x00, 0x40, 0x14, 0x25, 0xB0, 0x06, 0x3C,
78850x02, 0x80, 0x03, 0x3C, 0x10, 0x37, 0x62, 0x94, 0x00, 0x00, 0x00, 0x00,
78860x00, 0x01, 0x42, 0x30, 0x3A, 0x00, 0x40, 0x10, 0x02, 0x80, 0x02, 0x3C,
78870x02, 0x80, 0x03, 0x3C, 0x0E, 0x5E, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00,
78880xE5, 0xFF, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x5E, 0x62, 0x90,
78890x10, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xBD, 0x27, 0x01, 0x00, 0x42, 0x24,
78900x0E, 0x5E, 0x62, 0xA0, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
78910x84, 0x00, 0xC4, 0x34, 0x80, 0x00, 0xC6, 0x34, 0x00, 0x00, 0x82, 0x8C,
78920x00, 0x00, 0xC4, 0x8C, 0x02, 0x80, 0x08, 0x3C, 0x21, 0x10, 0x00, 0x00,
78930x14, 0x5E, 0x06, 0x8D, 0x42, 0xB0, 0x0A, 0x3C, 0x25, 0x10, 0x44, 0x00,
78940x02, 0x80, 0x04, 0x3C, 0x18, 0x5E, 0x88, 0x8C, 0x1C, 0x5E, 0x89, 0x8C,
78950x00, 0x00, 0x45, 0x91, 0x21, 0x10, 0x46, 0x00, 0xFB, 0xFF, 0x04, 0x24,
78960x24, 0x28, 0xA4, 0x00, 0x23, 0x40, 0x02, 0x01, 0x00, 0x00, 0x45, 0xA1,
78970x04, 0x00, 0x00, 0x11, 0x01, 0x00, 0x06, 0x24, 0x80, 0x10, 0x08, 0x00,
78980x21, 0x10, 0x48, 0x00, 0x80, 0x30, 0x02, 0x00, 0x01, 0x00, 0x04, 0x24,
78990xB9, 0x20, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0x42, 0xB0, 0x02, 0x3C,
79000x22, 0x00, 0x04, 0x24, 0x03, 0x00, 0x42, 0x34, 0x00, 0x00, 0x44, 0xA0,
79010x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x64, 0x90, 0x10, 0x00, 0xBF, 0x8F,
79020x01, 0x00, 0x05, 0x24, 0xFF, 0x00, 0x84, 0x30, 0x4B, 0x2E, 0x00, 0x08,
79030x18, 0x00, 0xBD, 0x27, 0x05, 0x5E, 0x40, 0xA0, 0x02, 0x80, 0x03, 0x3C,
79040xED, 0x5D, 0x64, 0x90, 0x10, 0x00, 0xBF, 0x8F, 0x01, 0x00, 0x05, 0x24,
79050xFF, 0x00, 0x84, 0x30, 0x4B, 0x2E, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
79060x10, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xBD, 0x27, 0x0E, 0x5E, 0x40, 0xA0,
79070x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27,
79080xFF, 0x00, 0xA5, 0x30, 0x10, 0x00, 0xB0, 0xAF, 0x14, 0x00, 0xBF, 0xAF,
79090x18, 0x00, 0xA0, 0x14, 0xFF, 0x00, 0x90, 0x30, 0x35, 0x00, 0x00, 0x12,
79100x01, 0x00, 0x05, 0x24, 0x02, 0x80, 0x02, 0x3C, 0x01, 0x00, 0x05, 0x24,
79110x05, 0x5E, 0x45, 0xA0, 0x02, 0x80, 0x07, 0x3C, 0x07, 0x5E, 0xE3, 0x90,
79120x02, 0x00, 0x04, 0x24, 0x21, 0x28, 0x00, 0x00, 0x02, 0x00, 0x63, 0x34,
79130x00, 0xF0, 0x06, 0x34, 0x07, 0x5E, 0xE3, 0xA0, 0xB9, 0x20, 0x00, 0x0C,
79140x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
79150x42, 0xB0, 0x02, 0x3C, 0x44, 0x00, 0x03, 0x24, 0x03, 0x00, 0x42, 0x34,
79160x18, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x43, 0xA0, 0x08, 0x00, 0xE0, 0x03,
79170x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x24, 0x02, 0x80, 0x02, 0x3C,
79180x05, 0x5E, 0x44, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0x08, 0x5E, 0x65, 0x90,
79190x0F, 0x00, 0x02, 0x24, 0x02, 0x80, 0x06, 0x3C, 0x0F, 0x00, 0xA5, 0x30,
79200x0D, 0x00, 0xA2, 0x10, 0x01, 0x00, 0x04, 0x24, 0x07, 0x5E, 0xC2, 0x90,
79210x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x34, 0x07, 0x5E, 0xC2, 0xA0,
79220xE1, 0x51, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xFF, 0x00, 0x16,
79230x02, 0x80, 0x02, 0x3C, 0x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
79240x08, 0x00, 0xE0, 0x03, 0x18, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C,
79250x04, 0x5E, 0x43, 0x90, 0x01, 0x00, 0x04, 0x24, 0xF6, 0xFF, 0x60, 0x10,
79260x01, 0x00, 0x05, 0x24, 0xC8, 0x51, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
79270xB9, 0x62, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C,
79280x05, 0x5E, 0x40, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x64, 0x90,
79290x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0xFF, 0x00, 0x84, 0x30,
79300x4B, 0x2E, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27,
79310xFF, 0x00, 0xA5, 0x30, 0x14, 0x00, 0xB1, 0xAF, 0x18, 0x00, 0xBF, 0xAF,
79320x10, 0x00, 0xB0, 0xAF, 0x03, 0x00, 0xA0, 0x14, 0xFF, 0x00, 0x91, 0x30,
79330x3A, 0x00, 0x20, 0x12, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x10, 0x3C,
79340x07, 0x5E, 0x02, 0x92, 0xFB, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00,
79350x07, 0x5E, 0x02, 0xA2, 0x10, 0x00, 0xA0, 0x14, 0x02, 0x80, 0x03, 0x3C,
79360x07, 0x5E, 0x02, 0x92, 0xFE, 0xFF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00,
79370x07, 0x5E, 0x02, 0xA2, 0x19, 0x00, 0x20, 0x16, 0x02, 0x80, 0x02, 0x3C,
79380x07, 0x5E, 0x02, 0x92, 0xFD, 0xFF, 0x03, 0x24, 0x18, 0x00, 0xBF, 0x8F,
79390x24, 0x10, 0x43, 0x00, 0x07, 0x5E, 0x02, 0xA2, 0x14, 0x00, 0xB1, 0x8F,
79400x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
79410x01, 0x00, 0x04, 0x24, 0x05, 0x5E, 0x64, 0xA0, 0x07, 0x5E, 0x02, 0x92,
79420x02, 0x80, 0x03, 0x3C, 0x01, 0x00, 0x42, 0x34, 0x07, 0x5E, 0x02, 0xA2,
79430x06, 0x5E, 0x62, 0x90, 0x02, 0x00, 0x03, 0x24, 0xFF, 0x00, 0x42, 0x30,
79440x23, 0x00, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0xE1, 0x51, 0x00, 0x0C,
79450x01, 0x00, 0x04, 0x24, 0xE9, 0xFF, 0x20, 0x12, 0x02, 0x80, 0x02, 0x3C,
79460x01, 0x00, 0x04, 0x24, 0x05, 0x5E, 0x44, 0xA0, 0x07, 0x5E, 0x03, 0x92,
79470x02, 0x00, 0x04, 0x24, 0x21, 0x28, 0x00, 0x00, 0x02, 0x00, 0x63, 0x34,
79480x00, 0xF0, 0x06, 0x34, 0x07, 0x5E, 0x03, 0xA2, 0xB9, 0x20, 0x00, 0x0C,
79490x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xBF, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
79500x10, 0x00, 0xB0, 0x8F, 0x42, 0xB0, 0x02, 0x3C, 0x44, 0x00, 0x03, 0x24,
79510x03, 0x00, 0x42, 0x34, 0x20, 0x00, 0xBD, 0x27, 0x00, 0x00, 0x43, 0xA0,
79520x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x5E, 0x40, 0xA0,
79530x02, 0x80, 0x03, 0x3C, 0xED, 0x5D, 0x64, 0x90, 0x18, 0x00, 0xBF, 0x8F,
79540x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x05, 0x24,
79550xFF, 0x00, 0x84, 0x30, 0x4B, 0x2E, 0x00, 0x08, 0x20, 0x00, 0xBD, 0x27,
79560xE2, 0x2C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x24,
79570x4B, 0x2E, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24, 0xE5, 0x62, 0x00, 0x08,
79580x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB2, 0xAF,
79590x0C, 0x00, 0xB1, 0xAF, 0x08, 0x00, 0xB0, 0xAF, 0x21, 0x40, 0xE0, 0x00,
79600x21, 0x90, 0xA0, 0x03, 0x21, 0x60, 0xC0, 0x00, 0x21, 0x78, 0x80, 0x00,
79610x45, 0x00, 0xE0, 0x14, 0x21, 0x50, 0xA0, 0x00, 0x2B, 0x10, 0xA6, 0x00,
79620x78, 0x00, 0x40, 0x10, 0xFF, 0xFF, 0x02, 0x34, 0x2B, 0x10, 0x46, 0x00,
79630x8F, 0x01, 0x40, 0x10, 0x21, 0x28, 0xC0, 0x00, 0xFF, 0x00, 0x02, 0x3C,
79640xFF, 0xFF, 0x42, 0x34, 0x10, 0x00, 0x03, 0x24, 0x2B, 0x10, 0x46, 0x00,
79650x18, 0x00, 0x04, 0x24, 0x21, 0x30, 0x60, 0x00, 0x0B, 0x30, 0x82, 0x00,
79660x02, 0x80, 0x03, 0x3C, 0x06, 0x10, 0xC5, 0x00, 0x98, 0xF2, 0x63, 0x24,
79670x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x90, 0x20, 0x00, 0x02, 0x24,
79680x21, 0x20, 0x86, 0x00, 0x23, 0x30, 0x44, 0x00, 0x08, 0x00, 0xC0, 0x10,
79690x02, 0x4C, 0x0C, 0x00, 0x23, 0x10, 0x46, 0x00, 0x06, 0x10, 0x4F, 0x00,
79700x04, 0x18, 0xCA, 0x00, 0x25, 0x50, 0x62, 0x00, 0x04, 0x60, 0xCC, 0x00,
79710x04, 0x78, 0xCF, 0x00, 0x02, 0x4C, 0x0C, 0x00, 0x1B, 0x00, 0x49, 0x01,
79720x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00,
79730xFF, 0xFF, 0x87, 0x31, 0x02, 0x24, 0x0F, 0x00, 0x12, 0x18, 0x00, 0x00,
79740x10, 0x28, 0x00, 0x00, 0x00, 0x14, 0x05, 0x00, 0x25, 0x28, 0x44, 0x00,
79750x18, 0x00, 0x67, 0x00, 0x12, 0x58, 0x00, 0x00, 0x2B, 0x18, 0xAB, 0x00,
79760x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x49, 0x01, 0x02, 0x00, 0x20, 0x15,
79770x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00, 0x08, 0x00, 0x60, 0x10,
79780x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0xAC, 0x00, 0x2B, 0x10, 0xAC, 0x00,
79790x04, 0x00, 0x40, 0x14, 0x2B, 0x10, 0xAB, 0x00, 0x00, 0x00, 0x42, 0x38,
79800x21, 0x18, 0xAC, 0x00, 0x0B, 0x28, 0x62, 0x00, 0x23, 0x28, 0xAB, 0x00,
79810x1B, 0x00, 0xA9, 0x00, 0x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00,
79820x0D, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xE4, 0x31, 0x12, 0x18, 0x00, 0x00,
79830x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x63, 0x00, 0x08,
79840x18, 0x00, 0x67, 0x00, 0x2B, 0x10, 0xA7, 0x00, 0x0A, 0x00, 0x40, 0x10,
79850xFF, 0xFF, 0x02, 0x34, 0x10, 0x00, 0xB2, 0x8F, 0x0C, 0x00, 0xB1, 0x8F,
79860x08, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x80, 0x00, 0x21, 0x18, 0xA0, 0x00,
79870x00, 0x00, 0xA4, 0xAF, 0x04, 0x00, 0xA5, 0xAF, 0x08, 0x00, 0xE0, 0x03,
79880x18, 0x00, 0xBD, 0x27, 0x2B, 0x10, 0x47, 0x00, 0xD2, 0x00, 0x40, 0x10,
79890x00, 0x01, 0xE3, 0x2C, 0xFF, 0x00, 0x02, 0x3C, 0x10, 0x00, 0x03, 0x24,
79900xFF, 0xFF, 0x42, 0x34, 0x2B, 0x10, 0x47, 0x00, 0x18, 0x00, 0x04, 0x24,
79910x21, 0x28, 0x60, 0x00, 0x0B, 0x28, 0x82, 0x00, 0x06, 0x10, 0xA8, 0x00,
79920x02, 0x80, 0x03, 0x3C, 0x98, 0xF2, 0x63, 0x24, 0x21, 0x10, 0x43, 0x00,
79930x00, 0x00, 0x44, 0x90, 0x20, 0x00, 0x02, 0x24, 0x21, 0x20, 0x85, 0x00,
79940x23, 0x30, 0x44, 0x00, 0xCE, 0x00, 0xC0, 0x14, 0x23, 0x38, 0x46, 0x00,
79950x2B, 0x10, 0x0A, 0x01, 0x04, 0x00, 0x40, 0x14, 0x23, 0x20, 0xEC, 0x01,
79960x2B, 0x10, 0xEC, 0x01, 0x05, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00,
79970x2B, 0x10, 0xE4, 0x01, 0x23, 0x18, 0x48, 0x01, 0x23, 0x50, 0x62, 0x00,
79980x21, 0x78, 0x80, 0x00, 0x04, 0x00, 0x40, 0x12, 0x21, 0xC0, 0xE0, 0x01,
79990x21, 0xC8, 0x40, 0x01, 0x00, 0x00, 0x58, 0xAE, 0x04, 0x00, 0x59, 0xAE,
80000x00, 0x00, 0xA2, 0x8F, 0x04, 0x00, 0xA3, 0x8F, 0x10, 0x00, 0xB2, 0x8F,
80010x0C, 0x00, 0xB1, 0x8F, 0x08, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
80020x18, 0x00, 0xBD, 0x27, 0x53, 0x00, 0xC0, 0x10, 0x01, 0x00, 0x02, 0x24,
80030xFF, 0xFF, 0x02, 0x34, 0x2B, 0x10, 0x4C, 0x00, 0x59, 0x00, 0x40, 0x14,
80040xFF, 0x00, 0x02, 0x3C, 0x00, 0x01, 0x83, 0x2D, 0x08, 0x00, 0x02, 0x24,
80050x21, 0x28, 0x00, 0x00, 0x0A, 0x28, 0x43, 0x00, 0x06, 0x10, 0xAC, 0x00,
80060x02, 0x80, 0x03, 0x3C, 0x98, 0xF2, 0x63, 0x24, 0x21, 0x10, 0x43, 0x00,
80070x00, 0x00, 0x44, 0x90, 0x20, 0x00, 0x02, 0x24, 0x21, 0x20, 0x85, 0x00,
80080x23, 0x30, 0x44, 0x00, 0x5B, 0x00, 0xC0, 0x14, 0x00, 0x00, 0x00, 0x00,
80090x23, 0x50, 0x4C, 0x01, 0x02, 0x4C, 0x0C, 0x00, 0xFF, 0xFF, 0x8D, 0x31,
80100x1B, 0x00, 0x49, 0x01, 0x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00,
80110x0D, 0x00, 0x07, 0x00, 0x02, 0x24, 0x0F, 0x00, 0x12, 0x18, 0x00, 0x00,
80120x10, 0x28, 0x00, 0x00, 0x00, 0x14, 0x05, 0x00, 0x25, 0x28, 0x44, 0x00,
80130x18, 0x00, 0x6D, 0x00, 0x12, 0x58, 0x00, 0x00, 0x2B, 0x18, 0xAB, 0x00,
80140x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x49, 0x01, 0x02, 0x00, 0x20, 0x15,
80150x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00, 0x08, 0x00, 0x60, 0x10,
80160x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0xAC, 0x00, 0x2B, 0x10, 0xAC, 0x00,
80170x04, 0x00, 0x40, 0x14, 0x2B, 0x10, 0xAB, 0x00, 0x00, 0x00, 0x42, 0x38,
80180x21, 0x18, 0xAC, 0x00, 0x0B, 0x28, 0x62, 0x00, 0x23, 0x28, 0xAB, 0x00,
80190x1B, 0x00, 0xA9, 0x00, 0x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00,
80200x0D, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xE4, 0x31, 0x12, 0x18, 0x00, 0x00,
80210x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80220x18, 0x00, 0x6D, 0x00, 0x00, 0x14, 0x08, 0x00, 0x12, 0x58, 0x00, 0x00,
80230x25, 0x40, 0x44, 0x00, 0x2B, 0x18, 0x0B, 0x01, 0x1B, 0x00, 0xA9, 0x00,
80240x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00,
80250x08, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x40, 0x0C, 0x01,
80260x2B, 0x10, 0x0C, 0x01, 0x04, 0x00, 0x40, 0x14, 0x2B, 0x10, 0x0B, 0x01,
80270x21, 0x18, 0x0C, 0x01, 0x00, 0x00, 0x42, 0x38, 0x0B, 0x40, 0x62, 0x00,
80280xAB, 0xFF, 0x40, 0x12, 0x23, 0x78, 0x0B, 0x01, 0x06, 0xC0, 0xCF, 0x00,
80290x21, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x58, 0xAE, 0xA1, 0x63, 0x00, 0x08,
80300x04, 0x00, 0x59, 0xAE, 0x1B, 0x00, 0x47, 0x00, 0x02, 0x00, 0xE0, 0x14,
80310x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0x02, 0x34,
80320x12, 0x60, 0x00, 0x00, 0x2B, 0x10, 0x4C, 0x00, 0xAB, 0xFF, 0x40, 0x10,
80330x00, 0x01, 0x83, 0x2D, 0xFF, 0x00, 0x02, 0x3C, 0x10, 0x00, 0x03, 0x24,
80340xFF, 0xFF, 0x42, 0x34, 0x2B, 0x10, 0x4C, 0x00, 0x18, 0x00, 0x04, 0x24,
80350x21, 0x28, 0x60, 0x00, 0x0B, 0x28, 0x82, 0x00, 0x02, 0x80, 0x03, 0x3C,
80360x06, 0x10, 0xAC, 0x00, 0x98, 0xF2, 0x63, 0x24, 0x21, 0x10, 0x43, 0x00,
80370x00, 0x00, 0x44, 0x90, 0x20, 0x00, 0x02, 0x24, 0x21, 0x20, 0x85, 0x00,
80380x23, 0x30, 0x44, 0x00, 0xA7, 0xFF, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00,
80390x23, 0x38, 0x46, 0x00, 0x04, 0x60, 0xCC, 0x00, 0x06, 0x58, 0xEA, 0x00,
80400x02, 0x4C, 0x0C, 0x00, 0x1B, 0x00, 0x69, 0x01, 0x02, 0x00, 0x20, 0x15,
80410x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0x8D, 0x31,
80420x06, 0x18, 0xEF, 0x00, 0x04, 0x10, 0xCA, 0x00, 0x25, 0x50, 0x43, 0x00,
80430x02, 0x24, 0x0A, 0x00, 0x12, 0x28, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00,
80440x00, 0x14, 0x08, 0x00, 0x25, 0x40, 0x44, 0x00, 0x18, 0x00, 0xAD, 0x00,
80450x12, 0x28, 0x00, 0x00, 0x2B, 0x18, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
80460x1B, 0x00, 0x69, 0x01, 0x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00,
80470x0D, 0x00, 0x07, 0x00, 0x05, 0x00, 0x60, 0x10, 0x04, 0x78, 0xCF, 0x00,
80480x21, 0x40, 0x0C, 0x01, 0x2B, 0x10, 0x0C, 0x01, 0x93, 0x00, 0x40, 0x10,
80490x2B, 0x10, 0x05, 0x01, 0x23, 0x40, 0x05, 0x01, 0x1B, 0x00, 0x09, 0x01,
80500x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00,
80510xFF, 0xFF, 0x44, 0x31, 0x12, 0x18, 0x00, 0x00, 0x10, 0x58, 0x00, 0x00,
80520x00, 0x14, 0x0B, 0x00, 0x25, 0x58, 0x44, 0x00, 0x18, 0x00, 0x6D, 0x00,
80530x12, 0x28, 0x00, 0x00, 0x2B, 0x18, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00,
80540x1B, 0x00, 0x09, 0x01, 0x02, 0x00, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00,
80550x0D, 0x00, 0x07, 0x00, 0x77, 0xFF, 0x60, 0x10, 0x23, 0x50, 0x65, 0x01,
80560x21, 0x58, 0x6C, 0x01, 0x2B, 0x10, 0x6C, 0x01, 0x04, 0x00, 0x40, 0x14,
80570x2B, 0x10, 0x65, 0x01, 0x00, 0x00, 0x42, 0x38, 0x21, 0x18, 0x6C, 0x01,
80580x0B, 0x58, 0x62, 0x00, 0xBF, 0x63, 0x00, 0x08, 0x23, 0x50, 0x65, 0x01,
80590x08, 0x00, 0x02, 0x24, 0x21, 0x28, 0x00, 0x00, 0x0A, 0x28, 0x43, 0x00,
80600x02, 0x80, 0x03, 0x3C, 0x06, 0x10, 0xA8, 0x00, 0x98, 0xF2, 0x63, 0x24,
80610x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x90, 0x20, 0x00, 0x02, 0x24,
80620x21, 0x20, 0x85, 0x00, 0x23, 0x30, 0x44, 0x00, 0x34, 0xFF, 0xC0, 0x10,
80630x23, 0x38, 0x46, 0x00, 0x06, 0x10, 0xEC, 0x00, 0x04, 0x18, 0xC8, 0x00,
80640x25, 0x40, 0x62, 0x00, 0x06, 0x58, 0xEA, 0x00, 0x02, 0x6C, 0x08, 0x00,
80650x1B, 0x00, 0x6D, 0x01, 0x02, 0x00, 0xA0, 0x15, 0x00, 0x00, 0x00, 0x00,
80660x0D, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0x11, 0x31, 0x06, 0x10, 0xEF, 0x00,
80670x04, 0x18, 0xCA, 0x00, 0x25, 0x50, 0x62, 0x00, 0x02, 0x24, 0x0A, 0x00,
80680x04, 0x60, 0xCC, 0x00, 0x12, 0x80, 0x00, 0x00, 0x10, 0x48, 0x00, 0x00,
80690x00, 0x14, 0x09, 0x00, 0x25, 0x48, 0x44, 0x00, 0x12, 0x28, 0x00, 0x00,
80700x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x11, 0x02,
80710x12, 0x70, 0x00, 0x00, 0x2B, 0x18, 0x2E, 0x01, 0x00, 0x00, 0x00, 0x00,
80720x1B, 0x00, 0x6D, 0x01, 0x02, 0x00, 0xA0, 0x15, 0x00, 0x00, 0x00, 0x00,
80730x0D, 0x00, 0x07, 0x00, 0x0A, 0x00, 0x60, 0x10, 0x04, 0x78, 0xCF, 0x00,
80740x21, 0x48, 0x28, 0x01, 0x2B, 0x10, 0x28, 0x01, 0x06, 0x00, 0x40, 0x14,
80750xFF, 0xFF, 0xB0, 0x24, 0x2B, 0x10, 0x2E, 0x01, 0x03, 0x00, 0x40, 0x10,
80760x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x26, 0x21, 0x48, 0x28, 0x01,
80770x23, 0x48, 0x2E, 0x01, 0x1B, 0x00, 0x2D, 0x01, 0x02, 0x00, 0xA0, 0x15,
80780x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0x44, 0x31,
80790x12, 0x28, 0x00, 0x00, 0x10, 0x58, 0x00, 0x00, 0x00, 0x14, 0x0B, 0x00,
80800x25, 0x58, 0x44, 0x00, 0x18, 0x00, 0xB1, 0x00, 0x12, 0x70, 0x00, 0x00,
80810x2B, 0x18, 0x6E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x2D, 0x01,
80820x02, 0x00, 0xA0, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x07, 0x00,
80830x0B, 0x00, 0x60, 0x10, 0x00, 0x14, 0x10, 0x00, 0x21, 0x58, 0x68, 0x01,
80840x2B, 0x10, 0x68, 0x01, 0x06, 0x00, 0x40, 0x14, 0xFF, 0xFF, 0xA5, 0x24,
80850x2B, 0x10, 0x6E, 0x01, 0x04, 0x00, 0x40, 0x10, 0x00, 0x14, 0x10, 0x00,
80860xFF, 0xFF, 0xA5, 0x24, 0x21, 0x58, 0x68, 0x01, 0x00, 0x14, 0x10, 0x00,
80870x25, 0x10, 0x45, 0x00, 0x23, 0x58, 0x6E, 0x01, 0x19, 0x00, 0x4C, 0x00,
80880x10, 0x28, 0x00, 0x00, 0x2B, 0x18, 0x65, 0x01, 0x12, 0x48, 0x00, 0x00,
80890x05, 0x00, 0x60, 0x14, 0x23, 0x20, 0x2C, 0x01, 0x07, 0x00, 0xAB, 0x14,
80900x2B, 0x10, 0xE9, 0x01, 0x05, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
80910x2B, 0x10, 0x24, 0x01, 0x23, 0x18, 0xA8, 0x00, 0x23, 0x28, 0x62, 0x00,
80920x21, 0x48, 0x80, 0x00, 0xEA, 0xFE, 0x40, 0x12, 0x23, 0x18, 0xE9, 0x01,
80930x23, 0x20, 0x65, 0x01, 0x2B, 0x10, 0xE3, 0x01, 0x23, 0x50, 0x82, 0x00,
80940x04, 0x28, 0xEA, 0x00, 0x06, 0x18, 0xC3, 0x00, 0x25, 0xC0, 0xA3, 0x00,
80950x06, 0xC8, 0xCA, 0x00, 0x00, 0x00, 0x58, 0xAE, 0xA1, 0x63, 0x00, 0x08,
80960x04, 0x00, 0x59, 0xAE, 0x00, 0x01, 0xC3, 0x2C, 0x08, 0x00, 0x02, 0x24,
80970x21, 0x30, 0x00, 0x00, 0x3B, 0x63, 0x00, 0x08, 0x0A, 0x30, 0x43, 0x00,
80980x00, 0x00, 0x42, 0x38, 0x21, 0x18, 0x0C, 0x01, 0x35, 0x64, 0x00, 0x08,
80990x0B, 0x40, 0x62, 0x00, 0x25, 0xB0, 0x03, 0x3C, 0x4D, 0x00, 0x64, 0x34,
81000xF1, 0x02, 0x65, 0x34, 0x08, 0x00, 0x02, 0x24, 0x00, 0x00, 0x80, 0xA0,
81010xEC, 0x02, 0x66, 0x34, 0x00, 0x00, 0xA2, 0xA0, 0xF0, 0x02, 0x63, 0x34,
81020xFF, 0x00, 0x02, 0x3C, 0x00, 0x00, 0x60, 0xA0, 0x00, 0x00, 0xC2, 0xAC,
81030x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x3C,
81040x25, 0xB0, 0x02, 0x3C, 0x60, 0x93, 0x63, 0x24, 0x18, 0x03, 0x42, 0x34,
81050x00, 0x00, 0x43, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
81060x7F, 0x00, 0x02, 0x3C, 0x0D, 0xB8, 0x44, 0x34, 0x80, 0x04, 0x03, 0x3C,
81070x25, 0x20, 0x83, 0x00, 0x00, 0x08, 0x02, 0x3C, 0x25, 0x20, 0x82, 0x00,
81080x00, 0x30, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
81090x25, 0x20, 0x83, 0x00, 0x41, 0xB0, 0x03, 0x3C, 0x00, 0x00, 0x64, 0xAC,
81100xD8, 0x1B, 0x44, 0xAC, 0xD0, 0x1B, 0x44, 0xAC, 0x08, 0x00, 0x63, 0x34,
81110x86, 0x00, 0x04, 0x24, 0x00, 0x00, 0x64, 0xA4, 0xDC, 0x1B, 0x44, 0xA4,
81120xD4, 0x1B, 0x40, 0xAC, 0xDE, 0x1B, 0x40, 0xA4, 0x08, 0x00, 0xE0, 0x03,
81130xE0, 0x1B, 0x44, 0xA4, 0xF5, 0x64, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
81140x42, 0xB0, 0x03, 0x3C, 0x01, 0x00, 0x63, 0x34, 0x02, 0x00, 0x02, 0x24,
81150xE8, 0xFF, 0xBD, 0x27, 0x00, 0x00, 0x62, 0xA0, 0x10, 0x00, 0xBF, 0xAF,
81160x85, 0x2B, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x21, 0x20, 0x00, 0x00,
81170x01, 0x00, 0x05, 0x24, 0xB9, 0x20, 0x00, 0x0C, 0x00, 0x50, 0x06, 0x24,
81180x1F, 0x00, 0x06, 0x3C, 0x10, 0x00, 0xBF, 0x8F, 0x00, 0x40, 0xC6, 0x34,
81190x03, 0x00, 0x04, 0x24, 0x01, 0x00, 0x05, 0x24, 0xB9, 0x20, 0x00, 0x08,
81200x18, 0x00, 0xBD, 0x27, 0x25, 0xB0, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C,
81210xC8, 0xFF, 0xBD, 0x27, 0x18, 0x03, 0x64, 0x34, 0x28, 0x94, 0x42, 0x24,
81220x00, 0x00, 0x82, 0xAC, 0x30, 0x00, 0xBE, 0xAF, 0x2C, 0x00, 0xB7, 0xAF,
81230x28, 0x00, 0xB6, 0xAF, 0x24, 0x00, 0xB5, 0xAF, 0x20, 0x00, 0xB4, 0xAF,
81240x1C, 0x00, 0xB3, 0xAF, 0x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF,
81250x34, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xB0, 0xAF, 0xB6, 0x00, 0x63, 0x34,
81260x00, 0x00, 0x64, 0x90, 0x02, 0x80, 0x03, 0x3C, 0x60, 0x1B, 0x62, 0x24,
81270x48, 0x01, 0x03, 0x24, 0x70, 0x37, 0x43, 0xAC, 0x6C, 0x37, 0x43, 0xAC,
81280xAB, 0x1B, 0x44, 0xA0, 0xC6, 0x3D, 0x40, 0xA0, 0x66, 0x37, 0x40, 0xA0,
81290x84, 0x6C, 0x00, 0x0C, 0x21, 0x98, 0x40, 0x00, 0xFD, 0xFF, 0x02, 0x3C,
81300xFB, 0xFF, 0x03, 0x3C, 0x21, 0xA0, 0x60, 0x02, 0xFF, 0xFF, 0x55, 0x34,
81310xFF, 0xFF, 0x76, 0x34, 0x21, 0x88, 0x00, 0x00, 0x02, 0x80, 0x1E, 0x3C,
81320x02, 0x80, 0x17, 0x3C, 0x21, 0x90, 0x60, 0x02, 0x40, 0x10, 0x11, 0x00,
81330x21, 0x10, 0x51, 0x00, 0x00, 0x11, 0x02, 0x00, 0x21, 0x10, 0x53, 0x00,
81340xD4, 0x1D, 0x42, 0x24, 0x07, 0x00, 0x03, 0x24, 0xFF, 0xFF, 0x63, 0x24,
81350x00, 0x00, 0x40, 0xA4, 0xFD, 0xFF, 0x61, 0x04, 0x02, 0x00, 0x42, 0x24,
81360xC0, 0x80, 0x11, 0x00, 0x34, 0x3F, 0xC4, 0x27, 0x21, 0x20, 0x04, 0x02,
81370x21, 0x28, 0x00, 0x00, 0x02, 0x00, 0x06, 0x24, 0xE4, 0x1D, 0x40, 0xA6,
81380xEC, 0x54, 0x00, 0x0C, 0xE6, 0x1D, 0x40, 0xA2, 0x21, 0x20, 0x13, 0x02,
81390xD4, 0x23, 0x83, 0x8C, 0xD2, 0x5C, 0xE7, 0x92, 0xBF, 0xFF, 0x02, 0x24,
81400x24, 0x28, 0x62, 0x00, 0x01, 0x00, 0x02, 0x24, 0x63, 0x00, 0xE2, 0x10,
81410x80, 0x07, 0xA6, 0x34, 0xFF, 0xF7, 0x03, 0x24, 0x24, 0x10, 0xC3, 0x00,
81420xFF, 0xEF, 0x03, 0x24, 0x24, 0x10, 0x43, 0x00, 0xD4, 0x23, 0x82, 0xAC,
81430x21, 0x30, 0x14, 0x02, 0xD4, 0x23, 0xC4, 0x8C, 0xE7, 0xFF, 0x02, 0x3C,
81440xFF, 0xFF, 0x42, 0x34, 0x24, 0x20, 0x95, 0x00, 0x24, 0x20, 0x96, 0x00,
81450xFF, 0xFD, 0x03, 0x3C, 0x24, 0x20, 0x82, 0x00, 0xFF, 0xFF, 0x63, 0x34,
81460xFF, 0xFB, 0x02, 0x3C, 0x24, 0x20, 0x83, 0x00, 0xD8, 0x23, 0xC5, 0x8C,
81470xFF, 0xFF, 0x42, 0x34, 0xFF, 0xE7, 0x03, 0x3C, 0x24, 0x20, 0x82, 0x00,
81480xFF, 0xFF, 0x63, 0x34, 0xFF, 0xFF, 0x02, 0x3C, 0x24, 0x20, 0x83, 0x00,
81490xFF, 0x7F, 0x42, 0x34, 0xC0, 0xFF, 0x03, 0x24, 0x24, 0x28, 0xA2, 0x00,
81500x24, 0x20, 0x83, 0x00, 0x1F, 0x00, 0x02, 0x3C, 0x01, 0x00, 0x31, 0x26,
81510x25, 0x28, 0xA2, 0x00, 0x08, 0x00, 0x84, 0x34, 0x20, 0x00, 0x22, 0x2A,
81520xD4, 0x23, 0xC4, 0xAC, 0xD8, 0x23, 0xC5, 0xAC, 0xC3, 0xFF, 0x40, 0x14,
81530x30, 0x00, 0x52, 0x26, 0x25, 0xB0, 0x02, 0x3C, 0x10, 0x00, 0x03, 0x24,
81540xB0, 0x03, 0x42, 0x34, 0x02, 0x80, 0x04, 0x3C, 0x00, 0x00, 0x43, 0xAC,
81550x88, 0x1E, 0x84, 0x24, 0x21, 0x28, 0x00, 0x00, 0xEC, 0x54, 0x00, 0x0C,
81560x20, 0x00, 0x06, 0x24, 0x02, 0x80, 0x02, 0x3C, 0xD1, 0x5C, 0x43, 0x90,
81570x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x60, 0x10, 0x02, 0x80, 0x03, 0x3C,
81580x60, 0x1B, 0x62, 0x24, 0x25, 0x03, 0x40, 0xA0, 0xC2, 0x6F, 0x00, 0x74,
81590x24, 0x03, 0x40, 0xA0, 0xD8, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
81600x47, 0x6C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xBF, 0x8F,
81610x30, 0x00, 0xBE, 0x8F, 0x2C, 0x00, 0xB7, 0x8F, 0x28, 0x00, 0xB6, 0x8F,
81620x24, 0x00, 0xB5, 0x8F, 0x20, 0x00, 0xB4, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
81630x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
81640x02, 0x80, 0x09, 0x3C, 0x02, 0x80, 0x0A, 0x3C, 0x02, 0x80, 0x0B, 0x3C,
81650x02, 0x80, 0x0C, 0x3C, 0x02, 0x80, 0x0D, 0x3C, 0x02, 0x80, 0x0E, 0x3C,
81660x02, 0x80, 0x0F, 0x3C, 0x88, 0x54, 0x22, 0x25, 0x90, 0x54, 0x43, 0x25,
81670x98, 0x54, 0x64, 0x25, 0xA0, 0x54, 0x85, 0x25, 0xA8, 0x54, 0xA6, 0x25,
81680xB0, 0x54, 0xC7, 0x25, 0xB8, 0x54, 0xE8, 0x25, 0x38, 0x00, 0xBD, 0x27,
81690x04, 0x00, 0x42, 0xAC, 0x88, 0x54, 0x22, 0xAD, 0x04, 0x00, 0x63, 0xAC,
81700x90, 0x54, 0x43, 0xAD, 0x04, 0x00, 0x84, 0xAC, 0x98, 0x54, 0x64, 0xAD,
81710x04, 0x00, 0xA5, 0xAC, 0xA0, 0x54, 0x85, 0xAD, 0x04, 0x00, 0xC6, 0xAC,
81720xA8, 0x54, 0xA6, 0xAD, 0x04, 0x00, 0xE7, 0xAC, 0xB0, 0x54, 0xC7, 0xAD,
81730xB8, 0x54, 0xE8, 0xAD, 0x08, 0x00, 0xE0, 0x03, 0x04, 0x00, 0x08, 0xAD,
81740x02, 0x80, 0x02, 0x3C, 0xD3, 0x5C, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00,
81750x9C, 0xFF, 0x67, 0x14, 0x80, 0x0F, 0xA2, 0x34, 0xFF, 0xF7, 0x03, 0x24,
81760x24, 0x10, 0xC3, 0x00, 0x4D, 0x65, 0x00, 0x08, 0x00, 0x10, 0x42, 0x34,
81770x7A, 0x6D, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x6F, 0x00, 0x74,
81780x24, 0x39, 0x80, 0xAE, 0x26, 0x70, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00,
81790x02, 0x80, 0x03, 0x3C, 0xC6, 0x5C, 0x64, 0x90, 0x92, 0x00, 0x02, 0x24,
81800x03, 0x00, 0x82, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x74,
81810x00, 0x00, 0x00, 0x00, 0xC1, 0x70, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00,
81820x7B, 0x65, 0x00, 0x08, 0x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x03, 0x3C,
81830x25, 0xB0, 0x02, 0x3C, 0xC8, 0xFF, 0xBD, 0x27, 0x14, 0x97, 0x63, 0x24,
81840x18, 0x03, 0x42, 0x34, 0x18, 0x00, 0xB0, 0xAF, 0x34, 0x00, 0xBF, 0xAF,
81850x30, 0x00, 0xB6, 0xAF, 0x2C, 0x00, 0xB5, 0xAF, 0x28, 0x00, 0xB4, 0xAF,
81860x24, 0x00, 0xB3, 0xAF, 0x20, 0x00, 0xB2, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
81870x00, 0x00, 0x43, 0xAC, 0x21, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x26,
81880xFF, 0xFF, 0x50, 0x30, 0x64, 0x00, 0x03, 0x2E, 0xFD, 0xFF, 0x60, 0x14,
81890x01, 0x00, 0x02, 0x26, 0x64, 0x40, 0x00, 0x0C, 0x02, 0x80, 0x14, 0x3C,
81900x02, 0x80, 0x03, 0x3C, 0xC3, 0x5C, 0x68, 0x90, 0x02, 0x80, 0x02, 0x3C,
81910x02, 0x80, 0x03, 0x3C, 0xC0, 0x5C, 0x4B, 0x94, 0xDB, 0x5C, 0x6A, 0x90,
81920x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0xE2, 0x5C, 0x67, 0x90,
81930xD0, 0x5C, 0x49, 0x90, 0xC2, 0x5C, 0x83, 0x92, 0x02, 0x80, 0x0C, 0x3C,
81940x02, 0x80, 0x02, 0x3C, 0xDD, 0x5C, 0x46, 0x90, 0xE0, 0x5C, 0x85, 0x91,
81950x25, 0xB0, 0x04, 0x3C, 0xB0, 0x03, 0x82, 0x34, 0x00, 0x00, 0x4B, 0xAC,
81960x00, 0x00, 0x48, 0xAC, 0x00, 0x00, 0x49, 0xAC, 0x00, 0x00, 0x43, 0xAC,
81970x02, 0x80, 0x03, 0x3C, 0x00, 0x00, 0x4A, 0xAC, 0x0A, 0x00, 0x88, 0x34,
81980x00, 0x00, 0x46, 0xAC, 0x00, 0x00, 0x45, 0xAC, 0x00, 0x00, 0x47, 0xAC,
81990x0C, 0x5D, 0x60, 0xA4, 0x00, 0x00, 0x06, 0x91, 0x02, 0x80, 0x02, 0x3C,
82000x0B, 0x00, 0x04, 0x24, 0x02, 0x80, 0x13, 0x3C, 0xCD, 0x5C, 0x44, 0xA0,
82010x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x65, 0x26, 0x00, 0x70, 0x03, 0x24,
82020xF0, 0x5C, 0x40, 0xA0, 0xF0, 0xFF, 0x02, 0x24, 0x01, 0x00, 0x07, 0x24,
82030x02, 0x80, 0x16, 0x3C, 0xAC, 0x1B, 0xA3, 0xA4, 0xAA, 0x1B, 0xA2, 0xA0,
82040xFF, 0x07, 0x03, 0x24, 0xFF, 0xFF, 0x02, 0x24, 0x20, 0x00, 0xC6, 0x30,
82050xE0, 0x5C, 0x87, 0xA1, 0xA8, 0x1B, 0xA7, 0xA0, 0xAE, 0x1B, 0xA3, 0xA4,
82060x48, 0xF5, 0xC2, 0xA2, 0x9A, 0x00, 0xC0, 0x10, 0xB0, 0x1B, 0xA0, 0xA4,
82070x00, 0x00, 0x02, 0x91, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x42, 0x30,
82080x0B, 0x01, 0x40, 0x14, 0x02, 0x80, 0x15, 0x3C, 0x21, 0x80, 0x00, 0x00,
82090x21, 0x88, 0x00, 0x00, 0x98, 0xF3, 0xB2, 0x26, 0xFF, 0x00, 0x24, 0x32,
82100xCF, 0x59, 0x00, 0x0C, 0x21, 0x28, 0x12, 0x02, 0x08, 0x00, 0x03, 0x26,
82110xFF, 0xFF, 0x70, 0x30, 0x01, 0x00, 0x22, 0x26, 0x80, 0x00, 0x03, 0x2E,
82120xF8, 0xFF, 0x60, 0x14, 0xFF, 0xFF, 0x51, 0x30, 0xC2, 0x5C, 0x83, 0x92,
82130x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x30, 0xCA, 0x00, 0x40, 0x14,
82140x04, 0x00, 0x62, 0x30, 0x83, 0x00, 0x40, 0x10, 0x25, 0xB0, 0x03, 0x3C,
82150x25, 0xB0, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0x50, 0x00, 0x84, 0x34,
82160xE7, 0xF3, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24,
82170x98, 0xF3, 0xA3, 0x26, 0x7B, 0x00, 0x67, 0x90, 0x00, 0x00, 0x00, 0x00,
82180x02, 0x00, 0xE2, 0x2C, 0x04, 0x00, 0x40, 0x14, 0x02, 0x00, 0x0B, 0x24,
82190x79, 0x00, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4B, 0x30,
82200x04, 0x00, 0xE2, 0x2C, 0xEC, 0x00, 0x40, 0x10, 0x98, 0xF3, 0xA2, 0x26,
82210x60, 0x1B, 0x62, 0x8E, 0xBF, 0xFF, 0x03, 0x24, 0x02, 0x80, 0x12, 0x3C,
82220x24, 0x10, 0x43, 0x00, 0x02, 0x80, 0x03, 0x3C, 0x4A, 0xF5, 0x60, 0xA0,
82230x60, 0x1B, 0x62, 0xAE, 0x02, 0x80, 0x02, 0x3C, 0xCF, 0x5C, 0x43, 0x90,
82240x01, 0x00, 0x02, 0x24, 0x02, 0x00, 0x62, 0x10, 0xFC, 0xFF, 0x08, 0x24,
82250x21, 0x40, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
82260x98, 0xF3, 0x4A, 0x24, 0x60, 0x1B, 0x69, 0x24, 0x21, 0x60, 0x00, 0x00,
82270x21, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x26, 0x21, 0x30, 0x30, 0x01,
82280x03, 0x00, 0x03, 0x2E, 0x08, 0x00, 0x04, 0x2E, 0xFF, 0xFF, 0x50, 0x30,
82290x0E, 0x00, 0x07, 0x2E, 0x04, 0x00, 0x60, 0x14, 0x21, 0x88, 0x00, 0x00,
82300x01, 0x00, 0x11, 0x24, 0x02, 0x00, 0x02, 0x24, 0x0A, 0x88, 0x44, 0x00,
82310x21, 0x10, 0x51, 0x01, 0x61, 0x00, 0x43, 0x90, 0x55, 0x00, 0x44, 0x90,
82320x5B, 0x00, 0x45, 0x90, 0x21, 0x18, 0x03, 0x01, 0x21, 0x20, 0x04, 0x01,
82330x21, 0x28, 0x05, 0x01, 0x9C, 0x1D, 0xC3, 0xA0, 0x64, 0x1D, 0xC4, 0xA0,
82340xEB, 0xFF, 0xE0, 0x14, 0x80, 0x1D, 0xC5, 0xA0, 0x01, 0x00, 0x8C, 0x25,
82350x02, 0x00, 0x82, 0x2D, 0x0E, 0x00, 0x29, 0x25, 0xE5, 0xFF, 0x40, 0x14,
82360x03, 0x00, 0x4A, 0x25, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
82370x60, 0x1B, 0x47, 0x24, 0x98, 0xF3, 0x66, 0x24, 0x21, 0x80, 0x00, 0x00,
82380x03, 0x00, 0x02, 0x2E, 0x21, 0x20, 0x07, 0x02, 0xD1, 0x00, 0x40, 0x10,
82390x08, 0x00, 0x03, 0x2E, 0x71, 0x00, 0xC3, 0x90, 0x6E, 0x00, 0xC2, 0x90,
82400x00, 0x00, 0x00, 0x00, 0xC6, 0x1D, 0x82, 0xA0, 0xB8, 0x1D, 0x83, 0xA0,
82410x01, 0x00, 0x02, 0x26, 0xFF, 0xFF, 0x50, 0x30, 0x0E, 0x00, 0x03, 0x2E,
82420xF4, 0xFF, 0x60, 0x14, 0x03, 0x00, 0x02, 0x2E, 0x03, 0x00, 0x02, 0x24,
82430x51, 0x00, 0x62, 0x15, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
82440x98, 0xF3, 0x4E, 0x24, 0xC0, 0xD9, 0x6F, 0x24, 0x21, 0x60, 0x00, 0x00,
82450x21, 0x68, 0x00, 0x00, 0x21, 0x10, 0xAE, 0x01, 0x74, 0x00, 0x43, 0x90,
82460x21, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x6A, 0x30, 0x02, 0x49, 0x03, 0x00,
82470x21, 0x10, 0xB0, 0x01, 0x00, 0x11, 0x02, 0x00, 0x21, 0x58, 0x4F, 0x00,
82480x21, 0x38, 0x00, 0x00, 0x21, 0x40, 0x67, 0x01, 0x00, 0x00, 0x03, 0x91,
82490x00, 0x31, 0x09, 0x00, 0x01, 0x00, 0xE7, 0x24, 0x02, 0x11, 0x03, 0x00,
82500x00, 0x21, 0x02, 0x00, 0x0F, 0x00, 0x63, 0x30, 0x2B, 0x10, 0x49, 0x00,
82510x0A, 0x20, 0xC2, 0x00, 0x2B, 0x28, 0x6A, 0x00, 0x00, 0x00, 0xA5, 0x38,
82520x25, 0x18, 0x83, 0x00, 0xFF, 0xFF, 0xE7, 0x30, 0x25, 0x20, 0x8A, 0x00,
82530x0A, 0x18, 0x85, 0x00, 0x10, 0x00, 0xE2, 0x2C, 0xEF, 0xFF, 0x40, 0x14,
82540x00, 0x00, 0x03, 0xA1, 0x01, 0x00, 0x02, 0x26, 0xFF, 0xFF, 0x50, 0x30,
82550x03, 0x00, 0x03, 0x2E, 0xE7, 0xFF, 0x60, 0x14, 0x21, 0x10, 0xB0, 0x01,
82560x01, 0x00, 0x8C, 0x25, 0x02, 0x00, 0x82, 0x2D, 0xDD, 0xFF, 0x40, 0x14,
82570x03, 0x00, 0xAD, 0x25, 0xCC, 0x66, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
82580x25, 0xB0, 0x03, 0x3C, 0x4C, 0x87, 0x02, 0x3C, 0x54, 0x00, 0x65, 0x34,
82590x00, 0xE0, 0x42, 0x34, 0x50, 0x00, 0x63, 0x34, 0x00, 0x00, 0x62, 0xAC,
82600x12, 0x01, 0x04, 0x24, 0x02, 0x80, 0x02, 0x3C, 0x00, 0x00, 0xA4, 0xAC,
82610x60, 0x1B, 0x46, 0x24, 0x21, 0x60, 0x00, 0x00, 0x10, 0x00, 0x05, 0x24,
82620x21, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x26, 0x21, 0x18, 0xD0, 0x00,
82630xFF, 0xFF, 0x50, 0x30, 0x0E, 0x00, 0x04, 0x2E, 0x80, 0x1D, 0x65, 0xA0,
82640x64, 0x1D, 0x65, 0xA0, 0xF9, 0xFF, 0x80, 0x14, 0x9C, 0x1D, 0x65, 0xA0,
82650x01, 0x00, 0x8C, 0x25, 0x02, 0x00, 0x82, 0x2D, 0xF4, 0xFF, 0x40, 0x14,
82660x0E, 0x00, 0xC6, 0x24, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x46, 0x24,
82670x21, 0x80, 0x00, 0x00, 0x04, 0x00, 0x05, 0x24, 0x01, 0x00, 0x02, 0x26,
82680x21, 0x18, 0x06, 0x02, 0xFF, 0xFF, 0x50, 0x30, 0x0E, 0x00, 0x04, 0x2E,
82690xC6, 0x1D, 0x60, 0xA0, 0xFA, 0xFF, 0x80, 0x14, 0xB8, 0x1D, 0x65, 0xA0,
82700x02, 0x80, 0x12, 0x3C, 0xC6, 0x5C, 0x43, 0x92, 0x01, 0x00, 0x04, 0x24,
82710x02, 0x80, 0x02, 0x3C, 0x54, 0x59, 0x00, 0x0C, 0x4B, 0xF5, 0x43, 0xA0,
82720x48, 0xF5, 0xC5, 0x26, 0xFF, 0x58, 0x00, 0x0C, 0xFA, 0x01, 0x04, 0x24,
82730x54, 0x59, 0x00, 0x0C, 0x21, 0x20, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
82740x25, 0xB0, 0x05, 0x3C, 0x48, 0x37, 0x84, 0x24, 0x50, 0x00, 0xA5, 0x34,
82750xF4, 0x54, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x24, 0x60, 0x1B, 0x65, 0x26,
82760x01, 0x00, 0x02, 0x24, 0x06, 0x00, 0x03, 0x24, 0x05, 0x00, 0x04, 0x24,
82770x33, 0x1C, 0xA2, 0xA0, 0x6F, 0x58, 0x00, 0x0C, 0xC4, 0x3D, 0xA3, 0xA0,
82780x34, 0x00, 0xBF, 0x8F, 0x30, 0x00, 0xB6, 0x8F, 0x2C, 0x00, 0xB5, 0x8F,
82790x28, 0x00, 0xB4, 0x8F, 0x24, 0x00, 0xB3, 0x8F, 0x20, 0x00, 0xB2, 0x8F,
82800x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
82810x38, 0x00, 0xBD, 0x27, 0x25, 0xB0, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
82820x50, 0x00, 0x84, 0x34, 0xAA, 0xF3, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C,
82830x06, 0x00, 0x06, 0x24, 0x98, 0xF3, 0xA2, 0x92, 0x98, 0xF3, 0xA5, 0x26,
82840x01, 0x00, 0xA4, 0x90, 0x21, 0x18, 0x40, 0x00, 0x10, 0x00, 0xA2, 0xA3,
82850x29, 0x00, 0x02, 0x24, 0x11, 0x00, 0xA4, 0xA3, 0x50, 0x00, 0xA7, 0x90,
82860x4F, 0x00, 0x62, 0x10, 0x02, 0x80, 0x12, 0x3C, 0x98, 0xF3, 0xA6, 0x26,
82870x68, 0x00, 0xC2, 0x90, 0x02, 0x80, 0x03, 0x3C, 0x04, 0x00, 0xE4, 0x2C,
82880x1F, 0x00, 0x42, 0x30, 0x34, 0x00, 0x80, 0x14, 0x49, 0xF5, 0x62, 0xA0,
82890x7A, 0x00, 0xC4, 0x90, 0x60, 0x1B, 0x65, 0x8E, 0x79, 0x00, 0xC6, 0x90,
82900x01, 0x00, 0x83, 0x30, 0xBF, 0xFF, 0x02, 0x24, 0x24, 0x28, 0xA2, 0x00,
82910x80, 0x19, 0x03, 0x00, 0x04, 0x00, 0x84, 0x30, 0x25, 0x28, 0xA3, 0x00,
82920x83, 0x20, 0x04, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x03, 0x00, 0xCB, 0x30,
82930x4A, 0xF5, 0x44, 0xA0, 0x60, 0x1B, 0x65, 0xAE, 0x06, 0x00, 0xE2, 0x2C,
82940x2C, 0xFF, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x98, 0xF3, 0xA3, 0x26,
82950x69, 0x00, 0x62, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x30,
82960x26, 0xFF, 0x40, 0x14, 0x02, 0x80, 0x02, 0x3C, 0x45, 0x66, 0x00, 0x08,
82970x21, 0x40, 0x00, 0x00, 0x21, 0x20, 0x00, 0x00, 0x80, 0x00, 0x05, 0x24,
82980xC1, 0x58, 0x00, 0x0C, 0x98, 0xF3, 0xA6, 0x26, 0x1F, 0x66, 0x00, 0x08,
82990x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x43, 0x90, 0x69, 0x00, 0x46, 0x90,
83000x7D, 0x00, 0x44, 0x90, 0x60, 0x1B, 0x65, 0x8E, 0xBF, 0xFF, 0x02, 0x24,
83010x01, 0x00, 0x63, 0x30, 0x24, 0x28, 0xA2, 0x00, 0x01, 0x00, 0xC6, 0x30,
83020x04, 0x00, 0x84, 0x30, 0x80, 0x19, 0x03, 0x00, 0x25, 0x28, 0xA3, 0x00,
83030x83, 0x20, 0x04, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x01, 0x00, 0xC6, 0x2C,
83040x4A, 0xF5, 0x44, 0xA0, 0x60, 0x1B, 0x65, 0xAE, 0x0B, 0xFF, 0xC0, 0x10,
83050x02, 0x80, 0x12, 0x3C, 0x45, 0x66, 0x00, 0x08, 0x21, 0x40, 0x00, 0x00,
83060x60, 0x1B, 0x62, 0x8E, 0xBF, 0xFF, 0x03, 0x24, 0x02, 0x80, 0x04, 0x3C,
83070x24, 0x10, 0x43, 0x00, 0x02, 0x00, 0x0B, 0x24, 0x4A, 0xF5, 0x80, 0xA0,
83080x12, 0x67, 0x00, 0x08, 0x60, 0x1B, 0x62, 0xAE, 0x21, 0x28, 0x07, 0x02,
83090x06, 0x00, 0x60, 0x10, 0x21, 0x20, 0xA0, 0x00, 0x67, 0x00, 0xC3, 0x90,
83100x6F, 0x00, 0xC2, 0x90, 0xB8, 0x1D, 0xA3, 0xA0, 0x74, 0x66, 0x00, 0x08,
83110xC6, 0x1D, 0xA2, 0xA0, 0x72, 0x00, 0xC3, 0x90, 0x70, 0x00, 0xC2, 0x90,
83120x73, 0x66, 0x00, 0x08, 0xC6, 0x1D, 0x82, 0xA0, 0xFF, 0x00, 0x83, 0x30,
83130x81, 0x00, 0x02, 0x24, 0xB0, 0xFF, 0x62, 0x14, 0x98, 0xF3, 0xA6, 0x26,
83140x54, 0x00, 0xA3, 0x90, 0x01, 0x00, 0x02, 0x24, 0x09, 0x00, 0x62, 0x10,
83150x02, 0x00, 0x02, 0x24, 0x04, 0x00, 0x62, 0x10, 0x11, 0x00, 0x02, 0x24,
83160x02, 0x80, 0x12, 0x3C, 0xFE, 0x66, 0x00, 0x08, 0xC6, 0x5C, 0x42, 0xA2,
83170x22, 0x00, 0x02, 0x24, 0xFD, 0x66, 0x00, 0x08, 0xC6, 0x5C, 0x42, 0xA2,
83180x02, 0x80, 0x12, 0x3C, 0x12, 0x00, 0x02, 0x24, 0xFD, 0x66, 0x00, 0x08,
83190xC6, 0x5C, 0x42, 0xA2, 0xD8, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB1, 0xAF,
83200x02, 0x80, 0x02, 0x3C, 0x25, 0xB0, 0x11, 0x3C, 0x18, 0x03, 0x23, 0x36,
83210x7C, 0x9D, 0x42, 0x24, 0x20, 0x00, 0xB2, 0xAF, 0x02, 0x80, 0x12, 0x3C,
83220x00, 0x00, 0x62, 0xAC, 0x18, 0x00, 0xB0, 0xAF, 0x24, 0x00, 0xBF, 0xAF,
83230xC5, 0x65, 0x00, 0x0C, 0x60, 0x1B, 0x50, 0x26, 0x08, 0x68, 0x00, 0x0C,
83240x00, 0x00, 0x00, 0x00, 0xA3, 0x6A, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
83250x87, 0x6B, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x6D, 0x00, 0x74,
83260x00, 0x00, 0x00, 0x00, 0xEF, 0x6A, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
83270xC4, 0x3D, 0x04, 0x92, 0x38, 0x0D, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00,
83280xC4, 0x3D, 0x04, 0x92, 0x75, 0x0D, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
83290xCB, 0x64, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x82, 0x40, 0x00, 0x0C,
83300x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x23, 0x36, 0x00, 0x00, 0x62, 0x94,
83310x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x42, 0x34, 0x00, 0x00, 0x62, 0xA4,
83320x0A, 0x65, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x00, 0x0C,
83330x00, 0x00, 0x00, 0x00, 0xF7, 0x64, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
83340x53, 0x6B, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6B, 0x00, 0x0C,
83350x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x3C, 0x68, 0x61, 0x84, 0x24,
83360x70, 0x6B, 0x00, 0x0C, 0x01, 0x00, 0x05, 0x24, 0x00, 0x80, 0x04, 0x3C,
83370xD0, 0x67, 0x84, 0x24, 0x70, 0x6B, 0x00, 0x0C, 0x02, 0x00, 0x05, 0x24,
83380x00, 0x80, 0x04, 0x3C, 0x39, 0x6F, 0x84, 0x24, 0x70, 0x6B, 0x00, 0x0C,
83390x04, 0x00, 0x05, 0x24, 0x44, 0x5C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
83400x01, 0x80, 0x04, 0x3C, 0x6C, 0x83, 0x84, 0x24, 0x70, 0x6B, 0x00, 0x0C,
83410x03, 0x00, 0x05, 0x24, 0x02, 0x80, 0x03, 0x3C, 0xD0, 0x5C, 0x63, 0x90,
83420x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x60, 0x10, 0x43, 0x00, 0x22, 0x36,
83430x07, 0x00, 0x02, 0x24, 0x0C, 0x00, 0x62, 0x10, 0x03, 0x00, 0x02, 0x24,
83440x25, 0xB0, 0x04, 0x3C, 0x43, 0x00, 0x85, 0x34, 0x10, 0x02, 0x86, 0x34,
83450x10, 0x00, 0x03, 0x24, 0x00, 0x00, 0xA2, 0xA0, 0xD8, 0x00, 0x84, 0x34,
83460x00, 0x00, 0xC3, 0xA0, 0x00, 0x00, 0x82, 0x90, 0x80, 0xFF, 0x03, 0x24,
83470x25, 0x10, 0x43, 0x00, 0x00, 0x00, 0x82, 0xA0, 0xDF, 0x64, 0x00, 0x0C,
83480x25, 0xB0, 0x10, 0x3C, 0x44, 0x00, 0x03, 0x36, 0x00, 0x00, 0x62, 0x94,
83490x02, 0x80, 0x04, 0x3C, 0x18, 0xE5, 0x84, 0x24, 0xC0, 0x00, 0x42, 0x34,
83500x00, 0x00, 0x62, 0xA4, 0x13, 0x58, 0x00, 0x0C, 0xF2, 0x00, 0x05, 0x24,
83510x02, 0x80, 0x02, 0x3C, 0xC3, 0x5C, 0x45, 0x90, 0x02, 0x80, 0x04, 0x3C,
83520x13, 0x58, 0x00, 0x0C, 0x5C, 0xE5, 0x84, 0x24, 0x02, 0x80, 0x02, 0x3C,
83530x02, 0x80, 0x03, 0x3C, 0xC2, 0x5C, 0x45, 0x90, 0xC7, 0x5C, 0x66, 0x90,
83540x02, 0x80, 0x04, 0x3C, 0x13, 0x58, 0x00, 0x0C, 0x6C, 0xE5, 0x84, 0x24,
83550x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0xC6, 0x5C, 0x45, 0x90,
83560x48, 0xF5, 0x66, 0x90, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
83570xCF, 0x5C, 0x47, 0x90, 0x4A, 0xF5, 0x62, 0x90, 0x02, 0x80, 0x04, 0x3C,
83580x80, 0xE5, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C, 0x10, 0x00, 0xA2, 0xAF,
83590xFA, 0x5B, 0x00, 0x0C, 0x80, 0x0C, 0x04, 0x36, 0x02, 0x80, 0x03, 0x3C,
83600x02, 0x80, 0x04, 0x3C, 0xD1, 0x5C, 0x65, 0x90, 0xCE, 0x5C, 0x86, 0x90,
83610x02, 0x80, 0x04, 0x3C, 0x21, 0x38, 0x40, 0x00, 0x13, 0x58, 0x00, 0x0C,
83620x9C, 0xE5, 0x84, 0x24, 0x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C,
83630xD3, 0x5C, 0x66, 0x90, 0xD2, 0x5C, 0x45, 0x90, 0x02, 0x80, 0x04, 0x3C,
83640x13, 0x58, 0x00, 0x0C, 0xB8, 0xE5, 0x84, 0x24, 0x60, 0x1B, 0x42, 0x26,
83650x54, 0x41, 0x46, 0x8C, 0x58, 0x41, 0x45, 0x8C, 0x02, 0x80, 0x04, 0x3C,
83660x13, 0x58, 0x00, 0x0C, 0xCC, 0xE5, 0x84, 0x24, 0x60, 0x1B, 0x46, 0x8E,
83670x02, 0x80, 0x02, 0x3C, 0x49, 0xF5, 0x45, 0x90, 0x82, 0x31, 0x06, 0x00,
83680x02, 0x80, 0x04, 0x3C, 0xEC, 0xE5, 0x84, 0x24, 0x13, 0x58, 0x00, 0x0C,
83690x01, 0x00, 0xC6, 0x30, 0x02, 0x80, 0x04, 0x3C, 0x08, 0x00, 0x84, 0x24,
83700x21, 0x28, 0x00, 0x00, 0x21, 0x30, 0x00, 0x00, 0x76, 0x39, 0x00, 0x0C,
83710x21, 0x38, 0x00, 0x00, 0xF5, 0x64, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
83720x24, 0x00, 0xBF, 0x8F, 0x20, 0x00, 0xB2, 0x8F, 0x1C, 0x00, 0xB1, 0x8F,
83730x18, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03,
83740x28, 0x00, 0xBD, 0x27, 0xD8, 0x00, 0x24, 0x36, 0x00, 0x00, 0x40, 0xA0,
83750xB0, 0x67, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0xBD, 0x27,
83760x24, 0x00, 0xB1, 0xAF, 0x44, 0x00, 0xBF, 0xAF, 0x40, 0x00, 0xBE, 0xAF,
83770x3C, 0x00, 0xB7, 0xAF, 0x38, 0x00, 0xB6, 0xAF, 0x34, 0x00, 0xB5, 0xAF,
83780x30, 0x00, 0xB4, 0xAF, 0x2C, 0x00, 0xB3, 0xAF, 0x28, 0x00, 0xB2, 0xAF,
83790x20, 0x00, 0xB0, 0xAF, 0x02, 0x80, 0x02, 0x3C, 0xC2, 0x5C, 0x42, 0x90,
83800x25, 0xB0, 0x11, 0x3C, 0x58, 0x00, 0x25, 0x36, 0x10, 0x00, 0xA2, 0xAF,
83810x4C, 0x81, 0x02, 0x3C, 0x00, 0xE0, 0x42, 0x34, 0x00, 0x00, 0xA2, 0xAC,
83820xFF, 0xFF, 0x04, 0x24, 0x96, 0x01, 0x03, 0x24, 0x28, 0x28, 0x02, 0x24,
83830x5C, 0x00, 0x26, 0x36, 0x60, 0x00, 0x27, 0x36, 0x64, 0x00, 0x28, 0x36,
83840x8A, 0x00, 0x29, 0x36, 0x00, 0x00, 0xC3, 0xAC, 0x00, 0x00, 0xE4, 0xAC,
83850x00, 0x00, 0x04, 0xAD, 0x00, 0x00, 0x22, 0xA5, 0x0E, 0x0E, 0x02, 0x3C,
83860x09, 0x00, 0x03, 0x24, 0x0A, 0x0A, 0x42, 0x34, 0x89, 0x00, 0x2A, 0x36,
83870x8C, 0x00, 0x2B, 0x36, 0x00, 0x00, 0x43, 0xA1, 0x90, 0x00, 0x2C, 0x36,
83880x00, 0x00, 0x62, 0xAD, 0x13, 0x00, 0x03, 0x24, 0x40, 0x00, 0x02, 0x24,
83890x91, 0x00, 0x2D, 0x36, 0x00, 0x00, 0x83, 0xA1, 0x92, 0x00, 0x2E, 0x36,
83900x00, 0x00, 0xA2, 0xA1, 0x3A, 0x01, 0x03, 0x24, 0x21, 0x00, 0x02, 0x24,
83910xB5, 0x00, 0x2F, 0x36, 0x00, 0x00, 0xC3, 0xA5, 0x00, 0x00, 0xE2, 0xA1,
83920x10, 0x00, 0xA2, 0x8F, 0x12, 0x00, 0x03, 0x24, 0x87, 0x01, 0x43, 0x10,
83930x07, 0x07, 0x02, 0x3C, 0x07, 0x07, 0x42, 0x34, 0xA0, 0x00, 0x24, 0x36,
83940x00, 0x00, 0x82, 0xAC, 0xA4, 0x00, 0x25, 0x36, 0x00, 0x07, 0x03, 0x24,
83950x00, 0xC0, 0x02, 0x3C, 0xA8, 0x00, 0x26, 0x36, 0x00, 0x00, 0xA3, 0xAC,
83960x00, 0xC4, 0x42, 0x34, 0x02, 0x80, 0x03, 0x3C, 0x00, 0x00, 0xC2, 0xAC,
83970x60, 0x1B, 0x62, 0x24, 0xAC, 0x1B, 0x45, 0x94, 0xAE, 0x1B, 0x46, 0x94,
83980xAA, 0x1B, 0x42, 0x90, 0x02, 0x80, 0x03, 0x3C, 0x21, 0xB0, 0x07, 0x3C,
83990x14, 0x00, 0xA2, 0xA3, 0xD1, 0x5C, 0x63, 0x90, 0x20, 0xB0, 0x02, 0x3C,
84000xFF, 0xFF, 0x42, 0x34, 0x18, 0x00, 0xA3, 0xAF, 0x23, 0xB0, 0x03, 0x3C,
84010xFF, 0xFF, 0x63, 0x34, 0x24, 0xB0, 0x08, 0x3C, 0xFF, 0x1F, 0x04, 0x3C,
84020x25, 0xB0, 0x1E, 0x3C, 0xFF, 0xFF, 0x84, 0x34, 0x21, 0x38, 0xA7, 0x00,
84030x21, 0x40, 0xC8, 0x00, 0x21, 0x28, 0xA2, 0x00, 0x21, 0x30, 0xC3, 0x00,
84040x24, 0x40, 0x04, 0x01, 0x24, 0x28, 0xA4, 0x00, 0x24, 0x38, 0xE4, 0x00,
84050x24, 0x30, 0xC4, 0x00, 0x35, 0x00, 0x02, 0x24, 0x20, 0x00, 0xC4, 0x37,
84060x00, 0x00, 0x82, 0xA0, 0x22, 0x00, 0x03, 0x24, 0x09, 0x00, 0x02, 0x24,
84070x03, 0x05, 0xC9, 0x37, 0x60, 0x05, 0xCA, 0x37, 0xAC, 0x00, 0xCB, 0x37,
84080xF8, 0x00, 0xCC, 0x37, 0xB0, 0x00, 0xCD, 0x37, 0x08, 0x01, 0xCE, 0x37,
84090xD8, 0x00, 0xCF, 0x37, 0x00, 0x00, 0x23, 0xA1, 0x00, 0x00, 0x42, 0xA1,
84100x00, 0x00, 0x65, 0xAD, 0x00, 0x00, 0x87, 0xAD, 0x00, 0x00, 0xA6, 0xAD,
84110x00, 0x00, 0xC8, 0xAD, 0x00, 0x00, 0xE0, 0xA1, 0x14, 0x00, 0xA3, 0x93,
84120x25, 0xB0, 0x02, 0x3C, 0xB4, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0xA0,
84130xB6, 0x00, 0xD1, 0x37, 0x04, 0x00, 0x02, 0x24, 0x25, 0xB0, 0x03, 0x3C,
84140x00, 0x00, 0x22, 0xA2, 0xB9, 0x00, 0x63, 0x34, 0xFF, 0xFF, 0x02, 0x24,
84150x00, 0x00, 0x62, 0xA0, 0x25, 0xB0, 0x03, 0x3C, 0x0F, 0x00, 0x02, 0x24,
84160xBA, 0x00, 0x63, 0x34, 0x00, 0x00, 0x62, 0xA4, 0xDC, 0x00, 0xD4, 0x37,
84170xFF, 0xCF, 0x03, 0x24, 0x3F, 0x3F, 0x02, 0x24, 0x16, 0x01, 0xD5, 0x37,
84180x00, 0x00, 0x83, 0xAE, 0x00, 0x00, 0xA2, 0xA6, 0x2F, 0x00, 0x02, 0x3C,
84190x00, 0x10, 0x03, 0x24, 0x17, 0x32, 0x42, 0x34, 0x18, 0x01, 0xD6, 0x37,
84200x1A, 0x01, 0xD7, 0x37, 0xD0, 0x01, 0xD8, 0x37, 0x00, 0x00, 0xC0, 0xA6,
84210x00, 0x00, 0xE3, 0xA6, 0x00, 0x00, 0x02, 0xAF, 0x5E, 0x00, 0x03, 0x3C,
84220x25, 0xB0, 0x02, 0x3C, 0x17, 0x43, 0x63, 0x34, 0xD4, 0x01, 0x42, 0x34,
84230x00, 0x00, 0x43, 0xAC, 0x10, 0x00, 0x02, 0x3C, 0x20, 0x53, 0x42, 0x34,
84240xD8, 0x01, 0xDF, 0x37, 0x00, 0x00, 0xE2, 0xAF, 0x25, 0xB0, 0x02, 0x3C,
84250x44, 0xA4, 0x03, 0x34, 0xDC, 0x01, 0x42, 0x34, 0x00, 0x00, 0x43, 0xAC,
84260x25, 0xB0, 0x03, 0x3C, 0x1A, 0x06, 0x02, 0x24, 0xE0, 0x01, 0x63, 0x34,
84270x00, 0x00, 0x62, 0xA4, 0xC2, 0x00, 0x02, 0x3C, 0x30, 0x30, 0x03, 0x24,
84280x51, 0x10, 0x42, 0x34, 0xF4, 0x01, 0xD0, 0x37, 0xF8, 0x01, 0xD3, 0x37,
84290x00, 0x00, 0x03, 0xA6, 0x00, 0x02, 0xD2, 0x37, 0x00, 0x00, 0x62, 0xAE,
84300x26, 0x00, 0x03, 0x24, 0x03, 0x02, 0xD9, 0x37, 0x04, 0x00, 0x02, 0x24,
84310x00, 0x00, 0x43, 0xA6, 0x00, 0x00, 0x22, 0xA3, 0x18, 0x00, 0xA3, 0x8F,
84320x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x60, 0x14, 0x36, 0x02, 0xC2, 0x37,
84330x04, 0x00, 0x03, 0x24, 0x00, 0x00, 0x43, 0xA0, 0x02, 0x80, 0x0B, 0x3C,
84340xC6, 0x5C, 0x66, 0x91, 0x25, 0xB0, 0x09, 0x3C, 0x34, 0x02, 0x23, 0x35,
84350x80, 0x00, 0x02, 0x24, 0x00, 0x00, 0x62, 0xA4, 0x38, 0x02, 0x24, 0x35,
84360x37, 0x02, 0x25, 0x35, 0x07, 0x00, 0x02, 0x24, 0x22, 0x00, 0x03, 0x24,
84370x00, 0x00, 0x80, 0xA0, 0x00, 0x00, 0xA2, 0xA0, 0xE1, 0x00, 0xC3, 0x10,
84380x1B, 0x1B, 0x02, 0x3C, 0x13, 0x13, 0x02, 0x3C, 0x13, 0x13, 0x42, 0x34,
84390x60, 0x01, 0x23, 0x35, 0x64, 0x01, 0x24, 0x35, 0x68, 0x01, 0x25, 0x35,
84400x7C, 0x01, 0x2A, 0x35, 0x6C, 0x01, 0x26, 0x35, 0x70, 0x01, 0x27, 0x35,
84410x74, 0x01, 0x28, 0x35, 0x78, 0x01, 0x29, 0x35, 0x00, 0x00, 0x62, 0xAC,
84420x00, 0x00, 0x82, 0xAC, 0x00, 0x00, 0xA2, 0xAC, 0x00, 0x00, 0xC2, 0xAC,
84430x00, 0x00, 0xE2, 0xAC, 0x00, 0x00, 0x02, 0xAD, 0x00, 0x00, 0x22, 0xAD,
84440x00, 0x00, 0x42, 0xAD, 0xC6, 0x5C, 0x65, 0x91, 0x25, 0xB0, 0x0C, 0x3C,
84450x01, 0x00, 0x03, 0x3C, 0x80, 0x01, 0x82, 0x35, 0x08, 0x5F, 0x63, 0x34,
84460x22, 0x00, 0x04, 0x24, 0x00, 0x00, 0x43, 0xAC, 0xE0, 0x00, 0xA4, 0x10,
84470x0F, 0x1F, 0x02, 0x3C, 0x92, 0x00, 0x02, 0x24, 0xDD, 0x00, 0xA2, 0x10,
84480x0F, 0x1F, 0x02, 0x3C, 0x0F, 0x10, 0x02, 0x3C, 0x00, 0xF0, 0x4F, 0x34,
84490xF7, 0x01, 0x91, 0x35, 0x15, 0xF0, 0x4D, 0x34, 0x77, 0x00, 0x0E, 0x24,
84500x84, 0x01, 0x87, 0x35, 0x88, 0x01, 0x88, 0x35, 0x10, 0xF0, 0x44, 0x34,
84510x8C, 0x01, 0x85, 0x35, 0x05, 0xF0, 0x42, 0x34, 0x00, 0x00, 0xED, 0xAC,
84520x90, 0x01, 0x83, 0x35, 0x00, 0x00, 0x04, 0xAD, 0x94, 0x01, 0x86, 0x35,
84530x00, 0x00, 0xA2, 0xAC, 0xF5, 0x0F, 0x02, 0x24, 0x00, 0x00, 0x6F, 0xAC,
84540x98, 0x01, 0x89, 0x35, 0x00, 0x00, 0xC2, 0xAC, 0x9C, 0x01, 0x8A, 0x35,
84550xA0, 0x01, 0x8B, 0x35, 0xF0, 0x0F, 0x03, 0x24, 0xF6, 0x01, 0x8C, 0x35,
84560x0D, 0x00, 0x02, 0x24, 0x00, 0x00, 0x23, 0xAD, 0x00, 0x00, 0x42, 0xAD,
84570x00, 0x00, 0x6D, 0xAD, 0x02, 0x80, 0x02, 0x3C, 0x00, 0x00, 0x8E, 0xA1,
84580x00, 0x00, 0x2E, 0xA2, 0xE3, 0x5C, 0x42, 0x90, 0x25, 0xB0, 0x1F, 0x3C,
84590xA7, 0x01, 0xE7, 0x37, 0x1C, 0x00, 0xA2, 0xAF, 0xFF, 0xFF, 0x02, 0x24,
84600x00, 0x00, 0xE2, 0xA0, 0x05, 0x06, 0x03, 0x3C, 0x25, 0xB0, 0x02, 0x3C,
84610x03, 0x04, 0x63, 0x34, 0x0C, 0x00, 0x04, 0x24, 0xFF, 0xFF, 0x05, 0x24,
84620x01, 0x02, 0x06, 0x3C, 0xC2, 0x01, 0x42, 0x34, 0xA8, 0x01, 0xE8, 0x37,
84630xAC, 0x01, 0xE9, 0x37, 0xB0, 0x01, 0xEA, 0x37, 0xB4, 0x01, 0xEB, 0x37,
84640xB8, 0x01, 0xEC, 0x37, 0xBC, 0x01, 0xED, 0x37, 0xC0, 0x01, 0xEE, 0x37,
84650xC1, 0x01, 0xEF, 0x37, 0x00, 0x00, 0x05, 0xAD, 0x00, 0x00, 0x25, 0xAD,
84660x00, 0x00, 0x46, 0xAD, 0x00, 0x00, 0x63, 0xAD, 0x00, 0x00, 0x86, 0xAD,
84670x00, 0x00, 0xA3, 0xAD, 0x00, 0x00, 0xC4, 0xA1, 0x25, 0xB0, 0x03, 0x3C,
84680x00, 0x00, 0xE4, 0xA1, 0x00, 0x00, 0x44, 0xA0, 0x25, 0xB0, 0x02, 0x3C,
84690x0D, 0x00, 0x17, 0x24, 0x0E, 0x00, 0x18, 0x24, 0xC4, 0x01, 0x63, 0x34,
84700xC5, 0x01, 0x42, 0x34, 0xC3, 0x01, 0xF1, 0x37, 0x00, 0x00, 0x37, 0xA2,
84710xC6, 0x01, 0xF4, 0x37, 0x00, 0x00, 0x77, 0xA0, 0xC7, 0x01, 0xF5, 0x37,
84720x00, 0x00, 0x58, 0xA0, 0x0F, 0x00, 0x02, 0x24, 0x00, 0x00, 0x98, 0xA2,
84730x00, 0x00, 0xA2, 0xA2, 0x53, 0x01, 0x02, 0x3C, 0x46, 0x00, 0xF6, 0x37,
84740x48, 0x00, 0xFE, 0x37, 0x0E, 0xF0, 0x42, 0x34, 0x00, 0x00, 0xC0, 0xA6,
84750x00, 0x00, 0xC2, 0xAF, 0x1C, 0x00, 0xA3, 0x8F, 0x00, 0x00, 0x00, 0x00,
84760x09, 0x00, 0x60, 0x10, 0x44, 0x00, 0xF7, 0x37, 0x00, 0x00, 0xE2, 0x8E,
84770x00, 0x02, 0x03, 0x3C, 0x25, 0x10, 0x43, 0x00, 0x00, 0x00, 0xE2, 0xAE,
84780x00, 0x00, 0xC3, 0x8F, 0x00, 0x04, 0x02, 0x3C, 0x25, 0x18, 0x62, 0x00,
84790x00, 0x00, 0xC3, 0xAF, 0x4C, 0x00, 0xE2, 0x37, 0x00, 0x00, 0x40, 0xA0,
84800x40, 0x00, 0xE4, 0x37, 0xBC, 0x00, 0x03, 0x24, 0xFC, 0x37, 0x02, 0x24,
84810x00, 0x00, 0x83, 0xA4, 0x00, 0x00, 0x82, 0xA4, 0x02, 0x80, 0x02, 0x3C,
84820xD8, 0x00, 0xE9, 0x37, 0x60, 0x1B, 0x43, 0x24, 0x00, 0x00, 0x26, 0x91,
84830xAA, 0x1B, 0x64, 0x90, 0x2A, 0xB0, 0x05, 0x3C, 0xA0, 0xFF, 0x02, 0x24,
84840x26, 0xB0, 0x07, 0x3C, 0x25, 0x30, 0xC2, 0x00, 0x30, 0x00, 0xAD, 0x34,
84850x34, 0x00, 0xA8, 0x34, 0x01, 0x00, 0x83, 0x24, 0x38, 0x00, 0xA5, 0x34,
84860x20, 0x20, 0x02, 0x24, 0x00, 0x00, 0x26, 0xA1, 0x79, 0x00, 0xEA, 0x34,
84870x00, 0x00, 0x03, 0xA1, 0x00, 0x00, 0xA2, 0xA4, 0x40, 0x00, 0x03, 0x24,
84880x16, 0x00, 0x02, 0x24, 0x00, 0x00, 0xA3, 0xA1, 0x94, 0x00, 0xEB, 0x37,
84890x00, 0x00, 0x42, 0xA1, 0x98, 0x00, 0xEC, 0x37, 0x64, 0x00, 0x03, 0x24,
84900x22, 0x00, 0x02, 0x24, 0x00, 0x00, 0x63, 0xA5, 0x7C, 0x00, 0xF4, 0x34,
84910x00, 0x00, 0x82, 0xA5, 0x7A, 0x00, 0xE7, 0x34, 0x04, 0x00, 0x03, 0x24,
84920x20, 0x0C, 0x02, 0x24, 0x00, 0x00, 0xE3, 0xA0, 0x9C, 0x00, 0xEE, 0x37,
84930x00, 0x00, 0x82, 0xA6, 0x9A, 0x00, 0xEF, 0x37, 0x0A, 0x00, 0x03, 0x24,
84940xFF, 0x03, 0x02, 0x24, 0x00, 0x00, 0xC3, 0xA1, 0x00, 0x00, 0xE2, 0xA5,
84950x25, 0xB0, 0x02, 0x3C, 0x02, 0x00, 0x03, 0x24, 0x96, 0x00, 0x42, 0x34,
84960x00, 0x00, 0x43, 0xA4, 0x89, 0x00, 0xF5, 0x37, 0xB7, 0x00, 0xF1, 0x37,
84970x20, 0x00, 0x02, 0x24, 0x09, 0x00, 0x03, 0x24, 0x00, 0x00, 0x22, 0xA2,
84980x00, 0x00, 0xA3, 0xA2, 0x00, 0x00, 0xE2, 0x96, 0xFF, 0xFD, 0x03, 0x24,
84990x04, 0x02, 0x05, 0x24, 0x24, 0x10, 0x43, 0x00, 0x00, 0x00, 0xE2, 0xA6,
85000x00, 0x00, 0xE3, 0x96, 0x29, 0xB0, 0x02, 0x3C, 0x40, 0x00, 0x42, 0x34,
85010x00, 0x02, 0x63, 0x34, 0x00, 0x00, 0xE3, 0xA6, 0xFF, 0x00, 0x84, 0x30,
85020x00, 0x00, 0x45, 0xA4, 0x7A, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
85030x44, 0x00, 0xBF, 0x8F, 0x40, 0x00, 0xBE, 0x8F, 0x3C, 0x00, 0xB7, 0x8F,
85040x38, 0x00, 0xB6, 0x8F, 0x34, 0x00, 0xB5, 0x8F, 0x30, 0x00, 0xB4, 0x8F,
85050x2C, 0x00, 0xB3, 0x8F, 0x28, 0x00, 0xB2, 0x8F, 0x24, 0x00, 0xB1, 0x8F,
85060x20, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x02, 0x24, 0x08, 0x00, 0xE0, 0x03,
85070x48, 0x00, 0xBD, 0x27, 0xFF, 0xFF, 0x03, 0x24, 0x00, 0x00, 0x43, 0xA0,
85080x02, 0x80, 0x0B, 0x3C, 0xC6, 0x5C, 0x66, 0x91, 0x25, 0xB0, 0x09, 0x3C,
85090x34, 0x02, 0x23, 0x35, 0x80, 0x00, 0x02, 0x24, 0x00, 0x00, 0x62, 0xA4,
85100x38, 0x02, 0x24, 0x35, 0x37, 0x02, 0x25, 0x35, 0x07, 0x00, 0x02, 0x24,
85110x22, 0x00, 0x03, 0x24, 0x00, 0x00, 0x80, 0xA0, 0x00, 0x00, 0xA2, 0xA0,
85120x23, 0xFF, 0xC3, 0x14, 0x13, 0x13, 0x02, 0x3C, 0x1B, 0x1B, 0x02, 0x3C,
85130x1B, 0x1B, 0x42, 0x34, 0x60, 0x01, 0x23, 0x35, 0x64, 0x01, 0x24, 0x35,
85140x68, 0x01, 0x25, 0x35, 0x7C, 0x01, 0x2A, 0x35, 0x6C, 0x01, 0x26, 0x35,
85150x70, 0x01, 0x27, 0x35, 0x74, 0x01, 0x28, 0x35, 0x78, 0x01, 0x29, 0x35,
85160x00, 0x00, 0x62, 0xAC, 0x00, 0x00, 0x82, 0xAC, 0x00, 0x00, 0xA2, 0xAC,
85170x00, 0x00, 0xC2, 0xAC, 0x00, 0x00, 0xE2, 0xAC, 0x00, 0x00, 0x02, 0xAD,
85180x00, 0x00, 0x22, 0xAD, 0x00, 0x00, 0x42, 0xAD, 0xC6, 0x5C, 0x65, 0x91,
85190x25, 0xB0, 0x0C, 0x3C, 0x01, 0x00, 0x03, 0x3C, 0x80, 0x01, 0x82, 0x35,
85200x08, 0x5F, 0x63, 0x34, 0x22, 0x00, 0x04, 0x24, 0x00, 0x00, 0x43, 0xAC,
85210x22, 0xFF, 0xA4, 0x14, 0x0F, 0x1F, 0x02, 0x3C, 0x00, 0xF0, 0x4F, 0x34,
85220xF7, 0x01, 0x91, 0x35, 0x15, 0xF0, 0x4D, 0x34, 0xE7, 0x68, 0x00, 0x08,
85230xFF, 0xFF, 0x0E, 0x24, 0x02, 0x80, 0x02, 0x3C, 0xC7, 0x5C, 0x44, 0x90,
85240x06, 0x00, 0x03, 0x24, 0x0C, 0x00, 0x83, 0x10, 0xA0, 0x00, 0x24, 0x36,
85250x00, 0x15, 0x02, 0x3C, 0x00, 0x07, 0x42, 0x34, 0x00, 0x00, 0x82, 0xAC,
85260x04, 0xE0, 0x02, 0x3C, 0xA4, 0x00, 0x25, 0x36, 0x00, 0x22, 0x03, 0x24,
85270xA8, 0x00, 0x26, 0x36, 0x00, 0xAE, 0x42, 0x34, 0x00, 0x00, 0xA3, 0xAC,
85280x47, 0x68, 0x00, 0x08, 0x02, 0x80, 0x03, 0x3C, 0x00, 0x15, 0x02, 0x3C,
85290x00, 0x07, 0x42, 0x34, 0x00, 0x00, 0x82, 0xAC, 0x04, 0xC0, 0x02, 0x3C,
85300xA4, 0x00, 0x25, 0x36, 0x00, 0x22, 0x03, 0x24, 0xA8, 0x00, 0x26, 0x36,
85310x00, 0xB0, 0x42, 0x34, 0x00, 0x00, 0xA3, 0xAC, 0x47, 0x68, 0x00, 0x08,
85320x02, 0x80, 0x03, 0x3C, 0xE8, 0xFF, 0xBD, 0x27, 0x01, 0x00, 0x06, 0x24,
85330xE8, 0x0E, 0x04, 0x24, 0x10, 0x00, 0xBF, 0xAF, 0xC1, 0x43, 0x00, 0x0C,
85340x00, 0x10, 0x05, 0x3C, 0x60, 0x08, 0x04, 0x24, 0xE3, 0x43, 0x00, 0x0C,
85350xFF, 0xFF, 0x05, 0x24, 0x20, 0x04, 0x06, 0x3C, 0x20, 0x04, 0xC6, 0x34,
85360x25, 0x30, 0x46, 0x00, 0x60, 0x08, 0x04, 0x24, 0xC1, 0x43, 0x00, 0x0C,
85370xFF, 0xFF, 0x05, 0x24, 0x70, 0x08, 0x04, 0x24, 0x00, 0x04, 0x05, 0x24,
85380xC1, 0x43, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00, 0x00, 0x20, 0x06, 0x3C,
85390x80, 0x00, 0xC6, 0x34, 0x80, 0x0C, 0x04, 0x24, 0xC1, 0x43, 0x00, 0x0C,
85400xFF, 0xFF, 0x05, 0x24, 0x00, 0x40, 0x06, 0x3C, 0x10, 0x00, 0xBF, 0x8F,
85410x00, 0x01, 0xC6, 0x34, 0x88, 0x0C, 0x04, 0x24, 0xFF, 0xFF, 0x05, 0x24,
85420xC1, 0x43, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27,
85430x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x1C, 0x00, 0xBF, 0xAF,
85440x10, 0x00, 0xB0, 0xAF, 0x21, 0x90, 0xA0, 0x00, 0x0A, 0x00, 0xA0, 0x10,
85450x21, 0x88, 0x00, 0x00, 0x21, 0x80, 0x80, 0x00, 0x00, 0x00, 0x04, 0x8E,
85460x04, 0x00, 0x05, 0x8E, 0x02, 0x00, 0x31, 0x26, 0x03, 0x5C, 0x00, 0x0C,
85470x08, 0x00, 0x10, 0x26, 0x2B, 0x10, 0x32, 0x02, 0xF9, 0xFF, 0x40, 0x14,
85480x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
85490x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
85500x20, 0x00, 0xBD, 0x27, 0xE0, 0xFF, 0xBD, 0x27, 0x18, 0x00, 0xB2, 0xAF,
85510x14, 0x00, 0xB1, 0xAF, 0x1C, 0x00, 0xBF, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
85520x21, 0x90, 0xA0, 0x00, 0x0B, 0x00, 0xA0, 0x10, 0x21, 0x88, 0x00, 0x00,
85530x21, 0x80, 0x80, 0x00, 0x00, 0x00, 0x04, 0x8E, 0x04, 0x00, 0x05, 0x8E,
85540x08, 0x00, 0x06, 0x8E, 0x03, 0x00, 0x31, 0x26, 0xC1, 0x43, 0x00, 0x0C,
85550x0C, 0x00, 0x10, 0x26, 0x2B, 0x10, 0x32, 0x02, 0xF8, 0xFF, 0x40, 0x14,
85560x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
85570x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
85580x20, 0x00, 0xBD, 0x27, 0x21, 0x40, 0x80, 0x00, 0x21, 0x48, 0x00, 0x00,
85590x1E, 0x00, 0xA0, 0x10, 0x21, 0x38, 0x00, 0x00, 0x80, 0x30, 0x07, 0x00,
85600x21, 0x10, 0xC8, 0x00, 0x00, 0x00, 0x43, 0x8C, 0x00, 0x00, 0x00, 0x00,
85610x00, 0xF2, 0x63, 0x24, 0x1D, 0x00, 0x62, 0x2C, 0x12, 0x00, 0x40, 0x10,
85620x80, 0x10, 0x03, 0x00, 0x02, 0x80, 0x03, 0x3C, 0x14, 0xE6, 0x63, 0x24,
85630x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x8C, 0x00, 0x00, 0x00, 0x00,
85640x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xC8, 0x00,
85650xC0, 0x18, 0x09, 0x00, 0x23, 0x18, 0x69, 0x00, 0x08, 0x00, 0x44, 0x8C,
85660x02, 0x80, 0x02, 0x3C, 0x80, 0x18, 0x03, 0x00, 0x60, 0x1B, 0x42, 0x24,
85670x21, 0x18, 0x62, 0x00, 0x04, 0x1D, 0x64, 0xAC, 0x01, 0x00, 0x29, 0x25,
85680x03, 0x00, 0xE7, 0x24, 0x2B, 0x10, 0xE5, 0x00, 0xE5, 0xFF, 0x40, 0x14,
85690x80, 0x30, 0x07, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,
85700x21, 0x10, 0xC8, 0x00, 0xC0, 0x18, 0x09, 0x00, 0x08, 0x00, 0x44, 0x8C,
85710x23, 0x18, 0x69, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
85720x80, 0x18, 0x03, 0x00, 0x03, 0x00, 0xE7, 0x24, 0x21, 0x18, 0x62, 0x00,
85730x2B, 0x10, 0xE5, 0x00, 0xD6, 0xFF, 0x40, 0x14, 0x00, 0x1D, 0x64, 0xAC,
85740x4D, 0x6A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xC8, 0x00,
85750xC0, 0x18, 0x09, 0x00, 0x08, 0x00, 0x44, 0x8C, 0x23, 0x18, 0x69, 0x00,
85760x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24, 0x80, 0x18, 0x03, 0x00,
85770x03, 0x00, 0xE7, 0x24, 0x21, 0x18, 0x62, 0x00, 0x2B, 0x10, 0xE5, 0x00,
85780xC8, 0xFF, 0x40, 0x14, 0xFC, 0x1C, 0x64, 0xAC, 0x4D, 0x6A, 0x00, 0x08,
85790x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xC8, 0x00, 0xC0, 0x18, 0x09, 0x00,
85800x08, 0x00, 0x44, 0x8C, 0x23, 0x18, 0x69, 0x00, 0x02, 0x80, 0x02, 0x3C,
85810x60, 0x1B, 0x42, 0x24, 0x80, 0x18, 0x03, 0x00, 0x03, 0x00, 0xE7, 0x24,
85820x21, 0x18, 0x62, 0x00, 0x2B, 0x10, 0xE5, 0x00, 0xBA, 0xFF, 0x40, 0x14,
85830xF8, 0x1C, 0x64, 0xAC, 0x4D, 0x6A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
85840x21, 0x10, 0xC8, 0x00, 0xC0, 0x18, 0x09, 0x00, 0x08, 0x00, 0x44, 0x8C,
85850x23, 0x18, 0x69, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24,
85860x80, 0x18, 0x03, 0x00, 0x03, 0x00, 0xE7, 0x24, 0x21, 0x18, 0x62, 0x00,
85870x2B, 0x10, 0xE5, 0x00, 0xAC, 0xFF, 0x40, 0x14, 0x08, 0x1D, 0x64, 0xAC,
85880x4D, 0x6A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xC8, 0x00,
85890xC0, 0x18, 0x09, 0x00, 0x08, 0x00, 0x44, 0x8C, 0x23, 0x18, 0x69, 0x00,
85900x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24, 0x80, 0x18, 0x03, 0x00,
85910x03, 0x00, 0xE7, 0x24, 0x21, 0x18, 0x62, 0x00, 0x2B, 0x10, 0xE5, 0x00,
85920x9E, 0xFF, 0x40, 0x14, 0xF4, 0x1C, 0x64, 0xAC, 0x4D, 0x6A, 0x00, 0x08,
85930x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xC8, 0x00, 0xC0, 0x18, 0x09, 0x00,
85940x08, 0x00, 0x44, 0x8C, 0x23, 0x18, 0x69, 0x00, 0x02, 0x80, 0x02, 0x3C,
85950x60, 0x1B, 0x42, 0x24, 0x80, 0x18, 0x03, 0x00, 0x03, 0x00, 0xE7, 0x24,
85960x21, 0x18, 0x62, 0x00, 0x2B, 0x10, 0xE5, 0x00, 0x90, 0xFF, 0x40, 0x14,
85970xF0, 0x1C, 0x64, 0xAC, 0x4D, 0x6A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
85980x25, 0xB0, 0x02, 0x3C, 0xFC, 0x37, 0x03, 0x24, 0x40, 0x00, 0x42, 0x34,
85990x02, 0x80, 0x04, 0x3C, 0x00, 0x00, 0x43, 0xA4, 0xE8, 0xFF, 0xBD, 0x27,
86000x5C, 0xD1, 0x84, 0x24, 0x10, 0x00, 0xBF, 0xAF, 0xFD, 0x69, 0x00, 0x0C,
86010x74, 0x01, 0x05, 0x24, 0x02, 0x80, 0x02, 0x3C, 0xC6, 0x5C, 0x44, 0x90,
86020x12, 0x00, 0x03, 0x24, 0x34, 0x00, 0x83, 0x10, 0x13, 0x00, 0x82, 0x28,
86030x17, 0x00, 0x40, 0x14, 0x11, 0x00, 0x02, 0x24, 0x22, 0x00, 0x02, 0x24,
86040x36, 0x00, 0x82, 0x10, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x04, 0x3C,
86050xE4, 0xCD, 0x84, 0x24, 0x2C, 0x6A, 0x00, 0x0C, 0x54, 0x00, 0x05, 0x24,
86060x02, 0x80, 0x02, 0x3C, 0x4A, 0xF5, 0x44, 0x90, 0x01, 0x00, 0x03, 0x24,
86070x1A, 0x00, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
86080xE4, 0xC8, 0x84, 0x24, 0xFD, 0x69, 0x00, 0x0C, 0x40, 0x01, 0x05, 0x24,
86090x10, 0x00, 0xBF, 0x8F, 0x84, 0x08, 0x04, 0x24, 0xFF, 0x00, 0x05, 0x24,
86100x58, 0x00, 0x06, 0x24, 0x35, 0x45, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
86110xED, 0xFF, 0x82, 0x14, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x04, 0x3C,
86120x9C, 0xD0, 0x84, 0x24, 0x14, 0x6A, 0x00, 0x0C, 0x30, 0x00, 0x05, 0x24,
86130x02, 0x80, 0x04, 0x3C, 0xE4, 0xCD, 0x84, 0x24, 0x2C, 0x6A, 0x00, 0x0C,
86140x54, 0x00, 0x05, 0x24, 0x02, 0x80, 0x02, 0x3C, 0x4A, 0xF5, 0x44, 0x90,
86150x01, 0x00, 0x03, 0x24, 0xE8, 0xFF, 0x83, 0x14, 0x00, 0x00, 0x00, 0x00,
86160xDE, 0x69, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
86170xE4, 0xC8, 0x84, 0x24, 0xFD, 0x69, 0x00, 0x0C, 0x40, 0x01, 0x05, 0x24,
86180x10, 0x00, 0xBF, 0x8F, 0x84, 0x08, 0x04, 0x24, 0xFF, 0x00, 0x05, 0x24,
86190x58, 0x00, 0x06, 0x24, 0x35, 0x45, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
86200x02, 0x80, 0x04, 0x3C, 0xE8, 0xCF, 0x84, 0x24, 0x2D, 0x00, 0x05, 0x24,
86210x14, 0x6A, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x6A, 0x00, 0x08,
86220x02, 0x80, 0x04, 0x3C, 0x34, 0xCF, 0x84, 0x24, 0xE8, 0x6A, 0x00, 0x08,
86230x2D, 0x00, 0x05, 0x24, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xB0, 0xAF,
86240x50, 0x0C, 0x04, 0x24, 0xFF, 0x00, 0x05, 0x24, 0x02, 0x80, 0x10, 0x3C,
86250x14, 0x00, 0xBF, 0xAF, 0x24, 0x45, 0x00, 0x0C, 0x60, 0x1B, 0x10, 0x26,
86260x60, 0x1D, 0x02, 0xA2, 0x58, 0x0C, 0x04, 0x24, 0x24, 0x45, 0x00, 0x0C,
86270xFF, 0x00, 0x05, 0x24, 0x61, 0x1D, 0x02, 0xA2, 0x60, 0x0C, 0x04, 0x24,
86280x24, 0x45, 0x00, 0x0C, 0xFF, 0x00, 0x05, 0x24, 0x62, 0x1D, 0x02, 0xA2,
86290x68, 0x0C, 0x04, 0x24, 0x24, 0x45, 0x00, 0x0C, 0xFF, 0x00, 0x05, 0x24,
86300x63, 0x1D, 0x02, 0xA2, 0x38, 0x0C, 0x04, 0x24, 0x24, 0x45, 0x00, 0x0C,
86310xFF, 0x00, 0x05, 0x24, 0xE8, 0x1C, 0x02, 0xA2, 0x34, 0x0C, 0x04, 0x24,
86320x24, 0x45, 0x00, 0x0C, 0xFF, 0xFF, 0x05, 0x24, 0xEC, 0x1C, 0x02, 0xAE,
86330x14, 0x00, 0xBF, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
86340x18, 0x00, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x05, 0x3C,
86350x02, 0x80, 0x03, 0x3C, 0x38, 0xAD, 0x42, 0x24, 0xB0, 0x5D, 0x60, 0xAC,
86360x10, 0x5D, 0xA2, 0xAC, 0x02, 0x80, 0x03, 0x3C, 0x00, 0x80, 0x02, 0x3C,
86370xB4, 0x5D, 0x60, 0xA4, 0x10, 0x5D, 0xA4, 0x24, 0x64, 0x11, 0x42, 0x24,
86380x02, 0x80, 0x03, 0x3C, 0xB6, 0x5D, 0x60, 0xA4, 0x08, 0x00, 0x82, 0xAC,
86390x00, 0x80, 0x03, 0x3C, 0x00, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x06, 0x3C,
86400x4C, 0x14, 0x42, 0x24, 0x80, 0x11, 0x63, 0x24, 0xB8, 0x5D, 0xC7, 0x24,
86410x14, 0x00, 0x82, 0xAC, 0x10, 0x00, 0x83, 0xAC, 0x02, 0x80, 0x02, 0x3C,
86420x02, 0x80, 0x03, 0x3C, 0xB8, 0x5D, 0xC0, 0xAC, 0x04, 0x00, 0xE0, 0xAC,
86430xC0, 0x5D, 0x40, 0xA0, 0xC4, 0x5D, 0x60, 0xAC, 0x01, 0x80, 0x02, 0x3C,
86440xB4, 0xC5, 0x42, 0x24, 0x7C, 0x00, 0x82, 0xAC, 0x00, 0x80, 0x03, 0x3C,
86450x00, 0x80, 0x02, 0x3C, 0x68, 0x14, 0x63, 0x24, 0x08, 0x17, 0x42, 0x24,
86460x20, 0x00, 0x83, 0xAC, 0x24, 0x00, 0x82, 0xAC, 0x00, 0x80, 0x03, 0x3C,
86470x00, 0x80, 0x02, 0x3C, 0xB0, 0x19, 0x63, 0x24, 0x54, 0x1C, 0x42, 0x24,
86480x28, 0x00, 0x83, 0xAC, 0x2C, 0x00, 0x82, 0xAC, 0x00, 0x80, 0x03, 0x3C,
86490x01, 0x80, 0x02, 0x3C, 0x80, 0x2F, 0x63, 0x24, 0x10, 0x02, 0x42, 0x24,
86500x30, 0x00, 0x83, 0xAC, 0x54, 0x00, 0x82, 0xAC, 0x00, 0x80, 0x03, 0x3C,
86510x00, 0x80, 0x02, 0x3C, 0x58, 0x1F, 0x63, 0x24, 0x38, 0x21, 0x42, 0x24,
86520x0C, 0x00, 0x83, 0xAC, 0x3C, 0x00, 0x82, 0xAC, 0x00, 0x80, 0x03, 0x3C,
86530x00, 0x80, 0x02, 0x3C, 0x00, 0x03, 0x63, 0x24, 0xF8, 0x1E, 0x42, 0x24,
86540x50, 0x00, 0x83, 0xAC, 0x08, 0x00, 0xE0, 0x03, 0x40, 0x00, 0x82, 0xAC,
86550x25, 0xB0, 0x02, 0x3C, 0x08, 0x00, 0x42, 0x34, 0x00, 0x00, 0x43, 0x8C,
86560x08, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x0E, 0x3C,
86570x02, 0x80, 0x08, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
86580xF8, 0x03, 0x4D, 0x24, 0x00, 0x18, 0x6C, 0x24, 0x01, 0x00, 0x07, 0x24,
86590x00, 0x00, 0xCB, 0x25, 0xFF, 0xFF, 0x0A, 0x24, 0x00, 0x04, 0x09, 0x25,
86600x80, 0x1A, 0x07, 0x00, 0x21, 0x10, 0x6B, 0x00, 0x00, 0x00, 0x42, 0xAC,
86610x90, 0x00, 0x4A, 0xAC, 0x00, 0x04, 0x04, 0x8D, 0x01, 0x00, 0xE7, 0x24,
86620x08, 0x00, 0x45, 0x24, 0x21, 0x18, 0x6D, 0x00, 0x06, 0x00, 0xE6, 0x28,
86630x04, 0x00, 0x82, 0xAC, 0x00, 0x00, 0x44, 0xAC, 0x04, 0x00, 0x49, 0xAC,
86640x00, 0x04, 0x02, 0xAD, 0x8C, 0x00, 0x40, 0xAC, 0x6C, 0x00, 0xA3, 0xAC,
86650xF0, 0xFF, 0xC0, 0x14, 0x68, 0x00, 0xAC, 0xAC, 0x08, 0x00, 0xE0, 0x03,
86660x00, 0x00, 0xC9, 0xAD, 0x06, 0x00, 0xA2, 0x2C, 0x13, 0x00, 0x40, 0x10,
86670xFF, 0xFF, 0x07, 0x24, 0x02, 0x80, 0x02, 0x3C, 0x80, 0x1A, 0x05, 0x00,
86680x00, 0x00, 0x42, 0x24, 0x0E, 0x00, 0xA0, 0x10, 0x21, 0x30, 0x62, 0x00,
86690x90, 0x00, 0xC3, 0x8C, 0xFF, 0xFF, 0x02, 0x24, 0x0A, 0x00, 0x62, 0x14,
86700x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0xC2, 0x8C, 0x00, 0x00, 0x00, 0x00,
86710x06, 0x00, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x24,
86720x88, 0x00, 0xC4, 0xAC, 0x8C, 0x00, 0xC2, 0xAC, 0x90, 0x00, 0xC5, 0xAC,
86730x21, 0x38, 0xA0, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0xE0, 0x00,
86740xE0, 0xFF, 0xBD, 0x27, 0x02, 0x80, 0x02, 0x3C, 0x1C, 0x00, 0xBF, 0xAF,
86750x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
86760xC3, 0x5C, 0x46, 0x90, 0x25, 0xB0, 0x07, 0x3C, 0x02, 0x80, 0x02, 0x3C,
86770xDB, 0xFF, 0x03, 0x24, 0x18, 0x03, 0xE4, 0x34, 0x27, 0x00, 0xE5, 0x34,
86780x1C, 0xAE, 0x42, 0x24, 0x00, 0x00, 0x82, 0xAC, 0x00, 0x00, 0xA3, 0xA0,
86790x02, 0x00, 0xC0, 0x10, 0x1B, 0x00, 0xE3, 0x34, 0x1F, 0x00, 0xE3, 0x34,
86800x07, 0x00, 0x02, 0x24, 0x00, 0x00, 0x62, 0xA0, 0xF0, 0x42, 0x00, 0x0C,
86810x21, 0x20, 0x00, 0x00, 0x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x50, 0x24,
86820x34, 0x1C, 0x04, 0x8E, 0xE3, 0x43, 0x00, 0x0C, 0x10, 0x00, 0x05, 0x24,
86830x40, 0x1C, 0x04, 0x8E, 0x10, 0x00, 0x05, 0x3C, 0x01, 0x00, 0x06, 0x24,
86840xC1, 0x43, 0x00, 0x0C, 0x21, 0x90, 0x40, 0x00, 0x3C, 0x1C, 0x04, 0x8E,
86850x10, 0x00, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C, 0x01, 0x00, 0x06, 0x24,
86860x58, 0x1C, 0x04, 0x8E, 0x00, 0x04, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C,
86870x21, 0x30, 0x00, 0x00, 0x58, 0x1C, 0x04, 0x8E, 0x00, 0x08, 0x05, 0x24,
86880xC1, 0x43, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00, 0x02, 0x80, 0x05, 0x3C,
86890x78, 0xDA, 0xA5, 0x24, 0x21, 0x20, 0x00, 0x00, 0xC1, 0x45, 0x00, 0x0C,
86900xCA, 0x00, 0x06, 0x24, 0x31, 0x00, 0x40, 0x10, 0x21, 0x18, 0x00, 0x00,
86910x02, 0x80, 0x02, 0x3C, 0xCF, 0x5C, 0x43, 0x90, 0x01, 0x00, 0x11, 0x24,
86920x53, 0x00, 0x71, 0x10, 0x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x02, 0x3C,
86930x4A, 0xF5, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x71, 0x10,
86940x02, 0x80, 0x05, 0x3C, 0x34, 0x1C, 0x04, 0x8E, 0x21, 0x30, 0x40, 0x02,
86950x10, 0x00, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C, 0x02, 0x80, 0x11, 0x3C,
86960xC6, 0x5C, 0x23, 0x92, 0x11, 0x00, 0x02, 0x24, 0x2A, 0x00, 0x62, 0x10,
86970x00, 0x08, 0x04, 0x24, 0xF0, 0x42, 0x00, 0x0C, 0x01, 0x00, 0x04, 0x24,
86980x34, 0x1C, 0x04, 0x8E, 0xE3, 0x43, 0x00, 0x0C, 0x10, 0x00, 0x05, 0x3C,
86990x40, 0x1C, 0x04, 0x8E, 0x10, 0x00, 0x05, 0x3C, 0x01, 0x00, 0x06, 0x24,
87000xC1, 0x43, 0x00, 0x0C, 0x21, 0x90, 0x40, 0x00, 0x3C, 0x1C, 0x04, 0x8E,
87010x10, 0x00, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C, 0x01, 0x00, 0x06, 0x24,
87020x58, 0x1C, 0x04, 0x8E, 0x00, 0x04, 0x05, 0x24, 0xC1, 0x43, 0x00, 0x0C,
87030x21, 0x30, 0x00, 0x00, 0x58, 0x1C, 0x04, 0x8E, 0x00, 0x08, 0x05, 0x24,
87040xC1, 0x43, 0x00, 0x0C, 0x21, 0x30, 0x00, 0x00, 0x02, 0x80, 0x05, 0x3C,
87050x20, 0xDA, 0xA5, 0x24, 0x01, 0x00, 0x04, 0x24, 0xC1, 0x45, 0x00, 0x0C,
87060x16, 0x00, 0x06, 0x24, 0x08, 0x00, 0x40, 0x14, 0x21, 0x18, 0x00, 0x00,
87070x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F,
87080x10, 0x00, 0xB0, 0x8F, 0x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03,
87090x20, 0x00, 0xBD, 0x27, 0x34, 0x1C, 0x04, 0x8E, 0x21, 0x30, 0x40, 0x02,
87100xC1, 0x43, 0x00, 0x0C, 0x10, 0x00, 0x05, 0x3C, 0x00, 0x08, 0x04, 0x24,
87110x00, 0x01, 0x05, 0x3C, 0xC1, 0x43, 0x00, 0x0C, 0x01, 0x00, 0x06, 0x24,
87120x00, 0x08, 0x04, 0x24, 0x00, 0x02, 0x05, 0x3C, 0xC1, 0x43, 0x00, 0x0C,
87130x01, 0x00, 0x06, 0x24, 0xC6, 0x5C, 0x23, 0x92, 0x11, 0x00, 0x02, 0x24,
87140x1D, 0x00, 0x62, 0x10, 0x00, 0x08, 0x04, 0x24, 0xF0, 0x42, 0x00, 0x0C,
87150x21, 0x20, 0x00, 0x00, 0x0F, 0x00, 0x05, 0x3C, 0x0C, 0x00, 0x06, 0x3C,
87160xFF, 0xFF, 0xA5, 0x34, 0x00, 0xB4, 0xC6, 0x34, 0x83, 0x45, 0x00, 0x0C,
87170x08, 0x00, 0x04, 0x24, 0x1C, 0x00, 0xBF, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
87180x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x01, 0x00, 0x03, 0x24,
87190x21, 0x10, 0x60, 0x00, 0x08, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xBD, 0x27,
87200x10, 0xD9, 0xA5, 0x24, 0x21, 0x20, 0x00, 0x00, 0xC1, 0x45, 0x00, 0x0C,
87210x16, 0x00, 0x06, 0x24, 0xC0, 0x6B, 0x00, 0x08, 0x02, 0x80, 0x02, 0x3C,
87220x68, 0xD9, 0xA5, 0x24, 0x21, 0x20, 0x00, 0x00, 0xC1, 0x45, 0x00, 0x0C,
87230x16, 0x00, 0x06, 0x24, 0xC4, 0x6B, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
87240x00, 0xFF, 0x05, 0x3C, 0xC1, 0x43, 0x00, 0x0C, 0x03, 0x00, 0x06, 0x24,
87250x01, 0x6C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xE0, 0x03,
87260x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
87270x02, 0x80, 0x02, 0x3C, 0x25, 0x59, 0x47, 0x90, 0x02, 0x80, 0x04, 0x3C,
87280x02, 0x80, 0x05, 0x3C, 0x03, 0x00, 0x03, 0x24, 0x4E, 0x37, 0x84, 0x24,
87290xB4, 0xDF, 0xA5, 0x24, 0x0F, 0x00, 0xE3, 0x10, 0x0D, 0x00, 0x06, 0x24,
87300x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0x4E, 0x37, 0x84, 0x24,
87310x64, 0xDF, 0xA5, 0x24, 0xF4, 0x54, 0x00, 0x0C, 0x0D, 0x00, 0x06, 0x24,
87320x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C, 0x10, 0x00, 0xBF, 0x8F,
87330x5B, 0x37, 0x84, 0x24, 0x74, 0xDF, 0xA5, 0x24, 0x0D, 0x00, 0x06, 0x24,
87340xF4, 0x54, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27, 0xF4, 0x54, 0x00, 0x0C,
87350x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x02, 0x80, 0x05, 0x3C,
87360x10, 0x00, 0xBF, 0x8F, 0x5B, 0x37, 0x84, 0x24, 0xA4, 0xDF, 0xA5, 0x24,
87370x0D, 0x00, 0x06, 0x24, 0xF4, 0x54, 0x00, 0x08, 0x18, 0x00, 0xBD, 0x27,
87380xE0, 0xFF, 0xBD, 0x27, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
87390x02, 0x80, 0x05, 0x3C, 0x02, 0x80, 0x10, 0x3C, 0x02, 0x80, 0x11, 0x3C,
87400x60, 0x1B, 0x31, 0x26, 0x2C, 0x59, 0x04, 0x26, 0xA0, 0xDD, 0xA5, 0x24,
87410x34, 0x00, 0x06, 0x24, 0x18, 0x00, 0xBF, 0xAF, 0xF4, 0x54, 0x00, 0x0C,
87420x2C, 0x59, 0x10, 0x26, 0x24, 0x6C, 0x00, 0x0C, 0x00, 0x3E, 0x30, 0xAE,
87430x02, 0x00, 0x10, 0x24, 0x02, 0x80, 0x04, 0x3C, 0x00, 0x80, 0x06, 0x3C,
87440x9C, 0x39, 0x30, 0xA2, 0xE8, 0x54, 0x84, 0x24, 0x98, 0x5B, 0xC6, 0x24,
87450xCF, 0x20, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
87460x01, 0x80, 0x06, 0x3C, 0xB8, 0x39, 0x30, 0xA2, 0x04, 0x55, 0x84, 0x24,
87470x90, 0x3B, 0xC6, 0x24, 0xCF, 0x20, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00,
87480x02, 0x80, 0x04, 0x3C, 0x01, 0x80, 0x06, 0x3C, 0xD4, 0x39, 0x30, 0xA2,
87490x20, 0x55, 0x84, 0x24, 0x08, 0x39, 0xC6, 0x24, 0xCF, 0x20, 0x00, 0x0C,
87500x21, 0x28, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C, 0x01, 0x80, 0x06, 0x3C,
87510xF0, 0x39, 0x30, 0xA2, 0x3C, 0x55, 0x84, 0x24, 0x74, 0x44, 0xC6, 0x24,
87520xCF, 0x20, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00, 0x02, 0x80, 0x04, 0x3C,
87530x00, 0x80, 0x06, 0x3C, 0x0C, 0x3A, 0x30, 0xA2, 0x58, 0x55, 0x84, 0x24,
87540xFC, 0x5A, 0xC6, 0x24, 0xCF, 0x20, 0x00, 0x0C, 0x21, 0x28, 0x00, 0x00,
87550x09, 0x00, 0x02, 0x24, 0xB8, 0x40, 0x22, 0xA2, 0xC7, 0x3D, 0x20, 0xA2,
87560x3A, 0x41, 0x20, 0xA2, 0xC8, 0x3D, 0x20, 0xA6, 0x18, 0x00, 0xBF, 0x8F,
87570x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
87580x20, 0x00, 0xBD, 0x27, 0x03, 0x80, 0x05, 0x3C, 0x00, 0x80, 0xA5, 0x24,
87590xD8, 0xFF, 0xBD, 0x27, 0x40, 0x10, 0x0D, 0x3C, 0xFF, 0xFF, 0xA5, 0x30,
87600x02, 0x80, 0x02, 0x3C, 0x60, 0x1B, 0x42, 0x24, 0x20, 0x00, 0xBE, 0xAF,
87610x25, 0xF0, 0xAD, 0x00, 0x2C, 0x38, 0x5E, 0xAC, 0x00, 0x01, 0xDE, 0x27,
87620x38, 0x38, 0x5E, 0xAC, 0x00, 0x01, 0xDE, 0x27, 0x1C, 0x00, 0xB7, 0xAF,
87630x18, 0x00, 0xB6, 0xAF, 0x14, 0x00, 0xB5, 0xAF, 0x10, 0x00, 0xB4, 0xAF,
87640x0C, 0x00, 0xB3, 0xAF, 0x08, 0x00, 0xB2, 0xAF, 0x04, 0x00, 0xB1, 0xAF,
87650x00, 0x00, 0xB0, 0xAF, 0x44, 0x38, 0x5E, 0xAC, 0x00, 0x01, 0xDE, 0x27,
87660x50, 0x38, 0x5E, 0xAC, 0xAA, 0x1B, 0x44, 0x90, 0x00, 0x01, 0xDE, 0x27,
87670x5C, 0x38, 0x5E, 0xAC, 0x00, 0x01, 0xDE, 0x27, 0x68, 0x38, 0x5E, 0xAC,
87680x20, 0xB0, 0x06, 0x3C, 0x38, 0x38, 0x48, 0x8C, 0x44, 0x38, 0x49, 0x8C,
87690x50, 0x38, 0x4A, 0x8C, 0x5C, 0x38, 0x4B, 0x8C, 0x68, 0x38, 0x4C, 0x8C,
87700x00, 0x22, 0x04, 0x00, 0x00, 0x01, 0xC7, 0x34, 0xFF, 0x1F, 0x03, 0x3C,
87710x00, 0x01, 0xDE, 0x27, 0xFF, 0xFF, 0x63, 0x34, 0x21, 0x38, 0x87, 0x00,
87720x21, 0x20, 0x86, 0x00, 0x24, 0x38, 0xE3, 0x00, 0x20, 0x10, 0x06, 0x3C,
87730x24, 0x20, 0x83, 0x00, 0x74, 0x38, 0x5E, 0xAC, 0x21, 0x70, 0xC0, 0x03,
87740x25, 0x28, 0xAD, 0x00, 0x25, 0xB0, 0x0F, 0x3C, 0x00, 0x01, 0xDE, 0x27,
87750x28, 0x38, 0x45, 0xAC, 0x34, 0x38, 0x48, 0xAC, 0x40, 0x38, 0x49, 0xAC,
87760x4C, 0x38, 0x4A, 0xAC, 0xEC, 0x37, 0x44, 0xAC, 0x58, 0x38, 0x4B, 0xAC,
87770xF8, 0x37, 0x47, 0xAC, 0x64, 0x38, 0x4C, 0xAC, 0xAC, 0x00, 0xE3, 0x35,
87780xC0, 0x37, 0x46, 0xAC, 0xBC, 0x37, 0x46, 0xAC, 0xCC, 0x37, 0x46, 0xAC,
87790xC8, 0x37, 0x46, 0xAC, 0x80, 0x38, 0x5E, 0xAC, 0xF0, 0x37, 0x44, 0xAC,
87800xFC, 0x37, 0x47, 0xAC, 0x70, 0x38, 0x4E, 0xAC, 0xD8, 0x37, 0x46, 0xAC,
87810xD4, 0x37, 0x46, 0xAC, 0xE4, 0x37, 0x46, 0xAC, 0xE0, 0x37, 0x46, 0xAC,
87820x08, 0x38, 0x46, 0xAC, 0x04, 0x38, 0x46, 0xAC, 0xAC, 0x1B, 0x47, 0x94,
87830x00, 0x02, 0xDE, 0x27, 0x00, 0x00, 0x69, 0x8C, 0x21, 0x10, 0x05, 0x3C,
87840x98, 0x38, 0x5E, 0xAC, 0xB0, 0x00, 0xE3, 0x35, 0x00, 0x00, 0x79, 0x8C,
87850x80, 0x38, 0x54, 0x8C, 0x00, 0x80, 0xA4, 0x34, 0x23, 0x10, 0x0D, 0x3C,
87860x22, 0x10, 0x10, 0x3C, 0x02, 0x80, 0x16, 0x3C, 0x02, 0x80, 0x17, 0x3C,
87870x02, 0x80, 0x18, 0x3C, 0x02, 0x80, 0x13, 0x3C, 0x23, 0x20, 0x87, 0x00,
87880x02, 0x80, 0x03, 0x3C, 0x24, 0x10, 0x07, 0x3C, 0xC0, 0x54, 0x68, 0x24,
87890xCC, 0x38, 0x44, 0xAC, 0x21, 0xA8, 0xC0, 0x03, 0xC8, 0x54, 0xCE, 0x26,
87900x00, 0x04, 0xDE, 0x27, 0xD0, 0x54, 0xEA, 0x26, 0xD8, 0x54, 0x0B, 0x27,
87910xE0, 0x54, 0x6C, 0x26, 0x00, 0x04, 0xB1, 0x35, 0x01, 0x00, 0x29, 0x25,
87920x00, 0x40, 0x12, 0x36, 0x00, 0x01, 0xEF, 0x35, 0x01, 0x00, 0x03, 0x24,
87930x02, 0x80, 0x04, 0x3C, 0x7C, 0x38, 0x54, 0xAC, 0x85, 0x38, 0x43, 0xA0,
87940x94, 0x38, 0x55, 0xAC, 0xFC, 0x38, 0x51, 0xAC, 0xC0, 0x38, 0x49, 0xAC,
87950xF0, 0x38, 0x52, 0xAC, 0xE4, 0x38, 0x59, 0xAC, 0x00, 0x00, 0xE7, 0xAD,
87960xE0, 0x38, 0x47, 0xAC, 0x00, 0x39, 0x46, 0xAC, 0x14, 0x38, 0x46, 0xAC,
87970x10, 0x38, 0x46, 0xAC, 0x9E, 0x38, 0x40, 0xA4, 0x9D, 0x38, 0x40, 0xA0,
87980x9C, 0x38, 0x40, 0xA0, 0xF4, 0x38, 0x4D, 0xAC, 0xF8, 0x38, 0x4D, 0xAC,
87990xB8, 0x38, 0x45, 0xAC, 0xBC, 0x38, 0x45, 0xAC, 0xC4, 0x38, 0x45, 0xAC,
88000xC8, 0x38, 0x45, 0xAC, 0xE8, 0x38, 0x50, 0xAC, 0xEC, 0x38, 0x50, 0xAC,
88010xDC, 0x38, 0x47, 0xAC, 0x04, 0x39, 0x46, 0xAC, 0x10, 0x39, 0x5E, 0xAC,
88020x0C, 0x39, 0x5E, 0xAC, 0x04, 0x00, 0x4A, 0xAD, 0xC8, 0x54, 0xCE, 0xAE,
88030x04, 0x00, 0x6B, 0xAD, 0xD0, 0x54, 0xEA, 0xAE, 0x04, 0x00, 0x8C, 0xAD,
88040xD8, 0x54, 0x0B, 0xAF, 0x04, 0x00, 0x08, 0xAD, 0xE0, 0x54, 0x6C, 0xAE,
88050xC0, 0x54, 0x88, 0xAC, 0x04, 0x00, 0xCE, 0xAD, 0x02, 0x80, 0x04, 0x3C,
88060x18, 0x18, 0x83, 0x24, 0x02, 0x80, 0x05, 0x3C, 0x00, 0x18, 0xA2, 0x24,
88070x18, 0x18, 0x83, 0xAC, 0x02, 0x80, 0x04, 0x3C, 0x04, 0x00, 0x02, 0xAD,
88080x00, 0x18, 0xA8, 0xAC, 0xC0, 0x54, 0x82, 0xAC, 0x21, 0x48, 0x60, 0x00,
88090x08, 0x00, 0x5E, 0xAC, 0x01, 0x00, 0x07, 0x24, 0x04, 0x00, 0x63, 0xAC,
88100x00, 0x01, 0xDE, 0x27, 0x04, 0x00, 0x48, 0xAC, 0x10, 0x00, 0x40, 0xAC,
88110x21, 0x40, 0x40, 0x00, 0x21, 0x18, 0xC0, 0x01, 0x21, 0x28, 0x00, 0x00,
88120x0F, 0x00, 0x06, 0x24, 0x21, 0x20, 0xA9, 0x00, 0x21, 0x10, 0xA8, 0x00,
88130xFF, 0xFF, 0xC6, 0x24, 0x20, 0x00, 0x5E, 0xAC, 0x28, 0x00, 0x47, 0xAC,
88140x18, 0x00, 0xA5, 0x24, 0x00, 0x00, 0x8E, 0xAC, 0x04, 0x00, 0x83, 0xAC,
88150x00, 0x00, 0x64, 0xAC, 0x00, 0x01, 0xDE, 0x27, 0xF5, 0xFF, 0xC1, 0x04,
88160x21, 0x18, 0x80, 0x00, 0x02, 0x80, 0x02, 0x3C, 0xD0, 0x54, 0x48, 0x24,
88170x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0x04, 0x00, 0x07, 0x8D,
88180x98, 0x19, 0x4B, 0x24, 0x04, 0x00, 0xC4, 0xAD, 0x00, 0x18, 0x6A, 0x24,
88190x02, 0x00, 0x09, 0x24, 0x21, 0x28, 0x00, 0x00, 0x0F, 0x00, 0x06, 0x24,
88200x21, 0x20, 0xAB, 0x00, 0x21, 0x10, 0xAA, 0x00, 0xFF, 0xFF, 0xC6, 0x24,
88210xA0, 0x01, 0x5E, 0xAC, 0xA8, 0x01, 0x49, 0xAC, 0x18, 0x00, 0xA5, 0x24,
88220x00, 0x00, 0x88, 0xAC, 0x04, 0x00, 0x87, 0xAC, 0x00, 0x00, 0xE4, 0xAC,
88230x00, 0x02, 0xDE, 0x27, 0xF5, 0xFF, 0xC1, 0x04, 0x21, 0x38, 0x80, 0x00,
88240x02, 0x80, 0x02, 0x3C, 0xD8, 0x54, 0x49, 0x24, 0x02, 0x80, 0x03, 0x3C,
88250x02, 0x80, 0x02, 0x3C, 0x04, 0x00, 0x25, 0x8D, 0x18, 0x1B, 0x4B, 0x24,
88260x04, 0x00, 0x04, 0xAD, 0x00, 0x18, 0x6A, 0x24, 0x03, 0x00, 0x07, 0x24,
88270x21, 0x20, 0x00, 0x00, 0x01, 0x00, 0x06, 0x24, 0x21, 0x40, 0x8B, 0x00,
88280x21, 0x10, 0x8A, 0x00, 0xFF, 0xFF, 0xC6, 0x24, 0x20, 0x03, 0x5E, 0xAC,
88290x28, 0x03, 0x47, 0xAC, 0x18, 0x00, 0x84, 0x24, 0x00, 0x00, 0x09, 0xAD,
88300x04, 0x00, 0x05, 0xAD, 0x00, 0x00, 0xA8, 0xAC, 0x00, 0x08, 0xDE, 0x27,
88310xF5, 0xFF, 0xC1, 0x04, 0x21, 0x28, 0x00, 0x01, 0x02, 0x80, 0x05, 0x3C,
88320x02, 0x80, 0x03, 0x3C, 0xE0, 0x54, 0xA5, 0x24, 0x00, 0x18, 0x63, 0x24,
88330x04, 0x00, 0xA6, 0x8C, 0x1C, 0x00, 0xB7, 0x8F, 0x50, 0x03, 0x7E, 0xAC,
88340x18, 0x00, 0xB6, 0x8F, 0x20, 0x00, 0xBE, 0x8F, 0x14, 0x00, 0xB5, 0x8F,
88350x10, 0x00, 0xB4, 0x8F, 0x0C, 0x00, 0xB3, 0x8F, 0x08, 0x00, 0xB2, 0x8F,
88360x04, 0x00, 0xB1, 0x8F, 0x00, 0x00, 0xB0, 0x8F, 0x02, 0x80, 0x07, 0x3C,
88370x48, 0x1B, 0xE4, 0x24, 0x04, 0x00, 0x02, 0x24, 0x28, 0x00, 0xBD, 0x27,
88380x04, 0x00, 0x28, 0xAD, 0x04, 0x00, 0xA4, 0xAC, 0x58, 0x03, 0x62, 0xAC,
88390x48, 0x1B, 0xE5, 0xAC, 0x04, 0x00, 0x86, 0xAC, 0x08, 0x00, 0xE0, 0x03,
88400x00, 0x00, 0xC4, 0xAC, 0xFA, 0x63, 0x00, 0x6A, 0x09, 0xD1, 0x0A, 0x62,
88410x08, 0xD0, 0x06, 0xD2, 0x7D, 0x67, 0x18, 0xA3, 0x10, 0xF0, 0x02, 0x69,
88420x00, 0xF4, 0x20, 0x31, 0x63, 0xF3, 0x00, 0x49, 0x00, 0x18, 0xDB, 0x5C,
88430x06, 0x94, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x10, 0xF0,
88440x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0x5C, 0xF4, 0x00, 0x4A, 0xDC, 0xF3,
88450x0C, 0x4B, 0x7B, 0x9B, 0x5B, 0x9A, 0x00, 0x6D, 0x69, 0xE2, 0x46, 0x32,
88460xC4, 0xF4, 0x54, 0xD9, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
88470xBC, 0xF3, 0x0C, 0x4A, 0x5B, 0xA2, 0x01, 0xF6, 0x01, 0x6B, 0x6B, 0xEB,
88480x50, 0x32, 0xE4, 0xF4, 0x5C, 0xD9, 0xE4, 0xF4, 0x58, 0xD9, 0x04, 0xF5,
88490x48, 0x99, 0x6C, 0xEA, 0x00, 0xF2, 0x00, 0x6B, 0x6D, 0xEA, 0x04, 0xF5,
88500x48, 0xD9, 0xA9, 0xE1, 0x01, 0x4D, 0x1D, 0x55, 0x04, 0xF5, 0x0C, 0xC2,
88510x44, 0xF5, 0x06, 0xC2, 0x24, 0xF5, 0x09, 0xC2, 0xF6, 0x61, 0x00, 0x6A,
88520x64, 0xF5, 0x44, 0xD9, 0x06, 0x94, 0x7F, 0x49, 0x15, 0x49, 0x01, 0x4C,
88530x20, 0x54, 0x06, 0xD4, 0xBF, 0x61, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4,
88540xA0, 0x35, 0x10, 0xF0, 0x02, 0x69, 0x00, 0xF4, 0x20, 0x31, 0x10, 0xF0,
88550x02, 0x68, 0x00, 0xF4, 0x00, 0x30, 0x10, 0xF0, 0x02, 0x6F, 0x00, 0xF4,
88560xE0, 0x37, 0x10, 0xF0, 0x02, 0x6E, 0x00, 0xF4, 0xC0, 0x36, 0x06, 0xD2,
88570x63, 0xF3, 0x00, 0x4D, 0x5C, 0xF4, 0x00, 0x49, 0xDC, 0xF3, 0x0C, 0x48,
88580xBC, 0xF3, 0x0C, 0x4F, 0x9C, 0xF3, 0x0C, 0x4E, 0x06, 0x93, 0x68, 0x32,
88590x2D, 0xE2, 0x60, 0x9B, 0xB1, 0xE2, 0x09, 0xE2, 0xC0, 0xF5, 0x74, 0xDC,
88600x40, 0x9A, 0x60, 0xF5, 0x40, 0xDC, 0x06, 0x94, 0xE9, 0xE4, 0x40, 0xA2,
88610xAD, 0xE4, 0x00, 0xF5, 0x44, 0xC3, 0xC9, 0xE4, 0x40, 0xA2, 0x01, 0x4C,
88620x1D, 0x54, 0x20, 0xF5, 0x5E, 0xC3, 0x06, 0xD4, 0xE7, 0x61, 0x10, 0xF0,
88630x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4,
88640x60, 0x33, 0x00, 0x6D, 0x10, 0xF0, 0x02, 0x69, 0x00, 0xF4, 0x20, 0x31,
88650x7C, 0xF2, 0x08, 0x4A, 0x1C, 0xF1, 0x08, 0x4B, 0x06, 0xD5, 0x63, 0xF3,
88660x00, 0x49, 0x2A, 0x65, 0x0B, 0x65, 0x05, 0x67, 0x89, 0x67, 0x00, 0x6D,
88670x3D, 0xE0, 0x99, 0xE0, 0xAD, 0xE6, 0x40, 0xA3, 0xB1, 0xE7, 0x01, 0x4D,
88680xA0, 0xF3, 0x48, 0xC4, 0x80, 0xF0, 0x51, 0xA3, 0x05, 0x55, 0x20, 0xF4,
88690x59, 0xC4, 0xF4, 0x61, 0x06, 0x95, 0x48, 0x67, 0x05, 0x48, 0x4D, 0xE5,
88700x40, 0xA3, 0x31, 0xE5, 0x01, 0x4D, 0xC0, 0xF4, 0x4A, 0xC4, 0x5D, 0xA3,
88710x1D, 0x55, 0xE0, 0xF4, 0x47, 0xC4, 0x06, 0xD5, 0xE1, 0x61, 0x9D, 0x67,
88720x52, 0x6A, 0x50, 0xC4, 0x41, 0x6A, 0x51, 0xC4, 0x00, 0x6B, 0x4D, 0x6A,
88730x52, 0xC4, 0x73, 0xC4, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34,
88740x7E, 0xF5, 0x00, 0x4C, 0xE0, 0xF3, 0x08, 0x6A, 0x43, 0xDC, 0xBD, 0x67,
88750x01, 0x6A, 0x10, 0xF0, 0x01, 0x6E, 0x00, 0xF4, 0xC0, 0x36, 0x54, 0xC4,
88760x30, 0xF7, 0x01, 0x4E, 0x00, 0x1C, 0xCF, 0x20, 0x10, 0x4D, 0x0A, 0x97,
88770x09, 0x91, 0x08, 0x90, 0x00, 0xEF, 0x06, 0x63, 0xC9, 0xF7, 0x1B, 0x6C,
88780xF1, 0x63, 0x8B, 0xEC, 0x1B, 0xD1, 0x80, 0x31, 0x20, 0x31, 0xE1, 0xF6,
88790x80, 0x41, 0x1C, 0x62, 0x00, 0x1C, 0xFA, 0x5B, 0x1A, 0xD0, 0xD1, 0xF6,
88800x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x07, 0xD2, 0x71, 0xF6, 0x80, 0x41,
88810x00, 0x1C, 0xFA, 0x5B, 0x08, 0xD2, 0x71, 0xF6, 0x84, 0x41, 0x00, 0x1C,
88820xFA, 0x5B, 0x09, 0xD2, 0x71, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xFA, 0x5B,
88830x0A, 0xD2, 0x71, 0xF6, 0x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x0B, 0xD2,
88840x81, 0xF6, 0x80, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x0C, 0xD2, 0x81, 0xF6,
88850x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x0D, 0xD2, 0x81, 0xF6, 0x88, 0x41,
88860x00, 0x1C, 0xFA, 0x5B, 0x0E, 0xD2, 0x81, 0xF6, 0x8C, 0x41, 0xE7, 0xF7,
88870x0E, 0x68, 0x00, 0x1C, 0xFA, 0x5B, 0x0F, 0xD2, 0xD1, 0xF6, 0x80, 0x41,
88880x10, 0xD2, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x30, 0xD1, 0xF6, 0x84, 0x41,
88890x00, 0x30, 0x00, 0x1C, 0xFA, 0x5B, 0x11, 0xD2, 0xD1, 0xF6, 0x88, 0x41,
88900x00, 0x1C, 0xFA, 0x5B, 0x12, 0xD2, 0xB0, 0x67, 0xE1, 0xF6, 0x80, 0x41,
88910xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x13, 0xD2, 0xB0, 0x67,
88920xD1, 0xF6, 0x8C, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B,
88930x00, 0x65, 0xB0, 0x67, 0x71, 0xF6, 0x80, 0x41, 0xF2, 0xF2, 0x1B, 0x4D,
88940x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xB0, 0x67, 0x71, 0xF6, 0x84, 0x41,
88950xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xB0, 0x67,
88960x71, 0xF6, 0x88, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B,
88970x00, 0x65, 0xB0, 0x67, 0x71, 0xF6, 0x8C, 0x41, 0xF2, 0xF2, 0x1B, 0x4D,
88980x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xB0, 0x67, 0x81, 0xF6, 0x80, 0x41,
88990xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xB0, 0x67,
89000x81, 0xF6, 0x84, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B,
89010x00, 0x65, 0xB0, 0x67, 0x81, 0xF6, 0x88, 0x41, 0xF2, 0xF2, 0x1B, 0x4D,
89020x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xB0, 0x67, 0x81, 0xF6, 0x8C, 0x41,
89030xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xB0, 0x67,
89040xD1, 0xF6, 0x80, 0x41, 0xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B,
89050x00, 0x65, 0xB0, 0x67, 0xD1, 0xF6, 0x84, 0x41, 0xF2, 0xF2, 0x1B, 0x4D,
89060x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0xB0, 0x67, 0xD1, 0xF6, 0x88, 0x41,
89070xF2, 0xF2, 0x1B, 0x4D, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0x6A,
89080x04, 0xD2, 0xFF, 0x6A, 0x01, 0x4A, 0x40, 0x30, 0x00, 0xF5, 0x00, 0x6A,
89090x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x15, 0xD2, 0x01, 0xF0, 0x00, 0x6A,
89100x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x00, 0x30, 0x16, 0xD2, 0x21, 0xF0,
89110x80, 0x41, 0x00, 0xF1, 0xA0, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65,
89120x21, 0xF0, 0x88, 0x41, 0x00, 0xF1, 0xA0, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
89130x00, 0x65, 0xA0, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x2A, 0xF4, 0x10, 0x4D,
89140x01, 0xF4, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0x1C,
89150x5B, 0x1F, 0x05, 0x6C, 0x01, 0xF0, 0x00, 0x6D, 0xA0, 0x35, 0x7F, 0x4D,
89160x01, 0xF4, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x65, 0x4D, 0x00, 0x1C,
89170x5B, 0x1F, 0x05, 0x6C, 0x8F, 0xF7, 0x00, 0x6D, 0xAB, 0xED, 0xA0, 0x35,
89180x21, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0xA0, 0x35, 0x00, 0x1C,
89190x5B, 0x1F, 0x05, 0x6C, 0x00, 0xF2, 0x14, 0x6D, 0xA0, 0x35, 0xA0, 0x35,
89200x00, 0xF1, 0x02, 0x4D, 0x41, 0xF6, 0x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
89210x00, 0x65, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x0D, 0xF0, 0x16, 0x6D,
89220xA0, 0x35, 0xA0, 0x35, 0xC0, 0xF4, 0x02, 0x4D, 0x41, 0xF6, 0x84, 0x41,
89230x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C,
89240xC5, 0xF0, 0x11, 0x6D, 0x41, 0xF6, 0x8C, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
89250x00, 0x65, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x00, 0xF2, 0x14, 0x6D,
89260xA0, 0x35, 0xA0, 0x35, 0x00, 0xF1, 0x02, 0x4D, 0x61, 0xF6, 0x80, 0x41,
89270x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C,
89280x05, 0xF0, 0x16, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0x01, 0xF5, 0x05, 0x4D,
89290x61, 0xF6, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x65, 0x00, 0x1C,
89300x5B, 0x1F, 0x05, 0x6C, 0x41, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
89310x15, 0x95, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x41, 0xF6, 0x88, 0x41,
89320x00, 0x1C, 0xDD, 0x5B, 0x16, 0x95, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C,
89330x00, 0x1C, 0x2C, 0x1F, 0x02, 0x6C, 0x00, 0xF2, 0x00, 0x6D, 0xA0, 0x35,
89340xA0, 0x35, 0xC5, 0xF0, 0x11, 0x4D, 0x61, 0xF6, 0x8C, 0x41, 0x00, 0x1C,
89350xDD, 0x5B, 0x00, 0x65, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x41, 0xF6,
89360x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x15, 0x95, 0x00, 0x1C, 0x5B, 0x1F,
89370x05, 0x6C, 0x41, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x16, 0x95,
89380x00, 0x1C, 0x2C, 0x1F, 0x02, 0x6C, 0xA0, 0x6D, 0xA0, 0x35, 0xA0, 0x35,
89390x2A, 0xF4, 0x13, 0x4D, 0x01, 0xF4, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
89400x00, 0x65, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x01, 0xF4, 0x88, 0x41,
89410x00, 0x1C, 0xDD, 0x5B, 0xE4, 0x6D, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C,
89420x21, 0xF6, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x00, 0x6D, 0x21, 0xF0,
89430x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0xB0, 0x67, 0x21, 0xF0, 0x88, 0x41,
89440x00, 0x1C, 0xDD, 0x5B, 0xB0, 0x67, 0xA1, 0xF6, 0x8C, 0x41, 0x00, 0x1C,
89450xFA, 0x5B, 0x00, 0x65, 0x05, 0xF0, 0x00, 0x6B, 0x6B, 0xEB, 0x60, 0x33,
89460x60, 0x33, 0x4C, 0xEB, 0x51, 0x23, 0x04, 0x95, 0x01, 0x4D, 0x0A, 0x5D,
89470x04, 0xD5, 0x3F, 0xF7, 0x04, 0x61, 0xC9, 0xF7, 0x1B, 0x68, 0x0B, 0xE8,
89480x00, 0x30, 0x00, 0x30, 0xE1, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
89490x07, 0x95, 0xD1, 0xF6, 0x8C, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x08, 0x95,
89500x71, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x09, 0x95, 0x71, 0xF6,
89510x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x0A, 0x95, 0x71, 0xF6, 0x88, 0x40,
89520x00, 0x1C, 0xDD, 0x5B, 0x0B, 0x95, 0x71, 0xF6, 0x8C, 0x40, 0x00, 0x1C,
89530xDD, 0x5B, 0x0C, 0x95, 0x81, 0xF6, 0x80, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
89540x0D, 0x95, 0x81, 0xF6, 0x84, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x0E, 0x95,
89550x81, 0xF6, 0x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x0F, 0x95, 0x81, 0xF6,
89560x8C, 0x40, 0x00, 0x1C, 0xDD, 0x5B, 0x10, 0x95, 0xD1, 0xF6, 0x80, 0x40,
89570x00, 0x1C, 0xDD, 0x5B, 0x11, 0x95, 0xD1, 0xF6, 0x84, 0x40, 0x00, 0x1C,
89580xDD, 0x5B, 0x12, 0x95, 0x81, 0xF6, 0x88, 0x40, 0x00, 0x1C, 0xDD, 0x5B,
89590x13, 0x95, 0x1C, 0x97, 0x1B, 0x91, 0x1A, 0x90, 0x00, 0xEF, 0x0F, 0x63,
89600x81, 0xF4, 0x80, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF3,
89610x1F, 0x6B, 0x4C, 0xEB, 0x91, 0xF6, 0x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B,
89620x14, 0xD3, 0xE0, 0xF3, 0x1F, 0x6C, 0x80, 0x34, 0x80, 0x34, 0x8C, 0xEA,
89630x42, 0x33, 0x14, 0x92, 0x62, 0x33, 0x10, 0xF0, 0x02, 0x6D, 0x00, 0xF4,
89640xA0, 0x35, 0x58, 0xEB, 0x63, 0xF3, 0x00, 0x4D, 0x17, 0xD5, 0xE0, 0xF3,
89650x1F, 0x6D, 0x07, 0xF7, 0x00, 0x68, 0x12, 0xEC, 0x82, 0x33, 0x17, 0x94,
89660xAC, 0xEB, 0x00, 0xF4, 0x00, 0x6D, 0x43, 0x9C, 0xAB, 0xED, 0xAC, 0xEA,
89670x6D, 0xEA, 0x43, 0xDC, 0x81, 0xF4, 0x80, 0x41, 0x00, 0x1C, 0xFA, 0x5B,
89680x00, 0x30, 0x17, 0x94, 0x00, 0xF4, 0x00, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA,
89690x63, 0x9C, 0xE0, 0xF3, 0x1F, 0x6D, 0x81, 0xF4, 0x80, 0x41, 0xAC, 0xEB,
89700xA2, 0x67, 0x00, 0x1C, 0xDD, 0x5B, 0x6D, 0xED, 0x00, 0x1C, 0x5B, 0x1F,
89710x05, 0x6C, 0x91, 0xF6, 0x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
89720xE0, 0xF3, 0x1F, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x6C, 0xEA, 0x14, 0x93,
89730x42, 0x32, 0x42, 0x32, 0x78, 0xEA, 0xE0, 0xF3, 0x1F, 0x6C, 0x80, 0x33,
89740x17, 0x94, 0x06, 0xD2, 0x43, 0x9C, 0x12, 0xED, 0xAC, 0xEB, 0x10, 0x6D,
89750xAB, 0xED, 0xA0, 0x35, 0xA0, 0x35, 0xE0, 0xF3, 0x1F, 0x4D, 0x68, 0x33,
89760xAC, 0xEA, 0x6D, 0xEA, 0x43, 0xDC, 0x81, 0xF4, 0x80, 0x41, 0x00, 0x1C,
89770xFA, 0x5B, 0x00, 0x65, 0x3F, 0x6B, 0x6B, 0xEB, 0x17, 0x94, 0x60, 0x33,
89780x60, 0x33, 0xFF, 0x4B, 0x6C, 0xEA, 0x63, 0x9C, 0xE0, 0xF3, 0x1F, 0x6D,
89790x3F, 0x6C, 0x62, 0x33, 0x6A, 0x33, 0xAC, 0xEB, 0x8C, 0xEB, 0x60, 0x33,
89800x60, 0x33, 0xA2, 0x67, 0x81, 0xF4, 0x80, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
89810x6D, 0xED, 0x91, 0xF4, 0x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
89820x02, 0xF0, 0x00, 0x6D, 0x06, 0x93, 0xA0, 0x35, 0xA0, 0x35, 0xFF, 0x4D,
89830xC0, 0xF3, 0x00, 0x6C, 0xAC, 0xEA, 0x8C, 0xEB, 0xA2, 0x67, 0x06, 0xD3,
89840x80, 0xF5, 0x60, 0x33, 0x91, 0xF4, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
89850x6D, 0xED, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x11, 0xF4, 0x84, 0x41,
89860x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xA1, 0xF6, 0x84, 0x41, 0x00, 0x1C,
89870xFA, 0x5B, 0x05, 0xD2, 0xE0, 0xF3, 0x1F, 0x6D, 0xA0, 0x35, 0xA0, 0x35,
89880xAC, 0xEA, 0x42, 0x33, 0x05, 0x92, 0x00, 0xF4, 0x00, 0x6C, 0x8B, 0xEC,
89890x62, 0x33, 0x8C, 0xEA, 0x6D, 0xEA, 0x11, 0xF4, 0x84, 0x41, 0xA2, 0x67,
89900x00, 0x1C, 0xDD, 0x5B, 0x05, 0xD2, 0xA1, 0xF6, 0x8C, 0x41, 0x00, 0x1C,
89910xFA, 0x5B, 0x00, 0x65, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x95, 0x60, 0x33,
89920x60, 0x33, 0xE0, 0xF3, 0x1F, 0x4B, 0x0C, 0xEA, 0x6C, 0xED, 0x5A, 0x32,
89930x05, 0xD5, 0x11, 0xF4, 0x84, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x4D, 0xED,
89940x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x81, 0xF4, 0x88, 0x41, 0x00, 0x1C,
89950xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF3, 0x1F, 0x6C, 0x4C, 0xEC, 0x14, 0xD4,
89960xB1, 0xF6, 0x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF3,
89970x1F, 0x6D, 0xA0, 0x35, 0xA0, 0x35, 0xAC, 0xEA, 0x42, 0x33, 0x62, 0x33,
89980x81, 0xF4, 0x88, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x18, 0xD3, 0x18, 0x93,
89990x14, 0x94, 0x98, 0xEB, 0xE0, 0xF3, 0x1F, 0x6B, 0x12, 0xED, 0xA2, 0x34,
90000x17, 0x95, 0x6C, 0xEC, 0x63, 0x9D, 0x00, 0xF4, 0x00, 0x6D, 0xAB, 0xED,
90010xAC, 0xEB, 0x8D, 0xEB, 0x17, 0x94, 0xAC, 0xEA, 0xE0, 0xF3, 0x1F, 0x6D,
90020x63, 0xDC, 0xAC, 0xEB, 0xA2, 0x67, 0x81, 0xF4, 0x88, 0x41, 0x00, 0x1C,
90030xDD, 0x5B, 0x6D, 0xED, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0xB1, 0xF6,
90040x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0xE0, 0xF3, 0x1F, 0x6B,
90050x60, 0x33, 0x60, 0x33, 0x6C, 0xEA, 0x14, 0x93, 0x42, 0x32, 0x42, 0x32,
90060x78, 0xEA, 0xE0, 0xF3, 0x1F, 0x6C, 0x80, 0x33, 0x17, 0x94, 0x06, 0xD2,
90070x43, 0x9C, 0x12, 0xED, 0xAC, 0xEB, 0x10, 0x6D, 0xAB, 0xED, 0xA0, 0x35,
90080xA0, 0x35, 0xE0, 0xF3, 0x1F, 0x4D, 0x68, 0x33, 0xAC, 0xEA, 0x6D, 0xEA,
90090x43, 0xDC, 0x81, 0xF4, 0x88, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65,
90100x10, 0xF0, 0x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xBD, 0xF7, 0x18, 0x4B,
90110x17, 0x94, 0xA0, 0x9B, 0xE0, 0xF3, 0x1F, 0x6B, 0x4C, 0xED, 0x43, 0x9C,
90120x3F, 0x6C, 0x42, 0x32, 0x4A, 0x32, 0x6C, 0xEA, 0x8C, 0xEA, 0x40, 0x32,
90130x40, 0x32, 0x81, 0xF4, 0x88, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x4D, 0xED,
90140x91, 0xF4, 0x8C, 0x41, 0x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x10, 0xF0,
90150x02, 0x6B, 0x00, 0xF4, 0x60, 0x33, 0xBD, 0xF7, 0x1C, 0x4B, 0xA0, 0x9B,
90160x06, 0x94, 0x4C, 0xED, 0xC0, 0xF3, 0x00, 0x6A, 0x4C, 0xEC, 0x80, 0xF5,
90170x80, 0x32, 0x91, 0xF4, 0x8C, 0x41, 0x00, 0x1C, 0xDD, 0x5B, 0x4D, 0xED,
90180x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x11, 0xF4, 0x8C, 0x41, 0x00, 0x1C,
90190xFA, 0x5B, 0x00, 0x65, 0xC1, 0xF6, 0x84, 0x41, 0x00, 0x1C, 0xFA, 0x5B,
90200x05, 0xD2, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0xDD, 0xF7,
90210x00, 0x4C, 0x60, 0x9C, 0x05, 0x95, 0x11, 0xF4, 0x8C, 0x41, 0x4C, 0xEB,
90220x00, 0xF4, 0x00, 0x6A, 0x4B, 0xEA, 0x62, 0x33, 0x62, 0x33, 0x4C, 0xED,
90230x6D, 0xED, 0x00, 0x1C, 0xDD, 0x5B, 0x05, 0xD5, 0xC1, 0xF6, 0x8C, 0x41,
90240x00, 0x1C, 0xFA, 0x5B, 0x00, 0x65, 0x01, 0x6C, 0x8B, 0xEC, 0x05, 0x93,
90250x80, 0x34, 0x80, 0x34, 0xE0, 0xF3, 0x1F, 0x4C, 0x8C, 0xEB, 0x4C, 0xE8,
90260xA3, 0x67, 0x1A, 0x30, 0x11, 0xF4, 0x8C, 0x41, 0x00, 0x1C, 0xDD, 0x5B,
90270x0D, 0xED, 0x00, 0x1C, 0x5B, 0x1F, 0x05, 0x6C, 0x1E, 0x16, 0x00, 0x00,
90280xFC, 0x63, 0x00, 0x6B, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
90290x9D, 0x67, 0x26, 0xF7, 0x61, 0xC2, 0x42, 0x6A, 0x50, 0xC4, 0x43, 0x6A,
90300x51, 0xC4, 0x4E, 0x6A, 0x52, 0xC4, 0x73, 0xC4, 0x10, 0xF0, 0x02, 0x6C,
90310x00, 0xF4, 0x80, 0x34, 0x9E, 0xF5, 0x18, 0x4C, 0xC0, 0xF7, 0x10, 0x6A,
90320x43, 0xDC, 0xBD, 0x67, 0x01, 0x6A, 0x10, 0xF0, 0x01, 0x6E, 0x00, 0xF4,
90330xC0, 0x36, 0x54, 0xC4, 0x13, 0xF6, 0x11, 0x4E, 0x06, 0x62, 0x00, 0x1C,
90340xCF, 0x20, 0x10, 0x4D, 0x06, 0x97, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x00,
90350xE0, 0x63, 0x3E, 0x62, 0x3C, 0xD0, 0x3D, 0xD1, 0x10, 0xF0, 0x02, 0x6D,
90360x00, 0xF4, 0xA0, 0x35, 0xC7, 0x63, 0x04, 0x04, 0xDD, 0xF7, 0x04, 0x4D,
90370x00, 0x1C, 0xF4, 0x54, 0x94, 0x6E, 0x9D, 0x67, 0x7F, 0x4C, 0x10, 0xF0,
90380x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35, 0xFF, 0x6E, 0x29, 0x4C, 0x5E, 0xF0,
90390x18, 0x4D, 0x00, 0x1C, 0xF4, 0x54, 0x09, 0x4E, 0x9D, 0x67, 0x10, 0xF0,
90400x02, 0x6D, 0x00, 0xF4, 0xA0, 0x35, 0xFF, 0x6E, 0xA0, 0xF1, 0x10, 0x4C,
90410x7E, 0xF1, 0x00, 0x4D, 0x00, 0x1C, 0xF4, 0x54, 0x09, 0x4E, 0x10, 0xF0,
90420x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0x00, 0x6B,
90430x63, 0xC2, 0x00, 0x68, 0xA2, 0x67, 0xFF, 0x6C, 0x08, 0x32, 0x04, 0x06,
90440xAD, 0xE2, 0xC9, 0xE2, 0x40, 0x9A, 0x01, 0x48, 0x8C, 0xE8, 0x25, 0x58,
90450x46, 0xDB, 0xF6, 0x61, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32,
90460x63, 0xF3, 0x00, 0x4A, 0x00, 0x68, 0x0A, 0x65, 0xFF, 0x69, 0x0C, 0x32,
90470x68, 0x67, 0x04, 0x04, 0x00, 0x6D, 0x7D, 0xE2, 0x99, 0xE2, 0xAD, 0xE6,
90480x80, 0xF0, 0x58, 0xA3, 0xB1, 0xE7, 0x01, 0x4D, 0xA0, 0xF0, 0x4C, 0xC4,
90490xA0, 0xF1, 0x40, 0xA3, 0x2C, 0xED, 0x08, 0x5D, 0xA0, 0xF1, 0x54, 0xC4,
90500xF2, 0x61, 0x01, 0x48, 0x2C, 0xE8, 0x21, 0x58, 0xE8, 0x61, 0xC8, 0x67,
90510x1F, 0x6A, 0xA0, 0xF2, 0x5E, 0xC6, 0x00, 0x6F, 0x01, 0x6A, 0x62, 0x9E,
90520xA0, 0xF2, 0xFF, 0xC6, 0xC0, 0xF2, 0x40, 0xC6, 0x10, 0xF0, 0x00, 0x6E,
90530xC0, 0x36, 0xC0, 0x36, 0xFF, 0x4E, 0x40, 0x6A, 0xCC, 0xEB, 0x4B, 0xEA,
90540x4C, 0xEB, 0x0C, 0x6A, 0x4D, 0xEB, 0x07, 0xF7, 0x01, 0x6A, 0x4B, 0xEA,
90550x4C, 0xEB, 0x03, 0xF0, 0x00, 0x6A, 0x4D, 0xEB, 0x07, 0xF7, 0x00, 0x6A,
90560x4B, 0xEA, 0x08, 0xF0, 0x00, 0x6C, 0x40, 0x32, 0x8B, 0xEC, 0xFF, 0x4A,
90570x80, 0x34, 0x4C, 0xEB, 0x4F, 0x44, 0x4C, 0xEB, 0x10, 0xF0, 0x00, 0x6A,
90580x4B, 0xEA, 0x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB, 0x40, 0x6A, 0x4D, 0xEB,
90590x08, 0xF0, 0x00, 0x6D, 0x81, 0x6A, 0xAD, 0xEB, 0x4B, 0xEA, 0x4C, 0xEB,
90600xFF, 0x6A, 0x01, 0x4A, 0x4B, 0xEA, 0x40, 0x32, 0xEF, 0xF7, 0x1F, 0x4A,
90610x4C, 0xEB, 0x0C, 0xF0, 0x00, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32,
90620xFF, 0x4A, 0x4C, 0xEB, 0x48, 0x67, 0x62, 0xDA, 0xA0, 0x35, 0x63, 0x9A,
90630x44, 0x9A, 0x80, 0x34, 0xA0, 0x35, 0xFF, 0x4C, 0xFF, 0x4D, 0xAC, 0xEA,
90640x8C, 0xEB, 0x88, 0x67, 0x44, 0xDC, 0x01, 0x6A, 0x4B, 0xEA, 0xC0, 0xF2,
90650x42, 0xC4, 0xFF, 0x6A, 0xCC, 0xEB, 0xC0, 0xF2, 0x44, 0xCC, 0x12, 0x6A,
90660xC0, 0xF2, 0xE6, 0xC4, 0x63, 0xDC, 0xC0, 0xF2, 0x47, 0xC4, 0x00, 0x1C,
90670xF6, 0x48, 0x00, 0x65, 0x39, 0x63, 0x3E, 0x97, 0x3D, 0x91, 0x3C, 0x90,
90680x00, 0xEF, 0x20, 0x63, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4, 0x80, 0x34,
90690x63, 0xF3, 0x00, 0x4C, 0xFF, 0xF7, 0x1F, 0x6A, 0x66, 0xF7, 0x4C, 0xDC,
90700x01, 0x6A, 0x4B, 0xEA, 0xFC, 0x63, 0x45, 0xC4, 0x1C, 0x6A, 0x06, 0x62,
90710xC0, 0xF2, 0x4F, 0xC4, 0xC0, 0xF2, 0x51, 0xC4, 0x0A, 0x6A, 0x3E, 0x6B,
90720xC0, 0xF2, 0x52, 0xC4, 0x40, 0x9C, 0xC0, 0xF2, 0x6E, 0xC4, 0xC0, 0xF2,
90730x70, 0xC4, 0x02, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA, 0x21, 0x6B, 0x6B, 0xEB,
90740x6C, 0xEA, 0x00, 0x6D, 0x40, 0xDC, 0x06, 0xF0, 0x00, 0x6A, 0xE0, 0xF2,
90750xA6, 0xC4, 0x4B, 0xEA, 0xE0, 0xF2, 0x64, 0x9C, 0x40, 0x32, 0x40, 0x32,
90760xFF, 0x4A, 0x4C, 0xEB, 0x20, 0x6A, 0xC0, 0xF2, 0x57, 0xC4, 0x08, 0xF0,
90770x00, 0x6A, 0x4B, 0xEA, 0x40, 0x32, 0x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB,
90780x10, 0xF0, 0x00, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xFF, 0x4A, 0x4C, 0xEB,
90790x20, 0x6A, 0xC0, 0xF2, 0x48, 0xCC, 0xFF, 0x6A, 0x01, 0x4A, 0xE0, 0xF2,
90800x64, 0xDC, 0xC0, 0xF2, 0x4A, 0xCC, 0x01, 0x6B, 0x00, 0xF2, 0x00, 0x6A,
90810xC0, 0xF2, 0xB6, 0xC4, 0xC0, 0xF2, 0xB4, 0xC4, 0xC0, 0xF2, 0xB5, 0xC4,
90820xC0, 0xF2, 0x4C, 0xCC, 0x61, 0xC4, 0x44, 0x6A, 0x9D, 0x67, 0x50, 0xC4,
90830x49, 0x6A, 0x51, 0xC4, 0x47, 0x6A, 0x52, 0xC4, 0xB3, 0xC4, 0x10, 0xF0,
90840x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x7E, 0xF5, 0x1C, 0x4C, 0xC0, 0xF7,
90850x10, 0x6A, 0xBD, 0x67, 0x10, 0xF0, 0x01, 0x6E, 0x00, 0xF4, 0xC0, 0x36,
90860x43, 0xDC, 0x74, 0xC4, 0x93, 0xF6, 0x19, 0x4E, 0x00, 0x1C, 0xCF, 0x20,
90870x10, 0x4D, 0x06, 0x97, 0x00, 0xEF, 0x04, 0x63, 0xFA, 0x63, 0x08, 0xD0,
90880x10, 0xF0, 0x02, 0x68, 0x00, 0xF4, 0x00, 0x30, 0x63, 0xF3, 0x00, 0x48,
90890x40, 0x98, 0x11, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA, 0x09, 0x6B, 0x6B, 0xEB,
90900x6C, 0xEA, 0x40, 0xD8, 0x7D, 0x67, 0x44, 0x6A, 0x50, 0xC3, 0x49, 0x6A,
90910x09, 0xD1, 0x51, 0xC3, 0x00, 0x69, 0x47, 0x6A, 0x10, 0xF0, 0x02, 0x6C,
90920x00, 0xF4, 0x80, 0x34, 0x1E, 0xF6, 0x08, 0x4C, 0x52, 0xC3, 0x33, 0xC3,
90930x14, 0x6A, 0x01, 0x6B, 0xBD, 0x67, 0x10, 0xF0, 0x01, 0x6E, 0x00, 0xF4,
90940xC0, 0x36, 0x43, 0xDC, 0x74, 0xC4, 0x10, 0x4D, 0x95, 0xF0, 0x05, 0x4E,
90950x0A, 0x62, 0x00, 0x1C, 0xCF, 0x20, 0x23, 0xC8, 0x5D, 0x67, 0x47, 0x6B,
90960x78, 0xC2, 0x7D, 0x67, 0x3B, 0x6A, 0x59, 0xC3, 0x43, 0x6A, 0x5A, 0xC3,
90970x01, 0x6A, 0x4B, 0xEA, 0x00, 0xF3, 0x44, 0xC0, 0xFF, 0x6A, 0x01, 0x4A,
90980x3B, 0xC3, 0x4B, 0xEA, 0x00, 0xF3, 0x64, 0x98, 0x40, 0x32, 0x40, 0x32,
90990xE0, 0xF0, 0x1F, 0x4A, 0x4C, 0xEB, 0x00, 0xF2, 0x00, 0x6A, 0x40, 0x32,
91000xF3, 0xF0, 0x14, 0x4A, 0x00, 0xF3, 0x4C, 0xD8, 0xFF, 0x6A, 0x01, 0x4A,
91010x40, 0x32, 0x46, 0xF0, 0x16, 0x4A, 0x00, 0xF3, 0x64, 0xD8, 0x00, 0xF3,
91020x50, 0xD8, 0x60, 0x98, 0x02, 0x6A, 0x00, 0xF3, 0x47, 0xC0, 0x05, 0x6A,
91030x4B, 0xEA, 0x00, 0x6C, 0x4C, 0xEB, 0x81, 0x6A, 0x00, 0xF3, 0x88, 0xD8,
91040x00, 0xF3, 0x94, 0xD8, 0x00, 0xF3, 0x98, 0xD8, 0x4B, 0xEA, 0x10, 0xF0,
91050x02, 0x6C, 0x00, 0xF4, 0x80, 0x34, 0x4C, 0xEB, 0xBE, 0xF5, 0x14, 0x4C,
91060xC0, 0xF7, 0x10, 0x6A, 0x60, 0xD8, 0xBD, 0x67, 0x43, 0xDC, 0x10, 0xF0,
91070x01, 0x6E, 0x00, 0xF4, 0xC0, 0x36, 0x01, 0x6A, 0x54, 0xC4, 0x55, 0xF1,
91080x09, 0x4E, 0x00, 0x1C, 0xCF, 0x20, 0x18, 0x4D, 0x4A, 0x6A, 0x00, 0xF3,
91090x5C, 0xC0, 0x45, 0x6A, 0x00, 0xF3, 0x5D, 0xC0, 0x46, 0x6A, 0x00, 0xF3,
91100x5E, 0xC0, 0x40, 0x6A, 0x00, 0xF3, 0x5F, 0xC0, 0x23, 0x6A, 0x20, 0xF3,
91110x40, 0xC0, 0x1E, 0x6A, 0x20, 0xF3, 0x41, 0xC0, 0x0A, 0x97, 0x09, 0x91,
91120x08, 0x90, 0x00, 0xEF, 0x06, 0x63, 0x00, 0x00, 0xFC, 0x63, 0x7D, 0x67,
91130x3B, 0x6A, 0x50, 0xC3, 0x43, 0x6A, 0x51, 0xC3, 0x36, 0x6A, 0x52, 0xC3,
91140x00, 0x6B, 0x5D, 0x67, 0x73, 0xC2, 0x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4,
91150x40, 0x32, 0x63, 0xF3, 0x00, 0x4A, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4,
91160x80, 0x34, 0xDE, 0xF5, 0x10, 0x4C, 0xC0, 0xF2, 0x73, 0xC2, 0xC0, 0xF7,
91170x10, 0x6A, 0x43, 0xDC, 0xBD, 0x67, 0x01, 0x6A, 0x10, 0xF0, 0x01, 0x6E,
91180x00, 0xF4, 0xC0, 0x36, 0x54, 0xC4, 0x95, 0xF4, 0x05, 0x4E, 0x06, 0x62,
91190x00, 0x1C, 0xCF, 0x20, 0x10, 0x4D, 0x06, 0x97, 0x00, 0xEF, 0x04, 0x63,
91200x10, 0xF0, 0x02, 0x6A, 0x00, 0xF4, 0x40, 0x32, 0xFC, 0x63, 0x63, 0xF3,
91210x00, 0x4A, 0x01, 0x6D, 0x00, 0x6B, 0x9D, 0x67, 0x66, 0xF7, 0xB6, 0xCA,
91220x66, 0xF7, 0x74, 0xCA, 0x52, 0x6A, 0x50, 0xC4, 0x53, 0x6A, 0x51, 0xC4,
91230x54, 0x6A, 0x52, 0xC4, 0x73, 0xC4, 0x10, 0xF0, 0x02, 0x6C, 0x00, 0xF4,
91240x80, 0x34, 0x3E, 0xF6, 0x04, 0x4C, 0xE0, 0xF1, 0x14, 0x6A, 0xB4, 0xC4,
91250x10, 0xF0, 0x02, 0x6E, 0x00, 0xF4, 0xC0, 0x36, 0xBD, 0x67, 0x43, 0xDC,
91260x10, 0xF5, 0x0D, 0x4E, 0x06, 0x62, 0x00, 0x1C, 0xCF, 0x20, 0x10, 0x4D,
91270x06, 0x97, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x65, 0xD8, 0xFF, 0xBD, 0x27,
91280x02, 0x80, 0x03, 0x3C, 0x20, 0x00, 0xBF, 0xAF, 0x1C, 0x00, 0xB1, 0xAF,
91290x18, 0x00, 0xB0, 0xAF, 0x74, 0xF2, 0x62, 0x24, 0x02, 0x00, 0x48, 0x90,
91300x74, 0xF2, 0x67, 0x94, 0x02, 0x80, 0x02, 0x3C, 0xD0, 0x5D, 0x42, 0x24,
91310x02, 0x00, 0x10, 0x24, 0x01, 0x80, 0x06, 0x3C, 0x21, 0x20, 0x40, 0x00,
91320x14, 0x00, 0x50, 0xA0, 0x10, 0x00, 0xA5, 0x27, 0xFC, 0xC1, 0xC6, 0x24,
91330x02, 0x80, 0x11, 0x3C, 0x20, 0x5E, 0x31, 0x26, 0x10, 0x00, 0xA7, 0xA7,
91340x12, 0x00, 0xA8, 0xA3, 0xCF, 0x20, 0x00, 0x0C, 0x13, 0x00, 0xA0, 0xA3,
91350x02, 0x80, 0x06, 0x3C, 0x21, 0x20, 0x20, 0x02, 0x10, 0x00, 0xA5, 0x27,
91360x14, 0x00, 0x30, 0xA2, 0xCF, 0x20, 0x00, 0x0C, 0x08, 0x86, 0xC6, 0x24,
91370x02, 0x80, 0x02, 0x3C, 0xEC, 0x5D, 0x40, 0xA0, 0x0C, 0x00, 0x04, 0x24,
91380x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0xED, 0x5D, 0x64, 0xA0,
91390xEE, 0x5D, 0x44, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C,
91400x04, 0x5E, 0x60, 0xA0, 0x06, 0x5E, 0x40, 0xA0, 0x02, 0x80, 0x03, 0x3C,
91410x02, 0x80, 0x02, 0x3C, 0x0C, 0x5E, 0x60, 0xA0, 0x01, 0x00, 0x06, 0x24,
91420x0D, 0x5E, 0x40, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C,
91430xF0, 0x5D, 0x66, 0xA0, 0x12, 0x00, 0x04, 0x24, 0x0E, 0x5E, 0x40, 0xA0,
91440x02, 0x80, 0x03, 0x3C, 0x02, 0x80, 0x02, 0x3C, 0xEF, 0x5D, 0x66, 0xA0,
91450xF1, 0x5D, 0x44, 0xA0, 0x02, 0x80, 0x03, 0x3C, 0x0C, 0x00, 0x04, 0x24,
91460x02, 0x80, 0x02, 0x3C, 0xF2, 0x5D, 0x60, 0xA0, 0x02, 0x80, 0x05, 0x3C,
91470xFC, 0x5D, 0x44, 0xA4, 0x64, 0x00, 0x03, 0x24, 0x02, 0x80, 0x02, 0x3C,
91480xF4, 0x5D, 0xA3, 0xA4, 0xC6, 0x5C, 0x43, 0x90, 0xF4, 0x5D, 0xA4, 0x94,
91490x02, 0x00, 0x05, 0x24, 0x02, 0x00, 0x63, 0x30, 0x01, 0x00, 0x63, 0x2C,
91500xFF, 0xFF, 0x84, 0x30, 0x23, 0x28, 0xA3, 0x00, 0x80, 0x22, 0x04, 0x00,
91510x02, 0x80, 0x02, 0x3C, 0xE8, 0x03, 0x03, 0x24, 0xF8, 0x5D, 0x44, 0xAC,
91520x0C, 0x00, 0x23, 0xAE, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
91530x00, 0x5E, 0x40, 0xAC, 0x05, 0x5E, 0x60, 0xA0, 0x02, 0x80, 0x02, 0x3C,
91540x02, 0x80, 0x03, 0x3C, 0x07, 0x5E, 0x40, 0xA0, 0x0F, 0x5E, 0x60, 0xA0,
91550x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C, 0x3C, 0x5E, 0x45, 0xA0,
91560x20, 0x00, 0xBF, 0x8F, 0x08, 0x5E, 0x60, 0xA0, 0x02, 0x80, 0x02, 0x3C,
91570x02, 0x80, 0x03, 0x3C, 0x1C, 0x00, 0xB1, 0x8F, 0x18, 0x00, 0xB0, 0x8F,
91580x09, 0x5E, 0x46, 0xA0, 0x0A, 0x5E, 0x66, 0xA0, 0x02, 0x80, 0x02, 0x3C,
91590x02, 0x80, 0x03, 0x3C, 0x0B, 0x5E, 0x40, 0xA0, 0x21, 0x20, 0x00, 0x00,
91600x10, 0x5E, 0x60, 0xAC, 0x02, 0x80, 0x02, 0x3C, 0x02, 0x80, 0x03, 0x3C,
91610x21, 0x28, 0x00, 0x00, 0x28, 0x00, 0xBD, 0x27, 0x14, 0x5E, 0x40, 0xAC,
91620x18, 0x5E, 0x64, 0xAC, 0x1C, 0x5E, 0x65, 0xAC, 0x08, 0x00, 0xE0, 0x03,
91630x00, 0x00, 0x00, 0x00, 0xD8, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB3, 0xAF,
91640x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
91650x20, 0x00, 0xBF, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x21, 0x98, 0xA0, 0x00,
91660x21, 0x88, 0xC0, 0x00, 0x21, 0x90, 0x00, 0x00, 0x00, 0x00, 0x04, 0x82,
91670x5C, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x40, 0x14,
91680x01, 0x00, 0x10, 0x26, 0xFF, 0xFF, 0x10, 0x26, 0x00, 0x00, 0x04, 0x92,
91690x2B, 0x00, 0x02, 0x24, 0x00, 0x1E, 0x04, 0x00, 0x03, 0x1E, 0x03, 0x00,
91700x41, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x24,
91710x30, 0x00, 0x22, 0x12, 0x00, 0x1E, 0x04, 0x00, 0x07, 0x00, 0x20, 0x16,
91720x21, 0x18, 0x80, 0x00, 0x00, 0x1E, 0x04, 0x00, 0x03, 0x1E, 0x03, 0x00,
91730x30, 0x00, 0x02, 0x24, 0x3B, 0x00, 0x62, 0x10, 0x0A, 0x00, 0x11, 0x24,
91740x21, 0x18, 0x80, 0x00, 0x00, 0x16, 0x03, 0x00, 0x03, 0x16, 0x02, 0x00,
91750x1A, 0x00, 0x40, 0x10, 0xFF, 0x00, 0x64, 0x30, 0xA9, 0xFF, 0x82, 0x24,
91760x61, 0x00, 0x83, 0x2C, 0xFF, 0x00, 0x45, 0x30, 0x09, 0x00, 0x60, 0x10,
91770x41, 0x00, 0x86, 0x2C, 0xC9, 0xFF, 0x82, 0x24, 0xFF, 0x00, 0x45, 0x30,
91780x05, 0x00, 0xC0, 0x10, 0x3A, 0x00, 0x87, 0x2C, 0xD0, 0xFF, 0x82, 0x24,
91790x02, 0x00, 0xE0, 0x10, 0xFF, 0x00, 0x05, 0x24, 0xFF, 0x00, 0x45, 0x30,
91800x2A, 0x10, 0xB1, 0x00, 0x0A, 0x00, 0x40, 0x10, 0x18, 0x00, 0x51, 0x02,
91810x01, 0x00, 0x10, 0x26, 0x12, 0x10, 0x00, 0x00, 0x2B, 0x18, 0x52, 0x00,
91820x23, 0x00, 0x60, 0x14, 0x21, 0x90, 0xA2, 0x00, 0x00, 0x00, 0x03, 0x92,
91830x00, 0x00, 0x00, 0x00, 0xE8, 0xFF, 0x60, 0x14, 0xFF, 0x00, 0x64, 0x30,
91840x02, 0x00, 0x60, 0x12, 0x21, 0x10, 0x40, 0x02, 0x00, 0x00, 0x70, 0xAE,
91850x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
91860x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0x08, 0x00, 0xE0, 0x03,
91870x28, 0x00, 0xBD, 0x27, 0x03, 0x1E, 0x03, 0x00, 0x30, 0x00, 0x02, 0x24,
91880xCE, 0xFF, 0x62, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x82,
91890x78, 0x00, 0x02, 0x24, 0x03, 0x00, 0x62, 0x10, 0x58, 0x00, 0x02, 0x24,
91900xD0, 0xFF, 0x62, 0x14, 0x21, 0x18, 0x80, 0x00, 0x02, 0x00, 0x10, 0x26,
91910x00, 0x00, 0x04, 0x92, 0x63, 0x71, 0x00, 0x08, 0x10, 0x00, 0x11, 0x24,
91920x01, 0x00, 0x10, 0x26, 0x00, 0x00, 0x04, 0x92, 0x5A, 0x71, 0x00, 0x08,
91930x10, 0x00, 0x02, 0x24, 0x8F, 0x71, 0x00, 0x08, 0x08, 0x00, 0x11, 0x24,
91940x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
91950x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0xFF, 0xFF, 0x02, 0x24,
91960x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27, 0x21, 0x48, 0x80, 0x00,
91970x31, 0x00, 0xC0, 0x14, 0x21, 0x50, 0x00, 0x00, 0x00, 0x00, 0x87, 0x90,
91980x30, 0x00, 0x02, 0x24, 0x00, 0x1E, 0x07, 0x00, 0x03, 0x1E, 0x03, 0x00,
91990x2E, 0x00, 0x62, 0x10, 0x0A, 0x00, 0x06, 0x24, 0x02, 0x80, 0x02, 0x3C,
92000x40, 0xF4, 0x4B, 0x24, 0xFF, 0x00, 0xE8, 0x30, 0x21, 0x10, 0x0B, 0x01,
92010x00, 0x00, 0x44, 0x90, 0x00, 0x1E, 0x07, 0x00, 0x03, 0x1E, 0x03, 0x00,
92020x44, 0x00, 0x82, 0x30, 0x02, 0x00, 0x87, 0x30, 0xD0, 0xFF, 0x63, 0x24,
92030x1A, 0x00, 0x40, 0x10, 0x04, 0x00, 0x84, 0x30, 0x07, 0x00, 0x80, 0x14,
92040x2B, 0x10, 0x66, 0x00, 0x21, 0x10, 0x00, 0x01, 0x02, 0x00, 0xE0, 0x10,
92050xE0, 0xFF, 0x03, 0x25, 0xFF, 0x00, 0x62, 0x30, 0xC9, 0xFF, 0x43, 0x24,
92060x2B, 0x10, 0x66, 0x00, 0x10, 0x00, 0x40, 0x10, 0x18, 0x00, 0x46, 0x01,
92070x01, 0x00, 0x29, 0x25, 0x00, 0x00, 0x27, 0x91, 0x00, 0x00, 0x00, 0x00,
92080xFF, 0x00, 0xE8, 0x30, 0x12, 0x10, 0x00, 0x00, 0x21, 0x50, 0x43, 0x00,
92090x21, 0x10, 0x0B, 0x01, 0x00, 0x00, 0x44, 0x90, 0x00, 0x1E, 0x07, 0x00,
92100x03, 0x1E, 0x03, 0x00, 0x44, 0x00, 0x82, 0x30, 0x02, 0x00, 0x87, 0x30,
92110xD0, 0xFF, 0x63, 0x24, 0xE8, 0xFF, 0x40, 0x14, 0x04, 0x00, 0x84, 0x30,
92120x02, 0x00, 0xA0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xAC,
92130x08, 0x00, 0xE0, 0x03, 0x21, 0x10, 0x40, 0x01, 0x00, 0x00, 0x87, 0x90,
92140xB1, 0x71, 0x00, 0x08, 0x02, 0x80, 0x02, 0x3C, 0x01, 0x00, 0x89, 0x24,
92150x00, 0x00, 0x27, 0x91, 0x78, 0x00, 0x02, 0x24, 0x00, 0x1E, 0x07, 0x00,
92160x03, 0x1E, 0x03, 0x00, 0xCD, 0xFF, 0x62, 0x14, 0x08, 0x00, 0x06, 0x24,
92170x01, 0x00, 0x22, 0x91, 0x02, 0x80, 0x03, 0x3C, 0x40, 0xF4, 0x63, 0x24,
92180x21, 0x10, 0x43, 0x00, 0x00, 0x00, 0x44, 0x90, 0x00, 0x00, 0x00, 0x00,
92190x44, 0x00, 0x84, 0x30, 0xC5, 0xFF, 0x80, 0x10, 0x02, 0x80, 0x02, 0x3C,
92200x01, 0x00, 0x29, 0x25, 0x00, 0x00, 0x27, 0x91, 0xB1, 0x71, 0x00, 0x08,
92210x10, 0x00, 0x06, 0x24, 0xE8, 0xFF, 0xBD, 0x27, 0x10, 0x00, 0xBF, 0xAF,
92220x00, 0x00, 0x83, 0x80, 0x2D, 0x00, 0x02, 0x24, 0x04, 0x00, 0x62, 0x10,
92230x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xBF, 0x8F, 0xA7, 0x71, 0x00, 0x08,
92240x18, 0x00, 0xBD, 0x27, 0xA7, 0x71, 0x00, 0x0C, 0x01, 0x00, 0x84, 0x24,
92250x10, 0x00, 0xBF, 0x8F, 0x23, 0x10, 0x02, 0x00, 0x08, 0x00, 0xE0, 0x03,
92260x18, 0x00, 0xBD, 0x27, 0xD8, 0xFF, 0xBD, 0x27, 0x1C, 0x00, 0xB3, 0xAF,
92270x18, 0x00, 0xB2, 0xAF, 0x14, 0x00, 0xB1, 0xAF, 0x10, 0x00, 0xB0, 0xAF,
92280x20, 0x00, 0xBF, 0xAF, 0x21, 0x80, 0x80, 0x00, 0x21, 0x90, 0xA0, 0x00,
92290x21, 0x98, 0xC0, 0x00, 0x21, 0x88, 0x00, 0x00, 0x00, 0x00, 0x04, 0x82,
92300x5C, 0x58, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x40, 0x14,
92310x01, 0x00, 0x10, 0x26, 0xFF, 0xFF, 0x10, 0x26, 0x00, 0x00, 0x03, 0x82,
92320x2D, 0x00, 0x02, 0x24, 0x0F, 0x00, 0x62, 0x10, 0x21, 0x20, 0x00, 0x02,
92330x21, 0x28, 0x40, 0x02, 0x43, 0x71, 0x00, 0x0C, 0x21, 0x30, 0x60, 0x02,
92340x12, 0x00, 0x40, 0x04, 0x21, 0x18, 0x40, 0x00, 0x23, 0x10, 0x02, 0x00,
92350x0A, 0x10, 0x71, 0x00, 0x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F,
92360x18, 0x00, 0xB2, 0x8F, 0x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F,
92370x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27, 0x01, 0x00, 0x10, 0x26,
92380x21, 0x20, 0x00, 0x02, 0x21, 0x28, 0x40, 0x02, 0x43, 0x71, 0x00, 0x0C,
92390x21, 0x30, 0x60, 0x02, 0xFF, 0xFF, 0x11, 0x24, 0xF0, 0xFF, 0x41, 0x04,
92400x21, 0x18, 0x40, 0x00, 0xF0, 0xFF, 0x20, 0x16, 0x00, 0x80, 0x02, 0x3C,
92410x20, 0x00, 0xBF, 0x8F, 0x1C, 0x00, 0xB3, 0x8F, 0x18, 0x00, 0xB2, 0x8F,
92420x14, 0x00, 0xB1, 0x8F, 0x10, 0x00, 0xB0, 0x8F, 0xFF, 0x7F, 0x02, 0x3C,
92430xFF, 0xFF, 0x42, 0x34, 0x08, 0x00, 0xE0, 0x03, 0x28, 0x00, 0xBD, 0x27,
92440x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92450x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F,
92460x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x01, 0x7F, 0x78, 0x0C, 0x00, 0x00,
92470x01, 0x00, 0x02, 0x7E, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x03, 0x7D,
92480x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x04, 0x7C, 0x78, 0x0C, 0x00, 0x00,
92490x01, 0x00, 0x05, 0x7B, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x06, 0x7A,
92500x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x07, 0x79, 0x78, 0x0C, 0x00, 0x00,
92510x01, 0x00, 0x08, 0x78, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x09, 0x77,
92520x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x76, 0x78, 0x0C, 0x00, 0x00,
92530x01, 0x00, 0x0B, 0x75, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x74,
92540x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x0D, 0x73, 0x78, 0x0C, 0x00, 0x00,
92550x01, 0x00, 0x0E, 0x72, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x71,
92560x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x10, 0x70, 0x78, 0x0C, 0x00, 0x00,
92570x01, 0x00, 0x11, 0x6F, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x12, 0x6F,
92580x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x13, 0x6E, 0x78, 0x0C, 0x00, 0x00,
92590x01, 0x00, 0x14, 0x6D, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x15, 0x6D,
92600x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x16, 0x6C, 0x78, 0x0C, 0x00, 0x00,
92610x01, 0x00, 0x17, 0x6B, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x18, 0x6A,
92620x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x19, 0x6A, 0x78, 0x0C, 0x00, 0x00,
92630x01, 0x00, 0x1A, 0x69, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x1B, 0x68,
92640x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x1C, 0x67, 0x78, 0x0C, 0x00, 0x00,
92650x01, 0x00, 0x1D, 0x66, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x1E, 0x65,
92660x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x64, 0x78, 0x0C, 0x00, 0x00,
92670x01, 0x00, 0x20, 0x63, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x21, 0x4C,
92680x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x22, 0x4B, 0x78, 0x0C, 0x00, 0x00,
92690x01, 0x00, 0x23, 0x4A, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x24, 0x49,
92700x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x25, 0x48, 0x78, 0x0C, 0x00, 0x00,
92710x01, 0x00, 0x26, 0x47, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x27, 0x46,
92720x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x28, 0x45, 0x78, 0x0C, 0x00, 0x00,
92730x01, 0x00, 0x29, 0x44, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x2C,
92740x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x2B, 0x2B, 0x78, 0x0C, 0x00, 0x00,
92750x01, 0x00, 0x2C, 0x2A, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x2D, 0x29,
92760x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x28, 0x78, 0x0C, 0x00, 0x00,
92770x01, 0x00, 0x2F, 0x27, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x30, 0x26,
92780x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x31, 0x25, 0x78, 0x0C, 0x00, 0x00,
92790x01, 0x00, 0x32, 0x24, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x33, 0x23,
92800x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x34, 0x22, 0x78, 0x0C, 0x00, 0x00,
92810x01, 0x00, 0x35, 0x09, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x36, 0x08,
92820x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x37, 0x07, 0x78, 0x0C, 0x00, 0x00,
92830x01, 0x00, 0x38, 0x06, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x39, 0x05,
92840x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x3A, 0x04, 0x78, 0x0C, 0x00, 0x00,
92850x01, 0x00, 0x3B, 0x03, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x3C, 0x02,
92860x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x3D, 0x01, 0x78, 0x0C, 0x00, 0x00,
92870x01, 0x00, 0x3E, 0x00, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x00,
92880x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x40, 0x7F, 0x78, 0x0C, 0x00, 0x00,
92890x01, 0x00, 0x41, 0x7F, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x42, 0x7E,
92900x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x43, 0x7D, 0x78, 0x0C, 0x00, 0x00,
92910x01, 0x00, 0x44, 0x7C, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x45, 0x7B,
92920x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x46, 0x7A, 0x78, 0x0C, 0x00, 0x00,
92930x01, 0x00, 0x47, 0x79, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x48, 0x78,
92940x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x49, 0x77, 0x78, 0x0C, 0x00, 0x00,
92950x01, 0x00, 0x4A, 0x76, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x4B, 0x75,
92960x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x4C, 0x74, 0x78, 0x0C, 0x00, 0x00,
92970x01, 0x00, 0x4D, 0x73, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x4E, 0x72,
92980x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x4F, 0x71, 0x78, 0x0C, 0x00, 0x00,
92990x01, 0x00, 0x50, 0x70, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x51, 0x6F,
93000x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x52, 0x6F, 0x78, 0x0C, 0x00, 0x00,
93010x01, 0x00, 0x53, 0x6E, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x54, 0x6D,
93020x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x55, 0x6D, 0x78, 0x0C, 0x00, 0x00,
93030x01, 0x00, 0x56, 0x6C, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x57, 0x6B,
93040x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x58, 0x6A, 0x78, 0x0C, 0x00, 0x00,
93050x01, 0x00, 0x59, 0x6A, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x5A, 0x69,
93060x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x5B, 0x68, 0x78, 0x0C, 0x00, 0x00,
93070x01, 0x00, 0x5C, 0x67, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x5D, 0x66,
93080x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x5E, 0x65, 0x78, 0x0C, 0x00, 0x00,
93090x01, 0x00, 0x5F, 0x64, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x60, 0x63,
93100x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x61, 0x4C, 0x78, 0x0C, 0x00, 0x00,
93110x01, 0x00, 0x62, 0x4B, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x63, 0x4A,
93120x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x64, 0x49, 0x78, 0x0C, 0x00, 0x00,
93130x01, 0x00, 0x65, 0x48, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x66, 0x47,
93140x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x67, 0x46, 0x78, 0x0C, 0x00, 0x00,
93150x01, 0x00, 0x68, 0x45, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x69, 0x44,
93160x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x6A, 0x2C, 0x78, 0x0C, 0x00, 0x00,
93170x01, 0x00, 0x6B, 0x2B, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x6C, 0x2A,
93180x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x6D, 0x29, 0x78, 0x0C, 0x00, 0x00,
93190x01, 0x00, 0x6E, 0x28, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x6F, 0x27,
93200x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x70, 0x26, 0x78, 0x0C, 0x00, 0x00,
93210x01, 0x00, 0x71, 0x25, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x72, 0x24,
93220x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x73, 0x23, 0x78, 0x0C, 0x00, 0x00,
93230x01, 0x00, 0x74, 0x22, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x75, 0x09,
93240x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x76, 0x08, 0x78, 0x0C, 0x00, 0x00,
93250x01, 0x00, 0x77, 0x07, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x78, 0x06,
93260x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x79, 0x05, 0x78, 0x0C, 0x00, 0x00,
93270x01, 0x00, 0x7A, 0x04, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x7B, 0x03,
93280x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x7C, 0x02, 0x78, 0x0C, 0x00, 0x00,
93290x01, 0x00, 0x7D, 0x01, 0x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x7E, 0x00,
93300x78, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x78, 0x0C, 0x00, 0x00,
93310x1E, 0x00, 0x00, 0x30, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x01, 0x30,
93320x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x02, 0x30, 0x78, 0x0C, 0x00, 0x00,
93330x1E, 0x00, 0x03, 0x30, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x04, 0x30,
93340x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x05, 0x34, 0x78, 0x0C, 0x00, 0x00,
93350x1E, 0x00, 0x06, 0x38, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x07, 0x3E,
93360x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x3E, 0x78, 0x0C, 0x00, 0x00,
93370x1E, 0x00, 0x09, 0x44, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x0A, 0x46,
93380x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x0B, 0x48, 0x78, 0x0C, 0x00, 0x00,
93390x1E, 0x00, 0x0C, 0x48, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x0D, 0x4E,
93400x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x0E, 0x56, 0x78, 0x0C, 0x00, 0x00,
93410x1E, 0x00, 0x0F, 0x5A, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x10, 0x5E,
93420x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x11, 0x62, 0x78, 0x0C, 0x00, 0x00,
93430x1E, 0x00, 0x12, 0x6C, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x13, 0x72,
93440x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x14, 0x72, 0x78, 0x0C, 0x00, 0x00,
93450x1E, 0x00, 0x15, 0x72, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x16, 0x72,
93460x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x17, 0x72, 0x78, 0x0C, 0x00, 0x00,
93470x1E, 0x00, 0x18, 0x72, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x19, 0x72,
93480x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x1A, 0x72, 0x78, 0x0C, 0x00, 0x00,
93490x1E, 0x00, 0x1B, 0x72, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x1C, 0x72,
93500x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x1D, 0x72, 0x78, 0x0C, 0x00, 0x00,
93510x1E, 0x00, 0x1E, 0x72, 0x78, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x72,
93520x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x06, 0x06, 0x04,
93530x04, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x02, 0x02, 0x00,
93540x08, 0x0E, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93550x10, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x08, 0x08, 0x04,
93560x14, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x02, 0x02, 0x00,
93570x18, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x08, 0x08, 0x04,
93580x1C, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x02, 0x02, 0x00,
93590x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93600x04, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93610x08, 0x0E, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93620x10, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93630x14, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93640x18, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93650x1C, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93660x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93670x04, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93680x08, 0x0E, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93690x10, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93700x14, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93710x18, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93720x1C, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93730x00, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93740x04, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93750x08, 0x0E, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93760x10, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93770x14, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93780x18, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93790x1C, 0x0E, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
93800x04, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
93810x24, 0x08, 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x04, 0x00, 0x30, 0x00,
93820x2C, 0x08, 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x04, 0x00, 0x30, 0x00,
93830x70, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00,
93840x64, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
93850x78, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x02, 0x00,
93860x74, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x00,
93870x78, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x00,
93880x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x00,
93890x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x00,
93900x0C, 0x09, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00,
93910x04, 0x0C, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00,
93920x04, 0x0D, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
93930xF4, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
93940x34, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x13, 0x00, 0x00, 0x00,
93950x04, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
93960x24, 0x08, 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x04, 0x00, 0x30, 0x00,
93970x2C, 0x08, 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x02, 0x00, 0x30, 0x00,
93980x70, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00,
93990x64, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94000x78, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x00,
94010x74, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94020x78, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94030x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94040x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94050x0C, 0x09, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
94060x04, 0x0C, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00,
94070x04, 0x0D, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
94080xF4, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x77, 0x77, 0x00, 0x00,
94090x34, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0A, 0x00, 0x00, 0x00,
94100x44, 0x08, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00,
94110x04, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
94120x24, 0x08, 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x04, 0x00, 0x30, 0x00,
94130x2C, 0x08, 0x00, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x02, 0x00, 0x10, 0x00,
94140x70, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00,
94150x64, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94160x78, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x00,
94170x74, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94180x78, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94190x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94200x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00,
94210x0C, 0x09, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
94220x04, 0x0C, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
94230x04, 0x0D, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
94240xF4, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x77, 0x77, 0x00, 0x00,
94250x34, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0A, 0x00, 0x00, 0x00,
94260x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00,
94270x00, 0x00, 0x04, 0x00, 0x04, 0x08, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
94280x08, 0x08, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x00,
94290x0A, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x88, 0x50, 0x00, 0x10,
94300x14, 0x08, 0x00, 0x00, 0x10, 0x3D, 0x0C, 0x02, 0x18, 0x08, 0x00, 0x00,
94310x85, 0x01, 0x20, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94320x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x24, 0x08, 0x00, 0x00,
94330x04, 0x00, 0x39, 0x00, 0x28, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
94340x2C, 0x08, 0x00, 0x00, 0x04, 0x00, 0x39, 0x00, 0x30, 0x08, 0x00, 0x00,
94350x04, 0x00, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x00, 0x02, 0x69, 0x00,
94360x38, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3C, 0x08, 0x00, 0x00,
94370x00, 0x02, 0x69, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
94380x44, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x08, 0x00, 0x00,
94390x00, 0x00, 0x00, 0x00, 0x4C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94400x50, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00,
94410x00, 0x00, 0x00, 0x00, 0x58, 0x08, 0x00, 0x00, 0x48, 0x48, 0x48, 0x48,
94420x5C, 0x08, 0x00, 0x00, 0xA9, 0x65, 0xA9, 0x65, 0x60, 0x08, 0x00, 0x00,
94430x30, 0x01, 0x7F, 0x0F, 0x64, 0x08, 0x00, 0x00, 0x30, 0x01, 0x7F, 0x0F,
94440x68, 0x08, 0x00, 0x00, 0x30, 0x01, 0x7F, 0x0F, 0x6C, 0x08, 0x00, 0x00,
94450x30, 0x01, 0x7F, 0x0F, 0x70, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x03,
94460x74, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x78, 0x08, 0x00, 0x00,
94470x02, 0x00, 0x02, 0x00, 0x7C, 0x08, 0x00, 0x00, 0x01, 0x02, 0x4F, 0x00,
94480x80, 0x08, 0x00, 0x00, 0xC1, 0x0A, 0x30, 0xA8, 0x84, 0x08, 0x00, 0x00,
94490x58, 0x00, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
94500x8C, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00,
94510x00, 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
94520x98, 0x08, 0x00, 0x00, 0x10, 0x20, 0x30, 0x40, 0x9C, 0x08, 0x00, 0x00,
94530x50, 0x60, 0x70, 0x00, 0xB0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94540xE0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x08, 0x00, 0x00,
94550x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x33, 0x33, 0x33, 0x30,
94560x04, 0x0E, 0x00, 0x00, 0x2F, 0x2E, 0x2D, 0x2A, 0x08, 0x0E, 0x00, 0x00,
94570x32, 0x32, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x33, 0x33, 0x33, 0x30,
94580x14, 0x0E, 0x00, 0x00, 0x2F, 0x2E, 0x2D, 0x2A, 0x18, 0x0E, 0x00, 0x00,
94590x33, 0x33, 0x33, 0x30, 0x1C, 0x0E, 0x00, 0x00, 0x2F, 0x2E, 0x2D, 0x2A,
94600x30, 0x0E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x01, 0x34, 0x0E, 0x00, 0x00,
94610x00, 0x48, 0x00, 0x01, 0x38, 0x0E, 0x00, 0x00, 0x1F, 0xDC, 0x00, 0x10,
94620x3C, 0x0E, 0x00, 0x00, 0x1F, 0x8C, 0x00, 0x10, 0x40, 0x0E, 0x00, 0x00,
94630xA0, 0x00, 0x14, 0x02, 0x44, 0x0E, 0x00, 0x00, 0xA0, 0x00, 0x16, 0x28,
94640x48, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0xF8, 0x4C, 0x0E, 0x00, 0x00,
94650x10, 0x29, 0x00, 0x00, 0x50, 0x0E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x01,
94660x54, 0x0E, 0x00, 0x00, 0x00, 0x48, 0x00, 0x01, 0x58, 0x0E, 0x00, 0x00,
94670x1F, 0xDC, 0x00, 0x10, 0x5C, 0x0E, 0x00, 0x00, 0x1F, 0x8C, 0x00, 0x10,
94680x60, 0x0E, 0x00, 0x00, 0xA0, 0x00, 0x14, 0x02, 0x64, 0x0E, 0x00, 0x00,
94690xA0, 0x00, 0x16, 0x28, 0x6C, 0x0E, 0x00, 0x00, 0x10, 0x29, 0x00, 0x00,
94700x70, 0x0E, 0x00, 0x00, 0xFB, 0x92, 0xED, 0x31, 0x74, 0x0E, 0x00, 0x00,
94710xFB, 0x36, 0x15, 0x36, 0x78, 0x0E, 0x00, 0x00, 0xFB, 0x36, 0x15, 0x36,
94720x7C, 0x0E, 0x00, 0x00, 0xFB, 0x36, 0x15, 0x36, 0x80, 0x0E, 0x00, 0x00,
94730xFB, 0x36, 0x15, 0x36, 0x84, 0x0E, 0x00, 0x00, 0xFB, 0x92, 0x0D, 0x00,
94740x88, 0x0E, 0x00, 0x00, 0xFB, 0x92, 0x0D, 0x00, 0x8C, 0x0E, 0x00, 0x00,
94750xFB, 0x92, 0xED, 0x31, 0xD0, 0x0E, 0x00, 0x00, 0xFB, 0x92, 0xED, 0x31,
94760xD4, 0x0E, 0x00, 0x00, 0xFB, 0x92, 0xED, 0x31, 0xD8, 0x0E, 0x00, 0x00,
94770xFB, 0x92, 0x0D, 0x00, 0xDC, 0x0E, 0x00, 0x00, 0xFB, 0x92, 0x0D, 0x00,
94780xE0, 0x0E, 0x00, 0x00, 0xFB, 0x92, 0x0D, 0x00, 0xE4, 0x0E, 0x00, 0x00,
94790x48, 0x54, 0x5E, 0x01, 0xE8, 0x0E, 0x00, 0x00, 0x48, 0x54, 0x55, 0x21,
94800x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00,
94810x23, 0x00, 0x00, 0x00, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94820x0C, 0x09, 0x00, 0x00, 0x13, 0x13, 0x12, 0x01, 0x00, 0x0A, 0x00, 0x00,
94830xC8, 0x47, 0xD0, 0x00, 0x04, 0x0A, 0x00, 0x00, 0x08, 0x00, 0xFF, 0x80,
94840x08, 0x0A, 0x00, 0x00, 0x00, 0x83, 0xCD, 0x88, 0x0C, 0x0A, 0x00, 0x00,
94850x0F, 0x12, 0x62, 0x2E, 0x10, 0x0A, 0x00, 0x00, 0x78, 0xBB, 0x00, 0x95,
94860x14, 0x0A, 0x00, 0x00, 0x28, 0x40, 0x14, 0x11, 0x18, 0x0A, 0x00, 0x00,
94870x17, 0x11, 0x88, 0x00, 0x1C, 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x14, 0x89,
94880x20, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x1A, 0x24, 0x0A, 0x00, 0x00,
94890x17, 0x13, 0x0E, 0x09, 0x28, 0x0A, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00,
94900x2C, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xD3, 0x10, 0x00, 0x0C, 0x00, 0x00,
94910x40, 0x1D, 0x07, 0x40, 0x04, 0x0C, 0x00, 0x00, 0x33, 0x56, 0xA0, 0x00,
94920x08, 0x0C, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00,
94930x6C, 0x6C, 0x6C, 0x6C, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08,
94940x14, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x18, 0x0C, 0x00, 0x00,
94950x00, 0x00, 0x00, 0x08, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40,
94960x20, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x0C, 0x00, 0x00,
94970x00, 0x01, 0x00, 0x40, 0x28, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
94980x2C, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x30, 0x0C, 0x00, 0x00,
94990x44, 0xAC, 0xE9, 0x6D, 0x34, 0x0C, 0x00, 0x00, 0xCF, 0x52, 0x96, 0x46,
95000x38, 0x0C, 0x00, 0x00, 0x94, 0x59, 0x79, 0x49, 0x3C, 0x0C, 0x00, 0x00,
95010x64, 0x97, 0x97, 0x0A, 0x40, 0x0C, 0x00, 0x00, 0x3F, 0x40, 0x7C, 0x1F,
95020x44, 0x0C, 0x00, 0x00, 0xB7, 0x00, 0x01, 0x00, 0x48, 0x0C, 0x00, 0x00,
95030x00, 0x00, 0x02, 0xEC, 0x4C, 0x0C, 0x00, 0x00, 0x7F, 0x03, 0x7F, 0x00,
95040x50, 0x0C, 0x00, 0x00, 0x20, 0x34, 0x54, 0x69, 0x54, 0x0C, 0x00, 0x00,
95050x94, 0x00, 0x3C, 0x43, 0x58, 0x0C, 0x00, 0x00, 0x20, 0x34, 0x54, 0x69,
95060x5C, 0x0C, 0x00, 0x00, 0x94, 0x00, 0x3C, 0x43, 0x60, 0x0C, 0x00, 0x00,
95070x20, 0x34, 0x54, 0x69, 0x64, 0x0C, 0x00, 0x00, 0x94, 0x00, 0x3C, 0x43,
95080x68, 0x0C, 0x00, 0x00, 0x20, 0x34, 0x54, 0x69, 0x6C, 0x0C, 0x00, 0x00,
95090x94, 0x00, 0x3C, 0x43, 0x70, 0x0C, 0x00, 0x00, 0x0D, 0x00, 0x7F, 0x2C,
95100x74, 0x0C, 0x00, 0x00, 0x5B, 0x17, 0x86, 0x01, 0x78, 0x0C, 0x00, 0x00,
95110x1F, 0x00, 0x00, 0x00, 0x7C, 0x0C, 0x00, 0x00, 0x12, 0x16, 0xB9, 0x00,
95120x80, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x84, 0x0C, 0x00, 0x00,
95130x00, 0x00, 0xF6, 0x20, 0x88, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20,
95140x8C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x90, 0x0C, 0x00, 0x00,
95150x00, 0x01, 0x00, 0x40, 0x94, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95160x98, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x9C, 0x0C, 0x00, 0x00,
95170x00, 0x00, 0x00, 0x00, 0xA0, 0x0C, 0x00, 0x00, 0x92, 0x24, 0x49, 0x00,
95180xA4, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x0C, 0x00, 0x00,
95190x00, 0x00, 0x00, 0x00, 0xAC, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95200xB0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x0C, 0x00, 0x00,
95210x00, 0x00, 0x00, 0x00, 0xB8, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95220xBC, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xC0, 0x0C, 0x00, 0x00,
95230x00, 0x00, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95240xC8, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x0C, 0x00, 0x00,
95250x00, 0x00, 0x00, 0x00, 0xD0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95260xD4, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x0C, 0x00, 0x00,
95270x27, 0x24, 0xB2, 0x64, 0xDC, 0x0C, 0x00, 0x00, 0x32, 0x69, 0x76, 0x00,
95280xE0, 0x0C, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0xE4, 0x0C, 0x00, 0x00,
95290x00, 0x00, 0x00, 0x00, 0xE8, 0x0C, 0x00, 0x00, 0x02, 0x43, 0x64, 0x37,
95300xEC, 0x0C, 0x00, 0x00, 0x0C, 0xD4, 0x97, 0x2F, 0x00, 0x0D, 0x00, 0x00,
95310x50, 0x07, 0x00, 0x00, 0x04, 0x0D, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00,
95320x08, 0x0D, 0x00, 0x00, 0x7F, 0x90, 0x00, 0x00, 0x0C, 0x0D, 0x00, 0x00,
95330x01, 0x00, 0x00, 0x00, 0x10, 0x0D, 0x00, 0x00, 0x33, 0x33, 0x63, 0xA0,
95340x14, 0x0D, 0x00, 0x00, 0x63, 0x3C, 0x33, 0x33, 0x18, 0x0D, 0x00, 0x00,
95350x6B, 0x5B, 0x8F, 0x6A, 0x1C, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95360x20, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0D, 0x00, 0x00,
95370x00, 0x00, 0x00, 0x00, 0x28, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95380x2C, 0x0D, 0x00, 0x00, 0x75, 0x99, 0x97, 0xCC, 0x30, 0x0D, 0x00, 0x00,
95390x00, 0x00, 0x00, 0x00, 0x34, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95400x38, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0D, 0x00, 0x00,
95410x93, 0x72, 0x02, 0x00, 0x40, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95420x44, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0D, 0x00, 0x00,
95430x00, 0x00, 0x00, 0x00, 0x50, 0x0D, 0x00, 0x00, 0x0A, 0x14, 0x37, 0x64,
95440x54, 0x0D, 0x00, 0x00, 0x02, 0xBD, 0x4D, 0x02, 0x58, 0x0D, 0x00, 0x00,
95450x00, 0x00, 0x00, 0x00, 0x5C, 0x0D, 0x00, 0x00, 0x64, 0x20, 0x03, 0x30,
95460x60, 0x0D, 0x00, 0x00, 0x68, 0xDE, 0x53, 0x46, 0x64, 0x0D, 0x00, 0x00,
95470x3C, 0x8A, 0x51, 0x00, 0x68, 0x0D, 0x00, 0x00, 0x01, 0x21, 0x00, 0x00,
95480x14, 0x0F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x4C, 0x0F, 0x00, 0x00,
95490x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
95500x40, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
95510x10, 0x00, 0x00, 0x00, 0x84, 0x02, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00,
95520xB4, 0x02, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00, 0xC0, 0x08, 0x01, 0x80,
95530x10, 0x00, 0x00, 0x00, 0xC8, 0x08, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00,
95540xD0, 0x08, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00, 0xD8, 0x08, 0x01, 0x80,
95550x10, 0x00, 0x00, 0x00, 0xB0, 0x08, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00,
95560xB8, 0x08, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00, 0x10, 0x09, 0x01, 0x80,
95570x10, 0x00, 0x00, 0x00, 0x18, 0x09, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00,
95580x58, 0x04, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00, 0x50, 0x04, 0x01, 0x80,
95590x10, 0x00, 0x00, 0x00, 0x20, 0x09, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00,
95600x28, 0x09, 0x01, 0x80, 0x74, 0x03, 0x00, 0x00, 0xF0, 0x28, 0x00, 0x80,
95610x04, 0x00, 0x00, 0x00, 0x88, 0x06, 0x01, 0x80, 0x74, 0x03, 0x00, 0x00,
95620xF0, 0x28, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0xAC, 0x2B, 0x00, 0x80,
95630x30, 0x00, 0x00, 0x00, 0x58, 0x2C, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00,
95640x1C, 0x2F, 0x00, 0x80, 0x13, 0x00, 0x00, 0x00, 0x7C, 0x07, 0x01, 0x80,
95650x17, 0x00, 0x00, 0x00, 0xD0, 0x07, 0x01, 0x80, 0x06, 0x00, 0x00, 0x00,
95660x58, 0x08, 0x01, 0x80, 0x06, 0x00, 0x00, 0x00, 0x60, 0x08, 0x01, 0x80,
95670x08, 0x00, 0x00, 0x00, 0x68, 0x08, 0x01, 0x80, 0x0C, 0x00, 0x00, 0x00,
95680x70, 0x08, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00, 0x78, 0x08, 0x01, 0x80,
95690x0E, 0x00, 0x00, 0x00, 0x80, 0x08, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00,
95700x88, 0x08, 0x01, 0x80, 0x38, 0x00, 0x00, 0x00, 0x90, 0x08, 0x01, 0x80,
95710x04, 0x00, 0x00, 0x00, 0x98, 0x08, 0x01, 0x80, 0x02, 0x00, 0x00, 0x00,
95720xA0, 0x08, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00, 0xA8, 0x08, 0x01, 0x80,
95730x01, 0x00, 0x00, 0x00, 0xE8, 0x08, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00,
95740xF0, 0x08, 0x01, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x60, 0x04, 0x01, 0x80,
95750x0E, 0x00, 0x00, 0x00, 0x68, 0x04, 0x01, 0x80, 0x0C, 0x00, 0x00, 0x00,
95760x80, 0x06, 0x01, 0x80, 0x34, 0x00, 0x00, 0x00, 0xF8, 0x08, 0x01, 0x80,
95770x04, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00,
95780x30, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00, 0x38, 0x09, 0x01, 0x80,
95790x04, 0x00, 0x00, 0x00, 0x40, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00,
95800x08, 0x09, 0x01, 0x80, 0x08, 0x00, 0x00, 0x00, 0xB8, 0x03, 0x01, 0x80,
95810x04, 0x00, 0x00, 0x00, 0x48, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00,
95820xC0, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00, 0xCC, 0x09, 0x01, 0x80,
95830x04, 0x00, 0x00, 0x00, 0xD4, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00,
95840xDC, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x01, 0x80,
95850x04, 0x00, 0x00, 0x00, 0xEC, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00,
95860xF4, 0x09, 0x01, 0x80, 0x04, 0x00, 0x00, 0x00, 0xFC, 0x09, 0x01, 0x80,
95870x04, 0x00, 0x00, 0x00, 0x04, 0x0A, 0x01, 0x80, 0x74, 0x03, 0x00, 0x00,
95880x0C, 0x0A, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x30, 0x0B, 0x01, 0x80,
95890x10, 0x00, 0x00, 0x00, 0x0C, 0x33, 0x00, 0x80, 0x06, 0x00, 0x00, 0x00,
95900x6C, 0x0B, 0x01, 0x80, 0x13, 0x00, 0x00, 0x00, 0xF8, 0x9E, 0x02, 0x00,
95910x13, 0x00, 0x00, 0x00, 0xC8, 0x5E, 0x02, 0x00, 0x13, 0x00, 0x00, 0x00,
95920xF8, 0x0E, 0x02, 0x00, 0x13, 0x00, 0x00, 0x00, 0xC8, 0xCE, 0x01, 0x00,
95930x13, 0x00, 0x00, 0x00, 0xD4, 0x8E, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00,
95940xA4, 0x4E, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, 0xD0, 0x0E, 0x01, 0x00,
95950x13, 0x00, 0x00, 0x00, 0xA0, 0xCE, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
95960xD0, 0x86, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xA0, 0x46, 0x00, 0x00,
95970x13, 0x00, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
95980xA4, 0x9E, 0x02, 0x00, 0x13, 0x00, 0x00, 0x00, 0x74, 0x5E, 0x02, 0x00,
95990x13, 0x00, 0x00, 0x00, 0xA4, 0x0E, 0x02, 0x00, 0x13, 0x00, 0x00, 0x00,
96000xD0, 0xCE, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, 0x40, 0x9F, 0x01, 0x00,
96010x13, 0x00, 0x00, 0x00, 0x70, 0x4E, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00,
96020xA0, 0x06, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0xC6, 0x00, 0x00,
96030x13, 0x00, 0x00, 0x00, 0xA0, 0x82, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
96040x70, 0x42, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00,
96050xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44,
96060x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00,
96070xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44,
96080x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00,
96090xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44,
96100x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00,
96110xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44,
96120x44, 0x22, 0x22, 0x00, 0xAA, 0x88, 0x88, 0x44, 0x44, 0x22, 0x22, 0x00,
96130x00, 0x00, 0x00, 0x00, 0x59, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00,
96140x41, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00,
96150x05, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00,
96160x03, 0xC8, 0x0F, 0x00, 0x13, 0x00, 0x00, 0x00, 0xB0, 0x7C, 0x01, 0x00,
96170x13, 0x00, 0x00, 0x00, 0xC0, 0x1C, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00,
96180x60, 0xDC, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x60, 0x8C, 0x00, 0x00,
96190x13, 0x00, 0x00, 0x00, 0x50, 0x44, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
96200x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x01, 0x03, 0x00,
96210x01, 0x00, 0x00, 0x00, 0x50, 0x02, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00,
96220x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x08, 0x00,
96230x11, 0x00, 0x00, 0x00, 0xFC, 0x31, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00,
96240x0F, 0x00, 0x0C, 0x00, 0x11, 0x00, 0x00, 0x00, 0xF8, 0xF9, 0x03, 0x00,
96250x10, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00,
96260x01, 0x01, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x09, 0x01, 0x00,
96270x14, 0x00, 0x00, 0x00, 0x3E, 0x09, 0x09, 0x00, 0x15, 0x00, 0x00, 0x00,
96280xF4, 0x98, 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0F, 0x00,
96290x1A, 0x00, 0x00, 0x00, 0x56, 0x30, 0x01, 0x00, 0x1B, 0x00, 0x00, 0x00,
96300x00, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
96310x1E, 0x00, 0x00, 0x00, 0x59, 0x10, 0x03, 0x00, 0x21, 0x00, 0x00, 0x00,
96320x00, 0x40, 0x05, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3C, 0x08, 0x00, 0x00,
96330x23, 0x00, 0x00, 0x00, 0x58, 0x15, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
96340x60, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x83, 0x25, 0x02, 0x00,
96350x26, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
96360xF1, 0xAC, 0x0E, 0x00, 0x28, 0x00, 0x00, 0x00, 0x54, 0xBD, 0x09, 0x00,
96370x29, 0x00, 0x00, 0x00, 0x82, 0x45, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00,
96380x01, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x34, 0x13, 0x02, 0x00,
96390x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96400x0A, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
96410x2B, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96420x33, 0x33, 0x05, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
96430x2A, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96440x08, 0x08, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x33, 0xB3, 0x05, 0x00,
96450x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00,
96460x03, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
96470x2B, 0x00, 0x00, 0x00, 0x33, 0x33, 0x06, 0x00, 0x2C, 0x00, 0x00, 0x00,
96480x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
96490x2B, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96500x33, 0xB3, 0x06, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00,
96510x2A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96520x09, 0x07, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x33, 0x33, 0x05, 0x00,
96530x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00,
96540x06, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00,
96550x2B, 0x00, 0x00, 0x00, 0x33, 0xB3, 0x05, 0x00, 0x2C, 0x00, 0x00, 0x00,
96560x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
96570x2B, 0x00, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96580x33, 0x33, 0x06, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00,
96590x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96600x09, 0x07, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x33, 0xB3, 0x06, 0x00,
96610x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00,
96620x09, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0x00,
96630x2B, 0x00, 0x00, 0x00, 0x33, 0x33, 0x05, 0x00, 0x2C, 0x00, 0x00, 0x00,
96640x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
96650x2B, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96660x33, 0xB3, 0x05, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00,
96670x2A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96680x0A, 0x06, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x33, 0x33, 0x06, 0x00,
96690x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00,
96700x0C, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0x00,
96710x2B, 0x00, 0x00, 0x00, 0x33, 0xB3, 0x06, 0x00, 0x2C, 0x00, 0x00, 0x00,
96720x0D, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00,
96730x2B, 0x00, 0x00, 0x00, 0x0B, 0x05, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96740x33, 0x33, 0x05, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00,
96750x2A, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00,
96760x0B, 0x05, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x23, 0x66, 0x06, 0x00,
96770x2C, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00,
96780x00, 0x40, 0x0E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
96790x31, 0x00, 0x00, 0x00, 0x31, 0x96, 0x0B, 0x00, 0x32, 0x00, 0x00, 0x00,
96800x0D, 0x13, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00,
96810x13, 0x00, 0x00, 0x00, 0x6C, 0x9E, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00,
96820x94, 0x5E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x01, 0x01, 0x00,
96830x18, 0x00, 0x00, 0x00, 0x01, 0xF4, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
96840x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x5B, 0x10, 0x03, 0x00,
96850xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96860x59, 0x01, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x04, 0x00,
96870x11, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x02, 0x00, 0x6C, 0x09, 0x00, 0x00,
96880x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
96890x0D, 0x00, 0x00, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
96900x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
96910x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x17, 0x05, 0x03,
96920x22, 0x43, 0x5E, 0x00, 0x4F, 0xA4, 0x00, 0x00, 0x4F, 0xA4, 0x00, 0x00,
96930x22, 0x43, 0x5E, 0x00, 0x4F, 0xA4, 0x00, 0x00, 0x22, 0x43, 0x5E, 0x00,
96940x4F, 0xA4, 0x3E, 0x00, 0x30, 0xA6, 0x00, 0x00, 0x4F, 0xA4, 0x3E, 0x00,
96950x2B, 0xA4, 0x5E, 0x00, 0x2B, 0xA4, 0x00, 0x00, 0x2B, 0xA4, 0x5E, 0x00,
96960x22, 0xA4, 0x5E, 0x00, 0x4F, 0xA4, 0x00, 0x00, 0x4F, 0xA4, 0x00, 0x00,
96970x4F, 0xA4, 0x5E, 0x00, 0x4F, 0xA4, 0x5E, 0x00, 0x4F, 0xA4, 0x5E, 0x00,
96980x1C, 0x42, 0x2F, 0x00, 0x4F, 0x64, 0x5E, 0x00, 0x4F, 0xA4, 0x5E, 0x00,
96990x4F, 0xA4, 0x5E, 0x00, 0x4F, 0xA4, 0x00, 0x00, 0x4F, 0xA4, 0x5E, 0x00,
97000x00, 0xE0, 0x4C, 0x02, 0x01, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x4C, 0x00,
97010x00, 0x0C, 0x43, 0x00, 0x00, 0x50, 0x43, 0x00, 0x00, 0x40, 0x96, 0x00,
97020x00, 0x05, 0xB5, 0x00, 0x00, 0x0A, 0xF7, 0x00, 0x00, 0x10, 0x18, 0x00,
97030x00, 0x21, 0x91, 0x00, 0x00, 0x1C, 0xF0, 0x00, 0x00, 0x13, 0x74, 0x00,
97040x00, 0x03, 0x7F, 0x00, 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00,
97050x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97060x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97070x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
97080xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xE7, 0x01, 0x80,
97090xE0, 0x25, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00, 0xBC, 0xE7, 0x01, 0x80,
97100xE8, 0x25, 0x01, 0x80, 0x20, 0x00, 0x00, 0x00, 0xC8, 0xE7, 0x01, 0x80,
97110xE0, 0x25, 0x01, 0x80, 0x30, 0x00, 0x00, 0x00, 0xD8, 0xE7, 0x01, 0x80,
97120xE8, 0x25, 0x01, 0x80, 0x40, 0x00, 0x00, 0x00, 0xE8, 0xE7, 0x01, 0x80,
97130x44, 0x43, 0x00, 0x80, 0x50, 0x00, 0x00, 0x00, 0xF4, 0xE7, 0x01, 0x80,
97140xD4, 0x49, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x80,
97150x34, 0x53, 0x00, 0x80, 0x90, 0x00, 0x00, 0x00, 0x0C, 0xE8, 0x01, 0x80,
97160x64, 0x30, 0x01, 0x80, 0xA0, 0x00, 0x00, 0x00, 0x14, 0xE8, 0x01, 0x80,
97170x6C, 0x30, 0x01, 0x80, 0xB0, 0x00, 0x00, 0x00, 0x20, 0xE8, 0x01, 0x80,
97180x9C, 0x39, 0x01, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x28, 0xE8, 0x01, 0x80,
97190x8C, 0x30, 0x01, 0x80, 0xD0, 0x00, 0x00, 0x00, 0x34, 0xE8, 0x01, 0x80,
97200xFC, 0x4E, 0x00, 0x80, 0xC8, 0x00, 0x00, 0x00, 0x40, 0xE8, 0x01, 0x80,
97210x54, 0x4A, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x00, 0x4C, 0xE8, 0x01, 0x80,
97220xAC, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
97230x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97240xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97250x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0xFF, 0x00, 0x00, 0x00,
97260x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
97270x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x00, 0x00, 0x00,
97280x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x00, 0x00, 0x00,
97290x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0x00, 0x00,
97300x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
97310xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97320x00, 0x01, 0x01, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97330x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97340x00, 0x00, 0x00, 0x00, 0xD0, 0xDF, 0x01, 0x80, 0xD0, 0xDF, 0x01, 0x80,
97350x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x31, 0x20, 0x10, 0x00,
97360x00, 0x30, 0x00, 0x00, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00,
97370x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x00, 0x00, 0x31, 0x2F, 0x10, 0x10,
97380x00, 0x30, 0x00, 0x00, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00,
97390x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x00, 0x00, 0x22, 0x20, 0x18, 0x08,
97400x00, 0x20, 0x00, 0x00, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x00, 0x00,
97410x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x00, 0x00, 0x22, 0x21, 0x20, 0x08,
97420x00, 0x20, 0x00, 0x00, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x00, 0x00,
97430x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x00, 0x00, 0x1A, 0x19, 0x18, 0x10,
97440x00, 0x18, 0x00, 0x00, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x00, 0x00,
97450x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x02,
97460x00, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x00, 0x00,
97470x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x00, 0x00, 0x08, 0x07, 0x06, 0x04,
97480x00, 0x06, 0x00, 0x00, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x00, 0x00,
97490x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x00, 0x00, 0x05, 0x04, 0x03, 0x02,
97500x00, 0x03, 0x00, 0x00, 0x09, 0x08, 0x07, 0x06, 0x07, 0x06, 0x06, 0x05,
97510x05, 0x04, 0x04, 0x03, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x03,
97520x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x00, 0x09, 0x08, 0x07,
97530x06, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, 0x05, 0x04, 0x04,
97540x03, 0x03, 0x02, 0x02, 0x02, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01,
97550x01, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
97560x08, 0x10, 0x10, 0x20, 0x08, 0x08, 0x08, 0x08, 0x20, 0x20, 0x20, 0x20,
97570x08, 0x08, 0x08, 0x08, 0x08, 0x20, 0x20, 0x20, 0x30, 0x08, 0x08, 0x08,
97580x08, 0x18, 0x18, 0x18, 0x18, 0x18, 0x20, 0x30, 0x30, 0x10, 0x20, 0x20,
97590x20, 0x20, 0x20, 0x30, 0x30, 0x08, 0x10, 0x20, 0x30, 0x30, 0x30, 0x30,
97600x30, 0x30, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
97610x08, 0x10, 0x10, 0x20, 0x08, 0x08, 0x08, 0x08, 0x08, 0x20, 0x20, 0x20,
97620x08, 0x08, 0x08, 0x08, 0x08, 0x20, 0x20, 0x20, 0x20, 0x08, 0x08, 0x08,
97630x08, 0x18, 0x18, 0x18, 0x18, 0x18, 0x20, 0x30, 0x30, 0x10, 0x20, 0x20,
97640x20, 0x20, 0x20, 0x30, 0x30, 0x08, 0x10, 0x20, 0x30, 0x30, 0x30, 0x30,
97650x30, 0x30, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A, 0x09, 0x08,
97660x04, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00,
97670x0A, 0x09, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x0A, 0x09,
97680x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x00,
97690x00, 0x12, 0x11, 0x10, 0x08, 0x00, 0x12, 0x11, 0x10, 0x08, 0x00, 0x22,
97700x21, 0x20, 0x18, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08,
97710x00, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00,
97720x22, 0x21, 0x20, 0x18, 0x00, 0x22, 0x21, 0x20, 0x18, 0x00, 0x22, 0x21,
97730x1C, 0x08, 0x00, 0x22, 0x20, 0x18, 0x08, 0x00, 0x0A, 0x09, 0x08, 0x02,
97740x00, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x0A,
97750x09, 0x08, 0x02, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x22, 0x21, 0x20,
97760x10, 0x00, 0x22, 0x21, 0x20, 0x08, 0x00, 0x22, 0x21, 0x1C, 0x08, 0x00,
97770x31, 0x30, 0x18, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A, 0x09,
97780x08, 0x04, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A, 0x09, 0x08, 0x04,
97790x00, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x1A,
97800x19, 0x18, 0x10, 0x00, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x1A, 0x19, 0x18,
97810x10, 0x00, 0x22, 0x21, 0x20, 0x08, 0x00, 0x31, 0x2C, 0x10, 0x10, 0x00,
97820x31, 0x28, 0x10, 0x00, 0x00, 0x12, 0x11, 0x10, 0x08, 0x00, 0x22, 0x21,
97830x20, 0x18, 0x00, 0x22, 0x21, 0x20, 0x18, 0x00, 0x22, 0x21, 0x20, 0x08,
97840x00, 0x22, 0x21, 0x14, 0x08, 0x00, 0x22, 0x20, 0x18, 0x08, 0x00, 0x31,
97850x30, 0x20, 0x10, 0x00, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x0A, 0x09, 0x08,
97860x00, 0x00, 0x12, 0x11, 0x10, 0x08, 0x00, 0x22, 0x21, 0x20, 0x18, 0x00,
97870x22, 0x21, 0x20, 0x18, 0x00, 0x31, 0x30, 0x20, 0x10, 0x00, 0x31, 0x2F,
97880x10, 0x10, 0x00, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x31, 0x10, 0x10, 0x00,
97890x00, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x04,
97900x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A,
97910x09, 0x08, 0x04, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08,
97920x00, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00,
97930x0A, 0x09, 0x08, 0x00, 0x00, 0x12, 0x11, 0x10, 0x08, 0x00, 0x12, 0x11,
97940x10, 0x08, 0x00, 0x22, 0x21, 0x20, 0x18, 0x00, 0x0A, 0x09, 0x08, 0x04,
97950x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x0A,
97960x09, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x22, 0x21, 0x20,
97970x18, 0x00, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x22, 0x21, 0x14, 0x08, 0x00,
97980x0A, 0x09, 0x08, 0x02, 0x00, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x0A, 0x09,
97990x08, 0x02, 0x00, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x0A, 0x09, 0x08, 0x00,
98000x00, 0x22, 0x21, 0x20, 0x10, 0x00, 0x22, 0x21, 0x20, 0x08, 0x00, 0x22,
98010x21, 0x14, 0x08, 0x00, 0x22, 0x21, 0x14, 0x08, 0x00, 0x0A, 0x09, 0x08,
98020x04, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x0A, 0x09, 0x08, 0x04, 0x00,
98030x0A, 0x09, 0x08, 0x04, 0x00, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x1A, 0x19,
98040x18, 0x10, 0x00, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x1A, 0x19, 0x18, 0x10,
98050x00, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x22, 0x21, 0x20, 0x08, 0x00, 0x31,
98060x2C, 0x10, 0x10, 0x00, 0x31, 0x28, 0x10, 0x00, 0x00, 0x12, 0x11, 0x10,
98070x08, 0x00, 0x22, 0x21, 0x20, 0x18, 0x00, 0x22, 0x21, 0x20, 0x18, 0x00,
98080x22, 0x21, 0x20, 0x08, 0x00, 0x22, 0x21, 0x14, 0x08, 0x00, 0x22, 0x20,
98090x18, 0x08, 0x00, 0x31, 0x30, 0x20, 0x10, 0x00, 0x31, 0x2C, 0x10, 0x10,
98100x00, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x12, 0x11, 0x10, 0x08, 0x00, 0x22,
98110x21, 0x20, 0x18, 0x00, 0x22, 0x21, 0x20, 0x18, 0x00, 0x31, 0x30, 0x20,
98120x10, 0x00, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x31, 0x2F, 0x10, 0x10, 0x00,
98130x31, 0x10, 0x10, 0x00, 0x00, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x00, 0x00,
98140x01, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x0C, 0x10, 0x18, 0x20, 0x30,
98150x02, 0x04, 0x08, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x06, 0x0C, 0x10, 0x18,
98160x24, 0x30, 0x3C, 0x48, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98170x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x27, 0x2C, 0x19, 0x1B, 0x1E, 0x20,
98180x23, 0x29, 0x2A, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x25, 0x29, 0x2B, 0x2E,
98190x2E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
98200x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
98210x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
98220x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00,
98230xD8, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
98240xA0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00,
98250x90, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00,
98260x2C, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00,
98270xD0, 0x02, 0x00, 0x00, 0x80, 0x0C, 0x00, 0x00, 0x80, 0x0C, 0x00, 0x00,
98280x80, 0x0C, 0x00, 0x00, 0xA0, 0x0F, 0x00, 0x00, 0xA0, 0x0F, 0x00, 0x00,
98290x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
98300x08, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
98310x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
98320x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00,
98330x28, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
98340x64, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00,
98350xF0, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
98360xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00,
98370x40, 0x06, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00,
98380xD0, 0x07, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0x54, 0x86, 0x01, 0x80,
98390x4C, 0xC4, 0x00, 0x80, 0x4C, 0xC4, 0x00, 0x80, 0x4C, 0xC4, 0x00, 0x80,
98400x4C, 0xC4, 0x00, 0x80, 0x9C, 0xC2, 0x00, 0x80, 0x5C, 0x86, 0x01, 0x80,
98410x54, 0x86, 0x01, 0x80, 0x54, 0x86, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00,
98420x00, 0x00, 0x00, 0x00, 0x44, 0x8B, 0x01, 0x80, 0x44, 0x8B, 0x01, 0x80,
98430x44, 0x8B, 0x01, 0x80, 0x44, 0x8B, 0x01, 0x80, 0x34, 0x86, 0x01, 0x80,
98440x30, 0x8A, 0x01, 0x80, 0x3C, 0x86, 0x01, 0x80, 0x44, 0x86, 0x01, 0x80,
98450x4C, 0x86, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98460x08, 0x04, 0x04, 0x08, 0x02, 0x02, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00,
98470x52, 0x54, 0x4C, 0x38, 0x37, 0x31, 0x32, 0x20, 0x46, 0x57, 0x20, 0x76,
98480x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x30, 0x2E, 0x30, 0x2E, 0x31,
98490x23, 0x20, 0xE4, 0xB8, 0x80, 0x20, 0x35, 0xE6, 0x9C, 0x88, 0x20, 0x33,
98500x31, 0x20, 0x31, 0x35, 0x3A, 0x32, 0x35, 0x3A, 0x33, 0x39, 0x20, 0x43,
98510x53, 0x54, 0x20, 0x32, 0x30, 0x31, 0x30, 0x20, 0x20, 0x53, 0x56, 0x4E,
98520x3A, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x43, 0x68, 0x69, 0x70,
98530x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3A, 0x25, 0x78, 0x00,
98540x48, 0x43, 0x49, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x25, 0x78,
98550x28, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00, 0x00, 0x72, 0x66, 0x5F, 0x63,
98560x6F, 0x66, 0x69, 0x67, 0x3A, 0x20, 0x25, 0x78, 0x28, 0x25, 0x78, 0x2C,
98570x20, 0x25, 0x78, 0x2C, 0x20, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00, 0x00,
98580x6D, 0x70, 0x5F, 0x6D, 0x6F, 0x64, 0x65, 0x3A, 0x20, 0x25, 0x78, 0x28,
98590x25, 0x78, 0x29, 0x2C, 0x20, 0x49, 0x51, 0x4B, 0x3A, 0x20, 0x25, 0x78,
98600x0A, 0x00, 0x00, 0x00, 0x76, 0x63, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65,
98610x3A, 0x20, 0x25, 0x78, 0x28, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00, 0x00,
98620x33, 0x32, 0x6B, 0x20, 0x63, 0x61, 0x6C, 0x69, 0x62, 0x72, 0x61, 0x3A,
98630x20, 0x25, 0x64, 0x2C, 0x20, 0x33, 0x32, 0x4B, 0x20, 0x54, 0x53, 0x46,
98640x3A, 0x20, 0x25, 0x78, 0x00, 0x00, 0x00, 0x00, 0x74, 0x61, 0x72, 0x67,
98650x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x6D, 0x61, 0x6C, 0x3A, 0x20,
98660x25, 0x78, 0x2C, 0x20, 0x20, 0x62, 0x74, 0x5F, 0x63, 0x6F, 0x65, 0x78,
98670x69, 0x73, 0x74, 0x3A, 0x20, 0x25, 0x78, 0x0A, 0x00, 0x00, 0x00, 0x00,
98680x54, 0xAA, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80,
98690x24, 0xA9, 0x01, 0x80, 0x1C, 0xAA, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80,
98700x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80, 0xE4, 0xA9, 0x01, 0x80,
98710x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80,
98720x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80,
98730x24, 0xA9, 0x01, 0x80, 0xAC, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80,
98740x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80, 0x74, 0xA9, 0x01, 0x80,
98750x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80,
98760x3C, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80, 0x24, 0xA9, 0x01, 0x80,
98770x24, 0xA9, 0x01, 0x80, 0xFC, 0xA8, 0x01, 0x80, 0x64, 0x05, 0x00, 0x80,
98780x58, 0x05, 0x00, 0x80, 0x4C, 0x05, 0x00, 0x80, 0x40, 0x05, 0x00, 0x80,
98790x34, 0x05, 0x00, 0x80, 0x28, 0x05, 0x00, 0x80, 0x1C, 0x05, 0x00, 0x80,
98800x10, 0x05, 0x00, 0x80, 0x04, 0x05, 0x00, 0x80, 0xF8, 0x04, 0x00, 0x80,
98810xB0, 0x04, 0x00, 0x80, 0x60, 0x1B, 0x02, 0x80, 0xB0, 0x03, 0x25, 0xB0,
98820x60, 0x1B, 0x02, 0x80, 0x60, 0x1B, 0x02, 0x80, 0x60, 0x1B, 0x02, 0x80,
98830x60, 0x1B, 0x02, 0x80, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64,
98840x20, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x49, 0x44, 0x3A,
98850x20, 0x25, 0x78, 0x2C, 0x20, 0x63, 0x6D, 0x64, 0x20, 0x73, 0x65, 0x71,
98860x3D, 0x25, 0x78, 0x2C, 0x20, 0x68, 0x32, 0x64, 0x73, 0x65, 0x71, 0x3D,
98870x25, 0x78, 0x0A, 0x00, 0x6A, 0x6F, 0x69, 0x6E, 0x62, 0x73, 0x73, 0x5F,
98880x68, 0x64, 0x6C, 0x00, 0x67, 0x65, 0x74, 0x20, 0x6A, 0x6F, 0x69, 0x6E,
98890x20, 0x63, 0x6D, 0x64, 0x0A, 0x00, 0x00, 0x00, 0x4E, 0x6F, 0x20, 0x69,
98900x72, 0x70, 0x20, 0x25, 0x73, 0x0A, 0x00, 0x00, 0x73, 0x65, 0x74, 0x20,
98910x6F, 0x70, 0x6D, 0x6F, 0x64, 0x65, 0x3A, 0x20, 0x25, 0x78, 0x0A, 0x00,
98920x67, 0x65, 0x74, 0x20, 0x73, 0x75, 0x72, 0x76, 0x65, 0x79, 0x20, 0x63,
98930x6D, 0x64, 0x0A, 0x00, 0x53, 0x53, 0x49, 0x44, 0x3A, 0x20, 0x25, 0x73,
98940x0A, 0x00, 0x00, 0x00, 0x73, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x3A,
98950x20, 0x25, 0x78, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x76, 0x20,
98960x73, 0x65, 0x74, 0x5F, 0x73, 0x74, 0x61, 0x6B, 0x65, 0x79, 0x0A, 0x00,
98970x54, 0x78, 0x5F, 0x42, 0x65, 0x61, 0x63, 0x6F, 0x6E, 0x5F, 0x68, 0x64,
98980x6C, 0x00, 0x00, 0x00, 0x74, 0x78, 0x20, 0x62, 0x65, 0x61, 0x63, 0x6F,
98990x6E, 0x20, 0x63, 0x6D, 0x64, 0x28, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00,
99000x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x4D, 0x61, 0x63, 0x41, 0x64,
99010x64, 0x72, 0x0A, 0x00, 0x00, 0x0E, 0x04, 0x0E, 0x10, 0x0E, 0x14, 0x0E,
99020x18, 0x0E, 0x1C, 0x0E, 0x4F, 0x6E, 0x41, 0x73, 0x73, 0x6F, 0x63, 0x52,
99030x65, 0x71, 0x00, 0x00, 0x4F, 0x6E, 0x41, 0x73, 0x73, 0x6F, 0x63, 0x52,
99040x73, 0x70, 0x00, 0x00, 0x4F, 0x6E, 0x52, 0x65, 0x41, 0x73, 0x73, 0x6F,
99050x63, 0x52, 0x65, 0x71, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x52, 0x65,
99060x41, 0x73, 0x73, 0x6F, 0x63, 0x52, 0x73, 0x70, 0x00, 0x00, 0x00, 0x00,
99070x4F, 0x6E, 0x50, 0x72, 0x6F, 0x62, 0x65, 0x52, 0x65, 0x71, 0x00, 0x00,
99080x4F, 0x6E, 0x50, 0x72, 0x6F, 0x62, 0x65, 0x52, 0x73, 0x70, 0x00, 0x00,
99090x4F, 0x6E, 0x42, 0x65, 0x61, 0x63, 0x6F, 0x6E, 0x00, 0x00, 0x00, 0x00,
99100x4F, 0x6E, 0x41, 0x54, 0x49, 0x4D, 0x00, 0x00, 0x4F, 0x6E, 0x44, 0x69,
99110x73, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x00, 0x00, 0x4F, 0x6E, 0x41, 0x75,
99120x74, 0x68, 0x00, 0x00, 0x4F, 0x6E, 0x44, 0x65, 0x41, 0x75, 0x74, 0x68,
99130x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E,
99140x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x51, 0x6F, 0x73, 0x4E, 0x75, 0x6C,
99150x6C, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74,
99160x69, 0x6F, 0x6E, 0x00, 0x41, 0x54, 0x49, 0x4D, 0x3A, 0x20, 0x25, 0x78,
99170x0A, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x07, 0x07, 0x0D, 0x0D, 0x0D,
99180x02, 0x07, 0x07, 0x0D, 0x0D, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00,
99190x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x10, 0x72, 0x65, 0x70, 0x6F,
99200x72, 0x74, 0x5F, 0x73, 0x75, 0x72, 0x76, 0x65, 0x79, 0x5F, 0x64, 0x6F,
99210x6E, 0x65, 0x00, 0x00, 0x73, 0x75, 0x72, 0x76, 0x65, 0x79, 0x20, 0x64,
99220x6F, 0x6E, 0x65, 0x28, 0x25, 0x78, 0x2C, 0x20, 0x25, 0x78, 0x29, 0x0A,
99230x00, 0x00, 0x00, 0x00, 0x4E, 0x6F, 0x20, 0x69, 0x72, 0x70, 0x20, 0x25,
99240x73, 0x0A, 0x00, 0x00, 0x72, 0x65, 0x70, 0x6F, 0x72, 0x74, 0x5F, 0x6A,
99250x6F, 0x69, 0x6E, 0x5F, 0x72, 0x65, 0x73, 0x00, 0x4E, 0x6F, 0x20, 0x69,
99260x72, 0x70, 0x28, 0x25, 0x78, 0x29, 0x20, 0x25, 0x73, 0x0A, 0x00, 0x00,
99270x6A, 0x6F, 0x69, 0x6E, 0x20, 0x72, 0x65, 0x73, 0x28, 0x25, 0x78, 0x2C,
99280x20, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00, 0x00, 0x72, 0x65, 0x70, 0x6F,
99290x72, 0x74, 0x5F, 0x64, 0x65, 0x6C, 0x5F, 0x73, 0x74, 0x61, 0x5F, 0x65,
99300x76, 0x65, 0x6E, 0x74, 0x00, 0x00, 0x00, 0x00, 0x64, 0x65, 0x6C, 0x20,
99310x73, 0x74, 0x61, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x70, 0x6F,
99320x72, 0x74, 0x5F, 0x61, 0x64, 0x64, 0x5F, 0x73, 0x74, 0x61, 0x5F, 0x65,
99330x76, 0x65, 0x6E, 0x74, 0x00, 0x00, 0x00, 0x00, 0x61, 0x64, 0x64, 0x20,
99340x73, 0x74, 0x61, 0x3A, 0x25, 0x78, 0x2C, 0x20, 0x25, 0x78, 0x0A, 0x00,
99350x72, 0x63, 0x76, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6F, 0x6E, 0x6E, 0x65,
99360x63, 0x74, 0x0A, 0x00, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5F, 0x70, 0x72,
99370x6F, 0x62, 0x65, 0x72, 0x65, 0x71, 0x00, 0x00, 0x4E, 0x6F, 0x20, 0x69,
99380x72, 0x70, 0x20, 0x40, 0x25, 0x73, 0x0A, 0x00, 0x57, 0x4D, 0x4D, 0x28,
99390x25, 0x78, 0x29, 0x3A, 0x20, 0x25, 0x78, 0x2C, 0x20, 0x25, 0x78, 0x0A,
99400x00, 0x00, 0x00, 0x00, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x20, 0x72, 0x65,
99410x6A, 0x65, 0x63, 0x74, 0x2C, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
99420x3A, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x63, 0x20,
99430x69, 0x64, 0x20, 0x23, 0x35, 0x3A, 0x20, 0x25, 0x78, 0x2C, 0x20, 0x25,
99440x78, 0x2C, 0x20, 0x25, 0x78, 0x0A, 0x00, 0x00, 0x69, 0x73, 0x73, 0x75,
99450x65, 0x5F, 0x70, 0x72, 0x6F, 0x62, 0x65, 0x72, 0x73, 0x70, 0x00, 0x00,
99460x72, 0x65, 0x70, 0x6F, 0x72, 0x74, 0x5F, 0x42, 0x53, 0x53, 0x49, 0x44,
99470x5F, 0x69, 0x6E, 0x66, 0x6F, 0x00, 0x00, 0x00, 0x70, 0x61, 0x63, 0x6B,
99480x65, 0x74, 0x20, 0x74, 0x6F, 0x6F, 0x20, 0x6C, 0x61, 0x72, 0x67, 0x65,
99490x28, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x50, 0xF2, 0x01,
99500x69, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x63, 0x61, 0x70, 0x3A,
99510x25, 0x78, 0x0A, 0x00, 0x49, 0x42, 0x53, 0x53, 0x20, 0x6D, 0x6F, 0x64,
99520x65, 0x2C, 0x20, 0x63, 0x75, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6E, 0x6E,
99530x65, 0x6C, 0x3A, 0x20, 0x25, 0x78, 0x2C, 0x20, 0x62, 0x63, 0x6E, 0x20,
99540x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x3A, 0x20, 0x25, 0x78,
99550x0A, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x63, 0x20, 0x69, 0x64, 0x20, 0x23,
99560x34, 0x3A, 0x20, 0x25, 0x78, 0x2C, 0x20, 0x25, 0x78, 0x0A, 0x00, 0x00,
99570x63, 0x75, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3A,
99580x20, 0x25, 0x78, 0x2C, 0x20, 0x62, 0x63, 0x6E, 0x20, 0x69, 0x6E, 0x74,
99590x65, 0x72, 0x76, 0x61, 0x6C, 0x3A, 0x20, 0x25, 0x78, 0x0A, 0x00, 0x00,
99600x69, 0x73, 0x73, 0x75, 0x65, 0x5F, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x72,
99610x65, 0x71, 0x00, 0x00, 0x00, 0x50, 0xF2, 0x04, 0x69, 0x73, 0x73, 0x75,
99620x65, 0x20, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x72, 0x65, 0x71, 0x28, 0x25,
99630x78, 0x29, 0x0A, 0x00, 0x5B, 0x57, 0x41, 0x50, 0x49, 0x5D, 0x20, 0x67,
99640x65, 0x74, 0x20, 0x77, 0x61, 0x70, 0x69, 0x20, 0x49, 0x45, 0x0A, 0x00,
99650x69, 0x73, 0x73, 0x75, 0x65, 0x5F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
99660x00, 0x00, 0x00, 0x00, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x61, 0x63,
99670x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x25, 0x78, 0x2C, 0x20, 0x25, 0x78,
99680x2C, 0x20, 0x25, 0x78, 0x20, 0x0A, 0x00, 0x00, 0x44, 0x45, 0x4C, 0x42,
99690x41, 0x3A, 0x20, 0x25, 0x78, 0x28, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00,
99700x41, 0x44, 0x44, 0x42, 0x41, 0x20, 0x52, 0x53, 0x50, 0x3A, 0x20, 0x25,
99710x78, 0x0A, 0x00, 0x00, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5F, 0x61, 0x75,
99720x74, 0x68, 0x00, 0x00, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x61, 0x75,
99730x74, 0x68, 0x0A, 0x00, 0x63, 0x6C, 0x6E, 0x74, 0x20, 0x61, 0x75, 0x74,
99740x68, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x65, 0x64, 0x20, 0x64, 0x75, 0x65,
99750x20, 0x74, 0x6F, 0x20, 0x69, 0x6C, 0x6C, 0x65, 0x67, 0x61, 0x6C, 0x20,
99760x73, 0x65, 0x71, 0x3D, 0x25, 0x78, 0x0A, 0x00, 0x63, 0x6C, 0x6E, 0x74,
99770x20, 0x61, 0x75, 0x74, 0x68, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x2C, 0x20,
99780x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3A, 0x20, 0x25, 0x64, 0x0A, 0x00,
99790x6E, 0x6F, 0x20, 0x63, 0x68, 0x61, 0x6C, 0x6C, 0x65, 0x6E, 0x67, 0x65,
99800x20, 0x74, 0x65, 0x78, 0x74, 0x3F, 0x0A, 0x00, 0x6C, 0x69, 0x6E, 0x6B,
99810x20, 0x74, 0x6F, 0x20, 0x75, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20,
99820x41, 0x50, 0x0A, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x20, 0x74, 0x6F, 0x20,
99830x41, 0x74, 0x68, 0x65, 0x72, 0x6F, 0x73, 0x20, 0x41, 0x50, 0x28, 0x4D,
99840x41, 0x43, 0x29, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x63, 0x20,
99850x69, 0x64, 0x20, 0x23, 0x25, 0x78, 0x3A, 0x20, 0x25, 0x78, 0x2C, 0x20,
99860x25, 0x78, 0x0A, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x20, 0x74, 0x6F, 0x20,
99870x42, 0x72, 0x6F, 0x61, 0x64, 0x63, 0x6F, 0x6D, 0x20, 0x41, 0x50, 0x0A,
99880x00, 0x00, 0x00, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x20, 0x74, 0x6F, 0x20,
99890x41, 0x74, 0x68, 0x65, 0x72, 0x6F, 0x73, 0x20, 0x41, 0x50, 0x0A, 0x00,
99900x6C, 0x69, 0x6E, 0x6B, 0x20, 0x74, 0x6F, 0x20, 0x4D, 0x61, 0x72, 0x76,
99910x65, 0x6C, 0x6C, 0x20, 0x41, 0x50, 0x0A, 0x00, 0x6C, 0x69, 0x6E, 0x6B,
99920x20, 0x74, 0x6F, 0x20, 0x52, 0x65, 0x61, 0x6C, 0x74, 0x65, 0x6B, 0x20,
99930x39, 0x36, 0x42, 0x20, 0x41, 0x50, 0x0A, 0x00, 0x6C, 0x69, 0x6E, 0x6B,
99940x20, 0x74, 0x6F, 0x20, 0x43, 0x69, 0x73, 0x63, 0x6F, 0x20, 0x41, 0x50,
99950x0A, 0x00, 0x00, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x20, 0x74, 0x6F, 0x20,
99960x52, 0x61, 0x6C, 0x69, 0x6E, 0x6B, 0x20, 0x41, 0x50, 0x0A, 0x00, 0x00,
99970x6C, 0x69, 0x6E, 0x6B, 0x20, 0x74, 0x6F, 0x20, 0x52, 0x65, 0x61, 0x6C,
99980x74, 0x65, 0x6B, 0x20, 0x39, 0x36, 0x42, 0x20, 0x41, 0x50, 0x20, 0x77,
99990x69, 0x74, 0x68, 0x20, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x20, 0x6D, 0x6F,
100000x64, 0x65, 0x0A, 0x00, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5F, 0x64, 0x65,
100010x61, 0x75, 0x74, 0x68, 0x00, 0x00, 0x00, 0x00, 0x69, 0x73, 0x73, 0x75,
100020x65, 0x5F, 0x64, 0x65, 0x61, 0x75, 0x74, 0x68, 0x0A, 0x00, 0x00, 0x00,
100030x69, 0x73, 0x73, 0x75, 0x65, 0x5F, 0x64, 0x69, 0x73, 0x61, 0x73, 0x73,
100040x6F, 0x63, 0x00, 0x00, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5F, 0x64, 0x69,
100050x73, 0x61, 0x73, 0x73, 0x6F, 0x63, 0x0A, 0x00, 0x69, 0x73, 0x73, 0x75,
100060x65, 0x5F, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x5F, 0x6C, 0x65, 0x6E, 0x00,
100070x64, 0x69, 0x73, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x20, 0x74,
100080x69, 0x6D, 0x65, 0x72, 0x3A, 0x20, 0x6E, 0x6F, 0x20, 0x62, 0x65, 0x61,
100090x63, 0x6F, 0x6E, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x64, 0x69, 0x73, 0x63,
100100x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x28, 0x6E, 0x6F, 0x20, 0x64, 0x61,
100110x74, 0x61, 0x20, 0x72, 0x63, 0x76, 0x64, 0x29, 0x0A, 0x00, 0x00, 0x00,
100120x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x51, 0x6F, 0x73, 0x4E, 0x75, 0x6C,
100130x6C, 0x28, 0x25, 0x64, 0x29, 0x00, 0x00, 0x00, 0x60, 0x1B, 0x02, 0x80,
100140xB0, 0x03, 0x25, 0xB0, 0x18, 0x03, 0x25, 0xB0, 0x44, 0x44, 0x33, 0x33,
100150x06, 0x00, 0x2A, 0xB0, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100160xB4, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0x38, 0x4A, 0x01, 0x80,
100170xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100180xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100190x2C, 0x4A, 0x01, 0x80, 0x20, 0x4A, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100200xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100210xB8, 0x49, 0x01, 0x80, 0x14, 0x4A, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100220xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0x08, 0x4A, 0x01, 0x80,
100230xB8, 0x49, 0x01, 0x80, 0xFC, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100240xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100250xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100260xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100270xB8, 0x49, 0x01, 0x80, 0xF0, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100280xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100290xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100300xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100310xB8, 0x49, 0x01, 0x80, 0xE4, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100320xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100330xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100340xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100350xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100360xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100370xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100380xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100390xB8, 0x49, 0x01, 0x80, 0xD8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100400xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100410xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100420xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100430xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100440xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100450xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100460xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100470xB8, 0x49, 0x01, 0x80, 0xCC, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100480xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100490xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100500xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80, 0xB8, 0x49, 0x01, 0x80,
100510xB8, 0x49, 0x01, 0x80, 0xC0, 0x49, 0x01, 0x80, 0xF8, 0x4A, 0x01, 0x80,
100520xEC, 0x4A, 0x01, 0x80, 0xE0, 0x4A, 0x01, 0x80, 0xD4, 0x4A, 0x01, 0x80,
100530xC8, 0x4A, 0x01, 0x80, 0xBC, 0x4A, 0x01, 0x80, 0xB0, 0x4A, 0x01, 0x80,
100540xA4, 0x4A, 0x01, 0x80, 0x98, 0x4A, 0x01, 0x80, 0x8C, 0x4A, 0x01, 0x80,
100550x80, 0x4A, 0x01, 0x80, 0x74, 0x4A, 0x01, 0x80, 0x00, 0x50, 0xF2, 0x01,
100560x00, 0x50, 0xF2, 0x02, 0x00, 0x0F, 0xAC, 0x02, 0x30, 0x31, 0x32, 0x33,
100570x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
100580x00, 0x00, 0x00, 0x00, 0x25, 0x64, 0x2E, 0x00, 0x25, 0x68, 0x68, 0x58,
100590x3A, 0x00, 0x00, 0x00, 0xEC, 0xEE, 0x01, 0x80, 0x67, 0x66, 0x66, 0x66,
100600x87, 0x7C, 0x00, 0x80, 0x5D, 0x7C, 0x00, 0x80, 0x37, 0x7C, 0x00, 0x80,
100610x11, 0x7C, 0x00, 0x80, 0xC1, 0x7B, 0x00, 0x80, 0x9B, 0x7B, 0x00, 0x80,
100620xEB, 0x7B, 0x00, 0x80, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x63,
100630x61, 0x6D, 0x20, 0x65, 0x6E, 0x74, 0x72, 0x79, 0x20, 0x28, 0x25, 0x78,
100640x2C, 0x20, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00, 0x2D, 0x3E, 0x28, 0x25,
100650x78, 0x2C, 0x20, 0x25, 0x78, 0x2C, 0x20, 0x25, 0x78, 0x2C, 0x20, 0x25,
100660x78, 0x29, 0x0A, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x09, 0x00, 0x00,
100670xDF, 0x88, 0x00, 0x80, 0xE5, 0x88, 0x00, 0x80, 0xEB, 0x88, 0x00, 0x80,
100680xF1, 0x88, 0x00, 0x80, 0xDF, 0x88, 0x00, 0x80, 0xDF, 0x88, 0x00, 0x80,
100690xDF, 0x88, 0x00, 0x80, 0xDF, 0x88, 0x00, 0x80, 0xF7, 0x88, 0x00, 0x80,
100700xFD, 0x88, 0x00, 0x80, 0x03, 0x89, 0x00, 0x80, 0x09, 0x89, 0x00, 0x80,
100710x60, 0x1B, 0x02, 0x80, 0x55, 0x6E, 0x69, 0x20, 0x4F, 0x6B, 0x3A, 0x20,
100720x41, 0x50, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x00, 0x00, 0x00, 0x00,
100730x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF,
100740xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFF, 0x03, 0xFE, 0x01, 0x80, 0x7F,
100750xE2, 0x01, 0x80, 0x78, 0xC7, 0x01, 0xC0, 0x71, 0xAE, 0x01, 0x80, 0x6B,
100760x95, 0x01, 0x40, 0x65, 0x7F, 0x01, 0xC0, 0x5F, 0x69, 0x01, 0x40, 0x5A,
100770x55, 0x01, 0x40, 0x55, 0x42, 0x01, 0x80, 0x50, 0x30, 0x01, 0x00, 0x4C,
100780x1F, 0x01, 0xC0, 0x47, 0x0F, 0x01, 0xC0, 0x43, 0x00, 0x01, 0x00, 0x40,
100790xF2, 0x00, 0x80, 0x3C, 0xE4, 0x00, 0x00, 0x39, 0xD7, 0x00, 0xC0, 0x35,
100800xCB, 0x00, 0xC0, 0x32, 0xC0, 0x00, 0x00, 0x30, 0xB5, 0x00, 0x40, 0x2D,
100810xAB, 0x00, 0xC0, 0x2A, 0xA2, 0x00, 0x80, 0x28, 0x98, 0x00, 0x00, 0x26,
100820x90, 0x00, 0x00, 0x24, 0x88, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x20,
100830x79, 0x00, 0x40, 0x1E, 0x72, 0x00, 0x80, 0x1C, 0x6C, 0x00, 0x00, 0x1B,
100840x66, 0x00, 0x80, 0x19, 0x60, 0x00, 0x00, 0x18, 0x5B, 0x00, 0xC0, 0x16,
100850x56, 0x00, 0x80, 0x15, 0x51, 0x00, 0x40, 0x14, 0x4C, 0x00, 0x00, 0x13,
100860x48, 0x00, 0x00, 0x12, 0x44, 0x00, 0x00, 0x11, 0x40, 0x00, 0x00, 0x10,
100870x36, 0x35, 0x2E, 0x25, 0x1C, 0x12, 0x09, 0x04, 0x33, 0x32, 0x2B, 0x23,
100880x1A, 0x11, 0x08, 0x04, 0x30, 0x2F, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03,
100890x2D, 0x2D, 0x27, 0x1F, 0x18, 0x0F, 0x08, 0x03, 0x2B, 0x2A, 0x25, 0x1E,
100900x16, 0x0E, 0x07, 0x03, 0x28, 0x28, 0x22, 0x1C, 0x15, 0x0D, 0x07, 0x03,
100910x26, 0x25, 0x21, 0x1B, 0x14, 0x0D, 0x06, 0x03, 0x24, 0x23, 0x1F, 0x19,
100920x13, 0x0C, 0x06, 0x03, 0x22, 0x21, 0x1D, 0x18, 0x11, 0x0B, 0x06, 0x02,
100930x20, 0x20, 0x1B, 0x16, 0x11, 0x08, 0x05, 0x02, 0x1F, 0x1E, 0x1A, 0x15,
100940x10, 0x0A, 0x05, 0x02, 0x1D, 0x1C, 0x18, 0x14, 0x0F, 0x0A, 0x05, 0x02,
100950x1B, 0x1A, 0x17, 0x13, 0x0E, 0x09, 0x04, 0x02, 0x1A, 0x19, 0x16, 0x12,
100960x0D, 0x09, 0x04, 0x02, 0x18, 0x17, 0x15, 0x11, 0x0C, 0x08, 0x04, 0x02,
100970x17, 0x16, 0x13, 0x10, 0x0C, 0x08, 0x04, 0x02, 0x16, 0x15, 0x12, 0x0F,
100980x0B, 0x07, 0x04, 0x01, 0x14, 0x14, 0x11, 0x0E, 0x0B, 0x07, 0x03, 0x02,
100990x13, 0x13, 0x10, 0x0D, 0x0A, 0x06, 0x03, 0x01, 0x12, 0x12, 0x0F, 0x0C,
101000x09, 0x06, 0x03, 0x01, 0x11, 0x11, 0x0F, 0x0C, 0x09, 0x06, 0x03, 0x01,
101010x10, 0x10, 0x0E, 0x0B, 0x08, 0x05, 0x03, 0x01, 0x0F, 0x0F, 0x0D, 0x0B,
101020x08, 0x05, 0x03, 0x01, 0x0E, 0x0E, 0x0C, 0x0A, 0x08, 0x05, 0x02, 0x01,
101030x0D, 0x0D, 0x0C, 0x0A, 0x07, 0x05, 0x02, 0x01, 0x0D, 0x0C, 0x0B, 0x09,
101040x07, 0x04, 0x02, 0x01, 0x0C, 0x0C, 0x0A, 0x09, 0x06, 0x04, 0x02, 0x01,
101050x0B, 0x0B, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x01, 0x0B, 0x0A, 0x09, 0x08,
101060x06, 0x04, 0x02, 0x01, 0x0A, 0x0A, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01,
101070x0A, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01, 0x09, 0x09, 0x08, 0x06,
101080x05, 0x03, 0x01, 0x01, 0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01,
101090x36, 0x35, 0x2E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x33, 0x32, 0x2B, 0x19,
101100x00, 0x00, 0x00, 0x00, 0x30, 0x2F, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00,
101110x2D, 0x2D, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x2A, 0x25, 0x15,
101120x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00,
101130x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 0x24, 0x23, 0x1F, 0x12,
101140x00, 0x00, 0x00, 0x00, 0x22, 0x21, 0x1D, 0x11, 0x00, 0x00, 0x00, 0x00,
101150x20, 0x20, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1E, 0x1A, 0x0F,
101160x00, 0x00, 0x00, 0x00, 0x1D, 0x1C, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
101170x1B, 0x1A, 0x17, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x19, 0x16, 0x0D,
101180x00, 0x00, 0x00, 0x00, 0x18, 0x17, 0x15, 0x0C, 0x00, 0x00, 0x00, 0x00,
101190x17, 0x16, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x15, 0x12, 0x0B,
101200x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x11, 0x0A, 0x00, 0x00, 0x00, 0x00,
101210x13, 0x13, 0x10, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x0F, 0x09,
101220x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x0F, 0x09, 0x00, 0x00, 0x00, 0x00,
101230x10, 0x10, 0x0E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0D, 0x08,
101240x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00,
101250x0D, 0x0D, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0C, 0x0B, 0x06,
101260x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00,
101270x0B, 0x0B, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x0A, 0x09, 0x05,
101280x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00,
101290x0A, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x08, 0x05,
101300x00, 0x00, 0x00, 0x00, 0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00,
101310x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x25, 0x78, 0x29, 0x0A, 0x00, 0x00,
101320x50, 0x53, 0x00, 0x00, 0xE8, 0x86, 0x01, 0x80, 0x58, 0x87, 0x01, 0x80,
101330x14, 0x87, 0x01, 0x80, 0x58, 0x87, 0x01, 0x80, 0x58, 0x87, 0x01, 0x80,
101340x58, 0x87, 0x01, 0x80, 0x58, 0x87, 0x01, 0x80, 0xC0, 0x86, 0x01, 0x80,
101350x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04,
101360x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
101370x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06,
101380x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
101390x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
101400x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
101410x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
101420x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
101430x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
101440x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
101450x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08,
101460x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101470x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101480x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101490x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101500x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101510x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101520x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101530x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101540x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101550x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101560x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101570x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101590x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101610x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101620x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101630x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101640x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101650x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101660x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101670x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101680x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101690x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101700x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101710x08, 0x28, 0x28, 0x28, 0x28, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101720x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
101730xA0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
101740x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
101750x04, 0x04, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x41, 0x41, 0x41,
101760x41, 0x41, 0x41, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
101770x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10,
101780x10, 0x10, 0x10, 0x10, 0x10, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x02,
101790x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
101800x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x10, 0x10, 0x10, 0x08,
101810x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101820x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101830x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x10, 0x10, 0x10,
101840x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
101850x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
101860x10, 0x10, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
101870x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
101880x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
101890x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
101900x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10,
101910x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x2D, 0x5C, 0x7C, 0x2F,
101920x00, 0x00, 0x00, 0x00, 0x0A, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101930xF0, 0xF4, 0x5E, 0x00, 0xF0, 0xF4, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00,
101940x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xE5, 0x5E, 0x00,
101950xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101960x00, 0x00, 0x00, 0x00, 0xB8, 0xA0, 0xFC, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
10197};
diff --git a/drivers/staging/rtl8712/generic.h b/drivers/staging/rtl8712/generic.h
new file mode 100644
index 00000000000..742424bdf16
--- /dev/null
+++ b/drivers/staging/rtl8712/generic.h
@@ -0,0 +1,153 @@
1#ifndef _LINUX_BYTEORDER_GENERIC_H
2#define _LINUX_BYTEORDER_GENERIC_H
3
4/*
5 * linux/byteorder_generic.h
6 * Generic Byte-reordering support
7 *
8 * Francois-Rene Rideau <fare@tunes.org> 19970707
9 * gathered all the good ideas from all asm-foo/byteorder.h into one file,
10 * cleaned them up.
11 * I hope it is compliant with non-GCC compilers.
12 * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h,
13 * because I wasn't sure it would be ok to put it in types.h
14 * Upgraded it to 2.1.43
15 * Francois-Rene Rideau <fare@tunes.org> 19971012
16 * Upgraded it to 2.1.57
17 * to please Linus T., replaced huge #ifdef's between little/big endian
18 * by nestedly #include'd files.
19 * Francois-Rene Rideau <fare@tunes.org> 19971205
20 * Made it to 2.1.71; now a facelift:
21 * Put files under include/linux/byteorder/
22 * Split swab from generic support.
23 *
24 * TODO:
25 * = Regular kernel maintainers could also replace all these manual
26 * byteswap macros that remain, disseminated among drivers,
27 * after some grep or the sources...
28 * = Linus might want to rename all these macros and files to fit his taste,
29 * to fit his personal naming scheme.
30 * = it seems that a few drivers would also appreciate
31 * nybble swapping support...
32 * = every architecture could add their byteswap macro in asm/byteorder.h
33 * see how some architectures already do (i386, alpha, ppc, etc)
34 * = cpu_to_beXX and beXX_to_cpu might some day need to be well
35 * distinguished throughout the kernel. This is not the case currently,
36 * since little endian, big endian, and pdp endian machines needn't it.
37 * But this might be the case for, say, a port of Linux to 20/21 bit
38 * architectures (and F21 Linux addict around?).
39 */
40
41/*
42 * The following macros are to be defined by <asm/byteorder.h>:
43 *
44 * Conversion of long and short int between network and host format
45 * ntohl(__u32 x)
46 * ntohs(__u16 x)
47 * htonl(__u32 x)
48 * htons(__u16 x)
49 * It seems that some programs (which? where? or perhaps a standard? POSIX?)
50 * might like the above to be functions, not macros (why?).
51 * if that's true, then detect them, and take measures.
52 * Anyway, the measure is: define only ___ntohl as a macro instead,
53 * and in a separate file, have
54 * unsigned long inline ntohl(x){return ___ntohl(x);}
55 *
56 * The same for constant arguments
57 * __constant_ntohl(__u32 x)
58 * __constant_ntohs(__u16 x)
59 * __constant_htonl(__u32 x)
60 * __constant_htons(__u16 x)
61 *
62 * Conversion of XX-bit integers (16- 32- or 64-)
63 * between native CPU format and little/big endian format
64 * 64-bit stuff only defined for proper architectures
65 * cpu_to_[bl]eXX(__uXX x)
66 * [bl]eXX_to_cpu(__uXX x)
67 *
68 * The same, but takes a pointer to the value to convert
69 * cpu_to_[bl]eXXp(__uXX x)
70 * [bl]eXX_to_cpup(__uXX x)
71 *
72 * The same, but change in situ
73 * cpu_to_[bl]eXXs(__uXX x)
74 * [bl]eXX_to_cpus(__uXX x)
75 *
76 * See asm-foo/byteorder.h for examples of how to provide
77 * architecture-optimized versions
78 *
79 */
80
81
82/*
83 * inside the kernel, we can use nicknames;
84 * outside of it, we must avoid POSIX namespace pollution...
85 */
86#define cpu_to_le64 __cpu_to_le64
87#define le64_to_cpu __le64_to_cpu
88#define cpu_to_le32 __cpu_to_le32
89#define le32_to_cpu __le32_to_cpu
90#define cpu_to_le16 __cpu_to_le16
91#define le16_to_cpu __le16_to_cpu
92#define cpu_to_be64 __cpu_to_be64
93#define be64_to_cpu __be64_to_cpu
94#define cpu_to_be32 __cpu_to_be32
95#define be32_to_cpu __be32_to_cpu
96#define cpu_to_be16 __cpu_to_be16
97#define be16_to_cpu __be16_to_cpu
98#define cpu_to_le64p __cpu_to_le64p
99#define le64_to_cpup __le64_to_cpup
100#define cpu_to_le32p __cpu_to_le32p
101#define le32_to_cpup __le32_to_cpup
102#define cpu_to_le16p __cpu_to_le16p
103#define le16_to_cpup __le16_to_cpup
104#define cpu_to_be64p __cpu_to_be64p
105#define be64_to_cpup __be64_to_cpup
106#define cpu_to_be32p __cpu_to_be32p
107#define be32_to_cpup __be32_to_cpup
108#define cpu_to_be16p __cpu_to_be16p
109#define be16_to_cpup __be16_to_cpup
110#define cpu_to_le64s __cpu_to_le64s
111#define le64_to_cpus __le64_to_cpus
112#define cpu_to_le32s __cpu_to_le32s
113#define le32_to_cpus __le32_to_cpus
114#define cpu_to_le16s __cpu_to_le16s
115#define le16_to_cpus __le16_to_cpus
116#define cpu_to_be64s __cpu_to_be64s
117#define be64_to_cpus __be64_to_cpus
118#define cpu_to_be32s __cpu_to_be32s
119#define be32_to_cpus __be32_to_cpus
120#define cpu_to_be16s __cpu_to_be16s
121#define be16_to_cpus __be16_to_cpus
122
123
124/*
125 * Handle ntohl and suches. These have various compatibility
126 * issues - like we want to give the prototype even though we
127 * also have a macro for them in case some strange program
128 * wants to take the address of the thing or something..
129 *
130 * Note that these used to return a "long" in libc5, even though
131 * long is often 64-bit these days.. Thus the casts.
132 *
133 * They have to be macros in order to do the constant folding
134 * correctly - if the argument passed into a inline function
135 * it is no longer constant according to gcc..
136 */
137
138#undef ntohl
139#undef ntohs
140#undef htonl
141#undef htons
142
143/*
144 * Do the prototypes. Somebody might want to take the
145 * address or some such sick thing..
146 */
147extern __u32 ntohl(__u32);
148extern __u32 htonl(__u32);
149extern unsigned short int ntohs(unsigned short int);
150extern unsigned short int htons(unsigned short int);
151
152#endif /* _LINUX_BYTEORDER_GENERIC_H */
153
diff --git a/drivers/staging/rtl8712/hal_init.c b/drivers/staging/rtl8712/hal_init.c
new file mode 100644
index 00000000000..29bcbea0f7e
--- /dev/null
+++ b/drivers/staging/rtl8712/hal_init.c
@@ -0,0 +1,356 @@
1/******************************************************************************
2 * hal_init.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _HAL_INIT_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "rtl871x_byteorder.h"
34#include "farray.h"
35
36#define FWBUFF_ALIGN_SZ 512
37#define MAX_DUMP_FWSZ 49152 /*default = 49152 (48k)*/
38
39static u32 rtl871x_open_fw(struct _adapter *padapter, void **pphfwfile_hdl,
40 const u8 **ppmappedfw)
41{
42 u32 len;
43
44 *ppmappedfw = f_array;
45 len = sizeof(f_array);
46 return len;
47}
48
49static void fill_fwpriv(struct _adapter *padapter, struct fw_priv *pfwpriv)
50{
51 struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv;
52 struct registry_priv *pregpriv = &padapter->registrypriv;
53
54 memset(pfwpriv, 0, sizeof(struct fw_priv));
55 /* todo: check if needs endian conversion */
56 pfwpriv->hci_sel = RTL8712_HCI_TYPE_72USB;
57 pfwpriv->usb_ep_num = (u8)pdvobj->nr_endpoint;
58 pfwpriv->bw_40MHz_en = pregpriv->cbw40_enable;
59 switch (pregpriv->rf_config) {
60 case RTL8712_RF_1T1R:
61 pfwpriv->rf_config = RTL8712_RFC_1T1R;
62 break;
63 case RTL8712_RF_2T2R:
64 pfwpriv->rf_config = RTL8712_RFC_2T2R;
65 break;
66 case RTL8712_RF_1T2R:
67 default:
68 pfwpriv->rf_config = RTL8712_RFC_1T2R;
69 }
70 pfwpriv->mp_mode = (pregpriv->mp_mode == 1) ? 1 : 0;
71 pfwpriv->vcsType = pregpriv->vrtl_carrier_sense; /* 0:off 1:on 2:auto */
72 pfwpriv->vcsMode = pregpriv->vcs_type; /* 1:RTS/CTS 2:CTS to self */
73 pfwpriv->turboMode = 1; /* default enable it */
74 pfwpriv->lowPowerMode = pregpriv->low_power;
75}
76
77static void update_fwhdr(struct fw_hdr *pfwhdr, const u8 *pmappedfw)
78{
79 pfwhdr->signature = le16_to_cpu(*(u16 *)pmappedfw);
80 pfwhdr->version = le16_to_cpu(*(u16 *)(pmappedfw+2));
81 /* define the size of boot loader */
82 pfwhdr->dmem_size = le32_to_cpu(*(uint *)(pmappedfw+4));
83 /* define the size of FW in IMEM */
84 pfwhdr->img_IMEM_size = le32_to_cpu(*(uint *)(pmappedfw+8));
85 /* define the size of FW in SRAM */
86 pfwhdr->img_SRAM_size = le32_to_cpu(*(uint *)(pmappedfw+12));
87 /* define the size of DMEM variable */
88 pfwhdr->fw_priv_sz = le32_to_cpu(*(uint *)(pmappedfw+16));
89}
90
91static u8 chk_fwhdr(struct fw_hdr *pfwhdr, u32 ulfilelength)
92{
93 u32 fwhdrsz, fw_sz;
94 u8 intf, rfconf;
95
96 /* check signature */
97 if ((pfwhdr->signature != 0x8712) && (pfwhdr->signature != 0x8192))
98 return _FAIL;
99 /* check interface */
100 intf = (u8)((pfwhdr->version&0x3000) >> 12);
101 /* check rf_conf */
102 rfconf = (u8)((pfwhdr->version&0xC000) >> 14);
103 /* check fw_priv_sze & sizeof(struct fw_priv) */
104 if (pfwhdr->fw_priv_sz != sizeof(struct fw_priv))
105 return _FAIL;
106 /* check fw_sz & image_fw_sz */
107 fwhdrsz = FIELD_OFFSET(struct fw_hdr, fwpriv) + pfwhdr->fw_priv_sz;
108 fw_sz = fwhdrsz + pfwhdr->img_IMEM_size + pfwhdr->img_SRAM_size +
109 pfwhdr->dmem_size;
110 if (fw_sz != ulfilelength)
111 return _FAIL;
112 return _SUCCESS;
113}
114
115static u8 rtl8712_dl_fw(struct _adapter *padapter)
116{
117 sint i;
118 u8 tmp8, tmp8_a;
119 u16 tmp16;
120 u32 maxlen = 0, tmp32; /* for compare usage */
121 uint dump_imem_sz, imem_sz, dump_emem_sz, emem_sz; /* max = 49152; */
122 struct fw_hdr fwhdr;
123 u32 ulfilelength; /* FW file size */
124 void *phfwfile_hdl = NULL;
125 const u8 *pmappedfw = NULL;
126 u8 *ptmpchar = NULL, *ppayload, *ptr;
127 struct tx_desc *ptx_desc;
128 u32 txdscp_sz = sizeof(struct tx_desc);
129
130 ulfilelength = rtl871x_open_fw(padapter, &phfwfile_hdl, &pmappedfw);
131 if (pmappedfw && (ulfilelength > 0)) {
132 update_fwhdr(&fwhdr, pmappedfw);
133 if (chk_fwhdr(&fwhdr, ulfilelength) == _FAIL)
134 goto exit_fail;
135 fill_fwpriv(padapter, &fwhdr.fwpriv);
136 /* firmware check ok */
137 maxlen = (fwhdr.img_IMEM_size > fwhdr.img_SRAM_size) ?
138 fwhdr.img_IMEM_size : fwhdr.img_SRAM_size;
139 maxlen += txdscp_sz;
140 ptmpchar = _malloc(maxlen + FWBUFF_ALIGN_SZ);
141 if (ptmpchar == NULL)
142 return _FAIL;
143
144 ptx_desc = (struct tx_desc *)(ptmpchar + FWBUFF_ALIGN_SZ -
145 ((addr_t)(ptmpchar) & (FWBUFF_ALIGN_SZ - 1)));
146 ppayload = (u8 *)(ptx_desc) + txdscp_sz;
147 ptr = (u8 *)pmappedfw + FIELD_OFFSET(struct fw_hdr, fwpriv) +
148 fwhdr.fw_priv_sz;
149 /* Download FirmWare */
150 /* 1. determine IMEM code size and Load IMEM Code Section */
151 imem_sz = fwhdr.img_IMEM_size;
152 do {
153 memset(ptx_desc, 0, TXDESC_SIZE);
154 if (imem_sz > MAX_DUMP_FWSZ/*49152*/)
155 dump_imem_sz = MAX_DUMP_FWSZ;
156 else {
157 dump_imem_sz = imem_sz;
158 ptx_desc->txdw0 |= cpu_to_le32(BIT(28));
159 }
160 ptx_desc->txdw0 |= cpu_to_le32(dump_imem_sz &
161 0x0000ffff);
162 memcpy(ppayload, ptr, dump_imem_sz);
163 r8712_write_mem(padapter, RTL8712_DMA_VOQ,
164 dump_imem_sz + TXDESC_SIZE,
165 (u8 *)ptx_desc);
166 ptr += dump_imem_sz;
167 imem_sz -= dump_imem_sz;
168 } while (imem_sz > 0);
169 i = 10;
170 tmp16 = r8712_read16(padapter, TCR);
171 while (((tmp16 & _IMEM_CODE_DONE) == 0) && (i > 0)) {
172 udelay(10);
173 tmp16 = r8712_read16(padapter, TCR);
174 i--;
175 }
176 if (i == 0 || (tmp16 & _IMEM_CHK_RPT) == 0)
177 goto exit_fail;
178
179 /* 2.Download EMEM code size and Load EMEM Code Section */
180 emem_sz = fwhdr.img_SRAM_size;
181 do {
182 memset(ptx_desc, 0, TXDESC_SIZE);
183 if (emem_sz > MAX_DUMP_FWSZ) /* max=48k */
184 dump_emem_sz = MAX_DUMP_FWSZ;
185 else {
186 dump_emem_sz = emem_sz;
187 ptx_desc->txdw0 |= cpu_to_le32(BIT(28));
188 }
189 ptx_desc->txdw0 |= cpu_to_le32(dump_emem_sz &
190 0x0000ffff);
191 memcpy(ppayload, ptr, dump_emem_sz);
192 r8712_write_mem(padapter, RTL8712_DMA_VOQ,
193 dump_emem_sz+TXDESC_SIZE, (u8 *)ptx_desc);
194 ptr += dump_emem_sz;
195 emem_sz -= dump_emem_sz;
196 } while (emem_sz > 0);
197 i = 5;
198 tmp16 = r8712_read16(padapter, TCR);
199 while (((tmp16 & _EMEM_CODE_DONE) == 0) && (i > 0)) {
200 udelay(10);
201 tmp16 = r8712_read16(padapter, TCR);
202 i--;
203 }
204 if (i == 0 || (tmp16 & _EMEM_CHK_RPT) == 0)
205 goto exit_fail;
206
207 /* 3.Enable CPU */
208 tmp8 = r8712_read8(padapter, SYS_CLKR);
209 r8712_write8(padapter, SYS_CLKR, tmp8|BIT(2));
210 tmp8_a = r8712_read8(padapter, SYS_CLKR);
211 if (tmp8_a != (tmp8|BIT(2)))
212 goto exit_fail;
213
214 tmp8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
215 r8712_write8(padapter, SYS_FUNC_EN+1, tmp8|BIT(2));
216 tmp8_a = r8712_read8(padapter, SYS_FUNC_EN + 1);
217 if (tmp8_a != (tmp8|BIT(2)))
218 goto exit_fail;
219
220 tmp32 = r8712_read32(padapter, TCR);
221
222 /* 4.polling IMEM Ready */
223 i = 100;
224 tmp16 = r8712_read16(padapter, TCR);
225 while (((tmp16 & _IMEM_RDY) == 0) && (i > 0)) {
226 msleep(20);
227 tmp16 = r8712_read16(padapter, TCR);
228 i--;
229 }
230 if (i == 0) {
231 r8712_write16(padapter, 0x10250348, 0xc000);
232 r8712_write16(padapter, 0x10250348, 0xc001);
233 r8712_write16(padapter, 0x10250348, 0x2000);
234 r8712_write16(padapter, 0x10250348, 0x2001);
235 r8712_write16(padapter, 0x10250348, 0x2002);
236 r8712_write16(padapter, 0x10250348, 0x2003);
237 goto exit_fail;
238 }
239 /* 5.Download DMEM code size and Load EMEM Code Section */
240 memset(ptx_desc, 0, TXDESC_SIZE);
241 ptx_desc->txdw0 |= cpu_to_le32(fwhdr.fw_priv_sz&0x0000ffff);
242 ptx_desc->txdw0 |= cpu_to_le32(BIT(28));
243 memcpy(ppayload, &fwhdr.fwpriv, fwhdr.fw_priv_sz);
244 r8712_write_mem(padapter, RTL8712_DMA_VOQ,
245 fwhdr.fw_priv_sz + TXDESC_SIZE, (u8 *)ptx_desc);
246
247 /* polling dmem code done */
248 i = 100;
249 tmp16 = r8712_read16(padapter, TCR);
250 while (((tmp16 & _DMEM_CODE_DONE) == 0) && (i > 0)) {
251 msleep(20);
252 tmp16 = r8712_read16(padapter, TCR);
253 i--;
254 }
255 if (i == 0)
256 goto exit_fail;
257
258 tmp8 = r8712_read8(padapter, 0x1025000A);
259 if (tmp8 & BIT(4)) /* When boot from EEPROM,
260 & FW need more time to read EEPROM */
261 i = 60;
262 else /* boot from EFUSE */
263 i = 30;
264 tmp16 = r8712_read16(padapter, TCR);
265 while (((tmp16 & _FWRDY) == 0) && (i > 0)) {
266 msleep(100);
267 tmp16 = r8712_read16(padapter, TCR);
268 i--;
269 }
270 if (i == 0)
271 goto exit_fail;
272 } else
273 goto exit_fail;
274 return _SUCCESS;
275
276exit_fail:
277 kfree(ptmpchar);
278 return _FAIL;
279}
280
281uint rtl8712_hal_init(struct _adapter *padapter)
282{
283 u32 val32;
284 int i;
285
286 /* r8712 firmware download */
287 if (rtl8712_dl_fw(padapter) != _SUCCESS)
288 return _FAIL;
289
290 printk(KERN_INFO "r8712u: 1 RCR=0x%x\n", r8712_read32(padapter, RCR));
291 val32 = r8712_read32(padapter, RCR);
292 r8712_write32(padapter, RCR, (val32 | BIT(26))); /* Enable RX TCP
293 Checksum offload */
294 printk(KERN_INFO "r8712u: 2 RCR=0x%x\n", r8712_read32(padapter, RCR));
295 val32 = r8712_read32(padapter, RCR);
296 r8712_write32(padapter, RCR, (val32|BIT(25))); /* Append PHY status */
297 val32 = 0;
298 val32 = r8712_read32(padapter, 0x10250040);
299 r8712_write32(padapter, 0x10250040, (val32&0x00FFFFFF));
300 /* for usb rx aggregation */
301 r8712_write8(padapter, 0x102500B5, r8712_read8(padapter, 0x102500B5) |
302 BIT(0)); /* page = 128bytes */
303 r8712_write8(padapter, 0x102500BD, r8712_read8(padapter, 0x102500BD) |
304 BIT(7)); /* enable usb rx aggregation */
305 r8712_write8(padapter, 0x102500D9, 1); /* TH=1 => means that invalidate
306 * usb rx aggregation */
307 r8712_write8(padapter, 0x1025FE5B, 0x04); /* 1.7ms/4 */
308 /* Fix the RX FIFO issue(USB error) */
309 r8712_write8(padapter, 0x1025fe5C, r8712_read8(padapter, 0x1025fe5C)
310 | BIT(7));
311 for (i = 0; i < 6; i++)
312 padapter->eeprompriv.mac_addr[i] = r8712_read8(padapter,
313 MACID + i);
314 return _SUCCESS;
315}
316
317uint rtl8712_hal_deinit(struct _adapter *padapter)
318{
319 r8712_write8(padapter, RF_CTRL, 0x00);
320 /* Turn off BB */
321 msleep(20);
322 /* Turn off MAC */
323 r8712_write8(padapter, SYS_CLKR+1, 0x38); /* Switch Control Path */
324 r8712_write8(padapter, SYS_FUNC_EN+1, 0x70);
325 r8712_write8(padapter, PMC_FSM, 0x06); /* Enable Loader Data Keep */
326 r8712_write8(padapter, SYS_ISO_CTRL, 0xF9); /* Isolation signals from
327 * CORE, PLL */
328 r8712_write8(padapter, SYS_ISO_CTRL+1, 0xe8); /* Enable EFUSE 1.2V */
329 r8712_write8(padapter, AFE_PLL_CTRL, 0x00); /* Disable AFE PLL. */
330 r8712_write8(padapter, LDOA15_CTRL, 0x54); /* Disable A15V */
331 r8712_write8(padapter, SYS_FUNC_EN+1, 0x50); /* Disable E-Fuse 1.2V */
332 r8712_write8(padapter, LDOV12D_CTRL, 0x24); /* Disable LDO12(for CE) */
333 r8712_write8(padapter, AFE_MISC, 0x30); /* Disable AFE BG&MB */
334 /* Option for Disable 1.6V LDO. */
335 r8712_write8(padapter, SPS0_CTRL, 0x56); /* Disable 1.6V LDO */
336 r8712_write8(padapter, SPS0_CTRL+1, 0x43); /* Set SW PFM */
337 return _SUCCESS;
338}
339
340uint rtl871x_hal_init(struct _adapter *padapter)
341{
342 padapter->hw_init_completed = false;
343 if (padapter->halpriv.hal_bus_init == NULL)
344 return _FAIL;
345 else {
346 if (padapter->halpriv.hal_bus_init(padapter) != _SUCCESS)
347 return _FAIL;
348 }
349 if (rtl8712_hal_init(padapter) == _SUCCESS)
350 padapter->hw_init_completed = true;
351 else {
352 padapter->hw_init_completed = false;
353 return _FAIL;
354 }
355 return _SUCCESS;
356}
diff --git a/drivers/staging/rtl8712/ieee80211.c b/drivers/staging/rtl8712/ieee80211.c
new file mode 100644
index 00000000000..f06addcf063
--- /dev/null
+++ b/drivers/staging/rtl8712/ieee80211.c
@@ -0,0 +1,454 @@
1/******************************************************************************
2 * ieee80211.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _IEEE80211_C
30
31#include "drv_types.h"
32#include "ieee80211.h"
33#include "wifi.h"
34#include "osdep_service.h"
35#include "wlan_bssdef.h"
36
37static const u8 WPA_OUI_TYPE[] = {0x00, 0x50, 0xf2, 1};
38static const u8 WPA_CIPHER_SUITE_NONE[] = {0x00, 0x50, 0xf2, 0};
39static const u8 WPA_CIPHER_SUITE_WEP40[] = {0x00, 0x50, 0xf2, 1};
40static const u8 WPA_CIPHER_SUITE_TKIP[] = {0x00, 0x50, 0xf2, 2};
41static const u8 WPA_CIPHER_SUITE_CCMP[] = {0x00, 0x50, 0xf2, 4};
42static const u8 WPA_CIPHER_SUITE_WEP104[] = {0x00, 0x50, 0xf2, 5};
43
44static const u8 RSN_CIPHER_SUITE_NONE[] = {0x00, 0x0f, 0xac, 0};
45static const u8 RSN_CIPHER_SUITE_WEP40[] = {0x00, 0x0f, 0xac, 1};
46static const u8 RSN_CIPHER_SUITE_TKIP[] = {0x00, 0x0f, 0xac, 2};
47static const u8 RSN_CIPHER_SUITE_CCMP[] = {0x00, 0x0f, 0xac, 4};
48static const u8 RSN_CIPHER_SUITE_WEP104[] = {0x00, 0x0f, 0xac, 5};
49
50/*-----------------------------------------------------------
51 * for adhoc-master to generate ie and provide supported-rate to fw
52 *-----------------------------------------------------------
53 */
54
55static u8 WIFI_CCKRATES[] = {
56 (IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK),
57 (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK),
58 (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK),
59 (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK)
60};
61
62static u8 WIFI_OFDMRATES[] = {
63 (IEEE80211_OFDM_RATE_6MB),
64 (IEEE80211_OFDM_RATE_9MB),
65 (IEEE80211_OFDM_RATE_12MB),
66 (IEEE80211_OFDM_RATE_18MB),
67 (IEEE80211_OFDM_RATE_24MB),
68 (IEEE80211_OFDM_RATE_36MB),
69 (IEEE80211_OFDM_RATE_48MB),
70 (IEEE80211_OFDM_RATE_54MB)
71};
72
73uint r8712_is_cckrates_included(u8 *rate)
74{
75 u32 i = 0;
76
77 while (rate[i] != 0) {
78 if ((((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) ||
79 (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22))
80 return true;
81 i++;
82 }
83 return false;
84}
85
86uint r8712_is_cckratesonly_included(u8 *rate)
87{
88 u32 i = 0;
89
90 while (rate[i] != 0) {
91 if ((((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&
92 (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22))
93 return false;
94 i++;
95 }
96 return true;
97}
98
99/* r8712_set_ie will update frame length */
100u8 *r8712_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen)
101{
102 *pbuf = (u8)index;
103 *(pbuf + 1) = (u8)len;
104 if (len > 0)
105 memcpy((void *)(pbuf + 2), (void *)source, len);
106 *frlen = *frlen + (len + 2);
107 return pbuf + len + 2;
108}
109
110/*----------------------------------------------------------------------------
111index: the information element id index, limit is the limit for search
112-----------------------------------------------------------------------------*/
113u8 *r8712_get_ie(u8 *pbuf, sint index, sint *len, sint limit)
114{
115 sint tmp, i;
116 u8 *p;
117
118 if (limit < 1)
119 return NULL;
120 p = pbuf;
121 i = 0;
122 *len = 0;
123 while (1) {
124 if (*p == index) {
125 *len = *(p + 1);
126 return p;
127 } else {
128 tmp = *(p + 1);
129 p += (tmp + 2);
130 i += (tmp + 2);
131 }
132 if (i >= limit)
133 break;
134 }
135 return NULL;
136}
137
138static void set_supported_rate(u8 *SupportedRates, uint mode)
139{
140 memset(SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX);
141 switch (mode) {
142 case WIRELESS_11B:
143 memcpy(SupportedRates, WIFI_CCKRATES,
144 IEEE80211_CCK_RATE_LEN);
145 break;
146 case WIRELESS_11G:
147 case WIRELESS_11A:
148 memcpy(SupportedRates, WIFI_OFDMRATES,
149 IEEE80211_NUM_OFDM_RATESLEN);
150 break;
151 case WIRELESS_11BG:
152 memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN);
153 memcpy(SupportedRates + IEEE80211_CCK_RATE_LEN, WIFI_OFDMRATES,
154 IEEE80211_NUM_OFDM_RATESLEN);
155 break;
156 }
157}
158
159static uint r8712_get_rateset_len(u8 *rateset)
160{
161 uint i = 0;
162
163 while (1) {
164 if ((rateset[i]) == 0)
165 break;
166 if (i > 12)
167 break;
168 i++;
169 }
170 return i;
171}
172
173int r8712_generate_ie(struct registry_priv *pregistrypriv,
174 struct _adapter *padapter)
175{
176 int sz = 0, rateLen;
177 struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network;
178 u8 *ie = pdev_network->IEs;
179 struct ieee80211_ht_cap ht_capie;
180 struct ieee80211_ht_addt_info ht_addt_info;
181 unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
182 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
183 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
184
185 /*timestamp will be inserted by hardware*/
186 sz += 8;
187 ie += sz;
188 /*beacon interval : 2bytes*/
189 *(u16 *)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);
190 sz += 2;
191 ie += 2;
192 /*capability info*/
193 *(u16 *)ie = 0;
194 *(u16 *)ie |= cpu_to_le16(cap_IBSS);
195 if (pregistrypriv->preamble == PREAMBLE_SHORT)
196 *(u16 *)ie |= cpu_to_le16(cap_ShortPremble);
197 if (pdev_network->Privacy)
198 *(u16 *)ie |= cpu_to_le16(cap_Privacy);
199 sz += 2;
200 ie += 2;
201 /*SSID*/
202 ie = r8712_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength,
203 pdev_network->Ssid.Ssid, &sz);
204 /*supported rates*/
205 set_supported_rate(pdev_network->SupportedRates,
206 pregistrypriv->wireless_mode);
207 rateLen = r8712_get_rateset_len(pdev_network->SupportedRates);
208 if (rateLen > 8) {
209 ie = r8712_set_ie(ie, _SUPPORTEDRATES_IE_, 8,
210 pdev_network->SupportedRates, &sz);
211 ie = r8712_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8),
212 (pdev_network->SupportedRates + 8), &sz);
213 } else
214 ie = r8712_set_ie(ie, _SUPPORTEDRATES_IE_,
215 rateLen, pdev_network->SupportedRates, &sz);
216 /*DS parameter set*/
217 ie = r8712_set_ie(ie, _DSSET_IE_, 1,
218 (u8 *)&(pdev_network->Configuration.DSConfig), &sz);
219 /*IBSS Parameter Set*/
220 ie = r8712_set_ie(ie, _IBSS_PARA_IE_, 2,
221 (u8 *)&(pdev_network->Configuration.ATIMWindow), &sz);
222 if (pregistrypriv->ht_enable == 1) {
223 if (pqospriv->qos_option == 0) {
224 ie = r8712_set_ie(ie, _VENDOR_SPECIFIC_IE_,
225 _WMM_IE_Length_, WMM_IE, &sz);
226 pqospriv->qos_option = 1;
227 }
228 memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap));
229 ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |
230 IEEE80211_HT_CAP_SGI_20 |
231 IEEE80211_HT_CAP_SGI_40 |
232 IEEE80211_HT_CAP_TX_STBC |
233 IEEE80211_HT_CAP_MAX_AMSDU |
234 IEEE80211_HT_CAP_DSSSCCK40;
235 ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR &
236 0x03) | (IEEE80211_HT_CAP_AMPDU_DENSITY & 0x00);
237 ie = r8712_set_ie(ie, _HT_CAPABILITY_IE_,
238 sizeof(struct ieee80211_ht_cap),
239 (unsigned char *)&ht_capie, &sz);
240 /*add HT info ie*/
241 memset(&ht_addt_info, 0,
242 sizeof(struct ieee80211_ht_addt_info));
243 /*need to add the HT additional IEs*/
244 ht_addt_info.control_chan = pregistrypriv->channel;
245 ie = r8712_set_ie(ie, _HT_ADD_INFO_IE_,
246 sizeof(struct ieee80211_ht_addt_info),
247 (unsigned char *)&ht_addt_info, &sz);
248 }
249 return sz;
250}
251
252unsigned char *r8712_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit)
253{
254 int len;
255 u16 val16;
256 unsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01};
257 u8 *pbuf = pie;
258
259 while (1) {
260 pbuf = r8712_get_ie(pbuf, _WPA_IE_ID_, &len, limit);
261 if (pbuf) {
262 /*check if oui matches...*/
263 if (memcmp((pbuf + 2), wpa_oui_type,
264 sizeof(wpa_oui_type)))
265 goto check_next_ie;
266 /*check version...*/
267 memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16));
268 val16 = le16_to_cpu(val16);
269 if (val16 != 0x0001)
270 goto check_next_ie;
271 *wpa_ie_len = *(pbuf + 1);
272 return pbuf;
273 } else {
274 *wpa_ie_len = 0;
275 return NULL;
276 }
277check_next_ie:
278 limit = limit - (pbuf - pie) - 2 - len;
279 if (limit <= 0)
280 break;
281 pbuf += (2 + len);
282 }
283 *wpa_ie_len = 0;
284 return NULL;
285}
286
287unsigned char *r8712_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit)
288{
289 return r8712_get_ie(pie, _WPA2_IE_ID_, rsn_ie_len, limit);
290}
291
292static int r8712_get_wpa_cipher_suite(u8 *s)
293{
294 if (!memcmp(s, (void *)WPA_CIPHER_SUITE_NONE, WPA_SELECTOR_LEN))
295 return WPA_CIPHER_NONE;
296 if (!memcmp(s, (void *)WPA_CIPHER_SUITE_WEP40, WPA_SELECTOR_LEN))
297 return WPA_CIPHER_WEP40;
298 if (!memcmp(s, (void *)WPA_CIPHER_SUITE_TKIP, WPA_SELECTOR_LEN))
299 return WPA_CIPHER_TKIP;
300 if (!memcmp(s, (void *)WPA_CIPHER_SUITE_CCMP, WPA_SELECTOR_LEN))
301 return WPA_CIPHER_CCMP;
302 if (!memcmp(s, (void *)WPA_CIPHER_SUITE_WEP104, WPA_SELECTOR_LEN))
303 return WPA_CIPHER_WEP104;
304 return 0;
305}
306
307static int r8712_get_wpa2_cipher_suite(u8 *s)
308{
309 if (!memcmp(s, (void *)RSN_CIPHER_SUITE_NONE, RSN_SELECTOR_LEN))
310 return WPA_CIPHER_NONE;
311 if (!memcmp(s, (void *)RSN_CIPHER_SUITE_WEP40, RSN_SELECTOR_LEN))
312 return WPA_CIPHER_WEP40;
313 if (!memcmp(s, (void *)RSN_CIPHER_SUITE_TKIP, RSN_SELECTOR_LEN))
314 return WPA_CIPHER_TKIP;
315 if (!memcmp(s, (void *)RSN_CIPHER_SUITE_CCMP, RSN_SELECTOR_LEN))
316 return WPA_CIPHER_CCMP;
317 if (!memcmp(s, (void *)RSN_CIPHER_SUITE_WEP104, RSN_SELECTOR_LEN))
318 return WPA_CIPHER_WEP104;
319 return 0;
320}
321
322int r8712_parse_wpa_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher,
323 int *pairwise_cipher)
324{
325 int i, ret = _SUCCESS;
326 int left, count;
327 u8 *pos;
328
329 if (wpa_ie_len <= 0) {
330 /* No WPA IE - fail silently */
331 return _FAIL;
332 }
333 if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie + 1) != (u8)(wpa_ie_len - 2))
334 || (memcmp(wpa_ie + 2, (void *)WPA_OUI_TYPE, WPA_SELECTOR_LEN)))
335 return _FAIL;
336 pos = wpa_ie;
337 pos += 8;
338 left = wpa_ie_len - 8;
339 /*group_cipher*/
340 if (left >= WPA_SELECTOR_LEN) {
341 *group_cipher = r8712_get_wpa_cipher_suite(pos);
342 pos += WPA_SELECTOR_LEN;
343 left -= WPA_SELECTOR_LEN;
344 } else if (left > 0)
345 return _FAIL;
346 /*pairwise_cipher*/
347 if (left >= 2) {
348 count = le16_to_cpu(*(u16 *)pos);
349 pos += 2;
350 left -= 2;
351 if (count == 0 || left < count * WPA_SELECTOR_LEN)
352 return _FAIL;
353 for (i = 0; i < count; i++) {
354 *pairwise_cipher |= r8712_get_wpa_cipher_suite(pos);
355 pos += WPA_SELECTOR_LEN;
356 left -= WPA_SELECTOR_LEN;
357 }
358 } else if (left == 1)
359 return _FAIL;
360 return ret;
361}
362
363int r8712_parse_wpa2_ie(u8 *rsn_ie, int rsn_ie_len, int *group_cipher,
364 int *pairwise_cipher)
365{
366 int i, ret = _SUCCESS;
367 int left, count;
368 u8 *pos;
369
370 if (rsn_ie_len <= 0) {
371 /* No RSN IE - fail silently */
372 return _FAIL;
373 }
374 if ((*rsn_ie != _WPA2_IE_ID_) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2)))
375 return _FAIL;
376 pos = rsn_ie;
377 pos += 4;
378 left = rsn_ie_len - 4;
379 /*group_cipher*/
380 if (left >= RSN_SELECTOR_LEN) {
381 *group_cipher = r8712_get_wpa2_cipher_suite(pos);
382 pos += RSN_SELECTOR_LEN;
383 left -= RSN_SELECTOR_LEN;
384 } else if (left > 0)
385 return _FAIL;
386 /*pairwise_cipher*/
387 if (left >= 2) {
388 count = le16_to_cpu(*(u16 *)pos);
389 pos += 2;
390 left -= 2;
391 if (count == 0 || left < count * RSN_SELECTOR_LEN)
392 return _FAIL;
393 for (i = 0; i < count; i++) {
394 *pairwise_cipher |= r8712_get_wpa2_cipher_suite(pos);
395 pos += RSN_SELECTOR_LEN;
396 left -= RSN_SELECTOR_LEN;
397 }
398 } else if (left == 1)
399 return _FAIL;
400 return ret;
401}
402
403int r8712_get_sec_ie(u8 *in_ie, uint in_len, u8 *rsn_ie, u16 *rsn_len,
404 u8 *wpa_ie, u16 *wpa_len)
405{
406 u8 authmode, sec_idx;
407 u8 wpa_oui[4] = {0x0, 0x50, 0xf2, 0x01};
408 uint cnt;
409
410 /*Search required WPA or WPA2 IE and copy to sec_ie[ ]*/
411 cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_);
412 sec_idx = 0;
413 while (cnt < in_len) {
414 authmode = in_ie[cnt];
415 if ((authmode == _WPA_IE_ID_) &&
416 (!memcmp(&in_ie[cnt + 2], &wpa_oui[0], 4))) {
417 memcpy(wpa_ie, &in_ie[cnt], in_ie[cnt + 1] + 2);
418 *wpa_len = in_ie[cnt+1]+2;
419 cnt += in_ie[cnt + 1] + 2; /*get next */
420 } else {
421 if (authmode == _WPA2_IE_ID_) {
422 memcpy(rsn_ie, &in_ie[cnt],
423 in_ie[cnt + 1] + 2);
424 *rsn_len = in_ie[cnt+1] + 2;
425 cnt += in_ie[cnt+1] + 2; /*get next*/
426 } else
427 cnt += in_ie[cnt+1] + 2; /*get next*/
428 }
429 }
430 return *rsn_len + *wpa_len;
431}
432
433int r8712_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen)
434{
435 int match;
436 uint cnt;
437 u8 eid, wps_oui[4] = {0x0, 0x50, 0xf2, 0x04};
438
439 cnt = 12;
440 match = false;
441 while (cnt < in_len) {
442 eid = in_ie[cnt];
443 if ((eid == _WPA_IE_ID_) &&
444 (!memcmp(&in_ie[cnt+2], wps_oui, 4))) {
445 memcpy(wps_ie, &in_ie[cnt], in_ie[cnt+1]+2);
446 *wps_ielen = in_ie[cnt+1]+2;
447 cnt += in_ie[cnt+1]+2;
448 match = true;
449 break;
450 } else
451 cnt += in_ie[cnt+1]+2; /* goto next */
452 }
453 return match;
454}
diff --git a/drivers/staging/rtl8712/ieee80211.h b/drivers/staging/rtl8712/ieee80211.h
new file mode 100644
index 00000000000..432cf8a7605
--- /dev/null
+++ b/drivers/staging/rtl8712/ieee80211.h
@@ -0,0 +1,770 @@
1#ifndef __IEEE80211_H
2#define __IEEE80211_H
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include "wifi.h"
7#include <linux/wireless.h>
8
9#define MGMT_QUEUE_NUM 5
10#define ETH_ALEN 6
11#define IEEE_CMD_SET_WPA_PARAM 1
12#define IEEE_CMD_SET_WPA_IE 2
13#define IEEE_CMD_SET_ENCRYPTION 3
14#define IEEE_CMD_MLME 4
15
16#define IEEE_PARAM_WPA_ENABLED 1
17#define IEEE_PARAM_TKIP_COUNTERMEASURES 2
18#define IEEE_PARAM_DROP_UNENCRYPTED 3
19#define IEEE_PARAM_PRIVACY_INVOKED 4
20#define IEEE_PARAM_AUTH_ALGS 5
21#define IEEE_PARAM_IEEE_802_1X 6
22#define IEEE_PARAM_WPAX_SELECT 7
23
24#define AUTH_ALG_OPEN_SYSTEM 0x1
25#define AUTH_ALG_SHARED_KEY 0x2
26#define AUTH_ALG_LEAP 0x00000004
27
28#define IEEE_MLME_STA_DEAUTH 1
29#define IEEE_MLME_STA_DISASSOC 2
30
31#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2
32#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3
33#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4
34#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5
35#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6
36#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7
37
38
39#define IEEE_CRYPT_ALG_NAME_LEN 16
40
41#define WPA_CIPHER_NONE BIT(0)
42#define WPA_CIPHER_WEP40 BIT(1)
43#define WPA_CIPHER_WEP104 BIT(2)
44#define WPA_CIPHER_TKIP BIT(3)
45#define WPA_CIPHER_CCMP BIT(4)
46
47
48
49#define WPA_SELECTOR_LEN 4
50#define RSN_HEADER_LEN 4
51
52#define RSN_SELECTOR_LEN 4
53
54enum NETWORK_TYPE {
55 WIRELESS_INVALID = 0,
56 WIRELESS_11B = 1,
57 WIRELESS_11G = 2,
58 WIRELESS_11BG = (WIRELESS_11B | WIRELESS_11G),
59 WIRELESS_11A = 4,
60 WIRELESS_11N = 8,
61 WIRELESS_11GN = (WIRELESS_11G | WIRELESS_11N),
62 WIRELESS_11BGN = (WIRELESS_11B | WIRELESS_11G | WIRELESS_11N),
63};
64
65
66struct ieee_param {
67 u32 cmd;
68 u8 sta_addr[ETH_ALEN];
69 union {
70 struct {
71 u8 name;
72 u32 value;
73 } wpa_param;
74 struct {
75 u32 len;
76 u8 reserved[32];
77 u8 data[0];
78 } wpa_ie;
79 struct{
80 int command;
81 int reason_code;
82 } mlme;
83 struct {
84 u8 alg[IEEE_CRYPT_ALG_NAME_LEN];
85 u8 set_tx;
86 u32 err;
87 u8 idx;
88 u8 seq[8]; /* sequence counter (set: RX, get: TX) */
89 u16 key_len;
90 u8 key[0];
91 } crypt;
92 } u;
93};
94
95#define IEEE80211_DATA_LEN 2304
96/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
97 6.2.1.1.2.
98
99 The figure in section 7.1.2 suggests a body size of up to 2312
100 bytes is allowed, which is a bit confusing, I suspect this
101 represents the 2304 bytes of real data, plus a possible 8 bytes of
102 WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
103
104#define IEEE80211_HLEN 30
105#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
106
107/* this is stolen from ipw2200 driver */
108#define IEEE_IBSS_MAC_HASH_SIZE 31
109
110struct ieee_ibss_seq {
111 u8 mac[ETH_ALEN];
112 u16 seq_num;
113 u16 frag_num;
114 unsigned int packet_time;
115 struct list_head list;
116};
117
118struct ieee80211_hdr {
119 u16 frame_ctl;
120 u16 duration_id;
121 u8 addr1[ETH_ALEN];
122 u8 addr2[ETH_ALEN];
123 u8 addr3[ETH_ALEN];
124 u16 seq_ctl;
125 u8 addr4[ETH_ALEN];
126} __attribute__ ((packed));
127
128struct ieee80211_hdr_3addr {
129 u16 frame_ctl;
130 u16 duration_id;
131 u8 addr1[ETH_ALEN];
132 u8 addr2[ETH_ALEN];
133 u8 addr3[ETH_ALEN];
134 u16 seq_ctl;
135} __attribute__ ((packed));
136
137
138struct ieee80211_hdr_qos {
139 u16 frame_ctl;
140 u16 duration_id;
141 u8 addr1[ETH_ALEN];
142 u8 addr2[ETH_ALEN];
143 u8 addr3[ETH_ALEN];
144 u16 seq_ctl;
145 u8 addr4[ETH_ALEN];
146 u16 qc;
147} __attribute__ ((packed));
148
149struct ieee80211_hdr_3addr_qos {
150 u16 frame_ctl;
151 u16 duration_id;
152 u8 addr1[ETH_ALEN];
153 u8 addr2[ETH_ALEN];
154 u8 addr3[ETH_ALEN];
155 u16 seq_ctl;
156 u16 qc;
157} __attribute__ ((packed));
158
159struct eapol {
160 u8 snap[6];
161 u16 ethertype;
162 u8 version;
163 u8 type;
164 u16 length;
165} __attribute__ ((packed));
166
167
168enum eap_type {
169 EAP_PACKET = 0,
170 EAPOL_START,
171 EAPOL_LOGOFF,
172 EAPOL_KEY,
173 EAPOL_ENCAP_ASF_ALERT
174};
175
176#define IEEE80211_3ADDR_LEN 24
177#define IEEE80211_4ADDR_LEN 30
178#define IEEE80211_FCS_LEN 4
179
180#define MIN_FRAG_THRESHOLD 256U
181#define MAX_FRAG_THRESHOLD 2346U
182
183/* Frame control field constants */
184#define IEEE80211_FCTL_VERS 0x0002
185#define IEEE80211_FCTL_FTYPE 0x000c
186#define IEEE80211_FCTL_STYPE 0x00f0
187#define IEEE80211_FCTL_TODS 0x0100
188#define IEEE80211_FCTL_FROMDS 0x0200
189#define IEEE80211_FCTL_MOREFRAGS 0x0400
190#define IEEE80211_FCTL_RETRY 0x0800
191#define IEEE80211_FCTL_PM 0x1000
192#define IEEE80211_FCTL_MOREDATA 0x2000
193#define IEEE80211_FCTL_WEP 0x4000
194#define IEEE80211_FCTL_ORDER 0x8000
195
196#define IEEE80211_FTYPE_MGMT 0x0000
197#define IEEE80211_FTYPE_CTL 0x0004
198#define IEEE80211_FTYPE_DATA 0x0008
199
200/* management */
201#define IEEE80211_STYPE_ASSOC_REQ 0x0000
202#define IEEE80211_STYPE_ASSOC_RESP 0x0010
203#define IEEE80211_STYPE_REASSOC_REQ 0x0020
204#define IEEE80211_STYPE_REASSOC_RESP 0x0030
205#define IEEE80211_STYPE_PROBE_REQ 0x0040
206#define IEEE80211_STYPE_PROBE_RESP 0x0050
207#define IEEE80211_STYPE_BEACON 0x0080
208#define IEEE80211_STYPE_ATIM 0x0090
209#define IEEE80211_STYPE_DISASSOC 0x00A0
210#define IEEE80211_STYPE_AUTH 0x00B0
211#define IEEE80211_STYPE_DEAUTH 0x00C0
212
213/* control */
214#define IEEE80211_STYPE_PSPOLL 0x00A0
215#define IEEE80211_STYPE_RTS 0x00B0
216#define IEEE80211_STYPE_CTS 0x00C0
217#define IEEE80211_STYPE_ACK 0x00D0
218#define IEEE80211_STYPE_CFEND 0x00E0
219#define IEEE80211_STYPE_CFENDACK 0x00F0
220
221/* data */
222#define IEEE80211_STYPE_DATA 0x0000
223#define IEEE80211_STYPE_DATA_CFACK 0x0010
224#define IEEE80211_STYPE_DATA_CFPOLL 0x0020
225#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
226#define IEEE80211_STYPE_NULLFUNC 0x0040
227#define IEEE80211_STYPE_CFACK 0x0050
228#define IEEE80211_STYPE_CFPOLL 0x0060
229#define IEEE80211_STYPE_CFACKPOLL 0x0070
230#define IEEE80211_QOS_DATAGRP 0x0080
231#define IEEE80211_QoS_DATAGRP IEEE80211_QOS_DATAGRP
232
233#define IEEE80211_SCTL_FRAG 0x000F
234#define IEEE80211_SCTL_SEQ 0xFFF0
235
236/* QoS,QOS */
237#define NORMAL_ACK 0
238#define NO_ACK 1
239#define NON_EXPLICIT_ACK 2
240#define BLOCK_ACK 3
241
242#ifndef ETH_P_PAE
243#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
244#endif /* ETH_P_PAE */
245
246#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
247
248#define ETH_P_ECONET 0x0018
249
250#ifndef ETH_P_80211_RAW
251#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
252#endif
253
254/* IEEE 802.11 defines */
255
256#define P80211_OUI_LEN 3
257
258struct ieee80211_snap_hdr {
259 u8 dsap; /* always 0xAA */
260 u8 ssap; /* always 0xAA */
261 u8 ctrl; /* always 0x03 */
262 u8 oui[P80211_OUI_LEN]; /* organizational universal id */
263} __attribute__ ((packed));
264
265#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
266
267#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
268#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
269
270#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f)
271
272#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG)
273#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE80211_SCTL_SEQ)
274
275/* Authentication algorithms */
276#define WLAN_AUTH_OPEN 0
277#define WLAN_AUTH_SHARED_KEY 1
278
279#define WLAN_AUTH_CHALLENGE_LEN 128
280
281#define WLAN_CAPABILITY_BSS (1<<0)
282#define WLAN_CAPABILITY_IBSS (1<<1)
283#define WLAN_CAPABILITY_CF_POLLABLE (1<<2)
284#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
285#define WLAN_CAPABILITY_PRIVACY (1<<4)
286#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
287#define WLAN_CAPABILITY_PBCC (1<<6)
288#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
289#define WLAN_CAPABILITY_SHORT_SLOT (1<<10)
290
291/* Status codes */
292#define WLAN_STATUS_SUCCESS 0
293#define WLAN_STATUS_UNSPECIFIED_FAILURE 1
294#define WLAN_STATUS_CAPS_UNSUPPORTED 10
295#define WLAN_STATUS_REASSOC_NO_ASSOC 11
296#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12
297#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13
298#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14
299#define WLAN_STATUS_CHALLENGE_FAIL 15
300#define WLAN_STATUS_AUTH_TIMEOUT 16
301#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17
302#define WLAN_STATUS_ASSOC_DENIED_RATES 18
303/* 802.11b */
304#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19
305#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20
306#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21
307
308/* Reason codes */
309#define WLAN_REASON_UNSPECIFIED 1
310#define WLAN_REASON_PREV_AUTH_NOT_VALID 2
311#define WLAN_REASON_DEAUTH_LEAVING 3
312#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4
313#define WLAN_REASON_DISASSOC_AP_BUSY 5
314#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6
315#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7
316#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8
317#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9
318
319
320/* Information Element IDs */
321#define WLAN_EID_SSID 0
322#define WLAN_EID_SUPP_RATES 1
323#define WLAN_EID_FH_PARAMS 2
324#define WLAN_EID_DS_PARAMS 3
325#define WLAN_EID_CF_PARAMS 4
326#define WLAN_EID_TIM 5
327#define WLAN_EID_IBSS_PARAMS 6
328#define WLAN_EID_CHALLENGE 16
329#define WLAN_EID_RSN 48
330#define WLAN_EID_GENERIC 221
331
332#define IEEE80211_MGMT_HDR_LEN 24
333#define IEEE80211_DATA_HDR3_LEN 24
334#define IEEE80211_DATA_HDR4_LEN 30
335
336
337#define IEEE80211_STATMASK_SIGNAL (1<<0)
338#define IEEE80211_STATMASK_RSSI (1<<1)
339#define IEEE80211_STATMASK_NOISE (1<<2)
340#define IEEE80211_STATMASK_RATE (1<<3)
341#define IEEE80211_STATMASK_WEMASK 0x7
342
343
344#define IEEE80211_CCK_MODULATION (1<<0)
345#define IEEE80211_OFDM_MODULATION (1<<1)
346
347#define IEEE80211_24GHZ_BAND (1<<0)
348#define IEEE80211_52GHZ_BAND (1<<1)
349
350#define IEEE80211_CCK_RATE_LEN 4
351#define IEEE80211_NUM_OFDM_RATESLEN 8
352
353
354#define IEEE80211_CCK_RATE_1MB 0x02
355#define IEEE80211_CCK_RATE_2MB 0x04
356#define IEEE80211_CCK_RATE_5MB 0x0B
357#define IEEE80211_CCK_RATE_11MB 0x16
358#define IEEE80211_OFDM_RATE_LEN 8
359#define IEEE80211_OFDM_RATE_6MB 0x0C
360#define IEEE80211_OFDM_RATE_9MB 0x12
361#define IEEE80211_OFDM_RATE_12MB 0x18
362#define IEEE80211_OFDM_RATE_18MB 0x24
363#define IEEE80211_OFDM_RATE_24MB 0x30
364#define IEEE80211_OFDM_RATE_36MB 0x48
365#define IEEE80211_OFDM_RATE_48MB 0x60
366#define IEEE80211_OFDM_RATE_54MB 0x6C
367#define IEEE80211_BASIC_RATE_MASK 0x80
368
369#define IEEE80211_CCK_RATE_1MB_MASK (1<<0)
370#define IEEE80211_CCK_RATE_2MB_MASK (1<<1)
371#define IEEE80211_CCK_RATE_5MB_MASK (1<<2)
372#define IEEE80211_CCK_RATE_11MB_MASK (1<<3)
373#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4)
374#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5)
375#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6)
376#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7)
377#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8)
378#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9)
379#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10)
380#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11)
381
382#define IEEE80211_CCK_RATES_MASK 0x0000000F
383#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \
384 IEEE80211_CCK_RATE_2MB_MASK)
385#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \
386 IEEE80211_CCK_RATE_5MB_MASK | \
387 IEEE80211_CCK_RATE_11MB_MASK)
388
389#define IEEE80211_OFDM_RATES_MASK 0x00000FF0
390#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \
391 IEEE80211_OFDM_RATE_12MB_MASK | \
392 IEEE80211_OFDM_RATE_24MB_MASK)
393#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \
394 IEEE80211_OFDM_RATE_9MB_MASK | \
395 IEEE80211_OFDM_RATE_18MB_MASK | \
396 IEEE80211_OFDM_RATE_36MB_MASK | \
397 IEEE80211_OFDM_RATE_48MB_MASK | \
398 IEEE80211_OFDM_RATE_54MB_MASK)
399#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \
400 IEEE80211_CCK_DEFAULT_RATES_MASK)
401
402#define IEEE80211_NUM_OFDM_RATES 8
403#define IEEE80211_NUM_CCK_RATES 4
404#define IEEE80211_OFDM_SHIFT_MASK_A 4
405
406
407
408
409/* NOTE: This data is for statistical purposes; not all hardware provides this
410 * information for frames received. Not setting these will not cause
411 * any adverse affects. */
412struct ieee80211_rx_stats {
413 s8 rssi;
414 u8 signal;
415 u8 noise;
416 u8 received_channel;
417 u16 rate; /* in 100 kbps */
418 u8 mask;
419 u8 freq;
420 u16 len;
421};
422
423/* IEEE 802.11 requires that STA supports concurrent reception of at least
424 * three fragmented frames. This define can be increased to support more
425 * concurrent frames, but it should be noted that each entry can consume about
426 * 2 kB of RAM and increasing cache size will slow down frame reassembly. */
427#define IEEE80211_FRAG_CACHE_LEN 4
428
429struct ieee80211_frag_entry {
430 u32 first_frag_time;
431 uint seq;
432 uint last_frag;
433 uint qos; /*jackson*/
434 uint tid; /*jackson*/
435 struct sk_buff *skb;
436 u8 src_addr[ETH_ALEN];
437 u8 dst_addr[ETH_ALEN];
438};
439
440struct ieee80211_stats {
441 uint tx_unicast_frames;
442 uint tx_multicast_frames;
443 uint tx_fragments;
444 uint tx_unicast_octets;
445 uint tx_multicast_octets;
446 uint tx_deferred_transmissions;
447 uint tx_single_retry_frames;
448 uint tx_multiple_retry_frames;
449 uint tx_retry_limit_exceeded;
450 uint tx_discards;
451 uint rx_unicast_frames;
452 uint rx_multicast_frames;
453 uint rx_fragments;
454 uint rx_unicast_octets;
455 uint rx_multicast_octets;
456 uint rx_fcs_errors;
457 uint rx_discards_no_buffer;
458 uint tx_discards_wrong_sa;
459 uint rx_discards_undecryptable;
460 uint rx_message_in_msg_fragments;
461 uint rx_message_in_bad_msg_fragments;
462};
463
464struct ieee80211_softmac_stats{
465 uint rx_ass_ok;
466 uint rx_ass_err;
467 uint rx_probe_rq;
468 uint tx_probe_rs;
469 uint tx_beacons;
470 uint rx_auth_rq;
471 uint rx_auth_rs_ok;
472 uint rx_auth_rs_err;
473 uint tx_auth_rq;
474 uint no_auth_rs;
475 uint no_ass_rs;
476 uint tx_ass_rq;
477 uint rx_ass_rq;
478 uint tx_probe_rq;
479 uint reassoc;
480 uint swtxstop;
481 uint swtxawake;
482};
483
484#define SEC_KEY_1 (1<<0)
485#define SEC_KEY_2 (1<<1)
486#define SEC_KEY_3 (1<<2)
487#define SEC_KEY_4 (1<<3)
488#define SEC_ACTIVE_KEY (1<<4)
489#define SEC_AUTH_MODE (1<<5)
490#define SEC_UNICAST_GROUP (1<<6)
491#define SEC_LEVEL (1<<7)
492#define SEC_ENABLED (1<<8)
493
494#define SEC_LEVEL_0 0 /* None */
495#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */
496#define SEC_LEVEL_2 2 /* Level 1 + TKIP */
497#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */
498#define SEC_LEVEL_3 4 /* Level 2 + CCMP */
499
500#define WEP_KEYS 4
501#define WEP_KEY_LEN 13
502
503struct ieee80211_security {
504 u16 active_key:2,
505 enabled:1,
506 auth_mode:2,
507 auth_algo:4,
508 unicast_uses_group:1;
509 u8 key_sizes[WEP_KEYS];
510 u8 keys[WEP_KEYS][WEP_KEY_LEN];
511 u8 level;
512 u16 flags;
513} __attribute__ ((packed));
514
515/*
516
517 802.11 data frame from AP
518
519 ,-------------------------------------------------------------------.
520Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
521 |------|------|---------|---------|---------|------|---------|------|
522Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs |
523 | | tion | (BSSID) | | | ence | data | |
524 `-------------------------------------------------------------------'
525
526Total: 28-2340 bytes
527
528*/
529
530struct ieee80211_header_data {
531 u16 frame_ctl;
532 u16 duration_id;
533 u8 addr1[6];
534 u8 addr2[6];
535 u8 addr3[6];
536 u16 seq_ctrl;
537};
538
539#define BEACON_PROBE_SSID_ID_POSITION 12
540
541/* Management Frame Information Element Types */
542#define MFIE_TYPE_SSID 0
543#define MFIE_TYPE_RATES 1
544#define MFIE_TYPE_FH_SET 2
545#define MFIE_TYPE_DS_SET 3
546#define MFIE_TYPE_CF_SET 4
547#define MFIE_TYPE_TIM 5
548#define MFIE_TYPE_IBSS_SET 6
549#define MFIE_TYPE_CHALLENGE 16
550#define MFIE_TYPE_ERP 42
551#define MFIE_TYPE_RSN 48
552#define MFIE_TYPE_RATES_EX 50
553#define MFIE_TYPE_GENERIC 221
554
555struct ieee80211_info_element_hdr {
556 u8 id;
557 u8 len;
558} __attribute__ ((packed));
559
560struct ieee80211_info_element {
561 u8 id;
562 u8 len;
563 u8 data[0];
564} __attribute__ ((packed));
565
566/*
567 * These are the data types that can make up management packets
568 *
569 u16 auth_algorithm;
570 u16 auth_sequence;
571 u16 beacon_interval;
572 u16 capability;
573 u8 current_ap[ETH_ALEN];
574 u16 listen_interval;
575 struct {
576 u16 association_id:14, reserved:2;
577 } __attribute__ ((packed));
578 u32 time_stamp[2];
579 u16 reason;
580 u16 status;
581*/
582
583#define IEEE80211_DEFAULT_TX_ESSID "Penguin"
584#define IEEE80211_DEFAULT_BASIC_RATE 10
585
586struct ieee80211_authentication {
587 struct ieee80211_header_data header;
588 u16 algorithm;
589 u16 transaction;
590 u16 status;
591} __attribute__ ((packed));
592
593struct ieee80211_probe_response {
594 struct ieee80211_header_data header;
595 u32 time_stamp[2];
596 u16 beacon_interval;
597 u16 capability;
598 struct ieee80211_info_element info_element;
599} __attribute__ ((packed));
600
601struct ieee80211_probe_request {
602 struct ieee80211_header_data header;
603} __attribute__ ((packed));
604
605struct ieee80211_assoc_request_frame {
606 struct ieee80211_hdr_3addr header;
607 u16 capability;
608 u16 listen_interval;
609 struct ieee80211_info_element_hdr info_element;
610} __attribute__ ((packed));
611
612struct ieee80211_assoc_response_frame {
613 struct ieee80211_hdr_3addr header;
614 u16 capability;
615 u16 status;
616 u16 aid;
617} __attribute__ ((packed));
618
619struct ieee80211_txb {
620 u8 nr_frags;
621 u8 encrypted;
622 u16 reserved;
623 u16 frag_size;
624 u16 payload_size;
625 struct sk_buff *fragments[0];
626};
627
628/* SWEEP TABLE ENTRIES NUMBER*/
629#define MAX_SWEEP_TAB_ENTRIES 42
630#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7
631/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs
632 * only use 8, and then use extended rates for the remaining supported
633 * rates. Other APs, however, stick all of their supported rates on the
634 * main rates information element... */
635#define MAX_RATES_LENGTH ((u8)12)
636#define MAX_RATES_EX_LENGTH ((u8)16)
637#define MAX_NETWORK_COUNT 128
638#define MAX_CHANNEL_NUMBER 161
639#define IEEE80211_SOFTMAC_SCAN_TIME 400
640/*(HZ / 2)*/
641#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2)
642
643#define CRC_LENGTH 4U
644
645#define MAX_WPA_IE_LEN 128
646#define MAX_WPS_IE_LEN 512
647
648#define NETWORK_EMPTY_ESSID (1<<0)
649#define NETWORK_HAS_OFDM (1<<1)
650#define NETWORK_HAS_CCK (1<<2)
651
652#define IEEE80211_DTIM_MBCAST 4
653#define IEEE80211_DTIM_UCAST 2
654#define IEEE80211_DTIM_VALID 1
655#define IEEE80211_DTIM_INVALID 0
656
657#define IEEE80211_PS_DISABLED 0
658#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST
659#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST
660#define IW_ESSID_MAX_SIZE 32
661/*
662 * join_res:
663 * -1: authentication fail
664 * -2: association fail
665 * > 0: TID
666 */
667
668enum ieee80211_state {
669 /* the card is not linked at all */
670 IEEE80211_NOLINK = 0,
671 /* IEEE80211_ASSOCIATING* are for BSS client mode
672 * the driver shall not perform RX filtering unless
673 * the state is LINKED.
674 * The driver shall just check for the state LINKED and
675 * defaults to NOLINK for ALL the other states (including
676 * LINKED_SCANNING)
677 */
678 /* the association procedure will start (wq scheduling)*/
679 IEEE80211_ASSOCIATING,
680 IEEE80211_ASSOCIATING_RETRY,
681 /* the association procedure is sending AUTH request*/
682 IEEE80211_ASSOCIATING_AUTHENTICATING,
683 /* the association procedure has successfully authentcated
684 * and is sending association request
685 */
686 IEEE80211_ASSOCIATING_AUTHENTICATED,
687 /* the link is ok. the card associated to a BSS or linked
688 * to a ibss cell or acting as an AP and creating the bss
689 */
690 IEEE80211_LINKED,
691 /* same as LINKED, but the driver shall apply RX filter
692 * rules as we are in NO_LINK mode. As the card is still
693 * logically linked, but it is doing a syncro site survey
694 * then it will be back to LINKED state.
695 */
696 IEEE80211_LINKED_SCANNING,
697};
698
699#define DEFAULT_MAX_SCAN_AGE (15 * HZ)
700#define DEFAULT_FTS 2346
701
702#define CFG_IEEE80211_RESERVE_FCS (1<<0)
703#define CFG_IEEE80211_COMPUTE_FCS (1<<1)
704
705#define MAXTID 16
706
707#define IEEE_A (1<<0)
708#define IEEE_B (1<<1)
709#define IEEE_G (1<<2)
710#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G)
711
712extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len)
713{
714 /* Single white space is for Linksys APs */
715 if (essid_len == 1 && essid[0] == ' ')
716 return 1;
717 /* Otherwise, if the entire essid is 0, we assume it is hidden */
718 while (essid_len) {
719 essid_len--;
720 if (essid[essid_len] != '\0')
721 return 0;
722 }
723 return 1;
724}
725
726extern inline int ieee80211_get_hdrlen(u16 fc)
727{
728 int hdrlen = 24;
729
730 switch (WLAN_FC_GET_TYPE(fc)) {
731 case IEEE80211_FTYPE_DATA:
732 if (fc & IEEE80211_QOS_DATAGRP)
733 hdrlen += 2;
734 if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
735 hdrlen += 6; /* Addr4 */
736 break;
737 case IEEE80211_FTYPE_CTL:
738 switch (WLAN_FC_GET_STYPE(fc)) {
739 case IEEE80211_STYPE_CTS:
740 case IEEE80211_STYPE_ACK:
741 hdrlen = 10;
742 break;
743 default:
744 hdrlen = 16;
745 break;
746 }
747 break;
748 }
749 return hdrlen;
750}
751
752struct registry_priv;
753
754u8 *r8712_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen);
755u8 *r8712_get_ie(u8*pbuf, sint index, sint *len, sint limit);
756unsigned char *r8712_get_wpa_ie(unsigned char *pie, int *rsn_ie_len, int limit);
757unsigned char *r8712_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit);
758int r8712_parse_wpa_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher,
759 int *pairwise_cipher);
760int r8712_parse_wpa2_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher,
761 int *pairwise_cipher);
762int r8712_get_sec_ie(u8 *in_ie, uint in_len, u8 *rsn_ie, u16 *rsn_len, u8 *wpa_ie,
763 u16 *wpa_len);
764int r8712_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen);
765int r8712_generate_ie(struct registry_priv *pregistrypriv, struct _adapter *padapter);
766uint r8712_is_cckrates_included(u8 *rate);
767uint r8712_is_cckratesonly_included(u8 *rate);
768
769#endif /* IEEE80211_H */
770
diff --git a/drivers/staging/rtl8712/if_ether.h b/drivers/staging/rtl8712/if_ether.h
new file mode 100644
index 00000000000..36a2ba5c86f
--- /dev/null
+++ b/drivers/staging/rtl8712/if_ether.h
@@ -0,0 +1,116 @@
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Global definitions for the Ethernet IEEE 802.3 interface.
7 *
8 * Version: @(#)if_ether.h 1.0.1a 02/08/94
9 *
10 * Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
11 * Donald Becker, <becker@super.org>
12 * Alan Cox, <alan@redhat.com>
13 * Steve Whitehouse, <gw7rrm@eeshack3.swan.ac.uk>
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version
18 * 2 of the License, or (at your option) any later version.
19 */
20
21#ifndef _LINUX_IF_ETHER_H
22#define _LINUX_IF_ETHER_H
23
24/*
25 * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble
26 * and FCS/CRC (frame check sequence).
27 */
28
29#define ETH_ALEN 6 /* Octets in one ethernet addr */
30#define ETH_HLEN 14 /* Total octets in header. */
31#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */
32#define ETH_DATA_LEN 1500 /* Max. octets in payload */
33#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */
34
35/*
36 * These are the defined Ethernet Protocol ID's.
37 */
38
39#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */
40#define ETH_P_PUP 0x0200 /* Xerox PUP packet */
41#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */
42#define ETH_P_IP 0x0800 /* Internet Protocol packet */
43#define ETH_P_X25 0x0805 /* CCITT X.25 */
44#define ETH_P_ARP 0x0806 /* Address Resolution packet */
45#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet
46 * [ NOT AN OFFICIAL ID ] */
47#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */
48#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr
49 * Trans packet */
50#define ETH_P_DEC 0x6000 /* DEC Assigned proto */
51#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */
52#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */
53#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */
54#define ETH_P_LAT 0x6004 /* DEC LAT */
55#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */
56#define ETH_P_CUST 0x6006 /* DEC Customer use */
57#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */
58#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */
59#define ETH_P_ATALK 0x809B /* Appletalk DDP */
60#define ETH_P_AARP 0x80F3 /* Appletalk AARP */
61#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */
62#define ETH_P_IPX 0x8137 /* IPX over DIX */
63#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */
64#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */
65#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */
66#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */
67#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport
68 * over Ethernet
69 */
70
71/*
72 * Non DIX types. Won't clash for 1500 types.
73 */
74
75#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */
76#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */
77#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */
78#define ETH_P_802_2 0x0004 /* 802.2 frames */
79#define ETH_P_SNAP 0x0005 /* Internal only */
80#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */
81#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/
82#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */
83#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */
84#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/
85#define ETH_P_TR_802_2 0x0011i /* 802.2 frames */
86#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */
87#define ETH_P_CONTROL 0x0016 /* Card specific control frames */
88#define ETH_P_IRDA 0x0017 /* Linux-IrDA */
89#define ETH_P_ECONET 0x0018 /* Acorn Econet */
90
91/*
92 * This is an Ethernet frame header.
93 */
94
95struct ethhdr {
96 unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
97 unsigned char h_source[ETH_ALEN]; /* source ether addr */
98 unsigned short h_proto; /* packet type ID field */
99};
100
101struct _vlan {
102 unsigned short h_vlan_TCI; /* Encapsulates priority and VLAN ID*/
103 unsigned short h_vlan_encapsulated_proto;
104};
105
106
107
108#define get_vlan_id(pvlan) ((ntohs((unsigned short)pvlan->h_vlan_TCI)) & 0xfff)
109#define get_vlan_priority(pvlan) ((ntohs((unsigned short)\
110 pvlan->h_vlan_TCI)) >> 13)
111#define get_vlan_encap_proto(pvlan) (ntohs((unsigned short)\
112 pvlan->h_vlan_encapsulated_proto))
113
114
115#endif /* _LINUX_IF_ETHER_H */
116
diff --git a/drivers/staging/rtl8712/ip.h b/drivers/staging/rtl8712/ip.h
new file mode 100644
index 00000000000..4785a591486
--- /dev/null
+++ b/drivers/staging/rtl8712/ip.h
@@ -0,0 +1,137 @@
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Definitions for the IP protocol.
7 *
8 * Version: @(#)ip.h 1.0.2 04/28/93
9 *
10 * Authors: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
16 */
17#ifndef _LINUX_IP_H
18#define _LINUX_IP_H
19
20#include "rtl871x_byteorder.h"
21
22/* SOL_IP socket options */
23
24#define IPTOS_TOS_MASK 0x1E
25#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK)
26#define IPTOS_LOWDELAY 0x10
27#define IPTOS_THROUGHPUT 0x08
28#define IPTOS_RELIABILITY 0x04
29#define IPTOS_MINCOST 0x02
30
31#define IPTOS_PREC_MASK 0xE0
32#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK)
33#define IPTOS_PREC_NETCONTROL 0xe0
34#define IPTOS_PREC_INTERNETCONTROL 0xc0
35#define IPTOS_PREC_CRITIC_ECP 0xa0
36#define IPTOS_PREC_FLASHOVERRIDE 0x80
37#define IPTOS_PREC_FLASH 0x60
38#define IPTOS_PREC_IMMEDIATE 0x40
39#define IPTOS_PREC_PRIORITY 0x20
40#define IPTOS_PREC_ROUTINE 0x00
41
42/* IP options */
43#define IPOPT_COPY 0x80
44#define IPOPT_CLASS_MASK 0x60
45#define IPOPT_NUMBER_MASK 0x1f
46
47#define IPOPT_COPIED(o) ((o)&IPOPT_COPY)
48#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK)
49#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK)
50
51#define IPOPT_CONTROL 0x00
52#define IPOPT_RESERVED1 0x20
53#define IPOPT_MEASUREMENT 0x40
54#define IPOPT_RESERVED2 0x60
55
56#define IPOPT_END (0 | IPOPT_CONTROL)
57#define IPOPT_NOOP (1 | IPOPT_CONTROL)
58#define IPOPT_SEC (2 | IPOPT_CONTROL|IPOPT_COPY)
59#define IPOPT_LSRR (3 | IPOPT_CONTROL|IPOPT_COPY)
60#define IPOPT_TIMESTAMP (4 | IPOPT_MEASUREMENT)
61#define IPOPT_RR (7 | IPOPT_CONTROL)
62#define IPOPT_SID (8 | IPOPT_CONTROL | IPOPT_COPY)
63#define IPOPT_SSRR (9 | IPOPT_CONTROL | IPOPT_COPY)
64#define IPOPT_RA (20 | IPOPT_CONTROL | IPOPT_COPY)
65
66#define IPVERSION 4
67#define MAXTTL 255
68#define IPDEFTTL 64
69
70/* struct timestamp, struct route and MAX_ROUTES are removed.
71 *
72 * REASONS: it is clear that nobody used them because:
73 * - MAX_ROUTES value was wrong.
74 * - "struct route" was wrong.
75 * - "struct timestamp" had fatally misaligned bitfields and was completely
76 * unusable.
77 */
78
79#define IPOPT_OPTVAL 0
80#define IPOPT_OLEN 1
81#define IPOPT_OFFSET 2
82#define IPOPT_MINOFF 4
83#define MAX_IPOPTLEN 40
84#define IPOPT_NOP IPOPT_NOOP
85#define IPOPT_EOL IPOPT_END
86#define IPOPT_TS IPOPT_TIMESTAMP
87
88#define IPOPT_TS_TSONLY 0 /* timestamps only */
89#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
90#define IPOPT_TS_PRESPEC 3 /* specified modules only */
91
92struct ip_options {
93 __u32 faddr; /* Saved first hop address */
94 unsigned char optlen;
95 unsigned char srr;
96 unsigned char rr;
97 unsigned char ts;
98 unsigned char is_setbyuser:1, /* Set by setsockopt? */
99 is_data:1, /* Options in __data, rather than skb */
100 is_strictroute:1, /* Strict source route */
101 srr_is_hit:1, /* Packet destination addr was our one */
102 is_changed:1, /* IP checksum more not valid */
103 rr_needaddr:1, /* Need to record addr of outgoing dev */
104 ts_needtime:1, /* Need to record timestamp */
105 ts_needaddr:1; /* Need to record addr of outgoing dev */
106 unsigned char router_alert;
107 unsigned char __pad1;
108 unsigned char __pad2;
109 unsigned char __data[0];
110};
111
112#define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
113
114struct iphdr {
115#if defined(__LITTLE_ENDIAN_BITFIELD)
116 __u8 ihl:4,
117 version:4;
118#elif defined(__BIG_ENDIAN_BITFIELD)
119 __u8 version:4,
120 ihl:4;
121#else
122#error "Please fix <asm/byteorder.h>"
123#endif
124 __u8 tos;
125 __u16 tot_len;
126 __u16 id;
127 __u16 frag_off;
128 __u8 ttl;
129 __u8 protocol;
130 __u16 check;
131 __u32 saddr;
132 __u32 daddr;
133 /*The options start here. */
134};
135
136#endif /* _LINUX_IP_H */
137
diff --git a/drivers/staging/rtl8712/little_endian.h b/drivers/staging/rtl8712/little_endian.h
new file mode 100644
index 00000000000..0248c143c6d
--- /dev/null
+++ b/drivers/staging/rtl8712/little_endian.h
@@ -0,0 +1,69 @@
1#ifndef _LINUX_BYTEORDER_LITTLE_ENDIAN_H
2#define _LINUX_BYTEORDER_LITTLE_ENDIAN_H
3
4#ifndef __LITTLE_ENDIAN
5#define __LITTLE_ENDIAN 1234
6#endif
7#ifndef __LITTLE_ENDIAN_BITFIELD
8#define __LITTLE_ENDIAN_BITFIELD
9#endif
10
11#include "swab.h"
12
13#define __constant_htonl(x) ___constant_swab32((x))
14#define __constant_ntohl(x) ___constant_swab32((x))
15#define __constant_htons(x) ___constant_swab16((x))
16#define __constant_ntohs(x) ___constant_swab16((x))
17#define __constant_cpu_to_le64(x) ((__u64)(x))
18#define __constant_le64_to_cpu(x) ((__u64)(x))
19#define __constant_cpu_to_le32(x) ((__u32)(x))
20#define __constant_le32_to_cpu(x) ((__u32)(x))
21#define __constant_cpu_to_le16(x) ((__u16)(x))
22#define __constant_le16_to_cpu(x) ((__u16)(x))
23#define __constant_cpu_to_be64(x) ___constant_swab64((x))
24#define __constant_be64_to_cpu(x) ___constant_swab64((x))
25#define __constant_cpu_to_be32(x) ___constant_swab32((x))
26#define __constant_be32_to_cpu(x) ___constant_swab32((x))
27#define __constant_cpu_to_be16(x) ___constant_swab16((x))
28#define __constant_be16_to_cpu(x) ___constant_swab16((x))
29#define __cpu_to_le64(x) ((__u64)(x))
30#define __le64_to_cpu(x) ((__u64)(x))
31#define __cpu_to_le32(x) ((__u32)(x))
32#define __le32_to_cpu(x) ((__u32)(x))
33#define __cpu_to_le16(x) ((__u16)(x))
34#define __le16_to_cpu(x) ((__u16)(x))
35#define __cpu_to_be64(x) __swab64((x))
36#define __be64_to_cpu(x) __swab64((x))
37#define __cpu_to_be32(x) __swab32((x))
38#define __be32_to_cpu(x) __swab32((x))
39#define __cpu_to_be16(x) __swab16((x))
40#define __be16_to_cpu(x) __swab16((x))
41#define __cpu_to_le64p(x) (*(__u64 *)(x))
42#define __le64_to_cpup(x) (*(__u64 *)(x))
43#define __cpu_to_le32p(x) (*(__u32 *)(x))
44#define __le32_to_cpup(x) (*(__u32 *)(x))
45#define __cpu_to_le16p(x) (*(__u16 *)(x))
46#define __le16_to_cpup(x) (*(__u16 *)(x))
47#define __cpu_to_be64p(x) __swab64p((x))
48#define __be64_to_cpup(x) __swab64p((x))
49#define __cpu_to_be32p(x) __swab32p((x))
50#define __be32_to_cpup(x) __swab32p((x))
51#define __cpu_to_be16p(x) __swab16p((x))
52#define __be16_to_cpup(x) __swab16p((x))
53#define __cpu_to_le64s(x) do {} while (0)
54#define __le64_to_cpus(x) do {} while (0)
55#define __cpu_to_le32s(x) do {} while (0)
56#define __le32_to_cpus(x) do {} while (0)
57#define __cpu_to_le16s(x) do {} while (0)
58#define __le16_to_cpus(x) do {} while (0)
59#define __cpu_to_be64s(x) __swab64s((x))
60#define __be64_to_cpus(x) __swab64s((x))
61#define __cpu_to_be32s(x) __swab32s((x))
62#define __be32_to_cpus(x) __swab32s((x))
63#define __cpu_to_be16s(x) __swab16s((x))
64#define __be16_to_cpus(x) __swab16s((x))
65
66#include "generic.h"
67
68#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */
69
diff --git a/drivers/staging/rtl8712/mlme_linux.c b/drivers/staging/rtl8712/mlme_linux.c
new file mode 100644
index 00000000000..abf96c14df9
--- /dev/null
+++ b/drivers/staging/rtl8712/mlme_linux.c
@@ -0,0 +1,170 @@
1/******************************************************************************
2 * mlme_linux.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _MLME_OSDEP_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "mlme_osdep.h"
34
35static void sitesurvey_ctrl_handler(void *FunctionContext)
36{
37 struct _adapter *adapter = (struct _adapter *)FunctionContext;
38
39 _r8712_sitesurvey_ctrl_handler(adapter);
40 _set_timer(&adapter->mlmepriv.sitesurveyctrl.sitesurvey_ctrl_timer,
41 3000);
42}
43
44static void join_timeout_handler (void *FunctionContext)
45{
46 struct _adapter *adapter = (struct _adapter *)FunctionContext;
47 _r8712_join_timeout_handler(adapter);
48}
49
50static void _scan_timeout_handler (void *FunctionContext)
51{
52 struct _adapter *adapter = (struct _adapter *)FunctionContext;
53 r8712_scan_timeout_handler(adapter);
54}
55
56static void dhcp_timeout_handler (void *FunctionContext)
57{
58 struct _adapter *adapter = (struct _adapter *)FunctionContext;
59 _r8712_dhcp_timeout_handler(adapter);
60}
61
62static void wdg_timeout_handler (void *FunctionContext)
63{
64 struct _adapter *adapter = (struct _adapter *)FunctionContext;
65
66 _r8712_wdg_timeout_handler(adapter);
67
68 _set_timer(&adapter->mlmepriv.wdg_timer, 2000);
69}
70
71void r8712_init_mlme_timer(struct _adapter *padapter)
72{
73 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
74
75 _init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev,
76 join_timeout_handler, (pmlmepriv->nic_hdl));
77 _init_timer(&(pmlmepriv->sitesurveyctrl.sitesurvey_ctrl_timer),
78 padapter->pnetdev, sitesurvey_ctrl_handler,
79 (u8 *)(pmlmepriv->nic_hdl));
80 _init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev,
81 _scan_timeout_handler, (pmlmepriv->nic_hdl));
82 _init_timer(&(pmlmepriv->dhcp_timer), padapter->pnetdev,
83 dhcp_timeout_handler, (u8 *)(pmlmepriv->nic_hdl));
84 _init_timer(&(pmlmepriv->wdg_timer), padapter->pnetdev,
85 wdg_timeout_handler, (u8 *)(pmlmepriv->nic_hdl));
86}
87
88void r8712_os_indicate_connect(struct _adapter *adapter)
89{
90 r8712_indicate_wx_assoc_event(adapter);
91 netif_carrier_on(adapter->pnetdev);
92}
93
94static struct RT_PMKID_LIST backupPMKIDList[NUM_PMKID_CACHE];
95void r8712_os_indicate_disconnect(struct _adapter *adapter)
96{
97 u8 backupPMKIDIndex = 0;
98 u8 backupTKIPCountermeasure = 0x00;
99
100 r8712_indicate_wx_disassoc_event(adapter);
101 netif_carrier_off(adapter->pnetdev);
102 if (adapter->securitypriv.AuthAlgrthm == 2) { /*/802.1x*/
103 /* We have to backup the PMK information for WiFi PMK Caching
104 * test item. Backup the btkip_countermeasure information.
105 * When the countermeasure is trigger, the driver have to
106 * disconnect with AP for 60 seconds.
107 */
108
109 memset(&backupPMKIDList[0], 0x00, sizeof(
110 struct RT_PMKID_LIST) * NUM_PMKID_CACHE);
111 memcpy(&backupPMKIDList[0], &adapter->securitypriv.
112 PMKIDList[0], sizeof(struct RT_PMKID_LIST) *
113 NUM_PMKID_CACHE);
114 backupPMKIDIndex = adapter->securitypriv.PMKIDIndex;
115 backupTKIPCountermeasure = adapter->securitypriv.
116 btkip_countermeasure;
117 memset((unsigned char *)&adapter->securitypriv, 0,
118 sizeof(struct security_priv));
119 _init_timer(&(adapter->securitypriv.tkip_timer),
120 adapter->pnetdev, r8712_use_tkipkey_handler,
121 adapter);
122 /* Restore the PMK information to securitypriv structure
123 * for the following connection. */
124 memcpy(&adapter->securitypriv.PMKIDList[0],
125 &backupPMKIDList[0],
126 sizeof(struct RT_PMKID_LIST) * NUM_PMKID_CACHE);
127 adapter->securitypriv.PMKIDIndex = backupPMKIDIndex;
128 adapter->securitypriv.btkip_countermeasure =
129 backupTKIPCountermeasure;
130 } else { /*reset values in securitypriv*/
131 struct security_priv *psec_priv = &adapter->securitypriv;
132
133 psec_priv->AuthAlgrthm = 0; /*open system*/
134 psec_priv->PrivacyAlgrthm = _NO_PRIVACY_;
135 psec_priv->PrivacyKeyIndex = 0;
136 psec_priv->XGrpPrivacy = _NO_PRIVACY_;
137 psec_priv->XGrpKeyid = 1;
138 psec_priv->ndisauthtype = Ndis802_11AuthModeOpen;
139 psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled;
140 psec_priv->wps_phase = false;
141 }
142}
143
144void r8712_report_sec_ie(struct _adapter *adapter, u8 authmode, u8 *sec_ie)
145{
146 uint len;
147 u8 *buff, *p, i;
148 union iwreq_data wrqu;
149
150 buff = NULL;
151 if (authmode == _WPA_IE_ID_) {
152 buff = _malloc(IW_CUSTOM_MAX);
153 if (buff == NULL)
154 return;
155 memset(buff, 0, IW_CUSTOM_MAX);
156 p = buff;
157 p += sprintf(p, "ASSOCINFO(ReqIEs=");
158 len = sec_ie[1] + 2;
159 len = (len < IW_CUSTOM_MAX) ? len : IW_CUSTOM_MAX;
160 for (i = 0; i < len; i++)
161 p += sprintf(p, "%02x", sec_ie[i]);
162 p += sprintf(p, ")");
163 memset(&wrqu, 0, sizeof(wrqu));
164 wrqu.data.length = p-buff;
165 wrqu.data.length = (wrqu.data.length < IW_CUSTOM_MAX) ?
166 wrqu.data.length : IW_CUSTOM_MAX;
167 wireless_send_event(adapter->pnetdev, IWEVCUSTOM, &wrqu, buff);
168 kfree(buff);
169 }
170}
diff --git a/drivers/staging/rtl8712/mlme_osdep.h b/drivers/staging/rtl8712/mlme_osdep.h
new file mode 100644
index 00000000000..7013a498080
--- /dev/null
+++ b/drivers/staging/rtl8712/mlme_osdep.h
@@ -0,0 +1,18 @@
1#ifndef __MLME_OSDEP_H_
2#define __MLME_OSDEP_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7void r8712_init_mlme_timer(struct _adapter *padapter);
8void r8712_os_indicate_disconnect(struct _adapter *adapter);
9void r8712_os_indicate_connect(struct _adapter *adapter);
10void r8712_report_sec_ie(struct _adapter *adapter, u8 authmode, u8 *sec_ie);
11int r8712_recv_indicatepkts_in_order(struct _adapter *adapter,
12 struct recv_reorder_ctrl *precvreorder_ctrl,
13 int bforced);
14void r8712_indicate_wx_assoc_event(struct _adapter *padapter);
15void r8712_indicate_wx_disassoc_event(struct _adapter *padapter);
16
17#endif /*_MLME_OSDEP_H_*/
18
diff --git a/drivers/staging/rtl8712/mp_custom_oid.h b/drivers/staging/rtl8712/mp_custom_oid.h
new file mode 100644
index 00000000000..a9e0b3483e3
--- /dev/null
+++ b/drivers/staging/rtl8712/mp_custom_oid.h
@@ -0,0 +1,274 @@
1#ifndef __CUSTOM_OID_H
2#define __CUSTOM_OID_H
3
4/* 0xFF818000 - 0xFF81802F RTL8180 Mass Production Kit
5 * 0xFF818500 - 0xFF81850F RTL8185 Setup Utility
6 * 0xFF818580 - 0xFF81858F RTL8185 Phy Status Utility
7 *
8 * by Owen for Production Kit
9 * For Production Kit with Agilent Equipments
10 * in order to make our custom oids hopefully somewhat unique
11 * we will use 0xFF (indicating implementation specific OID)
12 * 81(first byte of non zero Realtek unique identifier)
13 * 80 (second byte of non zero Realtek unique identifier)
14 * XX (the custom OID number - providing 255 possible custom oids)
15 */
16#define OID_RT_PRO_RESET_DUT 0xFF818000
17#define OID_RT_PRO_SET_DATA_RATE 0xFF818001
18#define OID_RT_PRO_START_TEST 0xFF818002
19#define OID_RT_PRO_STOP_TEST 0xFF818003
20#define OID_RT_PRO_SET_PREAMBLE 0xFF818004
21#define OID_RT_PRO_SET_SCRAMBLER 0xFF818005
22#define OID_RT_PRO_SET_FILTER_BB 0xFF818006
23#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB 0xFF818007
24#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL 0xFF818008
25#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL 0xFF818009
26#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL 0xFF81800A
27
28#define OID_RT_PRO_SET_TX_ANTENNA_BB 0xFF81800D
29#define OID_RT_PRO_SET_ANTENNA_BB 0xFF81800E
30#define OID_RT_PRO_SET_CR_SCRAMBLER 0xFF81800F
31#define OID_RT_PRO_SET_CR_NEW_FILTER 0xFF818010
32#define OID_RT_PRO_SET_TX_POWER_CONTROL 0xFF818011
33#define OID_RT_PRO_SET_CR_TX_CONFIG 0xFF818012
34#define OID_RT_PRO_GET_TX_POWER_CONTROL 0xFF818013
35#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY 0xFF818014
36#define OID_RT_PRO_SET_CR_SETPOINT 0xFF818015
37#define OID_RT_PRO_SET_INTEGRATOR 0xFF818016
38#define OID_RT_PRO_SET_SIGNAL_QUALITY 0xFF818017
39#define OID_RT_PRO_GET_INTEGRATOR 0xFF818018
40#define OID_RT_PRO_GET_SIGNAL_QUALITY 0xFF818019
41#define OID_RT_PRO_QUERY_EEPROM_TYPE 0xFF81801A
42#define OID_RT_PRO_WRITE_MAC_ADDRESS 0xFF81801B
43#define OID_RT_PRO_READ_MAC_ADDRESS 0xFF81801C
44#define OID_RT_PRO_WRITE_CIS_DATA 0xFF81801D
45#define OID_RT_PRO_READ_CIS_DATA 0xFF81801E
46#define OID_RT_PRO_WRITE_POWER_CONTROL 0xFF81801F
47#define OID_RT_PRO_READ_POWER_CONTROL 0xFF818020
48#define OID_RT_PRO_WRITE_EEPROM 0xFF818021
49#define OID_RT_PRO_READ_EEPROM 0xFF818022
50#define OID_RT_PRO_RESET_TX_PACKET_SENT 0xFF818023
51#define OID_RT_PRO_QUERY_TX_PACKET_SENT 0xFF818024
52#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED 0xFF818025
53#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED 0xFF818026
54#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR 0xFF818027
55#define OID_RT_PRO_QUERY_CURRENT_ADDRESS 0xFF818028
56#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS 0xFF818029
57#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS 0xFF81802A
58#define OID_RT_PRO_RECEIVE_PACKET 0xFF81802C
59#define OID_RT_PRO_WRITE_EEPROM_BYTE 0xFF81802D
60#define OID_RT_PRO_READ_EEPROM_BYTE 0xFF81802E
61#define OID_RT_PRO_SET_MODULATION 0xFF81802F
62#define OID_RT_DRIVER_OPTION 0xFF818080
63#define OID_RT_RF_OFF 0xFF818081
64#define OID_RT_AUTH_STATUS 0xFF818082
65#define OID_RT_PRO_SET_CONTINUOUS_TX 0xFF81800B
66#define OID_RT_PRO_SET_SINGLE_CARRIER_TX 0xFF81800C
67#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX 0xFF81802B
68#define OID_RT_PRO_SET_SINGLE_TONE_TX 0xFF818043
69#define OID_RT_UTILITY_FALSE_ALARM_COUNTERS 0xFF818580
70#define OID_RT_UTILITY_SELECT_DEBUG_MODE 0xFF818581
71#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER 0xFF818582
72#define OID_RT_UTILITY_GET_RSSI_STATUS 0xFF818583
73#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS 0xFF818584
74#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS \
75 0xFF818585
76#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS 0xFF818586
77#define OID_RT_WIRELESS_MODE 0xFF818500
78#define OID_RT_SUPPORTED_RATES 0xFF818501
79#define OID_RT_DESIRED_RATES 0xFF818502
80#define OID_RT_WIRELESS_MODE_STARTING_ADHOC 0xFF818503
81#define OID_RT_GET_CONNECT_STATE 0xFF030001
82#define OID_RT_RESCAN 0xFF030002
83#define OID_RT_SET_KEY_LENGTH 0xFF030003
84#define OID_RT_SET_DEFAULT_KEY_ID 0xFF030004
85#define OID_RT_SET_CHANNEL 0xFF010182
86#define OID_RT_SET_SNIFFER_MODE 0xFF010183
87#define OID_RT_GET_SIGNAL_QUALITY 0xFF010184
88#define OID_RT_GET_SMALL_PACKET_CRC 0xFF010185
89#define OID_RT_GET_MIDDLE_PACKET_CRC 0xFF010186
90#define OID_RT_GET_LARGE_PACKET_CRC 0xFF010187
91#define OID_RT_GET_TX_RETRY 0xFF010188
92#define OID_RT_GET_RX_RETRY 0xFF010189
93#define OID_RT_PRO_SET_FW_DIG_STATE 0xFF01018A
94#define OID_RT_PRO_SET_FW_RA_STATE 0xFF01018B
95#define OID_RT_GET_RX_TOTAL_PACKET 0xFF010190
96#define OID_RT_GET_TX_BEACON_OK 0xFF010191
97#define OID_RT_GET_TX_BEACON_ERR 0xFF010192
98#define OID_RT_GET_RX_ICV_ERR 0xFF010193
99#define OID_RT_SET_ENCRYPTION_ALGORITHM 0xFF010194
100#define OID_RT_SET_NO_AUTO_RESCAN 0xFF010195
101#define OID_RT_GET_PREAMBLE_MODE 0xFF010196
102#define OID_RT_GET_DRIVER_UP_DELTA_TIME 0xFF010197
103#define OID_RT_GET_AP_IP 0xFF010198
104#define OID_RT_GET_CHANNELPLAN 0xFF010199
105#define OID_RT_SET_PREAMBLE_MODE 0xFF01019A
106#define OID_RT_SET_BCN_INTVL 0xFF01019B
107#define OID_RT_GET_RF_VENDER 0xFF01019C
108#define OID_RT_DEDICATE_PROBE 0xFF01019D
109#define OID_RT_PRO_RX_FILTER_PATTERN 0xFF01019E
110#define OID_RT_GET_DCST_CURRENT_THRESHOLD 0xFF01019F
111#define OID_RT_GET_CCA_ERR 0xFF0101A0
112#define OID_RT_GET_CCA_UPGRADE_THRESHOLD 0xFF0101A1
113#define OID_RT_GET_CCA_FALLBACK_THRESHOLD 0xFF0101A2
114#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES 0xFF0101A3
115#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES 0xFF0101A4
116#define OID_RT_SET_RATE_ADAPTIVE 0xFF0101A5
117#define OID_RT_GET_DCST_EVALUATE_PERIOD 0xFF0101A5
118#define OID_RT_GET_DCST_TIME_UNIT_INDEX 0xFF0101A6
119#define OID_RT_GET_TOTAL_TX_BYTES 0xFF0101A7
120#define OID_RT_GET_TOTAL_RX_BYTES 0xFF0101A8
121#define OID_RT_CURRENT_TX_POWER_LEVEL 0xFF0101A9
122#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT 0xFF0101AA
123#define OID_RT_GET_ENC_KEY_MATCH_COUNT 0xFF0101AB
124#define OID_RT_GET_CHANNEL 0xFF0101AC
125#define OID_RT_SET_CHANNELPLAN 0xFF0101AD
126#define OID_RT_GET_HARDWARE_RADIO_OFF 0xFF0101AE
127#define OID_RT_CHANNELPLAN_BY_COUNTRY 0xFF0101AF
128#define OID_RT_SCAN_AVAILABLE_BSSID 0xFF0101B0
129#define OID_RT_GET_HARDWARE_VERSION 0xFF0101B1
130#define OID_RT_GET_IS_ROAMING 0xFF0101B2
131#define OID_RT_GET_IS_PRIVACY 0xFF0101B3
132#define OID_RT_GET_KEY_MISMATCH 0xFF0101B4
133#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH 0xFF0101B5
134#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH 0xFF0101B6
135#define OID_RT_RESET_LOG 0xFF0101B7
136#define OID_RT_GET_LOG 0xFF0101B8
137#define OID_RT_SET_INDICATE_HIDDEN_AP 0xFF0101B9
138#define OID_RT_GET_HEADER_FAIL 0xFF0101BA
139#define OID_RT_SUPPORTED_WIRELESS_MODE 0xFF0101BB
140#define OID_RT_GET_CHANNEL_LIST 0xFF0101BC
141#define OID_RT_GET_SCAN_IN_PROGRESS 0xFF0101BD
142#define OID_RT_GET_TX_INFO 0xFF0101BE
143#define OID_RT_RF_READ_WRITE_OFFSET 0xFF0101BF
144#define OID_RT_RF_READ_WRITE 0xFF0101C0
145#define OID_RT_FORCED_DATA_RATE 0xFF0101C1
146#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST 0xFF0101C2
147#define OID_RT_GET_BSS_WIRELESS_MODE 0xFF0101C3
148#define OID_RT_SCAN_WITH_MAGIC_PACKET 0xFF0101C4
149#define OID_RT_PRO_RX_FILTER 0xFF0111C0
150#define OID_CE_USB_WRITE_REGISTRY 0xFF0111C1
151#define OID_CE_USB_READ_REGISTRY 0xFF0111C2
152#define OID_RT_PRO_SET_INITIAL_GAIN 0xFF0111C3
153#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE 0xFF0111C4
154#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE 0xFF0111C5
155#define OID_RT_PRO_SET_TX_CHARGE_PUMP 0xFF0111C6
156#define OID_RT_PRO_SET_RX_CHARGE_PUMP 0xFF0111C7
157#define OID_RT_PRO_RF_WRITE_REGISTRY 0xFF0111C8
158#define OID_RT_PRO_RF_READ_REGISTRY 0xFF0111C9
159#define OID_RT_PRO_QUERY_RF_TYPE 0xFF0111CA
160#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST 0xFF010300
161#define OID_RT_AP_GET_CURRENT_TIME_STAMP 0xFF010301
162#define OID_RT_AP_SWITCH_INTO_AP_MODE 0xFF010302
163#define OID_RT_AP_SET_DTIM_PERIOD 0xFF010303
164#define OID_RT_AP_SUPPORTED 0xFF010304
165#define OID_RT_AP_SET_PASSPHRASE 0xFF010305
166#define OID_RT_PRO8187_WI_POLL 0xFF818780
167#define OID_RT_PRO_WRITE_BB_REG 0xFF818781
168#define OID_RT_PRO_READ_BB_REG 0xFF818782
169#define OID_RT_PRO_WRITE_RF_REG 0xFF818783
170#define OID_RT_PRO_READ_RF_REG 0xFF818784
171#define OID_RT_MH_VENDER_ID 0xFFEDC100
172#define OID_RT_PRO8711_JOIN_BSS 0xFF871100
173#define OID_RT_PRO_READ_REGISTER 0xFF871101
174#define OID_RT_PRO_WRITE_REGISTER 0xFF871102
175#define OID_RT_PRO_BURST_READ_REGISTER 0xFF871103
176#define OID_RT_PRO_BURST_WRITE_REGISTER 0xFF871104
177#define OID_RT_PRO_WRITE_TXCMD 0xFF871105
178#define OID_RT_PRO_READ16_EEPROM 0xFF871106
179#define OID_RT_PRO_WRITE16_EEPROM 0xFF871107
180#define OID_RT_PRO_H2C_SET_COMMAND 0xFF871108
181#define OID_RT_PRO_H2C_QUERY_RESULT 0xFF871109
182#define OID_RT_PRO8711_WI_POLL 0xFF87110A
183#define OID_RT_PRO8711_PKT_LOSS 0xFF87110B
184#define OID_RT_RD_ATTRIB_MEM 0xFF87110C
185#define OID_RT_WR_ATTRIB_MEM 0xFF87110D
186/*Method 2 for H2C/C2H*/
187#define OID_RT_PRO_H2C_CMD_MODE 0xFF871110
188#define OID_RT_PRO_H2C_CMD_RSP_MODE 0xFF871111
189#define OID_RT_PRO_H2C_CMD_EVENT_MODE 0xFF871112
190#define OID_RT_PRO_WAIT_C2H_EVENT 0xFF871113
191#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST 0xFF871114
192#define OID_RT_PRO_SCSI_ACCESS_TEST 0xFF871115
193#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT 0xFF871116
194#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN 0xFF871117
195#define OID_RT_RRO_RX_PKT_VIA_IOCTRL 0xFF871118
196#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL 0xFF871119
197#define OID_RT_RPO_SET_PWRMGT_TEST 0xFF87111A
198#define OID_RT_PRO_QRY_PWRMGT_TEST 0XFF87111B
199#define OID_RT_RPO_ASYNC_RWIO_TEST 0xFF87111C
200#define OID_RT_RPO_ASYNC_RWIO_POLL 0xFF87111D
201#define OID_RT_PRO_SET_RF_INTFS 0xFF87111E
202#define OID_RT_POLL_RX_STATUS 0xFF87111F
203#define OID_RT_PRO_CFG_DEBUG_MESSAGE 0xFF871120
204#define OID_RT_PRO_SET_DATA_RATE_EX 0xFF871121
205#define OID_RT_PRO_SET_BASIC_RATE 0xFF871122
206#define OID_RT_PRO_READ_TSSI 0xFF871123
207#define OID_RT_PRO_SET_POWER_TRACKING 0xFF871124
208#define OID_RT_PRO_QRY_PWRSTATE 0xFF871150
209#define OID_RT_PRO_SET_PWRSTATE 0xFF871151
210/*Method 2 , using workitem */
211#define OID_RT_SET_READ_REG 0xFF871181
212#define OID_RT_SET_WRITE_REG 0xFF871182
213#define OID_RT_SET_BURST_READ_REG 0xFF871183
214#define OID_RT_SET_BURST_WRITE_REG 0xFF871184
215#define OID_RT_SET_WRITE_TXCMD 0xFF871185
216#define OID_RT_SET_READ16_EEPROM 0xFF871186
217#define OID_RT_SET_WRITE16_EEPROM 0xFF871187
218#define OID_RT_QRY_POLL_WKITEM 0xFF871188
219
220/*For SDIO INTERFACE only*/
221#define OID_RT_PRO_SYNCPAGERW_SRAM 0xFF8711A0
222#define OID_RT_PRO_871X_DRV_EXT 0xFF8711A1
223
224/*For USB INTERFACE only*/
225#define OID_RT_PRO_USB_VENDOR_REQ 0xFF8711B0
226#define OID_RT_PRO_SCSI_AUTO_TEST 0xFF8711B1
227#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE 0xFF8711B2
228#define OID_RT_PRO_USB_MAC_RX_FIFO_READ 0xFF8711B3
229#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING 0xFF8711B4
230
231#define OID_RT_PRO_H2C_SET_RATE_TABLE 0xFF8711FB
232#define OID_RT_PRO_H2C_GET_RATE_TABLE 0xFF8711FC
233#define OID_RT_PRO_H2C_C2H_LBK_TEST 0xFF8711FE
234
235#define OID_RT_PRO_ENCRYPTION_CTRL 0xFF871200
236#define OID_RT_PRO_ADD_STA_INFO 0xFF871201
237#define OID_RT_PRO_DELE_STA_INFO 0xFF871202
238#define OID_RT_PRO_QUERY_DR_VARIABLE 0xFF871203
239
240#define OID_RT_PRO_RX_PACKET_TYPE 0xFF871204
241
242#define OID_RT_PRO_READ_EFUSE 0xFF871205
243#define OID_RT_PRO_WRITE_EFUSE 0xFF871206
244#define OID_RT_PRO_RW_EFUSE_PGPKT 0xFF871207
245#define OID_RT_GET_EFUSE_CURRENT_SIZE 0xFF871208
246
247#define OID_RT_SET_BANDWIDTH 0xFF871209
248#define OID_RT_SET_CRYSTAL_CAP 0xFF87120A
249
250#define OID_RT_SET_RX_PACKET_TYPE 0xFF87120B
251
252#define OID_RT_GET_EFUSE_MAX_SIZE 0xFF87120C
253
254#define OID_RT_PRO_SET_TX_AGC_OFFSET 0xFF87120D
255
256#define OID_RT_PRO_SET_PKT_TEST_MODE 0xFF87120E
257
258#define OID_RT_PRO_FOR_EVM_TEST_SETTING 0xFF87120F
259
260#define OID_RT_PRO_GET_THERMAL_METER 0xFF871210
261
262#define OID_RT_RESET_PHY_RX_PACKET_COUNT 0xFF871211
263#define OID_RT_GET_PHY_RX_PACKET_RECEIVED 0xFF871212
264#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR 0xFF871213
265
266#define OID_RT_SET_POWER_DOWN 0xFF871214
267
268#define OID_RT_GET_POWER_MODE 0xFF871215
269
270#define OID_RT_PRO_EFUSE 0xFF871216
271#define OID_RT_PRO_EFUSE_MAP 0xFF871217
272
273#endif /*#ifndef __CUSTOM_OID_H */
274
diff --git a/drivers/staging/rtl8712/os_intfs.c b/drivers/staging/rtl8712/os_intfs.c
new file mode 100644
index 00000000000..aaf7de01544
--- /dev/null
+++ b/drivers/staging/rtl8712/os_intfs.c
@@ -0,0 +1,458 @@
1/******************************************************************************
2 * os_intfs.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _OS_INTFS_C_
30
31#include <linux/module.h>
32#include <linux/init.h>
33#include <linux/kthread.h>
34#include "osdep_service.h"
35#include "drv_types.h"
36#include "xmit_osdep.h"
37#include "recv_osdep.h"
38#include "rtl871x_ioctl.h"
39#include "usb_osintf.h"
40
41MODULE_LICENSE("GPL");
42MODULE_DESCRIPTION("rtl871x wireless lan driver");
43MODULE_AUTHOR("Larry Finger");
44
45static char ifname[IFNAMSIZ] = "wlan%d";
46
47/* module param defaults */
48static int chip_version = RTL8712_2ndCUT;
49static int rfintfs = HWPI;
50static int lbkmode = RTL8712_AIR_TRX;
51static int hci = RTL8712_USB;
52static int ampdu_enable = 1;/*for enable tx_ampdu*/
53
54/* The video_mode variable is for vedio mode.*/
55/* It may be specify when inserting module with video_mode=1 parameter.*/
56static int video_mode = 1; /* enable video mode*/
57
58/*Ndis802_11Infrastructure; infra, ad-hoc, auto*/
59static int network_mode = Ndis802_11IBSS;
60static int channel = 1;/*ad-hoc support requirement*/
61static int wireless_mode = WIRELESS_11BG;
62static int vrtl_carrier_sense = AUTO_VCS;
63static int vcs_type = RTS_CTS;
64static int frag_thresh = 2346;
65static int preamble = PREAMBLE_LONG;/*long, short, auto*/
66static int scan_mode = 1;/*active, passive*/
67static int adhoc_tx_pwr = 1;
68static int soft_ap;
69static int smart_ps = 1;
70static int power_mgnt = PS_MODE_ACTIVE;
71static int radio_enable = 1;
72static int long_retry_lmt = 7;
73static int short_retry_lmt = 7;
74static int busy_thresh = 40;
75static int ack_policy = NORMAL_ACK;
76static int mp_mode;
77static int software_encrypt;
78static int software_decrypt;
79
80static int wmm_enable;/* default is set to disable the wmm.*/
81static int uapsd_enable;
82static int uapsd_max_sp = NO_LIMIT;
83static int uapsd_acbk_en;
84static int uapsd_acbe_en;
85static int uapsd_acvi_en;
86static int uapsd_acvo_en;
87
88static int ht_enable = 1;
89static int cbw40_enable = 1;
90static int rf_config = RTL8712_RF_1T2R; /* 1T2R*/
91static int low_power;
92/* mac address to use instead of the one stored in Efuse */
93char *r8712_initmac;
94static char *initmac;
95
96module_param_string(ifname, ifname, sizeof(ifname), S_IRUGO|S_IWUSR);
97module_param(initmac, charp, 0644);
98module_param(video_mode, int, 0644);
99module_param(chip_version, int, 0644);
100module_param(rfintfs, int, 0644);
101module_param(lbkmode, int, 0644);
102module_param(hci, int, 0644);
103module_param(network_mode, int, 0644);
104module_param(channel, int, 0644);
105module_param(mp_mode, int, 0644);
106module_param(wmm_enable, int, 0644);
107module_param(vrtl_carrier_sense, int, 0644);
108module_param(vcs_type, int, 0644);
109module_param(busy_thresh, int, 0644);
110module_param(ht_enable, int, 0644);
111module_param(cbw40_enable, int, 0644);
112module_param(ampdu_enable, int, 0644);
113module_param(rf_config, int, 0644);
114module_param(power_mgnt, int, 0644);
115module_param(low_power, int, 0644);
116
117MODULE_PARM_DESC(ifname, " Net interface name, wlan%d=default");
118MODULE_PARM_DESC(initmac, "MAC-Address, default: use FUSE");
119
120static uint loadparam(struct _adapter *padapter, struct net_device *pnetdev);
121static int netdev_open(struct net_device *pnetdev);
122static int netdev_close(struct net_device *pnetdev);
123
124static uint loadparam(struct _adapter *padapter, struct net_device *pnetdev)
125{
126 uint status = _SUCCESS;
127 struct registry_priv *registry_par = &padapter->registrypriv;
128
129 registry_par->chip_version = (u8)chip_version;
130 registry_par->rfintfs = (u8)rfintfs;
131 registry_par->lbkmode = (u8)lbkmode;
132 registry_par->hci = (u8)hci;
133 registry_par->network_mode = (u8)network_mode;
134 memcpy(registry_par->ssid.Ssid, "ANY", 3);
135 registry_par->ssid.SsidLength = 3;
136 registry_par->channel = (u8)channel;
137 registry_par->wireless_mode = (u8)wireless_mode;
138 registry_par->vrtl_carrier_sense = (u8)vrtl_carrier_sense ;
139 registry_par->vcs_type = (u8)vcs_type;
140 registry_par->frag_thresh = (u16)frag_thresh;
141 registry_par->preamble = (u8)preamble;
142 registry_par->scan_mode = (u8)scan_mode;
143 registry_par->adhoc_tx_pwr = (u8)adhoc_tx_pwr;
144 registry_par->soft_ap = (u8)soft_ap;
145 registry_par->smart_ps = (u8)smart_ps;
146 registry_par->power_mgnt = (u8)power_mgnt;
147 registry_par->radio_enable = (u8)radio_enable;
148 registry_par->long_retry_lmt = (u8)long_retry_lmt;
149 registry_par->short_retry_lmt = (u8)short_retry_lmt;
150 registry_par->busy_thresh = (u16)busy_thresh;
151 registry_par->ack_policy = (u8)ack_policy;
152 registry_par->mp_mode = (u8)mp_mode;
153 registry_par->software_encrypt = (u8)software_encrypt;
154 registry_par->software_decrypt = (u8)software_decrypt;
155 /*UAPSD*/
156 registry_par->wmm_enable = (u8)wmm_enable;
157 registry_par->uapsd_enable = (u8)uapsd_enable;
158 registry_par->uapsd_max_sp = (u8)uapsd_max_sp;
159 registry_par->uapsd_acbk_en = (u8)uapsd_acbk_en;
160 registry_par->uapsd_acbe_en = (u8)uapsd_acbe_en;
161 registry_par->uapsd_acvi_en = (u8)uapsd_acvi_en;
162 registry_par->uapsd_acvo_en = (u8)uapsd_acvo_en;
163 registry_par->ht_enable = (u8)ht_enable;
164 registry_par->cbw40_enable = (u8)cbw40_enable;
165 registry_par->ampdu_enable = (u8)ampdu_enable;
166 registry_par->rf_config = (u8)rf_config;
167 registry_par->low_power = (u8)low_power;
168 r8712_initmac = initmac;
169 return status;
170}
171
172static int r871x_net_set_mac_address(struct net_device *pnetdev, void *p)
173{
174 struct _adapter *padapter = (struct _adapter *)_netdev_priv(pnetdev);
175 struct sockaddr *addr = p;
176
177 if (padapter->bup == false)
178 memcpy(pnetdev->dev_addr, addr->sa_data, ETH_ALEN);
179 return 0;
180}
181
182static struct net_device_stats *r871x_net_get_stats(struct net_device *pnetdev)
183{
184 struct _adapter *padapter = (struct _adapter *) _netdev_priv(pnetdev);
185 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
186 struct recv_priv *precvpriv = &(padapter->recvpriv);
187
188 padapter->stats.tx_packets = pxmitpriv->tx_pkts;
189 padapter->stats.rx_packets = precvpriv->rx_pkts;
190 padapter->stats.tx_dropped = pxmitpriv->tx_drop;
191 padapter->stats.rx_dropped = precvpriv->rx_drop;
192 padapter->stats.tx_bytes = pxmitpriv->tx_bytes;
193 padapter->stats.rx_bytes = precvpriv->rx_bytes;
194 return &padapter->stats;
195}
196
197static const struct net_device_ops rtl8712_netdev_ops = {
198 .ndo_open = netdev_open,
199 .ndo_stop = netdev_close,
200 .ndo_start_xmit = r8712_xmit_entry,
201 .ndo_set_mac_address = r871x_net_set_mac_address,
202 .ndo_get_stats = r871x_net_get_stats,
203 .ndo_do_ioctl = r871x_ioctl,
204};
205
206struct net_device *r8712_init_netdev(void)
207{
208 struct _adapter *padapter;
209 struct net_device *pnetdev;
210
211 pnetdev = alloc_etherdev(sizeof(struct _adapter));
212 if (!pnetdev)
213 return NULL;
214 if (dev_alloc_name(pnetdev, ifname) < 0) {
215 strcpy(ifname, "wlan%d");
216 dev_alloc_name(pnetdev, ifname);
217 }
218 padapter = (struct _adapter *) _netdev_priv(pnetdev);
219 padapter->pnetdev = pnetdev;
220 printk(KERN_INFO "r8712u: register rtl8712_netdev_ops to"
221 " netdev_ops\n");
222 pnetdev->netdev_ops = &rtl8712_netdev_ops;
223 pnetdev->watchdog_timeo = HZ; /* 1 second timeout */
224 pnetdev->wireless_handlers = (struct iw_handler_def *)
225 &r871x_handlers_def;
226 /*step 2.*/
227 loadparam(padapter, pnetdev);
228 netif_carrier_off(pnetdev);
229 padapter->pid = 0; /* Initial the PID value used for HW PBC.*/
230 return pnetdev;
231}
232
233static u32 start_drv_threads(struct _adapter *padapter)
234{
235 padapter->cmdThread = kthread_run(r8712_cmd_thread, padapter,
236 padapter->pnetdev->name);
237 if (IS_ERR(padapter->cmdThread) < 0)
238 return _FAIL;
239 return _SUCCESS;
240}
241
242void r8712_stop_drv_threads(struct _adapter *padapter)
243{
244 /*Below is to termindate r8712_cmd_thread & event_thread...*/
245 up(&padapter->cmdpriv.cmd_queue_sema);
246 if (padapter->cmdThread)
247 _down_sema(&padapter->cmdpriv.terminate_cmdthread_sema);
248 padapter->cmdpriv.cmd_seq = 1;
249}
250
251static void start_drv_timers(struct _adapter *padapter)
252{
253 _set_timer(&padapter->mlmepriv.sitesurveyctrl.sitesurvey_ctrl_timer,
254 5000);
255 _set_timer(&padapter->mlmepriv.wdg_timer, 2000);
256}
257
258static void stop_drv_timers(struct _adapter *padapter)
259{
260 _cancel_timer_ex(&padapter->mlmepriv.assoc_timer);
261 _cancel_timer_ex(&padapter->mlmepriv.sitesurveyctrl.
262 sitesurvey_ctrl_timer);
263 _cancel_timer_ex(&padapter->securitypriv.tkip_timer);
264 _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer);
265 _cancel_timer_ex(&padapter->mlmepriv.dhcp_timer);
266 _cancel_timer_ex(&padapter->mlmepriv.wdg_timer);
267}
268
269static u8 init_default_value(struct _adapter *padapter)
270{
271 u8 ret = _SUCCESS;
272 struct registry_priv *pregistrypriv = &padapter->registrypriv;
273 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
274 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
275 struct security_priv *psecuritypriv = &padapter->securitypriv;
276
277 /*xmit_priv*/
278 pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;
279 pxmitpriv->vcs = pregistrypriv->vcs_type;
280 pxmitpriv->vcs_type = pregistrypriv->vcs_type;
281 pxmitpriv->rts_thresh = pregistrypriv->rts_thresh;
282 pxmitpriv->frag_len = pregistrypriv->frag_thresh;
283 /*ht_priv*/
284 {
285 int i;
286 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
287
288 phtpriv->ampdu_enable = false;/*set to disabled*/
289 for (i = 0; i < 16; i++)
290 phtpriv->baddbareq_issued[i] = false;
291 }
292 /*security_priv*/
293 psecuritypriv->sw_encrypt = pregistrypriv->software_encrypt;
294 psecuritypriv->sw_decrypt = pregistrypriv->software_decrypt;
295 psecuritypriv->binstallGrpkey = _FAIL;
296 /*pwrctrl_priv*/
297 /*registry_priv*/
298 r8712_init_registrypriv_dev_network(padapter);
299 r8712_update_registrypriv_dev_network(padapter);
300 /*misc.*/
301 return ret;
302}
303
304u8 r8712_init_drv_sw(struct _adapter *padapter)
305{
306 if ((r8712_init_cmd_priv(&padapter->cmdpriv)) == _FAIL)
307 return _FAIL;
308 padapter->cmdpriv.padapter = padapter;
309 if ((r8712_init_evt_priv(&padapter->evtpriv)) == _FAIL)
310 return _FAIL;
311 if (r8712_init_mlme_priv(padapter) == _FAIL)
312 return _FAIL;
313 _r8712_init_xmit_priv(&padapter->xmitpriv, padapter);
314 _r8712_init_recv_priv(&padapter->recvpriv, padapter);
315 memset((unsigned char *)&padapter->securitypriv, 0,
316 sizeof(struct security_priv));
317 _init_timer(&(padapter->securitypriv.tkip_timer), padapter->pnetdev,
318 r8712_use_tkipkey_handler, padapter);
319 _r8712_init_sta_priv(&padapter->stapriv);
320 padapter->stapriv.padapter = padapter;
321 r8712_init_bcmc_stainfo(padapter);
322 r8712_init_pwrctrl_priv(padapter);
323 sema_init(&(padapter->pwrctrlpriv.pnp_pwr_mgnt_sema), 0);
324 mp871xinit(padapter);
325 if (init_default_value(padapter) != _SUCCESS)
326 return _FAIL;
327 r8712_InitSwLeds(padapter);
328 return _SUCCESS;
329}
330
331u8 r8712_free_drv_sw(struct _adapter *padapter)
332{
333 struct net_device *pnetdev = (struct net_device *)padapter->pnetdev;
334
335 r8712_free_cmd_priv(&padapter->cmdpriv);
336 r8712_free_evt_priv(&padapter->evtpriv);
337 r8712_DeInitSwLeds(padapter);
338 r8712_free_mlme_priv(&padapter->mlmepriv);
339 r8712_free_io_queue(padapter);
340 _free_xmit_priv(&padapter->xmitpriv);
341 _r8712_free_sta_priv(&padapter->stapriv);
342 _r8712_free_recv_priv(&padapter->recvpriv);
343 mp871xdeinit(padapter);
344 if (pnetdev)
345 os_free_netdev(pnetdev);
346 return _SUCCESS;
347}
348
349
350static void enable_video_mode(struct _adapter *padapter, int cbw40_value)
351{
352 /* bit 8:
353 * 1 -> enable video mode to 96B AP
354 * 0 -> disable video mode to 96B AP
355 * bit 9:
356 * 1 -> enable 40MHz mode
357 * 0 -> disable 40MHz mode
358 * bit 10:
359 * 1 -> enable STBC
360 * 0 -> disable STBC
361 */
362 u32 intcmd = 0xf4000500; /* enable bit8, bit10*/
363
364 if (cbw40_value) {
365 /* if the driver supports the 40M bandwidth,
366 * we can enable the bit 9.*/
367 intcmd |= 0x200;
368 }
369 r8712_fw_cmd(padapter, intcmd);
370}
371
372static int netdev_open(struct net_device *pnetdev)
373{
374 struct _adapter *padapter = (struct _adapter *)_netdev_priv(pnetdev);
375
376 if (padapter->bup == false) {
377 padapter->bDriverStopped = false;
378 padapter->bSurpriseRemoved = false;
379 padapter->bup = true;
380 if (rtl871x_hal_init(padapter) != _SUCCESS)
381 goto netdev_open_error;
382 if (r8712_initmac == NULL)
383 /* Use the mac address stored in the Efuse */
384 memcpy(pnetdev->dev_addr,
385 padapter->eeprompriv.mac_addr, ETH_ALEN);
386 else {
387 /* We have to inform f/w to use user-supplied MAC
388 * address.
389 */
390 msleep(200);
391 r8712_setMacAddr_cmd(padapter, (u8 *)pnetdev->dev_addr);
392 /*
393 * The "myid" function will get the wifi mac address
394 * from eeprompriv structure instead of netdev
395 * structure. So, we have to overwrite the mac_addr
396 * stored in the eeprompriv structure. In this case,
397 * the real mac address won't be used anymore. So that,
398 * the eeprompriv.mac_addr should store the mac which
399 * users specify.
400 */
401 memcpy(padapter->eeprompriv.mac_addr,
402 pnetdev->dev_addr, ETH_ALEN);
403 }
404 if (start_drv_threads(padapter) != _SUCCESS)
405 goto netdev_open_error;
406 if (padapter->dvobjpriv.inirp_init == NULL)
407 goto netdev_open_error;
408 else
409 padapter->dvobjpriv.inirp_init(padapter);
410 r8712_set_ps_mode(padapter, padapter->registrypriv.power_mgnt,
411 padapter->registrypriv.smart_ps);
412 }
413 if (!netif_queue_stopped(pnetdev))
414 netif_start_queue(pnetdev);
415 else
416 netif_wake_queue(pnetdev);
417
418 if (video_mode)
419 enable_video_mode(padapter, cbw40_enable);
420 /* start driver mlme relation timer */
421 start_drv_timers(padapter);
422 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_NO_LINK);
423 return 0;
424netdev_open_error:
425 padapter->bup = false;
426 netif_carrier_off(pnetdev);
427 netif_stop_queue(pnetdev);
428 return -1;
429}
430
431static int netdev_close(struct net_device *pnetdev)
432{
433 struct _adapter *padapter = (struct _adapter *) _netdev_priv(pnetdev);
434
435 /* Close LED*/
436 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_POWER_OFF);
437 msleep(200);
438
439 /*s1.*/
440 if (pnetdev) {
441 if (!netif_queue_stopped(pnetdev))
442 netif_stop_queue(pnetdev);
443 }
444 /*s2.*/
445 /*s2-1. issue disassoc_cmd to fw*/
446 r8712_disassoc_cmd(padapter);
447 /*s2-2. indicate disconnect to os*/
448 r8712_ind_disconnect(padapter);
449 /*s2-3.*/
450 r8712_free_assoc_resources(padapter);
451 /*s2-4.*/
452 r8712_free_network_queue(padapter);
453 /*Stop driver mlme relation timer*/
454 stop_drv_timers(padapter);
455 return 0;
456}
457
458#include "mlme_osdep.h"
diff --git a/drivers/staging/rtl8712/osdep_intf.h b/drivers/staging/rtl8712/osdep_intf.h
new file mode 100644
index 00000000000..3bc20257b03
--- /dev/null
+++ b/drivers/staging/rtl8712/osdep_intf.h
@@ -0,0 +1,19 @@
1#ifndef __OSDEP_INTF_H_
2#define __OSDEP_INTF_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0 : 1)) << 2)
8
9struct intf_priv {
10 u8 *intf_dev;
11 /* when in USB, IO is through interrupt in/out endpoints */
12 struct usb_device *udev;
13 struct urb *piorw_urb;
14 struct semaphore io_retevt;
15};
16
17int r871x_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
18
19#endif /*_OSDEP_INTF_H_*/
diff --git a/drivers/staging/rtl8712/osdep_service.h b/drivers/staging/rtl8712/osdep_service.h
new file mode 100644
index 00000000000..73509dad210
--- /dev/null
+++ b/drivers/staging/rtl8712/osdep_service.h
@@ -0,0 +1,260 @@
1#ifndef __OSDEP_SERVICE_H_
2#define __OSDEP_SERVICE_H_
3
4#define _SUCCESS 1
5#define _FAIL 0
6
7#include "basic_types.h"
8#include <linux/version.h>
9#include <linux/spinlock.h>
10
11#include <linux/semaphore.h>
12#include <linux/sem.h>
13#include <linux/netdevice.h>
14#include <linux/etherdevice.h>
15#include <net/iw_handler.h>
16#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
17#include <linux/compiler.h>
18#include <linux/kernel.h>
19#include <linux/errno.h>
20#include <linux/init.h>
21#include <linux/slab.h>
22#include <linux/module.h>
23#include <linux/sched.h>
24#include <linux/kref.h>
25#include <linux/smp_lock.h>
26#include <linux/netdevice.h>
27#include <linux/skbuff.h>
28#include <linux/usb.h>
29#include <linux/usb/ch9.h>
30#include <linux/io.h>
31#include <linux/circ_buf.h>
32#include <linux/uaccess.h>
33#include <asm/byteorder.h>
34#include <asm/atomic.h>
35#include <linux/wireless.h>
36#include <linux/rtnetlink.h>
37#include "ethernet.h"
38#include <linux/if_arp.h>
39#include <linux/firmware.h>
40#define _usb_alloc_urb(x, y) usb_alloc_urb(x, y)
41#define _usb_submit_urb(x, y) usb_submit_urb(x, y)
42
43struct __queue {
44 struct list_head queue;
45 spinlock_t lock;
46};
47
48#define _pkt struct sk_buff
49#define _buffer unsigned char
50#define thread_exit() complete_and_exit(NULL, 0)
51#define _workitem struct work_struct
52#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000)
53
54#define _init_queue(pqueue) \
55 do { \
56 _init_listhead(&((pqueue)->queue)); \
57 spin_lock_init(&((pqueue)->lock)); \
58 } while (0)
59
60static inline void *_netdev_priv(struct net_device *dev)
61{
62 return netdev_priv(dev);
63}
64
65static inline void os_free_netdev(struct net_device *dev)
66{
67 free_netdev(dev);
68}
69
70static inline struct list_head *get_next(struct list_head *list)
71{
72 return list->next;
73}
74
75static inline struct list_head *get_list_head(struct __queue *queue)
76{
77 return &(queue->queue);
78}
79
80#define LIST_CONTAINOR(ptr, type, member) \
81 ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))
82
83static inline void _enter_hwio_critical(struct semaphore *prwlock,
84 unsigned long *pirqL)
85{
86 down(prwlock);
87}
88
89static inline void _exit_hwio_critical(struct semaphore *prwlock,
90 unsigned long *pirqL)
91{
92 up(prwlock);
93}
94
95static inline void list_delete(struct list_head *plist)
96{
97 list_del_init(plist);
98}
99
100static inline void _init_timer(struct timer_list *ptimer,
101 struct net_device *padapter,
102 void *pfunc, void *cntx)
103{
104 ptimer->function = pfunc;
105 ptimer->data = (addr_t)cntx;
106 init_timer(ptimer);
107}
108
109static inline void _set_timer(struct timer_list *ptimer, u32 delay_time)
110{
111 mod_timer(ptimer, (jiffies+(delay_time*HZ/1000)));
112}
113
114static inline void _cancel_timer(struct timer_list *ptimer, u8 *bcancelled)
115{
116 del_timer(ptimer);
117 *bcancelled = true; /*true ==1; false==0*/
118}
119
120static inline void _init_workitem(_workitem *pwork, void *pfunc, void *cntx)
121{
122 INIT_WORK(pwork, pfunc);
123}
124
125static inline void _set_workitem(_workitem *pwork)
126{
127 schedule_work(pwork);
128}
129
130#include "rtl871x_byteorder.h"
131
132#ifndef BIT
133 #define BIT(x) (1 << (x))
134#endif
135
136/*
137For the following list_xxx operations,
138caller must guarantee the atomic context.
139Otherwise, there will be racing condition.
140*/
141static inline u32 is_list_empty(struct list_head *phead)
142{
143 if (list_empty(phead))
144 return true;
145 else
146 return false;
147}
148
149static inline void list_insert_tail(struct list_head *plist, struct list_head *phead)
150{
151 list_add_tail(plist, phead);
152}
153
154static inline u32 _down_sema(struct semaphore *sema)
155{
156 if (down_interruptible(sema))
157 return _FAIL;
158 else
159 return _SUCCESS;
160}
161
162static inline void _rtl_rwlock_init(struct semaphore *prwlock)
163{
164 init_MUTEX(prwlock);
165}
166
167static inline void _init_listhead(struct list_head *list)
168{
169 INIT_LIST_HEAD(list);
170}
171
172static inline u32 _queue_empty(struct __queue *pqueue)
173{
174 return is_list_empty(&(pqueue->queue));
175}
176
177static inline u32 end_of_queue_search(struct list_head *head, struct list_head *plist)
178{
179 if (head == plist)
180 return true;
181 else
182 return false;
183}
184
185static inline void sleep_schedulable(int ms)
186{
187 u32 delta;
188
189 delta = (ms * HZ) / 1000;/*(ms)*/
190 if (delta == 0)
191 delta = 1;/* 1 ms */
192 set_current_state(TASK_INTERRUPTIBLE);
193 if (schedule_timeout(delta) != 0)
194 return ;
195}
196
197static inline u8 *_malloc(u32 sz)
198{
199 u8 *pbuf;
200
201 pbuf = kmalloc(sz, GFP_ATOMIC);
202 return pbuf;
203}
204
205static inline unsigned char _cancel_timer_ex(struct timer_list *ptimer)
206{
207 return del_timer(ptimer);
208}
209
210static inline void thread_enter(void *context)
211{
212 daemonize("%s", "RTKTHREAD");
213 allow_signal(SIGTERM);
214}
215
216static inline void flush_signals_thread(void)
217{
218 if (signal_pending(current))
219 flush_signals(current);
220}
221
222static inline u32 _RND8(u32 sz)
223{
224 u32 val;
225
226 val = ((sz >> 3) + ((sz & 7) ? 1 : 0)) << 3;
227 return val;
228}
229
230static inline u32 _RND128(u32 sz)
231{
232 u32 val;
233
234 val = ((sz >> 7) + ((sz & 127) ? 1 : 0)) << 7;
235 return val;
236}
237
238static inline u32 _RND256(u32 sz)
239{
240 u32 val;
241
242 val = ((sz >> 8) + ((sz & 255) ? 1 : 0)) << 8;
243 return val;
244}
245
246static inline u32 _RND512(u32 sz)
247{
248 u32 val;
249
250 val = ((sz >> 9) + ((sz & 511) ? 1 : 0)) << 9;
251 return val;
252}
253
254#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
255#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
256
257#define STRUCT_PACKED __attribute__ ((packed))
258
259#endif
260
diff --git a/drivers/staging/rtl8712/recv_linux.c b/drivers/staging/rtl8712/recv_linux.c
new file mode 100644
index 00000000000..1f0949ed7ee
--- /dev/null
+++ b/drivers/staging/rtl8712/recv_linux.c
@@ -0,0 +1,169 @@
1/******************************************************************************
2 * recv_linux.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RECV_OSDEP_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "wifi.h"
34#include "recv_osdep.h"
35#include "osdep_intf.h"
36#include "usb_ops.h"
37
38/*init os related resource in struct recv_priv*/
39/*alloc os related resource in union recv_frame*/
40int r8712_os_recv_resource_alloc(struct _adapter *padapter,
41 union recv_frame *precvframe)
42{
43 precvframe->u.hdr.pkt_newalloc = precvframe->u.hdr.pkt = NULL;
44 return _SUCCESS;
45}
46
47/*alloc os related resource in struct recv_buf*/
48int r8712_os_recvbuf_resource_alloc(struct _adapter *padapter,
49 struct recv_buf *precvbuf)
50{
51 int res = _SUCCESS;
52
53 precvbuf->irp_pending = false;
54 precvbuf->purb = _usb_alloc_urb(0, GFP_KERNEL);
55 if (precvbuf->purb == NULL)
56 res = _FAIL;
57 precvbuf->pskb = NULL;
58 precvbuf->reuse = false;
59 precvbuf->pallocated_buf = NULL;
60 precvbuf->pbuf = NULL;
61 precvbuf->pdata = NULL;
62 precvbuf->phead = NULL;
63 precvbuf->ptail = NULL;
64 precvbuf->pend = NULL;
65 precvbuf->transfer_len = 0;
66 precvbuf->len = 0;
67 return res;
68}
69
70/*free os related resource in struct recv_buf*/
71int r8712_os_recvbuf_resource_free(struct _adapter *padapter,
72 struct recv_buf *precvbuf)
73{
74 if (precvbuf->pskb)
75 dev_kfree_skb_any(precvbuf->pskb);
76 if (precvbuf->purb) {
77 usb_kill_urb(precvbuf->purb);
78 usb_free_urb(precvbuf->purb);
79 }
80 return _SUCCESS;
81}
82
83void r8712_handle_tkip_mic_err(struct _adapter *padapter, u8 bgroup)
84{
85 union iwreq_data wrqu;
86 struct iw_michaelmicfailure ev;
87 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
88
89 memset(&ev, 0x00, sizeof(ev));
90 if (bgroup)
91 ev.flags |= IW_MICFAILURE_GROUP;
92 else
93 ev.flags |= IW_MICFAILURE_PAIRWISE;
94 ev.src_addr.sa_family = ARPHRD_ETHER;
95 memcpy(ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[0], ETH_ALEN);
96 memset(&wrqu, 0x00, sizeof(wrqu));
97 wrqu.data.length = sizeof(ev);
98 wireless_send_event(padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu,
99 (char *)&ev);
100}
101
102void r8712_recv_indicatepkt(struct _adapter *padapter,
103 union recv_frame *precv_frame)
104{
105 struct recv_priv *precvpriv;
106 struct __queue *pfree_recv_queue;
107 _pkt *skb;
108 struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
109
110 precvpriv = &(padapter->recvpriv);
111 pfree_recv_queue = &(precvpriv->free_recv_queue);
112 skb = precv_frame->u.hdr.pkt;
113 if (skb == NULL)
114 goto _recv_indicatepkt_drop;
115 skb->data = precv_frame->u.hdr.rx_data;
116#ifdef NET_SKBUFF_DATA_USES_OFFSET
117 skb->tail = (sk_buff_data_t)(precv_frame->u.hdr.rx_tail -
118 precv_frame->u.hdr.rx_head);
119#else
120 skb->tail = (sk_buff_data_t)precv_frame->u.hdr.rx_tail;
121#endif
122 skb->len = precv_frame->u.hdr.len;
123 if ((pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1))
124 skb->ip_summed = CHECKSUM_UNNECESSARY;
125 else
126 skb->ip_summed = CHECKSUM_NONE;
127 skb->dev = padapter->pnetdev;
128 skb->protocol = eth_type_trans(skb, padapter->pnetdev);
129 netif_rx(skb);
130 precv_frame->u.hdr.pkt = NULL; /* pointers to NULL before
131 * r8712_free_recvframe() */
132 r8712_free_recvframe(precv_frame, pfree_recv_queue);
133 return;
134_recv_indicatepkt_drop:
135 /*enqueue back to free_recv_queue*/
136 if (precv_frame)
137 r8712_free_recvframe(precv_frame, pfree_recv_queue);
138 precvpriv->rx_drop++;
139}
140
141void r8712_os_read_port(struct _adapter *padapter, struct recv_buf *precvbuf)
142{
143 struct recv_priv *precvpriv = &padapter->recvpriv;
144
145 precvbuf->ref_cnt--;
146 /*free skb in recv_buf*/
147 dev_kfree_skb_any(precvbuf->pskb);
148 precvbuf->pskb = NULL;
149 precvbuf->reuse = false;
150 if (precvbuf->irp_pending == false)
151 r8712_read_port(padapter, precvpriv->ff_hwaddr, 0,
152 (unsigned char *)precvbuf);
153}
154
155static void _r8712_reordering_ctrl_timeout_handler (void *FunctionContext)
156{
157 struct recv_reorder_ctrl *preorder_ctrl =
158 (struct recv_reorder_ctrl *)FunctionContext;
159
160 r8712_reordering_ctrl_timeout_handler(preorder_ctrl);
161}
162
163void r8712_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl)
164{
165 struct _adapter *padapter = preorder_ctrl->padapter;
166
167 _init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev,
168 _r8712_reordering_ctrl_timeout_handler, preorder_ctrl);
169}
diff --git a/drivers/staging/rtl8712/recv_osdep.h b/drivers/staging/rtl8712/recv_osdep.h
new file mode 100644
index 00000000000..b23dd6b159f
--- /dev/null
+++ b/drivers/staging/rtl8712/recv_osdep.h
@@ -0,0 +1,27 @@
1#ifndef __RECV_OSDEP_H_
2#define __RECV_OSDEP_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include <linux/skbuff.h>
7
8sint _r8712_init_recv_priv(struct recv_priv *precvpriv,
9 struct _adapter *padapter);
10void _r8712_free_recv_priv(struct recv_priv *precvpriv);
11s32 r8712_recv_entry(union recv_frame *precv_frame);
12void r8712_recv_indicatepkt(struct _adapter *adapter,
13 union recv_frame *precv_frame);
14void r8712_handle_tkip_mic_err(struct _adapter *padapter, u8 bgroup);
15int r8712_init_recv_priv(struct recv_priv *precvpriv, struct _adapter *padapter);
16void r8712_free_recv_priv(struct recv_priv *precvpriv);
17int r8712_os_recv_resource_alloc(struct _adapter *padapter,
18 union recv_frame *precvframe);
19int r8712_os_recvbuf_resource_alloc(struct _adapter *padapter,
20 struct recv_buf *precvbuf);
21int r8712_os_recvbuf_resource_free(struct _adapter *padapter,
22 struct recv_buf *precvbuf);
23void r8712_os_read_port(struct _adapter *padapter, struct recv_buf *precvbuf);
24void r8712_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl);
25
26#endif
27
diff --git a/drivers/staging/rtl8712/rtl8712_bitdef.h b/drivers/staging/rtl8712/rtl8712_bitdef.h
new file mode 100644
index 00000000000..356184fa060
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_bitdef.h
@@ -0,0 +1,19 @@
1#ifndef __RTL8712_BITDEF_H__
2#define __RTL8712_BITDEF_H__
3
4#include "rtl8712_cmdctrl_bitdef.h"
5#include "rtl8712_syscfg_bitdef.h"
6#include "rtl8712_macsetting_bitdef.h"
7#include "rtl8712_timectrl_bitdef.h"
8#include "rtl8712_fifoctrl_bitdef.h"
9#include "rtl8712_ratectrl_bitdef.h"
10#include "rtl8712_edcasetting_bitdef.h"
11#include "rtl8712_wmac_bitdef.h"
12#include "rtl8712_security_bitdef.h"
13#include "rtl8712_powersave_bitdef.h"
14#include "rtl8712_gp_bitdef.h"
15#include "rtl8712_interrupt_bitdef.h"
16#include "rtl8712_debugctrl_bitdef.h"
17
18#endif /* __RTL8712_BITDEF_H__ */
19
diff --git a/drivers/staging/rtl8712/rtl8712_cmd.c b/drivers/staging/rtl8712/rtl8712_cmd.c
new file mode 100644
index 00000000000..26c605e8cd6
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_cmd.c
@@ -0,0 +1,465 @@
1/******************************************************************************
2 * rtl8712_cmd.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL8712_CMD_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "recv_osdep.h"
34#include "mlme_osdep.h"
35#include "rtl871x_byteorder.h"
36#include "rtl871x_ioctl_set.h"
37
38static void check_hw_pbc(struct _adapter *padapter)
39{
40 u8 tmp1byte;
41
42 r8712_write8(padapter, MAC_PINMUX_CTRL, (GPIOMUX_EN | GPIOSEL_GPIO));
43 tmp1byte = r8712_read8(padapter, GPIO_IO_SEL);
44 tmp1byte &= ~(HAL_8192S_HW_GPIO_WPS_BIT);
45 r8712_write8(padapter, GPIO_IO_SEL, tmp1byte);
46 tmp1byte = r8712_read8(padapter, GPIO_CTRL);
47 if (tmp1byte == 0xff)
48 return ;
49 if (tmp1byte&HAL_8192S_HW_GPIO_WPS_BIT) {
50 /* Here we only set bPbcPressed to true
51 * After trigger PBC, the variable will be set to false */
52 DBG_8712("CheckPbcGPIO - PBC is pressed !!!!\n");
53 /* 0 is the default value and it means the application monitors
54 * the HW PBC doesn't privde its pid to driver. */
55 if (padapter->pid == 0)
56 return;
57 kill_pid(find_vpid(padapter->pid), SIGUSR1, 1);
58 }
59}
60
61/* query rx phy status from fw.
62 * Adhoc mode: beacon.
63 * Infrastructure mode: beacon , data. */
64static void query_fw_rx_phy_status(struct _adapter *padapter)
65{
66 u32 val32 = 0;
67 int pollingcnts = 50;
68
69 if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == true) {
70 r8712_write32(padapter, IOCMD_CTRL_REG, 0xf4000001);
71 msleep(100);
72 /* Wait FW complete IO Cmd */
73 while ((r8712_read32(padapter, IOCMD_CTRL_REG)) &&
74 (pollingcnts > 0)) {
75 pollingcnts--;
76 msleep(20);
77 }
78 if (pollingcnts != 0)
79 val32 = r8712_read32(padapter, IOCMD_DATA_REG);
80 else /* time out */
81 val32 = 0;
82 val32 = val32 >> 4;
83 padapter->recvpriv.fw_rssi =
84 (u8)r8712_signal_scale_mapping(val32);
85 }
86}
87
88/* check mlme, hw, phy, or dynamic algorithm status. */
89static void StatusWatchdogCallback(struct _adapter *padapter)
90{
91 check_hw_pbc(padapter);
92 query_fw_rx_phy_status(padapter);
93}
94
95static void r871x_internal_cmd_hdl(struct _adapter *padapter, u8 *pbuf)
96{
97 struct drvint_cmd_parm *pdrvcmd;
98
99 if (!pbuf)
100 return;
101 pdrvcmd = (struct drvint_cmd_parm *)pbuf;
102 switch (pdrvcmd->i_cid) {
103 case WDG_WK_CID:
104 StatusWatchdogCallback(padapter);
105 break;
106 default:
107 break;
108 }
109 kfree(pdrvcmd->pbuf);
110}
111
112static u8 read_macreg_hdl(struct _adapter *padapter, u8 *pbuf)
113{
114 void (*pcmd_callback)(struct _adapter *dev, struct cmd_obj *pcmd);
115 struct cmd_obj *pcmd = (struct cmd_obj *)pbuf;
116
117 /* invoke cmd->callback function */
118 pcmd_callback = cmd_callback[pcmd->cmdcode].callback;
119 if (pcmd_callback == NULL)
120 r8712_free_cmd_obj(pcmd);
121 else
122 pcmd_callback(padapter, pcmd);
123 return H2C_SUCCESS;
124}
125
126static u8 write_macreg_hdl(struct _adapter *padapter, u8 *pbuf)
127{
128 void (*pcmd_callback)(struct _adapter *dev, struct cmd_obj *pcmd);
129 struct cmd_obj *pcmd = (struct cmd_obj *)pbuf;
130
131 /* invoke cmd->callback function */
132 pcmd_callback = cmd_callback[pcmd->cmdcode].callback;
133 if (pcmd_callback == NULL)
134 r8712_free_cmd_obj(pcmd);
135 else
136 pcmd_callback(padapter, pcmd);
137 return H2C_SUCCESS;
138}
139
140static u8 read_bbreg_hdl(struct _adapter *padapter, u8 *pbuf)
141{
142 u32 val;
143 void (*pcmd_callback)(struct _adapter *dev, struct cmd_obj *pcmd);
144 struct readBB_parm *prdbbparm;
145 struct cmd_obj *pcmd = (struct cmd_obj *)pbuf;
146
147 prdbbparm = (struct readBB_parm *)pcmd->parmbuf;
148 if (pcmd->rsp && pcmd->rspsz > 0)
149 memcpy(pcmd->rsp, (u8 *)&val, pcmd->rspsz);
150 pcmd_callback = cmd_callback[pcmd->cmdcode].callback;
151 if (pcmd_callback == NULL)
152 r8712_free_cmd_obj(pcmd);
153 else
154 pcmd_callback(padapter, pcmd);
155 return H2C_SUCCESS;
156}
157
158static u8 write_bbreg_hdl(struct _adapter *padapter, u8 *pbuf)
159{
160 void (*pcmd_callback)(struct _adapter *dev, struct cmd_obj *pcmd);
161 struct writeBB_parm *pwritebbparm;
162 struct cmd_obj *pcmd = (struct cmd_obj *)pbuf;
163
164 pwritebbparm = (struct writeBB_parm *)pcmd->parmbuf;
165 pcmd_callback = cmd_callback[pcmd->cmdcode].callback;
166 if (pcmd_callback == NULL)
167 r8712_free_cmd_obj(pcmd);
168 else
169 pcmd_callback(padapter, pcmd);
170 return H2C_SUCCESS;
171}
172
173static u8 read_rfreg_hdl(struct _adapter *padapter, u8 *pbuf)
174{
175 u32 val;
176 void (*pcmd_callback)(struct _adapter *dev, struct cmd_obj *pcmd);
177 struct readRF_parm *prdrfparm;
178 struct cmd_obj *pcmd = (struct cmd_obj *)pbuf;
179
180 prdrfparm = (struct readRF_parm *)pcmd->parmbuf;
181 if (pcmd->rsp && pcmd->rspsz > 0)
182 memcpy(pcmd->rsp, (u8 *)&val, pcmd->rspsz);
183 pcmd_callback = cmd_callback[pcmd->cmdcode].callback;
184 if (pcmd_callback == NULL)
185 r8712_free_cmd_obj(pcmd);
186 else
187 pcmd_callback(padapter, pcmd);
188 return H2C_SUCCESS;
189}
190
191static u8 write_rfreg_hdl(struct _adapter *padapter, u8 *pbuf)
192{
193 void (*pcmd_callback)(struct _adapter *dev, struct cmd_obj *pcmd);
194 struct writeRF_parm *pwriterfparm;
195 struct cmd_obj *pcmd = (struct cmd_obj *)pbuf;
196
197 pwriterfparm = (struct writeRF_parm *)pcmd->parmbuf;
198 pcmd_callback = cmd_callback[pcmd->cmdcode].callback;
199 if (pcmd_callback == NULL)
200 r8712_free_cmd_obj(pcmd);
201 else
202 pcmd_callback(padapter, pcmd);
203 return H2C_SUCCESS;
204}
205
206static u8 sys_suspend_hdl(struct _adapter *padapter, u8 *pbuf)
207{
208 struct cmd_obj *pcmd = (struct cmd_obj *)pbuf;
209 struct usb_suspend_parm *psetusbsuspend;
210
211 psetusbsuspend = (struct usb_suspend_parm *)pcmd->parmbuf;
212 r8712_free_cmd_obj(pcmd);
213 return H2C_SUCCESS;
214}
215
216static struct cmd_obj *cmd_hdl_filter(struct _adapter *padapter,
217 struct cmd_obj *pcmd)
218{
219 struct cmd_obj *pcmd_r;
220
221 if (pcmd == NULL)
222 return pcmd;
223 pcmd_r = NULL;
224
225 switch (pcmd->cmdcode) {
226 case GEN_CMD_CODE(_Read_MACREG):
227 read_macreg_hdl(padapter, (u8 *)pcmd);
228 pcmd_r = pcmd;
229 break;
230 case GEN_CMD_CODE(_Write_MACREG):
231 write_macreg_hdl(padapter, (u8 *)pcmd);
232 pcmd_r = pcmd;
233 break;
234 case GEN_CMD_CODE(_Read_BBREG):
235 read_bbreg_hdl(padapter, (u8 *)pcmd);
236 break;
237 case GEN_CMD_CODE(_Write_BBREG):
238 write_bbreg_hdl(padapter, (u8 *)pcmd);
239 break;
240 case GEN_CMD_CODE(_Read_RFREG):
241 read_rfreg_hdl(padapter, (u8 *)pcmd);
242 break;
243 case GEN_CMD_CODE(_Write_RFREG):
244 write_rfreg_hdl(padapter, (u8 *)pcmd);
245 break;
246 case GEN_CMD_CODE(_SetUsbSuspend):
247 sys_suspend_hdl(padapter, (u8 *)pcmd);
248 break;
249 case GEN_CMD_CODE(_JoinBss):
250 r8712_joinbss_reset(padapter);
251 /* Before set JoinBss_CMD to FW, driver must ensure FW is in
252 * PS_MODE_ACTIVE. Directly write rpwm to radio on and assign
253 * new pwr_mode to Driver, instead of use workitem to change
254 * state. */
255 if (padapter->pwrctrlpriv.pwr_mode > PS_MODE_ACTIVE) {
256 padapter->pwrctrlpriv.pwr_mode = PS_MODE_ACTIVE;
257 _enter_pwrlock(&(padapter->pwrctrlpriv.lock));
258 r8712_set_rpwm(padapter, PS_STATE_S4);
259 up(&(padapter->pwrctrlpriv.lock));
260 }
261 pcmd_r = pcmd;
262 break;
263 case _DRV_INT_CMD_:
264 r871x_internal_cmd_hdl(padapter, pcmd->parmbuf);
265 r8712_free_cmd_obj(pcmd);
266 pcmd_r = NULL;
267 break;
268 default:
269 pcmd_r = pcmd;
270 break;
271 }
272 return pcmd_r; /* if returning pcmd_r == NULL, pcmd must be free. */
273}
274
275static u8 check_cmd_fifo(struct _adapter *padapter, uint sz)
276{
277 u8 res = _SUCCESS;
278 return res;
279}
280
281u8 r8712_fw_cmd(struct _adapter *pAdapter, u32 cmd)
282{
283 int pollingcnts = 50;
284
285 r8712_write32(pAdapter, IOCMD_CTRL_REG, cmd);
286 msleep(100);
287 while ((0 != r8712_read32(pAdapter, IOCMD_CTRL_REG)) &&
288 (pollingcnts > 0)) {
289 pollingcnts--;
290 msleep(20);
291 }
292 if (pollingcnts == 0)
293 return false;
294 return true;
295}
296
297void r8712_fw_cmd_data(struct _adapter *pAdapter, u32 *value, u8 flag)
298{
299 if (flag == 0) /* set */
300 r8712_write32(pAdapter, IOCMD_DATA_REG, *value);
301 else /* query */
302 *value = r8712_read32(pAdapter, IOCMD_DATA_REG);
303}
304
305int r8712_cmd_thread(void *context)
306{
307 struct cmd_obj *pcmd;
308 unsigned int cmdsz, wr_sz, *pcmdbuf, *prspbuf;
309 struct tx_desc *pdesc;
310 void (*pcmd_callback)(struct _adapter *dev, struct cmd_obj *pcmd);
311 struct _adapter *padapter = (struct _adapter *)context;
312 struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
313
314 thread_enter(padapter);
315 while (1) {
316 if ((_down_sema(&(pcmdpriv->cmd_queue_sema))) == _FAIL)
317 break;
318 if ((padapter->bDriverStopped == true) ||
319 (padapter->bSurpriseRemoved == true))
320 break;
321 if (r8712_register_cmd_alive(padapter) != _SUCCESS)
322 continue;
323_next:
324 pcmd = r8712_dequeue_cmd(&(pcmdpriv->cmd_queue));
325 if (!(pcmd)) {
326 r8712_unregister_cmd_alive(padapter);
327 continue;
328 }
329 pcmdbuf = (unsigned int *)pcmdpriv->cmd_buf;
330 prspbuf = (unsigned int *)pcmdpriv->rsp_buf;
331 pdesc = (struct tx_desc *)pcmdbuf;
332 memset(pdesc, 0, TXDESC_SIZE);
333 pcmd = cmd_hdl_filter(padapter, pcmd);
334 if (pcmd) { /* if pcmd != NULL, cmd will be handled by f/w */
335 struct dvobj_priv *pdvobj = (struct dvobj_priv *)
336 &padapter->dvobjpriv;
337 u8 blnPending = 0;
338 pcmdpriv->cmd_issued_cnt++;
339 cmdsz = _RND8((pcmd->cmdsz)); /* _RND8 */
340 wr_sz = TXDESC_SIZE + 8 + cmdsz;
341 pdesc->txdw0 |= cpu_to_le32((wr_sz-TXDESC_SIZE) &
342 0x0000ffff);
343 if (pdvobj->ishighspeed) {
344 if ((wr_sz % 512) == 0)
345 blnPending = 1;
346 } else {
347 if ((wr_sz % 64) == 0)
348 blnPending = 1;
349 }
350 if (blnPending) /* 32 bytes for TX Desc - 8 offset */
351 pdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE +
352 OFFSET_SZ + 8) << OFFSET_SHT) &
353 0x00ff0000);
354 else {
355 pdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE +
356 OFFSET_SZ) <<
357 OFFSET_SHT) &
358 0x00ff0000);
359 }
360 pdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
361 pdesc->txdw1 |= cpu_to_le32((0x13 << QSEL_SHT) &
362 0x00001f00);
363 pcmdbuf += (TXDESC_SIZE >> 2);
364 *pcmdbuf = cpu_to_le32((cmdsz & 0x0000ffff) |
365 (pcmd->cmdcode << 16) |
366 (pcmdpriv->cmd_seq << 24));
367 pcmdbuf += 2 ; /* 8 bytes aligment */
368 memcpy((u8 *)pcmdbuf, pcmd->parmbuf, pcmd->cmdsz);
369 while (check_cmd_fifo(padapter, wr_sz) == _FAIL) {
370 if ((padapter->bDriverStopped == true) ||
371 (padapter->bSurpriseRemoved == true))
372 break;
373 msleep(100);
374 continue;
375 }
376 if (blnPending)
377 wr_sz += 8; /* Append 8 bytes */
378 r8712_write_mem(padapter, RTL8712_DMA_H2CCMD, wr_sz,
379 (u8 *)pdesc);
380 pcmdpriv->cmd_seq++;
381 if (pcmd->cmdcode == GEN_CMD_CODE(_CreateBss)) {
382 pcmd->res = H2C_SUCCESS;
383 pcmd_callback = cmd_callback[pcmd->
384 cmdcode].callback;
385 if (pcmd_callback)
386 pcmd_callback(padapter, pcmd);
387 continue;
388 }
389 if (pcmd->cmdcode == GEN_CMD_CODE(_SetPwrMode)) {
390 if (padapter->pwrctrlpriv.bSleep) {
391 _enter_pwrlock(&(padapter->
392 pwrctrlpriv.lock));
393 r8712_set_rpwm(padapter, PS_STATE_S2);
394 up(&padapter->pwrctrlpriv.lock);
395 }
396 }
397 r8712_free_cmd_obj(pcmd);
398 if (_queue_empty(&(pcmdpriv->cmd_queue))) {
399 r8712_unregister_cmd_alive(padapter);
400 continue;
401 } else
402 goto _next;
403 } else
404 goto _next;
405 flush_signals_thread();
406 }
407 /* free all cmd_obj resources */
408 do {
409 pcmd = r8712_dequeue_cmd(&(pcmdpriv->cmd_queue));
410 if (pcmd == NULL)
411 break;
412 r8712_free_cmd_obj(pcmd);
413 } while (1);
414 up(&pcmdpriv->terminate_cmdthread_sema);
415 thread_exit();
416}
417
418void r8712_event_handle(struct _adapter *padapter, uint *peventbuf)
419{
420 u8 evt_code, evt_seq;
421 u16 evt_sz;
422 void (*event_callback)(struct _adapter *dev, u8 *pbuf);
423 struct evt_priv *pevt_priv = &(padapter->evtpriv);
424
425 if (peventbuf == NULL)
426 goto _abort_event_;
427 evt_sz = (u16)(le32_to_cpu(*peventbuf) & 0xffff);
428 evt_seq = (u8)((le32_to_cpu(*peventbuf) >> 24) & 0x7f);
429 evt_code = (u8)((le32_to_cpu(*peventbuf) >> 16) & 0xff);
430 /* checking event sequence... */
431 if ((evt_seq & 0x7f) != pevt_priv->event_seq) {
432 pevt_priv->event_seq = ((evt_seq + 1) & 0x7f);
433 goto _abort_event_;
434 }
435 /* checking if event code is valid */
436 if (evt_code >= MAX_C2HEVT) {
437 pevt_priv->event_seq = ((evt_seq+1) & 0x7f);
438 goto _abort_event_;
439 } else if ((evt_code == GEN_EVT_CODE(_Survey)) &&
440 (evt_sz > sizeof(struct wlan_bssid_ex))) {
441 pevt_priv->event_seq = ((evt_seq+1)&0x7f);
442 goto _abort_event_;
443 }
444 /* checking if event size match the event parm size */
445 if ((wlanevents[evt_code].parmsize) &&
446 (wlanevents[evt_code].parmsize != evt_sz)) {
447 pevt_priv->event_seq = ((evt_seq+1)&0x7f);
448 goto _abort_event_;
449 } else if ((evt_sz == 0) && (evt_code != GEN_EVT_CODE(_WPS_PBC))) {
450 pevt_priv->event_seq = ((evt_seq+1)&0x7f);
451 goto _abort_event_;
452 }
453 pevt_priv->event_seq++; /* update evt_seq */
454 if (pevt_priv->event_seq > 127)
455 pevt_priv->event_seq = 0;
456 peventbuf = peventbuf + 2; /* move to event content, 8 bytes aligment */
457 if (peventbuf) {
458 event_callback = wlanevents[evt_code].event_callback;
459 if (event_callback)
460 event_callback(padapter, (u8 *)peventbuf);
461 }
462 pevt_priv->evt_done_cnt++;
463_abort_event_:
464 return;
465}
diff --git a/drivers/staging/rtl8712/rtl8712_cmd.h b/drivers/staging/rtl8712/rtl8712_cmd.h
new file mode 100644
index 00000000000..13ef0626b28
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_cmd.h
@@ -0,0 +1,157 @@
1#ifndef __RTL8712_CMD_H_
2#define __RTL8712_CMD_H_
3
4u8 r8712_fw_cmd(struct _adapter *pAdapter, u32 cmd);
5void r8712_fw_cmd_data(struct _adapter *pAdapter, u32 *value, u8 flag);
6
7
8enum rtl8712_h2c_cmd {
9 GEN_CMD_CODE(_Read_MACREG), /*0*/
10 GEN_CMD_CODE(_Write_MACREG),
11 GEN_CMD_CODE(_Read_BBREG),
12 GEN_CMD_CODE(_Write_BBREG),
13 GEN_CMD_CODE(_Read_RFREG),
14 GEN_CMD_CODE(_Write_RFREG), /*5*/
15 GEN_CMD_CODE(_Read_EEPROM),
16 GEN_CMD_CODE(_Write_EEPROM),
17 GEN_CMD_CODE(_Read_EFUSE),
18 GEN_CMD_CODE(_Write_EFUSE),
19
20 GEN_CMD_CODE(_Read_CAM), /*10*/
21 GEN_CMD_CODE(_Write_CAM),
22 GEN_CMD_CODE(_setBCNITV),
23 GEN_CMD_CODE(_setMBIDCFG),
24 GEN_CMD_CODE(_JoinBss), /*14*/
25 GEN_CMD_CODE(_DisConnect), /*15*/
26 GEN_CMD_CODE(_CreateBss),
27 GEN_CMD_CODE(_SetOpMode),
28 GEN_CMD_CODE(_SiteSurvey), /*18*/
29 GEN_CMD_CODE(_SetAuth),
30
31 GEN_CMD_CODE(_SetKey), /*20*/
32 GEN_CMD_CODE(_SetStaKey),
33 GEN_CMD_CODE(_SetAssocSta),
34 GEN_CMD_CODE(_DelAssocSta),
35 GEN_CMD_CODE(_SetStaPwrState),
36 GEN_CMD_CODE(_SetBasicRate), /*25*/
37 GEN_CMD_CODE(_GetBasicRate),
38 GEN_CMD_CODE(_SetDataRate),
39 GEN_CMD_CODE(_GetDataRate),
40 GEN_CMD_CODE(_SetPhyInfo),
41
42 GEN_CMD_CODE(_GetPhyInfo), /*30*/
43 GEN_CMD_CODE(_SetPhy),
44 GEN_CMD_CODE(_GetPhy),
45 GEN_CMD_CODE(_readRssi),
46 GEN_CMD_CODE(_readGain),
47 GEN_CMD_CODE(_SetAtim), /*35*/
48 GEN_CMD_CODE(_SetPwrMode),
49 GEN_CMD_CODE(_JoinbssRpt),
50 GEN_CMD_CODE(_SetRaTable),
51 GEN_CMD_CODE(_GetRaTable),
52
53 GEN_CMD_CODE(_GetCCXReport), /*40*/
54 GEN_CMD_CODE(_GetDTMReport),
55 GEN_CMD_CODE(_GetTXRateStatistics),
56 GEN_CMD_CODE(_SetUsbSuspend),
57 GEN_CMD_CODE(_SetH2cLbk),
58 GEN_CMD_CODE(_AddBAReq), /*45*/
59
60 GEN_CMD_CODE(_SetChannel), /*46*/
61/* MP_OFFLOAD Start (47~54)*/
62 GEN_CMD_CODE(_SetTxPower),
63 GEN_CMD_CODE(_SwitchAntenna),
64 GEN_CMD_CODE(_SetCrystalCap),
65 GEN_CMD_CODE(_SetSingleCarrierTx), /*50*/
66 GEN_CMD_CODE(_SetSingleToneTx),
67 GEN_CMD_CODE(_SetCarrierSuppressionTx),
68 GEN_CMD_CODE(_SetContinuousTx),
69 GEN_CMD_CODE(_SwitchBandwidth), /*54*/
70/* MP_OFFLOAD End*/
71 GEN_CMD_CODE(_TX_Beacon), /*55*/
72 GEN_CMD_CODE(_SetPowerTracking),
73 GEN_CMD_CODE(_AMSDU_TO_AMPDU), /*57*/
74 GEN_CMD_CODE(_SetMacAddress), /*58*/
75 MAX_H2CCMD
76};
77
78
79#define _GetBBReg_CMD_ _Read_BBREG_CMD_
80#define _SetBBReg_CMD_ _Write_BBREG_CMD_
81#define _GetRFReg_CMD_ _Read_RFREG_CMD_
82#define _SetRFReg_CMD_ _Write_RFREG_CMD_
83#define _DRV_INT_CMD_ (MAX_H2CCMD+1)
84#define _SetRFIntFs_CMD_ (MAX_H2CCMD+2)
85
86#ifdef _RTL8712_CMD_C_
87static struct _cmd_callback cmd_callback[] = {
88 {GEN_CMD_CODE(_Read_MACREG), NULL}, /*0*/
89 {GEN_CMD_CODE(_Write_MACREG), NULL},
90 {GEN_CMD_CODE(_Read_BBREG), &r8712_getbbrfreg_cmdrsp_callback},
91 {GEN_CMD_CODE(_Write_BBREG), NULL},
92 {GEN_CMD_CODE(_Read_RFREG), &r8712_getbbrfreg_cmdrsp_callback},
93 {GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/
94 {GEN_CMD_CODE(_Read_EEPROM), NULL},
95 {GEN_CMD_CODE(_Write_EEPROM), NULL},
96 {GEN_CMD_CODE(_Read_EFUSE), NULL},
97 {GEN_CMD_CODE(_Write_EFUSE), NULL},
98
99 {GEN_CMD_CODE(_Read_CAM), NULL}, /*10*/
100 {GEN_CMD_CODE(_Write_CAM), NULL},
101 {GEN_CMD_CODE(_setBCNITV), NULL},
102 {GEN_CMD_CODE(_setMBIDCFG), NULL},
103 {GEN_CMD_CODE(_JoinBss), &r8712_joinbss_cmd_callback}, /*14*/
104 {GEN_CMD_CODE(_DisConnect), &r8712_disassoc_cmd_callback}, /*15*/
105 {GEN_CMD_CODE(_CreateBss), &r8712_createbss_cmd_callback},
106 {GEN_CMD_CODE(_SetOpMode), NULL},
107 {GEN_CMD_CODE(_SiteSurvey), &r8712_survey_cmd_callback}, /*18*/
108 {GEN_CMD_CODE(_SetAuth), NULL},
109
110 {GEN_CMD_CODE(_SetKey), NULL}, /*20*/
111 {GEN_CMD_CODE(_SetStaKey), &r8712_setstaKey_cmdrsp_callback},
112 {GEN_CMD_CODE(_SetAssocSta), &r8712_setassocsta_cmdrsp_callback},
113 {GEN_CMD_CODE(_DelAssocSta), NULL},
114 {GEN_CMD_CODE(_SetStaPwrState), NULL},
115 {GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/
116 {GEN_CMD_CODE(_GetBasicRate), NULL},
117 {GEN_CMD_CODE(_SetDataRate), NULL},
118 {GEN_CMD_CODE(_GetDataRate), NULL},
119 {GEN_CMD_CODE(_SetPhyInfo), NULL},
120
121 {GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/
122 {GEN_CMD_CODE(_SetPhy), NULL},
123 {GEN_CMD_CODE(_GetPhy), NULL},
124 {GEN_CMD_CODE(_readRssi), NULL},
125 {GEN_CMD_CODE(_readGain), NULL},
126 {GEN_CMD_CODE(_SetAtim), NULL}, /*35*/
127 {GEN_CMD_CODE(_SetPwrMode), NULL},
128 {GEN_CMD_CODE(_JoinbssRpt), NULL},
129 {GEN_CMD_CODE(_SetRaTable), NULL},
130 {GEN_CMD_CODE(_GetRaTable), NULL},
131
132 {GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/
133 {GEN_CMD_CODE(_GetDTMReport), NULL},
134 {GEN_CMD_CODE(_GetTXRateStatistics), NULL},
135 {GEN_CMD_CODE(_SetUsbSuspend), NULL},
136 {GEN_CMD_CODE(_SetH2cLbk), NULL},
137 {GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/
138
139 {GEN_CMD_CODE(_SetChannel), NULL}, /*46*/
140/* MP_OFFLOAD Start (47~54)*/
141 {GEN_CMD_CODE(_SetTxPower), NULL},
142 {GEN_CMD_CODE(_SwitchAntenna), NULL},
143 {GEN_CMD_CODE(_SetCrystalCap), NULL},
144 {GEN_CMD_CODE(_SetSingleCarrierTx), NULL}, /*50*/
145 {GEN_CMD_CODE(_SetSingleToneTx), NULL},
146 {GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL},
147 {GEN_CMD_CODE(_SetContinuousTx), NULL},
148 {GEN_CMD_CODE(_SwitchBandwidth), NULL}, /*54*/
149/* MP_OFFLOAD End*/
150 {GEN_CMD_CODE(_TX_Beacon), NULL}, /*55*/
151 {GEN_CMD_CODE(_SetPowerTracking), NULL},
152 {GEN_CMD_CODE(_AMSDU_TO_AMPDU), NULL}, /*57*/
153 {GEN_CMD_CODE(_SetMacAddress), NULL}, /*58*/
154};
155#endif
156
157#endif
diff --git a/drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h b/drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h
new file mode 100644
index 00000000000..6c49903a42f
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h
@@ -0,0 +1,89 @@
1#ifndef __RTL8712_CMDCTRL_BITDEF_H__
2#define __RTL8712_CMDCTRL_BITDEF_H__
3
4/*
5 * 2. Command Control Registers (Offset: 0x0040 - 0x004F)*/
6/*--------------------------------------------------------------------------*/
7/* 8192S (CMD) command register bits (Offset 0x40, 16 bits)*/
8/*--------------------------------------------------------------------------*/
9#define _APSDOFF_STATUS BIT(15)
10#define _APSDOFF BIT(14)
11#define _BBRSTn BIT(13) /*Enable OFDM/CCK*/
12#define _BB_GLB_RSTn BIT(12) /*Enable BB*/
13#define _SCHEDULE_EN BIT(10) /*Enable MAC scheduler*/
14#define _MACRXEN BIT(9)
15#define _MACTXEN BIT(8)
16#define _DDMA_EN BIT(7) /*FW off load function enable*/
17#define _FW2HW_EN BIT(6) /*MAC every module reset */
18#define _RXDMA_EN BIT(5)
19#define _TXDMA_EN BIT(4)
20#define _HCI_RXDMA_EN BIT(3)
21#define _HCI_TXDMA_EN BIT(2)
22
23/*TXPAUSE*/
24#define _STOPHCCA BIT(6)
25#define _STOPHIGH BIT(5)
26#define _STOPMGT BIT(4)
27#define _STOPVO BIT(3)
28#define _STOPVI BIT(2)
29#define _STOPBE BIT(1)
30#define _STOPBK BIT(0)
31
32/*TCR*/
33#define _DISCW BIT(20)
34#define _ICV BIT(19)
35#define _CFEND_FMT BIT(17)
36#define _CRC BIT(16)
37#define _FWRDY BIT(7)
38#define _BASECHG BIT(6)
39#define _IMEM_RDY BIT(5)
40#define _DMEM_CODE_DONE BIT(4)
41#define _EMEM_CHK_RPT BIT(3)
42#define _EMEM_CODE_DONE BIT(2)
43#define _IMEM_CHK_RPT BIT(1)
44#define _IMEM_CODE_DONE BIT(0)
45
46#define _TXDMA_INIT_VALUE (_IMEM_CHK_RPT|_EMEM_CHK_RPT)
47
48/*RCR*/
49#define _ENMBID BIT(27)
50#define _APP_PHYST_RXFF BIT(25)
51#define _APP_PHYST_STAFF BIT(24)
52#define _CBSSID BIT(23)
53#define _APWRMGT BIT(22)
54#define _ADD3 BIT(21)
55#define _AMF BIT(20)
56#define _ACF BIT(19)
57#define _ADF BIT(18)
58#define _APP_MIC BIT(17)
59#define _APP_ICV BIT(16)
60#define _RXFTH_MSK 0x0000E000
61#define _RXFTH_SHT 13
62#define _AICV BIT(12)
63#define _RXPKTLMT_MSK 0x00000FC0
64#define _RXPKTLMT_SHT 6
65#define _ACRC32 BIT(5)
66#define _AB BIT(3)
67#define _AM BIT(2)
68#define _APM BIT(1)
69#define _AAP BIT(0)
70
71/*MSR*/
72#define _NETTYPE_MSK 0x03
73#define _NETTYPE_SHT 0
74
75/*BT*/
76#define _BTMODE_MSK 0x06
77#define _BTMODE_SHT 1
78#define _ENBT BIT(0)
79
80/*MBIDCTRL*/
81#define _ENMBID_MODE BIT(15)
82#define _BCNNO_MSK 0x7000
83#define _BCNNO_SHT 12
84#define _BCNSPACE_MSK 0x0FFF
85#define _BCNSPACE_SHT 0
86
87
88#endif /* __RTL8712_CMDCTRL_BITDEF_H__*/
89
diff --git a/drivers/staging/rtl8712/rtl8712_cmdctrl_regdef.h b/drivers/staging/rtl8712/rtl8712_cmdctrl_regdef.h
new file mode 100644
index 00000000000..5d9a3f20ea6
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_cmdctrl_regdef.h
@@ -0,0 +1,15 @@
1#ifndef __RTL8712_CMDCTRL_REGDEF_H__
2#define __RTL8712_CMDCTRL_REGDEF_H__
3
4
5#define CR (RTL8712_CMDCTRL_ + 0x0000)
6#define TXPAUSE (RTL8712_CMDCTRL_ + 0x0002)
7#define TCR (RTL8712_CMDCTRL_ + 0x0004)
8#define RCR (RTL8712_CMDCTRL_ + 0x0008)
9#define MSR (RTL8712_CMDCTRL_ + 0x000C)
10#define SYSF_CFG (RTL8712_CMDCTRL_ + 0x000D)
11#define MBIDCTRL (RTL8712_CMDCTRL_ + 0x000E)
12
13
14#endif /* __RTL8712_CMDCTRL_REGDEF_H__ */
15
diff --git a/drivers/staging/rtl8712/rtl8712_debugctrl_bitdef.h b/drivers/staging/rtl8712/rtl8712_debugctrl_bitdef.h
new file mode 100644
index 00000000000..7b34d4025e3
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_debugctrl_bitdef.h
@@ -0,0 +1,36 @@
1#ifndef __RTL8712_DEBUGCTRL_BITDEF_H__
2#define __RTL8712_DEBUGCTRL_BITDEF_H__
3
4/*BIST*/
5#define _BIST_RST BIT(0)
6
7/*LMS*/
8#define _LMS_MSK 0x03
9
10/*WDG_CTRL*/
11#define _OVSEL_MSK 0x0600
12#define _OVSEL_SHT 9
13#define _WDGCLR BIT(8)
14#define _WDGEN_MSK 0x00FF
15#define _WDGEN_SHT 0
16
17/*INTM*/
18#define _TXTIMER_MSK 0xF000
19#define _TXTIMER_SHT 12
20#define _TXNUM_MSK 0x0F00
21#define _TXNUM_SHT 8
22#define _RXTIMER_MSK 0x00F0
23#define _RXTIMER_SHT 4
24#define _RXNUM_MSK 0x000F
25#define _RXNUM_SHT 0
26
27/*FDLOCKTURN0*/
28/*FDLOCKTURN1*/
29#define _TURN1 BIT(0)
30
31/*FDLOCKFLAG0*/
32/*FDLOCKFLAG1*/
33#define _LOCKFLAG1_MSK 0x03
34
35
36#endif /* __RTL8712_DEBUGCTRL_BITDEF_H__ */
diff --git a/drivers/staging/rtl8712/rtl8712_debugctrl_regdef.h b/drivers/staging/rtl8712/rtl8712_debugctrl_regdef.h
new file mode 100644
index 00000000000..27cad716868
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_debugctrl_regdef.h
@@ -0,0 +1,28 @@
1#ifndef __RTL8712_DEBUGCTRL_REGDEF_H__
2#define __RTL8712_DEBUGCTRL_REGDEF_H__
3
4#define BIST (RTL8712_DEBUGCTRL_ + 0x00)
5#define DBS (RTL8712_DEBUGCTRL_ + 0x04)
6#define LMS (RTL8712_DEBUGCTRL_ + 0x05)
7#define CPUINST (RTL8712_DEBUGCTRL_ + 0x08)
8#define CPUCAUSE (RTL8712_DEBUGCTRL_ + 0x0C)
9#define LBUS_ERR_ADDR (RTL8712_DEBUGCTRL_ + 0x10)
10#define LBUS_ERR_CMD (RTL8712_DEBUGCTRL_ + 0x14)
11#define LBUS_ERR_DATA_L (RTL8712_DEBUGCTRL_ + 0x18)
12#define LBUS_ERR_DATA_H (RTL8712_DEBUGCTRL_ + 0x1C)
13#define LBUS_EXCEPTION_ADDR (RTL8712_DEBUGCTRL_ + 0x20)
14#define WDG_CTRL (RTL8712_DEBUGCTRL_ + 0x24)
15#define INTMTU (RTL8712_DEBUGCTRL_ + 0x28)
16#define INTM (RTL8712_DEBUGCTRL_ + 0x2A)
17#define FDLOCKTURN0 (RTL8712_DEBUGCTRL_ + 0x2C)
18#define FDLOCKTURN1 (RTL8712_DEBUGCTRL_ + 0x2D)
19#define FDLOCKFLAG0 (RTL8712_DEBUGCTRL_ + 0x2E)
20#define FDLOCKFLAG1 (RTL8712_DEBUGCTRL_ + 0x2F)
21#define TRXPKTBUF_DBG_DATA (RTL8712_DEBUGCTRL_ + 0x30)
22#define TRXPKTBUF_DBG_CTRL (RTL8712_DEBUGCTRL_ + 0x38)
23#define DPLL_MON (RTL8712_DEBUGCTRL_ + 0x3A)
24
25
26
27#endif /* __RTL8712_DEBUGCTRL_REGDEF_H__ */
28
diff --git a/drivers/staging/rtl8712/rtl8712_edcasetting_bitdef.h b/drivers/staging/rtl8712/rtl8712_edcasetting_bitdef.h
new file mode 100644
index 00000000000..c69b1b72c28
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_edcasetting_bitdef.h
@@ -0,0 +1,52 @@
1#ifndef __RTL8712_EDCASETTING_BITDEF_H__
2#define __RTL8712_EDCASETTING_BITDEF_H__
3
4/*EDCAPARAM*/
5#define _TXOPLIMIT_MSK 0xFFFF0000
6#define _TXOPLIMIT_SHT 16
7#define _ECWIN_MSK 0x0000FF00
8#define _ECWIN_SHT 8
9#define _AIFS_MSK 0x000000FF
10#define _AIFS_SHT 0
11
12/*BCNTCFG*/
13#define _BCNECW_MSK 0xFF00
14#define _BCNECW_SHT 8
15#define _BCNIFS_MSK 0x00FF
16#define _BCNIFS_SHT 0
17
18/*CWRR*/
19#define _CWRR_MSK 0x03FF
20
21/*ACMAVG*/
22#define _AVG_TIME_UP BIT(3)
23#define _AVGPERIOD_MSK 0x03
24
25/*ACMHWCTRL*/
26#define _VOQ_ACM_STATUS BIT(6)
27#define _VIQ_ACM_STATUS BIT(5)
28#define _BEQ_ACM_STATUS BIT(4)
29#define _VOQ_ACM_EN BIT(3)
30#define _VIQ_ACM_EN BIT(2)
31#define _BEQ_ACM_EN BIT(1)
32#define _ACMHWEN BIT(0)
33
34/*VO_ADMTIME*/
35#define _VO_ACM_RUT BIT(18)
36#define _VO_ADMTIME_MSK 0x0003FFF
37
38/*VI_ADMTIME*/
39#define _VI_ACM_RUT BIT(18)
40#define _VI_ADMTIME_MSK 0x0003FFF
41
42/*BE_ADMTIME*/
43#define _BE_ACM_RUT BIT(18)
44#define _BE_ADMTIME_MSK 0x0003FFF
45
46/*Retry limit reg*/
47#define _SRL_MSK 0xFF00
48#define _SRL_SHT 8
49#define _LRL_MSK 0x00FF
50#define _LRL_SHT 0
51
52#endif /* __RTL8712_EDCASETTING_BITDEF_H__*/
diff --git a/drivers/staging/rtl8712/rtl8712_edcasetting_regdef.h b/drivers/staging/rtl8712/rtl8712_edcasetting_regdef.h
new file mode 100644
index 00000000000..de3d3e23ba9
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_edcasetting_regdef.h
@@ -0,0 +1,18 @@
1#ifndef __RTL8712_EDCASETTING_REGDEF_H__
2#define __RTL8712_EDCASETTING_REGDEF_H__
3
4#define EDCA_VO_PARAM (RTL8712_EDCASETTING_ + 0x00)
5#define EDCA_VI_PARAM (RTL8712_EDCASETTING_ + 0x04)
6#define EDCA_BE_PARAM (RTL8712_EDCASETTING_ + 0x08)
7#define EDCA_BK_PARAM (RTL8712_EDCASETTING_ + 0x0C)
8#define BCNTCFG (RTL8712_EDCASETTING_ + 0x10)
9#define CWRR (RTL8712_EDCASETTING_ + 0x12)
10#define ACMAVG (RTL8712_EDCASETTING_ + 0x16)
11#define ACMHWCTRL (RTL8712_EDCASETTING_ + 0x17)
12#define VO_ADMTIME (RTL8712_EDCASETTING_ + 0x18)
13#define VI_ADMTIME (RTL8712_EDCASETTING_ + 0x1C)
14#define BE_ADMTIME (RTL8712_EDCASETTING_ + 0x20)
15#define RL (RTL8712_EDCASETTING_ + 0x24)
16
17#endif /* __RTL8712_EDCASETTING_REGDEF_H__ */
18
diff --git a/drivers/staging/rtl8712/rtl8712_efuse.c b/drivers/staging/rtl8712/rtl8712_efuse.c
new file mode 100644
index 00000000000..9730ae1c58d
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_efuse.c
@@ -0,0 +1,568 @@
1/*
2 * rtl8712_efuse.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL8712_EFUSE_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "rtl8712_efuse.h"
34
35/* reserve 3 bytes for HW stop read */
36static int efuse_available_max_size = EFUSE_MAX_SIZE - 3 /*0x1FD*/;
37
38static void efuse_reg_ctrl(struct _adapter *padapter, u8 bPowerOn)
39{
40 u8 tmpu8 = 0;
41
42 if (true == bPowerOn) {
43 /* -----------------e-fuse pwr & clk reg ctrl ---------------
44 * Enable LDOE25 Macro Block
45 */
46 tmpu8 = r8712_read8(padapter, EFUSE_TEST + 3);
47 tmpu8 |= 0x80;
48 r8712_write8(padapter, EFUSE_TEST + 3, tmpu8);
49 msleep(20); /* for some platform , need some delay time */
50 /* Change Efuse Clock for write action to 40MHZ */
51 r8712_write8(padapter, EFUSE_CLK_CTRL, 0x03);
52 msleep(20); /* for some platform , need some delay time */
53 } else {
54 /* -----------------e-fuse pwr & clk reg ctrl -----------------
55 * Disable LDOE25 Macro Block
56 */
57 tmpu8 = r8712_read8(padapter, EFUSE_TEST + 3);
58 tmpu8 &= 0x7F;
59 r8712_write8(padapter, EFUSE_TEST + 3, tmpu8);
60 /* Change Efuse Clock for write action to 500K */
61 r8712_write8(padapter, EFUSE_CLK_CTRL, 0x02);
62 }
63}
64
65/*
66 * Before write E-Fuse, this function must be called.
67 */
68u8 r8712_efuse_reg_init(struct _adapter *padapter)
69{
70 return true;
71}
72
73void r8712_efuse_reg_uninit(struct _adapter *padapter)
74{
75 efuse_reg_ctrl(padapter, false);
76}
77
78static u8 efuse_one_byte_read(struct _adapter *padapter, u16 addr, u8 *data)
79{
80 u8 tmpidx = 0, bResult;
81
82 /* -----------------e-fuse reg ctrl --------------------------------- */
83 r8712_write8(padapter, EFUSE_CTRL+1, (u8)(addr&0xFF)); /* address */
84 r8712_write8(padapter, EFUSE_CTRL+2, ((u8)((addr>>8)&0x03)) |
85 (r8712_read8(padapter, EFUSE_CTRL+2)&0xFC));
86 r8712_write8(padapter, EFUSE_CTRL+3, 0x72); /* read cmd */
87 /* wait for complete */
88 while (!(0x80 & r8712_read8(padapter, EFUSE_CTRL+3)) && (tmpidx < 100))
89 tmpidx++;
90 if (tmpidx < 100) {
91 *data = r8712_read8(padapter, EFUSE_CTRL);
92 bResult = true;
93 } else {
94 *data = 0xff;
95 bResult = false;
96 }
97 return bResult;
98}
99
100static u8 efuse_one_byte_write(struct _adapter *padapter, u16 addr, u8 data)
101{
102 u8 tmpidx = 0, bResult;
103
104 /* -----------------e-fuse reg ctrl -------------------------------- */
105 r8712_write8(padapter, EFUSE_CTRL+1, (u8)(addr&0xFF)); /* address */
106 r8712_write8(padapter, EFUSE_CTRL+2, ((u8)((addr>>8)&0x03)) |
107 (r8712_read8(padapter, EFUSE_CTRL+2)&0xFC));
108 r8712_write8(padapter, EFUSE_CTRL, data); /* data */
109 r8712_write8(padapter, EFUSE_CTRL+3, 0xF2); /* write cmd */
110 /* wait for complete */
111 while ((0x80 & r8712_read8(padapter, EFUSE_CTRL+3)) && (tmpidx < 100))
112 tmpidx++;
113 if (tmpidx < 100)
114 bResult = true;
115 else
116 bResult = false;
117 return bResult;
118}
119
120static u8 efuse_one_byte_rw(struct _adapter *padapter, u8 bRead, u16 addr,
121 u8 *data)
122{
123 u8 tmpidx = 0, tmpv8 = 0, bResult;
124
125 /* -----------------e-fuse reg ctrl --------------------------------- */
126 r8712_write8(padapter, EFUSE_CTRL+1, (u8)(addr&0xFF)); /* address */
127 tmpv8 = ((u8)((addr >> 8) & 0x03)) |
128 (r8712_read8(padapter, EFUSE_CTRL + 2) & 0xFC);
129 r8712_write8(padapter, EFUSE_CTRL+2, tmpv8);
130 if (true == bRead) {
131 r8712_write8(padapter, EFUSE_CTRL+3, 0x72); /* read cmd */
132 while (!(0x80 & r8712_read8(padapter, EFUSE_CTRL+3)) &&
133 (tmpidx < 100))
134 tmpidx++;
135 if (tmpidx < 100) {
136 *data = r8712_read8(padapter, EFUSE_CTRL);
137 bResult = true;
138 } else {
139 *data = 0;
140 bResult = false;
141 }
142 } else {
143 r8712_write8(padapter, EFUSE_CTRL, *data); /* data */
144 r8712_write8(padapter, EFUSE_CTRL+3, 0xF2); /* write cmd */
145 while ((0x80 & r8712_read8(padapter, EFUSE_CTRL+3)) &&
146 (tmpidx < 100))
147 tmpidx++;
148 if (tmpidx < 100)
149 bResult = true;
150 else
151 bResult = false;
152 }
153 return bResult;
154}
155
156static u8 efuse_is_empty(struct _adapter *padapter, u8 *empty)
157{
158 u8 value, ret = true;
159
160 /* read one byte to check if E-Fuse is empty */
161 if (efuse_one_byte_rw(padapter, true, 0, &value) == true) {
162 if (0xFF == value)
163 *empty = true;
164 else
165 *empty = false;
166 } else
167 ret = false;
168 return ret;
169}
170
171void r8712_efuse_change_max_size(struct _adapter *padapter)
172{
173 u16 pre_pg_data_saddr = 0x1FB;
174 u16 i;
175 u16 pre_pg_data_size = 5;
176 u8 pre_pg_data[5];
177
178 for (i = 0; i < pre_pg_data_size; i++)
179 efuse_one_byte_read(padapter, pre_pg_data_saddr + i,
180 &pre_pg_data[i]);
181 if ((pre_pg_data[0] == 0x03) && (pre_pg_data[1] == 0x00) &&
182 (pre_pg_data[2] == 0x00) && (pre_pg_data[3] == 0x00) &&
183 (pre_pg_data[4] == 0x0C))
184 efuse_available_max_size -= pre_pg_data_size;
185}
186
187int r8712_efuse_get_max_size(struct _adapter *padapter)
188{
189 return efuse_available_max_size;
190}
191
192static u8 calculate_word_cnts(const u8 word_en)
193{
194 u8 word_cnts = 0;
195 u8 word_idx;
196
197 for (word_idx = 0; word_idx < PGPKG_MAX_WORDS; word_idx++)
198 if (!(word_en & BIT(word_idx)))
199 word_cnts++; /* 0 : write enable */
200 return word_cnts;
201}
202
203static void pgpacket_copy_data(const u8 word_en, const u8 *sourdata,
204 u8 *targetdata)
205{
206 u8 tmpindex = 0;
207 u8 word_idx, byte_idx;
208
209 for (word_idx = 0; word_idx < PGPKG_MAX_WORDS; word_idx++) {
210 if (!(word_en&BIT(word_idx))) {
211 byte_idx = word_idx * 2;
212 targetdata[byte_idx] = sourdata[tmpindex++];
213 targetdata[byte_idx + 1] = sourdata[tmpindex++];
214 }
215 }
216}
217
218u16 r8712_efuse_get_current_size(struct _adapter *padapter)
219{
220 int bContinual = true;
221 u16 efuse_addr = 0;
222 u8 hoffset = 0, hworden = 0;
223 u8 efuse_data, word_cnts = 0;
224
225 while (bContinual && efuse_one_byte_read(padapter, efuse_addr,
226 &efuse_data) && (efuse_addr < efuse_available_max_size)) {
227 if (efuse_data != 0xFF) {
228 hoffset = (efuse_data >> 4) & 0x0F;
229 hworden = efuse_data & 0x0F;
230 word_cnts = calculate_word_cnts(hworden);
231 /* read next header */
232 efuse_addr = efuse_addr + (word_cnts * 2) + 1;
233 } else
234 bContinual = false ;
235 }
236 return efuse_addr;
237}
238
239u8 r8712_efuse_pg_packet_read(struct _adapter *padapter, u8 offset, u8 *data)
240{
241 u8 hoffset = 0, hworden = 0, word_cnts = 0;
242 u16 efuse_addr = 0;
243 u8 efuse_data;
244 u8 tmpidx = 0;
245 u8 tmpdata[PGPKT_DATA_SIZE];
246 u8 ret = true;
247
248 if (data == NULL)
249 return false;
250 if (offset > 0x0f)
251 return false;
252 memset(data, 0xFF, sizeof(u8)*PGPKT_DATA_SIZE);
253 while (efuse_addr < efuse_available_max_size) {
254 if (efuse_one_byte_read(padapter, efuse_addr, &efuse_data) ==
255 true) {
256 if (efuse_data == 0xFF)
257 break;
258 hoffset = (efuse_data >> 4) & 0x0F;
259 hworden = efuse_data & 0x0F;
260 word_cnts = calculate_word_cnts(hworden);
261 if (hoffset == offset) {
262 memset(tmpdata, 0xFF, PGPKT_DATA_SIZE);
263 for (tmpidx = 0; tmpidx < word_cnts * 2;
264 tmpidx++) {
265 if (efuse_one_byte_read(padapter,
266 efuse_addr+1+tmpidx, &efuse_data) ==
267 true) {
268 tmpdata[tmpidx] = efuse_data;
269 } else
270 ret = false;
271 }
272 pgpacket_copy_data(hworden, tmpdata, data);
273 }
274 efuse_addr += 1 + (word_cnts*2);
275 } else {
276 ret = false;
277 break;
278 }
279 }
280 return ret;
281}
282
283static u8 fix_header(struct _adapter *padapter, u8 header, u16 header_addr)
284{
285 struct PGPKT_STRUCT pkt;
286 u8 offset, word_en, value;
287 u16 addr;
288 int i;
289 u8 ret = true;
290
291 pkt.offset = GET_EFUSE_OFFSET(header);
292 pkt.word_en = GET_EFUSE_WORD_EN(header);
293 addr = header_addr + 1 + calculate_word_cnts(pkt.word_en) * 2;
294 if (addr > efuse_available_max_size)
295 return false;
296 /* retrieve original data */
297 addr = 0;
298 while (addr < header_addr) {
299 if (efuse_one_byte_read(padapter, addr++, &value) == false) {
300 ret = false;
301 break;
302 }
303 offset = GET_EFUSE_OFFSET(value);
304 word_en = GET_EFUSE_WORD_EN(value);
305 if (pkt.offset != offset) {
306 addr += calculate_word_cnts(word_en)*2;
307 continue;
308 }
309 for (i = 0; i < PGPKG_MAX_WORDS; i++) {
310 if (BIT(i) & word_en)
311 continue;
312 if (!(BIT(i) & pkt.word_en)) {
313 if (efuse_one_byte_read(padapter, addr,
314 &value) == true)
315 pkt.data[i*2] = value;
316 else
317 return false;
318 if (efuse_one_byte_read(padapter, addr + 1,
319 &value) == true)
320 pkt.data[i*2 + 1] = value;
321 else
322 return false;
323 }
324 addr += 2;
325 }
326 }
327 if (addr != header_addr)
328 return false;
329 addr++;
330 /* fill original data */
331 for (i = 0; i < PGPKG_MAX_WORDS; i++) {
332 if (BIT(i) & pkt.word_en)
333 continue;
334 efuse_one_byte_write(padapter, addr, pkt.data[i*2]);
335 efuse_one_byte_write(padapter, addr+1, pkt.data[i*2 + 1]);
336 /* additional check */
337 if (efuse_one_byte_read(padapter, addr, &value) == false)
338 ret = false;
339 else if (pkt.data[i*2] != value) {
340 ret = false;
341 if (0xFF == value) /* write again */
342 efuse_one_byte_write(padapter, addr,
343 pkt.data[i * 2]);
344 }
345 if (efuse_one_byte_read(padapter, addr+1, &value) == false)
346 ret = false;
347 else if (pkt.data[i*2 + 1] != value) {
348 ret = false;
349 if (0xFF == value) /* write again */
350 efuse_one_byte_write(padapter, addr+1,
351 pkt.data[i*2 + 1]);
352 }
353 addr += 2;
354 }
355 return ret;
356}
357
358u8 r8712_efuse_pg_packet_write(struct _adapter *padapter, const u8 offset,
359 const u8 word_en, const u8 *data)
360{
361 u8 pg_header = 0;
362 u16 efuse_addr = 0, curr_size = 0;
363 u8 efuse_data, target_word_cnts = 0;
364 static int repeat_times;
365 int sub_repeat;
366 u8 bResult = true;
367
368 /* check if E-Fuse Clock Enable and E-Fuse Clock is 40M */
369 efuse_data = r8712_read8(padapter, EFUSE_CLK_CTRL);
370 if (efuse_data != 0x03)
371 return false;
372 pg_header = MAKE_EFUSE_HEADER(offset, word_en);
373 target_word_cnts = calculate_word_cnts(word_en);
374 repeat_times = 0;
375 efuse_addr = 0;
376 while (efuse_addr < efuse_available_max_size) {
377 curr_size = r8712_efuse_get_current_size(padapter);
378 if ((curr_size + 1 + target_word_cnts * 2) >
379 efuse_available_max_size)
380 return false; /*target_word_cnts + pg header(1 byte)*/
381 efuse_addr = curr_size; /* current size is also the last addr*/
382 efuse_one_byte_write(padapter, efuse_addr, pg_header); /*hdr*/
383 sub_repeat = 0;
384 /* check if what we read is what we write */
385 while (efuse_one_byte_read(padapter, efuse_addr,
386 &efuse_data) == false) {
387 if (++sub_repeat > _REPEAT_THRESHOLD_) {
388 bResult = false; /* continue to blind write */
389 break; /* continue to blind write */
390 }
391 }
392 if ((sub_repeat > _REPEAT_THRESHOLD_) ||
393 (pg_header == efuse_data)) {
394 /* write header ok OR can't check header(creep) */
395 u8 i;
396
397 /* go to next address */
398 efuse_addr++;
399 for (i = 0; i < target_word_cnts*2; i++) {
400 efuse_one_byte_write(padapter,
401 efuse_addr + i,
402 *(data + i));
403 if (efuse_one_byte_read(padapter,
404 efuse_addr + i, &efuse_data) == false)
405 bResult = false;
406 else if (*(data+i) != efuse_data) /* fail */
407 bResult = false;
408 }
409 break;
410 } else { /* write header fail */
411 bResult = false;
412 if (0xFF == efuse_data)
413 return bResult; /* not thing damaged. */
414 /* call rescue procedure */
415 if (fix_header(padapter, efuse_data, efuse_addr) ==
416 false)
417 return false; /* rescue fail */
418
419 if (++repeat_times > _REPEAT_THRESHOLD_) /* fail */
420 break;
421 /* otherwise, take another risk... */
422 }
423 }
424 return bResult;
425}
426
427u8 r8712_efuse_access(struct _adapter *padapter, u8 bRead, u16 start_addr,
428 u16 cnts, u8 *data)
429{
430 int i;
431 u8 res = true;;
432
433 if (start_addr > EFUSE_MAX_SIZE)
434 return false;
435 if ((bRead == false) && ((start_addr + cnts) >
436 efuse_available_max_size))
437 return false;
438 if ((false == bRead) && (r8712_efuse_reg_init(padapter) == false))
439 return false;
440 /* -----------------e-fuse one byte read / write ---------------------*/
441 for (i = 0; i < cnts; i++) {
442 if ((start_addr + i) > EFUSE_MAX_SIZE) {
443 res = false;
444 break;
445 }
446 res = efuse_one_byte_rw(padapter, bRead, start_addr + i,
447 data + i);
448 if ((false == bRead) && (false == res))
449 break;
450 }
451 if (false == bRead)
452 r8712_efuse_reg_uninit(padapter);
453 return res;
454}
455
456u8 r8712_efuse_map_read(struct _adapter *padapter, u16 addr, u16 cnts, u8 *data)
457{
458 u8 offset, ret = true;
459 u8 pktdata[PGPKT_DATA_SIZE];
460 int i, idx;
461
462 if ((addr + cnts) > EFUSE_MAP_MAX_SIZE)
463 return false;
464 if ((efuse_is_empty(padapter, &offset) == true) && (offset ==
465 true)) {
466 for (i = 0; i < cnts; i++)
467 data[i] = 0xFF;
468 return ret;
469 }
470 offset = (addr >> 3) & 0xF;
471 ret = r8712_efuse_pg_packet_read(padapter, offset, pktdata);
472 i = addr & 0x7; /* pktdata index */
473 idx = 0; /* data index */
474
475 do {
476 for (; i < PGPKT_DATA_SIZE; i++) {
477 data[idx++] = pktdata[i];
478 if (idx == cnts)
479 return ret;
480 }
481 offset++;
482 if (!r8712_efuse_pg_packet_read(padapter, offset, pktdata))
483 ret = false;
484 i = 0;
485 } while (1);
486 return ret;
487}
488
489u8 r8712_efuse_map_write(struct _adapter *padapter, u16 addr, u16 cnts,
490 u8 *data)
491{
492 u8 offset, word_en, empty;
493 u8 pktdata[PGPKT_DATA_SIZE], newdata[PGPKT_DATA_SIZE];
494 int i, j, idx;
495
496 if ((addr + cnts) > EFUSE_MAP_MAX_SIZE)
497 return false;
498 /* check if E-Fuse Clock Enable and E-Fuse Clock is 40M */
499 empty = r8712_read8(padapter, EFUSE_CLK_CTRL);
500 if (empty != 0x03)
501 return false;
502 if (efuse_is_empty(padapter, &empty) == true) {
503 if (true == empty)
504 memset(pktdata, 0xFF, PGPKT_DATA_SIZE);
505 } else
506 return false;
507 offset = (addr >> 3) & 0xF;
508 if (empty == false)
509 if (!r8712_efuse_pg_packet_read(padapter, offset, pktdata))
510 return false;
511 word_en = 0xF;
512 memset(newdata, 0xFF, PGPKT_DATA_SIZE);
513 i = addr & 0x7; /* pktdata index */
514 j = 0; /* newdata index */
515 idx = 0; /* data index */
516
517 if (i & 0x1) {
518 /* odd start */
519 if (data[idx] != pktdata[i]) {
520 word_en &= ~BIT(i >> 1);
521 newdata[j++] = pktdata[i - 1];
522 newdata[j++] = data[idx];
523 }
524 i++;
525 idx++;
526 }
527 do {
528 for (; i < PGPKT_DATA_SIZE; i += 2) {
529 if ((cnts - idx) == 1) {
530 if (data[idx] != pktdata[i]) {
531 word_en &= ~BIT(i >> 1);
532 newdata[j++] = data[idx];
533 newdata[j++] = pktdata[1 + 1];
534 }
535 idx++;
536 break;
537 } else {
538 if ((data[idx] != pktdata[i]) || (data[idx+1] !=
539 pktdata[i+1])) {
540 word_en &= ~BIT(i >> 1);
541 newdata[j++] = data[idx];
542 newdata[j++] = data[idx + 1];
543 }
544 idx += 2;
545 }
546 if (idx == cnts)
547 break;
548 }
549
550 if (word_en != 0xF)
551 if (r8712_efuse_pg_packet_write(padapter, offset,
552 word_en, newdata) == false)
553 return false;
554 if (idx == cnts)
555 break;
556 offset++;
557 if (empty == false)
558 if (!r8712_efuse_pg_packet_read(padapter, offset,
559 pktdata))
560 return false;
561 i = 0;
562 j = 0;
563 word_en = 0xF;
564 memset(newdata, 0xFF, PGPKT_DATA_SIZE);
565 } while (1);
566
567 return true;
568}
diff --git a/drivers/staging/rtl8712/rtl8712_efuse.h b/drivers/staging/rtl8712/rtl8712_efuse.h
new file mode 100644
index 00000000000..6a64f91ad75
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_efuse.h
@@ -0,0 +1,43 @@
1#ifndef __RTL8712_EFUSE_H__
2#define __RTL8712_EFUSE_H__
3
4#include "osdep_service.h"
5
6
7#define _REPEAT_THRESHOLD_ 3
8
9#define EFUSE_MAX_SIZE 512
10#define EFUSE_MAP_MAX_SIZE 128
11
12#define PGPKG_MAX_WORDS 4
13#define PGPKT_DATA_SIZE 8 /* PGPKG_MAX_WORDS*2; BYTES sizeof(u8)*8*/
14#define MAX_PGPKT_SIZE 9 /* 1 + PGPKT_DATA_SIZE; header + 2 * 4 words (BYTES)*/
15
16#define GET_EFUSE_OFFSET(header) ((header & 0xF0) >> 4)
17#define GET_EFUSE_WORD_EN(header) (header & 0x0F)
18#define MAKE_EFUSE_HEADER(offset, word_en) (((offset & 0x0F) << 4) | \
19 (word_en & 0x0F))
20/*--------------------------------------------------------------------------*/
21struct PGPKT_STRUCT {
22 u8 offset;
23 u8 word_en;
24 u8 data[PGPKT_DATA_SIZE];
25};
26/*--------------------------------------------------------------------------*/
27u8 r8712_efuse_reg_init(struct _adapter *padapter);
28void r8712_efuse_reg_uninit(struct _adapter *padapter);
29u16 r8712_efuse_get_current_size(struct _adapter *padapter);
30int r8712_efuse_get_max_size(struct _adapter *padapter);
31void r8712_efuse_change_max_size(struct _adapter *padapter);
32u8 r8712_efuse_pg_packet_read(struct _adapter *padapter,
33 u8 offset, u8 *data);
34u8 r8712_efuse_pg_packet_write(struct _adapter *padapter,
35 const u8 offset, const u8 word_en,
36 const u8 *data);
37u8 r8712_efuse_access(struct _adapter *padapter, u8 bRead,
38 u16 start_addr, u16 cnts, u8 *data);
39u8 r8712_efuse_map_read(struct _adapter *padapter, u16 addr,
40 u16 cnts, u8 *data);
41u8 r8712_efuse_map_write(struct _adapter *padapter, u16 addr,
42 u16 cnts, u8 *data);
43#endif
diff --git a/drivers/staging/rtl8712/rtl8712_event.h b/drivers/staging/rtl8712/rtl8712_event.h
new file mode 100644
index 00000000000..48408f72546
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_event.h
@@ -0,0 +1,73 @@
1#ifndef _RTL8712_EVENT_H_
2#define _RTL8712_EVENT_H_
3
4void r8712_event_handle(struct _adapter *padapter, uint *peventbuf);
5void r8712_got_addbareq_event_callback(struct _adapter *adapter , u8 *pbuf);
6
7enum rtl8712_c2h_event {
8 GEN_EVT_CODE(_Read_MACREG) = 0, /*0*/
9 GEN_EVT_CODE(_Read_BBREG),
10 GEN_EVT_CODE(_Read_RFREG),
11 GEN_EVT_CODE(_Read_EEPROM),
12 GEN_EVT_CODE(_Read_EFUSE),
13 GEN_EVT_CODE(_Read_CAM), /*5*/
14 GEN_EVT_CODE(_Get_BasicRate),
15 GEN_EVT_CODE(_Get_DataRate),
16 GEN_EVT_CODE(_Survey), /*8*/
17 GEN_EVT_CODE(_SurveyDone), /*9*/
18
19 GEN_EVT_CODE(_JoinBss) , /*10*/
20 GEN_EVT_CODE(_AddSTA),
21 GEN_EVT_CODE(_DelSTA),
22 GEN_EVT_CODE(_AtimDone) ,
23 GEN_EVT_CODE(_TX_Report),
24 GEN_EVT_CODE(_CCX_Report), /*15*/
25 GEN_EVT_CODE(_DTM_Report),
26 GEN_EVT_CODE(_TX_Rate_Statistics),
27 GEN_EVT_CODE(_C2HLBK),
28 GEN_EVT_CODE(_FWDBG),
29 GEN_EVT_CODE(_C2HFEEDBACK), /*20*/
30 GEN_EVT_CODE(_ADDBA),
31 GEN_EVT_CODE(_C2HBCN),
32 GEN_EVT_CODE(_ReportPwrState), /*filen: only for PCIE, USB*/
33 GEN_EVT_CODE(_WPS_PBC), /*24*/
34 GEN_EVT_CODE(_ADDBAReq_Report), /*25*/
35 MAX_C2HEVT
36};
37
38
39#ifdef _RTL8712_CMD_C_
40
41static struct fwevent wlanevents[] = {
42 {0, NULL}, /*0*/
43 {0, NULL},
44 {0, NULL},
45 {0, NULL},
46 {0, NULL},
47 {0, NULL},
48 {0, NULL},
49 {0, NULL},
50 {0, &r8712_survey_event_callback}, /*8*/
51 {sizeof(struct surveydone_event), &r8712_surveydone_event_callback},/*9*/
52
53 {0, &r8712_joinbss_event_callback}, /*10*/
54 {sizeof(struct stassoc_event), &r8712_stassoc_event_callback},
55 {sizeof(struct stadel_event), &r8712_stadel_event_callback},
56 {0, &r8712_atimdone_event_callback},
57 {0, NULL},
58 {0, NULL}, /*15*/
59 {0, NULL},
60 {0, NULL},
61 {0, NULL},
62 {0, NULL}, /*fwdbg_event_callback},*/
63 {0, NULL}, /*20*/
64 {0, NULL},
65 {0, NULL},
66 {0, &r8712_cpwm_event_callback},
67 {0, &r8712_wpspbc_event_callback},
68 {0, &r8712_got_addbareq_event_callback},
69};
70
71#endif/*_RTL8712_CMD_C_*/
72
73#endif
diff --git a/drivers/staging/rtl8712/rtl8712_fifoctrl_bitdef.h b/drivers/staging/rtl8712/rtl8712_fifoctrl_bitdef.h
new file mode 100644
index 00000000000..e5df19f4b02
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_fifoctrl_bitdef.h
@@ -0,0 +1,126 @@
1#ifndef __RTL8712_FIFOCTRL_BITDEF_H__
2#define __RTL8712_FIFOCTRL_BITDEF_H__
3
4/*PBP*/
5#define _PSTX_MSK 0xF0
6#define _PSTX_SHT 4
7#define _PSRX_MSK 0x0F
8#define _PSRX_SHT 0
9
10/*TXFF_STATUS*/
11#define _TXSTATUS_OVF BIT(15)
12
13/*RXFF_STATUS*/
14#define _STATUSFF1_OVF BIT(7)
15#define _STATUSFF1_EMPTY BIT(6)
16#define _STATUSFF0_OVF BIT(5)
17#define _STATUSFF0_EMPTY BIT(4)
18#define _RXFF1_OVF BIT(3)
19#define _RXFF1_EMPTY BIT(2)
20#define _RXFF0_OVF BIT(1)
21#define _RXFF0_EMPTY BIT(0)
22
23/*TXFF_EMPTY_TH*/
24#define _BKQ_EMPTY_TH_MSK 0x0F0000
25#define _BKQ_EMPTY_TH_SHT 16
26#define _BEQ_EMPTY_TH_MSK 0x00F000
27#define _BEQ_EMPTY_TH_SHT 12
28#define _VIQ_EMPTY_TH_MSK 0x000F00
29#define _VIQ_EMPTY_TH_SHT 8
30#define _VOQ_EMPTY_TH_MSK 0x0000F0
31#define _VOQ_EMPTY_TH_SHT 4
32#define _BMCQ_EMPTY_TH_MSK 0x00000F
33#define _BMCQ_EMPTY_TH_SHT 0
34
35/*SDIO_RX_BLKSZ*/
36#define _SDIO_RX_BLKSZ_MSK 0x07
37
38/*RXDMA_CTRL*/
39#define _C2HFF_POLL BIT(4)
40#define _RXPKT_POLL BIT(0)
41
42/*RXPKT_NUM*/
43#define _RXCMD_NUM_MSK 0xFF00
44#define _RXCMD_NUM_SHT 8
45#define _RXFF0_NUM_MSK 0x00FF
46#define _RXFF0_NUM_SHT 0
47
48/*FIFOPAGE2*/
49#define _PUB_AVAL_PG_MSK 0xFFFF0000
50#define _PUB_AVAL_PG_SHT 16
51#define _BCN_AVAL_PG_MSK 0x0000FFFF
52#define _BCN_AVAL_PG_SHT 0
53
54/*RX0PKTNUM*/
55#define _RXFF0_DEC_POLL BIT(15)
56#define _RXFF0_PKT_DEC_NUM_MSK 0x3F00
57#define _RXFF0_PKT_DEC_NUM_SHT 8
58#define _RXFF0_PKTNUM_RPT_MSK 0x00FF
59#define _RXFF0_PKTNUM_RPT_SHT 0
60
61/*RX1PKTNUM*/
62#define _RXFF1_DEC_POLL BIT(15)
63#define _RXFF1_PKT_DEC_NUM_MSK 0x3F00
64#define _RXFF1_PKT_DEC_NUM_SHT 8
65#define _RXFF1_PKTNUM_RPT_MSK 0x00FF
66#define _RXFF1_PKTNUM_RPT_SHT 0
67
68/*RXFLTMAP0*/
69#define _MGTFLT13EN BIT(13)
70#define _MGTFLT12EN BIT(12)
71#define _MGTFLT11EN BIT(11)
72#define _MGTFLT10EN BIT(10)
73#define _MGTFLT9EN BIT(9)
74#define _MGTFLT8EN BIT(8)
75#define _MGTFLT5EN BIT(5)
76#define _MGTFLT4EN BIT(4)
77#define _MGTFLT3EN BIT(3)
78#define _MGTFLT2EN BIT(2)
79#define _MGTFLT1EN BIT(1)
80#define _MGTFLT0EN BIT(0)
81
82/*RXFLTMAP1*/
83#define _CTRLFLT15EN BIT(15)
84#define _CTRLFLT14EN BIT(14)
85#define _CTRLFLT13EN BIT(13)
86#define _CTRLFLT12EN BIT(12)
87#define _CTRLFLT11EN BIT(11)
88#define _CTRLFLT10EN BIT(10)
89#define _CTRLFLT9EN BIT(9)
90#define _CTRLFLT8EN BIT(8)
91#define _CTRLFLT7EN BIT(7)
92#define _CTRLFLT6EN BIT(6)
93
94/*RXFLTMAP2*/
95#define _DATAFLT15EN BIT(15)
96#define _DATAFLT14EN BIT(14)
97#define _DATAFLT13EN BIT(13)
98#define _DATAFLT12EN BIT(12)
99#define _DATAFLT11EN BIT(11)
100#define _DATAFLT10EN BIT(10)
101#define _DATAFLT9EN BIT(9)
102#define _DATAFLT8EN BIT(8)
103#define _DATAFLT7EN BIT(7)
104#define _DATAFLT6EN BIT(6)
105#define _DATAFLT5EN BIT(5)
106#define _DATAFLT4EN BIT(4)
107#define _DATAFLT3EN BIT(3)
108#define _DATAFLT2EN BIT(2)
109#define _DATAFLT1EN BIT(1)
110#define _DATAFLT0EN BIT(0)
111
112/*RXFLTMAP3*/
113#define _MESHAFLT1EN BIT(1)
114#define _MESHAFLT0EN BIT(0)
115
116/*TXPKT_NUM_CTRL*/
117#define _TXPKTNUM_DEC BIT(8)
118#define _TXPKTNUM_MSK 0x00FF
119#define _TXPKTNUM_SHT 0
120
121/*TXFF_PG_NUM*/
122#define _TXFF_PG_NUM_MSK 0x0FFF
123
124
125#endif /* __RTL8712_FIFOCTRL_BITDEF_H__ */
126
diff --git a/drivers/staging/rtl8712/rtl8712_fifoctrl_regdef.h b/drivers/staging/rtl8712/rtl8712_fifoctrl_regdef.h
new file mode 100644
index 00000000000..c2e3af2c79f
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_fifoctrl_regdef.h
@@ -0,0 +1,57 @@
1#ifndef __RTL8712_FIFOCTRL_REGDEF_H__
2#define __RTL8712_FIFOCTRL_REGDEF_H__
3
4#define RQPN (RTL8712_FIFOCTRL_ + 0x00)
5#define RXFF_BNDY (RTL8712_FIFOCTRL_ + 0x0C)
6#define RXRPT_BNDY (RTL8712_FIFOCTRL_ + 0x10)
7#define TXPKTBUF_PGBNDY (RTL8712_FIFOCTRL_ + 0x14)
8#define PBP (RTL8712_FIFOCTRL_ + 0x15)
9#define RX_DRVINFO_SZ (RTL8712_FIFOCTRL_ + 0x16)
10#define TXFF_STATUS (RTL8712_FIFOCTRL_ + 0x17)
11#define RXFF_STATUS (RTL8712_FIFOCTRL_ + 0x18)
12#define TXFF_EMPTY_TH (RTL8712_FIFOCTRL_ + 0x19)
13#define SDIO_RX_BLKSZ (RTL8712_FIFOCTRL_ + 0x1C)
14#define RXDMA_RXCTRL (RTL8712_FIFOCTRL_ + 0x1D)
15#define RXPKT_NUM (RTL8712_FIFOCTRL_ + 0x1E)
16#define RXPKT_NUM_C2H (RTL8712_FIFOCTRL_ + 0x1F)
17#define C2HCMD_UDT_SIZE (RTL8712_FIFOCTRL_ + 0x20)
18#define C2HCMD_UDT_ADDR (RTL8712_FIFOCTRL_ + 0x22)
19#define FIFOPAGE2 (RTL8712_FIFOCTRL_ + 0x24)
20#define FIFOPAGE1 (RTL8712_FIFOCTRL_ + 0x28)
21#define FW_RSVD_PG_CTRL (RTL8712_FIFOCTRL_ + 0x30)
22#define TXRPTFF_RDPTR (RTL8712_FIFOCTRL_ + 0x40)
23#define TXRPTFF_WTPTR (RTL8712_FIFOCTRL_ + 0x44)
24#define C2HFF_RDPTR (RTL8712_FIFOCTRL_ + 0x48)
25#define C2HFF_WTPTR (RTL8712_FIFOCTRL_ + 0x4C)
26#define RXFF0_RDPTR (RTL8712_FIFOCTRL_ + 0x50)
27#define RXFF0_WTPTR (RTL8712_FIFOCTRL_ + 0x54)
28#define RXFF1_RDPTR (RTL8712_FIFOCTRL_ + 0x58)
29#define RXFF1_WTPTR (RTL8712_FIFOCTRL_ + 0x5C)
30#define RXRPT0FF_RDPTR (RTL8712_FIFOCTRL_ + 0x60)
31#define RXRPT0FF_WTPTR (RTL8712_FIFOCTRL_ + 0x64)
32#define RXRPT1FF_RDPTR (RTL8712_FIFOCTRL_ + 0x68)
33#define RXRPT1FF_WTPTR (RTL8712_FIFOCTRL_ + 0x6C)
34#define RX0PKTNUM (RTL8712_FIFOCTRL_ + 0x72)
35#define RX1PKTNUM (RTL8712_FIFOCTRL_ + 0x74)
36#define RXFLTMAP0 (RTL8712_FIFOCTRL_ + 0x76)
37#define RXFLTMAP1 (RTL8712_FIFOCTRL_ + 0x78)
38#define RXFLTMAP2 (RTL8712_FIFOCTRL_ + 0x7A)
39#define RXFLTMAP3 (RTL8712_FIFOCTRL_ + 0x7c)
40#define TBDA (RTL8712_FIFOCTRL_ + 0x84)
41#define THPDA (RTL8712_FIFOCTRL_ + 0x88)
42#define TCDA (RTL8712_FIFOCTRL_ + 0x8C)
43#define TMDA (RTL8712_FIFOCTRL_ + 0x90)
44#define HDA (RTL8712_FIFOCTRL_ + 0x94)
45#define TVODA (RTL8712_FIFOCTRL_ + 0x98)
46#define TVIDA (RTL8712_FIFOCTRL_ + 0x9C)
47#define TBEDA (RTL8712_FIFOCTRL_ + 0xA0)
48#define TBKDA (RTL8712_FIFOCTRL_ + 0xA4)
49#define RCDA (RTL8712_FIFOCTRL_ + 0xA8)
50#define RDSA (RTL8712_FIFOCTRL_ + 0xAC)
51#define TXPKT_NUM_CTRL (RTL8712_FIFOCTRL_ + 0xB0)
52#define TXQ_PGADD (RTL8712_FIFOCTRL_ + 0xB3)
53#define TXFF_PG_NUM (RTL8712_FIFOCTRL_ + 0xB4)
54
55
56
57#endif /* __RTL8712_FIFOCTRL_REGDEF_H__ */
diff --git a/drivers/staging/rtl8712/rtl8712_gp_bitdef.h b/drivers/staging/rtl8712/rtl8712_gp_bitdef.h
new file mode 100644
index 00000000000..35ca809e179
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_gp_bitdef.h
@@ -0,0 +1,54 @@
1#ifndef __RTL8712_GP_BITDEF_H__
2#define __RTL8712_GP_BITDEF_H__
3
4/*GPIO_CTRL*/
5#define _GPIO_MOD_MSK 0xFF000000
6#define _GPIO_MOD_SHT 24
7#define _GPIO_IO_SEL_MSK 0x00FF0000
8#define _GPIO_IO_SEL_SHT 16
9#define _GPIO_OUT_MSK 0x0000FF00
10#define _GPIO_OUT_SHT 8
11#define _GPIO_IN_MSK 0x000000FF
12#define _GPIO_IN_SHT 0
13
14/*SYS_PINMUX_CFG*/
15#define _GPIOSEL_MSK 0x0003
16#define _GPIOSEL_SHT 0
17
18/*LED_CFG*/
19#define _LED1SV BIT(7)
20#define _LED1CM_MSK 0x0070
21#define _LED1CM_SHT 4
22#define _LED0SV BIT(3)
23#define _LED0CM_MSK 0x0007
24#define _LED0CM_SHT 0
25
26/*PHY_REG*/
27#define _HST_RDRDY_SHT 0
28#define _HST_RDRDY_MSK 0xFF
29#define _HST_RDRDY BIT(_HST_RDRDY_SHT)
30#define _CPU_WTBUSY_SHT 1
31#define _CPU_WTBUSY_MSK 0xFF
32#define _CPU_WTBUSY BIT(_CPU_WTBUSY_SHT)
33
34/* 11. General Purpose Registers (Offset: 0x02E0 - 0x02FF)*/
35
36/* 8192S GPIO Config Setting (offset 0x2F1, 1 byte)*/
37
38/*----------------------------------------------------------------------------*/
39
40#define GPIOMUX_EN BIT(3) /* When this bit is set to "1",
41 * GPIO PINs will switch to MAC
42 * GPIO Function*/
43#define GPIOSEL_GPIO 0 /* UART or JTAG or pure GPIO*/
44#define GPIOSEL_PHYDBG 1 /* PHYDBG*/
45#define GPIOSEL_BT 2 /* BT_coex*/
46#define GPIOSEL_WLANDBG 3 /* WLANDBG*/
47#define GPIOSEL_GPIO_MASK (~(BIT(0)|BIT(1)))
48/* HW Readio OFF switch (GPIO BIT) */
49#define HAL_8192S_HW_GPIO_OFF_BIT BIT(3)
50#define HAL_8192S_HW_GPIO_OFF_MASK 0xF7
51#define HAL_8192S_HW_GPIO_WPS_BIT BIT(4)
52
53#endif /*__RTL8712_GP_BITDEF_H__*/
54
diff --git a/drivers/staging/rtl8712/rtl8712_gp_regdef.h b/drivers/staging/rtl8712/rtl8712_gp_regdef.h
new file mode 100644
index 00000000000..17e72bda617
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_gp_regdef.h
@@ -0,0 +1,17 @@
1#ifndef __RTL8712_GP_REGDEF_H__
2#define __RTL8712_GP_REGDEF_H__
3
4#define PSTIMER (RTL8712_GP_ + 0x00)
5#define TIMER1 (RTL8712_GP_ + 0x04)
6#define TIMER2 (RTL8712_GP_ + 0x08)
7#define GPIO_CTRL (RTL8712_GP_ + 0x0C)
8#define GPIO_IO_SEL (RTL8712_GP_ + 0x0E)
9#define GPIO_INTCTRL (RTL8712_GP_ + 0x10)
10#define MAC_PINMUX_CTRL (RTL8712_GP_ + 0x11)
11#define LEDCFG (RTL8712_GP_ + 0x12)
12#define PHY_REG_RPT (RTL8712_GP_ + 0x13)
13#define PHY_REG_DATA (RTL8712_GP_ + 0x14)
14
15
16#endif /*__RTL8712_GP_REGDEF_H__ */
17
diff --git a/drivers/staging/rtl8712/rtl8712_hal.h b/drivers/staging/rtl8712/rtl8712_hal.h
new file mode 100644
index 00000000000..13df2001e9a
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_hal.h
@@ -0,0 +1,124 @@
1#ifndef __RTL8712_HAL_H__
2#define __RTL8712_HAL_H__
3
4enum _HW_VERSION {
5 RTL8712_FPGA,
6 RTL8712_1stCUT, /*A Cut (RTL8712_ASIC)*/
7 RTL8712_2ndCUT, /*B Cut*/
8 RTL8712_3rdCUT, /*C Cut*/
9};
10
11enum _LOOPBACK_TYPE {
12 RTL8712_AIR_TRX = 0,
13 RTL8712_MAC_LBK,
14 RTL8712_BB_LBK,
15 RTL8712_MAC_FW_LBK = 4,
16 RTL8712_BB_FW_LBK = 8,
17};
18
19enum RTL871X_HCI_TYPE {
20 RTL8712_SDIO,
21 RTL8712_USB,
22};
23
24enum RTL8712_RF_CONFIG{
25 RTL8712_RF_1T1R,
26 RTL8712_RF_1T2R,
27 RTL8712_RF_2T2R
28};
29
30enum _RTL8712_HCI_TYPE_{
31 RTL8712_HCI_TYPE_PCIE = 0x01,
32 RTL8712_HCI_TYPE_AP_PCIE = 0x81,
33 RTL8712_HCI_TYPE_USB = 0x02,
34 RTL8712_HCI_TYPE_92USB = 0x02,
35 RTL8712_HCI_TYPE_AP_USB = 0x82,
36 RTL8712_HCI_TYPE_72USB = 0x12,
37 RTL8712_HCI_TYPE_SDIO = 0x04,
38 RTL8712_HCI_TYPE_72SDIO = 0x14
39};
40
41struct fw_priv { /*8-bytes alignment required*/
42 /*--- long word 0 ----*/
43 unsigned char signature_0; /*0x12: CE product, 0x92: IT product*/
44 unsigned char signature_1; /*0x87: CE product, 0x81: IT product*/
45 unsigned char hci_sel; /*0x81: PCI-AP, 01:PCIe, 02: 92S-U, 0x82: USB-AP,
46 * 0x12: 72S-U, 03:SDIO*/
47 unsigned char chip_version; /*the same value as register value*/
48 unsigned char customer_ID_0; /*customer ID low byte*/
49 unsigned char customer_ID_1; /*customer ID high byte*/
50 unsigned char rf_config; /*0x11: 1T1R, 0x12: 1T2R, 0x92: 1T2R turbo,
51 * 0x22: 2T2R*/
52 unsigned char usb_ep_num; /* 4: 4EP, 6: 6EP, 11: 11EP*/
53 /*--- long word 1 ----*/
54 unsigned char regulatory_class_0; /*regulatory class bit map 0*/
55 unsigned char regulatory_class_1; /*regulatory class bit map 1*/
56 unsigned char regulatory_class_2; /*regulatory class bit map 2*/
57 unsigned char regulatory_class_3; /*regulatory class bit map 3*/
58 unsigned char rfintfs; /* 0:SWSI, 1:HWSI, 2:HWPI*/
59 unsigned char def_nettype;
60 unsigned char turboMode;
61 unsigned char lowPowerMode;/* 0: noral mode, 1: low power mode*/
62 /*--- long word 2 ----*/
63 unsigned char lbk_mode; /*0x00: normal, 0x03: MACLBK, 0x01: PHYLBK*/
64 unsigned char mp_mode; /* 1: for MP use, 0: for normal driver */
65 unsigned char vcsType; /* 0:off 1:on 2:auto */
66 unsigned char vcsMode; /* 1:RTS/CTS 2:CTS to self */
67 unsigned char rsvd022;
68 unsigned char rsvd023;
69 unsigned char rsvd024;
70 unsigned char rsvd025;
71 /*--- long word 3 ----*/
72 unsigned char qos_en; /*1: QoS enable*/
73 unsigned char bw_40MHz_en; /*1: 40MHz BW enable*/
74 unsigned char AMSDU2AMPDU_en; /*1: 4181 convert AMSDU to AMPDU,
75 * 0: disable*/
76 unsigned char AMPDU_en; /*1: 11n AMPDU enable*/
77 unsigned char rate_control_offload; /*1: FW offloads, 0: driver handles*/
78 unsigned char aggregation_offload; /*1: FW offloads, 0: driver handles*/
79 unsigned char rsvd030;
80 unsigned char rsvd031;
81 /*--- long word 4 ----*/
82 unsigned char beacon_offload; /* 1. FW offloads, 0: driver handles*/
83 unsigned char MLME_offload; /* 2. FW offloads, 0: driver handles*/
84 unsigned char hwpc_offload; /* 3. FW offloads, 0: driver handles*/
85 unsigned char tcp_checksum_offload; /* 4. FW offloads, 0: driver handles*/
86 unsigned char tcp_offload; /* 5. FW offloads, 0: driver handles*/
87 unsigned char ps_control_offload; /* 6. FW offloads, 0: driver handles*/
88 unsigned char WWLAN_offload; /* 7. FW offloads, 0: driver handles*/
89 unsigned char rsvd040;
90 /*--- long word 5 ----*/
91 unsigned char tcp_tx_frame_len_L; /*tcp tx packet length low byte*/
92 unsigned char tcp_tx_frame_len_H; /*tcp tx packet length high byte*/
93 unsigned char tcp_rx_frame_len_L; /*tcp rx packet length low byte*/
94 unsigned char tcp_rx_frame_len_H; /*tcp rx packet length high byte*/
95 unsigned char rsvd050;
96 unsigned char rsvd051;
97 unsigned char rsvd052;
98 unsigned char rsvd053;
99};
100
101struct fw_hdr {/*8-byte alinment required*/
102 unsigned short signature;
103 unsigned short version; /*0x8000 ~ 0x8FFF for FPGA version,
104 *0x0000 ~ 0x7FFF for ASIC version,*/
105 unsigned int dmem_size; /*define the size of boot loader*/
106 unsigned int img_IMEM_size; /*define the size of FW in IMEM*/
107 unsigned int img_SRAM_size; /*define the size of FW in SRAM*/
108 unsigned int fw_priv_sz; /*define the size of DMEM variable*/
109 unsigned short efuse_addr;
110 unsigned short h2ccnd_resp_addr;
111 unsigned int SVNRevision;
112 unsigned int release_time; /*Mon:Day:Hr:Min*/
113 struct fw_priv fwpriv;
114};
115
116struct hal_priv{
117 /*Endpoint handles*/
118 struct net_device *pipehdls_r8712[10];
119 u8 (*hal_bus_init)(struct _adapter *adapter);
120};
121
122uint rtl8712_hal_init(struct _adapter *padapter);
123
124#endif
diff --git a/drivers/staging/rtl8712/rtl8712_interrupt_bitdef.h b/drivers/staging/rtl8712/rtl8712_interrupt_bitdef.h
new file mode 100644
index 00000000000..02f24809814
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_interrupt_bitdef.h
@@ -0,0 +1,39 @@
1#ifndef __RTL8712_INTERRUPT_BITDEF_H__
2#define __RTL8712_INTERRUPT_BITDEF_H__
3
4/*HIMR*/
5/*HISR*/
6#define _CPUERR BIT(29)
7#define _ATIMEND BIT(28)
8#define _TXBCNOK BIT(27)
9#define _TXBCNERR BIT(26)
10#define _BCNDMAINT4 BIT(25)
11#define _BCNDMAINT3 BIT(24)
12#define _BCNDMAINT2 BIT(23)
13#define _BCNDMAINT1 BIT(22)
14#define _BCNDOK4 BIT(21)
15#define _BCNDOK3 BIT(20)
16#define _BCNDOK2 BIT(19)
17#define _BCNDOK1 BIT(18)
18#define _TIMEOUT2 BIT(17)
19#define _TIMEOUT1 BIT(16)
20#define _TXFOVW BIT(15)
21#define _PSTIMEOUT BIT(14)
22#define _BCNDMAINT0 BIT(13)
23#define _FOVW BIT(12)
24#define _RDU BIT(11)
25#define _RXCMDOK BIT(10)
26#define _BCNDOK0 BIT(9)
27#define _HIGHDOK BIT(8)
28#define _COMDOK BIT(7)
29#define _MGTDOK BIT(6)
30#define _HCCADOK BIT(5)
31#define _BKDOK BIT(4)
32#define _BEDOK BIT(3)
33#define _VIDOK BIT(2)
34#define _VODOK BIT(1)
35#define _RXOK BIT(0)
36
37
38#endif /*__RTL8712_INTERRUPT_BITDEF_H__*/
39
diff --git a/drivers/staging/rtl8712/rtl8712_io.c b/drivers/staging/rtl8712/rtl8712_io.c
new file mode 100644
index 00000000000..c7346008def
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_io.c
@@ -0,0 +1,151 @@
1/******************************************************************************
2 * rtl8712_io.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>.
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL8712_IO_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "rtl871x_io.h"
34#include "osdep_intf.h"
35#include "usb_ops.h"
36
37u8 r8712_read8(struct _adapter *adapter, u32 addr)
38{
39 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
40 struct intf_hdl *pintfhdl = &(pio_queue->intf);
41 u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);
42 u8 r_val;
43
44 _read8 = pintfhdl->io_ops._read8;
45 r_val = _read8(pintfhdl, addr);
46 return r_val;
47}
48
49u16 r8712_read16(struct _adapter *adapter, u32 addr)
50{
51 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
52 struct intf_hdl *pintfhdl = &(pio_queue->intf);
53 u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);
54 u16 r_val;
55
56 _read16 = pintfhdl->io_ops._read16;
57 r_val = _read16(pintfhdl, addr);
58 return r_val;
59}
60
61u32 r8712_read32(struct _adapter *adapter, u32 addr)
62{
63 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
64 struct intf_hdl *pintfhdl = &(pio_queue->intf);
65 u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);
66 u32 r_val;
67
68 _read32 = pintfhdl->io_ops._read32;
69 r_val = _read32(pintfhdl, addr);
70 return r_val;
71}
72
73void r8712_write8(struct _adapter *adapter, u32 addr, u8 val)
74{
75 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
76 struct intf_hdl *pintfhdl = &(pio_queue->intf);
77 void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
78
79 _write8 = pintfhdl->io_ops._write8;
80 _write8(pintfhdl, addr, val);
81}
82
83void r8712_write16(struct _adapter *adapter, u32 addr, u16 val)
84{
85 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
86 struct intf_hdl *pintfhdl = &(pio_queue->intf);
87
88 void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
89 _write16 = pintfhdl->io_ops._write16;
90 _write16(pintfhdl, addr, val);
91}
92
93void r8712_write32(struct _adapter *adapter, u32 addr, u32 val)
94{
95 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
96 struct intf_hdl *pintfhdl = (struct intf_hdl *)(&(pio_queue->intf));
97
98 void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
99 _write32 = pintfhdl->io_ops._write32;
100 _write32(pintfhdl, addr, val);
101}
102
103void r8712_read_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
104{
105 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
106 struct intf_hdl *pintfhdl = &(pio_queue->intf);
107
108 void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
109 u8 *pmem);
110 if ((adapter->bDriverStopped == true) ||
111 (adapter->bSurpriseRemoved == true))
112 return;
113 _read_mem = pintfhdl->io_ops._read_mem;
114 _read_mem(pintfhdl, addr, cnt, pmem);
115}
116
117void r8712_write_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
118{
119 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
120 struct intf_hdl *pintfhdl = &(pio_queue->intf);
121 void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
122 u8 *pmem);
123
124 _write_mem = pintfhdl->io_ops._write_mem;
125 _write_mem(pintfhdl, addr, cnt, pmem);
126}
127
128void r8712_read_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
129{
130 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
131 struct intf_hdl *pintfhdl = &(pio_queue->intf);
132
133 u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
134 u8 *pmem);
135 if ((adapter->bDriverStopped == true) ||
136 (adapter->bSurpriseRemoved == true))
137 return;
138 _read_port = pintfhdl->io_ops._read_port;
139 _read_port(pintfhdl, addr, cnt, pmem);
140}
141
142void r8712_write_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
143{
144 struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
145 struct intf_hdl *pintfhdl = &(pio_queue->intf);
146
147 u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
148 u8 *pmem);
149 _write_port = pintfhdl->io_ops._write_port;
150 _write_port(pintfhdl, addr, cnt, pmem);
151}
diff --git a/drivers/staging/rtl8712/rtl8712_led.c b/drivers/staging/rtl8712/rtl8712_led.c
new file mode 100644
index 00000000000..5024ee42b04
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_led.c
@@ -0,0 +1,1815 @@
1/******************************************************************************
2 * rtl8712_led.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#include "drv_types.h"
30
31/*===========================================================================
32 * Constant.
33 *===========================================================================
34
35 *
36 * Default LED behavior.
37 */
38#define LED_BLINK_NORMAL_INTERVAL 100
39#define LED_BLINK_SLOWLY_INTERVAL 200
40#define LED_BLINK_LONG_INTERVAL 400
41
42#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000
43#define LED_BLINK_LINK_INTERVAL_ALPHA 500
44#define LED_BLINK_SCAN_INTERVAL_ALPHA 180
45#define LED_BLINK_FASTER_INTERVAL_ALPHA 50
46#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000
47
48/*===========================================================================
49 * LED object.
50 *===========================================================================
51 */
52enum _LED_STATE_871x{
53 LED_UNKNOWN = 0,
54 LED_ON = 1,
55 LED_OFF = 2,
56 LED_BLINK_NORMAL = 3,
57 LED_BLINK_SLOWLY = 4,
58 LED_POWER_ON_BLINK = 5,
59 LED_SCAN_BLINK = 6, /* LED is blinking during scanning period,
60 * the # of times to blink is depend on time
61 * for scanning. */
62 LED_NO_LINK_BLINK = 7, /* LED is blinking during no link state. */
63 LED_BLINK_StartToBlink = 8,/* Customzied for Sercomm Printer
64 * Server case */
65 LED_BLINK_WPS = 9, /* LED is blinkg during WPS communication */
66 LED_TXRX_BLINK = 10,
67 LED_BLINK_WPS_STOP = 11, /*for ALPHA */
68 LED_BLINK_WPS_STOP_OVERLAP = 12, /*for BELKIN */
69};
70
71/*===========================================================================
72 * Prototype of protected function.
73 *===========================================================================
74 */
75static void BlinkTimerCallback(unsigned long data);
76
77static void BlinkWorkItemCallback(struct work_struct *work);
78/*===========================================================================
79 * LED_819xUsb routines.
80 *===========================================================================
81 *
82 *
83 *
84 * Description:
85 * Initialize an LED_871x object.
86 */
87static void InitLed871x(struct _adapter *padapter, struct LED_871x *pLed,
88 enum LED_PIN_871x LedPin)
89{
90 struct net_device *nic;
91
92 nic = padapter->pnetdev;
93 pLed->padapter = padapter;
94 pLed->LedPin = LedPin;
95 pLed->CurrLedState = LED_OFF;
96 pLed->bLedOn = false;
97 pLed->bLedBlinkInProgress = false;
98 pLed->BlinkTimes = 0;
99 pLed->BlinkingLedState = LED_UNKNOWN;
100 _init_timer(&(pLed->BlinkTimer), nic, BlinkTimerCallback, pLed);
101 _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed);
102}
103
104/*
105 * Description:
106 * DeInitialize an LED_871x object.
107 */
108static void DeInitLed871x(struct LED_871x *pLed)
109{
110 _cancel_timer_ex(&(pLed->BlinkTimer));
111 /* We should reset bLedBlinkInProgress if we cancel
112 * the LedControlTimer, */
113 pLed->bLedBlinkInProgress = false;
114}
115
116/*
117 * Description:
118 * Turn on LED according to LedPin specified.
119 */
120static void SwLedOn(struct _adapter *padapter, struct LED_871x *pLed)
121{
122 u8 LedCfg;
123
124 if ((padapter->bSurpriseRemoved == true) ||
125 (padapter->bDriverStopped == true))
126 return;
127 LedCfg = r8712_read8(padapter, LEDCFG);
128 switch (pLed->LedPin) {
129 case LED_PIN_GPIO0:
130 break;
131 case LED_PIN_LED0:
132 /* SW control led0 on.*/
133 r8712_write8(padapter, LEDCFG, LedCfg&0xf0);
134 break;
135 case LED_PIN_LED1:
136 /* SW control led1 on.*/
137 r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
138 break;
139 default:
140 break;
141 }
142 pLed->bLedOn = true;
143}
144
145/*
146 * Description:
147 * Turn off LED according to LedPin specified.
148 */
149static void SwLedOff(struct _adapter *padapter, struct LED_871x *pLed)
150{
151 u8 LedCfg;
152
153 if ((padapter->bSurpriseRemoved == true) ||
154 (padapter->bDriverStopped == true))
155 return;
156 LedCfg = r8712_read8(padapter, LEDCFG);
157 switch (pLed->LedPin) {
158 case LED_PIN_GPIO0:
159 break;
160 case LED_PIN_LED0:
161 LedCfg &= 0xf0; /* Set to software control.*/
162 r8712_write8(padapter, LEDCFG, (LedCfg|BIT(3)));
163 break;
164 case LED_PIN_LED1:
165 LedCfg &= 0x0f; /* Set to software control.*/
166 r8712_write8(padapter, LEDCFG, (LedCfg|BIT(7)));
167 break;
168 default:
169 break;
170 }
171 pLed->bLedOn = false;
172}
173
174/*===========================================================================
175 * Interface to manipulate LED objects.
176 *===========================================================================
177 *
178 * Description:
179 * Initialize all LED_871x objects.
180 */
181void r8712_InitSwLeds(struct _adapter *padapter)
182{
183 struct led_priv *pledpriv = &(padapter->ledpriv);
184
185 pledpriv->LedControlHandler = LedControl871x;
186 InitLed871x(padapter, &(pledpriv->SwLed0), LED_PIN_LED0);
187 InitLed871x(padapter, &(pledpriv->SwLed1), LED_PIN_LED1);
188}
189
190/* Description:
191 * DeInitialize all LED_819xUsb objects.
192 */
193void r8712_DeInitSwLeds(struct _adapter *padapter)
194{
195 struct led_priv *ledpriv = &(padapter->ledpriv);
196
197 DeInitLed871x(&(ledpriv->SwLed0));
198 DeInitLed871x(&(ledpriv->SwLed1));
199}
200
201/* Description:
202 * Implementation of LED blinking behavior.
203 * It toggle off LED and schedule corresponding timer if necessary.
204 */
205static void SwLedBlink(struct LED_871x *pLed)
206{
207 struct _adapter *padapter = pLed->padapter;
208 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
209 u8 bStopBlinking = false;
210
211 /* Change LED according to BlinkingLedState specified. */
212 if (pLed->BlinkingLedState == LED_ON)
213 SwLedOn(padapter, pLed);
214 else
215 SwLedOff(padapter, pLed);
216 /* Determine if we shall change LED state again. */
217 pLed->BlinkTimes--;
218 switch (pLed->CurrLedState) {
219 case LED_BLINK_NORMAL:
220 if (pLed->BlinkTimes == 0)
221 bStopBlinking = true;
222 break;
223 case LED_BLINK_StartToBlink:
224 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) &&
225 (pmlmepriv->fw_state & WIFI_STATION_STATE))
226 bStopBlinking = true;
227 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) &&
228 ((pmlmepriv->fw_state & WIFI_ADHOC_STATE) ||
229 (pmlmepriv->fw_state & WIFI_ADHOC_MASTER_STATE)))
230 bStopBlinking = true;
231 else if (pLed->BlinkTimes == 0)
232 bStopBlinking = true;
233 break;
234 case LED_BLINK_WPS:
235 if (pLed->BlinkTimes == 0)
236 bStopBlinking = true;
237 break;
238 default:
239 bStopBlinking = true;
240 break;
241 }
242 if (bStopBlinking) {
243 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) &&
244 (pLed->bLedOn == false))
245 SwLedOn(padapter, pLed);
246 else if ((check_fwstate(pmlmepriv, _FW_LINKED) ==
247 true) && pLed->bLedOn == true)
248 SwLedOff(padapter, pLed);
249 pLed->BlinkTimes = 0;
250 pLed->bLedBlinkInProgress = false;
251 } else {
252 /* Assign LED state to toggle. */
253 if (pLed->BlinkingLedState == LED_ON)
254 pLed->BlinkingLedState = LED_OFF;
255 else
256 pLed->BlinkingLedState = LED_ON;
257
258 /* Schedule a timer to toggle LED state. */
259 switch (pLed->CurrLedState) {
260 case LED_BLINK_NORMAL:
261 _set_timer(&(pLed->BlinkTimer),
262 LED_BLINK_NORMAL_INTERVAL);
263 break;
264 case LED_BLINK_SLOWLY:
265 case LED_BLINK_StartToBlink:
266 _set_timer(&(pLed->BlinkTimer),
267 LED_BLINK_SLOWLY_INTERVAL);
268 break;
269 case LED_BLINK_WPS:
270 if (pLed->BlinkingLedState == LED_ON)
271 _set_timer(&(pLed->BlinkTimer),
272 LED_BLINK_LONG_INTERVAL);
273 else
274 _set_timer(&(pLed->BlinkTimer),
275 LED_BLINK_LONG_INTERVAL);
276 break;
277 default:
278 _set_timer(&(pLed->BlinkTimer),
279 LED_BLINK_SLOWLY_INTERVAL);
280 break;
281 }
282 }
283}
284
285static void SwLedBlink1(struct LED_871x *pLed)
286{
287 struct _adapter *padapter = pLed->padapter;
288 struct led_priv *ledpriv = &(padapter->ledpriv);
289 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
290 struct eeprom_priv *peeprompriv = &(padapter->eeprompriv);
291 struct LED_871x *pLed1 = &(ledpriv->SwLed1);
292 u8 bStopBlinking = false;
293
294 if (peeprompriv->CustomerID == RT_CID_819x_CAMEO)
295 pLed = &(ledpriv->SwLed1);
296 /* Change LED according to BlinkingLedState specified. */
297 if (pLed->BlinkingLedState == LED_ON)
298 SwLedOn(padapter, pLed);
299 else
300 SwLedOff(padapter, pLed);
301 if (peeprompriv->CustomerID == RT_CID_DEFAULT) {
302 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
303 if (!pLed1->bSWLedCtrl) {
304 SwLedOn(padapter, pLed1);
305 pLed1->bSWLedCtrl = true;
306 } else if (!pLed1->bLedOn)
307 SwLedOn(padapter, pLed1);
308 } else {
309 if (!pLed1->bSWLedCtrl) {
310 SwLedOff(padapter, pLed1);
311 pLed1->bSWLedCtrl = true;
312 } else if (pLed1->bLedOn)
313 SwLedOff(padapter, pLed1);
314 }
315 }
316 switch (pLed->CurrLedState) {
317 case LED_BLINK_SLOWLY:
318 if (pLed->bLedOn)
319 pLed->BlinkingLedState = LED_OFF;
320 else
321 pLed->BlinkingLedState = LED_ON;
322 _set_timer(&(pLed->BlinkTimer),
323 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
324 break;
325 case LED_BLINK_NORMAL:
326 if (pLed->bLedOn)
327 pLed->BlinkingLedState = LED_OFF;
328 else
329 pLed->BlinkingLedState = LED_ON;
330 _set_timer(&(pLed->BlinkTimer),
331 LED_BLINK_LINK_INTERVAL_ALPHA);
332 break;
333 case LED_SCAN_BLINK:
334 pLed->BlinkTimes--;
335 if (pLed->BlinkTimes == 0)
336 bStopBlinking = true;
337 if (bStopBlinking) {
338 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
339 pLed->bLedLinkBlinkInProgress = true;
340 pLed->CurrLedState = LED_BLINK_NORMAL;
341 if (pLed->bLedOn)
342 pLed->BlinkingLedState = LED_OFF;
343 else
344 pLed->BlinkingLedState = LED_ON;
345 _set_timer(&(pLed->BlinkTimer),
346 LED_BLINK_LINK_INTERVAL_ALPHA);
347 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
348 pLed->bLedNoLinkBlinkInProgress = true;
349 pLed->CurrLedState = LED_BLINK_SLOWLY;
350 if (pLed->bLedOn)
351 pLed->BlinkingLedState = LED_OFF;
352 else
353 pLed->BlinkingLedState = LED_ON;
354 _set_timer(&(pLed->BlinkTimer),
355 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
356 }
357 pLed->bLedScanBlinkInProgress = false;
358 } else {
359 if (pLed->bLedOn)
360 pLed->BlinkingLedState = LED_OFF;
361 else
362 pLed->BlinkingLedState = LED_ON;
363 _set_timer(&(pLed->BlinkTimer),
364 LED_BLINK_SCAN_INTERVAL_ALPHA);
365 }
366 break;
367 case LED_TXRX_BLINK:
368 pLed->BlinkTimes--;
369 if (pLed->BlinkTimes == 0)
370 bStopBlinking = true;
371 if (bStopBlinking) {
372 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
373 pLed->bLedLinkBlinkInProgress = true;
374 pLed->CurrLedState = LED_BLINK_NORMAL;
375 if (pLed->bLedOn)
376 pLed->BlinkingLedState = LED_OFF;
377 else
378 pLed->BlinkingLedState = LED_ON;
379 _set_timer(&(pLed->BlinkTimer),
380 LED_BLINK_LINK_INTERVAL_ALPHA);
381 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
382 pLed->bLedNoLinkBlinkInProgress = true;
383 pLed->CurrLedState = LED_BLINK_SLOWLY;
384 if (pLed->bLedOn)
385 pLed->BlinkingLedState = LED_OFF;
386 else
387 pLed->BlinkingLedState = LED_ON;
388 _set_timer(&(pLed->BlinkTimer),
389 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
390 }
391 pLed->BlinkTimes = 0;
392 pLed->bLedBlinkInProgress = false;
393 } else {
394 if (pLed->bLedOn)
395 pLed->BlinkingLedState = LED_OFF;
396 else
397 pLed->BlinkingLedState = LED_ON;
398 _set_timer(&(pLed->BlinkTimer),
399 LED_BLINK_FASTER_INTERVAL_ALPHA);
400 }
401 break;
402 case LED_BLINK_WPS:
403 if (pLed->bLedOn)
404 pLed->BlinkingLedState = LED_OFF;
405 else
406 pLed->BlinkingLedState = LED_ON;
407 _set_timer(&(pLed->BlinkTimer),
408 LED_BLINK_SCAN_INTERVAL_ALPHA);
409 break;
410 case LED_BLINK_WPS_STOP: /* WPS success */
411 if (pLed->BlinkingLedState == LED_ON) {
412 pLed->BlinkingLedState = LED_OFF;
413 _set_timer(&(pLed->BlinkTimer),
414 LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
415 bStopBlinking = false;
416 } else
417 bStopBlinking = true;
418 if (bStopBlinking) {
419 pLed->bLedLinkBlinkInProgress = true;
420 pLed->CurrLedState = LED_BLINK_NORMAL;
421 if (pLed->bLedOn)
422 pLed->BlinkingLedState = LED_OFF;
423 else
424 pLed->BlinkingLedState = LED_ON;
425 _set_timer(&(pLed->BlinkTimer),
426 LED_BLINK_LINK_INTERVAL_ALPHA);
427 }
428 pLed->bLedWPSBlinkInProgress = false;
429 break;
430 default:
431 break;
432 }
433}
434
435static void SwLedBlink2(struct LED_871x *pLed)
436{
437 struct _adapter *padapter = pLed->padapter;
438 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
439 u8 bStopBlinking = false;
440
441 /* Change LED according to BlinkingLedState specified. */
442 if (pLed->BlinkingLedState == LED_ON)
443 SwLedOn(padapter, pLed);
444 else
445 SwLedOff(padapter, pLed);
446 switch (pLed->CurrLedState) {
447 case LED_SCAN_BLINK:
448 pLed->BlinkTimes--;
449 if (pLed->BlinkTimes == 0)
450 bStopBlinking = true;
451 if (bStopBlinking) {
452 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
453 pLed->CurrLedState = LED_ON;
454 pLed->BlinkingLedState = LED_ON;
455 SwLedOn(padapter, pLed);
456 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
457 pLed->CurrLedState = LED_OFF;
458 pLed->BlinkingLedState = LED_OFF;
459 SwLedOff(padapter, pLed);
460 }
461 pLed->bLedScanBlinkInProgress = false;
462 } else {
463 if (pLed->bLedOn)
464 pLed->BlinkingLedState = LED_OFF;
465 else
466 pLed->BlinkingLedState = LED_ON;
467 _set_timer(&(pLed->BlinkTimer),
468 LED_BLINK_SCAN_INTERVAL_ALPHA);
469 }
470 break;
471 case LED_TXRX_BLINK:
472 pLed->BlinkTimes--;
473 if (pLed->BlinkTimes == 0)
474 bStopBlinking = true;
475 if (bStopBlinking) {
476 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
477 pLed->CurrLedState = LED_ON;
478 pLed->BlinkingLedState = LED_ON;
479 SwLedOn(padapter, pLed);
480 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
481 pLed->CurrLedState = LED_OFF;
482 pLed->BlinkingLedState = LED_OFF;
483 SwLedOff(padapter, pLed);
484 }
485 pLed->bLedBlinkInProgress = false;
486 } else {
487 if (pLed->bLedOn)
488 pLed->BlinkingLedState = LED_OFF;
489 else
490 pLed->BlinkingLedState = LED_ON;
491 _set_timer(&(pLed->BlinkTimer),
492 LED_BLINK_FASTER_INTERVAL_ALPHA);
493 }
494 break;
495 default:
496 break;
497 }
498}
499
500static void SwLedBlink3(struct LED_871x *pLed)
501{
502 struct _adapter *padapter = pLed->padapter;
503 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
504 u8 bStopBlinking = false;
505
506 /* Change LED according to BlinkingLedState specified. */
507 if (pLed->BlinkingLedState == LED_ON)
508 SwLedOn(padapter, pLed);
509 else
510 if (pLed->CurrLedState != LED_BLINK_WPS_STOP)
511 SwLedOff(padapter, pLed);
512 switch (pLed->CurrLedState) {
513 case LED_SCAN_BLINK:
514 pLed->BlinkTimes--;
515 if (pLed->BlinkTimes == 0)
516 bStopBlinking = true;
517 if (bStopBlinking) {
518 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
519 pLed->CurrLedState = LED_ON;
520 pLed->BlinkingLedState = LED_ON;
521 if (!pLed->bLedOn)
522 SwLedOn(padapter, pLed);
523 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
524 pLed->CurrLedState = LED_OFF;
525 pLed->BlinkingLedState = LED_OFF;
526 if (pLed->bLedOn)
527 SwLedOff(padapter, pLed);
528 }
529 pLed->bLedScanBlinkInProgress = false;
530 } else {
531 if (pLed->bLedOn)
532 pLed->BlinkingLedState = LED_OFF;
533 else
534 pLed->BlinkingLedState = LED_ON;
535 _set_timer(&(pLed->BlinkTimer),
536 LED_BLINK_SCAN_INTERVAL_ALPHA);
537 }
538 break;
539 case LED_TXRX_BLINK:
540 pLed->BlinkTimes--;
541 if (pLed->BlinkTimes == 0)
542 bStopBlinking = true;
543 if (bStopBlinking) {
544 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
545 pLed->CurrLedState = LED_ON;
546 pLed->BlinkingLedState = LED_ON;
547 if (!pLed->bLedOn)
548 SwLedOn(padapter, pLed);
549 } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
550 pLed->CurrLedState = LED_OFF;
551 pLed->BlinkingLedState = LED_OFF;
552 if (pLed->bLedOn)
553 SwLedOff(padapter, pLed);
554 }
555 pLed->bLedBlinkInProgress = false;
556 } else {
557 if (pLed->bLedOn)
558 pLed->BlinkingLedState = LED_OFF;
559 else
560 pLed->BlinkingLedState = LED_ON;
561 _set_timer(&(pLed->BlinkTimer),
562 LED_BLINK_FASTER_INTERVAL_ALPHA);
563 }
564 break;
565 case LED_BLINK_WPS:
566 if (pLed->bLedOn)
567 pLed->BlinkingLedState = LED_OFF;
568 else
569 pLed->BlinkingLedState = LED_ON;
570 _set_timer(&(pLed->BlinkTimer),
571 LED_BLINK_SCAN_INTERVAL_ALPHA);
572 break;
573 case LED_BLINK_WPS_STOP: /*WPS success*/
574 if (pLed->BlinkingLedState == LED_ON) {
575 pLed->BlinkingLedState = LED_OFF;
576 _set_timer(&(pLed->BlinkTimer),
577 LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
578 bStopBlinking = false;
579 } else
580 bStopBlinking = true;
581 if (bStopBlinking) {
582 pLed->CurrLedState = LED_ON;
583 pLed->BlinkingLedState = LED_ON;
584 SwLedOn(padapter, pLed);
585 pLed->bLedWPSBlinkInProgress = false;
586 }
587 break;
588 default:
589 break;
590 }
591}
592
593static void SwLedBlink4(struct LED_871x *pLed)
594{
595 struct _adapter *padapter = pLed->padapter;
596 struct led_priv *ledpriv = &(padapter->ledpriv);
597 struct LED_871x *pLed1 = &(ledpriv->SwLed1);
598 u8 bStopBlinking = false;
599
600 /* Change LED according to BlinkingLedState specified. */
601 if (pLed->BlinkingLedState == LED_ON)
602 SwLedOn(padapter, pLed);
603 else
604 SwLedOff(padapter, pLed);
605 if (!pLed1->bLedWPSBlinkInProgress &&
606 pLed1->BlinkingLedState == LED_UNKNOWN) {
607 pLed1->BlinkingLedState = LED_OFF;
608 pLed1->CurrLedState = LED_OFF;
609 SwLedOff(padapter, pLed1);
610 }
611 switch (pLed->CurrLedState) {
612 case LED_BLINK_SLOWLY:
613 if (pLed->bLedOn)
614 pLed->BlinkingLedState = LED_OFF;
615 else
616 pLed->BlinkingLedState = LED_ON;
617 _set_timer(&(pLed->BlinkTimer),
618 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
619 break;
620 case LED_BLINK_StartToBlink:
621 if (pLed->bLedOn) {
622 pLed->BlinkingLedState = LED_OFF;
623 _set_timer(&(pLed->BlinkTimer),
624 LED_BLINK_SLOWLY_INTERVAL);
625 } else {
626 pLed->BlinkingLedState = LED_ON;
627 _set_timer(&(pLed->BlinkTimer),
628 LED_BLINK_NORMAL_INTERVAL);
629 }
630 break;
631 case LED_SCAN_BLINK:
632 pLed->BlinkTimes--;
633 if (pLed->BlinkTimes == 0)
634 bStopBlinking = true;
635 if (bStopBlinking) {
636 pLed->bLedNoLinkBlinkInProgress = true;
637 pLed->CurrLedState = LED_BLINK_SLOWLY;
638 if (pLed->bLedOn)
639 pLed->BlinkingLedState = LED_OFF;
640 else
641 pLed->BlinkingLedState = LED_ON;
642 _set_timer(&(pLed->BlinkTimer),
643 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
644 pLed->bLedScanBlinkInProgress = false;
645 } else {
646 if (pLed->bLedOn)
647 pLed->BlinkingLedState = LED_OFF;
648 else
649 pLed->BlinkingLedState = LED_ON;
650 _set_timer(&(pLed->BlinkTimer),
651 LED_BLINK_SCAN_INTERVAL_ALPHA);
652 }
653 break;
654 case LED_TXRX_BLINK:
655 pLed->BlinkTimes--;
656 if (pLed->BlinkTimes == 0)
657 bStopBlinking = true;
658 if (bStopBlinking) {
659 pLed->bLedNoLinkBlinkInProgress = true;
660 pLed->CurrLedState = LED_BLINK_SLOWLY;
661 if (pLed->bLedOn)
662 pLed->BlinkingLedState = LED_OFF;
663 else
664 pLed->BlinkingLedState = LED_ON;
665 _set_timer(&(pLed->BlinkTimer),
666 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
667 pLed->bLedBlinkInProgress = false;
668 } else {
669 if (pLed->bLedOn)
670 pLed->BlinkingLedState = LED_OFF;
671 else
672 pLed->BlinkingLedState = LED_ON;
673 _set_timer(&(pLed->BlinkTimer),
674 LED_BLINK_FASTER_INTERVAL_ALPHA);
675 }
676 break;
677 case LED_BLINK_WPS:
678 if (pLed->bLedOn) {
679 pLed->BlinkingLedState = LED_OFF;
680 _set_timer(&(pLed->BlinkTimer),
681 LED_BLINK_SLOWLY_INTERVAL);
682 } else {
683 pLed->BlinkingLedState = LED_ON;
684 _set_timer(&(pLed->BlinkTimer),
685 LED_BLINK_NORMAL_INTERVAL);
686 }
687 break;
688 case LED_BLINK_WPS_STOP: /*WPS authentication fail*/
689 if (pLed->bLedOn)
690 pLed->BlinkingLedState = LED_OFF;
691 else
692 pLed->BlinkingLedState = LED_ON;
693 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
694 break;
695 case LED_BLINK_WPS_STOP_OVERLAP: /*WPS session overlap */
696 pLed->BlinkTimes--;
697 if (pLed->BlinkTimes == 0) {
698 if (pLed->bLedOn)
699 pLed->BlinkTimes = 1;
700 else
701 bStopBlinking = true;
702 }
703 if (bStopBlinking) {
704 pLed->BlinkTimes = 10;
705 pLed->BlinkingLedState = LED_ON;
706 _set_timer(&(pLed->BlinkTimer),
707 LED_BLINK_LINK_INTERVAL_ALPHA);
708 } else {
709 if (pLed->bLedOn)
710 pLed->BlinkingLedState = LED_OFF;
711 else
712 pLed->BlinkingLedState = LED_ON;
713 _set_timer(&(pLed->BlinkTimer),
714 LED_BLINK_NORMAL_INTERVAL);
715 }
716 break;
717 default:
718 break;
719 }
720}
721
722static void SwLedBlink5(struct LED_871x *pLed)
723{
724 struct _adapter *padapter = pLed->padapter;
725 u8 bStopBlinking = false;
726
727 /* Change LED according to BlinkingLedState specified. */
728 if (pLed->BlinkingLedState == LED_ON)
729 SwLedOn(padapter, pLed);
730 else
731 SwLedOff(padapter, pLed);
732 switch (pLed->CurrLedState) {
733 case LED_SCAN_BLINK:
734 pLed->BlinkTimes--;
735 if (pLed->BlinkTimes == 0)
736 bStopBlinking = true;
737 if (bStopBlinking) {
738 pLed->CurrLedState = LED_ON;
739 pLed->BlinkingLedState = LED_ON;
740 if (!pLed->bLedOn)
741 _set_timer(&(pLed->BlinkTimer),
742 LED_BLINK_FASTER_INTERVAL_ALPHA);
743 pLed->bLedScanBlinkInProgress = false;
744 } else {
745 if (pLed->bLedOn)
746 pLed->BlinkingLedState = LED_OFF;
747 else
748 pLed->BlinkingLedState = LED_ON;
749 _set_timer(&(pLed->BlinkTimer),
750 LED_BLINK_SCAN_INTERVAL_ALPHA);
751 }
752 break;
753 case LED_TXRX_BLINK:
754 pLed->BlinkTimes--;
755 if (pLed->BlinkTimes == 0)
756 bStopBlinking = true;
757 if (bStopBlinking) {
758 pLed->CurrLedState = LED_ON;
759 pLed->BlinkingLedState = LED_ON;
760 if (!pLed->bLedOn)
761 _set_timer(&(pLed->BlinkTimer),
762 LED_BLINK_FASTER_INTERVAL_ALPHA);
763 pLed->bLedBlinkInProgress = false;
764 } else {
765 if (pLed->bLedOn)
766 pLed->BlinkingLedState = LED_OFF;
767 else
768 pLed->BlinkingLedState = LED_ON;
769 _set_timer(&(pLed->BlinkTimer),
770 LED_BLINK_FASTER_INTERVAL_ALPHA);
771 }
772 break;
773 default:
774 break;
775 }
776}
777
778static void SwLedBlink6(struct LED_871x *pLed)
779{
780 struct _adapter *padapter = pLed->padapter;
781 u8 bStopBlinking = false;
782
783 /* Change LED according to BlinkingLedState specified. */
784 if (pLed->BlinkingLedState == LED_ON)
785 SwLedOn(padapter, pLed);
786 else
787 SwLedOff(padapter, pLed);
788 switch (pLed->CurrLedState) {
789 case LED_TXRX_BLINK:
790 pLed->BlinkTimes--;
791 if (pLed->BlinkTimes == 0)
792 bStopBlinking = true;
793 if (bStopBlinking) {
794 pLed->CurrLedState = LED_ON;
795 pLed->BlinkingLedState = LED_ON;
796 if (!pLed->bLedOn)
797 SwLedOn(padapter, pLed);
798 pLed->bLedBlinkInProgress = false;
799 } else {
800 if (pLed->bLedOn)
801 pLed->BlinkingLedState = LED_OFF;
802 else
803 pLed->BlinkingLedState = LED_ON;
804 _set_timer(&(pLed->BlinkTimer),
805 LED_BLINK_FASTER_INTERVAL_ALPHA);
806 }
807 break;
808 case LED_BLINK_WPS:
809 if (pLed->bLedOn)
810 pLed->BlinkingLedState = LED_OFF;
811 else
812 pLed->BlinkingLedState = LED_ON;
813 _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
814 break;
815
816 default:
817 break;
818 }
819}
820
821/* Description:
822 * Callback function of LED BlinkTimer,
823 * it just schedules to corresponding BlinkWorkItem.
824 */
825static void BlinkTimerCallback(unsigned long data)
826{
827 struct LED_871x *pLed = (struct LED_871x *)data;
828
829 /* This fixed the crash problem on Fedora 12 when trying to do thei
830 * insmod;ifconfig up;rmmod commands. */
831 if ((pLed->padapter->bSurpriseRemoved == true) ||
832 (pLed->padapter->bDriverStopped == true))
833 return;
834 _set_workitem(&(pLed->BlinkWorkItem));
835}
836
837/* Description:
838 * Callback function of LED BlinkWorkItem.
839 * We dispatch acture LED blink action according to LedStrategy.
840 */
841static void BlinkWorkItemCallback(struct work_struct *work)
842{
843 struct LED_871x *pLed = container_of(work, struct LED_871x,
844 BlinkWorkItem);
845 struct led_priv *ledpriv = &(pLed->padapter->ledpriv);
846
847 switch (ledpriv->LedStrategy) {
848 case SW_LED_MODE0:
849 SwLedBlink(pLed);
850 break;
851 case SW_LED_MODE1:
852 SwLedBlink1(pLed);
853 break;
854 case SW_LED_MODE2:
855 SwLedBlink2(pLed);
856 break;
857 case SW_LED_MODE3:
858 SwLedBlink3(pLed);
859 break;
860 case SW_LED_MODE4:
861 SwLedBlink4(pLed);
862 break;
863 case SW_LED_MODE5:
864 SwLedBlink5(pLed);
865 break;
866 case SW_LED_MODE6:
867 SwLedBlink6(pLed);
868 break;
869 default:
870 SwLedBlink(pLed);
871 break;
872 }
873}
874
875/*============================================================================
876 * Default LED behavior.
877 *============================================================================
878 *
879 * Description:
880 * Implement each led action for SW_LED_MODE0.
881 * This is default strategy.
882 */
883
884static void SwLedControlMode1(struct _adapter *padapter,
885 enum LED_CTL_MODE LedAction)
886{
887 struct led_priv *ledpriv = &(padapter->ledpriv);
888 struct LED_871x *pLed = &(ledpriv->SwLed0);
889 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
890 struct sitesurvey_ctrl *psitesurveyctrl = &(pmlmepriv->sitesurveyctrl);
891
892 if (padapter->eeprompriv.CustomerID == RT_CID_819x_CAMEO)
893 pLed = &(ledpriv->SwLed1);
894 switch (LedAction) {
895 case LED_CTL_START_TO_LINK:
896 case LED_CTL_NO_LINK:
897 if (pLed->bLedNoLinkBlinkInProgress == false) {
898 if (pLed->CurrLedState == LED_SCAN_BLINK ||
899 IS_LED_WPS_BLINKING(pLed))
900 return;
901 if (pLed->bLedLinkBlinkInProgress == true) {
902 _cancel_timer_ex(&(pLed->BlinkTimer));
903 pLed->bLedLinkBlinkInProgress = false;
904 }
905 if (pLed->bLedBlinkInProgress == true) {
906 _cancel_timer_ex(&(pLed->BlinkTimer));
907 pLed->bLedBlinkInProgress = false;
908 }
909 pLed->bLedNoLinkBlinkInProgress = true;
910 pLed->CurrLedState = LED_BLINK_SLOWLY;
911 if (pLed->bLedOn)
912 pLed->BlinkingLedState = LED_OFF;
913 else
914 pLed->BlinkingLedState = LED_ON;
915 _set_timer(&(pLed->BlinkTimer),
916 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
917 }
918 break;
919 case LED_CTL_LINK:
920 if (pLed->bLedLinkBlinkInProgress == false) {
921 if (pLed->CurrLedState == LED_SCAN_BLINK ||
922 IS_LED_WPS_BLINKING(pLed))
923 return;
924 if (pLed->bLedNoLinkBlinkInProgress == true) {
925 _cancel_timer_ex(&(pLed->BlinkTimer));
926 pLed->bLedNoLinkBlinkInProgress = false;
927 }
928 if (pLed->bLedBlinkInProgress == true) {
929 _cancel_timer_ex(&(pLed->BlinkTimer));
930 pLed->bLedBlinkInProgress = false;
931 }
932 pLed->bLedLinkBlinkInProgress = true;
933 pLed->CurrLedState = LED_BLINK_NORMAL;
934 if (pLed->bLedOn)
935 pLed->BlinkingLedState = LED_OFF;
936 else
937 pLed->BlinkingLedState = LED_ON;
938 _set_timer(&(pLed->BlinkTimer),
939 LED_BLINK_LINK_INTERVAL_ALPHA);
940 }
941 break;
942 case LED_CTL_SITE_SURVEY:
943 if ((psitesurveyctrl->traffic_busy) &&
944 (check_fwstate(pmlmepriv, _FW_LINKED) == true))
945 ; /* dummy branch */
946 else if (pLed->bLedScanBlinkInProgress == false) {
947 if (IS_LED_WPS_BLINKING(pLed))
948 return;
949 if (pLed->bLedNoLinkBlinkInProgress == true) {
950 _cancel_timer_ex(&(pLed->BlinkTimer));
951 pLed->bLedNoLinkBlinkInProgress = false;
952 }
953 if (pLed->bLedLinkBlinkInProgress == true) {
954 _cancel_timer_ex(&(pLed->BlinkTimer));
955 pLed->bLedLinkBlinkInProgress = false;
956 }
957 if (pLed->bLedBlinkInProgress == true) {
958 _cancel_timer_ex(&(pLed->BlinkTimer));
959 pLed->bLedBlinkInProgress = false;
960 }
961 pLed->bLedScanBlinkInProgress = true;
962 pLed->CurrLedState = LED_SCAN_BLINK;
963 pLed->BlinkTimes = 24;
964 if (pLed->bLedOn)
965 pLed->BlinkingLedState = LED_OFF;
966 else
967 pLed->BlinkingLedState = LED_ON;
968 _set_timer(&(pLed->BlinkTimer),
969 LED_BLINK_SCAN_INTERVAL_ALPHA);
970 }
971 break;
972 case LED_CTL_TX:
973 case LED_CTL_RX:
974 if (pLed->bLedBlinkInProgress == false) {
975 if (pLed->CurrLedState == LED_SCAN_BLINK ||
976 IS_LED_WPS_BLINKING(pLed))
977 return;
978 if (pLed->bLedNoLinkBlinkInProgress == true) {
979 _cancel_timer_ex(&(pLed->BlinkTimer));
980 pLed->bLedNoLinkBlinkInProgress = false;
981 }
982 if (pLed->bLedLinkBlinkInProgress == true) {
983 _cancel_timer_ex(&(pLed->BlinkTimer));
984 pLed->bLedLinkBlinkInProgress = false;
985 }
986 pLed->bLedBlinkInProgress = true;
987 pLed->CurrLedState = LED_TXRX_BLINK;
988 pLed->BlinkTimes = 2;
989 if (pLed->bLedOn)
990 pLed->BlinkingLedState = LED_OFF;
991 else
992 pLed->BlinkingLedState = LED_ON;
993 _set_timer(&(pLed->BlinkTimer),
994 LED_BLINK_FASTER_INTERVAL_ALPHA);
995 }
996 break;
997
998 case LED_CTL_START_WPS: /*wait until xinpin finish */
999 case LED_CTL_START_WPS_BOTTON:
1000 if (pLed->bLedWPSBlinkInProgress == false) {
1001 if (pLed->bLedNoLinkBlinkInProgress == true) {
1002 _cancel_timer_ex(&(pLed->BlinkTimer));
1003 pLed->bLedNoLinkBlinkInProgress = false;
1004 }
1005 if (pLed->bLedLinkBlinkInProgress == true) {
1006 _cancel_timer_ex(&(pLed->BlinkTimer));
1007 pLed->bLedLinkBlinkInProgress = false;
1008 }
1009 if (pLed->bLedBlinkInProgress == true) {
1010 _cancel_timer_ex(&(pLed->BlinkTimer));
1011 pLed->bLedBlinkInProgress = false;
1012 }
1013 if (pLed->bLedScanBlinkInProgress == true) {
1014 _cancel_timer_ex(&(pLed->BlinkTimer));
1015 pLed->bLedScanBlinkInProgress = false;
1016 }
1017 pLed->bLedWPSBlinkInProgress = true;
1018 pLed->CurrLedState = LED_BLINK_WPS;
1019 if (pLed->bLedOn)
1020 pLed->BlinkingLedState = LED_OFF;
1021 else
1022 pLed->BlinkingLedState = LED_ON;
1023 _set_timer(&(pLed->BlinkTimer),
1024 LED_BLINK_SCAN_INTERVAL_ALPHA);
1025 }
1026 break;
1027 case LED_CTL_STOP_WPS:
1028 if (pLed->bLedNoLinkBlinkInProgress == true) {
1029 _cancel_timer_ex(&(pLed->BlinkTimer));
1030 pLed->bLedNoLinkBlinkInProgress = false;
1031 }
1032 if (pLed->bLedLinkBlinkInProgress == true) {
1033 _cancel_timer_ex(&(pLed->BlinkTimer));
1034 pLed->bLedLinkBlinkInProgress = false;
1035 }
1036 if (pLed->bLedBlinkInProgress == true) {
1037 _cancel_timer_ex(&(pLed->BlinkTimer));
1038 pLed->bLedBlinkInProgress = false;
1039 }
1040 if (pLed->bLedScanBlinkInProgress == true) {
1041 _cancel_timer_ex(&(pLed->BlinkTimer));
1042 pLed->bLedScanBlinkInProgress = false;
1043 }
1044 if (pLed->bLedWPSBlinkInProgress)
1045 _cancel_timer_ex(&(pLed->BlinkTimer));
1046 else
1047 pLed->bLedWPSBlinkInProgress = true;
1048 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1049 if (pLed->bLedOn) {
1050 pLed->BlinkingLedState = LED_OFF;
1051 _set_timer(&(pLed->BlinkTimer),
1052 LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
1053 } else {
1054 pLed->BlinkingLedState = LED_ON;
1055 _set_timer(&(pLed->BlinkTimer), 0);
1056 }
1057 break;
1058 case LED_CTL_STOP_WPS_FAIL:
1059 if (pLed->bLedWPSBlinkInProgress) {
1060 _cancel_timer_ex(&(pLed->BlinkTimer));
1061 pLed->bLedWPSBlinkInProgress = false;
1062 }
1063 pLed->bLedNoLinkBlinkInProgress = true;
1064 pLed->CurrLedState = LED_BLINK_SLOWLY;
1065 if (pLed->bLedOn)
1066 pLed->BlinkingLedState = LED_OFF;
1067 else
1068 pLed->BlinkingLedState = LED_ON;
1069 _set_timer(&(pLed->BlinkTimer),
1070 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1071 break;
1072 case LED_CTL_POWER_OFF:
1073 pLed->CurrLedState = LED_OFF;
1074 pLed->BlinkingLedState = LED_OFF;
1075 if (pLed->bLedNoLinkBlinkInProgress) {
1076 _cancel_timer_ex(&(pLed->BlinkTimer));
1077 pLed->bLedNoLinkBlinkInProgress = false;
1078 }
1079 if (pLed->bLedLinkBlinkInProgress) {
1080 _cancel_timer_ex(&(pLed->BlinkTimer));
1081 pLed->bLedLinkBlinkInProgress = false;
1082 }
1083 if (pLed->bLedBlinkInProgress) {
1084 _cancel_timer_ex(&(pLed->BlinkTimer));
1085 pLed->bLedBlinkInProgress = false;
1086 }
1087 if (pLed->bLedWPSBlinkInProgress) {
1088 _cancel_timer_ex(&(pLed->BlinkTimer));
1089 pLed->bLedWPSBlinkInProgress = false;
1090 }
1091 if (pLed->bLedScanBlinkInProgress) {
1092 _cancel_timer_ex(&(pLed->BlinkTimer));
1093 pLed->bLedScanBlinkInProgress = false;
1094 }
1095 _set_timer(&(pLed->BlinkTimer), 0);
1096 break;
1097 default:
1098 break;
1099 }
1100}
1101
1102static void SwLedControlMode2(struct _adapter *padapter,
1103 enum LED_CTL_MODE LedAction)
1104{
1105 struct led_priv *ledpriv = &(padapter->ledpriv);
1106 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1107 struct LED_871x *pLed = &(ledpriv->SwLed0);
1108
1109 switch (LedAction) {
1110 case LED_CTL_SITE_SURVEY:
1111 if (pmlmepriv->sitesurveyctrl.traffic_busy)
1112 ; /* dummy branch */
1113 else if (pLed->bLedScanBlinkInProgress == false) {
1114 if (IS_LED_WPS_BLINKING(pLed))
1115 return;
1116
1117 if (pLed->bLedBlinkInProgress == true) {
1118 _cancel_timer_ex(&(pLed->BlinkTimer));
1119 pLed->bLedBlinkInProgress = false;
1120 }
1121 pLed->bLedScanBlinkInProgress = true;
1122 pLed->CurrLedState = LED_SCAN_BLINK;
1123 pLed->BlinkTimes = 24;
1124 if (pLed->bLedOn)
1125 pLed->BlinkingLedState = LED_OFF;
1126 else
1127 pLed->BlinkingLedState = LED_ON;
1128 _set_timer(&(pLed->BlinkTimer),
1129 LED_BLINK_SCAN_INTERVAL_ALPHA);
1130 }
1131 break;
1132
1133 case LED_CTL_TX:
1134 case LED_CTL_RX:
1135 if ((pLed->bLedBlinkInProgress == false) &&
1136 (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
1137 if (pLed->CurrLedState == LED_SCAN_BLINK ||
1138 IS_LED_WPS_BLINKING(pLed))
1139 return;
1140 pLed->bLedBlinkInProgress = true;
1141 pLed->CurrLedState = LED_TXRX_BLINK;
1142 pLed->BlinkTimes = 2;
1143 if (pLed->bLedOn)
1144 pLed->BlinkingLedState = LED_OFF;
1145 else
1146 pLed->BlinkingLedState = LED_ON;
1147 _set_timer(&(pLed->BlinkTimer),
1148 LED_BLINK_FASTER_INTERVAL_ALPHA);
1149 }
1150 break;
1151
1152 case LED_CTL_LINK:
1153 pLed->CurrLedState = LED_ON;
1154 pLed->BlinkingLedState = LED_ON;
1155 if (pLed->bLedBlinkInProgress) {
1156 _cancel_timer_ex(&(pLed->BlinkTimer));
1157 pLed->bLedBlinkInProgress = false;
1158 }
1159 if (pLed->bLedScanBlinkInProgress) {
1160 _cancel_timer_ex(&(pLed->BlinkTimer));
1161 pLed->bLedScanBlinkInProgress = false;
1162 }
1163
1164 _set_timer(&(pLed->BlinkTimer), 0);
1165 break;
1166
1167 case LED_CTL_START_WPS: /*wait until xinpin finish*/
1168 case LED_CTL_START_WPS_BOTTON:
1169 if (pLed->bLedWPSBlinkInProgress == false) {
1170 if (pLed->bLedBlinkInProgress == true) {
1171 _cancel_timer_ex(&(pLed->BlinkTimer));
1172 pLed->bLedBlinkInProgress = false;
1173 }
1174 if (pLed->bLedScanBlinkInProgress == true) {
1175 _cancel_timer_ex(&(pLed->BlinkTimer));
1176 pLed->bLedScanBlinkInProgress = false;
1177 }
1178 pLed->bLedWPSBlinkInProgress = true;
1179 pLed->CurrLedState = LED_ON;
1180 pLed->BlinkingLedState = LED_ON;
1181 _set_timer(&(pLed->BlinkTimer), 0);
1182 }
1183 break;
1184
1185 case LED_CTL_STOP_WPS:
1186 pLed->bLedWPSBlinkInProgress = false;
1187 pLed->CurrLedState = LED_ON;
1188 pLed->BlinkingLedState = LED_ON;
1189 _set_timer(&(pLed->BlinkTimer), 0);
1190 break;
1191
1192 case LED_CTL_STOP_WPS_FAIL:
1193 pLed->bLedWPSBlinkInProgress = false;
1194 pLed->CurrLedState = LED_OFF;
1195 pLed->BlinkingLedState = LED_OFF;
1196 _set_timer(&(pLed->BlinkTimer), 0);
1197 break;
1198
1199 case LED_CTL_START_TO_LINK:
1200 case LED_CTL_NO_LINK:
1201 if (!IS_LED_BLINKING(pLed)) {
1202 pLed->CurrLedState = LED_OFF;
1203 pLed->BlinkingLedState = LED_OFF;
1204 _set_timer(&(pLed->BlinkTimer), 0);
1205 }
1206 break;
1207 case LED_CTL_POWER_OFF:
1208 pLed->CurrLedState = LED_OFF;
1209 pLed->BlinkingLedState = LED_OFF;
1210 if (pLed->bLedBlinkInProgress) {
1211 _cancel_timer_ex(&(pLed->BlinkTimer));
1212 pLed->bLedBlinkInProgress = false;
1213 }
1214 if (pLed->bLedScanBlinkInProgress) {
1215 _cancel_timer_ex(&(pLed->BlinkTimer));
1216 pLed->bLedScanBlinkInProgress = false;
1217 }
1218 if (pLed->bLedWPSBlinkInProgress) {
1219 _cancel_timer_ex(&(pLed->BlinkTimer));
1220 pLed->bLedWPSBlinkInProgress = false;
1221 }
1222 _set_timer(&(pLed->BlinkTimer), 0);
1223 break;
1224 default:
1225 break;
1226 }
1227}
1228
1229static void SwLedControlMode3(struct _adapter *padapter,
1230 enum LED_CTL_MODE LedAction)
1231{
1232 struct led_priv *ledpriv = &(padapter->ledpriv);
1233 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1234 struct LED_871x *pLed = &(ledpriv->SwLed0);
1235
1236 switch (LedAction) {
1237 case LED_CTL_SITE_SURVEY:
1238 if (pmlmepriv->sitesurveyctrl.traffic_busy)
1239 ; /* dummy branch */
1240 else if (pLed->bLedScanBlinkInProgress == false) {
1241 if (IS_LED_WPS_BLINKING(pLed))
1242 return;
1243 if (pLed->bLedBlinkInProgress == true) {
1244 _cancel_timer_ex(&(pLed->BlinkTimer));
1245 pLed->bLedBlinkInProgress = false;
1246 }
1247 pLed->bLedScanBlinkInProgress = true;
1248 pLed->CurrLedState = LED_SCAN_BLINK;
1249 pLed->BlinkTimes = 24;
1250 if (pLed->bLedOn)
1251 pLed->BlinkingLedState = LED_OFF;
1252 else
1253 pLed->BlinkingLedState = LED_ON;
1254 _set_timer(&(pLed->BlinkTimer),
1255 LED_BLINK_SCAN_INTERVAL_ALPHA);
1256 }
1257 break;
1258 case LED_CTL_TX:
1259 case LED_CTL_RX:
1260 if ((pLed->bLedBlinkInProgress == false) &&
1261 (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
1262 if (pLed->CurrLedState == LED_SCAN_BLINK ||
1263 IS_LED_WPS_BLINKING(pLed))
1264 return;
1265 pLed->bLedBlinkInProgress = true;
1266 pLed->CurrLedState = LED_TXRX_BLINK;
1267 pLed->BlinkTimes = 2;
1268 if (pLed->bLedOn)
1269 pLed->BlinkingLedState = LED_OFF;
1270 else
1271 pLed->BlinkingLedState = LED_ON;
1272 _set_timer(&(pLed->BlinkTimer),
1273 LED_BLINK_FASTER_INTERVAL_ALPHA);
1274 }
1275 break;
1276 case LED_CTL_LINK:
1277 if (IS_LED_WPS_BLINKING(pLed))
1278 return;
1279 pLed->CurrLedState = LED_ON;
1280 pLed->BlinkingLedState = LED_ON;
1281 if (pLed->bLedBlinkInProgress) {
1282 _cancel_timer_ex(&(pLed->BlinkTimer));
1283 pLed->bLedBlinkInProgress = false;
1284 }
1285 if (pLed->bLedScanBlinkInProgress) {
1286 _cancel_timer_ex(&(pLed->BlinkTimer));
1287 pLed->bLedScanBlinkInProgress = false;
1288 }
1289 _set_timer(&(pLed->BlinkTimer), 0);
1290 break;
1291 case LED_CTL_START_WPS: /* wait until xinpin finish */
1292 case LED_CTL_START_WPS_BOTTON:
1293 if (pLed->bLedWPSBlinkInProgress == false) {
1294 if (pLed->bLedBlinkInProgress == true) {
1295 _cancel_timer_ex(&(pLed->BlinkTimer));
1296 pLed->bLedBlinkInProgress = false;
1297 }
1298 if (pLed->bLedScanBlinkInProgress == true) {
1299 _cancel_timer_ex(&(pLed->BlinkTimer));
1300 pLed->bLedScanBlinkInProgress = false;
1301 }
1302 pLed->bLedWPSBlinkInProgress = true;
1303 pLed->CurrLedState = LED_BLINK_WPS;
1304 if (pLed->bLedOn)
1305 pLed->BlinkingLedState = LED_OFF;
1306 else
1307 pLed->BlinkingLedState = LED_ON;
1308 _set_timer(&(pLed->BlinkTimer),
1309 LED_BLINK_SCAN_INTERVAL_ALPHA);
1310 }
1311 break;
1312 case LED_CTL_STOP_WPS:
1313 if (pLed->bLedWPSBlinkInProgress) {
1314 _cancel_timer_ex(&(pLed->BlinkTimer));
1315 pLed->bLedWPSBlinkInProgress = false;
1316 } else
1317 pLed->bLedWPSBlinkInProgress = true;
1318 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1319 if (pLed->bLedOn) {
1320 pLed->BlinkingLedState = LED_OFF;
1321 _set_timer(&(pLed->BlinkTimer),
1322 LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
1323 } else {
1324 pLed->BlinkingLedState = LED_ON;
1325 _set_timer(&(pLed->BlinkTimer), 0);
1326 }
1327 break;
1328 case LED_CTL_STOP_WPS_FAIL:
1329 if (pLed->bLedWPSBlinkInProgress) {
1330 _cancel_timer_ex(&(pLed->BlinkTimer));
1331 pLed->bLedWPSBlinkInProgress = false;
1332 }
1333 pLed->CurrLedState = LED_OFF;
1334 pLed->BlinkingLedState = LED_OFF;
1335 _set_timer(&(pLed->BlinkTimer), 0);
1336 break;
1337 case LED_CTL_START_TO_LINK:
1338 case LED_CTL_NO_LINK:
1339 if (!IS_LED_BLINKING(pLed)) {
1340 pLed->CurrLedState = LED_OFF;
1341 pLed->BlinkingLedState = LED_OFF;
1342 _set_timer(&(pLed->BlinkTimer), 0);
1343 }
1344 break;
1345 case LED_CTL_POWER_OFF:
1346 pLed->CurrLedState = LED_OFF;
1347 pLed->BlinkingLedState = LED_OFF;
1348 if (pLed->bLedBlinkInProgress) {
1349 _cancel_timer_ex(&(pLed->BlinkTimer));
1350 pLed->bLedBlinkInProgress = false;
1351 }
1352 if (pLed->bLedScanBlinkInProgress) {
1353 _cancel_timer_ex(&(pLed->BlinkTimer));
1354 pLed->bLedScanBlinkInProgress = false;
1355 }
1356 if (pLed->bLedWPSBlinkInProgress) {
1357 _cancel_timer_ex(&(pLed->BlinkTimer));
1358 pLed->bLedWPSBlinkInProgress = false;
1359 }
1360 _set_timer(&(pLed->BlinkTimer), 0);
1361 break;
1362 default:
1363 break;
1364 }
1365}
1366
1367static void SwLedControlMode4(struct _adapter *padapter,
1368 enum LED_CTL_MODE LedAction)
1369{
1370 struct led_priv *ledpriv = &(padapter->ledpriv);
1371 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1372 struct LED_871x *pLed = &(ledpriv->SwLed0);
1373 struct LED_871x *pLed1 = &(ledpriv->SwLed1);
1374
1375 switch (LedAction) {
1376 case LED_CTL_START_TO_LINK:
1377 if (pLed1->bLedWPSBlinkInProgress) {
1378 pLed1->bLedWPSBlinkInProgress = false;
1379 _cancel_timer_ex(&(pLed1->BlinkTimer));
1380 pLed1->BlinkingLedState = LED_OFF;
1381 pLed1->CurrLedState = LED_OFF;
1382 if (pLed1->bLedOn)
1383 _set_timer(&(pLed->BlinkTimer), 0);
1384 }
1385 if (pLed->bLedStartToLinkBlinkInProgress == false) {
1386 if (pLed->CurrLedState == LED_SCAN_BLINK ||
1387 IS_LED_WPS_BLINKING(pLed))
1388 return;
1389 if (pLed->bLedBlinkInProgress == true) {
1390 _cancel_timer_ex(&(pLed->BlinkTimer));
1391 pLed->bLedBlinkInProgress = false;
1392 }
1393 if (pLed->bLedNoLinkBlinkInProgress == true) {
1394 _cancel_timer_ex(&(pLed->BlinkTimer));
1395 pLed->bLedNoLinkBlinkInProgress = false;
1396 }
1397 pLed->bLedStartToLinkBlinkInProgress = true;
1398 pLed->CurrLedState = LED_BLINK_StartToBlink;
1399 if (pLed->bLedOn) {
1400 pLed->BlinkingLedState = LED_OFF;
1401 _set_timer(&(pLed->BlinkTimer),
1402 LED_BLINK_SLOWLY_INTERVAL);
1403 } else {
1404 pLed->BlinkingLedState = LED_ON;
1405 _set_timer(&(pLed->BlinkTimer),
1406 LED_BLINK_NORMAL_INTERVAL);
1407 }
1408 }
1409 break;
1410 case LED_CTL_LINK:
1411 case LED_CTL_NO_LINK:
1412 /*LED1 settings*/
1413 if (LedAction == LED_CTL_LINK) {
1414 if (pLed1->bLedWPSBlinkInProgress) {
1415 pLed1->bLedWPSBlinkInProgress = false;
1416 _cancel_timer_ex(&(pLed1->BlinkTimer));
1417 pLed1->BlinkingLedState = LED_OFF;
1418 pLed1->CurrLedState = LED_OFF;
1419 if (pLed1->bLedOn)
1420 _set_timer(&(pLed->BlinkTimer), 0);
1421 }
1422 }
1423 if (pLed->bLedNoLinkBlinkInProgress == false) {
1424 if (pLed->CurrLedState == LED_SCAN_BLINK ||
1425 IS_LED_WPS_BLINKING(pLed))
1426 return;
1427 if (pLed->bLedBlinkInProgress == true) {
1428 _cancel_timer_ex(&(pLed->BlinkTimer));
1429 pLed->bLedBlinkInProgress = false;
1430 }
1431 pLed->bLedNoLinkBlinkInProgress = true;
1432 pLed->CurrLedState = LED_BLINK_SLOWLY;
1433 if (pLed->bLedOn)
1434 pLed->BlinkingLedState = LED_OFF;
1435 else
1436 pLed->BlinkingLedState = LED_ON;
1437 _set_timer(&(pLed->BlinkTimer),
1438 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1439 }
1440 break;
1441 case LED_CTL_SITE_SURVEY:
1442 if ((pmlmepriv->sitesurveyctrl.traffic_busy) &&
1443 (check_fwstate(pmlmepriv, _FW_LINKED) == true))
1444 ;
1445 else if (pLed->bLedScanBlinkInProgress == false) {
1446 if (IS_LED_WPS_BLINKING(pLed))
1447 return;
1448 if (pLed->bLedNoLinkBlinkInProgress == true) {
1449 _cancel_timer_ex(&(pLed->BlinkTimer));
1450 pLed->bLedNoLinkBlinkInProgress = false;
1451 }
1452 if (pLed->bLedBlinkInProgress == true) {
1453 _cancel_timer_ex(&(pLed->BlinkTimer));
1454 pLed->bLedBlinkInProgress = false;
1455 }
1456 pLed->bLedScanBlinkInProgress = true;
1457 pLed->CurrLedState = LED_SCAN_BLINK;
1458 pLed->BlinkTimes = 24;
1459 if (pLed->bLedOn)
1460 pLed->BlinkingLedState = LED_OFF;
1461 else
1462 pLed->BlinkingLedState = LED_ON;
1463 _set_timer(&(pLed->BlinkTimer),
1464 LED_BLINK_SCAN_INTERVAL_ALPHA);
1465 }
1466 break;
1467 case LED_CTL_TX:
1468 case LED_CTL_RX:
1469 if (pLed->bLedBlinkInProgress == false) {
1470 if (pLed->CurrLedState == LED_SCAN_BLINK ||
1471 IS_LED_WPS_BLINKING(pLed))
1472 return;
1473 if (pLed->bLedNoLinkBlinkInProgress == true) {
1474 _cancel_timer_ex(&(pLed->BlinkTimer));
1475 pLed->bLedNoLinkBlinkInProgress = false;
1476 }
1477 pLed->bLedBlinkInProgress = true;
1478 pLed->CurrLedState = LED_TXRX_BLINK;
1479 pLed->BlinkTimes = 2;
1480 if (pLed->bLedOn)
1481 pLed->BlinkingLedState = LED_OFF;
1482 else
1483 pLed->BlinkingLedState = LED_ON;
1484 _set_timer(&(pLed->BlinkTimer),
1485 LED_BLINK_FASTER_INTERVAL_ALPHA);
1486 }
1487 break;
1488 case LED_CTL_START_WPS: /*wait until xinpin finish*/
1489 case LED_CTL_START_WPS_BOTTON:
1490 if (pLed1->bLedWPSBlinkInProgress) {
1491 pLed1->bLedWPSBlinkInProgress = false;
1492 _cancel_timer_ex(&(pLed1->BlinkTimer));
1493 pLed1->BlinkingLedState = LED_OFF;
1494 pLed1->CurrLedState = LED_OFF;
1495 if (pLed1->bLedOn)
1496 _set_timer(&(pLed->BlinkTimer), 0);
1497 }
1498 if (pLed->bLedWPSBlinkInProgress == false) {
1499 if (pLed->bLedNoLinkBlinkInProgress == true) {
1500 _cancel_timer_ex(&(pLed->BlinkTimer));
1501 pLed->bLedNoLinkBlinkInProgress = false;
1502 }
1503 if (pLed->bLedBlinkInProgress == true) {
1504 _cancel_timer_ex(&(pLed->BlinkTimer));
1505 pLed->bLedBlinkInProgress = false;
1506 }
1507 if (pLed->bLedScanBlinkInProgress == true) {
1508 _cancel_timer_ex(&(pLed->BlinkTimer));
1509 pLed->bLedScanBlinkInProgress = false;
1510 }
1511 pLed->bLedWPSBlinkInProgress = true;
1512 pLed->CurrLedState = LED_BLINK_WPS;
1513 if (pLed->bLedOn) {
1514 pLed->BlinkingLedState = LED_OFF;
1515 _set_timer(&(pLed->BlinkTimer),
1516 LED_BLINK_SLOWLY_INTERVAL);
1517 } else {
1518 pLed->BlinkingLedState = LED_ON;
1519 _set_timer(&(pLed->BlinkTimer),
1520 LED_BLINK_NORMAL_INTERVAL);
1521 }
1522 }
1523 break;
1524 case LED_CTL_STOP_WPS: /*WPS connect success*/
1525 if (pLed->bLedWPSBlinkInProgress) {
1526 _cancel_timer_ex(&(pLed->BlinkTimer));
1527 pLed->bLedWPSBlinkInProgress = false;
1528 }
1529 pLed->bLedNoLinkBlinkInProgress = true;
1530 pLed->CurrLedState = LED_BLINK_SLOWLY;
1531 if (pLed->bLedOn)
1532 pLed->BlinkingLedState = LED_OFF;
1533 else
1534 pLed->BlinkingLedState = LED_ON;
1535 _set_timer(&(pLed->BlinkTimer),
1536 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1537 break;
1538 case LED_CTL_STOP_WPS_FAIL: /*WPS authentication fail*/
1539 if (pLed->bLedWPSBlinkInProgress) {
1540 _cancel_timer_ex(&(pLed->BlinkTimer));
1541 pLed->bLedWPSBlinkInProgress = false;
1542 }
1543 pLed->bLedNoLinkBlinkInProgress = true;
1544 pLed->CurrLedState = LED_BLINK_SLOWLY;
1545 if (pLed->bLedOn)
1546 pLed->BlinkingLedState = LED_OFF;
1547 else
1548 pLed->BlinkingLedState = LED_ON;
1549 _set_timer(&(pLed->BlinkTimer),
1550 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1551 /*LED1 settings*/
1552 if (pLed1->bLedWPSBlinkInProgress)
1553 _cancel_timer_ex(&(pLed1->BlinkTimer));
1554 else
1555 pLed1->bLedWPSBlinkInProgress = true;
1556 pLed1->CurrLedState = LED_BLINK_WPS_STOP;
1557 if (pLed1->bLedOn)
1558 pLed1->BlinkingLedState = LED_OFF;
1559 else
1560 pLed1->BlinkingLedState = LED_ON;
1561 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1562 break;
1563 case LED_CTL_STOP_WPS_FAIL_OVERLAP: /*WPS session overlap*/
1564 if (pLed->bLedWPSBlinkInProgress) {
1565 _cancel_timer_ex(&(pLed->BlinkTimer));
1566 pLed->bLedWPSBlinkInProgress = false;
1567 }
1568 pLed->bLedNoLinkBlinkInProgress = true;
1569 pLed->CurrLedState = LED_BLINK_SLOWLY;
1570 if (pLed->bLedOn)
1571 pLed->BlinkingLedState = LED_OFF;
1572 else
1573 pLed->BlinkingLedState = LED_ON;
1574 _set_timer(&(pLed->BlinkTimer),
1575 LED_BLINK_NO_LINK_INTERVAL_ALPHA);
1576 /*LED1 settings*/
1577 if (pLed1->bLedWPSBlinkInProgress)
1578 _cancel_timer_ex(&(pLed1->BlinkTimer));
1579 else
1580 pLed1->bLedWPSBlinkInProgress = true;
1581 pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
1582 pLed1->BlinkTimes = 10;
1583 if (pLed1->bLedOn)
1584 pLed1->BlinkingLedState = LED_OFF;
1585 else
1586 pLed1->BlinkingLedState = LED_ON;
1587 _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
1588 break;
1589 case LED_CTL_POWER_OFF:
1590 pLed->CurrLedState = LED_OFF;
1591 pLed->BlinkingLedState = LED_OFF;
1592 if (pLed->bLedNoLinkBlinkInProgress) {
1593 _cancel_timer_ex(&(pLed->BlinkTimer));
1594 pLed->bLedNoLinkBlinkInProgress = false;
1595 }
1596 if (pLed->bLedLinkBlinkInProgress) {
1597 _cancel_timer_ex(&(pLed->BlinkTimer));
1598 pLed->bLedLinkBlinkInProgress = false;
1599 }
1600 if (pLed->bLedBlinkInProgress) {
1601 _cancel_timer_ex(&(pLed->BlinkTimer));
1602 pLed->bLedBlinkInProgress = false;
1603 }
1604 if (pLed->bLedWPSBlinkInProgress) {
1605 _cancel_timer_ex(&(pLed->BlinkTimer));
1606 pLed->bLedWPSBlinkInProgress = false;
1607 }
1608 if (pLed->bLedScanBlinkInProgress) {
1609 _cancel_timer_ex(&(pLed->BlinkTimer));
1610 pLed->bLedScanBlinkInProgress = false;
1611 }
1612 if (pLed->bLedStartToLinkBlinkInProgress) {
1613 _cancel_timer_ex(&(pLed->BlinkTimer));
1614 pLed->bLedStartToLinkBlinkInProgress = false;
1615 }
1616 if (pLed1->bLedWPSBlinkInProgress) {
1617 _cancel_timer_ex(&(pLed1->BlinkTimer));
1618 pLed1->bLedWPSBlinkInProgress = false;
1619 }
1620 pLed1->BlinkingLedState = LED_UNKNOWN;
1621 SwLedOff(padapter, pLed);
1622 SwLedOff(padapter, pLed1);
1623 break;
1624 default:
1625 break;
1626 }
1627}
1628
1629static void SwLedControlMode5(struct _adapter *padapter,
1630 enum LED_CTL_MODE LedAction)
1631{
1632 struct led_priv *ledpriv = &(padapter->ledpriv);
1633 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1634 struct LED_871x *pLed = &(ledpriv->SwLed0);
1635
1636 if (padapter->eeprompriv.CustomerID == RT_CID_819x_CAMEO)
1637 pLed = &(ledpriv->SwLed1);
1638
1639 switch (LedAction) {
1640 case LED_CTL_POWER_ON:
1641 case LED_CTL_NO_LINK:
1642 case LED_CTL_LINK: /* solid blue */
1643 if (pLed->CurrLedState == LED_SCAN_BLINK)
1644 return;
1645 pLed->CurrLedState = LED_ON;
1646 pLed->BlinkingLedState = LED_ON;
1647 pLed->bLedBlinkInProgress = false;
1648 _set_timer(&(pLed->BlinkTimer), 0);
1649 break;
1650 case LED_CTL_SITE_SURVEY:
1651 if ((pmlmepriv->sitesurveyctrl.traffic_busy) &&
1652 (check_fwstate(pmlmepriv, _FW_LINKED) == true))
1653 ; /* dummy branch */
1654 else if (pLed->bLedScanBlinkInProgress == false) {
1655 if (pLed->bLedBlinkInProgress == true) {
1656 _cancel_timer_ex(&(pLed->BlinkTimer));
1657 pLed->bLedBlinkInProgress = false;
1658 }
1659 pLed->bLedScanBlinkInProgress = true;
1660 pLed->CurrLedState = LED_SCAN_BLINK;
1661 pLed->BlinkTimes = 24;
1662 if (pLed->bLedOn)
1663 pLed->BlinkingLedState = LED_OFF;
1664 else
1665 pLed->BlinkingLedState = LED_ON;
1666 _set_timer(&(pLed->BlinkTimer),
1667 LED_BLINK_SCAN_INTERVAL_ALPHA);
1668 }
1669 break;
1670 case LED_CTL_TX:
1671 case LED_CTL_RX:
1672 if (pLed->bLedBlinkInProgress == false) {
1673 if (pLed->CurrLedState == LED_SCAN_BLINK)
1674 return;
1675 pLed->bLedBlinkInProgress = true;
1676 pLed->CurrLedState = LED_TXRX_BLINK;
1677 pLed->BlinkTimes = 2;
1678 if (pLed->bLedOn)
1679 pLed->BlinkingLedState = LED_OFF;
1680 else
1681 pLed->BlinkingLedState = LED_ON;
1682 _set_timer(&(pLed->BlinkTimer),
1683 LED_BLINK_FASTER_INTERVAL_ALPHA);
1684 }
1685 break;
1686 case LED_CTL_POWER_OFF:
1687 pLed->CurrLedState = LED_OFF;
1688 pLed->BlinkingLedState = LED_OFF;
1689 if (pLed->bLedBlinkInProgress) {
1690 _cancel_timer_ex(&(pLed->BlinkTimer));
1691 pLed->bLedBlinkInProgress = false;
1692 }
1693 SwLedOff(padapter, pLed);
1694 break;
1695 default:
1696 break;
1697 }
1698}
1699
1700
1701static void SwLedControlMode6(struct _adapter *padapter,
1702 enum LED_CTL_MODE LedAction)
1703{
1704 struct led_priv *ledpriv = &(padapter->ledpriv);
1705 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1706 struct LED_871x *pLed = &(ledpriv->SwLed0);
1707
1708 switch (LedAction) {
1709 case LED_CTL_POWER_ON:
1710 case LED_CTL_NO_LINK:
1711 case LED_CTL_LINK: /*solid blue*/
1712 case LED_CTL_SITE_SURVEY:
1713 if (IS_LED_WPS_BLINKING(pLed))
1714 return;
1715 pLed->CurrLedState = LED_ON;
1716 pLed->BlinkingLedState = LED_ON;
1717 pLed->bLedBlinkInProgress = false;
1718 _set_timer(&(pLed->BlinkTimer), 0);
1719 break;
1720 case LED_CTL_TX:
1721 case LED_CTL_RX:
1722 if (pLed->bLedBlinkInProgress == false &&
1723 (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
1724 if (IS_LED_WPS_BLINKING(pLed))
1725 return;
1726 pLed->bLedBlinkInProgress = true;
1727 pLed->CurrLedState = LED_TXRX_BLINK;
1728 pLed->BlinkTimes = 2;
1729 if (pLed->bLedOn)
1730 pLed->BlinkingLedState = LED_OFF;
1731 else
1732 pLed->BlinkingLedState = LED_ON;
1733 _set_timer(&(pLed->BlinkTimer),
1734 LED_BLINK_FASTER_INTERVAL_ALPHA);
1735 }
1736 break;
1737 case LED_CTL_START_WPS: /*wait until xinpin finish*/
1738 case LED_CTL_START_WPS_BOTTON:
1739 if (pLed->bLedWPSBlinkInProgress == false) {
1740 if (pLed->bLedBlinkInProgress == true) {
1741 _cancel_timer_ex(&(pLed->BlinkTimer));
1742 pLed->bLedBlinkInProgress = false;
1743 }
1744 pLed->bLedWPSBlinkInProgress = true;
1745 pLed->CurrLedState = LED_BLINK_WPS;
1746 if (pLed->bLedOn)
1747 pLed->BlinkingLedState = LED_OFF;
1748 else
1749 pLed->BlinkingLedState = LED_ON;
1750 _set_timer(&(pLed->BlinkTimer),
1751 LED_BLINK_SCAN_INTERVAL_ALPHA);
1752 }
1753 break;
1754 case LED_CTL_STOP_WPS_FAIL:
1755 case LED_CTL_STOP_WPS:
1756 if (pLed->bLedWPSBlinkInProgress) {
1757 _cancel_timer_ex(&(pLed->BlinkTimer));
1758 pLed->bLedWPSBlinkInProgress = false;
1759 }
1760 pLed->CurrLedState = LED_ON;
1761 pLed->BlinkingLedState = LED_ON;
1762 _set_timer(&(pLed->BlinkTimer), 0);
1763 break;
1764 case LED_CTL_POWER_OFF:
1765 pLed->CurrLedState = LED_OFF;
1766 pLed->BlinkingLedState = LED_OFF;
1767 if (pLed->bLedBlinkInProgress) {
1768 _cancel_timer_ex(&(pLed->BlinkTimer));
1769 pLed->bLedBlinkInProgress = false;
1770 }
1771 if (pLed->bLedWPSBlinkInProgress) {
1772 _cancel_timer_ex(&(pLed->BlinkTimer));
1773 pLed->bLedWPSBlinkInProgress = false;
1774 }
1775 SwLedOff(padapter, pLed);
1776 break;
1777 default:
1778 break;
1779 }
1780}
1781
1782/* Description:
1783 * Dispatch LED action according to pHalData->LedStrategy.
1784 */
1785void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction)
1786{
1787 struct led_priv *ledpriv = &(padapter->ledpriv);
1788
1789 if (ledpriv == NULL || ledpriv->bRegUseLed == false)
1790 return;
1791 switch (ledpriv->LedStrategy) {
1792 case SW_LED_MODE0:
1793 break;
1794 case SW_LED_MODE1:
1795 SwLedControlMode1(padapter, LedAction);
1796 break;
1797 case SW_LED_MODE2:
1798 SwLedControlMode2(padapter, LedAction);
1799 break;
1800 case SW_LED_MODE3:
1801 SwLedControlMode3(padapter, LedAction);
1802 break;
1803 case SW_LED_MODE4:
1804 SwLedControlMode4(padapter, LedAction);
1805 break;
1806 case SW_LED_MODE5:
1807 SwLedControlMode5(padapter, LedAction);
1808 break;
1809 case SW_LED_MODE6:
1810 SwLedControlMode6(padapter, LedAction);
1811 break;
1812 default:
1813 break;
1814 }
1815}
diff --git a/drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h b/drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h
new file mode 100644
index 00000000000..74800cd2340
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h
@@ -0,0 +1,28 @@
1#ifndef __RTL8712_MACSETTING_BITDEF_H__
2#define __RTL8712_MACSETTING_BITDEF_H__
3
4
5/*MACID*/
6/*BSSID*/
7
8/*HWVID*/
9#define _HWVID_MSK 0x0F
10
11/*MAR*/
12/*MBIDCANCONTENT*/
13
14/*MBIDCANCFG*/
15#define _POOLING BIT(31)
16#define _WRITE_EN BIT(16)
17#define _CAM_ADDR_MSK 0x001F
18#define _CAM_ADDR_SHT 0
19
20/*BUILDTIME*/
21#define _BUILDTIME_MSK 0x3FFFFFFF
22
23/*BUILDUSER*/
24
25
26
27#endif /* __RTL8712_MACSETTING_BITDEF_H__*/
28
diff --git a/drivers/staging/rtl8712/rtl8712_macsetting_regdef.h b/drivers/staging/rtl8712/rtl8712_macsetting_regdef.h
new file mode 100644
index 00000000000..00b003bd690
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_macsetting_regdef.h
@@ -0,0 +1,16 @@
1#ifndef __RTL8712_MACSETTING_REGDEF_H__
2#define __RTL8712_MACSETTING_REGDEF_H__
3
4#define MACID (RTL8712_MACIDSETTING_ + 0x0000)
5#define BSSIDR (RTL8712_MACIDSETTING_ + 0x0008)
6#define HWVID (RTL8712_MACIDSETTING_ + 0x000E)
7#define MAR (RTL8712_MACIDSETTING_ + 0x0010)
8#define MBIDCANCONTENT (RTL8712_MACIDSETTING_ + 0x0018)
9#define MBIDCANCFG (RTL8712_MACIDSETTING_ + 0x0020)
10#define BUILDTIME (RTL8712_MACIDSETTING_ + 0x0024)
11#define BUILDUSER (RTL8712_MACIDSETTING_ + 0x0028)
12
13
14
15#endif /*__RTL8712_MACSETTING_REGDEF_H__*/
16
diff --git a/drivers/staging/rtl8712/rtl8712_powersave_bitdef.h b/drivers/staging/rtl8712/rtl8712_powersave_bitdef.h
new file mode 100644
index 00000000000..0922a8dc132
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_powersave_bitdef.h
@@ -0,0 +1,33 @@
1#ifndef __RTL8712_POWERSAVE_BITDEF_H__
2#define __RTL8712_POWERSAVE_BITDEF_H__
3
4/*WOWCTRL*/
5#define _UWF BIT(3)
6#define _MAGIC BIT(2)
7#define _WOW_EN BIT(1)
8#define _PMEN BIT(0)
9
10/*PSSTATUS*/
11#define _PSSTATUS_SEL_MSK 0x0F
12
13/*PSSWITCH*/
14#define _PSSWITCH_ACT BIT(7)
15#define _PSSWITCH_SEL_MSK 0x0F
16#define _PSSWITCH_SEL_SHT 0
17
18/*LPNAV_CTRL*/
19#define _LPNAV_EN BIT(31)
20#define _LPNAV_EARLY_MSK 0x7FFF0000
21#define _LPNAV_EARLY_SHT 16
22#define _LPNAV_TH_MSK 0x0000FFFF
23#define _LPNAV_TH_SHT 0
24
25/*RPWM*/
26/*CPWM*/
27#define _TOGGLING BIT(7)
28#define _WWLAN BIT(3)
29#define _RPS_ST BIT(2)
30#define _WLAN_TRX BIT(1)
31#define _SYS_CLK BIT(0)
32
33#endif /* __RTL8712_POWERSAVE_BITDEF_H__*/
diff --git a/drivers/staging/rtl8712/rtl8712_powersave_regdef.h b/drivers/staging/rtl8712/rtl8712_powersave_regdef.h
new file mode 100644
index 00000000000..72927df3db2
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_powersave_regdef.h
@@ -0,0 +1,20 @@
1#ifndef __RTL8712_POWERSAVE_REGDEF_H__
2#define __RTL8712_POWERSAVE_REGDEF_H__
3
4#define WOWCTRL (RTL8712_POWERSAVE_ + 0x00)
5#define PSSTATUS (RTL8712_POWERSAVE_ + 0x01)
6#define PSSWITCH (RTL8712_POWERSAVE_ + 0x02)
7#define MIMOPS_WAITPERIOD (RTL8712_POWERSAVE_ + 0x03)
8#define LPNAV_CTRL (RTL8712_POWERSAVE_ + 0x04)
9#define WFM0 (RTL8712_POWERSAVE_ + 0x10)
10#define WFM1 (RTL8712_POWERSAVE_ + 0x20)
11#define WFM2 (RTL8712_POWERSAVE_ + 0x30)
12#define WFM3 (RTL8712_POWERSAVE_ + 0x40)
13#define WFM4 (RTL8712_POWERSAVE_ + 0x50)
14#define WFM5 (RTL8712_POWERSAVE_ + 0x60)
15#define WFCRC (RTL8712_POWERSAVE_ + 0x70)
16#define RPWM (RTL8712_POWERSAVE_ + 0x7C)
17#define CPWM (RTL8712_POWERSAVE_ + 0x7D)
18
19#endif /* __RTL8712_POWERSAVE_REGDEF_H__ */
20
diff --git a/drivers/staging/rtl8712/rtl8712_ratectrl_bitdef.h b/drivers/staging/rtl8712/rtl8712_ratectrl_bitdef.h
new file mode 100644
index 00000000000..87048b3fe04
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_ratectrl_bitdef.h
@@ -0,0 +1,30 @@
1#ifndef __RTL8712_RATECTRL_BITDEF_H__
2#define __RTL8712_RATECTRL_BITDEF_H__
3
4/*INIRTSMCS_SEL*/
5#define _INIRTSMCS_SEL_MSK 0x3F
6
7/* RRSR*/
8#define _RRSR_SHORT BIT(23)
9#define _RRSR_RSC_MSK 0x600000
10#define _RRSR_RSC_SHT 21
11#define _RRSR_BITMAP_MSK 0x0FFFFF
12#define _RRSR_BITMAP_SHT 0
13
14/* AGGLEN_LMT_H*/
15#define _AGGLMT_MCS32_MSK 0xF0
16#define _AGGLMT_MCS32_SHT 4
17#define _AGGLMT_MCS15_SGI_MSK 0x0F
18#define _AGGLMT_MCS15_SGI_SHT 0
19
20/* DARFRC*/
21/* RARFRC*/
22/* MCS_TXAGC*/
23/* CCK_TXAGC*/
24#define _CCK_MSK 0xFF00
25#define _CCK_SHT 8
26#define _BARKER_MSK 0x00FF
27#define _BARKER_SHT 0
28
29#endif /* __RTL8712_RATECTRL_BITDEF_H__*/
30
diff --git a/drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h b/drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h
new file mode 100644
index 00000000000..31c8363e5bc
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h
@@ -0,0 +1,31 @@
1#ifndef __RTL8712_RATECTRL_REGDEF_H__
2#define __RTL8712_RATECTRL_REGDEF_H__
3
4#define INIMCS_SEL (RTL8712_RATECTRL_ + 0x00)
5#define INIRTSMCS_SEL (RTL8712_RATECTRL_ + 0x20)
6#define RRSR (RTL8712_RATECTRL_ + 0x21)
7#define ARFR0 (RTL8712_RATECTRL_ + 0x24)
8#define ARFR1 (RTL8712_RATECTRL_ + 0x28)
9#define ARFR2 (RTL8712_RATECTRL_ + 0x2C)
10#define ARFR3 (RTL8712_RATECTRL_ + 0x30)
11#define ARFR4 (RTL8712_RATECTRL_ + 0x34)
12#define ARFR5 (RTL8712_RATECTRL_ + 0x38)
13#define ARFR6 (RTL8712_RATECTRL_ + 0x3C)
14#define ARFR7 (RTL8712_RATECTRL_ + 0x40)
15#define AGGLEN_LMT_H (RTL8712_RATECTRL_ + 0x47)
16#define AGGLEN_LMT_L (RTL8712_RATECTRL_ + 0x48)
17#define DARFRC (RTL8712_RATECTRL_ + 0x50)
18#define RARFRC (RTL8712_RATECTRL_ + 0x58)
19#define MCS_TXAGC0 (RTL8712_RATECTRL_ + 0x60)
20#define MCS_TXAGC1 (RTL8712_RATECTRL_ + 0x61)
21#define MCS_TXAGC2 (RTL8712_RATECTRL_ + 0x62)
22#define MCS_TXAGC3 (RTL8712_RATECTRL_ + 0x63)
23#define MCS_TXAGC4 (RTL8712_RATECTRL_ + 0x64)
24#define MCS_TXAGC5 (RTL8712_RATECTRL_ + 0x65)
25#define MCS_TXAGC6 (RTL8712_RATECTRL_ + 0x66)
26#define MCS_TXAGC7 (RTL8712_RATECTRL_ + 0x67)
27#define CCK_TXAGC (RTL8712_RATECTRL_ + 0x68)
28
29
30#endif /*__RTL8712_RATECTRL_REGDEF_H__*/
31
diff --git a/drivers/staging/rtl8712/rtl8712_recv.c b/drivers/staging/rtl8712/rtl8712_recv.c
new file mode 100644
index 00000000000..f63ca4c2f18
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_recv.c
@@ -0,0 +1,1145 @@
1/******************************************************************************
2 * rtl8712_recv.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL8712_RECV_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "recv_osdep.h"
34#include "mlme_osdep.h"
35#include "ip.h"
36#include "if_ether.h"
37#include "ethernet.h"
38#include "usb_ops.h"
39#include "wifi.h"
40
41/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
42static u8 bridge_tunnel_header[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8};
43
44/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
45static u8 rfc1042_header[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
46
47static void recv_tasklet(void *priv);
48
49int r8712_init_recv_priv(struct recv_priv *precvpriv, struct _adapter *padapter)
50{
51 int i;
52 struct recv_buf *precvbuf;
53 int res = _SUCCESS;
54 addr_t tmpaddr = 0;
55 int alignment = 0;
56 struct sk_buff *pskb = NULL;
57
58 sema_init(&precvpriv->recv_sema, 0);
59 sema_init(&precvpriv->terminate_recvthread_sema, 0);
60 /*init recv_buf*/
61 _init_queue(&precvpriv->free_recv_buf_queue);
62 precvpriv->pallocated_recv_buf = _malloc(NR_RECVBUFF *
63 sizeof(struct recv_buf) + 4);
64 if (precvpriv->pallocated_recv_buf == NULL)
65 return _FAIL;
66 memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF *
67 sizeof(struct recv_buf) + 4);
68 precvpriv->precv_buf = precvpriv->pallocated_recv_buf + 4 -
69 ((addr_t) (precvpriv->pallocated_recv_buf) & 3);
70 precvbuf = (struct recv_buf *)precvpriv->precv_buf;
71 for (i = 0; i < NR_RECVBUFF; i++) {
72 _init_listhead(&precvbuf->list);
73 spin_lock_init(&precvbuf->recvbuf_lock);
74 res = r8712_os_recvbuf_resource_alloc(padapter, precvbuf);
75 if (res == _FAIL)
76 break;
77 precvbuf->ref_cnt = 0;
78 precvbuf->adapter = padapter;
79 list_insert_tail(&precvbuf->list,
80 &(precvpriv->free_recv_buf_queue.queue));
81 precvbuf++;
82 }
83 precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF;
84 tasklet_init(&precvpriv->recv_tasklet,
85 (void(*)(unsigned long))recv_tasklet,
86 (unsigned long)padapter);
87 skb_queue_head_init(&precvpriv->rx_skb_queue);
88
89 skb_queue_head_init(&precvpriv->free_recv_skb_queue);
90 for (i = 0; i < NR_PREALLOC_RECV_SKB; i++) {
91 pskb = netdev_alloc_skb(padapter->pnetdev, MAX_RECVBUF_SZ +
92 RECVBUFF_ALIGN_SZ);
93 if (pskb) {
94 pskb->dev = padapter->pnetdev;
95 tmpaddr = (addr_t)pskb->data;
96 alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
97 skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));
98 skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
99 }
100 pskb = NULL;
101 }
102 return res;
103}
104
105void r8712_free_recv_priv(struct recv_priv *precvpriv)
106{
107 int i;
108 struct recv_buf *precvbuf;
109 struct _adapter *padapter = precvpriv->adapter;
110
111 precvbuf = (struct recv_buf *)precvpriv->precv_buf;
112 for (i = 0; i < NR_RECVBUFF ; i++) {
113 r8712_os_recvbuf_resource_free(padapter, precvbuf);
114 precvbuf++;
115 }
116 kfree(precvpriv->pallocated_recv_buf);
117 skb_queue_purge(&precvpriv->rx_skb_queue);
118 if (skb_queue_len(&precvpriv->rx_skb_queue))
119 printk(KERN_WARNING "r8712u: rx_skb_queue not empty\n");
120 skb_queue_purge(&precvpriv->free_recv_skb_queue);
121 if (skb_queue_len(&precvpriv->free_recv_skb_queue))
122 printk(KERN_WARNING "r8712u: free_recv_skb_queue not empty "
123 "%d\n", skb_queue_len(&precvpriv->free_recv_skb_queue));
124}
125
126int r8712_init_recvbuf(struct _adapter *padapter, struct recv_buf *precvbuf)
127{
128 int res = _SUCCESS;
129
130 precvbuf->transfer_len = 0;
131 precvbuf->len = 0;
132 precvbuf->ref_cnt = 0;
133 if (precvbuf->pbuf) {
134 precvbuf->pdata = precvbuf->pbuf;
135 precvbuf->phead = precvbuf->pbuf;
136 precvbuf->ptail = precvbuf->pbuf;
137 precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ;
138 }
139 return res;
140}
141
142void init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpriv)
143{
144 struct recv_buf *precvbuf = precvframe->u.hdr.precvbuf;
145
146 /* Perry: This can be removed */
147 _init_listhead(&precvframe->u.hdr.list);
148 precvframe->u.hdr.len = 0;
149 if (precvbuf) {
150 if (precvbuf->pskb)
151 precvframe->u.hdr.pkt = skb_clone(precvbuf->pskb,
152 GFP_ATOMIC);
153 }
154}
155
156int r8712_free_recvframe(union recv_frame *precvframe,
157 struct __queue *pfree_recv_queue)
158{
159 unsigned long irqL;
160 struct _adapter *padapter = precvframe->u.hdr.adapter;
161 struct recv_priv *precvpriv = &padapter->recvpriv;
162
163 if (precvframe->u.hdr.pkt) {
164 dev_kfree_skb_any(precvframe->u.hdr.pkt);/*free skb by driver*/
165 precvframe->u.hdr.pkt = NULL;
166 }
167 spin_lock_irqsave(&pfree_recv_queue->lock, irqL);
168 list_delete(&(precvframe->u.hdr.list));
169 list_insert_tail(&(precvframe->u.hdr.list),
170 get_list_head(pfree_recv_queue));
171 if (padapter != NULL) {
172 if (pfree_recv_queue == &precvpriv->free_recv_queue)
173 precvpriv->free_recvframe_cnt++;
174 }
175 spin_unlock_irqrestore(&pfree_recv_queue->lock, irqL);
176 return _SUCCESS;
177}
178
179static void update_recvframe_attrib_from_recvstat(struct rx_pkt_attrib *pattrib,
180 struct recv_stat *prxstat)
181{
182 u32 *pphy_info;
183 struct phy_stat *pphy_stat;
184 u16 drvinfo_sz = 0;
185
186 drvinfo_sz = (le32_to_cpu(prxstat->rxdw0)&0x000f0000)>>16;
187 drvinfo_sz = drvinfo_sz<<3;
188 /*TODO:
189 * Offset 0 */
190 pattrib->bdecrypted = ((le32_to_cpu(prxstat->rxdw0) & BIT(27)) >> 27)
191 ? 0 : 1;
192 pattrib->crc_err = ((le32_to_cpu(prxstat->rxdw0) & BIT(14)) >> 14);
193 /*Offset 4*/
194 /*Offset 8*/
195 /*Offset 12*/
196 if (le32_to_cpu(prxstat->rxdw3) & BIT(13)) {
197 pattrib->tcpchk_valid = 1; /* valid */
198 if (le32_to_cpu(prxstat->rxdw3) & BIT(11))
199 pattrib->tcp_chkrpt = 1; /* correct */
200 else
201 pattrib->tcp_chkrpt = 0; /* incorrect */
202 if (le32_to_cpu(prxstat->rxdw3) & BIT(12))
203 pattrib->ip_chkrpt = 1; /* correct */
204 else
205 pattrib->ip_chkrpt = 0; /* incorrect */
206 } else
207 pattrib->tcpchk_valid = 0; /* invalid */
208 pattrib->mcs_rate = (u8)((le32_to_cpu(prxstat->rxdw3)) & 0x3f);
209 pattrib->htc = (u8)((le32_to_cpu(prxstat->rxdw3) >> 6) & 0x1);
210 /*Offset 16*/
211 /*Offset 20*/
212 /*phy_info*/
213 if (drvinfo_sz) {
214 pphy_stat = (struct phy_stat *)(prxstat+1);
215 pphy_info = (u32 *)prxstat+1;
216 }
217}
218
219/*perform defrag*/
220union recv_frame *recvframe_defrag(struct _adapter *adapter,
221 struct __queue *defrag_q)
222{
223 struct list_head *plist, *phead;
224 u8 wlanhdr_offset;
225 u8 curfragnum;
226 struct recv_frame_hdr *pfhdr, *pnfhdr;
227 union recv_frame *prframe, *pnextrframe;
228 struct __queue *pfree_recv_queue;
229
230 pfree_recv_queue = &adapter->recvpriv.free_recv_queue;
231 phead = get_list_head(defrag_q);
232 plist = get_next(phead);
233 prframe = LIST_CONTAINOR(plist, union recv_frame, u);
234 list_delete(&prframe->u.list);
235 pfhdr = &prframe->u.hdr;
236 curfragnum = 0;
237 if (curfragnum != pfhdr->attrib.frag_num) {
238 /*the first fragment number must be 0
239 *free the whole queue*/
240 r8712_free_recvframe(prframe, pfree_recv_queue);
241 prframe = NULL;
242 goto exit;
243 }
244 plist = get_next(phead);
245 while (end_of_queue_search(phead, plist) == false) {
246 pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u);
247 /*check the fragment sequence (2nd ~n fragment frame) */
248 pnfhdr = &pnextrframe->u.hdr;
249 curfragnum++;
250 if (curfragnum != pnfhdr->attrib.frag_num) {
251 /* the fragment number must increase (after decache)
252 * release the defrag_q & prframe */
253 r8712_free_recvframe(prframe, pfree_recv_queue);
254 prframe = NULL;
255 goto exit;
256 }
257 /* copy the 2nd~n fragment frame's payload to the first fragment
258 * get the 2nd~last fragment frame's payload */
259 wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;
260 recvframe_pull(pnextrframe, wlanhdr_offset);
261 /* append to first fragment frame's tail (if privacy frame,
262 * pull the ICV) */
263 recvframe_pull_tail(prframe, pfhdr->attrib.icv_len);
264 memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len);
265 recvframe_put(prframe, pnfhdr->len);
266 pfhdr->attrib.icv_len = pnfhdr->attrib.icv_len;
267 plist = get_next(plist);
268 };
269exit:
270 /* free the defrag_q queue and return the prframe */
271 r8712_free_recvframe_queue(defrag_q, pfree_recv_queue);
272 return prframe;
273}
274
275/* check if need to defrag, if needed queue the frame to defrag_q */
276union recv_frame *r8712_recvframe_chk_defrag(struct _adapter *padapter,
277 union recv_frame *precv_frame)
278{
279 u8 ismfrag;
280 u8 fragnum;
281 u8 *psta_addr;
282 struct recv_frame_hdr *pfhdr;
283 struct sta_info *psta;
284 struct sta_priv *pstapriv ;
285 struct list_head *phead;
286 union recv_frame *prtnframe = NULL;
287 struct __queue *pfree_recv_queue, *pdefrag_q;
288
289 pstapriv = &padapter->stapriv;
290 pfhdr = &precv_frame->u.hdr;
291 pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
292 /* need to define struct of wlan header frame ctrl */
293 ismfrag = pfhdr->attrib.mfrag;
294 fragnum = pfhdr->attrib.frag_num;
295 psta_addr = pfhdr->attrib.ta;
296 psta = r8712_get_stainfo(pstapriv, psta_addr);
297 if (psta == NULL)
298 pdefrag_q = NULL;
299 else
300 pdefrag_q = &psta->sta_recvpriv.defrag_q;
301
302 if ((ismfrag == 0) && (fragnum == 0))
303 prtnframe = precv_frame;/*isn't a fragment frame*/
304 if (ismfrag == 1) {
305 /* 0~(n-1) fragment frame
306 * enqueue to defraf_g */
307 if (pdefrag_q != NULL) {
308 if (fragnum == 0) {
309 /*the first fragment*/
310 if (_queue_empty(pdefrag_q) == false) {
311 /*free current defrag_q */
312 r8712_free_recvframe_queue(pdefrag_q,
313 pfree_recv_queue);
314 }
315 }
316 /* Then enqueue the 0~(n-1) fragment to the defrag_q */
317 phead = get_list_head(pdefrag_q);
318 list_insert_tail(&pfhdr->list, phead);
319 prtnframe = NULL;
320 } else {
321 /* can't find this ta's defrag_queue, so free this
322 * recv_frame */
323 r8712_free_recvframe(precv_frame, pfree_recv_queue);
324 prtnframe = NULL;
325 }
326
327 }
328 if ((ismfrag == 0) && (fragnum != 0)) {
329 /* the last fragment frame
330 * enqueue the last fragment */
331 if (pdefrag_q != NULL) {
332 phead = get_list_head(pdefrag_q);
333 list_insert_tail(&pfhdr->list, phead);
334 /*call recvframe_defrag to defrag*/
335 precv_frame = recvframe_defrag(padapter, pdefrag_q);
336 prtnframe = precv_frame;
337 } else {
338 /* can't find this ta's defrag_queue, so free this
339 * recv_frame */
340 r8712_free_recvframe(precv_frame, pfree_recv_queue);
341 prtnframe = NULL;
342 }
343 }
344 if ((prtnframe != NULL) && (prtnframe->u.hdr.attrib.privacy)) {
345 /* after defrag we must check tkip mic code */
346 if (r8712_recvframe_chkmic(padapter, prtnframe) == _FAIL) {
347 r8712_free_recvframe(prtnframe, pfree_recv_queue);
348 prtnframe = NULL;
349 }
350 }
351 return prtnframe;
352}
353
354int amsdu_to_msdu(struct _adapter *padapter, union recv_frame *prframe)
355{
356 int a_len, padding_len;
357 u16 eth_type, nSubframe_Length;
358 u8 nr_subframes, i;
359 unsigned char *data_ptr, *pdata;
360 struct rx_pkt_attrib *pattrib;
361 _pkt *sub_skb, *subframes[MAX_SUBFRAME_COUNT];
362 struct recv_priv *precvpriv = &padapter->recvpriv;
363 struct __queue *pfree_recv_queue = &(precvpriv->free_recv_queue);
364 int ret = _SUCCESS;
365
366 nr_subframes = 0;
367 pattrib = &prframe->u.hdr.attrib;
368 recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen);
369 if (prframe->u.hdr.attrib.iv_len > 0)
370 recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len);
371 a_len = prframe->u.hdr.len;
372 pdata = prframe->u.hdr.rx_data;
373 while (a_len > ETH_HLEN) {
374 /* Offset 12 denote 2 mac address */
375 nSubframe_Length = *((u16 *)(pdata + 12));
376 /*==m==>change the length order*/
377 nSubframe_Length = (nSubframe_Length >> 8) +
378 (nSubframe_Length << 8);
379 if (a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length)) {
380 printk(KERN_WARNING "r8712u: nRemain_Length is %d and"
381 " nSubframe_Length is: %d\n",
382 a_len, nSubframe_Length);
383 goto exit;
384 }
385 /* move the data point to data content */
386 pdata += ETH_HLEN;
387 a_len -= ETH_HLEN;
388 /* Allocate new skb for releasing to upper layer */
389 sub_skb = dev_alloc_skb(nSubframe_Length + 12);
390 skb_reserve(sub_skb, 12);
391 data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length);
392 memcpy(data_ptr, pdata, nSubframe_Length);
393 subframes[nr_subframes++] = sub_skb;
394 if (nr_subframes >= MAX_SUBFRAME_COUNT) {
395 printk(KERN_WARNING "r8712u: ParseSubframe(): Too"
396 " many Subframes! Packets dropped!\n");
397 break;
398 }
399 pdata += nSubframe_Length;
400 a_len -= nSubframe_Length;
401 if (a_len != 0) {
402 padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & 3);
403 if (padding_len == 4)
404 padding_len = 0;
405 if (a_len < padding_len)
406 goto exit;
407 pdata += padding_len;
408 a_len -= padding_len;
409 }
410 }
411 for (i = 0; i < nr_subframes; i++) {
412 sub_skb = subframes[i];
413 /* convert hdr + possible LLC headers into Ethernet header */
414 eth_type = (sub_skb->data[6] << 8) | sub_skb->data[7];
415 if (sub_skb->len >= 8 &&
416 ((!memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) &&
417 eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
418 !memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE))) {
419 /* remove RFC1042 or Bridge-Tunnel encapsulation and
420 * replace EtherType */
421 skb_pull(sub_skb, SNAP_SIZE);
422 memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src,
423 ETH_ALEN);
424 memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst,
425 ETH_ALEN);
426 } else {
427 u16 len;
428 /* Leave Ethernet header part of hdr and full payload */
429 len = htons(sub_skb->len);
430 memcpy(skb_push(sub_skb, 2), &len, 2);
431 memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src,
432 ETH_ALEN);
433 memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst,
434 ETH_ALEN);
435 }
436 /* Indicate the packets to upper layer */
437 if (sub_skb) {
438 sub_skb->protocol =
439 eth_type_trans(sub_skb, padapter->pnetdev);
440 sub_skb->dev = padapter->pnetdev;
441 if ((pattrib->tcpchk_valid == 1) &&
442 (pattrib->tcp_chkrpt == 1)) {
443 sub_skb->ip_summed = CHECKSUM_UNNECESSARY;
444 } else
445 sub_skb->ip_summed = CHECKSUM_NONE;
446 netif_rx(sub_skb);
447 }
448 }
449exit:
450 prframe->u.hdr.len = 0;
451 r8712_free_recvframe(prframe, pfree_recv_queue);
452 return ret;
453}
454
455void r8712_rxcmd_event_hdl(struct _adapter *padapter, void *prxcmdbuf)
456{
457 uint voffset;
458 u8 *poffset;
459 u16 pkt_len, cmd_len, drvinfo_sz;
460 u8 eid, cmd_seq;
461 struct recv_stat *prxstat;
462
463 poffset = (u8 *)prxcmdbuf;
464 voffset = *(uint *)poffset;
465 pkt_len = le32_to_cpu(voffset) & 0x00003fff;
466 prxstat = (struct recv_stat *)prxcmdbuf;
467 drvinfo_sz = ((le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16);
468 drvinfo_sz = drvinfo_sz << 3;
469 poffset += RXDESC_SIZE + drvinfo_sz;
470 do {
471 voffset = *(uint *)poffset;
472 cmd_len = (u16)(le32_to_cpu(voffset) & 0xffff);
473 cmd_seq = (u8)((le32_to_cpu(voffset) >> 24) & 0x7f);
474 eid = (u8)((le32_to_cpu(voffset) >> 16) & 0xff);
475 r8712_event_handle(padapter, (uint *)poffset);
476 poffset += (cmd_len + 8);/*8 bytes aligment*/
477 } while (le32_to_cpu(voffset) & BIT(31));
478
479}
480
481static int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl,
482 u16 seq_num)
483{
484 u8 wsize = preorder_ctrl->wsize_b;
485 u16 wend = (preorder_ctrl->indicate_seq + wsize - 1) % 4096;
486
487 /* Rx Reorder initialize condition.*/
488 if (preorder_ctrl->indicate_seq == 0xffff)
489 preorder_ctrl->indicate_seq = seq_num;
490 /* Drop out the packet which SeqNum is smaller than WinStart */
491 if (SN_LESS(seq_num, preorder_ctrl->indicate_seq))
492 return false;
493 /*
494 * Sliding window manipulation. Conditions includes:
495 * 1. Incoming SeqNum is equal to WinStart =>Window shift 1
496 * 2. Incoming SeqNum is larger than the WinEnd => Window shift N
497 */
498 if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq))
499 preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq +
500 1) % 4096;
501 else if (SN_LESS(wend, seq_num)) {
502 if (seq_num >= (wsize - 1))
503 preorder_ctrl->indicate_seq = seq_num + 1 - wsize;
504 else
505 preorder_ctrl->indicate_seq = 4095 - (wsize -
506 (seq_num + 1)) + 1;
507 }
508 return true;
509}
510
511static int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl,
512 union recv_frame *prframe)
513{
514 struct list_head *phead, *plist;
515 union recv_frame *pnextrframe;
516 struct rx_pkt_attrib *pnextattrib;
517 struct __queue *ppending_recvframe_queue =
518 &preorder_ctrl->pending_recvframe_queue;
519 struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
520
521 phead = get_list_head(ppending_recvframe_queue);
522 plist = get_next(phead);
523 while (end_of_queue_search(phead, plist) == false) {
524 pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u);
525 pnextattrib = &pnextrframe->u.hdr.attrib;
526 if (SN_LESS(pnextattrib->seq_num, pattrib->seq_num))
527 plist = get_next(plist);
528 else if (SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num))
529 return false;
530 else
531 break;
532 }
533 list_delete(&(prframe->u.hdr.list));
534 list_insert_tail(&(prframe->u.hdr.list), plist);
535 return true;
536}
537
538int r8712_recv_indicatepkts_in_order(struct _adapter *padapter,
539 struct recv_reorder_ctrl *preorder_ctrl,
540 int bforced)
541{
542 struct list_head *phead, *plist;
543 union recv_frame *prframe;
544 struct rx_pkt_attrib *pattrib;
545 int bPktInBuf = false;
546 struct recv_priv *precvpriv = &padapter->recvpriv;
547 struct __queue *ppending_recvframe_queue =
548 &preorder_ctrl->pending_recvframe_queue;
549
550 phead = get_list_head(ppending_recvframe_queue);
551 plist = get_next(phead);
552 /* Handling some condition for forced indicate case.*/
553 if (bforced == true) {
554 if (is_list_empty(phead))
555 return true;
556 else {
557 prframe = LIST_CONTAINOR(plist, union recv_frame, u);
558 pattrib = &prframe->u.hdr.attrib;
559 preorder_ctrl->indicate_seq = pattrib->seq_num;
560 }
561 }
562 /* Prepare indication list and indication.
563 * Check if there is any packet need indicate. */
564 while (!is_list_empty(phead)) {
565 prframe = LIST_CONTAINOR(plist, union recv_frame, u);
566 pattrib = &prframe->u.hdr.attrib;
567 if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) {
568 plist = get_next(plist);
569 list_delete(&(prframe->u.hdr.list));
570 if (SN_EQUAL(preorder_ctrl->indicate_seq,
571 pattrib->seq_num))
572 preorder_ctrl->indicate_seq =
573 (preorder_ctrl->indicate_seq + 1) % 4096;
574 /*indicate this recv_frame*/
575 if (!pattrib->amsdu) {
576 if ((padapter->bDriverStopped == false) &&
577 (padapter->bSurpriseRemoved == false)) {
578 /* indicate this recv_frame */
579 r8712_recv_indicatepkt(padapter,
580 prframe);
581 }
582 } else if (pattrib->amsdu == 1) {
583 if (amsdu_to_msdu(padapter, prframe) !=
584 _SUCCESS)
585 r8712_free_recvframe(prframe,
586 &precvpriv->free_recv_queue);
587 }
588 /* Update local variables. */
589 bPktInBuf = false;
590 } else {
591 bPktInBuf = true;
592 break;
593 }
594 }
595 return bPktInBuf;
596}
597
598static int recv_indicatepkt_reorder(struct _adapter *padapter,
599 union recv_frame *prframe)
600{
601 unsigned long irql;
602 struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
603 struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl;
604 struct __queue *ppending_recvframe_queue =
605 &preorder_ctrl->pending_recvframe_queue;
606
607 if (!pattrib->amsdu) {
608 /* s1. */
609 r8712_wlanhdr_to_ethhdr(prframe);
610 if (pattrib->qos != 1) {
611 if ((padapter->bDriverStopped == false) &&
612 (padapter->bSurpriseRemoved == false)) {
613 r8712_recv_indicatepkt(padapter, prframe);
614 return _SUCCESS;
615 } else
616 return _FAIL;
617 }
618 }
619 spin_lock_irqsave(&ppending_recvframe_queue->lock, irql);
620 /*s2. check if winstart_b(indicate_seq) needs to been updated*/
621 if (!check_indicate_seq(preorder_ctrl, pattrib->seq_num))
622 goto _err_exit;
623 /*s3. Insert all packet into Reorder Queue to maintain its ordering.*/
624 if (!enqueue_reorder_recvframe(preorder_ctrl, prframe))
625 goto _err_exit;
626 /*s4.
627 * Indication process.
628 * After Packet dropping and Sliding Window shifting as above, we can
629 * now just indicate the packets with the SeqNum smaller than latest
630 * WinStart and buffer other packets.
631 *
632 * For Rx Reorder condition:
633 * 1. All packets with SeqNum smaller than WinStart => Indicate
634 * 2. All packets with SeqNum larger than or equal to
635 * WinStart => Buffer it.
636 */
637 if (r8712_recv_indicatepkts_in_order(padapter, preorder_ctrl, false) ==
638 true) {
639 _set_timer(&preorder_ctrl->reordering_ctrl_timer,
640 REORDER_WAIT_TIME);
641 spin_unlock_irqrestore(&ppending_recvframe_queue->lock, irql);
642 } else {
643 spin_unlock_irqrestore(&ppending_recvframe_queue->lock, irql);
644 _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);
645 }
646 return _SUCCESS;
647_err_exit:
648 spin_unlock_irqrestore(&ppending_recvframe_queue->lock, irql);
649 return _FAIL;
650}
651
652void r8712_reordering_ctrl_timeout_handler(void *pcontext)
653{
654 unsigned long irql;
655 struct recv_reorder_ctrl *preorder_ctrl =
656 (struct recv_reorder_ctrl *)pcontext;
657 struct _adapter *padapter = preorder_ctrl->padapter;
658 struct __queue *ppending_recvframe_queue =
659 &preorder_ctrl->pending_recvframe_queue;
660
661 if (padapter->bDriverStopped || padapter->bSurpriseRemoved)
662 return;
663 spin_lock_irqsave(&ppending_recvframe_queue->lock, irql);
664 r8712_recv_indicatepkts_in_order(padapter, preorder_ctrl, true);
665 spin_unlock_irqrestore(&ppending_recvframe_queue->lock, irql);
666}
667
668static int r8712_process_recv_indicatepkts(struct _adapter *padapter,
669 union recv_frame *prframe)
670{
671 int retval = _SUCCESS;
672 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
673 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
674
675 if (phtpriv->ht_option == 1) { /*B/G/N Mode*/
676 if (recv_indicatepkt_reorder(padapter, prframe) != _SUCCESS) {
677 /* including perform A-MPDU Rx Ordering Buffer Control*/
678 if ((padapter->bDriverStopped == false) &&
679 (padapter->bSurpriseRemoved == false))
680 return _FAIL;
681 }
682 } else { /*B/G mode*/
683 retval = r8712_wlanhdr_to_ethhdr(prframe);
684 if (retval != _SUCCESS)
685 return retval;
686 if ((padapter->bDriverStopped == false) &&
687 (padapter->bSurpriseRemoved == false)) {
688 /* indicate this recv_frame */
689 r8712_recv_indicatepkt(padapter, prframe);
690 } else
691 return _FAIL;
692 }
693 return retval;
694}
695
696static u8 query_rx_pwr_percentage(s8 antpower)
697{
698 if ((antpower <= -100) || (antpower >= 20))
699 return 0;
700 else if (antpower >= 0)
701 return 100;
702 else
703 return 100 + antpower;
704}
705
706static u8 evm_db2percentage(s8 value)
707{
708 /*
709 * -33dB~0dB to 0%~99%
710 */
711 s8 ret_val;
712
713 ret_val = value;
714 if (ret_val >= 0)
715 ret_val = 0;
716 if (ret_val <= -33)
717 ret_val = -33;
718 ret_val = -ret_val;
719 ret_val *= 3;
720 if (ret_val == 99)
721 ret_val = 100;
722 return ret_val;
723}
724
725s32 r8712_signal_scale_mapping(s32 cur_sig)
726{
727 s32 ret_sig;
728
729 if (cur_sig >= 51 && cur_sig <= 100)
730 ret_sig = 100;
731 else if (cur_sig >= 41 && cur_sig <= 50)
732 ret_sig = 80 + ((cur_sig - 40) * 2);
733 else if (cur_sig >= 31 && cur_sig <= 40)
734 ret_sig = 66 + (cur_sig - 30);
735 else if (cur_sig >= 21 && cur_sig <= 30)
736 ret_sig = 54 + (cur_sig - 20);
737 else if (cur_sig >= 10 && cur_sig <= 20)
738 ret_sig = 42 + (((cur_sig - 10) * 2) / 3);
739 else if (cur_sig >= 5 && cur_sig <= 9)
740 ret_sig = 22 + (((cur_sig - 5) * 3) / 2);
741 else if (cur_sig >= 1 && cur_sig <= 4)
742 ret_sig = 6 + (((cur_sig - 1) * 3) / 2);
743 else
744 ret_sig = cur_sig;
745 return ret_sig;
746}
747
748static s32 translate2dbm(struct _adapter *padapter, u8 signal_strength_idx)
749{
750 s32 signal_power; /* in dBm.*/
751 /* Translate to dBm (x=0.5y-95).*/
752 signal_power = (s32)((signal_strength_idx + 1) >> 1);
753 signal_power -= 95;
754 return signal_power;
755}
756
757static void query_rx_phy_status(struct _adapter *padapter,
758 union recv_frame *prframe)
759{
760 u8 i, max_spatial_stream, evm;
761 struct recv_stat *prxstat = (struct recv_stat *)prframe->u.hdr.rx_head;
762 struct phy_stat *pphy_stat = (struct phy_stat *)(prxstat + 1);
763 u8 *pphy_head = (u8 *)(prxstat + 1);
764 s8 rx_pwr[4], rx_pwr_all;
765 u8 pwdb_all;
766 u32 rssi, total_rssi = 0;
767 u8 bcck_rate = 0, rf_rx_num = 0, cck_highpwr = 0;
768 struct phy_cck_rx_status *pcck_buf;
769 u8 sq;
770
771 /* Record it for next packet processing*/
772 bcck_rate = (prframe->u.hdr.attrib.mcs_rate <= 3 ? 1 : 0);
773 if (bcck_rate) {
774 u8 report;
775
776 /* CCK Driver info Structure is not the same as OFDM packet.*/
777 pcck_buf = (struct phy_cck_rx_status *)pphy_stat;
778 /* (1)Hardware does not provide RSSI for CCK
779 * (2)PWDB, Average PWDB cacluated by hardware
780 * (for rate adaptive)
781 */
782 if (!cck_highpwr) {
783 report = pcck_buf->cck_agc_rpt & 0xc0;
784 report = report >> 6;
785 switch (report) {
786 /* Modify the RF RNA gain value to -40, -20,
787 * -2, 14 by Jenyu's suggestion
788 * Note: different RF with the different
789 * RNA gain. */
790 case 0x3:
791 rx_pwr_all = -40 - (pcck_buf->cck_agc_rpt &
792 0x3e);
793 break;
794 case 0x2:
795 rx_pwr_all = -20 - (pcck_buf->cck_agc_rpt &
796 0x3e);
797 break;
798 case 0x1:
799 rx_pwr_all = -2 - (pcck_buf->cck_agc_rpt &
800 0x3e);
801 break;
802 case 0x0:
803 rx_pwr_all = 14 - (pcck_buf->cck_agc_rpt &
804 0x3e);
805 break;
806 }
807 } else {
808 report = ((u8)(le32_to_cpu(pphy_stat->phydw1) >> 8)) &
809 0x60;
810 report = report >> 5;
811 switch (report) {
812 case 0x3:
813 rx_pwr_all = -40 - ((pcck_buf->cck_agc_rpt &
814 0x1f) << 1);
815 break;
816 case 0x2:
817 rx_pwr_all = -20 - ((pcck_buf->cck_agc_rpt &
818 0x1f) << 1);
819 break;
820 case 0x1:
821 rx_pwr_all = -2 - ((pcck_buf->cck_agc_rpt &
822 0x1f) << 1);
823 break;
824 case 0x0:
825 rx_pwr_all = 14 - ((pcck_buf->cck_agc_rpt &
826 0x1f) << 1);
827 break;
828 }
829 }
830 pwdb_all = query_rx_pwr_percentage(rx_pwr_all);
831 /* CCK gain is smaller than OFDM/MCS gain,*/
832 /* so we add gain diff by experiences, the val is 6 */
833 pwdb_all += 6;
834 if (pwdb_all > 100)
835 pwdb_all = 100;
836 /* modify the offset to make the same gain index with OFDM.*/
837 if (pwdb_all > 34 && pwdb_all <= 42)
838 pwdb_all -= 2;
839 else if (pwdb_all > 26 && pwdb_all <= 34)
840 pwdb_all -= 6;
841 else if (pwdb_all > 14 && pwdb_all <= 26)
842 pwdb_all -= 8;
843 else if (pwdb_all > 4 && pwdb_all <= 14)
844 pwdb_all -= 4;
845 /*
846 * (3) Get Signal Quality (EVM)
847 */
848 if (pwdb_all > 40)
849 sq = 100;
850 else {
851 sq = pcck_buf->sq_rpt;
852 if (pcck_buf->sq_rpt > 64)
853 sq = 0;
854 else if (pcck_buf->sq_rpt < 20)
855 sq = 100;
856 else
857 sq = ((64-sq) * 100) / 44;
858 }
859 prframe->u.hdr.attrib.signal_qual = sq;
860 prframe->u.hdr.attrib.rx_mimo_signal_qual[0] = sq;
861 prframe->u.hdr.attrib.rx_mimo_signal_qual[1] = -1;
862 } else {
863 /* (1)Get RSSI for HT rate */
864 for (i = 0; i < ((padapter->registrypriv.rf_config) &
865 0x0f) ; i++) {
866 rf_rx_num++;
867 rx_pwr[i] = ((pphy_head[PHY_STAT_GAIN_TRSW_SHT + i]
868 & 0x3F) * 2) - 110;
869 /* Translate DBM to percentage. */
870 rssi = query_rx_pwr_percentage(rx_pwr[i]);
871 total_rssi += rssi;
872 }
873 /* (2)PWDB, Average PWDB cacluated by hardware (for
874 * rate adaptive) */
875 rx_pwr_all = (((pphy_head[PHY_STAT_PWDB_ALL_SHT]) >> 1) & 0x7f)
876 - 106;
877 pwdb_all = query_rx_pwr_percentage(rx_pwr_all);
878
879 {
880 /* (3)EVM of HT rate */
881 if (prframe->u.hdr.attrib.htc &&
882 prframe->u.hdr.attrib.mcs_rate >= 20 &&
883 prframe->u.hdr.attrib.mcs_rate <= 27) {
884 /* both spatial stream make sense */
885 max_spatial_stream = 2;
886 } else {
887 /* only spatial stream 1 makes sense */
888 max_spatial_stream = 1;
889 }
890 for (i = 0; i < max_spatial_stream; i++) {
891 evm = evm_db2percentage((pphy_head
892 [PHY_STAT_RXEVM_SHT + i]));/*dbm*/
893 prframe->u.hdr.attrib.signal_qual =
894 (u8)(evm & 0xff);
895 prframe->u.hdr.attrib.rx_mimo_signal_qual[i] =
896 (u8)(evm & 0xff);
897 }
898 }
899 }
900 /* UI BSS List signal strength(in percentage), make it good looking,
901 * from 0~100. It is assigned to the BSS List in
902 * GetValueFromBeaconOrProbeRsp(). */
903 if (bcck_rate)
904 prframe->u.hdr.attrib.signal_strength =
905 (u8)r8712_signal_scale_mapping(pwdb_all);
906 else {
907 if (rf_rx_num != 0)
908 prframe->u.hdr.attrib.signal_strength =
909 (u8)(r8712_signal_scale_mapping(total_rssi /=
910 rf_rx_num));
911 }
912}
913
914static void process_link_qual(struct _adapter *padapter,
915 union recv_frame *prframe)
916{
917 u32 last_evm = 0, tmpVal;
918 struct rx_pkt_attrib *pattrib;
919
920 if (prframe == NULL || padapter == NULL)
921 return;
922 pattrib = &prframe->u.hdr.attrib;
923 if (pattrib->signal_qual != 0) {
924 /*
925 * 1. Record the general EVM to the sliding window.
926 */
927 if (padapter->recvpriv.signal_qual_data.total_num++ >=
928 PHY_LINKQUALITY_SLID_WIN_MAX) {
929 padapter->recvpriv.signal_qual_data.total_num =
930 PHY_LINKQUALITY_SLID_WIN_MAX;
931 last_evm = padapter->recvpriv.signal_qual_data.elements
932 [padapter->recvpriv.signal_qual_data.index];
933 padapter->recvpriv.signal_qual_data.total_val -=
934 last_evm;
935 }
936 padapter->recvpriv.signal_qual_data.total_val +=
937 pattrib->signal_qual;
938 padapter->recvpriv.signal_qual_data.elements[padapter->
939 recvpriv.signal_qual_data.index++] =
940 pattrib->signal_qual;
941 if (padapter->recvpriv.signal_qual_data.index >=
942 PHY_LINKQUALITY_SLID_WIN_MAX)
943 padapter->recvpriv.signal_qual_data.index = 0;
944
945 /* <1> Showed on UI for user, in percentage. */
946 tmpVal = padapter->recvpriv.signal_qual_data.total_val /
947 padapter->recvpriv.signal_qual_data.total_num;
948 padapter->recvpriv.signal = (u8)tmpVal;
949 }
950}
951
952static void process_rssi(struct _adapter *padapter, union recv_frame *prframe)
953{
954 u32 last_rssi, tmp_val;
955 struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
956
957 if (padapter->recvpriv.signal_strength_data.total_num++ >=
958 PHY_RSSI_SLID_WIN_MAX) {
959 padapter->recvpriv.signal_strength_data.total_num =
960 PHY_RSSI_SLID_WIN_MAX;
961 last_rssi = padapter->recvpriv.signal_strength_data.elements
962 [padapter->recvpriv.signal_strength_data.index];
963 padapter->recvpriv.signal_strength_data.total_val -= last_rssi;
964 }
965 padapter->recvpriv.signal_strength_data.total_val +=
966 pattrib->signal_strength;
967 padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.
968 signal_strength_data.index++] =
969 pattrib->signal_strength;
970 if (padapter->recvpriv.signal_strength_data.index >=
971 PHY_RSSI_SLID_WIN_MAX)
972 padapter->recvpriv.signal_strength_data.index = 0;
973 tmp_val = padapter->recvpriv.signal_strength_data.total_val /
974 padapter->recvpriv.signal_strength_data.total_num;
975 padapter->recvpriv.rssi = (s8)translate2dbm(padapter, (u8)tmp_val);
976}
977
978static void process_phy_info(struct _adapter *padapter,
979 union recv_frame *prframe)
980{
981 query_rx_phy_status(padapter, prframe);
982 process_rssi(padapter, prframe);
983 process_link_qual(padapter, prframe);
984}
985
986int recv_func(struct _adapter *padapter, void *pcontext)
987{
988 struct rx_pkt_attrib *pattrib;
989 union recv_frame *prframe, *orig_prframe;
990 int retval = _SUCCESS;
991 struct __queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
992 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
993
994 prframe = (union recv_frame *)pcontext;
995 orig_prframe = prframe;
996 pattrib = &prframe->u.hdr.attrib;
997 if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == true)) {
998 if (pattrib->crc_err == 1)
999 padapter->mppriv.rx_crcerrpktcount++;
1000 else
1001 padapter->mppriv.rx_pktcount++;
1002 if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == false) {
1003 /* free this recv_frame */
1004 r8712_free_recvframe(orig_prframe, pfree_recv_queue);
1005 goto _exit_recv_func;
1006 }
1007 }
1008 /* check the frame crtl field and decache */
1009 retval = r8712_validate_recv_frame(padapter, prframe);
1010 if (retval != _SUCCESS) {
1011 /* free this recv_frame */
1012 r8712_free_recvframe(orig_prframe, pfree_recv_queue);
1013 goto _exit_recv_func;
1014 }
1015 process_phy_info(padapter, prframe);
1016 prframe = r8712_decryptor(padapter, prframe);
1017 if (prframe == NULL) {
1018 retval = _FAIL;
1019 goto _exit_recv_func;
1020 }
1021 prframe = r8712_recvframe_chk_defrag(padapter, prframe);
1022 if (prframe == NULL)
1023 goto _exit_recv_func;
1024 prframe = r8712_portctrl(padapter, prframe);
1025 if (prframe == NULL) {
1026 retval = _FAIL;
1027 goto _exit_recv_func;
1028 }
1029 retval = r8712_process_recv_indicatepkts(padapter, prframe);
1030 if (retval != _SUCCESS) {
1031 r8712_free_recvframe(orig_prframe, pfree_recv_queue);
1032 goto _exit_recv_func;
1033 }
1034_exit_recv_func:
1035 return retval;
1036}
1037
1038static int recvbuf2recvframe(struct _adapter *padapter, struct sk_buff *pskb)
1039{
1040 u8 *pbuf, shift_sz = 0;
1041 u8 frag, mf;
1042 uint pkt_len;
1043 u32 transfer_len;
1044 struct recv_stat *prxstat;
1045 u16 pkt_cnt, drvinfo_sz, pkt_offset, tmp_len, alloc_sz;
1046 struct __queue *pfree_recv_queue;
1047 _pkt *pkt_copy = NULL;
1048 union recv_frame *precvframe = NULL;
1049 struct recv_priv *precvpriv = &padapter->recvpriv;
1050
1051 pfree_recv_queue = &(precvpriv->free_recv_queue);
1052 pbuf = pskb->data;
1053 prxstat = (struct recv_stat *)pbuf;
1054 pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16)&0xff;
1055 pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff;
1056 transfer_len = pskb->len;
1057 /* Test throughput with Netgear 3700 (No security) with Chariot 3T3R
1058 * pairs. The packet count will be a big number so that the containing
1059 * packet will effect the Rx reordering. */
1060 if (transfer_len < pkt_len) {
1061 /* In this case, it means the MAX_RECVBUF_SZ is too small to
1062 * get the data from 8712u. */
1063 return _FAIL;
1064 }
1065 do {
1066 prxstat = (struct recv_stat *)pbuf;
1067 pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff;
1068 /* more fragment bit */
1069 mf = (le32_to_cpu(prxstat->rxdw1) >> 27) & 0x1;
1070 /* ragmentation number */
1071 frag = (le32_to_cpu(prxstat->rxdw2) >> 12) & 0xf;
1072 /* uint 2^3 = 8 bytes */
1073 drvinfo_sz = (le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16;
1074 drvinfo_sz = drvinfo_sz<<3;
1075 if (pkt_len <= 0)
1076 goto _exit_recvbuf2recvframe;
1077 /* Qos data, wireless lan header length is 26 */
1078 if ((le32_to_cpu(prxstat->rxdw0) >> 23) & 0x01)
1079 shift_sz = 2;
1080 precvframe = r8712_alloc_recvframe(pfree_recv_queue);
1081 if (precvframe == NULL)
1082 goto _exit_recvbuf2recvframe;
1083 _init_listhead(&precvframe->u.hdr.list);
1084 precvframe->u.hdr.precvbuf = NULL; /*can't access the precvbuf*/
1085 precvframe->u.hdr.len = 0;
1086 tmp_len = pkt_len + drvinfo_sz + RXDESC_SIZE;
1087 pkt_offset = (u16)_RND128(tmp_len);
1088 /* for first fragment packet, driver need allocate 1536 +
1089 * drvinfo_sz + RXDESC_SIZE to defrag packet. */
1090 if ((mf == 1) && (frag == 0))
1091 alloc_sz = 1658;
1092 else
1093 alloc_sz = tmp_len;
1094 /* 2 is for IP header 4 bytes alignment in QoS packet case.
1095 * 4 is for skb->data 4 bytes alignment. */
1096 alloc_sz += 6;
1097 pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz);
1098 if (pkt_copy) {
1099 pkt_copy->dev = padapter->pnetdev;
1100 precvframe->u.hdr.pkt = pkt_copy;
1101 skb_reserve(pkt_copy, 4 - ((addr_t)(pkt_copy->data)
1102 % 4));
1103 skb_reserve(pkt_copy, shift_sz);
1104 memcpy(pkt_copy->data, pbuf, tmp_len);
1105 precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data =
1106 precvframe->u.hdr.rx_tail = pkt_copy->data;
1107 precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz;
1108 } else {
1109 precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC);
1110 precvframe->u.hdr.rx_head = pbuf;
1111 precvframe->u.hdr.rx_data = pbuf;
1112 precvframe->u.hdr.rx_tail = pbuf;
1113 precvframe->u.hdr.rx_end = pbuf + alloc_sz;
1114 }
1115 recvframe_put(precvframe, tmp_len);
1116 recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE);
1117 /* because the endian issue, driver avoid reference to the
1118 * rxstat after calling update_recvframe_attrib_from_recvstat();
1119 */
1120 update_recvframe_attrib_from_recvstat(&precvframe->u.hdr.attrib,
1121 prxstat);
1122 r8712_recv_entry(precvframe);
1123 transfer_len -= pkt_offset;
1124 pbuf += pkt_offset;
1125 pkt_cnt--;
1126 precvframe = NULL;
1127 pkt_copy = NULL;
1128 } while ((transfer_len > 0) && pkt_cnt > 0);
1129_exit_recvbuf2recvframe:
1130 return _SUCCESS;
1131}
1132
1133static void recv_tasklet(void *priv)
1134{
1135 struct sk_buff *pskb;
1136 struct _adapter *padapter = (struct _adapter *)priv;
1137 struct recv_priv *precvpriv = &padapter->recvpriv;
1138
1139 while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) {
1140 recvbuf2recvframe(padapter, pskb);
1141 skb_reset_tail_pointer(pskb);
1142 pskb->len = 0;
1143 skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
1144 }
1145}
diff --git a/drivers/staging/rtl8712/rtl8712_recv.h b/drivers/staging/rtl8712/rtl8712_recv.h
new file mode 100644
index 00000000000..4ba52b9c169
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_recv.h
@@ -0,0 +1,128 @@
1#ifndef _RTL8712_RECV_H_
2#define _RTL8712_RECV_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7#define NR_RECVBUFF (8)
8#define NR_PREALLOC_RECV_SKB (8)
9#define RXDESC_SIZE 24
10#define RXDESC_OFFSET RXDESC_SIZE
11#define RECV_BLK_SZ 512
12#define RECV_BLK_CNT 16
13#define RECV_BLK_TH RECV_BLK_CNT
14#define MAX_RECVBUF_SZ (30720) /* 30K */
15#define RECVBUFF_ALIGN_SZ 512
16#define RSVD_ROOM_SZ (0)
17/*These definition is used for Rx packet reordering.*/
18#define SN_LESS(a, b) (((a-b) & 0x800) != 0)
19#define SN_EQUAL(a, b) (a == b)
20#define REORDER_WAIT_TIME 30 /* (ms)*/
21
22struct recv_stat {
23 unsigned int rxdw0;
24 unsigned int rxdw1;
25 unsigned int rxdw2;
26 unsigned int rxdw3;
27 unsigned int rxdw4;
28 unsigned int rxdw5;
29};
30
31struct phy_cck_rx_status {
32 /* For CCK rate descriptor. This is a unsigned 8:1 variable.
33 * LSB bit present 0.5. And MSB 7 bts present a signed value.
34 * Range from -64~+63.5. */
35 u8 adc_pwdb_X[4];
36 u8 sq_rpt;
37 u8 cck_agc_rpt;
38};
39
40struct phy_stat {
41 unsigned int phydw0;
42 unsigned int phydw1;
43 unsigned int phydw2;
44 unsigned int phydw3;
45 unsigned int phydw4;
46 unsigned int phydw5;
47 unsigned int phydw6;
48 unsigned int phydw7;
49};
50#define PHY_STAT_GAIN_TRSW_SHT 0
51#define PHY_STAT_PWDB_ALL_SHT 4
52#define PHY_STAT_CFOSHO_SHT 5
53#define PHY_STAT_CCK_AGC_RPT_SHT 5
54#define PHY_STAT_CFOTAIL_SHT 9
55#define PHY_STAT_RXEVM_SHT 13
56#define PHY_STAT_RXSNR_SHT 15
57#define PHY_STAT_PDSNR_SHT 19
58#define PHY_STAT_CSI_CURRENT_SHT 21
59#define PHY_STAT_CSI_TARGET_SHT 23
60#define PHY_STAT_SIGEVM_SHT 25
61#define PHY_STAT_MAX_EX_PWR_SHT 26
62
63union recvstat {
64 struct recv_stat recv_stat;
65 unsigned int value[RXDESC_SIZE>>2];
66};
67
68
69struct recv_buf {
70 struct list_head list;
71 spinlock_t recvbuf_lock;
72 u32 ref_cnt;
73 struct _adapter *adapter;
74 struct urb *purb;
75 _pkt *pskb;
76 u8 reuse;
77 u8 irp_pending;
78 u32 transfer_len;
79 uint len;
80 u8 *phead;
81 u8 *pdata;
82 u8 *ptail;
83 u8 *pend;
84 u8 *pbuf;
85 u8 *pallocated_buf;
86};
87
88/*
89 head ----->
90 data ----->
91 payload
92 tail ----->
93 end ----->
94 len = (unsigned int )(tail - data);
95*/
96struct recv_frame_hdr{
97 struct list_head list;
98 _pkt *pkt;
99 _pkt *pkt_newalloc;
100 struct _adapter *adapter;
101 u8 fragcnt;
102 struct rx_pkt_attrib attrib;
103 uint len;
104 u8 *rx_head;
105 u8 *rx_data;
106 u8 *rx_tail;
107 u8 *rx_end;
108 void *precvbuf;
109 struct sta_info *psta;
110 /*for A-MPDU Rx reordering buffer control*/
111 struct recv_reorder_ctrl *preorder_ctrl;
112};
113
114union recv_frame {
115 union {
116 struct list_head list;
117 struct recv_frame_hdr hdr;
118 addr_t mem[RECVFRAME_HDR_ALIGN>>2];
119 } u;
120};
121
122int r8712_init_recvbuf(struct _adapter *padapter, struct recv_buf *precvbuf);
123void r8712_rxcmd_event_hdl(struct _adapter *padapter, void *prxcmdbuf);
124s32 r8712_signal_scale_mapping(s32 cur_sig);
125void r8712_reordering_ctrl_timeout_handler(void *pcontext);
126
127#endif
128
diff --git a/drivers/staging/rtl8712/rtl8712_regdef.h b/drivers/staging/rtl8712/rtl8712_regdef.h
new file mode 100644
index 00000000000..5b0de2ab6b6
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_regdef.h
@@ -0,0 +1,19 @@
1#ifndef __RTL8712_REGDEF_H__
2#define __RTL8712_REGDEF_H__
3
4#include "rtl8712_syscfg_regdef.h"
5#include "rtl8712_cmdctrl_regdef.h"
6#include "rtl8712_macsetting_regdef.h"
7#include "rtl8712_timectrl_regdef.h"
8#include "rtl8712_fifoctrl_regdef.h"
9#include "rtl8712_ratectrl_regdef.h"
10#include "rtl8712_edcasetting_regdef.h"
11#include "rtl8712_wmac_regdef.h"
12#include "rtl8712_powersave_regdef.h"
13#include "rtl8712_gp_regdef.h"
14#include "rtl8712_debugctrl_regdef.h"
15
16#define HIMR (RTL8712_INTERRUPT_ + 0x08)
17
18#endif /* __RTL8712_REGDEF_H__*/
19
diff --git a/drivers/staging/rtl8712/rtl8712_security_bitdef.h b/drivers/staging/rtl8712/rtl8712_security_bitdef.h
new file mode 100644
index 00000000000..8df4bf4a069
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_security_bitdef.h
@@ -0,0 +1,29 @@
1#ifndef __RTL8712_SECURITY_BITDEF_H__
2#define __RTL8712_SECURITY_BITDEF_H__
3
4/*CAMCMD*/
5#define _SECCAM_POLLING BIT(31)
6#define _SECCAM_CLR BIT(30)
7#define _SECCAM_WE BIT(16)
8#define _SECCAM_ADR_MSK 0x000000FF
9#define _SECCAM_ADR_SHT 0
10
11/*CAMDBG*/
12#define _SECCAM_INFO BIT(31)
13#define _SEC_KEYFOUND BIT(30)
14#define _SEC_CONFIG_MSK 0x3F000000
15#define _SEC_CONFIG_SHT 24
16#define _SEC_KEYCONTENT_MSK 0x00FFFFFF
17#define _SEC_KEYCONTENT_SHT 0
18
19/*SECCFG*/
20#define _NOSKMC BIT(5)
21#define _SKBYA2 BIT(4)
22#define _RXDEC BIT(3)
23#define _TXENC BIT(2)
24#define _RXUSEDK BIT(1)
25#define _TXUSEDK BIT(0)
26
27
28#endif /*__RTL8712_SECURITY_BITDEF_H__*/
29
diff --git a/drivers/staging/rtl8712/rtl8712_spec.h b/drivers/staging/rtl8712/rtl8712_spec.h
new file mode 100644
index 00000000000..3f181eed4ee
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_spec.h
@@ -0,0 +1,110 @@
1#ifndef __RTL8712_SPEC_H__
2#define __RTL8712_SPEC_H__
3
4#define RTL8712_IOBASE_TXPKT 0x10200000 /*IOBASE_TXPKT*/
5#define RTL8712_IOBASE_RXPKT 0x10210000 /*IOBASE_RXPKT*/
6#define RTL8712_IOBASE_RXCMD 0x10220000 /*IOBASE_RXCMD*/
7#define RTL8712_IOBASE_TXSTATUS 0x10230000 /*IOBASE_TXSTATUS*/
8#define RTL8712_IOBASE_RXSTATUS 0x10240000 /*IOBASE_RXSTATUS*/
9#define RTL8712_IOBASE_IOREG 0x10250000 /*IOBASE_IOREG ADDR*/
10#define RTL8712_IOBASE_SCHEDULER 0x10260000 /*IOBASE_SCHEDULE*/
11
12#define RTL8712_IOBASE_TRXDMA 0x10270000 /*IOBASE_TRXDMA*/
13#define RTL8712_IOBASE_TXLLT 0x10280000 /*IOBASE_TXLLT*/
14#define RTL8712_IOBASE_WMAC 0x10290000 /*IOBASE_WMAC*/
15#define RTL8712_IOBASE_FW2HW 0x102A0000 /*IOBASE_FW2HW*/
16#define RTL8712_IOBASE_ACCESS_PHYREG 0x102B0000 /*IOBASE_ACCESS_PHYREG*/
17
18#define RTL8712_IOBASE_FF 0x10300000 /*IOBASE_FIFO 0x1031000~0x103AFFFF*/
19
20
21/*IOREG Offset for 8712*/
22#define RTL8712_SYSCFG_ RTL8712_IOBASE_IOREG
23#define RTL8712_CMDCTRL_ (RTL8712_IOBASE_IOREG + 0x40)
24#define RTL8712_MACIDSETTING_ (RTL8712_IOBASE_IOREG + 0x50)
25#define RTL8712_TIMECTRL_ (RTL8712_IOBASE_IOREG + 0x80)
26#define RTL8712_FIFOCTRL_ (RTL8712_IOBASE_IOREG + 0xA0)
27#define RTL8712_RATECTRL_ (RTL8712_IOBASE_IOREG + 0x160)
28#define RTL8712_EDCASETTING_ (RTL8712_IOBASE_IOREG + 0x1D0)
29#define RTL8712_WMAC_ (RTL8712_IOBASE_IOREG + 0x200)
30#define RTL8712_SECURITY_ (RTL8712_IOBASE_IOREG + 0x240)
31#define RTL8712_POWERSAVE_ (RTL8712_IOBASE_IOREG + 0x260)
32#define RTL8712_GP_ (RTL8712_IOBASE_IOREG + 0x2E0)
33#define RTL8712_INTERRUPT_ (RTL8712_IOBASE_IOREG + 0x300)
34#define RTL8712_DEBUGCTRL_ (RTL8712_IOBASE_IOREG + 0x310)
35#define RTL8712_OFFLOAD_ (RTL8712_IOBASE_IOREG + 0x2D0)
36
37
38/*FIFO for 8712*/
39#define RTL8712_DMA_BCNQ (RTL8712_IOBASE_FF + 0x10000)
40#define RTL8712_DMA_MGTQ (RTL8712_IOBASE_FF + 0x20000)
41#define RTL8712_DMA_BMCQ (RTL8712_IOBASE_FF + 0x30000)
42#define RTL8712_DMA_VOQ (RTL8712_IOBASE_FF + 0x40000)
43#define RTL8712_DMA_VIQ (RTL8712_IOBASE_FF + 0x50000)
44#define RTL8712_DMA_BEQ (RTL8712_IOBASE_FF + 0x60000)
45#define RTL8712_DMA_BKQ (RTL8712_IOBASE_FF + 0x70000)
46#define RTL8712_DMA_RX0FF (RTL8712_IOBASE_FF + 0x80000)
47#define RTL8712_DMA_H2CCMD (RTL8712_IOBASE_FF + 0x90000)
48#define RTL8712_DMA_C2HCMD (RTL8712_IOBASE_FF + 0xA0000)
49
50
51/*------------------------------*/
52
53/*BIT 16 15*/
54#define DID_SDIO_LOCAL 0 /* 0 0*/
55#define DID_WLAN_IOREG 1 /* 0 1*/
56#define DID_WLAN_FIFO 3 /* 1 1*/
57#define DID_UNDEFINE (-1)
58
59#define CMD_ADDR_MAPPING_SHIFT 2 /*SDIO CMD ADDR MAPPING,
60 *shift 2 bit for match
61 * offset[14:2]*/
62
63/*Offset for SDIO LOCAL*/
64#define OFFSET_SDIO_LOCAL 0x0FFF
65
66/*Offset for WLAN IOREG*/
67#define OFFSET_WLAN_IOREG 0x0FFF
68
69/*Offset for WLAN FIFO*/
70#define OFFSET_TX_BCNQ 0x0300
71#define OFFSET_TX_HIQ 0x0310
72#define OFFSET_TX_CMDQ 0x0320
73#define OFFSET_TX_MGTQ 0x0330
74#define OFFSET_TX_HCCAQ 0x0340
75#define OFFSET_TX_VOQ 0x0350
76#define OFFSET_TX_VIQ 0x0360
77#define OFFSET_TX_BEQ 0x0370
78#define OFFSET_TX_BKQ 0x0380
79#define OFFSET_RX_RX0FFQ 0x0390
80#define OFFSET_RX_C2HFFQ 0x03A0
81
82#define BK_QID_01 1
83#define BK_QID_02 2
84#define BE_QID_01 0
85#define BE_QID_02 3
86#define VI_QID_01 4
87#define VI_QID_02 5
88#define VO_QID_01 6
89#define VO_QID_02 7
90#define HCCA_QID_01 8
91#define HCCA_QID_02 9
92#define HCCA_QID_03 10
93#define HCCA_QID_04 11
94#define HCCA_QID_05 12
95#define HCCA_QID_06 13
96#define HCCA_QID_07 14
97#define HCCA_QID_08 15
98#define HI_QID 17
99#define CMD_QID 19
100#define MGT_QID 18
101#define BCN_QID 16
102
103#include "rtl8712_regdef.h"
104
105#include "rtl8712_bitdef.h"
106
107#include "basic_types.h"
108
109#endif /* __RTL8712_SPEC_H__ */
110
diff --git a/drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h b/drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h
new file mode 100644
index 00000000000..dce15c2ff50
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h
@@ -0,0 +1,145 @@
1#ifndef __RTL8712_SYSCFG_BITDEF_H__
2#define __RTL8712_SYSCFG_BITDEF_H__
3
4/*SYS_PWR_CTRL*/
5/*SRCTRL0*/
6/*SRCTRL1*/
7/*SYS_CLKR*/
8
9/*SYS_IOS_CTRL*/
10#define iso_LDR2RP_SHT 8 /* EE Loader to Retention Path*/
11#define iso_LDR2RP BIT(iso_LDR2RP_SHT) /* 1:isolation, 0:attach*/
12
13/*SYS_CTRL*/
14#define FEN_DIO_SDIO_SHT 0
15#define FEN_DIO_SDIO BIT(FEN_DIO_SDIO_SHT)
16#define FEN_SDIO_SHT 1
17#define FEN_SDIO BIT(FEN_SDIO_SHT)
18#define FEN_USBA_SHT 2
19#define FEN_USBA BIT(FEN_USBA_SHT)
20#define FEN_UPLL_SHT 3
21#define FEN_UPLL BIT(FEN_UPLL_SHT)
22#define FEN_USBD_SHT 4
23#define FEN_USBD BIT(FEN_USBD_SHT)
24#define FEN_DIO_PCIE_SHT 5
25#define FEN_DIO_PCIE BIT(FEN_DIO_PCIE_SHT)
26#define FEN_PCIEA_SHT 6
27#define FEN_PCIEA BIT(FEN_PCIEA_SHT)
28#define FEN_PPLL_SHT 7
29#define FEN_PPLL BIT(FEN_PPLL_SHT)
30#define FEN_PCIED_SHT 8
31#define FEN_PCIED BIT(FEN_PCIED_SHT)
32#define FEN_CPUEN_SHT 10
33#define FEN_CPUEN BIT(FEN_CPUEN_SHT)
34#define FEN_DCORE_SHT 11
35#define FEN_DCORE BIT(FEN_DCORE_SHT)
36#define FEN_ELDR_SHT 12
37#define FEN_ELDR BIT(FEN_ELDR_SHT)
38#define PWC_DV2LDR_SHT 13
39#define PWC_DV2LDR BIT(PWC_DV2LDR_SHT) /* Loader Power Enable*/
40
41/*=== SYS_CLKR ===*/
42#define SYS_CLKSEL_SHT 0
43#define SYS_CLKSEL BIT(SYS_CLKSEL_SHT) /* System Clock 80MHz*/
44#define PS_CLKSEL_SHT 1
45#define PS_CLKSEL BIT(PS_CLKSEL_SHT) /*System power save
46 * clock select.*/
47#define CPU_CLKSEL_SHT 2
48#define CPU_CLKSEL BIT(CPU_CLKSEL_SHT) /* System Clock select,
49 * 1: AFE source,
50 * 0: System clock(L-Bus)*/
51#define INT32K_EN_SHT 3
52#define INT32K_EN BIT(INT32K_EN_SHT)
53#define MACSLP_SHT 4
54#define MACSLP BIT(MACSLP_SHT)
55#define MAC_CLK_EN_SHT 11
56#define MAC_CLK_EN BIT(MAC_CLK_EN_SHT) /* MAC Clock Enable.*/
57#define SYS_CLK_EN_SHT 12
58#define SYS_CLK_EN BIT(SYS_CLK_EN_SHT)
59#define RING_CLK_EN_SHT 13
60#define RING_CLK_EN BIT(RING_CLK_EN_SHT)
61#define SWHW_SEL_SHT 14
62#define SWHW_SEL BIT(SWHW_SEL_SHT) /* Load done,
63 * control path switch.*/
64#define FWHW_SEL_SHT 15
65#define FWHW_SEL BIT(FWHW_SEL_SHT) /* Sleep exit,
66 * control path switch.*/
67
68/*9346CR*/
69#define _VPDIDX_MSK 0xFF00
70#define _VPDIDX_SHT 8
71#define _EEM_MSK 0x00C0
72#define _EEM_SHT 6
73#define _EEM0 BIT(6)
74#define _EEM1 BIT(7)
75#define _EEPROM_EN BIT(5)
76#define _9356SEL BIT(4)
77#define _EECS BIT(3)
78#define _EESK BIT(2)
79#define _EEDI BIT(1)
80#define _EEDO BIT(0)
81
82/*AFE_MISC*/
83#define AFE_MISC_USB_MBEN_SHT 7
84#define AFE_MISC_USB_MBEN BIT(AFE_MISC_USB_MBEN_SHT)
85#define AFE_MISC_USB_BGEN_SHT 6
86#define AFE_MISC_USB_BGEN BIT(AFE_MISC_USB_BGEN_SHT)
87#define AFE_MISC_LD12_VDAJ_SHT 4
88#define AFE_MISC_LD12_VDAJ_MSK 0X0030
89#define AFE_MISC_LD12_VDAJ BIT(AFE_MISC_LD12_VDAJ_SHT)
90#define AFE_MISC_I32_EN_SHT 3
91#define AFE_MISC_I32_EN BIT(AFE_MISC_I32_EN_SHT)
92#define AFE_MISC_E32_EN_SHT 2
93#define AFE_MISC_E32_EN BIT(AFE_MISC_E32_EN_SHT)
94#define AFE_MISC_MBEN_SHT 1
95#define AFE_MISC_MBEN BIT(AFE_MISC_MBEN_SHT)/* Enable AFE Macro
96 * Block's Mbias.*/
97#define AFE_MISC_BGEN_SHT 0
98#define AFE_MISC_BGEN BIT(AFE_MISC_BGEN_SHT)/* Enable AFE Macro
99 * Block's Bandgap.*/
100
101
102/*--------------------------------------------------------------------------*/
103/* SPS1_CTRL bits (Offset 0x18-1E, 56bits)*/
104/*--------------------------------------------------------------------------*/
105#define SPS1_SWEN BIT(1) /* Enable vsps18 SW Macro Block.*/
106#define SPS1_LDEN BIT(0) /* Enable VSPS12 LDO Macro block.*/
107
108
109/*----------------------------------------------------------------------------*/
110/* LDOA15_CTRL bits (Offset 0x20, 8bits)*/
111/*----------------------------------------------------------------------------*/
112#define LDA15_EN BIT(0) /* Enable LDOA15 Macro Block*/
113
114
115/*----------------------------------------------------------------------------*/
116/* 8192S LDOV12D_CTRL bit (Offset 0x21, 8bits)*/
117/*----------------------------------------------------------------------------*/
118#define LDV12_EN BIT(0) /* Enable LDOVD12 Macro Block*/
119#define LDV12_SDBY BIT(1) /* LDOVD12 standby mode*/
120
121/*CLK_PS_CTRL*/
122#define _CLK_GATE_EN BIT(0)
123
124
125/* EFUSE_CTRL*/
126#define EF_FLAG BIT(31) /* Access Flag, Write:1;
127 * Read:0*/
128#define EF_PGPD 0x70000000 /* E-fuse Program time*/
129#define EF_RDT 0x0F000000 /* E-fuse read time: in the
130 * unit of cycle time*/
131#define EF_PDN_EN BIT(19) /* EFuse Power down enable*/
132#define ALD_EN BIT(18) /* Autoload Enable*/
133#define EF_ADDR 0x0003FF00 /* Access Address*/
134#define EF_DATA 0x000000FF /* Access Data*/
135
136/* EFUSE_TEST*/
137#define LDOE25_EN BIT(31) /* Enable LDOE25 Macro Block*/
138
139/* EFUSE_CLK_CTRL*/
140#define EFUSE_CLK_EN BIT(1) /* E-Fuse Clock Enable*/
141#define EFUSE_CLK_SEL BIT(0) /* E-Fuse Clock Select,
142 * 0:500K, 1:40M*/
143
144#endif /*__RTL8712_SYSCFG_BITDEF_H__*/
145
diff --git a/drivers/staging/rtl8712/rtl8712_syscfg_regdef.h b/drivers/staging/rtl8712/rtl8712_syscfg_regdef.h
new file mode 100644
index 00000000000..687e1b7a03f
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_syscfg_regdef.h
@@ -0,0 +1,31 @@
1#ifndef __RTL8712_SYSCFG_REGDEF_H__
2#define __RTL8712_SYSCFG_REGDEF_H__
3
4
5#define SYS_ISO_CTRL (RTL8712_SYSCFG_ + 0x0000)
6#define SYS_FUNC_EN (RTL8712_SYSCFG_ + 0x0002)
7#define PMC_FSM (RTL8712_SYSCFG_ + 0x0004)
8#define SYS_CLKR (RTL8712_SYSCFG_ + 0x0008)
9#define EE_9346CR (RTL8712_SYSCFG_ + 0x000A)
10#define EE_VPD (RTL8712_SYSCFG_ + 0x000C)
11#define AFE_MISC (RTL8712_SYSCFG_ + 0x0010)
12#define SPS0_CTRL (RTL8712_SYSCFG_ + 0x0011)
13#define SPS1_CTRL (RTL8712_SYSCFG_ + 0x0018)
14#define RF_CTRL (RTL8712_SYSCFG_ + 0x001F)
15#define LDOA15_CTRL (RTL8712_SYSCFG_ + 0x0020)
16#define LDOV12D_CTRL (RTL8712_SYSCFG_ + 0x0021)
17#define LDOHCI12_CTRL (RTL8712_SYSCFG_ + 0x0022)
18#define LDO_USB_CTRL (RTL8712_SYSCFG_ + 0x0023)
19#define LPLDO_CTRL (RTL8712_SYSCFG_ + 0x0024)
20#define AFE_XTAL_CTRL (RTL8712_SYSCFG_ + 0x0026)
21#define AFE_PLL_CTRL (RTL8712_SYSCFG_ + 0x0028)
22#define EFUSE_CTRL (RTL8712_SYSCFG_ + 0x0030)
23#define EFUSE_TEST (RTL8712_SYSCFG_ + 0x0034)
24#define PWR_DATA (RTL8712_SYSCFG_ + 0x0038)
25#define DPS_TIMER (RTL8712_SYSCFG_ + 0x003C)
26#define RCLK_MON (RTL8712_SYSCFG_ + 0x003E)
27#define EFUSE_CLK_CTRL (RTL8712_SYSCFG_ + 0x02F8)
28
29
30#endif /*__RTL8712_SYSCFG_REGDEF_H__*/
31
diff --git a/drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h b/drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h
new file mode 100644
index 00000000000..32ce9fab5db
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h
@@ -0,0 +1,44 @@
1#ifndef __RTL8712_TIMECTRL_BITDEF_H__
2#define __RTL8712_TIMECTRL_BITDEF_H__
3
4/*TSFTR*/
5/*SLOT*/
6/*USTIME*/
7
8/*TUBASE*/
9#define _TUBASE_MSK 0x07FF
10
11/*SIFS_CCK*/
12#define _SIFS_CCK_TRX_MSK 0xFF00
13#define _SIFS_CCK_TRX_SHT 0x8
14#define _SIFS_CCK_CTX_MSK 0x00FF
15#define _SIFS_CCK_CTX_SHT 0
16
17/*SIFS_OFDM*/
18#define _SIFS_OFDM_TRX_MSK 0xFF00
19#define _SIFS_OFDM_TRX_SHT 0x8
20#define _SIFS_OFDM_CTX_MSK 0x00FF
21#define _SIFS_OFDM_CTX_SHT 0
22
23/*PIFS*/
24/*ACKTO*/
25/*EIFS*/
26/*BCNITV*/
27/*ATIMWND*/
28
29/*DRVERLYINT*/
30#define _ENSWBCN BIT(15)
31#define _DRVERLY_TU_MSK 0x0FF0
32#define _DRVERLY_TU_SHT 4
33#define _DRVERLY_US_MSK 0x000F
34#define _DRVERLY_US_SHT 0
35
36/*BCNDMATIM*/
37#define _BCNDMATIM_MSK 0x03FF
38
39/*BCNERRTH*/
40/*MLT*/
41
42
43#endif /* __RTL8712_TIMECTRL_BITDEF_H__*/
44
diff --git a/drivers/staging/rtl8712/rtl8712_timectrl_regdef.h b/drivers/staging/rtl8712/rtl8712_timectrl_regdef.h
new file mode 100644
index 00000000000..8a3dd562ba8
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_timectrl_regdef.h
@@ -0,0 +1,20 @@
1#ifndef __RTL8712_TIMECTRL_REGDEF_H__
2#define __RTL8712_TIMECTRL_REGDEF_H__
3
4#define TSFTR (RTL8712_TIMECTRL_ + 0x00)
5#define USTIME (RTL8712_TIMECTRL_ + 0x08)
6#define SLOT (RTL8712_TIMECTRL_ + 0x09)
7#define TUBASE (RTL8712_TIMECTRL_ + 0x0A)
8#define SIFS_CCK (RTL8712_TIMECTRL_ + 0x0C)
9#define SIFS_OFDM (RTL8712_TIMECTRL_ + 0x0E)
10#define PIFS (RTL8712_TIMECTRL_ + 0x10)
11#define ACKTO (RTL8712_TIMECTRL_ + 0x11)
12#define EIFS (RTL8712_TIMECTRL_ + 0x12)
13#define BCNITV (RTL8712_TIMECTRL_ + 0x14)
14#define ATIMWND (RTL8712_TIMECTRL_ + 0x16)
15#define DRVERLYINT (RTL8712_TIMECTRL_ + 0x18)
16#define BCNDMATIM (RTL8712_TIMECTRL_ + 0x1A)
17#define BCNERRTH (RTL8712_TIMECTRL_ + 0x1C)
18#define MLT (RTL8712_TIMECTRL_ + 0x1D)
19
20#endif /* __RTL8712_TIMECTRL_REGDEF_H__ */
diff --git a/drivers/staging/rtl8712/rtl8712_wmac_bitdef.h b/drivers/staging/rtl8712/rtl8712_wmac_bitdef.h
new file mode 100644
index 00000000000..6d3be2a2422
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_wmac_bitdef.h
@@ -0,0 +1,37 @@
1#ifndef __RTL8712_WMAC_BITDEF_H__
2#define __RTL8712_WMAC_BITDEF_H__
3
4/*NAVCTRL*/
5#define _NAV_UPPER_EN BIT(18)
6#define _NAV_MTO_EN BIT(17)
7#define _NAV_UPPER BIT(16)
8#define _NAV_MTO_MSK 0xFF00
9#define _NAV_MTO_SHT 8
10#define _RTSRST_MSK 0x00FF
11#define _RTSRST_SHT 0
12
13/*BWOPMODE*/
14#define _20MHZBW BIT(2)
15
16/*BACAMCMD*/
17#define _BACAM_POLL BIT(31)
18#define _BACAM_RST BIT(17)
19#define _BACAM_RW BIT(16)
20#define _BACAM_ADDR_MSK 0x0000007F
21#define _BACAM_ADDR_SHT 0
22
23/*LBDLY*/
24#define _LBDLY_MSK 0x1F
25
26/*FWDLY*/
27#define _FWDLY_MSK 0x0F
28
29/*RXERR_RPT*/
30#define _RXERR_RPT_SEL_MSK 0xF0000000
31#define _RXERR_RPT_SEL_SHT 28
32#define _RPT_CNT_MSK 0x000FFFFF
33#define _RPT_CNT_SHT 0
34
35
36#endif /*__RTL8712_WMAC_BITDEF_H__*/
37
diff --git a/drivers/staging/rtl8712/rtl8712_wmac_regdef.h b/drivers/staging/rtl8712/rtl8712_wmac_regdef.h
new file mode 100644
index 00000000000..ac80dfb317c
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_wmac_regdef.h
@@ -0,0 +1,24 @@
1#ifndef __RTL8712_WMAC_REGDEF_H__
2#define __RTL8712_WMAC_REGDEF_H__
3
4#define NAVCTRL (RTL8712_WMAC_ + 0x00)
5#define BWOPMODE (RTL8712_WMAC_ + 0x03)
6#define BACAMCMD (RTL8712_WMAC_ + 0x04)
7#define BACAMCONTENT (RTL8712_WMAC_ + 0x08)
8#define LBDLY (RTL8712_WMAC_ + 0x10)
9#define FWDLY (RTL8712_WMAC_ + 0x11)
10#define HWPC_RX_CTRL (RTL8712_WMAC_ + 0x18)
11#define MQ (RTL8712_WMAC_ + 0x20)
12#define MA (RTL8712_WMAC_ + 0x22)
13#define MS (RTL8712_WMAC_ + 0x24)
14#define CLM_RESULT (RTL8712_WMAC_ + 0x27)
15#define NHM_RPI_CNT (RTL8712_WMAC_ + 0x28)
16#define RXERR_RPT (RTL8712_WMAC_ + 0x30)
17#define NAV_PROT_LEN (RTL8712_WMAC_ + 0x34)
18#define CFEND_TH (RTL8712_WMAC_ + 0x36)
19#define AMPDU_MIN_SPACE (RTL8712_WMAC_ + 0x37)
20#define TXOP_STALL_CTRL (RTL8712_WMAC_ + 0x38)
21
22
23#endif /*__RTL8712_WMAC_REGDEF_H__*/
24
diff --git a/drivers/staging/rtl8712/rtl8712_xmit.c b/drivers/staging/rtl8712/rtl8712_xmit.c
new file mode 100644
index 00000000000..8edc518536f
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_xmit.c
@@ -0,0 +1,509 @@
1/******************************************************************************
2 * rtl8712_xmit.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL8712_XMIT_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "rtl871x_byteorder.h"
34#include "wifi.h"
35#include "osdep_intf.h"
36#include "usb_ops.h"
37
38static void dump_xframe(struct _adapter *padapter,
39 struct xmit_frame *pxmitframe);
40
41sint _r8712_init_hw_txqueue(struct hw_txqueue *phw_txqueue, u8 ac_tag)
42{
43 phw_txqueue->ac_tag = ac_tag;
44 switch (ac_tag) {
45 case BE_QUEUE_INX:
46 phw_txqueue->ff_hwaddr = RTL8712_DMA_BEQ;
47 break;
48 case BK_QUEUE_INX:
49 phw_txqueue->ff_hwaddr = RTL8712_DMA_BKQ;
50 break;
51 case VI_QUEUE_INX:
52 phw_txqueue->ff_hwaddr = RTL8712_DMA_VIQ;
53 break;
54 case VO_QUEUE_INX:
55 phw_txqueue->ff_hwaddr = RTL8712_DMA_VOQ;
56 break;
57 case BMC_QUEUE_INX:
58 phw_txqueue->ff_hwaddr = RTL8712_DMA_BEQ;
59 break;
60 }
61 return _SUCCESS;
62}
63
64int r8712_txframes_sta_ac_pending(struct _adapter *padapter,
65 struct pkt_attrib *pattrib)
66{
67 struct sta_info *psta;
68 struct tx_servq *ptxservq;
69 int priority = pattrib->priority;
70
71 psta = pattrib->psta;
72 switch (priority) {
73 case 1:
74 case 2:
75 ptxservq = &(psta->sta_xmitpriv.bk_q);
76 break;
77 case 4:
78 case 5:
79 ptxservq = &(psta->sta_xmitpriv.vi_q);
80 break;
81 case 6:
82 case 7:
83 ptxservq = &(psta->sta_xmitpriv.vo_q);
84 break;
85 case 0:
86 case 3:
87 default:
88 ptxservq = &(psta->sta_xmitpriv.be_q);
89 break;
90 }
91 return ptxservq->qcnt;
92}
93
94static u32 get_ff_hwaddr(struct xmit_frame *pxmitframe)
95{
96 u32 addr = 0;
97 struct pkt_attrib *pattrib = &pxmitframe->attrib;
98 struct _adapter *padapter = pxmitframe->padapter;
99 struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv;
100
101 if (pxmitframe->frame_tag == TXAGG_FRAMETAG)
102 addr = RTL8712_DMA_H2CCMD;
103 else if (pxmitframe->frame_tag == MGNT_FRAMETAG)
104 addr = RTL8712_DMA_MGTQ;
105 else if (pdvobj->nr_endpoint == 6) {
106 switch (pattrib->priority) {
107 case 0:
108 case 3:
109 addr = RTL8712_DMA_BEQ;
110 break;
111 case 1:
112 case 2:
113 addr = RTL8712_DMA_BKQ;
114 break;
115 case 4:
116 case 5:
117 addr = RTL8712_DMA_VIQ;
118 break;
119 case 6:
120 case 7:
121 addr = RTL8712_DMA_VOQ;
122 break;
123 case 0x10:
124 case 0x11:
125 case 0x12:
126 case 0x13:
127 addr = RTL8712_DMA_H2CCMD;
128 break;
129 default:
130 addr = RTL8712_DMA_BEQ;
131 break;
132 }
133 } else if (pdvobj->nr_endpoint == 4) {
134 switch (pattrib->qsel) {
135 case 0:
136 case 3:
137 case 1:
138 case 2:
139 addr = RTL8712_DMA_BEQ;/*RTL8712_EP_LO;*/
140 break;
141 case 4:
142 case 5:
143 case 6:
144 case 7:
145 addr = RTL8712_DMA_VOQ;/*RTL8712_EP_HI;*/
146 break;
147 case 0x10:
148 case 0x11:
149 case 0x12:
150 case 0x13:
151 addr = RTL8712_DMA_H2CCMD;;
152 break;
153 default:
154 addr = RTL8712_DMA_BEQ;/*RTL8712_EP_LO;*/
155 break;
156 }
157 }
158 return addr;
159}
160
161static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv,
162 struct hw_xmit *phwxmit,
163 struct tx_servq *ptxservq,
164 struct __queue *pframe_queue)
165{
166 struct list_head *xmitframe_plist, *xmitframe_phead;
167 struct xmit_frame *pxmitframe = NULL;
168
169 xmitframe_phead = get_list_head(pframe_queue);
170 xmitframe_plist = get_next(xmitframe_phead);
171 if ((end_of_queue_search(xmitframe_phead, xmitframe_plist)) == false) {
172 pxmitframe = LIST_CONTAINOR(xmitframe_plist,
173 struct xmit_frame, list);
174 list_delete(&pxmitframe->list);
175 ptxservq->qcnt--;
176 phwxmit->txcmdcnt++;
177 }
178 return pxmitframe;
179}
180
181static struct xmit_frame *dequeue_xframe_ex(struct xmit_priv *pxmitpriv,
182 struct hw_xmit *phwxmit_i, sint entry)
183{
184 unsigned long irqL0;
185 struct list_head *sta_plist, *sta_phead;
186 struct hw_xmit *phwxmit;
187 struct tx_servq *ptxservq = NULL;
188 struct __queue *pframe_queue = NULL;
189 struct xmit_frame *pxmitframe = NULL;
190 int i, inx[4];
191 int j, tmp, acirp_cnt[4];
192
193 /*entry indx: 0->vo, 1->vi, 2->be, 3->bk.*/
194 inx[0] = 0; acirp_cnt[0] = pxmitpriv->voq_cnt;
195 inx[1] = 1; acirp_cnt[1] = pxmitpriv->viq_cnt;
196 inx[2] = 2; acirp_cnt[2] = pxmitpriv->beq_cnt;
197 inx[3] = 3; acirp_cnt[3] = pxmitpriv->bkq_cnt;
198 for (i = 0; i < 4; i++) {
199 for (j = i + 1; j < 4; j++) {
200 if (acirp_cnt[j] < acirp_cnt[i]) {
201 tmp = acirp_cnt[i];
202 acirp_cnt[i] = acirp_cnt[j];
203 acirp_cnt[j] = tmp;
204 tmp = inx[i];
205 inx[i] = inx[j];
206 inx[j] = tmp;
207 }
208 }
209 }
210 spin_lock_irqsave(&pxmitpriv->lock, irqL0);
211 for (i = 0; i < entry; i++) {
212 phwxmit = phwxmit_i + inx[i];
213 sta_phead = get_list_head(phwxmit->sta_queue);
214 sta_plist = get_next(sta_phead);
215 while ((end_of_queue_search(sta_phead, sta_plist)) == false) {
216 ptxservq = LIST_CONTAINOR(sta_plist, struct tx_servq,
217 tx_pending);
218 pframe_queue = &ptxservq->sta_pending;
219 pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit,
220 ptxservq, pframe_queue);
221 if (pxmitframe) {
222 phwxmit->accnt--;
223 goto exit_dequeue_xframe_ex;
224 }
225 sta_plist = get_next(sta_plist);
226 /*Remove sta node when there are no pending packets.*/
227 if (_queue_empty(pframe_queue)) {
228 /*must be done after get_next and before break*/
229 list_delete(&ptxservq->tx_pending);
230 }
231 }
232 }
233exit_dequeue_xframe_ex:
234 spin_unlock_irqrestore(&pxmitpriv->lock, irqL0);
235 return pxmitframe;
236}
237
238void r8712_do_queue_select(struct _adapter *padapter,
239 struct pkt_attrib *pattrib)
240{
241 u8 qsel = 0;
242 struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv;
243
244 if (pdvobj->nr_endpoint == 6)
245 qsel = pattrib->priority;
246 else if (pdvobj->nr_endpoint == 4)
247 qsel = pattrib->priority;
248 pattrib->qsel = qsel;
249}
250
251static void update_txdesc(struct xmit_frame *pxmitframe, uint *pmem, int sz)
252{
253 uint qsel;
254 struct _adapter *padapter = pxmitframe->padapter;
255 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
256 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
257 struct security_priv *psecuritypriv = &padapter->securitypriv;
258 struct pkt_attrib *pattrib = &pxmitframe->attrib;
259 struct tx_desc *ptxdesc = (struct tx_desc *)pmem;
260 struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv;
261 u8 blnSetTxDescOffset;
262 sint bmcst = IS_MCAST(pattrib->ra);
263 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
264 struct tx_desc txdesc_mp;
265
266 memcpy(&txdesc_mp, ptxdesc, sizeof(struct tx_desc));
267 memset(ptxdesc, 0, sizeof(struct tx_desc));
268 /* offset 0 */
269 ptxdesc->txdw0 |= cpu_to_le32(sz&0x0000ffff);
270 if (pdvobj->ishighspeed) {
271 if (((sz + TXDESC_SIZE) % 512) == 0)
272 blnSetTxDescOffset = 1;
273 else
274 blnSetTxDescOffset = 0;
275 } else {
276 if (((sz + TXDESC_SIZE) % 64) == 0)
277 blnSetTxDescOffset = 1;
278 else
279 blnSetTxDescOffset = 0;
280 }
281 if (blnSetTxDescOffset) {
282 /* 32 bytes for TX Desc + 8 bytes pending */
283 ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ + 8) <<
284 OFFSET_SHT) & 0x00ff0000);
285 } else {
286 /* default = 32 bytes for TX Desc */
287 ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ) <<
288 OFFSET_SHT) & 0x00ff0000);
289 }
290 ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
291 if (pxmitframe->frame_tag == DATA_FRAMETAG) {
292 /* offset 4 */
293 ptxdesc->txdw1 |= cpu_to_le32((pattrib->mac_id)&0x1f);
294 qsel = (uint)(pattrib->qsel & 0x0000001f);
295 ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00);
296 if (!pqospriv->qos_option)
297 ptxdesc->txdw1 |= cpu_to_le32(BIT(16));/*Non-QoS*/
298 if ((pattrib->encrypt > 0) && !pattrib->bswenc) {
299 switch (pattrib->encrypt) { /*SEC_TYPE*/
300 case _WEP40_:
301 case _WEP104_:
302 ptxdesc->txdw1 |= cpu_to_le32((0x01 << 22) &
303 0x00c00000);
304 /*KEY_ID when WEP is used;*/
305 ptxdesc->txdw1 |= cpu_to_le32((psecuritypriv->
306 PrivacyKeyIndex << 17) &
307 0x00060000);
308 break;
309 case _TKIP_:
310 case _TKIP_WTMIC_:
311 ptxdesc->txdw1 |= cpu_to_le32((0x02 << 22) &
312 0x00c00000);
313 break;
314 case _AES_:
315 ptxdesc->txdw1 |= cpu_to_le32((0x03 << 22) &
316 0x00c00000);
317 break;
318 case _NO_PRIVACY_:
319 default:
320 break;
321 }
322 }
323 /*offset 8*/
324 if (bmcst)
325 ptxdesc->txdw2 |= cpu_to_le32(BMC);
326
327 /*offset 12*/
328 /* f/w will increase the seqnum by itself, driver pass the
329 * correct priority to fw
330 * fw will check the correct priority for increasing the
331 * seqnum per tid. about usb using 4-endpoint, qsel points out
332 * the correct mapping between AC&Endpoint,
333 * the purpose is that correct mapping lets the MAC release
334 * the AC Queue list correctly. */
335 ptxdesc->txdw3 = cpu_to_le32((pattrib->priority << SEQ_SHT) &
336 0x0fff0000);
337 if ((pattrib->ether_type != 0x888e) &&
338 (pattrib->ether_type != 0x0806) &&
339 (pattrib->dhcp_pkt != 1)) {
340 /*Not EAP & ARP type data packet*/
341 if (phtpriv->ht_option == 1) { /*B/G/N Mode*/
342 if (phtpriv->ampdu_enable != true)
343 ptxdesc->txdw2 |= cpu_to_le32(BK);
344 }
345 } else {
346 /* EAP data packet and ARP packet.
347 * Use the 1M data rate to send the EAP/ARP packet.
348 * This will maybe make the handshake smooth.
349 */
350 /*driver uses data rate*/
351 ptxdesc->txdw4 = cpu_to_le32(0x80000000);
352 ptxdesc->txdw5 = cpu_to_le32(0x001f8000);/*1M*/
353 }
354 if (pattrib->pctrl == 1) { /* mp tx packets */
355 struct tx_desc *ptxdesc_mp;
356 ptxdesc_mp = &txdesc_mp;
357 /* offset 8 */
358 ptxdesc->txdw2 = cpu_to_le32(ptxdesc_mp->txdw2);
359 if (bmcst)
360 ptxdesc->txdw2 |= cpu_to_le32(BMC);
361 ptxdesc->txdw2 |= cpu_to_le32(BK);
362 /* offset 16 */
363 ptxdesc->txdw4 = cpu_to_le32(ptxdesc_mp->txdw4);
364 /* offset 20 */
365 ptxdesc->txdw5 = cpu_to_le32(ptxdesc_mp->txdw5);
366 pattrib->pctrl = 0;/* reset to zero; */
367 }
368 } else if (pxmitframe->frame_tag == MGNT_FRAMETAG) {
369 /* offset 4 */
370 ptxdesc->txdw1 |= (0x05) & 0x1f;/*CAM_ID(MAC_ID), default=5;*/
371 qsel = (uint)(pattrib->qsel & 0x0000001f);
372 ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00);
373 ptxdesc->txdw1 |= cpu_to_le32(BIT(16));/* Non-QoS */
374 /* offset 8 */
375 if (bmcst)
376 ptxdesc->txdw2 |= cpu_to_le32(BMC);
377 /* offset 12 */
378 /* f/w will increase the seqnum by itself, driver pass the
379 * correct priority to fw
380 * fw will check the correct priority for increasing the seqnum
381 * per tid. about usb using 4-endpoint, qsel points out the
382 * correct mapping between AC&Endpoint,
383 * the purpose is that correct mapping let the MAC releases
384 * the AC Queue list correctly. */
385 ptxdesc->txdw3 = cpu_to_le32((pattrib->priority << SEQ_SHT) &
386 0x0fff0000);
387 /* offset 16 */
388 ptxdesc->txdw4 = cpu_to_le32(0x80002040);/*gtest*/
389 /* offset 20 */
390 ptxdesc->txdw5 = cpu_to_le32(0x001f8000);/* gtest 1M */
391 } else if (pxmitframe->frame_tag == TXAGG_FRAMETAG) {
392 /* offset 4 */
393 qsel = 0x13;
394 ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00);
395 } else {
396 /* offset 4 */
397 qsel = (uint)(pattrib->priority&0x0000001f);
398 ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00);
399 /*offset 8*/
400 /*offset 12*/
401 ptxdesc->txdw3 = cpu_to_le32((pattrib->seqnum << SEQ_SHT) &
402 0x0fff0000);
403 /*offset 16*/
404 ptxdesc->txdw4 = cpu_to_le32(0x80002040);/*gtest*/
405 /*offset 20*/
406 ptxdesc->txdw5 = cpu_to_le32(0x001f9600);/*gtest*/
407 }
408}
409
410int r8712_xmitframe_complete(struct _adapter *padapter,
411 struct xmit_priv *pxmitpriv,
412 struct xmit_buf *pxmitbuf)
413{
414 struct hw_xmit *phwxmits;
415 sint hwentry;
416 struct xmit_frame *pxmitframe = NULL;
417 int res = _SUCCESS, xcnt = 0;
418
419 phwxmits = pxmitpriv->hwxmits;
420 hwentry = pxmitpriv->hwxmit_entry;
421 if (pxmitbuf == NULL) {
422 pxmitbuf = r8712_alloc_xmitbuf(pxmitpriv);
423 if (!pxmitbuf)
424 return false;
425 }
426 do {
427 pxmitframe = dequeue_xframe_ex(pxmitpriv, phwxmits, hwentry);
428 if (pxmitframe) {
429 pxmitframe->pxmitbuf = pxmitbuf;
430 pxmitframe->pxmit_urb[0] = pxmitbuf->pxmit_urb[0];
431 pxmitframe->buf_addr = pxmitbuf->pbuf;
432 if (pxmitframe->frame_tag == DATA_FRAMETAG) {
433 if (pxmitframe->attrib.priority <= 15)
434 res = r8712_xmitframe_coalesce(padapter,
435 pxmitframe->pkt, pxmitframe);
436 /* always return ndis_packet after
437 * r8712_xmitframe_coalesce */
438 r8712_xmit_complete(padapter, pxmitframe);
439 }
440 if (res == _SUCCESS)
441 dump_xframe(padapter, pxmitframe);
442 else
443 r8712_free_xmitframe_ex(pxmitpriv, pxmitframe);
444 xcnt++;
445 } else {
446 r8712_free_xmitbuf(pxmitpriv, pxmitbuf);
447 return false;
448 }
449 break;
450 } while (0);
451 return true;
452}
453
454static void dump_xframe(struct _adapter *padapter,
455 struct xmit_frame *pxmitframe)
456{
457 int t, sz, w_sz;
458 u8 *mem_addr;
459 u32 ff_hwaddr;
460 struct pkt_attrib *pattrib = &pxmitframe->attrib;
461 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
462 struct security_priv *psecuritypriv = &padapter->securitypriv;
463
464 if (pxmitframe->attrib.ether_type != 0x0806) {
465 if (pxmitframe->attrib.ether_type != 0x888e)
466 r8712_issue_addbareq_cmd(padapter, pattrib->priority);
467 }
468 mem_addr = pxmitframe->buf_addr;
469 for (t = 0; t < pattrib->nr_frags; t++) {
470 if (t != (pattrib->nr_frags - 1)) {
471 sz = pxmitpriv->frag_len;
472 sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 :
473 pattrib->icv_len);
474 pxmitframe->last[t] = 0;
475 } else {
476 sz = pattrib->last_txcmdsz;
477 pxmitframe->last[t] = 1;
478 }
479 update_txdesc(pxmitframe, (uint *)mem_addr, sz);
480 w_sz = sz + TXDESC_SIZE;
481 pxmitframe->mem_addr = mem_addr;
482 pxmitframe->bpending[t] = false;
483 ff_hwaddr = get_ff_hwaddr(pxmitframe);
484 r8712_write_port(padapter, ff_hwaddr, w_sz,
485 (unsigned char *)pxmitframe);
486 mem_addr += w_sz;
487 mem_addr = (u8 *)RND4(((addr_t)(mem_addr)));
488 }
489}
490
491int r8712_xmit_direct(struct _adapter *padapter, struct xmit_frame *pxmitframe)
492{
493 int res = _SUCCESS;
494
495 res = r8712_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe);
496 pxmitframe->pkt = NULL;
497 if (res == _SUCCESS)
498 dump_xframe(padapter, pxmitframe);
499 return res;
500}
501
502int r8712_xmit_enqueue(struct _adapter *padapter, struct xmit_frame *pxmitframe)
503{
504 if (r8712_xmit_classifier(padapter, pxmitframe) == _FAIL) {
505 pxmitframe->pkt = NULL;
506 return _FAIL;
507 }
508 return _SUCCESS;
509}
diff --git a/drivers/staging/rtl8712/rtl8712_xmit.h b/drivers/staging/rtl8712/rtl8712_xmit.h
new file mode 100644
index 00000000000..5d77c510724
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl8712_xmit.h
@@ -0,0 +1,95 @@
1#ifndef _RTL8712_XMIT_H_
2#define _RTL8712_XMIT_H_
3
4#define HWXMIT_ENTRY 4
5
6#define VO_QUEUE_INX 0
7#define VI_QUEUE_INX 1
8#define BE_QUEUE_INX 2
9#define BK_QUEUE_INX 3
10#define TS_QUEUE_INX 4
11#define MGT_QUEUE_INX 5
12#define BMC_QUEUE_INX 6
13#define BCN_QUEUE_INX 7
14
15#define HW_QUEUE_ENTRY 8
16
17#define TXDESC_SIZE 32
18#define TXDESC_OFFSET TXDESC_SIZE
19
20#define NR_AMSDU_XMITFRAME 8
21#define NR_TXAGG_XMITFRAME 8
22
23#define MAX_AMSDU_XMITBUF_SZ 8704
24#define MAX_TXAGG_XMITBUF_SZ 16384 /*16k*/
25
26
27#define tx_cmd tx_desc
28
29
30/*
31 *defined for TX DESC Operation
32 */
33
34#define MAX_TID (15)
35
36/*OFFSET 0*/
37#define OFFSET_SZ (0)
38#define OFFSET_SHT (16)
39#define OWN BIT(31)
40#define FSG BIT(27)
41#define LSG BIT(26)
42
43/*OFFSET 4*/
44#define PKT_OFFSET_SZ (0)
45#define QSEL_SHT (8)
46#define HWPC BIT(31)
47
48/*OFFSET 8*/
49#define BMC BIT(7)
50#define BK BIT(30)
51#define AGG_EN BIT(29)
52
53/*OFFSET 12*/
54#define SEQ_SHT (16)
55
56/*OFFSET 16*/
57#define TXBW BIT(18)
58
59/*OFFSET 20*/
60#define DISFB BIT(15)
61
62struct tx_desc{
63
64 /*DWORD 0*/
65 unsigned int txdw0;
66
67 unsigned int txdw1;
68
69 unsigned int txdw2;
70
71 unsigned int txdw3;
72
73 unsigned int txdw4;
74
75 unsigned int txdw5;
76
77 unsigned int txdw6;
78
79 unsigned int txdw7;
80
81};
82
83
84union txdesc {
85 struct tx_desc txdesc;
86 unsigned int value[TXDESC_SIZE>>2];
87};
88
89int r8712_xmitframe_complete(struct _adapter *padapter,
90 struct xmit_priv *pxmitpriv,
91 struct xmit_buf *pxmitbuf);
92void r8712_do_queue_select(struct _adapter *padapter,
93 struct pkt_attrib *pattrib);
94
95#endif
diff --git a/drivers/staging/rtl8712/rtl871x_byteorder.h b/drivers/staging/rtl8712/rtl871x_byteorder.h
new file mode 100644
index 00000000000..07707e23dbe
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_byteorder.h
@@ -0,0 +1,13 @@
1#ifndef _RTL871X_BYTEORDER_H_
2#define _RTL871X_BYTEORDER_H_
3
4#if defined(__LITTLE_ENDIAN)
5# include "little_endian.h"
6#elif defined(__BIG_ENDIAN)
7# include "big_endian.h"
8#else
9# error "Must be LITTLE/BIG Endian Host"
10#endif
11
12#endif /* _RTL871X_BYTEORDER_H_ */
13
diff --git a/drivers/staging/rtl8712/rtl871x_cmd.c b/drivers/staging/rtl8712/rtl871x_cmd.c
new file mode 100644
index 00000000000..38c7dc683c7
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_cmd.c
@@ -0,0 +1,918 @@
1/******************************************************************************
2 * rtl871x_cmd.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_CMD_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "recv_osdep.h"
34#include "mlme_osdep.h"
35#include "rtl871x_byteorder.h"
36
37/*
38Caller and the r8712_cmd_thread can protect cmd_q by spin_lock.
39No irqsave is necessary.
40*/
41
42static sint _init_cmd_priv(struct cmd_priv *pcmdpriv)
43{
44 sema_init(&(pcmdpriv->cmd_queue_sema), 0);
45 sema_init(&(pcmdpriv->terminate_cmdthread_sema), 0);
46
47 _init_queue(&(pcmdpriv->cmd_queue));
48
49 /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */
50 pcmdpriv->cmd_seq = 1;
51 pcmdpriv->cmd_allocated_buf = _malloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ);
52 if (pcmdpriv->cmd_allocated_buf == NULL)
53 return _FAIL;
54 pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ -
55 ((addr_t)(pcmdpriv->cmd_allocated_buf) &
56 (CMDBUFF_ALIGN_SZ-1));
57 pcmdpriv->rsp_allocated_buf = _malloc(MAX_RSPSZ + 4);
58 if (pcmdpriv->rsp_allocated_buf == NULL)
59 return _FAIL;
60 pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 -
61 ((addr_t)(pcmdpriv->rsp_allocated_buf) & 3);
62 pcmdpriv->cmd_issued_cnt = 0;
63 pcmdpriv->cmd_done_cnt = 0;
64 pcmdpriv->rsp_cnt = 0;
65 return _SUCCESS;
66}
67
68static sint _init_evt_priv(struct evt_priv *pevtpriv)
69{
70 /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */
71 pevtpriv->event_seq = 0;
72 pevtpriv->evt_allocated_buf = _malloc(MAX_EVTSZ + 4);
73
74 if (pevtpriv->evt_allocated_buf == NULL)
75 return _FAIL;
76 pevtpriv->evt_buf = pevtpriv->evt_allocated_buf + 4 -
77 ((addr_t)(pevtpriv->evt_allocated_buf) & 3);
78 pevtpriv->evt_done_cnt = 0;
79 return _SUCCESS;
80}
81
82static void _free_evt_priv(struct evt_priv *pevtpriv)
83{
84 kfree(pevtpriv->evt_allocated_buf);
85}
86
87static void _free_cmd_priv(struct cmd_priv *pcmdpriv)
88{
89 if (pcmdpriv) {
90 kfree(pcmdpriv->cmd_allocated_buf);
91 kfree(pcmdpriv->rsp_allocated_buf);
92 }
93}
94
95/*
96Calling Context:
97
98_enqueue_cmd can only be called between kernel thread,
99since only spin_lock is used.
100
101ISR/Call-Back functions can't call this sub-function.
102
103*/
104
105static sint _enqueue_cmd(struct __queue *queue, struct cmd_obj *obj)
106{
107 unsigned long irqL;
108
109 if (obj == NULL)
110 return _SUCCESS;
111 spin_lock_irqsave(&queue->lock, irqL);
112 list_insert_tail(&obj->list, &queue->queue);
113 spin_unlock_irqrestore(&queue->lock, irqL);
114 return _SUCCESS;
115}
116
117static struct cmd_obj *_dequeue_cmd(struct __queue *queue)
118{
119 unsigned long irqL;
120 struct cmd_obj *obj;
121
122 spin_lock_irqsave(&(queue->lock), irqL);
123 if (is_list_empty(&(queue->queue)))
124 obj = NULL;
125 else {
126 obj = LIST_CONTAINOR(get_next(&(queue->queue)),
127 struct cmd_obj, list);
128 list_delete(&obj->list);
129 }
130 spin_unlock_irqrestore(&(queue->lock), irqL);
131 return obj;
132}
133
134u32 r8712_init_cmd_priv(struct cmd_priv *pcmdpriv)
135{
136 return _init_cmd_priv(pcmdpriv);
137}
138
139u32 r8712_init_evt_priv(struct evt_priv *pevtpriv)
140{
141 return _init_evt_priv(pevtpriv);
142}
143
144void r8712_free_evt_priv(struct evt_priv *pevtpriv)
145{
146 _free_evt_priv(pevtpriv);
147}
148
149void r8712_free_cmd_priv(struct cmd_priv *pcmdpriv)
150{
151 _free_cmd_priv(pcmdpriv);
152}
153
154u32 r8712_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj)
155{
156 int res;
157
158 if (pcmdpriv->padapter->eeprompriv.bautoload_fail_flag == true)
159 return _FAIL;
160 res = _enqueue_cmd(&pcmdpriv->cmd_queue, obj);
161 up(&pcmdpriv->cmd_queue_sema);
162 return res;
163}
164
165u32 r8712_enqueue_cmd_ex(struct cmd_priv *pcmdpriv, struct cmd_obj *obj)
166{
167 unsigned long irqL;
168 struct __queue *queue;
169
170 if (obj == NULL)
171 return _SUCCESS;
172 if (pcmdpriv->padapter->eeprompriv.bautoload_fail_flag == true)
173 return _FAIL;
174 queue = &pcmdpriv->cmd_queue;
175 spin_lock_irqsave(&queue->lock, irqL);
176 list_insert_tail(&obj->list, &queue->queue);
177 spin_unlock_irqrestore(&queue->lock, irqL);
178 up(&pcmdpriv->cmd_queue_sema);
179 return _SUCCESS;
180}
181
182struct cmd_obj *r8712_dequeue_cmd(struct __queue *queue)
183{
184 return _dequeue_cmd(queue);
185}
186
187void r8712_free_cmd_obj(struct cmd_obj *pcmd)
188{
189 if ((pcmd->cmdcode != _JoinBss_CMD_) &&
190 (pcmd->cmdcode != _CreateBss_CMD_))
191 kfree((unsigned char *)pcmd->parmbuf);
192 if (pcmd->rsp != NULL) {
193 if (pcmd->rspsz != 0)
194 kfree((unsigned char *)pcmd->rsp);
195 }
196 kfree((unsigned char *)pcmd);
197}
198
199/*
200r8712_sitesurvey_cmd(~)
201 ### NOTE:#### (!!!!)
202 MUST TAKE CARE THAT BEFORE CALLING THIS FUNC,
203 YOU SHOULD HAVE LOCKED pmlmepriv->lock
204*/
205u8 r8712_sitesurvey_cmd(struct _adapter *padapter,
206 struct ndis_802_11_ssid *pssid)
207{
208 struct cmd_obj *ph2c;
209 struct sitesurvey_parm *psurveyPara;
210 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
211 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
212
213 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
214 if (ph2c == NULL)
215 return _FAIL;
216 psurveyPara = (struct sitesurvey_parm *)_malloc(
217 sizeof(struct sitesurvey_parm));
218 if (psurveyPara == NULL) {
219 kfree((unsigned char *) ph2c);
220 return _FAIL;
221 }
222 init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara,
223 GEN_CMD_CODE(_SiteSurvey));
224 psurveyPara->bsslimit = cpu_to_le32(48);
225 psurveyPara->passive_mode = cpu_to_le32(1);
226 psurveyPara->ss_ssidlen = 0;
227 memset(psurveyPara->ss_ssid, 0, IW_ESSID_MAX_SIZE + 1);
228 if ((pssid != NULL) && (pssid->SsidLength)) {
229 memcpy(psurveyPara->ss_ssid, pssid->Ssid, pssid->SsidLength);
230 psurveyPara->ss_ssidlen = cpu_to_le32(pssid->SsidLength);
231 }
232 set_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
233 r8712_enqueue_cmd(pcmdpriv, ph2c);
234 _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT);
235 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_SITE_SURVEY);
236 return _SUCCESS;
237}
238
239u8 r8712_setdatarate_cmd(struct _adapter *padapter, u8 *rateset)
240{
241 struct cmd_obj *ph2c;
242 struct setdatarate_parm *pbsetdataratepara;
243 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
244
245 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
246 if (ph2c == NULL)
247 return _FAIL;
248 pbsetdataratepara = (struct setdatarate_parm *)_malloc(
249 sizeof(struct setdatarate_parm));
250 if (pbsetdataratepara == NULL) {
251 kfree((u8 *) ph2c);
252 return _FAIL;
253 }
254 init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara,
255 GEN_CMD_CODE(_SetDataRate));
256 pbsetdataratepara->mac_id = 5;
257 memcpy(pbsetdataratepara->datarates, rateset, NumRates);
258 r8712_enqueue_cmd(pcmdpriv, ph2c);
259 return _SUCCESS;
260}
261
262u8 r8712_setbasicrate_cmd(struct _adapter *padapter, u8 *rateset)
263{
264 struct cmd_obj *ph2c;
265 struct setbasicrate_parm *pssetbasicratepara;
266 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
267
268 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
269 if (ph2c == NULL)
270 return _FAIL;
271 pssetbasicratepara = (struct setbasicrate_parm *)_malloc(
272 sizeof(struct setbasicrate_parm));
273 if (pssetbasicratepara == NULL) {
274 kfree((u8 *) ph2c);
275 return _FAIL;
276 }
277 init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara,
278 _SetBasicRate_CMD_);
279 memcpy(pssetbasicratepara->basicrates, rateset, NumRates);
280 r8712_enqueue_cmd(pcmdpriv, ph2c);
281 return _SUCCESS;
282}
283
284/* power tracking mechanism setting */
285u8 r8712_setptm_cmd(struct _adapter *padapter, u8 type)
286{
287 struct cmd_obj *ph2c;
288 struct PT_param *pptparm;
289 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
290
291 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
292 if (ph2c == NULL)
293 return _FAIL;
294 pptparm = (struct PT_param *)_malloc(sizeof(struct PT_param));
295 if (pptparm == NULL) {
296 kfree((u8 *) ph2c);
297 return _FAIL;
298 }
299 init_h2fwcmd_w_parm_no_rsp(ph2c, pptparm,
300 GEN_CMD_CODE(_SetPowerTracking));
301 pptparm->PT_En = type;
302 r8712_enqueue_cmd(pcmdpriv, ph2c);
303 return _SUCCESS;
304}
305
306u8 r8712_setrfreg_cmd(struct _adapter *padapter, u8 offset, u32 val)
307{
308 struct cmd_obj *ph2c;
309 struct writeRF_parm *pwriterfparm;
310 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
311
312 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
313 if (ph2c == NULL)
314 return _FAIL;
315 pwriterfparm = (struct writeRF_parm *)_malloc(
316 sizeof(struct writeRF_parm));
317 if (pwriterfparm == NULL) {
318 kfree((u8 *) ph2c);
319 return _FAIL;
320 }
321 init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg));
322 pwriterfparm->offset = offset;
323 pwriterfparm->value = val;
324 r8712_enqueue_cmd(pcmdpriv, ph2c);
325 return _SUCCESS;
326}
327
328u8 r8712_getrfreg_cmd(struct _adapter *padapter, u8 offset, u8 *pval)
329{
330 struct cmd_obj *ph2c;
331 struct readRF_parm *prdrfparm;
332 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
333
334 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
335 if (ph2c == NULL)
336 return _FAIL;
337 prdrfparm = (struct readRF_parm *)_malloc(sizeof(struct readRF_parm));
338 if (prdrfparm == NULL) {
339 kfree((u8 *) ph2c);
340 return _FAIL;
341 }
342 _init_listhead(&ph2c->list);
343 ph2c->cmdcode = GEN_CMD_CODE(_GetRFReg);
344 ph2c->parmbuf = (unsigned char *)prdrfparm;
345 ph2c->cmdsz = sizeof(struct readRF_parm);
346 ph2c->rsp = pval;
347 ph2c->rspsz = sizeof(struct readRF_rsp);
348 prdrfparm->offset = offset;
349 r8712_enqueue_cmd(pcmdpriv, ph2c);
350 return _SUCCESS;
351}
352
353void r8712_getbbrfreg_cmdrsp_callback(struct _adapter *padapter,
354 struct cmd_obj *pcmd)
355{
356 kfree((unsigned char *) pcmd->parmbuf);
357 kfree((unsigned char *) pcmd);
358 padapter->mppriv.workparam.bcompleted = true;
359}
360
361u8 r8712_createbss_cmd(struct _adapter *padapter)
362{
363 struct cmd_obj *pcmd;
364 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
365 struct wlan_bssid_ex *pdev_network =
366 &padapter->registrypriv.dev_network;
367
368 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_START_TO_LINK);
369 pcmd = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
370 if (pcmd == NULL)
371 return _FAIL;
372 _init_listhead(&pcmd->list);
373 pcmd->cmdcode = _CreateBss_CMD_;
374 pcmd->parmbuf = (unsigned char *)pdev_network;
375 pcmd->cmdsz = r8712_get_ndis_wlan_bssid_ex_sz((
376 struct ndis_wlan_bssid_ex *)
377 pdev_network);
378 pcmd->rsp = NULL;
379 pcmd->rspsz = 0;
380 /* notes: translate IELength & Length after assign to cmdsz; */
381 pdev_network->Length = cpu_to_le32(pcmd->cmdsz);
382 pdev_network->IELength = cpu_to_le32(pdev_network->IELength);
383 pdev_network->Ssid.SsidLength = cpu_to_le32(
384 pdev_network->Ssid.SsidLength);
385 r8712_enqueue_cmd(pcmdpriv, pcmd);
386 return _SUCCESS;
387}
388
389u8 r8712_joinbss_cmd(struct _adapter *padapter, struct wlan_network *pnetwork)
390{
391 u8 *auth;
392 uint t_len = 0;
393 struct ndis_wlan_bssid_ex *psecnetwork;
394 struct cmd_obj *pcmd;
395 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
396 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
397 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
398 struct security_priv *psecuritypriv = &padapter->securitypriv;
399 struct registry_priv *pregistrypriv = &padapter->registrypriv;
400 enum NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->
401 network.InfrastructureMode;
402
403 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_START_TO_LINK);
404 pcmd = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
405 if (pcmd == NULL)
406 return _FAIL;
407 t_len = sizeof(u32) + 6 * sizeof(unsigned char) + 2 +
408 sizeof(struct ndis_802_11_ssid) + sizeof(u32) +
409 sizeof(s32) +
410 sizeof(enum NDIS_802_11_NETWORK_TYPE) +
411 sizeof(struct NDIS_802_11_CONFIGURATION) +
412 sizeof(enum NDIS_802_11_NETWORK_INFRASTRUCTURE) +
413 sizeof(NDIS_802_11_RATES_EX) +
414 sizeof(u32) + MAX_IE_SZ;
415
416 /* for hidden ap to set fw_state here */
417 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) !=
418 true) {
419 switch (ndis_network_mode) {
420 case Ndis802_11IBSS:
421 pmlmepriv->fw_state |= WIFI_ADHOC_STATE;
422 break;
423 case Ndis802_11Infrastructure:
424 pmlmepriv->fw_state |= WIFI_STATION_STATE;
425 break;
426 case Ndis802_11APMode:
427 case Ndis802_11AutoUnknown:
428 case Ndis802_11InfrastructureMax:
429 break;
430 }
431 }
432 psecnetwork = (struct ndis_wlan_bssid_ex *)&psecuritypriv->sec_bss;
433 if (psecnetwork == NULL) {
434 if (pcmd != NULL)
435 kfree((unsigned char *)pcmd);
436 return _FAIL;
437 }
438 memset(psecnetwork, 0, t_len);
439 memcpy(psecnetwork, &pnetwork->network, t_len);
440 auth = &psecuritypriv->authenticator_ie[0];
441 psecuritypriv->authenticator_ie[0] = (unsigned char)
442 psecnetwork->IELength;
443 if ((psecnetwork->IELength-12) < (256 - 1))
444 memcpy(&psecuritypriv->authenticator_ie[1],
445 &psecnetwork->IEs[12], psecnetwork->IELength-12);
446 else
447 memcpy(&psecuritypriv->authenticator_ie[1],
448 &psecnetwork->IEs[12], (256-1));
449 psecnetwork->IELength = 0;
450 /* If the the driver wants to use the bssid to create the connection.
451 * If not, we copy the connecting AP's MAC address to it so that
452 * the driver just has the bssid information for PMKIDList searching.
453 */
454 if (pmlmepriv->assoc_by_bssid == false)
455 memcpy(&pmlmepriv->assoc_bssid[0],
456 &pnetwork->network.MacAddress[0], ETH_ALEN);
457 psecnetwork->IELength = r8712_restruct_sec_ie(padapter,
458 &pnetwork->network.IEs[0],
459 &psecnetwork->IEs[0],
460 pnetwork->network.IELength);
461 pqospriv->qos_option = 0;
462 if (pregistrypriv->wmm_enable) {
463 u32 tmp_len;
464
465 tmp_len = r8712_restruct_wmm_ie(padapter,
466 &pnetwork->network.IEs[0],
467 &psecnetwork->IEs[0],
468 pnetwork->network.IELength,
469 psecnetwork->IELength);
470 if (psecnetwork->IELength != tmp_len) {
471 psecnetwork->IELength = tmp_len;
472 pqospriv->qos_option = 1; /* WMM IE in beacon */
473 } else
474 pqospriv->qos_option = 0; /* no WMM IE in beacon */
475 }
476 if (pregistrypriv->ht_enable) {
477 /* r8712_restructure_ht_ie */
478 r8712_restructure_ht_ie(padapter, &pnetwork->network.IEs[0],
479 &psecnetwork->IEs[0],
480 pnetwork->network.IELength,
481 &psecnetwork->IELength);
482 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)
483 r8712_add_ht_addt_info(padapter,
484 &pnetwork->network.IEs[0],
485 &psecnetwork->IEs[0],
486 pnetwork->network.IELength,
487 &psecnetwork->IELength);
488 }
489 psecuritypriv->supplicant_ie[0] = (u8)psecnetwork->IELength;
490 if (psecnetwork->IELength < 255)
491 memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0],
492 psecnetwork->IELength);
493 else
494 memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0],
495 255);
496 /* get cmdsz before endian conversion */
497 pcmd->cmdsz = r8712_get_ndis_wlan_bssid_ex_sz(psecnetwork);
498#ifdef __BIG_ENDIAN
499 /* wlan_network endian conversion */
500 psecnetwork->Length = cpu_to_le32(psecnetwork->Length);
501 psecnetwork->Ssid.SsidLength = cpu_to_le32(
502 psecnetwork->Ssid.SsidLength);
503 psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy);
504 psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi);
505 psecnetwork->NetworkTypeInUse = cpu_to_le32(
506 psecnetwork->NetworkTypeInUse);
507 psecnetwork->Configuration.ATIMWindow = cpu_to_le32(
508 psecnetwork->Configuration.ATIMWindow);
509 psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(
510 psecnetwork->Configuration.BeaconPeriod);
511 psecnetwork->Configuration.DSConfig = cpu_to_le32(
512 psecnetwork->Configuration.DSConfig);
513 psecnetwork->Configuration.FHConfig.DwellTime = cpu_to_le32(
514 psecnetwork->Configuration.FHConfig.DwellTime);
515 psecnetwork->Configuration.FHConfig.HopPattern = cpu_to_le32(
516 psecnetwork->Configuration.FHConfig.HopPattern);
517 psecnetwork->Configuration.FHConfig.HopSet = cpu_to_le32(
518 psecnetwork->Configuration.FHConfig.HopSet);
519 psecnetwork->Configuration.FHConfig.Length = cpu_to_le32(
520 psecnetwork->Configuration.FHConfig.Length);
521 psecnetwork->Configuration.Length = cpu_to_le32(
522 psecnetwork->Configuration.Length);
523 psecnetwork->InfrastructureMode = cpu_to_le32(
524 psecnetwork->InfrastructureMode);
525 psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength);
526#endif
527 _init_listhead(&pcmd->list);
528 pcmd->cmdcode = _JoinBss_CMD_;
529 pcmd->parmbuf = (unsigned char *)psecnetwork;
530 pcmd->rsp = NULL;
531 pcmd->rspsz = 0;
532 r8712_enqueue_cmd(pcmdpriv, pcmd);
533 return _SUCCESS;
534}
535
536u8 r8712_disassoc_cmd(struct _adapter *padapter) /* for sta_mode */
537{
538 struct cmd_obj *pdisconnect_cmd;
539 struct disconnect_parm *pdisconnect;
540 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
541
542 pdisconnect_cmd = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
543 if (pdisconnect_cmd == NULL)
544 return _FAIL;
545 pdisconnect = (struct disconnect_parm *)_malloc(
546 sizeof(struct disconnect_parm));
547 if (pdisconnect == NULL) {
548 kfree((u8 *)pdisconnect_cmd);
549 return _FAIL;
550 }
551 init_h2fwcmd_w_parm_no_rsp(pdisconnect_cmd, pdisconnect,
552 _DisConnect_CMD_);
553 r8712_enqueue_cmd(pcmdpriv, pdisconnect_cmd);
554 return _SUCCESS;
555}
556
557u8 r8712_setopmode_cmd(struct _adapter *padapter,
558 enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype)
559{
560 struct cmd_obj *ph2c;
561 struct setopmode_parm *psetop;
562
563 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
564
565 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
566 if (ph2c == NULL)
567 return _FAIL;
568 psetop = (struct setopmode_parm *)_malloc(
569 sizeof(struct setopmode_parm));
570 if (psetop == NULL) {
571 kfree((u8 *) ph2c);
572 return _FAIL;
573 }
574 init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_);
575 psetop->mode = (u8)networktype;
576 r8712_enqueue_cmd(pcmdpriv, ph2c);
577 return _SUCCESS;
578}
579
580u8 r8712_setstakey_cmd(struct _adapter *padapter, u8 *psta, u8 unicast_key)
581{
582 struct cmd_obj *ph2c;
583 struct set_stakey_parm *psetstakey_para;
584 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
585 struct set_stakey_rsp *psetstakey_rsp = NULL;
586 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
587 struct security_priv *psecuritypriv = &padapter->securitypriv;
588 struct sta_info *sta = (struct sta_info *)psta;
589
590 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
591 if (ph2c == NULL)
592 return _FAIL;
593 psetstakey_para = (struct set_stakey_parm *)_malloc(
594 sizeof(struct set_stakey_parm));
595 if (psetstakey_para == NULL) {
596 kfree((u8 *) ph2c);
597 return _FAIL;
598 }
599 psetstakey_rsp = (struct set_stakey_rsp *)_malloc(
600 sizeof(struct set_stakey_rsp));
601 if (psetstakey_rsp == NULL) {
602 kfree((u8 *) ph2c);
603 kfree((u8 *) psetstakey_para);
604 return _FAIL;
605 }
606 init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
607 ph2c->rsp = (u8 *) psetstakey_rsp;
608 ph2c->rspsz = sizeof(struct set_stakey_rsp);
609 memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
610 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
611 psetstakey_para->algorithm = (unsigned char)
612 psecuritypriv->PrivacyAlgrthm;
613 else
614 GET_ENCRY_ALGO(psecuritypriv, sta,
615 psetstakey_para->algorithm, false);
616 if (unicast_key == true)
617 memcpy(&psetstakey_para->key, &sta->x_UncstKey, 16);
618 else
619 memcpy(&psetstakey_para->key,
620 &psecuritypriv->XGrpKey[
621 psecuritypriv->XGrpKeyid - 1]. skey, 16);
622 r8712_enqueue_cmd(pcmdpriv, ph2c);
623 return _SUCCESS;
624}
625
626u8 r8712_setrfintfs_cmd(struct _adapter *padapter, u8 mode)
627{
628 struct cmd_obj *ph2c;
629 struct setrfintfs_parm *psetrfintfsparm;
630 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
631
632 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
633 if (ph2c == NULL)
634 return _FAIL;
635 psetrfintfsparm = (struct setrfintfs_parm *)_malloc(
636 sizeof(struct setrfintfs_parm));
637 if (psetrfintfsparm == NULL) {
638 kfree((unsigned char *) ph2c);
639 return _FAIL;
640 }
641 init_h2fwcmd_w_parm_no_rsp(ph2c, psetrfintfsparm,
642 GEN_CMD_CODE(_SetRFIntFs));
643 psetrfintfsparm->rfintfs = mode;
644 r8712_enqueue_cmd(pcmdpriv, ph2c);
645 return _SUCCESS;
646}
647
648u8 r8712_setrttbl_cmd(struct _adapter *padapter,
649 struct setratable_parm *prate_table)
650{
651 struct cmd_obj *ph2c;
652 struct setratable_parm *psetrttblparm;
653 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
654
655 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
656 if (ph2c == NULL)
657 return _FAIL;
658 psetrttblparm = (struct setratable_parm *)_malloc(
659 sizeof(struct setratable_parm));
660 if (psetrttblparm == NULL) {
661 kfree((unsigned char *)ph2c);
662 return _FAIL;
663 }
664 init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm,
665 GEN_CMD_CODE(_SetRaTable));
666 memcpy(psetrttblparm, prate_table, sizeof(struct setratable_parm));
667 r8712_enqueue_cmd(pcmdpriv, ph2c);
668 return _SUCCESS;
669}
670
671u8 r8712_setMacAddr_cmd(struct _adapter *padapter, u8 *mac_addr)
672{
673 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
674 struct cmd_obj *ph2c;
675 struct SetMacAddr_param *psetMacAddr_para;
676
677 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
678 if (ph2c == NULL)
679 return _FAIL;
680 psetMacAddr_para = (struct SetMacAddr_param *)_malloc(
681 sizeof(struct SetMacAddr_param));
682 if (psetMacAddr_para == NULL) {
683 kfree((u8 *) ph2c);
684 return _FAIL;
685 }
686 init_h2fwcmd_w_parm_no_rsp(ph2c, psetMacAddr_para,
687 _SetMacAddress_CMD_);
688 memcpy(psetMacAddr_para->MacAddr, mac_addr, ETH_ALEN);
689 r8712_enqueue_cmd(pcmdpriv, ph2c);
690 return _SUCCESS;
691}
692
693u8 r8712_setassocsta_cmd(struct _adapter *padapter, u8 *mac_addr)
694{
695 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
696 struct cmd_obj *ph2c;
697 struct set_assocsta_parm *psetassocsta_para;
698 struct set_stakey_rsp *psetassocsta_rsp = NULL;
699
700 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
701 if (ph2c == NULL)
702 return _FAIL;
703 psetassocsta_para = (struct set_assocsta_parm *)
704 _malloc(sizeof(struct set_assocsta_parm));
705 if (psetassocsta_para == NULL) {
706 kfree((u8 *) ph2c);
707 return _FAIL;
708 }
709 psetassocsta_rsp = (struct set_stakey_rsp *)_malloc(
710 sizeof(struct set_assocsta_rsp));
711 if (psetassocsta_rsp == NULL) {
712 kfree((u8 *)ph2c);
713 kfree((u8 *)psetassocsta_para);
714 return _FAIL;
715 }
716 init_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_);
717 ph2c->rsp = (u8 *) psetassocsta_rsp;
718 ph2c->rspsz = sizeof(struct set_assocsta_rsp);
719 memcpy(psetassocsta_para->addr, mac_addr, ETH_ALEN);
720 r8712_enqueue_cmd(pcmdpriv, ph2c);
721 return _SUCCESS;
722}
723
724u8 r8712_addbareq_cmd(struct _adapter *padapter, u8 tid)
725{
726 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
727 struct cmd_obj *ph2c;
728 struct addBaReq_parm *paddbareq_parm;
729
730 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
731 if (ph2c == NULL)
732 return _FAIL;
733 paddbareq_parm = (struct addBaReq_parm *)_malloc(
734 sizeof(struct addBaReq_parm));
735 if (paddbareq_parm == NULL) {
736 kfree((unsigned char *)ph2c);
737 return _FAIL;
738 }
739 paddbareq_parm->tid = tid;
740 init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm,
741 GEN_CMD_CODE(_AddBAReq));
742 r8712_enqueue_cmd_ex(pcmdpriv, ph2c);
743 return _SUCCESS;
744}
745
746u8 r8712_wdg_wk_cmd(struct _adapter *padapter)
747{
748 struct cmd_obj *ph2c;
749 struct drvint_cmd_parm *pdrvintcmd_param;
750 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
751
752 ph2c = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
753 if (ph2c == NULL)
754 return _FAIL;
755 pdrvintcmd_param = (struct drvint_cmd_parm *)_malloc(
756 sizeof(struct drvint_cmd_parm));
757 if (pdrvintcmd_param == NULL) {
758 kfree((unsigned char *)ph2c);
759 return _FAIL;
760 }
761 pdrvintcmd_param->i_cid = WDG_WK_CID;
762 pdrvintcmd_param->sz = 0;
763 pdrvintcmd_param->pbuf = NULL;
764 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvintcmd_param, _DRV_INT_CMD_);
765 r8712_enqueue_cmd_ex(pcmdpriv, ph2c);
766 return _SUCCESS;
767}
768
769void r8712_survey_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd)
770{
771 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
772
773 if (pcmd->res != H2C_SUCCESS)
774 clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
775 r8712_free_cmd_obj(pcmd);
776}
777
778void r8712_disassoc_cmd_callback(struct _adapter *padapter,
779 struct cmd_obj *pcmd)
780{
781 unsigned long irqL;
782 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
783
784 if (pcmd->res != H2C_SUCCESS) {
785 spin_lock_irqsave(&pmlmepriv->lock, irqL);
786 set_fwstate(pmlmepriv, _FW_LINKED);
787 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
788 return;
789 }
790 r8712_free_cmd_obj(pcmd);
791}
792
793void r8712_joinbss_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd)
794{
795 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
796
797 if ((pcmd->res != H2C_SUCCESS))
798 _set_timer(&pmlmepriv->assoc_timer, 1);
799 r8712_free_cmd_obj(pcmd);
800}
801
802void r8712_createbss_cmd_callback(struct _adapter *padapter,
803 struct cmd_obj *pcmd)
804{
805 unsigned long irqL;
806 u8 timer_cancelled;
807 struct sta_info *psta = NULL;
808 struct wlan_network *pwlan = NULL;
809 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
810 struct ndis_wlan_bssid_ex *pnetwork = (struct ndis_wlan_bssid_ex *)
811 pcmd->parmbuf;
812 struct wlan_network *tgt_network = &(pmlmepriv->cur_network);
813
814 if ((pcmd->res != H2C_SUCCESS))
815 _set_timer(&pmlmepriv->assoc_timer, 1);
816 _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled);
817#ifdef __BIG_ENDIAN
818 /* endian_convert */
819 pnetwork->Length = le32_to_cpu(pnetwork->Length);
820 pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength);
821 pnetwork->Privacy = le32_to_cpu(pnetwork->Privacy);
822 pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi);
823 pnetwork->NetworkTypeInUse = le32_to_cpu(pnetwork->NetworkTypeInUse);
824 pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->
825 Configuration.ATIMWindow);
826 pnetwork->Configuration.DSConfig = le32_to_cpu(pnetwork->
827 Configuration.DSConfig);
828 pnetwork->Configuration.FHConfig.DwellTime = le32_to_cpu(pnetwork->
829 Configuration.FHConfig.DwellTime);
830 pnetwork->Configuration.FHConfig.HopPattern = le32_to_cpu(pnetwork->
831 Configuration.FHConfig.HopPattern);
832 pnetwork->Configuration.FHConfig.HopSet = le32_to_cpu(pnetwork->
833 Configuration.FHConfig.HopSet);
834 pnetwork->Configuration.FHConfig.Length = le32_to_cpu(pnetwork->
835 Configuration.FHConfig.Length);
836 pnetwork->Configuration.Length = le32_to_cpu(pnetwork->
837 Configuration.Length);
838 pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->
839 InfrastructureMode);
840 pnetwork->IELength = le32_to_cpu(pnetwork->IELength);
841#endif
842 spin_lock_irqsave(&pmlmepriv->lock, irqL);
843 if ((pmlmepriv->fw_state) & WIFI_AP_STATE) {
844 psta = r8712_get_stainfo(&padapter->stapriv,
845 pnetwork->MacAddress);
846 if (!psta) {
847 psta = r8712_alloc_stainfo(&padapter->stapriv,
848 pnetwork->MacAddress);
849 if (psta == NULL)
850 goto createbss_cmd_fail ;
851 }
852 r8712_indicate_connect(padapter);
853 } else {
854 pwlan = _r8712_alloc_network(pmlmepriv);
855 if (pwlan == NULL) {
856 pwlan = r8712_get_oldest_wlan_network(
857 &pmlmepriv->scanned_queue);
858 if (pwlan == NULL)
859 goto createbss_cmd_fail;
860 pwlan->last_scanned = jiffies;
861 } else
862 list_insert_tail(&(pwlan->list),
863 &pmlmepriv->scanned_queue.queue);
864 pnetwork->Length = r8712_get_ndis_wlan_bssid_ex_sz(pnetwork);
865 memcpy(&(pwlan->network), pnetwork, pnetwork->Length);
866 pwlan->fixed = true;
867 memcpy(&tgt_network->network, pnetwork,
868 (r8712_get_ndis_wlan_bssid_ex_sz(pnetwork)));
869 if (pmlmepriv->fw_state & _FW_UNDER_LINKING)
870 pmlmepriv->fw_state ^= _FW_UNDER_LINKING;
871 /* we will set _FW_LINKED when there is one more sat to
872 * join us (stassoc_event_callback) */
873 }
874createbss_cmd_fail:
875 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
876 r8712_free_cmd_obj(pcmd);
877}
878
879void r8712_setstaKey_cmdrsp_callback(struct _adapter *padapter,
880 struct cmd_obj *pcmd)
881{
882 struct sta_priv *pstapriv = &padapter->stapriv;
883 struct set_stakey_rsp *psetstakey_rsp = (struct set_stakey_rsp *)
884 (pcmd->rsp);
885 struct sta_info *psta = r8712_get_stainfo(pstapriv,
886 psetstakey_rsp->addr);
887
888 if (psta == NULL)
889 goto exit;
890 psta->aid = psta->mac_id = psetstakey_rsp->keyid; /*CAM_ID(CAM_ENTRY)*/
891exit:
892 r8712_free_cmd_obj(pcmd);
893}
894
895void r8712_setassocsta_cmdrsp_callback(struct _adapter *padapter,
896 struct cmd_obj *pcmd)
897{
898 unsigned long irqL;
899 struct sta_priv *pstapriv = &padapter->stapriv;
900 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
901 struct set_assocsta_parm *passocsta_parm =
902 (struct set_assocsta_parm *)(pcmd->parmbuf);
903 struct set_assocsta_rsp *passocsta_rsp =
904 (struct set_assocsta_rsp *) (pcmd->rsp);
905 struct sta_info *psta = r8712_get_stainfo(pstapriv,
906 passocsta_parm->addr);
907
908 if (psta == NULL)
909 return;
910 psta->aid = psta->mac_id = passocsta_rsp->cam_id;
911 spin_lock_irqsave(&pmlmepriv->lock, irqL);
912 if ((check_fwstate(pmlmepriv, WIFI_MP_STATE)) &&
913 (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)))
914 pmlmepriv->fw_state ^= _FW_UNDER_LINKING;
915 set_fwstate(pmlmepriv, _FW_LINKED);
916 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
917 r8712_free_cmd_obj(pcmd);
918}
diff --git a/drivers/staging/rtl8712/rtl871x_cmd.h b/drivers/staging/rtl8712/rtl871x_cmd.h
new file mode 100644
index 00000000000..3a945b5f0e0
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_cmd.h
@@ -0,0 +1,719 @@
1#ifndef __RTL871X_CMD_H_
2#define __RTL871X_CMD_H_
3
4#include "wlan_bssdef.h"
5#include "rtl871x_rf.h"
6#define C2H_MEM_SZ (16*1024)
7
8#include "osdep_service.h"
9#include "ieee80211.h"
10
11#define FREE_CMDOBJ_SZ 128
12#define MAX_CMDSZ 512
13#define MAX_RSPSZ 512
14#define MAX_EVTSZ 1024
15#define CMDBUFF_ALIGN_SZ 512
16
17struct cmd_obj {
18 u16 cmdcode;
19 u8 res;
20 u8 *parmbuf;
21 u32 cmdsz;
22 u8 *rsp;
23 u32 rspsz;
24 struct list_head list;
25};
26
27struct cmd_priv {
28 struct semaphore cmd_queue_sema;
29 struct semaphore terminate_cmdthread_sema;
30 struct __queue cmd_queue;
31 u8 cmd_seq;
32 u8 *cmd_buf; /*shall be non-paged, and 4 bytes aligned*/
33 u8 *cmd_allocated_buf;
34 u8 *rsp_buf; /*shall be non-paged, and 4 bytes aligned*/
35 u8 *rsp_allocated_buf;
36 u32 cmd_issued_cnt;
37 u32 cmd_done_cnt;
38 u32 rsp_cnt;
39 struct _adapter *padapter;
40};
41
42struct evt_obj {
43 u16 evtcode;
44 u8 res;
45 u8 *parmbuf;
46 u32 evtsz;
47 struct list_head list;
48};
49
50struct evt_priv {
51 struct __queue evt_queue;
52 u8 event_seq;
53 u8 *evt_buf; /*shall be non-paged, and 4 bytes aligned*/
54 u8 *evt_allocated_buf;
55 u32 evt_done_cnt;
56 struct tasklet_struct event_tasklet;
57};
58
59#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \
60do {\
61 _init_listhead(&pcmd->list);\
62 pcmd->cmdcode = code;\
63 pcmd->parmbuf = (u8 *)(pparm);\
64 pcmd->cmdsz = sizeof(*pparm);\
65 pcmd->rsp = NULL;\
66 pcmd->rspsz = 0;\
67} while (0)
68
69u32 r8712_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj);
70u32 r8712_enqueue_cmd_ex(struct cmd_priv *pcmdpriv, struct cmd_obj *obj);
71struct cmd_obj *r8712_dequeue_cmd(struct __queue *queue);
72void r8712_free_cmd_obj(struct cmd_obj *pcmd);
73int r8712_cmd_thread(void *context);
74u32 r8712_init_cmd_priv(struct cmd_priv *pcmdpriv);
75void r8712_free_cmd_priv(struct cmd_priv *pcmdpriv);
76u32 r8712_init_evt_priv(struct evt_priv *pevtpriv);
77void r8712_free_evt_priv(struct evt_priv *pevtpriv);
78
79enum rtl871x_drvint_cid {
80 NONE_WK_CID,
81 WDG_WK_CID,
82 MAX_WK_CID
83};
84
85enum RFINTFS {
86 SWSI,
87 HWSI,
88 HWPI,
89};
90
91/*
92 * Caller Mode: Infra, Ad-HoC(C)
93 * Notes: To enter USB suspend mode
94 * Command Mode
95 */
96struct usb_suspend_parm {
97 u32 action; /* 1: sleep, 0:resume */
98};
99
100/*
101 * Caller Mode: Infra, Ad-Hoc
102 * Notes: To join the specified bss
103 * Command Event Mode
104 */
105struct joinbss_parm {
106 struct ndis_wlan_bssid_ex network;
107};
108
109/*
110 * Caller Mode: Infra, Ad-HoC(C)
111 * Notes: To disconnect the current associated BSS
112 * Command Mode
113 */
114struct disconnect_parm {
115 u32 rsvd;
116};
117
118/*
119 * Caller Mode: AP, Ad-HoC(M)
120 * Notes: To create a BSS
121 * Command Mode
122 */
123struct createbss_parm {
124 struct ndis_wlan_bssid_ex network;
125};
126
127/*
128 * Caller Mode: AP, Ad-HoC, Infra
129 * Notes: To set the NIC mode of RTL8711
130 * Command Mode
131 * The definition of mode:
132 *
133 * #define IW_MODE_AUTO 0 // Let the driver decides which AP to join
134 * #define IW_MODE_ADHOC 1 // Single cell network (Ad-Hoc Clients)
135 * #define IW_MODE_INFRA 2 // Multi cell network, roaming, ..
136 * #define IW_MODE_MASTER 3 // Synchronisation master or AP
137 * #define IW_MODE_REPEAT 4 // Wireless Repeater (forwarder)
138 * #define IW_MODE_SECOND 5 // Secondary master/repeater (backup)
139 * #define IW_MODE_MONITOR 6 // Passive monitor (listen only)
140*/
141struct setopmode_parm {
142 u8 mode;
143 u8 rsvd[3];
144};
145
146/*
147 * Caller Mode: AP, Ad-HoC, Infra
148 * Notes: To ask RTL8711 performing site-survey
149 * Command-Event Mode
150 */
151struct sitesurvey_parm {
152 sint passive_mode; /*active: 1, passive: 0 */
153 sint bsslimit; /* 1 ~ 48 */
154 sint ss_ssidlen;
155 u8 ss_ssid[IW_ESSID_MAX_SIZE + 1];
156};
157
158/*
159 * Caller Mode: Any
160 * Notes: To set the auth type of RTL8711. open/shared/802.1x
161 * Command Mode
162 */
163struct setauth_parm {
164 u8 mode; /*0: legacy open, 1: legacy shared 2: 802.1x*/
165 u8 _1x; /*0: PSK, 1: TLS*/
166 u8 rsvd[2];
167};
168
169/*
170 * Caller Mode: Infra
171 * a. algorithm: wep40, wep104, tkip & aes
172 * b. keytype: grp key/unicast key
173 * c. key contents
174 *
175 * when shared key ==> keyid is the camid
176 * when 802.1x ==> keyid [0:1] ==> grp key
177 * when 802.1x ==> keyid > 2 ==> unicast key
178 */
179struct setkey_parm {
180 u8 algorithm; /* encryption algorithm, could be none, wep40,
181 * TKIP, CCMP, wep104 */
182 u8 keyid;
183 u8 grpkey; /* 1: this is the grpkey for 802.1x.
184 * 0: this is the unicast key for 802.1x */
185 u8 key[16]; /* this could be 40 or 104 */
186};
187
188/*
189 * When in AP or Ad-Hoc mode, this is used to
190 * allocate an sw/hw entry for a newly associated sta.
191 * Command
192 * when shared key ==> algorithm/keyid
193 */
194struct set_stakey_parm {
195 u8 addr[ETH_ALEN];
196 u8 algorithm;
197 u8 key[16];
198};
199
200struct set_stakey_rsp {
201 u8 addr[ETH_ALEN];
202 u8 keyid;
203 u8 rsvd;
204};
205
206struct SetMacAddr_param {
207 u8 MacAddr[ETH_ALEN];
208};
209
210/*
211Caller Ad-Hoc/AP
212
213Command -Rsp(AID == CAMID) mode
214
215This is to force fw to add an sta_data entry per driver's request.
216
217FW will write an cam entry associated with it.
218
219*/
220struct set_assocsta_parm {
221 u8 addr[ETH_ALEN];
222};
223
224struct set_assocsta_rsp {
225 u8 cam_id;
226 u8 rsvd[3];
227};
228
229/*
230 Caller Ad-Hoc/AP
231
232 Command mode
233
234 This is to force fw to del an sta_data entry per driver's request
235
236 FW will invalidate the cam entry associated with it.
237
238*/
239struct del_assocsta_parm {
240 u8 addr[ETH_ALEN];
241};
242
243/*
244Caller Mode: AP/Ad-HoC(M)
245
246Notes: To notify fw that given staid has changed its power state
247
248Command Mode
249
250*/
251struct setstapwrstate_parm {
252 u8 staid;
253 u8 status;
254 u8 hwaddr[6];
255};
256
257/*
258Caller Mode: Any
259
260Notes: To setup the basic rate of RTL8711
261
262Command Mode
263
264*/
265struct setbasicrate_parm {
266 u8 basicrates[NumRates];
267};
268
269/*
270Caller Mode: Any
271
272Notes: To read the current basic rate
273
274Command-Rsp Mode
275
276*/
277struct getbasicrate_parm {
278 u32 rsvd;
279};
280
281struct getbasicrate_rsp {
282 u8 basicrates[NumRates];
283};
284
285/*
286Caller Mode: Any
287
288Notes: To setup the data rate of RTL8711
289
290Command Mode
291
292*/
293struct setdatarate_parm {
294 u8 mac_id;
295 u8 datarates[NumRates];
296};
297
298/*
299Caller Mode: Any
300
301Notes: To read the current data rate
302
303Command-Rsp Mode
304
305*/
306struct getdatarate_parm {
307 u32 rsvd;
308
309};
310struct getdatarate_rsp {
311 u8 datarates[NumRates];
312};
313
314
315/*
316Caller Mode: Any
317AP: AP can use the info for the contents of beacon frame
318Infra: STA can use the info when sitesurveying
319Ad-HoC(M): Like AP
320Ad-HoC(C): Like STA
321
322
323Notes: To set the phy capability of the NIC
324
325Command Mode
326
327*/
328
329/*
330Caller Mode: Any
331
332Notes: To set the channel/modem/band
333This command will be used when channel/modem/band is changed.
334
335Command Mode
336
337*/
338/*
339Caller Mode: Any
340
341Notes: To get the current setting of channel/modem/band
342
343Command-Rsp Mode
344
345*/
346struct getphy_rsp {
347 u8 rfchannel;
348 u8 modem;
349};
350
351struct readBB_parm {
352 u8 offset;
353};
354struct readBB_rsp {
355 u8 value;
356};
357
358struct readTSSI_parm {
359 u8 offset;
360};
361struct readTSSI_rsp {
362 u8 value;
363};
364
365struct writeBB_parm {
366 u8 offset;
367 u8 value;
368};
369
370struct readRF_parm {
371 u8 offset;
372};
373struct readRF_rsp {
374 u32 value;
375};
376
377struct writeRF_parm {
378 u32 offset;
379 u32 value;
380};
381
382struct setrfintfs_parm {
383 u8 rfintfs;
384};
385
386struct getrfintfs_parm {
387 u8 rfintfs;
388};
389
390/*
391 Notes: This command is used for H2C/C2H loopback testing
392
393 mac[0] == 0
394 ==> CMD mode, return H2C_SUCCESS.
395 The following condition must be ture under CMD mode
396 mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0;
397 s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7;
398 s2 == (b1 << 8 | b0);
399
400 mac[0] == 1
401 ==> CMD_RSP mode, return H2C_SUCCESS_RSP
402
403 The rsp layout shall be:
404 rsp: parm:
405 mac[0] = mac[5];
406 mac[1] = mac[4];
407 mac[2] = mac[3];
408 mac[3] = mac[2];
409 mac[4] = mac[1];
410 mac[5] = mac[0];
411 s0 = s1;
412 s1 = swap16(s0);
413 w0 = swap32(w1);
414 b0 = b1
415 s2 = s0 + s1
416 b1 = b0
417 w1 = w0
418
419 mac[0] == 2
420 ==> CMD_EVENT mode, return H2C_SUCCESS
421 The event layout shall be:
422 event: parm:
423 mac[0] = mac[5];
424 mac[1] = mac[4];
425 mac[2] = event's sequence number, starting from 1 to parm's marc[3]
426 mac[3] = mac[2];
427 mac[4] = mac[1];
428 mac[5] = mac[0];
429 s0 = swap16(s0) - event.mac[2];
430 s1 = s1 + event.mac[2];
431 w0 = swap32(w0);
432 b0 = b1
433 s2 = s0 + event.mac[2]
434 b1 = b0
435 w1 = swap32(w1) - event.mac[2];
436
437 parm->mac[3] is the total event counts that host requested.
438
439
440 event will be the same with the cmd's param.
441
442*/
443
444/* CMD param Formart for DRV INTERNAL CMD HDL*/
445struct drvint_cmd_parm {
446 int i_cid; /*internal cmd id*/
447 int sz; /* buf sz*/
448 unsigned char *pbuf;
449};
450
451/*------------------- Below are used for RF/BB tunning ---------------------*/
452
453struct setantenna_parm {
454 u8 tx_antset;
455 u8 rx_antset;
456 u8 tx_antenna;
457 u8 rx_antenna;
458};
459
460struct enrateadaptive_parm {
461 u32 en;
462};
463
464struct settxagctbl_parm {
465 u32 txagc[MAX_RATES_LENGTH];
466};
467
468struct gettxagctbl_parm {
469 u32 rsvd;
470};
471struct gettxagctbl_rsp {
472 u32 txagc[MAX_RATES_LENGTH];
473};
474
475struct setagcctrl_parm {
476 u32 agcctrl; /* 0: pure hw, 1: fw */
477};
478
479struct setssup_parm {
480 u32 ss_ForceUp[MAX_RATES_LENGTH];
481};
482
483struct getssup_parm {
484 u32 rsvd;
485};
486struct getssup_rsp {
487 u8 ss_ForceUp[MAX_RATES_LENGTH];
488};
489
490struct setssdlevel_parm {
491 u8 ss_DLevel[MAX_RATES_LENGTH];
492};
493
494struct getssdlevel_parm {
495 u32 rsvd;
496};
497struct getssdlevel_rsp {
498 u8 ss_DLevel[MAX_RATES_LENGTH];
499};
500
501struct setssulevel_parm {
502 u8 ss_ULevel[MAX_RATES_LENGTH];
503};
504
505struct getssulevel_parm {
506 u32 rsvd;
507};
508struct getssulevel_rsp {
509 u8 ss_ULevel[MAX_RATES_LENGTH];
510};
511
512struct setcountjudge_parm {
513 u8 count_judge[MAX_RATES_LENGTH];
514};
515
516struct getcountjudge_parm {
517 u32 rsvd;
518};
519
520struct getcountjudge_rsp {
521 u8 count_judge[MAX_RATES_LENGTH];
522};
523
524struct setpwrmode_parm {
525 u8 mode;
526 u8 flag_low_traffic_en;
527 u8 flag_lpnav_en;
528 u8 flag_rf_low_snr_en;
529 u8 flag_dps_en; /* 1: dps, 0: 32k */
530 u8 bcn_rx_en;
531 u8 bcn_pass_cnt; /* fw report one beacon information to
532 * driver when it receives bcn_pass_cnt
533 * beacons. */
534 u8 bcn_to; /* beacon TO (ms). ¡§=0¡¨ no limit.*/
535 u16 bcn_itv;
536 u8 app_itv; /* only for VOIP mode. */
537 u8 awake_bcn_itv;
538 u8 smart_ps;
539 u8 bcn_pass_time; /* unit: 100ms */
540};
541
542struct setatim_parm {
543 u8 op; /*0: add, 1:del*/
544 u8 txid; /* id of dest station.*/
545};
546
547struct setratable_parm {
548 u8 ss_ForceUp[NumRates];
549 u8 ss_ULevel[NumRates];
550 u8 ss_DLevel[NumRates];
551 u8 count_judge[NumRates];
552};
553
554struct getratable_parm {
555 uint rsvd;
556};
557struct getratable_rsp {
558 u8 ss_ForceUp[NumRates];
559 u8 ss_ULevel[NumRates];
560 u8 ss_DLevel[NumRates];
561 u8 count_judge[NumRates];
562};
563
564/*to get TX,RX retry count*/
565struct gettxretrycnt_parm{
566 unsigned int rsvd;
567};
568
569struct gettxretrycnt_rsp{
570 unsigned long tx_retrycnt;
571};
572
573struct getrxretrycnt_parm{
574 unsigned int rsvd;
575};
576
577struct getrxretrycnt_rsp{
578 unsigned long rx_retrycnt;
579};
580
581/*to get BCNOK,BCNERR count*/
582struct getbcnokcnt_parm{
583 unsigned int rsvd;
584};
585
586struct getbcnokcnt_rsp{
587 unsigned long bcnokcnt;
588};
589
590struct getbcnerrcnt_parm{
591 unsigned int rsvd;
592};
593struct getbcnerrcnt_rsp{
594 unsigned long bcnerrcnt;
595};
596
597/* to get current TX power level*/
598struct getcurtxpwrlevel_parm{
599 unsigned int rsvd;
600};
601
602struct getcurtxpwrlevel_rsp{
603 unsigned short tx_power;
604};
605
606/*dynamic on/off DIG*/
607struct setdig_parm{
608 unsigned char dig_on; /* 1:on , 0:off */
609};
610
611/*dynamic on/off RA*/
612struct setra_parm{
613 unsigned char ra_on; /* 1:on , 0:off */
614};
615
616struct setprobereqextraie_parm {
617 unsigned char e_id;
618 unsigned char ie_len;
619 unsigned char ie[0];
620};
621
622struct setassocreqextraie_parm {
623 unsigned char e_id;
624 unsigned char ie_len;
625 unsigned char ie[0];
626};
627
628struct setproberspextraie_parm {
629 unsigned char e_id;
630 unsigned char ie_len;
631 unsigned char ie[0];
632};
633
634struct setassocrspextraie_parm {
635 unsigned char e_id;
636 unsigned char ie_len;
637 unsigned char ie[0];
638};
639
640struct addBaReq_parm {
641 unsigned int tid;
642};
643
644/*H2C Handler index: 46 */
645struct SetChannel_parm {
646 u32 curr_ch;
647};
648
649/*H2C Handler index: 56 */
650struct PT_param {
651 u8 PT_En;
652};
653
654#define GEN_CMD_CODE(cmd) cmd ## _CMD_
655
656/*
657 * Result:
658 * 0x00: success
659 * 0x01: sucess, and check Response.
660 * 0x02: cmd ignored due to duplicated sequcne number
661 * 0x03: cmd dropped due to invalid cmd code
662 * 0x04: reserved.
663 */
664
665#define H2C_RSP_OFFSET 512
666#define H2C_SUCCESS 0x00
667#define H2C_SUCCESS_RSP 0x01
668#define H2C_DUPLICATED 0x02
669#define H2C_DROPPED 0x03
670#define H2C_PARAMETERS_ERROR 0x04
671#define H2C_REJECTED 0x05
672#define H2C_CMD_OVERFLOW 0x06
673#define H2C_RESERVED 0x07
674
675u8 r8712_setMacAddr_cmd(struct _adapter *padapter, u8 *mac_addr);
676u8 r8712_setassocsta_cmd(struct _adapter *padapter, u8 *mac_addr);
677u8 r8712_sitesurvey_cmd(struct _adapter *padapter,
678 struct ndis_802_11_ssid *pssid);
679u8 r8712_createbss_cmd(struct _adapter *padapter);
680u8 r8712_setstakey_cmd(struct _adapter *padapter, u8 *psta, u8 unicast_key);
681u8 r8712_joinbss_cmd(struct _adapter *padapter,
682 struct wlan_network *pnetwork);
683u8 r8712_disassoc_cmd(struct _adapter *padapter);
684u8 r8712_setopmode_cmd(struct _adapter *padapter,
685 enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype);
686u8 r8712_setdatarate_cmd(struct _adapter *padapter, u8 *rateset);
687u8 r8712_setbasicrate_cmd(struct _adapter *padapter, u8 *rateset);
688u8 r8712_getrfreg_cmd(struct _adapter *padapter, u8 offset, u8 * pval);
689u8 r8712_setrfintfs_cmd(struct _adapter *padapter, u8 mode);
690u8 r8712_setrfreg_cmd(struct _adapter *padapter, u8 offset, u32 val);
691u8 r8712_setrttbl_cmd(struct _adapter *padapter,
692 struct setratable_parm *prate_table);
693u8 r8712_setptm_cmd(struct _adapter *padapter, u8 type);
694u8 r8712_addbareq_cmd(struct _adapter *padapter, u8 tid);
695u8 r8712_wdg_wk_cmd(struct _adapter *padapter);
696void r8712_survey_cmd_callback(struct _adapter *padapter,
697 struct cmd_obj *pcmd);
698void r8712_disassoc_cmd_callback(struct _adapter *padapter,
699 struct cmd_obj *pcmd);
700void r8712_joinbss_cmd_callback(struct _adapter *padapter,
701 struct cmd_obj *pcmd);
702void r8712_createbss_cmd_callback(struct _adapter *padapter,
703 struct cmd_obj *pcmd);
704void r8712_getbbrfreg_cmdrsp_callback(struct _adapter *padapter,
705 struct cmd_obj *pcmd);
706void r8712_setstaKey_cmdrsp_callback(struct _adapter *padapter,
707 struct cmd_obj *pcmd);
708void r8712_setassocsta_cmdrsp_callback(struct _adapter *padapter,
709 struct cmd_obj *pcmd);
710
711struct _cmd_callback {
712 u32 cmd_code;
713 void (*callback)(struct _adapter *padapter, struct cmd_obj *cmd);
714};
715
716#include "rtl8712_cmd.h"
717
718#endif /* _CMD_H_ */
719
diff --git a/drivers/staging/rtl8712/rtl871x_debug.h b/drivers/staging/rtl8712/rtl871x_debug.h
new file mode 100644
index 00000000000..c392fd958e4
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_debug.h
@@ -0,0 +1,142 @@
1#ifndef __RTL871X_DEBUG_H__
2#define __RTL871X_DEBUG_H__
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7
8#define _drv_emerg_ 1
9#define _drv_alert_ 2
10#define _drv_crit_ 3
11#define _drv_err_ 4
12#define _drv_warning_ 5
13#define _drv_notice_ 6
14#define _drv_info_ 7
15#define _drv_dump_ 8
16#define _drv_debug_ 9
17
18
19#define _module_rtl871x_xmit_c_ BIT(0)
20#define _module_xmit_osdep_c_ BIT(1)
21#define _module_rtl871x_recv_c_ BIT(2)
22#define _module_recv_osdep_c_ BIT(3)
23#define _module_rtl871x_mlme_c_ BIT(4)
24#define _module_mlme_osdep_c_ BIT(5)
25#define _module_rtl871x_sta_mgt_c_ BIT(6)
26#define _module_rtl871x_cmd_c_ BIT(7)
27#define _module_cmd_osdep_c_ BIT(8)
28#define _module_rtl871x_io_c_ BIT(9)
29#define _module_io_osdep_c_ BIT(10)
30#define _module_os_intfs_c_ BIT(11)
31#define _module_rtl871x_security_c_ BIT(12)
32#define _module_rtl871x_eeprom_c_ BIT(13)
33#define _module_hal_init_c_ BIT(14)
34#define _module_hci_hal_init_c_ BIT(15)
35#define _module_rtl871x_ioctl_c_ BIT(16)
36#define _module_rtl871x_ioctl_set_c_ BIT(17)
37#define _module_rtl871x_pwrctrl_c_ BIT(19)
38#define _module_hci_intfs_c_ BIT(20)
39#define _module_hci_ops_c_ BIT(21)
40#define _module_osdep_service_c_ BIT(22)
41#define _module_rtl871x_mp_ioctl_c_ BIT(23)
42#define _module_hci_ops_os_c_ BIT(24)
43#define _module_rtl871x_ioctl_os_c BIT(25)
44#define _module_rtl8712_cmd_c_ BIT(26)
45#define _module_rtl871x_mp_c_ BIT(27)
46#define _module_rtl8712_xmit_c_ BIT(28)
47#define _module_rtl8712_efuse_c_ BIT(29)
48#define _module_rtl8712_recv_c_ BIT(30)
49#define _module_rtl8712_led_c_ BIT(31)
50
51#undef _MODULE_DEFINE_
52
53#if defined _RTL871X_XMIT_C_
54 #define _MODULE_DEFINE_ _module_rtl871x_xmit_c_
55#elif defined _XMIT_OSDEP_C_
56 #define _MODULE_DEFINE_ _module_xmit_osdep_c_
57#elif defined _RTL871X_RECV_C_
58 #define _MODULE_DEFINE_ _module_rtl871x_recv_c_
59#elif defined _RECV_OSDEP_C_
60 #define _MODULE_DEFINE_ _module_recv_osdep_c_
61#elif defined _RTL871X_MLME_C_
62 #define _MODULE_DEFINE_ _module_rtl871x_mlme_c_
63#elif defined _MLME_OSDEP_C_
64 #define _MODULE_DEFINE_ _module_mlme_osdep_c_
65#elif defined _RTL871X_STA_MGT_C_
66 #define _MODULE_DEFINE_ _module_rtl871x_sta_mgt_c_
67#elif defined _RTL871X_CMD_C_
68 #define _MODULE_DEFINE_ _module_rtl871x_cmd_c_
69#elif defined _CMD_OSDEP_C_
70 #define _MODULE_DEFINE_ _module_cmd_osdep_c_
71#elif defined _RTL871X_IO_C_
72 #define _MODULE_DEFINE_ _module_rtl871x_io_c_
73#elif defined _IO_OSDEP_C_
74 #define _MODULE_DEFINE_ _module_io_osdep_c_
75#elif defined _OS_INTFS_C_
76 #define _MODULE_DEFINE_ _module_os_intfs_c_
77#elif defined _RTL871X_SECURITY_C_
78 #define _MODULE_DEFINE_ _module_rtl871x_security_c_
79#elif defined _RTL871X_EEPROM_C_
80 #define _MODULE_DEFINE_ _module_rtl871x_eeprom_c_
81#elif defined _HAL_INIT_C_
82 #define _MODULE_DEFINE_ _module_hal_init_c_
83#elif defined _HCI_HAL_INIT_C_
84 #define _MODULE_DEFINE_ _module_hci_hal_init_c_
85#elif defined _RTL871X_IOCTL_C_
86 #define _MODULE_DEFINE_ _module_rtl871x_ioctl_c_
87#elif defined _RTL871X_IOCTL_SET_C_
88 #define _MODULE_DEFINE_ _module_rtl871x_ioctl_set_c_
89#elif defined _RTL871X_PWRCTRL_C_
90 #define _MODULE_DEFINE_ _module_rtl871x_pwrctrl_c_
91#elif defined _HCI_INTF_C_
92 #define _MODULE_DEFINE_ _module_hci_intfs_c_
93#elif defined _HCI_OPS_C_
94 #define _MODULE_DEFINE_ _module_hci_ops_c_
95#elif defined _OSDEP_HCI_INTF_C_
96 #define _MODULE_DEFINE_ _module_hci_intfs_c_
97#elif defined _OSDEP_SERVICE_C_
98 #define _MODULE_DEFINE_ _module_osdep_service_c_
99#elif defined _RTL871X_MP_IOCTL_C_
100 #define _MODULE_DEFINE_ _module_rtl871x_mp_ioctl_c_
101#elif defined _HCI_OPS_OS_C_
102 #define _MODULE_DEFINE_ _module_hci_ops_os_c_
103#elif defined _RTL871X_IOCTL_LINUX_C_
104 #define _MODULE_DEFINE_ _module_rtl871x_ioctl_os_c
105#elif defined _RTL871X_MP_C_
106 #define _MODULE_DEFINE_ _module_rtl871x_mp_c_
107#elif defined _RTL8712_CMD_C_
108 #define _MODULE_DEFINE_ _module_rtl8712_cmd_c_
109#elif defined _RTL8712_XMIT_C_
110 #define _MODULE_DEFINE_ _module_rtl8712_xmit_c_
111#elif defined _RTL8712_EFUSE_C_
112 #define _MODULE_DEFINE_ _module_rtl8712_efuse_c_
113#elif defined _RTL8712_RECV_C_
114 #define _MODULE_DEFINE_ _module_rtl8712_recv_c_
115#else
116 #undef _MODULE_DEFINE_
117#endif
118
119#define _dbgdump printk
120
121#define MSG_8712(x, ...) {}
122
123#define DBG_8712(x, ...) {}
124
125#define WRN_8712(x, ...) {}
126
127#define ERR_8712(x, ...) {}
128
129#undef MSG_8712
130#define MSG_8712 _dbgdump
131
132#undef DBG_8712
133#define DBG_8712 _dbgdump
134
135#undef WRN_8712
136#define WRN_8712 _dbgdump
137
138#undef ERR_8712
139#define ERR_8712 _dbgdump
140
141#endif /*__RTL871X_DEBUG_H__*/
142
diff --git a/drivers/staging/rtl8712/rtl871x_eeprom.c b/drivers/staging/rtl8712/rtl871x_eeprom.c
new file mode 100644
index 00000000000..2f145d63fce
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_eeprom.c
@@ -0,0 +1,233 @@
1/******************************************************************************
2 * rtl871x_eeprom.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_EEPROM_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33
34static void up_clk(struct _adapter *padapter, u16 *x)
35{
36 *x = *x | _EESK;
37 r8712_write8(padapter, EE_9346CR, (u8)*x);
38 udelay(CLOCK_RATE);
39}
40
41static void down_clk(struct _adapter *padapter, u16 *x)
42{
43 *x = *x & ~_EESK;
44 r8712_write8(padapter, EE_9346CR, (u8)*x);
45 udelay(CLOCK_RATE);
46}
47
48static void shift_out_bits(struct _adapter *padapter, u16 data, u16 count)
49{
50 u16 x, mask;
51
52 if (padapter->bSurpriseRemoved == true)
53 goto out;
54 mask = 0x01 << (count - 1);
55 x = r8712_read8(padapter, EE_9346CR);
56 x &= ~(_EEDO | _EEDI);
57 do {
58 x &= ~_EEDI;
59 if (data & mask)
60 x |= _EEDI;
61 if (padapter->bSurpriseRemoved == true)
62 goto out;
63 r8712_write8(padapter, EE_9346CR, (u8)x);
64 udelay(CLOCK_RATE);
65 up_clk(padapter, &x);
66 down_clk(padapter, &x);
67 mask = mask >> 1;
68 } while (mask);
69 if (padapter->bSurpriseRemoved == true)
70 goto out;
71 x &= ~_EEDI;
72 r8712_write8(padapter, EE_9346CR, (u8)x);
73out:;
74}
75
76static u16 shift_in_bits(struct _adapter *padapter)
77{
78 u16 x, d = 0, i;
79
80 if (padapter->bSurpriseRemoved == true)
81 goto out;
82 x = r8712_read8(padapter, EE_9346CR);
83 x &= ~(_EEDO | _EEDI);
84 d = 0;
85 for (i = 0; i < 16; i++) {
86 d = d << 1;
87 up_clk(padapter, &x);
88 if (padapter->bSurpriseRemoved == true)
89 goto out;
90 x = r8712_read8(padapter, EE_9346CR);
91 x &= ~(_EEDI);
92 if (x & _EEDO)
93 d |= 1;
94 down_clk(padapter, &x);
95 }
96out:
97 return d;
98}
99
100static void standby(struct _adapter *padapter)
101{
102 u8 x;
103
104 x = r8712_read8(padapter, EE_9346CR);
105 x &= ~(_EECS | _EESK);
106 r8712_write8(padapter, EE_9346CR, x);
107 udelay(CLOCK_RATE);
108 x |= _EECS;
109 r8712_write8(padapter, EE_9346CR, x);
110 udelay(CLOCK_RATE);
111}
112
113static u16 wait_eeprom_cmd_done(struct _adapter *padapter)
114{
115 u8 x;
116 u16 i;
117
118 standby(padapter);
119 for (i = 0; i < 200; i++) {
120 x = r8712_read8(padapter, EE_9346CR);
121 if (x & _EEDO)
122 return true;
123 udelay(CLOCK_RATE);
124 }
125 return false;
126}
127
128static void eeprom_clean(struct _adapter *padapter)
129{
130 u16 x;
131
132 if (padapter->bSurpriseRemoved == true)
133 return;
134 x = r8712_read8(padapter, EE_9346CR);
135 if (padapter->bSurpriseRemoved == true)
136 return;
137 x &= ~(_EECS | _EEDI);
138 r8712_write8(padapter, EE_9346CR, (u8)x);
139 if (padapter->bSurpriseRemoved == true)
140 return;
141 up_clk(padapter, &x);
142 if (padapter->bSurpriseRemoved == true)
143 return;
144 down_clk(padapter, &x);
145}
146
147void r8712_eeprom_write16(struct _adapter *padapter, u16 reg, u16 data)
148{
149 u8 x;
150 u8 tmp8_ori, tmp8_new, tmp8_clk_ori, tmp8_clk_new;
151
152 tmp8_ori = r8712_read8(padapter, 0x102502f1);
153 tmp8_new = tmp8_ori & 0xf7;
154 if (tmp8_ori != tmp8_new)
155 r8712_write8(padapter, 0x102502f1, tmp8_new);
156 tmp8_clk_ori = r8712_read8(padapter, 0x10250003);
157 tmp8_clk_new = tmp8_clk_ori | 0x20;
158 if (tmp8_clk_new != tmp8_clk_ori)
159 r8712_write8(padapter, 0x10250003, tmp8_clk_new);
160 x = r8712_read8(padapter, EE_9346CR);
161 x &= ~(_EEDI | _EEDO | _EESK | _EEM0);
162 x |= _EEM1 | _EECS;
163 r8712_write8(padapter, EE_9346CR, x);
164 shift_out_bits(padapter, EEPROM_EWEN_OPCODE, 5);
165 if (padapter->EepromAddressSize == 8) /*CF+ and SDIO*/
166 shift_out_bits(padapter, 0, 6);
167 else /* USB */
168 shift_out_bits(padapter, 0, 4);
169 standby(padapter);
170 /* Erase this particular word. Write the erase opcode and register
171 * number in that order. The opcode is 3bits in length; reg is 6
172 * bits long.
173 */
174 standby(padapter);
175 /* write the new word to the EEPROM
176 * send the write opcode the EEPORM
177 */
178 shift_out_bits(padapter, EEPROM_WRITE_OPCODE, 3);
179 /* select which word in the EEPROM that we are writing to. */
180 shift_out_bits(padapter, reg, padapter->EepromAddressSize);
181 /* write the data to the selected EEPROM word. */
182 shift_out_bits(padapter, data, 16);
183 if (wait_eeprom_cmd_done(padapter)) {
184 standby(padapter);
185 shift_out_bits(padapter, EEPROM_EWDS_OPCODE, 5);
186 shift_out_bits(padapter, reg, 4);
187 eeprom_clean(padapter);
188 }
189 if (tmp8_clk_new != tmp8_clk_ori)
190 r8712_write8(padapter, 0x10250003, tmp8_clk_ori);
191 if (tmp8_new != tmp8_ori)
192 r8712_write8(padapter, 0x102502f1, tmp8_ori);
193}
194
195u16 r8712_eeprom_read16(struct _adapter *padapter, u16 reg) /*ReadEEprom*/
196{
197 u16 x;
198 u16 data = 0;
199 u8 tmp8_ori, tmp8_new, tmp8_clk_ori, tmp8_clk_new;
200
201 tmp8_ori = r8712_read8(padapter, 0x102502f1);
202 tmp8_new = tmp8_ori & 0xf7;
203 if (tmp8_ori != tmp8_new)
204 r8712_write8(padapter, 0x102502f1, tmp8_new);
205 tmp8_clk_ori = r8712_read8(padapter, 0x10250003);
206 tmp8_clk_new = tmp8_clk_ori | 0x20;
207 if (tmp8_clk_new != tmp8_clk_ori)
208 r8712_write8(padapter, 0x10250003, tmp8_clk_new);
209 if (padapter->bSurpriseRemoved == true)
210 goto out;
211 /* select EEPROM, reset bits, set _EECS */
212 x = r8712_read8(padapter, EE_9346CR);
213 if (padapter->bSurpriseRemoved == true)
214 goto out;
215 x &= ~(_EEDI | _EEDO | _EESK | _EEM0);
216 x |= _EEM1 | _EECS;
217 r8712_write8(padapter, EE_9346CR, (unsigned char)x);
218 /* write the read opcode and register number in that order
219 * The opcode is 3bits in length, reg is 6 bits long
220 */
221 shift_out_bits(padapter, EEPROM_READ_OPCODE, 3);
222 shift_out_bits(padapter, reg, padapter->EepromAddressSize);
223 /* Now read the data (16 bits) in from the selected EEPROM word */
224 data = shift_in_bits(padapter);
225 eeprom_clean(padapter);
226out:
227 if (tmp8_clk_new != tmp8_clk_ori)
228 r8712_write8(padapter, 0x10250003, tmp8_clk_ori);
229 if (tmp8_new != tmp8_ori)
230 r8712_write8(padapter, 0x102502f1, tmp8_ori);
231 return data;
232}
233
diff --git a/drivers/staging/rtl8712/rtl871x_eeprom.h b/drivers/staging/rtl8712/rtl871x_eeprom.h
new file mode 100644
index 00000000000..fb15f5bde42
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_eeprom.h
@@ -0,0 +1,82 @@
1#ifndef __RTL871X_EEPROM_H__
2#define __RTL871X_EEPROM_H__
3
4#include "osdep_service.h"
5
6#define RTL8712_EEPROM_ID 0x8712
7#define EEPROM_MAX_SIZE 256
8#define CLOCK_RATE 50 /*100us*/
9
10/*- EEPROM opcodes*/
11#define EEPROM_READ_OPCODE 06
12#define EEPROM_WRITE_OPCODE 05
13#define EEPROM_ERASE_OPCODE 07
14#define EEPROM_EWEN_OPCODE 19 /* Erase/write enable*/
15#define EEPROM_EWDS_OPCODE 16 /* Erase/write disable*/
16
17#define EEPROM_CID_DEFAULT 0x0
18#define EEPROM_CID_ALPHA 0x1
19#define EEPROM_CID_Senao 0x3
20#define EEPROM_CID_NetCore 0x5
21#define EEPROM_CID_CAMEO 0X8
22#define EEPROM_CID_SITECOM 0x9
23#define EEPROM_CID_COREGA 0xB
24#define EEPROM_CID_EDIMAX_BELKIN 0xC
25#define EEPROM_CID_SERCOMM_BELKIN 0xE
26#define EEPROM_CID_CAMEO1 0xF
27#define EEPROM_CID_WNC_COREGA 0x12
28#define EEPROM_CID_CLEVO 0x13
29#define EEPROM_CID_WHQL 0xFE
30
31enum RT_CUSTOMER_ID {
32 RT_CID_DEFAULT = 0,
33 RT_CID_8187_ALPHA0 = 1,
34 RT_CID_8187_SERCOMM_PS = 2,
35 RT_CID_8187_HW_LED = 3,
36 RT_CID_8187_NETGEAR = 4,
37 RT_CID_WHQL = 5,
38 RT_CID_819x_CAMEO = 6,
39 RT_CID_819x_RUNTOP = 7,
40 RT_CID_819x_Senao = 8,
41 RT_CID_TOSHIBA = 9,
42 RT_CID_819x_Netcore = 10,
43 RT_CID_Nettronix = 11,
44 RT_CID_DLINK = 12,
45 RT_CID_PRONET = 13,
46 RT_CID_COREGA = 14,
47 RT_CID_819x_ALPHA = 15,
48 RT_CID_819x_Sitecom = 16,
49 RT_CID_CCX = 17,
50 RT_CID_819x_Lenovo = 18,
51 RT_CID_819x_QMI = 19,
52 RT_CID_819x_Edimax_Belkin = 20,
53 RT_CID_819x_Sercomm_Belkin = 21,
54 RT_CID_819x_CAMEO1 = 22,
55 RT_CID_819x_MSI = 23,
56 RT_CID_819x_Acer = 24,
57 RT_CID_819x_AzWave_ASUS = 25,
58 RT_CID_819x_AzWave = 26,
59 RT_CID_819x_WNC_COREGA = 27,
60 RT_CID_819x_CLEVO = 28,
61};
62
63struct eeprom_priv {
64 u8 bautoload_fail_flag;
65 u8 bempty;
66 u8 sys_config;
67 u8 mac_addr[6];
68 u8 config0;
69 u16 channel_plan;
70 u8 country_string[3];
71 u8 tx_power_b[15];
72 u8 tx_power_g[15];
73 u8 tx_power_a[201];
74 u8 efuse_eeprom_data[EEPROM_MAX_SIZE];
75 enum RT_CUSTOMER_ID CustomerID;
76};
77
78void r8712_eeprom_write16(struct _adapter *padapter, u16 reg, u16 data);
79u16 r8712_eeprom_read16(struct _adapter *padapter, u16 reg);
80
81#endif /*__RTL871X_EEPROM_H__*/
82
diff --git a/drivers/staging/rtl8712/rtl871x_event.h b/drivers/staging/rtl8712/rtl871x_event.h
new file mode 100644
index 00000000000..d45229356bf
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_event.h
@@ -0,0 +1,95 @@
1#ifndef _RTL871x_EVENT_H_
2#define _RTL871x_EVENT_H_
3
4#include "osdep_service.h"
5
6#include "wlan_bssdef.h"
7#include <linux/semaphore.h>
8#include <linux/sem.h>
9
10/*
11 * Used to report a bss has been scanned
12*/
13struct survey_event {
14 struct ndis_wlan_bssid_ex bss;
15};
16
17/*
18 * Used to report that the requested site survey has been done.
19 * bss_cnt indicates the number of bss that has been reported.
20*/
21struct surveydone_event {
22 unsigned int bss_cnt;
23
24};
25
26/*
27 * Used to report the link result of joinning the given bss
28 * join_res:
29 * -1: authentication fail
30 * -2: association fail
31 * > 0: TID
32*/
33struct joinbss_event {
34 struct wlan_network network;
35};
36
37/*
38 * Used to report a given STA has joinned the created BSS.
39 * It is used in AP/Ad-HoC(M) mode.
40*/
41struct stassoc_event {
42 unsigned char macaddr[6];
43 unsigned char rsvd[2];
44 int cam_id;
45};
46
47struct stadel_event {
48 unsigned char macaddr[6];
49 unsigned char rsvd[2];
50};
51
52struct addba_event {
53 unsigned int tid;
54};
55
56#define GEN_EVT_CODE(event) event ## _EVT_
57
58struct fwevent {
59 u32 parmsize;
60 void (*event_callback)(struct _adapter *dev, u8 *pbuf);
61};
62
63#define C2HEVENT_SZ 32
64struct event_node{
65 unsigned char *node;
66 unsigned char evt_code;
67 unsigned short evt_sz;
68 /*volatile*/ int *caller_ff_tail;
69 int caller_ff_sz;
70};
71
72struct c2hevent_queue {
73 /*volatile*/ int head;
74 /*volatile*/ int tail;
75 struct event_node nodes[C2HEVENT_SZ];
76 unsigned char seq;
77};
78
79#define NETWORK_QUEUE_SZ 4
80
81struct network_queue {
82 /*volatile*/ int head;
83 /*volatile*/ int tail;
84 struct wlan_bssid_ex networks[NETWORK_QUEUE_SZ];
85};
86
87struct ADDBA_Req_Report_parm {
88 unsigned char MacAddress[ETH_ALEN];
89 unsigned short StartSeqNum;
90 unsigned char tid;
91};
92#include "rtl8712_event.h"
93
94#endif /* _WLANEVENT_H_ */
95
diff --git a/drivers/staging/rtl8712/rtl871x_ht.h b/drivers/staging/rtl8712/rtl871x_ht.h
new file mode 100644
index 00000000000..612203deea7
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_ht.h
@@ -0,0 +1,19 @@
1#ifndef _RTL871X_HT_H_
2#define _RTL871X_HT_H_
3
4#include "osdep_service.h"
5#include "wifi.h"
6
7struct ht_priv {
8 unsigned int ht_option;
9 unsigned int ampdu_enable;/*for enable Tx A-MPDU*/
10 unsigned char baddbareq_issued[16];
11 unsigned int tx_amsdu_enable;/*for enable Tx A-MSDU */
12 unsigned int tx_amdsu_maxlen; /* 1: 8k, 0:4k ; default:8k, for tx */
13 unsigned int rx_ampdu_maxlen; /* for rx reordering ctrl win_sz,
14 * updated when join_callback. */
15 struct ieee80211_ht_cap ht_cap;
16};
17
18#endif /*_RTL871X_HT_H_ */
19
diff --git a/drivers/staging/rtl8712/rtl871x_io.c b/drivers/staging/rtl8712/rtl871x_io.c
new file mode 100644
index 00000000000..e6e3c3752a9
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_io.c
@@ -0,0 +1,163 @@
1/******************************************************************************
2 * rtl871x_io.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28/*
29 *
30 * The purpose of rtl871x_io.c
31 *
32 * a. provides the API
33 * b. provides the protocol engine
34 * c. provides the software interface between caller and the hardware interface
35 *
36 * For r8712u, both sync/async operations are provided.
37 *
38 * Only sync read/write_mem operations are provided.
39 *
40 */
41
42#define _RTL871X_IO_C_
43
44#include "osdep_service.h"
45#include "drv_types.h"
46#include "rtl871x_io.h"
47#include "osdep_intf.h"
48#include "usb_ops.h"
49
50static uint _init_intf_hdl(struct _adapter *padapter,
51 struct intf_hdl *pintf_hdl)
52{
53 struct intf_priv *pintf_priv;
54 void (*set_intf_option)(u32 *poption) = NULL;
55 void (*set_intf_funs)(struct intf_hdl *pintf_hdl);
56 void (*set_intf_ops)(struct _io_ops *pops);
57 uint (*init_intf_priv)(struct intf_priv *pintfpriv);
58
59 set_intf_option = &(r8712_usb_set_intf_option);
60 set_intf_funs = &(r8712_usb_set_intf_funs);
61 set_intf_ops = &r8712_usb_set_intf_ops;
62 init_intf_priv = &r8712_usb_init_intf_priv;
63 pintf_priv = pintf_hdl->pintfpriv = (struct intf_priv *)
64 _malloc(sizeof(struct intf_priv));
65 if (pintf_priv == NULL)
66 goto _init_intf_hdl_fail;
67 pintf_hdl->adapter = (u8 *)padapter;
68 set_intf_option(&pintf_hdl->intf_option);
69 set_intf_funs(pintf_hdl);
70 set_intf_ops(&pintf_hdl->io_ops);
71 pintf_priv->intf_dev = (u8 *)&(padapter->dvobjpriv);
72 if (init_intf_priv(pintf_priv) == _FAIL)
73 goto _init_intf_hdl_fail;
74 return _SUCCESS;
75_init_intf_hdl_fail:
76 if (pintf_priv)
77 kfree((u8 *)pintf_priv);
78 return _FAIL;
79}
80
81static void _unload_intf_hdl(struct intf_priv *pintfpriv)
82{
83 void (*unload_intf_priv)(struct intf_priv *pintfpriv);
84
85 unload_intf_priv = &r8712_usb_unload_intf_priv;
86 unload_intf_priv(pintfpriv);
87 if (pintfpriv)
88 kfree((u8 *)pintfpriv);
89}
90
91static uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl)
92{
93 struct _adapter *adapter = (struct _adapter *)dev;
94
95 pintfhdl->intf_option = 0;
96 pintfhdl->adapter = dev;
97 pintfhdl->intf_dev = (u8 *)&(adapter->dvobjpriv);
98 if (_init_intf_hdl(adapter, pintfhdl) == false)
99 goto register_intf_hdl_fail;
100 return _SUCCESS;
101register_intf_hdl_fail:
102 return false;
103}
104
105static void unregister_intf_hdl(struct intf_hdl *pintfhdl)
106{
107 _unload_intf_hdl(pintfhdl->pintfpriv);
108 memset((u8 *)pintfhdl, 0, sizeof(struct intf_hdl));
109}
110
111uint r8712_alloc_io_queue(struct _adapter *adapter)
112{
113 u32 i;
114 struct io_queue *pio_queue;
115 struct io_req *pio_req;
116
117 pio_queue = (struct io_queue *)_malloc(sizeof(struct io_queue));
118 if (pio_queue == NULL)
119 goto alloc_io_queue_fail;
120 _init_listhead(&pio_queue->free_ioreqs);
121 _init_listhead(&pio_queue->processing);
122 _init_listhead(&pio_queue->pending);
123 spin_lock_init(&pio_queue->lock);
124 pio_queue->pallocated_free_ioreqs_buf = (u8 *)_malloc(NUM_IOREQ *
125 (sizeof(struct io_req)) + 4);
126 if ((pio_queue->pallocated_free_ioreqs_buf) == NULL)
127 goto alloc_io_queue_fail;
128 memset(pio_queue->pallocated_free_ioreqs_buf, 0,
129 (NUM_IOREQ * (sizeof(struct io_req)) + 4));
130 pio_queue->free_ioreqs_buf = pio_queue->pallocated_free_ioreqs_buf + 4
131 - ((addr_t)(pio_queue->pallocated_free_ioreqs_buf)
132 & 3);
133 pio_req = (struct io_req *)(pio_queue->free_ioreqs_buf);
134 for (i = 0; i < NUM_IOREQ; i++) {
135 _init_listhead(&pio_req->list);
136 sema_init(&pio_req->sema, 0);
137 list_insert_tail(&pio_req->list, &pio_queue->free_ioreqs);
138 pio_req++;
139 }
140 if ((register_intf_hdl((u8 *)adapter, &(pio_queue->intf))) == _FAIL)
141 goto alloc_io_queue_fail;
142 adapter->pio_queue = pio_queue;
143 return _SUCCESS;
144alloc_io_queue_fail:
145 if (pio_queue) {
146 kfree(pio_queue->pallocated_free_ioreqs_buf);
147 kfree((u8 *)pio_queue);
148 }
149 adapter->pio_queue = NULL;
150 return _FAIL;
151}
152
153void r8712_free_io_queue(struct _adapter *adapter)
154{
155 struct io_queue *pio_queue = (struct io_queue *)(adapter->pio_queue);
156
157 if (pio_queue) {
158 kfree(pio_queue->pallocated_free_ioreqs_buf);
159 adapter->pio_queue = NULL;
160 unregister_intf_hdl(&pio_queue->intf);
161 kfree((u8 *)pio_queue);
162 }
163}
diff --git a/drivers/staging/rtl8712/rtl871x_io.h b/drivers/staging/rtl8712/rtl871x_io.h
new file mode 100644
index 00000000000..b70cb2b6296
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_io.h
@@ -0,0 +1,233 @@
1#ifndef _IO_H_
2#define _IO_H_
3
4#include "osdep_service.h"
5#include "osdep_intf.h"
6
7#define NUM_IOREQ 8
8
9#define MAX_PROT_SZ (64-16)
10
11#define _IOREADY 0
12#define _IO_WAIT_COMPLETE 1
13#define _IO_WAIT_RSP 2
14
15/* IO COMMAND TYPE */
16#define _IOSZ_MASK_ (0x7F)
17#define _IO_WRITE_ BIT(7)
18#define _IO_FIXED_ BIT(8)
19#define _IO_BURST_ BIT(9)
20#define _IO_BYTE_ BIT(10)
21#define _IO_HW_ BIT(11)
22#define _IO_WORD_ BIT(12)
23#define _IO_SYNC_ BIT(13)
24#define _IO_CMDMASK_ (0x1F80)
25
26/*
27 For prompt mode accessing, caller shall free io_req
28 Otherwise, io_handler will free io_req
29*/
30/* IO STATUS TYPE */
31#define _IO_ERR_ BIT(2)
32#define _IO_SUCCESS_ BIT(1)
33#define _IO_DONE_ BIT(0)
34#define IO_RD32 (_IO_SYNC_ | _IO_WORD_)
35#define IO_RD16 (_IO_SYNC_ | _IO_HW_)
36#define IO_RD8 (_IO_SYNC_ | _IO_BYTE_)
37#define IO_RD32_ASYNC (_IO_WORD_)
38#define IO_RD16_ASYNC (_IO_HW_)
39#define IO_RD8_ASYNC (_IO_BYTE_)
40#define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_)
41#define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_)
42#define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_)
43#define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_)
44#define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_)
45#define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_)
46/*
47 Only Sync. burst accessing is provided.
48*/
49#define IO_WR_BURST(x) (IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | \
50 ((x) & _IOSZ_MASK_))
51#define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ((x) & _IOSZ_MASK_))
52/*below is for the intf_option bit defition...*/
53#define _INTF_ASYNC_ BIT(0) /*support async io*/
54struct intf_priv;
55struct intf_hdl;
56struct io_queue;
57struct _io_ops {
58 uint (*_sdbus_read_bytes_to_membuf)(struct intf_priv *pintfpriv,
59 u32 addr, u32 cnt, u8 *pbuf);
60 uint (*_sdbus_read_blocks_to_membuf)(struct intf_priv *pintfpriv,
61 u32 addr, u32 cnt, u8 *pbuf);
62 u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);
63 u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);
64 u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);
65 uint (*_sdbus_write_blocks_from_membuf)(struct intf_priv *pintfpriv,
66 u32 addr, u32 cnt, u8 *pbuf,
67 u8 async);
68 uint (*_sdbus_write_bytes_from_membuf)(struct intf_priv *pintfpriv,
69 u32 addr, u32 cnt, u8 *pbuf);
70 u8 (*_cmd52r)(struct intf_priv *pintfpriv, u32 addr);
71 void (*_cmd52w)(struct intf_priv *pintfpriv, u32 addr, u8 val8);
72 u8 (*_cmdfunc152r)(struct intf_priv *pintfpriv, u32 addr);
73 void (*_cmdfunc152w)(struct intf_priv *pintfpriv, u32 addr, u8 val8);
74 void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
75 void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
76 void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
77 void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
78 u8 *pmem);
79 void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
80 u8 *pmem);
81 void (*_sync_irp_protocol_rw)(struct io_queue *pio_q);
82 u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
83 u8 *pmem);
84 u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
85 u8 *pmem);
86};
87
88struct io_req {
89 struct list_head list;
90 u32 addr;
91 /*volatile*/ u32 val;
92 u32 command;
93 u32 status;
94 u8 *pbuf;
95 struct semaphore sema;
96 void (*_async_io_callback)(struct _adapter *padater,
97 struct io_req *pio_req, u8 *cnxt);
98 u8 *cnxt;
99};
100
101struct intf_hdl {
102 u32 intf_option;
103 u8 *adapter;
104 u8 *intf_dev;
105 struct intf_priv *pintfpriv;
106 void (*intf_hdl_init)(u8 *priv);
107 void (*intf_hdl_unload)(u8 *priv);
108 void (*intf_hdl_open)(u8 *priv);
109 void (*intf_hdl_close)(u8 *priv);
110 struct _io_ops io_ops;
111};
112
113struct reg_protocol_rd {
114
115#ifdef __LITTLE_ENDIAN
116 /* DW1 */
117 u32 NumOfTrans:4;
118 u32 Reserved1:4;
119 u32 Reserved2:24;
120 /* DW2 */
121 u32 ByteCount:7;
122 u32 WriteEnable:1; /*0:read, 1:write*/
123 u32 FixOrContinuous:1; /*0:continuous, 1: Fix*/
124 u32 BurstMode:1;
125 u32 Byte1Access:1;
126 u32 Byte2Access:1;
127 u32 Byte4Access:1;
128 u32 Reserved3:3;
129 u32 Reserved4:16;
130 /*DW3*/
131 u32 BusAddress;
132 /*DW4*/
133#else
134/*DW1*/
135 u32 Reserved1:4;
136 u32 NumOfTrans:4;
137 u32 Reserved2:24;
138 /*DW2*/
139 u32 WriteEnable:1;
140 u32 ByteCount:7;
141 u32 Reserved3:3;
142 u32 Byte4Access:1;
143 u32 Byte2Access:1;
144 u32 Byte1Access:1;
145 u32 BurstMode:1 ;
146 u32 FixOrContinuous:1;
147 u32 Reserved4:16;
148 /*DW3*/
149 u32 BusAddress;
150 /*DW4*/
151#endif
152};
153
154struct reg_protocol_wt {
155#ifdef __LITTLE_ENDIAN
156 /*DW1*/
157 u32 NumOfTrans:4;
158 u32 Reserved1:4;
159 u32 Reserved2:24;
160 /*DW2*/
161 u32 ByteCount:7;
162 u32 WriteEnable:1; /*0:read, 1:write*/
163 u32 FixOrContinuous:1; /*0:continuous, 1: Fix*/
164 u32 BurstMode:1;
165 u32 Byte1Access:1;
166 u32 Byte2Access:1;
167 u32 Byte4Access:1;
168 u32 Reserved3:3;
169 u32 Reserved4:16;
170 /*DW3*/
171 u32 BusAddress;
172 /*DW4*/
173 u32 Value;
174#else
175 /*DW1*/
176 u32 Reserved1:4;
177 u32 NumOfTrans:4;
178 u32 Reserved2:24;
179 /*DW2*/
180 u32 WriteEnable:1;
181 u32 ByteCount:7;
182 u32 Reserved3:3;
183 u32 Byte4Access:1;
184 u32 Byte2Access:1;
185 u32 Byte1Access:1;
186 u32 BurstMode:1;
187 u32 FixOrContinuous:1;
188 u32 Reserved4:16;
189 /*DW3*/
190 u32 BusAddress;
191 /*DW4*/
192 u32 Value;
193#endif
194};
195
196/*
197Below is the data structure used by _io_handler
198*/
199
200struct io_queue {
201 spinlock_t lock;
202 struct list_head free_ioreqs;
203 /*The io_req list that will be served in the single protocol r/w.*/
204 struct list_head pending;
205 struct list_head processing;
206 u8 *free_ioreqs_buf; /* 4-byte aligned */
207 u8 *pallocated_free_ioreqs_buf;
208 struct intf_hdl intf;
209};
210
211static inline u32 _RND4(u32 sz)
212{
213 u32 val;
214 val = ((sz >> 2) + ((sz & 3) ? 1 : 0)) << 2;
215 return val;
216}
217
218u8 r8712_read8(struct _adapter *adapter, u32 addr);
219u16 r8712_read16(struct _adapter *adapter, u32 addr);
220u32 r8712_read32(struct _adapter *adapter, u32 addr);
221void r8712_read_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
222void r8712_read_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
223void r8712_write8(struct _adapter *adapter, u32 addr, u8 val);
224void r8712_write16(struct _adapter *adapter, u32 addr, u16 val);
225void r8712_write32(struct _adapter *adapter, u32 addr, u32 val);
226void r8712_write_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
227void r8712_write_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
228/*ioreq */
229uint r8712_alloc_io_queue(struct _adapter *adapter);
230void r8712_free_io_queue(struct _adapter *adapter);
231
232#endif /*_RTL8711_IO_H_*/
233
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl.h b/drivers/staging/rtl8712/rtl871x_ioctl.h
new file mode 100644
index 00000000000..20168028d39
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_ioctl.h
@@ -0,0 +1,97 @@
1#ifndef __IOCTL_H
2#define __IOCTL_H
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7#ifndef OID_802_11_CAPABILITY
8 #define OID_802_11_CAPABILITY 0x0d010122
9#endif
10
11#ifndef OID_802_11_PMKID
12 #define OID_802_11_PMKID 0x0d010123
13#endif
14
15
16/* For DDK-defined OIDs*/
17#define OID_NDIS_SEG1 0x00010100
18#define OID_NDIS_SEG2 0x00010200
19#define OID_NDIS_SEG3 0x00020100
20#define OID_NDIS_SEG4 0x01010100
21#define OID_NDIS_SEG5 0x01020100
22#define OID_NDIS_SEG6 0x01020200
23#define OID_NDIS_SEG7 0xFD010100
24#define OID_NDIS_SEG8 0x0D010100
25#define OID_NDIS_SEG9 0x0D010200
26#define OID_NDIS_SEG10 0x0D020200
27#define SZ_OID_NDIS_SEG1 23
28#define SZ_OID_NDIS_SEG2 3
29#define SZ_OID_NDIS_SEG3 6
30#define SZ_OID_NDIS_SEG4 6
31#define SZ_OID_NDIS_SEG5 4
32#define SZ_OID_NDIS_SEG6 8
33#define SZ_OID_NDIS_SEG7 7
34#define SZ_OID_NDIS_SEG8 36
35#define SZ_OID_NDIS_SEG9 24
36#define SZ_OID_NDIS_SEG10 19
37
38/* For Realtek-defined OIDs*/
39#define OID_MP_SEG1 0xFF871100
40#define OID_MP_SEG2 0xFF818000
41#define OID_MP_SEG3 0xFF818700
42#define OID_MP_SEG4 0xFF011100
43
44enum oid_type {
45 QUERY_OID,
46 SET_OID
47};
48
49struct oid_funs_node {
50 unsigned int oid_start; /*the starting number for OID*/
51 unsigned int oid_end; /*the ending number for OID*/
52 struct oid_obj_priv *node_array;
53 unsigned int array_sz; /*the size of node_array*/
54 int query_counter; /*count the number of query hits for this segment*/
55 int set_counter; /*count the number of set hits for this segment*/
56};
57
58struct oid_par_priv {
59 void *adapter_context;
60 uint oid;
61 void *information_buf;
62 unsigned long information_buf_len;
63 unsigned long *bytes_rw;
64 unsigned long *bytes_needed;
65 enum oid_type type_of_oid;
66 unsigned int dbg;
67};
68
69struct oid_obj_priv {
70 unsigned char dbg; /* 0: without OID debug message
71 * 1: with OID debug message */
72 uint(*oidfuns)(struct oid_par_priv *poid_par_priv);
73};
74
75uint oid_null_function(struct oid_par_priv *poid_par_priv);
76
77extern struct iw_handler_def r871x_handlers_def;
78
79extern uint drv_query_info(
80 struct net_device *MiniportAdapterContext,
81 uint Oid,
82 void *InformationBuffer,
83 u32 InformationBufferLength,
84 u32 *BytesWritten,
85 u32 *BytesNeeded
86);
87
88extern uint drv_set_info(
89 struct net_device *MiniportAdapterContext,
90 uint Oid,
91 void *InformationBuffer,
92 u32 InformationBufferLength,
93 u32 *BytesRead,
94 u32 *BytesNeeded
95);
96
97#endif
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
new file mode 100644
index 00000000000..862ac45c528
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
@@ -0,0 +1,2256 @@
1/******************************************************************************
2 * rtl871x_ioctl_linux.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_IOCTL_LINUX_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "wlan_bssdef.h"
34#include "rtl871x_debug.h"
35#include "wifi.h"
36#include "rtl871x_mlme.h"
37#include "rtl871x_ioctl.h"
38#include "rtl871x_ioctl_set.h"
39#include "rtl871x_mp_ioctl.h"
40#include "mlme_osdep.h"
41
42#define RTL_IOCTL_WPA_SUPPLICANT (SIOCIWFIRSTPRIV + 30)
43
44#define SCAN_ITEM_SIZE 768
45#define MAX_CUSTOM_LEN 64
46#define RATE_COUNT 4
47
48
49static const u32 rtl8180_rates[] = {1000000, 2000000, 5500000, 11000000,
50 6000000, 9000000, 12000000, 18000000,
51 24000000, 36000000, 48000000, 54000000};
52
53static const long ieee80211_wlan_frequencies[] = {
54 2412, 2417, 2422, 2427,
55 2432, 2437, 2442, 2447,
56 2452, 2457, 2462, 2467,
57 2472, 2484
58};
59
60static const char * const iw_operation_mode[] = {
61 "Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary",
62 "Monitor"
63};
64
65static int hex2num_i(char c)
66{
67 if (c >= '0' && c <= '9')
68 return c - '0';
69 if (c >= 'a' && c <= 'f')
70 return c - 'a' + 10;
71 if (c >= 'A' && c <= 'F')
72 return c - 'A' + 10;
73 return -1;
74}
75
76/**
77 * hwaddr_aton - Convert ASCII string to MAC address
78 * @txt: MAC address as a string (e.g., "00:11:22:33:44:55")
79 * @addr: Buffer for the MAC address (ETH_ALEN = 6 bytes)
80 * Returns: 0 on success, -1 on failure (e.g., string not a MAC address)
81 */
82static int hwaddr_aton_i(const char *txt, u8 *addr)
83{
84 int i;
85
86 for (i = 0; i < 6; i++) {
87 int a, b;
88
89 a = hex2num_i(*txt++);
90 if (a < 0)
91 return -1;
92 b = hex2num_i(*txt++);
93 if (b < 0)
94 return -1;
95 *addr++ = (a << 4) | b;
96 if (i < 5 && *txt++ != ':')
97 return -1;
98 }
99 return 0;
100}
101
102void r8712_indicate_wx_assoc_event(struct _adapter *padapter)
103{
104 union iwreq_data wrqu;
105 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
106
107 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
108 memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress,
109 ETH_ALEN);
110 wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL);
111}
112
113void r8712_indicate_wx_disassoc_event(struct _adapter *padapter)
114{
115 union iwreq_data wrqu;
116
117 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
118 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
119 wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL);
120}
121
122static inline void handle_pairwise_key(struct sta_info *psta,
123 struct ieee_param *param,
124 struct _adapter *padapter)
125{
126 /* pairwise key */
127 memcpy(psta->x_UncstKey.skey, param->u.crypt.key,
128 (param->u.crypt. key_len > 16 ? 16 : param->u.crypt.key_len));
129 if (strcmp(param->u.crypt.alg, "TKIP") == 0) { /* set mic key */
130 memcpy(psta->tkiptxmickey. skey, &(param->u.crypt.
131 key[16]), 8);
132 memcpy(psta->tkiprxmickey. skey, &(param->u.crypt.
133 key[24]), 8);
134 padapter->securitypriv. busetkipkey = false;
135 _set_timer(&padapter->securitypriv.tkip_timer, 50);
136 }
137 r8712_setstakey_cmd(padapter, (unsigned char *)psta, true);
138}
139
140static inline void handle_group_key(struct ieee_param *param,
141 struct _adapter *padapter)
142{
143 if (0 < param->u.crypt.idx &&
144 param->u.crypt.idx < 3) {
145 /* group key idx is 1 or 2 */
146 memcpy(padapter->securitypriv.XGrpKey[param->u.crypt.
147 idx-1].skey, param->u.crypt.key, (param->u.crypt.key_len
148 > 16 ? 16 : param->u.crypt.key_len));
149 memcpy(padapter->securitypriv.XGrptxmickey[param->
150 u.crypt.idx-1].skey, &(param->u.crypt.key[16]), 8);
151 memcpy(padapter->securitypriv. XGrprxmickey[param->
152 u.crypt.idx-1].skey, &(param->u.crypt.key[24]), 8);
153 padapter->securitypriv.binstallGrpkey = true;
154 r8712_set_key(padapter, &padapter->securitypriv,
155 param->u.crypt.idx);
156 if (padapter->registrypriv.power_mgnt > PS_MODE_ACTIVE) {
157 if (padapter->registrypriv.power_mgnt != padapter->
158 pwrctrlpriv.pwr_mode)
159 _set_timer(&(padapter->mlmepriv.dhcp_timer),
160 60000);
161 }
162 }
163}
164
165static inline char *translate_scan(struct _adapter *padapter,
166 struct iw_request_info *info,
167 struct wlan_network *pnetwork,
168 char *start, char *stop)
169{
170 struct iw_event iwe;
171 struct ieee80211_ht_cap *pht_capie;
172 char *current_val;
173 u8 *buf = (u8 *)_malloc(pnetwork->network.IELength * 2);
174 u8 *wpa_ie = (u8 *)_malloc(255);
175 u8 *rsn_ie = (u8 *)_malloc(255);
176 u8 *wps_ie = (u8 *)_malloc(MAX_WPS_IE_LEN);
177 s8 *p;
178 u32 i = 0, ht_ielen = 0;
179 u16 cap, ht_cap = false, mcs_rate;
180 u8 rssi, bw_40MHz = 0, short_GI = 0;
181
182 if ((pnetwork->network.Configuration.DSConfig < 1) ||
183 (pnetwork->network.Configuration.DSConfig > 14)) {
184 if (pnetwork->network.Configuration.DSConfig < 1)
185 pnetwork->network.Configuration.DSConfig = 1;
186 else
187 pnetwork->network.Configuration.DSConfig = 14;
188 }
189 /* AP MAC address */
190 iwe.cmd = SIOCGIWAP;
191 iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
192 memcpy(iwe.u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);
193 start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN);
194 /* Add the ESSID */
195 iwe.cmd = SIOCGIWESSID;
196 iwe.u.data.flags = 1;
197 iwe.u.data.length = (u16)min((u16)pnetwork->network.Ssid.SsidLength,
198 (u16)32);
199 start = iwe_stream_add_point(info, start, stop, &iwe,
200 pnetwork->network.Ssid.Ssid);
201 /* parsing HT_CAP_IE */
202 p = r8712_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_,
203 &ht_ielen, pnetwork->network.IELength - 12);
204 if (p && ht_ielen > 0) {
205 ht_cap = true;
206 pht_capie = (struct ieee80211_ht_cap *)(p + 2);
207 memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
208 bw_40MHz = (pht_capie->cap_info&IEEE80211_HT_CAP_SUP_WIDTH)
209 ? 1 : 0;
210 short_GI = (pht_capie->cap_info&(IEEE80211_HT_CAP_SGI_20 |
211 IEEE80211_HT_CAP_SGI_40)) ? 1 : 0;
212 }
213 /* Add the protocol name */
214 iwe.cmd = SIOCGIWNAME;
215 if ((r8712_is_cckratesonly_included((u8 *)&pnetwork->network.
216 SupportedRates)) == true) {
217 if (ht_cap == true)
218 snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bn");
219 else
220 snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11b");
221 } else if ((r8712_is_cckrates_included((u8 *)&pnetwork->network.
222 SupportedRates)) == true) {
223 if (ht_cap == true)
224 snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bgn");
225 else
226 snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bg");
227 } else {
228 if (ht_cap == true)
229 snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11gn");
230 else
231 snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11g");
232 }
233 start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN);
234 /* Add mode */
235 iwe.cmd = SIOCGIWMODE;
236 memcpy((u8 *)&cap, r8712_get_capability_from_ie(pnetwork->network.IEs),
237 2);
238 cap = le16_to_cpu(cap);
239 if (cap & (WLAN_CAPABILITY_IBSS|WLAN_CAPABILITY_BSS)) {
240 if (cap & WLAN_CAPABILITY_BSS)
241 iwe.u.mode = (u32)IW_MODE_MASTER;
242 else
243 iwe.u.mode = (u32)IW_MODE_ADHOC;
244 start = iwe_stream_add_event(info, start, stop, &iwe,
245 IW_EV_UINT_LEN);
246 }
247 /* Add frequency/channel */
248 iwe.cmd = SIOCGIWFREQ;
249 {
250 /* check legel index */
251 u8 dsconfig = pnetwork->network.Configuration.DSConfig;
252 if (dsconfig >= 1 && dsconfig <= sizeof(
253 ieee80211_wlan_frequencies) / sizeof(long))
254 iwe.u.freq.m = (s32)(ieee80211_wlan_frequencies[
255 pnetwork->network.Configuration.
256 DSConfig - 1] * 100000);
257 else
258 iwe.u.freq.m = 0;
259 }
260 iwe.u.freq.e = (s16)1;
261 iwe.u.freq.i = (u8)pnetwork->network.Configuration.DSConfig;
262 start = iwe_stream_add_event(info, start, stop, &iwe,
263 IW_EV_FREQ_LEN);
264 /* Add encryption capability */
265 iwe.cmd = SIOCGIWENCODE;
266 if (cap & WLAN_CAPABILITY_PRIVACY)
267 iwe.u.data.flags = (u16)(IW_ENCODE_ENABLED |
268 IW_ENCODE_NOKEY);
269 else
270 iwe.u.data.flags = (u16)(IW_ENCODE_DISABLED);
271 iwe.u.data.length = (u16)0;
272 start = iwe_stream_add_point(info, start, stop, &iwe,
273 pnetwork->network.Ssid.Ssid);
274 /*Add basic and extended rates */
275 current_val = start + iwe_stream_lcp_len(info);
276 iwe.cmd = SIOCGIWRATE;
277 iwe.u.bitrate.fixed = 0;
278 iwe.u.bitrate.disabled = 0;
279 iwe.u.bitrate.value = 0;
280 i = 0;
281 while (pnetwork->network.SupportedRates[i] != 0) {
282 /* Bit rate given in 500 kb/s units */
283 iwe.u.bitrate.value = (pnetwork->network.SupportedRates[i++] &
284 0x7F) * 500000;
285 current_val = iwe_stream_add_value(info, start, current_val,
286 stop, &iwe, IW_EV_PARAM_LEN);
287 }
288 /* Check if we added any event */
289 if ((current_val - start) > iwe_stream_lcp_len(info))
290 start = current_val;
291 /* parsing WPA/WPA2 IE */
292 {
293 u16 wpa_len = 0, rsn_len = 0;
294 u8 *p;
295 sint out_len = 0;
296 out_len = r8712_get_sec_ie(pnetwork->network.IEs,
297 pnetwork->network.
298 IELength, rsn_ie, &rsn_len,
299 wpa_ie, &wpa_len);
300 if (wpa_len > 0) {
301 p = buf;
302 memset(buf, 0, MAX_WPA_IE_LEN);
303 p += snprintf(p, 7, "wpa_ie=");
304 for (i = 0; i < wpa_len; i++)
305 p += snprintf(p, 2, "%02x", wpa_ie[i]);
306 memset(&iwe, 0, sizeof(iwe));
307 iwe.cmd = IWEVCUSTOM;
308 iwe.u.data.length = (u16)strlen(buf);
309 start = iwe_stream_add_point(info, start, stop,
310 &iwe, buf);
311 memset(&iwe, 0, sizeof(iwe));
312 iwe.cmd = IWEVGENIE;
313 iwe.u.data.length = (u16)wpa_len;
314 start = iwe_stream_add_point(info, start, stop,
315 &iwe, wpa_ie);
316 }
317 if (rsn_len > 0) {
318 p = buf;
319 memset(buf, 0, MAX_WPA_IE_LEN);
320 p += snprintf(p, 7, "rsn_ie=");
321 for (i = 0; i < rsn_len; i++)
322 p += snprintf(p, 2, "%02x", rsn_ie[i]);
323 memset(&iwe, 0, sizeof(iwe));
324 iwe.cmd = IWEVCUSTOM;
325 iwe.u.data.length = strlen(buf);
326 start = iwe_stream_add_point(info, start, stop,
327 &iwe, buf);
328 memset(&iwe, 0, sizeof(iwe));
329 iwe.cmd = IWEVGENIE;
330 iwe.u.data.length = rsn_len;
331 start = iwe_stream_add_point(info, start, stop, &iwe,
332 rsn_ie);
333 }
334 }
335
336 { /* parsing WPS IE */
337 uint wps_ielen;
338
339 if (r8712_get_wps_ie(pnetwork->network.IEs,
340 pnetwork->network.IELength,
341 wps_ie, &wps_ielen) == true) {
342 if (wps_ielen > 2) {
343 iwe.cmd = IWEVGENIE;
344 iwe.u.data.length = (u16)wps_ielen;
345 start = iwe_stream_add_point(info, start, stop,
346 &iwe, wps_ie);
347 }
348 }
349 }
350 /* Add quality statistics */
351 iwe.cmd = IWEVQUAL;
352 rssi = r8712_signal_scale_mapping(pnetwork->network.Rssi);
353 /* we only update signal_level (signal strength) that is rssi. */
354 iwe.u.qual.updated = (u8)(IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_UPDATED |
355 IW_QUAL_NOISE_INVALID);
356 iwe.u.qual.level = rssi; /* signal strength */
357 iwe.u.qual.qual = 0; /* signal quality */
358 iwe.u.qual.noise = 0; /* noise level */
359 start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN);
360 /* how to translate rssi to ?% */
361 kfree(buf);
362 kfree(wpa_ie);
363 kfree(rsn_ie);
364 kfree(wps_ie);
365 return start;
366}
367
368static int wpa_set_auth_algs(struct net_device *dev, u32 value)
369{
370 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
371 int ret = 0;
372
373 if ((value & AUTH_ALG_SHARED_KEY) && (value & AUTH_ALG_OPEN_SYSTEM)) {
374 padapter->securitypriv.ndisencryptstatus =
375 Ndis802_11Encryption1Enabled;
376 padapter->securitypriv.ndisauthtype =
377 Ndis802_11AuthModeAutoSwitch;
378 padapter->securitypriv.AuthAlgrthm = 3;
379 } else if (value & AUTH_ALG_SHARED_KEY) {
380 padapter->securitypriv.ndisencryptstatus =
381 Ndis802_11Encryption1Enabled;
382 padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeShared;
383 padapter->securitypriv.AuthAlgrthm = 1;
384 } else if (value & AUTH_ALG_OPEN_SYSTEM) {
385 if (padapter->securitypriv.ndisauthtype <
386 Ndis802_11AuthModeWPAPSK) {
387 padapter->securitypriv.ndisauthtype =
388 Ndis802_11AuthModeOpen;
389 padapter->securitypriv.AuthAlgrthm = 0;
390 }
391 } else
392 ret = -EINVAL;
393 return ret;
394}
395
396static int wpa_set_encryption(struct net_device *dev, struct ieee_param *param,
397 u32 param_len)
398{
399 int ret = 0;
400 u32 wep_key_idx, wep_key_len = 0;
401 struct NDIS_802_11_WEP *pwep = NULL;
402 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
403 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
404 struct security_priv *psecuritypriv = &padapter->securitypriv;
405
406 param->u.crypt.err = 0;
407 param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
408 if (param_len != (u32)((u8 *) param->u.crypt.key - (u8 *)param) +
409 param->u.crypt.key_len)
410 return -EINVAL;
411 if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
412 param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
413 param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
414 if (param->u.crypt.idx >= WEP_KEYS) {
415 /* for large key indices, set the default (0) */
416 param->u.crypt.idx = 0;
417 }
418 } else
419 return -EINVAL;
420 if (strcmp(param->u.crypt.alg, "WEP") == 0) {
421 printk(KERN_INFO "r8712u: wpa_set_encryption, crypt.alg ="
422 " WEP\n");
423 padapter->securitypriv.ndisencryptstatus =
424 Ndis802_11Encryption1Enabled;
425 padapter->securitypriv.PrivacyAlgrthm = _WEP40_;
426 padapter->securitypriv.XGrpPrivacy = _WEP40_;
427 wep_key_idx = param->u.crypt.idx;
428 wep_key_len = param->u.crypt.key_len;
429 if (wep_key_idx >= WEP_KEYS)
430 wep_key_idx = 0;
431 if (wep_key_len > 0) {
432 wep_key_len = wep_key_len <= 5 ? 5 : 13;
433 pwep = (struct NDIS_802_11_WEP *)_malloc((u32)
434 (wep_key_len +
435 FIELD_OFFSET(struct NDIS_802_11_WEP,
436 KeyMaterial)));
437 if (pwep == NULL)
438 return -ENOMEM;
439 memset(pwep, 0, sizeof(struct NDIS_802_11_WEP));
440 pwep->KeyLength = wep_key_len;
441 pwep->Length = wep_key_len +
442 FIELD_OFFSET(struct NDIS_802_11_WEP,
443 KeyMaterial);
444 if (wep_key_len == 13) {
445 padapter->securitypriv.PrivacyAlgrthm =
446 _WEP104_;
447 padapter->securitypriv.XGrpPrivacy =
448 _WEP104_;
449 }
450 } else
451 return -EINVAL;
452 pwep->KeyIndex = wep_key_idx;
453 pwep->KeyIndex |= 0x80000000;
454 memcpy(pwep->KeyMaterial, param->u.crypt.key, pwep->KeyLength);
455 if (param->u.crypt.set_tx) {
456 if (r8712_set_802_11_add_wep(padapter, pwep) ==
457 (u8)_FAIL)
458 ret = -EOPNOTSUPP;
459 } else {
460 /* don't update "psecuritypriv->PrivacyAlgrthm" and
461 * "psecuritypriv->PrivacyKeyIndex=keyid", but can
462 * r8712_set_key to fw/cam
463 */
464 if (wep_key_idx >= WEP_KEYS) {
465 ret = -EOPNOTSUPP;
466 goto exit;
467 }
468 memcpy(&(psecuritypriv->DefKey[wep_key_idx].
469 skey[0]), pwep->KeyMaterial,
470 pwep->KeyLength);
471 psecuritypriv->DefKeylen[wep_key_idx] =
472 pwep->KeyLength;
473 r8712_set_key(padapter, psecuritypriv, wep_key_idx);
474 }
475 goto exit;
476 }
477 if (padapter->securitypriv.AuthAlgrthm == 2) { /* 802_1x */
478 struct sta_info *psta, *pbcmc_sta;
479 struct sta_priv *pstapriv = &padapter->stapriv;
480
481 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE |
482 WIFI_MP_STATE) == true) { /* sta mode */
483 psta = r8712_get_stainfo(pstapriv,
484 get_bssid(pmlmepriv));
485 if (psta) {
486 psta->ieee8021x_blocked = false;
487 if ((padapter->securitypriv.ndisencryptstatus ==
488 Ndis802_11Encryption2Enabled) ||
489 (padapter->securitypriv.ndisencryptstatus ==
490 Ndis802_11Encryption3Enabled))
491 psta->XPrivacy = padapter->
492 securitypriv.PrivacyAlgrthm;
493 if (param->u.crypt.set_tx == 1)
494 handle_pairwise_key(psta, param,
495 padapter);
496 else /* group key */
497 handle_group_key(param, padapter);
498 }
499 pbcmc_sta = r8712_get_bcmc_stainfo(padapter);
500 if (pbcmc_sta) {
501 pbcmc_sta->ieee8021x_blocked = false;
502 if ((padapter->securitypriv.ndisencryptstatus ==
503 Ndis802_11Encryption2Enabled) ||
504 (padapter->securitypriv.ndisencryptstatus ==
505 Ndis802_11Encryption3Enabled))
506 pbcmc_sta->XPrivacy =
507 padapter->securitypriv.
508 PrivacyAlgrthm;
509 }
510 }
511 }
512exit:
513 kfree((u8 *)pwep);
514 return ret;
515}
516
517static int r871x_set_wpa_ie(struct _adapter *padapter, char *pie,
518 unsigned short ielen)
519{
520 u8 *buf = NULL, *pos = NULL;
521 int group_cipher = 0, pairwise_cipher = 0;
522 int ret = 0;
523
524 if ((ielen > MAX_WPA_IE_LEN) || (pie == NULL))
525 return -EINVAL;
526 if (ielen) {
527 buf = _malloc(ielen);
528 if (buf == NULL)
529 return -ENOMEM;
530 memcpy(buf, pie , ielen);
531 pos = buf;
532 if (ielen < RSN_HEADER_LEN) {
533 ret = -1;
534 goto exit;
535 }
536 if (r8712_parse_wpa_ie(buf, ielen, &group_cipher,
537 &pairwise_cipher) == _SUCCESS) {
538 padapter->securitypriv.AuthAlgrthm = 2;
539 padapter->securitypriv.ndisauthtype =
540 Ndis802_11AuthModeWPAPSK;
541 }
542 if (r8712_parse_wpa2_ie(buf, ielen, &group_cipher,
543 &pairwise_cipher) == _SUCCESS) {
544 padapter->securitypriv.AuthAlgrthm = 2;
545 padapter->securitypriv.ndisauthtype =
546 Ndis802_11AuthModeWPA2PSK;
547 }
548 switch (group_cipher) {
549 case WPA_CIPHER_NONE:
550 padapter->securitypriv.XGrpPrivacy =
551 _NO_PRIVACY_;
552 padapter->securitypriv.ndisencryptstatus =
553 Ndis802_11EncryptionDisabled;
554 break;
555 case WPA_CIPHER_WEP40:
556 padapter->securitypriv.XGrpPrivacy = _WEP40_;
557 padapter->securitypriv.ndisencryptstatus =
558 Ndis802_11Encryption1Enabled;
559 break;
560 case WPA_CIPHER_TKIP:
561 padapter->securitypriv.XGrpPrivacy = _TKIP_;
562 padapter->securitypriv.ndisencryptstatus =
563 Ndis802_11Encryption2Enabled;
564 break;
565 case WPA_CIPHER_CCMP:
566 padapter->securitypriv.XGrpPrivacy = _AES_;
567 padapter->securitypriv.ndisencryptstatus =
568 Ndis802_11Encryption3Enabled;
569 break;
570 case WPA_CIPHER_WEP104:
571 padapter->securitypriv.XGrpPrivacy = _WEP104_;
572 padapter->securitypriv.ndisencryptstatus =
573 Ndis802_11Encryption1Enabled;
574 break;
575 }
576 switch (pairwise_cipher) {
577 case WPA_CIPHER_NONE:
578 padapter->securitypriv.PrivacyAlgrthm =
579 _NO_PRIVACY_;
580 padapter->securitypriv.ndisencryptstatus =
581 Ndis802_11EncryptionDisabled;
582 break;
583 case WPA_CIPHER_WEP40:
584 padapter->securitypriv.PrivacyAlgrthm = _WEP40_;
585 padapter->securitypriv.ndisencryptstatus =
586 Ndis802_11Encryption1Enabled;
587 break;
588 case WPA_CIPHER_TKIP:
589 padapter->securitypriv.PrivacyAlgrthm = _TKIP_;
590 padapter->securitypriv.ndisencryptstatus =
591 Ndis802_11Encryption2Enabled;
592 break;
593 case WPA_CIPHER_CCMP:
594 padapter->securitypriv.PrivacyAlgrthm = _AES_;
595 padapter->securitypriv.ndisencryptstatus =
596 Ndis802_11Encryption3Enabled;
597 break;
598 case WPA_CIPHER_WEP104:
599 padapter->securitypriv.PrivacyAlgrthm = _WEP104_;
600 padapter->securitypriv.ndisencryptstatus =
601 Ndis802_11Encryption1Enabled;
602 break;
603 }
604 padapter->securitypriv.wps_phase = false;
605 {/* set wps_ie */
606 u16 cnt = 0;
607 u8 eid, wps_oui[4] = {0x0, 0x50, 0xf2, 0x04};
608
609 while (cnt < ielen) {
610 eid = buf[cnt];
611
612 if ((eid == _VENDOR_SPECIFIC_IE_) &&
613 (!memcmp(&buf[cnt+2], wps_oui, 4))) {
614 printk(KERN_INFO "r8712u: "
615 "SET WPS_IE\n");
616 padapter->securitypriv.wps_ie_len =
617 ((buf[cnt+1] + 2) <
618 (MAX_WPA_IE_LEN << 2)) ?
619 (buf[cnt + 1] + 2) :
620 (MAX_WPA_IE_LEN << 2);
621 memcpy(padapter->securitypriv.wps_ie,
622 &buf[cnt],
623 padapter->securitypriv.wps_ie_len);
624 padapter->securitypriv.wps_phase =
625 true;
626 printk(KERN_INFO "r8712u: SET WPS_IE,"
627 " wps_phase==true\n");
628 cnt += buf[cnt+1]+2;
629 break;
630 } else
631 cnt += buf[cnt + 1] + 2;
632 }
633 }
634 }
635exit:
636 kfree(buf);
637 return ret;
638}
639
640static int r8711_wx_get_name(struct net_device *dev,
641 struct iw_request_info *info,
642 union iwreq_data *wrqu, char *extra)
643{
644 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
645 u32 ht_ielen = 0;
646 char *p;
647 u8 ht_cap = false;
648 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
649 struct ndis_wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
650 NDIS_802_11_RATES_EX *prates = NULL;
651
652 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) ==
653 true) {
654 /* parsing HT_CAP_IE */
655 p = r8712_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_,
656 &ht_ielen, pcur_bss->IELength - 12);
657 if (p && ht_ielen > 0)
658 ht_cap = true;
659 prates = &pcur_bss->SupportedRates;
660 if (r8712_is_cckratesonly_included((u8 *)prates) == true) {
661 if (ht_cap == true)
662 snprintf(wrqu->name, IFNAMSIZ,
663 "IEEE 802.11bn");
664 else
665 snprintf(wrqu->name, IFNAMSIZ,
666 "IEEE 802.11b");
667 } else if ((r8712_is_cckrates_included((u8 *)prates)) == true) {
668 if (ht_cap == true)
669 snprintf(wrqu->name, IFNAMSIZ,
670 "IEEE 802.11bgn");
671 else
672 snprintf(wrqu->name, IFNAMSIZ,
673 "IEEE 802.11bg");
674 } else {
675 if (ht_cap == true)
676 snprintf(wrqu->name, IFNAMSIZ,
677 "IEEE 802.11gn");
678 else
679 snprintf(wrqu->name, IFNAMSIZ,
680 "IEEE 802.11g");
681 }
682 } else
683 snprintf(wrqu->name, IFNAMSIZ, "unassociated");
684 return 0;
685}
686
687static const long frequency_list[] = {
688 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462,
689 2467, 2472, 2484, 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
690 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210,
691 5220, 5230, 5240, 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560,
692 5580, 5600, 5620, 5640, 5660, 5680, 5700, 5745, 5765, 5785, 5805,
693 5825
694};
695
696static int r8711_wx_set_freq(struct net_device *dev,
697 struct iw_request_info *info,
698 union iwreq_data *wrqu, char *extra)
699{
700 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
701 struct iw_freq *fwrq = &wrqu->freq;
702 int rc = 0;
703
704/* If setting by frequency, convert to a channel */
705 if ((fwrq->e == 1) &&
706 (fwrq->m >= (int) 2.412e8) &&
707 (fwrq->m <= (int) 2.487e8)) {
708 int f = fwrq->m / 100000;
709 int c = 0;
710 while ((c < 14) && (f != frequency_list[c]))
711 c++;
712 fwrq->e = 0;
713 fwrq->m = c + 1;
714 }
715 /* Setting by channel number */
716 if ((fwrq->m > 14) || (fwrq->e > 0))
717 rc = -EOPNOTSUPP;
718 else {
719 int channel = fwrq->m;
720 if ((channel < 1) || (channel > 14))
721 rc = -EINVAL;
722 else {
723 /* Yes ! We can set it !!! */
724 padapter->registrypriv.channel = channel;
725 }
726 }
727 return rc;
728}
729
730static int r8711_wx_get_freq(struct net_device *dev,
731 struct iw_request_info *info,
732 union iwreq_data *wrqu, char *extra)
733{
734 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
735 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
736 struct ndis_wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
737
738 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
739 wrqu->freq.m = ieee80211_wlan_frequencies[
740 pcur_bss->Configuration.DSConfig-1] * 100000;
741 wrqu->freq.e = 1;
742 wrqu->freq.i = pcur_bss->Configuration.DSConfig;
743 } else
744 return -1;
745 return 0;
746}
747
748static int r8711_wx_set_mode(struct net_device *dev,
749 struct iw_request_info *a,
750 union iwreq_data *wrqu, char *b)
751{
752 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
753 enum NDIS_802_11_NETWORK_INFRASTRUCTURE networkType;
754
755 switch (wrqu->mode) {
756 case IW_MODE_AUTO:
757 networkType = Ndis802_11AutoUnknown;
758 break;
759 case IW_MODE_ADHOC:
760 networkType = Ndis802_11IBSS;
761 break;
762 case IW_MODE_MASTER:
763 networkType = Ndis802_11APMode;
764 break;
765 case IW_MODE_INFRA:
766 networkType = Ndis802_11Infrastructure;
767 break;
768 default:
769 return -EINVAL;
770 }
771 if (Ndis802_11APMode == networkType)
772 r8712_setopmode_cmd(padapter, networkType);
773 else
774 r8712_setopmode_cmd(padapter, Ndis802_11AutoUnknown);
775 if (!r8712_set_802_11_infrastructure_mode(padapter, networkType))
776 return -1;
777 return 0;
778}
779
780static int r8711_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
781 union iwreq_data *wrqu, char *b)
782{
783 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
784 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
785
786 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true)
787 wrqu->mode = IW_MODE_INFRA;
788 else if (check_fwstate(pmlmepriv,
789 WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) == true)
790 wrqu->mode = IW_MODE_ADHOC;
791 else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true)
792 wrqu->mode = IW_MODE_MASTER;
793 else
794 wrqu->mode = IW_MODE_AUTO;
795 return 0;
796}
797
798static int r871x_wx_set_pmkid(struct net_device *dev,
799 struct iw_request_info *a,
800 union iwreq_data *wrqu, char *extra)
801{
802 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
803 struct security_priv *psecuritypriv = &padapter->securitypriv;
804 struct iw_pmksa *pPMK = (struct iw_pmksa *) extra;
805 u8 strZeroMacAddress[ETH_ALEN] = {0x00};
806 u8 strIssueBssid[ETH_ALEN] = {0x00};
807 u8 j, blInserted = false;
808 int intReturn = false;
809
810/*
811 There are the BSSID information in the bssid.sa_data array.
812 If cmd is IW_PMKSA_FLUSH, it means the wpa_suppplicant wants to clear
813 all the PMKID information. If cmd is IW_PMKSA_ADD, it means the
814 wpa_supplicant wants to add a PMKID/BSSID to driver.
815 If cmd is IW_PMKSA_REMOVE, it means the wpa_supplicant wants to
816 remove a PMKID/BSSID from driver.
817*/
818 if (pPMK == NULL)
819 return -EINVAL;
820 memcpy(strIssueBssid, pPMK->bssid.sa_data, ETH_ALEN);
821 switch (pPMK->cmd) {
822 case IW_PMKSA_ADD:
823 if (!memcmp(strIssueBssid, strZeroMacAddress, ETH_ALEN))
824 return intReturn;
825 else
826 intReturn = true;
827 blInserted = false;
828 /* overwrite PMKID */
829 for (j = 0 ; j < NUM_PMKID_CACHE; j++) {
830 if (!memcmp(psecuritypriv->PMKIDList[j].Bssid,
831 strIssueBssid, ETH_ALEN)) {
832 /* BSSID is matched, the same AP => rewrite
833 * with new PMKID. */
834 printk(KERN_INFO "r8712u: r871x_wx_set_pmkid:"
835 " BSSID exists in the PMKList.\n");
836 memcpy(psecuritypriv->PMKIDList[j].PMKID,
837 pPMK->pmkid, IW_PMKID_LEN);
838 psecuritypriv->PMKIDList[j].bUsed = true;
839 psecuritypriv->PMKIDIndex = j + 1;
840 blInserted = true;
841 break;
842 }
843 }
844 if (!blInserted) {
845 /* Find a new entry */
846 printk(KERN_INFO "r8712u: r871x_wx_set_pmkid: Use the"
847 " new entry index = %d for this PMKID.\n",
848 psecuritypriv->PMKIDIndex);
849 memcpy(psecuritypriv->PMKIDList[psecuritypriv->
850 PMKIDIndex].Bssid, strIssueBssid, ETH_ALEN);
851 memcpy(psecuritypriv->PMKIDList[psecuritypriv->
852 PMKIDIndex].PMKID, pPMK->pmkid, IW_PMKID_LEN);
853 psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].
854 bUsed = true;
855 psecuritypriv->PMKIDIndex++ ;
856 if (psecuritypriv->PMKIDIndex == NUM_PMKID_CACHE)
857 psecuritypriv->PMKIDIndex = 0;
858 }
859 break;
860 case IW_PMKSA_REMOVE:
861 intReturn = true;
862 for (j = 0; j < NUM_PMKID_CACHE; j++) {
863 if (!memcmp(psecuritypriv->PMKIDList[j].Bssid,
864 strIssueBssid, ETH_ALEN)) {
865 /* BSSID is matched, the same AP => Remove
866 * this PMKID information and reset it. */
867 memset(psecuritypriv->PMKIDList[j].Bssid,
868 0x00, ETH_ALEN);
869 psecuritypriv->PMKIDList[j].bUsed = false;
870 break;
871 }
872 }
873 break;
874 case IW_PMKSA_FLUSH:
875 memset(psecuritypriv->PMKIDList, 0,
876 sizeof(struct RT_PMKID_LIST) * NUM_PMKID_CACHE);
877 psecuritypriv->PMKIDIndex = 0;
878 intReturn = true;
879 break;
880 default:
881 printk(KERN_INFO "r8712u: r871x_wx_set_pmkid: "
882 "unknown Command\n");
883 intReturn = false;
884 break;
885 }
886 return intReturn;
887}
888
889static int r8711_wx_get_sens(struct net_device *dev,
890 struct iw_request_info *info,
891 union iwreq_data *wrqu, char *extra)
892{
893 wrqu->sens.value = 0;
894 wrqu->sens.fixed = 0; /* no auto select */
895 wrqu->sens.disabled = 1;
896 return 0;
897}
898
899static int r8711_wx_get_range(struct net_device *dev,
900 struct iw_request_info *info,
901 union iwreq_data *wrqu, char *extra)
902{
903 struct iw_range *range = (struct iw_range *)extra;
904 u16 val;
905 int i;
906
907 wrqu->data.length = sizeof(*range);
908 memset(range, 0, sizeof(*range));
909 /* Let's try to keep this struct in the same order as in
910 * linux/include/wireless.h
911 */
912
913 /* TODO: See what values we can set, and remove the ones we can't
914 * set, or fill them with some default data.
915 */
916 /* ~5 Mb/s real (802.11b) */
917 range->throughput = 5 * 1000 * 1000;
918 /* TODO: 8711 sensitivity ? */
919 /* signal level threshold range */
920 /* percent values between 0 and 100. */
921 range->max_qual.qual = 100;
922 range->max_qual.level = 100;
923 range->max_qual.noise = 100;
924 range->max_qual.updated = 7; /* Updated all three */
925 range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */
926 /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
927 range->avg_qual.level = 20 + -98;
928 range->avg_qual.noise = 0;
929 range->avg_qual.updated = 7; /* Updated all three */
930 range->num_bitrates = RATE_COUNT;
931 for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++)
932 range->bitrate[i] = rtl8180_rates[i];
933 range->min_frag = MIN_FRAG_THRESHOLD;
934 range->max_frag = MAX_FRAG_THRESHOLD;
935 range->pm_capa = 0;
936 range->we_version_compiled = WIRELESS_EXT;
937 range->we_version_source = 16;
938 range->num_channels = 14;
939 for (i = 0, val = 0; i < 14; i++) {
940 /* Include only legal frequencies for some countries */
941 range->freq[val].i = i + 1;
942 range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000;
943 range->freq[val].e = 1;
944 val++;
945 if (val == IW_MAX_FREQUENCIES)
946 break;
947 }
948 range->num_frequency = val;
949 range->enc_capa = IW_ENC_CAPA_WPA |
950 IW_ENC_CAPA_WPA2 |
951 IW_ENC_CAPA_CIPHER_TKIP |
952 IW_ENC_CAPA_CIPHER_CCMP;
953 return 0;
954}
955
956static int r871x_wx_set_priv(struct net_device *dev,
957 struct iw_request_info *info,
958 union iwreq_data *awrq,
959 char *extra)
960{
961 int ret = 0, len = 0;
962 char *ext;
963 struct iw_point *dwrq = (struct iw_point *)awrq;
964
965 len = dwrq->length;
966 ext = _malloc(len);
967 if (!_malloc(len))
968 return -ENOMEM;
969 if (copy_from_user(ext, dwrq->pointer, len)) {
970 kfree(ext);
971 return -EFAULT;
972 }
973 kfree(ext);
974 return ret;
975}
976
977/* set bssid flow
978 * s1. set_802_11_infrastructure_mode()
979 * s2. set_802_11_authentication_mode()
980 * s3. set_802_11_encryption_mode()
981 * s4. set_802_11_bssid()
982 */
983static int r8711_wx_set_wap(struct net_device *dev,
984 struct iw_request_info *info,
985 union iwreq_data *awrq,
986 char *extra)
987{
988 int ret = -EINPROGRESS;
989 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
990 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
991 struct __queue *queue = &pmlmepriv->scanned_queue;
992 struct sockaddr *temp = (struct sockaddr *)awrq;
993 unsigned long irqL;
994 struct list_head *phead;
995 u8 *dst_bssid;
996 struct wlan_network *pnetwork = NULL;
997 enum NDIS_802_11_AUTHENTICATION_MODE authmode;
998
999 if (padapter->bup == false)
1000 return -1;
1001 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true)
1002 return -1;
1003 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true)
1004 return ret;
1005 if (temp->sa_family != ARPHRD_ETHER)
1006 return -EINVAL;
1007 authmode = padapter->securitypriv.ndisauthtype;
1008 spin_lock_irqsave(&queue->lock, irqL);
1009 phead = get_list_head(queue);
1010 pmlmepriv->pscanned = get_next(phead);
1011 while (1) {
1012 if (end_of_queue_search(phead, pmlmepriv->pscanned) == true)
1013 break;
1014 pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned,
1015 struct wlan_network, list);
1016 pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
1017 dst_bssid = pnetwork->network.MacAddress;
1018 if (!memcmp(dst_bssid, temp->sa_data, ETH_ALEN)) {
1019 if (r8712_set_802_11_infrastructure_mode(padapter,
1020 pnetwork->network.InfrastructureMode) == false)
1021 ret = -1;
1022 break;
1023 }
1024 }
1025 spin_unlock_irqrestore(&queue->lock, irqL);
1026 if (!ret) {
1027 if (!r8712_set_802_11_authentication_mode(padapter, authmode))
1028 ret = -1;
1029 else {
1030 if (!r8712_set_802_11_bssid(padapter, temp->sa_data))
1031 ret = -1;
1032 }
1033 }
1034 return ret;
1035}
1036
1037static int r8711_wx_get_wap(struct net_device *dev,
1038 struct iw_request_info *info,
1039 union iwreq_data *wrqu, char *extra)
1040{
1041 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1042 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1043 struct ndis_wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
1044
1045 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
1046 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
1047 if (check_fwstate(pmlmepriv, _FW_LINKED |
1048 WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) {
1049 memcpy(wrqu->ap_addr.sa_data, pcur_bss->MacAddress, ETH_ALEN);
1050 }
1051 return 0;
1052}
1053
1054static int r871x_wx_set_mlme(struct net_device *dev,
1055 struct iw_request_info *info,
1056 union iwreq_data *wrqu, char *extra)
1057{
1058 int ret = 0;
1059 u16 reason;
1060 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1061 struct iw_mlme *mlme = (struct iw_mlme *) extra;
1062
1063 if (mlme == NULL)
1064 return -1;
1065 reason = cpu_to_le16(mlme->reason_code);
1066 switch (mlme->cmd) {
1067 case IW_MLME_DEAUTH:
1068 if (!r8712_set_802_11_disassociate(padapter))
1069 ret = -1;
1070 break;
1071 case IW_MLME_DISASSOC:
1072 if (!r8712_set_802_11_disassociate(padapter))
1073 ret = -1;
1074 break;
1075 default:
1076 return -EOPNOTSUPP;
1077 }
1078 return ret;
1079}
1080
1081static int r8711_wx_set_scan(struct net_device *dev,
1082 struct iw_request_info *a,
1083 union iwreq_data *wrqu, char *extra)
1084{
1085 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1086 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1087 u8 status = true;
1088
1089 if (padapter->bDriverStopped == true) {
1090 printk(KERN_WARNING "r8712u: in r8711_wx_set_scan: "
1091 "bDriverStopped=%d\n", padapter->bDriverStopped);
1092 return -1;
1093 }
1094 if (padapter->bup == false)
1095 return -1;
1096 if (padapter->hw_init_completed == false)
1097 return -1;
1098 if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)) ||
1099 (pmlmepriv->sitesurveyctrl.traffic_busy == true))
1100 return 0;
1101 if (wrqu->data.length == sizeof(struct iw_scan_req)) {
1102 struct iw_scan_req *req = (struct iw_scan_req *)extra;
1103 if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
1104 struct ndis_802_11_ssid ssid;
1105 unsigned long irqL;
1106 u32 len = (u32) min((u8)req->essid_len,
1107 (u8)IW_ESSID_MAX_SIZE);
1108 memset((unsigned char *)&ssid, 0,
1109 sizeof(struct ndis_802_11_ssid));
1110 memcpy(ssid.Ssid, req->essid, len);
1111 ssid.SsidLength = len;
1112 spin_lock_irqsave(&pmlmepriv->lock, irqL);
1113 if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY |
1114 _FW_UNDER_LINKING)) ||
1115 (pmlmepriv->sitesurveyctrl.traffic_busy == true)) {
1116 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
1117 status = false;
1118 } else
1119 status = r8712_sitesurvey_cmd(padapter, &ssid);
1120 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
1121 }
1122 } else
1123 status = r8712_set_802_11_bssid_list_scan(padapter);
1124 if (status == false)
1125 return -1;
1126 return 0;
1127}
1128
1129static int r8711_wx_get_scan(struct net_device *dev,
1130 struct iw_request_info *a,
1131 union iwreq_data *wrqu, char *extra)
1132{
1133 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1134 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1135 struct __queue *queue = &pmlmepriv->scanned_queue;
1136 struct wlan_network *pnetwork = NULL;
1137 unsigned long irqL;
1138 struct list_head *plist, *phead;
1139 char *ev = extra;
1140 char *stop = ev + wrqu->data.length;
1141 u32 ret = 0, cnt = 0;
1142
1143 if (padapter->bDriverStopped)
1144 return -EINVAL;
1145 while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)) {
1146 msleep(30);
1147 cnt++;
1148 if (cnt > 1000)
1149 break;
1150 }
1151 spin_lock_irqsave(&queue->lock, irqL);
1152 phead = get_list_head(queue);
1153 plist = get_next(phead);
1154 while (1) {
1155 if (end_of_queue_search(phead, plist) == true)
1156 break;
1157 if ((stop - ev) < SCAN_ITEM_SIZE) {
1158 ret = -E2BIG;
1159 break;
1160 }
1161 pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
1162 ev = translate_scan(padapter, a, pnetwork, ev, stop);
1163 plist = get_next(plist);
1164 }
1165 spin_unlock_irqrestore(&queue->lock, irqL);
1166 wrqu->data.length = ev - extra;
1167 wrqu->data.flags = 0;
1168 return ret;
1169}
1170
1171/* set ssid flow
1172 * s1. set_802_11_infrastructure_mode()
1173 * s2. set_802_11_authenticaion_mode()
1174 * s3. set_802_11_encryption_mode()
1175 * s4. set_802_11_ssid()
1176 */
1177static int r8711_wx_set_essid(struct net_device *dev,
1178 struct iw_request_info *a,
1179 union iwreq_data *wrqu, char *extra)
1180{
1181 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1182 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1183 struct __queue *queue = &pmlmepriv->scanned_queue;
1184 struct wlan_network *pnetwork = NULL;
1185 enum NDIS_802_11_AUTHENTICATION_MODE authmode;
1186 struct ndis_802_11_ssid ndis_ssid;
1187 u8 *dst_ssid, *src_ssid;
1188 struct list_head *phead;
1189 u32 len;
1190
1191 if (padapter->bup == false)
1192 return -1;
1193 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
1194 return -1;
1195 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
1196 return 0;
1197 if (wrqu->essid.length > IW_ESSID_MAX_SIZE)
1198 return -E2BIG;
1199 authmode = padapter->securitypriv.ndisauthtype;
1200 if (wrqu->essid.flags && wrqu->essid.length) {
1201 len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ?
1202 wrqu->essid.length : IW_ESSID_MAX_SIZE;
1203 memset(&ndis_ssid, 0, sizeof(struct ndis_802_11_ssid));
1204 ndis_ssid.SsidLength = len;
1205 memcpy(ndis_ssid.Ssid, extra, len);
1206 src_ssid = ndis_ssid.Ssid;
1207 phead = get_list_head(queue);
1208 pmlmepriv->pscanned = get_next(phead);
1209 while (1) {
1210 if (end_of_queue_search(phead, pmlmepriv->pscanned))
1211 break;
1212 pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned,
1213 struct wlan_network, list);
1214 pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
1215 dst_ssid = pnetwork->network.Ssid.Ssid;
1216 if ((!memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength))
1217 && (pnetwork->network.Ssid.SsidLength ==
1218 ndis_ssid.SsidLength)) {
1219 if (!r8712_set_802_11_infrastructure_mode(
1220 padapter,
1221 pnetwork->network.InfrastructureMode))
1222 return -1;
1223 break;
1224 }
1225 }
1226 r8712_set_802_11_authentication_mode(padapter, authmode);
1227 r8712_set_802_11_ssid(padapter, &ndis_ssid);
1228 }
1229 return -EINPROGRESS;
1230}
1231
1232static int r8711_wx_get_essid(struct net_device *dev,
1233 struct iw_request_info *a,
1234 union iwreq_data *wrqu, char *extra)
1235{
1236 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1237 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1238 struct ndis_wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
1239 u32 len, ret = 0;
1240
1241 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE)) {
1242 len = pcur_bss->Ssid.SsidLength;
1243 wrqu->essid.length = len;
1244 memcpy(extra, pcur_bss->Ssid.Ssid, len);
1245 wrqu->essid.flags = 1;
1246 } else
1247 ret = -1;
1248 return ret;
1249}
1250
1251static int r8711_wx_set_rate(struct net_device *dev,
1252 struct iw_request_info *a,
1253 union iwreq_data *wrqu, char *extra)
1254{
1255 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1256 u32 target_rate = wrqu->bitrate.value;
1257 u32 fixed = wrqu->bitrate.fixed;
1258 u32 ratevalue = 0;
1259 u8 datarates[NumRates];
1260 u8 mpdatarate[NumRates] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff};
1261 int i, ret = 0;
1262
1263 if (target_rate == -1) {
1264 ratevalue = 11;
1265 goto set_rate;
1266 }
1267 target_rate = target_rate / 100000;
1268 switch (target_rate) {
1269 case 10:
1270 ratevalue = 0;
1271 break;
1272 case 20:
1273 ratevalue = 1;
1274 break;
1275 case 55:
1276 ratevalue = 2;
1277 break;
1278 case 60:
1279 ratevalue = 3;
1280 break;
1281 case 90:
1282 ratevalue = 4;
1283 break;
1284 case 110:
1285 ratevalue = 5;
1286 break;
1287 case 120:
1288 ratevalue = 6;
1289 break;
1290 case 180:
1291 ratevalue = 7;
1292 break;
1293 case 240:
1294 ratevalue = 8;
1295 break;
1296 case 360:
1297 ratevalue = 9;
1298 break;
1299 case 480:
1300 ratevalue = 10;
1301 break;
1302 case 540:
1303 ratevalue = 11;
1304 break;
1305 default:
1306 ratevalue = 11;
1307 break;
1308 }
1309set_rate:
1310 for (i = 0; i < NumRates; i++) {
1311 if (ratevalue == mpdatarate[i]) {
1312 datarates[i] = mpdatarate[i];
1313 if (fixed == 0)
1314 break;
1315 } else
1316 datarates[i] = 0xff;
1317 }
1318 if (r8712_setdatarate_cmd(padapter, datarates) != _SUCCESS)
1319 ret = -1;
1320 return ret;
1321}
1322
1323static int r8711_wx_get_rate(struct net_device *dev,
1324 struct iw_request_info *info,
1325 union iwreq_data *wrqu, char *extra)
1326{
1327 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1328 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1329 struct ndis_wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
1330 struct ieee80211_ht_cap *pht_capie;
1331 int i;
1332 u8 *p;
1333 u16 rate, max_rate = 0, ht_cap = false;
1334 u32 ht_ielen = 0;
1335 u8 bw_40MHz = 0, short_GI = 0;
1336 u16 mcs_rate = 0;
1337
1338 i = 0;
1339 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE)) {
1340 p = r8712_get_ie(&pcur_bss->IEs[12],
1341 _HT_CAPABILITY_IE_, &ht_ielen,
1342 pcur_bss->IELength - 12);
1343 if (p && ht_ielen > 0) {
1344 ht_cap = true;
1345 pht_capie = (struct ieee80211_ht_cap *)(p + 2);
1346 memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
1347 bw_40MHz = (pht_capie->cap_info &
1348 IEEE80211_HT_CAP_SUP_WIDTH) ? 1 : 0;
1349 short_GI = (pht_capie->cap_info &
1350 (IEEE80211_HT_CAP_SGI_20 |
1351 IEEE80211_HT_CAP_SGI_40)) ? 1 : 0;
1352 }
1353 while ((pcur_bss->SupportedRates[i] != 0) &&
1354 (pcur_bss->SupportedRates[i] != 0xFF)) {
1355 rate = pcur_bss->SupportedRates[i] & 0x7F;
1356 if (rate > max_rate)
1357 max_rate = rate;
1358 wrqu->bitrate.fixed = 0; /* no auto select */
1359 wrqu->bitrate.value = rate*500000;
1360 i++;
1361 }
1362 if (ht_cap == true) {
1363 if (mcs_rate & 0x8000) /* MCS15 */
1364 max_rate = (bw_40MHz) ? ((short_GI) ? 300 :
1365 270) : ((short_GI) ? 144 : 130);
1366 else if (mcs_rate & 0x0080) /* MCS7 */
1367 max_rate = (bw_40MHz) ? ((short_GI) ? 150 :
1368 135) : ((short_GI) ? 72 : 65);
1369 else /* default MCS7 */
1370 max_rate = (bw_40MHz) ? ((short_GI) ? 150 :
1371 135) : ((short_GI) ? 72 : 65);
1372 max_rate *= 2; /* Mbps/2 */
1373 wrqu->bitrate.value = max_rate * 500000;
1374 }
1375 } else
1376 return -1;
1377 return 0;
1378}
1379
1380static int r8711_wx_get_rts(struct net_device *dev,
1381 struct iw_request_info *info,
1382 union iwreq_data *wrqu, char *extra)
1383{
1384 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1385
1386 wrqu->rts.value = padapter->registrypriv.rts_thresh;
1387 wrqu->rts.fixed = 0; /* no auto select */
1388 return 0;
1389}
1390
1391static int r8711_wx_set_frag(struct net_device *dev,
1392 struct iw_request_info *info,
1393 union iwreq_data *wrqu, char *extra)
1394{
1395 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1396
1397 if (wrqu->frag.disabled)
1398 padapter->xmitpriv.frag_len = MAX_FRAG_THRESHOLD;
1399 else {
1400 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
1401 wrqu->frag.value > MAX_FRAG_THRESHOLD)
1402 return -EINVAL;
1403 padapter->xmitpriv.frag_len = wrqu->frag.value & ~0x1;
1404 }
1405 return 0;
1406}
1407
1408static int r8711_wx_get_frag(struct net_device *dev,
1409 struct iw_request_info *info,
1410 union iwreq_data *wrqu, char *extra)
1411{
1412 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
1413
1414 wrqu->frag.value = padapter->xmitpriv.frag_len;
1415 wrqu->frag.fixed = 0; /* no auto select */
1416 return 0;
1417}
1418
1419static int r8711_wx_get_retry(struct net_device *dev,
1420 struct iw_request_info *info,
1421 union iwreq_data *wrqu, char *extra)
1422{
1423 wrqu->retry.value = 7;
1424 wrqu->retry.fixed = 0; /* no auto select */
1425 wrqu->retry.disabled = 1;
1426 return 0;
1427}
1428
1429static int r8711_wx_set_enc(struct net_device *dev,
1430 struct iw_request_info *info,
1431 union iwreq_data *wrqu, char *keybuf)
1432{
1433 u32 key;
1434 u32 keyindex_provided;
1435 struct NDIS_802_11_WEP wep;
1436 enum NDIS_802_11_AUTHENTICATION_MODE authmode;
1437 struct iw_point *erq = &(wrqu->encoding);
1438 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
1439
1440 key = erq->flags & IW_ENCODE_INDEX;
1441 memset(&wep, 0, sizeof(struct NDIS_802_11_WEP));
1442 if (erq->flags & IW_ENCODE_DISABLED) {
1443 printk(KERN_INFO "r8712u: r8711_wx_set_enc: "
1444 "EncryptionDisabled\n");
1445 padapter->securitypriv.ndisencryptstatus =
1446 Ndis802_11EncryptionDisabled;
1447 padapter->securitypriv.PrivacyAlgrthm = _NO_PRIVACY_;
1448 padapter->securitypriv.XGrpPrivacy = _NO_PRIVACY_;
1449 padapter->securitypriv.AuthAlgrthm = 0; /* open system */
1450 authmode = Ndis802_11AuthModeOpen;
1451 padapter->securitypriv.ndisauthtype = authmode;
1452 return 0;
1453 }
1454 if (key) {
1455 if (key > WEP_KEYS)
1456 return -EINVAL;
1457 key--;
1458 keyindex_provided = 1;
1459 } else {
1460 keyindex_provided = 0;
1461 key = padapter->securitypriv.PrivacyKeyIndex;
1462 }
1463 /* set authentication mode */
1464 if (erq->flags & IW_ENCODE_OPEN) {
1465 printk(KERN_INFO "r8712u: r8711_wx_set_enc: "
1466 "IW_ENCODE_OPEN\n");
1467 padapter->securitypriv.ndisencryptstatus =
1468 Ndis802_11Encryption1Enabled;
1469 padapter->securitypriv.AuthAlgrthm = 0; /* open system */
1470 padapter->securitypriv.PrivacyAlgrthm = _NO_PRIVACY_;
1471 padapter->securitypriv.XGrpPrivacy = _NO_PRIVACY_;
1472 authmode = Ndis802_11AuthModeOpen;
1473 padapter->securitypriv.ndisauthtype = authmode;
1474 } else if (erq->flags & IW_ENCODE_RESTRICTED) {
1475 printk(KERN_INFO "r8712u: r8711_wx_set_enc: "
1476 "IW_ENCODE_RESTRICTED\n");
1477 padapter->securitypriv.ndisencryptstatus =
1478 Ndis802_11Encryption1Enabled;
1479 padapter->securitypriv.AuthAlgrthm = 1; /* shared system */
1480 padapter->securitypriv.PrivacyAlgrthm = _WEP40_;
1481 padapter->securitypriv.XGrpPrivacy = _WEP40_;
1482 authmode = Ndis802_11AuthModeShared;
1483 padapter->securitypriv.ndisauthtype = authmode;
1484 } else {
1485 padapter->securitypriv.ndisencryptstatus =
1486 Ndis802_11Encryption1Enabled;
1487 padapter->securitypriv.AuthAlgrthm = 0; /* open system */
1488 padapter->securitypriv.PrivacyAlgrthm = _NO_PRIVACY_;
1489 padapter->securitypriv.XGrpPrivacy = _NO_PRIVACY_;
1490 authmode = Ndis802_11AuthModeOpen;
1491 padapter->securitypriv.ndisauthtype = authmode;
1492 }
1493 wep.KeyIndex = key;
1494 if (erq->length > 0) {
1495 wep.KeyLength = erq->length <= 5 ? 5 : 13;
1496 wep.Length = wep.KeyLength +
1497 FIELD_OFFSET(struct NDIS_802_11_WEP, KeyMaterial);
1498 } else {
1499 wep.KeyLength = 0 ;
1500 if (keyindex_provided == 1) { /* set key_id only, no given
1501 * KeyMaterial(erq->length==0).*/
1502 padapter->securitypriv.PrivacyKeyIndex = key;
1503 switch (padapter->securitypriv.DefKeylen[key]) {
1504 case 5:
1505 padapter->securitypriv.PrivacyAlgrthm =
1506 _WEP40_;
1507 break;
1508 case 13:
1509 padapter->securitypriv.PrivacyAlgrthm =
1510 _WEP104_;
1511 break;
1512 default:
1513 padapter->securitypriv.PrivacyAlgrthm =
1514 _NO_PRIVACY_;
1515 break;
1516 }
1517 return 0;
1518 }
1519 }
1520 wep.KeyIndex |= 0x80000000; /* transmit key */
1521 memcpy(wep.KeyMaterial, keybuf, wep.KeyLength);
1522 if (r8712_set_802_11_add_wep(padapter, &wep) == _FAIL)
1523 return -EOPNOTSUPP;
1524 return 0;
1525}
1526
1527static int r8711_wx_get_enc(struct net_device *dev,
1528 struct iw_request_info *info,
1529 union iwreq_data *wrqu, char *keybuf)
1530{
1531 uint key, ret = 0;
1532 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
1533 struct iw_point *erq = &(wrqu->encoding);
1534 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1535
1536 if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
1537 if (!check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
1538 erq->length = 0;
1539 erq->flags |= IW_ENCODE_DISABLED;
1540 return 0;
1541 }
1542 }
1543 key = erq->flags & IW_ENCODE_INDEX;
1544 if (key) {
1545 if (key > WEP_KEYS)
1546 return -EINVAL;
1547 key--;
1548 } else {
1549 key = padapter->securitypriv.PrivacyKeyIndex;
1550 }
1551 erq->flags = key + 1;
1552 switch (padapter->securitypriv.ndisencryptstatus) {
1553 case Ndis802_11EncryptionNotSupported:
1554 case Ndis802_11EncryptionDisabled:
1555 erq->length = 0;
1556 erq->flags |= IW_ENCODE_DISABLED;
1557 break;
1558 case Ndis802_11Encryption1Enabled:
1559 erq->length = padapter->securitypriv.DefKeylen[key];
1560 if (erq->length) {
1561 memcpy(keybuf, padapter->securitypriv.DefKey[
1562 key].skey, padapter->securitypriv.
1563 DefKeylen[key]);
1564 erq->flags |= IW_ENCODE_ENABLED;
1565 if (padapter->securitypriv.ndisauthtype ==
1566 Ndis802_11AuthModeOpen)
1567 erq->flags |= IW_ENCODE_OPEN;
1568 else if (padapter->securitypriv.ndisauthtype ==
1569 Ndis802_11AuthModeShared)
1570 erq->flags |= IW_ENCODE_RESTRICTED;
1571 } else {
1572 erq->length = 0;
1573 erq->flags |= IW_ENCODE_DISABLED;
1574 }
1575 break;
1576 case Ndis802_11Encryption2Enabled:
1577 case Ndis802_11Encryption3Enabled:
1578 erq->length = 16;
1579 erq->flags |= (IW_ENCODE_ENABLED | IW_ENCODE_OPEN |
1580 IW_ENCODE_NOKEY);
1581 break;
1582 default:
1583 erq->length = 0;
1584 erq->flags |= IW_ENCODE_DISABLED;
1585 break;
1586 }
1587 return ret;
1588}
1589
1590static int r8711_wx_get_power(struct net_device *dev,
1591 struct iw_request_info *info,
1592 union iwreq_data *wrqu, char *extra)
1593{
1594 wrqu->power.value = 0;
1595 wrqu->power.fixed = 0; /* no auto select */
1596 wrqu->power.disabled = 1;
1597 return 0;
1598}
1599
1600static int r871x_wx_set_gen_ie(struct net_device *dev,
1601 struct iw_request_info *info,
1602 union iwreq_data *wrqu, char *extra)
1603{
1604 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1605
1606 return r871x_set_wpa_ie(padapter, extra, wrqu->data.length);
1607}
1608
1609static int r871x_wx_set_auth(struct net_device *dev,
1610 struct iw_request_info *info,
1611 union iwreq_data *wrqu, char *extra)
1612{
1613 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1614 struct iw_param *param = (struct iw_param *)&(wrqu->param);
1615 int paramid;
1616 int paramval;
1617 int ret = 0;
1618
1619 paramid = param->flags & IW_AUTH_INDEX;
1620 paramval = param->value;
1621 switch (paramid) {
1622 case IW_AUTH_WPA_VERSION:
1623 break;
1624 case IW_AUTH_CIPHER_PAIRWISE:
1625 break;
1626 case IW_AUTH_CIPHER_GROUP:
1627 break;
1628 case IW_AUTH_KEY_MGMT:
1629 /*
1630 * ??? does not use these parameters
1631 */
1632 break;
1633 case IW_AUTH_TKIP_COUNTERMEASURES:
1634 if (paramval) {
1635 /* wpa_supplicant is enabling tkip countermeasure. */
1636 padapter->securitypriv.btkip_countermeasure = true;
1637 } else {
1638 /* wpa_supplicant is disabling tkip countermeasure. */
1639 padapter->securitypriv.btkip_countermeasure = false;
1640 }
1641 break;
1642 case IW_AUTH_DROP_UNENCRYPTED:
1643 /* HACK:
1644 *
1645 * wpa_supplicant calls set_wpa_enabled when the driver
1646 * is loaded and unloaded, regardless of if WPA is being
1647 * used. No other calls are made which can be used to
1648 * determine if encryption will be used or not prior to
1649 * association being expected. If encryption is not being
1650 * used, drop_unencrypted is set to false, else true -- we
1651 * can use this to determine if the CAP_PRIVACY_ON bit should
1652 * be set.
1653 */
1654 if (padapter->securitypriv.ndisencryptstatus ==
1655 Ndis802_11Encryption1Enabled) {
1656 /* it means init value, or using wep,
1657 * ndisencryptstatus =
1658 * Ndis802_11Encryption1Enabled,
1659 * then it needn't reset it;
1660 */
1661 break;
1662 }
1663
1664 if (paramval) {
1665 padapter->securitypriv.ndisencryptstatus =
1666 Ndis802_11EncryptionDisabled;
1667 padapter->securitypriv.PrivacyAlgrthm =
1668 _NO_PRIVACY_;
1669 padapter->securitypriv.XGrpPrivacy =
1670 _NO_PRIVACY_;
1671 padapter->securitypriv.AuthAlgrthm = 0;
1672 padapter->securitypriv.ndisauthtype =
1673 Ndis802_11AuthModeOpen;
1674 }
1675 break;
1676 case IW_AUTH_80211_AUTH_ALG:
1677 ret = wpa_set_auth_algs(dev, (u32)paramval);
1678 break;
1679 case IW_AUTH_WPA_ENABLED:
1680 break;
1681 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
1682 break;
1683 case IW_AUTH_PRIVACY_INVOKED:
1684 break;
1685 default:
1686 return -EOPNOTSUPP;
1687 }
1688
1689 return ret;
1690}
1691
1692static int r871x_wx_set_enc_ext(struct net_device *dev,
1693 struct iw_request_info *info,
1694 union iwreq_data *wrqu, char *extra)
1695{
1696 struct iw_point *pencoding = &wrqu->encoding;
1697 struct iw_encode_ext *pext = (struct iw_encode_ext *)extra;
1698 struct ieee_param *param = NULL;
1699 char *alg_name;
1700 u32 param_len;
1701 int ret = 0;
1702
1703 param_len = sizeof(struct ieee_param) + pext->key_len;
1704 param = (struct ieee_param *)_malloc(param_len);
1705 if (param == NULL)
1706 return -1;
1707 memset(param, 0, param_len);
1708 param->cmd = IEEE_CMD_SET_ENCRYPTION;
1709 memset(param->sta_addr, 0xff, ETH_ALEN);
1710 switch (pext->alg) {
1711 case IW_ENCODE_ALG_NONE:
1712 alg_name = "none";
1713 break;
1714 case IW_ENCODE_ALG_WEP:
1715 alg_name = "WEP";
1716 break;
1717 case IW_ENCODE_ALG_TKIP:
1718 alg_name = "TKIP";
1719 break;
1720 case IW_ENCODE_ALG_CCMP:
1721 alg_name = "CCMP";
1722 break;
1723 default:
1724 return -1;
1725 }
1726 strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN);
1727 if (pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
1728 param->u.crypt.set_tx = 0;
1729 if (pext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)
1730 param->u.crypt.set_tx = 1;
1731 param->u.crypt.idx = (pencoding->flags & 0x00FF) - 1;
1732 if (pext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)
1733 memcpy(param->u.crypt.seq, pext->rx_seq, 8);
1734 if (pext->key_len) {
1735 param->u.crypt.key_len = pext->key_len;
1736 memcpy(param + 1, pext + 1, pext->key_len);
1737 }
1738 ret = wpa_set_encryption(dev, param, param_len);
1739 if (param)
1740 kfree((u8 *)param);
1741 return ret;
1742}
1743
1744static int r871x_wx_get_nick(struct net_device *dev,
1745 struct iw_request_info *info,
1746 union iwreq_data *wrqu, char *extra)
1747{
1748 if (extra) {
1749 wrqu->data.length = 8;
1750 wrqu->data.flags = 1;
1751 memcpy(extra, "rtl_wifi", 8);
1752 }
1753 return 0;
1754}
1755
1756static int r8711_wx_read32(struct net_device *dev,
1757 struct iw_request_info *info,
1758 union iwreq_data *wrqu, char *keybuf)
1759{
1760 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
1761 u32 addr;
1762 u32 data32;
1763
1764 get_user(addr, (u32 __user *)wrqu->data.pointer);
1765 data32 = r8712_read32(padapter, addr);
1766 put_user(data32, (u32 __user *)wrqu->data.pointer);
1767 wrqu->data.length = (data32 & 0xffff0000) >> 16;
1768 wrqu->data.flags = data32 & 0xffff;
1769 get_user(addr, (u32 __user *)wrqu->data.pointer);
1770 return 0;
1771}
1772
1773static int r8711_wx_write32(struct net_device *dev,
1774 struct iw_request_info *info,
1775 union iwreq_data *wrqu, char *keybuf)
1776{
1777 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
1778 u32 addr;
1779 u32 data32;
1780
1781 get_user(addr, (u32 __user *)wrqu->data.pointer);
1782 data32 = ((u32)wrqu->data.length<<16) | (u32)wrqu->data.flags ;
1783 r8712_write32(padapter, addr, data32);
1784 return 0;
1785}
1786
1787static int dummy(struct net_device *dev,
1788 struct iw_request_info *a,
1789 union iwreq_data *wrqu, char *b)
1790{
1791 return -1;
1792}
1793
1794static int r8711_drvext_hdl(struct net_device *dev,
1795 struct iw_request_info *info,
1796 union iwreq_data *wrqu, char *extra)
1797{
1798 return 0;
1799}
1800
1801static int r871x_mp_ioctl_hdl(struct net_device *dev,
1802 struct iw_request_info *info,
1803 union iwreq_data *wrqu, char *extra)
1804{
1805 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1806 struct iw_point *p = &wrqu->data;
1807 struct oid_par_priv oid_par;
1808 struct mp_ioctl_handler *phandler;
1809 struct mp_ioctl_param *poidparam;
1810 unsigned long BytesRead, BytesWritten, BytesNeeded;
1811 u8 *pparmbuf = NULL, bset;
1812 u16 len;
1813 uint status;
1814 int ret = 0;
1815
1816 if ((!p->length) || (!p->pointer)) {
1817 ret = -EINVAL;
1818 goto _r871x_mp_ioctl_hdl_exit;
1819 }
1820 bset = (u8)(p->flags & 0xFFFF);
1821 len = p->length;
1822 pparmbuf = NULL;
1823 pparmbuf = (u8 *)_malloc(len);
1824 if (pparmbuf == NULL) {
1825 ret = -ENOMEM;
1826 goto _r871x_mp_ioctl_hdl_exit;
1827 }
1828 if (copy_from_user(pparmbuf, p->pointer, len)) {
1829 ret = -EFAULT;
1830 goto _r871x_mp_ioctl_hdl_exit;
1831 }
1832 poidparam = (struct mp_ioctl_param *)pparmbuf;
1833 if (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) {
1834 ret = -EINVAL;
1835 goto _r871x_mp_ioctl_hdl_exit;
1836 }
1837 phandler = mp_ioctl_hdl + poidparam->subcode;
1838 if ((phandler->paramsize != 0) &&
1839 (poidparam->len < phandler->paramsize)) {
1840 ret = -EINVAL;
1841 goto _r871x_mp_ioctl_hdl_exit;
1842 }
1843 if (phandler->oid == 0 && phandler->handler)
1844 status = phandler->handler(&oid_par);
1845 else if (phandler->handler) {
1846 oid_par.adapter_context = padapter;
1847 oid_par.oid = phandler->oid;
1848 oid_par.information_buf = poidparam->data;
1849 oid_par.information_buf_len = poidparam->len;
1850 oid_par.dbg = 0;
1851 BytesWritten = 0;
1852 BytesNeeded = 0;
1853 if (bset) {
1854 oid_par.bytes_rw = &BytesRead;
1855 oid_par.bytes_needed = &BytesNeeded;
1856 oid_par.type_of_oid = SET_OID;
1857 } else {
1858 oid_par.bytes_rw = &BytesWritten;
1859 oid_par.bytes_needed = &BytesNeeded;
1860 oid_par.type_of_oid = QUERY_OID;
1861 }
1862 status = phandler->handler(&oid_par);
1863 /* todo:check status, BytesNeeded, etc. */
1864 } else {
1865 printk(KERN_INFO "r8712u: r871x_mp_ioctl_hdl(): err!,"
1866 " subcode=%d, oid=%d, handler=%p\n",
1867 poidparam->subcode, phandler->oid, phandler->handler);
1868 ret = -EFAULT;
1869 goto _r871x_mp_ioctl_hdl_exit;
1870 }
1871 if (bset == 0x00) { /* query info */
1872 if (copy_to_user(p->pointer, pparmbuf, len))
1873 ret = -EFAULT;
1874 }
1875 if (status) {
1876 ret = -EFAULT;
1877 goto _r871x_mp_ioctl_hdl_exit;
1878 }
1879_r871x_mp_ioctl_hdl_exit:
1880 if (pparmbuf != NULL)
1881 kfree(pparmbuf);
1882 return ret;
1883}
1884
1885static int r871x_get_ap_info(struct net_device *dev,
1886 struct iw_request_info *info,
1887 union iwreq_data *wrqu, char *extra)
1888{
1889 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1890 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1891 struct __queue *queue = &pmlmepriv->scanned_queue;
1892 struct iw_point *pdata = &wrqu->data;
1893 struct wlan_network *pnetwork = NULL;
1894 u32 cnt = 0, wpa_ielen;
1895 unsigned long irqL;
1896 struct list_head *plist, *phead;
1897 unsigned char *pbuf;
1898 u8 bssid[ETH_ALEN];
1899 char data[32];
1900
1901 if (padapter->bDriverStopped || (pdata == NULL))
1902 return -EINVAL;
1903 while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)) {
1904 msleep(30);
1905 cnt++;
1906 if (cnt > 100)
1907 break;
1908 }
1909 pdata->flags = 0;
1910 if (pdata->length >= 32) {
1911 if (copy_from_user(data, pdata->pointer, 32))
1912 return -EINVAL;
1913 } else
1914 return -EINVAL;
1915 spin_lock_irqsave(&(pmlmepriv->scanned_queue.lock), irqL);
1916 phead = get_list_head(queue);
1917 plist = get_next(phead);
1918 while (1) {
1919 if (end_of_queue_search(phead, plist) == true)
1920 break;
1921 pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
1922 if (hwaddr_aton_i(data, bssid)) {
1923 printk(KERN_INFO "r8712u: Invalid BSSID '%s'.\n",
1924 (u8 *)data);
1925 spin_unlock_irqrestore(&(pmlmepriv->scanned_queue.lock),
1926 irqL);
1927 return -EINVAL;
1928 }
1929 printk(KERN_INFO "r8712u: BSSID:" MACSTR "\n",
1930 MAC2STR(bssid));
1931 if (!memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN)) {
1932 /* BSSID match, then check if supporting wpa/wpa2 */
1933 pbuf = r8712_get_wpa_ie(&pnetwork->network.IEs[12],
1934 &wpa_ielen, pnetwork->network.IELength-12);
1935 if (pbuf && (wpa_ielen > 0)) {
1936 pdata->flags = 1;
1937 break;
1938 }
1939 pbuf = r8712_get_wpa2_ie(&pnetwork->network.IEs[12],
1940 &wpa_ielen, pnetwork->network.IELength-12);
1941 if (pbuf && (wpa_ielen > 0)) {
1942 pdata->flags = 2;
1943 break;
1944 }
1945 }
1946 plist = get_next(plist);
1947 }
1948 spin_unlock_irqrestore(&(pmlmepriv->scanned_queue.lock), irqL);
1949 if (pdata->length >= 34) {
1950 if (copy_to_user((u8 __user *)pdata->pointer + 32,
1951 (u8 *)&pdata->flags, 1))
1952 return -EINVAL;
1953 }
1954 return 0;
1955}
1956
1957static int r871x_set_pid(struct net_device *dev,
1958 struct iw_request_info *info,
1959 union iwreq_data *wrqu, char *extra)
1960{
1961 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
1962 struct iw_point *pdata = &wrqu->data;
1963
1964 if ((padapter->bDriverStopped) || (pdata == NULL))
1965 return -EINVAL;
1966 if (copy_from_user(&padapter->pid, pdata->pointer, sizeof(int)))
1967 return -EINVAL;
1968 return 0;
1969}
1970
1971static int r871x_wps_start(struct net_device *dev,
1972 struct iw_request_info *info,
1973 union iwreq_data *wrqu, char *extra)
1974{
1975 struct _adapter *padapter = (struct _adapter *)_netdev_priv(dev);
1976 struct iw_point *pdata = &wrqu->data;
1977 u32 u32wps_start = 0;
1978 unsigned int uintRet = 0;
1979
1980 uintRet = copy_from_user((void *)&u32wps_start, pdata->pointer, 4);
1981 if ((padapter->bDriverStopped) || (pdata == NULL))
1982 return -EINVAL;
1983 if (u32wps_start == 0)
1984 u32wps_start = *extra;
1985 if (u32wps_start == 1) /* WPS Start */
1986 padapter->ledpriv.LedControlHandler(padapter,
1987 LED_CTL_START_WPS);
1988 else if (u32wps_start == 2) /* WPS Stop because of wps success */
1989 padapter->ledpriv.LedControlHandler(padapter,
1990 LED_CTL_STOP_WPS);
1991 else if (u32wps_start == 3) /* WPS Stop because of wps fail */
1992 padapter->ledpriv.LedControlHandler(padapter,
1993 LED_CTL_STOP_WPS_FAIL);
1994 return 0;
1995}
1996
1997static int wpa_set_param(struct net_device *dev, u8 name, u32 value)
1998{
1999 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
2000
2001 switch (name) {
2002 case IEEE_PARAM_WPA_ENABLED:
2003 padapter->securitypriv.AuthAlgrthm = 2; /* 802.1x */
2004 switch ((value)&0xff) {
2005 case 1: /* WPA */
2006 padapter->securitypriv.ndisauthtype =
2007 Ndis802_11AuthModeWPAPSK; /* WPA_PSK */
2008 padapter->securitypriv.ndisencryptstatus =
2009 Ndis802_11Encryption2Enabled;
2010 break;
2011 case 2: /* WPA2 */
2012 padapter->securitypriv.ndisauthtype =
2013 Ndis802_11AuthModeWPA2PSK; /* WPA2_PSK */
2014 padapter->securitypriv.ndisencryptstatus =
2015 Ndis802_11Encryption3Enabled;
2016 break;
2017 }
2018 break;
2019 case IEEE_PARAM_TKIP_COUNTERMEASURES:
2020 break;
2021 case IEEE_PARAM_DROP_UNENCRYPTED:
2022 /* HACK:
2023 *
2024 * wpa_supplicant calls set_wpa_enabled when the driver
2025 * is loaded and unloaded, regardless of if WPA is being
2026 * used. No other calls are made which can be used to
2027 * determine if encryption will be used or not prior to
2028 * association being expected. If encryption is not being
2029 * used, drop_unencrypted is set to false, else true -- we
2030 * can use this to determine if the CAP_PRIVACY_ON bit should
2031 * be set.
2032 */
2033 break;
2034 case IEEE_PARAM_PRIVACY_INVOKED:
2035 break;
2036 case IEEE_PARAM_AUTH_ALGS:
2037 return wpa_set_auth_algs(dev, value);
2038 break;
2039 case IEEE_PARAM_IEEE_802_1X:
2040 break;
2041 case IEEE_PARAM_WPAX_SELECT:
2042 /* added for WPA2 mixed mode */
2043 break;
2044 default:
2045 return -EOPNOTSUPP;
2046 }
2047 return 0;
2048}
2049
2050static int wpa_mlme(struct net_device *dev, u32 command, u32 reason)
2051{
2052 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
2053
2054 switch (command) {
2055 case IEEE_MLME_STA_DEAUTH:
2056 if (!r8712_set_802_11_disassociate(padapter))
2057 return -1;
2058 break;
2059 case IEEE_MLME_STA_DISASSOC:
2060 if (!r8712_set_802_11_disassociate(padapter))
2061 return -1;
2062 break;
2063 default:
2064 return -EOPNOTSUPP;
2065 }
2066 return 0;
2067}
2068
2069static int wpa_supplicant_ioctl(struct net_device *dev, struct iw_point *p)
2070{
2071 struct ieee_param *param;
2072 int ret = 0;
2073 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
2074
2075 if (p->length < sizeof(struct ieee_param) || !p->pointer)
2076 return -EINVAL;
2077 param = (struct ieee_param *)_malloc(p->length);
2078 if (param == NULL)
2079 return -ENOMEM;
2080 if (copy_from_user(param, p->pointer, p->length))
2081 kfree((u8 *)param);
2082 return -EFAULT;
2083 switch (param->cmd) {
2084 case IEEE_CMD_SET_WPA_PARAM:
2085 ret = wpa_set_param(dev, param->u.wpa_param.name,
2086 param->u.wpa_param.value);
2087 break;
2088 case IEEE_CMD_SET_WPA_IE:
2089 ret = r871x_set_wpa_ie(padapter, (char *)param->u.wpa_ie.data,
2090 (u16)param->u.wpa_ie.len);
2091 break;
2092 case IEEE_CMD_SET_ENCRYPTION:
2093 ret = wpa_set_encryption(dev, param, p->length);
2094 break;
2095 case IEEE_CMD_MLME:
2096 ret = wpa_mlme(dev, param->u.mlme.command,
2097 param->u.mlme.reason_code);
2098 break;
2099 default:
2100 ret = -EOPNOTSUPP;
2101 break;
2102 }
2103 if (ret == 0 && copy_to_user(p->pointer, param, p->length))
2104 ret = -EFAULT;
2105 kfree((u8 *)param);
2106 return ret;
2107}
2108
2109/* based on "driver_ipw" and for hostapd */
2110int r871x_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
2111{
2112 struct iwreq *wrq = (struct iwreq *)rq;
2113
2114 switch (cmd) {
2115 case RTL_IOCTL_WPA_SUPPLICANT:
2116 return wpa_supplicant_ioctl(dev, &wrq->u.data);
2117 default:
2118 return -EOPNOTSUPP;
2119 }
2120 return 0;
2121}
2122
2123static iw_handler r8711_handlers[] = {
2124 NULL, /* SIOCSIWCOMMIT */
2125 r8711_wx_get_name, /* SIOCGIWNAME */
2126 dummy, /* SIOCSIWNWID */
2127 dummy, /* SIOCGIWNWID */
2128 r8711_wx_set_freq, /* SIOCSIWFREQ */
2129 r8711_wx_get_freq, /* SIOCGIWFREQ */
2130 r8711_wx_set_mode, /* SIOCSIWMODE */
2131 r8711_wx_get_mode, /* SIOCGIWMODE */
2132 dummy, /* SIOCSIWSENS */
2133 r8711_wx_get_sens, /* SIOCGIWSENS */
2134 NULL, /* SIOCSIWRANGE */
2135 r8711_wx_get_range, /* SIOCGIWRANGE */
2136 r871x_wx_set_priv, /* SIOCSIWPRIV */
2137 NULL, /* SIOCGIWPRIV */
2138 NULL, /* SIOCSIWSTATS */
2139 NULL, /* SIOCGIWSTATS */
2140 dummy, /* SIOCSIWSPY */
2141 dummy, /* SIOCGIWSPY */
2142 NULL, /* SIOCGIWTHRSPY */
2143 NULL, /* SIOCWIWTHRSPY */
2144 r8711_wx_set_wap, /* SIOCSIWAP */
2145 r8711_wx_get_wap, /* SIOCGIWAP */
2146 r871x_wx_set_mlme, /* request MLME operation;
2147 * uses struct iw_mlme */
2148 dummy, /* SIOCGIWAPLIST -- deprecated */
2149 r8711_wx_set_scan, /* SIOCSIWSCAN */
2150 r8711_wx_get_scan, /* SIOCGIWSCAN */
2151 r8711_wx_set_essid, /* SIOCSIWESSID */
2152 r8711_wx_get_essid, /* SIOCGIWESSID */
2153 dummy, /* SIOCSIWNICKN */
2154 r871x_wx_get_nick, /* SIOCGIWNICKN */
2155 NULL, /* -- hole -- */
2156 NULL, /* -- hole -- */
2157 r8711_wx_set_rate, /* SIOCSIWRATE */
2158 r8711_wx_get_rate, /* SIOCGIWRATE */
2159 dummy, /* SIOCSIWRTS */
2160 r8711_wx_get_rts, /* SIOCGIWRTS */
2161 r8711_wx_set_frag, /* SIOCSIWFRAG */
2162 r8711_wx_get_frag, /* SIOCGIWFRAG */
2163 dummy, /* SIOCSIWTXPOW */
2164 dummy, /* SIOCGIWTXPOW */
2165 dummy, /* SIOCSIWRETRY */
2166 r8711_wx_get_retry, /* SIOCGIWRETRY */
2167 r8711_wx_set_enc, /* SIOCSIWENCODE */
2168 r8711_wx_get_enc, /* SIOCGIWENCODE */
2169 dummy, /* SIOCSIWPOWER */
2170 r8711_wx_get_power, /* SIOCGIWPOWER */
2171 NULL, /*---hole---*/
2172 NULL, /*---hole---*/
2173 r871x_wx_set_gen_ie, /* SIOCSIWGENIE */
2174 NULL, /* SIOCGIWGENIE */
2175 r871x_wx_set_auth, /* SIOCSIWAUTH */
2176 NULL, /* SIOCGIWAUTH */
2177 r871x_wx_set_enc_ext, /* SIOCSIWENCODEEXT */
2178 NULL, /* SIOCGIWENCODEEXT */
2179 r871x_wx_set_pmkid, /* SIOCSIWPMKSA */
2180 NULL, /*---hole---*/
2181};
2182
2183static const struct iw_priv_args r8711_private_args[] = {
2184 {
2185 SIOCIWFIRSTPRIV + 0x0,
2186 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "read32"
2187 },
2188 {
2189 SIOCIWFIRSTPRIV + 0x1,
2190 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "write32"
2191 },
2192 {
2193 SIOCIWFIRSTPRIV + 0x2, 0, 0, "driver_ext"
2194 },
2195 {
2196 SIOCIWFIRSTPRIV + 0x3, 0, 0, "mp_ioctl"
2197 },
2198 {
2199 SIOCIWFIRSTPRIV + 0x4,
2200 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "apinfo"
2201 },
2202 {
2203 SIOCIWFIRSTPRIV + 0x5,
2204 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setpid"
2205 },
2206 {
2207 SIOCIWFIRSTPRIV + 0x6,
2208 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_start"
2209 }
2210};
2211
2212static iw_handler r8711_private_handler[] = {
2213 r8711_wx_read32,
2214 r8711_wx_write32,
2215 r8711_drvext_hdl,
2216 r871x_mp_ioctl_hdl,
2217 r871x_get_ap_info, /*for MM DTV platform*/
2218 r871x_set_pid,
2219 r871x_wps_start,
2220};
2221
2222static struct iw_statistics *r871x_get_wireless_stats(struct net_device *dev)
2223{
2224 struct _adapter *padapter = (struct _adapter *) _netdev_priv(dev);
2225 struct iw_statistics *piwstats = &padapter->iwstats;
2226 int tmp_level = 0;
2227 int tmp_qual = 0;
2228 int tmp_noise = 0;
2229
2230 if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) != true) {
2231 piwstats->qual.qual = 0;
2232 piwstats->qual.level = 0;
2233 piwstats->qual.noise = 0;
2234 } else {
2235 /* show percentage, we need transfer dbm to orignal value. */
2236 tmp_level = padapter->recvpriv.fw_rssi;
2237 tmp_qual = padapter->recvpriv.signal;
2238 tmp_noise = padapter->recvpriv.noise;
2239 piwstats->qual.level = tmp_level;
2240 piwstats->qual.qual = tmp_qual;
2241 piwstats->qual.noise = tmp_noise;
2242 }
2243 piwstats->qual.updated = IW_QUAL_ALL_UPDATED;
2244 return &padapter->iwstats;
2245}
2246
2247struct iw_handler_def r871x_handlers_def = {
2248 .standard = r8711_handlers,
2249 .num_standard = sizeof(r8711_handlers) / sizeof(iw_handler),
2250 .private = r8711_private_handler,
2251 .private_args = (struct iw_priv_args *)r8711_private_args,
2252 .num_private = sizeof(r8711_private_handler) / sizeof(iw_handler),
2253 .num_private_args = sizeof(r8711_private_args) /
2254 sizeof(struct iw_priv_args),
2255 .get_wireless_stats = r871x_get_wireless_stats,
2256};
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_rtl.c b/drivers/staging/rtl8712/rtl871x_ioctl_rtl.c
new file mode 100644
index 00000000000..7adbe82cd08
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_rtl.c
@@ -0,0 +1,535 @@
1/******************************************************************************
2 * rtl871x_ioctl_rtl.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_IOCTL_RTL_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "wlan_bssdef.h"
34#include "wifi.h"
35#include "rtl871x_ioctl.h"
36#include "rtl871x_ioctl_set.h"
37#include "rtl871x_ioctl_rtl.h"
38#include "mp_custom_oid.h"
39#include "rtl871x_mp.h"
40#include "rtl871x_mp_ioctl.h"
41
42uint oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv)
43{
44 if (poid_par_priv->type_of_oid != QUERY_OID)
45 return NDIS_STATUS_NOT_ACCEPTED;
46 return NDIS_STATUS_SUCCESS;
47}
48
49uint oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
50{
51 struct _adapter *padapter = (struct _adapter *)
52 (poid_par_priv->adapter_context);
53
54 if (poid_par_priv->type_of_oid != QUERY_OID)
55 return NDIS_STATUS_NOT_ACCEPTED;
56 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
57 *(u32 *)poid_par_priv->information_buf =
58 padapter->recvpriv.rx_smallpacket_crcerr;
59 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
60 } else
61 return NDIS_STATUS_INVALID_LENGTH;
62 return NDIS_STATUS_SUCCESS;
63}
64
65uint oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
66{
67 struct _adapter *padapter = (struct _adapter *)
68 (poid_par_priv->adapter_context);
69
70 if (poid_par_priv->type_of_oid != QUERY_OID)
71 return NDIS_STATUS_NOT_ACCEPTED;
72 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
73 *(u32 *)poid_par_priv->information_buf =
74 padapter->recvpriv.rx_middlepacket_crcerr;
75 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
76 } else
77 return NDIS_STATUS_INVALID_LENGTH;
78 return NDIS_STATUS_SUCCESS;
79}
80
81uint oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
82{
83 struct _adapter *padapter = (struct _adapter *)
84 (poid_par_priv->adapter_context);
85
86 if (poid_par_priv->type_of_oid != QUERY_OID)
87 return NDIS_STATUS_NOT_ACCEPTED;
88 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
89 *(u32 *)poid_par_priv->information_buf =
90 padapter->recvpriv.rx_largepacket_crcerr;
91 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
92 } else
93 return NDIS_STATUS_INVALID_LENGTH;
94 return NDIS_STATUS_SUCCESS;
95}
96
97uint oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv)
98{
99 if (poid_par_priv->type_of_oid != QUERY_OID)
100 return NDIS_STATUS_NOT_ACCEPTED;
101 return NDIS_STATUS_SUCCESS;
102}
103
104uint oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv)
105{
106 if (poid_par_priv->type_of_oid != QUERY_OID)
107 return NDIS_STATUS_NOT_ACCEPTED;
108 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
109 return NDIS_STATUS_SUCCESS;
110}
111
112uint oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv)
113{
114 struct _adapter *padapter = (struct _adapter *)
115 (poid_par_priv->adapter_context);
116
117 if (poid_par_priv->type_of_oid != QUERY_OID)
118 return NDIS_STATUS_NOT_ACCEPTED;
119 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
120 *(u32 *)poid_par_priv->information_buf =
121 padapter->recvpriv.rx_pkts +
122 padapter->recvpriv.rx_drop;
123 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
124 } else
125 return NDIS_STATUS_INVALID_LENGTH;
126 return NDIS_STATUS_SUCCESS;
127}
128
129uint oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv)
130{
131 if (poid_par_priv->type_of_oid != QUERY_OID)
132 return NDIS_STATUS_NOT_ACCEPTED;
133 return NDIS_STATUS_SUCCESS;
134}
135
136uint oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv)
137{
138 if (poid_par_priv->type_of_oid != QUERY_OID)
139 return NDIS_STATUS_NOT_ACCEPTED;
140 return NDIS_STATUS_SUCCESS;
141}
142
143uint oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv)
144{
145 struct _adapter *padapter = (struct _adapter *)
146 (poid_par_priv->adapter_context);
147
148 if (poid_par_priv->type_of_oid != QUERY_OID)
149 return NDIS_STATUS_NOT_ACCEPTED;
150 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
151 *(uint *)poid_par_priv->information_buf =
152 padapter->recvpriv.rx_icv_err;
153 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
154 } else
155 return NDIS_STATUS_INVALID_LENGTH ;
156 return NDIS_STATUS_SUCCESS;
157}
158
159uint oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv
160 *poid_par_priv)
161{
162 if (poid_par_priv->type_of_oid != SET_OID)
163 return NDIS_STATUS_NOT_ACCEPTED;
164 return NDIS_STATUS_SUCCESS;
165}
166
167uint oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
168{
169 struct _adapter *padapter = (struct _adapter *)
170 (poid_par_priv->adapter_context);
171 u32 preamblemode = 0 ;
172
173 if (poid_par_priv->type_of_oid != QUERY_OID)
174 return NDIS_STATUS_NOT_ACCEPTED;
175 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
176 if (padapter->registrypriv.preamble == PREAMBLE_LONG)
177 preamblemode = 0;
178 else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
179 preamblemode = 1;
180 else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
181 preamblemode = 2;
182 *(u32 *)poid_par_priv->information_buf = preamblemode;
183 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
184 } else
185 return NDIS_STATUS_INVALID_LENGTH;
186 return NDIS_STATUS_SUCCESS;
187}
188
189uint oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv)
190{
191 if (poid_par_priv->type_of_oid != QUERY_OID)
192 return NDIS_STATUS_NOT_ACCEPTED;
193 return NDIS_STATUS_SUCCESS;
194}
195
196uint oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
197{
198 struct _adapter *padapter = (struct _adapter *)
199 (poid_par_priv->adapter_context);
200 struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
201
202 if (poid_par_priv->type_of_oid != QUERY_OID)
203 return NDIS_STATUS_NOT_ACCEPTED;
204 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
205 *(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan;
206 return NDIS_STATUS_SUCCESS;
207}
208
209uint oid_rt_set_channelplan_hdl(struct oid_par_priv
210 *poid_par_priv)
211{
212 struct _adapter *padapter = (struct _adapter *)
213 (poid_par_priv->adapter_context);
214 struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
215
216 if (poid_par_priv->type_of_oid != SET_OID)
217 return NDIS_STATUS_NOT_ACCEPTED;
218 peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf;
219 return NDIS_STATUS_SUCCESS;
220}
221
222uint oid_rt_set_preamble_mode_hdl(struct oid_par_priv
223 *poid_par_priv)
224{
225 struct _adapter *padapter = (struct _adapter *)
226 (poid_par_priv->adapter_context);
227 u32 preamblemode = 0;
228
229 if (poid_par_priv->type_of_oid != SET_OID)
230 return NDIS_STATUS_NOT_ACCEPTED;
231 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
232 preamblemode = *(u32 *)poid_par_priv->information_buf;
233 if (preamblemode == 0)
234 padapter->registrypriv.preamble = PREAMBLE_LONG;
235 else if (preamblemode == 1)
236 padapter->registrypriv.preamble = PREAMBLE_AUTO;
237 else if (preamblemode == 2)
238 padapter->registrypriv.preamble = PREAMBLE_SHORT;
239 *(u32 *)poid_par_priv->information_buf = preamblemode;
240 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
241 } else
242 return NDIS_STATUS_INVALID_LENGTH;
243 return NDIS_STATUS_SUCCESS;
244}
245
246uint oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv)
247{
248 if (poid_par_priv->type_of_oid != SET_OID)
249 return NDIS_STATUS_NOT_ACCEPTED;
250 return NDIS_STATUS_SUCCESS;
251}
252
253uint oid_rt_dedicate_probe_hdl(struct oid_par_priv
254 *poid_par_priv)
255{
256 return NDIS_STATUS_SUCCESS;
257}
258
259uint oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv
260 *poid_par_priv)
261{
262 struct _adapter *padapter = (struct _adapter *)
263 (poid_par_priv->adapter_context);
264
265 if (poid_par_priv->type_of_oid != QUERY_OID)
266 return NDIS_STATUS_NOT_ACCEPTED;
267 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
268 *(u32 *)poid_par_priv->information_buf =
269 padapter->xmitpriv.tx_bytes;
270 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
271 } else
272 return NDIS_STATUS_INVALID_LENGTH;
273 return NDIS_STATUS_SUCCESS;
274}
275
276uint oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv
277 *poid_par_priv)
278{
279 struct _adapter *padapter = (struct _adapter *)
280 (poid_par_priv->adapter_context);
281
282 if (poid_par_priv->type_of_oid != QUERY_OID)
283 return NDIS_STATUS_NOT_ACCEPTED;
284 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
285 *(u32 *)poid_par_priv->information_buf =
286 padapter->recvpriv.rx_bytes;
287 *poid_par_priv->bytes_rw = poid_par_priv->
288 information_buf_len;
289 } else
290 return NDIS_STATUS_INVALID_LENGTH;
291 return NDIS_STATUS_SUCCESS;
292}
293
294uint oid_rt_current_tx_power_level_hdl(struct oid_par_priv
295 *poid_par_priv)
296{
297 return NDIS_STATUS_SUCCESS;
298}
299
300uint oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv
301 *poid_par_priv)
302{
303 if (poid_par_priv->type_of_oid != QUERY_OID)
304 return NDIS_STATUS_NOT_ACCEPTED;
305 return NDIS_STATUS_SUCCESS;
306}
307
308uint oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv
309 *poid_par_priv)
310{
311 if (poid_par_priv->type_of_oid != QUERY_OID)
312 return NDIS_STATUS_NOT_ACCEPTED;
313 return NDIS_STATUS_SUCCESS;
314}
315
316uint oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv)
317{
318 struct _adapter *padapter = (struct _adapter *)
319 (poid_par_priv->adapter_context);
320 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
321 struct NDIS_802_11_CONFIGURATION *pnic_Config;
322 u32 channelnum;
323
324 if (poid_par_priv->type_of_oid != QUERY_OID)
325 return NDIS_STATUS_NOT_ACCEPTED;
326 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) ||
327 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true))
328 pnic_Config = &pmlmepriv->cur_network.network.Configuration;
329 else
330 pnic_Config = &padapter->registrypriv.dev_network.
331 Configuration;
332 channelnum = pnic_Config->DSConfig;
333 *(u32 *)poid_par_priv->information_buf = channelnum;
334 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
335 return NDIS_STATUS_SUCCESS;
336}
337
338uint oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv
339 *poid_par_priv)
340{
341 if (poid_par_priv->type_of_oid != QUERY_OID)
342 return NDIS_STATUS_NOT_ACCEPTED;
343 return NDIS_STATUS_SUCCESS;
344}
345
346uint oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv)
347{
348 if (poid_par_priv->type_of_oid != QUERY_OID)
349 return NDIS_STATUS_NOT_ACCEPTED;
350 return NDIS_STATUS_SUCCESS;
351}
352
353uint oid_rt_supported_wireless_mode_hdl(struct oid_par_priv
354 *poid_par_priv)
355{
356 u32 ulInfo = 0;
357
358 if (poid_par_priv->type_of_oid != QUERY_OID)
359 return NDIS_STATUS_NOT_ACCEPTED;
360 if (poid_par_priv->information_buf_len >= sizeof(u32)) {
361 ulInfo |= 0x0100; /* WIRELESS_MODE_B */
362 ulInfo |= 0x0200; /* WIRELESS_MODE_G */
363 ulInfo |= 0x0400; /* WIRELESS_MODE_A */
364 *(u32 *) poid_par_priv->information_buf = ulInfo;
365 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
366 } else
367 return NDIS_STATUS_INVALID_LENGTH;
368 return NDIS_STATUS_SUCCESS;
369}
370
371uint oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv)
372{
373 if (poid_par_priv->type_of_oid != QUERY_OID)
374 return NDIS_STATUS_NOT_ACCEPTED;
375 return NDIS_STATUS_SUCCESS;
376}
377
378uint oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv)
379{
380 if (poid_par_priv->type_of_oid != QUERY_OID)
381 return NDIS_STATUS_NOT_ACCEPTED;
382 return NDIS_STATUS_SUCCESS;
383}
384
385
386uint oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv)
387{
388 return NDIS_STATUS_SUCCESS;
389}
390
391uint oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv
392 *poid_par_priv)
393{
394 return NDIS_STATUS_SUCCESS;
395}
396
397uint oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv
398 *poid_par_priv)
399{
400 if (poid_par_priv->type_of_oid != QUERY_OID)
401 return NDIS_STATUS_NOT_ACCEPTED;
402 return NDIS_STATUS_SUCCESS;
403}
404
405uint oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv
406 *poid_par_priv)
407{
408 return NDIS_STATUS_SUCCESS;
409}
410
411uint oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv
412 *poid_par_priv)
413{
414 if (poid_par_priv->type_of_oid != QUERY_OID)
415 return NDIS_STATUS_NOT_ACCEPTED;
416 return NDIS_STATUS_SUCCESS;
417}
418
419uint oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv*
420 poid_par_priv)
421{
422 return NDIS_STATUS_SUCCESS;
423}
424
425uint oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv)
426{
427 return NDIS_STATUS_SUCCESS;
428}
429
430uint oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv)
431{
432 if (poid_par_priv->type_of_oid != SET_OID)
433 return NDIS_STATUS_NOT_ACCEPTED;
434 return NDIS_STATUS_SUCCESS;
435}
436
437uint oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv*
438 poid_par_priv)
439{
440 uint status = NDIS_STATUS_SUCCESS;
441 struct _adapter *Adapter = (struct _adapter *)
442 (poid_par_priv->adapter_context);
443
444 if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
445 return NDIS_STATUS_NOT_ACCEPTED;
446 if (poid_par_priv->information_buf_len ==
447 (sizeof(unsigned long) * 3)) {
448 if (!r8712_setrfreg_cmd(Adapter,
449 *(unsigned char *)poid_par_priv->information_buf,
450 (unsigned long)(*((unsigned long *)
451 poid_par_priv->information_buf + 2))))
452 status = NDIS_STATUS_NOT_ACCEPTED;
453 } else
454 status = NDIS_STATUS_INVALID_LENGTH;
455 return status;
456}
457
458uint oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv)
459{
460 uint status = NDIS_STATUS_SUCCESS;
461 struct _adapter *Adapter = (struct _adapter *)
462 (poid_par_priv->adapter_context);
463
464 if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
465 return NDIS_STATUS_NOT_ACCEPTED;
466 if (poid_par_priv->information_buf_len == (sizeof(unsigned long)*3)) {
467 if (Adapter->mppriv.act_in_progress == true)
468 status = NDIS_STATUS_NOT_ACCEPTED;
469 else {
470 /* init workparam */
471 Adapter->mppriv.act_in_progress = true;
472 Adapter->mppriv.workparam.bcompleted = false;
473 Adapter->mppriv.workparam.act_type = MPT_READ_RF;
474 Adapter->mppriv.workparam.io_offset = *(unsigned long *)
475 poid_par_priv->information_buf;
476 Adapter->mppriv.workparam.io_value = 0xcccccccc;
477
478 /* RegOffsetValue - The offset of RF register to read.
479 * RegDataWidth - The data width of RF register to read.
480 * RegDataValue - The value to read.
481 * RegOffsetValue = *((unsigned long *)InformationBuffer);
482 * RegDataWidth = *((unsigned long *)InformationBuffer+1);
483 * RegDataValue = *((unsigned long *)InformationBuffer+2);
484 */
485 if (!r8712_getrfreg_cmd(Adapter,
486 *(unsigned char *)poid_par_priv->information_buf,
487 (unsigned char *)&Adapter->mppriv.workparam.
488 io_value))
489 status = NDIS_STATUS_NOT_ACCEPTED;
490 }
491 } else
492 status = NDIS_STATUS_INVALID_LENGTH;
493 return status;
494}
495
496enum _CONNECT_STATE_{
497 CHECKINGSTATUS,
498 ASSOCIATED,
499 ADHOCMODE,
500 NOTASSOCIATED
501};
502
503uint oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv)
504{
505 struct _adapter *padapter = (struct _adapter *)
506 (poid_par_priv->adapter_context);
507 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
508 u32 ulInfo;
509
510 if (poid_par_priv->type_of_oid != QUERY_OID)
511 return NDIS_STATUS_NOT_ACCEPTED;
512 /* nStatus==0 CheckingStatus
513 * nStatus==1 Associated
514 * nStatus==2 AdHocMode
515 * nStatus==3 NotAssociated
516 */
517 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true)
518 ulInfo = CHECKINGSTATUS;
519 else if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
520 ulInfo = ASSOCIATED;
521 else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)
522 ulInfo = ADHOCMODE;
523 else
524 ulInfo = NOTASSOCIATED ;
525 *(u32 *)poid_par_priv->information_buf = ulInfo;
526 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
527 return NDIS_STATUS_SUCCESS;
528}
529
530uint oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv)
531{
532 if (poid_par_priv->type_of_oid != SET_OID)
533 return NDIS_STATUS_NOT_ACCEPTED;
534 return NDIS_STATUS_SUCCESS;
535}
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_rtl.h b/drivers/staging/rtl8712/rtl871x_ioctl_rtl.h
new file mode 100644
index 00000000000..4f1aa876d75
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_rtl.h
@@ -0,0 +1,96 @@
1#ifndef _RTL871X_IOCTL_RTL_H
2#define _RTL871X_IOCTL_RTL_H
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7/*************** oid_rtl_seg_01_01 **************/
8uint oid_rt_get_signal_quality_hdl(
9 struct oid_par_priv *poid_par_priv);/*84*/
10uint oid_rt_get_small_packet_crc_hdl(
11 struct oid_par_priv *poid_par_priv);
12uint oid_rt_get_middle_packet_crc_hdl(
13 struct oid_par_priv *poid_par_priv);
14uint oid_rt_get_large_packet_crc_hdl(
15 struct oid_par_priv *poid_par_priv);
16uint oid_rt_get_tx_retry_hdl(
17 struct oid_par_priv *poid_par_priv);
18uint oid_rt_get_rx_retry_hdl(
19 struct oid_par_priv *poid_par_priv);
20uint oid_rt_get_rx_total_packet_hdl(
21 struct oid_par_priv *poid_par_priv);
22uint oid_rt_get_tx_beacon_ok_hdl(
23 struct oid_par_priv *poid_par_priv);
24uint oid_rt_get_tx_beacon_err_hdl(
25 struct oid_par_priv *poid_par_priv);
26uint oid_rt_get_rx_icv_err_hdl(
27 struct oid_par_priv *poid_par_priv);/*93*/
28uint oid_rt_set_encryption_algorithm_hdl(
29 struct oid_par_priv *poid_par_priv);
30uint oid_rt_get_preamble_mode_hdl(
31 struct oid_par_priv *poid_par_priv);
32uint oid_rt_get_ap_ip_hdl(
33 struct oid_par_priv *poid_par_priv);
34uint oid_rt_get_channelplan_hdl(
35 struct oid_par_priv *poid_par_priv);
36uint oid_rt_set_channelplan_hdl(
37 struct oid_par_priv *poid_par_priv);
38uint oid_rt_set_preamble_mode_hdl(
39 struct oid_par_priv *poid_par_priv);
40uint oid_rt_set_bcn_intvl_hdl(
41 struct oid_par_priv *poid_par_priv);
42uint oid_rt_dedicate_probe_hdl(
43 struct oid_par_priv *poid_par_priv);
44uint oid_rt_get_total_tx_bytes_hdl(
45 struct oid_par_priv *poid_par_priv);
46uint oid_rt_get_total_rx_bytes_hdl(
47 struct oid_par_priv *poid_par_priv);
48uint oid_rt_current_tx_power_level_hdl(
49 struct oid_par_priv *poid_par_priv);
50uint oid_rt_get_enc_key_mismatch_count_hdl(
51 struct oid_par_priv *poid_par_priv);
52uint oid_rt_get_enc_key_match_count_hdl(
53 struct oid_par_priv *poid_par_priv);
54uint oid_rt_get_channel_hdl(
55 struct oid_par_priv *poid_par_priv);
56uint oid_rt_get_hardware_radio_off_hdl(
57 struct oid_par_priv *poid_par_priv);
58uint oid_rt_get_key_mismatch_hdl(
59 struct oid_par_priv *poid_par_priv);
60uint oid_rt_supported_wireless_mode_hdl(
61 struct oid_par_priv *poid_par_priv);
62uint oid_rt_get_channel_list_hdl(
63 struct oid_par_priv *poid_par_priv);
64uint oid_rt_get_scan_in_progress_hdl(
65 struct oid_par_priv *poid_par_priv);
66uint oid_rt_forced_data_rate_hdl(
67 struct oid_par_priv *poid_par_priv);
68uint oid_rt_wireless_mode_for_scan_list_hdl(
69 struct oid_par_priv *poid_par_priv);
70uint oid_rt_get_bss_wireless_mode_hdl(
71 struct oid_par_priv *poid_par_priv);
72uint oid_rt_scan_with_magic_packet_hdl(
73 struct oid_par_priv *poid_par_priv);
74
75/************** oid_rtl_seg_01_03 section start **************/
76uint oid_rt_ap_get_associated_station_list_hdl(
77 struct oid_par_priv *poid_par_priv);
78uint oid_rt_ap_switch_into_ap_mode_hdl(
79 struct oid_par_priv *poid_par_priv);
80uint oid_rt_ap_supported_hdl(
81 struct oid_par_priv *poid_par_priv);
82uint oid_rt_ap_set_passphrase_hdl(
83 struct oid_par_priv *poid_par_priv);
84/* oid_rtl_seg_01_11 */
85uint oid_rt_pro_rf_write_registry_hdl(
86 struct oid_par_priv *poid_par_priv);
87uint oid_rt_pro_rf_read_registry_hdl(
88 struct oid_par_priv *poid_par_priv);
89/*************** oid_rtl_seg_03_00 section start **************/
90uint oid_rt_get_connect_state_hdl(
91 struct oid_par_priv *poid_par_priv);
92uint oid_rt_set_default_key_id_hdl(
93 struct oid_par_priv *poid_par_priv);
94
95#endif
96
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_set.c b/drivers/staging/rtl8712/rtl871x_ioctl_set.c
new file mode 100644
index 00000000000..8b1451d0306
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_set.c
@@ -0,0 +1,379 @@
1/******************************************************************************
2 * rtl871x_ioctl_set.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_IOCTL_SET_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "rtl871x_ioctl_set.h"
34#include "usb_osintf.h"
35#include "usb_ops.h"
36
37#define IS_MAC_ADDRESS_BROADCAST(addr) \
38( \
39 ((addr[0] == 0xff) && (addr[1] == 0xff) && \
40 (addr[2] == 0xff) && (addr[3] == 0xff) && \
41 (addr[4] == 0xff) && (addr[5] == 0xff)) ? true : false \
42)
43
44static u8 validate_ssid(struct ndis_802_11_ssid *ssid)
45{
46 u8 i;
47
48 if (ssid->SsidLength > 32)
49 return false;
50 for (i = 0; i < ssid->SsidLength; i++) {
51 /* wifi, printable ascii code must be supported */
52 if (!((ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e)))
53 return false;
54 }
55 return true;
56}
57
58static u8 do_join(struct _adapter *padapter)
59{
60 struct list_head *plist, *phead;
61 u8 *pibss = NULL;
62 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
63 struct __queue *queue = &(pmlmepriv->scanned_queue);
64
65 phead = get_list_head(queue);
66 plist = get_next(phead);
67 pmlmepriv->cur_network.join_res = -2;
68 pmlmepriv->fw_state |= _FW_UNDER_LINKING;
69 pmlmepriv->pscanned = plist;
70 pmlmepriv->to_join = true;
71 if (_queue_empty(queue) == true) {
72 if (pmlmepriv->fw_state & _FW_UNDER_LINKING)
73 pmlmepriv->fw_state ^= _FW_UNDER_LINKING;
74 /* when set_ssid/set_bssid for do_join(), but scanning queue
75 * is empty we try to issue sitesurvey firstly
76 */
77 if (pmlmepriv->sitesurveyctrl.traffic_busy == false)
78 r8712_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid);
79 return true;
80 } else {
81 int ret;
82
83 ret = r8712_select_and_join_from_scan(pmlmepriv);
84 if (ret == _SUCCESS)
85 _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
86 else {
87 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
88 /* submit r8712_createbss_cmd to change to an
89 * ADHOC_MASTER pmlmepriv->lock has been
90 * acquired by caller...
91 */
92 struct wlan_bssid_ex *pdev_network =
93 &(padapter->registrypriv.dev_network);
94 pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;
95 pibss = padapter->registrypriv.dev_network.
96 MacAddress;
97 memset(&pdev_network->Ssid, 0,
98 sizeof(struct ndis_802_11_ssid));
99 memcpy(&pdev_network->Ssid,
100 &pmlmepriv->assoc_ssid,
101 sizeof(struct ndis_802_11_ssid));
102 r8712_update_registrypriv_dev_network(padapter);
103 r8712_generate_random_ibss(pibss);
104 if (r8712_createbss_cmd(padapter) != _SUCCESS)
105 return false;
106 pmlmepriv->to_join = false;
107 } else {
108 /* can't associate ; reset under-linking */
109 if (pmlmepriv->fw_state & _FW_UNDER_LINKING)
110 pmlmepriv->fw_state ^=
111 _FW_UNDER_LINKING;
112 /* when set_ssid/set_bssid for do_join(), but
113 * there are no desired bss in scanning queue
114 * we try to issue sitesurvey first
115 */
116 if (!pmlmepriv->sitesurveyctrl.traffic_busy)
117 r8712_sitesurvey_cmd(padapter,
118 &pmlmepriv->assoc_ssid);
119 }
120 }
121 }
122 return true;
123}
124
125u8 r8712_set_802_11_bssid(struct _adapter *padapter, u8 *bssid)
126{
127 unsigned long irqL;
128 u8 status = true;
129 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
130
131 if ((bssid[0] == 0x00 && bssid[1] == 0x00 && bssid[2] == 0x00 &&
132 bssid[3] == 0x00 && bssid[4] == 0x00 && bssid[5] == 0x00) ||
133 (bssid[0] == 0xFF && bssid[1] == 0xFF && bssid[2] == 0xFF &&
134 bssid[3] == 0xFF && bssid[4] == 0xFF && bssid[5] == 0xFF)) {
135 status = false;
136 return status;
137 }
138 spin_lock_irqsave(&pmlmepriv->lock, irqL);
139 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY |
140 _FW_UNDER_LINKING) == true) {
141 status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING);
142 goto _Abort_Set_BSSID;
143 }
144 if (check_fwstate(pmlmepriv,
145 _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == true) {
146 if (!memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid,
147 ETH_ALEN)) {
148 if (check_fwstate(pmlmepriv,
149 WIFI_STATION_STATE) == false)
150 goto _Abort_Set_BSSID; /* driver is in
151 * WIFI_ADHOC_MASTER_STATE */
152 } else {
153 r8712_disassoc_cmd(padapter);
154 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
155 r8712_ind_disconnect(padapter);
156 r8712_free_assoc_resources(padapter);
157 if ((check_fwstate(pmlmepriv,
158 WIFI_ADHOC_MASTER_STATE))) {
159 _clr_fwstate_(pmlmepriv,
160 WIFI_ADHOC_MASTER_STATE);
161 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
162 }
163 }
164 }
165 memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
166 pmlmepriv->assoc_by_bssid = true;
167 status = do_join(padapter);
168 goto done;
169_Abort_Set_BSSID:
170done:
171 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
172 return status;
173}
174
175void r8712_set_802_11_ssid(struct _adapter *padapter,
176 struct ndis_802_11_ssid *ssid)
177{
178 unsigned long irqL;
179 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
180 struct wlan_network *pnetwork = &pmlmepriv->cur_network;
181
182 if (padapter->hw_init_completed == false)
183 return;
184 spin_lock_irqsave(&pmlmepriv->lock, irqL);
185 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)) {
186 check_fwstate(pmlmepriv, _FW_UNDER_LINKING);
187 goto _Abort_Set_SSID;
188 }
189 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE)) {
190 if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) &&
191 (!memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid,
192 ssid->SsidLength))) {
193 if ((check_fwstate(pmlmepriv,
194 WIFI_STATION_STATE) == false)) {
195 if (r8712_is_same_ibss(padapter,
196 pnetwork) == false) {
197 /* if in WIFI_ADHOC_MASTER_STATE or
198 * WIFI_ADHOC_STATE, create bss or
199 * rejoin again
200 */
201 r8712_disassoc_cmd(padapter);
202 if (check_fwstate(pmlmepriv,
203 _FW_LINKED) == true)
204 r8712_ind_disconnect(padapter);
205 r8712_free_assoc_resources(padapter);
206 if (check_fwstate(pmlmepriv,
207 WIFI_ADHOC_MASTER_STATE)) {
208 _clr_fwstate_(pmlmepriv,
209 WIFI_ADHOC_MASTER_STATE);
210 set_fwstate(pmlmepriv,
211 WIFI_ADHOC_STATE);
212 }
213 } else
214 goto _Abort_Set_SSID; /* driver is in
215 * WIFI_ADHOC_MASTER_STATE */
216 }
217 } else {
218 r8712_disassoc_cmd(padapter);
219 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
220 r8712_ind_disconnect(padapter);
221 r8712_free_assoc_resources(padapter);
222 if (check_fwstate(pmlmepriv,
223 WIFI_ADHOC_MASTER_STATE) == true) {
224 _clr_fwstate_(pmlmepriv,
225 WIFI_ADHOC_MASTER_STATE);
226 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
227 }
228 }
229 }
230 if (padapter->securitypriv.btkip_countermeasure == true)
231 goto _Abort_Set_SSID;
232 if (validate_ssid(ssid) == false)
233 goto _Abort_Set_SSID;
234 memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(struct ndis_802_11_ssid));
235 pmlmepriv->assoc_by_bssid = false;
236 do_join(padapter);
237 goto done;
238_Abort_Set_SSID:
239done:
240 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
241}
242
243u8 r8712_set_802_11_infrastructure_mode(struct _adapter *padapter,
244 enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype)
245{
246 unsigned long irqL;
247 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
248 struct wlan_network *cur_network = &pmlmepriv->cur_network;
249 enum NDIS_802_11_NETWORK_INFRASTRUCTURE *pold_state =
250 &(cur_network->network.InfrastructureMode);
251
252 if (*pold_state != networktype) {
253 spin_lock_irqsave(&pmlmepriv->lock, irqL);
254 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) ||
255 (*pold_state == Ndis802_11IBSS))
256 r8712_disassoc_cmd(padapter);
257 if (check_fwstate(pmlmepriv,
258 _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == true)
259 r8712_free_assoc_resources(padapter);
260 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) ||
261 (*pold_state == Ndis802_11Infrastructure) ||
262 (*pold_state == Ndis802_11IBSS)) {
263 /* will clr Linked_state before this function,
264 * we must have chked whether issue dis-assoc_cmd or
265 * not */
266 r8712_ind_disconnect(padapter);
267 }
268 *pold_state = networktype;
269 /* clear WIFI_STATION_STATE; WIFI_AP_STATE; WIFI_ADHOC_STATE;
270 * WIFI_ADHOC_MASTER_STATE */
271 _clr_fwstate_(pmlmepriv, WIFI_STATION_STATE | WIFI_AP_STATE |
272 WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE |
273 WIFI_AP_STATE);
274 switch (networktype) {
275 case Ndis802_11IBSS:
276 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
277 break;
278 case Ndis802_11Infrastructure:
279 set_fwstate(pmlmepriv, WIFI_STATION_STATE);
280 break;
281 case Ndis802_11APMode:
282 set_fwstate(pmlmepriv, WIFI_AP_STATE);
283 break;
284 case Ndis802_11AutoUnknown:
285 case Ndis802_11InfrastructureMax:
286 break;
287 }
288 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
289 }
290 return true;
291}
292
293u8 r8712_set_802_11_disassociate(struct _adapter *padapter)
294{
295 unsigned long irqL;
296 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
297
298 spin_lock_irqsave(&pmlmepriv->lock, irqL);
299 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
300 r8712_disassoc_cmd(padapter);
301 r8712_ind_disconnect(padapter);
302 r8712_free_assoc_resources(padapter);
303 }
304 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
305 return true;
306}
307
308u8 r8712_set_802_11_bssid_list_scan(struct _adapter *padapter)
309{
310 struct mlme_priv *pmlmepriv = NULL;
311 unsigned long irqL;
312 u8 ret = true;
313
314 if (padapter == NULL)
315 return false;
316 pmlmepriv = &padapter->mlmepriv;
317 if (padapter->hw_init_completed == false)
318 return false;
319 spin_lock_irqsave(&pmlmepriv->lock, irqL);
320 if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)) ||
321 (pmlmepriv->sitesurveyctrl.traffic_busy == true)) {
322 /* Scan or linking is in progress, do nothing. */
323 ret = (u8)check_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
324 } else {
325 r8712_free_network_queue(padapter);
326 ret = r8712_sitesurvey_cmd(padapter, NULL);
327 }
328 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
329 return ret;
330}
331
332u8 r8712_set_802_11_authentication_mode(struct _adapter *padapter,
333 enum NDIS_802_11_AUTHENTICATION_MODE authmode)
334{
335 struct security_priv *psecuritypriv = &padapter->securitypriv;
336 u8 ret;
337
338 psecuritypriv->ndisauthtype = authmode;
339 if (psecuritypriv->ndisauthtype > 3)
340 psecuritypriv->AuthAlgrthm = 2; /* 802.1x */
341 if (r8712_set_auth(padapter, psecuritypriv) == _SUCCESS)
342 ret = true;
343 else
344 ret = false;
345 return ret;
346}
347
348u8 r8712_set_802_11_add_wep(struct _adapter *padapter,
349 struct NDIS_802_11_WEP *wep)
350{
351 u8 bdefaultkey;
352 u8 btransmitkey;
353 sint keyid;
354 struct security_priv *psecuritypriv = &padapter->securitypriv;
355
356 bdefaultkey = (wep->KeyIndex & 0x40000000) > 0 ? false : true;
357 btransmitkey = (wep->KeyIndex & 0x80000000) > 0 ? true : false;
358 keyid = wep->KeyIndex & 0x3fffffff;
359 if (keyid >= WEP_KEYS)
360 return false;
361 switch (wep->KeyLength) {
362 case 5:
363 psecuritypriv->PrivacyAlgrthm = _WEP40_;
364 break;
365 case 13:
366 psecuritypriv->PrivacyAlgrthm = _WEP104_;
367 break;
368 default:
369 psecuritypriv->PrivacyAlgrthm = _NO_PRIVACY_;
370 break;
371 }
372 memcpy(psecuritypriv->DefKey[keyid].skey, &wep->KeyMaterial,
373 wep->KeyLength);
374 psecuritypriv->DefKeylen[keyid] = wep->KeyLength;
375 psecuritypriv->PrivacyKeyIndex = keyid;
376 if (r8712_set_key(padapter, psecuritypriv, keyid) == _FAIL)
377 return false;
378 return _SUCCESS;
379}
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_set.h b/drivers/staging/rtl8712/rtl871x_ioctl_set.h
new file mode 100644
index 00000000000..283afbfc1d0
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_set.h
@@ -0,0 +1,24 @@
1#ifndef __IOCTL_SET_H
2#define __IOCTL_SET_H
3
4#include "drv_types.h"
5
6typedef u8 NDIS_802_11_PMKID_VALUE[16];
7
8struct BSSIDInfo {
9 unsigned char BSSID[6];
10 NDIS_802_11_PMKID_VALUE PMKID;
11};
12
13u8 r8712_set_802_11_authentication_mode(struct _adapter *pdapter,
14 enum NDIS_802_11_AUTHENTICATION_MODE authmode);
15u8 r8712_set_802_11_bssid(struct _adapter *padapter, u8 *bssid);
16u8 r8712_set_802_11_add_wep(struct _adapter *padapter, struct NDIS_802_11_WEP *wep);
17u8 r8712_set_802_11_disassociate(struct _adapter *padapter);
18u8 r8712_set_802_11_bssid_list_scan(struct _adapter *padapter);
19u8 r8712_set_802_11_infrastructure_mode(struct _adapter *padapter,
20 enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype);
21void r8712_set_802_11_ssid(struct _adapter *padapter, struct ndis_802_11_ssid *ssid);
22
23#endif
24
diff --git a/drivers/staging/rtl8712/rtl871x_led.h b/drivers/staging/rtl8712/rtl871x_led.h
new file mode 100644
index 00000000000..994ef82141a
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_led.h
@@ -0,0 +1,99 @@
1#ifndef __RTL8712_LED_H
2#define __RTL8712_LED_H
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7/*===========================================================================
8 * LED customization.
9 *===========================================================================
10 */
11enum LED_CTL_MODE {
12 LED_CTL_POWER_ON = 1,
13 LED_CTL_LINK = 2,
14 LED_CTL_NO_LINK = 3,
15 LED_CTL_TX = 4,
16 LED_CTL_RX = 5,
17 LED_CTL_SITE_SURVEY = 6,
18 LED_CTL_POWER_OFF = 7,
19 LED_CTL_START_TO_LINK = 8,
20 LED_CTL_START_WPS = 9,
21 LED_CTL_STOP_WPS = 10,
22 LED_CTL_START_WPS_BOTTON = 11,
23 LED_CTL_STOP_WPS_FAIL = 12,
24 LED_CTL_STOP_WPS_FAIL_OVERLAP = 13,
25};
26
27#define IS_LED_WPS_BLINKING(_LED_871x) \
28 (((struct LED_871x *)_LED_871x)->CurrLedState == LED_BLINK_WPS \
29 || ((struct LED_871x *)_LED_871x)->CurrLedState == LED_BLINK_WPS_STOP \
30 || ((struct LED_871x *)_LED_871x)->bLedWPSBlinkInProgress)
31
32#define IS_LED_BLINKING(_LED_871x) \
33 (((struct LED_871x *)_LED_871x)->bLedWPSBlinkInProgress \
34 || ((struct LED_871x *)_LED_871x)->bLedScanBlinkInProgress)
35
36enum LED_PIN_871x {
37 LED_PIN_GPIO0,
38 LED_PIN_LED0,
39 LED_PIN_LED1
40};
41
42/*===========================================================================
43 * LED customization.
44 *===========================================================================
45 */
46enum LED_STRATEGY_871x {
47 SW_LED_MODE0, /* SW control 1 LED via GPIO0. It is default option. */
48 SW_LED_MODE1, /* 2 LEDs, through LED0 and LED1. For ALPHA. */
49 SW_LED_MODE2, /* SW control 1 LED via GPIO0,
50 * custom for AzWave 8187 minicard. */
51 SW_LED_MODE3, /* SW control 1 LED via GPIO0,
52 * customized for Sercomm Printer Server case.*/
53 SW_LED_MODE4, /*for Edimax / Belkin*/
54 SW_LED_MODE5, /*for Sercomm / Belkin*/
55 SW_LED_MODE6, /*for WNC / Corega*/
56 HW_LED, /* HW control 2 LEDs, LED0 and LED1 (there are 4 different
57 * control modes, see MAC.CONFIG1 for details.)*/
58};
59
60struct LED_871x {
61 struct _adapter *padapter;
62 enum LED_PIN_871x LedPin; /* Implementation for this SW led. */
63 u32 CurrLedState; /* Current LED state. */
64 u8 bLedOn; /* true if LED is ON */
65 u8 bSWLedCtrl;
66 u8 bLedBlinkInProgress; /*true if blinking */
67 u8 bLedNoLinkBlinkInProgress;
68 u8 bLedLinkBlinkInProgress;
69 u8 bLedStartToLinkBlinkInProgress;
70 u8 bLedScanBlinkInProgress;
71 u8 bLedWPSBlinkInProgress;
72 u32 BlinkTimes; /* No. times to toggle for blink.*/
73 u32 BlinkingLedState; /* Next state for blinking,
74 * either LED_ON or OFF.*/
75
76 struct timer_list BlinkTimer; /* Timer object for led blinking.*/
77 _workitem BlinkWorkItem; /* Workitem used by BlinkTimer */
78};
79
80struct led_priv {
81 /* add for led controll */
82 struct LED_871x SwLed0;
83 struct LED_871x SwLed1;
84 enum LED_STRATEGY_871x LedStrategy;
85 u8 bRegUseLed;
86 void (*LedControlHandler)(struct _adapter *padapter,
87 enum LED_CTL_MODE LedAction);
88 /* add for led controll */
89};
90
91/*===========================================================================
92 * Interface to manipulate LED objects.
93 *===========================================================================*/
94void r8712_InitSwLeds(struct _adapter *padapter);
95void r8712_DeInitSwLeds(struct _adapter *padapter);
96void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction);
97
98#endif
99
diff --git a/drivers/staging/rtl8712/rtl871x_mlme.c b/drivers/staging/rtl8712/rtl871x_mlme.c
new file mode 100644
index 00000000000..fb3508a012c
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_mlme.c
@@ -0,0 +1,1842 @@
1/******************************************************************************
2 * rtl871x_mlme.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_MLME_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "recv_osdep.h"
34#include "xmit_osdep.h"
35#include "mlme_osdep.h"
36#include "sta_info.h"
37#include "wifi.h"
38#include "wlan_bssdef.h"
39
40static void update_ht_cap(struct _adapter *padapter, u8 *pie, uint ie_len);
41
42static sint _init_mlme_priv(struct _adapter *padapter)
43{
44 sint i;
45 u8 *pbuf;
46 struct wlan_network *pnetwork;
47 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
48
49 memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv));
50 pmlmepriv->nic_hdl = (u8 *)padapter;
51 pmlmepriv->pscanned = NULL;
52 pmlmepriv->fw_state = 0;
53 pmlmepriv->cur_network.network.InfrastructureMode =
54 Ndis802_11AutoUnknown;
55 spin_lock_init(&(pmlmepriv->lock));
56 spin_lock_init(&(pmlmepriv->lock2));
57 _init_queue(&(pmlmepriv->free_bss_pool));
58 _init_queue(&(pmlmepriv->scanned_queue));
59 set_scanned_network_val(pmlmepriv, 0);
60 memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid));
61 pbuf = _malloc(MAX_BSS_CNT * (sizeof(struct wlan_network)));
62 if (pbuf == NULL)
63 return _FAIL;
64 pmlmepriv->free_bss_buf = pbuf;
65 pnetwork = (struct wlan_network *)pbuf;
66 for (i = 0; i < MAX_BSS_CNT; i++) {
67 _init_listhead(&(pnetwork->list));
68 list_insert_tail(&(pnetwork->list),
69 &(pmlmepriv->free_bss_pool.queue));
70 pnetwork++;
71 }
72 pmlmepriv->sitesurveyctrl.last_rx_pkts = 0;
73 pmlmepriv->sitesurveyctrl.last_tx_pkts = 0;
74 pmlmepriv->sitesurveyctrl.traffic_busy = false;
75 /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */
76 r8712_init_mlme_timer(padapter);
77 return _SUCCESS;
78}
79
80struct wlan_network *_r8712_alloc_network(struct mlme_priv *pmlmepriv)
81{
82 unsigned long irqL;
83 struct wlan_network *pnetwork;
84 struct __queue *free_queue = &pmlmepriv->free_bss_pool;
85 struct list_head *plist = NULL;
86
87 if (_queue_empty(free_queue) == true)
88 return NULL;
89 spin_lock_irqsave(&free_queue->lock, irqL);
90 plist = get_next(&(free_queue->queue));
91 pnetwork = LIST_CONTAINOR(plist , struct wlan_network, list);
92 list_delete(&pnetwork->list);
93 pnetwork->last_scanned = jiffies;
94 pmlmepriv->num_of_scanned++;
95 spin_unlock_irqrestore(&free_queue->lock, irqL);
96 return pnetwork;
97}
98
99static void _free_network(struct mlme_priv *pmlmepriv,
100 struct wlan_network *pnetwork)
101{
102 u32 curr_time, delta_time;
103 unsigned long irqL;
104 struct __queue *free_queue = &(pmlmepriv->free_bss_pool);
105
106 if (pnetwork == NULL)
107 return;
108 if (pnetwork->fixed == true)
109 return;
110 curr_time = jiffies;
111 delta_time = (curr_time - (u32)pnetwork->last_scanned) / HZ;
112 if (delta_time < SCANQUEUE_LIFETIME)
113 return;
114 spin_lock_irqsave(&free_queue->lock, irqL);
115 list_delete(&pnetwork->list);
116 list_insert_tail(&pnetwork->list, &free_queue->queue);
117 pmlmepriv->num_of_scanned--;
118 spin_unlock_irqrestore(&free_queue->lock, irqL);
119}
120
121static void _free_network_nolock(struct mlme_priv *pmlmepriv,
122 struct wlan_network *pnetwork)
123{
124 struct __queue *free_queue = &pmlmepriv->free_bss_pool;
125
126 if (pnetwork == NULL)
127 return;
128 if (pnetwork->fixed == true)
129 return;
130 list_delete(&pnetwork->list);
131 list_insert_tail(&pnetwork->list, get_list_head(free_queue));
132 pmlmepriv->num_of_scanned--;
133}
134
135
136/*
137 return the wlan_network with the matching addr
138 Shall be calle under atomic context...
139 to avoid possible racing condition...
140*/
141static struct wlan_network *_r8712_find_network(struct __queue *scanned_queue,
142 u8 *addr)
143{
144 unsigned long irqL;
145 struct list_head *phead, *plist;
146 struct wlan_network *pnetwork = NULL;
147 u8 zero_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
148
149 if (!memcmp(zero_addr, addr, ETH_ALEN))
150 return NULL;
151 spin_lock_irqsave(&scanned_queue->lock, irqL);
152 phead = get_list_head(scanned_queue);
153 plist = get_next(phead);
154 while (plist != phead) {
155 pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
156 plist = get_next(plist);
157 if (!memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN))
158 break;
159 }
160 spin_unlock_irqrestore(&scanned_queue->lock, irqL);
161 return pnetwork;
162}
163
164static void _free_network_queue(struct _adapter *padapter)
165{
166 unsigned long irqL;
167 struct list_head *phead, *plist;
168 struct wlan_network *pnetwork;
169 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
170 struct __queue *scanned_queue = &pmlmepriv->scanned_queue;
171
172 spin_lock_irqsave(&scanned_queue->lock, irqL);
173 phead = get_list_head(scanned_queue);
174 plist = get_next(phead);
175 while (end_of_queue_search(phead, plist) == false) {
176 pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
177 plist = get_next(plist);
178 _free_network(pmlmepriv, pnetwork);
179 }
180 spin_unlock_irqrestore(&scanned_queue->lock, irqL);
181}
182
183sint r8712_if_up(struct _adapter *padapter)
184{
185 sint res;
186
187 if (padapter->bDriverStopped || padapter->bSurpriseRemoved ||
188 (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == false)) {
189 res = false;
190 } else
191 res = true;
192 return res;
193}
194
195void r8712_generate_random_ibss(u8 *pibss)
196{
197 u32 curtime = jiffies;
198
199 pibss[0] = 0x02; /*in ad-hoc mode bit1 must set to 1 */
200 pibss[1] = 0x11;
201 pibss[2] = 0x87;
202 pibss[3] = (u8)(curtime & 0xff);
203 pibss[4] = (u8)((curtime>>8) & 0xff);
204 pibss[5] = (u8)((curtime>>16) & 0xff);
205}
206
207uint r8712_get_ndis_wlan_bssid_ex_sz(struct ndis_wlan_bssid_ex *bss)
208{
209 uint t_len;
210
211 t_len = sizeof(u32) + 6 * sizeof(unsigned long) + 2 +
212 sizeof(struct ndis_802_11_ssid) + sizeof(u32) +
213 sizeof(s32) +
214 sizeof(enum NDIS_802_11_NETWORK_TYPE) +
215 sizeof(struct NDIS_802_11_CONFIGURATION) +
216 sizeof(enum NDIS_802_11_NETWORK_INFRASTRUCTURE) +
217 sizeof(NDIS_802_11_RATES_EX) +
218 sizeof(u32) + bss->IELength;
219 return t_len;
220}
221
222u8 *r8712_get_capability_from_ie(u8 *ie)
223{
224 return ie + 8 + 2;
225}
226
227int r8712_init_mlme_priv(struct _adapter *padapter)
228{
229 return _init_mlme_priv(padapter);
230}
231
232void r8712_free_mlme_priv(struct mlme_priv *pmlmepriv)
233{
234 kfree(pmlmepriv->free_bss_buf);
235}
236
237static struct wlan_network *alloc_network(struct mlme_priv *pmlmepriv)
238{
239 return _r8712_alloc_network(pmlmepriv);
240}
241
242static void free_network_nolock(struct mlme_priv *pmlmepriv,
243 struct wlan_network *pnetwork)
244{
245 _free_network_nolock(pmlmepriv, pnetwork);
246}
247
248void r8712_free_network_queue(struct _adapter *dev)
249{
250 _free_network_queue(dev);
251}
252
253/*
254 return the wlan_network with the matching addr
255
256 Shall be calle under atomic context...
257 to avoid possible racing condition...
258*/
259static struct wlan_network *r8712_find_network(struct __queue *scanned_queue,
260 u8 *addr)
261{
262 struct wlan_network *pnetwork = _r8712_find_network(scanned_queue,
263 addr);
264
265 return pnetwork;
266}
267
268int r8712_is_same_ibss(struct _adapter *adapter, struct wlan_network *pnetwork)
269{
270 int ret = true;
271 struct security_priv *psecuritypriv = &adapter->securitypriv;
272
273 if ((psecuritypriv->PrivacyAlgrthm != _NO_PRIVACY_) &&
274 (pnetwork->network.Privacy == 0))
275 ret = false;
276 else if ((psecuritypriv->PrivacyAlgrthm == _NO_PRIVACY_) &&
277 (pnetwork->network.Privacy == 1))
278 ret = false;
279 else
280 ret = true;
281 return ret;
282
283}
284
285static int is_same_network(struct ndis_wlan_bssid_ex *src,
286 struct ndis_wlan_bssid_ex *dst)
287{
288 u16 s_cap, d_cap;
289
290 memcpy((u8 *)&s_cap, r8712_get_capability_from_ie(src->IEs), 2);
291 memcpy((u8 *)&d_cap, r8712_get_capability_from_ie(dst->IEs), 2);
292 return (src->Ssid.SsidLength == dst->Ssid.SsidLength) &&
293 (src->Configuration.DSConfig ==
294 dst->Configuration.DSConfig) &&
295 ((!memcmp(src->MacAddress, dst->MacAddress,
296 ETH_ALEN))) &&
297 ((!memcmp(src->Ssid.Ssid,
298 dst->Ssid.Ssid,
299 src->Ssid.SsidLength))) &&
300 ((s_cap & WLAN_CAPABILITY_IBSS) ==
301 (d_cap & WLAN_CAPABILITY_IBSS)) &&
302 ((s_cap & WLAN_CAPABILITY_BSS) ==
303 (d_cap & WLAN_CAPABILITY_BSS));
304
305}
306
307struct wlan_network *r8712_get_oldest_wlan_network(
308 struct __queue *scanned_queue)
309{
310 struct list_head *plist, *phead;
311 struct wlan_network *pwlan = NULL;
312 struct wlan_network *oldest = NULL;
313
314 phead = get_list_head(scanned_queue);
315 plist = get_next(phead);
316 while (1) {
317 if (end_of_queue_search(phead, plist) == true)
318 break;
319 pwlan = LIST_CONTAINOR(plist, struct wlan_network, list);
320 if (pwlan->fixed != true) {
321 if (oldest == NULL ||
322 time_after((unsigned long)oldest->last_scanned,
323 (unsigned long)pwlan->last_scanned))
324 oldest = pwlan;
325 }
326 plist = get_next(plist);
327 }
328 return oldest;
329}
330
331static void update_network(struct ndis_wlan_bssid_ex *dst,
332 struct ndis_wlan_bssid_ex *src,
333 struct _adapter *padapter)
334{
335 u32 last_evm = 0, tmpVal;
336
337 if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) &&
338 is_same_network(&(padapter->mlmepriv.cur_network.network), src)) {
339 if (padapter->recvpriv.signal_qual_data.total_num++ >=
340 PHY_LINKQUALITY_SLID_WIN_MAX) {
341 padapter->recvpriv.signal_qual_data.total_num =
342 PHY_LINKQUALITY_SLID_WIN_MAX;
343 last_evm = padapter->recvpriv.signal_qual_data.
344 elements[padapter->recvpriv.
345 signal_qual_data.index];
346 padapter->recvpriv.signal_qual_data.total_val -=
347 last_evm;
348 }
349 padapter->recvpriv.signal_qual_data.total_val += src->Rssi;
350
351 padapter->recvpriv.signal_qual_data.
352 elements[padapter->recvpriv.signal_qual_data.
353 index++] = src->Rssi;
354 if (padapter->recvpriv.signal_qual_data.index >=
355 PHY_LINKQUALITY_SLID_WIN_MAX)
356 padapter->recvpriv.signal_qual_data.index = 0;
357 /* <1> Showed on UI for user, in percentage. */
358 tmpVal = padapter->recvpriv.signal_qual_data.total_val /
359 padapter->recvpriv.signal_qual_data.total_num;
360 padapter->recvpriv.signal = (u8)tmpVal;
361
362 src->Rssi = padapter->recvpriv.signal;
363 } else
364 src->Rssi = (src->Rssi + dst->Rssi) / 2;
365 memcpy((u8 *)dst, (u8 *)src, r8712_get_ndis_wlan_bssid_ex_sz(src));
366}
367
368static void update_current_network(struct _adapter *adapter,
369 struct ndis_wlan_bssid_ex *pnetwork)
370{
371 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
372
373 if (is_same_network(&(pmlmepriv->cur_network.network), pnetwork)) {
374 update_network(&(pmlmepriv->cur_network.network),
375 pnetwork, adapter);
376 r8712_update_protection(adapter,
377 (pmlmepriv->cur_network.network.IEs) +
378 sizeof(struct NDIS_802_11_FIXED_IEs),
379 pmlmepriv->cur_network.network.IELength);
380 }
381}
382
383/*
384Caller must hold pmlmepriv->lock first.
385*/
386static void update_scanned_network(struct _adapter *adapter,
387 struct ndis_wlan_bssid_ex *target)
388{
389 struct list_head *plist, *phead;
390
391 u32 bssid_ex_sz;
392 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
393 struct __queue *queue = &pmlmepriv->scanned_queue;
394 struct wlan_network *pnetwork = NULL;
395 struct wlan_network *oldest = NULL;
396
397 phead = get_list_head(queue);
398 plist = get_next(phead);
399
400 while (1) {
401 if (end_of_queue_search(phead, plist) == true)
402 break;
403
404 pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
405 if (is_same_network(&pnetwork->network, target))
406 break;
407 if ((oldest == ((struct wlan_network *)0)) ||
408 time_after((unsigned long)oldest->last_scanned,
409 (unsigned long)pnetwork->last_scanned))
410 oldest = pnetwork;
411
412 plist = get_next(plist);
413 }
414
415
416 /* If we didn't find a match, then get a new network slot to initialize
417 * with this beacon's information */
418 if (end_of_queue_search(phead, plist) == true) {
419 if (_queue_empty(&pmlmepriv->free_bss_pool) == true) {
420 /* If there are no more slots, expire the oldest */
421 pnetwork = oldest;
422 target->Rssi = (pnetwork->network.Rssi +
423 target->Rssi) / 2;
424 memcpy(&pnetwork->network, target,
425 r8712_get_ndis_wlan_bssid_ex_sz(target));
426 pnetwork->last_scanned = jiffies;
427 } else {
428 /* Otherwise just pull from the free list */
429 /* update scan_time */
430 pnetwork = alloc_network(pmlmepriv);
431 if (pnetwork == NULL)
432 return;
433 bssid_ex_sz = r8712_get_ndis_wlan_bssid_ex_sz(target);
434 target->Length = bssid_ex_sz;
435 memcpy(&pnetwork->network, target, bssid_ex_sz);
436 list_insert_tail(&pnetwork->list, &queue->queue);
437 }
438 } else {
439 /* we have an entry and we are going to update it. But
440 * this entry may be already expired. In this case we
441 * do the same as we found a new net and call the new_net
442 * handler
443 */
444 update_network(&pnetwork->network, target, adapter);
445 pnetwork->last_scanned = jiffies;
446 }
447}
448
449static void rtl8711_add_network(struct _adapter *adapter,
450 struct ndis_wlan_bssid_ex *pnetwork)
451{
452 unsigned long irqL;
453 struct mlme_priv *pmlmepriv = &(((struct _adapter *)adapter)->mlmepriv);
454 struct __queue *queue = &pmlmepriv->scanned_queue;
455
456 spin_lock_irqsave(&queue->lock, irqL);
457 update_current_network(adapter, pnetwork);
458 update_scanned_network(adapter, pnetwork);
459 spin_unlock_irqrestore(&queue->lock, irqL);
460}
461
462/*select the desired network based on the capability of the (i)bss.
463 * check items: (1) security
464 * (2) network_type
465 * (3) WMM
466 * (4) HT
467 * (5) others
468 */
469static int is_desired_network(struct _adapter *adapter,
470 struct wlan_network *pnetwork)
471{
472 u8 wps_ie[512];
473 uint wps_ielen;
474 int bselected = true;
475 struct security_priv *psecuritypriv = &adapter->securitypriv;
476
477 if (psecuritypriv->wps_phase == true) {
478 if (r8712_get_wps_ie(pnetwork->network.IEs,
479 pnetwork->network.IELength, wps_ie,
480 &wps_ielen) == true)
481 return true;
482 else
483 return false;
484 }
485 if ((psecuritypriv->PrivacyAlgrthm != _NO_PRIVACY_) &&
486 (pnetwork->network.Privacy == 0))
487 bselected = false;
488 return bselected;
489}
490
491/* TODO: Perry : For Power Management */
492void r8712_atimdone_event_callback(struct _adapter *adapter , u8 *pbuf)
493{
494}
495
496void r8712_survey_event_callback(struct _adapter *adapter, u8 *pbuf)
497{
498 unsigned long flags;
499 u32 len;
500 struct ndis_wlan_bssid_ex *pnetwork;
501 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
502
503 pnetwork = (struct ndis_wlan_bssid_ex *)pbuf;
504#ifdef __BIG_ENDIAN
505 /* endian_convert */
506 pnetwork->Length = le32_to_cpu(pnetwork->Length);
507 pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength);
508 pnetwork->Privacy = le32_to_cpu(pnetwork->Privacy);
509 pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi);
510 pnetwork->NetworkTypeInUse = le32_to_cpu(pnetwork->NetworkTypeInUse);
511 pnetwork->Configuration.ATIMWindow =
512 le32_to_cpu(pnetwork->Configuration.ATIMWindow);
513 pnetwork->Configuration.BeaconPeriod =
514 le32_to_cpu(pnetwork->Configuration.BeaconPeriod);
515 pnetwork->Configuration.DSConfig =
516 le32_to_cpu(pnetwork->Configuration.DSConfig);
517 pnetwork->Configuration.FHConfig.DwellTime =
518 le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime);
519 pnetwork->Configuration.FHConfig.HopPattern =
520 le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern);
521 pnetwork->Configuration.FHConfig.HopSet =
522 le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet);
523 pnetwork->Configuration.FHConfig.Length =
524 le32_to_cpu(pnetwork->Configuration.FHConfig.Length);
525 pnetwork->Configuration.Length =
526 le32_to_cpu(pnetwork->Configuration.Length);
527 pnetwork->InfrastructureMode =
528 le32_to_cpu(pnetwork->InfrastructureMode);
529 pnetwork->IELength = le32_to_cpu(pnetwork->IELength);
530#endif
531 len = r8712_get_ndis_wlan_bssid_ex_sz(pnetwork);
532 if (len > sizeof(struct wlan_bssid_ex))
533 return;
534 spin_lock_irqsave(&pmlmepriv->lock2, flags);
535 /* update IBSS_network 's timestamp */
536 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) {
537 if (!memcmp(&(pmlmepriv->cur_network.network.MacAddress),
538 pnetwork->MacAddress, ETH_ALEN)) {
539 struct wlan_network *ibss_wlan = NULL;
540
541 memcpy(pmlmepriv->cur_network.network.IEs,
542 pnetwork->IEs, 8);
543 ibss_wlan = r8712_find_network(
544 &pmlmepriv->scanned_queue,
545 pnetwork->MacAddress);
546 if (!ibss_wlan) {
547 memcpy(ibss_wlan->network.IEs,
548 pnetwork->IEs, 8);
549 goto exit;
550 }
551 }
552 }
553 /* lock pmlmepriv->lock when you accessing network_q */
554 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == false) {
555 if (pnetwork->Ssid.Ssid[0] != 0)
556 rtl8711_add_network(adapter, pnetwork);
557 else {
558 pnetwork->Ssid.SsidLength = 8;
559 memcpy(pnetwork->Ssid.Ssid, "<hidden>", 8);
560 rtl8711_add_network(adapter, pnetwork);
561 }
562 }
563exit:
564 spin_unlock_irqrestore(&pmlmepriv->lock2, flags);
565}
566
567void r8712_surveydone_event_callback(struct _adapter *adapter, u8 *pbuf)
568{
569 unsigned long irqL;
570 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
571
572 spin_lock_irqsave(&pmlmepriv->lock, irqL);
573
574 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) {
575 u8 timer_cancelled;
576
577 _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled);
578
579 _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
580 }
581
582 if (pmlmepriv->to_join == true) {
583 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)) {
584 if (check_fwstate(pmlmepriv, _FW_LINKED) == false) {
585 set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
586
587 if (r8712_select_and_join_from_scan(pmlmepriv)
588 == _SUCCESS)
589 _set_timer(&pmlmepriv->assoc_timer,
590 MAX_JOIN_TIMEOUT);
591 else {
592 struct wlan_bssid_ex *pdev_network =
593 &(adapter->registrypriv.dev_network);
594 u8 *pibss =
595 adapter->registrypriv.
596 dev_network.MacAddress;
597 pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;
598 memset(&pdev_network->Ssid, 0,
599 sizeof(struct
600 ndis_802_11_ssid));
601 memcpy(&pdev_network->Ssid,
602 &pmlmepriv->assoc_ssid,
603 sizeof(struct
604 ndis_802_11_ssid));
605 r8712_update_registrypriv_dev_network
606 (adapter);
607 r8712_generate_random_ibss(pibss);
608 pmlmepriv->fw_state =
609 WIFI_ADHOC_MASTER_STATE;
610 pmlmepriv->to_join = false;
611 }
612 }
613 } else {
614 pmlmepriv->to_join = false;
615 set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
616 if (r8712_select_and_join_from_scan(pmlmepriv) ==
617 _SUCCESS)
618 _set_timer(&pmlmepriv->assoc_timer,
619 MAX_JOIN_TIMEOUT);
620 else
621 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
622 }
623 }
624 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
625}
626
627/*
628 *r8712_free_assoc_resources: the caller has to lock pmlmepriv->lock
629 */
630void r8712_free_assoc_resources(struct _adapter *adapter)
631{
632 unsigned long irqL;
633 struct wlan_network *pwlan = NULL;
634 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
635 struct sta_priv *pstapriv = &adapter->stapriv;
636 struct wlan_network *tgt_network = &pmlmepriv->cur_network;
637
638 pwlan = r8712_find_network(&pmlmepriv->scanned_queue,
639 tgt_network->network.MacAddress);
640
641 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE)) {
642 struct sta_info *psta;
643
644 psta = r8712_get_stainfo(&adapter->stapriv,
645 tgt_network->network.MacAddress);
646
647 spin_lock_irqsave(&pstapriv->sta_hash_lock, irqL);
648 r8712_free_stainfo(adapter, psta);
649 spin_unlock_irqrestore(&pstapriv->sta_hash_lock, irqL);
650 }
651
652 if (check_fwstate(pmlmepriv,
653 WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE))
654 r8712_free_all_stainfo(adapter);
655 if (pwlan)
656 pwlan->fixed = false;
657
658 if (((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) &&
659 (adapter->stapriv.asoc_sta_count == 1)))
660 free_network_nolock(pmlmepriv, pwlan);
661}
662
663/*
664*r8712_indicate_connect: the caller has to lock pmlmepriv->lock
665*/
666void r8712_indicate_connect(struct _adapter *padapter)
667{
668 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
669
670 pmlmepriv->to_join = false;
671 set_fwstate(pmlmepriv, _FW_LINKED);
672 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_LINK);
673 r8712_os_indicate_connect(padapter);
674 if (padapter->registrypriv.power_mgnt > PS_MODE_ACTIVE)
675 _set_timer(&pmlmepriv->dhcp_timer, 60000);
676}
677
678
679/*
680*r8712_ind_disconnect: the caller has to lock pmlmepriv->lock
681*/
682void r8712_ind_disconnect(struct _adapter *padapter)
683{
684 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
685
686 _clr_fwstate_(pmlmepriv, _FW_LINKED);
687 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_NO_LINK);
688 r8712_os_indicate_disconnect(padapter);
689 if (padapter->pwrctrlpriv.pwr_mode !=
690 padapter->registrypriv.power_mgnt) {
691 _cancel_timer_ex(&pmlmepriv->dhcp_timer);
692 r8712_set_ps_mode(padapter, padapter->registrypriv.power_mgnt,
693 padapter->registrypriv.smart_ps);
694 }
695}
696
697/*Notes:
698 *pnetwork : returns from r8712_joinbss_event_callback
699 *ptarget_wlan: found from scanned_queue
700 *if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if
701 * "ptarget_sta" & "ptarget_wlan" exist.
702 *if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check
703 * if "ptarget_wlan" exist.
704 *if join_res > 0, update "cur_network->network" from
705 * "pnetwork->network" if (ptarget_wlan !=NULL).
706 */
707void r8712_joinbss_event_callback(struct _adapter *adapter, u8 *pbuf)
708{
709 unsigned long irqL = 0, irqL2;
710 u8 timer_cancelled;
711 struct sta_info *ptarget_sta = NULL, *pcur_sta = NULL;
712 struct sta_priv *pstapriv = &adapter->stapriv;
713 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
714 struct wlan_network *cur_network = &pmlmepriv->cur_network;
715 struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL;
716 unsigned int the_same_macaddr = false;
717 struct wlan_network *pnetwork;
718
719 if (sizeof(struct list_head) == 4 * sizeof(u32)) {
720 pnetwork = (struct wlan_network *)
721 _malloc(sizeof(struct wlan_network));
722 memcpy((u8 *)pnetwork+16, (u8 *)pbuf + 8,
723 sizeof(struct wlan_network) - 16);
724 } else
725 pnetwork = (struct wlan_network *)pbuf;
726
727#ifdef __BIG_ENDIAN
728 /* endian_convert */
729 pnetwork->join_res = le32_to_cpu(pnetwork->join_res);
730 pnetwork->network_type = le32_to_cpu(pnetwork->network_type);
731 pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length);
732 pnetwork->network.Ssid.SsidLength =
733 le32_to_cpu(pnetwork->network.Ssid.SsidLength);
734 pnetwork->network.Privacy = le32_to_cpu(pnetwork->network.Privacy);
735 pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi);
736 pnetwork->network.NetworkTypeInUse =
737 le32_to_cpu(pnetwork->network.NetworkTypeInUse);
738 pnetwork->network.Configuration.ATIMWindow =
739 le32_to_cpu(pnetwork->network.Configuration.ATIMWindow);
740 pnetwork->network.Configuration.BeaconPeriod =
741 le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod);
742 pnetwork->network.Configuration.DSConfig =
743 le32_to_cpu(pnetwork->network.Configuration.DSConfig);
744 pnetwork->network.Configuration.FHConfig.DwellTime =
745 le32_to_cpu(pnetwork->network.Configuration.FHConfig.
746 DwellTime);
747 pnetwork->network.Configuration.FHConfig.HopPattern =
748 le32_to_cpu(pnetwork->network.Configuration.
749 FHConfig.HopPattern);
750 pnetwork->network.Configuration.FHConfig.HopSet =
751 le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet);
752 pnetwork->network.Configuration.FHConfig.Length =
753 le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length);
754 pnetwork->network.Configuration.Length =
755 le32_to_cpu(pnetwork->network.Configuration.Length);
756 pnetwork->network.InfrastructureMode =
757 le32_to_cpu(pnetwork->network.InfrastructureMode);
758 pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength);
759#endif
760
761 the_same_macaddr = !memcmp(pnetwork->network.MacAddress,
762 cur_network->network.MacAddress, ETH_ALEN);
763 pnetwork->network.Length =
764 r8712_get_ndis_wlan_bssid_ex_sz(&pnetwork->network);
765 spin_lock_irqsave(&pmlmepriv->lock, irqL);
766 if (pnetwork->network.Length > sizeof(struct wlan_bssid_ex))
767 goto ignore_joinbss_callback;
768 if (pnetwork->join_res > 0) {
769 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true) {
770 /*s1. find ptarget_wlan*/
771 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
772 if (the_same_macaddr == true)
773 ptarget_wlan =
774 r8712_find_network(&pmlmepriv->
775 scanned_queue,
776 cur_network->network.MacAddress);
777 else {
778 pcur_wlan =
779 r8712_find_network(&pmlmepriv->
780 scanned_queue,
781 cur_network->network.MacAddress);
782 pcur_wlan->fixed = false;
783
784 pcur_sta = r8712_get_stainfo(pstapriv,
785 cur_network->network.MacAddress);
786 spin_lock_irqsave(&pstapriv->
787 sta_hash_lock, irqL2);
788 r8712_free_stainfo(adapter, pcur_sta);
789 spin_unlock_irqrestore(&(pstapriv->
790 sta_hash_lock), irqL2);
791
792 ptarget_wlan =
793 r8712_find_network(&pmlmepriv->
794 scanned_queue,
795 pnetwork->network.
796 MacAddress);
797 if (ptarget_wlan)
798 ptarget_wlan->fixed = true;
799 }
800 } else {
801 ptarget_wlan = r8712_find_network(&pmlmepriv->
802 scanned_queue,
803 pnetwork->network.MacAddress);
804 if (ptarget_wlan)
805 ptarget_wlan->fixed = true;
806 }
807
808 if (ptarget_wlan == NULL) {
809 if (check_fwstate(pmlmepriv,
810 _FW_UNDER_LINKING))
811 pmlmepriv->fw_state ^=
812 _FW_UNDER_LINKING;
813 goto ignore_joinbss_callback;
814 }
815
816 /*s2. find ptarget_sta & update ptarget_sta*/
817 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
818 if (the_same_macaddr == true) {
819 ptarget_sta =
820 r8712_get_stainfo(pstapriv,
821 pnetwork->network.MacAddress);
822 if (ptarget_sta == NULL)
823 ptarget_sta =
824 r8712_alloc_stainfo(pstapriv,
825 pnetwork->network.MacAddress);
826 } else
827 ptarget_sta =
828 r8712_alloc_stainfo(pstapriv,
829 pnetwork->network.MacAddress);
830 if (ptarget_sta) /*update ptarget_sta*/ {
831 ptarget_sta->aid = pnetwork->join_res;
832 ptarget_sta->qos_option = 1;
833 ptarget_sta->mac_id = 5;
834 if (adapter->securitypriv.
835 AuthAlgrthm == 2) {
836 adapter->securitypriv.
837 binstallGrpkey =
838 false;
839 adapter->securitypriv.
840 busetkipkey =
841 false;
842 adapter->securitypriv.
843 bgrpkey_handshake =
844 false;
845 ptarget_sta->ieee8021x_blocked
846 = true;
847 ptarget_sta->XPrivacy =
848 adapter->securitypriv.
849 PrivacyAlgrthm;
850 memset((u8 *)&ptarget_sta->
851 x_UncstKey,
852 0,
853 sizeof(union Keytype));
854 memset((u8 *)&ptarget_sta->
855 tkiprxmickey,
856 0,
857 sizeof(union Keytype));
858 memset((u8 *)&ptarget_sta->
859 tkiptxmickey,
860 0,
861 sizeof(union Keytype));
862 memset((u8 *)&ptarget_sta->
863 txpn, 0,
864 sizeof(union pn48));
865 memset((u8 *)&ptarget_sta->
866 rxpn, 0,
867 sizeof(union pn48));
868 }
869 } else {
870 if (check_fwstate(pmlmepriv,
871 _FW_UNDER_LINKING))
872 pmlmepriv->fw_state ^=
873 _FW_UNDER_LINKING;
874 goto ignore_joinbss_callback;
875 }
876 }
877
878 /*s3. update cur_network & indicate connect*/
879 memcpy(&cur_network->network, &pnetwork->network,
880 pnetwork->network.Length);
881 cur_network->aid = pnetwork->join_res;
882 /*update fw_state will clr _FW_UNDER_LINKING*/
883 switch (pnetwork->network.InfrastructureMode) {
884 case Ndis802_11Infrastructure:
885 pmlmepriv->fw_state = WIFI_STATION_STATE;
886 break;
887 case Ndis802_11IBSS:
888 pmlmepriv->fw_state = WIFI_ADHOC_STATE;
889 break;
890 default:
891 pmlmepriv->fw_state = WIFI_NULL_STATE;
892 break;
893 }
894 r8712_update_protection(adapter,
895 (cur_network->network.IEs) +
896 sizeof(struct NDIS_802_11_FIXED_IEs),
897 (cur_network->network.IELength));
898 /*TODO: update HT_Capability*/
899 update_ht_cap(adapter, cur_network->network.IEs,
900 cur_network->network.IELength);
901 /*indicate connect*/
902 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)
903 == true)
904 r8712_indicate_connect(adapter);
905 _cancel_timer(&pmlmepriv->assoc_timer,
906 &timer_cancelled);
907 } else
908 goto ignore_joinbss_callback;
909 } else {
910 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true) {
911 _set_timer(&pmlmepriv->assoc_timer, 1);
912 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
913 }
914 }
915ignore_joinbss_callback:
916 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
917 if (sizeof(struct list_head) == 4 * sizeof(u32))
918 kfree((u8 *)pnetwork);
919}
920
921void r8712_stassoc_event_callback(struct _adapter *adapter, u8 *pbuf)
922{
923 unsigned long irqL;
924 struct sta_info *psta;
925 struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
926 struct stassoc_event *pstassoc = (struct stassoc_event *)pbuf;
927
928 /* to do: */
929 if (r8712_access_ctrl(&adapter->acl_list, pstassoc->macaddr) == false)
930 return;
931 psta = r8712_get_stainfo(&adapter->stapriv, pstassoc->macaddr);
932 if (psta != NULL) {
933 /*the sta have been in sta_info_queue => do nothing
934 *(between drv has received this event before and
935 * fw have not yet to set key to CAM_ENTRY) */
936 return;
937 }
938
939 psta = r8712_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr);
940 if (psta == NULL)
941 return;
942 /* to do : init sta_info variable */
943 psta->qos_option = 0;
944 psta->mac_id = le32_to_cpu((uint)pstassoc->cam_id);
945 /* psta->aid = (uint)pstassoc->cam_id; */
946
947 if (adapter->securitypriv.AuthAlgrthm == 2)
948 psta->XPrivacy = adapter->securitypriv.PrivacyAlgrthm;
949 psta->ieee8021x_blocked = false;
950 spin_lock_irqsave(&pmlmepriv->lock, irqL);
951 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) ||
952 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)) {
953 if (adapter->stapriv.asoc_sta_count == 2) {
954 /* a sta + bc/mc_stainfo (not Ibss_stainfo) */
955 r8712_indicate_connect(adapter);
956 }
957 }
958 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
959}
960
961void r8712_stadel_event_callback(struct _adapter *adapter, u8 *pbuf)
962{
963 unsigned long irqL, irqL2;
964 struct sta_info *psta;
965 struct wlan_network *pwlan = NULL;
966 struct wlan_bssid_ex *pdev_network = NULL;
967 u8 *pibss = NULL;
968 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
969 struct stadel_event *pstadel = (struct stadel_event *)pbuf;
970 struct sta_priv *pstapriv = &adapter->stapriv;
971 struct wlan_network *tgt_network = &pmlmepriv->cur_network;
972
973 spin_lock_irqsave(&pmlmepriv->lock, irqL2);
974 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) {
975 r8712_ind_disconnect(adapter);
976 r8712_free_assoc_resources(adapter);
977 }
978 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE |
979 WIFI_ADHOC_STATE)) {
980 psta = r8712_get_stainfo(&adapter->stapriv, pstadel->macaddr);
981 spin_lock_irqsave(&pstapriv->sta_hash_lock, irqL);
982 r8712_free_stainfo(adapter, psta);
983 spin_unlock_irqrestore(&pstapriv->sta_hash_lock, irqL);
984 if (adapter->stapriv.asoc_sta_count == 1) {
985 /*a sta + bc/mc_stainfo (not Ibss_stainfo) */
986 pwlan = r8712_find_network(&pmlmepriv->scanned_queue,
987 tgt_network->network.MacAddress);
988 if (pwlan) {
989 pwlan->fixed = false;
990 free_network_nolock(pmlmepriv, pwlan);
991 }
992 /*re-create ibss*/
993 pdev_network = &(adapter->registrypriv.dev_network);
994 pibss = adapter->registrypriv.dev_network.MacAddress;
995 memcpy(pdev_network, &tgt_network->network,
996 r8712_get_ndis_wlan_bssid_ex_sz(&tgt_network->
997 network));
998 memset(&pdev_network->Ssid, 0,
999 sizeof(struct ndis_802_11_ssid));
1000 memcpy(&pdev_network->Ssid,
1001 &pmlmepriv->assoc_ssid,
1002 sizeof(struct ndis_802_11_ssid));
1003 r8712_update_registrypriv_dev_network(adapter);
1004 r8712_generate_random_ibss(pibss);
1005 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
1006 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE);
1007 set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
1008 }
1009 }
1010 }
1011 spin_unlock_irqrestore(&pmlmepriv->lock, irqL2);
1012}
1013
1014void r8712_cpwm_event_callback(struct _adapter *adapter, u8 *pbuf)
1015{
1016 struct reportpwrstate_parm *preportpwrstate =
1017 (struct reportpwrstate_parm *)pbuf;
1018
1019 preportpwrstate->state |= (u8)(adapter->pwrctrlpriv.cpwm_tog + 0x80);
1020 r8712_cpwm_int_hdl(adapter, preportpwrstate);
1021}
1022
1023/* When the Netgear 3500 AP is with WPA2PSK-AES mode, it will send
1024 * the ADDBA req frame with start seq control = 0 to wifi client after
1025 * the WPA handshake and the seqence number of following data packet
1026 * will be 0. In this case, the Rx reorder sequence is not longer than 0
1027 * and the WiFi client will drop the data with seq number 0.
1028 * So, the 8712 firmware has to inform driver with receiving the
1029 * ADDBA-Req frame so that the driver can reset the
1030 * sequence value of Rx reorder contorl.
1031 */
1032void r8712_got_addbareq_event_callback(struct _adapter *adapter, u8 *pbuf)
1033{
1034 struct ADDBA_Req_Report_parm *pAddbareq_pram =
1035 (struct ADDBA_Req_Report_parm *)pbuf;
1036 struct sta_info *psta;
1037 struct sta_priv *pstapriv = &adapter->stapriv;
1038 struct recv_reorder_ctrl *precvreorder_ctrl = NULL;
1039 struct __queue *ppending_recvframe_queue = NULL;
1040 unsigned long irql;
1041
1042 printk(KERN_INFO "r8712u: [%s] mac = %pM, seq = %d, tid = %d\n",
1043 __func__, pAddbareq_pram->MacAddress,
1044 pAddbareq_pram->StartSeqNum, pAddbareq_pram->tid);
1045 psta = r8712_get_stainfo(pstapriv, pAddbareq_pram->MacAddress);
1046 precvreorder_ctrl = &psta->recvreorder_ctrl[pAddbareq_pram->tid];
1047 ppending_recvframe_queue = &precvreorder_ctrl->pending_recvframe_queue;
1048 spin_lock_irqsave(&ppending_recvframe_queue->lock, irql);
1049 r8712_recv_indicatepkts_in_order(adapter, precvreorder_ctrl, true);
1050 spin_unlock_irqrestore(&ppending_recvframe_queue->lock, irql);
1051 /* set the indicate_seq to 0xffff so that the rx reorder can store
1052 * any following data packet.*/
1053 precvreorder_ctrl->indicate_seq = 0xffff;
1054}
1055
1056void r8712_wpspbc_event_callback(struct _adapter *adapter, u8 *pbuf)
1057{
1058 if (adapter->securitypriv.wps_hw_pbc_pressed == false)
1059 adapter->securitypriv.wps_hw_pbc_pressed = true;
1060}
1061
1062void _r8712_sitesurvey_ctrl_handler(struct _adapter *adapter)
1063{
1064 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1065 struct sitesurvey_ctrl *psitesurveyctrl = &pmlmepriv->sitesurveyctrl;
1066 struct registry_priv *pregistrypriv = &adapter->registrypriv;
1067 u64 current_tx_pkts;
1068 uint current_rx_pkts;
1069
1070 current_tx_pkts = (adapter->xmitpriv.tx_pkts) -
1071 (psitesurveyctrl->last_tx_pkts);
1072 current_rx_pkts = (adapter->recvpriv.rx_pkts) -
1073 (psitesurveyctrl->last_rx_pkts);
1074 psitesurveyctrl->last_tx_pkts = adapter->xmitpriv.tx_pkts;
1075 psitesurveyctrl->last_rx_pkts = adapter->recvpriv.rx_pkts;
1076 if ((current_tx_pkts > pregistrypriv->busy_thresh) ||
1077 (current_rx_pkts > pregistrypriv->busy_thresh))
1078 psitesurveyctrl->traffic_busy = true;
1079 else
1080 psitesurveyctrl->traffic_busy = false;
1081}
1082
1083void _r8712_join_timeout_handler(struct _adapter *adapter)
1084{
1085 unsigned long irqL;
1086 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1087
1088 if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
1089 return;
1090 spin_lock_irqsave(&pmlmepriv->lock, irqL);
1091 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
1092 pmlmepriv->to_join = false;
1093 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
1094 r8712_os_indicate_disconnect(adapter);
1095 _clr_fwstate_(pmlmepriv, _FW_LINKED);
1096 }
1097 if (adapter->pwrctrlpriv.pwr_mode != adapter->registrypriv.power_mgnt) {
1098 r8712_set_ps_mode(adapter, adapter->registrypriv.power_mgnt,
1099 adapter->registrypriv.smart_ps);
1100 }
1101 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
1102}
1103
1104void r8712_scan_timeout_handler (struct _adapter *adapter)
1105{
1106 unsigned long irqL;
1107 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1108
1109 spin_lock_irqsave(&pmlmepriv->lock, irqL);
1110 _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
1111 pmlmepriv->to_join = false; /* scan fail, so clear to_join flag */
1112 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
1113}
1114
1115void _r8712_dhcp_timeout_handler (struct _adapter *adapter)
1116{
1117 if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
1118 return;
1119 if (adapter->pwrctrlpriv.pwr_mode != adapter->registrypriv.power_mgnt)
1120 r8712_set_ps_mode(adapter, adapter->registrypriv.power_mgnt,
1121 adapter->registrypriv.smart_ps);
1122}
1123
1124void _r8712_wdg_timeout_handler(struct _adapter *adapter)
1125{
1126 r8712_wdg_wk_cmd(adapter);
1127}
1128
1129int r8712_select_and_join_from_scan(struct mlme_priv *pmlmepriv)
1130{
1131 struct list_head *phead;
1132 unsigned char *dst_ssid, *src_ssid;
1133 struct _adapter *adapter;
1134 struct __queue *queue = NULL;
1135 struct wlan_network *pnetwork = NULL;
1136 struct wlan_network *pnetwork_max_rssi = NULL;
1137
1138 adapter = (struct _adapter *)pmlmepriv->nic_hdl;
1139 queue = &pmlmepriv->scanned_queue;
1140 phead = get_list_head(queue);
1141 pmlmepriv->pscanned = get_next(phead);
1142 while (1) {
1143 if (end_of_queue_search(phead, pmlmepriv->pscanned) == true) {
1144 if ((pmlmepriv->assoc_by_rssi == true) &&
1145 (pnetwork_max_rssi != NULL)) {
1146 pnetwork = pnetwork_max_rssi;
1147 goto ask_for_joinbss;
1148 }
1149 return _FAIL;
1150 }
1151 pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned,
1152 struct wlan_network, list);
1153 if (pnetwork == NULL)
1154 return _FAIL;
1155 pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
1156 if (pmlmepriv->assoc_by_bssid == true) {
1157 dst_ssid = pnetwork->network.MacAddress;
1158 src_ssid = pmlmepriv->assoc_bssid;
1159 if (!memcmp(dst_ssid, src_ssid, ETH_ALEN)) {
1160 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
1161 if (is_same_network(&pmlmepriv->
1162 cur_network.network,
1163 &pnetwork->network)) {
1164 _clr_fwstate_(pmlmepriv,
1165 _FW_UNDER_LINKING);
1166 /*r8712_indicate_connect again*/
1167 r8712_indicate_connect(adapter);
1168 return 2;
1169 }
1170 r8712_disassoc_cmd(adapter);
1171 r8712_ind_disconnect(adapter);
1172 r8712_free_assoc_resources(adapter);
1173 }
1174 goto ask_for_joinbss;
1175 }
1176 } else if (pmlmepriv->assoc_ssid.SsidLength == 0)
1177 goto ask_for_joinbss;
1178 dst_ssid = pnetwork->network.Ssid.Ssid;
1179 src_ssid = pmlmepriv->assoc_ssid.Ssid;
1180 if ((pnetwork->network.Ssid.SsidLength ==
1181 pmlmepriv->assoc_ssid.SsidLength) &&
1182 (!memcmp(dst_ssid, src_ssid,
1183 pmlmepriv->assoc_ssid.SsidLength))) {
1184 if (pmlmepriv->assoc_by_rssi == true) {
1185 /* if the ssid is the same, select the bss
1186 * which has the max rssi*/
1187 if (pnetwork_max_rssi) {
1188 if (pnetwork->network.Rssi >
1189 pnetwork_max_rssi->network.Rssi)
1190 pnetwork_max_rssi = pnetwork;
1191 } else
1192 pnetwork_max_rssi = pnetwork;
1193 } else if (is_desired_network(adapter, pnetwork)) {
1194 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
1195 r8712_disassoc_cmd(adapter);
1196 r8712_free_assoc_resources(adapter);
1197 }
1198 goto ask_for_joinbss;
1199 }
1200 }
1201 }
1202 return _FAIL;
1203ask_for_joinbss:
1204 return r8712_joinbss_cmd(adapter, pnetwork);
1205}
1206
1207sint r8712_set_auth(struct _adapter *adapter,
1208 struct security_priv *psecuritypriv)
1209{
1210 struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
1211 struct cmd_obj *pcmd;
1212 struct setauth_parm *psetauthparm;
1213 sint ret = _SUCCESS;
1214
1215 pcmd = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
1216 if (pcmd == NULL)
1217 return _FAIL;
1218
1219 psetauthparm = (struct setauth_parm *)_malloc(
1220 sizeof(struct setauth_parm));
1221 if (psetauthparm == NULL) {
1222 kfree((unsigned char *)pcmd);
1223 return _FAIL;
1224 }
1225 memset(psetauthparm, 0, sizeof(struct setauth_parm));
1226 psetauthparm->mode = (u8)psecuritypriv->AuthAlgrthm;
1227 pcmd->cmdcode = _SetAuth_CMD_;
1228 pcmd->parmbuf = (unsigned char *)psetauthparm;
1229 pcmd->cmdsz = sizeof(struct setauth_parm);
1230 pcmd->rsp = NULL;
1231 pcmd->rspsz = 0;
1232 _init_listhead(&pcmd->list);
1233 r8712_enqueue_cmd(pcmdpriv, pcmd);
1234 return ret;
1235}
1236
1237sint r8712_set_key(struct _adapter *adapter,
1238 struct security_priv *psecuritypriv,
1239 sint keyid)
1240{
1241 struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
1242 struct cmd_obj *pcmd;
1243 struct setkey_parm *psetkeyparm;
1244 u8 keylen;
1245
1246 pcmd = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
1247 if (pcmd == NULL)
1248 return _FAIL;
1249 psetkeyparm = (struct setkey_parm *)_malloc(sizeof(struct setkey_parm));
1250 if (psetkeyparm == NULL) {
1251 kfree((unsigned char *)pcmd);
1252 return _FAIL;
1253 }
1254 memset(psetkeyparm, 0, sizeof(struct setkey_parm));
1255 if (psecuritypriv->AuthAlgrthm == 2) { /* 802.1X */
1256 psetkeyparm->algorithm =
1257 (u8)psecuritypriv->XGrpPrivacy;
1258 } else { /* WEP */
1259 psetkeyparm->algorithm =
1260 (u8)psecuritypriv->PrivacyAlgrthm;
1261 }
1262 psetkeyparm->keyid = (u8)keyid;
1263
1264 switch (psetkeyparm->algorithm) {
1265 case _WEP40_:
1266 keylen = 5;
1267 memcpy(psetkeyparm->key,
1268 psecuritypriv->DefKey[keyid].skey, keylen);
1269 break;
1270 case _WEP104_:
1271 keylen = 13;
1272 memcpy(psetkeyparm->key,
1273 psecuritypriv->DefKey[keyid].skey, keylen);
1274 break;
1275 case _TKIP_:
1276 keylen = 16;
1277 memcpy(psetkeyparm->key,
1278 &psecuritypriv->XGrpKey[keyid - 1], keylen);
1279 psetkeyparm->grpkey = 1;
1280 break;
1281 case _AES_:
1282 keylen = 16;
1283 memcpy(psetkeyparm->key,
1284 &psecuritypriv->XGrpKey[keyid - 1], keylen);
1285 psetkeyparm->grpkey = 1;
1286 break;
1287 default:
1288 return _FAIL;
1289 }
1290 pcmd->cmdcode = _SetKey_CMD_;
1291 pcmd->parmbuf = (u8 *)psetkeyparm;
1292 pcmd->cmdsz = (sizeof(struct setkey_parm));
1293 pcmd->rsp = NULL;
1294 pcmd->rspsz = 0;
1295 _init_listhead(&pcmd->list);
1296 r8712_enqueue_cmd(pcmdpriv, pcmd);
1297 return _SUCCESS;
1298}
1299
1300/* adjust IEs for r8712_joinbss_cmd in WMM */
1301int r8712_restruct_wmm_ie(struct _adapter *adapter, u8 *in_ie, u8 *out_ie,
1302 uint in_len, uint initial_out_len)
1303{
1304 unsigned int ielength = 0;
1305 unsigned int i, j;
1306
1307 i = 12; /* after the fixed IE */
1308 while (i < in_len) {
1309 ielength = initial_out_len;
1310 if (in_ie[i] == 0xDD && in_ie[i + 2] == 0x00 &&
1311 in_ie[i + 3] == 0x50 && in_ie[i + 4] == 0xF2 &&
1312 in_ie[i + 5] == 0x02 && i + 5 < in_len) {
1313 /*WMM element ID and OUI*/
1314 for (j = i; j < i + 9; j++) {
1315 out_ie[ielength] = in_ie[j];
1316 ielength++;
1317 }
1318 out_ie[initial_out_len + 1] = 0x07;
1319 out_ie[initial_out_len + 6] = 0x00;
1320 out_ie[initial_out_len + 8] = 0x00;
1321 break;
1322 }
1323 i += (in_ie[i + 1] + 2); /* to the next IE element */
1324 }
1325 return ielength;
1326}
1327
1328/*
1329 * Ported from 8185: IsInPreAuthKeyList().
1330 *
1331 * Search by BSSID,
1332 * Return Value:
1333 * -1 :if there is no pre-auth key in the table
1334 * >=0 :if there is pre-auth key, and return the entry id
1335 */
1336static int SecIsInPMKIDList(struct _adapter *Adapter, u8 *bssid)
1337{
1338 struct security_priv *psecuritypriv = &Adapter->securitypriv;
1339 int i = 0;
1340
1341 do {
1342 if (psecuritypriv->PMKIDList[i].bUsed &&
1343 (!memcmp(psecuritypriv->PMKIDList[i].Bssid,
1344 bssid, ETH_ALEN)))
1345 break;
1346 else
1347 i++;
1348 } while (i < NUM_PMKID_CACHE);
1349
1350 if (i == NUM_PMKID_CACHE) {
1351 i = -1; /* Could not find. */
1352 } else {
1353 ; /* There is one Pre-Authentication Key for the
1354 * specific BSSID. */
1355 }
1356 return i;
1357}
1358
1359sint r8712_restruct_sec_ie(struct _adapter *adapter, u8 *in_ie,
1360 u8 *out_ie, uint in_len)
1361{
1362 u8 authmode = 0, securitytype, match;
1363 u8 sec_ie[255], uncst_oui[4], bkup_ie[255];
1364 u8 wpa_oui[4] = {0x0, 0x50, 0xf2, 0x01};
1365 uint ielength, cnt, remove_cnt;
1366 int iEntry;
1367 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1368 struct security_priv *psecuritypriv = &adapter->securitypriv;
1369 uint ndisauthmode = psecuritypriv->ndisauthtype;
1370 uint ndissecuritytype = psecuritypriv->ndisencryptstatus;
1371
1372 if ((ndisauthmode == Ndis802_11AuthModeWPA) ||
1373 (ndisauthmode == Ndis802_11AuthModeWPAPSK)) {
1374 authmode = _WPA_IE_ID_;
1375 uncst_oui[0] = 0x0;
1376 uncst_oui[1] = 0x50;
1377 uncst_oui[2] = 0xf2;
1378 }
1379 if ((ndisauthmode == Ndis802_11AuthModeWPA2) ||
1380 (ndisauthmode == Ndis802_11AuthModeWPA2PSK)) {
1381 authmode = _WPA2_IE_ID_;
1382 uncst_oui[0] = 0x0;
1383 uncst_oui[1] = 0x0f;
1384 uncst_oui[2] = 0xac;
1385 }
1386 switch (ndissecuritytype) {
1387 case Ndis802_11Encryption1Enabled:
1388 case Ndis802_11Encryption1KeyAbsent:
1389 securitytype = _WEP40_;
1390 uncst_oui[3] = 0x1;
1391 break;
1392 case Ndis802_11Encryption2Enabled:
1393 case Ndis802_11Encryption2KeyAbsent:
1394 securitytype = _TKIP_;
1395 uncst_oui[3] = 0x2;
1396 break;
1397 case Ndis802_11Encryption3Enabled:
1398 case Ndis802_11Encryption3KeyAbsent:
1399 securitytype = _AES_;
1400 uncst_oui[3] = 0x4;
1401 break;
1402 default:
1403 securitytype = _NO_PRIVACY_;
1404 break;
1405 }
1406 /*Search required WPA or WPA2 IE and copy to sec_ie[] */
1407 cnt = 12;
1408 match = false;
1409 while (cnt < in_len) {
1410 if (in_ie[cnt] == authmode) {
1411 if ((authmode == _WPA_IE_ID_) &&
1412 (!memcmp(&in_ie[cnt+2], &wpa_oui[0], 4))) {
1413 memcpy(&sec_ie[0], &in_ie[cnt],
1414 in_ie[cnt + 1] + 2);
1415 match = true;
1416 break;
1417 }
1418 if (authmode == _WPA2_IE_ID_) {
1419 memcpy(&sec_ie[0], &in_ie[cnt],
1420 in_ie[cnt + 1] + 2);
1421 match = true;
1422 break;
1423 }
1424 if (((authmode == _WPA_IE_ID_) &&
1425 (!memcmp(&in_ie[cnt + 2], &wpa_oui[0], 4))) ||
1426 (authmode == _WPA2_IE_ID_))
1427 memcpy(&bkup_ie[0], &in_ie[cnt],
1428 in_ie[cnt + 1] + 2);
1429 }
1430 cnt += in_ie[cnt+1] + 2; /*get next*/
1431 }
1432 /*restruct WPA IE or WPA2 IE in sec_ie[] */
1433 if (match == true) {
1434 if (sec_ie[0] == _WPA_IE_ID_) {
1435 /* parsing SSN IE to select required encryption
1436 * algorithm, and set the bc/mc encryption algorithm */
1437 while (true) {
1438 /*check wpa_oui tag*/
1439 if (memcmp(&sec_ie[2], &wpa_oui[0], 4)) {
1440 match = false;
1441 break;
1442 }
1443 if ((sec_ie[6] != 0x01) || (sec_ie[7] != 0x0)) {
1444 /*IE Ver error*/
1445 match = false;
1446 break;
1447 }
1448 if (!memcmp(&sec_ie[8], &wpa_oui[0], 3)) {
1449 /* get bc/mc encryption type (group
1450 * key type)*/
1451 switch (sec_ie[11]) {
1452 case 0x0: /*none*/
1453 psecuritypriv->XGrpPrivacy =
1454 _NO_PRIVACY_;
1455 break;
1456 case 0x1: /*WEP_40*/
1457 psecuritypriv->XGrpPrivacy =
1458 _WEP40_;
1459 break;
1460 case 0x2: /*TKIP*/
1461 psecuritypriv->XGrpPrivacy =
1462 _TKIP_;
1463 break;
1464 case 0x3: /*AESCCMP*/
1465 case 0x4:
1466 psecuritypriv->XGrpPrivacy =
1467 _AES_;
1468 break;
1469 case 0x5: /*WEP_104*/
1470 psecuritypriv->XGrpPrivacy =
1471 _WEP104_;
1472 break;
1473 }
1474 } else {
1475 match = false;
1476 break;
1477 }
1478 if (sec_ie[12] == 0x01) {
1479 /*check the unicast encryption type*/
1480 if (memcmp(&sec_ie[14],
1481 &uncst_oui[0], 4)) {
1482 match = false;
1483 break;
1484
1485 } /*else the uncst_oui is match*/
1486 } else { /*mixed mode, unicast_enc_type > 1*/
1487 /*select the uncst_oui and remove
1488 * the other uncst_oui*/
1489 cnt = sec_ie[12];
1490 remove_cnt = (cnt-1) * 4;
1491 sec_ie[12] = 0x01;
1492 memcpy(&sec_ie[14], &uncst_oui[0], 4);
1493 /*remove the other unicast suit*/
1494 memcpy(&sec_ie[18],
1495 &sec_ie[18 + remove_cnt],
1496 sec_ie[1] - 18 + 2 -
1497 remove_cnt);
1498 sec_ie[1] = sec_ie[1] - remove_cnt;
1499 }
1500 break;
1501 }
1502 }
1503 if (authmode == _WPA2_IE_ID_) {
1504 /* parsing RSN IE to select required encryption
1505 * algorithm, and set the bc/mc encryption algorithm */
1506 while (true) {
1507 if ((sec_ie[2] != 0x01) || (sec_ie[3] != 0x0)) {
1508 /*IE Ver error*/
1509 match = false;
1510 break;
1511 }
1512 if (!memcmp(&sec_ie[4], &uncst_oui[0], 3)) {
1513 /*get bc/mc encryption type*/
1514 switch (sec_ie[7]) {
1515 case 0x1: /*WEP_40*/
1516 psecuritypriv->XGrpPrivacy =
1517 _WEP40_;
1518 break;
1519 case 0x2: /*TKIP*/
1520 psecuritypriv->XGrpPrivacy =
1521 _TKIP_;
1522 break;
1523 case 0x4: /*AESWRAP*/
1524 psecuritypriv->XGrpPrivacy =
1525 _AES_;
1526 break;
1527 case 0x5: /*WEP_104*/
1528 psecuritypriv->XGrpPrivacy =
1529 _WEP104_;
1530 break;
1531 default: /*one*/
1532 psecuritypriv->XGrpPrivacy =
1533 _NO_PRIVACY_;
1534 break;
1535 }
1536 } else {
1537 match = false;
1538 break;
1539 }
1540 if (sec_ie[8] == 0x01) {
1541 /*check the unicast encryption type*/
1542 if (memcmp(&sec_ie[10],
1543 &uncst_oui[0], 4)) {
1544 match = false;
1545 break;
1546 } /*else the uncst_oui is match*/
1547 } else { /*mixed mode, unicast_enc_type > 1*/
1548 /*select the uncst_oui and remove the
1549 * other uncst_oui*/
1550 cnt = sec_ie[8];
1551 remove_cnt = (cnt-1)*4;
1552 sec_ie[8] = 0x01;
1553 memcpy(&sec_ie[10], &uncst_oui[0], 4);
1554 /*remove the other unicast suit*/
1555 memcpy(&sec_ie[14],
1556 &sec_ie[14 + remove_cnt],
1557 (sec_ie[1] - 14 + 2 -
1558 remove_cnt));
1559 sec_ie[1] = sec_ie[1]-remove_cnt;
1560 }
1561 break;
1562 }
1563 }
1564 }
1565 if ((authmode == _WPA_IE_ID_) || (authmode == _WPA2_IE_ID_)) {
1566 /*copy fixed ie*/
1567 memcpy(out_ie, in_ie, 12);
1568 ielength = 12;
1569 /*copy RSN or SSN*/
1570 if (match == true) {
1571 memcpy(&out_ie[ielength], &sec_ie[0], sec_ie[1]+2);
1572 ielength += sec_ie[1] + 2;
1573 if (authmode == _WPA2_IE_ID_) {
1574 /*the Pre-Authentication bit should be zero*/
1575 out_ie[ielength - 1] = 0;
1576 out_ie[ielength - 2] = 0;
1577 }
1578 r8712_report_sec_ie(adapter, authmode, sec_ie);
1579 }
1580 } else {
1581 /*copy fixed ie only*/
1582 memcpy(out_ie, in_ie, 12);
1583 ielength = 12;
1584 if (psecuritypriv->wps_phase == true) {
1585 memcpy(out_ie+ielength, psecuritypriv->wps_ie,
1586 psecuritypriv->wps_ie_len);
1587 ielength += psecuritypriv->wps_ie_len;
1588 }
1589 }
1590 iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid);
1591 if (iEntry < 0)
1592 return ielength;
1593 else {
1594 if (authmode == _WPA2_IE_ID_) {
1595 out_ie[ielength] = 1;
1596 ielength++;
1597 out_ie[ielength] = 0; /*PMKID count = 0x0100*/
1598 ielength++;
1599 memcpy(&out_ie[ielength],
1600 &psecuritypriv->PMKIDList[iEntry].PMKID, 16);
1601 ielength += 16;
1602 out_ie[13] += 18;/*PMKID length = 2+16*/
1603 }
1604 }
1605 return ielength;
1606}
1607
1608void r8712_init_registrypriv_dev_network(struct _adapter *adapter)
1609{
1610 struct registry_priv *pregistrypriv = &adapter->registrypriv;
1611 struct eeprom_priv *peepriv = &adapter->eeprompriv;
1612 struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network;
1613 u8 *myhwaddr = myid(peepriv);
1614
1615 memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN);
1616 memcpy(&pdev_network->Ssid, &pregistrypriv->ssid,
1617 sizeof(struct ndis_802_11_ssid));
1618 pdev_network->Configuration.Length =
1619 sizeof(struct NDIS_802_11_CONFIGURATION);
1620 pdev_network->Configuration.BeaconPeriod = 100;
1621 pdev_network->Configuration.FHConfig.Length = 0;
1622 pdev_network->Configuration.FHConfig.HopPattern = 0;
1623 pdev_network->Configuration.FHConfig.HopSet = 0;
1624 pdev_network->Configuration.FHConfig.DwellTime = 0;
1625}
1626
1627void r8712_update_registrypriv_dev_network(struct _adapter *adapter)
1628{
1629 int sz = 0;
1630 struct registry_priv *pregistrypriv = &adapter->registrypriv;
1631 struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network;
1632 struct security_priv *psecuritypriv = &adapter->securitypriv;
1633 struct wlan_network *cur_network = &adapter->mlmepriv.cur_network;
1634
1635 pdev_network->Privacy = cpu_to_le32(psecuritypriv->PrivacyAlgrthm
1636 > 0 ? 1 : 0) ; /* adhoc no 802.1x */
1637 pdev_network->Rssi = 0;
1638 switch (pregistrypriv->wireless_mode) {
1639 case WIRELESS_11B:
1640 pdev_network->NetworkTypeInUse = cpu_to_le32(Ndis802_11DS);
1641 break;
1642 case WIRELESS_11G:
1643 case WIRELESS_11BG:
1644 pdev_network->NetworkTypeInUse = cpu_to_le32(Ndis802_11OFDM24);
1645 break;
1646 case WIRELESS_11A:
1647 pdev_network->NetworkTypeInUse = cpu_to_le32(Ndis802_11OFDM5);
1648 break;
1649 default:
1650 /* TODO */
1651 break;
1652 }
1653 pdev_network->Configuration.DSConfig = cpu_to_le32(
1654 pregistrypriv->channel);
1655 if (cur_network->network.InfrastructureMode == Ndis802_11IBSS)
1656 pdev_network->Configuration.ATIMWindow = cpu_to_le32(3);
1657 pdev_network->InfrastructureMode = cpu_to_le32(
1658 cur_network->network.InfrastructureMode);
1659 /* 1. Supported rates
1660 * 2. IE
1661 */
1662 sz = r8712_generate_ie(pregistrypriv, adapter);
1663 pdev_network->IELength = sz;
1664 pdev_network->Length = r8712_get_ndis_wlan_bssid_ex_sz(
1665 (struct ndis_wlan_bssid_ex *)pdev_network);
1666}
1667
1668/*the fucntion is at passive_level*/
1669void r8712_joinbss_reset(struct _adapter *padapter)
1670{
1671 int i;
1672 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1673 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1674
1675 /* todo: if you want to do something io/reg/hw setting before join_bss,
1676 * please add code here */
1677 phtpriv->ampdu_enable = false;/*reset to disabled*/
1678 for (i = 0; i < 16; i++)
1679 phtpriv->baddbareq_issued[i] = false;/*reset it*/
1680 if (phtpriv->ht_option) {
1681 /* validate usb rx aggregation */
1682 r8712_write8(padapter, 0x102500D9, 48);/*TH = 48 pages, 6k*/
1683 } else {
1684 /* invalidate usb rx aggregation */
1685 /* TH=1 => means that invalidate usb rx aggregation */
1686 r8712_write8(padapter, 0x102500D9, 1);
1687 }
1688}
1689
1690/*the function is >= passive_level*/
1691unsigned int r8712_restructure_ht_ie(struct _adapter *padapter, u8 *in_ie,
1692 u8 *out_ie, uint in_len, uint *pout_len)
1693{
1694 u32 ielen, out_len;
1695 unsigned char *p, *pframe;
1696 struct ieee80211_ht_cap ht_capie;
1697 unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
1698 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1699 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
1700 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1701
1702 phtpriv->ht_option = 0;
1703 p = r8712_get_ie(in_ie+12, _HT_CAPABILITY_IE_, &ielen, in_len-12);
1704 if (p && (ielen > 0)) {
1705 if (pqospriv->qos_option == 0) {
1706 out_len = *pout_len;
1707 pframe = r8712_set_ie(out_ie+out_len,
1708 _VENDOR_SPECIFIC_IE_,
1709 _WMM_IE_Length_,
1710 WMM_IE, pout_len);
1711 pqospriv->qos_option = 1;
1712 }
1713 out_len = *pout_len;
1714 memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap));
1715 ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |
1716 IEEE80211_HT_CAP_SGI_20 |
1717 IEEE80211_HT_CAP_SGI_40 |
1718 IEEE80211_HT_CAP_TX_STBC |
1719 IEEE80211_HT_CAP_MAX_AMSDU |
1720 IEEE80211_HT_CAP_DSSSCCK40;
1721 ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR &
1722 0x03) | (IEEE80211_HT_CAP_AMPDU_DENSITY & 0x00);
1723 pframe = r8712_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_,
1724 sizeof(struct ieee80211_ht_cap),
1725 (unsigned char *)&ht_capie, pout_len);
1726 phtpriv->ht_option = 1;
1727 }
1728 return phtpriv->ht_option;
1729}
1730
1731/* the fucntion is > passive_level (in critical_section) */
1732static void update_ht_cap(struct _adapter *padapter, u8 *pie, uint ie_len)
1733{
1734 u8 *p, max_ampdu_sz;
1735 int i, len;
1736 struct sta_info *bmc_sta, *psta;
1737 struct ieee80211_ht_cap *pht_capie;
1738 struct ieee80211_ht_addt_info *pht_addtinfo;
1739 struct recv_reorder_ctrl *preorder_ctrl;
1740 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1741 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1742 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1743 struct wlan_network *pcur_network = &(pmlmepriv->cur_network);
1744
1745 if (!phtpriv->ht_option)
1746 return;
1747 /* maybe needs check if ap supports rx ampdu. */
1748 if ((phtpriv->ampdu_enable == false) &&
1749 (pregistrypriv->ampdu_enable == 1))
1750 phtpriv->ampdu_enable = true;
1751 /*check Max Rx A-MPDU Size*/
1752 len = 0;
1753 p = r8712_get_ie(pie + sizeof(struct NDIS_802_11_FIXED_IEs),
1754 _HT_CAPABILITY_IE_,
1755 &len, ie_len -
1756 sizeof(struct NDIS_802_11_FIXED_IEs));
1757 if (p && len > 0) {
1758 pht_capie = (struct ieee80211_ht_cap *)(p+2);
1759 max_ampdu_sz = (pht_capie->ampdu_params_info &
1760 IEEE80211_HT_CAP_AMPDU_FACTOR);
1761 /* max_ampdu_sz (kbytes); */
1762 max_ampdu_sz = 1 << (max_ampdu_sz+3);
1763 phtpriv->rx_ampdu_maxlen = max_ampdu_sz;
1764 }
1765 /* for A-MPDU Rx reordering buffer control for bmc_sta & sta_info
1766 * if A-MPDU Rx is enabled, reseting rx_ordering_ctrl
1767 * wstart_b(indicate_seq) to default value=0xffff
1768 * todo: check if AP can send A-MPDU packets
1769 */
1770 bmc_sta = r8712_get_bcmc_stainfo(padapter);
1771 if (bmc_sta) {
1772 for (i = 0; i < 16; i++) {
1773 preorder_ctrl = &bmc_sta->recvreorder_ctrl[i];
1774 preorder_ctrl->indicate_seq = 0xffff;
1775 preorder_ctrl->wend_b = 0xffff;
1776 }
1777 }
1778 psta = r8712_get_stainfo(&padapter->stapriv,
1779 pcur_network->network.MacAddress);
1780 if (psta) {
1781 for (i = 0; i < 16 ; i++) {
1782 preorder_ctrl = &psta->recvreorder_ctrl[i];
1783 preorder_ctrl->indicate_seq = 0xffff;
1784 preorder_ctrl->wend_b = 0xffff;
1785 }
1786 }
1787 len = 0;
1788 p = r8712_get_ie(pie + sizeof(struct NDIS_802_11_FIXED_IEs),
1789 _HT_ADD_INFO_IE_, &len,
1790 ie_len-sizeof(struct NDIS_802_11_FIXED_IEs));
1791 if (p && len > 0)
1792 pht_addtinfo = (struct ieee80211_ht_addt_info *)(p + 2);
1793}
1794
1795void r8712_issue_addbareq_cmd(struct _adapter *padapter, int priority)
1796{
1797 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1798 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1799
1800 if ((phtpriv->ht_option == 1) && (phtpriv->ampdu_enable == true)) {
1801 if (phtpriv->baddbareq_issued[priority] == false) {
1802 r8712_addbareq_cmd(padapter, (u8)priority);
1803 phtpriv->baddbareq_issued[priority] = true;
1804 }
1805 }
1806}
1807
1808/*the fucntion is >= passive_level*/
1809unsigned int r8712_add_ht_addt_info(struct _adapter *padapter,
1810 u8 *in_ie, u8 *out_ie,
1811 uint in_len, uint *pout_len)
1812{
1813 u32 ielen, out_len = 0;
1814 unsigned char *p, *pframe;
1815 struct ieee80211_ht_addt_info ht_addt_info;
1816 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1817 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1818 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1819 out_len = *pout_len;
1820
1821 if (pregistrypriv->ht_enable == 1) {
1822 p = r8712_get_ie(in_ie+12, _HT_ADD_INFO_IE_,
1823 &ielen, in_len - 12);
1824 if (p && (ielen > 0)) {
1825 ; /* dummy branch */
1826 } else {
1827 if (p == NULL) {
1828 int sz = sizeof(struct ieee80211_ht_addt_info);
1829 memset(&ht_addt_info, 0, sz);
1830 /*need to add the HT additional IEs*/
1831 ht_addt_info.control_chan =
1832 pregistrypriv->channel;
1833 pframe = r8712_set_ie(out_ie + out_len,
1834 _HT_ADD_INFO_IE_,
1835 sz,
1836 (unsigned char *)&ht_addt_info,
1837 pout_len);
1838 }
1839 }
1840 }
1841 return phtpriv->ht_option;
1842}
diff --git a/drivers/staging/rtl8712/rtl871x_mlme.h b/drivers/staging/rtl8712/rtl871x_mlme.h
new file mode 100644
index 00000000000..2b35b740ab8
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_mlme.h
@@ -0,0 +1,208 @@
1#ifndef __RTL871X_MLME_H_
2#define __RTL871X_MLME_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include "wlan_bssdef.h"
7
8#define MAX_BSS_CNT 64
9#define MAX_JOIN_TIMEOUT 6000
10
11#define SCANNING_TIMEOUT 4500
12
13#define SCANQUEUE_LIFETIME 20 /* unit:sec */
14
15#define WIFI_NULL_STATE 0x00000000
16#define WIFI_ASOC_STATE 0x00000001 /* Under Linked state...*/
17#define WIFI_REASOC_STATE 0x00000002
18#define WIFI_SLEEP_STATE 0x00000004
19#define WIFI_STATION_STATE 0x00000008
20#define WIFI_AP_STATE 0x00000010
21#define WIFI_ADHOC_STATE 0x00000020
22#define WIFI_ADHOC_MASTER_STATE 0x00000040
23#define WIFI_UNDER_LINKING 0x00000080
24#define WIFI_SITE_MONITOR 0x00000800 /* to indicate the station
25 * is under site surveying*/
26#define WIFI_MP_STATE 0x00010000
27#define WIFI_MP_CTX_BACKGROUND 0x00020000 /* in cont. tx background*/
28#define WIFI_MP_CTX_ST 0x00040000 /* in cont. tx with
29 * single-tone*/
30#define WIFI_MP_CTX_BACKGROUND_PENDING 0x00080000 /* pending in cont, tx
31 * background due to out of skb*/
32#define WIFI_MP_CTX_CCK_HW 0x00100000 /* in continous tx*/
33#define WIFI_MP_CTX_CCK_CS 0x00200000 /* in cont, tx with carrier
34 * suppression*/
35#define WIFI_MP_LPBK_STATE 0x00400000
36
37#define _FW_UNDER_LINKING WIFI_UNDER_LINKING
38#define _FW_LINKED WIFI_ASOC_STATE
39#define _FW_UNDER_SURVEY WIFI_SITE_MONITOR
40
41/*
42there are several "locks" in mlme_priv,
43since mlme_priv is a shared resource between many threads,
44like ISR/Call-Back functions, the OID handlers, and even timer functions.
45Each _queue has its own locks, already.
46Other items are protected by mlme_priv.lock.
47To avoid possible dead lock, any thread trying to modifiying mlme_priv
48SHALL not lock up more than one locks at a time!
49*/
50
51#define traffic_threshold 10
52#define traffic_scan_period 500
53
54struct sitesurvey_ctrl {
55 u64 last_tx_pkts;
56 uint last_rx_pkts;
57 sint traffic_busy;
58 struct timer_list sitesurvey_ctrl_timer;
59};
60
61struct mlme_priv {
62
63 spinlock_t lock;
64 spinlock_t lock2;
65 sint fw_state; /*shall we protect this variable? */
66 u8 to_join; /*flag*/
67 u8 *nic_hdl;
68 struct list_head *pscanned;
69 struct __queue free_bss_pool;
70 struct __queue scanned_queue;
71 u8 *free_bss_buf;
72 unsigned long num_of_scanned;
73 struct ndis_802_11_ssid assoc_ssid;
74 u8 assoc_bssid[6];
75 struct wlan_network cur_network;
76 struct sitesurvey_ctrl sitesurveyctrl;
77 struct timer_list assoc_timer;
78 uint assoc_by_bssid;
79 uint assoc_by_rssi;
80 struct timer_list scan_to_timer; /* driver handles scan_timeout.*/
81 struct timer_list dhcp_timer; /* set dhcp to if driver in ps mode.*/
82 struct qos_priv qospriv;
83 struct ht_priv htpriv;
84 struct timer_list wdg_timer; /*watchdog periodic timer*/
85};
86
87static inline u8 *get_bssid(struct mlme_priv *pmlmepriv)
88{
89 return pmlmepriv->cur_network.network.MacAddress;
90}
91
92static inline u8 check_fwstate(struct mlme_priv *pmlmepriv, sint state)
93{
94 if (pmlmepriv->fw_state & state)
95 return true;
96 return false;
97}
98
99static inline sint get_fwstate(struct mlme_priv *pmlmepriv)
100{
101 return pmlmepriv->fw_state;
102}
103
104/*
105 * No Limit on the calling context,
106 * therefore set it to be the critical section...
107 *
108 * ### NOTE:#### (!!!!)
109 * TAKE CARE THAT BEFORE CALLING THIS FUNC, LOCK pmlmepriv->lock
110 */
111static inline void set_fwstate(struct mlme_priv *pmlmepriv, sint state)
112{
113 pmlmepriv->fw_state |= state;
114}
115
116static inline void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state)
117{
118 pmlmepriv->fw_state &= ~state;
119}
120
121/*
122 * No Limit on the calling context,
123 * therefore set it to be the critical section...
124 */
125static inline void clr_fwstate(struct mlme_priv *pmlmepriv, sint state)
126{
127 unsigned long irqL;
128
129 spin_lock_irqsave(&pmlmepriv->lock, irqL);
130 if (check_fwstate(pmlmepriv, state) == true)
131 pmlmepriv->fw_state ^= state;
132 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
133}
134
135static inline void up_scanned_network(struct mlme_priv *pmlmepriv)
136{
137 unsigned long irqL;
138
139 spin_lock_irqsave(&pmlmepriv->lock, irqL);
140 pmlmepriv->num_of_scanned++;
141 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
142}
143
144static inline void down_scanned_network(struct mlme_priv *pmlmepriv)
145{
146 unsigned long irqL;
147
148 spin_lock_irqsave(&pmlmepriv->lock, irqL);
149 pmlmepriv->num_of_scanned--;
150 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
151}
152
153static inline void set_scanned_network_val(struct mlme_priv *pmlmepriv,
154 sint val)
155{
156 unsigned long irqL;
157
158 spin_lock_irqsave(&pmlmepriv->lock, irqL);
159 pmlmepriv->num_of_scanned = val;
160 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
161}
162
163void r8712_survey_event_callback(struct _adapter *adapter, u8 *pbuf);
164void r8712_surveydone_event_callback(struct _adapter *adapter, u8 *pbuf);
165void r8712_joinbss_event_callback(struct _adapter *adapter, u8 *pbuf);
166void r8712_stassoc_event_callback(struct _adapter *adapter, u8 *pbuf);
167void r8712_stadel_event_callback(struct _adapter *adapter, u8 *pbuf);
168void r8712_atimdone_event_callback(struct _adapter *adapter, u8 *pbuf);
169void r8712_cpwm_event_callback(struct _adapter *adapter, u8 *pbuf);
170void r8712_wpspbc_event_callback(struct _adapter *adapter, u8 *pbuf);
171void r8712_free_network_queue(struct _adapter *adapter);
172int r8712_init_mlme_priv(struct _adapter *adapter);
173void r8712_free_mlme_priv(struct mlme_priv *pmlmepriv);
174sint r8712_select_and_join_from_scan(struct mlme_priv *pmlmepriv);
175sint r8712_set_key(struct _adapter *adapter,
176 struct security_priv *psecuritypriv, sint keyid);
177sint r8712_set_auth(struct _adapter *adapter,
178 struct security_priv *psecuritypriv);
179uint r8712_get_ndis_wlan_bssid_ex_sz(struct ndis_wlan_bssid_ex *bss);
180void r8712_generate_random_ibss(u8 *pibss);
181u8 *r8712_get_capability_from_ie(u8 *ie);
182struct wlan_network *r8712_get_oldest_wlan_network(
183 struct __queue *scanned_queue);
184void r8712_free_assoc_resources(struct _adapter *adapter);
185void r8712_ind_disconnect(struct _adapter *adapter);
186void r8712_indicate_connect(struct _adapter *adapter);
187int r8712_restruct_sec_ie(struct _adapter *adapter, u8 *in_ie,
188 u8 *out_ie, uint in_len);
189int r8712_restruct_wmm_ie(struct _adapter *adapter, u8 *in_ie,
190 u8 *out_ie, uint in_len, uint initial_out_len);
191void r8712_init_registrypriv_dev_network(struct _adapter *adapter);
192void r8712_update_registrypriv_dev_network(struct _adapter *adapter);
193void _r8712_sitesurvey_ctrl_handler(struct _adapter *adapter);
194void _r8712_join_timeout_handler(struct _adapter *adapter);
195void r8712_scan_timeout_handler(struct _adapter *adapter);
196void _r8712_dhcp_timeout_handler(struct _adapter *adapter);
197void _r8712_wdg_timeout_handler(struct _adapter *adapter);
198struct wlan_network *_r8712_alloc_network(struct mlme_priv *pmlmepriv);
199sint r8712_if_up(struct _adapter *padapter);
200void r8712_joinbss_reset(struct _adapter *padapter);
201unsigned int r8712_restructure_ht_ie(struct _adapter *padapter, u8 *in_ie,
202 u8 *out_ie, uint in_len, uint *pout_len);
203void r8712_issue_addbareq_cmd(struct _adapter *padapter, int priority);
204unsigned int r8712_add_ht_addt_info(struct _adapter *padapter, u8 *in_ie,
205 u8 *out_ie, uint in_len, uint *pout_len);
206int r8712_is_same_ibss(struct _adapter *adapter, struct wlan_network *pnetwork);
207
208#endif /*__RTL871X_MLME_H_*/
diff --git a/drivers/staging/rtl8712/rtl871x_mp.c b/drivers/staging/rtl8712/rtl871x_mp.c
new file mode 100644
index 00000000000..a28e9bfe743
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_mp.c
@@ -0,0 +1,736 @@
1/******************************************************************************
2 * rtl871x_mp.c
3 *
4 * Description :
5 *
6 * Author :
7 *
8 * History :
9 *
10 * Copyright 2007, Realtek Corp.
11 *
12 * The contents of this file is the sole property of Realtek Corp. It can not be
13 * be used, copied or modified without written permission from Realtek Corp.
14 *
15*******************************************************************************/
16#define _RTL871X_MP_C_
17
18#include "osdep_service.h"
19#include "drv_types.h"
20#include "rtl871x_mp_phy_regdef.h"
21#include "rtl8712_cmd.h"
22
23static void _init_mp_priv_(struct mp_priv *pmp_priv)
24{
25 pmp_priv->mode = _LOOPBOOK_MODE_;
26 pmp_priv->curr_ch = 1;
27 pmp_priv->curr_modem = MIXED_PHY;
28 pmp_priv->curr_rateidx = 0;
29 pmp_priv->curr_txpoweridx = 0x14;
30 pmp_priv->antenna_tx = ANTENNA_A;
31 pmp_priv->antenna_rx = ANTENNA_AB;
32 pmp_priv->check_mp_pkt = 0;
33 pmp_priv->tx_pktcount = 0;
34 pmp_priv->rx_pktcount = 0;
35 pmp_priv->rx_crcerrpktcount = 0;
36}
37
38static int init_mp_priv(struct mp_priv *pmp_priv)
39{
40 int i, res;
41 struct mp_xmit_frame *pmp_xmitframe;
42
43 _init_mp_priv_(pmp_priv);
44 _init_queue(&pmp_priv->free_mp_xmitqueue);
45 pmp_priv->pallocated_mp_xmitframe_buf = NULL;
46 pmp_priv->pallocated_mp_xmitframe_buf = _malloc(NR_MP_XMITFRAME *
47 sizeof(struct mp_xmit_frame) + 4);
48 if (pmp_priv->pallocated_mp_xmitframe_buf == NULL) {
49 res = _FAIL;
50 goto _exit_init_mp_priv;
51 }
52 pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf +
53 4 -
54 ((addr_t)(pmp_priv->pallocated_mp_xmitframe_buf) & 3);
55 pmp_xmitframe = (struct mp_xmit_frame *)pmp_priv->pmp_xmtframe_buf;
56 for (i = 0; i < NR_MP_XMITFRAME; i++) {
57 _init_listhead(&(pmp_xmitframe->list));
58 list_insert_tail(&(pmp_xmitframe->list),
59 &(pmp_priv->free_mp_xmitqueue.queue));
60 pmp_xmitframe->pkt = NULL;
61 pmp_xmitframe->frame_tag = MP_FRAMETAG;
62 pmp_xmitframe->padapter = pmp_priv->papdater;
63 pmp_xmitframe++;
64 }
65 pmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME;
66 res = _SUCCESS;
67_exit_init_mp_priv:
68 return res;
69}
70
71static int free_mp_priv(struct mp_priv *pmp_priv)
72{
73 int res = 0;
74 kfree(pmp_priv->pallocated_mp_xmitframe_buf);
75 return res;
76}
77
78void mp871xinit(struct _adapter *padapter)
79{
80 struct mp_priv *pmppriv = &padapter->mppriv;
81
82 pmppriv->papdater = padapter;
83 init_mp_priv(pmppriv);
84}
85
86void mp871xdeinit(struct _adapter *padapter)
87{
88 struct mp_priv *pmppriv = &padapter->mppriv;
89
90 free_mp_priv(pmppriv);
91}
92
93/*
94 * Special for bb and rf reg read/write
95 */
96static u32 fw_iocmd_read(struct _adapter *pAdapter, struct IOCMD_STRUCT iocmd)
97{
98 u32 cmd32 = 0, val32 = 0;
99 u8 iocmd_class = iocmd.cmdclass;
100 u16 iocmd_value = iocmd.value;
101 u8 iocmd_idx = iocmd.index;
102
103 cmd32 = (iocmd_class << 24) | (iocmd_value << 8) | iocmd_idx ;
104 if (r8712_fw_cmd(pAdapter, cmd32))
105 r8712_fw_cmd_data(pAdapter, &val32, 1);
106 else
107 val32 = 0;
108 return val32;
109}
110
111static u8 fw_iocmd_write(struct _adapter *pAdapter,
112 struct IOCMD_STRUCT iocmd, u32 value)
113{
114 u32 cmd32 = 0;
115 u8 iocmd_class = iocmd.cmdclass;
116 u32 iocmd_value = iocmd.value;
117 u8 iocmd_idx = iocmd.index;
118
119 r8712_fw_cmd_data(pAdapter, &value, 0);
120 msleep(100);
121 cmd32 = (iocmd_class << 24) | (iocmd_value << 8) | iocmd_idx ;
122 return r8712_fw_cmd(pAdapter, cmd32);
123}
124
125/* offset : 0X800~0XFFF */
126u32 r8712_bb_reg_read(struct _adapter *pAdapter, u16 offset)
127{
128 u8 shift = offset & 0x0003; /* 4 byte access */
129 u16 bb_addr = offset & 0x0FFC; /* 4 byte access */
130 u32 bb_val = 0;
131 struct IOCMD_STRUCT iocmd;
132
133 iocmd.cmdclass = IOCMD_CLASS_BB_RF;
134 iocmd.value = bb_addr;
135 iocmd.index = IOCMD_BB_READ_IDX;
136 bb_val = fw_iocmd_read(pAdapter, iocmd);
137 if (shift != 0) {
138 u32 bb_val2 = 0;
139 bb_val >>= (shift * 8);
140 iocmd.value += 4;
141 bb_val2 = fw_iocmd_read(pAdapter, iocmd);
142 bb_val2 <<= ((4 - shift) * 8);
143 bb_val |= bb_val2;
144 }
145 return bb_val;
146}
147
148/* offset : 0X800~0XFFF */
149u8 r8712_bb_reg_write(struct _adapter *pAdapter, u16 offset, u32 value)
150{
151 u8 shift = offset & 0x0003; /* 4 byte access */
152 u16 bb_addr = offset & 0x0FFC; /* 4 byte access */
153 struct IOCMD_STRUCT iocmd;
154
155 iocmd.cmdclass = IOCMD_CLASS_BB_RF;
156 iocmd.value = bb_addr;
157 iocmd.index = IOCMD_BB_WRITE_IDX;
158 if (shift != 0) {
159 u32 oldValue = 0;
160 u32 newValue = value;
161
162 oldValue = r8712_bb_reg_read(pAdapter, iocmd.value);
163 oldValue &= (0xFFFFFFFF >> ((4 - shift) * 8));
164 value = oldValue | (newValue << (shift * 8));
165 if (fw_iocmd_write(pAdapter, iocmd, value) == false)
166 return false;
167 iocmd.value += 4;
168 oldValue = r8712_bb_reg_read(pAdapter, iocmd.value);
169 oldValue &= (0xFFFFFFFF << (shift * 8));
170 value = oldValue | (newValue >> ((4 - shift) * 8));
171 }
172 return fw_iocmd_write(pAdapter, iocmd, value);
173}
174
175/* offset : 0x00 ~ 0xFF */
176u32 r8712_rf_reg_read(struct _adapter *pAdapter, u8 path, u8 offset)
177{
178 u16 rf_addr = (path << 8) | offset;
179 u32 rf_data;
180 struct IOCMD_STRUCT iocmd;
181
182 iocmd.cmdclass = IOCMD_CLASS_BB_RF ;
183 iocmd.value = rf_addr ;
184 iocmd.index = IOCMD_RF_READ_IDX;
185 rf_data = fw_iocmd_read(pAdapter, iocmd);
186 return rf_data;
187}
188
189u8 r8712_rf_reg_write(struct _adapter *pAdapter, u8 path, u8 offset, u32 value)
190{
191 u16 rf_addr = (path << 8) | offset;
192 struct IOCMD_STRUCT iocmd;
193
194 iocmd.cmdclass = IOCMD_CLASS_BB_RF;
195 iocmd.value = rf_addr;
196 iocmd.index = IOCMD_RF_WRIT_IDX;
197 return fw_iocmd_write(pAdapter, iocmd, value);
198}
199
200static u32 bitshift(u32 bitmask)
201{
202 u32 i;
203
204 for (i = 0; i <= 31; i++)
205 if (((bitmask>>i) & 0x1) == 1)
206 break;
207 return i;
208}
209
210u32 get_bb_reg(struct _adapter *pAdapter, u16 offset, u32 bitmask)
211{
212 u32 org_value, bit_shift, new_value;
213
214 org_value = r8712_bb_reg_read(pAdapter, offset);
215 bit_shift = bitshift(bitmask);
216 new_value = (org_value & bitmask) >> bit_shift;
217 return new_value;
218}
219
220u8 set_bb_reg(struct _adapter *pAdapter, u16 offset, u32 bitmask, u32 value)
221{
222 u32 org_value, bit_shift, new_value;
223
224 if (bitmask != bMaskDWord) {
225 org_value = r8712_bb_reg_read(pAdapter, offset);
226 bit_shift = bitshift(bitmask);
227 new_value = ((org_value & (~bitmask)) | (value << bit_shift));
228 } else
229 new_value = value;
230 return r8712_bb_reg_write(pAdapter, offset, new_value);
231}
232
233static u32 get_rf_reg(struct _adapter *pAdapter, u8 path, u8 offset,
234 u32 bitmask)
235{
236 u32 org_value, bit_shift, new_value;
237
238 org_value = r8712_rf_reg_read(pAdapter, path, offset);
239 bit_shift = bitshift(bitmask);
240 new_value = (org_value & bitmask) >> bit_shift;
241 return new_value;
242}
243
244static u8 set_rf_reg(struct _adapter *pAdapter, u8 path, u8 offset, u32 bitmask,
245 u32 value)
246{
247 u32 org_value, bit_shift, new_value;
248
249 if (bitmask != bMaskDWord) {
250 org_value = r8712_rf_reg_read(pAdapter, path, offset);
251 bit_shift = bitshift(bitmask);
252 new_value = ((org_value & (~bitmask)) | (value << bit_shift));
253 } else
254 new_value = value;
255 return r8712_rf_reg_write(pAdapter, path, offset, new_value);
256}
257
258/*
259 * SetChannel
260 * Description
261 * Use H2C command to change channel,
262 * not only modify rf register, but also other setting need to be done.
263 */
264void r8712_SetChannel(struct _adapter *pAdapter)
265{
266 struct cmd_priv *pcmdpriv = &pAdapter->cmdpriv;
267 struct cmd_obj *pcmd = NULL;
268 struct SetChannel_parm *pparm = NULL;
269 u16 code = GEN_CMD_CODE(_SetChannel);
270
271 pcmd = (struct cmd_obj *)_malloc(sizeof(struct cmd_obj));
272 if (pcmd == NULL)
273 return;
274 pparm = (struct SetChannel_parm *)_malloc(sizeof(struct
275 SetChannel_parm));
276 if (pparm == NULL) {
277 if (pcmd != NULL)
278 kfree((u8 *)pcmd);
279 return;
280 }
281 pparm->curr_ch = pAdapter->mppriv.curr_ch;
282 init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code);
283 r8712_enqueue_cmd(pcmdpriv, pcmd);
284}
285
286static void SetCCKTxPower(struct _adapter *pAdapter, u8 TxPower)
287{
288 u16 TxAGC = 0;
289
290 TxAGC = TxPower;
291 set_bb_reg(pAdapter, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
292}
293
294static void SetOFDMTxPower(struct _adapter *pAdapter, u8 TxPower)
295{
296 u32 TxAGC = 0;
297
298 TxAGC |= ((TxPower<<24)|(TxPower<<16)|(TxPower<<8)|TxPower);
299 set_bb_reg(pAdapter, rTxAGC_Rate18_06, bTxAGCRate18_06, TxAGC);
300 set_bb_reg(pAdapter, rTxAGC_Rate54_24, bTxAGCRate54_24, TxAGC);
301 set_bb_reg(pAdapter, rTxAGC_Mcs03_Mcs00, bTxAGCRateMCS3_MCS0, TxAGC);
302 set_bb_reg(pAdapter, rTxAGC_Mcs07_Mcs04, bTxAGCRateMCS7_MCS4, TxAGC);
303 set_bb_reg(pAdapter, rTxAGC_Mcs11_Mcs08, bTxAGCRateMCS11_MCS8, TxAGC);
304 set_bb_reg(pAdapter, rTxAGC_Mcs15_Mcs12, bTxAGCRateMCS15_MCS12, TxAGC);
305}
306
307void r8712_SetTxPower(struct _adapter *pAdapter)
308{
309 u8 TxPower = pAdapter->mppriv.curr_txpoweridx;
310 SetCCKTxPower(pAdapter, TxPower);
311 SetOFDMTxPower(pAdapter, TxPower);
312}
313
314void r8712_SetTxAGCOffset(struct _adapter *pAdapter, u32 ulTxAGCOffset)
315{
316 u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D, tmpAGC;
317
318 TxAGCOffset_B = (ulTxAGCOffset&0x000000ff);
319 TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);
320 TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16);
321 tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);
322 set_bb_reg(pAdapter, rFPGA0_TxGainStage,
323 (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);
324}
325
326void r8712_SetDataRate(struct _adapter *pAdapter)
327{
328 u8 path = RF_PATH_A;
329 u8 offset = RF_SYN_G2;
330 u32 value;
331
332 value = (pAdapter->mppriv.curr_rateidx < 4) ? 0x4440 : 0xF200;
333 r8712_rf_reg_write(pAdapter, path, offset, value);
334}
335
336void r8712_SwitchBandwidth(struct _adapter *pAdapter)
337{
338 /* 3 1.Set MAC register : BWOPMODE bit2:1 20MhzBW */
339 u8 regBwOpMode = 0;
340 u8 Bandwidth = pAdapter->mppriv.curr_bandwidth;
341
342 regBwOpMode = r8712_read8(pAdapter, 0x10250203);
343 if (Bandwidth == HT_CHANNEL_WIDTH_20)
344 regBwOpMode |= BIT(2);
345 else
346 regBwOpMode &= ~(BIT(2));
347 r8712_write8(pAdapter, 0x10250203, regBwOpMode);
348 /* 3 2.Set PHY related register */
349 switch (Bandwidth) {
350 /* 20 MHz channel*/
351 case HT_CHANNEL_WIDTH_20:
352 set_bb_reg(pAdapter, rFPGA0_RFMOD, bRFMOD, 0x0);
353 set_bb_reg(pAdapter, rFPGA1_RFMOD, bRFMOD, 0x0);
354 /* Use PHY_REG.txt default value. Do not need to change.
355 * Correct the tx power for CCK rate in 40M.
356 * It is set in Tx descriptor for 8192x series
357 */
358 set_bb_reg(pAdapter, rFPGA0_AnalogParameter2, bMaskDWord, 0x58);
359 break;
360 /* 40 MHz channel*/
361 case HT_CHANNEL_WIDTH_40:
362 set_bb_reg(pAdapter, rFPGA0_RFMOD, bRFMOD, 0x1);
363 set_bb_reg(pAdapter, rFPGA1_RFMOD, bRFMOD, 0x1);
364 /* Use PHY_REG.txt default value. Do not need to change.
365 * Correct the tx power for CCK rate in 40M.
366 * Set Control channel to upper or lower. These settings are
367 * required only for 40MHz */
368 set_bb_reg(pAdapter, rCCK0_System, bCCKSideBand,
369 (HAL_PRIME_CHNL_OFFSET_DONT_CARE>>1));
370 set_bb_reg(pAdapter, rOFDM1_LSTF, 0xC00,
371 HAL_PRIME_CHNL_OFFSET_DONT_CARE);
372 set_bb_reg(pAdapter, rFPGA0_AnalogParameter2, bMaskDWord, 0x18);
373 break;
374 default:
375 break;
376 }
377
378 /* 3 3.Set RF related register */
379 switch (Bandwidth) {
380 case HT_CHANNEL_WIDTH_20:
381 set_rf_reg(pAdapter, RF_PATH_A, RF_CHNLBW,
382 BIT(10) | BIT(11), 0x01);
383 break;
384 case HT_CHANNEL_WIDTH_40:
385 set_rf_reg(pAdapter, RF_PATH_A, RF_CHNLBW,
386 BIT(10) | BIT(11), 0x00);
387 break;
388 default:
389 break;
390 }
391}
392/*------------------------------Define structure----------------------------*/
393struct R_ANTENNA_SELECT_OFDM {
394 u32 r_tx_antenna:4;
395 u32 r_ant_l:4;
396 u32 r_ant_non_ht:4;
397 u32 r_ant_ht1:4;
398 u32 r_ant_ht2:4;
399 u32 r_ant_ht_s1:4;
400 u32 r_ant_non_ht_s1:4;
401 u32 OFDM_TXSC:2;
402 u32 Reserved:2;
403};
404
405struct R_ANTENNA_SELECT_CCK {
406 u8 r_cckrx_enable_2:2;
407 u8 r_cckrx_enable:2;
408 u8 r_ccktx_enable:4;
409};
410
411void r8712_SwitchAntenna(struct _adapter *pAdapter)
412{
413 u32 ofdm_tx_en_val = 0, ofdm_tx_ant_sel_val = 0;
414 u8 ofdm_rx_ant_sel_val = 0;
415 u8 cck_ant_select_val = 0;
416 u32 cck_ant_sel_val = 0;
417 struct R_ANTENNA_SELECT_CCK *p_cck_txrx;
418
419 p_cck_txrx = (struct R_ANTENNA_SELECT_CCK *)&cck_ant_select_val;
420
421 switch (pAdapter->mppriv.antenna_tx) {
422 case ANTENNA_A:
423 /* From SD3 Willis suggestion !!! Set RF A=TX and B as standby*/
424 set_bb_reg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);
425 set_bb_reg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1);
426 ofdm_tx_en_val = 0x3;
427 ofdm_tx_ant_sel_val = 0x11111111;/* Power save */
428 p_cck_txrx->r_ccktx_enable = 0x8;
429 break;
430 case ANTENNA_B:
431 set_bb_reg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1);
432 set_bb_reg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);
433 ofdm_tx_en_val = 0x3;
434 ofdm_tx_ant_sel_val = 0x22222222;/* Power save */
435 p_cck_txrx->r_ccktx_enable = 0x4;
436 break;
437 case ANTENNA_AB: /* For 8192S */
438 set_bb_reg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);
439 set_bb_reg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);
440 ofdm_tx_en_val = 0x3;
441 ofdm_tx_ant_sel_val = 0x3321333; /* Disable Power save */
442 p_cck_txrx->r_ccktx_enable = 0xC;
443 break;
444 default:
445 break;
446 }
447 /*OFDM Tx*/
448 set_bb_reg(pAdapter, rFPGA1_TxInfo, 0xffffffff, ofdm_tx_ant_sel_val);
449 /*OFDM Tx*/
450 set_bb_reg(pAdapter, rFPGA0_TxInfo, 0x0000000f, ofdm_tx_en_val);
451 switch (pAdapter->mppriv.antenna_rx) {
452 case ANTENNA_A:
453 ofdm_rx_ant_sel_val = 0x1; /* A */
454 p_cck_txrx->r_cckrx_enable = 0x0; /* default: A */
455 p_cck_txrx->r_cckrx_enable_2 = 0x0; /* option: A */
456 break;
457 case ANTENNA_B:
458 ofdm_rx_ant_sel_val = 0x2; /* B */
459 p_cck_txrx->r_cckrx_enable = 0x1; /* default: B */
460 p_cck_txrx->r_cckrx_enable_2 = 0x1; /* option: B */
461 break;
462 case ANTENNA_AB:
463 ofdm_rx_ant_sel_val = 0x3; /* AB */
464 p_cck_txrx->r_cckrx_enable = 0x0; /* default:A */
465 p_cck_txrx->r_cckrx_enable_2 = 0x1; /* option:B */
466 break;
467 default:
468 break;
469 }
470 /*OFDM Rx*/
471 set_bb_reg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f,
472 ofdm_rx_ant_sel_val);
473 /*OFDM Rx*/
474 set_bb_reg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f,
475 ofdm_rx_ant_sel_val);
476
477 cck_ant_sel_val = cck_ant_select_val;
478 /*CCK TxRx*/
479 set_bb_reg(pAdapter, rCCK0_AFESetting, bMaskByte3, cck_ant_sel_val);
480}
481
482void r8712_SetCrystalCap(struct _adapter *pAdapter)
483{
484 set_bb_reg(pAdapter, rFPGA0_AnalogParameter1, bXtalCap,
485 pAdapter->mppriv.curr_crystalcap);
486}
487
488static void TriggerRFThermalMeter(struct _adapter *pAdapter)
489{
490 /* 0x24: RF Reg[6:5] */
491 set_rf_reg(pAdapter, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
492}
493
494static u32 ReadRFThermalMeter(struct _adapter *pAdapter)
495{
496 u32 ThermalValue = 0;
497
498 /* 0x24: RF Reg[4:0] */
499 ThermalValue = get_rf_reg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F);
500 return ThermalValue;
501}
502
503void r8712_GetThermalMeter(struct _adapter *pAdapter, u32 *value)
504{
505 TriggerRFThermalMeter(pAdapter);
506 msleep(1000);
507 *value = ReadRFThermalMeter(pAdapter);
508}
509
510void r8712_SetSingleCarrierTx(struct _adapter *pAdapter, u8 bStart)
511{
512 if (bStart) { /* Start Single Carrier. */
513 /* 1. if OFDM block on? */
514 if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn))
515 /*set OFDM block on*/
516 set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);
517 /* 2. set CCK test mode off, set to CCK normal mode */
518 set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, bDisable);
519 /* 3. turn on scramble setting */
520 set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
521 /* 4. Turn On Single Carrier Tx and off the other test modes. */
522 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
523 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable);
524 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
525 } else { /* Stop Single Carrier.*/
526 /* Turn off all test modes.*/
527 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
528 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier,
529 bDisable);
530 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
531 msleep(20);
532 /*BB Reset*/
533 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
534 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
535 }
536}
537
538void r8712_SetSingleToneTx(struct _adapter *pAdapter, u8 bStart)
539{
540 u8 rfPath = pAdapter->mppriv.curr_rfpath;
541 switch (pAdapter->mppriv.antenna_tx) {
542 case ANTENNA_B:
543 rfPath = RF_PATH_B;
544 break;
545 case ANTENNA_A:
546 default:
547 rfPath = RF_PATH_A;
548 break;
549 }
550 if (bStart) { /* Start Single Tone.*/
551 set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn, bDisable);
552 set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bDisable);
553 set_rf_reg(pAdapter, rfPath, RF_TX_G2, bRFRegOffsetMask,
554 0xd4000);
555 msleep(100);
556 /* PAD all on.*/
557 set_rf_reg(pAdapter, rfPath, RF_AC, bRFRegOffsetMask, 0x2001f);
558 msleep(100);
559 } else { /* Stop Single Tone.*/
560 set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);
561 set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);
562 set_rf_reg(pAdapter, rfPath, RF_TX_G2, bRFRegOffsetMask,
563 0x54000);
564 msleep(100);
565 /* PAD all on.*/
566 set_rf_reg(pAdapter, rfPath, RF_AC, bRFRegOffsetMask, 0x30000);
567 msleep(100);
568 }
569}
570
571void r8712_SetCarrierSuppressionTx(struct _adapter *pAdapter, u8 bStart)
572{
573 if (bStart) { /* Start Carrier Suppression.*/
574 if (pAdapter->mppriv.curr_rateidx <= MPT_RATE_11M) {
575 /* 1. if CCK block on? */
576 if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn)) {
577 /*set CCK block on*/
578 set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn,
579 bEnable);
580 }
581 /* Turn Off All Test Mode */
582 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx,
583 bDisable);
584 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier,
585 bDisable);
586 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone,
587 bDisable);
588 /*transmit mode*/
589 set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x2);
590 /*turn off scramble setting*/
591 set_bb_reg(pAdapter, rCCK0_System, bCCKScramble,
592 bDisable);
593 /*Set CCK Tx Test Rate*/
594 /*Set FTxRate to 1Mbps*/
595 set_bb_reg(pAdapter, rCCK0_System, bCCKTxRate, 0x0);
596 }
597 } else { /* Stop Carrier Suppression. */
598 if (pAdapter->mppriv.curr_rateidx <= MPT_RATE_11M) {
599 /*normal mode*/
600 set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x0);
601 /*turn on scramble setting*/
602 set_bb_reg(pAdapter, rCCK0_System, bCCKScramble,
603 bEnable);
604 /*BB Reset*/
605 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
606 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
607 }
608 }
609}
610
611static void SetCCKContinuousTx(struct _adapter *pAdapter, u8 bStart)
612{
613 u32 cckrate;
614
615 if (bStart) {
616 /* 1. if CCK block on? */
617 if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn)) {
618 /*set CCK block on*/
619 set_bb_reg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);
620 }
621 /* Turn Off All Test Mode */
622 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
623 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
624 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
625 /*Set CCK Tx Test Rate*/
626 cckrate = pAdapter->mppriv.curr_rateidx;
627 set_bb_reg(pAdapter, rCCK0_System, bCCKTxRate, cckrate);
628 /*transmit mode*/
629 set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x2);
630 /*turn on scramble setting*/
631 set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
632 } else {
633 /*normal mode*/
634 set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, 0x0);
635 /*turn on scramble setting*/
636 set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
637 /*BB Reset*/
638 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
639 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
640 }
641} /* mpt_StartCckContTx */
642
643static void SetOFDMContinuousTx(struct _adapter *pAdapter, u8 bStart)
644{
645 if (bStart) {
646 /* 1. if OFDM block on? */
647 if (!get_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) {
648 /*set OFDM block on*/
649 set_bb_reg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);
650 }
651 /* 2. set CCK test mode off, set to CCK normal mode*/
652 set_bb_reg(pAdapter, rCCK0_System, bCCKBBMode, bDisable);
653 /* 3. turn on scramble setting */
654 set_bb_reg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
655 /* 4. Turn On Continue Tx and turn off the other test modes.*/
656 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable);
657 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
658 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
659 } else {
660 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
661 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier,
662 bDisable);
663 set_bb_reg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
664 msleep(20);
665 /*BB Reset*/
666 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
667 set_bb_reg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
668 }
669} /* mpt_StartOfdmContTx */
670
671void r8712_SetContinuousTx(struct _adapter *pAdapter, u8 bStart)
672{
673 /* ADC turn off [bit24-21] adc port0 ~ port1 */
674 if (bStart) {
675 r8712_bb_reg_write(pAdapter, rRx_Wait_CCCA,
676 r8712_bb_reg_read(pAdapter,
677 rRx_Wait_CCCA) & 0xFE1FFFFF);
678 msleep(100);
679 }
680 if (pAdapter->mppriv.curr_rateidx <= MPT_RATE_11M)
681 SetCCKContinuousTx(pAdapter, bStart);
682 else if ((pAdapter->mppriv.curr_rateidx >= MPT_RATE_6M) &&
683 (pAdapter->mppriv.curr_rateidx <= MPT_RATE_MCS15))
684 SetOFDMContinuousTx(pAdapter, bStart);
685 /* ADC turn on [bit24-21] adc port0 ~ port1 */
686 if (!bStart)
687 r8712_bb_reg_write(pAdapter, rRx_Wait_CCCA,
688 r8712_bb_reg_read(pAdapter,
689 rRx_Wait_CCCA) | 0x01E00000);
690}
691
692void r8712_ResetPhyRxPktCount(struct _adapter *pAdapter)
693{
694 u32 i, phyrx_set = 0;
695
696 for (i = OFDM_PPDU_BIT; i <= HT_MPDU_FAIL_BIT; i++) {
697 phyrx_set = 0;
698 phyrx_set |= (i << 28); /*select*/
699 phyrx_set |= 0x08000000; /* set counter to zero*/
700 r8712_write32(pAdapter, RXERR_RPT, phyrx_set);
701 }
702}
703
704static u32 GetPhyRxPktCounts(struct _adapter *pAdapter, u32 selbit)
705{
706 /*selection*/
707 u32 phyrx_set = 0, count = 0;
708 u32 SelectBit;
709
710 SelectBit = selbit << 28;
711 phyrx_set |= (SelectBit & 0xF0000000);
712 r8712_write32(pAdapter, RXERR_RPT, phyrx_set);
713 /*Read packet count*/
714 count = r8712_read32(pAdapter, RXERR_RPT) & RPTMaxCount;
715 return count;
716}
717
718u32 r8712_GetPhyRxPktReceived(struct _adapter *pAdapter)
719{
720 u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
721
722 OFDM_cnt = GetPhyRxPktCounts(pAdapter, OFDM_MPDU_OK_BIT);
723 CCK_cnt = GetPhyRxPktCounts(pAdapter, CCK_MPDU_OK_BIT);
724 HT_cnt = GetPhyRxPktCounts(pAdapter, HT_MPDU_OK_BIT);
725 return OFDM_cnt + CCK_cnt + HT_cnt;
726}
727
728u32 r8712_GetPhyRxPktCRC32Error(struct _adapter *pAdapter)
729{
730 u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
731
732 OFDM_cnt = GetPhyRxPktCounts(pAdapter, OFDM_MPDU_FAIL_BIT);
733 CCK_cnt = GetPhyRxPktCounts(pAdapter, CCK_MPDU_FAIL_BIT);
734 HT_cnt = GetPhyRxPktCounts(pAdapter, HT_MPDU_FAIL_BIT);
735 return OFDM_cnt + CCK_cnt + HT_cnt;
736}
diff --git a/drivers/staging/rtl8712/rtl871x_mp.h b/drivers/staging/rtl8712/rtl871x_mp.h
new file mode 100644
index 00000000000..805aba07159
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_mp.h
@@ -0,0 +1,318 @@
1#ifndef __RTL871X_MP_H_
2#define __RTL871X_MP_H_
3
4/* 00 - Success */
5/* 11 - Error */
6#define STATUS_SUCCESS (0x00000000L)
7#define STATUS_PENDING (0x00000103L)
8#define STATUS_UNSUCCESSFUL (0xC0000001L)
9#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL)
10#define STATUS_NOT_SUPPORTED (0xC00000BBL)
11#define NDIS_STATUS_SUCCESS ((uint)STATUS_SUCCESS)
12#define NDIS_STATUS_PENDING ((uint) STATUS_PENDING)
13#define NDIS_STATUS_NOT_RECOGNIZED ((uint)0x00010001L)
14#define NDIS_STATUS_NOT_COPIED ((uint)0x00010002L)
15#define NDIS_STATUS_NOT_ACCEPTED ((uint)0x00010003L)
16#define NDIS_STATUS_CALL_ACTIVE ((uint)0x00010007L)
17#define NDIS_STATUS_FAILURE ((uint) STATUS_UNSUCCESSFUL)
18#define NDIS_STATUS_RESOURCES ((uint)\
19 STATUS_INSUFFICIENT_RESOURCES)
20#define NDIS_STATUS_CLOSING ((uint)0xC0010002L)
21#define NDIS_STATUS_BAD_VERSION ((uint)0xC0010004L)
22#define NDIS_STATUS_BAD_CHARACTERISTICS ((uint)0xC0010005L)
23#define NDIS_STATUS_ADAPTER_NOT_FOUND ((uint)0xC0010006L)
24#define NDIS_STATUS_OPEN_FAILED ((uint)0xC0010007L)
25#define NDIS_STATUS_DEVICE_FAILED ((uint)0xC0010008L)
26#define NDIS_STATUS_MULTICAST_FULL ((uint)0xC0010009L)
27#define NDIS_STATUS_MULTICAST_EXISTS ((uint)0xC001000AL)
28#define NDIS_STATUS_MULTICAST_NOT_FOUND ((uint)0xC001000BL)
29#define NDIS_STATUS_REQUEST_ABORTED ((uint)0xC001000CL)
30#define NDIS_STATUS_RESET_IN_PROGRESS ((uint)0xC001000DL)
31#define NDIS_STATUS_CLOSING_INDICATING ((uint)0xC001000EL)
32#define NDIS_STATUS_NOT_SUPPORTED ((uint)STATUS_NOT_SUPPORTED)
33#define NDIS_STATUS_INVALID_PACKET ((uint)0xC001000FL)
34#define NDIS_STATUS_OPEN_LIST_FULL ((uint)0xC0010010L)
35#define NDIS_STATUS_ADAPTER_NOT_READY ((uint)0xC0010011L)
36#define NDIS_STATUS_ADAPTER_NOT_OPEN ((uint)0xC0010012L)
37#define NDIS_STATUS_NOT_INDICATING ((uint)0xC0010013L)
38#define NDIS_STATUS_INVALID_LENGTH ((uint)0xC0010014L)
39#define NDIS_STATUS_INVALID_DATA ((uint)0xC0010015L)
40#define NDIS_STATUS_BUFFER_TOO_SHORT ((uint)0xC0010016L)
41#define NDIS_STATUS_INVALID_OID ((uint)0xC0010017L)
42#define NDIS_STATUS_ADAPTER_REMOVED ((uint)0xC0010018L)
43#define NDIS_STATUS_UNSUPPORTED_MEDIA ((uint)0xC0010019L)
44#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((uint)0xC001001AL)
45#define NDIS_STATUS_FILE_NOT_FOUND ((uint)0xC001001BL)
46#define NDIS_STATUS_ERROR_READING_FILE ((uint)0xC001001CL)
47#define NDIS_STATUS_ALREADY_MAPPED ((uint)0xC001001DL)
48#define NDIS_STATUS_RESOURCE_CONFLICT ((uint)0xC001001EL)
49#define NDIS_STATUS_NO_CABLE ((uint)0xC001001FL)
50#define NDIS_STATUS_INVALID_SAP ((uint)0xC0010020L)
51#define NDIS_STATUS_SAP_IN_USE ((uint)0xC0010021L)
52#define NDIS_STATUS_INVALID_ADDRESS ((uint)0xC0010022L)
53#define NDIS_STATUS_VC_NOT_ACTIVATED ((uint)0xC0010023L)
54#define NDIS_STATUS_DEST_OUT_OF_ORDER ((uint)0xC0010024L) /* cause 27*/
55#define NDIS_STATUS_VC_NOT_AVAILABLE ((uint)0xC0010025L) /* 35,45*/
56#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((uint)0xC0010026L) /* 37*/
57#define NDIS_STATUS_INCOMPATABLE_QOS ((uint)0xC0010027L) /* 49*/
58#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((uint)0xC0010028L) /* 93*/
59#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((uint)0xC0010029L) /* 3*/
60#define MPT_NOOP 0
61#define MPT_READ_MAC_1BYTE 1
62#define MPT_READ_MAC_2BYTE 2
63#define MPT_READ_MAC_4BYTE 3
64#define MPT_WRITE_MAC_1BYTE 4
65#define MPT_WRITE_MAC_2BYTE 5
66#define MPT_WRITE_MAC_4BYTE 6
67#define MPT_READ_BB_CCK 7
68#define MPT_WRITE_BB_CCK 8
69#define MPT_READ_BB_OFDM 9
70#define MPT_WRITE_BB_OFDM 10
71#define MPT_READ_RF 11
72#define MPT_WRITE_RF 12
73#define MPT_READ_EEPROM_1BYTE 13
74#define MPT_WRITE_EEPROM_1BYTE 14
75#define MPT_READ_EEPROM_2BYTE 15
76#define MPT_WRITE_EEPROM_2BYTE 16
77#define MPT_SET_CSTHRESHOLD 21
78#define MPT_SET_INITGAIN 22
79#define MPT_SWITCH_BAND 23
80#define MPT_SWITCH_CHANNEL 24
81#define MPT_SET_DATARATE 25
82#define MPT_SWITCH_ANTENNA 26
83#define MPT_SET_TX_POWER 27
84#define MPT_SET_CONT_TX 28
85#define MPT_SET_SINGLE_CARRIER 29
86#define MPT_SET_CARRIER_SUPPRESSION 30
87#define MPT_GET_RATE_TABLE 31
88#define MPT_READ_TSSI 32
89#define MPT_GET_THERMAL_METER 33
90#define MAX_MP_XMITBUF_SZ 2048
91#define NR_MP_XMITFRAME 8
92
93struct mp_xmit_frame {
94 struct list_head list;
95 struct pkt_attrib attrib;
96 _pkt *pkt;
97 int frame_tag;
98 struct _adapter *padapter;
99 u8 *mem_addr;
100 u16 sz[8];
101 struct urb *pxmit_urb[8];
102 u8 bpending[8];
103 u8 last[8];
104 uint mem[(MAX_MP_XMITBUF_SZ >> 2)];
105};
106
107struct mp_wiparam {
108 u32 bcompleted;
109 u32 act_type;
110 u32 io_offset;
111 u32 io_value;
112};
113
114struct mp_priv {
115 struct _adapter *papdater;
116 /*OID cmd handler*/
117 struct mp_wiparam workparam;
118 u8 act_in_progress;
119 /*Tx Section*/
120 u8 TID;
121 u32 tx_pktcount;
122 /*Rx Section*/
123 u32 rx_pktcount;
124 u32 rx_crcerrpktcount;
125 u32 rx_pktloss;
126 struct recv_stat rxstat;
127 /*RF/BB relative*/
128 u32 curr_ch;
129 u32 curr_rateidx;
130 u8 curr_bandwidth;
131 u8 curr_modem;
132 u8 curr_txpoweridx;
133 u32 curr_crystalcap;
134 u16 antenna_tx;
135 u16 antenna_rx;
136 u8 curr_rfpath;
137 u8 check_mp_pkt;
138 uint ForcedDataRate;
139 struct wlan_network mp_network;
140 unsigned char network_macaddr[6];
141 /*Testing Flag*/
142 u32 mode;/*0 for normal type packet,
143 * 1 for loopback packet (16bytes TXCMD)*/
144 sint prev_fw_state;
145 u8 *pallocated_mp_xmitframe_buf;
146 u8 *pmp_xmtframe_buf;
147 struct __queue free_mp_xmitqueue;
148 u32 free_mp_xmitframe_cnt;
149};
150
151struct IOCMD_STRUCT {
152 u8 cmdclass;
153 u16 value;
154 u8 index;
155};
156
157struct rf_reg_param {
158 u32 path;
159 u32 offset;
160 u32 value;
161};
162
163struct bb_reg_param {
164 u32 offset;
165 u32 value;
166};
167/* ======================================================================= */
168
169#define LOWER true
170#define RAISE false
171#define IOCMD_CTRL_REG 0x10250370
172#define IOCMD_DATA_REG 0x10250374
173#define IOCMD_GET_THERMAL_METER 0xFD000028
174#define IOCMD_CLASS_BB_RF 0xF0
175#define IOCMD_BB_READ_IDX 0x00
176#define IOCMD_BB_WRITE_IDX 0x01
177#define IOCMD_RF_READ_IDX 0x02
178#define IOCMD_RF_WRIT_IDX 0x03
179#define BB_REG_BASE_ADDR 0x800
180#define RF_PATH_A 0
181#define RF_PATH_B 1
182#define RF_PATH_C 2
183#define RF_PATH_D 3
184#define MAX_RF_PATH_NUMS 2
185#define _2MAC_MODE_ 0
186#define _LOOPBOOK_MODE_ 1
187
188/* MP set force data rate base on the definition. */
189enum {
190 /* CCK rate. */
191 MPT_RATE_1M, /* 0 */
192 MPT_RATE_2M,
193 MPT_RATE_55M,
194 MPT_RATE_11M, /* 3 */
195
196 /* OFDM rate. */
197 MPT_RATE_6M, /* 4 */
198 MPT_RATE_9M,
199 MPT_RATE_12M,
200 MPT_RATE_18M,
201 MPT_RATE_24M,
202 MPT_RATE_36M,
203 MPT_RATE_48M,
204 MPT_RATE_54M, /* 11 */
205
206 /* HT rate. */
207 MPT_RATE_MCS0, /* 12 */
208 MPT_RATE_MCS1,
209 MPT_RATE_MCS2,
210 MPT_RATE_MCS3,
211 MPT_RATE_MCS4,
212 MPT_RATE_MCS5,
213 MPT_RATE_MCS6,
214 MPT_RATE_MCS7, /* 19 */
215 MPT_RATE_MCS8,
216 MPT_RATE_MCS9,
217 MPT_RATE_MCS10,
218 MPT_RATE_MCS11,
219 MPT_RATE_MCS12,
220 MPT_RATE_MCS13,
221 MPT_RATE_MCS14,
222 MPT_RATE_MCS15, /* 27 */
223 MPT_RATE_LAST
224};
225
226/* Represent Channel Width in HT Capabilities */
227enum HT_CHANNEL_WIDTH {
228 HT_CHANNEL_WIDTH_20 = 0,
229 HT_CHANNEL_WIDTH_40 = 1,
230};
231
232#define MAX_TX_PWR_INDEX_N_MODE 64 /* 0x3F */
233
234enum POWER_MODE {
235 POWER_LOW = 0,
236 POWER_NORMAL
237};
238
239#define RX_PKT_BROADCAST 1
240#define RX_PKT_DEST_ADDR 2
241#define RX_PKT_PHY_MATCH 3
242
243#define RPTMaxCount 0x000FFFFF;
244
245/* parameter 1 : BitMask
246 * bit 0 : OFDM PPDU
247 * bit 1 : OFDM False Alarm
248 * bit 2 : OFDM MPDU OK
249 * bit 3 : OFDM MPDU Fail
250 * bit 4 : CCK PPDU
251 * bit 5 : CCK False Alarm
252 * bit 6 : CCK MPDU ok
253 * bit 7 : CCK MPDU fail
254 * bit 8 : HT PPDU counter
255 * bit 9 : HT false alarm
256 * bit 10 : HT MPDU total
257 * bit 11 : HT MPDU OK
258 * bit 12 : HT MPDU fail
259 * bit 15 : RX full drop
260 */
261enum RXPHY_BITMASK {
262 OFDM_PPDU_BIT = 0,
263 OFDM_MPDU_OK_BIT,
264 OFDM_MPDU_FAIL_BIT,
265 CCK_PPDU_BIT,
266 CCK_MPDU_OK_BIT,
267 CCK_MPDU_FAIL_BIT,
268 HT_PPDU_BIT,
269 HT_MPDU_BIT,
270 HT_MPDU_OK_BIT,
271 HT_MPDU_FAIL_BIT,
272};
273
274enum ENCRY_CTRL_STATE {
275 HW_CONTROL, /*hw encryption& decryption*/
276 SW_CONTROL, /*sw encryption& decryption*/
277 HW_ENCRY_SW_DECRY, /*hw encryption & sw decryption*/
278 SW_ENCRY_HW_DECRY /*sw encryption & hw decryption*/
279};
280
281/* Bandwidth Offset */
282#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
283#define HAL_PRIME_CHNL_OFFSET_LOWER 1
284#define HAL_PRIME_CHNL_OFFSET_UPPER 2
285/*=======================================================================*/
286void mp871xinit(struct _adapter *padapter);
287void mp871xdeinit(struct _adapter *padapter);
288u32 r8712_bb_reg_read(struct _adapter *Adapter, u16 offset);
289u8 r8712_bb_reg_write(struct _adapter *Adapter, u16 offset, u32 value);
290u32 r8712_rf_reg_read(struct _adapter *Adapter, u8 path, u8 offset);
291u8 r8712_rf_reg_write(struct _adapter *Adapter, u8 path,
292 u8 offset, u32 value);
293u32 r8712_get_bb_reg(struct _adapter *Adapter, u16 offset, u32 bitmask);
294u8 r8712_set_bb_reg(struct _adapter *Adapter, u16 offset,
295 u32 bitmask, u32 value);
296u32 r8712_get_rf_reg(struct _adapter *Adapter, u8 path, u8 offset,
297 u32 bitmask);
298u8 r8712_set_rf_reg(struct _adapter *Adapter, u8 path, u8 offset,
299 u32 bitmask, u32 value);
300
301void r8712_SetChannel(struct _adapter *pAdapter);
302void r8712_SetTxPower(struct _adapter *pAdapte);
303void r8712_SetTxAGCOffset(struct _adapter *pAdapter, u32 ulTxAGCOffset);
304void r8712_SetDataRate(struct _adapter *pAdapter);
305void r8712_SwitchBandwidth(struct _adapter *pAdapter);
306void r8712_SwitchAntenna(struct _adapter *pAdapter);
307void r8712_SetCrystalCap(struct _adapter *pAdapter);
308void r8712_GetThermalMeter(struct _adapter *pAdapter, u32 *value);
309void r8712_SetContinuousTx(struct _adapter *pAdapter, u8 bStart);
310void r8712_SetSingleCarrierTx(struct _adapter *pAdapter, u8 bStart);
311void r8712_SetSingleToneTx(struct _adapter *pAdapter, u8 bStart);
312void r8712_SetCarrierSuppressionTx(struct _adapter *pAdapter, u8 bStart);
313void r8712_ResetPhyRxPktCount(struct _adapter *pAdapter);
314u32 r8712_GetPhyRxPktReceived(struct _adapter *pAdapter);
315u32 r8712_GetPhyRxPktCRC32Error(struct _adapter *pAdapter);
316
317#endif /*__RTL871X_MP_H_*/
318
diff --git a/drivers/staging/rtl8712/rtl871x_mp_ioctl.c b/drivers/staging/rtl8712/rtl871x_mp_ioctl.c
new file mode 100644
index 00000000000..d60aaa9c487
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_mp_ioctl.c
@@ -0,0 +1,1475 @@
1/******************************************************************************
2 * rtl871x_mp_ioctl.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_MP_IOCTL_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "mlme_osdep.h"
34#include "rtl871x_mp.h"
35#include "rtl871x_mp_ioctl.h"
36
37uint oid_null_function(struct oid_par_priv *poid_par_priv)
38{
39 return NDIS_STATUS_SUCCESS;
40}
41
42uint oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
43{
44 uint status = NDIS_STATUS_SUCCESS;
45 struct _adapter *Adapter = (struct _adapter *)
46 (poid_par_priv->adapter_context);
47
48 if (poid_par_priv->type_of_oid == SET_OID) {
49 if (poid_par_priv->information_buf_len >= sizeof(u8))
50 Adapter->registrypriv.wireless_mode =
51 *(u8 *)poid_par_priv->information_buf;
52 else
53 status = NDIS_STATUS_INVALID_LENGTH;
54 } else if (poid_par_priv->type_of_oid == QUERY_OID) {
55 if (poid_par_priv->information_buf_len >= sizeof(u8)) {
56 *(u8 *)poid_par_priv->information_buf =
57 Adapter->registrypriv.wireless_mode;
58 *poid_par_priv->bytes_rw =
59 poid_par_priv->information_buf_len;
60 } else
61 status = NDIS_STATUS_INVALID_LENGTH;
62 } else {
63 status = NDIS_STATUS_NOT_ACCEPTED;
64 }
65 return status;
66}
67
68uint oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
69{
70 uint status = NDIS_STATUS_SUCCESS;
71 struct _adapter *Adapter = (struct _adapter *)
72 (poid_par_priv->adapter_context);
73 struct bb_reg_param *pbbreg;
74 u16 offset;
75 u32 value;
76
77 if (poid_par_priv->type_of_oid != SET_OID)
78 return NDIS_STATUS_NOT_ACCEPTED;
79 if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
80 return NDIS_STATUS_INVALID_LENGTH;
81 pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
82 offset = (u16)(pbbreg->offset) & 0xFFF; /*0ffset :0x800~0xfff*/
83 if (offset < BB_REG_BASE_ADDR)
84 offset |= BB_REG_BASE_ADDR;
85 value = pbbreg->value;
86 r8712_bb_reg_write(Adapter, offset, value);
87 return status;
88}
89
90uint oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
91{
92 uint status = NDIS_STATUS_SUCCESS;
93 struct _adapter *Adapter = (struct _adapter *)
94 (poid_par_priv->adapter_context);
95 struct bb_reg_param *pbbreg;
96 u16 offset;
97 u32 value;
98
99 if (poid_par_priv->type_of_oid != QUERY_OID)
100 return NDIS_STATUS_NOT_ACCEPTED;
101 if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
102 return NDIS_STATUS_INVALID_LENGTH;
103 pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
104 offset = (u16)(pbbreg->offset) & 0xFFF; /*0ffset :0x800~0xfff*/
105 if (offset < BB_REG_BASE_ADDR)
106 offset |= BB_REG_BASE_ADDR;
107 value = r8712_bb_reg_read(Adapter, offset);
108 pbbreg->value = value;
109 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
110 return status;
111}
112
113uint oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
114{
115 uint status = NDIS_STATUS_SUCCESS;
116 struct _adapter *Adapter = (struct _adapter *)
117 (poid_par_priv->adapter_context);
118 struct rf_reg_param *pbbreg;
119 u8 path;
120 u8 offset;
121 u32 value;
122
123 if (poid_par_priv->type_of_oid != SET_OID)
124 return NDIS_STATUS_NOT_ACCEPTED;
125 if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
126 return NDIS_STATUS_INVALID_LENGTH;
127 pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
128 path = (u8)pbbreg->path;
129 if (path > RF_PATH_B)
130 return NDIS_STATUS_NOT_ACCEPTED;
131 offset = (u8)pbbreg->offset;
132 value = pbbreg->value;
133 r8712_rf_reg_write(Adapter, path, offset, value);
134 return status;
135}
136
137uint oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
138{
139 struct _adapter *Adapter = (struct _adapter *)
140 (poid_par_priv->adapter_context);
141 uint status = NDIS_STATUS_SUCCESS;
142 struct rf_reg_param *pbbreg;
143 u8 path;
144 u8 offset;
145 u32 value;
146
147 if (poid_par_priv->type_of_oid != QUERY_OID)
148 return NDIS_STATUS_NOT_ACCEPTED;
149 if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
150 return NDIS_STATUS_INVALID_LENGTH;
151 pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
152 path = (u8)pbbreg->path;
153 if (path > RF_PATH_B) /* 1T2R path_a /path_b */
154 return NDIS_STATUS_NOT_ACCEPTED;
155 offset = (u8)pbbreg->offset;
156 value = r8712_rf_reg_read(Adapter, path, offset);
157 pbbreg->value = value;
158 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
159 return status;
160}
161
162/*This function initializes the DUT to the MP test mode*/
163static int mp_start_test(struct _adapter *padapter)
164{
165 struct mp_priv *pmppriv = &padapter->mppriv;
166 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
167 struct wlan_network *tgt_network = &pmlmepriv->cur_network;
168 struct ndis_wlan_bssid_ex bssid;
169 struct sta_info *psta;
170 unsigned long length;
171 unsigned long irqL;
172 int res = _SUCCESS;
173
174 /* 3 1. initialize a new struct ndis_wlan_bssid_ex */
175 memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN);
176 bssid.Ssid.SsidLength = 16;
177 memcpy(bssid.Ssid.Ssid, (unsigned char *)"mp_pseudo_adhoc",
178 bssid.Ssid.SsidLength);
179 bssid.InfrastructureMode = Ndis802_11IBSS;
180 bssid.NetworkTypeInUse = Ndis802_11DS;
181 bssid.IELength = 0;
182 length = r8712_get_ndis_wlan_bssid_ex_sz(&bssid);
183 if (length % 4) {
184 /*round up to multiple of 4 bytes.*/
185 bssid.Length = ((length >> 2) + 1) << 2;
186 } else
187 bssid.Length = length;
188 spin_lock_irqsave(&pmlmepriv->lock, irqL);
189 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true)
190 goto end_of_mp_start_test;
191 /*init mp_start_test status*/
192 pmppriv->prev_fw_state = get_fwstate(pmlmepriv);
193 pmlmepriv->fw_state = WIFI_MP_STATE;
194 if (pmppriv->mode == _LOOPBOOK_MODE_)
195 set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); /*append txdesc*/
196 set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
197 /* 3 2. create a new psta for mp driver */
198 /* clear psta in the cur_network, if any */
199 psta = r8712_get_stainfo(&padapter->stapriv,
200 tgt_network->network.MacAddress);
201 if (psta)
202 r8712_free_stainfo(padapter, psta);
203 psta = r8712_alloc_stainfo(&padapter->stapriv, bssid.MacAddress);
204 if (psta == NULL) {
205 res = _FAIL;
206 goto end_of_mp_start_test;
207 }
208 /* 3 3. join psudo AdHoc */
209 tgt_network->join_res = 1;
210 tgt_network->aid = psta->aid = 1;
211 memcpy(&tgt_network->network, &bssid, length);
212 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
213 r8712_os_indicate_connect(padapter);
214 /* Set to LINKED STATE for MP TRX Testing */
215 set_fwstate(pmlmepriv, _FW_LINKED);
216end_of_mp_start_test:
217 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
218 return res;
219}
220
221/*This function change the DUT from the MP test mode into normal mode */
222static int mp_stop_test(struct _adapter *padapter)
223{
224 struct mp_priv *pmppriv = &padapter->mppriv;
225 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
226 struct wlan_network *tgt_network = &pmlmepriv->cur_network;
227 struct sta_info *psta;
228 unsigned long irqL;
229
230 spin_lock_irqsave(&pmlmepriv->lock, irqL);
231 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == false)
232 goto end_of_mp_stop_test;
233 /* 3 1. disconnect psudo AdHoc */
234 r8712_os_indicate_disconnect(padapter);
235 /* 3 2. clear psta used in mp test mode. */
236 psta = r8712_get_stainfo(&padapter->stapriv,
237 tgt_network->network.MacAddress);
238 if (psta)
239 r8712_free_stainfo(padapter, psta);
240 /* 3 3. return to normal state (default:station mode) */
241 pmlmepriv->fw_state = pmppriv->prev_fw_state; /* WIFI_STATION_STATE;*/
242 /*flush the cur_network*/
243 memset(tgt_network, 0, sizeof(struct wlan_network));
244end_of_mp_stop_test:
245 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
246 return _SUCCESS;
247}
248
249int mp_start_joinbss(struct _adapter *padapter, struct ndis_802_11_ssid *pssid)
250{
251 struct mp_priv *pmppriv = &padapter->mppriv;
252 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
253 unsigned char res = _SUCCESS;
254
255 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == false)
256 return _FAIL;
257 if (check_fwstate(pmlmepriv, _FW_LINKED) == false)
258 return _FAIL;
259 _clr_fwstate_(pmlmepriv, _FW_LINKED);
260 res = r8712_setassocsta_cmd(padapter, pmppriv->network_macaddr);
261 set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
262 return res;
263}
264
265uint oid_rt_pro_set_data_rate_hdl(struct oid_par_priv
266 *poid_par_priv)
267{
268 struct _adapter *Adapter = (struct _adapter *)
269 (poid_par_priv->adapter_context);
270 uint status = NDIS_STATUS_SUCCESS;
271 u32 ratevalue;
272
273 if (poid_par_priv->type_of_oid != SET_OID)
274 return NDIS_STATUS_NOT_ACCEPTED;
275 if (poid_par_priv->information_buf_len != sizeof(u32))
276 return NDIS_STATUS_INVALID_LENGTH;
277 ratevalue = *((u32 *)poid_par_priv->information_buf);
278 if (ratevalue >= MPT_RATE_LAST)
279 return NDIS_STATUS_INVALID_DATA;
280 Adapter->mppriv.curr_rateidx = ratevalue;
281 r8712_SetDataRate(Adapter);
282 return status;
283}
284
285uint oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv)
286{
287 struct _adapter *Adapter = (struct _adapter *)
288 (poid_par_priv->adapter_context);
289 uint status = NDIS_STATUS_SUCCESS;
290 u32 mode;
291 u8 val8;
292
293 if (poid_par_priv->type_of_oid != SET_OID)
294 return NDIS_STATUS_NOT_ACCEPTED;
295 mode = *((u32 *)poid_par_priv->information_buf);
296 Adapter->mppriv.mode = mode;/* 1 for loopback*/
297 if (mp_start_test(Adapter) == _FAIL)
298 status = NDIS_STATUS_NOT_ACCEPTED;
299 r8712_write8(Adapter, MSR, 1); /* Link in ad hoc network, 0x1025004C */
300 r8712_write8(Adapter, RCR, 0); /* RCR : disable all pkt, 0x10250048 */
301 /* RCR disable Check BSSID, 0x1025004a */
302 r8712_write8(Adapter, RCR+2, 0x57);
303 /* disable RX filter map , mgt frames will put in RX FIFO 0 */
304 r8712_write16(Adapter, RXFLTMAP0, 0x0);
305 val8 = r8712_read8(Adapter, EE_9346CR);
306 if (!(val8 & _9356SEL)) { /*boot from EFUSE*/
307 r8712_efuse_reg_init(Adapter);
308 r8712_efuse_change_max_size(Adapter);
309 r8712_efuse_reg_uninit(Adapter);
310 }
311 return status;
312}
313
314uint oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv)
315{
316 struct _adapter *Adapter = (struct _adapter *)
317 (poid_par_priv->adapter_context);
318 uint status = NDIS_STATUS_SUCCESS;
319
320 if (poid_par_priv->type_of_oid != SET_OID)
321 return NDIS_STATUS_NOT_ACCEPTED;
322 if (mp_stop_test(Adapter) == _FAIL)
323 status = NDIS_STATUS_NOT_ACCEPTED;
324 return status;
325}
326
327uint oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv
328 *poid_par_priv)
329{
330 struct _adapter *Adapter = (struct _adapter *)
331 (poid_par_priv->adapter_context);
332 uint status = NDIS_STATUS_SUCCESS;
333 u32 Channel;
334
335 if (poid_par_priv->type_of_oid != SET_OID)
336 return NDIS_STATUS_NOT_ACCEPTED;
337 if (poid_par_priv->information_buf_len != sizeof(u32))
338 return NDIS_STATUS_INVALID_LENGTH;
339 Channel = *((u32 *)poid_par_priv->information_buf);
340 if (Channel > 14)
341 return NDIS_STATUS_NOT_ACCEPTED;
342 Adapter->mppriv.curr_ch = Channel;
343 r8712_SetChannel(Adapter);
344 return status;
345}
346
347uint oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv)
348{
349 struct _adapter *Adapter = (struct _adapter *)
350 (poid_par_priv->adapter_context);
351 uint status = NDIS_STATUS_SUCCESS;
352 u32 antenna;
353
354 if (poid_par_priv->type_of_oid != SET_OID)
355 return NDIS_STATUS_NOT_ACCEPTED;
356 if (poid_par_priv->information_buf_len != sizeof(u32))
357 return NDIS_STATUS_INVALID_LENGTH;
358 antenna = *((u32 *)poid_par_priv->information_buf);
359 Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16);
360 Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF);
361 r8712_SwitchAntenna(Adapter);
362 return status;
363}
364
365uint oid_rt_pro_set_tx_power_control_hdl(
366 struct oid_par_priv *poid_par_priv)
367{
368 struct _adapter *Adapter = (struct _adapter *)
369 (poid_par_priv->adapter_context);
370 uint status = NDIS_STATUS_SUCCESS;
371 u32 tx_pwr_idx;
372
373 if (poid_par_priv->type_of_oid != SET_OID)
374 return NDIS_STATUS_NOT_ACCEPTED;
375 if (poid_par_priv->information_buf_len != sizeof(u32))
376 return NDIS_STATUS_INVALID_LENGTH;
377 tx_pwr_idx = *((u32 *)poid_par_priv->information_buf);
378 if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE)
379 return NDIS_STATUS_NOT_ACCEPTED;
380 Adapter->mppriv.curr_txpoweridx = (u8)tx_pwr_idx;
381 r8712_SetTxPower(Adapter);
382 return status;
383}
384
385uint oid_rt_pro_query_tx_packet_sent_hdl(
386 struct oid_par_priv *poid_par_priv)
387{
388 uint status = NDIS_STATUS_SUCCESS;
389 struct _adapter *Adapter = (struct _adapter *)
390 (poid_par_priv->adapter_context);
391
392 if (poid_par_priv->type_of_oid != QUERY_OID) {
393 status = NDIS_STATUS_NOT_ACCEPTED;
394 return status;
395 }
396 if (poid_par_priv->information_buf_len == sizeof(u32)) {
397 *(u32 *)poid_par_priv->information_buf =
398 Adapter->mppriv.tx_pktcount;
399 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
400 } else
401 status = NDIS_STATUS_INVALID_LENGTH;
402 return status;
403}
404
405uint oid_rt_pro_query_rx_packet_received_hdl(
406 struct oid_par_priv *poid_par_priv)
407{
408 uint status = NDIS_STATUS_SUCCESS;
409 struct _adapter *Adapter = (struct _adapter *)
410 (poid_par_priv->adapter_context);
411
412 if (poid_par_priv->type_of_oid != QUERY_OID) {
413 status = NDIS_STATUS_NOT_ACCEPTED;
414 return status;
415 }
416 if (poid_par_priv->information_buf_len == sizeof(u32)) {
417 *(u32 *)poid_par_priv->information_buf =
418 Adapter->mppriv.rx_pktcount;
419 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
420 } else
421 status = NDIS_STATUS_INVALID_LENGTH;
422 return status;
423}
424
425uint oid_rt_pro_query_rx_packet_crc32_error_hdl(
426 struct oid_par_priv *poid_par_priv)
427{
428 uint status = NDIS_STATUS_SUCCESS;
429 struct _adapter *Adapter = (struct _adapter *)
430 (poid_par_priv->adapter_context);
431
432 if (poid_par_priv->type_of_oid != QUERY_OID) {
433 status = NDIS_STATUS_NOT_ACCEPTED;
434 return status;
435 }
436 if (poid_par_priv->information_buf_len == sizeof(u32)) {
437 *(u32 *)poid_par_priv->information_buf =
438 Adapter->mppriv.rx_crcerrpktcount;
439 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
440 } else
441 status = NDIS_STATUS_INVALID_LENGTH;
442 return status;
443}
444
445uint oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv
446 *poid_par_priv)
447{
448 struct _adapter *Adapter = (struct _adapter *)
449 (poid_par_priv->adapter_context);
450
451 if (poid_par_priv->type_of_oid != SET_OID)
452 return NDIS_STATUS_NOT_ACCEPTED;
453 Adapter->mppriv.tx_pktcount = 0;
454 return NDIS_STATUS_SUCCESS;
455}
456
457uint oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv
458 *poid_par_priv)
459{
460 uint status = NDIS_STATUS_SUCCESS;
461 struct _adapter *Adapter = (struct _adapter *)
462 (poid_par_priv->adapter_context);
463
464 if (poid_par_priv->type_of_oid != SET_OID)
465 return NDIS_STATUS_NOT_ACCEPTED;
466 if (poid_par_priv->information_buf_len == sizeof(u32)) {
467 Adapter->mppriv.rx_pktcount = 0;
468 Adapter->mppriv.rx_crcerrpktcount = 0;
469 } else
470 status = NDIS_STATUS_INVALID_LENGTH;
471 return status;
472}
473
474uint oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv
475 *poid_par_priv)
476{
477 struct _adapter *Adapter = (struct _adapter *)
478 (poid_par_priv->adapter_context);
479
480 if (poid_par_priv->type_of_oid != SET_OID)
481 return NDIS_STATUS_NOT_ACCEPTED;
482 r8712_ResetPhyRxPktCount(Adapter);
483 return NDIS_STATUS_SUCCESS;
484}
485
486uint oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv
487 *poid_par_priv)
488{
489 struct _adapter *Adapter = (struct _adapter *)
490 (poid_par_priv->adapter_context);
491
492 if (poid_par_priv->type_of_oid != QUERY_OID)
493 return NDIS_STATUS_NOT_ACCEPTED;
494 if (poid_par_priv->information_buf_len != sizeof(u32))
495 return NDIS_STATUS_INVALID_LENGTH;
496 *(u32 *)poid_par_priv->information_buf =
497 r8712_GetPhyRxPktReceived(Adapter);
498 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
499 return NDIS_STATUS_SUCCESS;
500}
501
502uint oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv
503 *poid_par_priv)
504{
505 struct _adapter *Adapter = (struct _adapter *)
506 (poid_par_priv->adapter_context);
507
508 if (poid_par_priv->type_of_oid != QUERY_OID)
509 return NDIS_STATUS_NOT_ACCEPTED;
510 if (poid_par_priv->information_buf_len != sizeof(u32))
511 return NDIS_STATUS_INVALID_LENGTH;
512 *(u32 *)poid_par_priv->information_buf =
513 r8712_GetPhyRxPktCRC32Error(Adapter);
514 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
515 return NDIS_STATUS_SUCCESS;
516}
517
518uint oid_rt_pro_set_modulation_hdl(struct oid_par_priv
519 *poid_par_priv)
520{
521 struct _adapter *Adapter = (struct _adapter *)
522 (poid_par_priv->adapter_context);
523
524 if (poid_par_priv->type_of_oid != SET_OID)
525 return NDIS_STATUS_NOT_ACCEPTED;
526
527 Adapter->mppriv.curr_modem = *((u8 *)poid_par_priv->information_buf);
528 return NDIS_STATUS_SUCCESS;
529}
530
531uint oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv
532 *poid_par_priv)
533{
534 struct _adapter *Adapter = (struct _adapter *)
535 (poid_par_priv->adapter_context);
536 u32 bStartTest;
537
538 if (poid_par_priv->type_of_oid != SET_OID)
539 return NDIS_STATUS_NOT_ACCEPTED;
540 bStartTest = *((u32 *)poid_par_priv->information_buf);
541 r8712_SetContinuousTx(Adapter, (u8)bStartTest);
542 return NDIS_STATUS_SUCCESS;
543}
544
545uint oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv
546 *poid_par_priv)
547{
548 struct _adapter *Adapter = (struct _adapter *)
549 (poid_par_priv->adapter_context);
550 u32 bStartTest;
551
552 if (poid_par_priv->type_of_oid != SET_OID)
553 return NDIS_STATUS_NOT_ACCEPTED;
554 bStartTest = *((u32 *)poid_par_priv->information_buf);
555 r8712_SetSingleCarrierTx(Adapter, (u8)bStartTest);
556 return NDIS_STATUS_SUCCESS;
557}
558
559uint oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv
560 *poid_par_priv)
561{
562 struct _adapter *Adapter = (struct _adapter *)
563 (poid_par_priv->adapter_context);
564 u32 bStartTest;
565
566 if (poid_par_priv->type_of_oid != SET_OID)
567 return NDIS_STATUS_NOT_ACCEPTED;
568 bStartTest = *((u32 *)poid_par_priv->information_buf);
569 r8712_SetCarrierSuppressionTx(Adapter, (u8)bStartTest);
570 return NDIS_STATUS_SUCCESS;
571}
572
573uint oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv
574 *poid_par_priv)
575{
576 struct _adapter *Adapter = (struct _adapter *)
577 (poid_par_priv->adapter_context);
578 u32 bStartTest;
579
580 if (poid_par_priv->type_of_oid != SET_OID)
581 return NDIS_STATUS_NOT_ACCEPTED;
582 bStartTest = *((u32 *)poid_par_priv->information_buf);
583 r8712_SetSingleToneTx(Adapter, (u8)bStartTest);
584 return NDIS_STATUS_SUCCESS;
585}
586
587uint oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv)
588{
589 struct _adapter *Adapter = (struct _adapter *)
590 (poid_par_priv->adapter_context);
591 uint status = NDIS_STATUS_SUCCESS;
592 struct ndis_802_11_ssid *pssid;
593
594 if (poid_par_priv->type_of_oid != SET_OID)
595 return NDIS_STATUS_NOT_ACCEPTED;
596 *poid_par_priv->bytes_needed = (u32)sizeof(struct ndis_802_11_ssid);
597 *poid_par_priv->bytes_rw = 0;
598 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
599 return NDIS_STATUS_INVALID_LENGTH;
600 pssid = (struct ndis_802_11_ssid *)poid_par_priv->information_buf;
601 if (mp_start_joinbss(Adapter, pssid) == _FAIL)
602 status = NDIS_STATUS_NOT_ACCEPTED;
603 *poid_par_priv->bytes_rw = sizeof(struct ndis_802_11_ssid);
604 return status;
605}
606
607uint oid_rt_pro_read_register_hdl(struct oid_par_priv
608 *poid_par_priv)
609{
610 struct _adapter *Adapter = (struct _adapter *)
611 (poid_par_priv->adapter_context);
612 uint status = NDIS_STATUS_SUCCESS;
613 struct mp_rw_reg *RegRWStruct;
614 u16 offset;
615
616 if (poid_par_priv->type_of_oid != QUERY_OID)
617 return NDIS_STATUS_NOT_ACCEPTED;
618 RegRWStruct = (struct mp_rw_reg *)poid_par_priv->information_buf;
619 if ((RegRWStruct->offset >= 0x10250800) &&
620 (RegRWStruct->offset <= 0x10250FFF)) {
621 /*baseband register*/
622 /*0ffset :0x800~0xfff*/
623 offset = (u16)(RegRWStruct->offset) & 0xFFF;
624 RegRWStruct->value = r8712_bb_reg_read(Adapter, offset);
625 } else {
626 switch (RegRWStruct->width) {
627 case 1:
628 RegRWStruct->value = r8712_read8(Adapter,
629 RegRWStruct->offset);
630 break;
631 case 2:
632 RegRWStruct->value = r8712_read16(Adapter,
633 RegRWStruct->offset);
634 break;
635 case 4:
636 RegRWStruct->value = r8712_read32(Adapter,
637 RegRWStruct->offset);
638 break;
639 default:
640 status = NDIS_STATUS_NOT_ACCEPTED;
641 break;
642 }
643 }
644 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
645 return status;
646}
647
648uint oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv)
649{
650 struct _adapter *Adapter = (struct _adapter *)
651 (poid_par_priv->adapter_context);
652 uint status = NDIS_STATUS_SUCCESS;
653 struct mp_rw_reg *RegRWStruct;
654 u16 offset;
655 u32 value;
656 u32 oldValue = 0;
657
658 if (poid_par_priv->type_of_oid != SET_OID)
659 return NDIS_STATUS_NOT_ACCEPTED;
660 RegRWStruct = (struct mp_rw_reg *)poid_par_priv->information_buf;
661 if ((RegRWStruct->offset >= 0x10250800) &&
662 (RegRWStruct->offset <= 0x10250FFF)) {
663 /*baseband register*/
664 offset = (u16)(RegRWStruct->offset) & 0xFFF;
665 value = RegRWStruct->value;
666 switch (RegRWStruct->width) {
667 case 1:
668 oldValue = r8712_bb_reg_read(Adapter, offset);
669 oldValue &= 0xFFFFFF00;
670 value &= 0x000000FF;
671 value |= oldValue;
672 break;
673 case 2:
674 oldValue = r8712_bb_reg_read(Adapter, offset);
675 oldValue &= 0xFFFF0000;
676 value &= 0x0000FFFF;
677 value |= oldValue;
678 break;
679 }
680 r8712_bb_reg_write(Adapter, offset, value);
681 } else {
682 switch (RegRWStruct->width) {
683 case 1:
684 r8712_write8(Adapter, RegRWStruct->offset,
685 (unsigned char)RegRWStruct->value);
686 break;
687 case 2:
688 r8712_write16(Adapter, RegRWStruct->offset,
689 (unsigned short)RegRWStruct->value);
690 break;
691 case 4:
692 r8712_write32(Adapter, RegRWStruct->offset,
693 (unsigned int)RegRWStruct->value);
694 break;
695 default:
696 status = NDIS_STATUS_NOT_ACCEPTED;
697 break;
698 }
699
700 if ((status == NDIS_STATUS_SUCCESS) &&
701 (RegRWStruct->offset == HIMR) &&
702 (RegRWStruct->width == 4))
703 Adapter->ImrContent = RegRWStruct->value;
704 }
705 return status;
706}
707
708uint oid_rt_pro_burst_read_register_hdl(struct oid_par_priv
709 *poid_par_priv)
710{
711 struct _adapter *Adapter = (struct _adapter *)
712 (poid_par_priv->adapter_context);
713 struct burst_rw_reg *pBstRwReg;
714
715 if (poid_par_priv->type_of_oid != QUERY_OID)
716 return NDIS_STATUS_NOT_ACCEPTED;
717 pBstRwReg = (struct burst_rw_reg *)poid_par_priv->information_buf;
718 r8712_read_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len,
719 pBstRwReg->Data);
720 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
721 return NDIS_STATUS_SUCCESS;
722}
723
724uint oid_rt_pro_burst_write_register_hdl(struct oid_par_priv
725 *poid_par_priv)
726{
727 struct _adapter *Adapter = (struct _adapter *)
728 (poid_par_priv->adapter_context);
729 struct burst_rw_reg *pBstRwReg;
730
731 if (poid_par_priv->type_of_oid != SET_OID)
732 return NDIS_STATUS_NOT_ACCEPTED;
733 pBstRwReg = (struct burst_rw_reg *)poid_par_priv->information_buf;
734 r8712_write_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len,
735 pBstRwReg->Data);
736 return NDIS_STATUS_SUCCESS;
737}
738
739uint oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv)
740{
741 return NDIS_STATUS_SUCCESS;
742}
743
744uint oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv)
745{
746 struct _adapter *Adapter = (struct _adapter *)
747 (poid_par_priv->adapter_context);
748 struct eeprom_rw_param *pEEPROM;
749
750 if (poid_par_priv->type_of_oid != QUERY_OID)
751 return NDIS_STATUS_NOT_ACCEPTED;
752 pEEPROM = (struct eeprom_rw_param *)poid_par_priv->information_buf;
753 pEEPROM->value = r8712_eeprom_read16(Adapter,
754 (u16)(pEEPROM->offset >> 1));
755 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
756 return NDIS_STATUS_SUCCESS;
757}
758
759uint oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv)
760{
761 struct _adapter *Adapter = (struct _adapter *)
762 (poid_par_priv->adapter_context);
763 struct eeprom_rw_param *pEEPROM;
764
765 if (poid_par_priv->type_of_oid != SET_OID)
766 return NDIS_STATUS_NOT_ACCEPTED;
767 pEEPROM = (struct eeprom_rw_param *)poid_par_priv->information_buf;
768 r8712_eeprom_write16(Adapter, (u16)(pEEPROM->offset >> 1),
769 pEEPROM->value);
770 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
771 return NDIS_STATUS_SUCCESS;
772}
773
774uint oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv)
775{
776 struct _adapter *Adapter = (struct _adapter *)
777 (poid_par_priv->adapter_context);
778 struct mp_wiparam *pwi_param;
779
780 if (poid_par_priv->type_of_oid != QUERY_OID)
781 return NDIS_STATUS_NOT_ACCEPTED;
782 if (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam))
783 return NDIS_STATUS_INVALID_LENGTH;
784 if (Adapter->mppriv.workparam.bcompleted == false)
785 return NDIS_STATUS_NOT_ACCEPTED;
786 pwi_param = (struct mp_wiparam *)poid_par_priv->information_buf;
787 memcpy(pwi_param, &Adapter->mppriv.workparam,
788 sizeof(struct mp_wiparam));
789 Adapter->mppriv.act_in_progress = false;
790 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
791 return NDIS_STATUS_SUCCESS;
792}
793
794uint oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv)
795{
796 struct _adapter *Adapter = (struct _adapter *)
797 (poid_par_priv->adapter_context);
798
799 if (poid_par_priv->type_of_oid != QUERY_OID)
800 return NDIS_STATUS_NOT_ACCEPTED;
801 if (poid_par_priv->information_buf_len < sizeof(uint) * 2)
802 return NDIS_STATUS_INVALID_LENGTH;
803 if (*(uint *)poid_par_priv->information_buf == 1)
804 Adapter->mppriv.rx_pktloss = 0;
805 *((uint *)poid_par_priv->information_buf+1) =
806 Adapter->mppriv.rx_pktloss;
807 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
808 return NDIS_STATUS_SUCCESS;
809}
810
811uint oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)
812{
813 if (poid_par_priv->type_of_oid != QUERY_OID)
814 return NDIS_STATUS_NOT_ACCEPTED;
815 return NDIS_STATUS_SUCCESS;
816}
817
818uint oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)
819{
820 if (poid_par_priv->type_of_oid != SET_OID)
821 return NDIS_STATUS_NOT_ACCEPTED;
822 return NDIS_STATUS_SUCCESS;
823}
824
825uint oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv)
826{
827 struct _adapter *Adapter = (struct _adapter *)
828 (poid_par_priv->adapter_context);
829 uint status = NDIS_STATUS_SUCCESS;
830
831 if (poid_par_priv->type_of_oid != SET_OID)
832 return NDIS_STATUS_NOT_ACCEPTED;
833 if (r8712_setrfintfs_cmd(Adapter, *(unsigned char *)
834 poid_par_priv->information_buf) == _FAIL)
835 status = NDIS_STATUS_NOT_ACCEPTED;
836 return status;
837}
838
839uint oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv)
840{
841 struct _adapter *Adapter = (struct _adapter *)
842 (poid_par_priv->adapter_context);
843 uint status = NDIS_STATUS_SUCCESS;
844
845 if (poid_par_priv->type_of_oid != QUERY_OID)
846 return NDIS_STATUS_NOT_ACCEPTED;
847 memcpy(poid_par_priv->information_buf,
848 (unsigned char *)&Adapter->mppriv.rxstat,
849 sizeof(struct recv_stat));
850 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
851 return status;
852}
853
854uint oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv
855 *poid_par_priv)
856{
857 return NDIS_STATUS_SUCCESS;
858}
859
860uint oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv
861 *poid_par_priv)
862{
863 struct _adapter *Adapter = (struct _adapter *)
864 (poid_par_priv->adapter_context);
865 uint status = NDIS_STATUS_SUCCESS;
866
867 if (poid_par_priv->type_of_oid != SET_OID)
868 return NDIS_STATUS_NOT_ACCEPTED;
869 if (r8712_setdatarate_cmd(Adapter,
870 poid_par_priv->information_buf) != _SUCCESS)
871 status = NDIS_STATUS_NOT_ACCEPTED;
872 return status;
873}
874
875uint oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv)
876{
877 struct _adapter *Adapter = (struct _adapter *)
878 (poid_par_priv->adapter_context);
879 uint status = NDIS_STATUS_SUCCESS;
880
881 if (poid_par_priv->type_of_oid != QUERY_OID)
882 return NDIS_STATUS_NOT_ACCEPTED;
883
884 if (Adapter->mppriv.act_in_progress == true)
885 return NDIS_STATUS_NOT_ACCEPTED;
886
887 if (poid_par_priv->information_buf_len < sizeof(u8))
888 return NDIS_STATUS_INVALID_LENGTH;
889 /*init workparam*/
890 Adapter->mppriv.act_in_progress = true;
891 Adapter->mppriv.workparam.bcompleted = false;
892 Adapter->mppriv.workparam.act_type = MPT_GET_THERMAL_METER;
893 Adapter->mppriv.workparam.io_offset = 0;
894 Adapter->mppriv.workparam.io_value = 0xFFFFFFFF;
895 r8712_GetThermalMeter(Adapter, &Adapter->mppriv.workparam.io_value);
896 Adapter->mppriv.workparam.bcompleted = true;
897 Adapter->mppriv.act_in_progress = false;
898 *(u32 *)poid_par_priv->information_buf =
899 Adapter->mppriv.workparam.io_value;
900 *poid_par_priv->bytes_rw = sizeof(u32);
901 return status;
902}
903
904uint oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv
905 *poid_par_priv)
906{
907 struct _adapter *Adapter = (struct _adapter *)
908 (poid_par_priv->adapter_context);
909 uint status = NDIS_STATUS_SUCCESS;
910
911 if (poid_par_priv->type_of_oid != SET_OID)
912 return NDIS_STATUS_NOT_ACCEPTED;
913 if (poid_par_priv->information_buf_len < sizeof(u8))
914 return NDIS_STATUS_INVALID_LENGTH;
915 if (!r8712_setptm_cmd(Adapter, *((u8 *)poid_par_priv->information_buf)))
916 status = NDIS_STATUS_NOT_ACCEPTED;
917 return status;
918}
919
920uint oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv)
921{
922 struct _adapter *Adapter = (struct _adapter *)
923 (poid_par_priv->adapter_context);
924 u8 mpdatarate[NumRates] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff};
925 uint status = NDIS_STATUS_SUCCESS;
926 u32 ratevalue;
927 u8 datarates[NumRates];
928 int i;
929
930 if (poid_par_priv->type_of_oid != SET_OID)
931 return NDIS_STATUS_NOT_ACCEPTED;
932 ratevalue = *((u32 *)poid_par_priv->information_buf);
933 for (i = 0; i < NumRates; i++) {
934 if (ratevalue == mpdatarate[i])
935 datarates[i] = mpdatarate[i];
936 else
937 datarates[i] = 0xff;
938 }
939 if (r8712_setbasicrate_cmd(Adapter, datarates) != _SUCCESS)
940 status = NDIS_STATUS_NOT_ACCEPTED;
941 return status;
942}
943
944uint oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
945{
946 struct _adapter *Adapter = (struct _adapter *)
947 (poid_par_priv->adapter_context);
948
949 if (poid_par_priv->type_of_oid != QUERY_OID)
950 return NDIS_STATUS_NOT_ACCEPTED;
951 if (poid_par_priv->information_buf_len < 8)
952 return NDIS_STATUS_INVALID_LENGTH;
953 *poid_par_priv->bytes_rw = 8;
954 memcpy(poid_par_priv->information_buf,
955 &(Adapter->pwrctrlpriv.pwr_mode), 8);
956 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
957 return NDIS_STATUS_SUCCESS;
958}
959
960uint oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
961{
962 struct _adapter *Adapter = (struct _adapter *)
963 (poid_par_priv->adapter_context);
964 uint pwr_mode, smart_ps;
965
966 if (poid_par_priv->type_of_oid != SET_OID)
967 return NDIS_STATUS_NOT_ACCEPTED;
968 *poid_par_priv->bytes_rw = 0;
969 *poid_par_priv->bytes_needed = 8;
970 if (poid_par_priv->information_buf_len < 8)
971 return NDIS_STATUS_INVALID_LENGTH;
972 pwr_mode = *(uint *)(poid_par_priv->information_buf);
973 smart_ps = *(uint *)((addr_t)poid_par_priv->information_buf + 4);
974 if (pwr_mode != Adapter->pwrctrlpriv.pwr_mode || smart_ps !=
975 Adapter->pwrctrlpriv.smart_ps)
976 r8712_set_ps_mode(Adapter, pwr_mode, smart_ps);
977 *poid_par_priv->bytes_rw = 8;
978 return NDIS_STATUS_SUCCESS;
979}
980
981uint oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv
982 *poid_par_priv)
983{
984 struct _adapter *Adapter = (struct _adapter *)
985 (poid_par_priv->adapter_context);
986 uint status = NDIS_STATUS_SUCCESS;
987 struct setratable_parm *prate_table;
988 u8 res;
989
990 if (poid_par_priv->type_of_oid != SET_OID)
991 return NDIS_STATUS_NOT_ACCEPTED;
992 *poid_par_priv->bytes_needed = sizeof(struct setratable_parm);
993 if (poid_par_priv->information_buf_len <
994 sizeof(struct setratable_parm))
995 return NDIS_STATUS_INVALID_LENGTH;
996 prate_table = (struct setratable_parm *)poid_par_priv->information_buf;
997 res = r8712_setrttbl_cmd(Adapter, prate_table);
998 if (res == _FAIL)
999 status = NDIS_STATUS_FAILURE;
1000 return status;
1001}
1002
1003uint oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv
1004 *poid_par_priv)
1005{
1006 if (poid_par_priv->type_of_oid != QUERY_OID)
1007 return NDIS_STATUS_NOT_ACCEPTED;
1008 return NDIS_STATUS_SUCCESS;
1009}
1010
1011uint oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv
1012 *poid_par_priv)
1013{
1014 struct _adapter *Adapter = (struct _adapter *)
1015 (poid_par_priv->adapter_context);
1016 struct security_priv *psecuritypriv = &Adapter->securitypriv;
1017 enum ENCRY_CTRL_STATE encry_mode = 0;
1018
1019 *poid_par_priv->bytes_needed = sizeof(u8);
1020 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1021 return NDIS_STATUS_INVALID_LENGTH;
1022
1023 if (poid_par_priv->type_of_oid == SET_OID) {
1024 encry_mode = *((u8 *)poid_par_priv->information_buf);
1025 switch (encry_mode) {
1026 case HW_CONTROL:
1027 psecuritypriv->sw_decrypt = false;
1028 psecuritypriv->sw_encrypt = false;
1029 break;
1030 case SW_CONTROL:
1031 psecuritypriv->sw_decrypt = true;
1032 psecuritypriv->sw_encrypt = true;
1033 break;
1034 case HW_ENCRY_SW_DECRY:
1035 psecuritypriv->sw_decrypt = true;
1036 psecuritypriv->sw_encrypt = false;
1037 break;
1038 case SW_ENCRY_HW_DECRY:
1039 psecuritypriv->sw_decrypt = false;
1040 psecuritypriv->sw_encrypt = true;
1041 break;
1042 }
1043 } else {
1044 if ((psecuritypriv->sw_encrypt == false) &&
1045 (psecuritypriv->sw_decrypt == false))
1046 encry_mode = HW_CONTROL;
1047 else if ((psecuritypriv->sw_encrypt == false) &&
1048 (psecuritypriv->sw_decrypt == true))
1049 encry_mode = HW_ENCRY_SW_DECRY;
1050 else if ((psecuritypriv->sw_encrypt == true) &&
1051 (psecuritypriv->sw_decrypt == false))
1052 encry_mode = SW_ENCRY_HW_DECRY;
1053 else if ((psecuritypriv->sw_encrypt == true) &&
1054 (psecuritypriv->sw_decrypt == true))
1055 encry_mode = SW_CONTROL;
1056 *(u8 *)poid_par_priv->information_buf = encry_mode;
1057 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1058 }
1059 return NDIS_STATUS_SUCCESS;
1060}
1061/*----------------------------------------------------------------------*/
1062uint oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv)
1063{
1064 struct _adapter *Adapter = (struct _adapter *)
1065 (poid_par_priv->adapter_context);
1066
1067 uint status = NDIS_STATUS_SUCCESS;
1068
1069 struct sta_info *psta = NULL;
1070 u8 *macaddr;
1071
1072
1073 if (poid_par_priv->type_of_oid != SET_OID)
1074 return NDIS_STATUS_NOT_ACCEPTED;
1075
1076 *poid_par_priv->bytes_needed = ETH_ALEN;
1077 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1078 return NDIS_STATUS_INVALID_LENGTH;
1079 macaddr = (u8 *) poid_par_priv->information_buf;
1080 psta = r8712_get_stainfo(&Adapter->stapriv, macaddr);
1081 if (psta == NULL) { /* the sta in sta_info_queue => do nothing*/
1082 psta = r8712_alloc_stainfo(&Adapter->stapriv, macaddr);
1083 if (psta == NULL)
1084 status = NDIS_STATUS_FAILURE;
1085 }
1086 return status;
1087}
1088/*-------------------------------------------------------------------------*/
1089uint oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv)
1090{
1091 struct _adapter *Adapter = (struct _adapter *)
1092 (poid_par_priv->adapter_context);
1093
1094 unsigned long irqL;
1095 uint status = NDIS_STATUS_SUCCESS;
1096
1097 struct sta_info *psta = NULL;
1098 u8 *macaddr;
1099
1100
1101 if (poid_par_priv->type_of_oid != SET_OID)
1102 return NDIS_STATUS_NOT_ACCEPTED;
1103
1104 *poid_par_priv->bytes_needed = ETH_ALEN;
1105 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1106 return NDIS_STATUS_INVALID_LENGTH;
1107
1108 macaddr = (u8 *)poid_par_priv->information_buf;
1109
1110 psta = r8712_get_stainfo(&Adapter->stapriv, macaddr);
1111 if (psta != NULL) {
1112 spin_lock_irqsave(&(Adapter->stapriv.sta_hash_lock), irqL);
1113 r8712_free_stainfo(Adapter, psta);
1114 spin_unlock_irqrestore(&(Adapter->stapriv.sta_hash_lock), irqL);
1115 }
1116
1117 return status;
1118}
1119/*--------------------------------------------------------------------------*/
1120static u32 mp_query_drv_var(struct _adapter *padapter, u8 offset, u32 var)
1121{
1122 return var;
1123}
1124
1125uint oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv)
1126{
1127 struct _adapter *Adapter = (struct _adapter *)
1128 (poid_par_priv->adapter_context);
1129
1130 uint status = NDIS_STATUS_SUCCESS;
1131
1132 struct DR_VARIABLE_STRUCT *pdrv_var;
1133
1134 if (poid_par_priv->type_of_oid != QUERY_OID)
1135 return NDIS_STATUS_NOT_ACCEPTED;
1136 *poid_par_priv->bytes_needed = sizeof(struct DR_VARIABLE_STRUCT);
1137 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1138 return NDIS_STATUS_INVALID_LENGTH;
1139 pdrv_var = (struct DR_VARIABLE_STRUCT *)poid_par_priv->information_buf;
1140 pdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset,
1141 pdrv_var->variable);
1142 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1143 return status;
1144}
1145
1146/*--------------------------------------------------------------------------*/
1147uint oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)
1148{
1149 return NDIS_STATUS_SUCCESS;
1150}
1151/*------------------------------------------------------------------------*/
1152uint oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv)
1153{
1154 struct _adapter *Adapter = (struct _adapter *)
1155 (poid_par_priv->adapter_context);
1156
1157 uint status = NDIS_STATUS_SUCCESS;
1158
1159 struct EFUSE_ACCESS_STRUCT *pefuse;
1160 u8 *data;
1161 u16 addr = 0, cnts = 0;
1162
1163 if (poid_par_priv->type_of_oid != QUERY_OID)
1164 return NDIS_STATUS_NOT_ACCEPTED;
1165 if (poid_par_priv->information_buf_len <
1166 sizeof(struct EFUSE_ACCESS_STRUCT))
1167 return NDIS_STATUS_INVALID_LENGTH;
1168 pefuse = (struct EFUSE_ACCESS_STRUCT *)poid_par_priv->information_buf;
1169 addr = pefuse->start_addr;
1170 cnts = pefuse->cnts;
1171 data = pefuse->data;
1172 memset(data, 0xFF, cnts);
1173 if ((addr > 511) || (cnts < 1) || (cnts > 512) || (addr + cnts) >
1174 EFUSE_MAX_SIZE)
1175 return NDIS_STATUS_NOT_ACCEPTED;
1176 if (r8712_efuse_access(Adapter, true, addr, cnts, data) == false)
1177 status = NDIS_STATUS_FAILURE;
1178 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1179 return status;
1180}
1181/*------------------------------------------------------------------------*/
1182uint oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv)
1183{
1184 struct _adapter *Adapter = (struct _adapter *)
1185 (poid_par_priv->adapter_context);
1186
1187 uint status = NDIS_STATUS_SUCCESS;
1188
1189 struct EFUSE_ACCESS_STRUCT *pefuse;
1190 u8 *data;
1191 u16 addr = 0, cnts = 0;
1192
1193 if (poid_par_priv->type_of_oid != SET_OID)
1194 return NDIS_STATUS_NOT_ACCEPTED;
1195
1196 pefuse = (struct EFUSE_ACCESS_STRUCT *)poid_par_priv->information_buf;
1197 addr = pefuse->start_addr;
1198 cnts = pefuse->cnts;
1199 data = pefuse->data;
1200
1201 if ((addr > 511) || (cnts < 1) || (cnts > 512) ||
1202 (addr + cnts) > r8712_efuse_get_max_size(Adapter))
1203 return NDIS_STATUS_NOT_ACCEPTED;
1204 if (r8712_efuse_access(Adapter, false, addr, cnts, data) == false)
1205 status = NDIS_STATUS_FAILURE;
1206 return status;
1207}
1208/*----------------------------------------------------------------------*/
1209uint oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv)
1210{
1211 struct _adapter *Adapter = (struct _adapter *)
1212 (poid_par_priv->adapter_context);
1213 uint status = NDIS_STATUS_SUCCESS;
1214 struct PGPKT_STRUCT *ppgpkt;
1215
1216 *poid_par_priv->bytes_rw = 0;
1217 if (poid_par_priv->information_buf_len < sizeof(struct PGPKT_STRUCT))
1218 return NDIS_STATUS_INVALID_LENGTH;
1219 ppgpkt = (struct PGPKT_STRUCT *)poid_par_priv->information_buf;
1220 if (poid_par_priv->type_of_oid == QUERY_OID) {
1221 if (r8712_efuse_pg_packet_read(Adapter, ppgpkt->offset,
1222 ppgpkt->data) == true)
1223 *poid_par_priv->bytes_rw =
1224 poid_par_priv->information_buf_len;
1225 else
1226 status = NDIS_STATUS_FAILURE;
1227 } else {
1228 if (r8712_efuse_reg_init(Adapter) == true) {
1229 if (r8712_efuse_pg_packet_write(Adapter, ppgpkt->offset,
1230 ppgpkt->word_en, ppgpkt->data) == true)
1231 *poid_par_priv->bytes_rw =
1232 poid_par_priv->information_buf_len;
1233 else
1234 status = NDIS_STATUS_FAILURE;
1235 r8712_efuse_reg_uninit(Adapter);
1236 } else
1237 status = NDIS_STATUS_FAILURE;
1238 }
1239 return status;
1240}
1241
1242uint oid_rt_get_efuse_current_size_hdl(struct oid_par_priv
1243 *poid_par_priv)
1244{
1245 struct _adapter *Adapter = (struct _adapter *)
1246 (poid_par_priv->adapter_context);
1247 uint status = NDIS_STATUS_SUCCESS;
1248
1249 if (poid_par_priv->type_of_oid != QUERY_OID)
1250 return NDIS_STATUS_NOT_ACCEPTED;
1251 if (poid_par_priv->information_buf_len < sizeof(int))
1252 return NDIS_STATUS_INVALID_LENGTH;
1253 r8712_efuse_reg_init(Adapter);
1254 *(int *)poid_par_priv->information_buf =
1255 r8712_efuse_get_current_size(Adapter);
1256 r8712_efuse_reg_uninit(Adapter);
1257 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1258 return status;
1259}
1260
1261uint oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv)
1262{
1263 struct _adapter *Adapter = (struct _adapter *)
1264 (poid_par_priv->adapter_context);
1265 uint status = NDIS_STATUS_SUCCESS;
1266
1267 if (poid_par_priv->type_of_oid != QUERY_OID)
1268 return NDIS_STATUS_NOT_ACCEPTED;
1269 if (poid_par_priv->information_buf_len < sizeof(u32))
1270 return NDIS_STATUS_INVALID_LENGTH;
1271 *(int *)poid_par_priv->information_buf =
1272 r8712_efuse_get_max_size(Adapter);
1273 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1274 return status;
1275}
1276
1277uint oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv)
1278{
1279 uint status = NDIS_STATUS_SUCCESS;
1280
1281 if (poid_par_priv->type_of_oid == QUERY_OID)
1282 status = oid_rt_pro_read_efuse_hdl(poid_par_priv);
1283 else
1284 status = oid_rt_pro_write_efuse_hdl(poid_par_priv);
1285 return status;
1286}
1287
1288uint oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv)
1289{
1290 struct _adapter *Adapter = (struct _adapter *)
1291 (poid_par_priv->adapter_context);
1292 uint status = NDIS_STATUS_SUCCESS;
1293 u8 *data;
1294
1295 *poid_par_priv->bytes_rw = 0;
1296 if (poid_par_priv->information_buf_len < EFUSE_MAP_MAX_SIZE)
1297 return NDIS_STATUS_INVALID_LENGTH;
1298 data = (u8 *)poid_par_priv->information_buf;
1299 if (poid_par_priv->type_of_oid == QUERY_OID) {
1300 if (r8712_efuse_map_read(Adapter, 0, EFUSE_MAP_MAX_SIZE, data))
1301 *poid_par_priv->bytes_rw = EFUSE_MAP_MAX_SIZE;
1302 else
1303 status = NDIS_STATUS_FAILURE;
1304 } else {
1305 /* SET_OID */
1306 if (r8712_efuse_reg_init(Adapter) == true) {
1307 if (r8712_efuse_map_write(Adapter, 0,
1308 EFUSE_MAP_MAX_SIZE, data))
1309 *poid_par_priv->bytes_rw = EFUSE_MAP_MAX_SIZE;
1310 else
1311 status = NDIS_STATUS_FAILURE;
1312 r8712_efuse_reg_uninit(Adapter);
1313 } else {
1314 status = NDIS_STATUS_FAILURE;
1315 }
1316 }
1317 return status;
1318}
1319
1320uint oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv)
1321{
1322 struct _adapter *Adapter = (struct _adapter *)
1323 (poid_par_priv->adapter_context);
1324 uint status = NDIS_STATUS_SUCCESS;
1325 u32 bandwidth;
1326
1327 if (poid_par_priv->type_of_oid != SET_OID)
1328 return NDIS_STATUS_NOT_ACCEPTED;
1329 if (poid_par_priv->information_buf_len < sizeof(u32))
1330 return NDIS_STATUS_INVALID_LENGTH;
1331 bandwidth = *((u32 *)poid_par_priv->information_buf);/*4*/
1332 if (bandwidth != HT_CHANNEL_WIDTH_20)
1333 bandwidth = HT_CHANNEL_WIDTH_40;
1334 Adapter->mppriv.curr_bandwidth = (u8)bandwidth;
1335 r8712_SwitchBandwidth(Adapter);
1336 return status;
1337}
1338
1339uint oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv)
1340{
1341 struct _adapter *Adapter = (struct _adapter *)
1342 (poid_par_priv->adapter_context);
1343 uint status = NDIS_STATUS_SUCCESS;
1344 u32 crystal_cap = 0;
1345
1346 if (poid_par_priv->type_of_oid != SET_OID)
1347 return NDIS_STATUS_NOT_ACCEPTED;
1348 if (poid_par_priv->information_buf_len < sizeof(u32))
1349 return NDIS_STATUS_INVALID_LENGTH;
1350 crystal_cap = *((u32 *)poid_par_priv->information_buf);/*4*/
1351 if (crystal_cap > 0xf)
1352 return NDIS_STATUS_NOT_ACCEPTED;
1353 Adapter->mppriv.curr_crystalcap = crystal_cap;
1354 r8712_SetCrystalCap(Adapter);
1355 return status;
1356}
1357
1358uint oid_rt_set_rx_packet_type_hdl(struct oid_par_priv
1359 *poid_par_priv)
1360{
1361 struct _adapter *Adapter = (struct _adapter *)
1362 (poid_par_priv->adapter_context);
1363 u8 rx_pkt_type;
1364 u32 rcr_val32;
1365
1366 if (poid_par_priv->type_of_oid != SET_OID)
1367 return NDIS_STATUS_NOT_ACCEPTED;
1368 if (poid_par_priv->information_buf_len < sizeof(u8))
1369 return NDIS_STATUS_INVALID_LENGTH;
1370 rx_pkt_type = *((u8 *)poid_par_priv->information_buf);/*4*/
1371 rcr_val32 = r8712_read32(Adapter, RCR);/*RCR = 0x10250048*/
1372 rcr_val32 &= ~(RCR_CBSSID | RCR_AB | RCR_AM | RCR_APM | RCR_AAP);
1373 switch (rx_pkt_type) {
1374 case RX_PKT_BROADCAST:
1375 rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32);
1376 break;
1377 case RX_PKT_DEST_ADDR:
1378 rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32);
1379 break;
1380 case RX_PKT_PHY_MATCH:
1381 rcr_val32 |= (RCR_APM|RCR_ACRC32);
1382 break;
1383 default:
1384 rcr_val32 &= ~(RCR_AAP |
1385 RCR_APM |
1386 RCR_AM |
1387 RCR_AB |
1388 RCR_ACRC32);
1389 break;
1390 }
1391 if (rx_pkt_type == RX_PKT_DEST_ADDR)
1392 Adapter->mppriv.check_mp_pkt = 1;
1393 else
1394 Adapter->mppriv.check_mp_pkt = 0;
1395 r8712_write32(Adapter, RCR, rcr_val32);
1396 return NDIS_STATUS_SUCCESS;
1397}
1398
1399uint oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv
1400 *poid_par_priv)
1401{
1402 struct _adapter *Adapter = (struct _adapter *)
1403 (poid_par_priv->adapter_context);
1404 u32 txagc;
1405
1406 if (poid_par_priv->type_of_oid != SET_OID)
1407 return NDIS_STATUS_NOT_ACCEPTED;
1408 if (poid_par_priv->information_buf_len < sizeof(u32))
1409 return NDIS_STATUS_INVALID_LENGTH;
1410 txagc = *(u32 *)poid_par_priv->information_buf;
1411 r8712_SetTxAGCOffset(Adapter, txagc);
1412 return NDIS_STATUS_SUCCESS;
1413}
1414
1415uint oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv
1416 *poid_par_priv)
1417{
1418 struct _adapter *Adapter = (struct _adapter *)
1419 (poid_par_priv->adapter_context);
1420 uint status = NDIS_STATUS_SUCCESS;
1421 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
1422 struct mp_priv *pmppriv = &Adapter->mppriv;
1423 u32 type;
1424
1425 if (poid_par_priv->type_of_oid != SET_OID)
1426 return NDIS_STATUS_NOT_ACCEPTED;
1427
1428 if (poid_par_priv->information_buf_len < sizeof(u32))
1429 return NDIS_STATUS_INVALID_LENGTH;
1430
1431 type = *(u32 *)poid_par_priv->information_buf;
1432
1433 if (_LOOPBOOK_MODE_ == type) {
1434 pmppriv->mode = type;
1435 set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); /*append txdesc*/
1436 } else if (_2MAC_MODE_ == type) {
1437 pmppriv->mode = type;
1438 _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE);
1439 } else
1440 status = NDIS_STATUS_NOT_ACCEPTED;
1441 return status;
1442}
1443/*--------------------------------------------------------------------------*/
1444/*Linux*/
1445unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
1446{
1447 return _SUCCESS;
1448}
1449/*-------------------------------------------------------------------------*/
1450uint oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv)
1451{
1452 u8 bpwrup;
1453
1454 if (poid_par_priv->type_of_oid != SET_OID)
1455 return NDIS_STATUS_NOT_ACCEPTED;
1456 bpwrup = *(u8 *)poid_par_priv->information_buf;
1457 /*CALL the power_down function*/
1458 return NDIS_STATUS_SUCCESS;
1459}
1460
1461/*-------------------------------------------------------------------------- */
1462uint oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv)
1463{
1464 struct _adapter *Adapter = (struct _adapter *)
1465 (poid_par_priv->adapter_context);
1466
1467 if (poid_par_priv->type_of_oid != QUERY_OID)
1468 return NDIS_STATUS_NOT_ACCEPTED;
1469 if (poid_par_priv->information_buf_len < sizeof(u32))
1470 return NDIS_STATUS_INVALID_LENGTH;
1471 *(int *)poid_par_priv->information_buf =
1472 Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL;
1473 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1474 return NDIS_STATUS_SUCCESS;
1475}
diff --git a/drivers/staging/rtl8712/rtl871x_mp_ioctl.h b/drivers/staging/rtl8712/rtl871x_mp_ioctl.h
new file mode 100644
index 00000000000..2225bd15466
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_mp_ioctl.h
@@ -0,0 +1,457 @@
1#ifndef _RTL871X_MP_IOCTL_H
2#define _RTL871X_MP_IOCTL_H
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include "mp_custom_oid.h"
7#include "rtl871x_ioctl.h"
8#include "rtl871x_ioctl_rtl.h"
9#include "rtl8712_efuse.h"
10
11#define TESTFWCMDNUMBER 1000000
12#define TEST_H2CINT_WAIT_TIME 500
13#define TEST_C2HINT_WAIT_TIME 500
14#define HCI_TEST_SYSCFG_HWMASK 1
15#define _BUSCLK_40M (4 << 2)
16
17struct CFG_DBG_MSG_STRUCT {
18 u32 DebugLevel;
19 u32 DebugComponent_H32;
20 u32 DebugComponent_L32;
21};
22
23struct mp_rw_reg {
24 uint offset;
25 uint width;
26 u32 value;
27};
28
29/* for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM */
30struct eeprom_rw_param {
31 uint offset;
32 u16 value;
33};
34
35struct EFUSE_ACCESS_STRUCT {
36 u16 start_addr;
37 u16 cnts;
38 u8 data[0];
39};
40
41struct burst_rw_reg {
42 uint offset;
43 uint len;
44 u8 Data[256];
45};
46
47struct usb_vendor_req {
48 u8 bRequest;
49 u16 wValue;
50 u16 wIndex;
51 u16 wLength;
52 u8 u8Dir;/*0:OUT, 1:IN */
53 u8 u8InData;
54};
55
56struct DR_VARIABLE_STRUCT {
57 u8 offset;
58 u32 variable;
59};
60
61int mp_start_joinbss(struct _adapter *padapter, struct ndis_802_11_ssid *pssid);
62
63/* oid_rtl_seg_87_11_00 */
64uint oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv);
65uint oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv);
66uint oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv);
67uint oid_rt_pro_burst_read_register_hdl(struct oid_par_priv*
68 poid_par_priv);
69uint oid_rt_pro_burst_write_register_hdl(struct oid_par_priv*
70 poid_par_priv);
71uint oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv);
72uint oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv);
73uint oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv);
74uint oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv);
75uint oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv);
76uint oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv);
77uint oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv);
78uint oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv);
79uint oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv);
80/* oid_rtl_seg_87_11_20 */
81uint oid_rt_pro_cfg_debug_message_hdl(
82 struct oid_par_priv *poid_par_priv);
83uint oid_rt_pro_set_data_rate_ex_hdl(
84 struct oid_par_priv *poid_par_priv);
85uint oid_rt_pro_set_basic_rate_hdl(
86 struct oid_par_priv *poid_par_priv);
87uint oid_rt_pro_set_power_tracking_hdl(
88 struct oid_par_priv *poid_par_priv);
89/* oid_rtl_seg_87_11_50 */
90uint oid_rt_pro_qry_pwrstate_hdl(
91 struct oid_par_priv *poid_par_priv);
92uint oid_rt_pro_set_pwrstate_hdl(
93 struct oid_par_priv *poid_par_priv);
94/* oid_rtl_seg_87_11_F0 */
95uint oid_rt_pro_h2c_set_rate_table_hdl(
96 struct oid_par_priv *poid_par_priv);
97uint oid_rt_pro_h2c_get_rate_table_hdl(
98 struct oid_par_priv *poid_par_priv);
99/* oid_rtl_seg_81_80_00 */
100uint oid_rt_pro_set_data_rate_hdl(
101 struct oid_par_priv *poid_par_priv);
102uint oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv);
103uint oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv);
104uint oid_rt_pro_set_channel_direct_call_hdl(
105 struct oid_par_priv *poid_par_priv);
106uint oid_rt_pro_set_antenna_bb_hdl(
107 struct oid_par_priv *poid_par_priv);
108uint oid_rt_pro_set_tx_power_control_hdl(
109 struct oid_par_priv *poid_par_priv);
110/* oid_rtl_seg_81_80_20 */
111uint oid_rt_pro_query_tx_packet_sent_hdl(
112 struct oid_par_priv *poid_par_priv);
113uint oid_rt_pro_query_rx_packet_received_hdl(
114 struct oid_par_priv *poid_par_priv);
115uint oid_rt_pro_query_rx_packet_crc32_error_hdl(
116 struct oid_par_priv *poid_par_priv);
117uint oid_rt_pro_reset_tx_packet_sent_hdl(
118 struct oid_par_priv *poid_par_priv);
119uint oid_rt_pro_reset_rx_packet_received_hdl(
120 struct oid_par_priv *poid_par_priv);
121uint oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv);
122uint oid_rt_pro_set_continuous_tx_hdl(
123 struct oid_par_priv *poid_par_priv);
124uint oid_rt_pro_set_single_carrier_tx_hdl(
125 struct oid_par_priv *poid_par_priv);
126uint oid_rt_pro_set_carrier_suppression_tx_hdl(
127 struct oid_par_priv *poid_par_priv);
128uint oid_rt_pro_set_single_tone_tx_hdl(
129 struct oid_par_priv *poid_par_priv);
130/* oid_rtl_seg_81_87 */
131uint oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv);
132uint oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv);
133uint oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv);
134uint oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv);
135/* oid_rtl_seg_81_85 */
136uint oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv);
137/* oid_rtl_seg_87_12_00 */
138uint oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv);
139uint oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv);
140uint oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv);
141uint oid_rt_pro_query_dr_variable_hdl(
142 struct oid_par_priv *poid_par_priv);
143uint oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv);
144uint oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv);
145uint oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv);
146uint oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv);
147uint oid_rt_get_efuse_current_size_hdl(
148 struct oid_par_priv *poid_par_priv);
149uint oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv);
150uint oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv);
151uint oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv);
152uint oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv);
153uint oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv);
154uint oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv);
155uint oid_rt_pro_set_tx_agc_offset_hdl(
156 struct oid_par_priv *poid_par_priv);
157uint oid_rt_pro_set_pkt_test_mode_hdl(
158 struct oid_par_priv *poid_par_priv);
159uint oid_rt_get_thermal_meter_hdl(
160 struct oid_par_priv *poid_par_priv);
161uint oid_rt_reset_phy_rx_packet_count_hdl(
162 struct oid_par_priv *poid_par_priv);
163uint oid_rt_get_phy_rx_packet_received_hdl(
164 struct oid_par_priv *poid_par_priv);
165uint oid_rt_get_phy_rx_packet_crc32_error_hdl(
166 struct oid_par_priv *poid_par_priv);
167uint oid_rt_set_power_down_hdl(
168 struct oid_par_priv *poid_par_priv);
169uint oid_rt_get_power_mode_hdl(
170 struct oid_par_priv *poid_par_priv);
171#ifdef _RTL871X_MP_IOCTL_C_ /* CAUTION!!! */
172/* This ifdef _MUST_ be left in!! */
173static const struct oid_obj_priv oid_rtl_seg_81_80_00[] = {
174 {1, &oid_null_function}, /*0x00 OID_RT_PRO_RESET_DUT */
175 {1, &oid_rt_pro_set_data_rate_hdl}, /*0x01*/
176 {1, &oid_rt_pro_start_test_hdl},/*0x02*/
177 {1, &oid_rt_pro_stop_test_hdl}, /*0x03*/
178 {1, &oid_null_function}, /*0x04 OID_RT_PRO_SET_PREAMBLE*/
179 {1, &oid_null_function}, /*0x05 OID_RT_PRO_SET_SCRAMBLER*/
180 {1, &oid_null_function}, /*0x06 OID_RT_PRO_SET_FILTER_BB*/
181 {1, &oid_null_function}, /*0x07
182 * OID_RT_PRO_SET_MANUAL_DIVERS_BB*/
183 {1, &oid_rt_pro_set_channel_direct_call_hdl}, /*0x08*/
184 {1, &oid_null_function}, /*0x09
185 * OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL*/
186 {1, &oid_null_function}, /*0x0A
187 * OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL*/
188 {1, &oid_rt_pro_set_continuous_tx_hdl}, /*0x0B
189 * OID_RT_PRO_SET_TX_CONTINUOUS_DIRECT_CALL*/
190 {1, &oid_rt_pro_set_single_carrier_tx_hdl}, /*0x0C
191 * OID_RT_PRO_SET_SINGLE_CARRIER_TX_CONTINUOUS*/
192 {1, &oid_null_function}, /*0x0D
193 * OID_RT_PRO_SET_TX_ANTENNA_BB*/
194 {1, &oid_rt_pro_set_antenna_bb_hdl}, /*0x0E*/
195 {1, &oid_null_function}, /*0x0F OID_RT_PRO_SET_CR_SCRAMBLER*/
196 {1, &oid_null_function}, /*0x10 OID_RT_PRO_SET_CR_NEW_FILTER*/
197 {1, &oid_rt_pro_set_tx_power_control_hdl}, /*0x11
198 * OID_RT_PRO_SET_TX_POWER_CONTROL*/
199 {1, &oid_null_function}, /*0x12 OID_RT_PRO_SET_CR_TX_CONFIG*/
200 {1, &oid_null_function}, /*0x13
201 * OID_RT_PRO_GET_TX_POWER_CONTROL*/
202 {1, &oid_null_function}, /*0x14
203 * OID_RT_PRO_GET_CR_SIGNAL_QUALITY*/
204 {1, &oid_null_function}, /*0x15 OID_RT_PRO_SET_CR_SETPOINT*/
205 {1, &oid_null_function}, /*0x16 OID_RT_PRO_SET_INTEGRATOR*/
206 {1, &oid_null_function}, /*0x17 OID_RT_PRO_SET_SIGNAL_QUALITY*/
207 {1, &oid_null_function}, /*0x18 OID_RT_PRO_GET_INTEGRATOR*/
208 {1, &oid_null_function}, /*0x19 OID_RT_PRO_GET_SIGNAL_QUALITY*/
209 {1, &oid_null_function}, /*0x1A OID_RT_PRO_QUERY_EEPROM_TYPE*/
210 {1, &oid_null_function}, /*0x1B OID_RT_PRO_WRITE_MAC_ADDRESS*/
211 {1, &oid_null_function}, /*0x1C OID_RT_PRO_READ_MAC_ADDRESS*/
212 {1, &oid_null_function}, /*0x1D OID_RT_PRO_WRITE_CIS_DATA*/
213 {1, &oid_null_function}, /*0x1E OID_RT_PRO_READ_CIS_DATA*/
214 {1, &oid_null_function} /*0x1F OID_RT_PRO_WRITE_POWER_CONTROL*/
215};
216
217static const struct oid_obj_priv oid_rtl_seg_81_80_20[] = {
218 {1, &oid_null_function}, /*0x20 OID_RT_PRO_READ_POWER_CONTROL*/
219 {1, &oid_null_function}, /*0x21 OID_RT_PRO_WRITE_EEPROM*/
220 {1, &oid_null_function}, /*0x22 OID_RT_PRO_READ_EEPROM*/
221 {1, &oid_rt_pro_reset_tx_packet_sent_hdl}, /*0x23*/
222 {1, &oid_rt_pro_query_tx_packet_sent_hdl}, /*0x24*/
223 {1, &oid_rt_pro_reset_rx_packet_received_hdl}, /*0x25*/
224 {1, &oid_rt_pro_query_rx_packet_received_hdl}, /*0x26*/
225 {1, &oid_rt_pro_query_rx_packet_crc32_error_hdl},/*0x27*/
226 {1, &oid_null_function}, /*0x28
227 *OID_RT_PRO_QUERY_CURRENT_ADDRESS*/
228 {1, &oid_null_function}, /*0x29
229 *OID_RT_PRO_QUERY_PERMANENT_ADDRESS*/
230 {1, &oid_null_function}, /*0x2A
231 *OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS*/
232 {1, &oid_rt_pro_set_carrier_suppression_tx_hdl},/*0x2B
233 *OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX*/
234 {1, &oid_null_function}, /*0x2C OID_RT_PRO_RECEIVE_PACKET*/
235 {1, &oid_null_function}, /*0x2D OID_RT_PRO_WRITE_EEPROM_BYTE*/
236 {1, &oid_null_function}, /*0x2E OID_RT_PRO_READ_EEPROM_BYTE*/
237 {1, &oid_rt_pro_set_modulation_hdl} /*0x2F*/
238};
239
240static const struct oid_obj_priv oid_rtl_seg_81_80_40[] = {
241 {1, &oid_null_function}, /*0x40*/
242 {1, &oid_null_function}, /*0x41*/
243 {1, &oid_null_function}, /*0x42*/
244 {1, &oid_rt_pro_set_single_tone_tx_hdl}, /*0x43*/
245 {1, &oid_null_function}, /*0x44*/
246 {1, &oid_null_function} /*0x45*/
247};
248
249static const struct oid_obj_priv oid_rtl_seg_81_80_80[] = {
250 {1, &oid_null_function}, /*0x80 OID_RT_DRIVER_OPTION*/
251 {1, &oid_null_function}, /*0x81 OID_RT_RF_OFF*/
252 {1, &oid_null_function} /*0x82 OID_RT_AUTH_STATUS*/
253
254};
255
256static const struct oid_obj_priv oid_rtl_seg_81_85[] = {
257 {1, &oid_rt_wireless_mode_hdl} /*0x00 OID_RT_WIRELESS_MODE*/
258};
259
260#else /* _RTL871X_MP_IOCTL_C_ */
261extern struct oid_obj_priv oid_rtl_seg_81_80_00[32];
262extern struct oid_obj_priv oid_rtl_seg_81_80_20[16];
263extern struct oid_obj_priv oid_rtl_seg_81_80_40[6];
264extern struct oid_obj_priv oid_rtl_seg_81_80_80[3];
265extern struct oid_obj_priv oid_rtl_seg_81_85[1];
266extern struct oid_obj_priv oid_rtl_seg_81_87[5];
267extern struct oid_obj_priv oid_rtl_seg_87_11_00[32];
268extern struct oid_obj_priv oid_rtl_seg_87_11_20[5];
269extern struct oid_obj_priv oid_rtl_seg_87_11_50[2];
270extern struct oid_obj_priv oid_rtl_seg_87_11_80[1];
271extern struct oid_obj_priv oid_rtl_seg_87_11_B0[1];
272extern struct oid_obj_priv oid_rtl_seg_87_11_F0[16];
273extern struct oid_obj_priv oid_rtl_seg_87_12_00[32];
274
275#endif /* _RTL871X_MP_IOCTL_C_ */
276
277
278enum MP_MODE {
279 MP_START_MODE,
280 MP_STOP_MODE,
281 MP_ERR_MODE
282};
283
284struct rwreg_param{
285 unsigned int offset;
286 unsigned int width;
287 unsigned int value;
288};
289
290struct bbreg_param{
291 unsigned int offset;
292 unsigned int phymask;
293 unsigned int value;
294};
295
296struct txpower_param{
297 unsigned int pwr_index;
298};
299
300struct datarate_param{
301 unsigned int rate_index;
302};
303
304struct rfintfs_parm {
305 unsigned int rfintfs;
306};
307
308struct mp_xmit_packet {
309 unsigned int len;
310 unsigned int mem[MAX_MP_XMITBUF_SZ >> 2];
311};
312
313struct psmode_param {
314 unsigned int ps_mode;
315 unsigned int smart_ps;
316};
317
318struct mp_ioctl_handler {
319 unsigned int paramsize;
320 unsigned int (*handler)(struct oid_par_priv *poid_par_priv);
321 unsigned int oid;
322};
323
324struct mp_ioctl_param{
325 unsigned int subcode;
326 unsigned int len;
327 unsigned char data[0];
328};
329
330#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_
331
332enum RTL871X_MP_IOCTL_SUBCODE {
333 GEN_MP_IOCTL_SUBCODE(MP_START), /*0*/
334 GEN_MP_IOCTL_SUBCODE(MP_STOP), /*1*/
335 GEN_MP_IOCTL_SUBCODE(READ_REG), /*2*/
336 GEN_MP_IOCTL_SUBCODE(WRITE_REG),
337 GEN_MP_IOCTL_SUBCODE(SET_CHANNEL), /*4*/
338 GEN_MP_IOCTL_SUBCODE(SET_TXPOWER), /*5*/
339 GEN_MP_IOCTL_SUBCODE(SET_DATARATE), /*6*/
340 GEN_MP_IOCTL_SUBCODE(READ_BB_REG), /*7*/
341 GEN_MP_IOCTL_SUBCODE(WRITE_BB_REG),
342 GEN_MP_IOCTL_SUBCODE(READ_RF_REG), /*9*/
343 GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG),
344 GEN_MP_IOCTL_SUBCODE(SET_RF_INTFS),
345 GEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET), /*12*/
346 GEN_MP_IOCTL_SUBCODE(PS_STATE), /*13*/
347 GEN_MP_IOCTL_SUBCODE(READ16_EEPROM), /*14*/
348 GEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM), /*15*/
349 GEN_MP_IOCTL_SUBCODE(SET_PTM), /*16*/
350 GEN_MP_IOCTL_SUBCODE(READ_TSSI), /*17*/
351 GEN_MP_IOCTL_SUBCODE(CNTU_TX), /*18*/
352 GEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH), /*19*/
353 GEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE), /*20*/
354 GEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT), /*21*/
355 GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV), /*22*/
356 GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR), /*23*/
357 GEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN), /*24*/
358 GEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER), /*25*/
359 GEN_MP_IOCTL_SUBCODE(GET_POWER_MODE), /*26*/
360 GEN_MP_IOCTL_SUBCODE(EFUSE), /*27*/
361 GEN_MP_IOCTL_SUBCODE(EFUSE_MAP), /*28*/
362 GEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE), /*29*/
363 GEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE), /*30*/
364 GEN_MP_IOCTL_SUBCODE(SC_TX), /*31*/
365 GEN_MP_IOCTL_SUBCODE(CS_TX), /*32*/
366 GEN_MP_IOCTL_SUBCODE(ST_TX), /*33*/
367 GEN_MP_IOCTL_SUBCODE(SET_ANTENNA), /*34*/
368 MAX_MP_IOCTL_SUBCODE,
369};
370
371unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv);
372
373#ifdef _RTL871X_MP_IOCTL_C_ /* CAUTION!!! */
374/* This ifdef _MUST_ be left in!! */
375
376struct mp_ioctl_handler mp_ioctl_hdl[] = {
377 {sizeof(u32), oid_rt_pro_start_test_hdl,
378 OID_RT_PRO_START_TEST},/*0*/
379 {sizeof(u32), oid_rt_pro_stop_test_hdl,
380 OID_RT_PRO_STOP_TEST},/*1*/
381 {sizeof(struct rwreg_param),
382 oid_rt_pro_read_register_hdl,
383 OID_RT_PRO_READ_REGISTER},/*2*/
384 {sizeof(struct rwreg_param),
385 oid_rt_pro_write_register_hdl,
386 OID_RT_PRO_WRITE_REGISTER},
387 {sizeof(u32),
388 oid_rt_pro_set_channel_direct_call_hdl,
389 OID_RT_PRO_SET_CHANNEL_DIRECT_CALL},
390 {sizeof(struct txpower_param),
391 oid_rt_pro_set_tx_power_control_hdl,
392 OID_RT_PRO_SET_TX_POWER_CONTROL},
393 {sizeof(u32),
394 oid_rt_pro_set_data_rate_hdl,
395 OID_RT_PRO_SET_DATA_RATE},
396 {sizeof(struct bb_reg_param),
397 oid_rt_pro_read_bb_reg_hdl,
398 OID_RT_PRO_READ_BB_REG},/*7*/
399 {sizeof(struct bb_reg_param),
400 oid_rt_pro_write_bb_reg_hdl,
401 OID_RT_PRO_WRITE_BB_REG},
402 {sizeof(struct rwreg_param),
403 oid_rt_pro_read_rf_reg_hdl,
404 OID_RT_PRO_RF_READ_REGISTRY},/*9*/
405 {sizeof(struct rwreg_param),
406 oid_rt_pro_write_rf_reg_hdl,
407 OID_RT_PRO_RF_WRITE_REGISTRY},
408 {sizeof(struct rfintfs_parm), NULL, 0},
409 {0, &mp_ioctl_xmit_packet_hdl, 0},/*12*/
410 {sizeof(struct psmode_param), NULL, 0},/*13*/
411 {sizeof(struct eeprom_rw_param), NULL, 0},/*14*/
412 {sizeof(struct eeprom_rw_param), NULL, 0},/*15*/
413 {sizeof(u8), oid_rt_pro_set_power_tracking_hdl,
414 OID_RT_PRO_SET_POWER_TRACKING},/*16*/
415 {sizeof(u32), NULL, 0},/*17*/
416 {sizeof(u32), oid_rt_pro_set_continuous_tx_hdl,
417 OID_RT_PRO_SET_CONTINUOUS_TX},/*18*/
418 {sizeof(u32), oid_rt_set_bandwidth_hdl,
419 OID_RT_SET_BANDWIDTH},/*19*/
420 {sizeof(u32), oid_rt_set_rx_packet_type_hdl,
421 OID_RT_SET_RX_PACKET_TYPE},/*20*/
422 {0, oid_rt_reset_phy_rx_packet_count_hdl,
423 OID_RT_RESET_PHY_RX_PACKET_COUNT},/*21*/
424 {sizeof(u32), oid_rt_get_phy_rx_packet_received_hdl,
425 OID_RT_GET_PHY_RX_PACKET_RECEIVED},/*22*/
426 {sizeof(u32), oid_rt_get_phy_rx_packet_crc32_error_hdl,
427 OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR},/*23*/
428 {sizeof(unsigned char), oid_rt_set_power_down_hdl,
429 OID_RT_SET_POWER_DOWN},/*24*/
430 {sizeof(u32), oid_rt_get_thermal_meter_hdl,
431 OID_RT_PRO_GET_THERMAL_METER},/*25*/
432 {sizeof(u32), oid_rt_get_power_mode_hdl,
433 OID_RT_GET_POWER_MODE},/*26*/
434 {sizeof(struct EFUSE_ACCESS_STRUCT),
435 oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE},/*27*/
436 {EFUSE_MAP_MAX_SIZE, oid_rt_pro_efuse_map_hdl,
437 OID_RT_PRO_EFUSE_MAP},/*28*/
438 {sizeof(u32), oid_rt_get_efuse_max_size_hdl,
439 OID_RT_GET_EFUSE_MAX_SIZE},/*29*/
440 {sizeof(u32), oid_rt_get_efuse_current_size_hdl,
441 OID_RT_GET_EFUSE_CURRENT_SIZE},/*30*/
442 {sizeof(u32), oid_rt_pro_set_single_carrier_tx_hdl,
443 OID_RT_PRO_SET_SINGLE_CARRIER_TX},/*31*/
444 {sizeof(u32), oid_rt_pro_set_carrier_suppression_tx_hdl,
445 OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX},/*32*/
446 {sizeof(u32), oid_rt_pro_set_single_tone_tx_hdl,
447 OID_RT_PRO_SET_SINGLE_TONE_TX},/*33*/
448 {sizeof(u32), oid_rt_pro_set_antenna_bb_hdl,
449 OID_RT_PRO_SET_ANTENNA_BB},/*34*/
450};
451
452#else /* _RTL871X_MP_IOCTL_C_ */
453extern struct mp_ioctl_handler mp_ioctl_hdl[];
454#endif /* _RTL871X_MP_IOCTL_C_ */
455
456#endif
457
diff --git a/drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h b/drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h
new file mode 100644
index 00000000000..e386fb0aac3
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h
@@ -0,0 +1,1025 @@
1/*****************************************************************************
2 * Copyright(c) 2008, RealTEK Technology Inc. All Right Reserved.
3 *
4 * Module: __INC_HAL8192SPHYREG_H
5 *
6 *
7 * Note: 1. Define PMAC/BB register map
8 * 2. Define RF register map
9 * 3. PMAC/BB register bit mask.
10 * 4. RF reg bit mask.
11 * 5. Other BB/RF relative definition.
12 *
13 *
14 * Export: Constants, macro, functions(API), global variables(None).
15 *
16 * Abbrev:
17 *
18 * History:
19 * Data Who Remark
20 * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h.
21 * 2. Reorganize code architecture.
22 * 09/25/2008 MH 1. Add RL6052 register definition
23 *
24 *****************************************************************************/
25#ifndef __RTL871X_MP_PHY_REGDEF_H
26#define __RTL871X_MP_PHY_REGDEF_H
27
28
29/*--------------------------Define Parameters-------------------------------*/
30
31/*============================================================
32 * 8192S Regsiter offset definition
33 *============================================================
34 *
35 *
36 * BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF
37 * 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
38 * 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00
39 * 3. RF register 0x00-2E
40 * 4. Bit Mask for BB/RF register
41 * 5. Other defintion for BB/RF R/W
42 *
43 * 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
44 * 1. Page1(0x100)
45 */
46#define rPMAC_Reset 0x100
47#define rPMAC_TxStart 0x104
48#define rPMAC_TxLegacySIG 0x108
49#define rPMAC_TxHTSIG1 0x10c
50#define rPMAC_TxHTSIG2 0x110
51#define rPMAC_PHYDebug 0x114
52#define rPMAC_TxPacketNum 0x118
53#define rPMAC_TxIdle 0x11c
54#define rPMAC_TxMACHeader0 0x120
55#define rPMAC_TxMACHeader1 0x124
56#define rPMAC_TxMACHeader2 0x128
57#define rPMAC_TxMACHeader3 0x12c
58#define rPMAC_TxMACHeader4 0x130
59#define rPMAC_TxMACHeader5 0x134
60#define rPMAC_TxDataType 0x138
61#define rPMAC_TxRandomSeed 0x13c
62#define rPMAC_CCKPLCPPreamble 0x140
63#define rPMAC_CCKPLCPHeader 0x144
64#define rPMAC_CCKCRC16 0x148
65#define rPMAC_OFDMRxCRC32OK 0x170
66#define rPMAC_OFDMRxCRC32Er 0x174
67#define rPMAC_OFDMRxParityEr 0x178
68#define rPMAC_OFDMRxCRC8Er 0x17c
69#define rPMAC_CCKCRxRC16Er 0x180
70#define rPMAC_CCKCRxRC32Er 0x184
71#define rPMAC_CCKCRxRC32OK 0x188
72#define rPMAC_TxStatus 0x18c
73
74/*
75 * 2. Page2(0x200)
76 *
77 * The following two definition are only used for USB interface.
78 *#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address.
79 *#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data.
80 *
81 *
82 * 3. Page8(0x800)
83 */
84#define rFPGA0_RFMOD 0x800 /*RF mode & CCK TxSC RF
85 * BW Setting?? */
86#define rFPGA0_TxInfo 0x804 /* Status report?? */
87#define rFPGA0_PSDFunction 0x808
88#define rFPGA0_TxGainStage 0x80c /* Set TX PWR init gain? */
89#define rFPGA0_RFTiming1 0x810 /* Useless now */
90#define rFPGA0_RFTiming2 0x814
91#define rFPGA0_XA_HSSIParameter1 0x820 /* RF 3 wire register */
92#define rFPGA0_XA_HSSIParameter2 0x824
93#define rFPGA0_XB_HSSIParameter1 0x828
94#define rFPGA0_XB_HSSIParameter2 0x82c
95#define rFPGA0_XC_HSSIParameter1 0x830
96#define rFPGA0_XC_HSSIParameter2 0x834
97#define rFPGA0_XD_HSSIParameter1 0x838
98#define rFPGA0_XD_HSSIParameter2 0x83c
99#define rFPGA0_XA_LSSIParameter 0x840
100#define rFPGA0_XB_LSSIParameter 0x844
101#define rFPGA0_XC_LSSIParameter 0x848
102#define rFPGA0_XD_LSSIParameter 0x84c
103
104#define rFPGA0_RFWakeUpParameter 0x850 /* Useless now */
105#define rFPGA0_RFSleepUpParameter 0x854
106
107#define rFPGA0_XAB_SwitchControl 0x858 /* RF Channel switch */
108#define rFPGA0_XCD_SwitchControl 0x85c
109
110#define rFPGA0_XA_RFInterfaceOE 0x860 /* RF Channel switch */
111#define rFPGA0_XB_RFInterfaceOE 0x864
112#define rFPGA0_XC_RFInterfaceOE 0x868
113#define rFPGA0_XD_RFInterfaceOE 0x86c
114#define rFPGA0_XAB_RFInterfaceSW 0x870 /* RF Interface Software Ctrl */
115#define rFPGA0_XCD_RFInterfaceSW 0x874
116
117#define rFPGA0_XAB_RFParameter 0x878 /* RF Parameter */
118#define rFPGA0_XCD_RFParameter 0x87c
119
120#define rFPGA0_AnalogParameter1 0x880 /* Crystal cap setting
121 * RF-R/W protection
122 * for parameter4?? */
123#define rFPGA0_AnalogParameter2 0x884
124#define rFPGA0_AnalogParameter3 0x888 /* Useless now */
125#define rFPGA0_AnalogParameter4 0x88c
126
127#define rFPGA0_XA_LSSIReadBack 0x8a0 /* Tranceiver LSSI Readback */
128#define rFPGA0_XB_LSSIReadBack 0x8a4
129#define rFPGA0_XC_LSSIReadBack 0x8a8
130#define rFPGA0_XD_LSSIReadBack 0x8ac
131
132#define rFPGA0_PSDReport 0x8b4 /* Useless now */
133#define rFPGA0_XAB_RFInterfaceRB 0x8e0 /* Useless now */
134#define rFPGA0_XCD_RFInterfaceRB 0x8e4 /* Useless now */
135
136/*
137 * 4. Page9(0x900)
138 */
139#define rFPGA1_RFMOD 0x900 /* RF mode & OFDM TxSC */
140
141#define rFPGA1_TxBlock 0x904 /* Useless now */
142#define rFPGA1_DebugSelect 0x908 /* Useless now */
143#define rFPGA1_TxInfo 0x90c /* Useless now */
144
145/*
146 * 5. PageA(0xA00)
147 *
148 * Set Control channel to upper or lower.
149 * These settings are required only for 40MHz */
150#define rCCK0_System 0xa00
151
152#define rCCK0_AFESetting 0xa04 /* Disable init gain now */
153#define rCCK0_CCA 0xa08 /* Disable init gain now */
154
155#define rCCK0_RxAGC1 0xa0c
156/* AGC default value, saturation level
157 * Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now.
158 * Not the same as 90 series */
159#define rCCK0_RxAGC2 0xa10 /* AGC & DAGC */
160
161#define rCCK0_RxHP 0xa14
162
163#define rCCK0_DSPParameter1 0xa18 /* Timing recovery & Channel
164 * estimation threshold */
165#define rCCK0_DSPParameter2 0xa1c /* SQ threshold */
166
167#define rCCK0_TxFilter1 0xa20
168#define rCCK0_TxFilter2 0xa24
169#define rCCK0_DebugPort 0xa28 /* debug port and Tx filter3 */
170#define rCCK0_FalseAlarmReport 0xa2c /* 0xa2d useless now 0xa30-a4f
171 * channel report */
172#define rCCK0_TRSSIReport 0xa50
173#define rCCK0_RxReport 0xa54 /* 0xa57 */
174#define rCCK0_FACounterLower 0xa5c /* 0xa5b */
175#define rCCK0_FACounterUpper 0xa58 /* 0xa5c */
176
177/*
178 * 6. PageC(0xC00)
179 */
180#define rOFDM0_LSTF 0xc00
181#define rOFDM0_TRxPathEnable 0xc04
182#define rOFDM0_TRMuxPar 0xc08
183#define rOFDM0_TRSWIsolation 0xc0c
184
185/*RxIQ DC offset, Rx digital filter, DC notch filter */
186#define rOFDM0_XARxAFE 0xc10
187#define rOFDM0_XARxIQImbalance 0xc14 /* RxIQ imblance matrix */
188#define rOFDM0_XBRxAFE 0xc18
189#define rOFDM0_XBRxIQImbalance 0xc1c
190#define rOFDM0_XCRxAFE 0xc20
191#define rOFDM0_XCRxIQImbalance 0xc24
192#define rOFDM0_XDRxAFE 0xc28
193#define rOFDM0_XDRxIQImbalance 0xc2c
194
195#define rOFDM0_RxDetector1 0xc30 /* PD,BW & SBD DM tune
196 * init gain */
197#define rOFDM0_RxDetector2 0xc34 /* SBD & Fame Sync. */
198#define rOFDM0_RxDetector3 0xc38 /* Frame Sync. */
199#define rOFDM0_RxDetector4 0xc3c /* PD, SBD, Frame Sync &
200 * Short-GI */
201
202#define rOFDM0_RxDSP 0xc40 /* Rx Sync Path */
203#define rOFDM0_CFOandDAGC 0xc44 /* CFO & DAGC */
204#define rOFDM0_CCADropThreshold 0xc48 /* CCA Drop threshold */
205#define rOFDM0_ECCAThreshold 0xc4c /* energy CCA */
206
207#define rOFDM0_XAAGCCore1 0xc50 /* DIG */
208#define rOFDM0_XAAGCCore2 0xc54
209#define rOFDM0_XBAGCCore1 0xc58
210#define rOFDM0_XBAGCCore2 0xc5c
211#define rOFDM0_XCAGCCore1 0xc60
212#define rOFDM0_XCAGCCore2 0xc64
213#define rOFDM0_XDAGCCore1 0xc68
214#define rOFDM0_XDAGCCore2 0xc6c
215#define rOFDM0_AGCParameter1 0xc70
216#define rOFDM0_AGCParameter2 0xc74
217#define rOFDM0_AGCRSSITable 0xc78
218#define rOFDM0_HTSTFAGC 0xc7c
219
220#define rOFDM0_XATxIQImbalance 0xc80 /* TX PWR TRACK and DIG */
221#define rOFDM0_XATxAFE 0xc84
222#define rOFDM0_XBTxIQImbalance 0xc88
223#define rOFDM0_XBTxAFE 0xc8c
224#define rOFDM0_XCTxIQImbalance 0xc90
225#define rOFDM0_XCTxAFE 0xc94
226#define rOFDM0_XDTxIQImbalance 0xc98
227#define rOFDM0_XDTxAFE 0xc9c
228
229#define rOFDM0_RxHPParameter 0xce0
230#define rOFDM0_TxPseudoNoiseWgt 0xce4
231#define rOFDM0_FrameSync 0xcf0
232#define rOFDM0_DFSReport 0xcf4
233#define rOFDM0_TxCoeff1 0xca4
234#define rOFDM0_TxCoeff2 0xca8
235#define rOFDM0_TxCoeff3 0xcac
236#define rOFDM0_TxCoeff4 0xcb0
237#define rOFDM0_TxCoeff5 0xcb4
238#define rOFDM0_TxCoeff6 0xcb8
239
240/*
241 * 7. PageD(0xD00)
242 */
243#define rOFDM1_LSTF 0xd00
244#define rOFDM1_TRxPathEnable 0xd04
245
246#define rOFDM1_CFO 0xd08 /* No setting now */
247#define rOFDM1_CSI1 0xd10
248#define rOFDM1_SBD 0xd14
249#define rOFDM1_CSI2 0xd18
250#define rOFDM1_CFOTracking 0xd2c
251#define rOFDM1_TRxMesaure1 0xd34
252#define rOFDM1_IntfDet 0xd3c
253#define rOFDM1_PseudoNoiseStateAB 0xd50
254#define rOFDM1_PseudoNoiseStateCD 0xd54
255#define rOFDM1_RxPseudoNoiseWgt 0xd58
256
257#define rOFDM_PHYCounter1 0xda0 /* cca, parity fail */
258#define rOFDM_PHYCounter2 0xda4 /* rate illegal, crc8 fail */
259#define rOFDM_PHYCounter3 0xda8 /* MCS not support */
260#define rOFDM_ShortCFOAB 0xdac /* No setting now */
261#define rOFDM_ShortCFOCD 0xdb0
262#define rOFDM_LongCFOAB 0xdb4
263#define rOFDM_LongCFOCD 0xdb8
264#define rOFDM_TailCFOAB 0xdbc
265#define rOFDM_TailCFOCD 0xdc0
266#define rOFDM_PWMeasure1 0xdc4
267#define rOFDM_PWMeasure2 0xdc8
268#define rOFDM_BWReport 0xdcc
269#define rOFDM_AGCReport 0xdd0
270#define rOFDM_RxSNR 0xdd4
271#define rOFDM_RxEVMCSI 0xdd8
272#define rOFDM_SIGReport 0xddc
273
274/*
275 * 8. PageE(0xE00)
276 */
277#define rTxAGC_Rate18_06 0xe00
278#define rTxAGC_Rate54_24 0xe04
279#define rTxAGC_CCK_Mcs32 0xe08
280#define rTxAGC_Mcs03_Mcs00 0xe10
281#define rTxAGC_Mcs07_Mcs04 0xe14
282#define rTxAGC_Mcs11_Mcs08 0xe18
283#define rTxAGC_Mcs15_Mcs12 0xe1c
284
285/* Analog- control in RX_WAIT_CCA : REG: EE0
286 * [Analog- Power & Control Register] */
287#define rRx_Wait_CCCA 0xe70
288#define rAnapar_Ctrl_BB 0xee0
289
290/*
291 * 7. RF Register 0x00-0x2E (RF 8256)
292 * RF-0222D 0x00-3F
293 *
294 * Zebra1
295 */
296#define rZebra1_HSSIEnable 0x0 /* Useless now */
297#define rZebra1_TRxEnable1 0x1
298#define rZebra1_TRxEnable2 0x2
299#define rZebra1_AGC 0x4
300#define rZebra1_ChargePump 0x5
301#define rZebra1_Channel 0x7 /* RF channel switch */
302#define rZebra1_TxGain 0x8 /* Useless now */
303#define rZebra1_TxLPF 0x9
304#define rZebra1_RxLPF 0xb
305#define rZebra1_RxHPFCorner 0xc
306
307/* Zebra4 */
308#define rGlobalCtrl 0 /* Useless now */
309#define rRTL8256_TxLPF 19
310#define rRTL8256_RxLPF 11
311
312/* RTL8258 */
313#define rRTL8258_TxLPF 0x11 /* Useless now */
314#define rRTL8258_RxLPF 0x13
315#define rRTL8258_RSSILPF 0xa
316
317/* RL6052 Register definition */
318#define RF_AC 0x00
319#define RF_IQADJ_G1 0x01
320#define RF_IQADJ_G2 0x02
321#define RF_POW_TRSW 0x05
322
323#define RF_GAIN_RX 0x06
324#define RF_GAIN_TX 0x07
325
326#define RF_TXM_IDAC 0x08
327#define RF_BS_IQGEN 0x0F
328
329#define RF_MODE1 0x10
330#define RF_MODE2 0x11
331
332#define RF_RX_AGC_HP 0x12
333#define RF_TX_AGC 0x13
334#define RF_BIAS 0x14
335#define RF_IPA 0x15
336#define RF_POW_ABILITY 0x17
337#define RF_MODE_AG 0x18
338#define rRfChannel 0x18 /* RF channel and BW switch */
339#define RF_CHNLBW 0x18 /* RF channel and BW switch */
340#define RF_TOP 0x19
341#define RF_RX_G1 0x1A
342#define RF_RX_G2 0x1B
343#define RF_RX_BB2 0x1C
344#define RF_RX_BB1 0x1D
345
346#define RF_RCK1 0x1E
347#define RF_RCK2 0x1F
348
349#define RF_TX_G1 0x20
350#define RF_TX_G2 0x21
351#define RF_TX_G3 0x22
352
353#define RF_TX_BB1 0x23
354#define RF_T_METER 0x24
355
356#define RF_SYN_G1 0x25 /* RF TX Power control */
357#define RF_SYN_G2 0x26 /* RF TX Power control */
358#define RF_SYN_G3 0x27 /* RF TX Power control */
359#define RF_SYN_G4 0x28 /* RF TX Power control */
360#define RF_SYN_G5 0x29 /* RF TX Power control */
361#define RF_SYN_G6 0x2A /* RF TX Power control */
362#define RF_SYN_G7 0x2B /* RF TX Power control */
363#define RF_SYN_G8 0x2C /* RF TX Power control */
364
365#define RF_RCK_OS 0x30 /* RF TX PA control */
366
367#define RF_TXPA_G1 0x31 /* RF TX PA control */
368#define RF_TXPA_G2 0x32 /* RF TX PA control */
369#define RF_TXPA_G3 0x33 /* RF TX PA control */
370
371/*
372 * Bit Mask
373 *
374 * 1. Page1(0x100) */
375#define bBBResetB 0x100 /* Useless now? */
376#define bGlobalResetB 0x200
377#define bOFDMTxStart 0x4
378#define bCCKTxStart 0x8
379#define bCRC32Debug 0x100
380#define bPMACLoopback 0x10
381#define bTxLSIG 0xffffff
382#define bOFDMTxRate 0xf
383#define bOFDMTxReserved 0x10
384#define bOFDMTxLength 0x1ffe0
385#define bOFDMTxParity 0x20000
386#define bTxHTSIG1 0xffffff
387#define bTxHTMCSRate 0x7f
388#define bTxHTBW 0x80
389#define bTxHTLength 0xffff00
390#define bTxHTSIG2 0xffffff
391#define bTxHTSmoothing 0x1
392#define bTxHTSounding 0x2
393#define bTxHTReserved 0x4
394#define bTxHTAggreation 0x8
395#define bTxHTSTBC 0x30
396#define bTxHTAdvanceCoding 0x40
397#define bTxHTShortGI 0x80
398#define bTxHTNumberHT_LTF 0x300
399#define bTxHTCRC8 0x3fc00
400#define bCounterReset 0x10000
401#define bNumOfOFDMTx 0xffff
402#define bNumOfCCKTx 0xffff0000
403#define bTxIdleInterval 0xffff
404#define bOFDMService 0xffff0000
405#define bTxMACHeader 0xffffffff
406#define bTxDataInit 0xff
407#define bTxHTMode 0x100
408#define bTxDataType 0x30000
409#define bTxRandomSeed 0xffffffff
410#define bCCKTxPreamble 0x1
411#define bCCKTxSFD 0xffff0000
412#define bCCKTxSIG 0xff
413#define bCCKTxService 0xff00
414#define bCCKLengthExt 0x8000
415#define bCCKTxLength 0xffff0000
416#define bCCKTxCRC16 0xffff
417#define bCCKTxStatus 0x1
418#define bOFDMTxStatus 0x2
419#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && \
420 (_Offset <= 0xfff))
421
422/* 2. Page8(0x800) */
423#define bRFMOD 0x1 /* Reg 0x800 rFPGA0_RFMOD */
424#define bJapanMode 0x2
425#define bCCKTxSC 0x30
426#define bCCKEn 0x1000000
427#define bOFDMEn 0x2000000
428
429#define bOFDMRxADCPhase 0x10000 /* Useless now */
430#define bOFDMTxDACPhase 0x40000
431#define bXATxAGC 0x3f
432#define bXBTxAGC 0xf00 /* Reg 80c rFPGA0_TxGainStage */
433#define bXCTxAGC 0xf000
434#define bXDTxAGC 0xf0000
435
436#define bPAStart 0xf0000000 /* Useless now */
437#define bTRStart 0x00f00000
438#define bRFStart 0x0000f000
439#define bBBStart 0x000000f0
440#define bBBCCKStart 0x0000000f
441#define bPAEnd 0xf /* Reg0x814 */
442#define bTREnd 0x0f000000
443#define bRFEnd 0x000f0000
444#define bCCAMask 0x000000f0 /* T2R */
445#define bR2RCCAMask 0x00000f00
446#define bHSSI_R2TDelay 0xf8000000
447#define bHSSI_T2RDelay 0xf80000
448#define bContTxHSSI 0x400 /* change gain at continue Tx */
449#define bIGFromCCK 0x200
450#define bAGCAddress 0x3f
451#define bRxHPTx 0x7000
452#define bRxHPT2R 0x38000
453#define bRxHPCCKIni 0xc0000
454#define bAGCTxCode 0xc00000
455#define bAGCRxCode 0x300000
456#define b3WireDataLength 0x800 /* Reg 0x820~84f rFPGA0_XA_HSSIParm1 */
457#define b3WireAddressLength 0x400
458#define b3WireRFPowerDown 0x1 /* Useless now */
459#define b5GPAPEPolarity 0x40000000
460#define b2GPAPEPolarity 0x80000000
461#define bRFSW_TxDefaultAnt 0x3
462#define bRFSW_TxOptionAnt 0x30
463#define bRFSW_RxDefaultAnt 0x300
464#define bRFSW_RxOptionAnt 0x3000
465#define bRFSI_3WireData 0x1
466#define bRFSI_3WireClock 0x2
467#define bRFSI_3WireLoad 0x4
468#define bRFSI_3WireRW 0x8
469#define bRFSI_3Wire 0xf
470#define bRFSI_RFENV 0x10 /* Reg 0x870 rFPGA0_XAB_RFInterfaceSW */
471#define bRFSI_TRSW 0x20 /* Useless now */
472#define bRFSI_TRSWB 0x40
473#define bRFSI_ANTSW 0x100
474#define bRFSI_ANTSWB 0x200
475#define bRFSI_PAPE 0x400
476#define bRFSI_PAPE5G 0x800
477#define bBandSelect 0x1
478#define bHTSIG2_GI 0x80
479#define bHTSIG2_Smoothing 0x01
480#define bHTSIG2_Sounding 0x02
481#define bHTSIG2_Aggreaton 0x08
482#define bHTSIG2_STBC 0x30
483#define bHTSIG2_AdvCoding 0x40
484#define bHTSIG2_NumOfHTLTF 0x300
485#define bHTSIG2_CRC8 0x3fc
486#define bHTSIG1_MCS 0x7f
487#define bHTSIG1_BandWidth 0x80
488#define bHTSIG1_HTLength 0xffff
489#define bLSIG_Rate 0xf
490#define bLSIG_Reserved 0x10
491#define bLSIG_Length 0x1fffe
492#define bLSIG_Parity 0x20
493#define bCCKRxPhase 0x4
494#define bLSSIReadAddress 0x7f800000 /* T65 RF */
495#define bLSSIReadEdge 0x80000000 /* LSSI "Read" edge signal */
496#define bLSSIReadBackData 0xfffff /* T65 RF */
497#define bLSSIReadOKFlag 0x1000 /* Useless now */
498#define bCCKSampleRate 0x8 /*0: 44MHz, 1:88MHz*/
499#define bRegulator0Standby 0x1
500#define bRegulatorPLLStandby 0x2
501#define bRegulator1Standby 0x4
502#define bPLLPowerUp 0x8
503#define bDPLLPowerUp 0x10
504#define bDA10PowerUp 0x20
505#define bAD7PowerUp 0x200
506#define bDA6PowerUp 0x2000
507#define bXtalPowerUp 0x4000
508#define b40MDClkPowerUP 0x8000
509#define bDA6DebugMode 0x20000
510#define bDA6Swing 0x380000
511
512/* Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ */
513#define bADClkPhase 0x4000000
514
515#define b80MClkDelay 0x18000000 /* Useless */
516#define bAFEWatchDogEnable 0x20000000
517
518/* Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap */
519#define bXtalCap01 0xc0000000
520#define bXtalCap23 0x3
521#define bXtalCap92x 0x0f000000
522#define bXtalCap 0x0f000000
523#define bIntDifClkEnable 0x400 /* Useless */
524#define bExtSigClkEnable 0x800
525#define bBandgapMbiasPowerUp 0x10000
526#define bAD11SHGain 0xc0000
527#define bAD11InputRange 0x700000
528#define bAD11OPCurrent 0x3800000
529#define bIPathLoopback 0x4000000
530#define bQPathLoopback 0x8000000
531#define bAFELoopback 0x10000000
532#define bDA10Swing 0x7e0
533#define bDA10Reverse 0x800
534#define bDAClkSource 0x1000
535#define bAD7InputRange 0x6000
536#define bAD7Gain 0x38000
537#define bAD7OutputCMMode 0x40000
538#define bAD7InputCMMode 0x380000
539#define bAD7Current 0xc00000
540#define bRegulatorAdjust 0x7000000
541#define bAD11PowerUpAtTx 0x1
542#define bDA10PSAtTx 0x10
543#define bAD11PowerUpAtRx 0x100
544#define bDA10PSAtRx 0x1000
545#define bCCKRxAGCFormat 0x200
546#define bPSDFFTSamplepPoint 0xc000
547#define bPSDAverageNum 0x3000
548#define bIQPathControl 0xc00
549#define bPSDFreq 0x3ff
550#define bPSDAntennaPath 0x30
551#define bPSDIQSwitch 0x40
552#define bPSDRxTrigger 0x400000
553#define bPSDTxTrigger 0x80000000
554#define bPSDSineToneScale 0x7f000000
555#define bPSDReport 0xffff
556
557/* 3. Page9(0x900) */
558#define bOFDMTxSC 0x30000000 /* Useless */
559#define bCCKTxOn 0x1
560#define bOFDMTxOn 0x2
561#define bDebugPage 0xfff /* reset debug page and HWord, LWord */
562#define bDebugItem 0xff /* reset debug page and LWord */
563#define bAntL 0x10
564#define bAntNonHT 0x100
565#define bAntHT1 0x1000
566#define bAntHT2 0x10000
567#define bAntHT1S1 0x100000
568#define bAntNonHTS1 0x1000000
569
570/* 4. PageA(0xA00) */
571#define bCCKBBMode 0x3 /* Useless */
572#define bCCKTxPowerSaving 0x80
573#define bCCKRxPowerSaving 0x40
574
575#define bCCKSideBand 0x10 /* Reg 0xa00 rCCK0_System 20/40 switch*/
576#define bCCKScramble 0x8 /* Useless */
577#define bCCKAntDiversity 0x8000
578#define bCCKCarrierRecovery 0x4000
579#define bCCKTxRate 0x3000
580#define bCCKDCCancel 0x0800
581#define bCCKISICancel 0x0400
582#define bCCKMatchFilter 0x0200
583#define bCCKEqualizer 0x0100
584#define bCCKPreambleDetect 0x800000
585#define bCCKFastFalseCCA 0x400000
586#define bCCKChEstStart 0x300000
587#define bCCKCCACount 0x080000
588#define bCCKcs_lim 0x070000
589#define bCCKBistMode 0x80000000
590#define bCCKCCAMask 0x40000000
591#define bCCKTxDACPhase 0x4
592#define bCCKRxADCPhase 0x20000000 /* r_rx_clk */
593#define bCCKr_cp_mode0 0x0100
594#define bCCKTxDCOffset 0xf0
595#define bCCKRxDCOffset 0xf
596#define bCCKCCAMode 0xc000
597#define bCCKFalseCS_lim 0x3f00
598#define bCCKCS_ratio 0xc00000
599#define bCCKCorgBit_sel 0x300000
600#define bCCKPD_lim 0x0f0000
601#define bCCKNewCCA 0x80000000
602#define bCCKRxHPofIG 0x8000
603#define bCCKRxIG 0x7f00
604#define bCCKLNAPolarity 0x800000
605#define bCCKRx1stGain 0x7f0000
606#define bCCKRFExtend 0x20000000 /* CCK Rx Iinital gain polarity */
607#define bCCKRxAGCSatLevel 0x1f000000
608#define bCCKRxAGCSatCount 0xe0
609#define bCCKRxRFSettle 0x1f /* AGCsamp_dly */
610#define bCCKFixedRxAGC 0x8000
611#define bCCKAntennaPolarity 0x2000
612#define bCCKTxFilterType 0x0c00
613#define bCCKRxAGCReportType 0x0300
614#define bCCKRxDAGCEn 0x80000000
615#define bCCKRxDAGCPeriod 0x20000000
616#define bCCKRxDAGCSatLevel 0x1f000000
617#define bCCKTimingRecovery 0x800000
618#define bCCKTxC0 0x3f0000
619#define bCCKTxC1 0x3f000000
620#define bCCKTxC2 0x3f
621#define bCCKTxC3 0x3f00
622#define bCCKTxC4 0x3f0000
623#define bCCKTxC5 0x3f000000
624#define bCCKTxC6 0x3f
625#define bCCKTxC7 0x3f00
626#define bCCKDebugPort 0xff0000
627#define bCCKDACDebug 0x0f000000
628#define bCCKFalseAlarmEnable 0x8000
629#define bCCKFalseAlarmRead 0x4000
630#define bCCKTRSSI 0x7f
631#define bCCKRxAGCReport 0xfe
632#define bCCKRxReport_AntSel 0x80000000
633#define bCCKRxReport_MFOff 0x40000000
634#define bCCKRxRxReport_SQLoss 0x20000000
635#define bCCKRxReport_Pktloss 0x10000000
636#define bCCKRxReport_Lockedbit 0x08000000
637#define bCCKRxReport_RateError 0x04000000
638#define bCCKRxReport_RxRate 0x03000000
639#define bCCKRxFACounterLower 0xff
640#define bCCKRxFACounterUpper 0xff000000
641#define bCCKRxHPAGCStart 0xe000
642#define bCCKRxHPAGCFinal 0x1c00
643#define bCCKRxFalseAlarmEnable 0x8000
644#define bCCKFACounterFreeze 0x4000
645#define bCCKTxPathSel 0x10000000
646#define bCCKDefaultRxPath 0xc000000
647#define bCCKOptionRxPath 0x3000000
648
649/* 5. PageC(0xC00) */
650#define bNumOfSTF 0x3 /* Useless */
651#define bShift_L 0xc0
652#define bGI_TH 0xc
653#define bRxPathA 0x1
654#define bRxPathB 0x2
655#define bRxPathC 0x4
656#define bRxPathD 0x8
657#define bTxPathA 0x1
658#define bTxPathB 0x2
659#define bTxPathC 0x4
660#define bTxPathD 0x8
661#define bTRSSIFreq 0x200
662#define bADCBackoff 0x3000
663#define bDFIRBackoff 0xc000
664#define bTRSSILatchPhase 0x10000
665#define bRxIDCOffset 0xff
666#define bRxQDCOffset 0xff00
667#define bRxDFIRMode 0x1800000
668#define bRxDCNFType 0xe000000
669#define bRXIQImb_A 0x3ff
670#define bRXIQImb_B 0xfc00
671#define bRXIQImb_C 0x3f0000
672#define bRXIQImb_D 0xffc00000
673#define bDC_dc_Notch 0x60000
674#define bRxNBINotch 0x1f000000
675#define bPD_TH 0xf
676#define bPD_TH_Opt2 0xc000
677#define bPWED_TH 0x700
678#define bIfMF_Win_L 0x800
679#define bPD_Option 0x1000
680#define bMF_Win_L 0xe000
681#define bBW_Search_L 0x30000
682#define bwin_enh_L 0xc0000
683#define bBW_TH 0x700000
684#define bED_TH2 0x3800000
685#define bBW_option 0x4000000
686#define bRatio_TH 0x18000000
687#define bWindow_L 0xe0000000
688#define bSBD_Option 0x1
689#define bFrame_TH 0x1c
690#define bFS_Option 0x60
691#define bDC_Slope_check 0x80
692#define bFGuard_Counter_DC_L 0xe00
693#define bFrame_Weight_Short 0x7000
694#define bSub_Tune 0xe00000
695#define bFrame_DC_Length 0xe000000
696#define bSBD_start_offset 0x30000000
697#define bFrame_TH_2 0x7
698#define bFrame_GI2_TH 0x38
699#define bGI2_Sync_en 0x40
700#define bSarch_Short_Early 0x300
701#define bSarch_Short_Late 0xc00
702#define bSarch_GI2_Late 0x70000
703#define bCFOAntSum 0x1
704#define bCFOAcc 0x2
705#define bCFOStartOffset 0xc
706#define bCFOLookBack 0x70
707#define bCFOSumWeight 0x80
708#define bDAGCEnable 0x10000
709#define bTXIQImb_A 0x3ff
710#define bTXIQImb_B 0xfc00
711#define bTXIQImb_C 0x3f0000
712#define bTXIQImb_D 0xffc00000
713#define bTxIDCOffset 0xff
714#define bTxQDCOffset 0xff00
715#define bTxDFIRMode 0x10000
716#define bTxPesudoNoiseOn 0x4000000
717#define bTxPesudoNoise_A 0xff
718#define bTxPesudoNoise_B 0xff00
719#define bTxPesudoNoise_C 0xff0000
720#define bTxPesudoNoise_D 0xff000000
721#define bCCADropOption 0x20000
722#define bCCADropThres 0xfff00000
723#define bEDCCA_H 0xf
724#define bEDCCA_L 0xf0
725#define bLambda_ED 0x300
726#define bRxInitialGain 0x7f
727#define bRxAntDivEn 0x80
728#define bRxAGCAddressForLNA 0x7f00
729#define bRxHighPowerFlow 0x8000
730#define bRxAGCFreezeThres 0xc0000
731#define bRxFreezeStep_AGC1 0x300000
732#define bRxFreezeStep_AGC2 0xc00000
733#define bRxFreezeStep_AGC3 0x3000000
734#define bRxFreezeStep_AGC0 0xc000000
735#define bRxRssi_Cmp_En 0x10000000
736#define bRxQuickAGCEn 0x20000000
737#define bRxAGCFreezeThresMode 0x40000000
738#define bRxOverFlowCheckType 0x80000000
739#define bRxAGCShift 0x7f
740#define bTRSW_Tri_Only 0x80
741#define bPowerThres 0x300
742#define bRxAGCEn 0x1
743#define bRxAGCTogetherEn 0x2
744#define bRxAGCMin 0x4
745#define bRxHP_Ini 0x7
746#define bRxHP_TRLNA 0x70
747#define bRxHP_RSSI 0x700
748#define bRxHP_BBP1 0x7000
749#define bRxHP_BBP2 0x70000
750#define bRxHP_BBP3 0x700000
751#define bRSSI_H 0x7f0000 /* the threshold for high power */
752#define bRSSI_Gen 0x7f000000 /* the threshold for ant divers */
753#define bRxSettle_TRSW 0x7
754#define bRxSettle_LNA 0x38
755#define bRxSettle_RSSI 0x1c0
756#define bRxSettle_BBP 0xe00
757#define bRxSettle_RxHP 0x7000
758#define bRxSettle_AntSW_RSSI 0x38000
759#define bRxSettle_AntSW 0xc0000
760#define bRxProcessTime_DAGC 0x300000
761#define bRxSettle_HSSI 0x400000
762#define bRxProcessTime_BBPPW 0x800000
763#define bRxAntennaPowerShift 0x3000000
764#define bRSSITableSelect 0xc000000
765#define bRxHP_Final 0x7000000
766#define bRxHTSettle_BBP 0x7
767#define bRxHTSettle_HSSI 0x8
768#define bRxHTSettle_RxHP 0x70
769#define bRxHTSettle_BBPPW 0x80
770#define bRxHTSettle_Idle 0x300
771#define bRxHTSettle_Reserved 0x1c00
772#define bRxHTRxHPEn 0x8000
773#define bRxHTAGCFreezeThres 0x30000
774#define bRxHTAGCTogetherEn 0x40000
775#define bRxHTAGCMin 0x80000
776#define bRxHTAGCEn 0x100000
777#define bRxHTDAGCEn 0x200000
778#define bRxHTRxHP_BBP 0x1c00000
779#define bRxHTRxHP_Final 0xe0000000
780#define bRxPWRatioTH 0x3
781#define bRxPWRatioEn 0x4
782#define bRxMFHold 0x3800
783#define bRxPD_Delay_TH1 0x38
784#define bRxPD_Delay_TH2 0x1c0
785#define bRxPD_DC_COUNT_MAX 0x600
786#define bRxPD_Delay_TH 0x8000
787#define bRxProcess_Delay 0xf0000
788#define bRxSearchrange_GI2_Early 0x700000
789#define bRxFrame_Guard_Counter_L 0x3800000
790#define bRxSGI_Guard_L 0xc000000
791#define bRxSGI_Search_L 0x30000000
792#define bRxSGI_TH 0xc0000000
793#define bDFSCnt0 0xff
794#define bDFSCnt1 0xff00
795#define bDFSFlag 0xf0000
796#define bMFWeightSum 0x300000
797#define bMinIdxTH 0x7f000000
798#define bDAFormat 0x40000
799#define bTxChEmuEnable 0x01000000
800#define bTRSWIsolation_A 0x7f
801#define bTRSWIsolation_B 0x7f00
802#define bTRSWIsolation_C 0x7f0000
803#define bTRSWIsolation_D 0x7f000000
804#define bExtLNAGain 0x7c00
805
806/* 6. PageE(0xE00) */
807#define bSTBCEn 0x4 /* Useless */
808#define bAntennaMapping 0x10
809#define bNss 0x20
810#define bCFOAntSumD 0x200
811#define bPHYCounterReset 0x8000000
812#define bCFOReportGet 0x4000000
813#define bOFDMContinueTx 0x10000000
814#define bOFDMSingleCarrier 0x20000000
815#define bOFDMSingleTone 0x40000000
816#define bHTDetect 0x100
817#define bCFOEn 0x10000
818#define bCFOValue 0xfff00000
819#define bSigTone_Re 0x3f
820#define bSigTone_Im 0x7f00
821#define bCounter_CCA 0xffff
822#define bCounter_ParityFail 0xffff0000
823#define bCounter_RateIllegal 0xffff
824#define bCounter_CRC8Fail 0xffff0000
825#define bCounter_MCSNoSupport 0xffff
826#define bCounter_FastSync 0xffff
827#define bShortCFO 0xfff
828#define bShortCFOTLength 12 /* total */
829#define bShortCFOFLength 11 /* fraction */
830#define bLongCFO 0x7ff
831#define bLongCFOTLength 11
832#define bLongCFOFLength 11
833#define bTailCFO 0x1fff
834#define bTailCFOTLength 13
835#define bTailCFOFLength 12
836#define bmax_en_pwdB 0xffff
837#define bCC_power_dB 0xffff0000
838#define bnoise_pwdB 0xffff
839#define bPowerMeasTLength 10
840#define bPowerMeasFLength 3
841#define bRx_HT_BW 0x1
842#define bRxSC 0x6
843#define bRx_HT 0x8
844#define bNB_intf_det_on 0x1
845#define bIntf_win_len_cfg 0x30
846#define bNB_Intf_TH_cfg 0x1c0
847#define bRFGain 0x3f
848#define bTableSel 0x40
849#define bTRSW 0x80
850#define bRxSNR_A 0xff
851#define bRxSNR_B 0xff00
852#define bRxSNR_C 0xff0000
853#define bRxSNR_D 0xff000000
854#define bSNREVMTLength 8
855#define bSNREVMFLength 1
856#define bCSI1st 0xff
857#define bCSI2nd 0xff00
858#define bRxEVM1st 0xff0000
859#define bRxEVM2nd 0xff000000
860#define bSIGEVM 0xff
861#define bPWDB 0xff00
862#define bSGIEN 0x10000
863
864#define bSFactorQAM1 0xf /* Useless */
865#define bSFactorQAM2 0xf0
866#define bSFactorQAM3 0xf00
867#define bSFactorQAM4 0xf000
868#define bSFactorQAM5 0xf0000
869#define bSFactorQAM6 0xf0000
870#define bSFactorQAM7 0xf00000
871#define bSFactorQAM8 0xf000000
872#define bSFactorQAM9 0xf0000000
873#define bCSIScheme 0x100000
874
875#define bNoiseLvlTopSet 0x3 /* Useless */
876#define bChSmooth 0x4
877#define bChSmoothCfg1 0x38
878#define bChSmoothCfg2 0x1c0
879#define bChSmoothCfg3 0xe00
880#define bChSmoothCfg4 0x7000
881#define bMRCMode 0x800000
882#define bTHEVMCfg 0x7000000
883
884#define bLoopFitType 0x1 /* Useless */
885#define bUpdCFO 0x40
886#define bUpdCFOOffData 0x80
887#define bAdvUpdCFO 0x100
888#define bAdvTimeCtrl 0x800
889#define bUpdClko 0x1000
890#define bFC 0x6000
891#define bTrackingMode 0x8000
892#define bPhCmpEnable 0x10000
893#define bUpdClkoLTF 0x20000
894#define bComChCFO 0x40000
895#define bCSIEstiMode 0x80000
896#define bAdvUpdEqz 0x100000
897#define bUChCfg 0x7000000
898#define bUpdEqz 0x8000000
899
900#define bTxAGCRate18_06 0x7f7f7f7f /* Useless */
901#define bTxAGCRate54_24 0x7f7f7f7f
902#define bTxAGCRateMCS32 0x7f
903#define bTxAGCRateCCK 0x7f00
904#define bTxAGCRateMCS3_MCS0 0x7f7f7f7f
905#define bTxAGCRateMCS7_MCS4 0x7f7f7f7f
906#define bTxAGCRateMCS11_MCS8 0x7f7f7f7f
907#define bTxAGCRateMCS15_MCS12 0x7f7f7f7f
908
909/* Rx Pseduo noise */
910#define bRxPesudoNoiseOn 0x20000000 /* Useless */
911#define bRxPesudoNoise_A 0xff
912#define bRxPesudoNoise_B 0xff00
913#define bRxPesudoNoise_C 0xff0000
914#define bRxPesudoNoise_D 0xff000000
915#define bPesudoNoiseState_A 0xffff
916#define bPesudoNoiseState_B 0xffff0000
917#define bPesudoNoiseState_C 0xffff
918#define bPesudoNoiseState_D 0xffff0000
919
920/* 7. RF Register
921 * Zebra1 */
922#define bZebra1_HSSIEnable 0x8 /* Useless */
923#define bZebra1_TRxControl 0xc00
924#define bZebra1_TRxGainSetting 0x07f
925#define bZebra1_RxCorner 0xc00
926#define bZebra1_TxChargePump 0x38
927#define bZebra1_RxChargePump 0x7
928#define bZebra1_ChannelNum 0xf80
929#define bZebra1_TxLPFBW 0x400
930#define bZebra1_RxLPFBW 0x600
931
932/*Zebra4 */
933#define bRTL8256RegModeCtrl1 0x100 /* Useless */
934#define bRTL8256RegModeCtrl0 0x40
935#define bRTL8256_TxLPFBW 0x18
936#define bRTL8256_RxLPFBW 0x600
937
938/* RTL8258 */
939#define bRTL8258_TxLPFBW 0xc /* Useless */
940#define bRTL8258_RxLPFBW 0xc00
941#define bRTL8258_RSSILPFBW 0xc0
942
943/*
944 * Other Definition
945 */
946
947/* byte endable for sb_write */
948#define bByte0 0x1 /* Useless */
949#define bByte1 0x2
950#define bByte2 0x4
951#define bByte3 0x8
952#define bWord0 0x3
953#define bWord1 0xc
954#define bDWord 0xf
955
956/* for PutRegsetting & GetRegSetting BitMask */
957#define bMaskByte0 0xff /* Reg 0xc50 rOFDM0_XAAGCCore~0xC6f */
958#define bMaskByte1 0xff00
959#define bMaskByte2 0xff0000
960#define bMaskByte3 0xff000000
961#define bMaskHWord 0xffff0000
962#define bMaskLWord 0x0000ffff
963#define bMaskDWord 0xffffffff
964
965/* for PutRFRegsetting & GetRFRegSetting BitMask */
966#define bRFRegOffsetMask 0xfffff
967#define bEnable 0x1 /* Useless */
968#define bDisable 0x0
969
970#define LeftAntenna 0x0 /* Useless */
971#define RightAntenna 0x1
972
973#define tCheckTxStatus 500 /* 500ms Useless */
974#define tUpdateRxCounter 100 /* 100ms */
975
976#define rateCCK 0 /* Useless */
977#define rateOFDM 1
978#define rateHT 2
979
980/* define Register-End */
981#define bPMAC_End 0x1ff /* Useless */
982#define bFPGAPHY0_End 0x8ff
983#define bFPGAPHY1_End 0x9ff
984#define bCCKPHY0_End 0xaff
985#define bOFDMPHY0_End 0xcff
986#define bOFDMPHY1_End 0xdff
987
988#define bPMACControl 0x0 /* Useless */
989#define bWMACControl 0x1
990#define bWNICControl 0x2
991
992#define ANTENNA_A 0x1 /* Useless */
993#define ANTENNA_B 0x2
994#define ANTENNA_AB 0x3 /* ANTENNA_A |ANTENNA_B */
995
996#define ANTENNA_C 0x4
997#define ANTENNA_D 0x8
998
999
1000/* accept all physical address */
1001#define RCR_AAP BIT(0)
1002#define RCR_APM BIT(1) /* accept physical match */
1003#define RCR_AM BIT(2) /* accept multicast */
1004#define RCR_AB BIT(3) /* accept broadcast */
1005#define RCR_ACRC32 BIT(5) /* accept error packet */
1006#define RCR_9356SEL BIT(6)
1007#define RCR_AICV BIT(12) /* Accept ICV error packet */
1008#define RCR_RXFTH0 (BIT(13)|BIT(14)|BIT(15)) /* Rx FIFO threshold */
1009#define RCR_ADF BIT(18) /* Accept Data(frame type) frame */
1010#define RCR_ACF BIT(19) /* Accept control frame */
1011#define RCR_AMF BIT(20) /* Accept management frame */
1012#define RCR_ADD3 BIT(21)
1013#define RCR_APWRMGT BIT(22) /* Accept power management packet */
1014#define RCR_CBSSID BIT(23) /* Accept BSSID match packet */
1015#define RCR_ENMARP BIT(28) /* enable mac auto reset phy */
1016#define RCR_EnCS1 BIT(29) /* enable carrier sense method 1 */
1017#define RCR_EnCS2 BIT(30) /* enable carrier sense method 2 */
1018/* Rx Early mode is performed for packet size greater than 1536 */
1019#define RCR_OnlyErlPkt BIT(31)
1020
1021/*--------------------------Define Parameters-------------------------------*/
1022
1023
1024#endif /*__INC_HAL8192SPHYREG_H */
1025
diff --git a/drivers/staging/rtl8712/rtl871x_pwrctrl.c b/drivers/staging/rtl8712/rtl871x_pwrctrl.c
new file mode 100644
index 00000000000..9244c8a6d94
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_pwrctrl.c
@@ -0,0 +1,250 @@
1/******************************************************************************
2 * rtl871x_pwrctrl.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_PWRCTRL_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "osdep_intf.h"
34
35#define RTL8712_SDIO_LOCAL_BASE 0X10100000
36#define SDIO_HCPWM (RTL8712_SDIO_LOCAL_BASE + 0x0081)
37
38void r8712_set_rpwm(struct _adapter *padapter, u8 val8)
39{
40 u8 rpwm;
41 struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
42
43 if (pwrpriv->rpwm == val8) {
44 if (pwrpriv->rpwm_retry == 0)
45 return;
46 }
47 if ((padapter->bDriverStopped == true) ||
48 (padapter->bSurpriseRemoved == true))
49 return;
50 rpwm = val8 | pwrpriv->tog;
51 switch (val8) {
52 case PS_STATE_S1:
53 pwrpriv->cpwm = val8;
54 break;
55 case PS_STATE_S2:/* only for USB normal powersave mode use,
56 * temp mark some code. */
57 case PS_STATE_S3:
58 case PS_STATE_S4:
59 pwrpriv->cpwm = val8;
60 break;
61 default:
62 break;
63 }
64 pwrpriv->rpwm_retry = 0;
65 pwrpriv->rpwm = val8;
66 r8712_write8(padapter, 0x1025FE58, rpwm);
67 pwrpriv->tog += 0x80;
68}
69
70void r8712_set_ps_mode(struct _adapter *padapter, uint ps_mode, uint smart_ps)
71{
72 struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
73
74 if (ps_mode > PM_Card_Disable)
75 return;
76 /* if driver is in active state, we dont need set smart_ps.*/
77 if (ps_mode == PS_MODE_ACTIVE)
78 smart_ps = 0;
79 if ((pwrpriv->pwr_mode != ps_mode) || (pwrpriv->smart_ps != smart_ps)) {
80 if (pwrpriv->pwr_mode == PS_MODE_ACTIVE)
81 pwrpriv->bSleep = true;
82 else
83 pwrpriv->bSleep = false;
84 pwrpriv->pwr_mode = ps_mode;
85 pwrpriv->smart_ps = smart_ps;
86 _set_workitem(&(pwrpriv->SetPSModeWorkItem));
87 }
88}
89
90/*
91 * Caller:ISR handler...
92 *
93 * This will be called when CPWM interrupt is up.
94 *
95 * using to update cpwn of drv; and drv willl make a decision to up or
96 * down pwr level
97 */
98void r8712_cpwm_int_hdl(struct _adapter *padapter,
99 struct reportpwrstate_parm *preportpwrstate)
100{
101 struct pwrctrl_priv *pwrpriv = &(padapter->pwrctrlpriv);
102 struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
103 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
104
105 if (pwrpriv->cpwm_tog == ((preportpwrstate->state) & 0x80))
106 return;
107 _cancel_timer_ex(&padapter->pwrctrlpriv. rpwm_check_timer);
108 _enter_pwrlock(&pwrpriv->lock);
109 pwrpriv->cpwm = (preportpwrstate->state) & 0xf;
110 if (pwrpriv->cpwm >= PS_STATE_S2) {
111 if (pwrpriv->alives & CMD_ALIVE)
112 up(&(pcmdpriv->cmd_queue_sema));
113 if (pwrpriv->alives & XMIT_ALIVE)
114 up(&(pxmitpriv->xmit_sema));
115 }
116 pwrpriv->cpwm_tog = (preportpwrstate->state) & 0x80;
117 up(&pwrpriv->lock);
118}
119
120static inline void register_task_alive(struct pwrctrl_priv *pwrctrl, uint tag)
121{
122 pwrctrl->alives |= tag;
123}
124
125static inline void unregister_task_alive(struct pwrctrl_priv *pwrctrl, uint tag)
126{
127 if (pwrctrl->alives & tag)
128 pwrctrl->alives ^= tag;
129}
130
131static void _rpwm_check_handler (struct _adapter *padapter)
132{
133 struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
134
135 if (padapter->bDriverStopped == true ||
136 padapter->bSurpriseRemoved == true)
137 return;
138 if (pwrpriv->cpwm != pwrpriv->rpwm)
139 _set_workitem(&(pwrpriv->rpwm_workitem));
140}
141
142static void SetPSModeWorkItemCallback(struct work_struct *work)
143{
144 struct pwrctrl_priv *pwrpriv = container_of(work,
145 struct pwrctrl_priv, SetPSModeWorkItem);
146 struct _adapter *padapter = container_of(pwrpriv,
147 struct _adapter, pwrctrlpriv);
148 _enter_pwrlock(&pwrpriv->lock);
149 if (!pwrpriv->bSleep) {
150 if (pwrpriv->pwr_mode == PS_MODE_ACTIVE)
151 r8712_set_rpwm(padapter, PS_STATE_S4);
152 }
153 up(&pwrpriv->lock);
154}
155
156static void rpwm_workitem_callback(struct work_struct *work)
157{
158 struct pwrctrl_priv *pwrpriv = container_of(work,
159 struct pwrctrl_priv, rpwm_workitem);
160 struct _adapter *padapter = container_of(pwrpriv,
161 struct _adapter, pwrctrlpriv);
162 u8 cpwm = pwrpriv->cpwm;
163 _enter_pwrlock(&pwrpriv->lock);
164 if (pwrpriv->cpwm != pwrpriv->rpwm) {
165 cpwm = r8712_read8(padapter, SDIO_HCPWM);
166 pwrpriv->rpwm_retry = 1;
167 r8712_set_rpwm(padapter, pwrpriv->rpwm);
168 }
169 up(&pwrpriv->lock);
170}
171
172static void rpwm_check_handler (void *FunctionContext)
173{
174 struct _adapter *adapter = (struct _adapter *)FunctionContext;
175 _rpwm_check_handler(adapter);
176}
177
178void r8712_init_pwrctrl_priv(struct _adapter *padapter)
179{
180 struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
181
182 memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv));
183 sema_init(&pwrctrlpriv->lock, 1);
184 pwrctrlpriv->cpwm = PS_STATE_S4;
185 pwrctrlpriv->pwr_mode = PS_MODE_ACTIVE;
186 pwrctrlpriv->smart_ps = 0;
187 pwrctrlpriv->tog = 0x80;
188/* clear RPWM to ensure driver and fw back to initial state. */
189 r8712_write8(padapter, 0x1025FE58, 0);
190 _init_workitem(&(pwrctrlpriv->SetPSModeWorkItem),
191 SetPSModeWorkItemCallback, padapter);
192 _init_workitem(&(pwrctrlpriv->rpwm_workitem),
193 rpwm_workitem_callback, padapter);
194 _init_timer(&(pwrctrlpriv->rpwm_check_timer),
195 padapter->pnetdev, rpwm_check_handler, (u8 *)padapter);
196}
197
198/*
199Caller: r8712_cmd_thread
200
201Check if the fw_pwrstate is okay for issuing cmd.
202If not (cpwm should be is less than P2 state), then the sub-routine
203will raise the cpwm to be greater than or equal to P2.
204
205Calling Context: Passive
206
207Return Value:
208
209_SUCCESS: r8712_cmd_thread can issue cmds to firmware afterwards.
210_FAIL: r8712_cmd_thread can not do anything.
211*/
212sint r8712_register_cmd_alive(struct _adapter *padapter)
213{
214 uint res = _SUCCESS;
215 struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv;
216
217 _enter_pwrlock(&pwrctrl->lock);
218 register_task_alive(pwrctrl, CMD_ALIVE);
219 if (pwrctrl->cpwm < PS_STATE_S2) {
220 r8712_set_rpwm(padapter, PS_STATE_S3);
221 res = _FAIL;
222 }
223 up(&pwrctrl->lock);
224 return res;
225}
226
227/*
228Caller: ISR
229
230If ISR's txdone,
231No more pkts for TX,
232Then driver shall call this fun. to power down firmware again.
233*/
234
235void r8712_unregister_cmd_alive(struct _adapter *padapter)
236{
237 struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv;
238
239 _enter_pwrlock(&pwrctrl->lock);
240 unregister_task_alive(pwrctrl, CMD_ALIVE);
241 if ((pwrctrl->cpwm > PS_STATE_S2) &&
242 (pwrctrl->pwr_mode > PS_MODE_ACTIVE)) {
243 if ((pwrctrl->alives == 0) &&
244 (check_fwstate(&padapter->mlmepriv,
245 _FW_UNDER_LINKING) != true)) {
246 r8712_set_rpwm(padapter, PS_STATE_S0);
247 }
248 }
249 up(&pwrctrl->lock);
250}
diff --git a/drivers/staging/rtl8712/rtl871x_pwrctrl.h b/drivers/staging/rtl8712/rtl871x_pwrctrl.h
new file mode 100644
index 00000000000..34f074aebd6
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_pwrctrl.h
@@ -0,0 +1,127 @@
1#ifndef __RTL871X_PWRCTRL_H_
2#define __RTL871X_PWRCTRL_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7
8#define FW_PWR0 0
9#define FW_PWR1 1
10#define FW_PWR2 2
11#define FW_PWR3 3
12
13
14#define HW_PWR0 7
15#define HW_PWR1 6
16#define HW_PWR2 2
17#define HW_PWR3 0
18#define HW_PWR4 8
19
20#define FW_PWRMSK 0x7
21
22
23#define XMIT_ALIVE BIT(0)
24#define RECV_ALIVE BIT(1)
25#define CMD_ALIVE BIT(2)
26#define EVT_ALIVE BIT(3)
27
28
29enum Power_Mgnt {
30 PS_MODE_ACTIVE = 0 ,
31 PS_MODE_MIN ,
32 PS_MODE_MAX ,
33 PS_MODE_DTIM ,
34 PS_MODE_VOIP ,
35 PS_MODE_UAPSD_WMM ,
36 PS_MODE_UAPSD ,
37 PS_MODE_IBSS ,
38 PS_MODE_WWLAN ,
39 PM_Radio_Off ,
40 PM_Card_Disable ,
41 PS_MODE_NUM
42};
43
44
45/*
46 BIT[2:0] = HW state
47 BIT[3] = Protocol PS state, 0: register active state,
48 1: register sleep state
49 BIT[4] = sub-state
50*/
51
52#define PS_DPS BIT(0)
53#define PS_LCLK (PS_DPS)
54#define PS_RF_OFF BIT(1)
55#define PS_ALL_ON BIT(2)
56#define PS_ST_ACTIVE BIT(3)
57#define PS_LP BIT(4) /* low performance */
58
59#define PS_STATE_MASK (0x0F)
60#define PS_STATE_HW_MASK (0x07)
61#define PS_SEQ_MASK (0xc0)
62
63#define PS_STATE(x) (PS_STATE_MASK & (x))
64#define PS_STATE_HW(x) (PS_STATE_HW_MASK & (x))
65#define PS_SEQ(x) (PS_SEQ_MASK & (x))
66
67#define PS_STATE_S0 (PS_DPS)
68#define PS_STATE_S1 (PS_LCLK)
69#define PS_STATE_S2 (PS_RF_OFF)
70#define PS_STATE_S3 (PS_ALL_ON)
71#define PS_STATE_S4 ((PS_ST_ACTIVE) | (PS_ALL_ON))
72
73
74#define PS_IS_RF_ON(x) ((x) & (PS_ALL_ON))
75#define PS_IS_ACTIVE(x) ((x) & (PS_ST_ACTIVE))
76#define CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))
77
78
79struct reportpwrstate_parm {
80 unsigned char mode;
81 unsigned char state; /* the CPWM value */
82 unsigned short rsvd;
83};
84
85static inline void _enter_pwrlock(struct semaphore *plock)
86{
87 _down_sema(plock);
88}
89
90struct pwrctrl_priv {
91 struct semaphore lock;
92 /*volatile*/ u8 rpwm; /* requested power state for fw */
93 /* fw current power state. updated when 1. read from HCPWM or
94 * 2. driver lowers power level */
95 /*volatile*/ u8 cpwm;
96 /*volatile*/ u8 tog; /* toggling */
97 /*volatile*/ u8 cpwm_tog; /* toggling */
98 /*volatile*/ u8 tgt_rpwm; /* wanted power state */
99 uint pwr_mode;
100 uint smart_ps;
101 uint alives;
102 uint ImrContent; /* used to store original imr. */
103 uint bSleep; /* sleep -> active is different from active -> sleep. */
104
105 _workitem SetPSModeWorkItem;
106 _workitem rpwm_workitem;
107 struct timer_list rpwm_check_timer;
108 u8 rpwm_retry;
109 uint bSetPSModeWorkItemInProgress;
110
111 struct semaphore pnp_pwr_mgnt_sema;
112 spinlock_t pnp_pwr_mgnt_lock;
113 s32 pnp_current_pwr_state;
114 u8 pnp_bstop_trx;
115 u8 pnp_wwirp_pending;
116};
117
118void r8712_init_pwrctrl_priv(struct _adapter *adapter);
119sint r8712_register_cmd_alive(struct _adapter *padapter);
120void r8712_unregister_cmd_alive(struct _adapter *padapter);
121void r8712_cpwm_int_hdl(struct _adapter *padapter,
122 struct reportpwrstate_parm *preportpwrstate);
123void r8712_set_ps_mode(struct _adapter *padapter, uint ps_mode,
124 uint smart_ps);
125void r8712_set_rpwm(struct _adapter *padapter, u8 val8);
126
127#endif /* __RTL871X_PWRCTRL_H_ */
diff --git a/drivers/staging/rtl8712/rtl871x_recv.c b/drivers/staging/rtl8712/rtl871x_recv.c
new file mode 100644
index 00000000000..1f4304f8e04
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_recv.c
@@ -0,0 +1,715 @@
1/******************************************************************************
2 * rtl871x_recv.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_RECV_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "recv_osdep.h"
34#include "mlme_osdep.h"
35#include "ip.h"
36#include "if_ether.h"
37#include "ethernet.h"
38#include "usb_ops.h"
39#include "wifi.h"
40
41static const u8 SNAP_ETH_TYPE_IPX[2] = {0x81, 0x37};
42
43/* Datagram Delivery Protocol */
44static const u8 SNAP_ETH_TYPE_APPLETALK_AARP[2] = {0x80, 0xf3};
45
46/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
47static const u8 bridge_tunnel_header[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8};
48
49/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
50static const u8 rfc1042_header[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
51
52void _r8712_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv)
53{
54 memset((u8 *)psta_recvpriv, 0, sizeof(struct sta_recv_priv));
55 spin_lock_init(&psta_recvpriv->lock);
56 _init_queue(&psta_recvpriv->defrag_q);
57}
58
59sint _r8712_init_recv_priv(struct recv_priv *precvpriv,
60 struct _adapter *padapter)
61{
62 sint i;
63 union recv_frame *precvframe;
64
65 memset((unsigned char *)precvpriv, 0, sizeof(struct recv_priv));
66 spin_lock_init(&precvpriv->lock);
67 _init_queue(&precvpriv->free_recv_queue);
68 _init_queue(&precvpriv->recv_pending_queue);
69 precvpriv->adapter = padapter;
70 precvpriv->free_recvframe_cnt = NR_RECVFRAME;
71 precvpriv->pallocated_frame_buf = _malloc(NR_RECVFRAME *
72 sizeof(union recv_frame) +
73 RXFRAME_ALIGN_SZ);
74 if (precvpriv->pallocated_frame_buf == NULL)
75 return _FAIL;
76 memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME *
77 sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);
78 precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf +
79 RXFRAME_ALIGN_SZ -
80 ((addr_t)(precvpriv->pallocated_frame_buf) &
81 (RXFRAME_ALIGN_SZ-1));
82 precvframe = (union recv_frame *)precvpriv->precv_frame_buf;
83 for (i = 0; i < NR_RECVFRAME; i++) {
84 _init_listhead(&(precvframe->u.list));
85 list_insert_tail(&(precvframe->u.list),
86 &(precvpriv->free_recv_queue.queue));
87 r8712_os_recv_resource_alloc(padapter, precvframe);
88 precvframe->u.hdr.adapter = padapter;
89 precvframe++;
90 }
91 precvpriv->rx_pending_cnt = 1;
92 sema_init(&precvpriv->allrxreturnevt, 0);
93 return r8712_init_recv_priv(precvpriv, padapter);
94}
95
96void _r8712_free_recv_priv(struct recv_priv *precvpriv)
97{
98 kfree(precvpriv->pallocated_frame_buf);
99 r8712_free_recv_priv(precvpriv);
100}
101
102union recv_frame *r8712_alloc_recvframe(struct __queue *pfree_recv_queue)
103{
104 unsigned long irqL;
105 union recv_frame *precvframe;
106 struct list_head *plist, *phead;
107 struct _adapter *padapter;
108 struct recv_priv *precvpriv;
109
110 spin_lock_irqsave(&pfree_recv_queue->lock, irqL);
111 if (_queue_empty(pfree_recv_queue) == true)
112 precvframe = NULL;
113 else {
114 phead = get_list_head(pfree_recv_queue);
115 plist = get_next(phead);
116 precvframe = LIST_CONTAINOR(plist, union recv_frame, u);
117 list_delete(&precvframe->u.hdr.list);
118 padapter = precvframe->u.hdr.adapter;
119 if (padapter != NULL) {
120 precvpriv = &padapter->recvpriv;
121 if (pfree_recv_queue == &precvpriv->free_recv_queue)
122 precvpriv->free_recvframe_cnt--;
123 }
124 }
125 spin_unlock_irqrestore(&pfree_recv_queue->lock, irqL);
126 return precvframe;
127}
128
129union recv_frame *dequeue_recvframe(struct __queue *queue)
130{
131 return r8712_alloc_recvframe(queue);
132}
133
134sint enqueue_recvframe(union recv_frame *precvframe, struct __queue *queue)
135{
136 unsigned long irqL;
137 struct _adapter *padapter = precvframe->u.hdr.adapter;
138 struct recv_priv *precvpriv = &padapter->recvpriv;
139
140 spin_lock_irqsave(&queue->lock, irqL);
141 list_delete(&(precvframe->u.hdr.list));
142 list_insert_tail(&(precvframe->u.hdr.list), get_list_head(queue));
143 if (padapter != NULL) {
144 if (queue == &precvpriv->free_recv_queue)
145 precvpriv->free_recvframe_cnt++;
146 }
147 spin_unlock_irqrestore(&queue->lock, irqL);
148 return _SUCCESS;
149}
150
151/*
152caller : defrag; recvframe_chk_defrag in recv_thread (passive)
153pframequeue: defrag_queue : will be accessed in recv_thread (passive)
154
155using spin_lock to protect
156
157*/
158
159void r8712_free_recvframe_queue(struct __queue *pframequeue,
160 struct __queue *pfree_recv_queue)
161{
162 union recv_frame *precvframe;
163 struct list_head *plist, *phead;
164
165 spin_lock(&pframequeue->lock);
166 phead = get_list_head(pframequeue);
167 plist = get_next(phead);
168 while (end_of_queue_search(phead, plist) == false) {
169 precvframe = LIST_CONTAINOR(plist, union recv_frame, u);
170 plist = get_next(plist);
171 r8712_free_recvframe(precvframe, pfree_recv_queue);
172 }
173 spin_unlock(&pframequeue->lock);
174}
175
176sint r8712_recvframe_chkmic(struct _adapter *adapter,
177 union recv_frame *precvframe)
178{
179 sint i, res = _SUCCESS;
180 u32 datalen;
181 u8 miccode[8];
182 u8 bmic_err = false;
183 u8 *pframe, *payload, *pframemic;
184 u8 *mickey, idx, *iv;
185 struct sta_info *stainfo;
186 struct rx_pkt_attrib *prxattrib = &precvframe->u.hdr.attrib;
187 struct security_priv *psecuritypriv = &adapter->securitypriv;
188
189 stainfo = r8712_get_stainfo(&adapter->stapriv, &prxattrib->ta[0]);
190 if (prxattrib->encrypt == _TKIP_) {
191 /* calculate mic code */
192 if (stainfo != NULL) {
193 if (IS_MCAST(prxattrib->ra)) {
194 iv = precvframe->u.hdr.rx_data +
195 prxattrib->hdrlen;
196 idx = iv[3];
197 mickey = &psecuritypriv->XGrprxmickey[(((idx >>
198 6) & 0x3)) - 1].skey[0];
199 if (psecuritypriv->binstallGrpkey == false)
200 return _FAIL;
201 } else
202 mickey = &stainfo->tkiprxmickey.skey[0];
203 /*icv_len included the mic code*/
204 datalen = precvframe->u.hdr.len - prxattrib->hdrlen -
205 prxattrib->iv_len - prxattrib->icv_len - 8;
206 pframe = precvframe->u.hdr.rx_data;
207 payload = pframe + prxattrib->hdrlen +
208 prxattrib->iv_len;
209 seccalctkipmic(mickey, pframe, payload, datalen,
210 &miccode[0],
211 (unsigned char)prxattrib->priority);
212 pframemic = payload + datalen;
213 bmic_err = false;
214 for (i = 0; i < 8; i++) {
215 if (miccode[i] != *(pframemic + i))
216 bmic_err = true;
217 }
218 if (bmic_err == true) {
219 if (prxattrib->bdecrypted == true)
220 r8712_handle_tkip_mic_err(adapter,
221 (u8)IS_MCAST(prxattrib->ra));
222 res = _FAIL;
223 } else {
224 /* mic checked ok */
225 if ((psecuritypriv->bcheck_grpkey ==
226 false) && (IS_MCAST(prxattrib->ra) ==
227 true))
228 psecuritypriv->bcheck_grpkey = true;
229 }
230 recvframe_pull_tail(precvframe, 8);
231 }
232 }
233 return res;
234}
235
236/* decrypt and set the ivlen,icvlen of the recv_frame */
237union recv_frame *r8712_decryptor(struct _adapter *padapter,
238 union recv_frame *precv_frame)
239{
240 struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib;
241 struct security_priv *psecuritypriv = &padapter->securitypriv;
242 union recv_frame *return_packet = precv_frame;
243
244 if ((prxattrib->encrypt > 0) && ((prxattrib->bdecrypted == 0) ||
245 (psecuritypriv->sw_decrypt == true))) {
246 psecuritypriv->hw_decrypted = false;
247 switch (prxattrib->encrypt) {
248 case _WEP40_:
249 case _WEP104_:
250 r8712_wep_decrypt(padapter, (u8 *)precv_frame);
251 break;
252 case _TKIP_:
253 r8712_tkip_decrypt(padapter, (u8 *)precv_frame);
254 break;
255 case _AES_:
256 r8712_aes_decrypt(padapter, (u8 *)precv_frame);
257 break;
258 default:
259 break;
260 }
261 } else if (prxattrib->bdecrypted == 1)
262 psecuritypriv->hw_decrypted = true;
263 return return_packet;
264}
265/*###set the security information in the recv_frame */
266union recv_frame *r8712_portctrl(struct _adapter *adapter,
267 union recv_frame *precv_frame)
268{
269 u8 *psta_addr, *ptr;
270 uint auth_alg;
271 struct recv_frame_hdr *pfhdr;
272 struct sta_info *psta;
273 struct sta_priv *pstapriv;
274 union recv_frame *prtnframe;
275 u16 ether_type = 0;
276
277 pstapriv = &adapter->stapriv;
278 ptr = get_recvframe_data(precv_frame);
279 pfhdr = &precv_frame->u.hdr;
280 psta_addr = pfhdr->attrib.ta;
281 psta = r8712_get_stainfo(pstapriv, psta_addr);
282 auth_alg = adapter->securitypriv.AuthAlgrthm;
283 if (auth_alg == 2) {
284 if ((psta != NULL) && (psta->ieee8021x_blocked)) {
285 /* blocked
286 * only accept EAPOL frame */
287 prtnframe = precv_frame;
288 /*get ether_type */
289 ptr = ptr + pfhdr->attrib.hdrlen +
290 pfhdr->attrib.iv_len + LLC_HEADER_SIZE;
291 memcpy(&ether_type, ptr, 2);
292 ether_type = ntohs((unsigned short)ether_type);
293 if (ether_type == 0x888e)
294 prtnframe = precv_frame;
295 else {
296 /*free this frame*/
297 r8712_free_recvframe(precv_frame,
298 &adapter->recvpriv.free_recv_queue);
299 prtnframe = NULL;
300 }
301 } else {
302 /* allowed
303 * check decryption status, and decrypt the
304 * frame if needed */
305 prtnframe = precv_frame;
306 /* check is the EAPOL frame or not (Rekey) */
307 if (ether_type == 0x888e) {
308 /* check Rekey */
309 prtnframe = precv_frame;
310 }
311 }
312 } else
313 prtnframe = precv_frame;
314 return prtnframe;
315}
316
317sint recv_decache(union recv_frame *precv_frame, u8 bretry,
318 struct stainfo_rxcache *prxcache)
319{
320 sint tid = precv_frame->u.hdr.attrib.priority;
321 u16 seq_ctrl = ((precv_frame->u.hdr.attrib.seq_num&0xffff) << 4) |
322 (precv_frame->u.hdr.attrib.frag_num & 0xf);
323
324 if (tid > 15)
325 return _FAIL;
326 if (seq_ctrl == prxcache->tid_rxseq[tid])
327 return _FAIL;
328 prxcache->tid_rxseq[tid] = seq_ctrl;
329 return _SUCCESS;
330}
331
332sint sta2sta_data_frame(struct _adapter *adapter, union recv_frame *precv_frame,
333 struct sta_info **psta
334)
335{
336 u8 *ptr = precv_frame->u.hdr.rx_data;
337 sint ret = _SUCCESS;
338 struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
339 struct sta_priv *pstapriv = &adapter->stapriv;
340 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
341 u8 *mybssid = get_bssid(pmlmepriv);
342 u8 *myhwaddr = myid(&adapter->eeprompriv);
343 u8 *sta_addr = NULL;
344 sint bmcast = IS_MCAST(pattrib->dst);
345
346 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true) ||
347 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
348 /* filter packets that SA is myself or multicast or broadcast */
349 if (!memcmp(myhwaddr, pattrib->src, ETH_ALEN))
350 return _FAIL;
351 if ((memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast))
352 return _FAIL;
353 if (!memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
354 !memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
355 (memcmp(pattrib->bssid, mybssid, ETH_ALEN)))
356 return _FAIL;
357 sta_addr = pattrib->src;
358 } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) {
359 /* For Station mode, sa and bssid should always be BSSID,
360 * and DA is my mac-address */
361 if (memcmp(pattrib->bssid, pattrib->src, ETH_ALEN))
362 return _FAIL;
363 sta_addr = pattrib->bssid;
364 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) {
365 if (bmcast) {
366 /* For AP mode, if DA == MCAST, then BSSID should
367 * be also MCAST */
368 if (!IS_MCAST(pattrib->bssid))
369 return _FAIL;
370 } else { /* not mc-frame */
371 /* For AP mode, if DA is non-MCAST, then it must be
372 * BSSID, and bssid == BSSID */
373 if (memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN))
374 return _FAIL;
375 sta_addr = pattrib->src;
376 }
377 } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true) {
378 memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
379 memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);
380 memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
381 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
382 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
383 sta_addr = mybssid;
384 } else
385 ret = _FAIL;
386 if (bmcast)
387 *psta = r8712_get_bcmc_stainfo(adapter);
388 else
389 *psta = r8712_get_stainfo(pstapriv, sta_addr); /* get ap_info */
390 if (*psta == NULL) {
391 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true)
392 adapter->mppriv.rx_pktloss++;
393 return _FAIL;
394 }
395 return ret;
396}
397
398sint ap2sta_data_frame(struct _adapter *adapter, union recv_frame *precv_frame,
399 struct sta_info **psta)
400{
401 u8 *ptr = precv_frame->u.hdr.rx_data;
402 struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
403 struct sta_priv *pstapriv = &adapter->stapriv;
404 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
405 u8 *mybssid = get_bssid(pmlmepriv);
406 u8 *myhwaddr = myid(&adapter->eeprompriv);
407 sint bmcast = IS_MCAST(pattrib->dst);
408
409 if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true)
410 && (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
411 /* if NULL-frame, drop packet */
412 if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL)
413 return _FAIL;
414 /* drop QoS-SubType Data, including QoS NULL,
415 * excluding QoS-Data */
416 if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) ==
417 WIFI_QOS_DATA_TYPE) {
418 if (GetFrameSubType(ptr) & (BIT(4) | BIT(5) | BIT(6)))
419 return _FAIL;
420 }
421
422 /* filter packets that SA is myself or multicast or broadcast */
423 if (!memcmp(myhwaddr, pattrib->src, ETH_ALEN))
424 return _FAIL;
425
426 /* da should be for me */
427 if ((memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast))
428 return _FAIL;
429 /* check BSSID */
430 if (!memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
431 !memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
432 (memcmp(pattrib->bssid, mybssid, ETH_ALEN)))
433 return _FAIL;
434 if (bmcast)
435 *psta = r8712_get_bcmc_stainfo(adapter);
436 else
437 *psta = r8712_get_stainfo(pstapriv, pattrib->bssid);
438 if (*psta == NULL)
439 return _FAIL;
440 } else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == true) &&
441 (check_fwstate(pmlmepriv, _FW_LINKED) == true)) {
442 memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
443 memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);
444 memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
445 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
446 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
447 memcpy(pattrib->bssid, mybssid, ETH_ALEN);
448 *psta = r8712_get_stainfo(pstapriv, pattrib->bssid);
449 if (*psta == NULL)
450 return _FAIL;
451 } else
452 return _FAIL;
453 return _SUCCESS;
454}
455
456sint sta2ap_data_frame(struct _adapter *adapter, union recv_frame *precv_frame,
457 struct sta_info **psta)
458{
459 struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
460 struct sta_priv *pstapriv = &adapter->stapriv;
461 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
462 unsigned char *mybssid = get_bssid(pmlmepriv);
463
464 if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) {
465 /* For AP mode, if DA is non-MCAST, then it must be BSSID,
466 * and bssid == BSSID
467 * For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR */
468 if (memcmp(pattrib->bssid, mybssid, ETH_ALEN))
469 return _FAIL;
470 *psta = r8712_get_stainfo(pstapriv, pattrib->src);
471 if (*psta == NULL)
472 return _FAIL;
473 }
474 return _SUCCESS;
475}
476
477sint validate_recv_ctrl_frame(struct _adapter *adapter,
478 union recv_frame *precv_frame)
479{
480 return _FAIL;
481}
482
483sint validate_recv_mgnt_frame(struct _adapter *adapter,
484 union recv_frame *precv_frame)
485{
486 return _FAIL;
487}
488
489
490sint validate_recv_data_frame(struct _adapter *adapter,
491 union recv_frame *precv_frame)
492{
493 int res;
494 u8 bretry;
495 u8 *psa, *pda, *pbssid;
496 struct sta_info *psta = NULL;
497 u8 *ptr = precv_frame->u.hdr.rx_data;
498 struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
499 struct security_priv *psecuritypriv = &adapter->securitypriv;
500
501 bretry = GetRetry(ptr);
502 pda = get_da(ptr);
503 psa = get_sa(ptr);
504 pbssid = get_hdr_bssid(ptr);
505 if (pbssid == NULL)
506 return _FAIL;
507 memcpy(pattrib->dst, pda, ETH_ALEN);
508 memcpy(pattrib->src, psa, ETH_ALEN);
509 memcpy(pattrib->bssid, pbssid, ETH_ALEN);
510 switch (pattrib->to_fr_ds) {
511 case 0:
512 memcpy(pattrib->ra, pda, ETH_ALEN);
513 memcpy(pattrib->ta, psa, ETH_ALEN);
514 res = sta2sta_data_frame(adapter, precv_frame, &psta);
515 break;
516 case 1:
517 memcpy(pattrib->ra, pda, ETH_ALEN);
518 memcpy(pattrib->ta, pbssid, ETH_ALEN);
519 res = ap2sta_data_frame(adapter, precv_frame, &psta);
520 break;
521 case 2:
522 memcpy(pattrib->ra, pbssid, ETH_ALEN);
523 memcpy(pattrib->ta, psa, ETH_ALEN);
524 res = sta2ap_data_frame(adapter, precv_frame, &psta);
525 break;
526 case 3:
527 memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
528 memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);
529 return _FAIL;
530 default:
531 return _FAIL;
532 }
533 if (res == _FAIL)
534 return _FAIL;
535 if (psta == NULL)
536 return _FAIL;
537 else
538 precv_frame->u.hdr.psta = psta;
539 pattrib->amsdu = 0;
540 /* parsing QC field */
541 if (pattrib->qos == 1) {
542 pattrib->priority = GetPriority((ptr + 24));
543 pattrib->ack_policy = GetAckpolicy((ptr + 24));
544 pattrib->amsdu = GetAMsdu((ptr + 24));
545 pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 32 : 26;
546 } else {
547 pattrib->priority = 0;
548 pattrib->hdrlen = (pattrib->to_fr_ds == 3) ? 30 : 24;
549 }
550
551 if (pattrib->order)/*HT-CTRL 11n*/
552 pattrib->hdrlen += 4;
553 precv_frame->u.hdr.preorder_ctrl =
554 &psta->recvreorder_ctrl[pattrib->priority];
555
556 /* decache, drop duplicate recv packets */
557 if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) ==
558 _FAIL)
559 return _FAIL;
560
561 if (pattrib->privacy) {
562 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt,
563 IS_MCAST(pattrib->ra));
564 SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len,
565 pattrib->encrypt);
566 } else {
567 pattrib->encrypt = 0;
568 pattrib->iv_len = pattrib->icv_len = 0;
569 }
570 return _SUCCESS;
571}
572
573sint r8712_validate_recv_frame(struct _adapter *adapter,
574 union recv_frame *precv_frame)
575{
576 /*shall check frame subtype, to / from ds, da, bssid */
577 /*then call check if rx seq/frag. duplicated.*/
578
579 u8 type;
580 u8 subtype;
581 sint retval = _SUCCESS;
582 struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
583
584 u8 *ptr = precv_frame->u.hdr.rx_data;
585 u8 ver = (unsigned char)(*ptr) & 0x3;
586
587 /*add version chk*/
588 if (ver != 0)
589 return _FAIL;
590 type = GetFrameType(ptr);
591 subtype = GetFrameSubType(ptr); /*bit(7)~bit(2)*/
592 pattrib->to_fr_ds = get_tofr_ds(ptr);
593 pattrib->frag_num = GetFragNum(ptr);
594 pattrib->seq_num = GetSequence(ptr);
595 pattrib->pw_save = GetPwrMgt(ptr);
596 pattrib->mfrag = GetMFrag(ptr);
597 pattrib->mdata = GetMData(ptr);
598 pattrib->privacy = GetPrivacy(ptr);
599 pattrib->order = GetOrder(ptr);
600 switch (type) {
601 case WIFI_MGT_TYPE: /*mgnt*/
602 retval = validate_recv_mgnt_frame(adapter, precv_frame);
603 break;
604 case WIFI_CTRL_TYPE:/*ctrl*/
605 retval = validate_recv_ctrl_frame(adapter, precv_frame);
606 break;
607 case WIFI_DATA_TYPE: /*data*/
608 pattrib->qos = (subtype & BIT(7)) ? 1 : 0;
609 retval = validate_recv_data_frame(adapter, precv_frame);
610 break;
611 default:
612 return _FAIL;
613 }
614 return retval;
615}
616
617sint r8712_wlanhdr_to_ethhdr(union recv_frame *precvframe)
618{
619 /*remove the wlanhdr and add the eth_hdr*/
620 sint rmv_len;
621 u16 eth_type, len;
622 u8 bsnaphdr;
623 u8 *psnap_type;
624 struct ieee80211_snap_hdr *psnap;
625
626 sint ret = _SUCCESS;
627 struct _adapter *adapter = precvframe->u.hdr.adapter;
628 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
629
630 u8 *ptr = get_recvframe_data(precvframe); /*point to frame_ctrl field*/
631 struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
632
633 if (pattrib->encrypt)
634 recvframe_pull_tail(precvframe, pattrib->icv_len);
635 psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen +
636 pattrib->iv_len);
637 psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE;
638 /* convert hdr + possible LLC headers into Ethernet header */
639 if ((!memcmp(psnap, (void *)rfc1042_header, SNAP_SIZE) &&
640 (memcmp(psnap_type, (void *)SNAP_ETH_TYPE_IPX, 2)) &&
641 (memcmp(psnap_type, (void *)SNAP_ETH_TYPE_APPLETALK_AARP, 2))) ||
642 !memcmp(psnap, (void *)bridge_tunnel_header, SNAP_SIZE)) {
643 /* remove RFC1042 or Bridge-Tunnel encapsulation and
644 * replace EtherType */
645 bsnaphdr = true;
646 } else {
647 /* Leave Ethernet header part of hdr and full payload */
648 bsnaphdr = false;
649 }
650 rmv_len = pattrib->hdrlen + pattrib->iv_len +
651 (bsnaphdr ? SNAP_SIZE : 0);
652 len = precvframe->u.hdr.len - rmv_len;
653 if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == true)) {
654 ptr += rmv_len;
655 *ptr = 0x87;
656 *(ptr+1) = 0x12;
657 eth_type = 0x8712;
658 /* append rx status for mp test packets */
659 ptr = recvframe_pull(precvframe, (rmv_len -
660 sizeof(struct ethhdr) + 2) - 24);
661 memcpy(ptr, get_rxmem(precvframe), 24);
662 ptr += 24;
663 } else
664 ptr = recvframe_pull(precvframe, (rmv_len -
665 sizeof(struct ethhdr) + (bsnaphdr ? 2 : 0)));
666
667 memcpy(ptr, pattrib->dst, ETH_ALEN);
668 memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);
669 if (!bsnaphdr) {
670 len = htons(len);
671 memcpy(ptr + 12, &len, 2);
672 }
673 return ret;
674}
675
676s32 r8712_recv_entry(union recv_frame *precvframe)
677{
678 struct _adapter *padapter;
679 struct recv_priv *precvpriv;
680 struct mlme_priv *pmlmepriv;
681 struct recv_stat *prxstat;
682 struct dvobj_priv *pdev;
683 u8 *phead, *pdata, *ptail, *pend;
684
685 struct __queue *pfree_recv_queue, *ppending_recv_queue;
686 s32 ret = _SUCCESS;
687 struct intf_hdl *pintfhdl;
688
689 padapter = precvframe->u.hdr.adapter;
690 pintfhdl = &padapter->pio_queue->intf;
691 pmlmepriv = &padapter->mlmepriv;
692 precvpriv = &(padapter->recvpriv);
693 pdev = &padapter->dvobjpriv;
694 pfree_recv_queue = &(precvpriv->free_recv_queue);
695 ppending_recv_queue = &(precvpriv->recv_pending_queue);
696 phead = precvframe->u.hdr.rx_head;
697 pdata = precvframe->u.hdr.rx_data;
698 ptail = precvframe->u.hdr.rx_tail;
699 pend = precvframe->u.hdr.rx_end;
700 prxstat = (struct recv_stat *)phead;
701
702 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_RX);
703
704 ret = recv_func(padapter, precvframe);
705 if (ret == _FAIL)
706 goto _recv_entry_drop;
707 precvpriv->rx_pkts++;
708 precvpriv->rx_bytes += (uint)(precvframe->u.hdr.rx_tail -
709 precvframe->u.hdr.rx_data);
710 return ret;
711_recv_entry_drop:
712 precvpriv->rx_drop++;
713 padapter->mppriv.rx_pktloss = precvpriv->rx_drop;
714 return ret;
715}
diff --git a/drivers/staging/rtl8712/rtl871x_recv.h b/drivers/staging/rtl8712/rtl871x_recv.h
new file mode 100644
index 00000000000..bf8115dbcb6
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_recv.h
@@ -0,0 +1,330 @@
1#ifndef _RTL871X_RECV_H_
2#define _RTL871X_RECV_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7#define NR_RECVFRAME 256
8
9#define RXFRAME_ALIGN 8
10#define RXFRAME_ALIGN_SZ (1 << RXFRAME_ALIGN)
11
12#define MAX_RXFRAME_CNT 512
13#define MAX_RX_NUMBLKS (32)
14#define RECVFRAME_HDR_ALIGN 128
15#define MAX_SUBFRAME_COUNT 64
16
17#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
18
19/* for Rx reordering buffer control */
20struct recv_reorder_ctrl {
21 struct _adapter *padapter;
22 u16 indicate_seq;/* =wstart_b, init_value=0xffff */
23 u16 wend_b;
24 u8 wsize_b;
25 struct __queue pending_recvframe_queue;
26 struct timer_list reordering_ctrl_timer;
27};
28
29struct stainfo_rxcache {
30 u16 tid_rxseq[16];
31};
32
33#define PHY_RSSI_SLID_WIN_MAX 100
34#define PHY_LINKQUALITY_SLID_WIN_MAX 20
35
36
37struct smooth_rssi_data {
38 u32 elements[100]; /* array to store values */
39 u32 index; /* index to current array to store */
40 u32 total_num; /* num of valid elements */
41 u32 total_val; /* sum of valid elements */
42};
43
44struct rx_pkt_attrib {
45
46 u8 amsdu;
47 u8 order;
48 u8 qos;
49 u8 to_fr_ds;
50 u8 frag_num;
51 u16 seq_num;
52 u8 pw_save;
53 u8 mfrag;
54 u8 mdata;
55 u8 privacy; /* in frame_ctrl field */
56 u8 bdecrypted;
57 int hdrlen; /* the WLAN Header Len */
58 int encrypt; /* 0 no encrypt. != 0 encrypt algorith */
59 int iv_len;
60 int icv_len;
61 int priority;
62 int ack_policy;
63 u8 crc_err;
64 u8 dst[ETH_ALEN];
65 u8 src[ETH_ALEN];
66 u8 ta[ETH_ALEN];
67 u8 ra[ETH_ALEN];
68 u8 bssid[ETH_ALEN];
69 u8 tcpchk_valid; /* 0: invalid, 1: valid */
70 u8 ip_chkrpt; /* 0: incorrect, 1: correct */
71 u8 tcp_chkrpt; /* 0: incorrect, 1: correct */
72 u8 signal_qual;
73 s8 rx_mimo_signal_qual[2];
74 u8 mcs_rate;
75 u8 htc;
76 u8 signal_strength;
77};
78
79/*
80accesser of recv_priv: recv_entry(dispatch / passive level);
81recv_thread(passive) ; returnpkt(dispatch)
82; halt(passive) ;
83
84using enter_critical section to protect
85*/
86struct recv_priv {
87 spinlock_t lock;
88 struct semaphore recv_sema;
89 struct semaphore terminate_recvthread_sema;
90 struct __queue free_recv_queue;
91 struct __queue recv_pending_queue;
92 u8 *pallocated_frame_buf;
93 u8 *precv_frame_buf;
94 uint free_recvframe_cnt;
95 struct _adapter *adapter;
96 uint rx_bytes;
97 uint rx_pkts;
98 uint rx_drop;
99 uint rx_icv_err;
100 uint rx_largepacket_crcerr;
101 uint rx_smallpacket_crcerr;
102 uint rx_middlepacket_crcerr;
103 struct semaphore allrxreturnevt;
104 u8 rx_pending_cnt;
105 uint ff_hwaddr;
106 struct tasklet_struct recv_tasklet;
107 struct sk_buff_head free_recv_skb_queue;
108 struct sk_buff_head rx_skb_queue;
109 u8 *pallocated_recv_buf;
110 u8 *precv_buf; /* 4 alignment */
111 struct __queue free_recv_buf_queue;
112 u32 free_recv_buf_queue_cnt;
113 /* For the phy informatiom */
114 s8 rssi;
115 u8 signal;
116 u8 noise;
117 u8 fw_rssi;
118 struct smooth_rssi_data signal_qual_data;
119 struct smooth_rssi_data signal_strength_data;
120};
121
122struct sta_recv_priv {
123 spinlock_t lock;
124 sint option;
125 struct __queue defrag_q; /* keeping the fragment frame until defrag */
126 struct stainfo_rxcache rxcache;
127 uint sta_rx_bytes;
128 uint sta_rx_pkts;
129 uint sta_rx_fail;
130};
131
132#include "rtl8712_recv.h"
133
134/* get a free recv_frame from pfree_recv_queue */
135union recv_frame *r8712_alloc_recvframe(struct __queue *pfree_recv_queue);
136union recv_frame *r8712_dequeue_recvframe(struct __queue *queue);
137int r8712_enqueue_recvframe(union recv_frame *precvframe,
138 struct __queue *queue);
139int r8712_free_recvframe(union recv_frame *precvframe,
140 struct __queue *pfree_recv_queue);
141void r8712_free_recvframe_queue(struct __queue *pframequeue,
142 struct __queue *pfree_recv_queue);
143void r8712_init_recvframe(union recv_frame *precvframe,
144 struct recv_priv *precvpriv);
145int r8712_wlanhdr_to_ethhdr(union recv_frame *precvframe);
146int recv_func(struct _adapter *padapter, void *pcontext);
147
148static inline u8 *get_rxmem(union recv_frame *precvframe)
149{
150 /* always return rx_head... */
151 if (precvframe == NULL)
152 return NULL;
153 return precvframe->u.hdr.rx_head;
154}
155
156static inline u8 *get_rx_status(union recv_frame *precvframe)
157{
158 return get_rxmem(precvframe);
159}
160
161static inline u8 *get_recvframe_data(union recv_frame *precvframe)
162{
163 /* always return rx_data */
164 if (precvframe == NULL)
165 return NULL;
166 return precvframe->u.hdr.rx_data;
167}
168
169static inline u8 *recvframe_push(union recv_frame *precvframe, sint sz)
170{
171 /* append data before rx_data */
172
173 /* add data to the start of recv_frame
174 *
175 * This function extends the used data area of the recv_frame at the
176 * buffer start. rx_data must be still larger than rx_head, after
177 * pushing.
178 */
179
180 if (precvframe == NULL)
181 return NULL;
182 precvframe->u.hdr.rx_data -= sz ;
183 if (precvframe->u.hdr.rx_data < precvframe->u.hdr.rx_head) {
184 precvframe->u.hdr.rx_data += sz ;
185 return NULL;
186 }
187 precvframe->u.hdr.len += sz;
188 return precvframe->u.hdr.rx_data;
189}
190
191static inline u8 *recvframe_pull(union recv_frame *precvframe, sint sz)
192{
193 /* used for extract sz bytes from rx_data, update rx_data and return
194 * the updated rx_data to the caller */
195 if (precvframe == NULL)
196 return NULL;
197 precvframe->u.hdr.rx_data += sz;
198 if (precvframe->u.hdr.rx_data > precvframe->u.hdr.rx_tail) {
199 precvframe->u.hdr.rx_data -= sz;
200 return NULL;
201 }
202 precvframe->u.hdr.len -= sz;
203 return precvframe->u.hdr.rx_data;
204}
205
206static inline u8 *recvframe_put(union recv_frame *precvframe, sint sz)
207{
208 /* used for append sz bytes from ptr to rx_tail, update rx_tail and
209 * return the updated rx_tail to the caller
210 * after putting, rx_tail must be still larger than rx_end. */
211 unsigned char *prev_rx_tail;
212
213 if (precvframe == NULL)
214 return NULL;
215 prev_rx_tail = precvframe->u.hdr.rx_tail;
216 precvframe->u.hdr.rx_tail += sz;
217 if (precvframe->u.hdr.rx_tail > precvframe->u.hdr.rx_end) {
218 precvframe->u.hdr.rx_tail -= sz;
219 return NULL;
220 }
221 precvframe->u.hdr.len += sz;
222 return precvframe->u.hdr.rx_tail;
223}
224
225static inline u8 *recvframe_pull_tail(union recv_frame *precvframe, sint sz)
226{
227 /* rmv data from rx_tail (by yitsen)
228 * used for extract sz bytes from rx_end, update rx_end and return the
229 * updated rx_end to the caller
230 * after pulling, rx_end must be still larger than rx_data. */
231 if (precvframe == NULL)
232 return NULL;
233 precvframe->u.hdr.rx_tail -= sz;
234 if (precvframe->u.hdr.rx_tail < precvframe->u.hdr.rx_data) {
235 precvframe->u.hdr.rx_tail += sz;
236 return NULL;
237 }
238 precvframe->u.hdr.len -= sz;
239 return precvframe->u.hdr.rx_tail;
240}
241
242static inline _buffer *get_rxbuf_desc(union recv_frame *precvframe)
243{
244 _buffer *buf_desc;
245 if (precvframe == NULL)
246 return NULL;
247 return buf_desc;
248}
249
250static inline union recv_frame *rxmem_to_recvframe(u8 *rxmem)
251{
252 /* due to the design of 2048 bytes alignment of recv_frame, we can
253 * reference the union recv_frame from any given member of recv_frame.
254 * rxmem indicates the any member/address in recv_frame */
255 return (union recv_frame *)(((addr_t)rxmem >> RXFRAME_ALIGN) <<
256 RXFRAME_ALIGN);
257}
258
259static inline union recv_frame *pkt_to_recvframe(_pkt *pkt)
260{
261 u8 *buf_star;
262 union recv_frame *precv_frame;
263
264 precv_frame = rxmem_to_recvframe((unsigned char *)buf_star);
265 return precv_frame;
266}
267
268static inline u8 *pkt_to_recvmem(_pkt *pkt)
269{
270 /* return the rx_head */
271 union recv_frame *precv_frame = pkt_to_recvframe(pkt);
272
273 return precv_frame->u.hdr.rx_head;
274}
275
276static inline u8 *pkt_to_recvdata(_pkt *pkt)
277{
278 /* return the rx_data */
279 union recv_frame *precv_frame = pkt_to_recvframe(pkt);
280
281 return precv_frame->u.hdr.rx_data;
282}
283
284static inline sint get_recvframe_len(union recv_frame *precvframe)
285{
286 return precvframe->u.hdr.len;
287}
288
289struct sta_info;
290
291void _r8712_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv);
292sint r8712_recvframe_chkmic(struct _adapter *adapter,
293 union recv_frame *precvframe);
294union recv_frame *r8712_decryptor(struct _adapter *adapter,
295 union recv_frame *precv_frame);
296union recv_frame *r8712_recvframe_chk_defrag(struct _adapter *adapter,
297 union recv_frame *precv_frame);
298union recv_frame *r8712_recvframe_defrag(struct _adapter *adapter,
299 struct __queue *defrag_q);
300union recv_frame *r8712_recvframe_chk_defrag_new(struct _adapter *adapter,
301 union recv_frame *precv_frame);
302union recv_frame *r8712_recvframe_defrag_new(struct _adapter *adapter,
303 struct __queue *defrag_q,
304 union recv_frame *precv_frame);
305int r8712_recv_decache(union recv_frame *precv_frame, u8 bretry,
306 struct stainfo_rxcache *prxcache);
307int r8712_sta2sta_data_frame(struct _adapter *adapter,
308 union recv_frame *precv_frame,
309 struct sta_info **psta);
310int r8712_ap2sta_data_frame(struct _adapter *adapter,
311 union recv_frame *precv_frame,
312 struct sta_info **psta);
313int r8712_sta2ap_data_frame(struct _adapter *adapter,
314 union recv_frame *precv_frame,
315 struct sta_info **psta);
316int r8712_validate_recv_ctrl_frame(struct _adapter *adapter,
317 union recv_frame *precv_frame);
318int r8712_validate_recv_mgnt_frame(struct _adapter *adapter,
319 union recv_frame *precv_frame);
320int r8712_validate_recv_data_frame(struct _adapter *adapter,
321 union recv_frame *precv_frame);
322int r8712_validate_recv_frame(struct _adapter *adapter,
323 union recv_frame *precv_frame);
324union recv_frame *r8712_portctrl(struct _adapter *adapter,
325 union recv_frame *precv_frame);
326void r8712_mgt_dispatcher(struct _adapter *padapter, u8 *pframe, uint len);
327int r8712_amsdu_to_msdu(struct _adapter *padapter, union recv_frame *prframe);
328
329#endif
330
diff --git a/drivers/staging/rtl8712/rtl871x_rf.h b/drivers/staging/rtl8712/rtl871x_rf.h
new file mode 100644
index 00000000000..c709d8cadf0
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_rf.h
@@ -0,0 +1,43 @@
1#ifndef __RTL871X_RF_H_
2#define __RTL871X_RF_H_
3
4#include "rtl871x_cmd.h"
5#include "rtl871x_mp_phy_regdef.h"
6
7#define OFDM_PHY 1
8#define MIXED_PHY 2
9#define CCK_PHY 3
10#define NumRates (13)
11#define RTL8711_RF_MAX_SENS 6
12#define RTL8711_RF_DEF_SENS 4
13#define NUM_CHANNELS 15
14
15struct regulatory_class {
16 u32 starting_freq; /*MHz, */
17 u8 channel_set[NUM_CHANNELS];
18 u8 channel_cck_power[NUM_CHANNELS]; /*dbm*/
19 u8 channel_ofdm_power[NUM_CHANNELS];/*dbm*/
20 u8 txpower_limit; /*dbm*/
21 u8 channel_spacing; /*MHz*/
22 u8 modem;
23};
24
25enum _REG_PREAMBLE_MODE{
26 PREAMBLE_LONG = 1,
27 PREAMBLE_AUTO = 2,
28 PREAMBLE_SHORT = 3,
29};
30
31enum {
32 RTL8712_RFC_1T = 0x10,
33 RTL8712_RFC_2T = 0x20,
34 RTL8712_RFC_1R = 0x01,
35 RTL8712_RFC_2R = 0x02,
36 RTL8712_RFC_1T1R = 0x11,
37 RTL8712_RFC_1T2R = 0x12,
38 RTL8712_RFC_TURBO = 0x92,
39 RTL8712_RFC_2T2R = 0x22
40};
41
42#endif /*_RTL8711_RF_H_*/
43
diff --git a/drivers/staging/rtl8712/rtl871x_security.c b/drivers/staging/rtl8712/rtl871x_security.c
new file mode 100644
index 00000000000..65321bed4d5
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_security.c
@@ -0,0 +1,1389 @@
1/******************************************************************************
2 * rtl871x_security.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_SECURITY_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "wifi.h"
34#include "osdep_intf.h"
35
36/* =====WEP related===== */
37
38#define CRC32_POLY 0x04c11db7
39
40struct arc4context {
41 u32 x;
42 u32 y;
43 u8 state[256];
44};
45
46static void arcfour_init(struct arc4context *parc4ctx, u8 * key, u32 key_len)
47{
48 u32 t, u;
49 u32 keyindex;
50 u32 stateindex;
51 u8 *state;
52 u32 counter;
53
54 state = parc4ctx->state;
55 parc4ctx->x = 0;
56 parc4ctx->y = 0;
57 for (counter = 0; counter < 256; counter++)
58 state[counter] = (u8)counter;
59 keyindex = 0;
60 stateindex = 0;
61 for (counter = 0; counter < 256; counter++) {
62 t = state[counter];
63 stateindex = (stateindex + key[keyindex] + t) & 0xff;
64 u = state[stateindex];
65 state[stateindex] = (u8)t;
66 state[counter] = (u8)u;
67 if (++keyindex >= key_len)
68 keyindex = 0;
69 }
70}
71
72static u32 arcfour_byte(struct arc4context *parc4ctx)
73{
74 u32 x;
75 u32 y;
76 u32 sx, sy;
77 u8 *state;
78
79 state = parc4ctx->state;
80 x = (parc4ctx->x + 1) & 0xff;
81 sx = state[x];
82 y = (sx + parc4ctx->y) & 0xff;
83 sy = state[y];
84 parc4ctx->x = x;
85 parc4ctx->y = y;
86 state[y] = (u8)sx;
87 state[x] = (u8)sy;
88 return state[(sx + sy) & 0xff];
89}
90
91static void arcfour_encrypt(struct arc4context *parc4ctx,
92 u8 *dest, u8 *src, u32 len)
93{
94 u32 i;
95
96 for (i = 0; i < len; i++)
97 dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx);
98}
99
100static sint bcrc32initialized;
101static u32 crc32_table[256];
102
103static u8 crc32_reverseBit(u8 data)
104{
105 return ((u8)(data << 7) & 0x80) | ((data << 5) & 0x40) | ((data << 3)
106 & 0x20) | ((data << 1) & 0x10) | ((data >> 1) & 0x08) |
107 ((data >> 3) & 0x04) | ((data >> 5) & 0x02) | ((data >> 7) &
108 0x01);
109}
110
111static void crc32_init(void)
112{
113 if (bcrc32initialized == 1)
114 return;
115 else {
116 sint i, j;
117 u32 c;
118 u8 *p = (u8 *)&c, *p1;
119 u8 k;
120
121 c = 0x12340000;
122 for (i = 0; i < 256; ++i) {
123 k = crc32_reverseBit((u8)i);
124 for (c = ((u32)k) << 24, j = 8; j > 0; --j)
125 c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY :
126 (c << 1);
127 p1 = (u8 *)&crc32_table[i];
128 p1[0] = crc32_reverseBit(p[3]);
129 p1[1] = crc32_reverseBit(p[2]);
130 p1[2] = crc32_reverseBit(p[1]);
131 p1[3] = crc32_reverseBit(p[0]);
132 }
133 bcrc32initialized = 1;
134 }
135}
136
137static u32 getcrc32(u8 *buf, u32 len)
138{
139 u8 *p;
140 u32 crc;
141
142 if (bcrc32initialized == 0)
143 crc32_init();
144 crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
145 for (p = buf; len > 0; ++p, --len)
146 crc = crc32_table[(crc ^ *p) & 0xff] ^ (crc >> 8);
147 return ~crc; /* transmit complement, per CRC-32 spec */
148}
149
150/*
151 Need to consider the fragment situation
152*/
153void r8712_wep_encrypt(struct _adapter *padapter, u8 *pxmitframe)
154{ /* exclude ICV */
155 unsigned char crc[4];
156 struct arc4context mycontext;
157 u32 curfragnum, length, keylength;
158 u8 *pframe, *payload, *iv; /*,*wepkey*/
159 u8 wepkey[16];
160 struct pkt_attrib *pattrib = &((struct xmit_frame *)
161 pxmitframe)->attrib;
162 struct security_priv *psecuritypriv = &padapter->securitypriv;
163 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
164
165 if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
166 return;
167 pframe = ((struct xmit_frame *)pxmitframe)->buf_addr+TXDESC_OFFSET;
168 /*start to encrypt each fragment*/
169 if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) {
170 keylength = psecuritypriv->DefKeylen[psecuritypriv->
171 PrivacyKeyIndex];
172 for (curfragnum = 0; curfragnum < pattrib->nr_frags;
173 curfragnum++) {
174 iv = pframe+pattrib->hdrlen;
175 memcpy(&wepkey[0], iv, 3);
176 memcpy(&wepkey[3], &psecuritypriv->DefKey[
177 psecuritypriv->PrivacyKeyIndex].skey[0],
178 keylength);
179 payload = pframe+pattrib->iv_len+pattrib->hdrlen;
180 if ((curfragnum + 1) == pattrib->nr_frags) {
181 length = pattrib->last_txcmdsz-pattrib->
182 hdrlen-pattrib->iv_len -
183 pattrib->icv_len;
184 *((u32 *)crc) = cpu_to_le32(getcrc32(
185 payload, length));
186 arcfour_init(&mycontext, wepkey, 3 + keylength);
187 arcfour_encrypt(&mycontext, payload, payload,
188 length);
189 arcfour_encrypt(&mycontext, payload + length,
190 crc, 4);
191 } else {
192 length = pxmitpriv->frag_len-pattrib->hdrlen -
193 pattrib->iv_len-pattrib->icv_len;
194 *((u32 *)crc) = cpu_to_le32(getcrc32(
195 payload, length));
196 arcfour_init(&mycontext, wepkey, 3 + keylength);
197 arcfour_encrypt(&mycontext, payload, payload,
198 length);
199 arcfour_encrypt(&mycontext, payload+length,
200 crc, 4);
201 pframe += pxmitpriv->frag_len;
202 pframe = (u8 *)RND4((addr_t)(pframe));
203 }
204 }
205 }
206}
207
208void r8712_wep_decrypt(struct _adapter *padapter, u8 *precvframe)
209{
210 /* exclude ICV */
211 u8 crc[4];
212 struct arc4context mycontext;
213 u32 length, keylength;
214 u8 *pframe, *payload, *iv, wepkey[16];
215 u8 keyindex;
216 struct rx_pkt_attrib *prxattrib = &(((union recv_frame *)
217 precvframe)->u.hdr.attrib);
218 struct security_priv *psecuritypriv = &padapter->securitypriv;
219
220 pframe = (unsigned char *)((union recv_frame *)precvframe)->
221 u.hdr.rx_data;
222 /* start to decrypt recvframe */
223 if ((prxattrib->encrypt == _WEP40_) || (prxattrib->encrypt ==
224 _WEP104_)) {
225 iv = pframe + prxattrib->hdrlen;
226 keyindex = (iv[3] & 0x3);
227 keylength = psecuritypriv->DefKeylen[keyindex];
228 memcpy(&wepkey[0], iv, 3);
229 memcpy(&wepkey[3], &psecuritypriv->DefKey[
230 psecuritypriv->PrivacyKeyIndex].skey[0],
231 keylength);
232 length = ((union recv_frame *)precvframe)->
233 u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
234 payload = pframe+prxattrib->iv_len+prxattrib->hdrlen;
235 /* decrypt payload include icv */
236 arcfour_init(&mycontext, wepkey, 3 + keylength);
237 arcfour_encrypt(&mycontext, payload, payload, length);
238 /* calculate icv and compare the icv */
239 *((u32 *)crc) = cpu_to_le32(getcrc32(payload, length - 4));
240 }
241 return;
242}
243
244/* 3 =====TKIP related===== */
245
246static u32 secmicgetuint32(u8 *p)
247/* Convert from Byte[] to Us4Byte32 in a portable way */
248{
249 s32 i;
250 u32 res = 0;
251
252 for (i = 0; i < 4; i++)
253 res |= ((u32)(*p++)) << (8 * i);
254 return res;
255}
256
257static void secmicputuint32(u8 *p, u32 val)
258/* Convert from Us4Byte32 to Byte[] in a portable way */
259{
260 long i;
261 for (i = 0; i < 4; i++) {
262 *p++ = (u8) (val & 0xff);
263 val >>= 8;
264 }
265}
266
267static void secmicclear(struct mic_data *pmicdata)
268{
269/* Reset the state to the empty message. */
270 pmicdata->L = pmicdata->K0;
271 pmicdata->R = pmicdata->K1;
272 pmicdata->nBytesInM = 0;
273 pmicdata->M = 0;
274}
275
276void r8712_secmicsetkey(struct mic_data *pmicdata, u8 * key)
277{
278 /* Set the key */
279 pmicdata->K0 = secmicgetuint32(key);
280 pmicdata->K1 = secmicgetuint32(key + 4);
281 /* and reset the message */
282 secmicclear(pmicdata);
283}
284
285static void secmicappendbyte(struct mic_data *pmicdata, u8 b)
286{
287 /* Append the byte to our word-sized buffer */
288 pmicdata->M |= ((u32)b) << (8 * pmicdata->nBytesInM);
289 pmicdata->nBytesInM++;
290 /* Process the word if it is full. */
291 if (pmicdata->nBytesInM >= 4) {
292 pmicdata->L ^= pmicdata->M;
293 pmicdata->R ^= ROL32(pmicdata->L, 17);
294 pmicdata->L += pmicdata->R;
295 pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) |
296 ((pmicdata->L & 0x00ff00ff) << 8);
297 pmicdata->L += pmicdata->R;
298 pmicdata->R ^= ROL32(pmicdata->L, 3);
299 pmicdata->L += pmicdata->R;
300 pmicdata->R ^= ROR32(pmicdata->L, 2);
301 pmicdata->L += pmicdata->R;
302 /* Clear the buffer */
303 pmicdata->M = 0;
304 pmicdata->nBytesInM = 0;
305 }
306}
307
308void r8712_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes)
309{
310 /* This is simple */
311 while (nbytes > 0) {
312 secmicappendbyte(pmicdata, *src++);
313 nbytes--;
314 }
315}
316
317void r8712_secgetmic(struct mic_data *pmicdata, u8 *dst)
318{
319 /* Append the minimum padding */
320 secmicappendbyte(pmicdata, 0x5a);
321 secmicappendbyte(pmicdata, 0);
322 secmicappendbyte(pmicdata, 0);
323 secmicappendbyte(pmicdata, 0);
324 secmicappendbyte(pmicdata, 0);
325 /* and then zeroes until the length is a multiple of 4 */
326 while (pmicdata->nBytesInM != 0)
327 secmicappendbyte(pmicdata, 0);
328 /* The appendByte function has already computed the result. */
329 secmicputuint32(dst, pmicdata->L);
330 secmicputuint32(dst + 4, pmicdata->R);
331 /* Reset to the empty message. */
332 secmicclear(pmicdata);
333}
334
335void seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, u8 *mic_code,
336 u8 pri)
337{
338
339 struct mic_data micdata;
340 u8 priority[4] = {0x0, 0x0, 0x0, 0x0};
341
342 r8712_secmicsetkey(&micdata, key);
343 priority[0] = pri;
344 /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */
345 if (header[1] & 1) { /* ToDS==1 */
346 r8712_secmicappend(&micdata, &header[16], 6); /* DA */
347 if (header[1] & 2) /* From Ds==1 */
348 r8712_secmicappend(&micdata, &header[24], 6);
349 else
350 r8712_secmicappend(&micdata, &header[10], 6);
351 } else { /* ToDS==0 */
352 r8712_secmicappend(&micdata, &header[4], 6); /* DA */
353 if (header[1] & 2) /* From Ds==1 */
354 r8712_secmicappend(&micdata, &header[16], 6);
355 else
356 r8712_secmicappend(&micdata, &header[10], 6);
357 }
358 r8712_secmicappend(&micdata, &priority[0], 4);
359 r8712_secmicappend(&micdata, data, data_len);
360 r8712_secgetmic(&micdata, mic_code);
361}
362
363/* macros for extraction/creation of unsigned char/unsigned short values */
364#define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15))
365#define Lo8(v16) ((u8)((v16) & 0x00FF))
366#define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF))
367#define Lo16(v32) ((u16)((v32) & 0xFFFF))
368#define Hi16(v32) ((u16)(((v32) >> 16) & 0xFFFF))
369#define Mk16(hi, lo) ((lo) ^ (((u16)(hi)) << 8))
370
371/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */
372#define TK16(N) Mk16(tk[2 * (N) + 1], tk[2 * (N)])
373
374/* S-box lookup: 16 bits --> 16 bits */
375#define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)])
376
377/* fixed algorithm "parameters" */
378#define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */
379#define TA_SIZE 6 /* 48-bit transmitter address */
380#define TK_SIZE 16 /* 128-bit temporal key */
381#define P1K_SIZE 10 /* 80-bit Phase1 key */
382#define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */
383
384
385/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */
386static const unsigned short Sbox1[2][256] = {/* Sbox for hash (can be in ROM) */
387 {
388 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
389 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
390 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
391 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
392 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
393 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
394 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
395 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
396 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
397 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
398 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
399 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
400 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
401 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
402 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
403 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
404 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
405 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
406 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
407 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
408 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
409 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
410 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
411 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
412 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
413 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
414 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
415 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
416 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
417 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
418 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
419 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
420 },
421 { /* second half is unsigned char-reversed version of first! */
422 0xA5C6, 0x84F8, 0x99EE, 0x8DF6, 0x0DFF, 0xBDD6, 0xB1DE, 0x5491,
423 0x5060, 0x0302, 0xA9CE, 0x7D56, 0x19E7, 0x62B5, 0xE64D, 0x9AEC,
424 0x458F, 0x9D1F, 0x4089, 0x87FA, 0x15EF, 0xEBB2, 0xC98E, 0x0BFB,
425 0xEC41, 0x67B3, 0xFD5F, 0xEA45, 0xBF23, 0xF753, 0x96E4, 0x5B9B,
426 0xC275, 0x1CE1, 0xAE3D, 0x6A4C, 0x5A6C, 0x417E, 0x02F5, 0x4F83,
427 0x5C68, 0xF451, 0x34D1, 0x08F9, 0x93E2, 0x73AB, 0x5362, 0x3F2A,
428 0x0C08, 0x5295, 0x6546, 0x5E9D, 0x2830, 0xA137, 0x0F0A, 0xB52F,
429 0x090E, 0x3624, 0x9B1B, 0x3DDF, 0x26CD, 0x694E, 0xCD7F, 0x9FEA,
430 0x1B12, 0x9E1D, 0x7458, 0x2E34, 0x2D36, 0xB2DC, 0xEEB4, 0xFB5B,
431 0xF6A4, 0x4D76, 0x61B7, 0xCE7D, 0x7B52, 0x3EDD, 0x715E, 0x9713,
432 0xF5A6, 0x68B9, 0x0000, 0x2CC1, 0x6040, 0x1FE3, 0xC879, 0xEDB6,
433 0xBED4, 0x468D, 0xD967, 0x4B72, 0xDE94, 0xD498, 0xE8B0, 0x4A85,
434 0x6BBB, 0x2AC5, 0xE54F, 0x16ED, 0xC586, 0xD79A, 0x5566, 0x9411,
435 0xCF8A, 0x10E9, 0x0604, 0x81FE, 0xF0A0, 0x4478, 0xBA25, 0xE34B,
436 0xF3A2, 0xFE5D, 0xC080, 0x8A05, 0xAD3F, 0xBC21, 0x4870, 0x04F1,
437 0xDF63, 0xC177, 0x75AF, 0x6342, 0x3020, 0x1AE5, 0x0EFD, 0x6DBF,
438 0x4C81, 0x1418, 0x3526, 0x2FC3, 0xE1BE, 0xA235, 0xCC88, 0x392E,
439 0x5793, 0xF255, 0x82FC, 0x477A, 0xACC8, 0xE7BA, 0x2B32, 0x95E6,
440 0xA0C0, 0x9819, 0xD19E, 0x7FA3, 0x6644, 0x7E54, 0xAB3B, 0x830B,
441 0xCA8C, 0x29C7, 0xD36B, 0x3C28, 0x79A7, 0xE2BC, 0x1D16, 0x76AD,
442 0x3BDB, 0x5664, 0x4E74, 0x1E14, 0xDB92, 0x0A0C, 0x6C48, 0xE4B8,
443 0x5D9F, 0x6EBD, 0xEF43, 0xA6C4, 0xA839, 0xA431, 0x37D3, 0x8BF2,
444 0x32D5, 0x438B, 0x596E, 0xB7DA, 0x8C01, 0x64B1, 0xD29C, 0xE049,
445 0xB4D8, 0xFAAC, 0x07F3, 0x25CF, 0xAFCA, 0x8EF4, 0xE947, 0x1810,
446 0xD56F, 0x88F0, 0x6F4A, 0x725C, 0x2438, 0xF157, 0xC773, 0x5197,
447 0x23CB, 0x7CA1, 0x9CE8, 0x213E, 0xDD96, 0xDC61, 0x860D, 0x850F,
448 0x90E0, 0x427C, 0xC471, 0xAACC, 0xD890, 0x0506, 0x01F7, 0x121C,
449 0xA3C2, 0x5F6A, 0xF9AE, 0xD069, 0x9117, 0x5899, 0x273A, 0xB927,
450 0x38D9, 0x13EB, 0xB32B, 0x3322, 0xBBD2, 0x70A9, 0x8907, 0xA733,
451 0xB62D, 0x223C, 0x9215, 0x20C9, 0x4987, 0xFFAA, 0x7850, 0x7AA5,
452 0x8F03, 0xF859, 0x8009, 0x171A, 0xDA65, 0x31D7, 0xC684, 0xB8D0,
453 0xC382, 0xB029, 0x775A, 0x111E, 0xCB7B, 0xFCA8, 0xD66D, 0x3A2C,
454 }
455};
456
457/*
458**********************************************************************
459* Routine: Phase 1 -- generate P1K, given TA, TK, IV32
460*
461* Inputs:
462* tk[] = temporal key [128 bits]
463* ta[] = transmitter's MAC address [ 48 bits]
464* iv32 = upper 32 bits of IV [ 32 bits]
465* Output:
466* p1k[] = Phase 1 key [ 80 bits]
467*
468* Note:
469* This function only needs to be called every 2**16 packets,
470* although in theory it could be called every packet.
471*
472**********************************************************************
473*/
474static void phase1(u16 *p1k, const u8 *tk, const u8 *ta, u32 iv32)
475{
476 sint i;
477
478 /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */
479 p1k[0] = Lo16(iv32);
480 p1k[1] = Hi16(iv32);
481 p1k[2] = Mk16(ta[1], ta[0]); /* use TA[] as little-endian */
482 p1k[3] = Mk16(ta[3], ta[2]);
483 p1k[4] = Mk16(ta[5], ta[4]);
484 /* Now compute an unbalanced Feistel cipher with 80-bit block */
485 /* size on the 80-bit block P1K[], using the 128-bit key TK[] */
486 for (i = 0; i < PHASE1_LOOP_CNT; i++) { /* Each add is mod 2**16 */
487 p1k[0] += _S_(p1k[4] ^ TK16((i&1) + 0));
488 p1k[1] += _S_(p1k[0] ^ TK16((i&1) + 2));
489 p1k[2] += _S_(p1k[1] ^ TK16((i&1) + 4));
490 p1k[3] += _S_(p1k[2] ^ TK16((i&1) + 6));
491 p1k[4] += _S_(p1k[3] ^ TK16((i&1) + 0));
492 p1k[4] += (unsigned short)i; /* avoid "slide attacks" */
493 }
494}
495
496/*
497**********************************************************************
498* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16
499*
500* Inputs:
501* tk[] = Temporal key [128 bits]
502* p1k[] = Phase 1 output key [ 80 bits]
503* iv16 = low 16 bits of IV counter [ 16 bits]
504* Output:
505* rc4key[] = the key used to encrypt the packet [128 bits]
506*
507* Note:
508* The value {TA,IV32,IV16} for Phase1/Phase2 must be unique
509* across all packets using the same key TK value. Then, for a
510* given value of TK[], this TKIP48 construction guarantees that
511* the final RC4KEY value is unique across all packets.
512*
513* Suggested implementation optimization: if PPK[] is "overlaid"
514* appropriately on RC4KEY[], there is no need for the final
515* for loop below that copies the PPK[] result into RC4KEY[].
516*
517**********************************************************************
518*/
519static void phase2(u8 *rc4key, const u8 *tk, const u16 *p1k, u16 iv16)
520{
521 sint i;
522 u16 PPK[6]; /* temporary key for mixing */
523
524 /* Note: all adds in the PPK[] equations below are mod 2**16 */
525 for (i = 0; i < 5; i++)
526 PPK[i] = p1k[i]; /* first, copy P1K to PPK */
527 PPK[5] = p1k[4] + iv16; /* next, add in IV16 */
528 /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */
529 PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */
530 PPK[1] += _S_(PPK[0] ^ TK16(1));
531 PPK[2] += _S_(PPK[1] ^ TK16(2));
532 PPK[3] += _S_(PPK[2] ^ TK16(3));
533 PPK[4] += _S_(PPK[3] ^ TK16(4));
534 PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */
535 /* Final sweep: bijective, "linear". Rotates kill LSB correlations */
536 PPK[0] += RotR1(PPK[5] ^ TK16(6));
537 PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */
538 PPK[2] += RotR1(PPK[1]);
539 PPK[3] += RotR1(PPK[2]);
540 PPK[4] += RotR1(PPK[3]);
541 PPK[5] += RotR1(PPK[4]);
542 /* Note: At this point, for a given key TK[0..15], the 96-bit output */
543 /* value PPK[0..5] is guaranteed to be unique, as a function */
544 /* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */
545 /* is now a keyed permutation of {TA,IV32,IV16}. */
546 /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */
547 rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */
548 rc4key[1] = (Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */
549 rc4key[2] = Lo8(iv16);
550 rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1);
551 /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */
552 for (i = 0; i < 6; i++) {
553 rc4key[4 + 2 * i] = Lo8(PPK[i]);
554 rc4key[5 + 2 * i] = Hi8(PPK[i]);
555 }
556}
557
558/*The hlen isn't include the IV*/
559u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe)
560{ /* exclude ICV */
561 u16 pnl;
562 u32 pnh;
563 u8 rc4key[16];
564 u8 ttkey[16];
565 u8 crc[4];
566 struct arc4context mycontext;
567 u32 curfragnum, length, prwskeylen;
568
569 u8 *pframe, *payload, *iv, *prwskey;
570 union pn48 txpn;
571 struct sta_info *stainfo;
572 struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
573 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
574 u32 res = _SUCCESS;
575
576 if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
577 return _FAIL;
578
579 pframe = ((struct xmit_frame *)pxmitframe)->buf_addr+TXDESC_OFFSET;
580 /* 4 start to encrypt each fragment */
581 if (pattrib->encrypt == _TKIP_) {
582 if (pattrib->psta)
583 stainfo = pattrib->psta;
584 else
585 stainfo = r8712_get_stainfo(&padapter->stapriv,
586 &pattrib->ra[0]);
587 if (stainfo != NULL) {
588 prwskey = &stainfo->x_UncstKey.skey[0];
589 prwskeylen = 16;
590 for (curfragnum = 0; curfragnum < pattrib->nr_frags;
591 curfragnum++) {
592 iv = pframe + pattrib->hdrlen;
593 payload = pframe+pattrib->iv_len +
594 pattrib->hdrlen;
595 GET_TKIP_PN(iv, txpn);
596 pnl = (u16)(txpn.val);
597 pnh = (u32)(txpn.val >> 16);
598 phase1((u16 *)&ttkey[0], prwskey, &pattrib->
599 ta[0], pnh);
600 phase2(&rc4key[0], prwskey, (u16 *)&ttkey[0],
601 pnl);
602 if ((curfragnum + 1) == pattrib->nr_frags) {
603 /* 4 the last fragment */
604 length = pattrib->last_txcmdsz -
605 pattrib->hdrlen-pattrib->iv_len -
606 pattrib->icv_len;
607 *((u32 *)crc) = cpu_to_le32(
608 getcrc32(payload, length));
609 arcfour_init(&mycontext, rc4key, 16);
610 arcfour_encrypt(&mycontext, payload,
611 payload, length);
612 arcfour_encrypt(&mycontext, payload +
613 length, crc, 4);
614 } else {
615 length = pxmitpriv->frag_len-pattrib->
616 hdrlen-pattrib->
617 iv_len-pattrib->icv_len;
618 *((u32 *)crc) = cpu_to_le32(getcrc32(
619 payload, length));
620 arcfour_init(&mycontext, rc4key, 16);
621 arcfour_encrypt(&mycontext, payload,
622 payload, length);
623 arcfour_encrypt(&mycontext,
624 payload+length, crc, 4);
625 pframe += pxmitpriv->frag_len;
626 pframe = (u8 *)RND4((addr_t)(pframe));
627 }
628 }
629 } else
630 res = _FAIL;
631 }
632 return res;
633}
634
635/* The hlen doesn't include the IV */
636u32 r8712_tkip_decrypt(struct _adapter *padapter, u8 *precvframe)
637{ /* exclude ICV */
638 u16 pnl;
639 u32 pnh;
640 u8 rc4key[16];
641 u8 ttkey[16];
642 u8 crc[4];
643 struct arc4context mycontext;
644 u32 length, prwskeylen;
645 u8 *pframe, *payload, *iv, *prwskey, idx = 0;
646 union pn48 txpn;
647 struct sta_info *stainfo;
648 struct rx_pkt_attrib *prxattrib = &((union recv_frame *)
649 precvframe)->u.hdr.attrib;
650 struct security_priv *psecuritypriv = &padapter->securitypriv;
651
652 pframe = (unsigned char *)((union recv_frame *)
653 precvframe)->u.hdr.rx_data;
654 /* 4 start to decrypt recvframe */
655 if (prxattrib->encrypt == _TKIP_) {
656 stainfo = r8712_get_stainfo(&padapter->stapriv,
657 &prxattrib->ta[0]);
658 if (stainfo != NULL) {
659 iv = pframe+prxattrib->hdrlen;
660 payload = pframe+prxattrib->iv_len + prxattrib->hdrlen;
661 length = ((union recv_frame *)precvframe)->
662 u.hdr.len - prxattrib->hdrlen -
663 prxattrib->iv_len;
664 if (IS_MCAST(prxattrib->ra)) {
665 idx = iv[3];
666 prwskey = &psecuritypriv->XGrpKey[
667 ((idx >> 6) & 0x3) - 1].skey[0];
668 if (psecuritypriv->binstallGrpkey == false)
669 return _FAIL;
670 } else
671 prwskey = &stainfo->x_UncstKey.skey[0];
672 prwskeylen = 16;
673 GET_TKIP_PN(iv, txpn);
674 pnl = (u16)(txpn.val);
675 pnh = (u32)(txpn.val >> 16);
676 phase1((u16 *)&ttkey[0], prwskey, &prxattrib->ta[0],
677 pnh);
678 phase2(&rc4key[0], prwskey, (unsigned short *)
679 &ttkey[0], pnl);
680 /* 4 decrypt payload include icv */
681 arcfour_init(&mycontext, rc4key, 16);
682 arcfour_encrypt(&mycontext, payload, payload, length);
683 *((u32 *)crc) = cpu_to_le32(getcrc32(payload,
684 length - 4));
685 if (crc[3] != payload[length - 1] ||
686 crc[2] != payload[length - 2] ||
687 crc[1] != payload[length - 3] ||
688 crc[0] != payload[length - 4])
689 return _FAIL;
690 } else
691 return _FAIL;
692 }
693 return _SUCCESS;
694}
695
696/* 3 =====AES related===== */
697
698#define MAX_MSG_SIZE 2048
699/*****************************/
700/******** SBOX Table *********/
701/*****************************/
702
703static const u8 sbox_table[256] = {
704 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
705 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
706 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
707 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
708 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
709 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
710 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
711 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
712 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
713 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
714 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
715 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
716 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
717 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
718 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
719 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
720 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
721 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
722 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
723 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
724 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
725 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
726 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
727 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
728 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
729 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
730 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
731 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
732 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
733 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
734 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
735 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
736};
737
738/****************************************/
739/* aes128k128d() */
740/* Performs a 128 bit AES encrypt with */
741/* 128 bit data. */
742/****************************************/
743static void xor_128(u8 *a, u8 *b, u8 *out)
744{
745 sint i;
746
747 for (i = 0; i < 16; i++)
748 out[i] = a[i] ^ b[i];
749}
750
751static void xor_32(u8 *a, u8 *b, u8 *out)
752{
753 sint i;
754 for (i = 0; i < 4; i++)
755 out[i] = a[i] ^ b[i];
756}
757
758static u8 sbox(u8 a)
759{
760 return sbox_table[(sint)a];
761}
762
763static void next_key(u8 *key, sint round)
764{
765 u8 rcon;
766 u8 sbox_key[4];
767 u8 rcon_table[12] = {
768 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
769 0x1b, 0x36, 0x36, 0x36
770 };
771
772 sbox_key[0] = sbox(key[13]);
773 sbox_key[1] = sbox(key[14]);
774 sbox_key[2] = sbox(key[15]);
775 sbox_key[3] = sbox(key[12]);
776 rcon = rcon_table[round];
777 xor_32(&key[0], sbox_key, &key[0]);
778 key[0] = key[0] ^ rcon;
779 xor_32(&key[4], &key[0], &key[4]);
780 xor_32(&key[8], &key[4], &key[8]);
781 xor_32(&key[12], &key[8], &key[12]);
782}
783
784static void byte_sub(u8 *in, u8 *out)
785{
786 sint i;
787 for (i = 0; i < 16; i++)
788 out[i] = sbox(in[i]);
789}
790
791static void shift_row(u8 *in, u8 *out)
792{
793 out[0] = in[0];
794 out[1] = in[5];
795 out[2] = in[10];
796 out[3] = in[15];
797 out[4] = in[4];
798 out[5] = in[9];
799 out[6] = in[14];
800 out[7] = in[3];
801 out[8] = in[8];
802 out[9] = in[13];
803 out[10] = in[2];
804 out[11] = in[7];
805 out[12] = in[12];
806 out[13] = in[1];
807 out[14] = in[6];
808 out[15] = in[11];
809}
810
811static void mix_column(u8 *in, u8 *out)
812{
813 sint i;
814 u8 add1b[4];
815 u8 add1bf7[4];
816 u8 rotl[4];
817 u8 swap_halfs[4];
818 u8 andf7[4];
819 u8 rotr[4];
820 u8 temp[4];
821 u8 tempb[4];
822
823 for (i = 0 ; i < 4; i++) {
824 if ((in[i] & 0x80) == 0x80)
825 add1b[i] = 0x1b;
826 else
827 add1b[i] = 0x00;
828 }
829 swap_halfs[0] = in[2]; /* Swap halves */
830 swap_halfs[1] = in[3];
831 swap_halfs[2] = in[0];
832 swap_halfs[3] = in[1];
833 rotl[0] = in[3]; /* Rotate left 8 bits */
834 rotl[1] = in[0];
835 rotl[2] = in[1];
836 rotl[3] = in[2];
837 andf7[0] = in[0] & 0x7f;
838 andf7[1] = in[1] & 0x7f;
839 andf7[2] = in[2] & 0x7f;
840 andf7[3] = in[3] & 0x7f;
841 for (i = 3; i > 0; i--) { /* logical shift left 1 bit */
842 andf7[i] = andf7[i] << 1;
843 if ((andf7[i-1] & 0x80) == 0x80)
844 andf7[i] = (andf7[i] | 0x01);
845 }
846 andf7[0] = andf7[0] << 1;
847 andf7[0] = andf7[0] & 0xfe;
848 xor_32(add1b, andf7, add1bf7);
849 xor_32(in, add1bf7, rotr);
850 temp[0] = rotr[0]; /* Rotate right 8 bits */
851 rotr[0] = rotr[1];
852 rotr[1] = rotr[2];
853 rotr[2] = rotr[3];
854 rotr[3] = temp[0];
855 xor_32(add1bf7, rotr, temp);
856 xor_32(swap_halfs, rotl, tempb);
857 xor_32(temp, tempb, out);
858}
859
860static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext)
861{
862 sint round;
863 sint i;
864 u8 intermediatea[16];
865 u8 intermediateb[16];
866 u8 round_key[16];
867
868 for (i = 0; i < 16; i++)
869 round_key[i] = key[i];
870 for (round = 0; round < 11; round++) {
871 if (round == 0) {
872 xor_128(round_key, data, ciphertext);
873 next_key(round_key, round);
874 } else if (round == 10) {
875 byte_sub(ciphertext, intermediatea);
876 shift_row(intermediatea, intermediateb);
877 xor_128(intermediateb, round_key, ciphertext);
878 } else { /* 1 - 9 */
879 byte_sub(ciphertext, intermediatea);
880 shift_row(intermediatea, intermediateb);
881 mix_column(&intermediateb[0], &intermediatea[0]);
882 mix_column(&intermediateb[4], &intermediatea[4]);
883 mix_column(&intermediateb[8], &intermediatea[8]);
884 mix_column(&intermediateb[12], &intermediatea[12]);
885 xor_128(intermediatea, round_key, ciphertext);
886 next_key(round_key, round);
887 }
888 }
889}
890
891/************************************************/
892/* construct_mic_iv() */
893/* Builds the MIC IV from header fields and PN */
894/************************************************/
895static void construct_mic_iv(u8 *mic_iv, sint qc_exists, sint a4_exists,
896 u8 *mpdu, uint payload_length, u8 *pn_vector)
897{
898 sint i;
899
900 mic_iv[0] = 0x59;
901 if (qc_exists && a4_exists)
902 mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */
903 if (qc_exists && !a4_exists)
904 mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */
905 if (!qc_exists)
906 mic_iv[1] = 0x00;
907 for (i = 2; i < 8; i++)
908 mic_iv[i] = mpdu[i + 8];
909 for (i = 8; i < 14; i++)
910 mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */
911 mic_iv[14] = (unsigned char) (payload_length / 256);
912 mic_iv[15] = (unsigned char) (payload_length % 256);
913}
914
915/************************************************/
916/* construct_mic_header1() */
917/* Builds the first MIC header block from */
918/* header fields. */
919/************************************************/
920static void construct_mic_header1(u8 *mic_header1, sint header_length, u8 *mpdu)
921{
922 mic_header1[0] = (u8)((header_length - 2) / 256);
923 mic_header1[1] = (u8)((header_length - 2) % 256);
924 mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */
925 /* Mute retry, more data and pwr mgt bits */
926 mic_header1[3] = mpdu[1] & 0xc7;
927 mic_header1[4] = mpdu[4]; /* A1 */
928 mic_header1[5] = mpdu[5];
929 mic_header1[6] = mpdu[6];
930 mic_header1[7] = mpdu[7];
931 mic_header1[8] = mpdu[8];
932 mic_header1[9] = mpdu[9];
933 mic_header1[10] = mpdu[10]; /* A2 */
934 mic_header1[11] = mpdu[11];
935 mic_header1[12] = mpdu[12];
936 mic_header1[13] = mpdu[13];
937 mic_header1[14] = mpdu[14];
938 mic_header1[15] = mpdu[15];
939}
940
941/************************************************/
942/* construct_mic_header2() */
943/* Builds the last MIC header block from */
944/* header fields. */
945/************************************************/
946static void construct_mic_header2(u8 *mic_header2, u8 *mpdu, sint a4_exists,
947 sint qc_exists)
948{
949 sint i;
950
951 for (i = 0; i < 16; i++)
952 mic_header2[i] = 0x00;
953 mic_header2[0] = mpdu[16]; /* A3 */
954 mic_header2[1] = mpdu[17];
955 mic_header2[2] = mpdu[18];
956 mic_header2[3] = mpdu[19];
957 mic_header2[4] = mpdu[20];
958 mic_header2[5] = mpdu[21];
959 mic_header2[6] = 0x00;
960 mic_header2[7] = 0x00; /* mpdu[23]; */
961 if (!qc_exists && a4_exists)
962 for (i = 0; i < 6; i++)
963 mic_header2[8 + i] = mpdu[24 + i]; /* A4 */
964 if (qc_exists && !a4_exists) {
965 mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */
966 mic_header2[9] = mpdu[25] & 0x00;
967 }
968 if (qc_exists && a4_exists) {
969 for (i = 0; i < 6; i++)
970 mic_header2[8 + i] = mpdu[24 + i]; /* A4 */
971 mic_header2[14] = mpdu[30] & 0x0f;
972 mic_header2[15] = mpdu[31] & 0x00;
973 }
974}
975
976/************************************************/
977/* construct_mic_header2() */
978/* Builds the last MIC header block from */
979/* header fields. */
980/************************************************/
981static void construct_ctr_preload(u8 *ctr_preload, sint a4_exists, sint qc_exists,
982 u8 *mpdu, u8 *pn_vector, sint c)
983{
984 sint i;
985
986 for (i = 0; i < 16; i++)
987 ctr_preload[i] = 0x00;
988 i = 0;
989 ctr_preload[0] = 0x01; /* flag */
990 if (qc_exists && a4_exists)
991 ctr_preload[1] = mpdu[30] & 0x0f;
992 if (qc_exists && !a4_exists)
993 ctr_preload[1] = mpdu[24] & 0x0f;
994 for (i = 2; i < 8; i++)
995 ctr_preload[i] = mpdu[i + 8];
996 for (i = 8; i < 14; i++)
997 ctr_preload[i] = pn_vector[13 - i];
998 ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */
999 ctr_preload[15] = (unsigned char) (c % 256);
1000}
1001
1002/************************************/
1003/* bitwise_xor() */
1004/* A 128 bit, bitwise exclusive or */
1005/************************************/
1006static void bitwise_xor(u8 *ina, u8 *inb, u8 *out)
1007{
1008 sint i;
1009
1010 for (i = 0; i < 16; i++)
1011 out[i] = ina[i] ^ inb[i];
1012}
1013
1014static sint aes_cipher(u8 *key, uint hdrlen,
1015 u8 *pframe, uint plen)
1016{
1017 uint qc_exists, a4_exists, i, j, payload_remainder;
1018 uint num_blocks, payload_index;
1019
1020 u8 pn_vector[6];
1021 u8 mic_iv[16];
1022 u8 mic_header1[16];
1023 u8 mic_header2[16];
1024 u8 ctr_preload[16];
1025
1026 /* Intermediate Buffers */
1027 u8 chain_buffer[16];
1028 u8 aes_out[16];
1029 u8 padded_buffer[16];
1030 u8 mic[8];
1031 uint frtype = GetFrameType(pframe);
1032 uint frsubtype = GetFrameSubType(pframe);
1033
1034 frsubtype = frsubtype >> 4;
1035 memset((void *)mic_iv, 0, 16);
1036 memset((void *)mic_header1, 0, 16);
1037 memset((void *)mic_header2, 0, 16);
1038 memset((void *)ctr_preload, 0, 16);
1039 memset((void *)chain_buffer, 0, 16);
1040 memset((void *)aes_out, 0, 16);
1041 memset((void *)padded_buffer, 0, 16);
1042
1043 if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN))
1044 a4_exists = 0;
1045 else
1046 a4_exists = 1;
1047
1048 if ((frtype == WIFI_DATA_CFACK) ||
1049 (frtype == WIFI_DATA_CFPOLL) ||
1050 (frtype == WIFI_DATA_CFACKPOLL)) {
1051 qc_exists = 1;
1052 if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1053 hdrlen += 2;
1054 } else if ((frsubtype == 0x08) ||
1055 (frsubtype == 0x09) ||
1056 (frsubtype == 0x0a) ||
1057 (frsubtype == 0x0b)) {
1058 if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1059 hdrlen += 2;
1060 qc_exists = 1;
1061 } else
1062 qc_exists = 0;
1063 pn_vector[0] = pframe[hdrlen];
1064 pn_vector[1] = pframe[hdrlen+1];
1065 pn_vector[2] = pframe[hdrlen+4];
1066 pn_vector[3] = pframe[hdrlen+5];
1067 pn_vector[4] = pframe[hdrlen+6];
1068 pn_vector[5] = pframe[hdrlen+7];
1069 construct_mic_iv(mic_iv, qc_exists, a4_exists, pframe, plen, pn_vector);
1070 construct_mic_header1(mic_header1, hdrlen, pframe);
1071 construct_mic_header2(mic_header2, pframe, a4_exists, qc_exists);
1072 payload_remainder = plen % 16;
1073 num_blocks = plen / 16;
1074 /* Find start of payload */
1075 payload_index = (hdrlen + 8);
1076 /* Calculate MIC */
1077 aes128k128d(key, mic_iv, aes_out);
1078 bitwise_xor(aes_out, mic_header1, chain_buffer);
1079 aes128k128d(key, chain_buffer, aes_out);
1080 bitwise_xor(aes_out, mic_header2, chain_buffer);
1081 aes128k128d(key, chain_buffer, aes_out);
1082 for (i = 0; i < num_blocks; i++) {
1083 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1084 payload_index += 16;
1085 aes128k128d(key, chain_buffer, aes_out);
1086 }
1087 /* Add on the final payload block if it needs padding */
1088 if (payload_remainder > 0) {
1089 for (j = 0; j < 16; j++)
1090 padded_buffer[j] = 0x00;
1091 for (j = 0; j < payload_remainder; j++)
1092 padded_buffer[j] = pframe[payload_index++];
1093 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1094 aes128k128d(key, chain_buffer, aes_out);
1095 }
1096 for (j = 0; j < 8; j++)
1097 mic[j] = aes_out[j];
1098 /* Insert MIC into payload */
1099 for (j = 0; j < 8; j++)
1100 pframe[payload_index+j] = mic[j];
1101 payload_index = hdrlen + 8;
1102 for (i = 0; i < num_blocks; i++) {
1103 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1104 pframe, pn_vector, i + 1);
1105 aes128k128d(key, ctr_preload, aes_out);
1106 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1107 for (j = 0; j < 16; j++)
1108 pframe[payload_index++] = chain_buffer[j];
1109 }
1110 if (payload_remainder > 0) { /* If short final block, then pad it,*/
1111 /* encrypt and copy unpadded part back */
1112 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1113 pframe, pn_vector, num_blocks+1);
1114 for (j = 0; j < 16; j++)
1115 padded_buffer[j] = 0x00;
1116 for (j = 0; j < payload_remainder; j++)
1117 padded_buffer[j] = pframe[payload_index+j];
1118 aes128k128d(key, ctr_preload, aes_out);
1119 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1120 for (j = 0; j < payload_remainder; j++)
1121 pframe[payload_index++] = chain_buffer[j];
1122 }
1123 /* Encrypt the MIC */
1124 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1125 pframe, pn_vector, 0);
1126 for (j = 0; j < 16; j++)
1127 padded_buffer[j] = 0x00;
1128 for (j = 0; j < 8; j++)
1129 padded_buffer[j] = pframe[j+hdrlen+8+plen];
1130 aes128k128d(key, ctr_preload, aes_out);
1131 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1132 for (j = 0; j < 8; j++)
1133 pframe[payload_index++] = chain_buffer[j];
1134 return _SUCCESS;
1135}
1136
1137u32 r8712_aes_encrypt(struct _adapter *padapter, u8 *pxmitframe)
1138{ /* exclude ICV */
1139 /* Intermediate Buffers */
1140 sint curfragnum, length;
1141 u32 prwskeylen;
1142 u8 *pframe, *prwskey;
1143 struct sta_info *stainfo;
1144 struct pkt_attrib *pattrib = &((struct xmit_frame *)
1145 pxmitframe)->attrib;
1146 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1147 u32 res = _SUCCESS;
1148
1149 if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
1150 return _FAIL;
1151 pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;
1152 /* 4 start to encrypt each fragment */
1153 if ((pattrib->encrypt == _AES_)) {
1154 if (pattrib->psta)
1155 stainfo = pattrib->psta;
1156 else
1157 stainfo = r8712_get_stainfo(&padapter->stapriv,
1158 &pattrib->ra[0]);
1159 if (stainfo != NULL) {
1160 prwskey = &stainfo->x_UncstKey.skey[0];
1161 prwskeylen = 16;
1162 for (curfragnum = 0; curfragnum < pattrib->nr_frags;
1163 curfragnum++) {
1164 if ((curfragnum + 1) == pattrib->nr_frags) {\
1165 length = pattrib->last_txcmdsz -
1166 pattrib->hdrlen -
1167 pattrib->iv_len -
1168 pattrib->icv_len;
1169 aes_cipher(prwskey, pattrib->
1170 hdrlen, pframe, length);
1171 } else {
1172 length = pxmitpriv->frag_len -
1173 pattrib->hdrlen -
1174 pattrib->iv_len -
1175 pattrib->icv_len ;
1176 aes_cipher(prwskey, pattrib->
1177 hdrlen, pframe, length);
1178 pframe += pxmitpriv->frag_len;
1179 pframe = (u8 *)RND4((addr_t)(pframe));
1180 }
1181 }
1182 } else
1183 res = _FAIL;
1184 }
1185 return res;
1186}
1187
1188static sint aes_decipher(u8 *key, uint hdrlen,
1189 u8 *pframe, uint plen)
1190{
1191 static u8 message[MAX_MSG_SIZE];
1192 uint qc_exists, a4_exists, i, j, payload_remainder;
1193 uint num_blocks, payload_index;
1194 u8 pn_vector[6];
1195 u8 mic_iv[16];
1196 u8 mic_header1[16];
1197 u8 mic_header2[16];
1198 u8 ctr_preload[16];
1199 /* Intermediate Buffers */
1200 u8 chain_buffer[16];
1201 u8 aes_out[16];
1202 u8 padded_buffer[16];
1203 u8 mic[8];
1204 uint frtype = GetFrameType(pframe);
1205 uint frsubtype = GetFrameSubType(pframe);
1206
1207 frsubtype = frsubtype >> 4;
1208 memset((void *)mic_iv, 0, 16);
1209 memset((void *)mic_header1, 0, 16);
1210 memset((void *)mic_header2, 0, 16);
1211 memset((void *)ctr_preload, 0, 16);
1212 memset((void *)chain_buffer, 0, 16);
1213 memset((void *)aes_out, 0, 16);
1214 memset((void *)padded_buffer, 0, 16);
1215 /* start to decrypt the payload */
1216 /*(plen including llc, payload and mic) */
1217 num_blocks = (plen - 8) / 16;
1218 payload_remainder = (plen-8) % 16;
1219 pn_vector[0] = pframe[hdrlen];
1220 pn_vector[1] = pframe[hdrlen+1];
1221 pn_vector[2] = pframe[hdrlen+4];
1222 pn_vector[3] = pframe[hdrlen+5];
1223 pn_vector[4] = pframe[hdrlen+6];
1224 pn_vector[5] = pframe[hdrlen+7];
1225 if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN))
1226 a4_exists = 0;
1227 else
1228 a4_exists = 1;
1229 if ((frtype == WIFI_DATA_CFACK) ||
1230 (frtype == WIFI_DATA_CFPOLL) ||
1231 (frtype == WIFI_DATA_CFACKPOLL)) {
1232 qc_exists = 1;
1233 if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1234 hdrlen += 2;
1235 } else if ((frsubtype == 0x08) ||
1236 (frsubtype == 0x09) ||
1237 (frsubtype == 0x0a) ||
1238 (frsubtype == 0x0b)) {
1239 if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1240 hdrlen += 2;
1241 qc_exists = 1;
1242 } else
1243 qc_exists = 0;
1244 /* now, decrypt pframe with hdrlen offset and plen long */
1245 payload_index = hdrlen + 8; /* 8 is for extiv */
1246 for (i = 0; i < num_blocks; i++) {
1247 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1248 pframe, pn_vector, i + 1);
1249 aes128k128d(key, ctr_preload, aes_out);
1250 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1251 for (j = 0; j < 16; j++)
1252 pframe[payload_index++] = chain_buffer[j];
1253 }
1254 if (payload_remainder > 0) { /* If short final block, pad it,*/
1255 /* encrypt it and copy the unpadded part back */
1256 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1257 pframe, pn_vector, num_blocks+1);
1258 for (j = 0; j < 16; j++)
1259 padded_buffer[j] = 0x00;
1260 for (j = 0; j < payload_remainder; j++)
1261 padded_buffer[j] = pframe[payload_index + j];
1262 aes128k128d(key, ctr_preload, aes_out);
1263 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1264 for (j = 0; j < payload_remainder; j++)
1265 pframe[payload_index++] = chain_buffer[j];
1266 }
1267 /* start to calculate the mic */
1268 memcpy((void *)message, pframe, (hdrlen + plen + 8));
1269 pn_vector[0] = pframe[hdrlen];
1270 pn_vector[1] = pframe[hdrlen+1];
1271 pn_vector[2] = pframe[hdrlen+4];
1272 pn_vector[3] = pframe[hdrlen+5];
1273 pn_vector[4] = pframe[hdrlen+6];
1274 pn_vector[5] = pframe[hdrlen+7];
1275 construct_mic_iv(mic_iv, qc_exists, a4_exists, message, plen-8,
1276 pn_vector);
1277 construct_mic_header1(mic_header1, hdrlen, message);
1278 construct_mic_header2(mic_header2, message, a4_exists, qc_exists);
1279 payload_remainder = (plen - 8) % 16;
1280 num_blocks = (plen - 8) / 16;
1281 /* Find start of payload */
1282 payload_index = (hdrlen + 8);
1283 /* Calculate MIC */
1284 aes128k128d(key, mic_iv, aes_out);
1285 bitwise_xor(aes_out, mic_header1, chain_buffer);
1286 aes128k128d(key, chain_buffer, aes_out);
1287 bitwise_xor(aes_out, mic_header2, chain_buffer);
1288 aes128k128d(key, chain_buffer, aes_out);
1289 for (i = 0; i < num_blocks; i++) {
1290 bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1291 payload_index += 16;
1292 aes128k128d(key, chain_buffer, aes_out);
1293 }
1294 /* Add on the final payload block if it needs padding */
1295 if (payload_remainder > 0) {
1296 for (j = 0; j < 16; j++)
1297 padded_buffer[j] = 0x00;
1298 for (j = 0; j < payload_remainder; j++)
1299 padded_buffer[j] = message[payload_index++];
1300 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1301 aes128k128d(key, chain_buffer, aes_out);
1302 }
1303 for (j = 0 ; j < 8; j++)
1304 mic[j] = aes_out[j];
1305 /* Insert MIC into payload */
1306 for (j = 0; j < 8; j++)
1307 message[payload_index+j] = mic[j];
1308 payload_index = hdrlen + 8;
1309 for (i = 0; i < num_blocks; i++) {
1310 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1311 message, pn_vector, i + 1);
1312 aes128k128d(key, ctr_preload, aes_out);
1313 bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1314 for (j = 0; j < 16; j++)
1315 message[payload_index++] = chain_buffer[j];
1316 }
1317 if (payload_remainder > 0) { /* If short final block, pad it,*/
1318 /* encrypt and copy unpadded part back */
1319 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1320 message, pn_vector, num_blocks+1);
1321 for (j = 0; j < 16; j++)
1322 padded_buffer[j] = 0x00;
1323 for (j = 0; j < payload_remainder; j++)
1324 padded_buffer[j] = message[payload_index + j];
1325 aes128k128d(key, ctr_preload, aes_out);
1326 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1327 for (j = 0; j < payload_remainder; j++)
1328 message[payload_index++] = chain_buffer[j];
1329 }
1330 /* Encrypt the MIC */
1331 construct_ctr_preload(ctr_preload, a4_exists, qc_exists, message,
1332 pn_vector, 0);
1333 for (j = 0; j < 16; j++)
1334 padded_buffer[j] = 0x00;
1335 for (j = 0; j < 8; j++)
1336 padded_buffer[j] = message[j + hdrlen + plen];
1337 aes128k128d(key, ctr_preload, aes_out);
1338 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1339 for (j = 0; j < 8; j++)
1340 message[payload_index++] = chain_buffer[j];
1341 /* compare the mic */
1342 return _SUCCESS;
1343}
1344
1345u32 r8712_aes_decrypt(struct _adapter *padapter, u8 *precvframe)
1346{ /* exclude ICV */
1347 /* Intermediate Buffers */
1348 sint length;
1349 u32 prwskeylen;
1350 u8 *pframe, *prwskey, *iv, idx;
1351 struct sta_info *stainfo;
1352 struct rx_pkt_attrib *prxattrib = &((union recv_frame *)
1353 precvframe)->u.hdr.attrib;
1354 struct security_priv *psecuritypriv = &padapter->securitypriv;
1355
1356 pframe = (unsigned char *)((union recv_frame*)precvframe)->
1357 u.hdr.rx_data;
1358 /* 4 start to encrypt each fragment */
1359 if ((prxattrib->encrypt == _AES_)) {
1360 stainfo = r8712_get_stainfo(&padapter->stapriv,
1361 &prxattrib->ta[0]);
1362 if (stainfo != NULL) {
1363 if (IS_MCAST(prxattrib->ra)) {
1364 iv = pframe+prxattrib->hdrlen;
1365 idx = iv[3];
1366 prwskey = &psecuritypriv->XGrpKey[
1367 ((idx >> 6) & 0x3) - 1].skey[0];
1368 if (psecuritypriv->binstallGrpkey == false)
1369 return _FAIL;
1370
1371 } else
1372 prwskey = &stainfo->x_UncstKey.skey[0];
1373 prwskeylen = 16;
1374 length = ((union recv_frame *)precvframe)->
1375 u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
1376 aes_decipher(prwskey, prxattrib->hdrlen, pframe,
1377 length);
1378 } else
1379 return _FAIL;
1380 }
1381 return _SUCCESS;
1382}
1383
1384void r8712_use_tkipkey_handler(void *FunctionContext)
1385{
1386 struct _adapter *padapter = (struct _adapter *)FunctionContext;
1387
1388 padapter->securitypriv.busetkipkey = true;
1389}
diff --git a/drivers/staging/rtl8712/rtl871x_security.h b/drivers/staging/rtl8712/rtl871x_security.h
new file mode 100644
index 00000000000..782b70a352f
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_security.h
@@ -0,0 +1,196 @@
1#ifndef __RTL871X_SECURITY_H_
2#define __RTL871X_SECURITY_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7#define _NO_PRIVACY_ 0x0
8#define _WEP40_ 0x1
9#define _TKIP_ 0x2
10#define _TKIP_WTMIC_ 0x3
11#define _AES_ 0x4
12#define _WEP104_ 0x5
13
14#define _WPA_IE_ID_ 0xdd
15#define _WPA2_IE_ID_ 0x30
16
17#ifndef Ndis802_11AuthModeWPA2
18#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
19#endif
20
21#ifndef Ndis802_11AuthModeWPA2PSK
22#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
23#endif
24union pn48 {
25 u64 val;
26#if defined(__BIG_ENDIAN)
27struct {
28 u8 TSC7;
29 u8 TSC6;
30 u8 TSC5;
31 u8 TSC4;
32 u8 TSC3;
33 u8 TSC2;
34 u8 TSC1;
35 u8 TSC0;
36} _byte_;
37#else
38struct {
39 u8 TSC0;
40 u8 TSC1;
41 u8 TSC2;
42 u8 TSC3;
43 u8 TSC4;
44 u8 TSC5;
45 u8 TSC6;
46 u8 TSC7;
47} _byte_;
48#endif
49};
50
51union Keytype {
52 u8 skey[16];
53 u32 lkey[4];
54};
55
56struct RT_PMKID_LIST {
57 u8 bUsed;
58 u8 Bssid[6];
59 u8 PMKID[16];
60 u8 SsidBuf[33];
61 u8 *ssid_octet;
62 u16 ssid_length;
63};
64
65struct security_priv {
66 u32 AuthAlgrthm; /* 802.11 auth, could be open, shared,
67 * 8021x and authswitch */
68 u32 PrivacyAlgrthm; /* This specify the privacy for shared
69 * auth. algorithm. */
70 u32 PrivacyKeyIndex; /* this is only valid for legendary
71 * wep, 0~3 for key id. */
72 union Keytype DefKey[4]; /* this is only valid for def. key */
73 u32 DefKeylen[4];
74 u32 XGrpPrivacy; /* This specify the privacy algthm.
75 * used for Grp key */
76 u32 XGrpKeyid; /* key id used for Grp Key */
77 union Keytype XGrpKey[2]; /* 802.1x Group Key, for
78 * inx0 and inx1 */
79 union Keytype XGrptxmickey[2];
80 union Keytype XGrprxmickey[2];
81 union pn48 Grptxpn; /* PN48 used for Grp Key xmit. */
82 union pn48 Grprxpn; /* PN48 used for Grp Key recv. */
83 u8 wps_hw_pbc_pressed;/*for hw pbc pressed*/
84 u8 wps_phase;/*for wps*/
85 u8 wps_ie[MAX_WPA_IE_LEN<<2];
86 int wps_ie_len;
87 u8 binstallGrpkey;
88 u8 busetkipkey;
89 struct timer_list tkip_timer;
90 u8 bcheck_grpkey;
91 u8 bgrpkey_handshake;
92 s32 sw_encrypt; /* from registry_priv */
93 s32 sw_decrypt; /* from registry_priv */
94 s32 hw_decrypted; /* if the rx packets is hw_decrypted==false,
95 * it means the hw has not been ready. */
96 u32 ndisauthtype; /* keeps the auth_type & enc_status from upper
97 * layer ioctl(wpa_supplicant or wzc) */
98 u32 ndisencryptstatus;
99 struct wlan_bssid_ex sec_bss; /* for joinbss (h2c buffer) usage */
100 struct NDIS_802_11_WEP ndiswep;
101 u8 assoc_info[600];
102 u8 szofcapability[256]; /* for wpa2 usage */
103 u8 oidassociation[512]; /* for wpa/wpa2 usage */
104 u8 authenticator_ie[256]; /* store ap security information element */
105 u8 supplicant_ie[256]; /* store sta security information element */
106 /* for tkip countermeasure */
107 u32 last_mic_err_time;
108 u8 btkip_countermeasure;
109 u8 btkip_wait_report;
110 u32 btkip_countermeasure_time;
111 /*-------------------------------------------------------------------
112 * For WPA2 Pre-Authentication.
113 *------------------------------------------------------------------ */
114 struct RT_PMKID_LIST PMKIDList[NUM_PMKID_CACHE];
115 u8 PMKIDIndex;
116};
117
118#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst) \
119do { \
120 switch (psecuritypriv->AuthAlgrthm) { \
121 case 0: \
122 case 1: \
123 case 3: \
124 encry_algo = (u8)psecuritypriv->PrivacyAlgrthm; \
125 break; \
126 case 2: \
127 if (bmcst) \
128 encry_algo = (u8)psecuritypriv->XGrpPrivacy; \
129 else \
130 encry_algo = (u8)psta->XPrivacy; \
131 break; \
132 } \
133} while (0)
134#define SET_ICE_IV_LEN(iv_len, icv_len, encrypt)\
135do {\
136 switch (encrypt) { \
137 case _WEP40_: \
138 case _WEP104_: \
139 iv_len = 4; \
140 icv_len = 4; \
141 break; \
142 case _TKIP_: \
143 iv_len = 8; \
144 icv_len = 4; \
145 break; \
146 case _AES_: \
147 iv_len = 8; \
148 icv_len = 8; \
149 break; \
150 default: \
151 iv_len = 0; \
152 icv_len = 0; \
153 break; \
154 } \
155} while (0)
156#define GET_TKIP_PN(iv, txpn) \
157do {\
158 txpn._byte_.TSC0 = iv[2];\
159 txpn._byte_.TSC1 = iv[0];\
160 txpn._byte_.TSC2 = iv[4];\
161 txpn._byte_.TSC3 = iv[5];\
162 txpn._byte_.TSC4 = iv[6];\
163 txpn._byte_.TSC5 = iv[7];\
164} while (0)
165
166#define ROL32(A, n) (((A) << (n)) | (((A)>>(32-(n))) & ((1UL << (n)) - 1)))
167#define ROR32(A, n) ROL32((A), 32 - (n))
168
169struct mic_data {
170 u32 K0, K1; /* Key */
171 u32 L, R; /* Current state */
172 u32 M; /* Message accumulator (single word) */
173 u32 nBytesInM; /* # bytes in M */
174};
175
176void seccalctkipmic(
177 u8 *key,
178 u8 *header,
179 u8 *data,
180 u32 data_len,
181 u8 *Miccode,
182 u8 priority);
183
184void r8712_secmicsetkey(struct mic_data *pmicdata, u8 * key);
185void r8712_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes);
186void r8712_secgetmic(struct mic_data *pmicdata, u8 * dst);
187u32 r8712_aes_encrypt(struct _adapter *padapter, u8 *pxmitframe);
188u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe);
189void r8712_wep_encrypt(struct _adapter *padapter, u8 *pxmitframe);
190u32 r8712_aes_decrypt(struct _adapter *padapter, u8 *precvframe);
191u32 r8712_tkip_decrypt(struct _adapter *padapter, u8 *precvframe);
192void r8712_wep_decrypt(struct _adapter *padapter, u8 *precvframe);
193void r8712_use_tkipkey_handler(void *FunctionContext);
194
195#endif /*__RTL871X_SECURITY_H_ */
196
diff --git a/drivers/staging/rtl8712/rtl871x_sta_mgt.c b/drivers/staging/rtl8712/rtl871x_sta_mgt.c
new file mode 100644
index 00000000000..64f56961883
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_sta_mgt.c
@@ -0,0 +1,299 @@
1/******************************************************************************
2 * rtl871x_sta_mgt.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_STA_MGT_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "recv_osdep.h"
34#include "xmit_osdep.h"
35#include "sta_info.h"
36
37static void _init_stainfo(struct sta_info *psta)
38{
39 memset((u8 *)psta, 0, sizeof(struct sta_info));
40 spin_lock_init(&psta->lock);
41 _init_listhead(&psta->list);
42 _init_listhead(&psta->hash_list);
43 _r8712_init_sta_xmit_priv(&psta->sta_xmitpriv);
44 _r8712_init_sta_recv_priv(&psta->sta_recvpriv);
45#ifdef CONFIG_R8712_AP
46 _init_listhead(&psta->auth_list);
47#endif
48}
49
50u32 _r8712_init_sta_priv(struct sta_priv *pstapriv)
51{
52 struct sta_info *psta;
53 s32 i;
54
55 pstapriv->pallocated_stainfo_buf = _malloc(sizeof(struct sta_info) *
56 NUM_STA + 4);
57 if (pstapriv->pallocated_stainfo_buf == NULL)
58 return _FAIL;
59 pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 -
60 ((addr_t)(pstapriv->pallocated_stainfo_buf) & 3);
61 _init_queue(&pstapriv->free_sta_queue);
62 spin_lock_init(&pstapriv->sta_hash_lock);
63 pstapriv->asoc_sta_count = 0;
64 _init_queue(&pstapriv->sleep_q);
65 _init_queue(&pstapriv->wakeup_q);
66 psta = (struct sta_info *)(pstapriv->pstainfo_buf);
67 for (i = 0; i < NUM_STA; i++) {
68 _init_stainfo(psta);
69 _init_listhead(&(pstapriv->sta_hash[i]));
70 list_insert_tail(&psta->list,
71 get_list_head(&pstapriv->free_sta_queue));
72 psta++;
73 }
74#ifdef CONFIG_R8712_AP
75 _init_listhead(&pstapriv->asoc_list);
76 _init_listhead(&pstapriv->auth_list);
77#endif
78 return _SUCCESS;
79}
80
81/* this function is used to free the memory of lock || sema for all stainfos */
82static void mfree_all_stainfo(struct sta_priv *pstapriv)
83{
84 unsigned long irqL;
85 struct list_head *plist, *phead;
86 struct sta_info *psta = NULL;
87
88 spin_lock_irqsave(&pstapriv->sta_hash_lock, irqL);
89 phead = get_list_head(&pstapriv->free_sta_queue);
90 plist = get_next(phead);
91 while ((end_of_queue_search(phead, plist)) == false) {
92 psta = LIST_CONTAINOR(plist, struct sta_info, list);
93 plist = get_next(plist);
94 }
95
96 spin_unlock_irqrestore(&pstapriv->sta_hash_lock, irqL);
97}
98
99
100static void mfree_sta_priv_lock(struct sta_priv *pstapriv)
101{
102 mfree_all_stainfo(pstapriv); /* be done before free sta_hash_lock */
103}
104
105u32 _r8712_free_sta_priv(struct sta_priv *pstapriv)
106{
107 if (pstapriv) {
108 mfree_sta_priv_lock(pstapriv);
109 kfree(pstapriv->pallocated_stainfo_buf);
110 }
111 return _SUCCESS;
112}
113
114struct sta_info *r8712_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
115{
116 uint tmp_aid;
117 s32 index;
118 struct list_head *phash_list;
119 struct sta_info *psta;
120 struct __queue *pfree_sta_queue;
121 struct recv_reorder_ctrl *preorder_ctrl;
122 int i = 0;
123 u16 wRxSeqInitialValue = 0xffff;
124 unsigned long flags;
125
126 pfree_sta_queue = &pstapriv->free_sta_queue;
127 spin_lock_irqsave(&(pfree_sta_queue->lock), flags);
128 if (_queue_empty(pfree_sta_queue) == true)
129 psta = NULL;
130 else {
131 psta = LIST_CONTAINOR(get_next(&pfree_sta_queue->queue),
132 struct sta_info, list);
133 list_delete(&(psta->list));
134 tmp_aid = psta->aid;
135 _init_stainfo(psta);
136 memcpy(psta->hwaddr, hwaddr, ETH_ALEN);
137 index = wifi_mac_hash(hwaddr);
138 if (index >= NUM_STA) {
139 psta = NULL;
140 goto exit;
141 }
142 phash_list = &(pstapriv->sta_hash[index]);
143 list_insert_tail(&psta->hash_list, phash_list);
144 pstapriv->asoc_sta_count++ ;
145
146/* For the SMC router, the sequence number of first packet of WPS handshake
147 * will be 0. In this case, this packet will be dropped by recv_decache function
148 * if we use the 0x00 as the default value for tid_rxseq variable. So, we
149 * initialize the tid_rxseq variable as the 0xffff.
150 */
151 for (i = 0; i < 16; i++)
152 memcpy(&psta->sta_recvpriv.rxcache.tid_rxseq[i],
153 &wRxSeqInitialValue, 2);
154 /* for A-MPDU Rx reordering buffer control */
155 for (i = 0; i < 16 ; i++) {
156 preorder_ctrl = &psta->recvreorder_ctrl[i];
157 preorder_ctrl->padapter = pstapriv->padapter;
158 preorder_ctrl->indicate_seq = 0xffff;
159 preorder_ctrl->wend_b = 0xffff;
160 preorder_ctrl->wsize_b = 64;
161 _init_queue(&preorder_ctrl->pending_recvframe_queue);
162 r8712_init_recv_timer(preorder_ctrl);
163 }
164 }
165exit:
166 spin_unlock_irqrestore(&(pfree_sta_queue->lock), flags);
167 return psta;
168}
169
170/* using pstapriv->sta_hash_lock to protect */
171void r8712_free_stainfo(struct _adapter *padapter, struct sta_info *psta)
172{
173 int i;
174 unsigned long irqL0;
175 struct __queue *pfree_sta_queue;
176 struct recv_reorder_ctrl *preorder_ctrl;
177 struct sta_xmit_priv *pstaxmitpriv;
178 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
179 struct sta_priv *pstapriv = &padapter->stapriv;
180
181 if (psta == NULL)
182 return;
183 pfree_sta_queue = &pstapriv->free_sta_queue;
184 pstaxmitpriv = &psta->sta_xmitpriv;
185 spin_lock_irqsave(&(pxmitpriv->vo_pending.lock), irqL0);
186 r8712_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vo_q.sta_pending);
187 list_delete(&(pstaxmitpriv->vo_q.tx_pending));
188 spin_unlock_irqrestore(&(pxmitpriv->vo_pending.lock), irqL0);
189 spin_lock_irqsave(&(pxmitpriv->vi_pending.lock), irqL0);
190 r8712_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vi_q.sta_pending);
191 list_delete(&(pstaxmitpriv->vi_q.tx_pending));
192 spin_unlock_irqrestore(&(pxmitpriv->vi_pending.lock), irqL0);
193 spin_lock_irqsave(&(pxmitpriv->bk_pending.lock), irqL0);
194 r8712_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->bk_q.sta_pending);
195 list_delete(&(pstaxmitpriv->bk_q.tx_pending));
196 spin_unlock_irqrestore(&(pxmitpriv->bk_pending.lock), irqL0);
197 spin_lock_irqsave(&(pxmitpriv->be_pending.lock), irqL0);
198 r8712_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->be_q.sta_pending);
199 list_delete(&(pstaxmitpriv->be_q.tx_pending));
200 spin_unlock_irqrestore(&(pxmitpriv->be_pending.lock), irqL0);
201 list_delete(&psta->hash_list);
202 pstapriv->asoc_sta_count--;
203 /* re-init sta_info; 20061114 */
204 _r8712_init_sta_xmit_priv(&psta->sta_xmitpriv);
205 _r8712_init_sta_recv_priv(&psta->sta_recvpriv);
206 /* for A-MPDU Rx reordering buffer control,
207 * cancel reordering_ctrl_timer */
208 for (i = 0; i < 16; i++) {
209 preorder_ctrl = &psta->recvreorder_ctrl[i];
210 _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);
211 }
212 spin_lock(&(pfree_sta_queue->lock));
213 /* insert into free_sta_queue; 20061114 */
214 list_insert_tail(&psta->list, get_list_head(pfree_sta_queue));
215 spin_unlock(&(pfree_sta_queue->lock));
216}
217
218/* free all stainfo which in sta_hash[all] */
219void r8712_free_all_stainfo(struct _adapter *padapter)
220{
221 unsigned long irqL;
222 struct list_head *plist, *phead;
223 s32 index;
224 struct sta_info *psta = NULL;
225 struct sta_priv *pstapriv = &padapter->stapriv;
226 struct sta_info *pbcmc_stainfo = r8712_get_bcmc_stainfo(padapter);
227
228 if (pstapriv->asoc_sta_count == 1)
229 return;
230 spin_lock_irqsave(&pstapriv->sta_hash_lock, irqL);
231 for (index = 0; index < NUM_STA; index++) {
232 phead = &(pstapriv->sta_hash[index]);
233 plist = get_next(phead);
234 while ((end_of_queue_search(phead, plist)) == false) {
235 psta = LIST_CONTAINOR(plist,
236 struct sta_info, hash_list);
237 plist = get_next(plist);
238 if (pbcmc_stainfo != psta)
239 r8712_free_stainfo(padapter , psta);
240 }
241 }
242 spin_unlock_irqrestore(&pstapriv->sta_hash_lock, irqL);
243}
244
245/* any station allocated can be searched by hash list */
246struct sta_info *r8712_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
247{
248 unsigned long irqL;
249 struct list_head *plist, *phead;
250 struct sta_info *psta = NULL;
251 u32 index;
252
253 if (hwaddr == NULL)
254 return NULL;
255 index = wifi_mac_hash(hwaddr);
256 spin_lock_irqsave(&pstapriv->sta_hash_lock, irqL);
257 phead = &(pstapriv->sta_hash[index]);
258 plist = get_next(phead);
259 while ((end_of_queue_search(phead, plist)) == false) {
260 psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
261 if ((!memcmp(psta->hwaddr, hwaddr, ETH_ALEN))) {
262 /* if found the matched address */
263 break;
264 }
265 psta = NULL;
266 plist = get_next(plist);
267 }
268 spin_unlock_irqrestore(&pstapriv->sta_hash_lock, irqL);
269 return psta;
270}
271
272void r8712_init_bcmc_stainfo(struct _adapter *padapter)
273{
274 struct sta_info *psta;
275 struct tx_servq *ptxservq;
276 unsigned char bcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
277 struct sta_priv *pstapriv = &padapter->stapriv;
278
279 psta = r8712_alloc_stainfo(pstapriv, bcast_addr);
280 if (psta == NULL)
281 return;
282 ptxservq = &(psta->sta_xmitpriv.be_q);
283}
284
285struct sta_info *r8712_get_bcmc_stainfo(struct _adapter *padapter)
286{
287 struct sta_info *psta;
288 struct sta_priv *pstapriv = &padapter->stapriv;
289 u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
290
291 psta = r8712_get_stainfo(pstapriv, bc_addr);
292 return psta;
293}
294
295
296u8 r8712_access_ctrl(struct wlan_acl_pool *pacl_list, u8 *mac_addr)
297{
298 return true;
299}
diff --git a/drivers/staging/rtl8712/rtl871x_wlan_sme.h b/drivers/staging/rtl8712/rtl871x_wlan_sme.h
new file mode 100644
index 00000000000..d9733ac6a43
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_wlan_sme.h
@@ -0,0 +1,22 @@
1#ifndef _RTL871X_WLAN_SME_H_
2#define _RTL871X_WLAN_SME_H_
3
4#define MSR_APMODE 0x0C
5#define MSR_STAMODE 0x08
6#define MSR_ADHOCMODE 0x04
7#define MSR_NOLINKMODE 0x00
8#define _1M_RATE_ 0
9#define _2M_RATE_ 1
10#define _5M_RATE_ 2
11#define _11M_RATE_ 3
12#define _6M_RATE_ 4
13#define _9M_RATE_ 5
14#define _12M_RATE_ 6
15#define _18M_RATE_ 7
16#define _24M_RATE_ 8
17#define _36M_RATE_ 9
18#define _48M_RATE_ 10
19#define _54M_RATE_ 11
20
21#endif
22
diff --git a/drivers/staging/rtl8712/rtl871x_xmit.c b/drivers/staging/rtl8712/rtl871x_xmit.c
new file mode 100644
index 00000000000..b8195e3a72d
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_xmit.c
@@ -0,0 +1,1052 @@
1/******************************************************************************
2 * rtl871x_xmit.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _RTL871X_XMIT_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "rtl871x_byteorder.h"
34#include "wifi.h"
35#include "osdep_intf.h"
36#include "usb_ops.h"
37
38
39static const u8 P802_1H_OUI[P80211_OUI_LEN] = {0x00, 0x00, 0xf8};
40static const u8 RFC1042_OUI[P80211_OUI_LEN] = {0x00, 0x00, 0x00};
41static void init_hwxmits(struct hw_xmit *phwxmit, sint entry);
42static void alloc_hwxmits(struct _adapter *padapter);
43static void free_hwxmits(struct _adapter *padapter);
44
45static void _init_txservq(struct tx_servq *ptxservq)
46{
47 _init_listhead(&ptxservq->tx_pending);
48 _init_queue(&ptxservq->sta_pending);
49 ptxservq->qcnt = 0;
50}
51
52void _r8712_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)
53{
54 memset((unsigned char *)psta_xmitpriv, 0,
55 sizeof(struct sta_xmit_priv));
56 spin_lock_init(&psta_xmitpriv->lock);
57 _init_txservq(&psta_xmitpriv->be_q);
58 _init_txservq(&psta_xmitpriv->bk_q);
59 _init_txservq(&psta_xmitpriv->vi_q);
60 _init_txservq(&psta_xmitpriv->vo_q);
61 _init_listhead(&psta_xmitpriv->legacy_dz);
62 _init_listhead(&psta_xmitpriv->apsd);
63}
64
65sint _r8712_init_xmit_priv(struct xmit_priv *pxmitpriv,
66 struct _adapter *padapter)
67{
68 sint i;
69 struct xmit_buf *pxmitbuf;
70 struct xmit_frame *pxframe;
71
72 memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv));
73 spin_lock_init(&pxmitpriv->lock);
74 sema_init(&pxmitpriv->xmit_sema, 0);
75 sema_init(&pxmitpriv->terminate_xmitthread_sema, 0);
76 /*
77 Please insert all the queue initializaiton using _init_queue below
78 */
79 pxmitpriv->adapter = padapter;
80 _init_queue(&pxmitpriv->be_pending);
81 _init_queue(&pxmitpriv->bk_pending);
82 _init_queue(&pxmitpriv->vi_pending);
83 _init_queue(&pxmitpriv->vo_pending);
84 _init_queue(&pxmitpriv->bm_pending);
85 _init_queue(&pxmitpriv->legacy_dz_queue);
86 _init_queue(&pxmitpriv->apsd_queue);
87 _init_queue(&pxmitpriv->free_xmit_queue);
88 /*
89 Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
90 and initialize free_xmit_frame below.
91 Please also apply free_txobj to link_up all the xmit_frames...
92 */
93 pxmitpriv->pallocated_frame_buf = _malloc(NR_XMITFRAME *
94 sizeof(struct xmit_frame) + 4);
95 if (pxmitpriv->pallocated_frame_buf == NULL) {
96 pxmitpriv->pxmit_frame_buf = NULL;
97 return _FAIL;
98 }
99 pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 -
100 ((addr_t) (pxmitpriv->pallocated_frame_buf) & 3);
101 pxframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf;
102 for (i = 0; i < NR_XMITFRAME; i++) {
103 _init_listhead(&(pxframe->list));
104 pxframe->padapter = padapter;
105 pxframe->frame_tag = DATA_FRAMETAG;
106 pxframe->pkt = NULL;
107 pxframe->buf_addr = NULL;
108 pxframe->pxmitbuf = NULL;
109 list_insert_tail(&(pxframe->list),
110 &(pxmitpriv->free_xmit_queue.queue));
111 pxframe++;
112 }
113 pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
114 /*
115 init xmit hw_txqueue
116 */
117 _r8712_init_hw_txqueue(&pxmitpriv->be_txqueue, BE_QUEUE_INX);
118 _r8712_init_hw_txqueue(&pxmitpriv->bk_txqueue, BK_QUEUE_INX);
119 _r8712_init_hw_txqueue(&pxmitpriv->vi_txqueue, VI_QUEUE_INX);
120 _r8712_init_hw_txqueue(&pxmitpriv->vo_txqueue, VO_QUEUE_INX);
121 _r8712_init_hw_txqueue(&pxmitpriv->bmc_txqueue, BMC_QUEUE_INX);
122 pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
123 pxmitpriv->txirp_cnt = 1;
124 sema_init(&(pxmitpriv->tx_retevt), 0);
125 /*per AC pending irp*/
126 pxmitpriv->beq_cnt = 0;
127 pxmitpriv->bkq_cnt = 0;
128 pxmitpriv->viq_cnt = 0;
129 pxmitpriv->voq_cnt = 0;
130 /*init xmit_buf*/
131 _init_queue(&pxmitpriv->free_xmitbuf_queue);
132 _init_queue(&pxmitpriv->pending_xmitbuf_queue);
133 pxmitpriv->pallocated_xmitbuf = _malloc(NR_XMITBUFF *
134 sizeof(struct xmit_buf) + 4);
135 if (pxmitpriv->pallocated_xmitbuf == NULL)
136 return _FAIL;
137 pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 -
138 ((addr_t)(pxmitpriv->pallocated_xmitbuf) & 3);
139 pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
140 for (i = 0; i < NR_XMITBUFF; i++) {
141 _init_listhead(&pxmitbuf->list);
142 pxmitbuf->pallocated_buf = _malloc(MAX_XMITBUF_SZ +
143 XMITBUF_ALIGN_SZ);
144 if (pxmitbuf->pallocated_buf == NULL)
145 return _FAIL;
146 pxmitbuf->pbuf = pxmitbuf->pallocated_buf + XMITBUF_ALIGN_SZ -
147 ((addr_t) (pxmitbuf->pallocated_buf) &
148 (XMITBUF_ALIGN_SZ - 1));
149 r8712_xmit_resource_alloc(padapter, pxmitbuf);
150 list_insert_tail(&pxmitbuf->list,
151 &(pxmitpriv->free_xmitbuf_queue.queue));
152 pxmitbuf++;
153 }
154 pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;
155 alloc_hwxmits(padapter);
156 init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
157 tasklet_init(&pxmitpriv->xmit_tasklet,
158 (void(*)(addr_t))r8712_xmit_bh,
159 (addr_t)padapter);
160 return _SUCCESS;
161}
162
163void _free_xmit_priv(struct xmit_priv *pxmitpriv)
164{
165 int i;
166 struct _adapter *padapter = pxmitpriv->adapter;
167 struct xmit_frame *pxmitframe = (struct xmit_frame *)
168 pxmitpriv->pxmit_frame_buf;
169 struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
170
171 if (pxmitpriv->pxmit_frame_buf == NULL)
172 return;
173 for (i = 0; i < NR_XMITFRAME; i++) {
174 r8712_xmit_complete(padapter, pxmitframe);
175 pxmitframe++;
176 }
177 for (i = 0; i < NR_XMITBUFF; i++) {
178 r8712_xmit_resource_free(padapter, pxmitbuf);
179 kfree(pxmitbuf->pallocated_buf);
180 pxmitbuf++;
181 }
182 kfree(pxmitpriv->pallocated_frame_buf);
183 kfree(pxmitpriv->pallocated_xmitbuf);
184 free_hwxmits(padapter);
185}
186
187sint r8712_update_attrib(struct _adapter *padapter, _pkt *pkt,
188 struct pkt_attrib *pattrib)
189{
190 uint i;
191 struct pkt_file pktfile;
192 struct sta_info *psta = NULL;
193 struct ethhdr etherhdr;
194
195 struct tx_cmd txdesc;
196
197 sint bmcast;
198 struct sta_priv *pstapriv = &padapter->stapriv;
199 struct security_priv *psecuritypriv = &padapter->securitypriv;
200 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
201 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
202
203 _r8712_open_pktfile(pkt, &pktfile);
204
205 i = _r8712_pktfile_read(&pktfile, (unsigned char *)&etherhdr, ETH_HLEN);
206
207 pattrib->ether_type = ntohs(etherhdr.h_proto);
208
209{
210 u8 bool;
211 /*If driver xmit ARP packet, driver can set ps mode to initial
212 * setting. It stands for getting DHCP or fix IP.*/
213 if (pattrib->ether_type == 0x0806) {
214 if (padapter->pwrctrlpriv.pwr_mode !=
215 padapter->registrypriv.power_mgnt) {
216 _cancel_timer(&(pmlmepriv->dhcp_timer), &bool);
217 r8712_set_ps_mode(padapter, padapter->registrypriv.
218 power_mgnt, padapter->registrypriv.smart_ps);
219 }
220 }
221}
222 memcpy(pattrib->dst, &etherhdr.h_dest, ETH_ALEN);
223 memcpy(pattrib->src, &etherhdr.h_source, ETH_ALEN);
224 pattrib->pctrl = 0;
225 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true) ||
226 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
227 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
228 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
229 } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
230 memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
231 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
232 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
233 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
234 memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
235 } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true) {
236 /*firstly, filter packet not belongs to mp*/
237 if (pattrib->ether_type != 0x8712)
238 return _FAIL;
239 /* for mp storing the txcmd per packet,
240 * according to the info of txcmd to update pattrib */
241 /*get MP_TXDESC_SIZE bytes txcmd per packet*/
242 i = _r8712_pktfile_read(&pktfile, (u8 *)&txdesc, TXDESC_SIZE);
243 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
244 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
245 pattrib->pctrl = 1;
246 }
247 /* r8712_xmitframe_coalesce() overwrite this!*/
248 pattrib->pktlen = pktfile.pkt_len;
249 if (ETH_P_IP == pattrib->ether_type) {
250 /* The following is for DHCP and ARP packet, we use cck1M to
251 * tx these packets and let LPS awake some time
252 * to prevent DHCP protocol fail */
253 u8 tmp[24];
254 _r8712_pktfile_read(&pktfile, &tmp[0], 24);
255 pattrib->dhcp_pkt = 0;
256 if (pktfile.pkt_len > 282) {/*MINIMUM_DHCP_PACKET_SIZE)*/
257 if (ETH_P_IP == pattrib->ether_type) {/* IP header*/
258 if (((tmp[21] == 68) && (tmp[23] == 67)) ||
259 ((tmp[21] == 67) && (tmp[23] == 68))) {
260 /* 68 : UDP BOOTP client
261 * 67 : UDP BOOTP server
262 * Use low rate to send DHCP packet.*/
263 pattrib->dhcp_pkt = 1;
264 }
265 }
266 }
267 }
268 bmcast = IS_MCAST(pattrib->ra);
269 /* get sta_info*/
270 if (bmcast) {
271 psta = r8712_get_bcmc_stainfo(padapter);
272 pattrib->mac_id = 4;
273 } else {
274 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true) {
275 psta = r8712_get_stainfo(pstapriv,
276 get_bssid(pmlmepriv));
277 pattrib->mac_id = 5;
278 } else {
279 psta = r8712_get_stainfo(pstapriv, pattrib->ra);
280 if (psta == NULL) /* drop the pkt */
281 return _FAIL;
282 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
283 pattrib->mac_id = 5;
284 else
285 pattrib->mac_id = psta->mac_id;
286 }
287 }
288
289 if (psta) {
290 pattrib->psta = psta;
291 } else {
292 /* if we cannot get psta => drrp the pkt */
293 return _FAIL;
294 }
295
296 pattrib->ack_policy = 0;
297 /* get ether_hdr_len */
298 pattrib->pkt_hdrlen = ETH_HLEN;
299
300 if (pqospriv->qos_option)
301 r8712_set_qos(&pktfile, pattrib);
302 else {
303 pattrib->hdrlen = WLAN_HDR_A3_LEN;
304 pattrib->subtype = WIFI_DATA_TYPE;
305 pattrib->priority = 0;
306 }
307 if (psta->ieee8021x_blocked == true) {
308 pattrib->encrypt = 0;
309 if ((pattrib->ether_type != 0x888e) &&
310 (check_fwstate(pmlmepriv, WIFI_MP_STATE) == false))
311 return _FAIL;
312 } else
313 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
314 switch (pattrib->encrypt) {
315 case _WEP40_:
316 case _WEP104_:
317 pattrib->iv_len = 4;
318 pattrib->icv_len = 4;
319 break;
320 case _TKIP_:
321 pattrib->iv_len = 8;
322 pattrib->icv_len = 4;
323 if (padapter->securitypriv.busetkipkey == _FAIL)
324 return _FAIL;
325 break;
326 case _AES_:
327 pattrib->iv_len = 8;
328 pattrib->icv_len = 8;
329 break;
330 default:
331 pattrib->iv_len = 0;
332 pattrib->icv_len = 0;
333 break;
334 }
335
336 if (pattrib->encrypt &&
337 ((padapter->securitypriv.sw_encrypt == true) ||
338 (psecuritypriv->hw_decrypted == false)))
339 pattrib->bswenc = true;
340 else
341 pattrib->bswenc = false;
342 /* if in MP_STATE, update pkt_attrib from mp_txcmd, and overwrite
343 * some settings above.*/
344 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true)
345 pattrib->priority = (txdesc.txdw1 >> QSEL_SHT) & 0x1f;
346 return _SUCCESS;
347}
348
349static sint xmitframe_addmic(struct _adapter *padapter,
350 struct xmit_frame *pxmitframe)
351{
352 u32 curfragnum, length, datalen;
353 u8 *pframe, *payload, mic[8];
354 struct mic_data micdata;
355 struct sta_info *stainfo;
356 struct qos_priv *pqospriv = &(padapter->mlmepriv.qospriv);
357 struct pkt_attrib *pattrib = &pxmitframe->attrib;
358 struct security_priv *psecuritypriv = &padapter->securitypriv;
359 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
360 u8 priority[4] = {0x0, 0x0, 0x0, 0x0};
361 sint bmcst = IS_MCAST(pattrib->ra);
362
363 if (pattrib->psta)
364 stainfo = pattrib->psta;
365 else
366 stainfo = r8712_get_stainfo(&padapter->stapriv,
367 &pattrib->ra[0]);
368 if (pattrib->encrypt == _TKIP_) {
369 /*encode mic code*/
370 if (stainfo != NULL) {
371 u8 null_key[16] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
372 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
373 0x0, 0x0};
374 datalen = pattrib->pktlen - pattrib->hdrlen;
375 pframe = pxmitframe->buf_addr + TXDESC_OFFSET;;
376 if (bmcst) {
377 if (!memcmp(psecuritypriv->XGrptxmickey
378 [psecuritypriv->XGrpKeyid].skey,
379 null_key, 16))
380 return _FAIL;
381 /*start to calculate the mic code*/
382 r8712_secmicsetkey(&micdata,
383 psecuritypriv->
384 XGrptxmickey[psecuritypriv->
385 XGrpKeyid].skey);
386 } else {
387 if (!memcmp(&stainfo->tkiptxmickey.skey[0],
388 null_key, 16))
389 return _FAIL;
390 /* start to calculate the mic code */
391 r8712_secmicsetkey(&micdata,
392 &stainfo->tkiptxmickey.skey[0]);
393 }
394 if (pframe[1] & 1) { /* ToDS==1 */
395 r8712_secmicappend(&micdata,
396 &pframe[16], 6); /*DA*/
397 if (pframe[1]&2) /* From Ds==1 */
398 r8712_secmicappend(&micdata,
399 &pframe[24], 6);
400 else
401 r8712_secmicappend(&micdata,
402 &pframe[10], 6);
403 } else { /* ToDS==0 */
404 r8712_secmicappend(&micdata,
405 &pframe[4], 6); /* DA */
406 if (pframe[1]&2) /* From Ds==1 */
407 r8712_secmicappend(&micdata,
408 &pframe[16], 6);
409 else
410 r8712_secmicappend(&micdata,
411 &pframe[10], 6);
412 }
413 if (pqospriv->qos_option == 1)
414 priority[0] = (u8)pxmitframe->
415 attrib.priority;
416 r8712_secmicappend(&micdata, &priority[0], 4);
417 payload = pframe;
418 for (curfragnum = 0; curfragnum < pattrib->nr_frags;
419 curfragnum++) {
420 payload = (u8 *)RND4((addr_t)(payload));
421 payload = payload+pattrib->
422 hdrlen+pattrib->iv_len;
423 if ((curfragnum + 1) == pattrib->nr_frags) {
424 length = pattrib->last_txcmdsz -
425 pattrib->hdrlen -
426 pattrib->iv_len -
427 ((psecuritypriv->sw_encrypt)
428 ? pattrib->icv_len : 0);
429 r8712_secmicappend(&micdata, payload,
430 length);
431 payload = payload+length;
432 } else{
433 length = pxmitpriv->frag_len -
434 pattrib->hdrlen-pattrib->iv_len -
435 ((psecuritypriv->sw_encrypt) ?
436 pattrib->icv_len : 0);
437 r8712_secmicappend(&micdata, payload,
438 length);
439 payload = payload + length +
440 pattrib->icv_len;
441 }
442 }
443 r8712_secgetmic(&micdata, &(mic[0]));
444 /* add mic code and add the mic code length in
445 * last_txcmdsz */
446 memcpy(payload, &(mic[0]), 8);
447 pattrib->last_txcmdsz += 8;
448 payload = payload-pattrib->last_txcmdsz + 8;
449 }
450 }
451 return _SUCCESS;
452}
453
454static sint xmitframe_swencrypt(struct _adapter *padapter,
455 struct xmit_frame *pxmitframe)
456{
457 struct pkt_attrib *pattrib = &pxmitframe->attrib;
458
459 if (pattrib->bswenc) {
460 switch (pattrib->encrypt) {
461 case _WEP40_:
462 case _WEP104_:
463 r8712_wep_encrypt(padapter, (u8 *)pxmitframe);
464 break;
465 case _TKIP_:
466 r8712_tkip_encrypt(padapter, (u8 *)pxmitframe);
467 break;
468 case _AES_:
469 r8712_aes_encrypt(padapter, (u8 *)pxmitframe);
470 break;
471 default:
472 break;
473 }
474 }
475 return _SUCCESS;
476}
477
478static sint make_wlanhdr(struct _adapter *padapter , u8 *hdr,
479 struct pkt_attrib *pattrib)
480{
481 u16 *qc;
482
483 struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr;
484 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
485 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
486 u16 *fctrl = &pwlanhdr->frame_ctl;
487 memset(hdr, 0, WLANHDR_OFFSET);
488 SetFrameSubType(fctrl, pattrib->subtype);
489 if (pattrib->subtype & WIFI_DATA_TYPE) {
490 if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true)) {
491 /* to_ds = 1, fr_ds = 0; */
492 SetToDs(fctrl);
493 memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv),
494 ETH_ALEN);
495 memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
496 memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
497 } else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == true)) {
498 /* to_ds = 0, fr_ds = 1; */
499 SetFrDs(fctrl);
500 memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
501 memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv),
502 ETH_ALEN);
503 memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
504 } else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)
505 || (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)
506 == true)) {
507 memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
508 memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
509 memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv),
510 ETH_ALEN);
511 } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true) {
512 memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
513 memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
514 memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv),
515 ETH_ALEN);
516 } else
517 return _FAIL;
518
519 if (pattrib->encrypt)
520 SetPrivacy(fctrl);
521 if (pqospriv->qos_option) {
522 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
523 if (pattrib->priority)
524 SetPriority(qc, pattrib->priority);
525 SetAckpolicy(qc, pattrib->ack_policy);
526 }
527 /* TODO: fill HT Control Field */
528 /* Update Seq Num will be handled by f/w */
529 {
530 struct sta_info *psta;
531
532 sint bmcst = IS_MCAST(pattrib->ra);
533 if (pattrib->psta)
534 psta = pattrib->psta;
535 else {
536 if (bmcst)
537 psta = r8712_get_bcmc_stainfo(padapter);
538 else
539 psta =
540 r8712_get_stainfo(&padapter->stapriv,
541 pattrib->ra);
542 }
543 if (psta) {
544 psta->sta_xmitpriv.txseq_tid
545 [pattrib->priority]++;
546 psta->sta_xmitpriv.txseq_tid[pattrib->priority]
547 &= 0xFFF;
548 pattrib->seqnum = psta->sta_xmitpriv.
549 txseq_tid[pattrib->priority];
550 SetSeqNum(hdr, pattrib->seqnum);
551 }
552 }
553 }
554 return _SUCCESS;
555}
556
557static sint r8712_put_snap(u8 *data, u16 h_proto)
558{
559 struct ieee80211_snap_hdr *snap;
560 const u8 *oui;
561
562 snap = (struct ieee80211_snap_hdr *)data;
563 snap->dsap = 0xaa;
564 snap->ssap = 0xaa;
565 snap->ctrl = 0x03;
566 if (h_proto == 0x8137 || h_proto == 0x80f3)
567 oui = P802_1H_OUI;
568 else
569 oui = RFC1042_OUI;
570 snap->oui[0] = oui[0];
571 snap->oui[1] = oui[1];
572 snap->oui[2] = oui[2];
573 *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
574 return SNAP_SIZE + sizeof(u16);
575}
576
577/*
578 * This sub-routine will perform all the following:
579 * 1. remove 802.3 header.
580 * 2. create wlan_header, based on the info in pxmitframe
581 * 3. append sta's iv/ext-iv
582 * 4. append LLC
583 * 5. move frag chunk from pframe to pxmitframe->mem
584 * 6. apply sw-encrypt, if necessary.
585 */
586sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,
587 struct xmit_frame *pxmitframe)
588{
589 struct pkt_file pktfile;
590
591 sint frg_len, mpdu_len, llc_sz;
592 u32 mem_sz;
593 u8 frg_inx;
594 addr_t addr;
595 u8 *pframe, *mem_start, *ptxdesc;
596 struct sta_info *psta;
597 struct security_priv *psecuritypriv = &padapter->securitypriv;
598 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
599 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
600 struct pkt_attrib *pattrib = &pxmitframe->attrib;
601 u8 *pbuf_start;
602 sint bmcst = IS_MCAST(pattrib->ra);
603
604 if (pattrib->psta == NULL)
605 return _FAIL;
606 psta = pattrib->psta;
607 if (pxmitframe->buf_addr == NULL)
608 return _FAIL;
609 pbuf_start = pxmitframe->buf_addr;
610 ptxdesc = pbuf_start;
611 mem_start = pbuf_start + TXDESC_OFFSET;
612 if (make_wlanhdr(padapter, mem_start, pattrib) == _FAIL)
613 return _FAIL;
614 _r8712_open_pktfile(pkt, &pktfile);
615 _r8712_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
616 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true) {
617 /* truncate TXDESC_SIZE bytes txcmd if at mp mode for 871x */
618 if (pattrib->ether_type == 0x8712) {
619 /* take care - update_txdesc overwrite this */
620 _r8712_pktfile_read(&pktfile, ptxdesc, TXDESC_SIZE);
621 }
622 }
623 pattrib->pktlen = pktfile.pkt_len;
624 frg_inx = 0;
625 frg_len = pxmitpriv->frag_len - 4;
626 while (1) {
627 llc_sz = 0;
628 mpdu_len = frg_len;
629 pframe = mem_start;
630 SetMFrag(mem_start);
631 pframe += pattrib->hdrlen;
632 mpdu_len -= pattrib->hdrlen;
633 /* adding icv, if necessary...*/
634 if (pattrib->iv_len) {
635 if (psta != NULL) {
636 switch (pattrib->encrypt) {
637 case _WEP40_:
638 case _WEP104_:
639 WEP_IV(pattrib->iv, psta->txpn,
640 (u8)psecuritypriv->
641 PrivacyKeyIndex);
642 break;
643 case _TKIP_:
644 if (bmcst)
645 TKIP_IV(pattrib->iv,
646 psta->txpn,
647 (u8)psecuritypriv->
648 XGrpKeyid);
649 else
650 TKIP_IV(pattrib->iv, psta->txpn,
651 0);
652 break;
653 case _AES_:
654 if (bmcst)
655 AES_IV(pattrib->iv, psta->txpn,
656 (u8)psecuritypriv->
657 XGrpKeyid);
658 else
659 AES_IV(pattrib->iv, psta->txpn,
660 0);
661 break;
662 }
663 }
664 memcpy(pframe, pattrib->iv, pattrib->iv_len);
665 pframe += pattrib->iv_len;
666 mpdu_len -= pattrib->iv_len;
667 }
668 if (frg_inx == 0) {
669 llc_sz = r8712_put_snap(pframe, pattrib->ether_type);
670 pframe += llc_sz;
671 mpdu_len -= llc_sz;
672 }
673 if ((pattrib->icv_len > 0) && (pattrib->bswenc))
674 mpdu_len -= pattrib->icv_len;
675 if (bmcst)
676 mem_sz = _r8712_pktfile_read(&pktfile, pframe,
677 pattrib->pktlen);
678 else
679 mem_sz = _r8712_pktfile_read(&pktfile, pframe,
680 mpdu_len);
681 pframe += mem_sz;
682 if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
683 memcpy(pframe, pattrib->icv, pattrib->icv_len);
684 pframe += pattrib->icv_len;
685 }
686 frg_inx++;
687 if (bmcst || (r8712_endofpktfile(&pktfile) == true)) {
688 pattrib->nr_frags = frg_inx;
689 pattrib->last_txcmdsz = pattrib->hdrlen +
690 pattrib->iv_len +
691 ((pattrib->nr_frags == 1) ?
692 llc_sz : 0) +
693 ((pattrib->bswenc) ?
694 pattrib->icv_len : 0) + mem_sz;
695 ClearMFrag(mem_start);
696 break;
697 }
698 addr = (addr_t)(pframe);
699 mem_start = (unsigned char *)RND4(addr) + TXDESC_OFFSET;
700 memcpy(mem_start, pbuf_start + TXDESC_OFFSET, pattrib->hdrlen);
701 }
702
703 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
704 return _FAIL;
705 xmitframe_swencrypt(padapter, pxmitframe);
706 return _SUCCESS;
707}
708
709void r8712_update_protection(struct _adapter *padapter, u8 *ie, uint ie_len)
710{
711 uint protection;
712 u8 *perp;
713 sint erp_len;
714 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
715 struct registry_priv *pregistrypriv = &padapter->registrypriv;
716
717 switch (pxmitpriv->vcs_setting) {
718 case DISABLE_VCS:
719 pxmitpriv->vcs = NONE_VCS;
720 break;
721 case ENABLE_VCS:
722 break;
723 case AUTO_VCS:
724 default:
725 perp = r8712_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);
726 if (perp == NULL)
727 pxmitpriv->vcs = NONE_VCS;
728 else {
729 protection = (*(perp + 2)) & BIT(1);
730 if (protection) {
731 if (pregistrypriv->vcs_type == RTS_CTS)
732 pxmitpriv->vcs = RTS_CTS;
733 else
734 pxmitpriv->vcs = CTS_TO_SELF;
735 } else
736 pxmitpriv->vcs = NONE_VCS;
737 }
738 break;
739 }
740}
741
742struct xmit_buf *r8712_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
743{
744 unsigned long irqL;
745 struct xmit_buf *pxmitbuf = NULL;
746 struct list_head *plist, *phead;
747 struct __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
748
749 spin_lock_irqsave(&pfree_xmitbuf_queue->lock, irqL);
750 if (_queue_empty(pfree_xmitbuf_queue) == true)
751 pxmitbuf = NULL;
752 else {
753 phead = get_list_head(pfree_xmitbuf_queue);
754 plist = get_next(phead);
755 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
756 list_delete(&(pxmitbuf->list));
757 }
758 if (pxmitbuf != NULL)
759 pxmitpriv->free_xmitbuf_cnt--;
760 spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, irqL);
761 return pxmitbuf;
762}
763
764int r8712_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
765{
766 unsigned long irqL;
767 struct __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
768
769 if (pxmitbuf == NULL)
770 return _FAIL;
771 spin_lock_irqsave(&pfree_xmitbuf_queue->lock, irqL);
772 list_delete(&pxmitbuf->list);
773 list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));
774 pxmitpriv->free_xmitbuf_cnt++;
775 spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, irqL);
776 return _SUCCESS;
777}
778
779/*
780Calling context:
7811. OS_TXENTRY
7822. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
783
784If we turn on USE_RXTHREAD, then, no need for critical section.
785Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
786
787Must be very very cautious...
788
789*/
790
791struct xmit_frame *r8712_alloc_xmitframe(struct xmit_priv *pxmitpriv)
792{
793 /*
794 Please remember to use all the osdep_service api,
795 and lock/unlock or _enter/_exit critical to protect
796 pfree_xmit_queue
797 */
798 unsigned long irqL;
799 struct xmit_frame *pxframe = NULL;
800 struct list_head *plist, *phead;
801 struct __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
802
803 spin_lock_irqsave(&pfree_xmit_queue->lock, irqL);
804 if (_queue_empty(pfree_xmit_queue) == true)
805 pxframe = NULL;
806 else {
807 phead = get_list_head(pfree_xmit_queue);
808 plist = get_next(phead);
809 pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
810 list_delete(&(pxframe->list));
811 }
812 if (pxframe != NULL) {
813 pxmitpriv->free_xmitframe_cnt--;
814 pxframe->buf_addr = NULL;
815 pxframe->pxmitbuf = NULL;
816 pxframe->attrib.psta = NULL;
817 pxframe->pkt = NULL;
818 }
819 spin_unlock_irqrestore(&pfree_xmit_queue->lock, irqL);
820 return pxframe;
821}
822
823void r8712_free_xmitframe(struct xmit_priv *pxmitpriv,
824 struct xmit_frame *pxmitframe)
825{
826 unsigned long irqL;
827 struct __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
828 struct _adapter *padapter = pxmitpriv->adapter;
829
830 if (pxmitframe == NULL)
831 return;
832 if (pxmitframe->pkt)
833 r8712_xmit_complete(padapter, pxmitframe);
834 spin_lock_irqsave(&pfree_xmit_queue->lock, irqL);
835 list_delete(&pxmitframe->list);
836 list_insert_tail(&pxmitframe->list, get_list_head(pfree_xmit_queue));
837 pxmitpriv->free_xmitframe_cnt++;
838 spin_unlock_irqrestore(&pfree_xmit_queue->lock, irqL);
839 if (netif_queue_stopped(padapter->pnetdev))
840 netif_wake_queue(padapter->pnetdev);
841}
842
843void r8712_free_xmitframe_ex(struct xmit_priv *pxmitpriv,
844 struct xmit_frame *pxmitframe)
845{
846 if (pxmitframe == NULL)
847 return;
848 if (pxmitframe->frame_tag == DATA_FRAMETAG)
849 r8712_free_xmitframe(pxmitpriv, pxmitframe);
850}
851
852void r8712_free_xmitframe_queue(struct xmit_priv *pxmitpriv,
853 struct __queue *pframequeue)
854{
855 unsigned long irqL;
856 struct list_head *plist, *phead;
857 struct xmit_frame *pxmitframe;
858
859 spin_lock_irqsave(&(pframequeue->lock), irqL);
860 phead = get_list_head(pframequeue);
861 plist = get_next(phead);
862 while (end_of_queue_search(phead, plist) == false) {
863 pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
864 plist = get_next(plist);
865 r8712_free_xmitframe(pxmitpriv, pxmitframe);
866 }
867 spin_unlock_irqrestore(&(pframequeue->lock), irqL);
868}
869
870static inline struct tx_servq *get_sta_pending(struct _adapter *padapter,
871 struct __queue **ppstapending,
872 struct sta_info *psta, sint up)
873{
874
875 struct tx_servq *ptxservq;
876 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
877
878 switch (up) {
879 case 1:
880 case 2:
881 ptxservq = &(psta->sta_xmitpriv.bk_q);
882 *ppstapending = &padapter->xmitpriv.bk_pending;
883 (phwxmits+3)->accnt++;
884 break;
885 case 4:
886 case 5:
887 ptxservq = &(psta->sta_xmitpriv.vi_q);
888 *ppstapending = &padapter->xmitpriv.vi_pending;
889 (phwxmits+1)->accnt++;
890 break;
891 case 6:
892 case 7:
893 ptxservq = &(psta->sta_xmitpriv.vo_q);
894 *ppstapending = &padapter->xmitpriv.vo_pending;
895 (phwxmits+0)->accnt++;
896 break;
897 case 0:
898 case 3:
899 default:
900 ptxservq = &(psta->sta_xmitpriv.be_q);
901 *ppstapending = &padapter->xmitpriv.be_pending;
902 (phwxmits + 2)->accnt++;
903 break;
904 }
905 return ptxservq;
906}
907
908/*
909 * Will enqueue pxmitframe to the proper queue, and indicate it
910 * to xx_pending list.....
911 */
912sint r8712_xmit_classifier(struct _adapter *padapter,
913 struct xmit_frame *pxmitframe)
914{
915 unsigned long irqL0;
916 struct __queue *pstapending;
917 struct sta_info *psta;
918 struct tx_servq *ptxservq;
919 struct pkt_attrib *pattrib = &pxmitframe->attrib;
920 struct sta_priv *pstapriv = &padapter->stapriv;
921 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
922 sint bmcst = IS_MCAST(pattrib->ra);
923
924 if (pattrib->psta)
925 psta = pattrib->psta;
926 else {
927 if (bmcst)
928 psta = r8712_get_bcmc_stainfo(padapter);
929 else {
930 if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true)
931 psta = r8712_get_stainfo(pstapriv,
932 get_bssid(pmlmepriv));
933 else
934 psta = r8712_get_stainfo(pstapriv, pattrib->ra);
935 }
936 }
937 if (psta == NULL)
938 return _FAIL;
939 ptxservq = get_sta_pending(padapter, &pstapending,
940 psta, pattrib->priority);
941 spin_lock_irqsave(&pstapending->lock, irqL0);
942 if (is_list_empty(&ptxservq->tx_pending))
943 list_insert_tail(&ptxservq->tx_pending,
944 get_list_head(pstapending));
945 list_insert_tail(&pxmitframe->list,
946 get_list_head(&ptxservq->sta_pending));
947 ptxservq->qcnt++;
948 spin_unlock_irqrestore(&pstapending->lock, irqL0);
949 return _SUCCESS;
950}
951
952static void alloc_hwxmits(struct _adapter *padapter)
953{
954 struct hw_xmit *hwxmits;
955 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
956
957 pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
958 pxmitpriv->hwxmits = (struct hw_xmit *)_malloc(sizeof(struct hw_xmit) *
959 pxmitpriv->hwxmit_entry);
960 if (pxmitpriv->hwxmits == NULL)
961 return;
962 hwxmits = pxmitpriv->hwxmits;
963 if (pxmitpriv->hwxmit_entry == 5) {
964 pxmitpriv->bmc_txqueue.head = 0;
965 hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue;
966 hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
967 pxmitpriv->vo_txqueue.head = 0;
968 hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue;
969 hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
970 pxmitpriv->vi_txqueue.head = 0;
971 hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue;
972 hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
973 pxmitpriv->bk_txqueue.head = 0;
974 hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
975 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
976 pxmitpriv->be_txqueue.head = 0;
977 hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue;
978 hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
979 } else if (pxmitpriv->hwxmit_entry == 4) {
980 pxmitpriv->vo_txqueue.head = 0;
981 hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue;
982 hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
983 pxmitpriv->vi_txqueue.head = 0;
984 hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue;
985 hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
986 pxmitpriv->be_txqueue.head = 0;
987 hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue;
988 hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
989 pxmitpriv->bk_txqueue.head = 0;
990 hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
991 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
992 }
993}
994
995static void free_hwxmits(struct _adapter *padapter)
996{
997 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
998
999 if (pxmitpriv->hwxmits)
1000 kfree((u8 *)pxmitpriv->hwxmits);
1001}
1002
1003static void init_hwxmits(struct hw_xmit *phwxmit, sint entry)
1004{
1005 sint i;
1006
1007 for (i = 0; i < entry; i++, phwxmit++) {
1008 spin_lock_init(&phwxmit->xmit_lock);
1009 _init_listhead(&phwxmit->pending);
1010 phwxmit->txcmdcnt = 0;
1011 phwxmit->accnt = 0;
1012 }
1013}
1014
1015/*
1016 * tx_action == 0 == no frames to transmit
1017 * tx_action > 0 ==> we have frames to transmit
1018 * tx_action < 0 ==> we have frames to transmit, but TXFF is not even enough
1019 * to transmit 1 frame.
1020 */
1021
1022int r8712_pre_xmit(struct _adapter *padapter, struct xmit_frame *pxmitframe)
1023{
1024 unsigned long irqL;
1025 int ret;
1026 struct xmit_buf *pxmitbuf = NULL;
1027 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1028 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1029
1030 r8712_do_queue_select(padapter, pattrib);
1031 spin_lock_irqsave(&pxmitpriv->lock, irqL);
1032 if (r8712_txframes_sta_ac_pending(padapter, pattrib) > 0) {
1033 ret = false;
1034 r8712_xmit_enqueue(padapter, pxmitframe);
1035 spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
1036 return ret;
1037 }
1038 pxmitbuf = r8712_alloc_xmitbuf(pxmitpriv);
1039 if (pxmitbuf == NULL) { /*enqueue packet*/
1040 ret = false;
1041 r8712_xmit_enqueue(padapter, pxmitframe);
1042 spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
1043 } else { /*dump packet directly*/
1044 spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
1045 ret = true;
1046 pxmitframe->pxmitbuf = pxmitbuf;
1047 pxmitframe->pxmit_urb[0] = pxmitbuf->pxmit_urb[0];
1048 pxmitframe->buf_addr = pxmitbuf->pbuf;
1049 r8712_xmit_direct(padapter, pxmitframe);
1050 }
1051 return ret;
1052}
diff --git a/drivers/staging/rtl8712/rtl871x_xmit.h b/drivers/staging/rtl8712/rtl871x_xmit.h
new file mode 100644
index 00000000000..d518ce85585
--- /dev/null
+++ b/drivers/staging/rtl8712/rtl871x_xmit.h
@@ -0,0 +1,260 @@
1#ifndef _RTL871X_XMIT_H_
2#define _RTL871X_XMIT_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include "xmit_osdep.h"
7
8#define MAX_XMITBUF_SZ (2048)
9#define NR_XMITBUFF (4)
10#define XMITBUF_ALIGN_SZ 512
11#define TX_GUARD_BAND 5
12#define MAX_NUMBLKS (1)
13
14/* Fixed the Big Endian bug when using the software driver encryption.*/
15#define WEP_IV(pattrib_iv, txpn, keyidx)\
16do { \
17 pattrib_iv[0] = txpn._byte_.TSC0;\
18 pattrib_iv[1] = txpn._byte_.TSC1;\
19 pattrib_iv[2] = txpn._byte_.TSC2;\
20 pattrib_iv[3] = ((keyidx & 0x3)<<6);\
21 txpn.val = (txpn.val == 0xffffff) ? 0 : (txpn.val+1);\
22} while (0)
23
24/* Fixed the Big Endian bug when doing the Tx.
25 * The Linksys WRH54G will check this.*/
26#define TKIP_IV(pattrib_iv, txpn, keyidx)\
27do { \
28 pattrib_iv[0] = txpn._byte_.TSC1;\
29 pattrib_iv[1] = (txpn._byte_.TSC1 | 0x20) & 0x7f;\
30 pattrib_iv[2] = txpn._byte_.TSC0;\
31 pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
32 pattrib_iv[4] = txpn._byte_.TSC2;\
33 pattrib_iv[5] = txpn._byte_.TSC3;\
34 pattrib_iv[6] = txpn._byte_.TSC4;\
35 pattrib_iv[7] = txpn._byte_.TSC5;\
36 txpn.val = txpn.val == 0xffffffffffffULL ? 0 : \
37 (txpn.val+1);\
38} while (0)
39
40#define AES_IV(pattrib_iv, txpn, keyidx)\
41do { \
42 pattrib_iv[0] = txpn._byte_.TSC0;\
43 pattrib_iv[1] = txpn._byte_.TSC1;\
44 pattrib_iv[2] = 0;\
45 pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
46 pattrib_iv[4] = txpn._byte_.TSC2;\
47 pattrib_iv[5] = txpn._byte_.TSC3;\
48 pattrib_iv[6] = txpn._byte_.TSC4;\
49 pattrib_iv[7] = txpn._byte_.TSC5;\
50 txpn.val = txpn.val == 0xffffffffffffULL ? 0 : \
51 (txpn.val+1);\
52} while (0)
53
54struct hw_xmit {
55 spinlock_t xmit_lock;
56 struct list_head pending;
57 struct __queue *sta_queue;
58 struct hw_txqueue *phwtxqueue;
59 sint txcmdcnt;
60 int accnt;
61};
62
63struct pkt_attrib {
64 u8 type;
65 u8 subtype;
66 u8 bswenc;
67 u8 dhcp_pkt;
68
69 u16 seqnum;
70 u16 ether_type;
71 u32 pktlen; /* the original 802.3 pkt raw_data len
72 * (not include ether_hdr data) */
73 u32 last_txcmdsz;
74
75 u8 pkt_hdrlen; /*the original 802.3 pkt header len*/
76 u8 hdrlen; /*the WLAN Header Len*/
77 u8 nr_frags;
78 u8 ack_policy;
79 u8 mac_id;
80 u8 vcs_mode; /*virtual carrier sense method*/
81 u8 pctrl;/*per packet txdesc control enable*/
82 u8 qsel;
83
84 u8 priority;
85 u8 encrypt; /* when 0 indicate no encrypt. when non-zero,
86 * indicate the encrypt algorith*/
87 u8 iv_len;
88 u8 icv_len;
89 unsigned char iv[8];
90 unsigned char icv[8];
91 u8 dst[ETH_ALEN];
92 u8 src[ETH_ALEN];
93 u8 ta[ETH_ALEN];
94 u8 ra[ETH_ALEN];
95 struct sta_info *psta;
96};
97
98#define WLANHDR_OFFSET 64
99#define DATA_FRAMETAG 0x01
100#define L2_FRAMETAG 0x02
101#define MGNT_FRAMETAG 0x03
102#define AMSDU_FRAMETAG 0x04
103#define EII_FRAMETAG 0x05
104#define IEEE8023_FRAMETAG 0x06
105#define MP_FRAMETAG 0x07
106#define TXAGG_FRAMETAG 0x08
107
108struct xmit_buf {
109 struct list_head list;
110
111 u8 *pallocated_buf;
112 u8 *pbuf;
113 struct urb *pxmit_urb[8];
114};
115
116struct xmit_frame {
117 struct list_head list;
118 struct pkt_attrib attrib;
119 _pkt *pkt;
120 int frame_tag;
121 struct _adapter *padapter;
122 u8 *buf_addr;
123 struct xmit_buf *pxmitbuf;
124 u8 *mem_addr;
125 u16 sz[8];
126 struct urb *pxmit_urb[8];
127 u8 bpending[8];
128 u8 last[8];
129};
130
131struct tx_servq {
132 struct list_head tx_pending;
133 struct __queue sta_pending;
134 int qcnt;
135};
136
137struct sta_xmit_priv {
138 spinlock_t lock;
139 sint option;
140 sint apsd_setting; /* When bit mask is on, the associated edca
141 * queue supports APSD.*/
142 struct tx_servq be_q; /* priority == 0,3 */
143 struct tx_servq bk_q; /* priority == 1,2*/
144 struct tx_servq vi_q; /*priority == 4,5*/
145 struct tx_servq vo_q; /*priority == 6,7*/
146 struct list_head legacy_dz;
147 struct list_head apsd;
148 u16 txseq_tid[16];
149 uint sta_tx_bytes;
150 u64 sta_tx_pkts;
151 uint sta_tx_fail;
152};
153
154struct hw_txqueue {
155 /*volatile*/ sint head;
156 /*volatile*/ sint tail;
157 /*volatile*/ sint free_sz; /*in units of 64 bytes*/
158 /*volatile*/ sint free_cmdsz;
159 /*volatile*/ sint txsz[8];
160 uint ff_hwaddr;
161 uint cmd_hwaddr;
162 sint ac_tag;
163};
164
165struct xmit_priv {
166 spinlock_t lock;
167 struct semaphore xmit_sema;
168 struct semaphore terminate_xmitthread_sema;
169 struct __queue be_pending;
170 struct __queue bk_pending;
171 struct __queue vi_pending;
172 struct __queue vo_pending;
173 struct __queue bm_pending;
174 struct __queue legacy_dz_queue;
175 struct __queue apsd_queue;
176 u8 *pallocated_frame_buf;
177 u8 *pxmit_frame_buf;
178 uint free_xmitframe_cnt;
179 uint mapping_addr;
180 uint pkt_sz;
181 struct __queue free_xmit_queue;
182 struct hw_txqueue be_txqueue;
183 struct hw_txqueue bk_txqueue;
184 struct hw_txqueue vi_txqueue;
185 struct hw_txqueue vo_txqueue;
186 struct hw_txqueue bmc_txqueue;
187 uint frag_len;
188 struct _adapter *adapter;
189 u8 vcs_setting;
190 u8 vcs;
191 u8 vcs_type;
192 u16 rts_thresh;
193 uint tx_bytes;
194 u64 tx_pkts;
195 uint tx_drop;
196 struct hw_xmit *hwxmits;
197 u8 hwxmit_entry;
198 struct semaphore tx_retevt;/*all tx return event;*/
199 u8 txirp_cnt;
200 struct tasklet_struct xmit_tasklet;
201 /*per AC pending irp*/
202 int beq_cnt;
203 int bkq_cnt;
204 int viq_cnt;
205 int voq_cnt;
206 struct __queue free_amsdu_xmit_queue;
207 u8 *pallocated_amsdu_frame_buf;
208 u8 *pxmit_amsdu_frame_buf;
209 uint free_amsdu_xmitframe_cnt;
210 struct __queue free_txagg_xmit_queue;
211 u8 *pallocated_txagg_frame_buf;
212 u8 *pxmit_txagg_frame_buf;
213 uint free_txagg_xmitframe_cnt;
214 int cmdseq;
215 struct __queue free_xmitbuf_queue;
216 struct __queue pending_xmitbuf_queue;
217 u8 *pallocated_xmitbuf;
218 u8 *pxmitbuf;
219 uint free_xmitbuf_cnt;
220};
221
222static inline struct __queue *get_free_xmit_queue(
223 struct xmit_priv *pxmitpriv)
224{
225 return &(pxmitpriv->free_xmit_queue);
226}
227
228int r8712_free_xmitbuf(struct xmit_priv *pxmitpriv,
229 struct xmit_buf *pxmitbuf);
230struct xmit_buf *r8712_alloc_xmitbuf(struct xmit_priv *pxmitpriv);
231void r8712_update_protection(struct _adapter *padapter, u8 *ie, uint ie_len);
232struct xmit_frame *r8712_alloc_xmitframe(struct xmit_priv *pxmitpriv);
233void r8712_free_xmitframe(struct xmit_priv *pxmitpriv,
234 struct xmit_frame *pxmitframe);
235void r8712_free_xmitframe_queue(struct xmit_priv *pxmitpriv,
236 struct __queue *pframequeue);
237sint r8712_xmit_classifier(struct _adapter *padapter,
238 struct xmit_frame *pxmitframe);
239sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,
240 struct xmit_frame *pxmitframe);
241sint _r8712_init_hw_txqueue(struct hw_txqueue *phw_txqueue, u8 ac_tag);
242void _r8712_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv);
243sint r8712_update_attrib(struct _adapter *padapter, _pkt *pkt,
244 struct pkt_attrib *pattrib);
245int r8712_txframes_sta_ac_pending(struct _adapter *padapter,
246 struct pkt_attrib *pattrib);
247sint _r8712_init_xmit_priv(struct xmit_priv *pxmitpriv, struct _adapter *padapter);
248void _free_xmit_priv(struct xmit_priv *pxmitpriv);
249void r8712_free_xmitframe_ex(struct xmit_priv *pxmitpriv,
250 struct xmit_frame *pxmitframe);
251int r8712_pre_xmit(struct _adapter *padapter, struct xmit_frame *pxmitframe);
252int r8712_xmit_enqueue(struct _adapter *padapter,
253 struct xmit_frame *pxmitframe);
254int r8712_xmit_direct(struct _adapter *padapter, struct xmit_frame *pxmitframe);
255void r8712_xmit_bh(void *priv);
256
257#include "rtl8712_xmit.h"
258
259#endif /*_RTL871X_XMIT_H_*/
260
diff --git a/drivers/staging/rtl8712/sta_info.h b/drivers/staging/rtl8712/sta_info.h
new file mode 100644
index 00000000000..79ad1593214
--- /dev/null
+++ b/drivers/staging/rtl8712/sta_info.h
@@ -0,0 +1,125 @@
1#ifndef __STA_INFO_H_
2#define __STA_INFO_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include "wifi.h"
7
8#define NUM_STA 32
9#define NUM_ACL 64
10
11
12/* if mode ==0, then the sta is allowed once the addr is hit.
13 * if mode ==1, then the sta is rejected once the addr is non-hit.
14 */
15struct wlan_acl_node {
16 struct list_head list;
17 u8 addr[ETH_ALEN];
18 u8 mode;
19};
20
21struct wlan_acl_pool {
22 struct wlan_acl_node aclnode[NUM_ACL];
23};
24
25struct stainfo_stats {
26
27 uint rx_pkts;
28 uint rx_bytes;
29 u64 tx_pkts;
30 uint tx_bytes;
31};
32
33struct sta_info {
34 spinlock_t lock;
35 struct list_head list; /*free_sta_queue*/
36 struct list_head hash_list; /*sta_hash*/
37 struct sta_xmit_priv sta_xmitpriv;
38 struct sta_recv_priv sta_recvpriv;
39 uint state;
40 uint aid;
41 u8 mac_id;
42 u8 qos_option;
43 u8 hwaddr[ETH_ALEN];
44 uint ieee8021x_blocked; /*0: allowed, 1:blocked */
45 uint XPrivacy; /*aes, tkip...*/
46 union Keytype tkiptxmickey;
47 union Keytype tkiprxmickey;
48 union Keytype x_UncstKey;
49 union pn48 txpn; /* PN48 used for Unicast xmit.*/
50 union pn48 rxpn; /* PN48 used for Unicast recv.*/
51 u8 bssrateset[16];
52 uint bssratelen;
53 s32 rssi;
54 s32 signal_quality;
55 struct stainfo_stats sta_stats;
56 /*for A-MPDU Rx reordering buffer control */
57 struct recv_reorder_ctrl recvreorder_ctrl[16];
58 struct ht_priv htpriv;
59 /* Notes:
60 * STA_Mode:
61 * curr_network(mlme_priv/security_priv/qos/ht)
62 * + sta_info: (STA & AP) CAP/INFO
63 * scan_q: AP CAP/INFO
64 * AP_Mode:
65 * curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO
66 * sta_info: (AP & STA) CAP/INFO
67 */
68#ifdef CONFIG_R8712_AP
69 struct list_head asoc_list;
70 struct list_head auth_list;
71 unsigned int expire_to;
72 unsigned int auth_seq;
73 unsigned int authalg;
74 unsigned char chg_txt[128];
75 unsigned int tx_ra_bitmap;
76#endif
77};
78
79struct sta_priv {
80 u8 *pallocated_stainfo_buf;
81 u8 *pstainfo_buf;
82 struct __queue free_sta_queue;
83 spinlock_t sta_hash_lock;
84 struct list_head sta_hash[NUM_STA];
85 int asoc_sta_count;
86 struct __queue sleep_q;
87 struct __queue wakeup_q;
88 struct _adapter *padapter;
89#ifdef CONFIG_R8712_AP
90 struct list_head asoc_list;
91 struct list_head auth_list;
92 unsigned int auth_to; /* sec, time to expire in authenticating. */
93 unsigned int assoc_to; /* sec, time to expire before associating. */
94 unsigned int expire_to; /* sec , time to expire after associated. */
95#endif
96};
97
98static inline u32 wifi_mac_hash(u8 *mac)
99{
100 u32 x;
101
102 x = mac[0];
103 x = (x << 2) ^ mac[1];
104 x = (x << 2) ^ mac[2];
105 x = (x << 2) ^ mac[3];
106 x = (x << 2) ^ mac[4];
107 x = (x << 2) ^ mac[5];
108 x ^= x >> 8;
109 x = x & (NUM_STA - 1);
110 return x;
111}
112
113u32 _r8712_init_sta_priv(struct sta_priv *pstapriv);
114u32 _r8712_free_sta_priv(struct sta_priv *pstapriv);
115struct sta_info *r8712_alloc_stainfo(struct sta_priv *pstapriv,
116 u8 *hwaddr);
117void r8712_free_stainfo(struct _adapter *padapter , struct sta_info *psta);
118void r8712_free_all_stainfo(struct _adapter *padapter);
119struct sta_info *r8712_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr);
120void r8712_init_bcmc_stainfo(struct _adapter *padapter);
121struct sta_info *r8712_get_bcmc_stainfo(struct _adapter *padapter);
122u8 r8712_access_ctrl(struct wlan_acl_pool *pacl_list, u8 * mac_addr);
123
124#endif /* _STA_INFO_H_ */
125
diff --git a/drivers/staging/rtl8712/swab.h b/drivers/staging/rtl8712/swab.h
new file mode 100644
index 00000000000..44709a91baf
--- /dev/null
+++ b/drivers/staging/rtl8712/swab.h
@@ -0,0 +1,106 @@
1#ifndef _LINUX_BYTEORDER_SWAB_H
2#define _LINUX_BYTEORDER_SWAB_H
3
4#ifndef __u16
5 #define __u16 unsigned short
6#endif
7
8#ifndef __u32
9 #define __u32 unsigned int
10#endif
11
12#ifndef __u8
13 #define __u8 unsigned char
14#endif
15
16#ifndef __u64
17 #define __u64 unsigned long long
18#endif
19
20
21static inline __u16 ___swab16(__u16 x)
22{
23 __u16 __x = x;
24 return (__u16)(
25 (((__u16)(__x) & (__u16)0x00ffU) << 8) |
26 (((__u16)(__x) & (__u16)0xff00U) >> 8));
27
28}
29
30static inline __u32 ___swab32(__u32 x)
31{
32 __u32 __x = (x);
33 return (__u32)(
34 (((__u32)(__x) & (__u32)0x000000ffUL) << 24) |
35 (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) |
36 (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) |
37 (((__u32)(__x) & (__u32)0xff000000UL) >> 24));
38}
39
40static inline __u64 ___swab64(__u64 x)
41{
42 __u64 __x = (x);
43
44 return (__u64)( \
45 (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \
46 (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \
47 (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \
48 (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \
49 (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \
50 (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \
51 (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \
52 (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56));
53}
54
55#ifndef __arch__swab16
56static inline __u16 __arch__swab16(__u16 x)
57{
58 return ___swab16(x);
59}
60
61#endif
62
63#ifndef __arch__swab32
64static inline __u32 __arch__swab32(__u32 x)
65{
66 __u32 __tmp = (x) ;
67 return ___swab32(__tmp);
68}
69#endif
70
71#ifndef __arch__swab64
72
73static inline __u64 __arch__swab64(__u64 x)
74{
75 __u64 __tmp = (x) ;
76 return ___swab64(__tmp);
77}
78
79
80#endif
81
82#define __swab16(x) __fswab16(x)
83#define __swab32(x) __fswab32(x)
84#define __swab64(x) __fswab64(x)
85
86static inline const __u16 __fswab16(__u16 x)
87{
88 return __arch__swab16(x);
89}
90static inline const __u32 __fswab32(__u32 x)
91{
92 return __arch__swab32(x);
93}
94
95#define swab16 __swab16
96#define swab32 __swab32
97#define swab64 __swab64
98#define swab16p __swab16p
99#define swab32p __swab32p
100#define swab64p __swab64p
101#define swab16s __swab16s
102#define swab32s __swab32s
103#define swab64s __swab64s
104
105#endif /* _LINUX_BYTEORDER_SWAB_H */
106
diff --git a/drivers/staging/rtl8712/usb_halinit.c b/drivers/staging/rtl8712/usb_halinit.c
new file mode 100644
index 00000000000..f6569dce301
--- /dev/null
+++ b/drivers/staging/rtl8712/usb_halinit.c
@@ -0,0 +1,317 @@
1/******************************************************************************
2 * usb_halinit.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _HCI_HAL_INIT_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "usb_ops.h"
34#include "usb_osintf.h"
35
36u8 r8712_usb_hal_bus_init(struct _adapter *padapter)
37{
38 u8 val8 = 0;
39 u8 ret = _SUCCESS;
40 u8 PollingCnt = 20;
41 struct registry_priv *pregistrypriv = &padapter->registrypriv;
42
43 if (pregistrypriv->chip_version == RTL8712_FPGA) {
44 val8 = 0x01;
45 /* switch to 80M clock */
46 r8712_write8(padapter, SYS_CLKR, val8);
47 val8 = r8712_read8(padapter, SPS1_CTRL);
48 val8 = val8 | 0x01;
49 /* enable VSPS12 LDO Macro block */
50 r8712_write8(padapter, SPS1_CTRL, val8);
51 val8 = r8712_read8(padapter, AFE_MISC);
52 val8 = val8 | 0x01;
53 /* Enable AFE Macro Block's Bandgap */
54 r8712_write8(padapter, AFE_MISC, val8);
55 val8 = r8712_read8(padapter, LDOA15_CTRL);
56 val8 = val8 | 0x01;
57 /* enable LDOA15 block */
58 r8712_write8(padapter, LDOA15_CTRL, val8);
59 val8 = r8712_read8(padapter, SPS1_CTRL);
60 val8 = val8 | 0x02;
61 /* Enable VSPS12_SW Macro Block */
62 r8712_write8(padapter, SPS1_CTRL, val8);
63 val8 = r8712_read8(padapter, AFE_MISC);
64 val8 = val8 | 0x02;
65 /* Enable AFE Macro Block's Mbias */
66 r8712_write8(padapter, AFE_MISC, val8);
67 val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
68 val8 = val8 | 0x08;
69 /* isolate PCIe Analog 1.2V to PCIe 3.3V and PCIE Digital */
70 r8712_write8(padapter, SYS_ISO_CTRL + 1, val8);
71 val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
72 val8 = val8 & 0xEF;
73 /* attatch AFE PLL to MACTOP/BB/PCIe Digital */
74 r8712_write8(padapter, SYS_ISO_CTRL + 1, val8);
75 val8 = r8712_read8(padapter, AFE_XTAL_CTRL + 1);
76 val8 = val8 & 0xFB;
77 /* enable AFE clock */
78 r8712_write8(padapter, AFE_XTAL_CTRL + 1, val8);
79 val8 = r8712_read8(padapter, AFE_PLL_CTRL);
80 val8 = val8 | 0x01;
81 /* Enable AFE PLL Macro Block */
82 r8712_write8(padapter, AFE_PLL_CTRL, val8);
83 val8 = 0xEE;
84 /* release isolation AFE PLL & MD */
85 r8712_write8(padapter, SYS_ISO_CTRL, val8);
86 val8 = r8712_read8(padapter, SYS_CLKR + 1);
87 val8 = val8 | 0x08;
88 /* enable MAC clock */
89 r8712_write8(padapter, SYS_CLKR + 1, val8);
90 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
91 val8 = val8 | 0x08;
92 /* enable Core digital and enable IOREG R/W */
93 r8712_write8(padapter, SYS_FUNC_EN + 1, val8);
94 val8 = val8 | 0x80;
95 /* enable REG_EN */
96 r8712_write8(padapter, SYS_FUNC_EN + 1, val8);
97 val8 = r8712_read8(padapter, SYS_CLKR + 1);
98 val8 = (val8 | 0x80) & 0xBF;
99 /* switch the control path */
100 r8712_write8(padapter, SYS_CLKR + 1, val8);
101 val8 = 0xFC;
102 r8712_write8(padapter, CR, val8);
103 val8 = 0x37;
104 r8712_write8(padapter, CR + 1, val8);
105 /* reduce EndPoint & init it */
106 r8712_write8(padapter, 0x102500ab, r8712_read8(padapter,
107 0x102500ab) | BIT(6) | BIT(7));
108 /* consideration of power consumption - init */
109 r8712_write8(padapter, 0x10250008, r8712_read8(padapter,
110 0x10250008) & 0xfffffffb);
111 } else if (pregistrypriv->chip_version == RTL8712_1stCUT) {
112 /* Initialization for power on sequence, */
113 r8712_write8(padapter, SPS0_CTRL + 1, 0x53);
114 r8712_write8(padapter, SPS0_CTRL, 0x57);
115 /* Enable AFE Macro Block's Bandgap adn Enable AFE Macro
116 * Block's Mbias
117 */
118 val8 = r8712_read8(padapter, AFE_MISC);
119 r8712_write8(padapter, AFE_MISC, (val8 | AFE_MISC_BGEN |
120 AFE_MISC_MBEN));
121 /* Enable LDOA15 block */
122 val8 = r8712_read8(padapter, LDOA15_CTRL);
123 r8712_write8(padapter, LDOA15_CTRL, (val8 | LDA15_EN));
124 val8 = r8712_read8(padapter, SPS1_CTRL);
125 r8712_write8(padapter, SPS1_CTRL, (val8 | SPS1_LDEN));
126 msleep(20);
127 /* Enable Switch Regulator Block */
128 val8 = r8712_read8(padapter, SPS1_CTRL);
129 r8712_write8(padapter, SPS1_CTRL, (val8 | SPS1_SWEN));
130 r8712_write32(padapter, SPS1_CTRL, 0x00a7b267);
131 val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
132 r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 | 0x08));
133 /* Engineer Packet CP test Enable */
134 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
135 r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x20));
136 val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
137 r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 & 0x6F));
138 /* Enable AFE clock */
139 val8 = r8712_read8(padapter, AFE_XTAL_CTRL + 1);
140 r8712_write8(padapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb));
141 /* Enable AFE PLL Macro Block */
142 val8 = r8712_read8(padapter, AFE_PLL_CTRL);
143 r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x11));
144 /* Attatch AFE PLL to MACTOP/BB/PCIe Digital */
145 val8 = r8712_read8(padapter, SYS_ISO_CTRL);
146 r8712_write8(padapter, SYS_ISO_CTRL, (val8 & 0xEE));
147 /* Switch to 40M clock */
148 val8 = r8712_read8(padapter, SYS_CLKR);
149 r8712_write8(padapter, SYS_CLKR, val8 & (~SYS_CLKSEL));
150 /* SSC Disable */
151 val8 = r8712_read8(padapter, SYS_CLKR);
152 /* Enable MAC clock */
153 val8 = r8712_read8(padapter, SYS_CLKR + 1);
154 r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x18));
155 /* Revised POS, */
156 r8712_write8(padapter, PMC_FSM, 0x02);
157 /* Enable Core digital and enable IOREG R/W */
158 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
159 r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x08));
160 /* Enable REG_EN */
161 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
162 r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x80));
163 /* Switch the control path to FW */
164 val8 = r8712_read8(padapter, SYS_CLKR + 1);
165 r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF);
166 r8712_write8(padapter, CR, 0xFC);
167 r8712_write8(padapter, CR + 1, 0x37);
168 /* Fix the RX FIFO issue(usb error), */
169 val8 = r8712_read8(padapter, 0x1025FE5c);
170 r8712_write8(padapter, 0x1025FE5c, (val8|BIT(7)));
171 val8 = r8712_read8(padapter, 0x102500ab);
172 r8712_write8(padapter, 0x102500ab, (val8|BIT(6)|BIT(7)));
173 /* For power save, used this in the bit file after 970621 */
174 val8 = r8712_read8(padapter, SYS_CLKR);
175 r8712_write8(padapter, SYS_CLKR, val8&(~CPU_CLKSEL));
176 } else if (pregistrypriv->chip_version == RTL8712_2ndCUT ||
177 pregistrypriv->chip_version == RTL8712_3rdCUT) {
178 /* Initialization for power on sequence,
179 * E-Fuse leakage prevention sequence
180 */
181 r8712_write8(padapter, 0x37, 0xb0);
182 msleep(20);
183 r8712_write8(padapter, 0x37, 0x30);
184 /* Set control path switch to HW control and reset Digital Core,
185 * CPU Core and MAC I/O to solve FW download fail when system
186 * from resume sate.
187 */
188 val8 = r8712_read8(padapter, SYS_CLKR + 1);
189 if (val8 & 0x80) {
190 val8 &= 0x3f;
191 r8712_write8(padapter, SYS_CLKR + 1, val8);
192 }
193 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
194 val8 &= 0x73;
195 r8712_write8(padapter, SYS_FUNC_EN + 1, val8);
196 msleep(20);
197 /* Revised POS, */
198 /* Enable AFE Macro Block's Bandgap and Enable AFE Macro
199 * Block's Mbias */
200 r8712_write8(padapter, SPS0_CTRL + 1, 0x53);
201 r8712_write8(padapter, SPS0_CTRL, 0x57);
202 val8 = r8712_read8(padapter, AFE_MISC);
203 /*Bandgap*/
204 r8712_write8(padapter, AFE_MISC, (val8 | AFE_MISC_BGEN));
205 r8712_write8(padapter, AFE_MISC, (val8 | AFE_MISC_BGEN |
206 AFE_MISC_MBEN | AFE_MISC_I32_EN));
207 /* Enable PLL Power (LDOA15V) */
208 val8 = r8712_read8(padapter, LDOA15_CTRL);
209 r8712_write8(padapter, LDOA15_CTRL, (val8 | LDA15_EN));
210 /* Enable LDOV12D block */
211 val8 = r8712_read8(padapter, LDOV12D_CTRL);
212 r8712_write8(padapter, LDOV12D_CTRL, (val8 | LDV12_EN));
213 val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
214 r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 | 0x08));
215 /* Engineer Packet CP test Enable */
216 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
217 r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x20));
218 /* Support 64k IMEM */
219 val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
220 r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 & 0x68));
221 /* Enable AFE clock */
222 val8 = r8712_read8(padapter, AFE_XTAL_CTRL + 1);
223 r8712_write8(padapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb));
224 /* Enable AFE PLL Macro Block */
225 val8 = r8712_read8(padapter, AFE_PLL_CTRL);
226 r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x11));
227 /* Some sample will download fw failure. The clock will be
228 * stable with 500 us delay after reset the PLL
229 * TODO: When usleep is added to kernel, change next 3
230 * udelay(500) to usleep(500)
231 */
232 udelay(500);
233 r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x51));
234 udelay(500);
235 r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x11));
236 udelay(500);
237 /* Attatch AFE PLL to MACTOP/BB/PCIe Digital */
238 val8 = r8712_read8(padapter, SYS_ISO_CTRL);
239 r8712_write8(padapter, SYS_ISO_CTRL, (val8 & 0xEE));
240 /* Switch to 40M clock */
241 r8712_write8(padapter, SYS_CLKR, 0x00);
242 /* CPU Clock and 80M Clock SSC Disable to overcome FW download
243 * fail timing issue.
244 */
245 val8 = r8712_read8(padapter, SYS_CLKR);
246 r8712_write8(padapter, SYS_CLKR, (val8 | 0xa0));
247 /* Enable MAC clock */
248 val8 = r8712_read8(padapter, SYS_CLKR + 1);
249 r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x18));
250 /* Revised POS, */
251 r8712_write8(padapter, PMC_FSM, 0x02);
252 /* Enable Core digital and enable IOREG R/W */
253 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
254 r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x08));
255 /* Enable REG_EN */
256 val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
257 r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x80));
258 /* Switch the control path to FW */
259 val8 = r8712_read8(padapter, SYS_CLKR + 1);
260 r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF);
261 r8712_write8(padapter, CR, 0xFC);
262 r8712_write8(padapter, CR + 1, 0x37);
263 /* Fix the RX FIFO issue(usb error), 970410 */
264 val8 = r8712_read8(padapter, 0x1025FE5c);
265 r8712_write8(padapter, 0x1025FE5c, (val8 | BIT(7)));
266 /* For power save, used this in the bit file after 970621 */
267 val8 = r8712_read8(padapter, SYS_CLKR);
268 r8712_write8(padapter, SYS_CLKR, val8 & (~CPU_CLKSEL));
269 /* Revised for 8051 ROM code wrong operation. */
270 r8712_write8(padapter, 0x1025fe1c, 0x80);
271 /* To make sure that TxDMA can ready to download FW.
272 * We should reset TxDMA if IMEM RPT was not ready.
273 */
274 do {
275 val8 = r8712_read8(padapter, TCR);
276 if ((val8 & _TXDMA_INIT_VALUE) == _TXDMA_INIT_VALUE)
277 break;
278 udelay(5); /* PlatformStallExecution(5); */
279 } while (PollingCnt--); /* Delay 1ms */
280
281 if (PollingCnt <= 0) {
282 val8 = r8712_read8(padapter, CR);
283 r8712_write8(padapter, CR, val8&(~_TXDMA_EN));
284 udelay(2); /* PlatformStallExecution(2); */
285 /* Reset TxDMA */
286 r8712_write8(padapter, CR, val8|_TXDMA_EN);
287 }
288 } else
289 ret = _FAIL;
290 return ret;
291}
292
293unsigned int r8712_usb_inirp_init(struct _adapter *padapter)
294{
295 u8 i;
296 struct recv_buf *precvbuf;
297 struct intf_hdl *pintfhdl = &padapter->pio_queue->intf;
298 struct recv_priv *precvpriv = &(padapter->recvpriv);
299
300 precvpriv->ff_hwaddr = RTL8712_DMA_RX0FF; /* mapping rx fifo address */
301 /* issue Rx irp to receive data */
302 precvbuf = (struct recv_buf *)precvpriv->precv_buf;
303 for (i = 0; i < NR_RECVBUFF; i++) {
304 if (r8712_usb_read_port(pintfhdl, precvpriv->ff_hwaddr, 0,
305 (unsigned char *)precvbuf) == false)
306 return _FAIL;
307 precvbuf++;
308 precvpriv->free_recv_buf_queue_cnt--;
309 }
310 return _SUCCESS;
311}
312
313unsigned int r8712_usb_inirp_deinit(struct _adapter *padapter)
314{
315 r8712_usb_read_port_cancel(padapter);
316 return _SUCCESS;
317}
diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c
new file mode 100644
index 00000000000..9c5545269e6
--- /dev/null
+++ b/drivers/staging/rtl8712/usb_intf.c
@@ -0,0 +1,571 @@
1/******************************************************************************
2 * usb_intf.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _HCI_INTF_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "recv_osdep.h"
34#include "xmit_osdep.h"
35#include "rtl8712_efuse.h"
36#include "usb_vendor_req.h"
37#include "usb_ops.h"
38#include "usb_osintf.h"
39
40#define DRVER "v2.6.0007.20100607"
41
42static struct usb_interface *pintf;
43
44static int r871xu_drv_init(struct usb_interface *pusb_intf,
45 const struct usb_device_id *pdid);
46
47static void r871xu_dev_remove(struct usb_interface *pusb_intf);
48
49static struct usb_device_id rtl871x_usb_id_tbl[] = {
50 /*92SU
51 * Realtek */
52 {USB_DEVICE(0x0bda, 0x8171)},
53 {USB_DEVICE(0x0bda, 0x8172)},
54 {USB_DEVICE(0x0bda, 0x8173)},
55 {USB_DEVICE(0x0bda, 0x8174)},
56 {USB_DEVICE(0x0bda, 0x8712)},
57 {USB_DEVICE(0x0bda, 0x8713)},
58 {USB_DEVICE(0x0bda, 0xC512)},
59 /* Abocom */
60 {USB_DEVICE(0x07B8, 0x8188)},
61 /* Corega */
62 {USB_DEVICE(0x07aa, 0x0047)},
63 /* Dlink */
64 {USB_DEVICE(0x07d1, 0x3303)},
65 {USB_DEVICE(0x07d1, 0x3302)},
66 {USB_DEVICE(0x07d1, 0x3300)},
67 /* Dlink for Skyworth */
68 {USB_DEVICE(0x14b2, 0x3300)},
69 {USB_DEVICE(0x14b2, 0x3301)},
70 {USB_DEVICE(0x14b2, 0x3302)},
71 /* EnGenius */
72 {USB_DEVICE(0x1740, 0x9603)},
73 {USB_DEVICE(0x1740, 0x9605)},
74 /* Belkin */
75 {USB_DEVICE(0x050d, 0x815F)},
76 {USB_DEVICE(0x050d, 0x945A)},
77 {USB_DEVICE(0x050d, 0x845A)},
78 /* Guillemot */
79 {USB_DEVICE(0x06f8, 0xe031)},
80 /* Edimax */
81 {USB_DEVICE(0x7392, 0x7611)},
82 {USB_DEVICE(0x7392, 0x7612)},
83 {USB_DEVICE(0x7392, 0x7622)},
84 /* Sitecom */
85 {USB_DEVICE(0x0DF6, 0x0045)},
86 /* Hawking */
87 {USB_DEVICE(0x0E66, 0x0015)},
88 {USB_DEVICE(0x0E66, 0x0016)},
89 {USB_DEVICE(0x0b05, 0x1786)},
90 {USB_DEVICE(0x0b05, 0x1791)}, /* 11n mode disable */
91
92 {USB_DEVICE(0x13D3, 0x3306)},
93 {USB_DEVICE(0x13D3, 0x3309)},
94 {USB_DEVICE(0x13D3, 0x3310)},
95 {USB_DEVICE(0x13D3, 0x3311)}, /* 11n mode disable */
96 {USB_DEVICE(0x13D3, 0x3325)},
97 {USB_DEVICE(0x083A, 0xC512)},
98 {}
99};
100
101MODULE_DEVICE_TABLE(usb, rtl871x_usb_id_tbl);
102
103static struct specific_device_id specific_device_id_tbl[] = {
104 {.idVendor = 0x0b05, .idProduct = 0x1791,
105 .flags = SPEC_DEV_ID_DISABLE_HT},
106 {.idVendor = 0x13D3, .idProduct = 0x3311,
107 .flags = SPEC_DEV_ID_DISABLE_HT},
108 {}
109};
110
111struct drv_priv {
112 struct usb_driver r871xu_drv;
113 int drv_registered;
114};
115
116#ifdef CONFIG_PM
117static int r871x_suspend(struct usb_interface *pusb_intf, pm_message_t state)
118{
119 struct net_device *pnetdev = usb_get_intfdata(pusb_intf);
120
121 printk(KERN_INFO "r8712: suspending...\n");
122 if (!pnetdev || !netif_running(pnetdev)) {
123 printk(KERN_INFO "r8712: unable to suspend\n");
124 return 0;
125 }
126 if (pnetdev->netdev_ops->ndo_stop)
127 pnetdev->netdev_ops->ndo_stop(pnetdev);
128 mdelay(10);
129 netif_device_detach(pnetdev);
130 return 0;
131}
132
133static int r871x_resume(struct usb_interface *pusb_intf)
134{
135 struct net_device *pnetdev = usb_get_intfdata(pusb_intf);
136
137 printk(KERN_INFO "r8712: resuming...\n");
138 if (!pnetdev || !netif_running(pnetdev)) {
139 printk(KERN_INFO "r8712: unable to resume\n");
140 return 0;
141 }
142 netif_device_attach(pnetdev);
143 if (pnetdev->netdev_ops->ndo_open)
144 pnetdev->netdev_ops->ndo_open(pnetdev);
145 return 0;
146}
147
148static int r871x_reset_resume(struct usb_interface *pusb_intf)
149{
150 /* dummy routine */
151 return 0;
152}
153
154#endif
155
156static struct drv_priv drvpriv = {
157 .r871xu_drv.name = "r8712u",
158 .r871xu_drv.id_table = rtl871x_usb_id_tbl,
159 .r871xu_drv.probe = r871xu_drv_init,
160 .r871xu_drv.disconnect = r871xu_dev_remove,
161#ifdef CONFIG_PM
162 .r871xu_drv.suspend = r871x_suspend,
163 .r871xu_drv.resume = r871x_resume,
164 .r871xu_drv.reset_resume = r871x_reset_resume,
165#endif
166};
167
168static uint r8712_usb_dvobj_init(struct _adapter *padapter)
169{
170 uint status = _SUCCESS;
171 struct usb_device_descriptor *pdev_desc;
172 struct usb_host_config *phost_conf;
173 struct usb_config_descriptor *pconf_desc;
174 struct usb_host_interface *phost_iface;
175 struct usb_interface_descriptor *piface_desc;
176 struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv;
177 struct usb_device *pusbd = pdvobjpriv->pusbdev;
178
179 pdvobjpriv->padapter = padapter;
180 padapter->EepromAddressSize = 6;
181 pdev_desc = &pusbd->descriptor;
182 phost_conf = pusbd->actconfig;
183 pconf_desc = &phost_conf->desc;
184 phost_iface = &pintf->altsetting[0];
185 piface_desc = &phost_iface->desc;
186 pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints;
187 if (pusbd->speed == USB_SPEED_HIGH) {
188 pdvobjpriv->ishighspeed = true;
189 printk(KERN_INFO "r8712u: USB_SPEED_HIGH with %d endpoints\n",
190 pdvobjpriv->nr_endpoint);
191 } else {
192 pdvobjpriv->ishighspeed = false;
193 printk(KERN_INFO "r8712u: USB_SPEED_LOW with %d endpoints\n",
194 pdvobjpriv->nr_endpoint);
195 }
196 if ((r8712_alloc_io_queue(padapter)) == _FAIL)
197 status = _FAIL;
198 sema_init(&(padapter->dvobjpriv.usb_suspend_sema), 0);
199 return status;
200}
201
202static void r8712_usb_dvobj_deinit(struct _adapter *padapter)
203{
204}
205
206void rtl871x_intf_stop(struct _adapter *padapter)
207{
208 /*disable_hw_interrupt*/
209 if (padapter->bSurpriseRemoved == false) {
210 /*device still exists, so driver can do i/o operation
211 * TODO: */
212 }
213
214 /* cancel in irp */
215 if (padapter->dvobjpriv.inirp_deinit != NULL)
216 padapter->dvobjpriv.inirp_deinit(padapter);
217 /* cancel out irp */
218 r8712_usb_write_port_cancel(padapter);
219 /* TODO:cancel other irps */
220}
221
222void r871x_dev_unload(struct _adapter *padapter)
223{
224 if (padapter->bup == true) {
225 /*s1.*/
226 padapter->bDriverStopped = true;
227
228 /*s3.*/
229 rtl871x_intf_stop(padapter);
230
231 /*s4.*/
232 r8712_stop_drv_threads(padapter);
233
234 /*s5.*/
235 if (padapter->bSurpriseRemoved == false) {
236 padapter->hw_init_completed = false;
237 rtl8712_hal_deinit(padapter);
238 }
239
240 /*s6.*/
241 if (padapter->dvobj_deinit)
242 padapter->dvobj_deinit(padapter);
243 padapter->bup = false;
244 }
245}
246
247static void disable_ht_for_spec_devid(const struct usb_device_id *pdid,
248 struct _adapter *padapter)
249{
250 u16 vid, pid;
251 u32 flags;
252 int i;
253 int num = sizeof(specific_device_id_tbl) /
254 sizeof(struct specific_device_id);
255
256 for (i = 0; i < num; i++) {
257 vid = specific_device_id_tbl[i].idVendor;
258 pid = specific_device_id_tbl[i].idProduct;
259 flags = specific_device_id_tbl[i].flags;
260
261 if ((pdid->idVendor == vid) && (pdid->idProduct == pid) &&
262 (flags&SPEC_DEV_ID_DISABLE_HT)) {
263 padapter->registrypriv.ht_enable = 0;
264 padapter->registrypriv.cbw40_enable = 0;
265 padapter->registrypriv.ampdu_enable = 0;
266 }
267 }
268}
269
270static u8 key_2char2num(u8 hch, u8 lch)
271{
272 return (hex_to_bin(hch) << 4) | hex_to_bin(lch);
273}
274
275/*
276 * drv_init() - a device potentially for us
277 *
278 * notes: drv_init() is called when the bus driver has located a card for us
279 * to support. We accept the new device by returning 0.
280*/
281static int r871xu_drv_init(struct usb_interface *pusb_intf,
282 const struct usb_device_id *pdid)
283{
284 uint status;
285 struct _adapter *padapter = NULL;
286 struct dvobj_priv *pdvobjpriv;
287 struct net_device *pnetdev;
288
289 printk(KERN_INFO "r8712u: DriverVersion: %s\n", DRVER);
290 /* In this probe function, O.S. will provide the usb interface pointer
291 * to driver. We have to increase the reference count of the usb device
292 * structure by using the usb_get_dev function.
293 */
294 usb_get_dev(interface_to_usbdev(pusb_intf));
295 pintf = pusb_intf;
296 /* step 1. */
297 pnetdev = r8712_init_netdev();
298 if (!pnetdev)
299 goto error;
300 padapter = (struct _adapter *)_netdev_priv(pnetdev);
301 disable_ht_for_spec_devid(pdid, padapter);
302 pdvobjpriv = &padapter->dvobjpriv;
303 pdvobjpriv->padapter = padapter;
304 padapter->dvobjpriv.pusbdev = interface_to_usbdev(pusb_intf);
305 usb_set_intfdata(pusb_intf, pnetdev);
306 SET_NETDEV_DEV(pnetdev, &pusb_intf->dev);
307 /* step 2. */
308 padapter->dvobj_init = &r8712_usb_dvobj_init;
309 padapter->dvobj_deinit = &r8712_usb_dvobj_deinit;
310 padapter->halpriv.hal_bus_init = &r8712_usb_hal_bus_init;
311 padapter->dvobjpriv.inirp_init = &r8712_usb_inirp_init;
312 padapter->dvobjpriv.inirp_deinit = &r8712_usb_inirp_deinit;
313 /* step 3.
314 * initialize the dvobj_priv
315 */
316 if (padapter->dvobj_init == NULL)
317 goto error;
318 else {
319 status = padapter->dvobj_init(padapter);
320 if (status != _SUCCESS)
321 goto error;
322 }
323 /* step 4. */
324 status = r8712_init_drv_sw(padapter);
325 if (status == _FAIL)
326 goto error;
327 /* step 5. read efuse/eeprom data and get mac_addr */
328 {
329 int i, offset;
330 u8 mac[6];
331 u8 tmpU1b, AutoloadFail, eeprom_CustomerID;
332 u8 *pdata = padapter->eeprompriv.efuse_eeprom_data;
333
334 tmpU1b = r8712_read8(padapter, EE_9346CR);/*CR9346*/
335
336 /* To check system boot selection.*/
337 printk(KERN_INFO "r8712u: Boot from %s: Autoload %s\n",
338 (tmpU1b & _9356SEL) ? "EEPROM" : "EFUSE",
339 (tmpU1b & _EEPROM_EN) ? "OK" : "Failed");
340
341 /* To check autoload success or not.*/
342 if (tmpU1b & _EEPROM_EN) {
343 AutoloadFail = true;
344 /* The following operations prevent Efuse leakage by
345 * turning on 2.5V.
346 */
347 tmpU1b = r8712_read8(padapter, EFUSE_TEST+3);
348 r8712_write8(padapter, EFUSE_TEST + 3, tmpU1b | 0x80);
349 msleep(20);
350 r8712_write8(padapter, EFUSE_TEST + 3,
351 (tmpU1b & (~BIT(7))));
352
353 /* Retrieve Chip version.
354 * Recognize IC version by Reg0x4 BIT15.
355 */
356 tmpU1b = (u8)((r8712_read32(padapter, PMC_FSM) >> 15) &
357 0x1F);
358 if (tmpU1b == 0x3)
359 padapter->registrypriv.chip_version =
360 RTL8712_3rdCUT;
361 else
362 padapter->registrypriv.chip_version =
363 (tmpU1b >> 1) + 1;
364 switch (padapter->registrypriv.chip_version) {
365 case RTL8712_1stCUT:
366 case RTL8712_2ndCUT:
367 case RTL8712_3rdCUT:
368 break;
369 default:
370 padapter->registrypriv.chip_version =
371 RTL8712_2ndCUT;
372 break;
373 }
374
375 for (i = 0, offset = 0; i < 128; i += 8, offset++)
376 r8712_efuse_pg_packet_read(padapter, offset,
377 &pdata[i]);
378
379 if (r8712_initmac) {
380 /* Users specify the mac address */
381 int jj, kk;
382
383 for (jj = 0, kk = 0; jj < ETH_ALEN;
384 jj++, kk += 3)
385 mac[jj] =
386 key_2char2num(r8712_initmac[kk],
387 r8712_initmac[kk + 1]);
388 } else {
389 /* Use the mac address stored in the Efuse
390 * offset = 0x12 for usb in efuse
391 */
392 memcpy(mac, &pdata[0x12], ETH_ALEN);
393 }
394 eeprom_CustomerID = pdata[0x52];
395 switch (eeprom_CustomerID) {
396 case EEPROM_CID_ALPHA:
397 padapter->eeprompriv.CustomerID =
398 RT_CID_819x_ALPHA;
399 break;
400 case EEPROM_CID_CAMEO:
401 padapter->eeprompriv.CustomerID =
402 RT_CID_819x_CAMEO;
403 break;
404 case EEPROM_CID_SITECOM:
405 padapter->eeprompriv.CustomerID =
406 RT_CID_819x_Sitecom;
407 break;
408 case EEPROM_CID_COREGA:
409 padapter->eeprompriv.CustomerID =
410 RT_CID_COREGA;
411 break;
412 case EEPROM_CID_Senao:
413 padapter->eeprompriv.CustomerID =
414 RT_CID_819x_Senao;
415 break;
416 case EEPROM_CID_EDIMAX_BELKIN:
417 padapter->eeprompriv.CustomerID =
418 RT_CID_819x_Edimax_Belkin;
419 break;
420 case EEPROM_CID_SERCOMM_BELKIN:
421 padapter->eeprompriv.CustomerID =
422 RT_CID_819x_Sercomm_Belkin;
423 break;
424 case EEPROM_CID_WNC_COREGA:
425 padapter->eeprompriv.CustomerID =
426 RT_CID_819x_WNC_COREGA;
427 break;
428 case EEPROM_CID_WHQL:
429 break;
430 case EEPROM_CID_NetCore:
431 padapter->eeprompriv.CustomerID =
432 RT_CID_819x_Netcore;
433 break;
434 case EEPROM_CID_CAMEO1:
435 padapter->eeprompriv.CustomerID =
436 RT_CID_819x_CAMEO1;
437 break;
438 case EEPROM_CID_CLEVO:
439 padapter->eeprompriv.CustomerID =
440 RT_CID_819x_CLEVO;
441 break;
442 default:
443 padapter->eeprompriv.CustomerID =
444 RT_CID_DEFAULT;
445 break;
446 }
447 printk(KERN_INFO "r8712u: CustomerID = 0x%.4x\n",
448 padapter->eeprompriv.CustomerID);
449 /* Led mode */
450 switch (padapter->eeprompriv.CustomerID) {
451 case RT_CID_DEFAULT:
452 case RT_CID_819x_ALPHA:
453 case RT_CID_819x_CAMEO:
454 padapter->ledpriv.LedStrategy = SW_LED_MODE1;
455 padapter->ledpriv.bRegUseLed = true;
456 break;
457 case RT_CID_819x_Sitecom:
458 padapter->ledpriv.LedStrategy = SW_LED_MODE2;
459 padapter->ledpriv.bRegUseLed = true;
460 break;
461 case RT_CID_COREGA:
462 case RT_CID_819x_Senao:
463 padapter->ledpriv.LedStrategy = SW_LED_MODE3;
464 padapter->ledpriv.bRegUseLed = true;
465 break;
466 case RT_CID_819x_Edimax_Belkin:
467 padapter->ledpriv.LedStrategy = SW_LED_MODE4;
468 padapter->ledpriv.bRegUseLed = true;
469 break;
470 case RT_CID_819x_Sercomm_Belkin:
471 padapter->ledpriv.LedStrategy = SW_LED_MODE5;
472 padapter->ledpriv.bRegUseLed = true;
473 break;
474 case RT_CID_819x_WNC_COREGA:
475 padapter->ledpriv.LedStrategy = SW_LED_MODE6;
476 padapter->ledpriv.bRegUseLed = true;
477 break;
478 default:
479 padapter->ledpriv.LedStrategy = SW_LED_MODE0;
480 padapter->ledpriv.bRegUseLed = false;
481 break;
482 }
483 } else
484 AutoloadFail = false;
485 if (((mac[0] == 0xff) && (mac[1] == 0xff) &&
486 (mac[2] == 0xff) && (mac[3] == 0xff) &&
487 (mac[4] == 0xff) && (mac[5] == 0xff)) ||
488 ((mac[0] == 0x00) && (mac[1] == 0x00) &&
489 (mac[2] == 0x00) && (mac[3] == 0x00) &&
490 (mac[4] == 0x00) && (mac[5] == 0x00)) ||
491 (AutoloadFail == false)) {
492 mac[0] = 0x00;
493 mac[1] = 0xe0;
494 mac[2] = 0x4c;
495 mac[3] = 0x87;
496 mac[4] = 0x00;
497 mac[5] = 0x00;
498 }
499 if (r8712_initmac) {
500 /* Make sure the user did not select a multicast
501 * address by setting bit 1 of first octet.
502 */
503 mac[0] &= 0xFE;
504 printk(KERN_INFO "r8712u: MAC Address from user = "
505 "%pM\n", mac);
506 } else
507 printk(KERN_INFO "r8712u: MAC Address from efuse = "
508 "%pM\n", mac);
509 memcpy(pnetdev->dev_addr, mac, ETH_ALEN);
510 }
511 /* step 6. Tell the network stack we exist */
512 if (register_netdev(pnetdev) != 0)
513 goto error;
514 return 0;
515error:
516 usb_put_dev(interface_to_usbdev(pusb_intf));
517 usb_set_intfdata(pusb_intf, NULL);
518 if (padapter->dvobj_deinit != NULL)
519 padapter->dvobj_deinit(padapter);
520 if (pnetdev)
521 os_free_netdev(pnetdev);
522 return -ENODEV;
523}
524
525/* rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove()
526 * => how to recognize both */
527static void r871xu_dev_remove(struct usb_interface *pusb_intf)
528{
529 struct net_device *pnetdev = usb_get_intfdata(pusb_intf);
530 struct _adapter *padapter = (struct _adapter *)netdev_priv(pnetdev);
531 struct usb_device *udev = interface_to_usbdev(pusb_intf);
532
533 if (padapter) {
534 if (drvpriv.drv_registered == true)
535 padapter->bSurpriseRemoved = true;
536 if (pnetdev != NULL) {
537 /* will call netdev_close() */
538 unregister_netdev(pnetdev);
539 }
540 flush_scheduled_work();
541 udelay(1);
542 r871x_dev_unload(padapter);
543 r8712_free_drv_sw(padapter);
544 }
545 usb_set_intfdata(pusb_intf, NULL);
546 /* decrease the reference count of the usb device structure
547 * when disconnect */
548 usb_put_dev(udev);
549 /* If we didn't unplug usb dongle and remove/insert modlue, driver
550 * fails on sitesurvey for the first time when device is up.
551 * Reset usb port for sitesurvey fail issue. */
552 if (udev->state != USB_STATE_NOTATTACHED)
553 usb_reset_device(udev);
554 return;
555}
556
557static int __init r8712u_drv_entry(void)
558{
559 drvpriv.drv_registered = true;
560 return usb_register(&drvpriv.r871xu_drv);
561}
562
563static void __exit r8712u_drv_halt(void)
564{
565 drvpriv.drv_registered = false;
566 usb_deregister(&drvpriv.r871xu_drv);
567 printk(KERN_INFO "r8712u: Driver unloaded\n");
568}
569
570module_init(r8712u_drv_entry);
571module_exit(r8712u_drv_halt);
diff --git a/drivers/staging/rtl8712/usb_ops.c b/drivers/staging/rtl8712/usb_ops.c
new file mode 100644
index 00000000000..5a8b0ebd0b7
--- /dev/null
+++ b/drivers/staging/rtl8712/usb_ops.c
@@ -0,0 +1,201 @@
1/******************************************************************************
2 * usb_ops.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _HCI_OPS_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "osdep_intf.h"
34#include "usb_ops.h"
35#include "recv_osdep.h"
36#include "rtl871x_byteorder.h"
37
38static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr)
39{
40 u8 request;
41 u8 requesttype;
42 u16 wvalue;
43 u16 index;
44 u16 len;
45 u32 data;
46 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
47
48 request = 0x05;
49 requesttype = 0x01; /* read_in */
50 index = 0;
51 wvalue = (u16)(addr&0x0000ffff);
52 len = 1;
53 r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
54 requesttype);
55 return (u8)(le32_to_cpu(data)&0x0ff);
56}
57
58static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)
59{
60 u8 request;
61 u8 requesttype;
62 u16 wvalue;
63 u16 index;
64 u16 len;
65 u32 data;
66 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
67
68 request = 0x05;
69 requesttype = 0x01; /* read_in */
70 index = 0;
71 wvalue = (u16)(addr&0x0000ffff);
72 len = 2;
73 r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
74 requesttype);
75 return (u16)(le32_to_cpu(data)&0xffff);
76}
77
78static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr)
79{
80 u8 request;
81 u8 requesttype;
82 u16 wvalue;
83 u16 index;
84 u16 len;
85 u32 data;
86 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
87
88 request = 0x05;
89 requesttype = 0x01; /* read_in */
90 index = 0;
91 wvalue = (u16)(addr&0x0000ffff);
92 len = 4;
93 r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
94 requesttype);
95 return le32_to_cpu(data);
96}
97
98static void usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
99{
100 u8 request;
101 u8 requesttype;
102 u16 wvalue;
103 u16 index;
104 u16 len;
105 u32 data;
106 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
107
108 request = 0x05;
109 requesttype = 0x00; /* write_out */
110 index = 0;
111 wvalue = (u16)(addr&0x0000ffff);
112 len = 1;
113 data = val;
114 data = cpu_to_le32(data&0x000000ff);
115 r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
116 requesttype);
117}
118
119static void usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
120{
121 u8 request;
122 u8 requesttype;
123 u16 wvalue;
124 u16 index;
125 u16 len;
126 u32 data;
127 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
128
129 request = 0x05;
130 requesttype = 0x00; /* write_out */
131 index = 0;
132 wvalue = (u16)(addr&0x0000ffff);
133 len = 2;
134 data = val;
135 data = cpu_to_le32(data&0x0000ffff);
136 r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
137 requesttype);
138}
139
140static void usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
141{
142 u8 request;
143 u8 requesttype;
144 u16 wvalue;
145 u16 index;
146 u16 len;
147 u32 data;
148 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
149
150 request = 0x05;
151 requesttype = 0x00; /* write_out */
152 index = 0;
153 wvalue = (u16)(addr&0x0000ffff);
154 len = 4;
155 data = cpu_to_le32(val);
156 r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
157 requesttype);
158}
159
160void r8712_usb_set_intf_option(u32 *poption)
161{
162 *poption = ((*poption) | _INTF_ASYNC_);
163}
164
165static void usb_intf_hdl_init(u8 *priv)
166{
167}
168
169static void usb_intf_hdl_unload(u8 *priv)
170{
171}
172
173static void usb_intf_hdl_open(u8 *priv)
174{
175}
176
177static void usb_intf_hdl_close(u8 *priv)
178{
179}
180
181void r8712_usb_set_intf_funs(struct intf_hdl *pintf_hdl)
182{
183 pintf_hdl->intf_hdl_init = &usb_intf_hdl_init;
184 pintf_hdl->intf_hdl_unload = &usb_intf_hdl_unload;
185 pintf_hdl->intf_hdl_open = &usb_intf_hdl_open;
186 pintf_hdl->intf_hdl_close = &usb_intf_hdl_close;
187}
188
189void r8712_usb_set_intf_ops(struct _io_ops *pops)
190{
191 memset((u8 *)pops, 0, sizeof(struct _io_ops));
192 pops->_read8 = &usb_read8;
193 pops->_read16 = &usb_read16;
194 pops->_read32 = &usb_read32;
195 pops->_read_port = &r8712_usb_read_port;
196 pops->_write8 = &usb_write8;
197 pops->_write16 = &usb_write16;
198 pops->_write32 = &usb_write32;
199 pops->_write_mem = &r8712_usb_write_mem;
200 pops->_write_port = &r8712_usb_write_port;
201}
diff --git a/drivers/staging/rtl8712/usb_ops.h b/drivers/staging/rtl8712/usb_ops.h
new file mode 100644
index 00000000000..dc0611a2a0d
--- /dev/null
+++ b/drivers/staging/rtl8712/usb_ops.h
@@ -0,0 +1,25 @@
1#ifndef __USB_OPS_H_
2#define __USB_OPS_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include "osdep_intf.h"
7
8void r8712_usb_write_mem(struct intf_hdl *pintfhdl, u32 addr,
9 u32 cnt, u8 *wmem);
10u32 r8712_usb_write_port(struct intf_hdl *pintfhdl, u32 addr,
11 u32 cnt, u8 *wmem);
12u32 r8712_usb_read_port(struct intf_hdl *pintfhdl, u32 addr,
13 u32 cnt, u8 *rmem);
14void r8712_usb_set_intf_option(u32 *poption);
15void r8712_usb_set_intf_funs(struct intf_hdl *pintf_hdl);
16uint r8712_usb_init_intf_priv(struct intf_priv *pintfpriv);
17void r8712_usb_unload_intf_priv(struct intf_priv *pintfpriv);
18void r8712_usb_set_intf_ops(struct _io_ops *pops);
19void r8712_usb_read_port_cancel(struct _adapter *padapter);
20void r8712_usb_write_port_cancel(struct _adapter *padapter);
21int r8712_usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value,
22 u16 index, void *pdata, u16 len, u8 requesttype);
23
24#endif
25
diff --git a/drivers/staging/rtl8712/usb_ops_linux.c b/drivers/staging/rtl8712/usb_ops_linux.c
new file mode 100644
index 00000000000..7933ea4f632
--- /dev/null
+++ b/drivers/staging/rtl8712/usb_ops_linux.c
@@ -0,0 +1,529 @@
1/******************************************************************************
2 * usb_ops_linux.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _HCI_OPS_OS_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "osdep_intf.h"
34#include "usb_ops.h"
35
36#define RTL871X_VENQT_READ 0xc0
37#define RTL871X_VENQT_WRITE 0x40
38
39struct zero_bulkout_context {
40 void *pbuf;
41 void *purb;
42 void *pirp;
43 void *padapter;
44};
45
46#define usb_write_cmd r8712_usb_write_mem
47#define usb_write_cmd_complete usb_write_mem_complete
48
49uint r8712_usb_init_intf_priv(struct intf_priv *pintfpriv)
50{
51 pintfpriv->piorw_urb = _usb_alloc_urb(0, GFP_ATOMIC);
52 if (!pintfpriv->piorw_urb)
53 return _FAIL;
54 sema_init(&(pintfpriv->io_retevt), 0);
55 return _SUCCESS;
56}
57
58void r8712_usb_unload_intf_priv(struct intf_priv *pintfpriv)
59{
60 if (pintfpriv->piorw_urb) {
61 usb_kill_urb(pintfpriv->piorw_urb);
62 usb_free_urb(pintfpriv->piorw_urb);
63 }
64}
65
66static unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)
67{
68 unsigned int pipe = 0;
69 struct usb_device *pusbd = pdvobj->pusbdev;
70
71 if (pdvobj->nr_endpoint == 11) {
72 switch (addr) {
73 case RTL8712_DMA_BKQ:
74 pipe = usb_sndbulkpipe(pusbd, 0x07);
75 break;
76 case RTL8712_DMA_BEQ:
77 pipe = usb_sndbulkpipe(pusbd, 0x06);
78 break;
79 case RTL8712_DMA_VIQ:
80 pipe = usb_sndbulkpipe(pusbd, 0x05);
81 break;
82 case RTL8712_DMA_VOQ:
83 pipe = usb_sndbulkpipe(pusbd, 0x04);
84 break;
85 case RTL8712_DMA_BCNQ:
86 pipe = usb_sndbulkpipe(pusbd, 0x0a);
87 break;
88 case RTL8712_DMA_BMCQ: /* HI Queue */
89 pipe = usb_sndbulkpipe(pusbd, 0x0b);
90 break;
91 case RTL8712_DMA_MGTQ:
92 pipe = usb_sndbulkpipe(pusbd, 0x0c);
93 break;
94 case RTL8712_DMA_RX0FF:
95 pipe = usb_rcvbulkpipe(pusbd, 0x03); /* in */
96 break;
97 case RTL8712_DMA_C2HCMD:
98 pipe = usb_rcvbulkpipe(pusbd, 0x09); /* in */
99 break;
100 case RTL8712_DMA_H2CCMD:
101 pipe = usb_sndbulkpipe(pusbd, 0x0d);
102 break;
103 }
104 } else if (pdvobj->nr_endpoint == 6) {
105 switch (addr) {
106 case RTL8712_DMA_BKQ:
107 pipe = usb_sndbulkpipe(pusbd, 0x07);
108 break;
109 case RTL8712_DMA_BEQ:
110 pipe = usb_sndbulkpipe(pusbd, 0x06);
111 break;
112 case RTL8712_DMA_VIQ:
113 pipe = usb_sndbulkpipe(pusbd, 0x05);
114 break;
115 case RTL8712_DMA_VOQ:
116 pipe = usb_sndbulkpipe(pusbd, 0x04);
117 break;
118 case RTL8712_DMA_RX0FF:
119 case RTL8712_DMA_C2HCMD:
120 pipe = usb_rcvbulkpipe(pusbd, 0x03); /* in */
121 break;
122 case RTL8712_DMA_H2CCMD:
123 case RTL8712_DMA_BCNQ:
124 case RTL8712_DMA_BMCQ:
125 case RTL8712_DMA_MGTQ:
126 pipe = usb_sndbulkpipe(pusbd, 0x0d);
127 break;
128 }
129 } else if (pdvobj->nr_endpoint == 4) {
130 switch (addr) {
131 case RTL8712_DMA_BEQ:
132 pipe = usb_sndbulkpipe(pusbd, 0x06);
133 break;
134 case RTL8712_DMA_VOQ:
135 pipe = usb_sndbulkpipe(pusbd, 0x04);
136 break;
137 case RTL8712_DMA_RX0FF:
138 case RTL8712_DMA_C2HCMD:
139 pipe = usb_rcvbulkpipe(pusbd, 0x03); /* in */
140 break;
141 case RTL8712_DMA_H2CCMD:
142 case RTL8712_DMA_BCNQ:
143 case RTL8712_DMA_BMCQ:
144 case RTL8712_DMA_MGTQ:
145 pipe = usb_sndbulkpipe(pusbd, 0x0d);
146 break;
147 }
148 } else
149 pipe = 0;
150 return pipe;
151}
152
153static void usb_write_mem_complete(struct urb *purb)
154{
155 struct io_queue *pio_q = (struct io_queue *)purb->context;
156 struct intf_hdl *pintf = &(pio_q->intf);
157 struct intf_priv *pintfpriv = pintf->pintfpriv;
158 struct _adapter *padapter = (struct _adapter *)pintf->adapter;
159
160 if (purb->status != 0) {
161 if (purb->status == (-ESHUTDOWN))
162 padapter->bDriverStopped = true;
163 else
164 padapter->bSurpriseRemoved = true;
165 }
166 up(&pintfpriv->io_retevt);
167}
168
169void r8712_usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
170{
171 unsigned int pipe;
172 int status;
173 struct _adapter *padapter = (struct _adapter *)pintfhdl->adapter;
174 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
175 struct io_queue *pio_queue = (struct io_queue *)padapter->pio_queue;
176 struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfpriv->intf_dev;
177 struct usb_device *pusbd = pdvobj->pusbdev;
178 struct urb *piorw_urb = pintfpriv->piorw_urb;
179
180 if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||
181 (padapter->pwrctrlpriv.pnp_bstop_trx))
182 return;
183 /* translate DMA FIFO addr to pipehandle */
184 pipe = ffaddr2pipehdl(pdvobj, addr);
185 if (pipe == 0)
186 return;
187 usb_fill_bulk_urb(piorw_urb, pusbd, pipe,
188 wmem, cnt, usb_write_mem_complete,
189 pio_queue);
190 status = _usb_submit_urb(piorw_urb, GFP_ATOMIC);
191 _down_sema(&pintfpriv->io_retevt);
192}
193
194static void r8712_usb_read_port_complete(struct urb *purb)
195{
196 uint isevt, *pbuf;
197 struct recv_buf *precvbuf = (struct recv_buf *)purb->context;
198 struct _adapter *padapter = (struct _adapter *)precvbuf->adapter;
199 struct recv_priv *precvpriv = &padapter->recvpriv;
200
201 if (padapter->bSurpriseRemoved || padapter->bDriverStopped)
202 return;
203 if (purb->status == 0) { /* SUCCESS */
204 if ((purb->actual_length > (MAX_RECVBUF_SZ)) ||
205 (purb->actual_length < RXDESC_SIZE)) {
206 precvbuf->reuse = true;
207 r8712_read_port(padapter, precvpriv->ff_hwaddr, 0,
208 (unsigned char *)precvbuf);
209 } else {
210 precvbuf->transfer_len = purb->actual_length;
211 pbuf = (uint *)precvbuf->pbuf;
212 isevt = le32_to_cpu(*(pbuf + 1)) & 0x1ff;
213 if ((isevt & 0x1ff) == 0x1ff) {
214 r8712_rxcmd_event_hdl(padapter, pbuf);
215 precvbuf->reuse = true;
216 r8712_read_port(padapter, precvpriv->ff_hwaddr,
217 0, (unsigned char *)precvbuf);
218 } else {
219 _pkt *pskb = precvbuf->pskb;
220 skb_put(pskb, purb->actual_length);
221 skb_queue_tail(&precvpriv->rx_skb_queue, pskb);
222 tasklet_hi_schedule(&precvpriv->recv_tasklet);
223 precvbuf->pskb = NULL;
224 precvbuf->reuse = false;
225 r8712_read_port(padapter, precvpriv->ff_hwaddr,
226 0, (unsigned char *)precvbuf);
227 }
228 }
229 } else {
230 switch (purb->status) {
231 case -EINVAL:
232 case -EPIPE:
233 case -ENODEV:
234 case -ESHUTDOWN:
235 case -ENOENT:
236 padapter->bDriverStopped = true;
237 break;
238 case -EPROTO:
239 precvbuf->reuse = true;
240 r8712_read_port(padapter, precvpriv->ff_hwaddr, 0,
241 (unsigned char *)precvbuf);
242 break;
243 case -EINPROGRESS:
244 printk(KERN_ERR "r8712u: ERROR: URB IS IN"
245 " PROGRESS!/n");
246 break;
247 default:
248 break;
249 }
250 }
251}
252
253u32 r8712_usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
254{
255 unsigned int pipe;
256 int err;
257 u32 tmpaddr = 0;
258 int alignment = 0;
259 u32 ret = _SUCCESS;
260 struct urb *purb = NULL;
261 struct recv_buf *precvbuf = (struct recv_buf *)rmem;
262 struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
263 struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfpriv->intf_dev;
264 struct _adapter *adapter = (struct _adapter *)pdvobj->padapter;
265 struct recv_priv *precvpriv = &adapter->recvpriv;
266 struct usb_device *pusbd = pdvobj->pusbdev;
267
268 if (adapter->bDriverStopped || adapter->bSurpriseRemoved ||
269 adapter->pwrctrlpriv.pnp_bstop_trx)
270 return _FAIL;
271 if ((precvbuf->reuse == false) || (precvbuf->pskb == NULL)) {
272 precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue);
273 if (NULL != precvbuf->pskb)
274 precvbuf->reuse = true;
275 }
276 if (precvbuf != NULL) {
277 r8712_init_recvbuf(adapter, precvbuf);
278 /* re-assign for linux based on skb */
279 if ((precvbuf->reuse == false) || (precvbuf->pskb == NULL)) {
280 precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev,
281 MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
282 if (precvbuf->pskb == NULL)
283 return _FAIL;
284 tmpaddr = (addr_t)precvbuf->pskb->data;
285 alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
286 skb_reserve(precvbuf->pskb,
287 (RECVBUFF_ALIGN_SZ - alignment));
288 precvbuf->phead = precvbuf->pskb->head;
289 precvbuf->pdata = precvbuf->pskb->data;
290 precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
291 precvbuf->pend = skb_end_pointer(precvbuf->pskb);
292 precvbuf->pbuf = precvbuf->pskb->data;
293 } else { /* reuse skb */
294 precvbuf->phead = precvbuf->pskb->head;
295 precvbuf->pdata = precvbuf->pskb->data;
296 precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
297 precvbuf->pend = skb_end_pointer(precvbuf->pskb);
298 precvbuf->pbuf = precvbuf->pskb->data;
299 precvbuf->reuse = false;
300 }
301 purb = precvbuf->purb;
302 /* translate DMA FIFO addr to pipehandle */
303 pipe = ffaddr2pipehdl(pdvobj, addr);
304 usb_fill_bulk_urb(purb, pusbd, pipe,
305 precvbuf->pbuf, MAX_RECVBUF_SZ,
306 r8712_usb_read_port_complete,
307 precvbuf);
308 err = _usb_submit_urb(purb, GFP_ATOMIC);
309 if ((err) && (err != (-EPERM)))
310 ret = _FAIL;
311 } else
312 ret = _FAIL;
313 return ret;
314}
315
316void r8712_usb_read_port_cancel(struct _adapter *padapter)
317{
318 int i;
319 struct recv_buf *precvbuf;
320
321 precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf;
322 for (i = 0; i < NR_RECVBUFF; i++) {
323 if (precvbuf->purb)
324 usb_kill_urb(precvbuf->purb);
325 precvbuf++;
326 }
327}
328
329void r8712_xmit_bh(void *priv)
330{
331 int ret = false;
332 struct _adapter *padapter = (struct _adapter *)priv;
333 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
334
335 while (1) {
336 if ((padapter->bDriverStopped == true) ||
337 (padapter->bSurpriseRemoved == true)) {
338 printk(KERN_ERR "r8712u: xmit_bh => bDriverStopped"
339 " or bSurpriseRemoved\n");
340 break;
341 }
342 ret = r8712_xmitframe_complete(padapter, pxmitpriv, NULL);
343 if (ret == false)
344 break;
345 }
346}
347
348static void usb_write_port_complete(struct urb *purb)
349{
350 int i;
351 struct xmit_frame *pxmitframe = (struct xmit_frame *)purb->context;
352 struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf;
353 struct _adapter *padapter = pxmitframe->padapter;
354 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
355 struct pkt_attrib *pattrib = &pxmitframe->attrib;
356
357 switch (pattrib->priority) {
358 case 1:
359 case 2:
360 pxmitpriv->bkq_cnt--;
361 break;
362 case 4:
363 case 5:
364 pxmitpriv->viq_cnt--;
365 break;
366 case 6:
367 case 7:
368 pxmitpriv->voq_cnt--;
369 break;
370 case 0:
371 case 3:
372 default:
373 pxmitpriv->beq_cnt--;
374 break;
375 }
376 pxmitpriv->txirp_cnt--;
377 for (i = 0; i < 8; i++) {
378 if (purb == pxmitframe->pxmit_urb[i]) {
379 pxmitframe->bpending[i] = false;
380 break;
381 }
382 }
383 if (padapter->bSurpriseRemoved)
384 return;
385 switch (purb->status) {
386 case 0:
387 break;
388 default:
389 printk(KERN_WARNING "r8712u: pipe error: (%d)\n", purb->status);
390 break;
391 }
392 /* not to consider tx fragment */
393 r8712_free_xmitframe_ex(pxmitpriv, pxmitframe);
394 r8712_free_xmitbuf(pxmitpriv, pxmitbuf);
395 tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
396}
397
398u32 r8712_usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
399{
400 unsigned long irqL;
401 int i, status;
402 unsigned int pipe;
403 u32 ret, bwritezero;
404 struct urb *purb = NULL;
405 struct _adapter *padapter = (struct _adapter *)pintfhdl->adapter;
406 struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv;
407 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
408 struct xmit_frame *pxmitframe = (struct xmit_frame *)wmem;
409 struct usb_device *pusbd = pdvobj->pusbdev;
410 struct pkt_attrib *pattrib = &pxmitframe->attrib;
411
412 if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||
413 (padapter->pwrctrlpriv.pnp_bstop_trx))
414 return _FAIL;
415 for (i = 0; i < 8; i++) {
416 if (pxmitframe->bpending[i] == false) {
417 spin_lock_irqsave(&pxmitpriv->lock, irqL);
418 pxmitpriv->txirp_cnt++;
419 pxmitframe->bpending[i] = true;
420 switch (pattrib->priority) {
421 case 1:
422 case 2:
423 pxmitpriv->bkq_cnt++;
424 break;
425 case 4:
426 case 5:
427 pxmitpriv->viq_cnt++;
428 break;
429 case 6:
430 case 7:
431 pxmitpriv->voq_cnt++;
432 break;
433 case 0:
434 case 3:
435 default:
436 pxmitpriv->beq_cnt++;
437 break;
438 }
439 spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
440 pxmitframe->sz[i] = (u16)cnt;
441 purb = pxmitframe->pxmit_urb[i];
442 break;
443 }
444 }
445 bwritezero = false;
446 if (pdvobj->ishighspeed) {
447 if (cnt > 0 && cnt % 512 == 0)
448 bwritezero = true;
449 } else {
450 if (cnt > 0 && cnt % 64 == 0)
451 bwritezero = true;
452 }
453 /* translate DMA FIFO addr to pipehandle */
454 pipe = ffaddr2pipehdl(pdvobj, addr);
455 if (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0)
456 purb->transfer_flags &= (~URB_NO_INTERRUPT);
457 else
458 purb->transfer_flags |= URB_NO_INTERRUPT;
459 if (bwritezero)
460 cnt += 8;
461 usb_fill_bulk_urb(purb, pusbd, pipe,
462 pxmitframe->mem_addr,
463 cnt, usb_write_port_complete,
464 pxmitframe); /* context is xmit_frame */
465 status = _usb_submit_urb(purb, GFP_ATOMIC);
466 if (!status)
467 ret = _SUCCESS;
468 else
469 ret = _FAIL;
470 return ret;
471}
472
473void r8712_usb_write_port_cancel(struct _adapter *padapter)
474{
475 int i, j;
476 struct xmit_buf *pxmitbuf = (struct xmit_buf *)
477 padapter->xmitpriv.pxmitbuf;
478
479 for (i = 0; i < NR_XMITBUFF; i++) {
480 for (j = 0; j < 8; j++) {
481 if (pxmitbuf->pxmit_urb[j])
482 usb_kill_urb(pxmitbuf->pxmit_urb[j]);
483 }
484 pxmitbuf++;
485 }
486}
487
488int r8712_usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value,
489 u16 index, void *pdata, u16 len, u8 requesttype)
490{
491 unsigned int pipe;
492 int status;
493 u8 reqtype;
494 struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)
495 pintfpriv->intf_dev;
496 struct usb_device *udev = pdvobjpriv->pusbdev;
497 /* For mstar platform, mstar suggests the address for USB IO
498 * should be 16 bytes alignment. Trying to fix it here.
499 */
500 u8 *palloc_buf, *pIo_buf;
501
502 palloc_buf = _malloc((u32) len + 16);
503 if (palloc_buf == NULL) {
504 printk(KERN_ERR "r8712u: [%s] Can't alloc memory for vendor"
505 " request\n", __func__);
506 return -1;
507 }
508 pIo_buf = palloc_buf + 16 - ((addr_t)(palloc_buf) & 0x0f);
509 if (requesttype == 0x01) {
510 pipe = usb_rcvctrlpipe(udev, 0); /* read_in */
511 reqtype = RTL871X_VENQT_READ;
512 } else {
513 pipe = usb_sndctrlpipe(udev, 0); /* write_out */
514 reqtype = RTL871X_VENQT_WRITE;
515 memcpy(pIo_buf, pdata, len);
516 }
517 status = usb_control_msg(udev, pipe, request, reqtype, value, index,
518 pIo_buf, len, HZ / 2);
519 if (status > 0) { /* Success this control transfer. */
520 if (requesttype == 0x01) {
521 /* For Control read transfer, we have to copy the read
522 * data from pIo_buf to pdata.
523 */
524 memcpy(pdata, pIo_buf, status);
525 }
526 }
527 kfree(palloc_buf);
528 return status;
529}
diff --git a/drivers/staging/rtl8712/usb_osintf.h b/drivers/staging/rtl8712/usb_osintf.h
new file mode 100644
index 00000000000..0da6c1db048
--- /dev/null
+++ b/drivers/staging/rtl8712/usb_osintf.h
@@ -0,0 +1,24 @@
1#ifndef __USB_OSINTF_H
2#define __USB_OSINTF_H
3
4#include "osdep_service.h"
5#include "drv_types.h"
6#include "usb_vendor_req.h"
7
8#define USBD_HALTED(Status) ((u32)(Status) >> 30 == 3)
9
10extern char *r8712_initmac;
11
12unsigned int r8712_usb_inirp_init(struct _adapter *padapter);
13unsigned int r8712_usb_inirp_deinit(struct _adapter *padapter);
14uint rtl871x_hal_init(struct _adapter *padapter);
15uint rtl8712_hal_deinit(struct _adapter *padapter);
16
17void rtl871x_intf_stop(struct _adapter *padapter);
18void r871x_dev_unload(struct _adapter *padapter);
19void r8712_stop_drv_threads(struct _adapter *padapter);
20u8 r8712_init_drv_sw(struct _adapter *padapter);
21u8 r8712_free_drv_sw(struct _adapter *padapter);
22struct net_device *r8712_init_netdev(void);
23
24#endif
diff --git a/drivers/staging/rtl8712/usb_vendor_req.h b/drivers/staging/rtl8712/usb_vendor_req.h
new file mode 100644
index 00000000000..d35c538c47a
--- /dev/null
+++ b/drivers/staging/rtl8712/usb_vendor_req.h
@@ -0,0 +1,33 @@
1#ifndef _USB_VENDOR_REQUEST_H_
2#define _USB_VENDOR_REQUEST_H_
3
4/*4 Set/Get Register related wIndex/Data */
5#define RT_USB_RESET_MASK_OFF 0
6#define RT_USB_RESET_MASK_ON 1
7#define RT_USB_SLEEP_MASK_OFF 0
8#define RT_USB_SLEEP_MASK_ON 1
9#define RT_USB_LDO_ON 1
10#define RT_USB_LDO_OFF 0
11
12/*4 Set/Get SYSCLK related wValue or Data */
13#define RT_USB_SYSCLK_32KHZ 0
14#define RT_USB_SYSCLK_40MHZ 1
15#define RT_USB_SYSCLK_60MHZ 2
16
17enum RT_USB_BREQUEST {
18 RT_USB_SET_REGISTER = 1,
19 RT_USB_SET_SYSCLK = 2,
20 RT_USB_GET_SYSCLK = 3,
21 RT_USB_GET_REGISTER = 4
22};
23
24enum RT_USB_WVALUE {
25 RT_USB_RESET_MASK = 1,
26 RT_USB_SLEEP_MASK = 2,
27 RT_USB_USB_HRCPWM = 3,
28 RT_USB_LDO = 4,
29 RT_USB_BOOT_TYPE = 5
30};
31
32#endif
33
diff --git a/drivers/staging/rtl8712/wifi.h b/drivers/staging/rtl8712/wifi.h
new file mode 100644
index 00000000000..86d4b98e243
--- /dev/null
+++ b/drivers/staging/rtl8712/wifi.h
@@ -0,0 +1,622 @@
1#ifndef _WIFI_H_
2#define _WIFI_H_
3
4#include "rtl871x_byteorder.h"
5
6#ifdef BIT
7#undef BIT
8#endif
9#define BIT(x) (1 << (x))
10
11#define WLAN_ETHHDR_LEN 14
12#define WLAN_ETHADDR_LEN 6
13#define WLAN_IEEE_OUI_LEN 3
14#define WLAN_ADDR_LEN 6
15#define WLAN_CRC_LEN 4
16#define WLAN_BSSID_LEN 6
17#define WLAN_BSS_TS_LEN 8
18#define WLAN_HDR_A3_LEN 24
19#define WLAN_HDR_A4_LEN 30
20#define WLAN_HDR_A3_QOS_LEN 26
21#define WLAN_HDR_A4_QOS_LEN 32
22#define WLAN_SSID_MAXLEN 32
23#define WLAN_DATA_MAXLEN 2312
24
25#define WLAN_A3_PN_OFFSET 24
26#define WLAN_A4_PN_OFFSET 30
27
28#define WLAN_MIN_ETHFRM_LEN 60
29#define WLAN_MAX_ETHFRM_LEN 1514
30#define WLAN_ETHHDR_LEN 14
31
32#define P80211CAPTURE_VERSION 0x80211001
33
34enum WIFI_FRAME_TYPE {
35 WIFI_MGT_TYPE = (0),
36 WIFI_CTRL_TYPE = (BIT(2)),
37 WIFI_DATA_TYPE = (BIT(3)),
38 WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), /*!< QoS Data */
39};
40
41enum WIFI_FRAME_SUBTYPE {
42
43 /* below is for mgt frame */
44 WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE),
45 WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE),
46 WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE),
47 WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE),
48 WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE),
49 WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE),
50 WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE),
51 WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE),
52 WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE),
53 WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE),
54 WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE),
55 WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE),
56
57 /* below is for control frame */
58 WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE),
59 WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),
60 WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE),
61 WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE),
62 WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE),
63 WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),
64
65 /* below is for data frame */
66 WIFI_DATA = (0 | WIFI_DATA_TYPE),
67 WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE),
68 WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE),
69 WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE),
70 WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE),
71 WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE),
72 WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE),
73 WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE),
74};
75
76enum WIFI_REASON_CODE {
77 _RSON_RESERVED_ = 0,
78 _RSON_UNSPECIFIED_ = 1,
79 _RSON_AUTH_NO_LONGER_VALID_ = 2,
80 _RSON_DEAUTH_STA_LEAVING_ = 3,
81 _RSON_INACTIVITY_ = 4,
82 _RSON_UNABLE_HANDLE_ = 5,
83 _RSON_CLS2_ = 6,
84 _RSON_CLS3_ = 7,
85 _RSON_DISAOC_STA_LEAVING_ = 8,
86 _RSON_ASOC_NOT_AUTH_ = 9,
87
88 /* WPA reason */
89 _RSON_INVALID_IE_ = 13,
90 _RSON_MIC_FAILURE_ = 14,
91 _RSON_4WAY_HNDSHK_TIMEOUT_ = 15,
92 _RSON_GROUP_KEY_UPDATE_TIMEOUT_ = 16,
93 _RSON_DIFF_IE_ = 17,
94 _RSON_MLTCST_CIPHER_NOT_VALID_ = 18,
95 _RSON_UNICST_CIPHER_NOT_VALID_ = 19,
96 _RSON_AKMP_NOT_VALID_ = 20,
97 _RSON_UNSUPPORT_RSNE_VER_ = 21,
98 _RSON_INVALID_RSNE_CAP_ = 22,
99 _RSON_IEEE_802DOT1X_AUTH_FAIL_ = 23,
100
101 /* below are Realtek definitions */
102 _RSON_PMK_NOT_AVAILABLE_ = 24,
103};
104
105enum WIFI_STATUS_CODE {
106 _STATS_SUCCESSFUL_ = 0,
107 _STATS_FAILURE_ = 1,
108 _STATS_CAP_FAIL_ = 10,
109 _STATS_NO_ASOC_ = 11,
110 _STATS_OTHER_ = 12,
111 _STATS_NO_SUPP_ALG_ = 13,
112 _STATS_OUT_OF_AUTH_SEQ_ = 14,
113 _STATS_CHALLENGE_FAIL_ = 15,
114 _STATS_AUTH_TIMEOUT_ = 16,
115 _STATS_UNABLE_HANDLE_STA_ = 17,
116 _STATS_RATE_FAIL_ = 18,
117};
118
119enum WIFI_REG_DOMAIN {
120 DOMAIN_FCC = 1,
121 DOMAIN_IC = 2,
122 DOMAIN_ETSI = 3,
123 DOMAIN_SPAIN = 4,
124 DOMAIN_FRANCE = 5,
125 DOMAIN_MKK = 6,
126 DOMAIN_ISRAEL = 7,
127 DOMAIN_MKK1 = 8,
128 DOMAIN_MKK2 = 9,
129 DOMAIN_MKK3 = 10,
130 DOMAIN_MAX
131};
132
133#define _TO_DS_ BIT(8)
134#define _FROM_DS_ BIT(9)
135#define _MORE_FRAG_ BIT(10)
136#define _RETRY_ BIT(11)
137#define _PWRMGT_ BIT(12)
138#define _MORE_DATA_ BIT(13)
139#define _PRIVACY_ BIT(14)
140#define _ORDER_ BIT(15)
141
142#define SetToDs(pbuf) \
143 do { \
144 *(unsigned short *)(pbuf) |= cpu_to_le16(_TO_DS_); \
145 } while (0)
146
147#define GetToDs(pbuf) (((*(unsigned short *)(pbuf)) & \
148 le16_to_cpu(_TO_DS_)) != 0)
149
150#define ClearToDs(pbuf) \
151 do { \
152 *(unsigned short *)(pbuf) &= (~cpu_to_le16(_TO_DS_)); \
153 } while (0)
154
155#define SetFrDs(pbuf) \
156 do { \
157 *(unsigned short *)(pbuf) |= cpu_to_le16(_FROM_DS_); \
158 } while (0)
159
160#define GetFrDs(pbuf) (((*(unsigned short *)(pbuf)) & \
161 le16_to_cpu(_FROM_DS_)) != 0)
162
163#define ClearFrDs(pbuf) \
164 do { \
165 *(unsigned short *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)); \
166 } while (0)
167
168#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe))
169
170
171#define SetMFrag(pbuf) \
172 do { \
173 *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_FRAG_); \
174 } while (0)
175
176#define GetMFrag(pbuf) (((*(unsigned short *)(pbuf)) & \
177 le16_to_cpu(_MORE_FRAG_)) != 0)
178
179#define ClearMFrag(pbuf) \
180 do { \
181 *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)); \
182 } while (0)
183
184#define SetRetry(pbuf) \
185 do { \
186 *(unsigned short *)(pbuf) |= cpu_to_le16(_RETRY_); \
187 } while (0)
188
189#define GetRetry(pbuf) (((*(unsigned short *)(pbuf)) & \
190 le16_to_cpu(_RETRY_)) != 0)
191
192#define ClearRetry(pbuf) \
193 do { \
194 *(unsigned short *)(pbuf) &= (~cpu_to_le16(_RETRY_)); \
195 } while (0)
196
197#define SetPwrMgt(pbuf) \
198 do { \
199 *(unsigned short *)(pbuf) |= cpu_to_le16(_PWRMGT_); \
200 } while (0)
201
202#define GetPwrMgt(pbuf) (((*(unsigned short *)(pbuf)) & \
203 le16_to_cpu(_PWRMGT_)) != 0)
204
205#define ClearPwrMgt(pbuf) \
206 do { \
207 *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)); \
208 } while (0)
209
210#define SetMData(pbuf) \
211 do { \
212 *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_DATA_); \
213 } while (0)
214
215#define GetMData(pbuf) (((*(unsigned short *)(pbuf)) & \
216 le16_to_cpu(_MORE_DATA_)) != 0)
217
218#define ClearMData(pbuf) \
219 do { \
220 *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)); \
221 } while (0)
222
223#define SetPrivacy(pbuf) \
224 do { \
225 *(unsigned short *)(pbuf) |= cpu_to_le16(_PRIVACY_); \
226 } while (0)
227
228#define GetPrivacy(pbuf) (((*(unsigned short *)(pbuf)) & \
229 le16_to_cpu(_PRIVACY_)) != 0)
230
231#define ClearPrivacy(pbuf) \
232 do { \
233 *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)); \
234 } while (0)
235
236
237#define GetOrder(pbuf) (((*(unsigned short *)(pbuf)) & \
238 le16_to_cpu(_ORDER_)) != 0)
239
240#define GetFrameType(pbuf) (le16_to_cpu(*(unsigned short *)(pbuf)) & \
241 (BIT(3) | BIT(2)))
242
243#define SetFrameType(pbuf, type) \
244 do { \
245 *(unsigned short *)(pbuf) &= __constant_cpu_to_le16(~(BIT(3) | \
246 BIT(2))); \
247 *(unsigned short *)(pbuf) |= __constant_cpu_to_le16(type); \
248 } while (0)
249
250#define GetFrameSubType(pbuf) (cpu_to_le16(*(unsigned short *)(pbuf)) & \
251 (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | \
252 BIT(2)))
253
254#define SetFrameSubType(pbuf, type) \
255 do { \
256 *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | \
257 BIT(5) | BIT(4) | BIT(3) | BIT(2))); \
258 *(unsigned short *)(pbuf) |= cpu_to_le16(type); \
259 } while (0)
260
261#define GetSequence(pbuf) (cpu_to_le16(*(unsigned short *)\
262 ((addr_t)(pbuf) + 22)) >> 4)
263
264#define GetFragNum(pbuf) (cpu_to_le16(*(unsigned short *)((addr_t)\
265 (pbuf) + 22)) & 0x0f)
266
267#define GetTupleCache(pbuf) (cpu_to_le16(*(unsigned short *)\
268 ((addr_t)(pbuf) + 22)))
269
270#define SetFragNum(pbuf, num) \
271 do { \
272 *(unsigned short *)((addr_t)(pbuf) + 22) = \
273 ((*(unsigned short *)((addr_t)(pbuf) + 22)) & \
274 le16_to_cpu(~(0x000f))) | \
275 cpu_to_le16(0x0f & (num)); \
276 } while (0)
277
278#define SetSeqNum(pbuf, num) \
279 do { \
280 *(unsigned short *)((addr_t)(pbuf) + 22) = \
281 ((*(unsigned short *)((addr_t)(pbuf) + 22)) & \
282 le16_to_cpu((unsigned short)0x000f)) | \
283 le16_to_cpu((unsigned short)(0xfff0 & (num << 4))); \
284 } while (0)
285
286#define SetDuration(pbuf, dur) \
287 do { \
288 *(unsigned short *)((addr_t)(pbuf) + 2) |= \
289 cpu_to_le16(0xffff & (dur)); \
290 } while (0)
291
292#define SetPriority(pbuf, tid) \
293 do { \
294 *(unsigned short *)(pbuf) |= cpu_to_le16(tid & 0xf); \
295 } while (0)
296
297#define GetPriority(pbuf) ((le16_to_cpu(*(unsigned short *)(pbuf))) & 0xf)
298
299#define SetAckpolicy(pbuf, ack) \
300 do { \
301 *(unsigned short *)(pbuf) |= cpu_to_le16((ack & 3) << 5); \
302 } while (0)
303
304#define GetAckpolicy(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 5) & 0x3)
305
306#define GetAMsdu(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 7) & 0x1)
307
308#define SetAMsdu(pbuf, amsdu) \
309 do { \
310 *(unsigned short *)(pbuf) |= cpu_to_le16((amsdu & 1) << 7); \
311 } while (0)
312
313#define GetAid(pbuf) (cpu_to_le16(*(unsigned short *)((addr_t)(pbuf) + 2)) \
314 & 0x3fff)
315
316#define GetTid(pbuf) (cpu_to_le16(*(unsigned short *)((addr_t)(pbuf) + \
317 (((GetToDs(pbuf) << 1)|GetFrDs(pbuf)) == 3 ? \
318 30 : 24))) & 0x000f)
319
320#define GetAddr1Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 4))
321
322#define GetAddr2Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 10))
323
324#define GetAddr3Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 16))
325
326#define GetAddr4Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 24))
327
328
329
330static inline int IS_MCAST(unsigned char *da)
331{
332 if ((*da) & 0x01)
333 return true;
334 else
335 return false;
336}
337
338
339static inline unsigned char *get_da(unsigned char *pframe)
340{
341 unsigned char *da;
342 unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
343
344 switch (to_fr_ds) {
345 case 0x00: /* ToDs=0, FromDs=0 */
346 da = GetAddr1Ptr(pframe);
347 break;
348 case 0x01: /* ToDs=0, FromDs=1 */
349 da = GetAddr1Ptr(pframe);
350 break;
351 case 0x02: /* ToDs=1, FromDs=0 */
352 da = GetAddr3Ptr(pframe);
353 break;
354 default: /* ToDs=1, FromDs=1 */
355 da = GetAddr3Ptr(pframe);
356 break;
357 }
358 return da;
359}
360
361
362static inline unsigned char *get_sa(unsigned char *pframe)
363{
364 unsigned char *sa;
365 unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
366
367 switch (to_fr_ds) {
368 case 0x00: /* ToDs=0, FromDs=0 */
369 sa = GetAddr2Ptr(pframe);
370 break;
371 case 0x01: /* ToDs=0, FromDs=1 */
372 sa = GetAddr3Ptr(pframe);
373 break;
374 case 0x02: /* ToDs=1, FromDs=0 */
375 sa = GetAddr2Ptr(pframe);
376 break;
377 default: /* ToDs=1, FromDs=1 */
378 sa = GetAddr4Ptr(pframe);
379 break;
380 }
381
382 return sa;
383}
384
385static inline unsigned char *get_hdr_bssid(unsigned char *pframe)
386{
387 unsigned char *sa;
388 unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
389
390 switch (to_fr_ds) {
391 case 0x00: /* ToDs=0, FromDs=0 */
392 sa = GetAddr3Ptr(pframe);
393 break;
394 case 0x01: /* ToDs=0, FromDs=1 */
395 sa = GetAddr2Ptr(pframe);
396 break;
397 case 0x02: /* ToDs=1, FromDs=0 */
398 sa = GetAddr1Ptr(pframe);
399 break;
400 default: /* ToDs=1, FromDs=1 */
401 sa = NULL;
402 break;
403 }
404 return sa;
405}
406
407
408
409/*-----------------------------------------------------------------------------
410 Below is for the security related definition
411------------------------------------------------------------------------------*/
412#define _RESERVED_FRAME_TYPE_ 0
413#define _SKB_FRAME_TYPE_ 2
414#define _PRE_ALLOCMEM_ 1
415#define _PRE_ALLOCHDR_ 3
416#define _PRE_ALLOCLLCHDR_ 4
417#define _PRE_ALLOCICVHDR_ 5
418#define _PRE_ALLOCMICHDR_ 6
419
420#define _SIFSTIME_ ((priv->pmib->BssType.net_work_type & \
421 WIRELESS_11A) ? 16 : 10)
422#define _ACKCTSLNG_ 14 /*14 bytes long, including crclng */
423#define _CRCLNG_ 4
424
425#define _ASOCREQ_IE_OFFSET_ 4 /* excluding wlan_hdr */
426#define _ASOCRSP_IE_OFFSET_ 6
427#define _REASOCREQ_IE_OFFSET_ 10
428#define _REASOCRSP_IE_OFFSET_ 6
429#define _PROBEREQ_IE_OFFSET_ 0
430#define _PROBERSP_IE_OFFSET_ 12
431#define _AUTH_IE_OFFSET_ 6
432#define _DEAUTH_IE_OFFSET_ 0
433#define _BEACON_IE_OFFSET_ 12
434
435#define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_
436
437#define _SSID_IE_ 0
438#define _SUPPORTEDRATES_IE_ 1
439#define _DSSET_IE_ 3
440#define _TIM_IE_ 5
441#define _IBSS_PARA_IE_ 6
442#define _CHLGETXT_IE_ 16
443#define _RSN_IE_2_ 48`
444#define _SSN_IE_1_ 221
445#define _ERPINFO_IE_ 42
446#define _EXT_SUPPORTEDRATES_IE_ 50
447
448#define _HT_CAPABILITY_IE_ 45
449#define _HT_EXTRA_INFO_IE_ 61
450#define _HT_ADD_INFO_IE_ 61 /* _HT_EXTRA_INFO_IE_ */
451
452#define _VENDOR_SPECIFIC_IE_ 221
453
454#define _RESERVED47_ 47
455
456
457/* ---------------------------------------------------------------------------
458 Below is the fixed elements...
459-----------------------------------------------------------------------------*/
460#define _AUTH_ALGM_NUM_ 2
461#define _AUTH_SEQ_NUM_ 2
462#define _BEACON_ITERVAL_ 2
463#define _CAPABILITY_ 2
464#define _CURRENT_APADDR_ 6
465#define _LISTEN_INTERVAL_ 2
466#define _RSON_CODE_ 2
467#define _ASOC_ID_ 2
468#define _STATUS_CODE_ 2
469#define _TIMESTAMP_ 8
470
471#define AUTH_ODD_TO 0
472#define AUTH_EVEN_TO 1
473
474#define WLAN_ETHCONV_ENCAP 1
475#define WLAN_ETHCONV_RFC1042 2
476#define WLAN_ETHCONV_8021h 3
477
478#define cap_ESS BIT(0)
479#define cap_IBSS BIT(1)
480#define cap_CFPollable BIT(2)
481#define cap_CFRequest BIT(3)
482#define cap_Privacy BIT(4)
483#define cap_ShortPremble BIT(5)
484
485/*-----------------------------------------------------------------------------
486 Below is the definition for 802.11i / 802.1x
487------------------------------------------------------------------------------*/
488#define _IEEE8021X_MGT_ 1 /*WPA */
489#define _IEEE8021X_PSK_ 2 /* WPA with pre-shared key */
490
491/*-----------------------------------------------------------------------------
492 Below is the definition for WMM
493------------------------------------------------------------------------------*/
494#define _WMM_IE_Length_ 7 /* for WMM STA */
495#define _WMM_Para_Element_Length_ 24
496
497
498/*-----------------------------------------------------------------------------
499 Below is the definition for 802.11n
500------------------------------------------------------------------------------*/
501
502/* block-ack parameters */
503#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
504#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
505#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0
506#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
507#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
508
509#define SetOrderBit(pbuf) \
510 do { \
511 *(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \
512 } while (0)
513
514#define GetOrderBit(pbuf) (((*(unsigned short *)(pbuf)) & \
515 le16_to_cpu(_ORDER_)) != 0)
516
517
518/**
519 * struct ieee80211_bar - HT Block Ack Request
520 *
521 * This structure refers to "HT BlockAckReq" as
522 * described in 802.11n draft section 7.2.1.7.1
523 */
524struct ieee80211_bar {
525 unsigned short frame_control;
526 unsigned short duration;
527 unsigned char ra[6];
528 unsigned char ta[6];
529 unsigned short control;
530 unsigned short start_seq_num;
531} __attribute__((packed));
532
533/* 802.11 BAR control masks */
534#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000
535#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004
536
537
538 /**
539 * struct ieee80211_ht_cap - HT capabilities
540 *
541 * This structure refers to "HT capabilities element" as
542 * described in 802.11n draft section 7.3.2.52
543 */
544
545struct ieee80211_ht_cap {
546 unsigned short cap_info;
547 unsigned char ampdu_params_info;
548 unsigned char supp_mcs_set[16];
549 unsigned short extended_ht_cap_info;
550 unsigned int tx_BF_cap_info;
551 unsigned char antenna_selection_info;
552} __attribute__ ((packed));
553
554/**
555 * struct ieee80211_ht_cap - HT additional information
556 *
557 * This structure refers to "HT information element" as
558 * described in 802.11n draft section 7.3.2.53
559 */
560struct ieee80211_ht_addt_info {
561 unsigned char control_chan;
562 unsigned char ht_param;
563 unsigned short operation_mode;
564 unsigned short stbc_param;
565 unsigned char basic_set[16];
566} __attribute__ ((packed));
567
568/* 802.11n HT capabilities masks */
569#define IEEE80211_HT_CAP_SUP_WIDTH 0x0002
570#define IEEE80211_HT_CAP_SM_PS 0x000C
571#define IEEE80211_HT_CAP_GRN_FLD 0x0010
572#define IEEE80211_HT_CAP_SGI_20 0x0020
573#define IEEE80211_HT_CAP_SGI_40 0x0040
574#define IEEE80211_HT_CAP_TX_STBC 0x0080
575#define IEEE80211_HT_CAP_DELAY_BA 0x0400
576#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
577#define IEEE80211_HT_CAP_DSSSCCK40 0x1000
578/* 802.11n HT capability AMPDU settings */
579#define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03
580#define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C
581/* 802.11n HT capability MSC set */
582#define IEEE80211_SUPP_MCS_SET_UEQM 4
583#define IEEE80211_HT_CAP_MAX_STREAMS 4
584#define IEEE80211_SUPP_MCS_SET_LEN 10
585/* maximum streams the spec allows */
586#define IEEE80211_HT_CAP_MCS_TX_DEFINED 0x01
587#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF 0x02
588#define IEEE80211_HT_CAP_MCS_TX_STREAMS 0x0C
589#define IEEE80211_HT_CAP_MCS_TX_UEQM 0x10
590/* 802.11n HT IE masks */
591#define IEEE80211_HT_IE_CHA_SEC_OFFSET 0x03
592#define IEEE80211_HT_IE_CHA_SEC_NONE 0x00
593#define IEEE80211_HT_IE_CHA_SEC_ABOVE 0x01
594#define IEEE80211_HT_IE_CHA_SEC_BELOW 0x03
595#define IEEE80211_HT_IE_CHA_WIDTH 0x04
596#define IEEE80211_HT_IE_HT_PROTECTION 0x0003
597#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004
598#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010
599
600/* block-ack parameters */
601#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
602#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
603#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0
604#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
605#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
606
607/*
608 * A-PMDU buffer sizes
609 * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
610 */
611#define IEEE80211_MIN_AMPDU_BUF 0x8
612#define IEEE80211_MAX_AMPDU_BUF 0x40
613
614
615/* Spatial Multiplexing Power Save Modes */
616#define WLAN_HT_CAP_SM_PS_STATIC 0
617#define WLAN_HT_CAP_SM_PS_DYNAMIC 1
618#define WLAN_HT_CAP_SM_PS_INVALID 2
619#define WLAN_HT_CAP_SM_PS_DISABLED 3
620
621#endif /* _WIFI_H_ */
622
diff --git a/drivers/staging/rtl8712/wlan_bssdef.h b/drivers/staging/rtl8712/wlan_bssdef.h
new file mode 100644
index 00000000000..6d9295270f8
--- /dev/null
+++ b/drivers/staging/rtl8712/wlan_bssdef.h
@@ -0,0 +1,242 @@
1#ifndef __WLAN_BSSDEF_H__
2#define __WLAN_BSSDEF_H__
3
4#define MAX_IE_SZ 768
5
6#define NDIS_802_11_LENGTH_SSID 32
7#define NDIS_802_11_LENGTH_RATES 8
8#define NDIS_802_11_LENGTH_RATES_EX 16
9
10/* Set of 8 data rates*/
11typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES];
12/* Set of 16 data rates */
13typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX];
14
15struct ndis_802_11_ssid {
16 u32 SsidLength;
17 u8 Ssid[32];
18};
19
20enum NDIS_802_11_NETWORK_TYPE {
21 Ndis802_11FH,
22 Ndis802_11DS,
23 Ndis802_11OFDM5,
24 Ndis802_11OFDM24,
25 Ndis802_11NetworkTypeMax /* not a real type, defined as an upper bound */
26};
27
28struct NDIS_802_11_CONFIGURATION_FH {
29 u32 Length; /* Length of structure */
30 u32 HopPattern; /* As defined by 802.11, MSB set */
31 u32 HopSet; /* to one if non-802.11 */
32 u32 DwellTime; /* units are Kusec */
33};
34
35/*
36 FW will only save the channel number in DSConfig.
37 ODI Handler will convert the channel number to freq. number.
38*/
39struct NDIS_802_11_CONFIGURATION {
40 u32 Length; /* Length of structure */
41 u32 BeaconPeriod; /* units are Kusec */
42 u32 ATIMWindow; /* units are Kusec */
43 u32 DSConfig; /* Frequency, units are kHz */
44 struct NDIS_802_11_CONFIGURATION_FH FHConfig;
45};
46
47enum NDIS_802_11_NETWORK_INFRASTRUCTURE {
48 Ndis802_11IBSS,
49 Ndis802_11Infrastructure,
50 Ndis802_11AutoUnknown,
51 Ndis802_11InfrastructureMax, /* Not a real value, defined as upper bound */
52 Ndis802_11APMode
53};
54
55struct NDIS_802_11_FIXED_IEs {
56 u8 Timestamp[8];
57 u16 BeaconInterval;
58 u16 Capabilities;
59};
60
61/*
62 * Length is the 4 bytes multiples of the sume of
63 * 6 * sizeof (unsigned char) + 2 + sizeof (ndis_802_11_ssid) + sizeof (u32)
64 * + sizeof (s32) + sizeof (NDIS_802_11_NETWORK_TYPE)
65 * + sizeof (struct NDIS_802_11_CONFIGURATION)
66 * + sizeof (NDIS_802_11_RATES_EX) + IELength
67
68 * Except the IELength, all other fields are fixed length. Therefore, we can
69 * define a macro to present the partial sum.
70 */
71
72struct ndis_wlan_bssid_ex {
73 u32 Length;
74 unsigned char MacAddress[6];
75 u8 Reserved[2];
76 struct ndis_802_11_ssid Ssid;
77 u32 Privacy;
78 s32 Rssi;
79 enum NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
80 struct NDIS_802_11_CONFIGURATION Configuration;
81 enum NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
82 NDIS_802_11_RATES_EX SupportedRates;
83 u32 IELength;
84/*(timestamp, beacon interval, and capability information) */
85 u8 IEs[MAX_IE_SZ];
86};
87
88enum NDIS_802_11_AUTHENTICATION_MODE {
89 Ndis802_11AuthModeOpen,
90 Ndis802_11AuthModeShared,
91 Ndis802_11AuthModeAutoSwitch,
92 Ndis802_11AuthModeWPA,
93 Ndis802_11AuthModeWPAPSK,
94 Ndis802_11AuthModeWPANone,
95 Ndis802_11AuthModeMax /* Not a real mode, defined as upper bound */
96};
97
98enum {
99 Ndis802_11WEPEnabled,
100 Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
101 Ndis802_11WEPDisabled,
102 Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
103 Ndis802_11WEPKeyAbsent,
104 Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
105 Ndis802_11WEPNotSupported,
106 Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
107 Ndis802_11Encryption2Enabled,
108 Ndis802_11Encryption2KeyAbsent,
109 Ndis802_11Encryption3Enabled,
110 Ndis802_11Encryption3KeyAbsent
111};
112
113#define NDIS_802_11_AI_REQFI_CAPABILITIES 1
114#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2
115#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4
116
117#define NDIS_802_11_AI_RESFI_CAPABILITIES 1
118#define NDIS_802_11_AI_RESFI_STATUSCODE 2
119#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4
120
121struct NDIS_802_11_AI_REQFI {
122 u16 Capabilities;
123 u16 ListenInterval;
124 unsigned char CurrentAPAddress[6];
125};
126
127struct NDIS_802_11_AI_RESFI {
128 u16 Capabilities;
129 u16 StatusCode;
130 u16 AssociationId;
131};
132
133struct NDIS_802_11_ASSOCIATION_INFORMATION {
134 u32 Length;
135 u16 AvailableRequestFixedIEs;
136 struct NDIS_802_11_AI_REQFI RequestFixedIEs;
137 u32 RequestIELength;
138 u32 OffsetRequestIEs;
139 u16 AvailableResponseFixedIEs;
140 struct NDIS_802_11_AI_RESFI ResponseFixedIEs;
141 u32 ResponseIELength;
142 u32 OffsetResponseIEs;
143};
144
145/* Key mapping keys require a BSSID*/
146struct NDIS_802_11_KEY {
147 u32 Length; /* Length of this structure */
148 u32 KeyIndex;
149 u32 KeyLength; /* length of key in bytes */
150 unsigned char BSSID[6];
151 unsigned long long KeyRSC;
152 u8 KeyMaterial[32]; /* variable length */
153};
154
155struct NDIS_802_11_REMOVE_KEY {
156 u32 Length; /* Length of this structure */
157 u32 KeyIndex;
158 unsigned char BSSID[6];
159};
160
161struct NDIS_802_11_WEP {
162 u32 Length; /* Length of this structure */
163 u32 KeyIndex; /* 0 is the per-client key,
164 * 1-N are the global keys */
165 u32 KeyLength; /* length of key in bytes */
166 u8 KeyMaterial[16];/* variable length depending on above field */
167};
168
169/* mask for authentication/integrity fields */
170#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f
171#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01
172#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02
173#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06
174#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E
175
176/* MIC check time, 60 seconds. */
177#define MIC_CHECK_TIME 60000000
178
179#ifndef Ndis802_11APMode
180#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1)
181#endif
182
183struct wlan_network {
184 struct list_head list;
185 int network_type; /*refer to ieee80211.h for WIRELESS_11A/B/G */
186 int fixed; /* set to fixed when not to be removed asi
187 * site-surveying */
188 unsigned int last_scanned; /*timestamp for the network */
189 int aid; /*will only be valid when a BSS is joined. */
190 int join_res;
191 struct ndis_wlan_bssid_ex network; /*must be the last item */
192};
193
194enum VRTL_CARRIER_SENSE {
195 DISABLE_VCS,
196 ENABLE_VCS,
197 AUTO_VCS
198};
199
200enum VCS_TYPE {
201 NONE_VCS,
202 RTS_CTS,
203 CTS_TO_SELF
204};
205
206#define PWR_CAM 0
207#define PWR_MINPS 1
208#define PWR_MAXPS 2
209#define PWR_UAPSD 3
210#define PWR_VOIP 4
211
212enum UAPSD_MAX_SP {
213 NO_LIMIT,
214 TWO_MSDU,
215 FOUR_MSDU,
216 SIX_MSDU
217};
218
219#define NUM_PRE_AUTH_KEY 16
220#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY
221
222/*
223 * WPA2
224 */
225struct wlan_bssid_ex {
226 u32 Length;
227 unsigned char MacAddress[6];
228 u8 Reserved[2];
229 struct ndis_802_11_ssid Ssid;
230 u32 Privacy;
231 s32 Rssi;
232 enum NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
233 struct NDIS_802_11_CONFIGURATION Configuration;
234 enum NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
235 NDIS_802_11_RATES_EX SupportedRates;
236 u32 IELength;
237 u8 IEs[MAX_IE_SZ]; /* (timestamp, beacon interval, and capability
238 * information) */
239};
240
241#endif /* #ifndef WLAN_BSSDEF_H_ */
242
diff --git a/drivers/staging/rtl8712/xmit_linux.c b/drivers/staging/rtl8712/xmit_linux.c
new file mode 100644
index 00000000000..7dea8b5b7e7
--- /dev/null
+++ b/drivers/staging/rtl8712/xmit_linux.c
@@ -0,0 +1,182 @@
1/******************************************************************************
2 * xmit_linux.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _XMIT_OSDEP_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33
34
35#include "if_ether.h"
36#include "ip.h"
37#include "rtl871x_byteorder.h"
38#include "wifi.h"
39#include "mlme_osdep.h"
40#include "xmit_osdep.h"
41#include "osdep_intf.h"
42
43static uint remainder_len(struct pkt_file *pfile)
44{
45 /* Kovich: Need to extend the buf_len to 64 bit ?(unsigned long long) */
46 return (uint)(pfile->buf_len - ((addr_t)(pfile->cur_addr) -
47 (addr_t)(pfile->buf_start)));
48}
49
50void _r8712_open_pktfile(_pkt *pktptr, struct pkt_file *pfile)
51{
52 pfile->pkt = pktptr;
53 pfile->cur_addr = pfile->buf_start = pktptr->data;
54 pfile->pkt_len = pfile->buf_len = pktptr->len;
55 pfile->cur_buffer = pfile->buf_start ;
56}
57
58uint _r8712_pktfile_read(struct pkt_file *pfile, u8 *rmem, uint rlen)
59{
60 uint len;
61
62 len = remainder_len(pfile);
63 len = (rlen > len) ? len : rlen;
64 if (rmem)
65 skb_copy_bits(pfile->pkt, pfile->buf_len - pfile->pkt_len,
66 rmem, len);
67 pfile->cur_addr += len;
68 pfile->pkt_len -= len;
69 return len;
70}
71
72sint r8712_endofpktfile(struct pkt_file *pfile)
73{
74 if (pfile->pkt_len == 0)
75 return true;
76 else
77 return false;
78}
79
80
81void r8712_set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
82{
83 int i;
84 struct ethhdr etherhdr;
85 struct iphdr ip_hdr;
86 u16 UserPriority = 0;
87
88 _r8712_open_pktfile(ppktfile->pkt, ppktfile);
89 _r8712_pktfile_read(ppktfile, (unsigned char *)&etherhdr, ETH_HLEN);
90
91 /* get UserPriority from IP hdr*/
92 if (pattrib->ether_type == 0x0800) {
93 i = _r8712_pktfile_read(ppktfile, (u8 *)&ip_hdr,
94 sizeof(ip_hdr));
95 /*UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3 ;*/
96 UserPriority = ip_hdr.tos >> 5;
97 } else {
98 /* "When priority processing of data frames is supported,
99 * a STA's SME should send EAPOL-Key frames at the highest
100 * priority." */
101
102 if (pattrib->ether_type == 0x888e)
103 UserPriority = 7;
104 }
105 pattrib->priority = UserPriority;
106 pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
107 pattrib->subtype = WIFI_QOS_DATA_TYPE;
108}
109
110int r8712_xmit_resource_alloc(struct _adapter *padapter,
111 struct xmit_buf *pxmitbuf)
112{
113 int i;
114
115 for (i = 0; i < 8; i++) {
116 pxmitbuf->pxmit_urb[i] = _usb_alloc_urb(0, GFP_KERNEL);
117 if (pxmitbuf->pxmit_urb[i] == NULL) {
118 printk(KERN_ERR "r8712u: pxmitbuf->pxmit_urb[i]"
119 " == NULL");
120 return _FAIL;
121 }
122 }
123 return _SUCCESS;
124}
125
126void r8712_xmit_resource_free(struct _adapter *padapter,
127 struct xmit_buf *pxmitbuf)
128{
129 int i;
130
131 for (i = 0; i < 8; i++) {
132 if (pxmitbuf->pxmit_urb[i]) {
133 usb_kill_urb(pxmitbuf->pxmit_urb[i]);
134 usb_free_urb(pxmitbuf->pxmit_urb[i]);
135 }
136 }
137}
138
139void r8712_xmit_complete(struct _adapter *padapter, struct xmit_frame *pxframe)
140{
141 if (pxframe->pkt)
142 dev_kfree_skb_any(pxframe->pkt);
143 pxframe->pkt = NULL;
144}
145
146int r8712_xmit_entry(_pkt *pkt, struct net_device *pnetdev)
147{
148 struct xmit_frame *pxmitframe = NULL;
149 struct _adapter *padapter = (struct _adapter *)_netdev_priv(pnetdev);
150 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
151 int ret = 0;
152
153 if (r8712_if_up(padapter) == false) {
154 ret = 0;
155 goto _xmit_entry_drop;
156 }
157 pxmitframe = r8712_alloc_xmitframe(pxmitpriv);
158 if (pxmitframe == NULL) {
159 ret = 0;
160 goto _xmit_entry_drop;
161 }
162 if ((!r8712_update_attrib(padapter, pkt, &pxmitframe->attrib))) {
163 ret = 0;
164 goto _xmit_entry_drop;
165 }
166 padapter->ledpriv.LedControlHandler(padapter, LED_CTL_TX);
167 pxmitframe->pkt = pkt;
168 if (r8712_pre_xmit(padapter, pxmitframe) == true) {
169 /*dump xmitframe directly or drop xframe*/
170 dev_kfree_skb_any(pkt);
171 pxmitframe->pkt = NULL;
172 }
173 pxmitpriv->tx_pkts++;
174 pxmitpriv->tx_bytes += pxmitframe->attrib.last_txcmdsz;
175 return ret;
176_xmit_entry_drop:
177 if (pxmitframe)
178 r8712_free_xmitframe(pxmitpriv, pxmitframe);
179 pxmitpriv->tx_drop++;
180 dev_kfree_skb_any(pkt);
181 return ret;
182}
diff --git a/drivers/staging/rtl8712/xmit_osdep.h b/drivers/staging/rtl8712/xmit_osdep.h
new file mode 100644
index 00000000000..ca439378953
--- /dev/null
+++ b/drivers/staging/rtl8712/xmit_osdep.h
@@ -0,0 +1,38 @@
1#ifndef __XMIT_OSDEP_H_
2#define __XMIT_OSDEP_H_
3
4#include "osdep_service.h"
5#include "drv_types.h"
6
7struct pkt_file {
8 _pkt *pkt;
9 u32 pkt_len; /*the remainder length of the open_file*/
10 _buffer *cur_buffer;
11 u8 *buf_start;
12 u8 *cur_addr;
13 u32 buf_len;
14};
15
16#define NR_XMITFRAME 256
17
18struct xmit_priv;
19struct pkt_attrib;
20struct sta_xmit_priv;
21struct xmit_frame;
22struct xmit_buf;
23
24int r8712_xmit_entry(_pkt *pkt, struct net_device *pnetdev);
25int r8712_xmit_resource_alloc(struct _adapter *padapter,
26 struct xmit_buf *pxmitbuf);
27void r8712_xmit_resource_free(struct _adapter *padapter,
28 struct xmit_buf *pxmitbuf);
29
30void r8712_set_qos(struct pkt_file *ppktfile,
31 struct pkt_attrib *pattrib);
32void _r8712_open_pktfile(_pkt *pktptr, struct pkt_file *pfile);
33uint _r8712_pktfile_read(struct pkt_file *pfile, u8 *rmem, uint rlen);
34sint r8712_endofpktfile(struct pkt_file *pfile);
35void r8712_xmit_complete(struct _adapter *padapter,
36 struct xmit_frame *pxframe);
37
38#endif